Guide 03 · 8 min read · Updated epoch 137

Holder rewards

Every 30 minutes the protocol buys tokenized stocks with its share of trading fees and pays them to the wallets that hold $OMNIA, weighted by how long they held.

What you receive

You receive Robinhood Stock Tokens: plain ERC-20 tokens on Robinhood Chain that track a listed stock or fund. They sit in your wallet like any other token. They are not points, not an IOU and not a claim on a share held somewhere else.

Stock tokens carry issuer powers. Robinhood can pause, block or burn any stock token. Holding one is not share ownership and carries no dividend. Stock tokens are not offered to persons in the US, UK, Canada or Switzerland.

How a round works

The keeper runs one cycle every 1800 seconds, about 48 times a day. A cycle that finds nothing to distribute publishes nothing; there are no empty epochs.

  1. 1SnapshotThe keeper records every $OMNIA balance at a block. The block number is published with the epoch.
  2. 2BuyThe holder-payout leg of collected fees buys the stocks holders asked for, through Uniswap v4 and USDG, at Chainlink-checked prices.
  3. 3PublishA Merkle root goes on chain, funded with the stock tokens it allocates, and the full proof file is published.
  4. 4PayThe largest allocations are pushed to wallets. Everyone else claims with one click, any time within seven days.

One stock per round

Each round pays you in one of your basket stocks, not a sliver of all four. The stock is chosen by a fixed rotation: every round, each stock earns credit equal to its weight, and the stock with the most credit is paid and has 100 subtracted. Nothing is random. Over any stretch of rounds, what you receive matches your weights.

12345678910SPYNVDATSLASPYGOOGLNVDASPYTSLASPYNVDA
The protocol default basket (SPY 40, NVDA 25, TSLA 20, GOOGL 15) over 10 rounds: SPY 4, NVDA 3, TSLA 2, GOOGL 1. Twenty rounds settle to 8 / 5 / 4 / 3.

Holding weight

Your share of a round is not your balance at one instant. It is your average balance across the last 48 snapshots, which is the trailing 24 hours.

weight = (b₁ + b₂ + … + b₄₈) ÷ 48share = weight ÷ sum of all weightsyour round = share × stock bought this round

A wallet that buys just before a snapshot has one snapshot out of 48 counted, so 1/48 of the weight of the same balance held all day. Selling lowers your weight one snapshot at a time. There is no cliff and nothing resets.

Holding weight in detail

Your share of a payout is not your balance at the snapshot. It is your average eligible balance over the last 48 snapshots, one per published epoch, which at the 30-minute cadence is 24 hours. The keeper folds the balance table of each of the last 47 epoch files together with the snapshot it has just taken, sums your balance across those samples, and divides by the number of samples. That figure is your weight; the epoch's total_shares is the sum of every weight; your share is your weight over that total. A payout is then that share of whatever the fee actually bought.

Read it as balance times time. A wallet that bought just before the snapshot is in one sample of 48 and weighs 1/48 of an equal wallet that held all day. Nothing resets and there is no cliff to time: the weight grows by one sample's worth every epoch you stay, and after you sell it decays by one sample's worth every epoch, so a wallet that has sold is still paid, at a falling weight, until it is out of the window. The rule is symmetric on purpose: it defeats buying for a payout and selling straight after, and it does not punish a wallet that genuinely held and then left.

The window length is the protocol's configuration value payout_weighting.holding_window_epochs (48); the keeper reads it, and every figure on this page is derived from it.

Wallet, equal balance throughoutSamples presentWeight, relative to a full 24 hours
Held for the whole window48 of 48Full
Bought 12 hours ago24 of 48Half
Held all day, sold half its position 12 hours ago48 of 48, half of them at half the balance3/4
Bought just before this snapshot1 of 481/48
Sold everything 12 hours ago24 of 48, and falling by one every epochHalf, and falling
The holding time guide

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 Chainlink reading for every feed at once, then allocated so that each holder receives their holding-time weighted share of the VALUE, converted into the stock the rotation names for them. 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, and every wallet’s balance sample and weight) to disk BEFORE publishing. A root whose leaves were never written down cannot be claimed against.
  • publish stores the root, the per-stock allocation, the snapshot block and the publish time on chain. Ids are strictly sequential; the contract refuses a gap.
  • The treasury funds each stock entry by transfer, and the contract measures what arrived rather than trusting the amount. activate refuses unless every entry is funded up to its allocation.
  • Only an active epoch pays. The chain enforces that no epoch pays more than it was funded, that no leaf is claimed twice, and that a claim below the per-stock floor is refused.
Merkle formatleaf = keccak256(keccak256(abi.encode(chainid, distributor, epoch, account, stock, amount)))node = keccak256(min(a, b) || max(a, b)) sorted pairs, no index

Claiming, pushing and expiry

The largest allocations in each epoch are pushed to wallets automatically. Everything else is claimable with one click on the Portfolio page, or through the contract directly using the public proof. Unclaimed allocations return to the treasury seven days after the epoch publishes.

30 minBetween snapshots48Snapshots in your weight7 daysTo claim before a sweep
Epochs and claims in full

What can stop a payout

  • No volume. The trading fee is the only revenue. A round with no fees has nothing to buy.
  • A paused stock. If the issuer pauses a stock in your basket, rounds that would pay it pay the next stock in your basket until it resumes.
  • Missing a snapshot. A wallet with zero balance across all 48 snapshots has no weight.

What is trusted, what is enforced

The keeper is trusted to compute honest allocations; that the leaves sum to the allocation, and that every weight is the average the published samples give, are keeper invariants the chain cannot check but anyone with the files can. 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 protocol contracts.

Questions

No. You receive stock tokens bought with trading fees. Holding $OMNIA is not share ownership, and payouts depend entirely on trading volume.

Not yet. Baskets are limited to SPY, NVDA, TSLA and GOOGL, the four stocks the protocol has verified liquidity for.

The rotation pays each stock in turn according to its accumulated credit. Over many rounds your payouts match your weights; any single round is one stock.

No. Claims accumulate for seven days per epoch, and Claim everything on the Portfolio page collects them in one transaction.

Holder rewards · Omnia