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.
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.
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
| Era | Token | Components | Where it runs | Status |
|---|---|---|---|---|
| v1 / classic (2022) | WATT v1 (ERC-20) | MiningGame ERC-1155, ids 1–5 | Polygon 137, Altcoinchain 2330 | Withdraw only |
| v2 (2026) | WATT v2 (ERC-20, role-gated mint, LayerZero OFT) | — | Polygon, ALT, WATTxchain | Live |
| v3 (2026) | WATT v2 | MiningGameItems ERC-1155, 36 items | Polygon, ALT, WATTxchain | Live |
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
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
| Network | Chain ID | Currency | RPC |
|---|---|---|---|
| Polygon | 137 0x89 | POL | https://polygon-bor-rpc.publicnode.com |
| Altcoinchain | 2330 0x91a | ALT | https://rpc.wattxchange.app |
| WATTxchain | 22356 0x5754 | WTX | https://rpc-wtx.wattxchange.app |
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 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:
| What | Where it is | How to get it out |
|---|---|---|
| WATT v1 in your wallet | Polygon 0xE960d5…5839 · ALT 0x664514…4698 | Migrate to v2 (optional but recommended) |
| WATT v1 staked in the token pool | Polygon 0x5C3359…c692 — holds 768,577 WATT | End your stake |
| LP tokens staked | Polygon 0x672654…39d3 (WPOL/WATT UNI-V2) | End your LP stake |
| Components staked in the NFT pool | Polygon 0xcbfcA6…5275 (3,102 held) · ALT 0xe46304…A7b1 (4,097 held) | Unstake per deposit |
| Components in your wallet | Polygon 0x970a8b…9728 · ALT 0xf9670e…Ffb2 | Swap to v3, or claim on BSV |
The classic UI hardcodes the NFT collection as 0x970a8b10… on both chains.
That is correct on Polygon only. The Altcoinchain collection is
0xf9670e5D46834561813CA79854B3d7147BBbFfb2 — 0x970a8b… 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
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
| Parameter | Value | What it means for you |
|---|---|---|
| Contract | 0x5C33598c51785122dF275A1f4b4d0f1ab8ecc692 | Holds 768,577.57 WATT v1 of staker principal |
maturity | 30 seconds | Every stake older than half a minute is matured — no penalty applies to anyone |
penalization | 30 % | Only charged if you end inside the 30-second window. In practice: never |
interest_rate | 30 % / year | Simple interest on elapsed seconds, paid from the owner wallet |
| Owner wallet balance | 39,317 WATT | The interest budget. When it is empty, interest pays 0 — principal is unaffected |
How to end a stake
- Open the classic Token-staking page. stake.mining-game.wattxchange.app/token-staking/ (mirror: the-mining-game.github.io/token-staking/).
- 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.
- 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. - 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.
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.
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
- 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 atpolygon@block-91012890, 6,645 holders.) - 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. - 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.
- Paste your BSV ordinals address. In Yours Wallet this is the ordinals address, not the payment ("bsv") address. Never use an exchange deposit address.
- 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. - 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
| Asset | BSV-21 token id | Supply |
|---|---|---|
| WATT (8 decimals) | b47c7e9b608d0b7c7391462fe264eecdc03f248ab690e3b51a4e643135dc5ff9_0 | 10,000,000 |
id 1 · Gaming PC PCCASE | 5b30beb03f43e48f0bca8b01c65a4fa53c9a458a1cdf02c7bff6374f6980d1bb_0 | 20,000 |
id 2 · Genesis Badge GENESIS | 5954fbacf0e2dd7a60afb28eab433c258a067b2551860bdf30677c1b46d88688_0 | 200 |
id 3 · XL1 Processor XL1CPU | 48506a5deb8169c4b230e3167b052f9997df3022dafd990b5661c6e210f60005_0 | 20,000 |
id 4 · TX120 GPU TX120 | 14f2da63b6fe025953e5f590e3a468783e7fe13d65f5218d335186d4ea3b2bf4_0 | 12,000 |
id 5 · GP50 GPU GP50 | 2cb10dd66204ad0938575fb31bfac8ca010eee9310f1537d37c9759208cfffe6_0 | 8,000 |
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.
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.
| Chain | Classic collection (ERC-1155) | NFT staking contract | Escrowed now | New stakes |
|---|---|---|---|---|
| Polygon 137 | 0x970a8b10147e3459d3cbf56329b76ac18d329728 | 0xcbfcA68D10B2ec60a0FB2Bc58F7F0Bfd32CD5275 | 3,102 items | Disabled (canStake=false) |
| Altcoinchain 2330 | 0xf9670e5D46834561813CA79854B3d7147BBbFfb2 | 0xe463045318393095F11ed39f1a98332aBCc1A7b1 | 4,097 items | Open |
Stake weights are identical on both chains and are the authentic v1 values:
Unstaking, step by step
- Open the classic NFT-staking page. stake.mining-game.wattxchange.app/nft-staking/. Connect on the chain your rigs are on.
- 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. ReadisApprovedForAll(you, staker)to check. - Withdraw rewards first (optional).
withdrawRewards(depositId)per deposit, orgetRewardsAmount(depositId)to see what is owed. Do this before unstaking if you want the accrued v1 WATT. - Unstake per deposit.
unstake(depositId)— one call per deposit record. UsegetActivityLogs()or the page's list to find your deposit ids. - Confirm the items are back in your wallet with
balanceOf(you, id)on the collection, then head to migration or the BSV claim.
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.
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.
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).
- Pick your chain — Polygon or Altcoinchain. The migrator is per-chain; v1 on ALT becomes v2 on ALT.
- Approve v1 for the
WattSwapcontract. The page checks your existing allowance first, so a repeat migration skips this. - Call
migrate(amount). Your v1 is transferred to0x…dEaDand 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.
| Chain | WATT v1 | WATT v2 | WattSwap migrator |
|---|---|---|---|
| Polygon | 0xE960d5076cd3169C343Ee287A2c3380A222e5839 | 0x387693eCEC037C61943404F03c097d2ADA15ae3f | 0x90a0906a7e01a65f48bd35741681088E3FA6729c |
| Altcoinchain | 0x6645143e49B3a15d8F205658903a55E520444698 | 0xB7635E386283CAE6FB1A710f19CaA8220beF630D | 0xdFd07EBEEC3228D14b99f9f39EC71D884ABcbbF4 |
| WATTxchain | 0x99B5… | 0xc4603E2582aE320857379819123dFbFd3093dcfa | 0x704f5eFcDE5EDD87e767Be78ba8FaA6fAb244bad |
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.
- Approve the classic collection for the migrator — one
setApprovalForAllper chain. The per-card swap button does this on demand if you skip the explicit button. - Swap. Your classic tokens are retired and the same ids and amounts are minted on the new
MiningGameItemscollection. Swap ALL below does every id you hold in one call. - 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.
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
- End your Polygon token/LP stakes → WATT v1 lands in your wallet.
- Unstake your classic components, one deposit at a time, on each chain.
- Optional: claim the BSV copies now, while everything is in your wallet and matches the snapshot.
- Migrate WATT v1 → v2.
- Swap classic components → v3.
- 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.
| Contract | Address (Polygon 137 & ALT 2330) | What it does |
|---|---|---|
| MiningGameV3 | 0x856f59F1729f6e107EbCD75d21c64AB897c5681f | Component staking. Powered off mints WATT by stake weight; powered on burns WATT as fuel. |
| GameConfigV3 | 0x50BAb538dB8558deE04314f87d9df33a42c61352 | The entire economy on-chain — 16 traits, upgrade tiers, thermal/wear/cooling/power curves, luck. Multisig-governed. |
| MiningGameVault | 0x72A716F62aCfF960f6F097B4c7909B2368eD3acA | Your per-player rewards wallet plus the in-game DEX. UUPS-upgradeable behind an ERC-1967 proxy. |
| Multisig (2-of-3) | 0xc49699a99177a058439Ac7E3D2F5aF03d95e1D99 | Owns the config, the item collection and the shop. Anyone can execute() once quorum is reached. |
The rest of the economy, per chain
| Contract | Polygon 137 | Altcoinchain 2330 |
|---|---|---|
| MiningGameItems (ERC-1155) | 0x0CDbf4926a8EdFFaa803B96f8fa90B065DE19Eb2 | 0x851fd0205348783444Fc9EDe99Ca2321681EC99b |
| ItemShop | 0xeE6B67c3993884F1b693A4a66e952Bb563463131 | 0x92809C4a46b4D0F11a48BE21fF13202EA56DcEB1 |
| WattStakingPool | 0x7E8FC9d7D7588F410E1399aC690F901268B08a8d | 0xa3f8B04310380cD13Ec85B11420d1fc848af36C4 |
| WattPriceOracle | 0x88B6f5BeB2C9430Aef55C6234aC29183655E8B63 | 0x9Ce58737f5221d9Ab81A6eDaAD32f5aDa6d14100 |
| CaseFreeMint (free Gaming PC) | 0xc75504Cb57b26041655dDd739414C240Dd628e7a | 0x91Ae9eDe6016AdF84c643F9Ce5Bb60A9438D792f |
| WATT v2 multisig (token admin) | 0x0f4a9765531bB8f8aa33fB95AeDACD8a660fcBA9 | 0x59bDaFD1D4dC46648204044eB7259eA1F08A9280 |
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
wattConsumptionrate, 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.
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
| Key | Action |
|---|---|
W A S D · W A D X · arrows | Walk. Camera-relative, on the floor plane. |
Shift | Run |
F | Toggle pointer-lock mouse-look. Release and your framing and zoom survive. |
1 | Shop |
2 | Garage |
3 | Pool Hub |
4 | Stats |
5 | Wallet |
B / O / N | Bench / 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.
| Demo | Live | |
|---|---|---|
| Save slot | tmg3d_v1 | tmg3d_live_v1 |
| Components | Simulated, free | Mirrors the NFTs your wallet actually holds |
| WATT | Simulated drip | Real WATT v2 balance |
| Earning | Simulated block rewards | On-chain only — the simulation is switched off |
| Shop | Simulated purchases | Real buyWithWatt / real free mint |
| Pool Hub | Fictional demo pools | Real 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.
| Coin | Derivation path | Address form |
|---|---|---|
| EVM (POL / ALT / WATT) | m/44'/60'/0'/0/0 | MetaMask-compatible |
| WTX (WATTxchain) | m/44'/22356'/0'/0/0 | base58, version 73 — W… |
| HTH | m/44'/5'/0'/0/0 | version 0x64 — h… |
| BITN | m/44'/9332'/0'/0/0 | version 0x19 — B… |
| BSV | m/44'/236'/0'/0/0 | version 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.
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.
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.
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.
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.
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.
- Open the Stake & Claim tab at stake.mining-game.wattxchange.app.
- Tick components and set quantities, then Stake selected — or stake one card at a time.
- Approve on demand.
MiningGameV3.stake()takes custody viasafeTransferFrom, so the items collection needssetApprovalForAllfirst. 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. - Claim whenever.
claimWatt()pays your accrued WATT; you pay only gas. The hero panel shows pending WATT and your total off-weight live. - Unstake per position. Each staked position has its own Unstake button.
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
- 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. - Open the Pool Hub — in the game (
3) or on pools.html. - 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. - Choose the coin. A pool offers a menu of payout coins; each rig picks one. The MINE button pops the pool's menu.
- 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. - Stop when you like.
stopMiningsettles what was consumed, returns the NFT, and pays out. Unused fuel is not consumed.
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:
| Pool | Coin | Backed by | Stratum |
|---|---|---|---|
| #0 | WTX | A WATTxchain staking delegation plus the merged-mining payout address — both staking and mined-block income feed the same pool | genesis-pool.wtx.wattxchange.app:3333 · TLS 4333 |
| #1 | BITN | A Bitnet PoS wallet; matured coinstakes are credited as they land | genesis-pool.bitn.wattxchange.app:3334 · TLS 4334 |
| #2 | ALT | An Altcoinchain validator delegation (PoS activates at block 7,200,000) | genesis-pool.alt.wattxchange.app:3336 · TLS 4336 |
| #3 | HTH | 10 Help The Homeless masternodes, 1,000,000 HTH collateral each | genesis-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.
What the stake buys you
- The right to create pools.
NodeMiningEngine.createPoolchecks thePoolRegistryfor an active registration with at least the required stake. - Free mining for your own rigs. A host may call
startMiningwithwattAmount == 0for 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
- 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.
- Open the Create a pool tab on pools.html, section 1 · Become a host.
- 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.
- Register + lock WATT. This approves 100,000 WATT v2 and calls
registerPoolWithNode. Your status flips to ACTIVE. - 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.
createPoolreturns 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.
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:
| Feeder | Reads | Used for |
|---|---|---|
validators | Native balance growth of an address | PoS validators, staking delegations, merged-mining payout addresses |
masternodes | Coinbase payouts to each proTxHash | HTH and other Dash-lineage masternodes |
stakers | Newly-matured coinstakes via listsinceblock | Qtum-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.
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.
| Chain | ClubBadge |
|---|---|
| WATTxchain 22356 | 0xf7E47Bd99554c14991682C7bE937d735Da93DfC8 |
| Altcoinchain 2330 | 0x80A0C4E85C95814287649F7Df558697ae411f2B8 |
| Polygon 137 | 0x20cb5AF1D352C5384c25F25777f34B4650906437 |
| Base 8453 | 0x430BFc6aF1b5fAAff104484A827d98D59EE31a6D |
| Optimism 10 | 0xf2DbF910aD1cA08c3879C72AE6277fA903E058c4 |
| Sonic 146 | 0xf2DbF910aD1cA08c3879C72AE6277fA903E058c4 |
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.
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.
- 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. - 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. - Complete after 30 days.
completeUnstakereturns your 100,000 WATT. Only then doesenforceRegistration(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.
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.
| Rail | Moves | Between | Mechanism | Trust |
|---|---|---|---|---|
| WATT omnichain | WATT v2 | ALT ⇄ Polygon | LayerZero OFT — burn on source, mint on destination | Our own DVN attests; supply conserved exactly |
| WATT ⇄ WTX desk | WATT v2 ⇄ native WTX | ALT/Polygon ⇄ WATTxchain | HTLC in-leg, watched deposits out-leg; AMM or supply-ratio mint pricing | Operated desk, refundable HTLC |
| WATT cross-EVM | WATT v2 | ALT ⇄ Polygon | Same desk, 1:1 minus fee, paid from float | Operated desk, refundable HTLC |
| ALT omnichain | native ALT | ALT ⇄ Polygon | LayerZero lockbox on ALT, mint/burn OFT on Polygon | Same mesh; escrow exactly backs supply |
| BSV attested | WATT + rig NFTs | EVM → Bitcoin SV | Burn to 0x…dEaD, oracle quorum releases from a fixed treasury | Bounded — treasury-capped, cannot steal |
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 2330 | Polygon 137 | |
|---|---|---|
| WATT v2 | 0xB7635E386283CAE6FB1A710f19CaA8220beF630D | 0x387693eCEC037C61943404F03c097d2ADA15ae3f |
| OFT adapter | 0x8ce709Af081031eA9e3C0E5E59b20E9c4A823894 | 0xBE9Fb3ee29C01d604F522765726C5A59573A77e4 |
| LZ EndpointV2 | 0x4cf8a62FFF13F2c0572023804d320918b963fab3 | 0x4cf8a62FFF13F2c0572023804d320918b963fab3 |
| Confirmations required | 6 (≈ seconds inbound) | 40 (≈ 20 min inbound) |
Sending
- Pick a direction and connect on the source chain.
- Enter an amount. The page quantises it for you — see the warning below.
- Approve WATT v2 for the adapter, then Send. Messaging fee is currently 0.
- 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 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.
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
| Direction | Your side | Desk side |
|---|---|---|
| WATT → WTX | Lock 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 → WATT | Send 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.
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.
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.
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).
| Side | Contract | Role |
|---|---|---|
| Altcoinchain 2330 | 0x435779bFa6959072Ea321f18Fcd2e98F68441294 | ALTNativeOFTAdapter — escrows native ALT |
| Polygon 137 | 0x8d4c8180b12c2b43ee63ac5050e8d0acece440ba | ALTOFT "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…dEaDthroughMiningGameBridgeOut, which emitsWattExited/NftExitedwith abridgeId = 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 thatmintBatches 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 ordinarypause().
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.
| Pair | Status | Path |
|---|---|---|
| ALT → WTX | Live | SwapinDEX → WattSwap migrate → desk AMM |
| POL ⇄ WATT · POL → WTX · WTX → POL | Live | QuickSwap + desk |
| WTX ⇄ WATT · ALT → WATT | Live | Desk (mint in, AMM out) |
| POL → ALT · WTX → ALT · WATT → ALT | Needs liquidity | Unlocks 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
| Contract | Address |
|---|---|
| MiningGameV3 (component staking) | 0x856f59F1729f6e107EbCD75d21c64AB897c5681f |
| GameConfigV3 | 0x50BAb538dB8558deE04314f87d9df33a42c61352 |
| MiningGameVault (proxy) | 0x72A716F62aCfF960f6F097B4c7909B2368eD3acA |
| Classic → v3 item migrator | 0x97BcC99ff34FA2cde929c97074011E8929F59679 |
| Items / shop multisig (2-of-3) | 0xc49699a99177a058439Ac7E3D2F5aF03d95e1D99 |
| HTLCVault (bridge desk) | 0x54117CAd2835B3D5B499f3acA03B1Ff643Af1955 |
| LayerZero EndpointV2 | 0x4cf8a62FFF13F2c0572023804d320918b963fab3 |
Polygon 137
| Contract | Address |
|---|---|
| WATT v2 | 0x387693eCEC037C61943404F03c097d2ADA15ae3f |
| WATT v1 (legacy) | 0xE960d5076cd3169C343Ee287A2c3380A222e5839 |
| WattSwap (v1 → v2) | 0x90a0906a7e01a65f48bd35741681088E3FA6729c |
| WATT OFT adapter | 0xBE9Fb3ee29C01d604F522765726C5A59573A77e4 |
| ALT OFT (bridged ALT) | 0x8d4c8180b12c2b43ee63ac5050e8d0acece440ba |
| MiningGameItems | 0x0CDbf4926a8EdFFaa803B96f8fa90B065DE19Eb2 |
| ItemShop | 0xeE6B67c3993884F1b693A4a66e952Bb563463131 |
| WattStakingPool | 0x7E8FC9d7D7588F410E1399aC690F901268B08a8d |
| CaseFreeMint | 0xc75504Cb57b26041655dDd739414C240Dd628e7a |
| PoolRegistry (v3) | 0xC65E46645EF9d7Bf1F7D526c9Fb4F4B54704d1DE |
| NodeMiningEngine (v3) | 0x8d372e3e1fbB82e707D09f782a1e3959DC447354 |
| PayoutHub (v3) | 0x8eC1Fa15A1DFB038396176a122ED2D385Ee04339 |
| MiningRigNFT | 0xf9F94e9fa744DE1209EF28321604a0Aa3B21a884 |
| 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
| Contract | Address |
|---|---|
| WATT v2 | 0xB7635E386283CAE6FB1A710f19CaA8220beF630D |
| WATT v1 (legacy) | 0x6645143e49B3a15d8F205658903a55E520444698 |
| WattSwap (v1 → v2) | 0xdFd07EBEEC3228D14b99f9f39EC71D884ABcbbF4 |
| WATT OFT adapter | 0x8ce709Af081031eA9e3C0E5E59b20E9c4A823894 |
| ALT native lockbox | 0x435779bFa6959072Ea321f18Fcd2e98F68441294 |
| MiningGameItems | 0x851fd0205348783444Fc9EDe99Ca2321681EC99b |
| ItemShop | 0x92809C4a46b4D0F11a48BE21fF13202EA56DcEB1 |
| WattStakingPool | 0xa3f8B04310380cD13Ec85B11420d1fc848af36C4 |
| CaseFreeMint | 0x91Ae9eDe6016AdF84c643F9Ce5Bb60A9438D792f |
| PoolRegistry (v3) | 0x88beBed99cb45D81F5DEd708682C55a2b26a221C |
| NodeMiningEngine (v3) | 0x755dCf18b521BC7e42f88fdfEBa2C910809AF09F |
| PayoutHub (v3) | 0x7Cee30E196Cb298e4634D7192C527dA37f2C7d57 |
| MiningRigNFT | 0x131A875e1bfEB2B3735E5d9Ad5e8871fF6CE9381 |
| 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
| Contract | Address |
|---|---|
| WATT v2 | 0xc4603E2582aE320857379819123dFbFd3093dcfa |
| WattSwap (v1 → v2) | 0x704f5eFcDE5EDD87e767Be78ba8FaA6fAb244bad |
| MiningGameItems | 0x9baaFDE958d0dE13043CBb4292e467EB00ED06B4 |
| ItemShop | 0x0239f289Cca84E7Bb899Fe065ba452293D501355 |
| WattStakingPool | 0xe9000a1ba29c3e87B4F964E9514eA4e8fd5d5749 |
| PoolRegistry | 0x3a02971ceAF9B817e770c36e393A95542bC65Df2 |
| PayoutHub | 0x9fAb0fBa9b458A7A0c9D60a26BC33f6E2695F179 |
| 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.
| Id | Item | Category | Hash | W | SW | Eff | Cool | Pwr | Luck | Price (WATT) |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Gaming PC | PC | 2 | 5 | 1 | — | — | — | — | Free mint |
| 2 | Genesis Badge | Badge | 0 | 0 | 42 | 10 | — | — | 10 | 20,000 |
| 3 | XL1 Processor | CPU | 10 | 2 | 9 | — | — | — | — | 200 |
| 4 | TX120 GPU | GPU | 20 | 10 | 11 | — | — | — | — | 700 |
| 5 | GP50 GPU | GPU | 33 | 16 | 18 | — | — | — | — | 1,200 |
| 8 | TX190 GPU | GPU | 60 | 22 | 30 | — | — | — | — | 6,000 |
| 9 | XL190 CPU | CPU | 35 | 8 | 22 | — | — | — | — | 4,500 |
| 10 | GP720 GPU | GPU | 110 | 38 | 48 | — | — | — | — | 14,000 |
| 11 | GPX880 GPU | GPU | 180 | 60 | 75 | — | — | — | — | 30,000 |
| 12 | XXL270 CPU | CPU | 70 | 15 | 40 | — | — | — | — | 12,000 |
| 13 | Bit Hammer ASIC | ASIC | 320 | 110 | 120 | — | — | — | — | 60,000 |
| 14 | Mining Rig Frame | Frame | 0 | 0 | 10 | — | — | — | — | 8,000 |
| 17 | Red Mouse | Peripheral | 0 | 0 | 0 | — | — | — | 2 | 2,500 |
| 18 | RGB Keyboard | Peripheral | 0 | 0 | 0 | — | — | — | 2 | 3,500 |
| 19 | Server Tower | Structure | 0 | 0 | 40 | — | — | — | — | 20,000 |
| 23 | LC23 Monitor | Peripheral | 0 | 0 | 0 | — | — | — | 2 | 5,000 |
| 24 | Gaming Chair | Peripheral | 0 | 0 | 0 | — | — | — | 3 | 5,000 |
| 25 | Shipping Container | Structure | 0 | 0 | 0 | — | — | — | — | 50,000 |
| 26 | Warehouse | Structure | 0 | 0 | 0 | — | — | — | — | 250,000 |
| 40–47 | Power Upgrade Lv1–8 | Upgrade | Raises the farm's power cap | 400 · 1,100 · 2,600 · 6,000 · 14,000 · 32,000 · 70,000 · 160,000 | ||||||
| 50–57 | Cooling Upgrade Lv1–8 | Upgrade | Lowers the thermal coefficient | 350 · 900 · 2,200 · 5,200 · 12,000 · 28,000 · 60,000 · 130,000 | ||||||
| 60–61 | Rack Expansion Lv1–2 | Structure | More GPUs per framed rig | 1,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 id | Coin | Kind | Payout address form |
|---|---|---|---|
| 0 | ALT — Altcoinchain | Hybrid PoW/PoS | Your connected EVM address |
| 1 | WTX — WATTxchain | Hybrid PoW/PoS | base58 W… — must be registered |
| 2 | POL — Polygon | PoS | Your connected EVM address |
| 3 | BSV — Bitcoin SV | PoW | BSV ordinals address — must be registered |
| 4 | HTH — Help The Homeless | Masternode | h… — must be registered |
| 5 | BITN — Bitnet | PoS | B… — 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).
| # | Algorithm | Origin | Hardware |
|---|---|---|---|
| 0 | SHA256D | Bitcoin | ASIC |
| 1 | Scrypt | Litecoin | ASIC / GPU |
| 2 | Ethash | Ethereum Classic | GPU |
| 3 | RandomX | Monero | CPU |
| 4 | Equihash | Zcash | GPU / ASIC |
| 5 | X11 | Dash | ASIC / GPU |
| 6 | kHeavyHash | Kaspa | GPU / 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
| Term | Meaning |
|---|---|
| WATT | The game's fuel and reward token. v1 is the immutable 2022 original; v2 is the role-gated replacement. 1:1, always. |
| Component / item | An ERC-1155 token — a case, CPU, GPU, ASIC, frame, structure, peripheral, badge or upgrade. |
| Rig | An ERC-721 built from components. Rigs mine; components stake. |
| Powered off | A staked component minting WATT by stake weight. Costs nothing to hold. |
| Powered on | A rig mining in a pool, burning WATT as fuel. 99 % burned, 1 % to the host. |
| Effective power | hashRate × efficiency × 100 / wattConsumption. Your share of a pool. |
| Stake weight | What powered-off staking pays on. Gaming PC 1, Genesis Badge 42, XL1 9, TX120 11, GP50 18. |
| Target | A payout coin registered on the PayoutHub at runtime, with a kind: PoW, PoS, Masternode or Hybrid. |
| Host | Someone who locked 100,000 WATT v2 and may open pools. Earns 1 % of burns plus their fee, and mines free. |
| PayoutHub | The contract holding each target's balance, each miner's running credit, and each miner's non-EVM payout address. |
| NodeMiningEngine | The contract that splits reported deposits by effective power and settles WATT fuel. |
| Operator daemon | The off-chain service that reads real node income, reports it on-chain, and pushes payouts. Pays all the gas. |
| OFT | LayerZero's Omnichain Fungible Token — burn on source, mint on destination, one supply. |
| DVN | Decentralised Verifier Network — the party that attests a LayerZero packet. Ours is self-hosted. |
| HTLC | Hash Time-Locked Contract. Your bridge deposit is always refundable if the desk does not pay. |
| 1Sat Ordinal | Data inscribed permanently on Bitcoin SV against a single satoshi. All game art lives this way. |
| BSV-21 | The Bitcoin SV fungible-token standard. WATT and the five classic rigs exist as BSV-21 tokens. |
| Superstaker | A WATTxchain node accepting delegated stake for a fee. Minimum self-stake 20,000 WTX. |