PoX-4 / Stacking
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.
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();// 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.