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

  1. Remix Hood100Vault — team, keeper, teamBps 1489, chain 4663, 0.8.24, optimizer 200
  2. Verify. setRouter(amm, true)
  3. LetsCash $HOOD100, 5%, fee recipient = vault
  4. setHood(token)
  5. 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).