Five thousand pixel units on Robinhood Chain whose artwork is stored in contract code, paired with a token that is burned to put them to work and a pool that pays them a share of every trade. This document states the mechanism precisely, shows the arithmetic, and lists what can go wrong.
The art disappears. A collection stores a link. The
contract says ipfs://…, and a pinning service on the other
end holds the picture. Pinning is a subscription. When a project goes
quiet the subscription lapses, and what a holder owns becomes a number
pointing at nothing.
The token stops being needed. The usual design has an NFT that mints a token every day. Supply rises forever, demand does not, and the price goes one way. Projects patch it afterwards with burns and games, which is an attempt to build a drain after the tap is already running.
HoodUnits inverts both. The artwork is drawn by the contract, so there is nothing to keep paying for. And nothing is minted to pay anyone — rewards are a share of fees that already exist, while the token is only ever consumed.
Each unit is a 32×32 grid built from nine trait layers. The contract stores two things: the layer shapes, once, as run-length data; and per unit, nine trait indices packed into 24 bytes alongside the candlestick figures drawn behind him.
tokenURI decodes those bytes, paints the layers in order,
traces a dark outline around whatever silhouette results, and emits an
SVG as base64 JSON. Nothing is fetched. The entire collection is 120,000
bytes of trait data plus 1,136 bytes of layer shapes.
The renderer must reproduce the published artwork exactly, or the provenance hash would name something the contract can no longer draw. It is tested by comparing whole strings — the contract's SVG against the generator's — across 48 units chosen to include every rare trait.
One consequence worth stating: colour arithmetic in the generator uses integer round-half-up rather than floating point, because Solidity has no floats and a shade off by one would break that equality.
| Property | Value |
|---|---|
| Canvas | 32 × 32 pixels |
| Trait categories | 9, with 65 variants between them |
| Combinations | 13,208,832 |
| Supply drawn from it | 5,000 · 0.04% |
| Storage per unit | 24 bytes |
| Layer data | 1,094 bytes total, shared by all units |
| Provenance | 31500d8f6f21449052c19bfb5e8e8caa75b2d9414c4f15b4a178e594b1eebf02 |
| Mutable after sealing | No |
A unit earns nothing until recruited. Recruiting transfers a fee in UNITS, once per unit, and splits it in half in the same transaction.
The burn goes to an address with no known key rather than through a
burn() function, because a token minted by a launchpad may
not have one. A transfer works on any ERC-20.
The half that stays becomes reward for everyone already staked, so joining pays the people who joined before you. That is deliberate: it rewards being early without granting the team anything.
The fee is an owner-settable number, meant to be raised as the token finds a price. It starts low on purpose — a fee nobody can afford burns nothing and starts no flywheel. The split is not settable. Fifty-fifty is fixed in code.
A recruited unit can be staked. The pool takes custody while he works and returns him on request, with no lock-up and no penalty.
Every staked unit has an identical claim on the pool. An earlier design had three paid tiers with weights of 1×, 5× and 25×, and it failed a test that matters more than elegance: it could not be explained back in one sentence by the person who commissioned it. A mechanism its own founder cannot state plainly is one buyers will not understand either.
Equal shares also point demand somewhere more useful. Under tiers, more reward is bought with more token. Under equal shares, more reward is bought with more units — which is demand for the collection itself.
Fees accumulate in the pool. Anyone may call the function that starts a payout, and the payout is then released continuously over seven days rather than split among whoever happens to be staked at that moment.
A lump split creates exactly one profitable instant. Being staked for the second before it pays the same as being staked all month, which invites arriving just in time and leaving immediately after. The usual patch is a lock-up or a cooldown, which punishes honest holders to stop a minority.
A drip removes the instant instead of policing it. An hour staked earns an hour's worth. There is nothing to snipe, so nothing needs forbidding, and anyone can leave whenever they like.
| Approach | Sniping | Cost to honest holders |
|---|---|---|
| Lump split | Profitable | None until they are diluted by snipers |
| Split plus lock-up | Blocked | Cannot leave when they want to |
| Drip | Pointless by construction | None |
Paying thousands of stakers by iterating over them would run out of gas long before the collection sold out. Instead the pool keeps one running number per asset — reward accumulated per staked unit — and each unit remembers the value it last settled at.
Staking, unstaking and a sale all settle every asset before the divisor changes, or the new share count would be applied backwards across time that has already passed.
Two edge cases are worth stating because both involve real money. When nothing is staked, the clock is not advanced. Advancing it would strand whatever dripped into an empty pool; leaving it pays those seconds to whoever stakes next. When a payout is started with nothing staked, the call does nothing at all and the balance simply waits, so no fee is ever lost to bad timing.
When a unit changes hands, his recruitment is cleared in the same transaction. The buyer owns the artwork and everything else, but must pay to recruit him before he can work again. Anything already earned stays claimable.
Without this rule the fee is paid once per unit by its first owner, and after one pass through the collection the token has no remaining use. With it, every trip through the secondary market burns supply again.
Staking and unstaking route the unit through the pool contract and are explicitly not treated as sales — otherwise taking a unit out for a day would cost the fee again.
UNITS is launched on a Robinhood Chain launchpad with a trading tax. The tax is split at launch between the creator allocation, a burn, and a dividend paid to plain token holders. The creator allocation is what reaches this pool.
Both sides of the project earn. Holding UNITS alone collects the launchpad's dividend without owning anything else. Holding a staked unit collects that plus a share of the creator allocation — a smaller pot divided among far fewer participants, which is the reason to own a unit at all.
The pool accepts up to four assets and pays out whatever is sent to it.
The asset chosen is NVDA — tokenised NVIDIA, contract
0xd0601CE157Db5bdC3162BbaC2a2C8aF5320D9EEC, a plain ERC-20
with eighteen decimals that Robinhood issues on this chain against real
shares. The launchpad tax arrives in ETH; the sweep converts it before it
reaches the pool. No contract change was needed for this.
Two properties of that token were checked before it was chosen rather than
assumed. A contract can hold it: four of NVDA's sibling
token TSLA's five largest holders are contracts, including a Uniswap
pool manager and a MEV bot, so the compliance gates the issuer's
documentation mentions do not exclude ordinary contracts. Had that not
been true, the pool could never have custodied the asset and every
claim() would have reverted, stranding rewards permanently.
And market hours do not reach the drip: the pool hands out
the token, not a price, so a weekend accrues exactly like a weekday. Hours
constrain only the conversion step, which is ours to time.
NVDA was picked over the alternatives on depth. Thinner stock tokens on this chain — MSTR has under nine hundred in existence — would move against us on every conversion.
Deployed to Robinhood Chain on 6 August 2026, block 30,078,247. The artwork was sealed in the same run, so these addresses are final.
| Deployed | Address |
|---|---|
| HoodUnits | 0x7d79008259c78Bd77b2972E79d93B93310B57038 |
| HoodPool | 0x0398B88c2020EC4822eC12E569B3364725cDf795 |
| HoodUnitsRenderer | 0x831a818eb108D43D1f8a59E4F66087a396f55cD6 |
| Reward asset (NVDA) | 0xd0601CE157Db5bdC3162BbaC2a2C8aF5320D9EEC |
0x35FA…5962 and 0xc410…BC8A
is also on chain and should be ignored. That collection had no per-wallet
mint cap and no way to add one, so it was abandoned before the sale
opened. Nothing was ever minted from it. Stating this rather than quietly
leaving it there is the point: the addresses above are the only ones that
matter, and anyone can confirm the old ones have a supply of zero.
| Contract | Does |
|---|---|
| HoodUnits | ERC-721. Holds trait data, mints, serves tokenURI, tells the pool about transfers |
| HoodUnitsRenderer | Pure. Turns 24 packed bytes into an SVG |
| HoodUnitsData | A library, not a deployment. Generated layer shapes and palettes, compiled into the renderer |
| HoodPool | Recruitment, staking, accrual, claims |
| SSTORE2 | Writes the trait blobs as contract code rather than storage |
| Power | Bounded by |
|---|---|
| Set the mint price | Only affects future mints |
| Set the per-wallet mint cap | Starts at 10. Raising it cannot undo mints already made, and zero removes the cap entirely |
| Open or close the sale | Cannot mint without payment |
| Withdraw mint proceeds | Mint revenue only. Cannot touch the pool |
| Set the recruit fee | Only affects future recruits. Cannot change the 50/50 split |
| Name the token to be burned | Set once, after the launchpad mints it |
| Add a reward asset | Maximum of four, and only adds |
| Detach the pool from the collection | Emergency only. Stakes and balances are untouched |
There is no promised yield, no floor price, no roadmap of features that do not exist yet, and no treasury that has to be trusted. The pool cannot be withdrawn from. The supply cannot be raised. The artwork cannot be changed.
What is promised is narrow and checkable: 5,000 units whose pixels live in contract code, a fee that burns half of itself when a unit is put to work, and a pool that pays whatever it receives out to those units in equal shares over seven days. Every one of those claims can be verified on-chain without asking anyone.