Trading, dividends & claiming
Trading an index token
Index tokens trade on the chain's AMM like any ERC-20 — the app routes swaps against the registered index/USDG pool. Two things to know:
- The fee is taken in-token. If an index has a 3% buy fee and you buy 100 INDEX, 3 INDEX are skimmed to the token's fee balance and you receive 97. Quotes in the app show this.
- Only AMM trades are taxed. Plain transfers between wallets, claims, and RFV redemptions are fee-free.
Because the token is a standard ERC-20 (no reflections, no rebasing), it composes normally with routers, aggregators, and other protocols.
How your dividends accrue
Whenever anyone calls FeeProcessor.convert on your index, the distribution share of accrued fees buys the basket's stock tokens and folds them into the token's dividend accumulator. From that moment your share is claimable — proportional to your eligible balance at distribution time.
- Accrual is automatic. You never need to stake, register, or snapshot — holding in a wallet is enough.
- Balances held in the AMM pool (as LP) are excluded and don't accrue.
- Buying more increases your share of future distributions; selling stops future accrual but already-accrued dividends remain claimable.
Check what you're owed on-chain:
// amount of `stock` currently claimable by `account`
uint256 owed = IIndexToken(index).claimable(account, stock);
The app shows a live "Your dividends" panel per index (via the indexer + on-chain claimable reads).
Claiming
IIndexToken(index).claim(); // claim every basket stock at once
IIndexToken(index).claim(stock); // or claim a single stock
claim()transfers all accrued stock tokens (AAPLx, TSLAx, …) to your wallet. You keep your index tokens and keep accruing.claim(stock)is the escape hatch: if a single equity is paused or blocklisted, per-stock claiming means it can never block your other dividends.- Claims are
nonReentrantand follow checks-effects-interactions; there is no deadline — dividends never expire.
Triggering a conversion yourself
Conversion is permissionless, so if fees have accrued and nobody has converted, you can:
# optional helper — computes min-outs from router quotes and calls convert()
cd keeper && pnpm start
or call convert(index, minReserveOut, stockMinOuts, deadline) directly with your own slippage bounds (all min-outs must be > 0; on mainnet derive them from the Chainlink stock feeds or a TWAP to avoid sandwiching).