RollaCoasta

A thirty-second market on Robinhood Chain. Every fee it earns buys real stock for $ROLLA holders.

Connecting…
Demo mode. No RollaCoasta server is reachable, so the engine is running locally in this tab and the round seed is generated in your own browser — which means the fairness proof below proves nothing here. Run the server (npm start) for the real thing, where the seed never leaves the backend until settlement.
Real stock sent to $ROLLA holders loading…
$GUH
100.00
Live
30.0s
Stake
Leverage
Play balance your stake
Markets
loading…
Your account
Wallet ETH—
In‑play (practice)—
NetworkNot connected
Fees contributed0.0000
Rounds played0
Provably fair
Round#1
Commit…
Client seed…
Server seedsealed until settle
The tapeI/L 0.00
Pool$

Farm the house — real ETH

Provide ETH liquidity to back the game and earn the house edge, or deposit ETH to play for real. Balances are held by an on-chain vault you can verify; withdraw anytime. Unaudited beta — only deposit what you can afford to lose.

Pool TVL—
House equity (LPs)—
Player balances—
Your LP value—
Your play balance—
Your ETH (wallet)—
Provide liquidity the house side
Connect a wallet to farm or deposit. Verify the pool ↗
Ride01

What RollaCoasta is

RollaCoasta is a leveraged trading game played on synthetic tickers that live for thirty seconds. Every fee the game and the token generate is used to buy real equities, which go to $ROLLA holders. All of it.

A ticker lists at 100.00 and has half a minute to live. You go long or short at up to 100×, and you get out before it gets you — or you don’t. Then it delists and a new one lists two seconds later.

The price is not a random number generator with a chart drawn on top. It is driven by the order flow of the people trading it. Longs push it up, shorts push it down, liquidations shove it further, and funding drags it back. Squeezes and cascades are not animations — they are what the equation does when a crowd leans one way. That is what makes the tape worth reading, and it is what makes reading it an actual edge.

Underneath the game is a single, unusually short pipe. Fees go in one end, tokenised stock comes out the other, and $ROLLA holders own it. There is no cut taken along the way.

RollaCoasta
The platform. The game, the engine, the vault.
$ROLLA
The token. Hold it and the equities the vault buys accrue to you.
$GUH
The instrument. The synthetic ticker you actually trade — first of a series.
0.25–0.35% fee → split where the work is LPs 0.20% · Oracle nodes 0.05% · Stock→holders 0.05% · Buyback&burn 0.05% · Team 0%
Ride02

The first instrument is called $GUH

$GUH is not a company. It is a price, generated live, that exists for thirty seconds and then stops existing.

You enter at any moment. You close whenever you want, or the clock closes you at 0:00, or the price reaches your liquidation level and closes you the hard way. There is no overnight, no thesis, no waiting for earnings. There is a bar under the chart that says your live P&L, and it is also the button that gets you out.

The name is not decoration. It is the sound a Robinhood trader made in 2019 on discovering what a box spread does, and it is the only appropriate name for the first instrument in this series.

It launches alone, deliberately: one price path to tune, one order book, and everybody concentrated in the same thirty seconds. A thin market split six ways is six dead markets. The rest of the series unlocks later — see Ride 05.

Ride03

The price is made of you

Most games like this roll dice and draw the result. RollaCoasta does something else: the order flow is an input to the price. Every open position pushes the price in its own direction. The crowd is not betting on the chart. The crowd is the chart.

Each instrument runs this same engine with its own parameters. Below is the general form; $GUH’s specific numbers are in Ride 04. This is the exact equation running in the chart above.

Price evolution over one round, per tick dt dP/P = μ(s)·dt regime drift + σ(s)·dW committed random noise + λ·sign(I)·|I/L|^1.4·dt order-flow impact ← the whole idea + κ±·J·dN± jumps (the wicks) − φ·F(I/L)·dt funding drag I net open-interest imbalance (long notional − short notional) L farm-pool depth s hidden regime: CALM · PUMP · DUMP · EUPHORIA J jump magnitude, dN± jump arrival (Poisson, asymmetric)
Table 3.1 — what each term is for
TermNameWhat it does to the chart
μ(s)·dtRegime driftA hidden state machine flips between calm, pump, dump and euphoria on its own clock. You never see which regime you are in — you infer it, late, from the tape.
σ(s)·dWFair noiseThe provably-fair component. Seeded and committed before the round opens (Ride 08). This is the only part an operator could theoretically rig, which is exactly why it is the part that gets published.
λ·sign(I)·|I/L|^1.4Flow impactNet imbalance moves the price. The 1.4 exponent makes impact superlinear, so pushing the price is possible but gets brutally expensive — whales can try, and the attempt taxes them in public.
κ±·J·dN±JumpsPoisson wicks. Rare, violent, and asymmetric — this is where an instrument gets its personality.
−φ·F(I/L)Funding dragWhen the crowd stacks one way, funding pulls against it. Without this, a one-sided round walks the price to infinity and the game ends.

The loop this creates

Because liquidations force positions closed, and closing a position changes I, liquidations feed the same term that caused them. Nobody scripts a squeeze. The squeeze is what the equation does on its own.

Traders openlong / short Net imbalanceI = L$ − S$ Price movesλ·|I/L|^1.4 Liquidationsfire forced closes re-enter I — the squeeze Pool depth L damps Funding φ opposes I
The reflexive loop. Imbalance moves price, price triggers liquidations, and liquidations are forced orders that land back in imbalance — a self-feeding cascade. Pool depth L sits in the denominator and damps every push; funding drags the crowd back toward flat.

This only works peer-to-peer. Traders are counterparty to each other. If the house took the other side of a price it also influences, flow-driven pricing would be a printing press pointed at the house. It is not, and it must never be.

Fills are batched on purpose

Every order arriving inside a 100 ms window fills at the same price. Because flow moves price, unbatched fills would hand a decisive edge to whoever sits closest to the matching engine, and the game would become a latency auction no human can enter. Batching kills that outright — and it is why the agent API in Ride 07 is a fair fight.

The farm pool is a physics constant

Pool depth L is the denominator of the impact term, so it is not a yield sticker — it sets how violent the chart is. A thin pool means every order swings it. A deep pool smooths it out.

Which creates a trap worth naming: liquidity providers want a calm chart, traders want a violent one, and growing the pool would quietly kill the game. So as L grows, λ scales down and σ scales up to hold total volatility constant. The chart stays exactly as wild, while LP risk shifts from directional and ruinous to symmetric and survivable.

Ride04

$GUH grinds up and knifes down

$GUH’s defining parameter choice is jump asymmetry: downside jumps are 2.6× larger than upside jumps and arrive more than twice as often, offset by a positive baseline drift.

The result is a chart that climbs in small, reassuring increments and then falls off a cliff without warning. It rewards patience and then punishes it. It is a machine for manufacturing the exact noise the ticker is named after.

0:000:30 κ⁻ jumpκ⁻ jump
One characteristic $GUH round. Fourteen small green steps to build a position worth holding; one red tick to remove it. Longs die to the jumps, shorts die to the grind.
Table 4.1 — GUH-PERP-30 parameter set
ParameterValueNotes
σ — calm0.9 %/√sBaseline noise floor.
σ — feral3.4 %/√sReached when open interest overwhelms pool depth.
λ — impact0.85How hard a unit of imbalance pushes.
Impact exponent1.4Superlinear. The anti-whale.
κ⁺ — up jump1.0×Upside wick scale — the baseline.
κ⁻ — down jump2.6×The signature. Down jumps hit 2.6× harder.
dN⁺ rate0.05 /sRoughly 1.5 upside wicks per round.
dN⁻ rate0.11 /sRoughly 3.3 downside wicks per round.
φ — funding0.30Mild. $GUH lets the crowd get away with it for a while.
Regimes4Markov switching, mean dwell 6.5 s.
Round length30 sPlus 2 s settlement.
Ride05

Each new ticker is a different ride

The rest of the series unlocks at vault milestones — which means the fees in Ride 06 are not only buying stock, they are buying the next instrument for everyone in the room. And each one changes a different term of the equation, so each is a genuinely different trading problem, not a reskin.

Table 5.1 — the park map
TickerStatusFormula changeHow it plays
$GUH● OPENκ⁻ = 2.6 κ⁺Grinds up, knifes down.
$COPIUM● $250K vaultφ = 0.90Funding cranked to violent. It always comes back — until the round ends first.
$TENDIES● $1M vaultμeuphoria ×3Fat upside tails and long air pockets. Vertical or nothing.
$WIFESBF● $2.5M vaultμ < 0, κ⁺ = 2.6 κ⁻$GUH inverted. Bleeds down all round, then rips your shorts off.
$0DTE● $5M vaultσ ∝ 1/(T−t)Volatility explodes as the clock runs out. The last five seconds are the game.
$MARGIN.CALL● $10M vaultλ × 2The crowd moves it twice as hard. Pure reflexivity, no shelter.

Every instrument publishes a disclosure page exactly like this one before it opens — full parameter set, committed seeds, no exceptions. An instrument whose numbers are not public does not list.

Ride06

Fees, split where the work is.

A market charges 0.25% of traded notional — 0.35% with the protocol layer on — and it is split per market, so every party earns only on the volume they actually serve.

The baseline 0.25% pays the people doing the work: 0.20% to liquidity providers (of the market they back) and 0.05% to the oracle-node runners (of the market they run the oracle for). Turning the protocol layer on adds two more 0.05% slices — one buys real stock for $ROLLA holders, one buys back and burns $ROLLA. Team: 0%. Nothing is discretionary; every slice has an address.

Liquidity providers — per market Oracle nodes — per market Stock → $ROLLA holders (protocol on) $ROLLA buyback & burn (protocol on)
Baseline 0.25% = LP 0.20% + oracle 0.05% (always on). Protocol on adds the two 0.05% slices → 0.35%. Split per market: LPs and node runners earn only on the volume they serve. Team: 0%.
Table 6.1 — per-market fee split (of traded notional)
SliceRateDestinationWhen
Liquidity providers0.20%The market's LP pool — pro rata by sharesalways
Oracle nodes0.05%The runners of that market's oracle — pro rataalways
Stock → holders0.05%Buys real equities for $ROLLA holdersprotocol on
$ROLLA buyback & burn0.05%Buys $ROLLA on-market and burns itprotocol on
Team0%No allocation—
Total0.25% / 0.35%off / on—

Why split it this way?

Incentives are local. A liquidity provider earns the 0.20% only on the market they actually back, and an oracle-node runner earns the 0.05% only on the market they actually run the oracle for — so capital and honest data flow to where they are needed, market by market, instead of a single pooled fee everyone splits regardless of contribution.

Liquidity providers now earn two ways: this fee slice and the house edge — being the counterparty to net imbalance, keeping the difference when the crowd leans wrong. Depositing into a market's pool is both renting its fee stream and taking a position against its consensus.

The protocol layer (the two 0.05% slices) is a toggle: off, the fee is a lean 0.25% that goes entirely to the people running the market; on, it adds the flywheel that buys stock for holders and burns $ROLLA. Either way, the team takes nothing.

What gets bought

The vault accumulates fees continuously and executes on a schedule into tokenised equities. Every purchase is announced on the tape mid-round — the chart dims, a ticker tape crosses the screen, and the whole park watches the buy land. Losing money is one thing. Watching it become someone’s share of NVDA in real time is a different product.

A single trade, traced end to end

Round #48,201  ·  $GUH  ·  settled
Margin posted0.0800 Ξ
Leverage25×
Notional2.0000 Ξ

Entry100.00
Exit (t = 21.4s)101.60
Gross P&L+0.0320 Ξ

Open fee  0.10%−0.0020 Ξ
Close fee 0.10%−0.0020 Ξ
Returned to trader0.1080 Ξ

Fee disposition
To vault0.0040 Ξ
To team0.0000 Ξ
Round total, all traders1.6722 Ξ
→ equities purchased1.6722 Ξ

The trader made money and still paid into the vault. That is the point: winners fund it too. A player’s headline profile stat is not their P&L, it is lifetime fees contributed — which turns the losing half of the park from marks into patrons, and happens to be true.

Ride07

Agents ride too

RollaCoasta is open to automated traders on the same terms as humans: same batched fills, same fee schedule, same tape. Agents are not tolerated, they are wanted — they are the reason there is a market at four in the morning, and they pay the same 0.10% into the same vault.

1. Set up a wallet, securely. Auth is a signed message (SIWE) — it proves you own an address and authorises no transaction. Still, use a dedicated bot key with only what you're willing to trade, never your main wallet. Generate one and keep it in an env var, never in code or git:

# make a throwaway trading key (foundry) and export it cast wallet new export PK=0xyour_new_private_key # fund it with a little testnet ETH

2. Run the reference bot in one command. It signs in, streams the live tape, and trades the order-flow imbalance — the whole thing is ~30 lines (examples/agent.mjs). No SDK.

npm i viem ws PK=$PK ROLLA=https://rollacoasta.xyz node examples/agent.mjs

Under the hood — sign in (copy-paste, tested live). Nonce → sign the returned message → get a session token:

export ROLLA=https://rollacoasta.xyz # 1) nonce + the exact message to sign curl -s $ROLLA/v1/auth/nonce # 2) sign that message with your key cast wallet sign --private-key $PK "<message from step 1>" # 3) exchange address+signature+nonce for a token curl -s -XPOST $ROLLA/v1/auth/verify -H 'content-type: application/json' \ -d '{"address":"0x..","signature":"0x..","nonce":".."}' # -> { token }

Trade over the WebSocket (same host, wss://). Authenticate with the token, then open/close — fills batch every 100ms. Public reads are plain HTTP.

# WebSocket messages you send { "type": "auth", "token": "<token>" } { "type": "open", "side": "long", "leverage": 2, "margin": 25 } { "type": "close" } # public HTTP reads (no auth) GET /v1/pool farm-pool TVL, house equity, LP shares GET /v1/holders real GME sent to $ROLLA holders GET /v1/history recent rounds: commit + revealed seed GET /v1/round/:id one round's full artifacts (seed, order log, hash) GET /v1/account?token=.. your margin, position, realised P&L, fees

Auto-compound & farm. Trade the reflex, then recycle winnings into the house side so profits earn the edge as LP yield. Farming is on-chain (the FarmPool contract), so you compound with a plain addLiquidity tx:

// each settled round: if you profited, stake it into the farm pool import { createWalletClient, http, parseEther } from "viem"; const wallet = createWalletClient({ account, transport: http(RPC) }); ws.on("message", async raw => { const m = JSON.parse(raw); if (m.type === "tick" && !open) // lean with the crowd ws.send(JSON.stringify({ type: "open", side: m.I >= 0 ? "long" : "short", leverage: 2, margin: 25 })), open = true; if (m.type === "settle" && m.pnl > 0) // compound the win into LP yield await wallet.writeContract({ address: FARM_POOL, abi, functionName: "addLiquidity", value: parseEther(String(m.pnl)) }), open = false; });

Run an entropy + verifier node — earn governance points. Anyone can help decentralise the randomness and independently police the tape in one command. The node posts entropy that gets folded into each round's seed (it can only add unpredictability), and re-hashes every revealed seed against its commitment; each accepted contribution and verified round earns governance points.

npm i viem PK=$PK ROLLA=https://rollacoasta.xyz node examples/node.mjs # posts entropy each round + verifies settled rounds; see the board at /v1/network

The full reference bot is in the repo (examples/agent.mjs) and this whole flow is tested against the live endpoint. Every round is replayable: pull /v1/round/:id for the revealed seed + order log and re-run the open-source engine to check the tape yourself.

Machine and human leaderboards are kept separate, permanently. Agents will outperform people at a thirty-second reflexive market, and ranking them together would tell every human in the park to leave. Two divisions, two boards, one order book.

Ride08

What we can prove, and what we can’t

Before each round opens, the server publishes hash(serverSeed) — that is the Commit line in the panel beside the chart, and it is fixed before you can place a single order. After settlement it reveals serverSeed. The noise and jump terms — σ(s)·dW and κ±·J·dN± — are a pure function of (serverSeed, clientSeed, nonce), so anyone can replay the round and confirm the dice were cast before the first order arrived.

The Verify button does exactly that, in your own browser: it takes the revealed seed, re-computes SHA-256, and checks it against the commit you were shown thirty seconds earlier. If they ever disagree, the round was tampered with and you should never trade here again.

The flow term cannot be committed in advance, because it does not exist in advance. It is produced by the people trading, in the moment, and it is unknown to the operator for exactly as long as it is unknown to you. That is not a gap in the fairness proof — it is the product.

The dice are provably fairThe other traders are not
Ride09

Markets about anything

$GUH is the first market, not the only shape. The same settlement stack now runs oracle markets too — a 30-second (or any-duration) market on a real asset whose settlement price is a proven aggregation of many feeds, not a trusted oracle.

Two market kinds share one verifier and one settlement, behind a single 5-slot proof layout [init, final, commit, id, dataHash]:

  • Synthetic ($GUH) — the price path is the unique deterministic function of a committed seed. Truth is cryptographic; there is no oracle.
  • Oracle (e.g. BTC, a tokenised stock) — settles to an aggregation (mean / median / trimmed-mean) of authenticated feeds. The STARK proves only that final = AGG(the committed set); a wrong number has no valid proof.

Create a market

A market is kind × duration × oracle × payout. Register a spec (discoverable at /v1/markets); each oracle names its own sources/APIs at creation ({api, symbol}), so a custom oracle can pull whatever venues it needs. The aggregation is configurable per market. Full guide + template: ORACLE-SDK.md ↗.

Run an oracle node — secure & proven

Anyone can help run a market's oracle. A market has a set of nodes (e.g. 5 nodes, quorum 3): each independently pulls the sources, computes the same integer aggregation, and signs the observationsHash. On-chain, OracleFeed verifies a quorum of node signatures before the hash is committed — no single node can move the number. Node runners earn the 0.05% oracle-fee slice of the market they serve. One line to start:

// quote markets 1 and 2 as an oracle node EODHD_API_KEY=xxx PK=0xYOUR_NODE_KEY MARKETS=1,2 node examples/oracle-node.mjs

The proof fits on-chain

A full STARK verify is ~44M gas — over some chains' per-transaction limit (Robinhood testnet caps a tx near 32M). So the verifier is chunked: begin → step → finish carries the constraint accumulator across three transactions (~24M / 16M / 18M), each under the cap, reproducing the monolithic verify exactly. On testnet the full trustless loop runs end to end: feed → 5-node quorum → observationsHash → STARK proof (3 chunked txs) → disprove slashes a lie, and an honest round finalizes. Addresses below; details in DEPLOYMENTS.md ↗.

Howit works

The contracts, plainly

Three contracts on Robinhood Chain do the real work. All are source-verified — click any address to read them.

$GUH instruments — breeding, à la CryptoKitties

RollaInstruments is an ERC-721 where each token’s genome is the full parameter set of the price engine (drift, volatility, jump sizes, funding, pool depth), packed into one 256-bit number. It borrows the CryptoKitties idea — on-chain genes, breeding, cooldowns — but the genes aren’t cosmetic: they are the market. Breed two instruments and each gene is inherited from one parent with a small mutation, clamped to a safe envelope, producing a genuinely new market. Children are born as Eggs and only go live after an off-chain simulation gate replays the genome through thousands of headless rounds and proves it’s playable — a lying validator is caught because the gate is deterministic and reproducible. Token #0 is $GUH, the genesis genome every instrument descends from.

The farm pool — ETH liquidity that is the house

RollaFarmPoolETH holds the real ETH behind the game. Liquidity providers deposit ETH and receive shares in house equity; players deposit a withdrawable ETH balance to play. When players lose, house equity rises and every share is worth more; when they win, it falls. LPs aren’t renting a fee stream — they are the counterparty. A solvency invariant guarantees player balances are always fully backed by ETH in the contract, and both sides can withdraw at any time, even if the owner pauses new play.

Trading — 30 seconds, provably fair

Deposit ETH, pick a side (long or short) and leverage up to 100×, and ride a synthetic ticker that lives for 30 seconds. Cash out any time, or the round settles you at the buzzer — or your liquidation price gets hit first. Every round is provably fair: the server publishes hash(seed) before the round and reveals the seed after, so you can replay the exact price path yourself (the Verify button does it in your browser). Position size is capped at a small fraction of pool depth, so no whale can shove the price with their own order.

Farming — be the house

Provide ETH liquidity to the pool and you take the other side of every bet. When players lose, your share of the pool grows; when they win, it shrinks — you earn the house edge, not a fee sticker. Deposit and withdraw whenever you like; a solvency invariant in the contract keeps player balances fully backed at all times, and an incident pause can never touch your right to withdraw.

Settlement — trustless from the start (ZK)

You don’t have to trust us to settle honestly. The engine is pure deterministic math, so each round is settled behind a zero-knowledge proof: an SP1 proof attests that the round’s results were computed correctly from its committed inputs, and an on-chain verifier checks that proof before a single token moves. A wrong settlement can’t produce a valid proof, so it’s simply rejected — no trusted operator, ever. Wins and losses settle in one atomic, per-round-capped transaction against the pool.

Trustless settlement — audit in process. Click an address to copy.
ContractAddress · Robinhood testnet (46630)
Verifier core (shared)
RoundVerifierEntry0x191aEAA4D097fe778aD274217102305c09DdB4C2
StarkVerifier0xdB6C7619De1964fD6d3D8F1EBB67f6E0B64866CF
RoundStarkVerifier0xe36f596f05db7f52bf216a403cb06ae865a7e2c4
BatchVerifierEntry0x8b1EF83dbd4608423bDb4EbF54D897147413757E
BatchStarkVerifier0xae50b117397c54398c86ed3f9fa6caab936337b7
ProofRegistry0xa8318B3F05A5289A0c52139fe67E92E499f2D97b
Optimistic settlement
RollaSettlementOptimistic0xe2Ef21156B39af8df3C74065140fbEc0251Aa27D
RollaPositions0xbb349f428142D24af132182088bedC34B4c12774
RollaFarmPoolETH0x977ff648a16f10463E53c036222294C89a60Fe78
Batch (eager) settlement
RollaSettlementBatch0x018b1742345290117f289B6f307341ee955068eF
RollaPositions0x1F8eEF54D294B80d7FFe9aff1f7C9Ce79e80AD4E
RollaFarmPoolETH0x92C4E7a56230Dc70666934f3991EBee10Bf07C52
Oracle markets (aggregation) — live
AggMeanVerifierEntry (mean AIR, 54 libs)0x70775b480d380D2Cd9D23D767ee46c2Ea4d7419f
ChunkedAggMeanVerifier (verify under the per-tx gas cap)0xed5942861D2054091b122DacF1480281a23f378B
RollaMarketSettlement (kind-aware; synthetic + oracle)0x4d6E4Ab45200ccBe541e1d5DCa77E041f0a62152
OracleFeed (5-node quorum → observationsHash)0x1dEc2512712a53d033FBAaA886578A62ff69B6b4
RollaFees (0.25% / 0.35% per-market split)0xb3D1f81C8A9bAC7fEa4bECad3179cb7C6198Ee8e
RollaFarmPoolETH (oracle) · RollaPositions0x73b64FD9B2B16F87c3bAc052a25Bf9199A58b8dD

Each verifier entry also links 415 auto-generated constraint-library contracts (the AIR constraint evaluator, split to fit the 24KB contract limit) — full list in DEPLOYMENTS.md. Internal libraries (StarkProofCodec, GoldilocksField, KeccakTranscript, MerkleVerifier, FriVerifier, FriDeep, ConstraintEval, Poseidon2Goldilocks) are inlined into the deployed contracts above, so they have no separate address.

Token economy on mainnet: $ROLLA ↗ RollaInstruments ($GUH) ↗ GME ↗ Pons V2 ↗ Source on GitHub ↗