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
Name
e-scape
Symbol
ESC
In-world name
argent crown ("scape" in country dialect)
Decimals
18
Total supply
100,000,000 — fixed
Standard
ERC-20 with EIP-2612 permit
Network
Ethereum mainnet
Transfer tax
None at the token level. Taxation lives in the v4 hook, on swaps only.
Mint authority
Renounceable minter role, reserved only for refunding the treasury float if it runs dry.
Burn
Holder-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).
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:
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.
Fig. 1 — every credit path originates from an on-chain event; no signer node appears in the diagram
Contract
Responsibility
Lines
GameToken.sol
ERC-20 with permit, 100M fixed supply.
~50
GameItems.sol
ERC-1155 with on-chain plate SVG, Aereth-aligned name table.
~250
GameRegistry.sol
Player profile, on-chain bank, hook callbacks for XP and badges.
~210
TreasuryVault.sol
Holds ESC and ETH from hook taxation; 7-day timelocked recovery.
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):
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.
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 is
Authority
Why it cannot be forged
Visual XP, level display, loot in a live session
Client
No on-chain effect. Recomputed from chain on next load. Cheating it only fools yourself.
Swap-derived Magic XP
Hook
Computed atomically from real swap notional. To fake the XP you must actually move capital on mainnet.
LP Backer badge
Hook
One-shot mint on a real threshold cross, tracked in cumulativeLpEsc.
Profile & bank state
On-chain ledger
ERC-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.
#
Title
Type
Region
1
First Steps
Tutorial
Hearthmere
2
The Cook's Cake
Fetch
Hearthmere
3
The Missing Tally
Mystery · 2 endings
Hearthmere
4
Brakka's Commission
Crafting
Brassreach
5
The Walker Who Did Not Return
Force-or-trade choice
Mournloom
6
The Marrow-Wren
Dungeon dive
Tideclasp
7
Two Banners
Faction lock (1 year)
Hearthmere
8
The Pale Lock
Puzzle dungeon
Whitehollow
9
The Hollow Crown
Endgame · 3 endings
All 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.