Field guide / Rewards · 3 min read

Holder rewards and epochs

How a snapshot becomes a Merkle root every 15 minutes, and who is counted.

Pre-launch, and clear about it.
The deployed configuration splits the 4% protocol fee 1% holders, 1% liquidity, 1% staking and 1% operations, fixed in the treasury program with no setter. Staking itself is planned, phase 2: the allocation is set aside, but no staking program is deployed and nothing accepts a deposit. Values that have not been read from the chain render as a dash with the reason beside them.

An epoch every 15 minutes

The keeper runs one cycle every 900 seconds, about 96 times a day. Each cycle claims fees, splits the vault, buys stock for the holder leg, snapshots holders and publishes an epoch. A cycle that finds nothing to distribute publishes nothing; there are no empty epochs.

The snapshot

Holders are enumerated from every $DVR token account at one recorded slot. Balances owned by protocol addresses, pools, the keeper and the team leave the denominator; the exclusion list is published in the deployment file with a reason per address. A minimum holding threshold, if set, is published the same way and stamped into every epoch file it applied to.

Your share of an epoch is your balance over the eligible total at that slot. Sampling every 15 minutes is the time-weighting: a balance that arrives and leaves between two snapshots earns nothing.

From shares to stock

The pot is every stock the payout leg bought this cycle plus stock harvested in kind from the protocol pools. It is valued at one Pyth reading for every feed at once, then allocated so that each holder receives their share of the VALUE, converted into the stocks their basket names. Rounding to whole base units is repaired one unit at a time toward the holders who lost the most to flooring, never above their entitlement. Whatever remains is dust and stays in the treasury.

Publish, fund, activate

  • The keeper writes the epoch file (root, entries, every leaf and its proof) to disk BEFORE publishing. A root whose leaves were never written down cannot be claimed against.
  • publish_epoch stores the root, the per-stock allocation and the publish time on chain.
  • The treasury funds each stock vault. activate_epoch refuses unless every vault holds at least its allocation.
  • Only an active epoch pays. The chain enforces that no epoch pays more than it was funded and that no leaf is claimed twice.

Merkle format

leaf = sha256(0x00 || claimant || epoch_id_le_u64 || mint || amount_le_u64)
node = sha256(0x01 || min(a, b) || max(a, b))

What is trusted, what is enforced

The keeper is trusted to compute honest allocations; that the leaves sum to the allocation is a keeper invariant the chain cannot check. Everything after publication is enforced: the root is immutable, a claim is bound to its epoch, stock and claimant, an epoch cannot pay more than its funded budget, and a stolen keeper key can move money only into program vaults.