Claiming
The reward-per-share accumulator and why claims are pull-based.
A roll credits every holder at once and pays nobody automatically. You claim when you want to. This is not a convenience trade-off — it is the only way to distribute to an unbounded set of addresses safely.
Why not just send it
Pushing funds means looping over holders inside a transaction. That breaks in three separate ways: the loop eventually exceeds the block gas limit and the distribution can never complete; a single recipient whose address reverts on receipt can block everyone behind them; and the cost of paying out grows with every new holder, so success makes the protocol more expensive to run.
A pull-based accumulator has none of those properties. The roll is constant-cost regardless of holder count, and one address cannot affect another's ability to be paid.
The accumulator
The contract keeps one global number, accRewardPerShare, and one number per holder, rewardDebt. On a roll:
accRewardPerShare += rollAmount × 1e18 / totalWeightWhat you can claim at any moment is the gap between the two:
pending = (weight × accRewardPerShare / 1e18) − rewardDebtClaiming transfers pending to you and sets rewardDebt to the current product, closing the gap. Your entitlement is derived, never stored per-roll, so the contract does not care whether there have been three rolls or three hundred since you last claimed.
When your weight changes
Every transfer settles first. Before a balance or multiplier changes, the contract computes pending at the old weight and moves it into a per-holder accrued bucket, then recomputes rewardDebt at the new weight.
This is what stops the obvious attack. Selling after a roll does not forfeit what that roll already credited you — it is banked. And buying after a roll does not retroactively earn you a share of it.
Practical notes
- Nothing expires. Unclaimed USDC stays claimable indefinitely. There is no sweep, and no deadline after which the protocol keeps it.
- Claiming does not reset your multiplier. It moves USDC, not tokens, and hold time is untouched.
- Claims accumulate. You can leave ten rolls unclaimed and collect them in one transaction, paying gas once.
- You are paid in USDC. There is no wrapped representation and no claim token.
The one cost of pull-based claiming is that you pay the gas for your own claim. On Arc that gas is quoted in USDC, so it is easy to see whether a claim is worth making yet — and since nothing expires, waiting to batch several rolls together is always a valid choice.