Version 2.0 · 2026 · Ethereum mainnet

Whitepaper

A real game with a real economy underneath — and no signer between them.

01 Abstract

e-scape is a browser-playable 3D RPG with a signer-less on-chain economic layer. The game presents an original setting — the world of Aereth, the continent of Vael'orin — an original pantheon, and a nine-quest narrative arc that culminates in the discovery of the Hollow Crown.

The protocol is deliberately split into two tiers. The game is off-chain and free: exploration, combat, fifteen skills, gathering, crafting, quests, and live multiplayer all run in your browser with no server and no login. Value is on-chain: a fixed-supply ERC-20 (ESC), an ERC-1155 item registry, a player profile, a treasury, and a custom Uniswap v4 hook — all on Ethereum mainnet.

Critically, there is no reward-signer and no backend. Earlier designs signed gameplay rewards off-chain with a hot key; this one does not. Every on-chain credit — Magic XP, the LP Backer badge, the treasury skim — is computed autonomously by the hook from facts that are already on-chain. The class of attack "forge a signed reward" does not exist here, because rewards are never granted by a signature.

02 The two-tier model

Most on-chain games are spreadsheets with a sprite layer. We invert the formula, and we draw a hard line between what is fun and what is valuable.

Tier I — the game

Off-chain · free · trustless to you.

Runs entirely in the client. Move, fight, train, gather, craft, quest, and see other players. None of it touches the chain, so none of it can be cheated into value. Cheat the client and you have only cheated your own afternoon.

Tier II — the economy

On-chain · signer-less · autonomous.

ESC, items, profile, treasury, and the hook. Every value-bearing credit is derived by a contract from an on-chain event — a swap, a liquidity add — with no oracle and no privileged signer in the loop.

Three principles fall out of this split:

  • Playable without a wallet. Open the URL and walk in. Connect a wallet only to make your character permanent and your assets transferable.
  • No off-chain authority over value. There is no server that decides what you earned. The only things that mint or move ESC are on-chain rules anyone can read.
  • The hook is the economy. Liquidity, fees, taxation, and on-chain progression are a single coupled system administered by the v4 hook — not by a backend.

03 World & player model

Aereth is a post-Sundering world of seven thousand drifting shards. The player begins on the largest, Vael'orin, in the village of Hearthmere, branded as a Wayfarer — a neutral envoy of the eighty-seven-year-old Compact between three powers.

The full setting bible — gods, factions, historical events, landmarks, and NPC naming conventions — lives in a single source-of-truth file (content/bible.js) referenced by every NPC line, quest, and region. No name in the world is ad-hoc. See the codex for the full text.

04 Relay-based multiplayer

e-scape has no game server and no account system. Multiplayer is relay-based presence: each client broadcasts a compact state packet — position, animation state, equipment, a transient display name — through a lightweight message relay, and every other client in range renders it.

  • No login. A session identity is an ephemeral key generated in the browser. Nothing is stored server-side; close the tab and the identity is gone.
  • No authority. The relay forwards bytes. It never adjudicates combat, never holds inventory, never signs anything. It cannot, because it knows nothing worth signing.
  • Best-effort, interpolated. Remote avatars are smoothed client-side. Presence is ambient — you see the world is inhabited — not a competitive authority.
  • Value is never relayed. Trades that move ESC or items settle on-chain between wallets; the relay is only for showing each other walking around.

The road is never empty for long, and no one is keeping the gate.

05 The ESC token

Namee-scape
SymbolESC
In-world nameargent crown ("scape" in country dialect)
Decimals18
Total supply100,000,000 — fixed
StandardERC-20 with EIP-2612 permit
NetworkEthereum mainnet
Transfer taxNone at the token level. Taxation lives in the v4 hook, on swaps only.
Mint authorityRenounceable minter role, reserved only for refunding the treasury float if it runs dry.
BurnHolder-callable.

Supply allocation

  • Treasury Vault holds the reward float that funds in-world rewards.
  • Hook buffer is pre-funded (100k ESC) so afterSwap can pay the treasury skim instantly.
  • Initial LP is paired against ETH at roughly 1 ETH : 100,000 ESC.

Sources of demand

  • Registration costs 100 ESC to mint a permanent on-chain Wayfarer profile.
  • Liquidity provisioning past 1,000 ESC-equivalent earns the LP Backer badge — a unique on-chain item that unlocks the LP Backer cape (+2% XP).
  • On-chain shops spend ESC on high-value items; cheap consumables stay off-chain.
  • Swapping itself credits Magic XP, coupling trade to progression.

06 ERC-1155 item catalog

All on-chain items are ERC-1155 tokens minted by the Game Registry — the only address holding MINTER_ROLE on the items contract. There are 200 IDs, divided cleanly:

IDsCategoryCount
1–40Weapons (swords, scimitars, bows, staves, daggers, maces)40
41–90Armor (helms, plates, legs, boots, gloves, shields, capes, faction sets)50
91–130Resources (logs, ores, gems, herbs, fish)40
131–143Crafted intermediates (planks, leather, cloth)13
144–170Consumables (foods, potions)27
171–178Runes (8 schools)8
179–198Quest items (untradeable)20
199–200Cosmetics (hat, pet)2

Tier-coded items follow a seven-step palette:

CopperIronSteel MithrilAdamantRuneWyrmsteel

Metadata

The on-chain uri(id) returns a base64 JSON with item name, category, and a generic plate-SVG sized for marketplace previews. Rich icons are rendered client-side by an off-screen Three.js orthographic snapshot of each item's procedural mesh — no pre-baked icon assets, no IPFS dependency.

07 Smart-contract architecture

Six contracts on Ethereum mainnet. No off-chain component holds any privileged key over value.

register · swap · LP approve / swap creditSwapXp() 25 bps skim mint item ESC reward out Player Wallet EOA · permit · no pop-ups in play GameToken ESC · ERC-20 + permit v4 PoolManager + GameHook dynamic fee · skim · XP GameRegistry profile · bank hook callbacks TreasuryVault ESC + ETH · timelock GameItems ERC-1155 ×200
Fig. 1 — every credit path originates from an on-chain event; no signer node appears in the diagram
ContractResponsibilityLines
GameToken.solERC-20 with permit, 100M fixed supply.~50
GameItems.solERC-1155 with on-chain plate SVG, Aereth-aligned name table.~250
GameRegistry.solPlayer profile, on-chain bank, hook callbacks for XP and badges.~210
TreasuryVault.solHolds ESC and ETH from hook taxation; 7-day timelocked recovery.~110
GameHook.solv4 hook implementing IHooks: dynamic fee, treasury skim, swap-XP credit, LP-badge mint.~220
HookMiner.solCREATE2 brute-force salt search so the hook address encodes the permission bitmap.~50

Canonical addresses

The hook binds to the canonical Uniswap v4 singleton on Ethereum mainnet:

v4 PoolManager 0x000000000004444c5dc75cB358380D2e3dE08A90

Build & test status

All contracts compile under solc 0.8.26 with via_ir = true against the current Uniswap v4 release, and are covered by an integration suite spanning token mint/burn boundaries, registration with double-register revert, treasury timelocked recovery, hook permission-bitmap correctness, and a full journey from register through swap-XP credit and LP-badge mint.

08 The Uniswap v4 hook

The hook is the heart of the economy and the only bidirectional bridge between game and chain. Its permission bitmap (the lower 14 bits of the address):

BEFORE_ADD_LIQUIDITY_FLAG  (1 << 11)
AFTER_ADD_LIQUIDITY_FLAG   (1 << 10)
BEFORE_SWAP_FLAG           (1 <<  7)
AFTER_SWAP_FLAG            (1 <<  6)
                            ─────
                            0x0CC0

The hook's address is CREATE2-derived so its lower bits equal that bitmap, and the constructor calls Hooks.validateHookPermissions() to enforce the contract on-chain.

beforeSwap — dynamic fee

Reads the current pool sqrtPriceX96. If the pool is heavily tilted toward ESC (price below 0.707× of seed) and the trader is selling ESC, the fee jumps to 100 bps to dampen dumps. If tilted toward ETH (above 1.414×) and the trader is buying ESC, the fee drops to 10 bps to encourage rebalancing. Otherwise it is the base 30 bps. The fee is returned with OVERRIDE_FEE_FLAG so v4's engine respects it.

afterSwap — treasury skim & Magic XP

Every swap does three things atomically: it computes the absolute ESC volume of the trade, skims 25 bps of that volume from the hook's pre-funded buffer to the Treasury Vault, and calls registry.creditSwapXp(swapper, escVolume) — awarding 1 Magic XP per 100 ESC, capped at 10,000 XP per call so bulk farming is pointless.

afterAddLiquidity — LP Backer mint

Computes the ESC-equivalent of the add and calls registry.notifyLiquidityProvision(), tracking cumulativeLpEsc per provider. The first time a provider crosses 1,000 ESC-equivalent, the registry mints them the LP Backer badge (item 196).

Identifying the swapper

Because sender is the router, not the player's EOA, the hook reads hookData to credit the right address: routers pass abi.encode(swapper) as 32-byte hookData. If absent, XP credits to the router — undesirable, but never a value loss. No signature, no off-chain attestation, is involved at any point.

09 Value flow

One token, one world, one hook. Play is free; the chain wakes only when you choose to move value.

earn / spend register · LP swap · provide 25 bps skim Magic XP rewards out of treasury Play off-chain · free ESC Uniswap v4 Hook autonomous · signer-less Treasury Wayfarer XP
Fig. 2 — the ESC value cycle; the only value-bearing credits originate inside the hook

10 The trust model

Because the entire game is off-chain and grants no on-chain value on its own, "anti-cheat" is a structural property rather than a detection arms race. There is nothing to detect: tampering with the JavaScript client cannot mint ESC or items, because the client has no authority to do so.

What it isAuthorityWhy it cannot be forged
Visual XP, level display, loot in a live sessionClientNo on-chain effect. Recomputed from chain on next load. Cheating it only fools yourself.
Swap-derived Magic XPHookComputed atomically from real swap notional. To fake the XP you must actually move capital on mainnet.
LP Backer badgeHookOne-shot mint on a real threshold cross, tracked in cumulativeLpEsc.
Profile & bank stateOn-chain ledgerERC-1155 / ERC-20 transfers in and out. Cannot be desynced or replayed.

We do not pretend the client is secure — we make it irrelevant to value. The honest claim is narrow and total: the only things that change on-chain state are on-chain rules, and those rules took no one's word for it.

11 Skill & combat systems

Fifteen skills: Attack, Strength, Defence, Hitpoints, Ranged, Magic, Prayer, Mining, Smithing, Fishing, Cooking, Woodcutting, Firemaking, Crafting, and Slayer. Each has progression tiers at levels 1, 15, 30, 45, 60, 75, and 90, with named technique unlocks at every tier; milestone rewards land at 50 (festival cosmetic) and 99 (mastery cape and emote).

The XP curve mirrors the classic formula — xp(level) = floor( Σ (i + 300·2^(i/7)) / 4 ) — implemented identically on-chain (with a lookup table) and in JavaScript.

Combat depth

  • Three attack styles. Aggressive routes XP to Strength (+15% damage, −5% accuracy), Balanced to Attack (+5% accuracy), Defensive to Defence (+1.5 def, −10% damage).
  • Weapon specials. Cleave, Sand-Dance, Pierce-Shot, Aether Burst, Assassinate, Skullbreaker, and Rend, each draining a Focus bar that fills in combat.
  • Status effects. Bleed, Poison, Burn, Freeze, and Stun, each ticking on its own interval and damage profile.
  • Eight prayers and twelve spells across combat, utility, and alteration schools, each consuming runes per cast.
  • Telegraphed AOEs. Red ground decals bloom ~0.8s before a strike; a spacebar dodge-roll grants 0.45s of i-frames for 30 run energy.

12 Quest architecture

Quests are pure data: an id, a giver NPC, a prerequisite, hook text, an ordered list of objectives, per-ending rewards, and start/complete callbacks. The QuestEngine walks active quests every frame, evaluates the current step's predicate against live game state, and auto-advances when conditions match. NPC dialogue trees set and check the same flags through a shared state API.

#TitleTypeRegion
1First StepsTutorialHearthmere
2The Cook's CakeFetchHearthmere
3The Missing TallyMystery · 2 endingsHearthmere
4Brakka's CommissionCraftingBrassreach
5The Walker Who Did Not ReturnForce-or-trade choiceMournloom
6The Marrow-WrenDungeon diveTideclasp
7Two BannersFaction lock (1 year)Hearthmere
8The Pale LockPuzzle dungeonWhitehollow
9The Hollow CrownEndgame · 3 endingsAll regions

13 Roadmap

Phase 0 — public test

  • Deploy to mainnet.
  • Open the client to public testers.
  • Tune dialogue pacing, combat balance, and hook fee curves.

Phase 1 — router & LP UX

  • Wire the swap modal to a v4 router.
  • Wire Provide-LP to the v4 PositionManager.
  • Surface LP rewards in the HUD.

Phase 2 — audit

  • Independent audit of hook math and treasury recovery.
  • Harden the relay against spoofed presence floods.

Phase 3 — beyond Vael'orin

  • Player-built shards as NFT deeds.
  • Cross-shard trade routes funded by hook taxation.
  • Faction governance via on-chain Compact-vote.