$TAB is an ERC-20 token on Base that distributes 90% of its supply exclusively through browser-based proof-of-work mining. Any device with a browser can mine — no GPU, no staking, no presale allocation. Open a tab, earn $TAB.
Users submit a proof-of-work nonce that, when hashed with their personal challenge, falls below the current difficulty threshold. A Uniswap V4 self-hook captures swap fees for the contract; liquidity is permanently locked after pool seeding.
Most token launches front-load value to insiders: team allocations, VC rounds, pre-mine, or airdrop lists. $TAB has none of these. The only way to earn $TAB at launch is to run computation — a browser tab running a keccak256 loop.
Base's 2-second block times make browser mining practical. A single mint takes roughly 60 seconds — fast enough to feel rewarding, slow enough to prevent spam. Phones, laptops, and desktop CPUs all compete on equal footing; no specialised hardware exists for keccak256 at this scale.
The Uniswap V4 self-hook creates a sustainable fee loop: every swap on the TAB/ETH pool returns 1% to the contract. The deployer can claim these fees, funding ongoing development without holding any pre-minted supply.
Each address has a unique, deterministic challenge derived on-chain. The challenge changes after every successful mint by that address, preventing nonce reuse and making front-running meaningless (a stolen nonce is invalid against a different address).
A valid proof satisfies:
Where challenge is a bytes32 and nonce
is a uint256. The ABI encoding is a flat 64-byte buffer:
challenge in bytes 0–31, nonce right-aligned in bytes 32–63.
Mining runs entirely in the browser via a Rust → WebAssembly module compiled with
wasm-pack. A Web Worker runs batches of 50,000 hashes per tick,
yielding between batches via setTimeout(tick, 0) so the UI stays
responsive. Expected throughput: 1–3 MH/s on a modern CPU core.
Once a valid nonce is found, the user calls mine(nonce) on the contract.
The contract re-executes the hash verification on-chain. If valid, it mints the
current era reward to the caller and updates the challenge for that address.
| Allocation | Amount (TAB) | % | Notes |
|---|---|---|---|
| Genesis Sale | 1,050,000 | 5% | 0.01 ETH / 1,000 TAB · no minimum · max 5,000 TAB per tx |
| LP Seed (locked) | 1,050,000 | 5% | Paired with genesis ETH proceeds into Uniswap V4 · LP NFT burned to 0x000…dEaD |
| Mining Rewards | 18,900,000 | 90% | Distributed by proof-of-work · halving every 100,000 mints |
| Team / VC / Airdrop | 0 | 0% | — |
Halving continues every 100,000 mints until the 21,000,000 TAB hard cap is reached. After Era 64, the reward rounds to zero and mining ceases permanently.
Difficulty adjusts every epoch to target one global mint per 30 blocks (~60 seconds on Base). If mining is faster, difficulty increases; if slower, it decreases.
| Parameter | Value | Rationale |
|---|---|---|
| EPOCH_BLOCKS | 600 | 600 × 2s = 20 min epochs |
| TARGET_BLOCKS_PER_MINT | 30 | 30 × 2s = 60s per global mint |
| Initial difficulty | 2^224 − 1 | type(uint256).max >> 32 |
At initial difficulty, the expected number of hashes to find a valid nonce is approximately 232 ≈ 4.3 billion. At 1–3 MH/s in a browser tab, this takes 24–72 minutes for a single miner. As more miners join, difficulty rises to maintain the 60-second global target.
The genesis sale is a fixed-price window that bootstraps the initial liquidity pool. It is not a fundraise — every wei raised goes directly into the Uniswap V4 pool, paired with an equal allocation of TAB, and the LP NFT is immediately burned.
| Parameter | Value |
|---|---|
| Genesis cap | 1,050,000 TAB (5% of supply) |
| Price | 0.01 ETH per 1,000 TAB |
| Total raise (if sold out) | 10.5 ETH |
| Max per transaction | 5,000 TAB (5 units) |
| Minimum buy | None (1 unit = 1,000 TAB) |
| Overpayment handling | Excess ETH refunded on-chain |
The mining challenge is address-specific. A stolen nonce submitted from a different
address will fail on-chain. Base uses a centralised sequencer (Coinbase) with no
public mempool, further reducing front-running surface. For additional protection,
the Flashbots Protect Base endpoint can be used when submitting mine().
All state-mutating functions are protected with OpenZeppelin's
ReentrancyGuard.
The contract is deployed via the Arachnid CREATE2 factory
(0x4e59b44847b379578588920ca78fbf26c0b4956c).
forge create --create2 silently ignores the flag in current tooling
and deploys via regular CREATE — always use raw calldata via cast send
to the factory.
controller is set to tx.origin in the constructor.
It can call claimFees() only. It cannot mint tokens, change supply,
or modify the pool. If the controller key is lost, fees accumulate in the contract
permanently — this is acceptable, not catastrophic.
| Constant | Value | Notes |
|---|---|---|
| TOTAL_SUPPLY | 21,000,000 TAB | Hard cap, matches Bitcoin's symbolic 21M |
| MINING_SUPPLY | 18,900,000 TAB | 90% — all PoW distribution |
| GENESIS_CAP | 1,050,000 TAB | 5% |
| GENESIS_LP | 1,050,000 TAB | 5% — paired with genesis ETH in V4 pool |
| GENESIS_PRICE | 0.01 ETH | Per 1,000-token unit |
| MAX_UNITS_PER_TX | 5 | Max 5,000 TAB / 0.05 ETH per tx |
| BASE_REWARD | 100 TAB | Era 1 reward per mint |
| ERA_MINTS | 100,000 | Mints before halving |
| TARGET_BLOCKS_PER_MINT | 30 | ~60s on Base (2s blocks) |
| EPOCH_BLOCKS | 600 | ~20 min difficulty window |
| LP_FEE | 0 | Hook collects swap fees instead |