Rails documentation
Everything that decides a result, written down: the track, the two sides, the model that prices them, the vault that pays, and the ledger you can replay.
Overview
Rails is a platform for skill-based markets on crypto and tokenized stocks. These docs cover how it works, from your first track to the engine that settles it.
On Rails you trade the path a price takes. You lay a track on a live chart: a center line that can lean up or down, with a rail on each side. Then you pick a side. Hold wins if the price stays between the rails for the whole run. Derail wins if the price touches a rail first.
One number prices both sides: the chance your track holds. Each multiplier is the inverse of its side's chance, less a published 3% spread, and you see both before you commit. A neutral vault takes the other side of every position and pays the winners when the track resolves.
Where to start
- Quick start: from a connected wallet to your first settled track.
- Opening a position: gauge, grade, run and the math behind your multiplier.
- Predict: back or fade a track someone else laid.
- Parameters and limits: every knob, fee and cap in one table.
- Vault architecture: the counterparty to every position.
- Public ledger: how to re-verify every event yourself.
Vision
A market where your read of the chart is the edge, the odds sit in plain view and anyone can check every result.
Rails builds a new kind of market: skill-based, open to inspection and fun to play. You trade the path of a price across crypto and tokenized stocks, on live prices, with one engine under every product. The platform grows by adding markets and products to that engine.
Your read of the market is the edge. A neutral vault is your counterparty, your multiplier is the inverse of your chance to win less a published spread, and every price, position and payout goes into a ledger anyone can replay. Tracks is the first product on the engine and Predict the second. Future products reuse the same core.
What Rails stands for
The principles behind the platform. Where a principle is a rule, the code enforces it and the ledger lets you check it.
Eight crypto markets and eight tokenized stocks on one venue, priced and settled by the same engine.
A track pays on how the price travels during the run. Reading volatility and trend is the skill.
Every track has a public link. Back a player's track with Hold or fade it with Derail.
One vault, one ledger and one pricing model sit under every product, so liquidity pools once.
Prices stream from Hyperliquid's L1 in real time. The keeper settles on the same public bars.
The vault quotes any shape on any market as you draw it, so you never wait for a match.
Your multiplier is the inverse of your win chance less a 3% spread printed beside it.
Close an open position any time before its run ends, for an amount you see before you confirm.
The keeper chains every event by hash into a public ledger you can re-verify from genesis.
Every action is a JSON call. Anything a player does in the terminal, a program can do.
The leaderboard ranks net score: profit and loss plus royalties. Volume breaks ties.
Testnet is labeled testnet. Anything that is not live yet says soon.
One engine, every product
The hard parts live in one core: pricing, the vault, settlement, identity, the ledger and the token. A new product is a new front end on that core. An order-book venue has to bootstrap liquidity market by market. Rails solves it once, and every product feeds the same vault. See The engine for how the pieces fit.
Roadmap
Where Rails stands and where it goes next. Items under Now are live on the testnet; everything after that is a plan that can change.
The roadmap has three phases. Now covers what runs on the public testnet today. Next covers the token launch and the move to contracts. Later covers what the engine grows into. Testing and audits set the timing, so the phases carry no dates.
Now: public testnet (2026)
- The terminal: live charts for 16 markets and a ticket that prices both sides before you commit.
- Tracks: lay a track with gauge, grade and run, and back it to Hold or Derail.
- Predict: back or fade any live track at odds priced from where the price sits now.
- Dashboard: balance, open positions, history, equity curve and platform stats.
- Leaderboard: players ranked by net score, filtered by period, market and product.
- Public ledger: every event chained by hash, with an endpoint that re-verifies the whole chain.
- Faucet: 10,000 tRAIL every 6 hours for any wallet.
Next: launch and contracts
- $RAIL launch on Robinhood Chain.
- Contracts on chain: TrackEngine, RailsVault, ModelRegistry and TestRail deploy to Robinhood Chain testnet, then mainnet.
- Audits: an independent review of the contract suite before mainnet.
- Vault seed: 15% of the $RAIL supply seeds the settlement vault at mainnet, under a timelock.
- Staking: stake $RAIL to back the vault and earn a share of fees.
Later
- More markets across crypto and tokenized stocks.
- Multi-asset tracks that settle on more than one price.
- Longer runs past the 24-hour limit.
- Agent SDK: typed clients and examples for programs that trade.
- New products on the same engine, vault and ledger.
Tracks
The first product on Rails. Lay a track on a live price and take a side: Hold if the price stays between the rails to the end, Derail if it touches a rail first.
A track has a center line that starts at your entry price and a rail on each side of it, at equal distance. You set three things: the gauge (how far each rail sits from the center line), the grade (how much the track leans) and the run (how long it lasts). The ticket prices both sides from that shape before you open.
Pays stake × M if the price stays inside the rails, touching neither, until the run ends. You back calm, trend and pace.
Pays stake × M the moment the price touches either rail. You back a breakout, a reversal or a spike.
A track ends in one of three ways. It holds to the end and Hold gets paid. The price touches a rail, Derail gets paid and Hold settles at zero. Or you close early for an amount the ticket shows before you confirm. The vault pays every outcome, and the keeper writes each step to the public ledger.
Predict runs on the same tracks: anyone can back or fade a live track you laid, and you earn a royalty when they profit. To play, follow the quick start. For the math behind your multiplier, read Opening a position.
Quick start
From a connected wallet to your first settled track in five steps.
- 1Connect a wallet
Open the terminal and connect an EVM wallet on Robinhood Chain, through Privy or with a direct wallet signature. You sign one free message that proves you own the wallet. It sends no transaction and costs no gas.
- 2Claim tRAIL
Claim 10,000 tRAIL from the faucet. You can claim again every 6 hours. tRAIL is the testnet play unit and has no market value.
- 3Pick a market and shape a track
Choose one of the 16 markets, then set gauge, grade and run. The ticket shows the Hold and Derail multipliers for that exact shape as you change it.
- 4Take a side and open
Pick Hold or Derail and a deposit from 1 to 50,000 tRAIL. The open fee comes off the deposit, the rest becomes your stake, and your entry binds to the live price when the keeper accepts the open.
- 5Watch it settle
The keeper judges your track from public one-minute bars. When the track resolves, the vault credits the winning side. You can also close early for the amount the ticket shows.
Opening a position
Gauge, grade and run shape your track. One probability prices both sides, and your multiplier locks the moment your entry binds.
You enter at the live mid price. Hold wins if the price stays inside your rails to the end. Derail wins if it touches a rail first.
The track you lay
Every track starts at your entry price. The center line leans from there at your grade, and each rail sits one gauge away from it. Rails measures gauge and grade in range, the asset's typical one-hour move, so the same shape carries the same odds on BTC and on TSLA.
center(t) = entry + grade × range × hours since bind upper rail(t) = center(t) + gauge × range lower rail(t) = center(t) - gauge × range
Range freezes at bind. From then on the rails follow the grade you chose, and no one can move them.
Gauge, grade and run
| Knob | Limits | What it does |
|---|---|---|
| Gauge | ±0.25 to ±6 range | Distance from the center line to each rail. A tighter gauge is harder to hold. |
| Grade | -2.5 to +2.5 range per hour | The lean of the track. The price has to keep pace with it, so a steeper grade is harder to hold. |
| Run | 15 minutes to 24 hours | How long the track lasts. A longer run gives the price more time to reach a rail. |
Tighter, steeper and longer all make Hold harder, so Hold pays more and Derail pays less. On a flat track, gauge and run trade off: a ±1 gauge over one hour, a ±0.5 gauge over 15 minutes and a ±2 gauge over 4 hours all carry the same P of 0.409.
Your multiplier
The keeper reads your shape and the asset's range and computes P, the probability that the price stays inside the rails for the whole run. Each side pays the inverse of its own chance to win, less the published spread δ:
Hold: M = (1 - δ) / P Derail: M = (1 - δ) / (1 - P) δ = 3%, ceiling ×50, floor ×1.05
A side priced above ×50 pays ×50. The keeper does not offer a side priced below ×1.05. As a rough anchor, a Hold with a 25% chance pays ×3.88.
Sample quotes from the live model. P depends on the shape alone, so these numbers match on every market. Leaning down prices the same as leaning up by the same grade.
| Gauge | Grade | Run | P | Hold | Derail |
|---|---|---|---|---|---|
| ±1.5 | 0 | 30 min | 0.909 | ×1.07 | ×10.70 |
| ±1.5 | 0 | 1 hour | 0.728 | ×1.33 | ×3.56 |
| ±1.5 | +1 | 1 hour | 0.544 | ×1.78 | ×2.13 |
| ±1 | 0 | 1 hour | 0.409 | ×2.37 | ×1.64 |
| ±1 | 0 | 2 hours | 0.165 | ×5.87 | ×1.16 |
| ±1.5 | +2.5 | 1 hour | 0.091 | ×10.63 | ×1.07 |
| ±0.25 | 0 | 15 min | 0.038 | ×25.41 | Not offered |
The model behind P is described in The engine.
Your entry binds on open
Opening takes one step. The keeper checks your shape against the limits, reads the live mid price and the asset's range, prices your side, confirms the vault can reserve the payout and binds your entry. The entry price and your multiplier lock at that moment and stay fixed for the life of the position.
Prices move while you decide. Send a minimum multiplier with your open and the keeper refuses the open if the fresh quote lands below it, so you never accept worse odds than the ones you saw.
The open fee is the greater of 1% of your deposit and 0.5 tRAIL. The keeper takes it from the deposit at open, win or lose. The rest is your stake, the amount every payout formula multiplies. The vault then reserves stake × (M - 1), so your full payout is covered before your track starts.
deposit = 1,000 tRAIL open fee = max(1% × 1,000, 0.5) = 10 stake = 1,000 - 10 = 990 at ×2.00: gross payout = 1,980, vault reserve = 990
Then you choose how to leave. See Closing a position.
Closing a position
Your multiplier locks at bind. Your side and the moment you leave decide how much of it you collect.
| Exit | You collect | When |
|---|---|---|
| Your side wins | stake × M, less the profit fee | Hold: the track holds to the end. Derail: the price touches a rail first. |
| Close early | stake × M × P_win(now) × 0.95, less the profit fee | You cash out before the track resolves. |
| Your side loses | 0 | Hold: the price touches a rail. Derail: the track holds to the end. |
The profit fee is 10% of the profit on any payout above your stake. When the position is a Predict position from another player, 15% of that fee goes to the track's creator as a royalty and the rest stays with the vault as revenue. See Parameters and limits.
Hold to the end
When the final one-minute bar of the run closes with no touch, the track holds. Hold positions collect stake × M and Derail positions settle at zero. The keeper resolves a held track five seconds after that final bar closes.
Close early
You can close an open position any time before its run ends. The keeper values it at your side's current chance to win, from the live price, the time left and the range frozen at bind, then applies the 5% early-close penalty:
value = stake × M × P_win(now) × (1 - 0.05) payout = value - 10% × max(0, value - stake)
For Hold, P_win stays high while the price sits near the center line and falls as it drifts toward a rail. For Derail it moves the other way. A confirmed close is final. If the price sits on a rail when you ask, the keeper refuses the close because the track is derailing. Once the run is over, the track settles on its own within a minute.
Touch a rail
A touch resolves the whole track at once. Every Derail position on it collects stake × M, and every Hold position settles at zero. One verdict settles the creator's position and every Predict position on the track, whichever side each took.
The keeper proves the touch with the one-minute bar that crossed the rail and stores that bar in the ledger. You can fetch the same public bar and check it. The exact judging rules are in Price feed.
Parameters and limits
Every knob, fee and limit in one place. The engine serves these values at /api/model with a fingerprint hash, so you can confirm the numbers behind any quote.
| Parameter | Value | What it means |
|---|---|---|
| Gauge | ±0.25 to ±6 range | Distance from the center line to each rail |
| Grade | -2.5 to +2.5 range per hour | Lean of the center line |
| Run | 15 minutes to 24 hours | How long a track lasts |
| Deposit | 1 to 50,000 tRAIL | Size of one position, open fee included |
| Open positions | No cap | No limit on live positions per wallet |
| Hold probability P | 0 to 1 | The model's chance the price stays inside the rails to the end |
| Spread δ | 3% | Published margin on both sides' odds |
| Ceiling | ×50 | Highest multiplier either side can pay |
| Floor | ×1.05 | The keeper does not offer a side priced below this |
| Volatility uncertainty ν | 25% | Lognormal spread in volatility the model averages over |
| Open fee | max(1%, 0.5 tRAIL) | Taken from the deposit at open, win or lose |
| Profit fee | 10% of profit | Charged on any payout above the stake |
| Creator royalty | 15% of the profit fee | Paid to the track's creator on profitable Predict positions from other players |
| Early-close penalty | 5% | Discount on the value of an early close |
| Predict cutoff | 2 minutes | A track stops taking Predict positions when less than 2 minutes remain |
| Vault utilization | 60% max | Reserved payouts can never exceed 60% of vault capital |
| Faucet | 10,000 tRAIL per 6 hours | Free testnet balance per wallet |
| Model id | rails-dbm-1 | Recorded with every open in the ledger |
Range: the volatility unit
Range is the asset's one-sigma move over one hour, in price units. It makes a ±2 gauge the same difficulty on BTC as on TSLA. The keeper blends two estimates of it: 60% weight on the last 6 hours of one-minute bars and 40% on the last 3 days of 15-minute bars.
Each estimate caps outlier returns at six times the median move and weights recent bars more, with half-lives of 90 minutes and 24 hours. The blend follows the current regime without jumping on one spiky minute. A floor of 0.005% per √minute keeps quiet off-hours markets from pricing near-zero volatility, and each market's range refreshes once a minute at most.
Range sizes your track at open and then freezes into your rails. The price against those rails decides every outcome.
Markets
Eight crypto markets and eight tokenized stocks, all on the same rules and the same payout math.
| Symbol | Name | Class |
|---|---|---|
| BTC | Bitcoin | Crypto |
| ETH | Ethereum | Crypto |
| SOL | Solana | Crypto |
| XRP | XRP | Crypto |
| DOGE | Dogecoin | Crypto |
| HYPE | Hyperliquid | Crypto |
| BNB | BNB | Crypto |
| LINK | Chainlink | Crypto |
| HOOD | Robinhood | Tokenized stock |
| NVDA | Nvidia | Tokenized stock |
| TSLA | Tesla | Tokenized stock |
| AAPL | Apple | Tokenized stock |
| AMZN | Amazon | Tokenized stock |
| META | Meta | Tokenized stock |
| PLTR | Palantir | Tokenized stock |
| COIN | Coinbase | Tokenized stock |
Every market trades around the clock. Crypto prices come from Hyperliquid's perpetual markets, and tokenized stocks come from 24/7 stock perpetuals on its xyz market. Each stock carries a session flag that shows whether the regular US session is open (weekdays, 9:30 a.m. to 4:00 p.m. New York time). Outside that window the perp keeps trading while the underlying exchange is shut.
Rails measures every track in range, so a shape carries the same odds on every market. New markets need no new rules: any market the feed prices, the vault can take.
Predict
Every live track is a two-sided market. Back a track to Hold or fade it to Derail, at odds priced from where the price sits right now.
Pays stake × M if the track holds to the end. You back the creator's read.
Pays stake × M the moment the price touches a rail. You bet against the creator's read.
You draw nothing. Pick a live track from the terminal, a track link or a player's profile, choose a side and a deposit, and your position joins the track. It settles with the track, on the same verdict as the creator's own position.
A track takes Predict positions while it is live and more than 2 minutes remain. When you profit, the creator earns a royalty out of your profit fee, which costs you nothing extra. See Predict odds and Settling and closing.
Predict odds
Both sides of a live track come from one number, so they cannot drift apart and no one can arbitrage one side against the other.
When you predict, the keeper prices the track as it stands now: the live price, its distance to each rail, the time left and the range frozen at bind. From those it computes P, the chance the track holds for the rest of its run. Each side pays the inverse of its own chance, less the spread:
Hold: M = (1 - δ) / P_now Derail: M = (1 - δ) / (1 - P_now) δ = 3%, ceiling ×50, floor ×1.05
The odds move as it plays
Time spent inside the rails pushes P up, and a price drifting toward a rail pulls it down. One flat track with a ±1.5 gauge and a 60-minute run, priced at five moments:
| Moment | Price vs center line | P | Hold | Derail |
|---|---|---|---|---|
| At bind, 60 min left | On the center line | 0.728 | ×1.33 | ×3.56 |
| 30 min left | On the center line | 0.909 | ×1.07 | ×10.70 |
| 30 min left | 1.0 range above | 0.537 | ×1.81 | ×2.10 |
| 10 min left | 1.3 range above | 0.395 | ×2.46 | ×1.60 |
| 10 min left | On the center line | 0.995 | Not offered | ×50 (ceiling) |
The creator's multiplier stays where it locked. Yours locks when the keeper accepts your position. The ledger records the terms it used (the price's distance to the center line and the minutes left), so you can recompute your multiplier with /api/model. See The engine.
Guards
Send a minimum multiplier with your request and the keeper refuses the position if the odds moved below it. The keeper also refuses a prediction while the price sits on a rail, because the track is derailing.
Settling and closing
A Predict position resolves with the track it backs. You can also leave early for a known amount.
| Exit | You collect | When |
|---|---|---|
| Your side wins | stake × M, less the profit fee | Hold: the track holds to the end. Derail: the price touches a rail first. |
| Close early | stake × M × P_win(now) × 0.95, less the profit fee | You cash out before the track resolves. |
| Your side loses | 0 | The track resolves the other way. |
How it settles
One verdict settles every position on a track. If the price touches a rail, Derail wins and Hold settles at zero. If the track holds to the end, Hold wins. The creator's own position settles on the same verdict at the same moment.
Creator royalties
When a Predict position from another player pays out above its stake, through a win or a profitable early close, the track's creator receives 15% of that position's profit fee. The royalty comes out of the fee, so the predictor pays nothing extra. A track that draws Predict volume pays its creator on top of their own position.
predictor's profit = 1,000 tRAIL profit fee = 10% × 1,000 = 100 creator royalty = 15% × 100 = 15 vault revenue = 100 - 15 = 85
Close early
You can close a Predict position before the run ends at its current win chance less the 5% penalty, the same way a creator closes. See Closing a position.
The terminal
Where you lay tracks and trade: a live chart, your track on it and a ticket that prices both sides before you commit.
Open the terminal and pick a market to start.
The chart
The chart streams live prices for the market you pick. Your track appears on it as you shape it: the center line from the live price, a rail on each side and the end of the run. Open tracks play out on the same chart, so you watch the price move against your rails in real time.
Market list
All 16 markets sit in one list, grouped into crypto and tokenized stocks, each with its live price and 24-hour change. A stock outside its regular US session carries a flag. See Markets.
The ticket
The ticket holds the three controls (gauge, grade and run), the two sides with their live multipliers, your deposit and a summary of the fee, stake and full payout. Both multipliers reprice as you change the shape or the price moves. You fund positions from your tRAIL balance; the quick start shows how to claim it.
Your positions
Your open positions stay on the chart and in a list, where you can close any of them. Settled positions move to the History tab and to your public profile.
Track links
Every track has a public page. Anyone can watch it live without a wallet.
Each track lives at /track/<id>. The page draws the track on the live chart with its market, creator, entry, gauge, grade, run and time left, plus the positions on it. When the track resolves, the page shows the verdict and the proof behind it: the bar that touched a rail, or the last close of a held run.
Connect a wallet on a track page and you can predict on it: back it to Hold or fade it to Derail at the live odds. The link works for anyone you send it to.
To find tracks, browse the live list on the Predict tab of the terminal, sorted by volume. Every player's open positions also appear on their profile at /profile/<address>.
Dashboard
Your account and the whole platform in one place.
Open the dashboard from anywhere in the app.
Your account
The account view shows your tRAIL balance, the faucet timer, your open positions and your settled history. Each settled position lists its payout, fees and the price that settled it, and an equity curve plots your running profit and loss.
Platform stats
Platform stats cover the whole venue: players, positions, open positions, average multiplier, 24-hour volume, tracks held and derailed, the most popular markets and the biggest wins. The vault panel shows capital against the 150,000,000 tRAIL seed, escrow, reserved payouts, revenue, royalties paid and seven days of hourly capital and volume.
Leaderboard
The leaderboard ranks players by net score: settled payouts minus deposits, with fees counted, plus royalties earned as a creator. Filter by period (24 hours, 7 days, 30 days or all time), by market and by product (Tracks or Predict). When two scores tie, the player with more volume ranks higher.
Profile and identity
Your wallet is your account. You need nothing else to play.
Wallet login
You sign in with an EVM wallet on Robinhood Chain, through Privy or with a direct wallet signature. The sign-in message is free, sends no transaction and expires after 10 minutes. It carries a one-time nonce, so no one can replay a captured signature. Smart-contract wallets work too: Rails checks their signatures on Robinhood Chain.
Your session lasts 7 days in an HttpOnly cookie. Sign out any time to end it.
No email, no account
Rails has no email login, no password and no social sign-in. The identity data it keeps is your address, your optional display name, the wallet that referred you (if any) and your app preferences.
Display name
You can set an optional display name of 3 to 20 letters, digits, dots or underscores. It replaces your short address on the leaderboard, your profile and track pages. Each name belongs to one wallet at a time.
Public profiles
Every wallet has a public profile at /profile/<address>: rank, net score, open positions, settled history, an equity curve and top markets. Anyone can open yours, and you can open anyone's from the leaderboard or a track page. See Dashboard.
Getting access
The testnet is open to everyone: no invite code, no allowlist.
Open the terminal, connect a wallet and claim tRAIL from the faucet. You can play every product end to end at no cost, on live prices, and the keeper records every result in the public ledger.
- An EVM wallet, as a browser extension or through Privy.
- No ETH: signing in and trading on the testnet send no transactions.
- A few minutes to claim tRAIL and lay your first track.
tRAIL is a testnet unit with no market value. The draft tokenomics includes testnet players in the community and airdrop allocation.
The $RAIL token
$RAIL is the single asset every Rails product runs on. It has not launched; the testnet runs on tRAIL.
At launch, every position on every product opens and settles in $RAIL, paid from the vault. The platform and the token form one system: you play in $RAIL, you win $RAIL, and the vault that settles your wins holds $RAIL.
The loop
The design ties usage to the token in a loop. The staking part of it arrives with mainnet.
Every track and every Predict position is volume through the engine.
The open fee and the profit fee are the platform's revenue, published beside the odds.
Stakers back the vault and share in fee revenue. More revenue draws more stake.
More capital behind the vault lets it reserve larger payouts, which draws more volume.
more volume → more fee revenue → more rewards for stakers more stake → deeper vault → larger payouts → more volume
Published fees fund the loop, with no inflationary emissions behind it. The vault's average edge is the 3% spread plus fees, as long as the model's probabilities match how prices move. The model is public, so you can judge that yourself. See Vault architecture and Utility.
Launch
$RAIL launches on Robinhood Chain. Tracks is the first product and Predict the second, and future products plug into the same vault, ledger and token. The draft supply and allocation are on Tokenomics.
Tokenomics
A fixed supply of 1,000,000,000 $RAIL. The allocation below is a draft and can change before launch.
| Allocation | Share | $RAIL | Role |
|---|---|---|---|
| Settlement vault seed | 15% | 150,000,000 | Timelocked. Seeds the settlement vault at mainnet. |
| Launch liquidity | 25% | 250,000,000 | Trading liquidity when $RAIL launches. |
| Community and airdrop | 20% | 200,000,000 | Community rewards and the airdrop, testnet players included. |
| Ecosystem and creators | 15% | 150,000,000 | Grants and creator royalty programs. |
| Team | 15% | 150,000,000 | 12-month cliff, then 24-month linear vesting. |
| Treasury | 10% | 100,000,000 | Audits, listings and infrastructure. |
The testnet vault already follows this plan: it started with 150,000,000 tRAIL, the same 15% share the mainnet vault will receive. The genesis entry of the public ledger records that seed.
Team tokens release nothing at launch. They sit behind a 12-month cliff, followed by linear vesting over 24 months. The vault seed stays under a timelock until it goes into the settlement vault at mainnet.
Utility
What $RAIL does: one asset, three jobs.
Every position on every product opens and pays out in $RAIL. Demand grows with play.
The vault that pays winners holds $RAIL. Its depth sets how large a payout it can reserve.
Planned for mainnet: stake $RAIL behind the vault and earn a share of platform fees.
Play requires holding and moving $RAIL. The vault seed and any staked $RAIL sit out of circulation while they back payouts, so heavier play raises demand while more of the supply works inside the vault.
Vault architecture
One vault is the counterparty to every position on every market. It reserves each payout in full before a track starts.
You trade against a neutral vault. It takes the other side of every position and pays winners on its own, with no order book to fill and no match to wait for. If the feed prices a market, the vault quotes it, within its capacity limits. Its margin is the published spread and the fees beside your odds.
Full reserve
When you open, the vault moves your stake into escrow and reserves stake × (M - 1) from its capital, the most your position can win beyond the stake. It accepts a new position while total reserved payouts stay within 60% of vault capital. If a new reserve would cross that line, the keeper refuses the open and asks you to size down or widen the rails.
reserve = stake × (M - 1) open accepted if reserved + reserve ≤ 60% × capital
Settlement books
Every settlement balances to the micro-tRAIL. Capital pays gross - stake on a win and gains the stake on a loss, escrow releases the stake, and the fees land in revenue and royalties:
deposit + fromCapital = player + revenue + royalty fromCapital = gross - stake revenue = open fee + profit fee - royalty
deposit 1,000, open fee 10, stake 990, M = ×2.00 gross 1,980, profit 990, profit fee 99, royalty 14.85 player 1,881, revenue 94.15, fromCapital 990 1,000 + 990 = 1,881 + 94.15 + 14.85 = 1,990
The keeper writes these numbers into the public ledger for every settlement, so you can check the identity on any position.
Solvency by rule
The vault bears losses. Over a short window players can win more than they stake. The vault stays solvent through rules anyone can read: odds are the inverse of probability less the spread, every payout sits in reserve before its track starts, the ×50 ceiling caps any single position, and the 60% utilization cap bounds what the vault can owe at once.
The testnet vault started with 150,000,000 tRAIL. Its live capital, escrow, reserves, revenue and royalties are public at /api/stats. The setup works like the liquidity pool behind a perp venue: a counterparty whose size and limits follow public rules.
Where fees go
On the testnet, the vault books open fees and profit fees as revenue, and the keeper credits royalties to creators' balances at settlement.
Staking
Planned for mainnet: stake $RAIL to back the vault and earn a share of platform fees.
Stakers will supply part of the capital the vault settles from. A busier platform earns more fees, and stakers share in them. Staked $RAIL sits out of circulation while it backs payouts.
Backing the vault means sharing its results. The staking contract will define lock terms, the fee share and how stakers carry the vault's gains and drawdowns, and this page will describe it before launch.
The engine
One engine runs every product: a pricing model anyone can rerun, a neutral vault and a settlement rule that works from public price bars.
Today the engine runs server-side. Live prices, pricing, settlement and payouts all work end to end, and every event goes into a public, hash-chained ledger that anyone can re-verify. The Solidity contracts that carry these rules on chain are written and move to Robinhood Chain in the next phase.
One hold probability prices both sides of every track. Each multiplier is the inverse of its side's chance less the 3% spread.
One vault takes the other side of every position and reserves each payout in full before the track starts.
The keeper judges every track from public one-minute bars. Anyone can rerun the same rules on the same bars.
The model
The model treats the price over a run as a random walk with no trend of its own, with volatility set by range. Your track's center line leans at your grade, so the gap between the price and the center line drifts at minus the grade. The track holds while that gap stays within one gauge of the center line on either side. P is the chance a drifting random walk stays between two barriers for the whole run: a double-barrier survival probability with drift.
σ = range / √60 (volatility per √minute) h = gauge × range (distance to each rail) μ = -grade × range / 60 (drift of the gap, per minute) T = run in minutes P = Pr( |gap(t)| < h for all t ≤ T )
The keeper solves this with an eigenfunction series when the rails sit close relative to the move expected over the run, and with closed-form single-barrier formulas when they sit far apart. The switch comes where the track's full width reaches 6 × σ√T. The keeper then averages the result over a 25% lognormal uncertainty in volatility with 7-point Gauss-Hermite quadrature, so the odds account for the chance that range is off.
The pricing code is pure math shared by the server and the browser, so the ticket's preview and the keeper's quote run the same function. /api/model serves every parameter with a SHA-256 fingerprint, and each open records the model id rails-dbm-1 in the ledger.
Open, judge, settle
An open is one database transaction: the keeper validates the shape, reads the live mid and range, prices your side, checks that the vault can reserve the payout, debits your deposit and writes the open to the ledger.
From there the keeper judges the track against public one-minute bars. It runs on the API's reads of tracks, positions, the feed, stats, the leaderboard and profiles, on every close and prediction, and from a cron entry point. Every run reaches the same verdict for the same bars, so it does not matter which request triggers it. One verdict settles every position on the track, and the proof goes into the ledger: the deciding bar for a derail, the last close for a hold.
The price layer is covered in Price feed and the record in Public ledger.
Price feed
Every price on Rails comes from Hyperliquid's L1, streamed live. The keeper settles on the same public bars you can fetch yourself.
Rails reads public oracle and mid prices plus one-minute bars from Hyperliquid's L1: its crypto perpetuals and the 24/7 tokenized-stock perpetuals on its xyz market. The terminal streams them in real time. Your entry binds to the live mid, and settlement runs on one-minute bars.
How the keeper judges a track
- The bind bar, the minute your entry falls in, counts by its close alone, checked against the rails at the end of that minute.
- Every later bar counts by its high and low, checked against the rails at the bar's midpoint (or at the end of the run, if that comes first). A high at or above the upper rail, or a low at or below the lower rail, is a touch.
- The final bar, the minute the run ends in, counts in full.
- Both rails in one bar: the rail crossed by the larger margin counts as the touch.
- A held track resolves once the final bar has closed, after a 5-second grace.
- Missing bars never create a derail. A minute with no trades has no bar, and nothing crossed.
On a derail, the settle price is the rail's level at the touch, and the ledger stores the deciding bar with its feed and interval. On a hold, the ledger stores the last close. Anyone can pull the same candles from the public feed and rerun the check.
Gaps and old tracks
No data, no verdict. If the feed returns no bars, the keeper leaves the track live and retries on its next pass, so a feed outage can delay a settlement without causing a derail.
The feed keeps about 3.4 days of one-minute bars. If a track still has no verdict 3.3 days after its bind, the keeper judges it on 15-minute bars under the same rules.
Public ledger
Every event on Rails lands in an append-only ledger where each entry commits to the one before it.
The keeper writes every event to the ledger: the vault's genesis seed, faucet claims, opens, Predict positions, wins, losses, early closes, royalties and each held or derailed verdict. Every entry stores its time, kind, address, amount, a reference and a data object with the full terms, plus a SHA-256 hash that commits to the previous entry's hash.
hash = SHA-256( prev_hash + '|' + canonical({ ts, kind, address, amount, ref, data }) )
prev_hash of the first entry = 64 zeros
canonical = JSON with keys sorted and undefined fields droppedEdit, drop or reorder one entry and every hash after it breaks. The ledger page lists the entries, /api/ledger exports them, and /api/ledger/verify recomputes the whole chain from genesis and reports the head.
Verify it yourself
- 1Export
Call
/api/ledger?after=0&limit=500, then pass the lastseqyou received as the nextafter. Rows come in ascending order, each withprevHashandhash. - 2Rebuild each entry
Take
ts,kind,address,refanddataas returned. Convertamountfrom tRAIL back to micro units (multiply by 1,000,000), since the hash commits to the integer amount. - 3Hash and compare
Hash the canonical JSON with the previous hash and compare the result to
hash. The first mismatch marks the first altered entry.
A chain that checks out proves the history is consistent with itself. To catch a rewrite of the whole chain, keep a head hash you trust or compare against an anchor on Robinhood Chain.
Anchors on Robinhood Chain
When an operator key is configured, the keeper anchors the ledger head on Robinhood Chain at most once every 15 minutes. Each anchor is a zero-value transaction from the operator address to itself, with calldata that reads RAILS:<seq>:<hash>. /api/ledger/verify lists the latest anchors, so you can match a head hash to a transaction on the explorer.
Security
What protects the testnet today, what changes when the contracts deploy and the risks that remain.
The status first. On the public testnet the engine runs server-side and plays with tRAIL, a unit with no market value. The keeper holds the books in a database and publishes every event to the hash-chained ledger. The Solidity contracts (TrackEngine, RailsVault, ModelRegistry and TestRail) are written and move to Robinhood Chain in the next phase, followed by an independent audit.
One-time nonces that expire in 10 minutes, signature checks that cover smart-contract wallets and an HttpOnly session cookie.
Every trade, claim and profile change needs a session and passes an origin check, and SameSite cookies block cross-site requests.
The model, fees and limits are public at /api/model with a fingerprint hash. Anyone can recompute a multiplier.
Every balance change is a ledger entry chained by SHA-256, with optional anchors on Robinhood Chain.
Residual risks
- Server trust today. Until the contracts deploy, you rely on the keeper to run the published rules. The ledger exposes a bad write after the fact and cannot block one.
- Price source. Outcomes follow Hyperliquid's public prices and one-minute bars. A wick on that venue counts as a touch.
- Model risk. Odds come from a volatility estimate. If prices move in ways the model does not expect, the vault can gain or lose more than the spread suggests.
- Vault drawdowns. The vault bears losses. Full reserves and the 60% utilization cap bound what it can owe, and a run of player wins can still draw it down.
Contracts and addresses
Networks, contracts and where to verify them. Until each contract deploys, its address reads Launching soon.
Status today: the engine runs server-side on the public testnet, and the public ledger records every event. An operator key can anchor the ledger head on Robinhood Chain. The Solidity contracts below are written and deploy to Robinhood Chain in the next phase, testnet first.
| Network | Testnet | Mainnet |
|---|---|---|
| Chain | Robinhood Chain Testnet | Robinhood Chain |
| Type | Arbitrum-based L2 | Arbitrum-based L2 |
| Chain ID | 46630 | 4663 |
| RPC | https://rpc.testnet.chain.robinhood.com/rpc | https://rpc.mainnet.chain.robinhood.com/rpc |
| Explorer | https://explorer.testnet.chain.robinhood.com | https://explorer.chain.robinhood.com |
| Gas faucet | https://faucet.testnet.chain.robinhood.com | None |
| Contract | Role | Testnet | Mainnet |
|---|---|---|---|
| $RAIL | The platform token, fixed supply of 1,000,000,000 | Launching soon | Launching soon |
| TestRail | tRAIL, the testnet play unit | Launching soon | Testnet unit |
| TrackEngine | Opens tracks and positions, judges and settles them | Launching soon | Launching soon |
| RailsVault | Holds stakes, reserves payouts, pays winners, books fees and royalties | Launching soon | Launching soon |
| ModelRegistry | Pins the pricing model and its parameters by hash | Launching soon | Launching soon |
Developers and agents
The terminal runs on a public JSON API. Anything a player can do, a program can do.
Reads are public and need no key. Writes need a wallet session. Amounts are in tRAIL, times are Unix milliseconds, and errors come back as { error, message } with an HTTP status.
Public reads
| Endpoint | Returns |
|---|---|
| GET /api/markets | All 16 markets with price, 24-hour change, volume, range and session state |
| GET /api/model | Model, fees, limits, faucet and vault seed, plus a SHA-256 fingerprint |
| GET /api/quote?market=&gauge=&grade=&run= | Live P and both multipliers for a shape (defaults: gauge 1.5, grade 0, run 60) |
| GET /api/tracks?market=&sort=hot|new|ending&limit= | Live tracks with more than 2 minutes left (up to 100) |
| GET /api/tracks?status=recent&market=&limit= | Settled tracks, newest first (up to 50) |
| GET /api/tracks/{id} | One track with its positions, status and settlement proof |
| GET /api/positions?owner=&status=open|closed&limit= | Positions for an address; owner=me uses your session (up to 200) |
| GET /api/positions/{id} | One position with its track |
| GET /api/feed?limit=&before=&address= | Recent trading events from the ledger |
| GET /api/ledger?after=&before=&address=&limit= | Raw ledger rows with hashes (up to 500 per call) |
| GET /api/ledger/verify | Recomputes the chain from genesis: ok, entry count, head and latest anchors |
| GET /api/leaderboard?period=24h|7d|30d|all&market=&product=lay|predict | Players ranked by net score |
| GET /api/stats?series=1 | Platform and vault stats; series=1 adds 7 days of hourly capital and volume |
| GET /api/profile/{address} | Rank, stats, open positions, history, equity curve and top markets |
| GET /api/chain | Active network, chain ID, explorer and latest block |
Sign in from code
- 1Request a nonce
POST
/api/auth/noncewith{ address }. The response holds a nonce and the sign-in message. - 2Sign
Sign the message with the wallet key (personal_sign). Signing is free and sends no transaction.
- 3Verify
POST
/api/auth/verifywith{ message, signature }. The response sets an HttpOnly session cookie that lasts 7 days. Send it with every write.
Authenticated calls
| Endpoint | Body | Does |
|---|---|---|
| POST /api/tracks | { market, grade, gauge, runMinutes, side, deposit, minMultiplier? } | Lays a track and opens your position on it |
| POST /api/tracks/{id}/predict | { side, deposit, minMultiplier? } | Opens a Predict position on a live track |
| POST /api/positions/{id}/close | none | Closes your open position early |
| POST /api/faucet | none | Claims 10,000 tRAIL, once every 6 hours |
| GET /api/me | none | Your balance, faucet timer and settings |
| PATCH /api/me | { name?, settings? } | Sets your display name or preferences |
| POST /api/auth/logout | none | Ends the session |
side is hold or derail. Positions carry a kind: lay for the creator's position, predict for a Predict position. A request that fails a guard returns a code that names it: requote when the multiplier fell below your minMultiplier, side_not_offered under the ×1.05 floor, vault_capacity when the vault cannot reserve the payout, on_rail while a track is derailing.
Example
A quote for a flat ±1.5 track over one hour on BTC, trimmed for reading. Price and range change with the market; P and the multipliers depend on the shape alone.
GET /api/quote?market=BTC&gauge=1.5&grade=0&run=60
200 OK
{
"market": "BTC",
"price": 97250.5,
"range": 540.2,
"gauge": 1.5,
"grade": 0,
"run": 60,
"pHold": 0.727739,
"hold": { "p": 0.727739, "m": 1.33289, "offered": true },
"derail": { "p": 0.272261, "m": 3.56276, "offered": true },
"ts": 1789761600000
}An agent can price shapes with /api/quote, open with POST /api/tracks and a minMultiplier guard, follow its track with /api/tracks/{id} and check every result against /api/model and the ledger. The engine documents the model, so an agent can recompute P on its own and compare it with the keeper's quote.
FAQ
Short answers to the questions players ask most.
What can I trade?
Eight crypto markets (BTC, ETH, SOL, XRP, DOGE, HYPE, BNB, LINK) and eight tokenized stocks (HOOD, NVDA, TSLA, AAPL, AMZN, META, PLTR, COIN). The same rules and payout math apply to all of them. See Markets.
Do I need the price to go up to win?
No. You pick a side. Hold wins if the price stays between your rails to the end, whichever way the track leans. Derail wins if the price touches a rail first. Gauge, grade and run set the shape.
Can I bet on someone else's track?
Yes. With Predict you can back any live track to Hold or fade it to Derail, at odds priced from where the price sits now. A track takes predictions until 2 minutes before its end. See Predict.
Who is my counterparty?
A neutral vault takes the other side of every position. Its margin is the published 3% spread plus fees, shown beside your odds. The price against your rails decides every outcome. See Vault architecture.
What are the fees?
Rails charges two fees. The open fee is 1% of your deposit (0.5 tRAIL minimum), taken at open, win or lose. The profit fee is 10% of the profit on any payout above your stake. An early close also carries a 5% penalty on its value. On Predict positions from other players, 15% of the profit fee goes to the track's creator.
How is my multiplier set?
The keeper computes P, the chance your track holds for the whole run, from your shape and the asset's range. Hold pays (1 - δ) / P and Derail pays (1 - δ) / (1 - P), with δ = 3% and a ×50 ceiling. The keeper does not offer a side below ×1.05. See Opening a position.
When do I get paid?
When the track resolves. A derail settles on the keeper's first pass after the touch, and a hold settles five seconds after the final one-minute bar of the run closes. The payout lands in your tRAIL balance in the same step.
What happens if the price touches a rail?
The track resolves at that moment. Every Derail position on it collects stake × M, and every Hold position settles at zero, the creator's included. Positions you closed earlier keep what they paid.
Can I close early?
Yes, any time before the run ends, unless the price sits on a rail at that moment. You receive stake × M × P_win(now) × 0.95, less the profit fee on any profit. See Closing a position.
How many positions can I hold?
As many as you like. Rails sets no cap on open positions per wallet. Each position takes a deposit from 1 to 50,000 tRAIL, and the vault needs room to reserve its payout.
Why did the keeper refuse my open?
The keeper refuses an open when your side prices below ×1.05, when the fresh multiplier falls under the minimum you sent, when your balance runs short or when the vault cannot reserve the payout. The error message names the reason and the fix.
What chain is Rails on?
Robinhood Chain, an Arbitrum-based L2. The testnet chain ID is 46630 and the mainnet chain ID is 4663. See Contracts and addresses.
Are the contracts deployed?
Not yet. The engine runs server-side on the public testnet and records every event in a hash-chained public ledger. The Solidity contracts are written and move to Robinhood Chain in the next phase.
Do I need to verify my identity?
No. You need a wallet and nothing else: no email, no password, no identity check. Signing in is a free signature that sends no transaction.
Do I need ETH for gas?
Not on the testnet. Signing in and trading send no transactions, so you pay no gas.
What is tRAIL?
The testnet play unit. Claim 10,000 tRAIL from the faucet every 6 hours. It has no market value.
Is $RAIL live?
Not yet. $RAIL launches on Robinhood Chain, and until then every contract address reads Launching soon. The draft supply plan is on Tokenomics.
Are the contracts audited?
Not yet. An independent audit comes before mainnet, and the report will be linked from Security.
Can AI agents trade?
Yes. Every action is a JSON call with a wallet session, and every read is public. See Developers and agents.
How do I check a result?
Open the public ledger or call /api/ledger/verify. Each settlement stores its terms and the proof that decided it, and you can recompute the multiplier from /api/model and the terms the ledger recorded at open.
What is net score?
Your settled payouts minus your deposits, fees included, plus the royalties you earned as a creator. The leaderboard ranks by it.
Where do I follow Rails?
On X, the one social account Rails runs. The handle is not public yet.
Glossary
Every Rails term in one table.
| Term | Meaning |
|---|---|
| Track | A center line and two rails laid on a live price for a set run. The unit every product trades. |
| Rail | One of a track's two boundaries: the upper rail or the lower rail. |
| Center line | The line a track leans along. It starts at the entry price and moves at the grade. |
| Gauge | Distance from the center line to each rail, in range (±0.25 to ±6). |
| Grade | How much a track leans, in range per hour (-2.5 to +2.5). |
| Run | How long a track lasts (15 minutes to 24 hours). |
| Range | An asset's one-sigma move over one hour, in price units. It sizes a track at open, then freezes. |
| Hold | The side that wins if the price stays between the rails for the whole run. |
| Derail | The side that wins if the price touches a rail before the run ends. |
| Touch | A one-minute bar whose high reaches the upper rail or whose low reaches the lower rail. |
| Lay | To open a new track and take a side on it. The creator's position. |
| Predict | The product for taking a side on someone else's live track. |
| Back and fade | Backing a track means taking Hold on it. Fading it means taking Derail. |
| Bind | The moment the keeper accepts your open and locks your entry price and multiplier. |
| Entry | The live mid price your position binds to. |
| Hold probability (P) | The model's chance the price stays inside the rails to the end. It prices both sides. |
| Multiplier (M) | Your payout factor, locked at bind: (1 - δ) / P for Hold, (1 - δ) / (1 - P) for Derail. |
| Spread (δ) | The published 3% margin on both sides' odds. |
| Ceiling and floor | No multiplier pays above ×50. The keeper does not offer a side priced below ×1.05. |
| Deposit | What you put into a position, open fee included (1 to 50,000 tRAIL). |
| Stake | The deposit minus the open fee. Every payout formula multiplies it. |
| Open fee | The greater of 1% of the deposit and 0.5 tRAIL, taken at open. |
| Profit fee | 10% of the profit on any payout above the stake. |
| Royalty | 15% of the profit fee on profitable Predict positions from other players, paid to the track's creator. |
| Early close | Cashing out before the track resolves, at stake × M × P_win(now) × 0.95. |
| Vault | The neutral counterparty that reserves and pays every position. |
| Reserve | stake × (M - 1), set aside from vault capital when a position opens. |
| Keeper | The service that quotes, binds, judges tracks from one-minute bars and settles them. Every open, verdict and payout it makes lands in the ledger. |
| Ledger | The append-only, hash-chained record of every event on Rails. |
| Anchor | A Robinhood Chain transaction that records the ledger head's sequence number and hash. |
| Net score | Settled payouts minus deposits, plus royalties earned. The leaderboard ranks by it. |
| tRAIL | The testnet play unit from the faucet. It has no market value. |
| $RAIL | The Rails token, with a fixed supply of 1,000,000,000. Not launched yet. |
Changelog
Dated notes on what shipped, newest first.
| Date | Change |
|---|---|
| Sep 18, 2026 | Public testnet opens with the terminal, Tracks, Predict, the dashboard, the leaderboard, the docs and the public ledger. |