01 · What this is

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.

What this is not. The collection does not own shares, does not track a portfolio and pays no dividends. The tickers are a scoreboard, not an asset you hold. The money paid out each week comes from the collection's own treasury.
02 · The ticker

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.

03 · Where the money goes

A contract splits it, not a wallet.

SourceTo the treasuryTo the team
Mint60%40%
Secondary royalty80%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 detail that matters in practice. If one recipient refuses to accept a transfer, the other is not blocked. The refused share is recorded as a debt and waits to be withdrawn, instead of reverting the whole payment and freezing both sides.
04 · The bank

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.

EpochBank, share of the startup poolEven payout, vs a level week
122.0%2.61x
218.2%2.08x
314.5%1.54x
413.2%1.36x
5 onward10.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.

05 · Payouts and claiming

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.

PlaceShare of the bankDivided between
First17.5%the NFTs of that ticker
Second10.5%the NFTs of that ticker
Third7%the NFTs of that ticker
Everyone65%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.

An example, not a forecast. Say an epoch bank of 1000 and a collection of 1000 NFTs, which is 50 behind each ticker. First place would pay 4.15 per NFT, second 2.75, third 2.05, and every other NFT in the collection 0.65. The numbers are made up to show the shape of the split; the real bank depends on the treasury and is published before the epoch.

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.

06 · The epoch

Three trading days, two snapshots.

StageWhenWhat happens
Epoch opensWednesday, inside US market hoursStarting price recorded for all twenty tickers
Epoch runsWednesday to FridayNothing to do; the collection trades freely
Epoch closesFriday, at the closeFinishing price recorded, winners ranked, bank credited
Open windowFriday to WednesdayChange 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.

07 · Metric and winners

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.

08 · The ticker set

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.

FilterNames left
Candidates with quotes241
Have an official token on chain177
Have a dollar-denominated pool88
Pool deep enough relative to the prize41
Not an index fund34
Stable volatility year to year28

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.

How good is good. If all twenty tickers were literally identical, random chance alone would still spread the prizes unevenly over the same stretch of history, and by about as much as the current set does. That is the floor: the differences between these tickers are no longer distinguishable from luck, and there is nothing further to optimise.
09 · Price oracle

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.

10 · Contracts

Four pieces, no admin key over the money.

ContractWhat it does
CollectionERC-721. Draws and stores the ticker at mint, seals the supply, reports how many tokens each ticker has.
SplitterDivides the mint and the royalties. Immutable shares, no owner, no setters.
EpochsOpens and closes epochs, ranks tickers, credits balances, pays claims.
OracleReads 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.
Two bugs worth naming. Selling an NFT mid-epoch used to strand that epoch's payout: the buyer correctly received nothing, but the seller never got it either, and the money stuck on the contract forever. Fixed, and then a second, deeper version of the same bug was found where a second sale overwrote the first seller's claim. Both were found by long simulated runs with trading, not by scenario tests, which is why those runs are kept.
11 · Risks and limits

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.
12 · Glossary

The words used here.

EpochOne week of the game, Wednesday to Friday, with a starting and a finishing snapshot.
SnapshotA four-hour time-weighted average price for every ticker, read out of its pool.
BankThe money paid out for one epoch: a slice of the startup pool plus what the treasury took in that week.
Startup poolThe treasury's share of the mint, divided into equal weekly slices for the opening stretch of the project.
Prize shareThe 35% of a bank that goes to the top three tickers, in shares of 50, 30 and 20 per cent.
Collection shareThe 65% of a bank split evenly across every NFT, winner or not.
Open windowFriday close to Wednesday open, when you can change which ticker you hold.
SealingRecording the final supply on chain once the mint is over, after which no more tokens can exist.
KeeperThe account that opens and closes epochs. It cannot touch any money.
SplitterThe contract that divides the mint and the royalties on fixed, unchangeable shares.