paper
the loop.
$HOOD100. 100 seats. Merkle, not a push. Ranking is off-chain. Read that twice.
1 · tax
LetsCash takes 5% of every buy and sell, in ETH. Never in $HOOD100. The vault does not sell the index token to fund a hop.
- 0.3% — LetsCash, at the launchpad. Never hits this vault.
- 0.7% — team. If LetsCash forwards 4.7% here, teamBps = 1489 (0.7 / 4.7). Team pulls via pullTeam().
- 4.0% — index pot (indexWei). Buys the hundred.
Worked example. 10 ETH of volume. Cut 0.5 ETH. LetsCash keeps 0.03. Vault receives 0.47. Of that, ~0.07 team, ~0.40 index. That 0.40 ETH is split across up to 100 hops, equal wei, next epoch.
2 · rank
Off-chain. The crank lists Robinhood pairs by quote liquidity (pools summed, one seat per ticker). Skip $HOOD100, skip LP tokens, skip burn. Skip below the floor — a name that cannot take a hop without wrecking the pot is not a seat.
Up to 100. If only 61 names clear the floor, the pot splits 61 ways. Equal weight. No curator overlay. The contract cannot see Dexscreener. You trust the keeper, or you don’t sit.
3 · epoch
Clock is 3 hours, drift-resistant: on time → endsAt + EPOCH. Late → now + EPOCH (fat pot, no skipped ETH).
The crank should not settleEpoch if indexWei cannot pay the hops plus merkle gas. That rule is in the bot, not the bytecode. A rogue keeper can settle an empty root. That is why the keeper key is a separate EOA with no extra ETH to steal except the pot it already controls.
4 · buy
buy(router, data, wei) — one hop, only if router is allowlisted. Swap recipient MUST be the vault. Repeat ≤ 100. Tokens sit here until claim. Leftover ETH stays in indexWei for the next epoch.
5 · snapshot + merkle
Eligible: wallets holding ≥ 0.01% of total supply at the close block. Pools, the vault, burn: out. share = balance / eligibleSupply. Each seat pays share × tokensBought[seat].
Leaf (OpenZeppelin): keccak256(bytes.concat(keccak256(abi.encode(wallet, epoch, token, amount)))). Sorted pairs. One leaf per token. Claim 20 names per tx. Amount 0 is marked claimed, no transfer. Holder pays gas. No expiry — but the owner rescue can move leftover. That is written on purpose.
6 · deploy
- Remix Hood100Vault — team, keeper, teamBps 1489, chain 4663, 0.8.24, optimizer 200
- Verify. setRouter(amm, true)
- LetsCash $HOOD100, 5%, fee recipient = vault
- setHood(token)
- Crank. Site paste TOKEN_CA + VAULT_CA
what this is not
Not a ten. Not their slogan. Not a guaranteed APY. Not on-chain ranking. Not a push airdrop. Not LetsCash claim (that button is only the 4.7% stream into the vault).
