How the MACHINES protocol works
Every 3.5 days, holders vote on a stock. The treasury buys it and puts it inside the Machines. This page describes each step, what it costs, and who is allowed to trigger it.
What this is
A Machine is an NFT that owns a wallet. Anything sent to that wallet belongs to the Machine rather than to whoever is holding it today, so when a Machine is sold, its contents go with it. The protocol spends its income on tokenized stock and puts that stock in those wallets.
The protocol token is written $TICKERNAME throughout these docs. It has
one job: it is what you burn to switch a Machine on, and it is what the market
prices. There is no staking contract, no lockup, and no separate governance token.
It is a placeholder, not the ticker. The real name and symbol are revealed at
deployment, in the transaction that mints the supply. Everywhere you see
$TICKERNAME below, read it as "the protocol token", and treat any
token trading under that name today as somebody else's.
Burn $TICKERNAME to activate a Machine. Active Machines earn
$TICKERNAME and get a vote. The vote picks a stock. The treasury buys
it and sends it to the Machines. Every step after the vote is on chain.
The loop
One epoch is 3.5 days. The same six steps run every epoch, in order.
- Sync permissionless The mine closes the previous epoch and folds in Machines whose ink started or expired. Every share count downstream depends on this.
- Open the ballot ballot manager Up to 32 stocks are put forward. A stock only qualifies if it has a live price feed, was issued by the real issuer's factory, and is routable.
- Vote holders 48 hours. One active Machine is one vote, and a Machine votes once.
- Finalize permissionless The tally is counted on chain and the winner is handed to the treasury. Nobody gains by being the caller, and nothing is lost if the team is asleep.
- Buy permissionless, bounded The treasury buys the winner in chunks. The price floor comes from the oracle, not from the caller.
- Distribute permissionless The stock is split evenly across every Machine that was active for that epoch and pushed into each Machine's own wallet.
An epoch with zero votes cannot be finalized, so nothing is bought and the treasury rolls forward to the next epoch. Nothing is lost and nothing is stuck.
Network
Everything runs on Robinhood Chain. The Machines, the token, the stock and the pool are all on the same chain, so no step in the loop crosses a bridge.
| Field | Mainnet | Testnet |
|---|---|---|
| Chain ID | 4663 (0x1237) | 46630 (0xb626) |
| EVM version | Cancun | Cancun |
| Account standard | ERC-6551, registry 0x000000006551c19487814612e58FE06813775758 | |
| Venue | Uniswap V4, PoolManager 0x8366a39CC670B4001A1121B8F6A443A643e40951 | |
| Multicall3 | 0xcA11bde05977b3631167028862bE2a173976CA11 | |
Machines
Ten thousand Machines exist already. Each one has a deterministic ERC-6551 account derived from its token id, which means the address is known before the account is deployed and tokens can be sent to it either way.
A Machine is in one of three states:
| State | Meaning |
|---|---|
| Dormant | No ink. Earns nothing, cannot vote, receives no stock. |
| Lit | Inked this epoch. Starts earning next epoch. |
| Earning | Active for a full epoch. Earns, votes, and is counted for the drop. |
Ink and earnings belong to the Machine, not to the wallet holding it. Sell a Machine mid-run and the buyer gets the remaining epochs and whatever is already inside.
Ink
Ink is the activation cost, paid in $TICKERNAME. It buys 8 epochs, which
is 28 days, and it cannot be refunded. Topping up early extends the run rather than
restarting it.
| Parameter | Value | Why |
|---|---|---|
| Cost | 0.11% of the current epoch's emission | It tracks the schedule instead of being a fixed number that goes stale. |
| Duration | 8 epochs | 28 days at 3.5 days per epoch. |
| Burned | 50% | Destroyed. Supply only ever falls. |
| To the treasury | 50% | Funds the stock purchases. |
| Starts earning | Next epoch | A Machine cannot be paid for the epoch it was inked during, and cannot be inked mid-week to swing a ballot it can already see. |
Because the cost is a share of the epoch emission and the reward is a share of the same emission split across everyone active, the return depends entirely on how many Machines are switched on:
| Active Machines | A run earns, in tokens | Against ink of |
|---|---|---|
| 1,000 | ~8x the cost | 1x |
| 7,272 | break even on emission alone | 1x |
| 10,000 | ~0.73x | 1x |
At full participation a run earns less $TICKERNAME than the ink cost.
Half of what you pay is not spent, it is banked and comes back as stock, so the
real cost of a run is the burned half. Counting that, inking pays for itself below
about 14,500 active Machines, which is more than exist. The emission is not the
return. The stock is.
Emissions
800,000,000 $TICKERNAME, 80% of supply, is locked in the mine and paid
out on a fixed curve. Every active Machine is one share, so an epoch's emission is
divided evenly among whoever is switched on.
- Genesis: epochs 1 to 8 emit at twice the base rate.
- Taper: from epoch 9 the rate falls 1.3% per epoch, forever, approaching zero rather than ending at a cliff.
The constants are derived from the budget rather than picked, so the series sums to exactly 800,000,000 by construction. There is no halving, on purpose: a halving creates a known date to sell into.
Earnings accrue to the Machine and are claimed into its own wallet. Claiming is free beyond gas, and unclaimed earnings are not lost.
The vote
The ballot is open for 48 hours of each epoch and carries up to 32 tickers.
- One active Machine, one vote. Hold a hundred Machines and you have a hundred votes, which is the same rule for everybody.
- A Machine votes once per epoch. Recorded against the token id, so selling a Machine after voting does not produce a second vote.
- Only Machines active at the start of the epoch may vote. You cannot ink after seeing the ballot and vote in it.
- Ties break to the lower address, so the order the tickers were listed in cannot sway the result.
The tally is on chain. It is not a signature site with a multisig reporting the result, because the vote is the headline mechanic and should be the last thing running on trust.
What gets on the ballot
A stock qualifies only if all three hold:
- It has a live Chainlink feed, fresh enough for the treasury to accept.
- It was deployed by the issuer's own factory. This matters more than it sounds: searching the chain for Apple returns four tokens, one copying the real name character for character. Name and symbol are forgeable. The deployer is not.
- There is an honest route to buy it, priced within tolerance of the oracle.
The treasury
Once a ballot is finalized, the treasury buys the winner. Anyone can trigger a buy and there is a small bounty for doing so, because a protocol that only works while a particular server is awake is a protocol with a single point of failure.
What the caller controls is timing and route. What the caller cannot touch is the price:
| Guard | Effect |
|---|---|
| Oracle price floor | Minimum output is derived on chain from Chainlink feeds. A caller-supplied minimum is not a slippage guard, it is a request to be trusted. |
| Slippage cap | A fill more than the configured tolerance away from the oracle reverts. Hard capped at 5%. |
| Chunking | One buy spends a bounded share of the treasury, so a single transaction cannot move the market or drain the balance. |
| Pacing | A minimum interval between chunks. |
| Router allowlist | Only approved venues. The caller cannot point the treasury at a contract of their own. |
| Feed freshness | A stale feed is refused rather than trusted. |
| Bounty | Capped at 1%, and set well below that. |
Together these bound what a hostile or bribed caller can extract to a fraction of a percent of one chunk, and they do it without anybody needing to be trusted.
Distribution
When the epoch closes, the stock the treasury bought is handed to the distributor, which divides it evenly across every Machine that was active for that epoch and pushes it into each Machine's ERC-6551 account.
Push, not claim. There is nothing to race for and nothing expires. Settlement runs in batches so ten thousand Machines clear in a manageable number of transactions, and it is idempotent: a batch can be retried or overlapped and nothing is ever paid twice.
The Machine is not a claim ticket. The stock is inside it. That is what makes a Machine worth something on the secondary market beyond the art.
The token
$TICKERNAME is the codename. The ticker it launches under is revealed
at deployment and not before, so nothing here should be taken as the symbol to look
for on an exchange. The address will be published on this site and readable from the
mine contract on chain, which is the only pair of places worth trusting for it.
Fixed supply, minted once in the deploy transaction, and only ever destroyed. No mint function, no owner, no pause, no upgrade path, no blacklist.
| Allocation | Share | Amount | Purpose |
|---|---|---|---|
| Emissions | 80% | 800,000,000 | Locked in the mine, paid on the curve |
| Liquidity | 10% | 100,000,000 | The launch pool |
| Treasury | 5% | 50,000,000 | Protocol reserve |
| Airdrop | 5% | 50,000,000 | Starting ink, 5,000 per Machine |
| Max supply | 1,000,000,000 | Falls from here, never rises |
There is deliberately no transfer tax. A fee on transfer breaks Uniswap V3's swap callback, forces an exemption list covering every router and aggregator route where one missed route is a reverting swap, and makes the token something every scanner flags. The fee is collected by the venue instead.
The starting ink airdrop
Every Machine is sent its starting ink before trading opens, straight to its own wallet. This is an anti-sniping measure as much as a giveaway: holders who arrive at an open market with no ink would have to buy some before switching a Machine on, and that is a gas war the bots win. It is pushed, not claimed, so there is nothing to race for.
Sell fee
A Uniswap V4 hook on the $TICKERNAME pool charges a fee on sells.
Buying and plain transfers are untouched, and there is no exemption registry to
maintain or get wrong.
| Parameter | Value |
|---|---|
| Opening rate | 90% |
| Resting rate | 5% at launch, adjustable 0% to 10% |
| Hard ceiling | 10%, a constant, no function raises it |
| Ramp | Linear over the first 30 minutes of trading |
| Split | 30% founders, 70% stock treasury, founders capped at half |
| Charged on | Sells only |
Nothing trades until trading is opened. The pool can hold liquidity for days before anyone can swap against it, because every swap reverts until a single one way switch is thrown. That is deliberate: liquidity goes in early so it can be checked, and the market starts when it is meant to rather than the moment the pool exists.
The ramp starts at that switch, not at a date chosen when the contract was deployed. Its shape is immutable and nothing can change it, including the owner, so it can be checked before launch and believed during it. It ramps rather than steps, because a step creates one exact second everybody races for. There is no way to close trading again.
The resting rate is a dial, between 0% and 10%. Once the ramp is over, the owner can move the fee anywhere in that range. The ceiling is a constant in the contract rather than a promise on a page: an uncapped sell fee is the mechanism of a honeypot, where buyers can buy and never sell, and a limit written in code is the only version of "we would not do that" worth anything. There is no function to raise the cap, and no pause and no blacklist.
The split between the founders and the stock treasury can also be moved, and the founders' share cannot exceed half of any fee. The rest always buys stock.
A round trip inside the first minute returns about a tenth of what went in, which prices out flipping the launch entirely. Be clear about what it does not do: the fee is charged on the way out, so a buyer who waits out the thirty minutes leaves paying the permanent 5% like anyone else. It deters the flip, not the accumulation.
The 3.5% share is the second inflow to the treasury and the one that needs no human involvement at all: it arrives already denominated in the currency the treasury spends.
It is charged by the pool, not by the token. A Uniswap V4 pool is identified by the hash of its two currencies, fee, tick spacing and hook, so a pool with no hook is a different pool and anybody can create one. What keeps trading in the pool that charges the fee is depth: selling into a market a tenth the size costs more in price impact than the 5% being avoided.
The pool
A single Uniswap V4 pool against a stablecoin quote, initialized and funded in one transaction so it cannot sit half seeded. The hook address is mined with CREATE2, because V4 encodes hook permissions in the low bits of the hook's own address and an address without the right bits is not a valid hook.
Swapping goes through a thin adapter that settles directly against the PoolManager on a plain ERC-20 approval. The stock router settles through Permit2, which ignores a plain allowance, and the treasury pattern is approve-and-call.
Attributes
Everything in this section is deployed and frozen on chain today, and none of it affects a single payout. Version one ignores attributes entirely: every active Machine is one share, whatever it is wearing. This is here because the data is committed before it can carry any economic weight, which is the only order that makes it trustworthy.
Every Machine has two traits that were frozen on the NFT contract at mint and pinned to IPFS. Its headwear sets a share weight, and its body puts it on a sector desk. Both are committed on chain as one byte per Machine, high nibble for the desk, low nibble for the weight.
Weight classes
Seven classes, fixed forever in that order. The counts below are the collection as it actually is, not a plan:
| Class | Machines | Share of the collection |
|---|---|---|
| 1x | 7,131 | 71.3% |
| 1.5x | 407 | 4.1% |
| 2x | 1,356 | 13.6% |
| 3x | 559 | 5.6% |
| 4x | 429 | 4.3% |
| 6x | 81 | 0.8% |
| 10x | 37 | 0.4% |
| Total weight | 14,702.5 shares across 10,000 Machines | |
Sector desks
Sixteen desks, one per ticker the collection was drawn around:
| Desk | Machines | Desk | Machines |
|---|---|---|---|
| AAPL | 1,322 | GME | 661 |
| NVDA | 1,245 | TSLA | 562 |
| AMD | 1,239 | SPCX | 532 |
| AMZN | 911 | COST | 514 |
| RDDT | 888 | ETH | 111 |
| MSFT | 886 | SLV | 78 |
| GOOGL | 876 | PLTR | 66 |
| USDG | 56 | ||
| USAR | 53 |
Why it is sealed before it is used
The full ten thousand byte blob is committed as a hash in the constructor, before any of it is written. Sealing recomputes the hash over what was actually stored and reverts unless it matches, and after that nothing can be written again. So the attributes are provably the ones published at deploy rather than whatever was uploaded afterwards.
It is plain storage rather than merkle proofs. Ten thousand bytes is 313 slots, which costs about a dollar to write once on this chain. Paying that once removes a proof argument from every claim, removes any off-chain data the protocol has to trust, and lets anybody read the allocation straight off the contract forever.
What a later phase could do with it
The contract can already answer "what is this Machine worth if the winning stock is on its desk", with the multiplier supplied by the caller rather than baked in, so the policy would live in the distribution contract and this one stays a record of the artwork. Nothing calls it.
Switching that on changes who gets paid what, so it is a separate module and a public decision, not a flag somebody can flip. Until that happens, the honest description of attributes is: they are art, they are provably fixed, and they pay nothing.
The keeper
The keeper is a stateless state machine. It reads the chain, decides what is due, does one thing, and reads again. It holds no state between runs, so stopping it, restarting it, or running it after a crash all behave the same way.
SYNC -> OPEN_BALLOT -> FINALIZE -> BUY -> HAND_OFF -> SETTLE
It paces itself from the epoch length, so the same binary is correct on a 3.5 day epoch and on a short rehearsal epoch.
The keeper is a convenience, not a dependency. Four of the six steps are permissionless, which means the loop can be driven by anybody if the keeper stops.
Who can do what
| Action | Who | If nobody does it |
|---|---|---|
| Sync | Anyone | Happens automatically on the next ink or claim |
| Open a ballot | Ballot manager | No vote that epoch, treasury rolls forward |
| Vote | Machine owners | No winner, nothing is bought |
| Finalize | Anyone | The result is already fixed by the tally |
| Buy | Anyone, for a bounty | The balance rolls forward |
| Hand off | Owner | Stock waits in the treasury |
| Settle | Anyone | Stock waits in the distributor |
| Claim | Machine owners | Earnings keep accruing, nothing expires |
Nothing in the table can mint $TICKERNAME. That is not permissioned, it
does not exist: the token has no owner and no upgrade path, so there is no address
anywhere that can do it.
The sell fee is different and worth being exact about. The owner can move the resting rate, but only between 0% and 10%, because the ceiling is a constant in a contract that cannot be replaced. So the fee can change and it cannot be used to trap you.
Upgrades
Four contracts can be replaced by their owner: the mine, the vote, the treasury and the distributor. They hold the operating logic, and a bug in accrual or settlement needs a way to be fixed.
Being honest about what that means, because it is the price of the feature. The owner of those four could change the emission schedule, change how the vote is counted, or change where a drop is sent. Upgrading is not a way to mint supply or raise the sell fee, since neither of those lives in an upgradeable contract, but it is real power and worth pricing in.
| Contract | Upgradeable | Why |
|---|---|---|
| MachineMine | yes | Accrual and epoch logic, the part most likely to need a fix |
| MachineVote | yes | Ballot and counting rules |
| TreasurySwapper | yes | Routing and price guards, which track venues that change |
| RWADistributor | yes | Settlement, which walks the whole collection |
| ProtocolToken | no | An upgradeable token is a token with a mint function. Fixed supply has to mean fixed. |
| SellFeeHook | no | Not replaceable. The rate is a bounded dial inside it, hard capped at 10%, and the launch ramp is fixed. |
| MachineTraits | no | The seal is the point. Replaceable attributes are not sealed attributes. |
They are UUPS proxies, so the upgrade function lives in the implementation behind an owner check, and every implementation is deployed locked so nobody can claim one and point a proxy at it. Upgrade authority is a single owner key today. Moving it to a multisig with a timelock, so a change is announced before it can land, is on the pre-launch list.
Numbers at a glance
| Parameter | Value |
|---|---|
| Epoch | 3.5 days |
| Vote window | 48 hours |
| Tickers per ballot | up to 32 |
| Ink duration | 8 epochs, 28 days |
| Ink cost | 0.11% of the epoch emission |
| Ink burned | 50% |
| Max supply | 1,000,000,000 $TICKERNAME |
| Emission budget | 800,000,000, genesis 8 epochs at 2x, then -1.3% per epoch |
| Sell fee | 90% at open, 30 minute ramp, resting 5% adjustable 0 to 10% |
| Sell fee split | 1.5% founders, 3.5% stock treasury |
| Machines | 10,000 |
| Starting ink | 5,000 $TICKERNAME per Machine |