How the value reaches the end holder
There are two cases and they look nothing alike. In one, money has to move. In the other, nothing moves and the work is telling a pool who the accrual belonged to.
Case one: the issuer accrues into the multiplier
This is the Robinhood case. The value is already inside the token: the factor stepped, every holder is worth more, and there is nothing to send. For a wallet that is the end of the story.
For anything holding tokens on someone else's behalf it is not. A pool holds the tokens, the depositors hold the claim. A vault holds the tokens, the subscribers hold the claim. The chain records that the pool contract got richer and says nothing about whose share of it that was.
Here the output is not a payment but an allocation list: for one event and one pool, how the step splits across the providers who were in it at the effective time. The pool can then act on it, credit it, or simply publish it. What matters is that the answer exists and can be audited.
Case two: the issuer pays out
Cash arrives, the snapshot decides the split, holders receive stablecoin pro rata. Each holder
receives received × balance ÷ resolved_supply, truncated to the smallest unit.
Truncation always leaves a remainder. The remainder is carried into the next distribution for the
same wrapper rather than kept, and the carried figure is published with both events. Positions marked
unresolved are excluded from the denominator and their share is held aside, not spread
across everyone else. Redistributing it would pay people with money that is not theirs.
Withholding
Where an issuer publishes a gross amount and a withheld amount separately, both are published here. Where an issuer publishes only a net figure, it is labelled net. The registry does not model per holder tax treatment and does not present a net figure as if it were gross.
Proof
allocate(snapshot, step) // ledger-core, largest remainder
{
"event_id": "evt_aapl_2026_08_14",
"mode": "multiplier_accrual",
"pool": "0x…",
"pool_balance_at_effective": "…",
"step": "1.000000000 -> 1.000566080",
"recipients": 412,
"unresolved": "…",
"digest": "0x…"
}
An allocation is not marked final until the arithmetic closes and every unresolved
position is named.