#
      ###
     #####
    #######
      ###
     #####
    #######
   #########
     #####
    #######
   #########
  ###########
       #
       #

RUN YOUR OWN MINER

cli · gpu · anything that speaks keccak256

The browser tab is the easy way in. But anything works: the contract accepts a valid nonce from any software. Here is everything you need to build a faster miner.

The contract doesn't care what software you mine with.

LEVEL 0 · THIS TABzero setup
01Go back to the homepage, connect a wallet, press MINE.
02That's it. Your CPU cores mine in Web Workers; a found solution is sent by your own wallet.

Good for phones, laptops, and trying things out. For real hashrate, read on.

LEVEL 1 · CLI MINERnode · zero npm deps
01Install Node.js 18+ and Foundry (the miner signs its mining tx with cast):
# node: nodejs.org or your package manager, then:
curl -L https://foundry.paradigm.xyz | bash && foundryup   # installs cast
02Grab the reference miner (two files, no dependencies) right from this site:
curl -O http://this-host/miner/miner.mjs
curl -O http://this-host/miner/keccak.mjs
03Point it at the chain with a dedicated wallet key and run:
RPC_URL=https://rpc.mainnet.chain.robinhood.com \
PRIVATE_KEY=0x<fresh-wallet-key> \
CONTRACT=0x<contract-address> \
node miner.mjs
04Watch it hash. On a hit it submits mint(nonce, digest) with the 0.00005 ETH mining cost attached automatically, pays a few cents of L2 gas, and the reward lands on your address.

The reference miner is pure JS (~tens of kH/s) — a correctness baseline, not a race car. It re-checks the challenge every couple of seconds and refreshes automatically when someone else mines.

LEVEL 2 · BUILD A FAST ONEthe full spec

Everything the contract checks, byte for byte. Port the loop to GPU / SIMD / whatever you have:

01Read the current work: challengeNumber() → bytes32, miningTarget() → uint256.
02Build an 84-byte message: challenge(32) ‖ yourAddress(20) ‖ nonce(32) — packed, no ABI padding.
03A nonce wins iff uint256(keccak256(message)) ≤ miningTarget.
04Submit mint(uint256 nonce, bytes32 digest) where digest is your winning hash — payable, attach MINT_PRICE() (0.00005 ETH; it becomes contract-locked pool liquidity). Selector: 0x1801fbe5.
05On every mine (yours or not) the challenge rotates — subscribe to the Mint event or poll challengeNumber() and restart your sweep.
06Roughly every 100th mine the contract auto-deposits the accrued mining payments into the pool as locked liquidity — the crossing miner just pays a bit more gas. (A permissionless seedLiquidity() exists as a backup.)
Pre-check for freecheckMintSolution(nonce, you) — view
One mine per blocksecond mine in a block reverts
Retargetevery 128 mines · max 4× per cycle
Mining cost0.00005 ETH → locked liquidity
Pace~1 mine / 3 s network-wide

Expected work per mine = 2²⁵⁶ / miningTarget hashes. More hashrate wins more often, but the retarget keeps the network pace fixed — you're competing for share, not raising the ceiling. Existing open-source EIP-918 GPU miners (0xBitcoin family) adapt by changing the packed-message layout to the 84 bytes above.

[!] Use a burner, not your treasury. Mine with a fresh wallet that holds a little ETH for gas and nothing else. The miner needs the key to sign its mining tx — never feed it a key that guards real funds.