Documentation
Every part of Beanhood, written down
4,444 ERC-721 tokens on Robinhood Chain. Trading fees from $BEAN are spent on four tokenized stocks and credited to every NFT by weight. No activation, no staking, no fee to earn. The collection is deployed and immutable. The payroll is written and tested but waits for $BEAN, for the reason given in section 06.
- Collection
- Not deployed
- Payroll
- Not deployed
- $BEAN
- Not launched
- Audit
- None
- Chain
- Robinhood · 4663
01What it is
The token $BEAN trades in a pool that charges 1% on every swap. 70% of that fee is the creator share, which works out to 0.7% of traded volume. It arrives in two assets, roughly half WETH, half $BEAN.
The WETH is spent on four tokenized stocks and credited to every NFT in the collection by weight. The $BEAN is sent to the creator wallet and burned in batches.
There is no activation, no staking, no lock-up and no fee to earn. An NFT earns from the block it is minted, without any further transaction from its owner.
02Network
- Chain
- Robinhood Chain
- Chain id
- 4663
- Gas token
- ETH
- DEX
- Uniswap V3
- Explorer
- robinhoodchain
.blockscout.com
Adding the network is not something you have to do by hand. The connect button in the header offers to add it if your wallet does not have it yet.
03The collection
- Supply
- 4,444
- Standard
- ERC-721
- Royalty
- 5%ERC-2981
- Image
- 64 × 64 pxPNG, no background
- Categories
- 7
- Reveal
- Nonevisible at mint
Seven trait categories: Background, Body, Outfit, Mouth, Eyes, Headwear and Tier. Six of them are appearance. The seventh, Tier, is the only one that touches money.
Bodies are materials rather than skin tones — Dough, Clay, Sand, Ash, Moss, Emberskin, Frostbitten, Gilded. Every one of the 4,444 combinations appears exactly once; both the images and the trait sets were checked for duplicates by hash before anything was uploaded.
04Tier and weight
Payouts divide by weight, not per head. Tier is written into the metadata before mint, and the payroll stores it as three bits per token id — loaded once, then sealed permanently.
| Tier | Pieces | Weight | Total weight | Share of a round |
|---|---|---|---|---|
| Common | 2,667 | 1 | 2,667 | 31.6% |
| Uncommon | 1,111 | 2 | 2,222 | 26.3% |
| Rare | 444 | 4 | 1,776 | 21.0% |
| Epic | 178 | 7 | 1,246 | 14.8% |
| Legendary | 44 | 12 | 528 | 6.3% |
| Total | 4,444 | — | 8,439 | 100% |
Weight cannot be raised. There is no burn-to-boost, no staking multiplier and no upgrade path. A Legendary earns twelve times a Common in every round, and there will never be a forty-fifth Legendary.
05Minting
- Price
- 0.0001 ETH
- Per wallet
- 10
- Assignment
- Randomdrawn at mint
- Payment
- ETHnative, no approval
Token ids are drawn at random from whatever is unminted, using a lazy Fisher-Yates shuffle that touches two storage slots per draw — the last mint costs the same as the first.
The randomness exists because the metadata is public before mint. A sequential mint would hand all 44 Legendaries to whichever bot read the file fastest.
Contract addresses cannot mint. A contract could mint, inspect what it drew, and revert until it landed a Legendary. Refusing contract callers closes that door, and also blocks Safe and other smart wallets as a side effect. Mint from a regular wallet.
06The payroll
It is deployed after $BEAN launches, not before. The contract takes the token's address in its constructor and keeps it forever, and the function that moves the token half out is open to anyone — so pointing it at a placeholder would let the first caller drain whatever that placeholder turned out to be.
WETH accumulates in the payroll contract. Once the balance clears
MIN_ROUND, anyone may call convert(), which buys all
four stocks in equal quarters and credits every token at once.
Crediting uses an accumulator rather than a loop. Each purchase raises a single number per stock — earnings per unit of weight — and a token's balance is its weight multiplied by that number, minus whatever it has already withdrawn. A round therefore costs the same whether one bean exists or all 4,444 do, and no round is ever too small to pay everybody. Paying 4,444 tokens across four stocks the naive way would be 17,776 transfers.
- To holders
- 100%of the WETH half
- Team cut
- None
- Basket
- 4 stocks25% each, every round
- Minimum round
- 0.01 ETH
- Total weight
- 8,439
- Who can run it
- Anyone
07A round, worked
round converts 0.4 ETH each stock receives 0.1 ETH (25% each, no rotation) total weight 8,439 one unit of weight 0.4 / 8,439 = 0.0000474 ETH of stock Common (weight 1) 0.0000474 ETH Uncommon (weight 2) 0.0000948 ETH Rare (weight 4) 0.000190 ETH Epic (weight 7) 0.000332 ETH Legendary (weight 12) 0.000569 ETH
convert() is callable by any address. It is not a keeper, not a bot,
and not a permission held by the deployer. The caller supplies the minimum
acceptable output for each swap, so slippage is checked against a live quote
rather than a value frozen at deployment.
08The route
Stocks on Robinhood Chain are quoted against USDG, not against ether. A direct WETH swap would route through almost nothing — the WETH/SPCX pool holds 0.0003 ETH while its USDG pool holds over half a million. Every purchase therefore takes two hops, and the path is fixed in the contract.
WETH --0.01%--> USDG --0.05%--> NVDA 629,496 USDG deep
--0.30%--> SPCX 505,002
--0.30%--> AAPL 103,342
--0.30%--> TSLA 99,919
Call pathTo(index) to read the exact bytes handed to the router.
Nobody has to take our word for where the money goes.
09Claiming
Stock is credited to the token, not to the wallet that held it when the round
ran. claim(tokenId) transfers everything owed to the
current owner; claimMany(ids) does several at once. Both
are optional and there is no deadline.
Unclaimed stock therefore travels with the NFT. A bean that has never been claimed carries its whole accumulated balance to whoever buys it next — worth checking before you list, and worth checking before you buy.
The holdings page reads what each of your beans is owed and claims them in one transaction.
10$BEAN
- Pair
- $BEAN / ETH
- Pool fee
- 1%per swap
- Creator share
- 70%of the pool fee
Until $BEAN is trading there is no pool, no fee and no round. The creator share is set at launch and cannot be changed afterwards.
The token half of the fees is held in the creator wallet and burned in batches.
11Every function
| Function | Who can call | What it does |
|---|---|---|
| mint(qty)ANYONE | Any wallet, not a contract | Draws that many random unminted ids and transfers them to the caller. |
| convert(minOut)ANYONE | Any address | Swaps the accumulated WETH into the four stocks and credits every token by weight. |
| claim(id)HOLDER | The current owner of that token | Transfers everything the token is owed, in all four stocks. |
| claimMany(ids)HOLDER | The current owner of each token | The same, for several tokens in one transaction. |
| sweepBean()ANYONE | Any address | Pushes the $BEAN half of the fees to its one fixed destination. It can go nowhere else. |
| owed(id) | Read-only | What a token could withdraw right now, in basket order. |
| weightOf(id) | Read-only | The token's weight, 1 to 12. |
| tierOf(id) | Read-only | The token's tier, 0 Common through 4 Legendary. |
| pathTo(i) | Read-only | The exact swap path for stock i, so the route can be checked off-chain. |
| roundsRun() | Read-only | How many rounds have been converted so far. |
| loadTiers(...)SETUP ONLY | Installer, before sealing | Writes the tier table. Refused afterwards, by anyone, forever. |
| seal()SETUP ONLY | Installer, once | Closes the tier table permanently. convert() refuses to run until this is done. |
There is no setOwner, no setFee, no
withdraw on the payroll and no upgrade path. The list above is
complete.
12Addresses
Beanhood
| Contract | Address |
|---|---|
| Collection | not deployed |
| Payroll | not deployed |
| $BEAN | not launched |
The basket
Several tokens on this chain share these symbols. The four below are the official Robinhood Token contracts and are immutable in the payroll — they are the only four it can ever buy.
| Stock | Address | Share |
|---|
Infrastructure
| Name | Address |
|---|---|
| Uniswap SwapRouter02 | 0xcaf681a66d020601342297493863e78c959e5cb2 |
| Uniswap V3 Factory | 0x1f7d7550b1b028f7571e69a784071f0205fd2efa |
| QuoterV2 | 0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7 |
| WETH | 0x0bd7d308f8e1639fab988df18a8011f41eacad73 |
| USDG | 0x5fc5360d0400a0fd4f2af552add042d716f1d168 |
The explorer lists more than one contract called "Wrapped Ether". The WETH above is the one Uniswap's own deployment actually routes through, confirmed against the router rather than against a token list.
13Settings
| Setting | Value | Changeable after deploy |
|---|---|---|
| Supply | 4,444 | No |
| Mint price | 0.0001 ETH | No |
| Per wallet | 10 | No |
| Royalty | 5%, ERC-2981 | No |
| Pool fee | 1% | No |
| Creator share of pool fee | 70% | No |
| To holders | 100% of the WETH half | No |
| Basket split | 25% each, every round | No |
| Stock addresses | Fixed in the constructor | No |
| Swap route and fee tiers | Fixed in the constructor | No |
| Tier weights | 1 · 2 · 4 · 7 · 12 | No |
| Total weight | 8,439 | No |
| Minimum round | 0.01 ETH | No |
| Tier table | Loaded once, then sealed | No, after sealing |
| Metadata base URI | IPFS | No |
| Chain | Robinhood Chain, id 4663 | No |
14What cannot change
- The payroll has no owner, no setter and no upgrade path. Nothing in these docs can be altered after deployment, including by us.
- Stock addresses, the swap route and the pool fee tiers are immutable, set in the constructor.
- The tier table can be written only by the deploying address, only before
sealing, and never again.
convert()refuses to run until it is sealed, so no round can happen against a half-written table. convert()is permissionless, so the payroll cannot be stopped by the team losing interest.- Slippage limits come from the caller, from a live quote, rather than being frozen at deployment.
- The $BEAN half of the fees can only ever move to one address, fixed at deployment.
- No audit. The contracts compile clean, but no third party has reviewed them.
15Known limits
Stated here rather than discovered later.
- No fees until the token trades. Nothing accrues before $BEAN has a live market, and if it never gets one there is never a payroll.
- Payout tracks volume. At low volume a round can be worth less than the gas required to claim it.
- The $BEAN half is held, not burned on arrival. It goes to the creator wallet and is burned in batches. The destination is fixed at deployment; the timing is not. This is the one part of the system that still requires trust, and the wallet is public so it can be watched.
- Stock can fall. The payroll buys at market price. It accumulates stock; it does not promise the stock rises.
- Smart wallets cannot mint, for the reason given in section 05.
- Royalties are not enforceable. ERC-2981 is honoured at each marketplace's discretion.
- Unaudited and immutable at once. A bug found later cannot be patched later. Mint small.
16Disclaimer
Beanhood is an experimental on-chain collectible. Nothing here is investment advice and no return of any kind is promised. Tokenized stock is a token that tracks a stock price; it is not the stock itself, and it carries the risks of both.
Buy only what you are willing to lose.