SKYSPRINT Docs
How the arcade works: the hold gate, the run economy, every game, and exactly what is live versus still a prototype.
Overview
Sky Sprint is a competitive Web3 arcade on Robinhood Chain. Instead of paying to play, you earn the right to play by holding — the longer your tokens stay in the wallet, the more runs you unlock. Skill decides the leaderboard; holding decides who gets to enter.
Every game currently runs as a client-side simulation. Scores, run counts, and leaderboard entries live in your browser's localStorage — there is no contract deployed and no wallet transaction yet. Nothing here can move real funds. See Build Status for the per-feature breakdown.
| Parameter | Value | Source |
|---|---|---|
| Chain | Robinhood Chain | workspace README.md |
| Chain ID | 4663 | testnet 46630 |
| L2 type | Arbitrum Orbit L2 | workspace README.md |
| Gas token | ETH | workspace README.md |
| Block time | ~100 ms | workspace README.md |
| Token | Sky Sprint / SKYSPRINT | game config |
Game Loop
Five steps, in order. Every game in the arcade uses the same loop — only the skill test changes.
- Connect a walletThe wallet is what the hold gate reads. A wallet with nothing in it earns zero runs, by design.
- Clear the hold gateYou need 3 hours of accumulated holding before your first run unlocks. See The Hold Gate.
- Spend a runEach round burns one run from your balance. Runs are earned over time, capped per day — they do not accumulate forever.
- PlayYour score is whatever the game awards. A bust score of zero is still a spent run.
- SettleYour score joins the room leaderboard. Top scores at the weekly cutoff take the prize pool.
The Hold Gate
The gate is the entire point of the arcade. Holding is not a fee — it is the entry requirement, and the only thing that generates runs.
| Constant | Value | Meaning |
|---|---|---|
holdHours | 3 | Holding needed before run #1 |
blockHours | 3 | Hours per earning block |
runsPerBlock | 2 | Runs granted per completed block |
runCap | 6 | Maximum runs you can bank at once |
dailyHours | 24 | Upper bound used for held-time |
Worked example
A wallet held for 10 hours:
floor(10 / 3) = 3 completed blocks
3 × 2 runs per block = 6 runs
6 capped at runCap 6 -> 6 runs available
Held for 9 hours: floor(9/3)=3 → 3×2 = 6 runs. Held for 8 hours: floor(8/3)=2 → 2×2 = 4 runs. Holding 2 hours gives nothing — the gate is not met.
Held hours are derived from the wallet's first balance receipt. Until a backend supplies that, the shipped build mirrors a localStorage placeholder so the game and dashboard agree with each other. This is the first thing that changes when the on-chain reader lands.
Game Catalogue
Three titles are playable now. All three share the same hold-to-play loop: clear the gate, spend a run, chase a score.
A second shelf of titles is announced but not built — see Announced Titles. Nothing in that shelf has rules, code or a page yet.
Sky Sprint
Flappy-style endurance run through tightening gates. Distance is the score; the walls never forgive.
Live now Open game →Sky Invasion
Tower defence on a 5×7 grid. Energy regenerates on a timer; spend it on sentries, lances, barriers and frost before the swarm reaches your core.
Off Gate Not playable yetSky Guardian
Fly the ship and shoot the meteor field down. Both spawn rate and meteor speed climb until only reflexes keep the shield alive.
Off Gate Not playable yetAdditional titles are under development. They are not released, so there is nothing to link to and nothing documented about their rules yet — this page updates as each one ships.
Where Everything Lives
The site is three pages. Knowing which one holds what matters, because the same game name can appear in two places with two very different meanings.
| Page | Section | What it holds |
|---|---|---|
| Landing opening video, hero, marketing |
Hero | One call to action — Explore Arena. There is no Play button in the hero. |
| Play With Friends | The six announced social titles, as placeholders with no links | |
| Arena the dashboard |
Explore | The three playable titles, plus the Contract Address field with copy-to-clipboard |
| Games | Play With Friends again — the same six placeholders | |
| Dashboard | Wallet totals, My Runs (runs available, runs used, best score, held hours) and Run Economics | |
| Docs this page |
— | Rules and tuning for everything above |
It is now a block inside the Dashboard rather than a separate view, because the numbers it showed (runs available, runs used, best score, held hours) are all things you want next to your balance — not behind another click.
Contract Address field
Explore carries a Contract Address row with a Copy button. Until the token is deployed it reads After launch, and copying it says so plainly rather than claiming success on an address that does not exist.
Once a real address is pasted in, the field is recognised as an address and the copy confirmation changes accordingly. The address is a plain text node, so replacing it needs no code change.
Announced Titles
Six further games are named on the site but none of them exist yet. No prototype, no rules written down, no playable build. They are placeholders so the lineup is visible while the work happens.
The intent is a shelf of simple, fast wallet-to-wallet games — the kind you pick up in a minute and learn by playing one hand — each match staked in SKYSPRINT between two connected wallets.
Domino
Lay tiles, block the board, play out the rest.
AnnouncedA hand-building duel, one wallet against another.
AnnouncedChess
Square-by-square outthinking. Slow and deliberate.
AnnouncedLudo
Race pieces around the board, roll out of the home square.
AnnouncedBlackjack
Beat the dealer. Quick rounds.
AnnouncedDice
Pick a number, take the risk.
AnnouncedThey are meant to be our own simplified takes on classic social games, not reproductions of any product already on the store. Rules, stake sizes, match length and payout split are all undecided.
How they differ from the three live titles
| Live arcade titles | Announced social titles | |
|---|---|---|
| Opponent | Solo score attack | Another wallet, or the house |
| Runs | One run per attempt | Stake is staked directly, not a run |
| Scoring | Feeds the shared leaderboard | Head-to-head result, not ranked |
| State | Playable | Placeholder |
Whether an announced title will need runs at all is an open question. If it turns out social games should be staked rather than run-gated, the run economy in Runs & Rewards would not apply to them.
Sky Sprint
The original title. Hold the line — one tap or keypress lifts the craft, gravity pulls it down, and you thread it through a column of gates. Each gate survived adds one to your score.
Difficulty ramp
Speed rises and the gap tightens as you go, but both are bounded — there is always a survivable frame if you are paying attention.
| Constant | Value | Effect |
|---|---|---|
gravity | 0.10 | Constant downward pull |
flap | -3.8 | Upward impulse per input |
fallMax | 9.0 | Fall-speed ceiling — long drops stay recoverable |
pipeW | 56 | Gate width |
spacing | 200 | Distance between gates |
speedStart → speedMax | 1.55 → 3.30 | +0.055 per gate, ceiling at ~32 gates |
gapStart → gapMin | 170 → 142 | −0.85 per gate, floor at ~33 gates |
Low gravity plus a fall-speed cap is deliberate. Stock Flappy drops you instantly, which is far too punishing for a holder group that is mostly not gamers. Every constant here is tuned so a missed input stays recoverable.
Controls
- Tap the canvas, or press Space / Arrow Up, to flap.
- Escape or the pause button pauses mid-run.
- Touch and mouse both work —
touch-action:nonekeeps the page from scrolling under you.
Outcomes
- Run Over — you hit a gate or the floor. Score stands, run is spent.
- Runs Used Up — you still have the game open but no runs left. Replays wait on the hold gate.
- New best — beating your personal best is called out on the result overlay and stored.
This title has no game.js yet — nothing reads the hold gate and nothing
submits a score, so no run from it can be paid. The tables below describe the intended
design so the constants are settled before it ships. Play and Docs both point here, but
the game itself is not linked.
Sky Invasion
Tower defence on a 5 × 7 grid. Energy regenerates on its own timer — tapping never gives you energy, it only places a unit — and aliens walk the lanes toward your core. Lose all three core shield points and the run ends.
The four units
Cooldown and fire rate are in frames, so DPS is 60 / rate × damage.
| Unit | Cost | HP | Damage | Rate | Cooldown |
|---|---|---|---|---|---|
| Sentry | 50 | 120 | 6 | 26 | 240 |
| Lance | 125 | 110 | 44 | 96 | 560 |
| Barrier | 20 | 220 | — | — | 760 |
| Frost | 75 | 140 | 5 | 34 | 420 |
Lance hits hardest but fires slowly and has the second-worst HP. Barrier does no damage at all — its 220 HP is the point. Sentry is the cheap backbone; Frost is the cheapest source of sustained damage per shot.
Energy
| Constant | Value | Effect |
|---|---|---|
energyStart | 150 | Energy you begin a run with |
energyMax | 300 | Hard ceiling |
energyRate | 20 | Frames per +1 energy — about 3 energy/second |
coreShield | 3 | Hits your core can take before the run ends |
The four alien types
| Alien | HP | Speed | Damage | Score |
|---|---|---|---|---|
| Drone | 30 | 0.105 | 5 | 1 |
| Runner | 22 | 0.200 | 4 | 1 |
| Brute | 190 | 0.058 | 16 | 6 |
| Boss | 360 | 0.042 | 34 | 14 |
Runner is the fastest and the frailest — it exists to punish a lane you left empty. Boss arrives every 5th wave, moves slowest, and hits for 34, so a single unbraced lane loses the run on its own.
Wave ramp
| Constant | Value | Effect |
|---|---|---|
firstWaveDelay | 300 | Frames before the first wave |
waveGapStart | 210 | Opening breather between waves |
waveGapMin | 40 | Floor the gap tightens toward |
waveGapStep | -34 | How much each wave shortens the gap |
spdWaveStep / spdMax | +0.048 / 2.60 | Speed multiplier per wave, capped |
hpWaveStep / hpMax | +0.085 / 12.00 | HP multiplier per wave, capped |
bossEvery | 5 | A boss lands every 5th wave |
extraFrom / extraEvery | 5 / 4 | After wave 5, +1 reinforcement body every 4 waves |
maxAliens | 45 | Cap on simultaneous aliens |
Outcomes
- Core Breached — all 3 shield points gone. Score stands, run is spent.
- Runs Used Up — you still have the board open but no runs left.
As with Sky Invasion: no game.js, so nothing is gated and no score can be
submitted. The constants below are the intended design, written down so they are settled
before implementation.
Sky Guardian
You fly the ship. Meteors fall, you shoot them down, and the field only gets thicker. There is no finish line — the run ends when a rock reaches you and your shield is gone.
Ship
| Constant | Value | Effect |
|---|---|---|
shipSpeed | 4.4 | Lateral drift speed |
dragLerp | 0.34 | How quickly the ship settles into a new position |
shipR | 15 | Collision radius |
shieldMax | 3 | Hits you can take before the run ends |
iframes | 70 | Invulnerability frames after a hit — stops instant double-hits |
Shooting
| Constant | Value | Effect |
|---|---|---|
fireCd | 8 | Frames between shots |
bulletSpeed | 9.5 | Bullet travel speed |
bulletR | 3 | Bullet collision radius |
muzzle | 20 | Distance the shot spawns from the ship centre |
The meteor field
Every rock's size is rolled at random, so no two waves read the same. Larger meteors take several hits.
| Constant | Value | Effect |
|---|---|---|
metRMin / metRMax | 8 / 27 | Random size range per spawn |
metHpBig | 5 | HP of the large variant |
bigAt | 19 | Every 19th spawn is the large one |
spawnStart → spawnMin | 80 → 26 | Frames between spawns, tightening by 4.10 each time |
waveEvery | 8 | A named wave marker every 8 spawns |
speedStart → speedMax | 0.90 → 2.90 | Fall speed, +0.150 per step |
driftMax | 0.85 | Maximum sideways drift |
Outcomes
- Run Over — your shield hits 0. Score stands, run is spent.
- Runs Used Up — no runs left for another attempt.
Roadmap
Sky Sprint was the first of three titles, and the run economy it defines is shared by all of them. Three things are planned on top of that foundation: staking, player-versus-player battles, and more games. None of them are built or deployed yet.
Staking
Lock SKYSPRINT to earn a share of the rewards pool. The hold gate already measures token age — staking formalises it into a real, claimable position.
PlannedPlayer Battles
Head-to-head play against another wallet. Two runs, same seed, higher score takes the pot — turning every title in the arcade from a solo test into a contest.
PlannedSocial Titles
Six wallet-to-wallet games named on the site and nothing more — see Announced Titles. Building them is the first item of work on this roadmap.
In developmentNothing on this roadmap is live. There is no staking contract, no matchmaking, and no second game. Treat these sections as intent — the specifics will be written here once each system ships, and this page is updated as they land.
Token
The official SKYSPRINT token is planned to launch on Pons, a launchpad on Robinhood Chain. Its contract address does not exist yet — nothing below can be traded today.
| Parameter | Value |
|---|---|
| Name | Sky Sprint |
| Symbol | SKYSPRINT |
| Launchpad | Pons — Robinhood Chain |
| Chain | Robinhood Chain (4663) |
| Contract | Not deployed |
3% transfer tax
Every transfer carries a 3% tax. It is split 1 / 2:
| Share | Rate | Destination |
|---|---|---|
| Developer | 1% | Core team — operations and development |
| Rewards pool | 2% | Distributed to players |
| Total | 3% | — |
Rewards distribution
The 2% rewards share is paid out on two schedules:
- Daily — a smaller, regular payout to qualifying players.
- Weekly — the main distribution, following the settlement window described in Runs & Rewards.
Runs earned per transfer are the intended bridge between the token and the arcade: holding SKYSPRINT is what unlocks play, and the tax that comes with those transfers is what funds the payouts.
The 3% split (1% dev / 2% rewards) and the daily + weekly schedules are the intended design. Still to be finalised and written into this page once live: the Pons launch transaction, the deployed contract address, whether the tax is adjustable, and the exact daily/weekly split thresholds. Do not publish this section as final until the contract is deployed.
Runs & Rewards
Runs are the currency of the arcade. You do not buy them — you earn them by holding, and you can only bank a limited number at a time.
| Constant | Value | Meaning |
|---|---|---|
runsPerBlock | 2 | Runs per 3-hour block |
runCap | 6 | Bank limit — hoarding is impossible |
prizePool | 0.42 | Pool share per qualifying run |
topN | 10 | Leaderboard entries that qualify |
weeklyDays | 7 | Settlement window |
weeklyPrize | 5.00 | Weekly prize pool |
Runs earned by holding time
| Hours held | Blocks | Runs earned | After cap |
|---|---|---|---|
| 0 – 2 | 0 | 0 | Gate not met |
| 3 | 1 | 2 | 2 |
| 6 | 2 | 4 | 4 |
| 9 | 3 | 6 | 6 |
| 12+ | 4+ | 8+ | 6 (capped) |
You reach the cap at 9 hours and it never goes higher. Everything past that only matters if you spend runs — which is the intended pressure: hold, then actually play.
These numbers are the shipped tuning constants, editable from the admin panel. prizePool, weeklyPrize, and tokenPriceEth are placeholders until the token has a real price feed — confirm them before launch.
Scoring & Ranking
Each room shows the top 10 scores, your own row highlighted, and your live position against them.
Your position
The result overlay compares you against the 10th-place cutoff, not the leader. Beating the cutoff is what qualifies — chasing first place is not required.
- Score above the cutoff → you are in for the weekly pool.
- Score below it → you still keep the score on your personal best, you just miss the payout.
- A bust result scores zero and still spends the run.
Medals
Positions 1, 2 and 3 are badged. Everything from 4th down is ranked purely on score.
The shipped leaderboard is a fixed DUMMY list plus your own row, assembled in the browser. There is no server and no on-chain read yet. Your rank is real arithmetic over placeholder competitors — treat it as a UI preview, not a result.
Build Status
Honest per-feature state. Nothing below is inferred — this is what the shipped code actually does.
| Feature | State | Notes |
|---|---|---|
| Sky Sprint | Playable | Full loop: hold gate → run → score submitted → server-side scoring |
| Sky Invasion | Off Gate | No game.js — not gated, not scored, cannot be paid. Marked, not linked. |
| Sky Guardian | Off Gate | As above. Both need their game.js written before they can ship. |
| Hold gate | Enforced | Two conditions: 3h since first inbound transfer AND holding now, read live from the chain |
| Run economy | Server-authoritative | 2 per 3h block, capped 6/day. Computed on the server; the client cannot edit it. |
| Leaderboard | Live | SQLite, scored on submit, resets when the round locks |
| Wallet connection | Built | One shared hub across every page; personal_sign + /api/auth/verify |
| Token contract | Deployed | 0x060D35…E60975047 — testnet fixture matching the launcher's decimals and supply |
| Tax vault | Deployed | 0x8175ee55…D10a — 33.33% dev / 66.67% rewards, split fixed at deploy |
| Prize pool | Read from chain | Summed from TaxReceived events. An unreadable window shows —, never 0. |
| Round close | Scheduled | 23:00 UTC locks the pool; 00:00 pays. Day 7 also fires the weekly draw. |
| Payout ledger | Built | One row per (round, rank), uniqueness enforced by the schema. Signature ≠ payment. |
| Payout transfer | Not yet executed | Every rejection case is proven; no winner has been paid end-to-end yet. |
| Admin panel | Working | Server-side session, one panel for all three games, validated against a schema |
| Emergency timelock | Untested | 7-day path exists in the contract; never exercised. Largest remaining risk. |
| Staking | Not built | No contract. The card carries a disabled control that says so. |
Admin access
The admin panel is gated by a SHA-256 password hash in server/.env, and the hash
stays server-side: the browser only ever receives a session cookie. This is not the old
client-side gate, where the comparison ran in the page and anyone who viewed source could
read the hash and brute-force it offline. Still worth keeping anything sensitive out of it
— it is one login, not multi-factor.
Token 0x060D35F577e3C849a12Ae4c7a8DA921E60975047 · vault
0x8175ee556615Eb0d0B8387eDD900E79ec623D10a · chain id 46630.
The vault has an earlier deployment at 0xA7644e0C…55CE35 with a 0.05 ETH
per-claim cap; it is retired and the server no longer points at it.
Configuration
Every tuning value lives in one object so the admin panel can rewrite it at runtime without a rebuild. Reads come from localStorage under the key skysprint_config, falling back to the shipped defaults.
Storage keys
| Key | Holds |
|---|---|
skysprint_config | Full tuning config (physics + economy) |
skysprint_runs | Runs spent so far |
skysprint_runbest | Best score this session |
skysprint_best | All-time personal best |
skysprint_held_hours | Held-time placeholder until the on-chain reader lands |
One config store per game
The three titles do not share a config key. Each folder keeps its own tuning object, so changing one game never silently retunes another.
| Game | Folder | Config key |
|---|---|---|
| Sky Sprint | sky-sprint | skysprint_config |
| Sky Invasion | sky-invasion | aliendef_config |
| Sky Guardian | sky-guardian | meteordef_config |
Sky Invasion and Sky Guardian were renamed, but their localStorage keys were deliberately left as aliendef_ and meteordef_. Renaming them would have wiped every existing score and run count in players' browsers.
Best scores and run counts follow the same prefix per game — <prefix>_best, <prefix>_runs, <prefix>_runbest, <prefix>_scorever. All three also read the same shared hold-time value, so unlocking runs stays consistent across titles.
Live config sync
The storage event does not fire in the same tab and is unreliable on file://, so the game polls a cheap fingerprint of the config instead. When it changes, new values are pulled in. Physics constants need a page reload; run state does not.
Legacy config migration
Configs written before the Sky Sprint rename still carry the old token name and ticker. On load those keys are deleted so a stale ticker can never keep being served.
FAQ
Do I need to connect a wallet?
Not in the current build — nothing is connected and nothing can be spent. The wallet is already central to the design: it is what the hold gate reads. Wallet connection is on the roadmap but unbuilt.
Can I lose real money?
No. There is no contract, no transaction, and no wallet signature anywhere in the code. Every score is local. This changes when the token ships — treat the current build as a playable mock.
Why do I have zero runs?
Either you have not cleared the 3-hour hold gate, or you have spent everything you earned. The Runs cell shows what you earned, what you used, and what is left — if earned is zero, the gate is the reason.
Can I reset my state to test again?
Yes — clear this site's data in your browser, which removes the skysprint_* keys listed above. The admin panel has a round-reset that does the same thing.
Do the difficulty and odds change?
Yes. The admin panel rewrites skysprint_config live, and the running game picks up economy and scoring changes immediately. Physics changes take effect on reload.
My leaderboard rank looks odd.
Expected — the competitors are a hardcoded placeholder list. Your arithmetic against them is real; the field around you is not.
Can I compare scores between the three games?
They all feed one leaderboard, and that is deliberate — the top 10 wallets are picked from a single board. It only works because the score rate is tuned to roughly match: Sky Invasion pays 1 point per drone or runner, 6 per brute and 14 per boss precisely so a good tower defence run scores in the same band as a good Sky Sprint run. That is why one of the constants in that game is a score contract rather than a difficulty knob.
What does "announced" mean on the game cards?
It means the name and a one-line idea exist, and nothing else. No code, no rules, no prototype. If you are deciding whether to hold anything, the announced titles should carry zero weight — only the three playable ones do.
Which game is hardest?
Different failure modes rather than a clear order. Sky Sprint punishes a mistimed input instantly, Sky Guardian punishes slow reactions as the spawn rate tightens, and Sky Invasion punishes a lane you leave empty — a single unbraced boss costs 34 shield damage against a 3-point core.
How many games are there?
Three titles are playable today — Sky Sprint, Sky Invasion, and Sky Guardian. Six more are named but have nothing behind them yet; see Announced Titles. Staking and player-versus-player battles are on the roadmap. This page updates as each one ships.