WATTx documentation
The operator manual. How to run a node, mine on any of seven algorithms, merge-mine WATTx alongside the chain you already mine, stake and delegate, deploy contracts to the EVM, inscribe ordinals, and talk to every public endpoint.
The whitepaper explains why WATTx is built this way. This explains how to use it.
What WATTx is
WATTx is a hybrid Proof-of-Work / Proof-of-Stake blockchain with a UTXO ledger and a full Ethereum Virtual Machine layered over it, built on a QTUM Core foundation. Three things make it unusual:
- Seven mining algorithms in one chain. SHA256d, Scrypt, Ethash, RandomX, Equihash, X11 and kHeavyHash all produce valid WATTx blocks, each with its own independent difficulty. Whatever hardware you own — ASIC, GPU or CPU — there is a lane for it.
- Merged mining with every one of them. If you already mine Bitcoin, Litecoin, Monero, Dash, Zcash, Kaspa, Ethereum Classic or Altcoinchain, you can point the same work at WATTx and earn on both chains for no additional energy.
- PoW and PoS compete for the same blocks. There is no fixed split. The 50 WTX subsidy goes whole to whoever produced the block, so emission divides between mining and staking exactly in proportion to how much each side actually contributes.
On top of that sit an EVM for Solidity contracts, a UTXO layer that carries ordinal inscriptions, offline staking with delegation, and a trust-tier system that pays reliable validators more.
WATTx has a UTXO layer (coins, staking, ordinals) and an EVM account layer (contracts, tokens). A contract call is a UTXO transaction carrying a special output that the EVM executes. This is inherited from QTUM's Account Abstraction Layer, and it is the single most important thing to understand before you write tooling — see Smart contracts.
Network specifications
| Parameter | Value | Notes |
|---|---|---|
| Consensus | Hybrid PoW / PoS | Both produce blocks; no split within a block |
| Mining framework | X25X | 7 algorithms, independent difficulty each |
| Block time | 120 seconds | nPowTargetSpacing = 120 |
| Block subsidy | 50 WTX | Paid whole to the block's producer |
| Halving interval | 210,000 blocks | ≈ 9.7 months at 120 s |
| Maximum supply | 21,000,000 WTX | 50 × 210,000 × 2 — Bitcoin's geometric schedule |
| Coinbase maturity | 100 blocks | ≈ 3.3 hours |
| Stake maturity | 500 blocks | Dynamic — halves with every reward halving |
| Super staker minimum | 20,000 WTX | nMinValidatorStake |
| Offline staking | From block 1 | Delegation available since genesis |
| Smart contracts | EVM / Solidity ≤ 0.8.x | London, Shanghai, Cancun and Pectra all active from genesis |
| Token standards | QRC-20, QRC-721 | Byte-compatible with ERC-20 / ERC-721 |
| P2P port | 3888 | |
| RPC port | 3889 | |
| Premine | None | No ICO, no founder allocation, fair launch from block 0 |
Some older material quotes a 10 WTX reward, a 1,051,200-block halving and a 1-block coinbase maturity.
Those are testnet or pre-launch values. The figures above were read out of
src/kernel/chainparams.cpp on the mainnet build and cross-checked against a live node.
Activation schedule
| Milestone | Height | Status |
|---|---|---|
| Genesis — pure PoW | 0 | Active |
| Offline staking / delegation | 1 | Active |
| X25X multi-algorithm activation | 2,000 | Active |
| Per-algorithm difficulty retarget | 2,000 | Active |
| PoS difficulty fix (16-second stake mask, 4× convergence) | 2,000 | Active |
| Coinbase maturity v2 | 2,500 | Active |
| PoW → hybrid PoW/PoS transition | 5,000 | Active |
| AuxPoW merged mining | 210,000 | Scheduled |
| RandomX native activation | 210,000 | Scheduled |
| FCMP privacy | 210,000 | Scheduled |
| Shielded coinbase | 210,100 | Scheduled |
Ethereum hard forks — Muir Glacier, London, Shanghai, Cancun and Pectra — plus every QIP and the standard BIPs are all active from genesis, so the EVM is current from block 0.
Public endpoints
| Service | Endpoint | Protocol |
|---|---|---|
| EVM JSON-RPC | https://rpc-wtx.wattxchange.app | Ethereum JSON-RPC over an adapter. Read-only for external callers — see Smart contracts. |
| UTXO & ordinals API | https://ord-api.wattxchange.app | REST, CORS open |
| Public merged-mining stratum | pools.wattxchange.app:3333 | Stratum, RandomX lane |
| Explorer | https://wtx-explorer.wattxchange.app | Web |
The public pool advertises RandomX on 3333 only. The other six algorithm ports were closed after a real incident: an algorithm with no sustained hashrate drifts to the difficulty floor, and at the floor a phone can sweep full-reward blocks for almost no work — one did, for about 224 WTX on the SHA256d lane. The block subsidy is not coupled to difficulty, so this is a fairness and cheap-reorg problem rather than an inflation one. A port is re-opened when its algorithm has committed baseline hashrate behind it. Run your own merged pool (below) if you want the other six now.
Running a node
Download the release for your platform. The
Linux and macOS archives contain wattxd (daemon), wattx-cli (RPC client) and
wattx-qt (graphical wallet); Windows ships wattx-qt.exe with its DLLs. Android has
an APK; iOS is in progress.
# start the daemon
./wattxd -daemon
# follow the sync
./wattx-cli getblockchaininfo
./wattx-cli getconnectioncount
# stop cleanly — always do this rather than killing the process
./wattx-cli stop
RandomX ships as a shared object next to the binary, so run the daemon from its own directory with
LD_LIBRARY_PATH=. if you started it from elsewhere:
LD_LIBRARY_PATH=. ./wattxd -daemon. A daemon that exits immediately with a missing
librandomx.so is this and nothing else.
What good looks like
$ ./wattx-cli getblockchaininfo
{
"chain": "main",
"blocks": 20136,
"headers": 20136,
"difficulty": 110063.59,
"moneysupply": 914595,
"verificationprogress": 1,
"initialblockdownload": false,
"pruned": false
}
blocks == headers and initialblockdownload: false means you are synced.
moneysupply is the circulating WTX.
Seven algorithms racing for the same block slots means WATTx reorganises far more often than a single-algorithm chain — typically every 50 to 150 blocks, and usually one block deep. Anything that indexes WATTx must handle reorgs by finding the real common ancestor and replaying from there. An indexer that assumes a linear chain will silently lose data; ours did exactly that until it was fixed.
Configuration
~/.wattx/wattx.conf on Linux, %APPDATA%\WATTx\wattx.conf on Windows,
~/Library/Application Support/WATTx/wattx.conf on macOS.
# --- rpc ---
server=1
rpcuser=wattxrpc
rpcpassword=<long random string>
rpcport=3889
rpcbind=127.0.0.1
rpcallowip=127.0.0.1
# --- network ---
listen=1
port=3888
# --- staking ---
staking=1
# reservebalance=0
# --- optional indexes (needed by explorers and some APIs) ---
# txindex=1
# addressindex=1
# logevents=1 # EVM logs — required for eth_getLogs style queries
| Flag | Use it when |
|---|---|
-daemon | Running headless |
-datadir=<path> | Keeping several chains or wallets side by side |
-txindex=1 | You need getrawtransaction for arbitrary transactions |
-logevents=1 | You need EVM event logs — required for contract log queries |
-reindex | One-shot repair after a corrupt block index. The chain is small, so this takes seconds, not hours |
-rpcwallet=<name> | Several wallets loaded; every wallet RPC needs to be told which |
addressindex=1 is not enough on its own
Setting it in the config does not retroactively populate it, so getaddressbalance and
getaddressutxos answer "No information available" on a node that was not reindexed
with it. Either reindex, or use scantxoutset, which works for any address with no index at
all. Our public UTXO API takes the second route.
Addresses and wallets
Address formats
| Form | Looks like | Derivation | Used for |
|---|---|---|---|
| Legacy P2PKH | W… (base58, version 73) | m/44'/22356'/0'/0/0 | Coins, staking, delegation, contract calls |
| SegWit | wx1q… | bech32, hrp wx | Coins, ordinal funding |
| Taproot | wx1p… | m/86'/22356'/0'/0/0 | Ordinal inscriptions |
| EVM | 0x… (20 bytes) | HASH160(pubkey) of your legacy key | Contract identity |
A WATTx EVM address is HASH160(pubkey) — the same 20 bytes as your legacy W…
address. It is not keccak(pubkey)[12:], which is what Ethereum and MetaMask use. So an
Ethereum-derived address is a syntactically valid recipient on WATTx and utterly unspendable: it has no
UTXO-layer counterpart, no key that can sign for it, and no rescue path. An ERC-721 minted to a MetaMask
address on WATTx is frozen forever. We learned this by freezing a badge.
Always derive your WATTx EVM address from a WATTx key — the desktop wallet, the browser
extension and the Mining Game's HD wallet all do this correctly. fromhexaddress /
gethexaddress convert between the two forms.
Wallets
| Wallet | Platform | Does |
|---|---|---|
| wattx-qt | Linux, Windows, macOS | Full node, built-in miner, staking and delegation UI, contract deploy and call, built-in Solidity compiler |
| WATTx Mobile | Android (iOS soon) | Light client, sending, delegation, QR |
| WATTx Wallet extension | Chrome (MV3) | Self-custody WTX, ordinal inscription, window.wattx provider for dApps, and contract transactions from the browser |
| Mining Game HD wallet | In-game | One BIP-39 seed → payout addresses for WTX, HTH, BITN, BSV and EVM |
All of them derive WTX at m/44'/22356'/0'/0/0 with base58 version 73, so one seed opens the
same wallet everywhere.
# create an address
./wattx-cli getnewaddress "label"
# what is its EVM form?
./wattx-cli gethexaddress "WYourAddress…"
# and back
./wattx-cli fromhexaddress "0x…"
# is this address mine?
./wattx-cli validateaddress "WYourAddress…"
Backups
./wattx-cli backupwallet "/path/to/wallet-backup.dat"
./wattx-cli walletpassphrasechange "old" "new" # encrypt first if you have not
A staking node has to hold its wallet unlocked, so it is a hot wallet by definition. Keep the bulk of your coins in cold storage and delegate — delegation never moves your coins.
Hybrid PoW/PoS consensus
Blocks can be produced by a miner or by a staker. They compete for the same slots and the subsidy is not split — the whole 50 WTX goes to whoever produced that block.
That design choice matters: it means the PoW/PoS emission ratio is not a governance parameter anybody chose, it is an emergent measurement of how much each side actually contributes. If staking participation collapses, miners produce more blocks and earn more; if hashrate leaves, stakers do.
Combined difficulty
Combined = PoW_Difficulty^0.6 × PoS_Difficulty^0.4
where PoS_Difficulty = 100 / staking participation rate
Both mechanisms feed the network's security number, with PoW weighted slightly higher to keep mining worthwhile.
What an attacker has to do
Compromise both sides at once. Renting hashrate is not enough while stakers keep producing blocks, and acquiring stake is not enough while miners keep producing them. Add seven independent algorithm difficulties and there is no single hardware market deep enough to rent a majority from.
Block selection
When a PoW and a PoS solution appear together, the first valid block a majority of nodes receives wins. Ordinary nakamoto tie-breaking — but combined with seven algorithms it is also why reorgs are frequent on WATTx.
X25X — seven algorithms, one chain
Active since block 2,000. Each algorithm keeps its own independent difficulty, so hashrate arriving or leaving on one lane never disturbs the others.
| # | Algorithm | Hardware | Type | Chains you may already be mining |
|---|---|---|---|---|
| 0 | SHA256d | ASIC | Hash | Bitcoin, Bitcoin Cash, Bitnet, any SHA256d chain |
| 1 | Scrypt | ASIC / GPU | Memory-hard | Litecoin, Dogecoin, Flopcoin, Trollcoin |
| 2 | Ethash | GPU | Memory-hard | Ethereum Classic, Altcoinchain, EGAZ, Octaspace |
| 3 | RandomX | CPU | CPU-optimised | Monero, Etica |
| 4 | Equihash | GPU / ASIC | Memory-hard | Zcash, Horizen, BitcoinZ |
| 5 | X11 | ASIC / GPU | Chained hash | Dash, DigiByte, Help The Homeless |
| 6 | kHeavyHash | GPU / ASIC | Matrix-heavy | Kaspa |
Why seven
- Hardware inclusivity. Three hardware classes, seven lanes — no one hardware type can monopolise block production, and a CPU owner is not competing against an ASIC farm.
- Difficulty isolation. Per-algorithm retargeting means a hashrate migration on one lane cannot stall the chain on another.
- Merged-mining reach. Seven algorithms covers virtually every major PoW chain in existence, which is what makes AuxPoW more than a nice idea.
Per-algorithm difficulty is the right design and it has one sharp edge: an algorithm with no miners retargets down to the floor, and because the block subsidy is fixed rather than proportional to work, a trivial amount of hashing on an empty lane earns a full-reward block. That has happened. The durable fixes are a per-algorithm minimum difficulty floor, or coupling reward to work — both consensus changes. Until one ships, the operational mitigation is not to publish a lane with no baseline hashrate behind it.
Mining
Solo, from the node
./wattx-cli getnewaddress "mining"
./wattx-cli generatetoaddress 1 "WYourAddress…"
./wattx-cli getmininginfo
wattx-qt has the same thing behind a button. Solo CPU mining will find blocks on a young
chain and essentially never on a mature one — use a pool or merge-mine.
Pool mining
Point any miner that speaks the algorithm's usual stratum dialect at a WATTx-compatible pool. The public pool runs the RandomX lane:
# RandomX, e.g. xmrig
xmrig -o pools.wattxchange.app:3333 -u WYourWTXAddress -p x -a rx/0
# generic stratum form
stratum+tcp://pools.wattxchange.app:3333
The stratum speaks the wire protocol each algorithm's miners expect — the XMRig login/job/submit dialect
on RandomX, Bitcoin's mining.subscribe / mining.authorize /
mining.submit on SHA256d, Scrypt and X11, eth_getWork / eth_submitWork
on Ethash, and the nheqminer Zcash-stratum format on Equihash. Existing miners work unmodified.
Use your WATTx W… address as the stratum username. There is no account to register.
Which lane should you mine?
| You own | Lane | Realistic outcome |
|---|---|---|
| A CPU | RandomX | The only lane with sustained public hashrate. Real competition, real difficulty. |
| A SHA256d ASIC | SHA256d, merged with Bitcoin or Bitnet | Best return per watt in the system — you were mining anyway. |
| A GPU | Ethash or Equihash, merged with ETC/Altcoinchain or BitcoinZ | Dual-earning proven on both. |
| A Scrypt / X11 / kHeavyHash ASIC | That lane, merged with Litecoin / Dash / Kaspa | Dual-earning proven on all three. |
If you already mine anything on a supported algorithm, merged mining is strictly better than mining WATTx directly — same hardware, same power, two payouts.
AuxPoW merged mining
Do the work once, get paid on two chains. All seven X25X algorithms support merged mining, and it has been proven end-to-end on real parent chains for every one of them.
How it works
- Commit. You build a parent-chain block whose coinbase (or, for chains without a spendable coinbase, whose designated commitment field) contains a hash commitment to the WATTx block you want to produce.
- Mine it normally. Nothing about the parent chain's mining changes. Your hardware, your pool software, your usual work.
- Find a solution. When you find one good enough for the parent chain, you have also — for free — found one good enough for WATTx, because WATTx's difficulty is lower.
- Submit both. The parent solution goes to the parent chain. The AuxPoW proof — the parent header, the commitment and the merkle branch linking them — goes to WATTx.
- WATTx verifies it canonically. It recomputes the parent chain's own proof-of-work with the real algorithm, and checks that the parent block commits to the exact WATTx block being submitted. One share, two blocks.
Proven parent chains
| Algorithm | Parent proven | Notes |
|---|---|---|
| SHA256d | Bitcoin, Bitnet | Real bitcoind-accepted parent blocks alongside WATTx AuxPoW blocks |
| Scrypt | Litecoin | Real litecoind-accepted parent blocks |
| RandomX | Monero | Real keccak and CryptoNote tree hashing, monerod-accepted |
| X11 | Dash | Canonical X11 vendored into consensus |
| Ethash | Altcoinchain, Ethereum Classic | Trustless: the parent's extraData must commit to the exact WATTx block |
| Equihash | BitcoinZ (Zhash 144,5 and 48,5) | Consensus verifies the Wagner solution canonically |
| kHeavyHash | Kaspa | Canonical cSHAKE256 + matrix PoW with keyed-blake2b, cross-validated against kaspad byte for byte |
Each algorithm's proof is checked by recomputing that chain's actual proof-of-work inside WATTx consensus, and by verifying that the parent block's commitment binds to the specific WATTx block. There is no path where a parent header that did not really commit to your WATTx block is accepted, and a zero-hash or malformed proof fails closed rather than open. This was not free — earlier builds had fail-open holes on the Ethash, RandomX and Equihash paths, and each one was a free-block vulnerability until it was closed.
The point of it
WATTx does not want its own dedicated hashrate. It wants a slice of the hashrate that already exists. Every ASIC pointed at Bitcoin, every GPU on Ethereum Classic, every CPU on Monero can add its work to WATTx for zero marginal energy — and in return WATTx pays those miners to keep smaller networks alive rather than concentrating on the largest chain. A miner who merge-mines does not have to choose between the big chain and the small one.
Running a merged-mining pool
The daemon has a merged stratum built in. It polls each configured parent chain for work, builds a combined job, serves it on that algorithm's port in that algorithm's native wire protocol, and submits solutions to both chains.
./wattx-cli startmultimergedstratum '<json config>'
./wattx-cli getmergeminingdashboard
./wattx-cli stopmultimergedstratum
Ports are assigned from a base in algorithm order:
| Offset | Algorithm | Miner protocol |
|---|---|---|
| base + 0 | RandomX | XMRig — login / job / submit |
| base + 1 | SHA256d | Bitcoin stratum |
| base + 2 | Scrypt | Bitcoin stratum |
| base + 3 | Ethash | eth_getWork / eth_submitWork |
| base + 4 | Equihash | Zcash stratum (nheqminer) |
| base + 5 | X11 | Bitcoin stratum |
| base + 6 | kHeavyHash | Kaspa |
Per-chain share gates
One share difficulty cannot serve a SHA256d ASIC and a RandomX CPU at the same time, so each parent-chain
entry takes its own optional share_nbits or share_difficulty overriding the
pool-wide value. Set them per lane or your CPU miners will never submit anything and your ASICs will drown
you.
Configuration applies at daemon start. Stopping and restarting the stratum does not reload it — restart the daemon.
Kaspa timestamps are milliseconds. Divide by 1000 before the aux time-window check, or every kHeavyHash proof is rejected as out of range.
Equihash needs equihash_n and equihash_k per chain. BitcoinZ mainnet
is 144,5; the 48,5 parameters are a different chain entirely.
Ethash merged mining is trustless — the parent's extraData must commit to the exact WATTx
block — which means the parent node must seal a header byte-identical to the one the stratum job was
built from. Because the parent's sealing header churns on every recommit, the stratum keeps a job per
seal-hash rather than per parent height. Even done correctly there is a structural ceiling around 70–80 %:
the parent commits to the WATTx tip as of its last recommit, and if the WATTx tip advances before the
parent seals, that committed block is stale. That is inherent to trustlessly merge-mining a chain whose
blocks are faster than the parent's recommit interval.
The 1 % pool fee
Merged-mining pools in the WATTx ecosystem contribute a 1 % fee that funds the Mining Game economy. That is what makes the game's rewards backed by real mining revenue rather than by token emission — and it is why the game exists at all.
Solo staking
- Hold WTX in a wallet you control. Any amount stakes; more stakes proportionally more often.
- Wait for maturity. A UTXO must have 500 confirmations and must not have moved during that window. At 120-second blocks that is about 16.7 hours. The threshold halves at every reward halving.
- Unlock for staking only.
The trailing./wattx-cli walletpassphrase "YOUR_PASSPHRASE" 99999999 truetrueis what makes it staking-only: the wallet can sign coinstakes but cannotsendtoaddress. That is the flag you want on an always-on node. - Check it is working.
Look for./wattx-cli getstakinginfostaking: trueand a non-zeroweight. Compareweighttonetstakeweight— that ratio is roughly your share of PoS blocks. - Stay online. A staking node that is offline when its coin's turn comes simply misses it.
Stake weight = Σ (mature UTXO values)
A UTXO is mature when confirmations ≥ 500 and it has not moved in that window.
Almost always the wallet is locked, or locked without the staking-only flag. Note also that a staking-only unlock cannot send — so if a service on that node needs to pay out, it needs a full unlock at send time. Plan for that before you arm anything automated.
Delegation and super stakers
Offline staking has been active since block 1. You delegate your staking rights to a super staker; your coins never move and never leave your wallet.
As a delegator
# delegate to a super staker, agreeing to their fee (percent)
./wattx-cli setdelegateforaddress "<superStakerAddress>" <fee> "<yourAddress>" <gasLimit> <gasPrice>
# check it landed
./wattx-cli getdelegationinfoforaddress "<yourAddress>"
# undo it
./wattx-cli removedelegationforaddress "<yourAddress>" <gasLimit> <gasPrice>
- Non-custodial. The delegation is a contract record, not a transfer. Nobody can spend your coins.
- Any amount. There is no delegator minimum.
- Cold-storage compatible. Your keys can stay air-gapped; only the hot super staker node is online.
- Rewards land on your address, minus the super staker's fee.
As a super staker
./wattx-cli setsuperstaker "<yourAddress>" true
./wattx-cli listsuperstakercustomconfig
./wattx-cli getstakinginfo
- 20,000 WTX minimum self-stake (
nMinValidatorStake). - Run 24/7. Uptime is what your trust tier — and therefore your multiplier — is measured on.
- Publish your fee and keep it stable. Delegators can leave in one transaction.
Accepting delegations requires the address index, which on some builds triggers a full reindex. Plain solo staking needs no index at all. If you only want to stake your own coins, do not turn on superstaking.
Trust tiers
PoS networks have a lazy-validator problem: a node that is offline half the time still earns roughly in proportion to its stake, so there is no economic pressure to be reliable. Trust tiers add that pressure.
| Tier | Uptime | Multiplier |
|---|---|---|
| Bronze | 95 % | 1.0× |
| Silver | 97 % | 1.25× |
| Gold | 99 % | 1.5× |
| Platinum | 99.9 % | 2.0× |
Uptime is measured over rolling windows and tiers move dynamically — this is a continuously earned status, not a badge you keep. A Platinum validator earns double a Bronze one on the same stake, which is a large enough gap to justify real infrastructure: a UPS, a monitored host, an automatic restart. That is exactly the intent.
Tokenomics
The dual halving
Every halving does two things at once. It halves the block reward, controlling inflation — and it halves the staking maturity requirement, widening access.
| Era | Height | Reward | Stake maturity | ≈ |
|---|---|---|---|---|
| 0 | 0 | 50 WTX | 500 blocks | 16.7 hours |
| 1 | 210,000 | 25 WTX | 250 blocks | 8.3 hours |
| 2 | 420,000 | 12.5 WTX | 125 blocks | 4.2 hours |
| 3 | 630,000 | 6.25 WTX | 62 blocks | 2.1 hours |
| 4 | 840,000 | 3.125 WTX | 31 blocks | 1 hour |
| 5 | 1,050,000 | 1.5625 WTX | 15 blocks | 30 minutes |
The reasoning is progressive decentralisation. Early on, a high barrier selects for committed stakers and gives the young chain its security. Later, as the reward per block shrinks, the barrier shrinks with it and security comes from breadth of participation instead of depth of individual commitment. In the final eras maturity is near-instant.
Fair launch
Zero premine. No ICO, IEO or IDO. No founder allocation. Every WTX in existence was mined or staked, starting at block 0.
Smart contracts (EVM)
Full EVM, Solidity up to 0.8.x, QRC-20 and QRC-721 tokens that are byte-compatible with ERC-20 and ERC-721. Every Ethereum hard fork through Pectra is active from genesis. What is different is how a transaction reaches the EVM.
The Account Abstraction Layer
A WATTx contract transaction is a UTXO transaction carrying a special output script. Three opcodes carry the EVM payload:
| Opcode | Byte | Script shape |
|---|---|---|
OP_CREATE | 0xc1 | OP_4 <gasLimit> <gasPrice> <bytecode> OP_CREATE |
OP_CALL | 0xc2 | OP_4 <gasLimit> <gasPrice> <data> <address20> OP_CALL |
OP_SPEND | 0xc3 | Contract spending its own funds |
The sender is recovered from the input scriptSig, which is why contract calls must
spend legacy P2PKH inputs — and why the contract's view of "who called me" is
HASH160(pubkey), your legacy address as 20 bytes.
From the CLI
# deploy
./wattx-cli createcontract "<bytecode-hex>" [gasLimit] [gasPrice] [senderAddress]
# read-only call — free, no transaction
./wattx-cli callcontract "<contractAddr>" "<data-hex>"
# state-changing call, optionally sending WTX
./wattx-cli sendtocontract "<contractAddr>" "<data-hex>" <amount> [gasLimit] [gasPrice] [senderAddress]
# what happened?
./wattx-cli gettransactionreceipt "<txid>"
./wattx-cli searchlogs <fromBlock> <toBlock> # needs -logevents=1
wattx-qt has a built-in Solidity compiler and a contract UI; you can also compile with
solc and deploy the bytecode from the CLI.
MetaMask, Rabby and every other Ethereum wallet produce Ethereum-style signatures over an Ethereum
transaction. WATTx needs a UTXO transaction with an AAL output, signed with the UTXO key. An adapter can
present an Ethereum JSON-RPC surface and re-sign through a node wallet, which is how
rpc-wtx.wattxchange.app serves reads — but it cannot sign for your key. Anything that
needs a user to sign a contract transaction must go through
the WATTx wallet extension or the node wallet.
The EVM adapter's eth_call does not faithfully simulate msg.value or
reverts, so a simulation that looks fine can still revert on chain. Use the UTXO-side
gettransactionreceipt instead — it carries excepted and
exceptedMessage with the actual revert string.
block.chainid is 81, not 22356
The RPC adapter reports chain id 22356 so wallets and tooling can distinguish WATTx, but the
EVM's own block.chainid is 81. Anything that has to agree with on-chain state — most
importantly EIP-712 signatures — must use 81. Signing a typed-data domain with 22356
produces a signature that every contract on WATTx will reject. Read a contract's real domain with
eip712Domain() (0x84b0196e) rather than assuming. This cost us one reverted
100,000-WTX mint before we found it.
eth_accounts returns null, so provider.getSigner() throws "accounts is
not iterable". Construct the signer explicitly against a known address instead
(new JsonRpcSigner(provider, address) in ethers v6).
tx.wait() is unreliable — the adapter re-hashes transactions and can synthesise
phantom replacement transactions from UTXO change outputs. To confirm a deploy, scan blocks for your exact
creation calldata rather than waiting on a hash.
Receipts can also carry a badly checksummed address. Always re-checksum with
getAddress(addr.toLowerCase()) before using it, or ethers throws.
EVM from the browser
The WATTx Wallet extension is the answer to "MetaMask cannot do WATTx". It already holds UTXO keys and signs UTXO transactions, so it can build the AAL output itself.
It injects a window.wattx provider. Install it, then:
// connect — returns UTXO addresses and the derived EVM address
const acct = await window.wattx.connect();
// { addresses: {...}, evm: "0x…" }
// the caller identity a contract will see
const from = await window.wattx.getEvmAddress();
// a state-changing contract call
const txid = await window.wattx.sendToContract({
to: "0xContractAddress",
data: "0xa9059cbb…", // abi-encoded calldata
value: 0, // WTX in satoshi
gasLimit: 250000, // default
gasPrice: 40 // satoshi, default
});
// deploy
const { txid, address } = await window.wattx.deployContract({ bytecode: "0x60806040…" });
// ordinals
await window.wattx.inscribe({ contentType: "image/png", dataBase64, toAddress });
// plain coins
await window.wattx.sendWTX({ to: "wx1q…", amount: 100000000 });
Security model
- Per-origin connect grants are persisted; every inscription raises a fresh confirmation window showing content type, size and estimated cost.
- Every contract transaction raises its own approval screen.
createWallet,importWalletandexportBackupare locked tochrome-extension://senders — a web page can never call them.- The origin is taken from the browser's
sender, never from the page's claim about itself. - Keys are BIP-39; the create flow forces you through writing the phrase down before it shows you the wallet. Encryption at rest is still on the list.
Ordinals and the UTXO API
WATTx carries ordinal inscriptions on its UTXO layer, using the same commit/reveal envelope shape as
Bitcoin ordinals. Inscribe from the wallet extension, from
nft.wattxchange.app, or from the wattx-ord CLI.
The public API
GET https://ord-api.wattxchange.app/health
GET /address/:addr/utxo # works for W…, wx1q… and wx1p…
GET /address/:addr/balance
GET /tx/:txid # includes raw hex (needed for nonWitnessUtxo)
POST /tx {"hex":"…"} # broadcast
GET /inscription/:id # raw content, served with its own content-type
GET /inscriptions # block-scan discovery
GET /ord/inscriptions # rich index: owner, transfers, size
GET /ord/inscription/:id
GET /ord/address/:addr
GET /ord/content/:id
GET /ord/status
CORS is open, so a browser dApp can call it directly. It uses scantxoutset rather than the
address index, which means it works against any node with no reindex — at the cost of scanning the UTXO set
per query, which is fine on a chain this young.
The wattx-ord CLI and the wallet extension emit the content-type tag as OP_1
(0x51) with the body tag as a pushed 0x00; some other builders emit
01 01 plus a bare OP_0. An indexer that parses only one form silently finds
zero inscriptions on a chain that has them. Accept both.
WATTx reorganises every 50–150 blocks. An indexer whose reorg path wipes its state but rewinds only a
few blocks will erase the very range that held the data and never rescan it — and it will look perfectly
healthy, reporting indexedHeight at tip with zero results. Keep a rolling window of block
hashes, find the true common ancestor, and replay from there. A full rescan of the chain takes about 25
seconds, so there is no reason to cut corners.
Privacy
FCMP privacy transactions Block 210,000
Full-chain membership proofs bring shielded transactions to the base layer, with shielded coinbase following at block 210,100. Shielded outputs mature after 10 blocks; shielded coinbase outputs after 100.
Stealth addresses
The sender derives a one-time address from the recipient's public key. Only the recipient can detect and spend it, and every payment lands on a distinct, unlinked address — so a published address never becomes a public transaction history.
Cross-chain privacy pools
Deposit USDT on Ethereum, BSC or Polygon in fixed denominations (100, 1K, 10K, 100K). The deposit locks in that chain's pool contract; a LayerZero message creates a shielded commitment on WATTx in a 20-level incremental merkle tree. You generate a zero-knowledge proof off-chain and withdraw to any supported chain. Fixed denominations defeat amount correlation, the proof establishes validity without revealing the deposit, and withdrawing on a different chain breaks single-chain analysis outright.
WATTxSecret Live
secret.wattxchain.org — AES-256-GCM encryption performed entirely in your browser, self-destructing messages with configurable expiry (1–30 days) and view limits (1–10 views), no server-side storage, no cookies, no analytics. The key never leaves your machine, which means we could not read your messages even if we were asked to.
Ecosystem
ANS — WATTx Name Service Planned
Human-readable .wtx names mapping to addresses, contracts and IPFS content, resolved natively
in wallets and dApps.
Bridges
WTX moves to and from the EVM world through a bridge desk, and WATT — the Mining Game's token — moves between EVM chains over a self-hosted LayerZero mesh.
| Rail | Moves | Between | Mechanism |
|---|---|---|---|
| WTX ⇄ WATT desk | native WTX ⇄ WATT v2 | WATTx ⇄ Altcoinchain / Polygon | HTLC in-leg on the EVM side, watched deposits on the WTX side. Priced by a virtual AMM over real reserves, or minted at the circulating-supply ratio. |
| WATT omnichain | WATT v2 | Altcoinchain ⇄ Polygon | LayerZero OFT — burn on source, mint on destination, one supply |
| ALT omnichain | native ALT | Altcoinchain ⇄ Polygon | Native lockbox on ALT, mint/burn OFT on Polygon |
| Privacy pools | USDT | Ethereum / BSC / Polygon ⇄ WATTx | LayerZero message + ZK withdrawal proof |
Use them at bridge.wattxchange.app. The desk publishes live quotes and a route finder:
GET https://bridge.wattxchange.app/api/info
GET https://bridge.wattxchange.app/api/prices
GET https://bridge.wattxchange.app/api/quote?direction=WTX_TO_WATT&amount=100&dest=0x…
GET https://bridge.wattxchange.app/api/route?from=WTX&to=POL&amount=100
Users cannot sign transactions on the WATTx EVM — the compatibility layer re-signs through the node wallet — so WTX has to move on the UTXO layer, and the two legs cannot be atomically linked. The design compensates where it can: the EVM leg is a real HTLC with your refund path always intact, the desk pays the WTX side first and only then claims your lock, and it refuses to touch a lock with less than six hours left on it.
The desk needs three confirmations. If WATTx has stopped producing blocks, the deposit cannot reach them and the desk waits rather than paying. It publishes the chain tip age and shows a banner when the tip is more than fifteen minutes old, so a mining stall reads as a network pause rather than a stuck swap. Funds are refundable throughout, and it pays automatically once blocks resume.
Full bridge documentation, including every contract address, lives in the Mining Game docs.
The Mining Game
The Mining Game is where WATTx's mining economy becomes something you can hold. It is an NFT mining-rig builder whose rewards are funded by real node income — including the 1 % fee from merged mining pools.
- Collect component NFTs — cases, processors, GPUs, ASICs, frames — and assemble them into rigs.
- Point a rig at a pool. The pool is backed by a real validator, masternode or staking node; whatever that node earns is split among the pool's miners by effective power and paid out on-chain.
- Components you are not mining with can be staked powered-off to mint WATT; rigs that are mining burn WATT as fuel, 99 % destroyed and 1 % to the pool host.
- Lock 100,000 WATT and you can host your own pool, turning your node's income into a game economy — and your own rigs then mine for free.
- WTX is a first-class payout coin (target id 1), and WTX bridges to WATT through the desk.
RPC reference
Everything below is wattx-cli <command>, or a JSON-RPC POST to
http://127.0.0.1:3889 with your rpcuser / rpcpassword.
curl -s --user "$RPCUSER:$RPCPASS" -H 'content-type: application/json' \
http://127.0.0.1:3889/ \
--data '{"jsonrpc":"2.0","id":1,"method":"getblockchaininfo","params":[]}'
Chain and blocks
| Command | Does |
|---|---|
getblockchaininfo | Height, difficulty, money supply, sync state |
getblockcount · getbestblockhash | Tip height and hash |
getblock <hash> [verbosity] | A block. Verbosity 2 includes full transactions |
getblockhash <height> | Hash at a height |
getrawtransaction <txid> [verbose] | Needs -txindex=1 for arbitrary transactions |
sendrawtransaction <hex> | Broadcast |
scantxoutset start '[…]' | UTXOs for any descriptor — no index required |
getconnectioncount · getpeerinfo | Network health |
Mining
| Command | Does |
|---|---|
getmininginfo | Difficulty, hashrate, block template state |
generatetoaddress <n> <addr> | Solo-mine n blocks |
getblocktemplate | Work for external miners |
startmultimergedstratum '<json>' | Start the built-in merged-mining stratum on all configured algorithms |
stopmultimergedstratum | Stop it. Configuration changes need a daemon restart, not a stratum restart. |
getmergeminingdashboard | Per-algorithm port, parent chain, job and share state |
Staking and delegation
| Command | Does |
|---|---|
getstakinginfo | staking, weight, netstakeweight, expected time |
walletpassphrase "<pass>" <seconds> true | Unlock for staking only — cannot send |
setsuperstaker <addr> true | Accept delegations at that address |
listsuperstakercustomconfig | Your super staker configuration |
setdelegateforaddress <staker> <fee> <you> <gasLimit> <gasPrice> | Delegate. Your coins never move |
getdelegationinfoforaddress <addr> | Who you delegate to, and at what fee |
removedelegationforaddress <addr> <gasLimit> <gasPrice> | Undelegate |
listsinceblock <hash> | New wallet activity, including matured coinstakes |
Smart contracts
| Command | Does |
|---|---|
createcontract <bytecode> [gasLimit] [gasPrice] [sender] | Deploy |
callcontract <addr> <data> | Read-only, free |
sendtocontract <addr> <data> <value> [gasLimit] [gasPrice] [sender] | State-changing |
gettransactionreceipt <txid> | Receipt with excepted / exceptedMessage — the way to debug a revert |
searchlogs <from> <to> [addresses] [topics] | EVM logs — needs -logevents=1 |
getaccountinfo <addr> | Contract balance, storage and code |
gethexaddress · fromhexaddress | Convert between W… and 0x… |
Wallet
| Command | Does |
|---|---|
getnewaddress ["label"] · getbalance | The basics |
listunspent [minconf] | Your UTXOs. Note it omits locked outputs |
lockunspent <unlock> [outputs] [persistent] | Keep coin selection away from reserved UTXOs, across restarts |
sendtoaddress <addr> <amount> | Needs a full unlock, not a staking-only one |
validateaddress <addr> | Valid, and is it mine |
backupwallet <path> | Do this |
listreceivedbyaddress <minconf> … true | Includes zero-confirmation receipts — how a service spots an incoming deposit early |
EVM JSON-RPC
https://rpc-wtx.wattxchange.app speaks Ethereum JSON-RPC —
eth_blockNumber, eth_call, eth_getBalance,
eth_getTransactionReceipt and friends — so ethers.js and web3.js can read WATTx contracts
normally. It cannot sign for your key; see Smart contracts.
curl -s https://rpc-wtx.wattxchange.app \
-H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'
Troubleshooting
The daemon exits immediately
Missing librandomx.so. Run it from its own directory with LD_LIBRARY_PATH=..
getstakinginfo says staking: false
The wallet is locked, or unlocked without the staking-only flag. Run
walletpassphrase "<pass>" 99999999 true — the trailing true is the whole
point.
A staking node cannot send
Correct, and deliberate. A staking-only unlock signs coinstakes and nothing else. A full unlock is needed at send time.
getaddressbalance returns "No information available"
addressindex=1 in the config does not backfill. Reindex, or use
scantxoutset.
My indexer says it is synced but shows nothing
Its reorg path wiped the state without rewinding far enough. See Ordinals.
My EIP-712 signature is rejected as a bad signature
You signed with chain id 22356. The EVM's block.chainid is 81. Read the contract's
real domain with eip712Domain().
provider.getSigner() throws "accounts is not iterable"
The adapter's eth_accounts returns null. Construct the signer explicitly against a known
address.
tx.wait() hangs or resolves on the wrong transaction
The adapter re-hashes transactions and can synthesise phantom replacements from change outputs. Confirm a deploy by scanning blocks for your exact creation calldata.
"bad address checksum" from a receipt
Receipts can carry badly checksummed addresses. Re-checksum from lowercase before use.
An NFT I minted cannot be transferred
It went to an Ethereum-derived address. That address is unsignable on WATTx and there is no rescue. See Addresses — this is the one mistake with no undo.
The node is stuck on a corrupt block index
One-shot -reindex. The chain is small; it takes seconds.
Merged-mining config changes do not take effect
Stopping and starting the stratum does not reload configuration. Restart the daemon.
Glossary
| Term | Meaning |
|---|---|
| WTX | WATTx's native coin. |
| WATT | The Mining Game's ERC-20 fuel and reward token on Polygon, Altcoinchain and WATTx. Distinct from WTX. |
| X25X | WATTx's seven-algorithm mining framework, each algorithm with its own difficulty. |
| AuxPoW | Auxiliary proof-of-work. Work done on a parent chain counted as WATTx work — merged mining. |
| Parent chain | The chain you were already mining, whose blocks carry the WATTx commitment. |
| AAL | Account Abstraction Layer — the UTXO output that carries an EVM call or deploy. |
| OP_CREATE / OP_CALL | The script opcodes (0xc1 / 0xc2) that carry EVM payloads. |
| QRC-20 / QRC-721 | WATTx's token standards. Byte-compatible with ERC-20 / ERC-721. |
| Coinstake | The special transaction a staking node produces when it wins a PoS block. |
| Stake maturity | Confirmations a UTXO needs before it can stake. 500 today, halving with each reward halving. |
| Super staker | A node with ≥ 20,000 WTX self-stake that accepts delegations for a fee. |
| Delegation | Assigning staking rights to a super staker. Non-custodial — your coins never move. |
| Trust tier | Bronze / Silver / Gold / Platinum — an uptime-earned reward multiplier from 1.0× to 2.0×. |
| FCMP | Full-chain membership proofs — base-layer shielded transactions, activating at block 210,000. |
| Stealth address | A one-time address derived from the recipient's public key; only they can spend it. |
| Ordinal / inscription | Data written permanently into a UTXO's witness and tracked as a transferable artifact. |
| Combined difficulty | PoW^0.6 × PoS^0.4 — the chain's real security number. |