The Mining Game Docs

The Mining Game — the complete manual

Everything from rescuing a 2022 position on the original site, through the v2 migration, to building rigs, mining real coins, hosting a pool with 100,000 WATT locked, and moving value across every bridge we run.

Read it top to bottom if you are a legacy holder. Jump to Playing the game if you are new.

Live on Polygon · Altcoinchain · WATTxchain · Bitcoin SV

What this is

The Mining Game is an NFT mining simulator that pays in real cryptocurrency. You collect component NFTs — cases, processors, GPUs, ASICs, racks — assemble them into rigs, and point those rigs at a mining pool. The pool is backed by a real validator, masternode, or staking node somewhere in the world; whatever that node actually earns is split among the pool's miners in proportion to their rigs' effective power, and paid out on-chain.

Rigs burn WATT as fuel while they mine. Components that are not mining can be staked powered-off to mint WATT by their stake weight. That circle — burn to mine, stake to earn — is the whole economy.

History in one paragraph

The game launched in 2022 on Polygon and Altcoinchain. In 2023 a flaw in the free-mint gate (balanceOf(msg.sender, 1) == 0 — a mutable check you could reset by transferring the case away) let one player mint thousands of free Gaming PCs, and the original staking contract minted WATT on withdrawal with no finite pool, so each duplicate became a permanent WATT emitter. Then the founder passed away, api.mining.game lapsed, and the front-end — which walked that domain for its rig list on every render — died with it. Nothing on-chain was lost. This documentation covers the rebuilt stack: the original contracts are still readable and your positions are still withdrawable, and a fixed v2/v3 economy runs alongside them.

The three eras, and what you own in each

EraTokenComponentsWhere it runsStatus
v1 / classic (2022)WATT v1 (ERC-20)MiningGame ERC-1155, ids 1–5Polygon 137, Altcoinchain 2330Withdraw only
v2 (2026)WATT v2 (ERC-20, role-gated mint, LayerZero OFT)Polygon, ALT, WATTxchainLive
v3 (2026)WATT v2MiningGameItems ERC-1155, 36 itemsPolygon, ALT, WATTxchainLive

WATT v1 and WATT v2 are the same money at a 1:1 rate — v2 exists because v1 has three uncapped issuance paths baked into an immutable contract and a deployer key nobody can reach. v1 components and v3 components are likewise 1:1, id for id. Nothing you hold is stranded; every path is documented below.

The map — every site and what it does

Bookmark two things

stake.mining-game.wattxchange.app is where every wallet action lives. mining-game.wattxchange.app is the game itself. Everything else is reachable from those two.

Set up your wallet

You need one EVM wallet — MetaMask, Rabby, Brave Wallet, Phantom, anything that speaks EIP-1193. The same address works on Polygon and Altcoinchain. WATTxchain and Bitcoin SV are different (see below).

Networks

NetworkChain IDCurrencyRPC
Polygon137 0x89POLhttps://polygon-bor-rpc.publicnode.com
Altcoinchain2330 0x91aALThttps://rpc.wattxchange.app
WATTxchain22356 0x5754WTXhttps://rpc-wtx.wattxchange.app
Polygon public RPCs rot fast

polygon-rpc.com, rpc.ankr.com/polygon and polygon.llamarpc.com are all dead or key-gated now — a stale RPC in your wallet reads as "the site is broken" because every contract call silently returns nothing. Working, CORS-enabled, no key: polygon-bor-rpc.publicnode.com, polygon.drpc.org, 1rpc.io/matic. Every page here falls back through that list and then to your wallet's own RPC.

Brave users — read this before you report a bug

Brave Shields blocks third-party script CDNs. Every page on stake.mining-game.wattxchange.app now serves its libraries first-party from /vendor/ precisely because of this, but Shields also blocks third-party RPC hosts. If "Connect Wallet" does absolutely nothing — no popup, no error — drop Shields to standard for the site and reload. If component cards show flat images instead of spinning 3D models, that is Brave's fingerprint protection turning off WebGL; the pre-rendered stills are the intended fallback and nothing is broken.

WATTxchain addresses are different

WATTxchain is a UTXO chain with an EVM layered on top (Qtum lineage). An Ethereum-derived address is valid there but unsignable — the UTXO layer needs a hash160(pubkey) address, not keccak(pubkey)[12:]. Sending an NFT to your MetaMask address on WATTxchain freezes it forever. Use the WATTx wallet extension, the desktop wallet, or the in-game HD wallet, which all derive the correct form.

Bitcoin SV

For the BSV claim you need an ordinals-capable BSV wallet — Yours Wallet is what we test against. Claim to its ordinals address, never a payment address and never an exchange deposit address: rig ordinals sent to an exchange are gone.

The v1 era, briefly

If you played before 2026, everything you own is in one of five places:

WhatWhere it isHow to get it out
WATT v1 in your walletPolygon 0xE960d5…5839 · ALT 0x664514…4698Migrate to v2 (optional but recommended)
WATT v1 staked in the token poolPolygon 0x5C3359…c692 — holds 768,577 WATTEnd your stake
LP tokens stakedPolygon 0x672654…39d3 (WPOL/WATT UNI-V2)End your LP stake
Components staked in the NFT poolPolygon 0xcbfcA6…5275 (3,102 held) · ALT 0xe46304…A7b1 (4,097 held)Unstake per deposit
Components in your walletPolygon 0x970a8b…9728 · ALT 0xf9670e…Ffb2Swap to v3, or claim on BSV
One address is wrong in the old front-end

The classic UI hardcodes the NFT collection as 0x970a8b10… on both chains. That is correct on Polygon only. The Altcoinchain collection is 0xf9670e5D46834561813CA79854B3d7147BBbFfb20x970a8b… also exists on ALT (it shares a deployer nonce) but is nearly empty, so an ALT wallet can look empty when it is not. The rebuilt pages on stake.mining-game.wattxchange.app use the right one.

1 · Claim staked WATT on Polygon and Altcoinchain

Ending a v1 token stake returns your principal in full plus whatever interest the original owner wallet can still cover. Nothing is locked; the contracts are immutable and still work.

Where token staking actually exists

Polygon 137
Yes
Altcoinchain 2330
None deployed

We verified this on-chain by enumerating every contract the original deployer 0x4B6123e6…bf25 created (contract addresses from CREATE are deterministic, so nonce 0 through 400 can be walked and code-checked one by one). There is no WATT token-staking contract on Altcoinchain. The old UI's Altcoinchain config reuses Polygon's addresses, which have no code there — that is why the Token-staking page shows nothing on ALT. Your ALT WATT v1 is simply in your wallet; skip straight to migration. Altcoinchain does have NFT staking — see step 3.

The Polygon WATT stake — live parameters

ParameterValueWhat it means for you
Contract0x5C33598c51785122dF275A1f4b4d0f1ab8ecc692Holds 768,577.57 WATT v1 of staker principal
maturity30 secondsEvery stake older than half a minute is matured — no penalty applies to anyone
penalization30 %Only charged if you end inside the 30-second window. In practice: never
interest_rate30 % / yearSimple interest on elapsed seconds, paid from the owner wallet
Owner wallet balance39,317 WATTThe interest budget. When it is empty, interest pays 0 — principal is unaffected

How to end a stake

  1. Open the classic Token-staking page. stake.mining-game.wattxchange.app/token-staking/ (mirror: the-mining-game.github.io/token-staking/).
  2. Connect on Polygon. Chain 137. The page lists your ledger — one row per stake you ever started, each with its own index, amount, start time and accrued gain.
  3. End each row you want back. The button calls end(index). One transaction per row; there is no batch. Rows already ended are marked and cannot be ended twice.
  4. Check what arrived. A matured end() transfers your principal from the contract and, separately, pulls interest from the owner wallet. If the owner's allowance or balance is short the contract sets interest to zero and still pays your principal — the transaction does not revert.
If the page will not render your ledger

You can always call the contract directly from a block explorer or from Polygonscan's Write Contract tab. Read ledger_length(yourAddress) to get the count, ledger(yourAddress, i) to see each record (from, amount, gain, penalization, to, ended), get_gains(yourAddress, i) for the current interest, then write end(i). That path needs no front-end at all.

The LP stake (Polygon only)

A second contract, 0x672654aBeF98d6b1B78c34368072fF294D0339d3, stakes the WPOL / WATT v1 Uniswap-V2 pair token 0xEC54584a…9Bef and pays its interest in WATT. Its parameters are different and they matter:

  • maturity 30 days — genuinely enforced.
  • penalization 30 % — end before 30 days and you lose 30 % of your LP tokens to the owner wallet, and earn nothing. Check your start date first.
  • interest 0 % on the LP token, 125 % / year in WATT — again paid from the owner wallet, and again zeroed rather than reverting if that wallet is short.

The flow is identical: end(index) per row, from the Token-staking page or the explorer.

Known v1 risk, disclosed

Both staking contracts expose an owner-only set(lower, maturity, rate, penalization) that rewrites the terms of already open stakes — end() reads the current values, not the ones in force when you started. An owner could set maturity to the maximum and penalization to 100 % and take every open deposit. The owner is the original deployer 0x4B6123e6…bf25, whose key is not in anyone's hands, so this has never been exercised and the contracts have been static for years. It is still the correct reason to end an old stake rather than leave it sitting.

2 · Claim your holdings on Bitcoin SV

Every rig model, the WATT logo and the full component art are inscribed permanently as 1Sat Ordinals on Bitcoin SV, and WATT plus the five classic rigs exist there as BSV-21 tokens. A snapshot of the EVM chains lets you claim the BSV copies of what you held.

Why this exists

The v1 front-end died because it read its rig list from api.mining.game, a web server on a domain that lapsed. Putting the art on-chain removes that class of failure entirely: 28 MB of GLB models cost about $0.26 to inscribe once on BSV and are served forever by any ordinals gateway. The same 28 MB as EVM calldata would be roughly 483 million gas — impossible.

Why you cannot just be airdropped

A BSV address is derived differently from an EVM address; there is no way to compute the BSV address of a person who holds tokens at 0xabc…. So the claim is a signature proof: you sign a message with your EVM key that names your BSV address, and the service releases from the treasury to the address you signed for. A forged signature recovers to the wrong address and is rejected; a redirected payout changes the message and is rejected.

How to claim

  1. Unstake your components first. Staked rigs are owned by the staking contract, so the snapshot credits the contract, not you. Go do step 3, then come back. (The Altcoinchain snapshot was taken at alt@block-6892759; the Polygon one at polygon@block-91012890, 6,645 holders.)
  2. Open the claim page. the-mining-game.github.io/bitcoinSV-ALT_claim/ or the Claim-BSV tab on the classic site. The release backend is passed as ?api=<url> and remembered in local storage.
  3. Connect your EVM wallet and read your entitlement — WATT plus a quantity of each rig id, straight from the baked-in snapshot. This step is entirely client-side.
  4. Paste your BSV ordinals address. In Yours Wallet this is the ordinals address, not the payment ("bsv") address. Never use an exchange deposit address.
  5. Sign the claim message with personal_sign. The message binds the snapshot id, your lower-cased EVM address and your BSV address together — change any one of them and the signature no longer verifies.
  6. Submit. The service verifies the signature recovers to an address in the snapshot, checks the claimed-ledger so nobody claims twice, and releases BSV-21 WATT and rig tokens from the treasury. WATT converts 18-decimal EVM → 8-decimal BSV at the same face value; rig quantities are preserved exactly.

What you receive

AssetBSV-21 token idSupply
WATT (8 decimals)b47c7e9b608d0b7c7391462fe264eecdc03f248ab690e3b51a4e643135dc5ff9_010,000,000
id 1 · Gaming PC PCCASE5b30beb03f43e48f0bca8b01c65a4fa53c9a458a1cdf02c7bff6374f6980d1bb_020,000
id 2 · Genesis Badge GENESIS5954fbacf0e2dd7a60afb28eab433c258a067b2551860bdf30677c1b46d88688_0200
id 3 · XL1 Processor XL1CPU48506a5deb8169c4b230e3167b052f9997df3022dafd990b5661c6e210f60005_020,000
id 4 · TX120 GPU TX12014f2da63b6fe025953e5f590e3a468783e7fe13d65f5218d335186d4ea3b2bf4_012,000
id 5 · GP50 GPU GP502cb10dd66204ad0938575fb31bfac8ca010eee9310f1537d37c9759208cfffe6_08,000
You pay the indexer fee

Minting and claiming are free of charge from us, but on BSV every BSV-21 transfer needs a small payment (~1,000 satoshis) to the token's fund address so the GorillaPool indexer will validate it. Our tooling appends that output automatically. It is a few hundredths of a cent; it is not a fee we collect.

Two BSV quirks worth knowing

Gateways 404 until the transaction is mined, not merely broadcast — a fresh inscription looks missing for a block or two. And the GP50 token's on-chain icon field points at a dead inscription from a broadcast that reported success but never landed; the art you actually see comes from our origins file, which points at the good re-inscription 9215066c…b849_0. Cosmetic, baked into the deploy, not worth a token redeploy.

3 · Approve and unstake your v1 NFTs

Your classic components may be escrowed in the old NFT staking contract. Getting them back is a two-step approve-then-unstake, and there is one trap that makes the obvious button fail.

ChainClassic collection (ERC-1155)NFT staking contractEscrowed nowNew stakes
Polygon 1370x970a8b10147e3459d3cbf56329b76ac18d3297280xcbfcA68D10B2ec60a0FB2Bc58F7F0Bfd32CD52753,102 itemsDisabled (canStake=false)
Altcoinchain 23300xf9670e5D46834561813CA79854B3d7147BBbFfb20xe463045318393095F11ed39f1a98332aBCc1A7b14,097 itemsOpen

Stake weights are identical on both chains and are the authentic v1 values:

id 1 Gaming PC
1
id 2 Genesis Badge
42
id 3 XL1 Processor
9
id 4 TX120 GPU
11
id 5 GP50 GPU
18

Unstaking, step by step

  1. Open the classic NFT-staking page. stake.mining-game.wattxchange.app/nft-staking/. Connect on the chain your rigs are on.
  2. Approve the collection — once per chain. ERC-1155 has no per-token allowance; the staking contract needs setApprovalForAll(staker, true) on the collection before it can move anything on your behalf. You did this when you first staked, but if you switched wallets or chains you will need it again. Read isApprovedForAll(you, staker) to check.
  3. Withdraw rewards first (optional). withdrawRewards(depositId) per deposit, or getRewardsAmount(depositId) to see what is owed. Do this before unstaking if you want the accrued v1 WATT.
  4. Unstake per deposit. unstake(depositId) — one call per deposit record. Use getActivityLogs() or the page's list to find your deposit ids.
  5. Confirm the items are back in your wallet with balanceOf(you, id) on the collection, then head to migration or the BSV claim.
Do not use "Unstake all" — it will revert

unstakeAll() and withdrawAllRewards() loop over the contract's global deposit array, and withdrawAllRewards computes block.timestamp − depositTime − timeLock for every deposit before checking who owns it. Under Solidity 0.8 that subtraction underflows and reverts as soon as one deposit anywhere on the contract is still inside its lock window — which means any user can brick the batch functions for everyone, permanently, just by staking. The same loops are also an unbounded gas DoS at 3,000–4,000 deposits. Always unstake one deposit at a time. Per-deposit unstake(id) and withdrawRewards(id) are unaffected and work fine.

If your garage looks empty in the game

Staked components are escrowed — the game reads balanceOf on the collection, which cannot see them. The in-game wallet panel has a STAKED COMPONENTS section that reads your staking positions directly and offers a per-position Unstake, and the game will say so rather than showing you an empty garage. This is also true of the new v3 staker — if you staked everything, you have nothing left to build with.

Stranded items

Thirteen items on Polygon (10 × id 1, and 3 each of ids 3/4/5, across two wallets) were sent to the staking contract with a plain transfer instead of stake(). With no deposit record, the contract has no code path that can return them. They are recorded in the snapshot's stranded field and are not credited by default. If this is you, get in touch — crediting them in the BSV claim is a one-flag policy decision, not a technical problem.

4 · Migrate everything to v2

Two independent migrations, both 1:1, both one transaction, both on the chain you are already on. Neither one custodies anything.

Why migrate at all

WATT v1 (Watt.sol) has three uncapped issuance paths welded into an immutable contract: an owner-only mint(), a rewardsMint() callable by any address flagged staking, and a rewardsBurn(from, amount) that lets any gaming-flagged address burn anyone's balance with no allowance. The constructor flagged the deployer as both and never revoked it. That is what let a 2023 exploit inflate supply from a script.

WATT v2 has no owner mint at all. Minting is gated to a MINTER_ROLE allow-list that a multisig rotates and cannot itself use; there is no tax, no blacklist, no pause, no transfer limit, and no burn-someone-else path. It is also a LayerZero OFT, which is what makes the omnichain bridge possible.

A · WATT v1 → WATT v2

Use stake.mining-game.wattxchange.app/swap.html (or the WATT tab on the main stake page).

  1. Pick your chain — Polygon or Altcoinchain. The migrator is per-chain; v1 on ALT becomes v2 on ALT.
  2. Approve v1 for the WattSwap contract. The page checks your existing allowance first, so a repeat migration skips this.
  3. Call migrate(amount). Your v1 is transferred to 0x…dEaD and the same amount of v2 is minted to you. The contract measures the actual balance delta at the dead address rather than trusting the requested amount, so a fee-on-transfer token could never over-mint. v2 can never out-issue v1 because every mint is preceded by a burn.
ChainWATT v1WATT v2WattSwap migrator
Polygon0xE960d5076cd3169C343Ee287A2c3380A222e58390x387693eCEC037C61943404F03c097d2ADA15ae3f0x90a0906a7e01a65f48bd35741681088E3FA6729c
Altcoinchain0x6645143e49B3a15d8F205658903a55E5204446980xB7635E386283CAE6FB1A710f19CaA8220beF630D0xdFd07EBEEC3228D14b99f9f39EC71D884ABcbbF4
WATTxchain0x99B5…0xc4603E2582aE320857379819123dFbFd3093dcfa0x704f5eFcDE5EDD87e767Be78ba8FaA6fAb244bad
Altcoinchain needs legacy gas

Altcoinchain's node rejects EIP-1559 fee fields from some wallets with a could not coalesce error. Every page here forces type-0 (legacy gasPrice) transactions on ALT for exactly this reason. If you are calling the contract yourself from a wallet that insists on 1559, switch it to legacy.

B · Classic components → v3 components

Use the Migrate old → new tab on stake.mining-game.wattxchange.app.

  1. Approve the classic collection for the migrator — one setApprovalForAll per chain. The per-card swap button does this on demand if you skip the explicit button.
  2. Swap. Your classic tokens are retired and the same ids and amounts are minted on the new MiningGameItems collection. Swap ALL below does every id you hold in one call.
  3. Ids are preserved. id 1 stays the Gaming PC, id 3 stays the XL1 Processor, and so on. The v3 collection simply has 31 more items beyond the original five.

Migrator address, same on Polygon and Altcoinchain: 0x97BcC99ff34FA2cde929c97074011E8929F59679.

Migration deliberately needs nothing from the founder

The migrator requires no v1 ownership or admin rights — it works entirely off what any holder can do themselves (approve, then transfer). That was a design constraint, not an accident: the founder's wallet is unreachable, so any design that needed a v1 admin signature would have been dead on arrival.

Order of operations, if you have everything

  1. End your Polygon token/LP stakes → WATT v1 lands in your wallet.
  2. Unstake your classic components, one deposit at a time, on each chain.
  3. Optional: claim the BSV copies now, while everything is in your wallet and matches the snapshot.
  4. Migrate WATT v1 → v2.
  5. Swap classic components → v3.
  6. Stake the v3 components powered-off, or go build a rig.

The v3 economy

Four contracts carry the whole game, and they live at the same address on Polygon and Altcoinchain — deployed from one fresh key at nonce 0 on both chains, so CREATE produced identical addresses without needing CREATE2.

ContractAddress (Polygon 137 & ALT 2330)What it does
MiningGameV30x856f59F1729f6e107EbCD75d21c64AB897c5681fComponent staking. Powered off mints WATT by stake weight; powered on burns WATT as fuel.
GameConfigV30x50BAb538dB8558deE04314f87d9df33a42c61352The entire economy on-chain — 16 traits, upgrade tiers, thermal/wear/cooling/power curves, luck. Multisig-governed.
MiningGameVault0x72A716F62aCfF960f6F097B4c7909B2368eD3acAYour per-player rewards wallet plus the in-game DEX. UUPS-upgradeable behind an ERC-1967 proxy.
Multisig (2-of-3)0xc49699a99177a058439Ac7E3D2F5aF03d95e1D99Owns the config, the item collection and the shop. Anyone can execute() once quorum is reached.

The rest of the economy, per chain

ContractPolygon 137Altcoinchain 2330
MiningGameItems (ERC-1155)0x0CDbf4926a8EdFFaa803B96f8fa90B065DE19Eb20x851fd0205348783444Fc9EDe99Ca2321681EC99b
ItemShop0xeE6B67c3993884F1b693A4a66e952Bb5634631310x92809C4a46b4D0F11a48BE21fF13202EA56DcEB1
WattStakingPool0x7E8FC9d7D7588F410E1399aC690F901268B08a8d0xa3f8B04310380cD13Ec85B11420d1fc848af36C4
WattPriceOracle0x88B6f5BeB2C9430Aef55C6234aC29183655E8B630x9Ce58737f5221d9Ab81A6eDaAD32f5aDa6d14100
CaseFreeMint (free Gaming PC)0xc75504Cb57b26041655dDd739414C240Dd628e7a0x91Ae9eDe6016AdF84c643F9Ce5Bb60A9438D792f
WATT v2 multisig (token admin)0x0f4a9765531bB8f8aa33fB95AeDACD8a660fcBA90x59bDaFD1D4dC46648204044eB7259eA1F08A9280

Where WATT comes from and where it goes

  • In: components staked powered off mint WATT continuously, at a rate proportional to their combined stake weight. Claiming costs you nothing but gas.
  • Out: a rig that is powered on and mining burns WATT at its components' combined wattConsumption rate, per second. 99 % of that burn is destroyed; 1 % goes to the pool host. There is no staker share and the 99 % is a hard-coded constant no pool can lower.
  • Round trip: WATT you spend in the shop is routed into the WattStakingPool via fund(), and WATT stakers share it pro-rata. That pool is a pure redistribution — it has no emission rate of its own, so it pays out exactly as fast as people buy things.
The staking pool only counts fund()

Sending WATT to WattStakingPool with a plain transfer strands it — it will sit there and never be distributed. Every in-game purchase path routes through approve + fund(amount) for this reason. If the pool shows "nothing pending", the usual answer is simply that everything funded so far has already been claimed; it pays again the moment someone buys something.

Anti-Sybil, honestly stated

You cannot stop somebody minting from a hundred wallets on-chain. The design makes it unprofitable instead: the free case has ~0 stake weight, the WATT staking pool is funded rather than minted so splitting a stake across wallets earns the same total, and claiming costs gas that exceeds a dust reward. One free PC per wallet, forever, is enforced by a persistent flag that transferring the case away does not reset — that is precisely the bug that was exploited in 2023.

Playing the game

mining-game.wattxchange.app — a single-file 3D game. It installs as a PWA (look for the install chip), works offline for the demo world, and loads every 3D model straight from Bitcoin SV ordinals.

Controls

KeyAction
W A S D · W A D X · arrowsWalk. Camera-relative, on the floor plane.
ShiftRun
FToggle pointer-lock mouse-look. Release and your framing and zoom survive.
1Shop
2Garage
3Pool Hub
4Stats
5Wallet
B / O / NBench / in-game OS / network

Menu hotkeys are on the number row because the old letter bindings (W = wallet, S = shop) collided head-on with walking. The on-screen hint fades after your first move.

Demo mode and Live mode are separate worlds

The pill in the HUD toggles between them, and they do not share a save.

DemoLive
Save slottmg3d_v1tmg3d_live_v1
ComponentsSimulated, freeMirrors the NFTs your wallet actually holds
WATTSimulated dripReal WATT v2 balance
EarningSimulated block rewardsOn-chain only — the simulation is switched off
ShopSimulated purchasesReal buyWithWatt / real free mint
Pool HubFictional demo poolsReal registry pools, real host flow

A fresh Live world starts empty and then grants you one desk per Gaming PC you own. Demo progress never leaks into Live, and resetting wipes only the world you are in.

The in-game HD payout wallet

Open the Wallet app (5) → MingOS Wallet. It generates or imports a 12-word BIP-39 seed and derives one payout address per payout chain, so you can be paid in coins that have no EVM address at all.

CoinDerivation pathAddress form
EVM (POL / ALT / WATT)m/44'/60'/0'/0/0MetaMask-compatible
WTX (WATTxchain)m/44'/22356'/0'/0/0base58, version 73 — W…
HTHm/44'/5'/0'/0/0version 0x64 — h…
BITNm/44'/9332'/0'/0/0version 0x19 — B…
BSVm/44'/236'/0'/0/0version 0x00 — 1…

The WTX path matches the WATTx wallet extension and mobile app exactly, so one seed opens the same WTX wallet everywhere. Only addresses and paths are saved in your browser — never keys. Each coin has a SET PAYOUT button that registers the address on the PayoutHub so the pool operator knows where to send your earnings; EVM rewards go to your connected address and need no registration.

The seed is shown once

Write it down. There is no server-side copy, no account recovery and no support channel that can restore it. If you would rather not manage another seed, import one you already have.

Getting components

The free Gaming PC

Every wallet can mint one Gaming PC (item id 1) for free, forever, paying only gas. Use the in-game shop in Live mode, or the Buy components tab on the stake page.

Cost on Altcoinchain
~120,000 gas ≈ 0.00012 ALT
Cost on Polygon
~150,000 gas
Limit
1 per wallet, permanent

Both chains are open — no allowlist, not paused. The flag is persistent, so transferring the case away does not re-open your mint. That is deliberate: it is the exact hole that was exploited in 2023, when the check was against a live balanceOf.

Why the shop's own "mint free" button used to fail

The shop prices item 1 at zero, and ItemShop.costWatt() requires a price above zero, so buyWithWatt(1, n) always reverted with not for sale. A separate CaseFreeMint contract now owns that path. If you find an old build whose free-mint button reverts, that is why — use the current site.

Buying the rest

The shop sells 36 items for WATT. Tick as many cards as you like, set quantities, and the cart shows a running total, your balance, and what is left after. Cards that would push you past your balance turn red.

A multi-buy is several transactions

The deployed ItemShop has no batch entry point — only buyWithWatt(id, amount). So one unlimited WATT approval is followed by one transaction per ticked card. The running total is decremented between confirmations so the arithmetic stays right mid-batch. Real gas per buy is about 170,000.

Upgrades are endless

Power grid and cooling ladders continue past their 16 published tiers: capacity grows ×1.65 per level, cooling coefficient shrinks ×0.75 per level, and price grows ×2.25 per level. A worst-case farm — 33 rigs of an ASIC plus 19 GPX880s, 41,250 W — is fully powered at power level 18 and fully cooled at cooling level 20. Rack Expansion grows the GPUs a framed rig can hold (8 → 10 → 12 → 14 → 16 → 19); Garage Expansion adds desks.

Game credit — one signature instead of many

In Live mode the garage shows a credit banner. Topping up does one signed WATT v2 transfer into the staking pool and credits your in-game balance; upgrades then spend that credit with no further wallet prompts. This is deliberately not an ERC-20 approval — a standing allowance the page could pull from would be an exploit surface. With zero credit, each upgrade falls back to its own signed payment.

Powered-off staking — minting WATT

This is the passive side of the economy and the simplest thing to do with components you are not currently using.

  1. Open the Stake & Claim tab at stake.mining-game.wattxchange.app.
  2. Tick components and set quantities, then Stake selected — or stake one card at a time.
  3. Approve on demand. MiningGameV3.stake() takes custody via safeTransferFrom, so the items collection needs setApprovalForAll first. Every stake path now does this automatically; the separate Approve items button is there if you prefer to do it up front. Real stake gas is about 228,000.
  4. Claim whenever. claimWatt() pays your accrued WATT; you pay only gas. The hero panel shows pending WATT and your total off-weight live.
  5. Unstake per position. Each staked position has its own Unstake button.
A component is staked or mining, never both

Both actions take custody of the NFT, so they are mutually exclusive on-chain. Staking is the powered-off, WATT-minting state; mining is the powered-on, WATT-burning state. Pull a component out of staking before you build it into a rig.

Staking WATT itself

The Stake WATT tab stakes WATT v2 into the WattStakingPool and pays you a pro-rata share of every WATT spent in the shop. Unstaking always returns your full principal — rewards are tracked separately and are never at risk. There is no lock and no emission schedule; the pool distributes exactly what has been funded into it.

Mining for real coins

This is the point of the whole thing. A pool is backed by a real node — a validator, a set of masternodes, a staking wallet. Whatever that node earns is reported on-chain and split among the pool's miners by effective power. Payouts are pushed to you automatically; there is no claim button and no gas for you to pay.

How your share is calculated

effectivePower = hashRate × efficiency × 100 / wattConsumption

yourShare = effectivePower(yourRig) / Σ effectivePower(all rigs mining that coin)
wattBurned = duration × wattPerHour / 3600

Only rigs with an active, WATT-fuelled session count toward the denominator. Efficient rigs beat brute-force ones: doubling hash rate while doubling power draw earns you nothing.

Rewards are deposit-driven — there is no emission rate

The v3 engine has no rewardRate. Rewards exist only when real coin arrives via reportPoolDeposit(poolId, targetId, amount), and are split with a MasterChef-style accumulator over effective power. A deposit that arrives while nobody is mining that coin is credited to the host rather than lost. Each coin's accounting is scoped per target, so a host can never discharge one coin's debt with another coin's receipt.

Point a rig at a pool

  1. Get a rig NFT. Either mint one (MiningRigNFT, 0.1 POL / 0.1 ALT, random traits) or use the 🎫 CLAIM RIG path, which escrows classic components and derives a rig's traits from them: PC +100 hash/300 W, XL1 +80/200, TX120 +60/250, GP50 +150/400, Genesis Badge adds efficiency, rarity and cooling. reclaim() returns the components.
  2. Open the Pool Hub — in the game (3) or on pools.html.
  3. Register a payout address for the coin you want. EVM coins pay your connected address directly. For WTX, HTH, BITN or BSV you must call hub.setPayoutAddress(targetId, address) — the in-game wallet's SET PAYOUT button does this, and the game blocks mining until it is set.
  4. Choose the coin. A pool offers a menu of payout coins; each rig picks one. The MINE button pops the pool's menu.
  5. Start mining. startMining(rigId, poolId, targetId, wattAmount, …) stakes the rig NFT into the pool with WATT as fuel. A minimum of one hour of WATT is required. Your rig's power joins the pool from that moment.
  6. Stop when you like. stopMining settles what was consumed, returns the NFT, and pays out. Unused fuel is not consumed.
An underfunded pool can no longer trap your rig

In the original engine, stopMining claimed before returning the NFT, and the claim reverted if the pool could not cover it — so an underfunded pool locked your rig inside the contract until an operator topped it up. The v3 PayoutHub.credit() credits whatever the target can cover and never reverts; the engine carries any shortfall as session.owed, emits Unpaid, and returns your NFT regardless.

The live pools

The reference deployment, Genesis Pool, runs four pools on Polygon backed by real infrastructure:

PoolCoinBacked byStratum
#0WTXA WATTxchain staking delegation plus the merged-mining payout address — both staking and mined-block income feed the same poolgenesis-pool.wtx.wattxchange.app:3333 · TLS 4333
#1BITNA Bitnet PoS wallet; matured coinstakes are credited as they landgenesis-pool.bitn.wattxchange.app:3334 · TLS 4334
#2ALTAn Altcoinchain validator delegation (PoS activates at block 7,200,000)genesis-pool.alt.wattxchange.app:3336 · TLS 4336
#3HTH10 Help The Homeless masternodes, 1,000,000 HTH collateral eachgenesis-pool.hth.wattxchange.app:3338 · TLS 4338

Pool fee 0.5 %. The full miner loop has been proven end-to-end on Polygon mainnet with real money: a real masternode payment of 9.765625 HTH was fed in and split 99.5 / 0.5 exactly between the miner and the pool.

What "payout" actually looks like

The operator daemon polls every 120 seconds. It reads the backing node's real income, calls reportPoolDeposit on-chain (paying the gas itself), and the engine credits each rig by effective power into the PayoutHub as a running balance. A per-coin payer then sends each miner's accrued balance to their registered payout address once it clears the minimum — 0.1 WTX, 1.0 HTH, 1.0 BITN. It is a push model end to end: you never sign anything after starting the session, and you never pay payout gas.

Host a pool — locking 100,000 WATT

Hosting turns your own node's earnings into a game economy. You lock 100,000 WATT v2 once, and from then on you can open pools, set fees, and your own rigs mine for free.

Stake
100,000 WATT v2
Home chain
Polygon or ALT
Unstake hold
30 days
Host perks
1 % WATT cut + free mining

What the stake buys you

  • The right to create pools. NodeMiningEngine.createPool checks the PoolRegistry for an active registration with at least the required stake.
  • Free mining for your own rigs. A host may call startMining with wattAmount == 0 for rigs they own. The stake is the fuel. Consumption is capped at the deposit, so a zero-deposit session consumes zero forever.
  • 1 % of every WATT burn in your pools, with the other 99 % destroyed. That split is a constant — no pool can lower the burn.
  • Your reward fee, in basis points, on top.

Becoming a host

  1. Get 100,000 WATT v2 on your chosen home chain. Buy on a DEX and migrate, bridge v2 across, or use the supply-ratio mint — depositing WTX mints WATT v2 at the live circulating supply ratio, which is how the reference host funded their stake.
  2. Open the Create a pool tab on pools.html, section 1 · Become a host.
  3. Fill in your node. Pool name, stratum endpoint, node RPC endpoint, node P2P endpoint, and your fee percent. These are published on-chain so miners can see what they are joining.
  4. Register + lock WATT. This approves 100,000 WATT v2 and calls registerPoolWithNode. Your status flips to ACTIVE.
  5. Open a pool in section 2: pool name, the payout coins it offers, the node endpoint, your reward fee in bps (300 = 3 %) and your WATT cut in bps. createPool returns the pool id miners will point rigs at.

One pool, a menu of coins

A single 100,000-WATT stake backs a pool that can offer up to 16 payout coins, and each miner picks which one their rig mines. Power, accumulators, deposits and fees are all tracked per (pool, coin) pair. You can extend a live pool's menu at any time with addPoolTarget, and change fees at any time.

Pool fees are uncapped and changeable mid-session — by design

A host can set the reward fee to 100 % at any moment, including on sessions that are already open, and take everything earned from that point on. This was chosen deliberately after the trade-off was spelled out; the mitigation is transparency, not restriction. Every change emits PoolFeeChanged(poolId, oldFee, newFee, oldWattCut, newWattCut), the current rate is readable on-chain before you join, and each Paid event carries the feeBpsApplied. Rewards already credited cannot be clawed back. Read a pool's fee before you point a rig at it, and watch it while you mine.

Running your pool

Connecting real income

The link between your node and the on-chain pool is the operator daemon (mining-game-pool-operator). There is no on-chain validator field; the daemon holds the mapping and it is the engine's owner or an appointed poolPayer, which is what authorises every reportPoolDeposit. It supports three shapes of income:

FeederReadsUsed for
validatorsNative balance growth of an addressPoS validators, staking delegations, merged-mining payout addresses
masternodesCoinbase payouts to each proTxHashHTH and other Dash-lineage masternodes
stakersNewly-matured coinstakes via listsinceblockQtum-lineage PoS wallets (BITN)

Every feeder self-baselines on first sight, so historical balance is never credited — only growth from the moment you wire it up. A delegated field scales credit when you pledge only part of a wallet to the pool. A readChain label lets several addresses on one chain each feed separately, and reportChain lets a node on one chain feed a pool on another.

Baseline by chain and address

An early version keyed the balance baseline by chain alone, so repointing a feeder at a new address credited the difference between two unrelated balances — about 9,495 WTX of phantom host credit on one pool. It is now keyed chain:address. If you repoint a feeder, verify the new baseline before you arm the payer.

Stratum endpoints

If your pool takes real miners, publish plain TCP and TLS. Note that a Cloudflare-proxied DNS record blackholes raw TCP — stratum hostnames must be DNS-only A records. TLS is terminated with an nginx stream block; set proxy_timeout 1h, because nginx's 10-minute default drops idle miners mid-shift.

The 100k WATT Club badge

Hosts can mint a fully on-chain ERC-721 badge whose art — roughly 740,000 micro digits rendered as digits made of digits — lives entirely in contract storage across 20 SSTORE2 chunks. No IPFS, no metadata server, nothing that can lapse. One global member-number counter spans every chain, with tiers Genesis #1–100 (gold), Founder #101–1000 (platinum) and Member #1001–10000 (electric), and live Stake Chain and Pool ID traits. Mint at nft.wattxchange.app/genesis.html.

ChainClubBadge
WATTxchain 223560xf7E47Bd99554c14991682C7bE937d735Da93DfC8
Altcoinchain 23300x80A0C4E85C95814287649F7Df558697ae411f2B8
Polygon 1370x20cb5AF1D352C5384c25F25777f34B4650906437
Base 84530x430BFc6aF1b5fAAff104484A827d98D59EE31a6D
Optimism 100xf2DbF910aD1cA08c3879C72AE6277fA903E058c4
Sonic 1460xf2DbF910aD1cA08c3879C72AE6277fA903E058c4

All six verify the same genesis art hash 0x9b7563e1…3906cf on-chain. The series genesis is WATTxchain, where mint payments auto-stake in the treasury.

On WATTxchain, mint to a hash160 address

An Ethereum-derived address on WATTxchain is a valid 20-byte recipient but has no spendable UTXO form — an ERC-721 minted there can never be transferred, and there is no admin rescue. This cost us badge #00001 once. Use a WATTx wallet extension or node-wallet address.

Closing a pool

Unstaking is a 30-day hold, and the pool keeps running the whole time.

  1. Request unstake. Your registration moves to UNSTAKING. You can no longer create new pools, but your stake stays locked and therefore your existing pools stay backed — and you keep mining free.
  2. The warning is public. poolShutdown(poolId) returns (shuttingDown, unlockAt), and every front-end shows miners a countdown so they can move their rigs before the pool goes.
  3. Complete after 30 days. completeUnstake returns your 100,000 WATT. Only then does enforceRegistration(poolId) become callable — by anyone — to deactivate the pool.

PAUSED is different from UNSTAKING: a paused host still counts as staked and keeps their pools; re-activation re-checks the stake.

Cross-chain hosting

Today each chain's engine gates on its local registry, so hosting on Polygon and on Altcoinchain are separate 100,000-WATT stakes. PoolRegistryMirror is built and tested for the stake-once-mirror-everywhere model — a remote-chain stand-in fed either by a LayerZero adapter or by EIP-712 submitAttestation relays, fail-closed with a 7-day maximum record age so a stale record reads as CLOSED. It is not deployed yet.

The bridges — five rails, one map

The game spans four chains with three completely different address formats, so there is no single bridge. There are five rails, each honest about its own trust model.

RailMovesBetweenMechanismTrust
WATT omnichainWATT v2ALT ⇄ PolygonLayerZero OFT — burn on source, mint on destinationOur own DVN attests; supply conserved exactly
WATT ⇄ WTX deskWATT v2 ⇄ native WTXALT/Polygon ⇄ WATTxchainHTLC in-leg, watched deposits out-leg; AMM or supply-ratio mint pricingOperated desk, refundable HTLC
WATT cross-EVMWATT v2ALT ⇄ PolygonSame desk, 1:1 minus fee, paid from floatOperated desk, refundable HTLC
ALT omnichainnative ALTALT ⇄ PolygonLayerZero lockbox on ALT, mint/burn OFT on PolygonSame mesh; escrow exactly backs supply
BSV attestedWATT + rig NFTsEVM → Bitcoin SVBurn to 0x…dEaD, oracle quorum releases from a fixed treasuryBounded — treasury-capped, cannot steal
Why there is no "one bridge"

WATTxchain and Bitcoin SV have no EVM you can transact on as a user — WATTxchain's EVM re-signs through the node wallet, and BSV is pure UTXO script. A trust-minimised message bridge needs both ends to verify the other's consensus. Where that is possible (EVM ⇄ EVM) we run a real LayerZero mesh. Where it is not, we run an operated desk and say so.

WATT omnichain — LayerZero Live

Move WATT v2 between Altcoinchain and Polygon. WATT is burned on the source chain and minted on the destination — the same token, the same total supply, 1:1. No wrapped IOU.

Use it: stake.mining-game.wattxchange.app/bridge.html

Why we self-host the mesh

LayerZero's official endpoints only route to endpoint ids that LayerZero Labs has registered, and the registration functions are owner-only, so Altcoinchain cannot use an official endpoint on any remote chain. We therefore run our own EndpointV2 + SendUln302 + ReceiveUln302 on both ends, with eid == chainid. The adapter subclasses OFTCore directly: _debit is burnFrom, _credit is mint, and the adapter holds MINTER_ROLE on WATT v2 on each chain.

Altcoinchain 2330Polygon 137
WATT v20xB7635E386283CAE6FB1A710f19CaA8220beF630D0x387693eCEC037C61943404F03c097d2ADA15ae3f
OFT adapter0x8ce709Af081031eA9e3C0E5E59b20E9c4A8238940xBE9Fb3ee29C01d604F522765726C5A59573A77e4
LZ EndpointV20x4cf8a62FFF13F2c0572023804d320918b963fab30x4cf8a62FFF13F2c0572023804d320918b963fab3
Confirmations required6 (≈ seconds inbound)40 (≈ 20 min inbound)

Sending

  1. Pick a direction and connect on the source chain.
  2. Enter an amount. The page quantises it for you — see the warning below.
  3. Approve WATT v2 for the adapter, then Send. Messaging fee is currently 0.
  4. Wait for the relayer. ALT → Polygon needs 40 Polygon confirmations, so about twenty minutes. Polygon → ALT needs 6 and lands in seconds. Send gas is roughly 133,000.
The 6-decimal trap — why "MAX" used to fail

The OFT carries amounts in sharedDecimals() == 6, with decimalConversionRate() == 1e12, so anything finer than six decimal places is dust that _debitView drops. Sending minAmountLD == amountLD untrimmed then reverts with SlippageExceeded (0x71c4efed) for any amount with more than six decimals — and a real balance never lands on a 6-decimal boundary, so MAX failed every time. Always quantise (wei / 1e12) × 1e12 before approving, quoting and sending. The page does this now. If you are calling the contract yourself, do it too.

If a send burns but never mints

The burn is on-chain and permanent; the mint waits on the relayer. Compare endpoint.outboundNonce(src) with endpoint.inboundNonce(dst) — if outbound is ahead, the relayer is behind, not your funds lost. This has happened twice: once because a transient disk-full truncated the relayer's state file to zero bytes (and pm2 still reported online, restarts: 0 for an hour), and once because an unbounded getLogs range hit a pruned-history error. Both are fixed, and a liveness monitor now judges the relayer by log freshness rather than process status. Packets always deliver once the relayer catches up.

WATT ⇄ WTX desk Live

Use it: bridge.wattxchange.app — the desk serves its own swap UI, so there is no separate front-end to go stale.

This is a desk, not an atomic swap, and that is a consequence of the chain. Users cannot sign transactions on WATTxchain's EVM — its MetaMask compatibility layer recovers the sender and then dispatches node-wallet RPCs — so WTX has to move on the UTXO layer.

How a swap runs

DirectionYour sideDesk side
WATT → WTXLock WATT in the HTLCVault under a desk-issued hashlock. Minimum lock 12 h; your refund path is always intact.Pays WTX first, then claims the lock. The desk refuses to pay a lock with under 6 h left.
WTX → WATTSend WTX to the deposit address the desk shows you.Waits 3 confirmations, then pays WATT on your chosen EVM chain.

Vault 0x54117CAd2835B3D5B499f3acA03B1Ff643Af1955, same address on Altcoinchain and Polygon. Operator 0xE731A3d4D7C5cb642B5041392a4Eb6E966Dba11a.

Two pricing modes

Virtual AMM (default)

A constant-product curve over the desk's actual aggregate reserves — the WTX float on one side, the operator's WATT across every enabled EVM chain plus the BSV treasury on the other: out = R_out × in / (R_in + in). A fixed 1:1 rate was drainable the moment WATT's market price diverged from one WTX, so the pool self-prices instead. Reserves are read live with a 10-second cache and the desk fails closed — an unreadable reserve queues the swap rather than mispricing it.

Supply-ratio mint (WTX → WATT)

Instead of paying from float, the desk can mint WATT v2 at the live ratio of circulating supplies (WATT circulating ÷ WTX circulating), sourced from the supply aggregator with a 30-minute staleness gate. This is how the reference host funded their 100,000-WATT stake — one 18,500 WTX deposit minted 85,584 WATT. The cap is 100,000 WTX per swap.

The mint ratchet, stated plainly

Every mint raises WATT's circulating supply, so the next mint pays more WATT per WTX. That is inherent to a supply-ratio peg and it was accepted knowingly when the mode was opened to the public. The minting leg also requires the operator to hold MINTER_ROLE on that chain, granted once by the 2-of-2 multisig — Polygon is granted, Altcoinchain is not, so ALT-destination mint swaps queue rather than mispay.

"Stuck waiting for your deposit" is almost always the WTX chain, not the desk

The desk sees your deposit at zero confirmations but needs three. If WATTxchain is not producing blocks, every WTX-leg swap waits silently. The desk now publishes wtxChain: {height, tipTime, tipAgeSeconds, advancing} and the UI shows an amber WTX network paused — no new blocks for N min banner when the tip is more than 15 minutes old, and a live deposit detected — N/3 confirmations counter otherwise. Your funds are safe and refundable throughout.

Treasury money is carved out of the pool

Club-badge mint payments and the owner's own coins live in the same wallet the AMM measures, which once made the pool read 154,726 WTX against 1,595 WATT — 100 WATT would have drained about 9,127 WTX of treasury money. Those addresses are now excluded from the reserve calculation and their UTXOs are persistently locked so coin selection can never spend them.

WATT cross-EVM (desk) Live

The same desk also moves WATT v2 between Altcoinchain and Polygon at 1:1 minus fee, paid out of the operator's float rather than by burn-and-mint. You lock on the source chain, the desk pays on the destination from float, then claims your lock.

This exists alongside the LayerZero rail because it settles in seconds in both directions and needs no messaging confirmations. Its depth is bounded by float — currently a few hundred WATT per chain — so the LayerZero bridge is the right rail for large amounts and the desk is the right rail for small, fast ones. Both are reachable from the same bridge page and the desk UI.

ALT omnichain Live

Native ALT moves to Polygon as an ERC-20 over the same LayerZero mesh, using a lockbox rather than burn-and-mint (you cannot burn a native coin).

SideContractRole
Altcoinchain 23300x435779bFa6959072Ea321f18Fcd2e98F68441294ALTNativeOFTAdapter — escrows native ALT
Polygon 1370x8d4c8180b12c2b43ee63ac5050e8d0acece440baALTOFT "Altcoinchain" / ALT, 18 dp — mint & burn

Backing is exact: escrow balance always equals the Polygon-side total supply. Proven both ways on mainnet. ALT → Polygon needs 40 confirmations (about 20 minutes at ALT's ~30-second blocks); the reverse needs 6.

Bitcoin SV attested bridge

Bitcoin SV has no EVM, so the v3 Solidity cannot deploy there. The BSV leg is a burn-and-attest design with a deliberately bounded trust model.

  • Exit is trustless. You burn WATT v2 or components to 0x…dEaD through MiningGameBridgeOut, which emits WattExited / NftExited with a bridgeId = keccak(chainid, bridgeOut, nonce) — unique across chains and replay-proof. The oracle can only ever attest to a real, already-final on-chain burn, and it has no power to mint on the EVM side.
  • Release is bounded. The BSV treasury is a fixed pre-mint of 10,000,000 WATT with an n-of-m quorum signing releases. The worst an oracle failure can do is leak up to the treasury — it can never mint infinitely and it can never take your coins. That trade-off was chosen explicitly.
  • Coming back uses the mirror-image MiningGameBridgeIn, an n-of-m quorum that mintBatches on the destination. Its digest commits to the destination chain id, the bridge contract, the bridge id, the source chain, the source bridge-out contract, the recipient and the exact ids and amounts, so a signature cannot be replayed on another chain or redirected. Signers must arrive strictly ascending, which is an O(n) duplicate defence with no storage. The emergency stop is revoking its minter rights, beyond the ordinary pause().
Stated trust boundary

A quorum could mint without a real burn. That is inherent to any bridge whose destination chain cannot verify the source chain's consensus, and it is written into the contract's own documentation rather than hidden. Nothing is custodied, so the failure mode is inflate-yes, steal-no.

The one-way EVM → BSV path most people want is the signature-proof claim, which is simpler and already live.

Route finder — every rail at once

The desk exposes a route engine that quotes multi-hop paths across all rails: QuickSwap WATT v2/WPOL, SwapinDEX WATT/wALT on Altcoinchain, the WattSwap v1→v2 migration, the desk's cross-EVM lane, the desk's WATT⇄WTX lane, and the LayerZero ALT bridge.

GET https://bridge.wattxchange.app/api/route?from=WTX&to=POL&amount=100
GET https://bridge.wattxchange.app/api/quote?direction=WTX_TO_WATT&amount=100&dest=0x…
GET https://bridge.wattxchange.app/api/prices
GET https://bridge.wattxchange.app/api/info

The response gives the best path with per-leg venues, amounts and caps — or a blocked[] list naming the exact missing pool. The game's SELL popup uses this: it shows a live routed quote, a leg map, and jump-off buttons, and it greys out pairs it cannot route.

PairStatusPath
ALT → WTXLiveSwapinDEX → WattSwap migrate → desk AMM
POL ⇄ WATT · POL → WTX · WTX → POLLiveQuickSwap + desk
WTX ⇄ WATT · ALT → WATTLiveDesk (mint in, AMM out)
POL → ALT · WTX → ALT · WATT → ALTNeeds liquidityUnlocks when either the WATT v2/wALT pool on SwapinDEX or the ALT-OFT/WPOL pool on QuickSwap is seeded — see pool.html

Reference — all contracts

Same address on every EVM chain

ContractAddress
MiningGameV3 (component staking)0x856f59F1729f6e107EbCD75d21c64AB897c5681f
GameConfigV30x50BAb538dB8558deE04314f87d9df33a42c61352
MiningGameVault (proxy)0x72A716F62aCfF960f6F097B4c7909B2368eD3acA
Classic → v3 item migrator0x97BcC99ff34FA2cde929c97074011E8929F59679
Items / shop multisig (2-of-3)0xc49699a99177a058439Ac7E3D2F5aF03d95e1D99
HTLCVault (bridge desk)0x54117CAd2835B3D5B499f3acA03B1Ff643Af1955
LayerZero EndpointV20x4cf8a62FFF13F2c0572023804d320918b963fab3

Polygon 137

ContractAddress
WATT v20x387693eCEC037C61943404F03c097d2ADA15ae3f
WATT v1 (legacy)0xE960d5076cd3169C343Ee287A2c3380A222e5839
WattSwap (v1 → v2)0x90a0906a7e01a65f48bd35741681088E3FA6729c
WATT OFT adapter0xBE9Fb3ee29C01d604F522765726C5A59573A77e4
ALT OFT (bridged ALT)0x8d4c8180b12c2b43ee63ac5050e8d0acece440ba
MiningGameItems0x0CDbf4926a8EdFFaa803B96f8fa90B065DE19Eb2
ItemShop0xeE6B67c3993884F1b693A4a66e952Bb563463131
WattStakingPool0x7E8FC9d7D7588F410E1399aC690F901268B08a8d
CaseFreeMint0xc75504Cb57b26041655dDd739414C240Dd628e7a
PoolRegistry (v3)0xC65E46645EF9d7Bf1F7D526c9Fb4F4B54704d1DE
NodeMiningEngine (v3)0x8d372e3e1fbB82e707D09f782a1e3959DC447354
PayoutHub (v3)0x8eC1Fa15A1DFB038396176a122ED2D385Ee04339
MiningRigNFT0xf9F94e9fa744DE1209EF28321604a0Aa3B21a884
WATT v2 admin multisig (2-of-2)0x0f4a9765531bB8f8aa33fB95AeDACD8a660fcBA9
Classic collection (v1)0x970a8b10147e3459d3cbf56329b76ac18d329728
Classic NFT staking (v1)0xcbfcA68D10B2ec60a0FB2Bc58F7F0Bfd32CD5275
Classic WATT staking (v1)0x5C33598c51785122dF275A1f4b4d0f1ab8ecc692
Classic LP staking (v1)0x672654aBeF98d6b1B78c34368072fF294D0339d3

Altcoinchain 2330

ContractAddress
WATT v20xB7635E386283CAE6FB1A710f19CaA8220beF630D
WATT v1 (legacy)0x6645143e49B3a15d8F205658903a55E520444698
WattSwap (v1 → v2)0xdFd07EBEEC3228D14b99f9f39EC71D884ABcbbF4
WATT OFT adapter0x8ce709Af081031eA9e3C0E5E59b20E9c4A823894
ALT native lockbox0x435779bFa6959072Ea321f18Fcd2e98F68441294
MiningGameItems0x851fd0205348783444Fc9EDe99Ca2321681EC99b
ItemShop0x92809C4a46b4D0F11a48BE21fF13202EA56DcEB1
WattStakingPool0xa3f8B04310380cD13Ec85B11420d1fc848af36C4
CaseFreeMint0x91Ae9eDe6016AdF84c643F9Ce5Bb60A9438D792f
PoolRegistry (v3)0x88beBed99cb45D81F5DEd708682C55a2b26a221C
NodeMiningEngine (v3)0x755dCf18b521BC7e42f88fdfEBa2C910809AF09F
PayoutHub (v3)0x7Cee30E196Cb298e4634D7192C527dA37f2C7d57
MiningRigNFT0x131A875e1bfEB2B3735E5d9Ad5e8871fF6CE9381
WATT v2 admin multisig (2-of-2)0x59bDaFD1D4dC46648204044eB7259eA1F08A9280
Marketplace (thirdweb v2 clone)0x8F07428E3fd3860220e1B2163215F971171042AA
Classic collection (v1)0xf9670e5D46834561813CA79854B3d7147BBbFfb2
Classic NFT staking (v1)0xe463045318393095F11ed39f1a98332aBCc1A7b1
wALT (wrapped native)0x48721ADeFE5b97101722c0866c2AffCE797C32b6

WATTxchain 22356

ContractAddress
WATT v20xc4603E2582aE320857379819123dFbFd3093dcfa
WattSwap (v1 → v2)0x704f5eFcDE5EDD87e767Be78ba8FaA6fAb244bad
MiningGameItems0x9baaFDE958d0dE13043CBb4292e467EB00ED06B4
ItemShop0x0239f289Cca84E7Bb899Fe065ba452293D501355
WattStakingPool0xe9000a1ba29c3e87B4F964E9514eA4e8fd5d5749
PoolRegistry0x3a02971ceAF9B817e770c36e393A95542bC65Df2
PayoutHub0x9fAb0fBa9b458A7A0c9D60a26BC33f6E2695F179
WATT v2 admin multisig (2-of-2)0x536cebbF7ff414EDcd8590080F20DB90aecf8541

Reference — component catalogue

All 36 shop items with their on-chain traits. Hash is hash rate, W is WATT consumption per hour, SW is stake weight (what powered-off staking pays on), Eff is efficiency, Luck biases block finds.

IdItemCategoryHashWSWEffCoolPwrLuckPrice (WATT)
1Gaming PCPC251Free mint
2Genesis BadgeBadge0042101020,000
3XL1 ProcessorCPU1029200
4TX120 GPUGPU201011700
5GP50 GPUGPU3316181,200
8TX190 GPUGPU6022306,000
9XL190 CPUCPU358224,500
10GP720 GPUGPU110384814,000
11GPX880 GPUGPU180607530,000
12XXL270 CPUCPU70154012,000
13Bit Hammer ASICASIC32011012060,000
14Mining Rig FrameFrame00108,000
17Red MousePeripheral00022,500
18RGB KeyboardPeripheral00023,500
19Server TowerStructure004020,000
23LC23 MonitorPeripheral00025,000
24Gaming ChairPeripheral00035,000
25Shipping ContainerStructure00050,000
26WarehouseStructure000250,000
40–47Power Upgrade Lv1–8UpgradeRaises the farm's power cap400 · 1,100 · 2,600 · 6,000 · 14,000 · 32,000 · 70,000 · 160,000
50–57Cooling Upgrade Lv1–8UpgradeLowers the thermal coefficient350 · 900 · 2,200 · 5,200 · 12,000 · 28,000 · 60,000 · 130,000
60–61Rack Expansion Lv1–2StructureMore GPUs per framed rig1,500 · 9,000

Ids 1–5 are the original v1 components and migrate 1:1 from the classic collection. Beyond level 8, power and cooling ladders continue indefinitely — see Upgrades are endless.

Reference — payout targets and algorithms

Payout targets are registered on the PayoutHub at runtime, not compiled in. That is the change that made PoS chains and masternodes possible at all — neither is reachable by a mining algorithm, so the payout target comes from the pool you chose, not from your rig's algorithm trait. Traits still decide how much.

Target idCoinKindPayout address form
0ALT — AltcoinchainHybrid PoW/PoSYour connected EVM address
1WTX — WATTxchainHybrid PoW/PoSbase58 W… — must be registered
2POL — PolygonPoSYour connected EVM address
3BSV — Bitcoin SVPoWBSV ordinals address — must be registered
4HTH — Help The HomelessMasternodeh… — must be registered
5BITN — BitnetPoSB… — must be registered

Ids are fixed and the game hard-codes them, so they are stable. A pool may pin one algorithm or accept any (ANY_ALGO = 255, the normal setting for PoS and masternode pools).

#AlgorithmOriginHardware
0SHA256DBitcoinASIC
1ScryptLitecoinASIC / GPU
2EthashEthereum ClassicGPU
3RandomXMoneroCPU
4EquihashZcashGPU / ASIC
5X11DashASIC / GPU
6kHeavyHashKaspaGPU / ASIC

Troubleshooting

"Connect Wallet does nothing — no popup, no error"

Brave Shields blocking a script or RPC host. All page logic lives inside one ES module; if any import in it is blocked, the module never executes, so the button exists with no handler attached and clicking it is silently inert. It reads exactly like a wallet bug and is not one. Drop Shields to standard for the site and reload.

"Component cards show flat pictures instead of 3D models"

WebGL is unavailable — usually Brave's fingerprinting protection on Strict rather than a hardware problem. The pre-rendered 512 px stills are the intended fallback, taken from the same on-chain models with the same camera and lighting. Without WebGL the page also skips the multi-megabyte GLB downloads entirely, so it is faster.

"Stake failed: execution reverted (unknown custom error)"

Almost always ERC1155MissingApprovalForAll (selector 0xe237d922) — the staking contract takes custody and needs setApprovalForAll first. Every stake path approves on demand now, but an older tab will not. Reload, or press Approve items.

"The bridge rejects my MAX amount"

SlippageExceeded. Quantise to 6 decimals — see the 6-decimal trap.

"contract runner does not support sending transactions"

A read-only contract handle was used for a write. If you see this on our pages, tell us — it is a bug on our side, not yours, and it has bitten us twice (unstake and one liquidity path).

"gas price below minimum: gas tip cap 1500000000, minimum needed 25000000000"

Polygon enforces a 25 gwei priority-fee floor and some libraries default to 1.5 gwei. Set maxPriorityFeePerGas to at least 30 gwei.

"could not coalesce error" on Altcoinchain

Altcoinchain's node does not like EIP-1559 fee data from some wallets. Use legacy (type-0) transactions with an explicit gasPrice. Our pages force this automatically.

"My swap is stuck at 'waiting for your deposit'"

Check the amber banner. If WATTxchain has stopped producing blocks your deposit cannot reach three confirmations, and the desk waits rather than paying. Funds are safe and refundable throughout, and the desk pays automatically the moment blocks resume.

"My garage is empty but I own components"

They are staked. Escrowed items are owned by the staking contract, so balanceOf cannot see them. Open the wallet panel's STAKED COMPONENTS section and unstake what you want to build with.

"I upgraded and my wallet never prompted me"

Either you have game credit (that is the point of it — one signature up front, then no prompts), or you are on a stale tab from an older build spending simulated WATT. Hard-reload and check the credit banner.

"The free-mint button reverts with 'not for sale'"

Old build. The free case is minted by CaseFreeMint, not by the shop. Use the current site.

"WATT sent to the staking pool never showed up"

A plain transfer strands it. The pool only counts fund(amount).

Pages look stale after an update

GitHub Pages caches for up to ten minutes. Hard-reload (Ctrl/Cmd + Shift + R).

Glossary

TermMeaning
WATTThe game's fuel and reward token. v1 is the immutable 2022 original; v2 is the role-gated replacement. 1:1, always.
Component / itemAn ERC-1155 token — a case, CPU, GPU, ASIC, frame, structure, peripheral, badge or upgrade.
RigAn ERC-721 built from components. Rigs mine; components stake.
Powered offA staked component minting WATT by stake weight. Costs nothing to hold.
Powered onA rig mining in a pool, burning WATT as fuel. 99 % burned, 1 % to the host.
Effective powerhashRate × efficiency × 100 / wattConsumption. Your share of a pool.
Stake weightWhat powered-off staking pays on. Gaming PC 1, Genesis Badge 42, XL1 9, TX120 11, GP50 18.
TargetA payout coin registered on the PayoutHub at runtime, with a kind: PoW, PoS, Masternode or Hybrid.
HostSomeone who locked 100,000 WATT v2 and may open pools. Earns 1 % of burns plus their fee, and mines free.
PayoutHubThe contract holding each target's balance, each miner's running credit, and each miner's non-EVM payout address.
NodeMiningEngineThe contract that splits reported deposits by effective power and settles WATT fuel.
Operator daemonThe off-chain service that reads real node income, reports it on-chain, and pushes payouts. Pays all the gas.
OFTLayerZero's Omnichain Fungible Token — burn on source, mint on destination, one supply.
DVNDecentralised Verifier Network — the party that attests a LayerZero packet. Ours is self-hosted.
HTLCHash Time-Locked Contract. Your bridge deposit is always refundable if the desk does not pay.
1Sat OrdinalData inscribed permanently on Bitcoin SV against a single satoshi. All game art lives this way.
BSV-21The Bitcoin SV fungible-token standard. WATT and the five classic rigs exist as BSV-21 tokens.
SuperstakerA WATTxchain node accepting delegated stake for a fee. Minimum self-stake 20,000 WTX.