A collection where every NFT is a stock ticker, and the market keeps score.
Stockhoppers is an ERC-721 collection on Robinhood Chain. Each token has exactly one stock ticker attached to it at mint, out of twenty. That ticker is part of the token: it survives every sale, it is visible on chain, and there is no function anywhere that can change it.
Once a week an epoch runs. The contract records where each of the twenty tickers started and where it finished, ranks them by percentage move, and credits a bank of money to holders. The three best tickers take the prize share; the remainder is split evenly across every NFT in the collection, so holding a ticker that had a bad week still pays.
There is nothing to farm, nothing to stake and nothing to do weekly. Hold the NFT and the contract keeps a running balance for you. Claim it whenever you feel like it, in one transaction.
Attached at mint, attached for life.
The ticker is drawn inside the mint transaction and written into the token's storage right there. There is no separate reveal step to wait for and no metadata swap afterwards, which means there is also no moment at which anybody could have changed the outcome.
Why it never changes
A permanent ticker is what turns the collection into tribes. The NVDA holders and the TSLA holders are permanent groups that win and lose together week after week. If tickers could be reassigned, everyone would sit on whatever won last week and the whole thing would collapse into one crowd. Rotation still happens, but the market does it, not the project.
Every ticker gets the same number of NFTs
The collection is divided into twenty equal groups, one per ticker. Equal groups are what make the prize share mean the same thing to everyone: a first place is worth exactly as much to an NVDA holder as it is to a Ford holder. If the mint does not sell out completely, the remainder is spread one token at a time, so no two tickers ever differ by more than a single NFT.
You cannot fish for the one you want
Minting is allowed only from a plain wallet, never from a contract. That restriction exists for a specific reason. A wrapper contract could mint, look at which ticker came out, and revert the transaction if it was not the one it wanted, paying only gas and retrying until a popular ticker landed. Bots would take every large name and real minters would get the leftovers.
Because reverting is impossible, every attempt is a real mint at full price, which makes hunting for one specific ticker an order of magnitude more expensive than simply minting. The draw also mixes in the previous block's hash, so the outcome cannot be computed in advance and timed.
A contract splits it, not a wallet.
| Source | To the treasury | To the team |
|---|---|---|
| Mint | 60% | 40% |
| Secondary royalty | 80% | 20% |
Both splits are performed by a splitter contract. The addresses and the shares are set once at deployment and are immutable: the compiled contract contains no setter, no owner and no admin function of any kind. The payout address on the drop and the ERC-2981 royalty receiver both point at that contract, not at a wallet.
This is the whole trust argument, and it is deliberately the kind you can check yourself rather than one you have to take on faith. Open the contract in the explorer, look at the list of functions, and confirm there is nothing there that could redirect the money later.
A fixed slice every week, and a heavier opening.
The treasury's share of the mint becomes the startup pool, and that pool is split in two.
The base, 75% of the pool. Divided into equal weekly slices. The number of slices is fixed at deployment, once the real size of the collection is known. The bank of those opening weeks does not shrink from one week to the next. On top of the slice sits whatever else the treasury has taken in over that week.
The launch bonus, 25% of the pool. Paid on top of the first four weeks, in shares of 45, 30, 15 and 10 percent, and it goes entirely into the part of the bank that is split evenly across every NFT. Week one pays an ordinary holder about two and a half times what a level week pays.
| Epoch | Bank, share of the startup pool | Even payout, vs a level week |
|---|---|---|
| 1 | 22.0% | 2.61x |
| 2 | 18.2% | 2.08x |
| 3 | 14.5% | 1.54x |
| 4 | 13.2% | 1.36x |
| 5 onward | 10.7% | 1.00x |
Why the bonus can exist at all
The cap described below sits on the prize, not on the bank. The part that is split evenly across every NFT is not capped by anything, so the opening weeks can be made heavier without touching first prize by a cent. The contract says this literally: the prize is computed from the bank minus the bonus.
Why the bank is a fixed slice and not a percentage
An earlier design paid out a percentage of the treasury each week. It looks elegant and it decays horribly: the bank falls off exponentially, and within a year the payout to an ordinary holder would be smaller than the gas needed to collect it. A fixed slice of a finite pool spends the treasury deliberately and visibly instead of stretching it into a rounding error.
Why the bank is capped, and by what
The number of slices is not a matter of taste. First prize is a share of the bank, and first prize is exactly what would have to stay worth less than the cost of pushing a pool around for three days. That means the thinnest pool in the set decides how large a bank the game can safely carry: make the bank bigger and the tickers with smaller pools have to be dropped from the set, which is how you end up with a collection of names nobody recognises. The slice count was chosen as the largest one that keeps the whole set including its household names.
Once the startup pool is spent
Nothing ends. From then on the bank is whatever the treasury holds for that week. The project is designed to keep running indefinitely, with a bank that is honest about its own size rather than a schedule that pretends otherwise.
35% to the podium, 65% to the whole collection.
Every figure here is a share of that epoch's bank, whatever its size. Of each bank, 35% is prize money, divided between the three winning tickers in shares of 50, 30 and 20 per cent. Inside a ticker the prize is split evenly across its NFTs. The remaining 65% is split evenly across the entire supply, which is why no holder ever finishes an epoch with nothing.
| Place | Share of the bank | Divided between |
|---|---|---|
| First | 17.5% | the NFTs of that ticker |
| Second | 10.5% | the NFTs of that ticker |
| Third | 7% | the NFTs of that ticker |
| Everyone | 65% | the whole collection |
What that works out to per NFT
Because the twenty tickers hold equal numbers of NFTs, the ratios are the same whatever the bank and whatever the supply turn out to be. An NFT of the winning ticker ends the epoch with about 6.4 times what a non-winning NFT gets, second place about 4.2 times, third about 3.2 times.
Claiming
Nothing is ever sent to you automatically. The contract keeps a running accumulator and credits your balance each epoch; you withdraw it yourself, when you choose, with a single transaction that settles every epoch you have been owed. This is not a detail: pushing payouts out to a thousand addresses every week would cost more in gas than the payouts themselves.
Selling in the middle of an epoch
Entitlement is decided by one snapshot: whoever held the token when the epoch opened is the one owed for that epoch. If you sell mid-week you keep that entitlement, and it is claimable separately. The buyer starts earning from the next epoch. Nobody is disqualified for trading, and buying the leading ticker an hour before the finish gains nothing.
Three trading days, two snapshots.
| Stage | When | What happens |
|---|---|---|
| Epoch opens | Wednesday, inside US market hours | Starting price recorded for all twenty tickers |
| Epoch runs | Wednesday to Friday | Nothing to do; the collection trades freely |
| Epoch closes | Friday, at the close | Finishing price recorded, winners ranked, bank credited |
| Open window | Friday to Wednesday | Change your ticker if you want a different one |
Both snapshots sit inside trading hours
Each snapshot is a four-hour time-weighted average rather than a single instant, which means the window it covers has to be inside the session to mean anything. A snapshot taken at Wednesday's opening bell would average mostly the night before, when the price was not moving at all. So the starting snapshot is taken a few hours into Wednesday's session, and the finishing one at Friday's close. The metric is the average of one trading window against the average of another.
The open window is deliberately blind
Between Friday's close and Wednesday's open the epoch does not exist yet. Nobody, including us, knows which ticker will win. You look at the charts and make your own call, which is the entire point of letting the window exist.
Percentage change. Nothing clever.
A ticker's result is the plain percentage change of its price between the starting and the finishing snapshot. Not an average of daily moves, not a risk-adjusted anything. Anyone can check it against a public chart in under a minute, and that is worth more than a metric that is marginally fairer and impossible to verify.
The top three of the twenty take the prize share. Everything else is a finish, not a loss, because every NFT is paid regardless.
Ties are broken by a hash, not by list order
Inside the contract the result is computed in whole units, so exact ties are common rather than exotic. If ties were resolved by position in the ticker list, the same name would win every flat week forever, which is exactly what happened the first time it was tested against a dead sideways market: one ticker took sixty epochs in a row. Ties are now broken by a hash of the epoch number and the ticker index. It is deterministic and anyone can recompute it, but it is not tied to any ordering. Tested against a fully tied market, all twenty tickers took prizes.
Chosen from the chain, then from the charts.
The obvious way to choose twenty tickers is to open a screener and pick good names. That was tried and it failed on contact with the chain: seven of the names had no official token on Robinhood Chain at all, and two more sat in pools so empty that their price could be moved for free. Half the collection would have had no honest source of price.
So the order was reversed. Start from what actually trades on chain in a pool deep enough to be expensive to move, remove names whose volatility is unstable, and only then search inside what is left for the twenty with the most even distribution of prizes.
| Filter | Names left |
|---|---|
| Candidates with quotes | 241 |
| Have an official token on chain | 177 |
| Have a dollar-denominated pool | 88 |
| Pool deep enough relative to the prize | 41 |
| Not an index fund | 34 |
| Stable volatility year to year | 28 |
Volatility has to be comparable
A race scored by percentage change is a race between volatilities. A ticker that moves 1% in a week will essentially never beat one that moves 10%. The first draft of the set ignored this and spread volatility by a factor of ten; backtested against real quotes, the two index funds in it never once reached the top three. A whole slice of the collection would have been sold to people who never had a chance. Index funds are gone and the current spread is a factor of 3.5.
Volatility also has to be stable, not merely similar on average. A name that averaged high over three years but calmed down in the last one is a trap, and one such name reached the podium just once over a long stretch of history before this was caught. Names whose volatility shifts by more than a factor of 1.8 between years are excluded.
The real test is the prize distribution
Volatility spread is a symptom; the goal is that prizes reach everyone, and that is checked directly against real historical quotes. In the current set there are no dead names, and every ticker took first place at least once.
That last condition nearly got traded away. A candidate set scored slightly better on the spread of prizes, but three of its tickers never won at all, one of them the most recognisable name in the collection. A tribe that can never win makes the whole idea pointless, so the set with the marginally worse number and no holes was chosen instead.
A four-hour average, read from the pool itself.
Prices come from the on-chain Uniswap V3 pools of the tokenized stocks, not from an API the project controls. The pool itself keeps a running record of its own price history, and the contract reads a time-weighted average over a four-hour window straight out of it. Nobody has to be trusted to report a number.
Why an average and not the price at that moment
A spot price in a pool can be pushed a long way for a short time very cheaply. A four-hour average cannot: to move it you would have to hold the price away from the truth for the whole window, against every arbitrageur who would be delighted to take the other side. Tested on a live network, a fifty-fold price spike immediately before a snapshot did not move the recorded result by a single unit.
Every pool must be priced in dollars
The deepest pools for several of these stocks are quoted in ETH rather than dollars, and using them would be a quiet disaster. In a week when ETH fell 10%, every ticker with an ETH-quoted pool would show up 10% better than the rest for reasons that have nothing to do with the companies. The race would be decided by the price of ETH. Only dollar-quoted pools are used.
Refusals are visible before any gas is spent
A snapshot is refused outright if a pool is too thin, if its last trade is stale, or if its history does not cover the full averaging window. Rather than discovering that in a failed transaction, the oracle exposes a readiness query that returns a reason code per ticker, so the state of every pool can be checked before an epoch is opened.
Four pieces, no admin key over the money.
| Contract | What it does |
|---|---|
| Collection | ERC-721. Draws and stores the ticker at mint, seals the supply, reports how many tokens each ticker has. |
| Splitter | Divides the mint and the royalties. Immutable shares, no owner, no setters. |
| Epochs | Opens and closes epochs, ranks tickers, credits balances, pays claims. |
| Oracle | Reads the four-hour average out of each pool and refuses unusable ones. |
The keeper, and what happens if it disappears
A keeper account opens and closes epochs. It never touches money: it can only cause snapshots to be taken. But without it epochs would stop, and the unplayed remainder of the startup pool would sit on the contract forever, since there is no admin and no pause to recover it.
So the epoch contract has a rescue path. After six weeks of keeper silence, anyone may distribute the entire free balance evenly across the whole supply, with no prices and no winners. The caller takes nothing for themselves. This does not end the project: if the keeper comes back it simply opens the next epoch as usual.
What has been verified
- All the core contracts deployed and exercised on a test network, including a full-size collection minted out and an epoch run end to end.
- The splitter divides exactly, down to the last wei, and a recipient that refuses payment cannot block the other.
- Ticker distribution comes out exactly even, with zero loss to rounding.
- The ranking produced from raw pool data and the ranking produced from percentages agree, checked exhaustively over thousands of random cases.
- Transaction signing is checked against published specification vectors rather than against itself, byte for byte.
- The test suite is itself tested: deliberate faults are injected into the code, one at a time, and each one has to be caught.
The honest list.
- This is not an investment. No shares are held, no dividends are paid, no return is promised, and the value of an NFT can go to zero.
- The bank is finite and it comes from the collection. The treasury is filled by the collection's own activity and by nothing else. Nothing in this document implies you will make back what you paid.
- A smaller mint means a smaller bank. The treasury is a fixed share of what actually sells, and the weekly bank scales down with it.
- Ticker luck is real. Over a long horizon the set has been checked to reward everyone, but any individual epoch is decided by the market, and your ticker may lose for many weeks in a row.
- Smart contract risk. The contracts have been tested extensively and are not formally audited by a third party. Bugs found during development are documented above rather than hidden.
- Dependence on outside infrastructure. If a tokenized stock's pool on the chain dries up or stops trading, its price becomes unreadable and the oracle will refuse it.
- The keeper can fail. If it does, epochs stop until the rescue path opens and anyone can release the balance evenly.
The words used here.
| Epoch | One week of the game, Wednesday to Friday, with a starting and a finishing snapshot. |
| Snapshot | A four-hour time-weighted average price for every ticker, read out of its pool. |
| Bank | The money paid out for one epoch: a slice of the startup pool plus what the treasury took in that week. |
| Startup pool | The treasury's share of the mint, divided into equal weekly slices for the opening stretch of the project. |
| Prize share | The 35% of a bank that goes to the top three tickers, in shares of 50, 30 and 20 per cent. |
| Collection share | The 65% of a bank split evenly across every NFT, winner or not. |
| Open window | Friday close to Wednesday open, when you can change which ticker you hold. |
| Sealing | Recording the final supply on chain once the mint is over, after which no more tokens can exist. |
| Keeper | The account that opens and closes epochs. It cannot touch any money. |
| Splitter | The contract that divides the mint and the royalties on fixed, unchangeable shares. |

Stockhoppers