Stock Ledger Integrate
Record date

How the holder list is fixed

Off chain the issuer fixes its holders at the close of the record date. On chain nothing is fixed at all: the multiplier simply starts applying at a stated moment, and whoever holds the token then carries the new value. Everything below follows from that.

The rule

The snapshot is taken at the effective time of the event, at the last block before the factor applies, and not at the block where the event was emitted. Those are different: in the existing log the same effective time appears twice, emitted 150,000 blocks apart. Reading the emission block would give two different holder lists for one event.

What is counted

  • Wallet balances. The plain case: an address holds the wrapper, the address is in the book.
  • Pooled positions. Where a wrapper sits in an AMM pool, the position is attributed to the liquidity providers by their share of the pool at that block, so the accrual follows the exposure rather than stopping at the pool contract.
  • Lending markets. A supplied wrapper is attributed to the supplier, a borrowed one to the borrower, because the borrower carries the price exposure the accrual belongs to.
  • Bridged and wrapped again. Attributed where the chain of custody is legible, and flagged as unresolved where it is not.

Unresolved positions

Some positions cannot be attributed honestly: an opaque custodial contract, a bridge with no exit map, a pool that does not expose per provider state at a historical block. Those are published as unresolved with the address and the amount. They are never silently dropped and never quietly reassigned to someone else.

Reproducing a snapshot

The snapshot is a function of public state. Anyone with an archive node can rebuild it and diff it against the published list.

snapshot(client, 'evt_aapl_2026_08_14')   // ledger-core, no service involved

{
  "event_id": "evt_aapl_2026_08_14",
  "effective_at": "2026-08-14T15:12:46Z",
  "block": 36345343,
  "multiplier_after": "1.000566080",
  "total_supply": "…",
  "resolved": "…",
  "unresolved": "…",
  "holders": [
    { "address": "0x7f…a41c", "balance": "4120.000", "via": "wallet" },
    { "address": "0x2b…9e07", "balance": "988.250",  "via": "amm:0x…" }
  ]
}

Snapshots are content addressed: the same block and the same rules produce the same digest, and the digest is published with the event.