Overview

The PoX-4 dataset captures every Stacking lifecycle call on Stacks — solo stacking, delegation, extension, increase, revocation, aggregation, and signer-key authorizations. It is the canonical reference for "who is stacking, how much, in which cycle, with what BTC payout address, and which signer key."

Cursor is <block_height>:<tx_index> — PoX-4 is transaction-grain, not event-grain, because the contract returns state through (ok ...) response tuples and emits no prints.


Source

Decoded directly from canonical successful transactions against the PoX-4 contract:

  • SP000000000000000000002Q6VF78.pox-4 (mainnet)

Function args and raw_result are deserialized via Clarity. PoX address tuples are decoded into canonical Bitcoin address strings. Cycle math uses Nakamoto activation constants (first burnchain block 666050, reward cycle length 2100).

Forward-only ingestion from the moment the decoder enabled — historical cycles before activation are out of scope.


Tables

pox4_calls — one row per successful PoX-4 call. Wide schema; columns not relevant to a given function are null. Function discriminator covers all 12 supported calls:

  • Solo: stack-stx, stack-extend, stack-increase
  • Delegation: delegate-stx, revoke-delegate-stx, delegate-stack-stx, delegate-stack-extend, delegate-stack-increase
  • Aggregation: stack-aggregation-commit, stack-aggregation-commit-indexed, stack-aggregation-increase
  • Signer auth: set-signer-key-authorization

Daily rollups (pox4_cycles_daily, pox4_signers_daily) are deferred to a follow-up aggregator job.


API

GET /v1/datasets/pox-4/calls — PoX-4 calls. Filters: function_name, stacker, delegate_to, signer_key, reward_cycle, from_block, to_block. Pagination via cursor.

Try pox-4/calls
GET/v1/datasets/pox-4/calls?function_name=stack-stx&limit=5
curl
curl "https://api.secondlayer.tools/v1/datasets/pox-4/calls?function_name=stack-stx&limit=5"
fetch (TypeScript)
const res = await fetch(
  "https://api.secondlayer.tools/v1/datasets/pox-4/calls?function_name=stack-stx&limit=5",
);
const data = await res.json();
Response
// Hit Send to see live JSON.

Sample response shape:

{
  "calls": [
    {
      "cursor": "7869999:4",
      "block_height": 7869999,
      "block_time": "2026-05-05T12:34:56.000Z",
      "burn_block_height": 902481,
      "tx_id": "0xabc...",
      "tx_index": 4,
      "function_name": "stack-stx",
      "caller": "SP1...",
      "stacker": "SP1...",
      "amount_ustx": "100000000000",
      "lock_period": 6,
      "pox_addr_version": 4,
      "pox_addr_hashbytes": "0x000102...",
      "pox_addr_btc": "bc1q...",
      "start_cycle": 87,
      "end_cycle": 92,
      "signer_key": "0x03ab...",
      "auth_id": "1",
      "max_amount": "200000000000",
      "result_ok": true
    }
  ],
  "next_cursor": "7870001:0",
  "tip": { "block_height": 7889408 }
}

Freshness

/public/status.datasets[] includes a pox-4-calls entry with latest_finalized_cursor, generated_at, and lag_blocks against the chain tip. Parquet exporter is deferred — the API is the primary surface for v0.

Schema doc: docs/datasets/pox-4/schema.md.