Overcall is the on-chain layer for skill-based market games — one shared economy, powered by the $OVER token. Take a position on real prices and the outcome settles on decentralized price truth, never a house. The first game, Channels, is live on testnet.
The thesis. Make your call — the market settles it. Overcall is a layer, not a game: every game plugs into the same rails — shared settlement, verified identity, and one token. Channels is game #01, not the last.
A layer, not a game
Most on-chain games are a single app with a single economy. Overcall is the opposite: a venue that games plug into. Each game brings its own mechanics, but they all share three rails — a decentralized price source, a 1:1 human identity gate, and the $OVER token. More games means more demand for the same token and more liquidity in the same pools.
The rails
Trustless
Outcomes settle on a signed Chainlink Data Streams price and liquidation is permissionless — like a perp DEX. No one trusts our keeper.
The economy
$OVER
One token across every game — buy fuel, win prizes. Launching on Virtuals. Every game played is demand for the same asset.
The edge
Your read
Overcall is never your counterparty. There's no rake on who wins — the only alpha is reading the market.
Powered by
Chainlink — Data Streams is the decentralized, sub-second price authority every outcome settles on.
Virtuals — the launchpad where $OVER goes live at TGE: liquid and community-owned from day one.
Robinhood Chain — the Arbitrum-based L2 that hosts Channels and ships Chainlink as its exclusive oracle.
Where it is now
Overcall is live on testnet. The full economy switches on at mainnet — keep this split straight:
Testnet — now Live
Mainnet
Fuel
ETH (testnet)
$OVER
Daily prize pool
Sponsored by Overcall
Fuel + a share of Overcall trading fees
Same mechanics either way — only the fuel asset and the pool's funding change. Full detail on The shared economy.
How to read these docs. Start with The vision for the thesis, then The stack for the trustless rails. Channels is the first product — jump there to play. $OVER covers the token and roadmap.
Channels · Game #01
Channels
The first game on Overcall: draw your own liquidation. Stake fuel, draw an angled channel on the live price of any market — crypto or a tokenized stock — and earn every second you stay inside. The whole game in one screen — every rule below has a deeper page.
The 60-second version
Stake ETH for fuel
Fuel is the consumable that powers runs — staked 1:1, a pure sink. A daily cap per wallet keeps bots honest.
Buy a run upfront
Choose a duration in minutes and pay for the whole clock at open — no top-up, no refund. Duration is your conviction dial.
Draw your channel
Anchored at the live price, tilt an angle and pull the walls to a width. Steeper + narrower = more points/sec, harder to survive.
Earn every second inside
Points accrue continuously and ramp — the last seconds of a run pay up to 2× the first. Watch the counter tick up live.
Exit on the ladder
Ride to the end → bank 100%. Close early → keep 1 − d. Touch a wall → crash to 0.
Claim your share at midnight
Banked points share that UTC day's real ETH pool pro-rata. Verify X + Telegram + wallet once, then claim.
The exit ladder at a glance
100%
Full ride
Survive to the end of your bought time. Bank the entire accrued pot.
1 − d
Manual close
Bail anytime. Keep more the closer the price is to your center — 0% right at the wall.
0%
Crash
Price crosses a wall → the whole run pot is lost. A real liquidation.
d is your distance from center: d = |price − center| / halfWidth, capped at 1. Center = 0, a wall = 1. The close curve meets the crash exactly at the wall (both 0), so there's no clever dodge point. See The exit ladder.
Two things you can rely on
The bank is sacred
Points from runs you've already settled can never be lost. A crash only forfeits the current run's pot — never your banked total.
A run can always exit
Even a total oracle outage can't trap your funds: at the end of your bought time a run banks 100% with no price report needed.
Channels · Game #01
Quickstart
From a fresh wallet to your first banked points. Everything here is testnet — grab test ETH and experiment freely.
Connect your wallet
Open the app and click Connect wallet. Any EIP-6963 wallet works. Make sure you're on Robinhood Chain testnet; the footer shows a Testnet chip and live service dots.
Add fuel
In the order ticket, switch to the Fuel tab, enter an amount (or tap a preset), and confirm. You stake testnet ETH and receive fuel 1:1. The conversion line tells you roughly how many hours of runs that buys at the current burn.
Pick a market and aim
Choose an asset from the left market rail — live markets across crypto and tokenized stocks. On the chart, drag to tilt the angle and pull the walls to set your width. The draft tunnel previews your liquidation prices in real time.
Set duration and open
In the ticket, type a duration in minutes (± buttons help). Watch the Win — full ride line: it shows the points and estimated ETH if you survive. Hit Open run to lock it in.
Ride it — then decide
Watch points ramp up each second. When you're happy, Close to keep 1 − d, or let it run to the end for the full 100%. If price touches a wall first, the run crashes to 0.
Verify & claim
Points bank the moment a run settles. At UTC midnight, that day's pool pays out. Complete the one-time verification (X + Telegram + wallet) and hit Claim in the Leaderboard & Claims tab.
First-run tip. Start wide and shallow (a ±3–4×ATR width, near-flat angle, short duration). It pays fewer points but survives easily — you'll learn how the ramp and the d-meter feel before betting on a steep tunnel.
Good to know
You can have up to 5 runs open at once — open several fresh anchors instead of trying to extend one.
A run always settles inside its own UTC day, so max buyable duration shrinks as midnight approaches.
There is no cancel and no refund — fuel spent on a run is spent. Choose your duration deliberately.
Channels · Game #01
The core loop
Seven moves, start to payout. This is the canonical loop — the pages that follow zoom into each part.
Stake → fuel
Players stake testnet ETH and receive fuel, the consumable that powers runs. Fuel is the only sink and the only economy knob. A daily per-wallet cap bounds bot farms.
Buy the whole run upfront
Opening a run costs T × fuelBurnPerSecond for a chosen duration T in real time (60s min … 24h max, capped to the UTC day). Locked at open — no top-up, no refund. T is your conviction dial.
Draw a channel — two continuous knobs
At open, the anchor price P0 is the current Data Streams mark (freshness-bounded). You pick an angle (−4.0…+4.0) and a half-width (±1.0…6.0×ATR). The channel center drifts with your angle; the walls sit at center ± halfWidth.
Earn continuously
Points price the shape, fuel prices the clock. The instantaneous mint rate ramps from your base rate to 2× at expiry, so the accrued pot has a closed form. Late seconds are the valuable ones.
Survive — or not — in real time
A breach is any moment the price crosses a wall. With Data Streams there are no epochs: a liquidator submits the signed report at the instant of the breach. Sub-second sampling makes it wick-proof.
Exit — the ladder
Ride to the full T → bank 100%. Manual close → keep 1 − d. Crash → 0%. An oracle outage only favors you (no report ⇒ no liquidation ⇒ 100% at T).
Points → money, daily
Each UTC day has a real prize pool. At midnight it pays 85% pro-rata to that day's banked points + 15% podium to the top three, via a merkle-drop vault, claim-gated by X + Telegram + wallet verification.
Why upfront & no refund? It's a deliberate double commitment: a crash forfeits your fuel and your pot. That commitment is what makes "ride to the end" and the 2× ramp meaningful rather than farmable. The manual-close escape valve is the only relief — and it pays less the riskier your position.
Channels · Game #01
Drawing a channel
Two continuous knobs define every run: the angle you lean and the width of your walls. Together they set how many points you mint per second — and how easily the market can knock you out.
The anchor
When you open a run, the anchor price P0 is pinned to the current live mark — a fresh, signed Chainlink Data Streams report. You enter at the market price exactly like a perp position. There's no pending state, no future favorable print to wait for, and no cancel. The only residual edge is sub-second timing, bounded by the freshness window.
Angle — your read on the trend
The angle tilts your whole channel up (long) or down (short). It's set as levelX10 ∈ [−40, +40] — that's −4.0 to +4.0 in 0.1 steps, a continuous slider.
slope = level × ATR / 4 (per 5 min of real time)
The channel center at elapsed time τ is P0 + slope × (τ / 300s).
A steeper angle earns more points per second — but the center drifts faster, so the price has to keep up with your trend read or it drifts into a wall. Under a 0% crash, steep tunnels are a lottery: rare, big payouts, negative on average. Angle is priced as an increasing risk premium (see Multipliers).
Width — your margin
Width sets how far the walls sit from the center. It's widthX10 ∈ [10, 60] — ±1.0 to ±6.0 × ATR in 0.1 steps.
halfWidth = widthX10 × ATR / 10
The liquidation walls sit at center ± halfWidth at every instant.
Narrower walls earn more points — but a smaller move liquidates you. Crucially, width is priced in points, not fuel: fuel is a pure duration dial, and the shape is a pure risk/reward dial. The two never bleed into each other.
Units are ATR — never σ. Everything about your tunnel — angle drift and wall distance — is measured in ATR (average true range), the asset's volatility unit at anchor time. A 2×ATR width means the same relative room to breathe on BTC as on PEPE. See ATR.
Reading the chart
The dashed centerline (d = 0) always shows your safe center — points peak there.
The walls render in your accent color while safe, then shift to gold/coral as d climbs past 0.7 (danger).
An entry dot marks P0 on the price line; on a liquidated run, a coral × marks the exact pierce.
Wall / liquidation-price pills sit in the right margin. Hover anywhere on the channel to read both walls at that time.
Channels · Game #01
Duration & the daily cycle
Duration is free-form and bought upfront. But every run belongs to exactly one UTC day — the daily cycle is first-class.
Free-minutes duration
You set any duration in minutes — a number input with ± buttons and a = X.X h readout. There are no fixed 1h/4h/12h/24h presets. The bounds:
Bound
Value
Meaning
MIN_RUN_SECONDS
60
Shortest run — 1 minute.
MAX_RUN_SECONDS
86,400
Longest run — 24 hours.
Daily cap
→ 00:00 UTC
Capped so the run settles inside its own UTC day.
The on-chain cap is min(MAX_RUN_SECONDS, secondsUntilUtcMidnight). A run can never cross the daily settlement — so points always count for the day they were earned. The consequence: max buyable duration shrinks through the day. Open at 23:00 and your longest possible run is one hour.
Daily settlement
At UTC midnight, the keeper settles every still-open run via a report-free full-ride settlement → bank 100%. Reaching your bought T — including at the day boundary — counts as completion, not a bail. So the ramp's full-ride reward stands; the 1 − d penalty is only ever for voluntary early close.
Watch the "settles in" clock. The header shows a live HH:MM countdown to the next UTC midnight. Because settlement banks 100%, a run that survives to the boundary is a completion — a legitimate way to bank the full ramp without riding a marathon.
Duration is conviction
Because the ramp reaches 2× at expiry, a longer run pays disproportionately more if you survive it — but you're exposed to the walls for longer, and you paid for the whole clock upfront with no refund. Short runs are cheap, safe, and farmable-resistant; long runs are the marathon bet. There's no top-up: if you want to "keep playing," open a fresh run (see FAQ).
Channels · Game #01
The exit ladder
Three ways a run ends, one continuous curve. Understanding the ladder is understanding the whole game's risk.
100%
Full ride
Survive to the end of T. Bank the entire accrued pot, report-free.
1 − d
Manual close
Bail anytime at the live mark. Keep pot × (1 − d).
0%
Crash
Any wall touch. The whole run pot is lost — futures-style liquidation.
The distance metric, d
d = |price − center| / halfWidth (capped at 1)
Center → d = 0 · halfway to the wall → d = 0.5 · at the wall → d = 1.
Everything on the ladder is a function of d at the moment you exit. It's shown live in your positions as a d-meter that turns from green to gold to coral as you drift toward a wall.
Full ride — 100%
Let your run reach the end of the time you bought and it banks 100% of the accrued pot. This is settled report-free (settleExpiry) — anyone can trigger it, and it needs no price at all. Reaching your bought T, including at the daily midnight boundary, is completion.
Manual close — keep 1 − d
Close anytime and you settle at the live mark at the moment of the close: bank = pot(τ) × (1 − min(d, 1)).
Dead center (d = 0) → keep 100%.
Halfway to a wall (d = 0.5) → keep 50%.
Right at the wall (d = 1) → keep 0%.
The close value peaks exactly where you feel safest — centered — which is also where the greed to keep going is strongest. If the close report itself shows a breach, the crash rule wins (0).
Crash — 0%
Touch a wall and the run ends at 0%: the entire run pot is lost. This is a real liquidation. Combined with fuel-upfront-no-refund, a crash costs you both the fuel and the pot.
No dodge point. Because manual close hits 0% exactly at the wall, the close curve meets the crash rule continuously. There is no price at which bailing beats crashing — you can't scrape a consolation payout by closing a hair before the wall. And the bank is sacred: a crash forfeits only the current run's pot, never your banked points.
Why 0% at the wall
Earlier economy versions kept a 40% floor on a crash. That re-opened a dodge: bail at the wall for 40% instead of losing everything. The v3 rule — crash = 0, close = 1 − d — sends close-at-edge to zero and closes that loophole for good. It makes the wall a genuine liquidation price and keeps "play it safe vs. push your luck" as the game's core tension.
Channels · Game #01
Points & the ramp
Points are your score, and they don't accrue at a flat rate — they ramp, so the back of a run is worth up to twice the front. Here's the exact math, in closed form.
The instantaneous rate
At every instant, your run mints points at a rate that folds three things: a global base rate, your shape multipliers, and a time ramp.
rate(τ) = RATE × Mangle × Mwidth × (1 + τ / T)
τ = seconds elapsed · T = total run seconds · the shape multipliers are fixed at anchor.
M_angle grows with your angle — an increasing risk premium (up to 16.67× at level 4.0).
M_time = 1 + τ/T — ramps linearly to 2× at expiry. Late seconds are the valuable ones.
The accrued pot — closed form
Because the rate is a simple linear ramp, the total accrued pot is just its integral. Let k = RATE × M_angle × M_width (a per-run constant fixed at anchor):
pot(τ) = k × (τ + τ² / 2T)
pot(T) = k × 3T/2 → the full-ride payout (100%).
So the pot at any real instant is a single multiply-add — settlement never needs an epoch grid or a running tally. This is the continuous generalization of the old discrete per-epoch sum; the 2×-at-expiry ramp is preserved exactly.
Why a ramp at all? Front-loaded economies reward hit-and-run spam — open, grab the easy early points, close. The ramp makes the back of a run worth up to 2× the front, so the reward is for conviction and survival, not for churning. And watching points tick up every second (then vanish on a liquidation) is the intended dopamine.
A worked feel
Two runs with the same shape multipliers k:
Elapsed
Fraction of T
pot(τ) / k
Note
Quarter in
τ = 0.25T
0.281 T
Slow start — ramp barely kicked in.
Halfway
τ = 0.50T
0.625 T
Past half the pot already banked-in-waiting.
Three-quarters
τ = 0.75T
1.031 T
The ramp is paying off.
Full ride
τ = T
1.500 T
2× instantaneous rate at the finish line.
Notice how much of the pot lives in the final quarter: from 75% to 100% of the way through, pot/k climbs from 1.031T to 1.500T — nearly a third of the whole pot is in that last stretch. That's the tension the ramp is designed to create.
Channels · Game #01
Multipliers: the lottery
Steeper and narrower pay more — a lot more. But under a 0% crash, those big multipliers are a lottery, not a fair menu. This is a deliberate design decision, not a bug.
Why it's a lottery
When calibration replayed real market data against the crash-=0 model, it confirmed a structural fact: under a 0% crash you cannot make the grid EV-flat. A player who simply rides to breach or to full T almost never survives a steep, long tunnel (measured crash rates near 100% at levels 1–4). No finite multiplier turns an almost-always-zero bet into one as profitable as a safe flat tunnel — the solver blew up and still couldn't flatten it.
So the multipliers are an increasing risk premium: steep / narrow / long = rare, big payouts, negative on average. A brave degen bet, on-brand for a liquidation game. Safe, wide, flat tunnels are the reliable grind; steep narrow ones are the jackpot pull.
Embrace the lottery. These tables are the intended v3 multipliers, not placeholders. If a fair menu were ever wanted, the lever is a small crash floor (e.g. 10%) or shorter max durations for steep angles — both re-open flat calibration. That's an explicit owner decision, not something to "recalibrate to flat" quietly.
Angle multiplier
M_angle = exp(k · |level|) with k = ln(16.67) / 4, so level 4.0 pays exactly 16.67× level 0. It's a 41-entry lookup table indexed by |levelX10| (0.0…4.0). A sample:
Angle level
Multiplier
0.0 (flat)
1.00×
1.0
2.02×
2.0
4.08×
3.0
8.25×
4.0 (max)
16.67×
Width multiplier
M_width = (2/W)^α with α = 1.748, where W is the half-width in ATR. A 2×ATR width is the reference (1.00×); tighter walls pay steeply more, wider walls pay less. It's a 51-entry table indexed by widthX10 − 10 (1.0…6.0). A sample:
Half-width
Multiplier
Feel
±1.0 ×ATR
3.36×
Knife-edge — breaches fast.
±1.5 ×ATR
1.65×
Tight.
±2.0 ×ATR
1.00×
Reference width.
±3.0 ×ATR
0.49×
Roomy.
±4.0 ×ATR
0.30×
Very safe.
±6.0 ×ATR
0.15×
Maximum margin.
One synced source of truth. The full multiplier tables live in exactly three places kept byte-identical: the contract, the web mirror, and the game spec. A guard (check-economy-sync.mjs) enforces that they never drift. Any economy change means recalibrating all three together — the tables you see in the ticket are the tables the contract pays.
Channels · Game #01
The daily prize pool
Points are your in-game score. Once banked, they turn into a share of a real ETH pool — settled every UTC day.
The split: 85 / 15
Each UTC day has a real prize pool. At midnight it pays out in two parts:
Pro-rata
85%
Split across everyone by banked points. Your share = myPoints / totalPoints × 85% of pool. Sybil-neutral — splitting across wallets changes nothing.
Podium
15%
The top three by banked points take 7% / 5% / 3% of the pool. A bonus for topping the day, on top of pro-rata.
The pro-rata denominator is that day's banked-points total (the on-chain Banked events), attributed to the run's open day. Because a run can't cross midnight (see Duration), there's no cross-day mis-attribution.
See your share live
You don't have to wait for midnight to know where you stand. The app shows a live projected prize — myPoints / totalPoints × pool — in the header and the account drawer, updating as you bank points and as others do too. The order ticket's Win — full ride line even projects the ETH value of a run before you open it.
Pro-rata dilution. Your projection moves as the day's total points change. Bank more and it rises; when others bank, your share dilutes. That live tug-of-war is part of the game — it's why timing and shape choice matter, not just raw survival.
Where the pool comes from
It depends on the phase — and the difference is worth knowing:
Phase
Fuel
Daily prize pool
Testnet — nowLive
Testnet ETH
Sponsored by Overcall (real ETH)
Mainnet
$OVER
Fuel revenue + a share of Overcall trading fees
Today, on testnet, you play with testnet fuel and win a sponsor-funded real-ETH pool. On mainnet the pool becomes self-funding: every run's fuel is $OVER, and Overcall routes a share of its trading fees back in — so the pool grows with both play and trading volume, no sponsor required. See The shared economy.
Channels · Game #01
Claiming your prize
Prizes are paid through a merkle-drop vault, and claiming is gated by a one-time identity check. Here's how the gate works and why it's there.
How a claim works
Midnight settlement
At UTC midnight the keeper tallies the day's banked points, computes each wallet's allocation (85% pro-rata + 15% podium), and posts a merkle root of that day's payouts to the reward vault.
Verify once
Link your X account, your Telegram, and your wallet — a 1:1 human check. Once verified, you stay verified. This is the sybil gate that keeps the pool fair.
Claim
In the Leaderboard & Claims tab (or the account drawer), each claimable day shows as a row with its amount. Hit Claim; the vault verifies your merkle proof plus a signature from the verifier and pays out.
The verification gate
The vault won't pay a claim without an EIP-712 signature from the Overcall verifier service (signing domain OvercallRewards). The verifier only issues that signature once your X + Telegram + wallet check passes. So two things must both be true to claim: you're in that day's merkle root and you're a verified human.
Why gate at all? The 85% pro-rata split is only sybil-neutral if wallets map to humans. Pair the verification gate with the daily per-wallet fuel cap and the bot angle closes: you can't meaningfully multiply your share by splitting across wallets, and each verified wallet is capped on how much fuel it can burn per day.
Pull-based, always
Every payout in Overcall is pull-based — the vault never pushes ETH to you. Prizes wait in the merkle drop until you claim them, and in-game balances sit in a per-wallet balance you withdraw. This is standard safe-payment design: no failed push can wedge the contract.
The stack
Trustless settlement
The whole layer is only as trustworthy as its prices. Every game on Overcall settles on Chainlink Data Streams — decentralized, sub-second, signed price reports — so no one has to trust our keeper. This is the first rail every game plugs into.
A pull oracle
Data Streams is a pull oracle: a signed report is fetched off-chain and submitted on-chain only at the moments that need a price — open, close, liquidate. The contract verifies each report against Chainlink's VerifierProxy. The report is signed by Chainlink's decentralized network, so the keeper is only a relayer, never a price authority.
The keeper can't cheat prices. Because reports are Chainlink-signed, the relay that forwards them to your browser is not a trust point — a tampered report simply fails verification on-chain. The browser can't fetch the credentialed report itself, so the keeper relays it; that's a plumbing role, not a power.
Anchor = live mark, freshness-bounded
Opening a run accepts a report whose timestamp is within a tight window of the current block; that mark becomes your P0. You enter at the current market price like a perp — there's no future favorable print to wait for. The only residual edge is sub-second timing, bounded by the freshness window (MAX_REPORT_AGE = 60s at open, a tighter CLOSE_MAX_AGE = 20s at close).
Breach = any signed report beyond the wall
A breach is proven, not asserted: a signed report at time τ with a price outside center(τ) ± halfWidth is the proof. No OHLC candle needed — the stream's high-frequency reports are the wick. Anyone can submit that report to liquidate the run (see Liquidation).
Honest limitations of a pull oracle
Settling a real-time game on a pull oracle has bounded, accepted properties — none is a bug, and none should be "fixed" by re-introducing a trusted keeper price:
Sub-tick timing. Every price is the freshest signed report, not the literal continuous mark. Timing a favorable tick within the freshness window is a bounded skill edge — capped by the freshness bound, d ≥ 0, the daily cap, and pro-rata dilution.
Genuine recovery. If the price truly re-enters the tunnel before any breach report lands, a fresh close pays 1 − d on the recovered price — legitimate, since at the wall d → 1 so the payout → 0 anyway. Stale reach-back to a pre-breach price is blocked by the tight 20s close window.
Wick pierce-and-recover. A fast wick that pierces a wall and recovers without any report landing at the extreme goes undetected. This is inherent to a finite report cadence; it only ever favors the player (a missed breach never over-liquidates), so it's safe to accept.
Data Feeds as a sanity check
Chainlink Data Feeds (the push-based reference prices) are also live on Robinhood Chain. The contract can bound-check a Data Streams mark against the latest Feed to reject an absurd report, and Feeds are the degraded-mode reference if Streams are briefly unavailable.
Crypto and stocks, one rail
Chainlink Data Streams covers both crypto and tokenized stocks (equities) on Robinhood Chain, so Channels runs on either from the same settlement rail — whichever market you pick, the outcome is proven by the same signed, decentralized price. Adding a market is adding a feed id, not a new trust assumption.
The stack
Liquidation & the never-stuck law
Liquidation is permissionless and incentivized — that's what makes "survived to the end" trustworthy. And no matter what, a run can always exit.
Permissionless liquidation
Anyone except the run's owner can liquidate it by submitting a signed report that proves a breach at a time within the run's window. The liquidator earns a small optional bounty from the treasury. This is standard perp-DEX liquidation — and it's exactly what makes "survived to T" meaningful:
If a run had breached, an incentivized party would have proven it. So an unchallenged run reaching its end settles 100% — its survival is trusted not because we say so, but because anyone with a profit motive could have knocked it out and didn't.
The never-stuck law
A run can always exit — funds can never be trapped:
closeRun works the instant a fresh report is available.
settleExpiry banks 100% at the end of T with no report at all.
That second path is the safety valve. Even a total Chainlink outage cannot trap your money: with no report, no breach can be proven, so no run can be liquidated — and once your time is up, expiry settlement banks the full pot report-free.
An outage favors the player. No report ⇒ no liquidation ⇒ 100% at T. There is no voidRun and no refund path — none is needed. On a chain whose only oracle is Chainlink, a full Streams + Feeds outage would freeze the whole chain's DeFi anyway; this is the safety valve, not a common path. Don't add a report requirement to expiry settlement "for safety" — that would re-introduce a stuck-funds path.
How a run ends
Kind
Trigger
Who
Banks
Close
closeRun with a fresh report
Owner
pot × (1 − d)
Crash
liquidate — breach proven
Anyone but owner
0
Full ride
settleExpiry after T
Anyone
100%
Channels · Game #01
Fuel & the sink
Fuel is the only economy knob. It powers runs, it's a 100% sink, and it's bought upfront with no refund — the design is deliberately unforgiving.
Stake → fuel
You stake testnet ETH and receive fuel at 1:1 in wei. Staking is a 100% sink to the treasury — fuel is spent, not held as a balance you can un-stake. A daily per-wallet stake cap (dailyStakeCap, default 0.05 ETH/day) bounds how much any one wallet can burn per day, which is a key part of the anti-bot design.
Buying a run
Opening a run locks T × fuelBurnPerSecond upfront — you pay for the whole clock at open. There is:
No top-up — you can't add fuel to extend a live run.
No refund — closing early or crashing doesn't return unused fuel.
No cancel — once open, a run only ends on the ladder.
Double commitment. Fuel upfront + no refund means a crash costs you your fuel and your pot. That's intentional. It's what gives "ride to the end" and the 2× ramp their weight — without it, the game collapses into safe hit-and-run farming. The manual-close valve is the only relief, and it pays less the riskier you're positioned.
Fuel prices time; points price shape
A clean separation runs through the whole economy: fuel is a pure duration dial and points are the pure risk/reward dial. Widening or steepening your channel never costs more fuel — it only changes your points multipliers. Buying a longer run never changes your multipliers — it only costs more fuel and exposes you to the walls for longer.
Why no top-up?
Extending a live run was considered and deliberately left out. The pot formula pot(τ) = k·(τ + τ²/2T) has T in the denominator — increasing T mid-run would make your already-accrued points tick down, which is both wrong and infuriating. It would also turn the upfront commitment into an option (pay only for time used, stop when risky), diluting the pool and removing the core tension. The "keep playing" feel is already covered by opening a fresh run — up to 5 at once.
Channels · Game #01
ATR: the volatility unit
Every tunnel is measured in ATR — the asset's volatility unit — so a "2×ATR width" means the same thing on BTC as on a memecoin or a tokenized stock. ATR is the one bounded trust input in the system, and it never decides win or loss.
What ATR does
ATR (average true range) sizes your tunnel: both the wall distance (halfWidth = widthX10 × ATR / 10) and the angle drift (slope = level × ATR / 4 per 5 min) are expressed in ATR. It's set once, at anchor. Because it's a shared, volatility-relative unit, the same slider positions give a comparable risk profile across every market — crypto or stock — you don't have to recalibrate your intuition per asset. Units are always ATR, never σ.
ATR sizes; it never judges. ATR only scales the tunnel at the moment you open. Once set, your walls are fixed prices — ATR plays no part in deciding whether a later report is a breach. So even though ATR is a trusted input, it can't be used to cheat you out of a win or into a loss; it can only make your tunnel a bit wider or narrower at open.
How ATR is sourced
In a real-time, epoch-free game there's no rolling epoch history to average, so ATR is provided by the keeper (setAtr, poster-gated) and — for production — sanity-bounded against a Chainlink Data Feed reference so an absurd value is rejected. This is the pragmatic, trust-minimized default. The fully trustless upgrade — computing realized volatility on-chain from recent signed reports at open — is a future option; it's more gas but removes even this bounded trust input. ATR is never player-supplied.
Candidate designs, ranked
#
Design
Trade-off
1
On-chain realized vol from N recent signed reports
Fully trustless, higher gas. Preferred if gas allows.
2
Keeper-set ATR, sanity-bounded vs a Data Feed
Trust-minimized, cheap. The shipped MVP default.
3
A Chainlink volatility feed, if offered
Clean, dependent on feed availability.
Reference
Contract surface
The functions and events that make up the on-chain game, at a glance. Names and shapes follow Channels.sol.
Core functions
Function
Who
What it does
stake()payable
Anyone
Stake testnet ETH → fuel, subject to the daily per-wallet cap.
Verifies a fresh report (≤ 60s), pins P0 = mark, sets halfWidth/slope, caps duration to the UTC day, locks the fuel upfront. No pending state, no cancel.
closeRun(id, report)
Owner
Report must be ≤ 20s. Banks pot(τ) × (1 − d) at the live mark; a breach on the close report settles 0.
liquidate(id, report)
Anyone but owner
Proves price beyond a wall within the run window → settles 0. Optional flat bounty from treasury.
settleExpiry(id)
Anyone
After T, banks pot(T) (100%) with no report — the never-stuck escape.
potAt(id, elapsed) · centerAt(id, elapsed)
view
UI / keeper mirrors of the accrual and center math.
A run ends. kind: 0 close · 1 crash · 4 full ride.
Banked(player, runId, points, day)
Points bank — this is the daily prize denominator, attributed to the run's open day.
The stack
Contracts
Channels.sol (the game), RewardVault.sol (daily merkle-drop + EIP-712 claim gate), an IPriceVerifier seam wrapping Chainlink's VerifierProxy, and an ArcadeBase for admin / treasury / pull-payments.
Off-chain
A keeper (price sampler + report relay + permissionless liquidator + expiry settler + daily standings/vault posting) and a verifier service (X + Telegram + wallet → EIP-712 claim signatures).
Reference
Constants & parameters
The fixed numbers that bound the game, plus the admin-tunable knobs. These are enforced in the contract and mirrored in the app.
Fixed constants
Constant
Value
Meaning
MIN_RUN_SECONDS
60
Shortest run (1 min).
MAX_RUN_SECONDS
86,400
Longest run (24 h), further capped to the UTC day.
MAX_ACTIVE_RUNS
5
Concurrent open runs per wallet.
MAX_LEVEL_X10
40
Max angle magnitude — ±4.0, in 0.1 steps.
MIN_WIDTH_X10 … MAX_WIDTH_X10
10 … 60
Half-width range — ±1.0…6.0 ×ATR.
SLOPE_REF_SECONDS
300
Slope is measured per 5 minutes.
MAX_REPORT_AGE
60 s
Freshness window at open.
CLOSE_MAX_AGE
20 s
Tighter freshness at close (anti stale-dodge).
RATE_PER_SEC
33
Base point rate — sets absolute scale only.
Admin-tunable
Parameter
Default
Meaning
fuelBurnPerSecond
—
Fuel cost per second of run time.
dailyStakeCap
0.05 ETH
Max stake per wallet per day (anti-bot).
liquidatorRewardWei
0
Flat bounty paid to a liquidator.
Calibration constants
Constant
Value
Drives
Angle curve k
ln(16.67)/4
M_angle = exp(k·|level|) → 16.67× at level 4.0.
Width exponent α
1.748
M_width = (2/W)^α, reference 2×ATR = 1.00×.
Prize split
85 / 15
Pro-rata / podium (7·5·3% to top-3).
These are game-rule invariants. The ladder (100 / 1−d / 0), the ramp, the calibrated tables, and the daily split can't change silently. Any change requires an explicit owner decision, a spec update, recalibration, and a passing sync check across the contract, the web mirror, and the spec.
Reference
FAQ
Quick answers to the questions that come up most.
What is Overcall?
Overcall is the on-chain layer for skill-based market games — a venue, not a single game. Every game plugs into the same rails: a decentralized price source, a 1:1 human identity gate, and one token, $OVER. Channels is game #01. See The vision.
What is $OVER?
$OVER is Overcall's token, launching on the Virtuals launchpad at TGE. It's the fuel every game buys and the asset prize pools pay out in — one economy across every game on the layer. Today's testnet uses testnet ETH; the switch to $OVER happens at mainnet. See The $OVER token and the roadmap.
What markets can I play on?
Both crypto and tokenized stocks. Channels runs on any market Chainlink Data Streams covers on Robinhood Chain — pick one from the market rail. Whichever you choose, the outcome settles on the same decentralized, signed price rail. See Trustless settlement.
What changes at mainnet?
The mechanics don't — only the economy does. Testnet now: fuel is testnet ETH and the daily pool is sponsored by Overcall. Mainnet: fuel is $OVER and the pool is funded by fuel revenue + a share of Overcall trading fees. See the full split on The shared economy.
What exactly is fuel?
Fuel is the consumable that powers runs. Today you get it by staking testnet ETH 1:1; on mainnet fuel is bought with $OVER. Either way it's spent — a 100% sink, not a balance you can un-stake. Opening a run burns duration × fuelBurnPerSecond upfront. There's a daily per-wallet cap to bound bots.
What happens if I touch a wall?
The run crashes: the entire run pot is lost (0%), a real liquidation. Your banked points from prior runs are untouched — the bank is sacred. Because manual close hits 0% exactly at the wall too, there's no way to scrape a payout by bailing a hair early.
What about a fast wick that touches my wall and recovers?
A breach is proven by any signed report beyond the wall — an intended real touch liquidates. But a wick that pierces and recovers without any report landing at the extreme goes undetected. That's inherent to a pull oracle with finite cadence, and it only ever favors you (a missed breach never over-liquidates), so it's accepted rather than "fixed."
What if the oracle goes down?
An outage favors the player. With no report, no breach can be proven, so no run can be liquidated — and once your time is up, expiry settlement banks 100% with no report at all. Your funds can never be trapped. There's no void or refund path because none is needed.
Can I extend a run or add fuel to it?
No. Duration is fixed at open and fuel is bought upfront with no top-up and no refund. Extending would break the pot math (it would make accrued points tick down) and remove the game's core tension. If you want to keep playing, open a fresh run — you can have up to 5 at once.
Can I farm the pool with lots of wallets?
Not meaningfully. The 85% share is pro-rata, so splitting across wallets doesn't grow your slice. The daily per-wallet fuel cap limits how much any wallet can burn, and claiming is gated behind X + Telegram + wallet verification — a 1:1 human check.
When do payouts happen?
Every UTC midnight. The keeper tallies that day's banked points, posts a merkle root of the allocations to the reward vault, and you claim your share (85% pro-rata + 15% podium) once you're verified. The header shows a live "settles in" countdown.
Is this real money?
You play with testnet ETH — free and throwaway. The daily prize pool is real ETH, sponsor-funded during the testnet phase. Free to play, real prizes. At mainnet the economy runs on $OVER: fuel is bought with the token and prize pools pay out through it, so the pool is funded by real on-chain activity.
Reference
Glossary
The vocabulary of Channels, in one place.
Term
Meaning
Overcall
The layer — the on-chain venue for skill-based market games. A platform, not a single game.
$OVER
Overcall's token. Fuel on mainnet and the asset prize pools pay out in. Launches on Virtuals.
Channels
Game #01: draw your own liquidation. Stake fuel, draw an angled tunnel, survive.
The layer / rails
The shared services every game plugs into: settlement, identity, and the $OVER economy.
Markets
What you can play on — crypto and tokenized stocks, any asset Chainlink Data Streams covers on Robinhood Chain.
Virtuals
The launchpad where $OVER goes live at TGE — liquid and community-owned from day one.
TGE
Token Generation Event — when $OVER launches and the economy switches from testnet ETH to the token.
Fuel
The consumable that powers runs. Testnet ETH today, $OVER at mainnet. A 100% sink, no refund.
Run
A single position: a tunnel of chosen angle and width over a bought duration.
Tunnel / channel
The angled corridor you draw. Its edges are your liquidation walls.
Anchor / P0
The live mark at open — your entry price, like a perp entry.
Angle / level
How steeply the channel tilts, −4.0…+4.0. Drives the angle multiplier.
Half-width
Distance from center to a wall, ±1.0…6.0 ×ATR. Drives the width multiplier.
ATR
Average true range — the volatility unit that sizes every tunnel. Never σ.
d
Distance from center, |price − center| / halfWidth, capped at 1. Center 0, wall 1.
Pot
Points accrued so far in the current run: k·(τ + τ²/2T).
The ramp
The 1 + τ/T factor — the mint rate reaches 2× at expiry.
Bank
Your lifetime settled points. Sacred — never lost to a crash.
Full ride
Surviving to the end of T. Banks 100%.
Crash
A breach — a wall touch. Banks 0%.
Breach
Any signed report with price beyond a wall. Provable, permissionless to submit.
Keeper
The off-chain service: price relay, liquidator, expiry settler, daily standings.
Data Streams
Chainlink's pull-based, sub-second, signed price source. The game's price truth.
Pro-rata
85% of the daily pool split by banked points. Sybil-neutral.
Podium
15% of the daily pool to the top-3 (7 / 5 / 3%).
Overcall
The vision
One layer. Every game. One token. Overcall is a layer, not a game — the trustless venue for skill-based markets. Take a position on real prices and the outcome settles on decentralized price truth, never a house. Every game plugs into the same rails: shared settlement, verified identity, and one token — $OVER.
The thesis
Prediction markets and casinos both answer "what happens next?" — but one runs on real outcomes and the other on a house edge. Overcall takes the first path and removes the house entirely. The venue is never your counterparty. Outcomes are decided by a decentralized price feed, prizes are redistributed among players, and the same token flows through every game. Skill-based markets, settled in the open.
Three pillars
Trustless settlement
Every outcome reads a decentralized Chainlink Data Streams price, and liquidations are permissionless — like a perp DEX. No one trusts our keeper.
One token economy
Every game runs on $OVER — buy fuel, win prizes, one asset launched on Virtuals. More games mean more demand for the same token.
Your read is the edge
There is no house edge on who wins — the pool is shared among players. The only alpha is reading the market. See No house, all market.
Channels is game #01. The first game proves the rails end-to-end: draw a channel, ride the live market, settle on decentralized truth. More skill-based games join the same rails and the same token — see the roadmap.
Overcall
No house, all market
Overcall is never your counterparty. There is no rake on who wins and no house that profits when you lose — the daily pool is shared among players and settled on decentralized price truth. Your only edge is reading the market.
Who you're playing against
In a casino, the house is the counterparty: it wins when you lose, and the edge is baked into every bet. Overcall has no such seat at the table. When you play Channels:
The market decides the outcome — a decentralized Chainlink price, not us. We can't move a wall or nudge a settlement.
Prizes come from the pool, not the house — banked points share the day's pool pro-rata (85%) plus a top-3 podium (15%). Your winnings are other players' pool, redistributed.
We take no cut of who wins — the venue's only economic input is fuel (the sink), not a rake on outcomes.
0% house edge on who wins. This is a claim about the counterparty, not about variance. Within Channels you still choose your risk: a steep, narrow tunnel is a high-variance bet (see Multipliers). But that variance plays out between players — the house never takes the other side.
The only edge is your read
Because no one is fading you, the entire game reduces to a single question: can you read where the market goes? Pick the right angle, the right width, the right time to bail — and you keep more of the pool. Misread it and the market liquidates you. That's the product: a skill-based market where skill, not a house, decides the split.
The stack
Verified identity & fairness
A shared rail across every game: 1:1 human verification so a pro-rata pool can't be farmed by bots. Verify once, play everywhere on the layer.
The verification gate
Claiming a prize requires linking your X account, your Telegram, and your wallet — a 1:1 human check. The reward vault won't pay a claim without an EIP-712 signature from the Overcall verifier (signing domain OvercallRewards), and the verifier only issues that signature once your check passes. Two things must both be true to claim: you're in that day's merkle root and you're a verified human.
Why pro-rata needs it
The daily pool splits 85% pro-rata to banked points. Pro-rata is sybil-neutral — splitting your points across ten wallets yields the same total share as one wallet, so there's no gain from farming. The verification gate plus a daily per-wallet fuel cap close the remaining angle: a bot can't multiply its slice, and each verified human is bounded on how much fuel it can burn per day.
One identity, every game. Verification is a layer rail, not a Channels feature. As new games join Overcall, the same 1:1 human check and the same reward-vault gate keep every game's pool fair — verify once, and you're cleared across the layer.
The stack
The shared economy
One token, shared pools, shared identity — the economic rail every game plugs into. Play any game on Overcall and you're transacting in the same asset: $OVER.
Fuel is the only sink
Every game is powered by fuel, the consumable you spend to play. Fuel is the economy's single sink — bought upfront, no refund. Today, on testnet, fuel is staked from testnet ETH. On mainnet, fuel is bought with $OVER, so every run played is structural buy pressure on one token.
Testnet now vs mainnet
The mechanics never change — only what fuels the economy does. The switch happens at mainnet, when $OVER goes live. This is the single most important distinction to keep straight:
Testnet — now Live
Mainnet
Fuel
Staked from testnet ETH
Bought with $OVER
Daily prize pool
Sponsored by Overcall (real ETH)
Fuel revenue + a share of Overcall trading fees
Prizes flow through the token
On mainnet the daily pool is self-funding, with two sources: the $OVER fuel players spend, plus an added boost from a share of Overcall's trading fees — the venue routes part of its trading revenue back into the pool. The more the layer is played and traded, the deeper the pools, and no sponsor is required. During testnet, pools are simply sponsored by Overcall in real ETH so the game can be proven before the token goes live.
Why one token across games
Every game is demand for the same asset. A new game doesn't fragment liquidity into a new token — it adds volume to $OVER.
Shared pools and identity. The same reward vault and the same verified-human gate serve every game.
The layer compounds. Channels is game #01; each game that joins deepens the same economy rather than starting from zero.
Testnet today, $OVER at mainnet. The mechanics are identical; only the fuel asset changes. Read The $OVER token for how it launches, and the roadmap for when the switch happens.
$OVER
The $OVER token
One token fuels every game. $OVER is the economic engine of Overcall, launching on the Virtuals launchpad. On mainnet every run's fuel is bought with $OVER and prize pools flow through it — so every game played is demand for the token.
What $OVER does
Fuel is $OVER
Every run is bought with fuel — the economy's only sink. On mainnet fuel is $OVER, so more play means constant, structural buy pressure.
Launched on Virtuals
$OVER launches on the Virtuals launchpad at TGE — liquid and community-owned from day one, not a locked VC schedule.
Every game, one token
Fuel, prizes, and rewards across every game settle in $OVER. The layer grows game by game — the token captures the whole economy.
Where the demand comes from
$OVER isn't a governance sticker bolted onto a game — it is the economy. Because fuel is the only sink and fuel is $OVER, the token sits directly in the path of every action that costs anything, and daily prize pools are funded by that fuel plus a share of Overcall's trading fees — so both play and trading feed the same pot. Because the same token serves the whole layer, each new game adds to the same demand curve instead of splitting it — the token captures the layer's growth, not a single game's.
Testnet now vs mainnet. Today, fuel is testnet ETH and the daily pool is sponsored by Overcall. At mainnet, fuel is $OVER and the pool is funded by fuel revenue + a share of Overcall trading fees. Full split on The shared economy.
Not live yet. Today's testnet runs on testnet ETH; the $OVER economy goes live at mainnet. Nothing here is financial advice, and no token is tradeable until TGE on Virtuals. Track the switch on the roadmap.
$OVER
Roadmap
From testnet to a token economy, launched in the open. Prove the game on testnet, launch $OVER on Virtuals, move the whole economy on-chain — then open the layer to more games.
Now · Testnet · Channels Live
Channels is live on Robinhood Chain. Stake testnet ETH for fuel, draw your channel, and win real sponsor-funded ETH prizes. Every outcome settles on Chainlink Data Streams; claims are gated to verified humans.
Next · TGE · $OVER on Virtuals
The $OVER token launches on the Virtuals launchpad — liquid and community-owned from day one. It becomes the asset the entire economy is denominated in.
Then · Mainnet · the real economy
Fuel is bought with $OVER, and the daily prize pool becomes self-funding: fuel revenue plus a share of Overcall's trading fees — no sponsor needed. Every run played and every trade is structural demand for the token — no house, all on-chain.
The layer · More games, one economy
New skill-based market games plug into the same rails — shared settlement, shared identity, and the same $OVER economy. Channels is game #01, not the last.