Guide 05 · 4 min read · Updated epoch 137
Holding time
Why your weight is a 24-hour average and how it moves.
The rule in three statements
The full formula, with the worked example, is in the holder rewards guide; this guide covers the edges: the first day, gaps, quiet stretches, and how to recompute your own weight from the epoch files.
- Your share of a round is your average balance over the last 24 hours, measured across 48 snapshots.
- Buying just before a snapshot counts for 1/48 of a balance held all day.
- Selling lowers your weight gradually. There is no cliff and no reset.
The first day, gaps and quiet stretches
- The window is counted in published epochs, not on the clock. A cycle with nothing to distribute publishes no epoch and consumes no id, so a quiet stretch does not age anyone out of the window: holding time is measured in payouts. 48 epochs is 24 hours only when an epoch is published every cycle.
- The first day after launch is a shorter window. Epoch 1 has one sample, so it pays by current balance exactly as it would have without the rule; epoch k has k samples, a wallet present in all of them has full weight and a newcomer at epoch k has 1/k. The window reaches its full 48 samples at epoch 48.
- A gap counts as zero. An epoch inside the window whose proof file is missing, or was written before the weights existed, contributes nothing for every wallet and is listed in the epoch file as missing. It is never interpolated and no earlier balance is carried into it, because either could be gamed. The divisor shrinks with the gap, so a gap dilutes nobody; it only means the holding time it would have witnessed is not counted.
- Exclusions and the minimum holding threshold apply per sample. A wallet excluded, or below the threshold, at one snapshot is simply not in that sample.
- The weighting changes how much of the pot each eligible wallet is weighted for. It does not change who is eligible, and it cannot tell one wallet from many under one owner.
What the weighting defends against, and what it does not
- It defeats renting supply for a payout: a position bought for the snapshot earns 1/48 of its balance-weight and has to be held for a day to earn the rest, and it decays at the same rate afterwards, so buying before and selling after leaves nothing to collect.
- It is symmetric on purpose, so it does not penalise a wallet that genuinely held for the window and then sells: that wallet is paid, at a falling weight, for the following window, which is the same value it would have received had the payouts arrived on time.
- It does not stop a wallet from holding for a day and then selling, and is not meant to. It cannot tell one wallet from many under one owner.
Recompute your own weight
Every sample is public. Each epoch file carries a weighting block: the rule's version, the configured window, the ids whose balance tables it folded, the ids it could not, and one row per wallet with that epoch's own eligible balance and the weight it was paid by. The balance column of one epoch's file is the sample later epochs read, so nothing is needed beyond the files themselves.
- Open the file for epoch N and read weighting.window, the ids it folded, ending in N.
- For each id in the window, take your balance from that file’s weighting.holders row for your wallet; zero if you have no row.
- Sum those balances and divide by the number of ids in the window, rounding down. That is your weighting.holders weight for epoch N.
- Sum every wallet’s weight: that is total_shares. Your weight over total_shares is your share of the epoch, and each leaf addressed to you is that share of the stock the epoch allocated.
- An id listed under weighting.missing is not re-checked; the rule is that an unavailable sample contributes zero.