Reference
Reference page revised: all four fact-check refutations corrected from source (TICKER_COUNT is internal with no getter, five test stand-ins not two, retired decks keep an already-expired endCycle, the
title: Reference order: 10 summary: Every constant, address, term, revert and retired claim, each with the contract line that decides it. #
Every number, address, term and revert in these docs lives on this page. The other nine pages link here instead of restating. Contracts win over the Python engine and over site copy; a row that cannot be traced to a contract line does not ship.
Verified against contracts at commit 28200d4, Robinhood testnet 46630, deployed 2 Sep 2026 (deploy/testnet-addresses.md:1-4). Paths are relative to the repo root, written in full once (contracts/src/MinersNFT.sol, contracts/src/MinePool.sol, contracts/src/CardTraits.sol, contracts/script/Deploy.s.sol, contracts/interfaces/IMinePool.sol, contracts/interfaces/IMinersNFT.sol, app/web/src/app/deck/DeckApp.tsx, app/web/src/app/mint/MintApp.tsx) and short after that.
Constants #
Two contracts hold every economic number and neither has a setter. MinersNFT owns the mint and the cards. MinePool owns the mine. Every value below is a bytecode constant, except CYCLE_SECONDS, set at deploy. Constants appear by name here and by value everywhere else.
| Constant | Value | Unit | Contract | Setter | Owning page | Source |
|---|---|---|---|---|---|---|
| TABLE_SUPPLY | 5,040 | cards | MinersNFT | No | Mint | MinersNFT.sol:41 |
| UNIQUE_COUNT | 10 | cards | MinersNFT | No | Sealed cards | MinersNFT.sol:42 |
| TRANCHE_SIZE | 500 | mints | MinersNFT | No | Mint | MinersNFT.sol:43 |
| TRANCHE_COUNT | 10 | tranches | MinersNFT | No | Mint | MinersNFT.sol:44 |
| GTD_WINDOW | 30 | min | MinersNFT | No | Mint | MinersNFT.sol:46 |
| MAX_PER_TX | 100 | cards per call (no per-wallet cap) | MinersNFT | No | Mint | MinersNFT.sol:48 |
| ROYALTY_BPS | 500 | bps (5%) | MinersNFT | No | Money | MinersNFT.sol:51 |
| MAX_TIER | 9 | tier | MinersNFT | No | Merge | MinersNFT.sol:53 |
| MAX_STARS | 6 | stars | MinersNFT | No | Merge | MinersNFT.sol:54 |
| TIMELOCK_DELAY | 48 | h | MinersNFT | No | Money | MinersNFT.sol:57 |
| EMISSION_DIVISOR | 28 | each vein pays 1/28 of its balance per roll (about 3.57%) | MinePool | No | Cycles | MinePool.sol |
| BURN_TARGET_BPS | 1,500 | bps (15%) | MinePool | No | Shifts | MinePool.sol |
| STALE_AFTER | 2 | h | MinePool | No | Cycles | MinePool.sol:50 |
| PRICE_BAND_BPS | 2,000 | bps (+-20%) | MinePool | No | Cycles | MinePool.sol:52 |
| MAX_DECK_CARDS | 128 | cards | MinePool | No | Decks | MinePool.sol:54 |
| TIMELOCK_DELAY | 48 | h | MinePool | No | Money | MinePool.sol:59 |
| TICKER_COUNT | 3 | veins; internal constant, no getter | MinePool | No | Cycles | MinePool.sol:63 |
| CYCLE_SECONDS | 21,600 | s (6 h), set at deploy, read live from CYCLE_SECONDS() | MinePool | No | Cycles | MinePool.sol:73,202; Deploy.s.sol:118 |
Tranche price table #
Ten price steps keyed to mint order. The $CARDS column starts at 20,000 and multiplies by 1.08 each step, rounded to whole $CARDS; every one of them is burned. A flat $2.00 in every tranche is the ETH leg, frozen to wei at 2,500 USD/ETH (MinersNFT.sol:217-218). Before mainnet it is re-frozen at the live rate, so read it live from mintPrice(mintNo). Cumulative burn is derived and lands on 146,464,700 $CARDS at sellout, 14.65% of the 1 B supply (app/api/engine/economy.py:250-257).
| Tranche | Mint numbers | $CARDS per card (burned) | ETH leg (USD) | ETH leg (ETH, frozen at 2,500 USD/ETH; set at deploy, read live from mintPrice()) | Cumulative $CARDS burned (derived) | Source |
|---|---|---|---|---|---|---|
| 1 | 1 to 500 | 20,000 | $2.00 | 0.0008 | 10,000,000 | MinersNFT.sol:224,236 |
| 2 | 501 to 1,000 | 21,600 | $2.00 | 0.0008 | 20,800,000 | MinersNFT.sol:225,237 |
| 3 | 1,001 to 1,500 | 23,328 | $2.00 | 0.0008 | 32,464,000 | MinersNFT.sol:226,238 |
| 4 | 1,501 to 2,000 | 25,194 | $2.00 | 0.0008 | 45,061,000 | MinersNFT.sol:227,239 |
| 5 | 2,001 to 2,500 | 27,210 | $2.00 | 0.0008 | 58,666,000 | MinersNFT.sol:228,240 |
| 6 | 2,501 to 3,000 | 29,387 | $2.00 | 0.0008 | 73,359,500 | MinersNFT.sol:229,241 |
| 7 | 3,001 to 3,500 | 31,737 | $2.00 | 0.0008 | 89,228,000 | MinersNFT.sol:230,242 |
| 8 | 3,501 to 4,000 | 34,276 | $2.00 | 0.0008 | 106,366,000 | MinersNFT.sol:231,243 |
| 9 | 4,001 to 4,500 | 37,019 | $2.00 | 0.0008 | 124,875,500 | MinersNFT.sol:232,244 |
| 10 | 4,501 to 5,040 (540 cards) | 39,980 | $2.00 | 0.0008 | 146,464,700 | MinersNFT.sol:233,245,251-256 |
Addresses #
Five rows are test stand-ins. MockCards stands in for the Pons $CARDS token and MockStockRouter for the real router (Deploy.s.sol:84,88). The three MockStock tokens tSPY, tNVDA and tSPCX stand in for the verified mainnet stock tokens, which have no testnet code (Deploy.s.sol:85-87; deploy/mainnet-config.md:5-15). Nothing reads from the 30 Aug deploy (MinersNFT 0xA33d...2d73, MinePool 0xddE7...484c); it is invalid (deploy/testnet-addresses.md:51-52).
| Contract | Address (testnet, set at deploy) | Real or stand-in | Explorer | Source |
|---|---|---|---|---|
| MinersNFT | 0xB6e6aCC4936f2568112B4cD87D51783d8931De75 | Real | read contract | deploy/testnet-addresses.md:13 |
| MinePool | 0x523C6fD0DBd17B7F08F4e6650301157BE5643292 | Real | read contract | deploy/testnet-addresses.md:14 |
| CARDS (MockCards) | 0x9f4182c0079457c8D82a0f4e42cc53C9C4115b70 | Test stand-in (MockCards) for the Pons $CARDS token | read contract | deploy/testnet-addresses.md:15; Deploy.s.sol:84 |
| Keeper / Owner | 0x63B4f25429489dc2ff64D10506c1807C541B6367 | Deployer address on testnet | address | deploy/testnet-addresses.md:16 |
| Router (MockStockRouter) | 0x781A603FeA223634df68BECc07a8a5869561bF34 | Test stand-in (MockStockRouter); StockRouterV3 into the Renie V3 pools on mainnet | read contract | deploy/testnet-addresses.md:17; Deploy.s.sol:88 |
| tSPY | 0xCF58AA27e72B9f2862e6aad426E4b6a9141e202B | Test stand-in (MockStock) | read contract | deploy/testnet-addresses.md:18; Deploy.s.sol:85 |
| tNVDA | 0x62c77b56cac58E749487800000bbEB4e3045c00E | Test stand-in (MockStock) | read contract | deploy/testnet-addresses.md:19; Deploy.s.sol:86 |
| tSPCX | 0x9067ed2a4848c637E8d495B69952aab37CE734FF | Test stand-in (MockStock) | read contract | deploy/testnet-addresses.md:20; Deploy.s.sol:87 |
| Explorer / RPC | https://explorer.testnet.chain.robinhood.com / https://rpc.testnet.chain.robinhood.com | Testnet | deploy/testnet-addresses.md:3-4 | |
| Mainnet, chainId 4663 | set at deploy, published at launch | Real; stock token addresses verified (deploy/mainnet-config.md:5-13) | docs/MINE-PLAN.md:236-237; deploy/mainnet-config.md:5-13 |
Verify it on-chain Open the read-contract tab of MinersNFT and call
mintPrice(1),trancheIndex(5040),totalMinted(),SEED_COMMITMENT(),MINT_START(),REVEAL_DEADLINE(),GTD_MERKLE_ROOT()andTREASURY(). On MinePool callCYCLE_SECONDS(),currentCycle(),cycleEndTime(),lastCardsPrice(),totalWeight(),keeper()andpool(0). Every constant in Table 10.1 except TICKER_COUNT is a public getter of the same name, soMAX_PER_TX()returns 100,EMISSION_DIVISOR()returns 28 andBURN_TARGET_BPS()returns 1,500 (MinersNFT.sol:41-57; MinePool.sol).requiredBond(deckId, nCycles)returns the $CARDS a deck must hold beforebuyShiftswill sell itnCycles. TICKER_COUNT is internal, so count the threepool(t)slots instead (MinePool.sol:63).
Elements and one-of-ones #
Element index order is permanent because it feeds the hash. Each element owns 252 consecutive ids, so element, design and edition are readable from the id before reveal (CardTraits.sol:25,72-78). Ids 5,041 to 5,050 are the one-of-ones, tier 9, 6 stars, design 63, minted to TREASURY (CardTraits.sol:66-70; MinersNFT.sol:140-144).
| Index | Element | Table ids | One-of-one id | Source |
|---|---|---|---|---|
| 0 | Void | 1 to 252 | 5,041 | CardTraits.sol:25,66-70,130 |
| 1 | Thunder | 253 to 504 | 5,042 | CardTraits.sol:131 |
| 2 | Moon | 505 to 756 | 5,043 | CardTraits.sol:132 |
| 3 | Sun | 757 to 1,008 | 5,044 | CardTraits.sol:133 |
| 4 | Bleeding | 1,009 to 1,260 | 5,045 | CardTraits.sol:134 |
| 5 | Defense | 1,261 to 1,512 | 5,046 | CardTraits.sol:135 |
| 6 | Heal | 1,513 to 1,764 | 5,047 | CardTraits.sol:136 |
| 7 | Cloud | 1,765 to 2,016 | 5,048 | CardTraits.sol:137 |
| 8 | Attack | 2,017 to 2,268 | 5,049 | CardTraits.sol:138 |
| 9 | Earth | 2,269 to 2,520 | 5,050 | CardTraits.sol:139 |
| 10 | Sound | 2,521 to 2,772 | CardTraits.sol:140 | |
| 11 | Water | 2,773 to 3,024 | CardTraits.sol:141 | |
| 12 | Soul | 3,025 to 3,276 | CardTraits.sol:142 | |
| 13 | Fire | 3,277 to 3,528 | CardTraits.sol:143 | |
| 14 | Plant | 3,529 to 3,780 | CardTraits.sol:144 | |
| 15 | Poison | 3,781 to 4,032 | CardTraits.sol:145 | |
| 16 | Demon | 4,033 to 4,284 | CardTraits.sol:146 | |
| 17 | Light | 4,285 to 4,536 | CardTraits.sol:147 | |
| 18 | Charm | 4,537 to 4,788 | CardTraits.sol:148 | |
| 19 | Slime | 4,789 to 5,040 | CardTraits.sol:149 |
Formulas and the weight matrix #
One chain runs from a card to a payout. The middle column carries worked examples B and C, the same deck on every page. Amounts settle as decimals on-chain; dust stays in the vein.
card weight = 2^(tier-1) x (1 + 0.25 x stars) T2 1-star: 2 x 1.25 = 2.5 MinePool.sol:247
set bonus = x1.15 at 5 distinct designs of one 5 Moon designs: 12.5 x 1.15 = 14.375 MinePool.sol:758-764
element, x1.35 at 15, x1.6 at 40, x2.0 at 63
deck weight = sum over elements (card weights x bonus) 5.75 + 14.375 = 20.125 MinePool.sol:252-259
cost weight = deck weight without one-of-ones 20.125 MinePool.sol:249
share = deck weight / totalWeight 20.125 / 1,000 = 2.0125% MinePool.sol
emission = 1/28 of each vein per roll 0.357143 + 0.178571 + 0.535714 = 1.071429 ETH MinePool.sol
pending = share x emission, per vein 0.007188 + 0.003594 + 0.010781 = 0.021563 ETH MinePool.sol
cost = emission sum x 15% / price, 0.160714 ETH / 2,750 gwei = 58,441.6 $CARDS; MinePool.sol
spread over totalCostWeight x 0.020125 = 1,176.1 $CARDS (example price)
required bond= (vein balances / 28) x 15% x cost share requiredBond(B, 1) = 2,352.2 $CARDS (IDLE: n + 1); MinePool.sol
/ last price x cycles; buyShifts floor requiredBond(B, 4) = 5,880.5 $CARDS; else BondBelowMinimum
bond rule = burn min(bond, cost); 3,000 bonded: burn 1,176.1, 1,823.9 stays; MinePool.sol
fraction = bond / cost when short 1,000 bonded: burn 1,000, fraction 0.8502, retired
payout = pending x fraction; clip back to its vein 0.021563 ETH, or 0.018333 ETH MinePool.sol
paid as = each vein's share swapped into its stock tokenised SPY, NVDA, SPCX via StockRouterV3 MinePool.sol; StockRouterV3.sol
| Tier (base) | 0 stars (x1.00) | 1 star (x1.25) | 2 stars (x1.50) | 3 stars (x1.75) | 4 stars (x2.00) | 5 stars (x2.25) | 6 stars (x2.50) | Source |
|---|---|---|---|---|---|---|---|---|
| T1 (1) | 1 | 1.25 | 1.5 | 1.75 | 2 | 2.25 | 2.5 | MinePool.sol:247 |
| T2 (2) | 2 | 2.50 | 3.0 | 3.50 | 4 | 4.50 | 5.0 | MinePool.sol:247 |
| T3 (4) | 4 | 5.00 | 6.0 | 7.00 | 8 | 9.00 | 10.0 | MinePool.sol:247 |
| T4 (8) | 8 | 10.00 | 12.0 | 14.00 | 16 | 18.00 | 20.0 | MinePool.sol:247 |
| T5 (16) | 16 | 20.00 | 24.0 | 28.00 | 32 | 36.00 | 40.0 | MinePool.sol:247 |
| T6 (32) | 32 | 40.00 | 48.0 | 56.00 | 64 | 72.00 | 80.0 | MinePool.sol:247 |
| T7 (64) | 64 | 80.00 | 96.0 | 112.00 | 128 | 144.00 | 160.0 | MinePool.sol:247 |
| T8 (128) | 128 | 160.00 | 192.0 | 224.00 | 256 | 288.00 | 320.0 | MinePool.sol:247 |
| T9 (256) | 256 | 320.00 | 384.0 | 448.00 | 512 | 576.00 | 640.0 | MinePool.sol:247 |
Deck states #
A deck is in one of three states, read from deckInfo(deckId) and currentCycle(). The app shows three labels, IDLE, WORKING and RETIRED. A retired deck keeps its cards locked until you unbind.
| State | Condition | Can buyShifts | Can claim | Can unbind | Cards locked | App label | Source |
|---|---|---|---|---|---|---|---|
| Passive | endCycle < currentCycle, retired false | Yes, starts at currentCycle + n | Yes | Yes, once nothing is pending | Yes | IDLE | IMinePool.sol:53-54; MinePool.sol:112-116,267-268,307 |
| Active | endCycle >= currentCycle | Yes, extends by n | Yes | No, DeckStillActive | Yes | WORKING | MinePool.sol:313-322,335 |
| Retired | retired true; if the deck was still scheduled, its remaining schedule is dropped (endCycle = currentCycle - 1) | Yes, clears the flag | Yes | Yes, once nothing is pending | Yes | RETIRED | IMinePool.sol:62-63; MinePool.sol:311,456-461,523-534 |
Glossary #
Each term gets one line. The app's vocabulary is forge, START MINING, bond, shift, claim and merge, and the docs use the same words (DeckApp.tsx:441-448,611-617,625-637).
| Term | Definition | App label | Owning page | Source |
|---|---|---|---|---|
| Tranche | One of ten price steps of 500 mint numbers; the last is 540 | Tranche k / 10 | Mint | MinersNFT.sol:43-44,251-256 |
| Cycle | The mine-wide six-hour period closed by a roll; cycles start at 1 | CYCLE #n | Cycles | MinePool.sol:73,206 |
| Shift | One scheduled cycle of work for one deck; n bought is n+1 worked from passive | Add bond | Shifts | MinePool.sol:283-325 |
| Vein | One of the three ETH balances the mine pays from, SPY, NVDA, SPCX; every deck works all three | SPY, NVDA, SPCX | Cycles | IMinePool.sol:31-35; MinePool.sol:261 |
| The mine | MinePool, as a place and as the contract | The mine is open | Cycles | MinePool.sol:42 |
| Deck | 1 to 128 of your cards bound as one unit with bindDeck | Deck #id | Decks | MinePool.sol:54,214-218 |
| Bond | $CARDS locked on a deck as prepayment for cost; it must cover the required bond before a shift is sold | Bond left | Shifts | MinePool.sol |
| Required bond | requiredBond(deckId, nCycles): the estimated cost of the cycles bought, vein balances / 28 x 15% x the deck's cost-weight share / last price x nCycles; buyShifts reverts below it | Bond needed | Shifts | MinePool.sol |
| Cost | $CARDS a working deck accrues each roll and burns at claim; mine-wide target 15% of the cycle's ETH payout | $CARDS burned | Shifts | MinePool.sol |
| Weight | A card's or deck's share of the mine; share = weight / totalWeight | W | Decks | MinePool.sol:247,403 |
| Set bonus | Per-element multiplier keyed on distinct designs of that element in the deck | Set bonus preview | Decks | MinePool.sol:242-246,758-764 |
| Cost weight | Deck weight with one-of-ones excluded; the base for cost | Decks | MinePool.sol:249 | |
| Element | One of 20 kinds, Void to Slime in index order | {ELEMENT} CARD | Sealed cards | CardTraits.sol:129-150 |
| Design | One of 63 drawings per element, 64 with the one-of-one | Dn | Sealed cards | CardTraits.sol:22,30 |
| Edition | One of four strikes of a design, 0 to 3, consecutive ids; sets the star floor | ED e | Sealed cards | CardTraits.sol:23,75,122 |
| Tier | 1 to 9, the base of weight; each tier is 2x the one below | TIER n | Sealed cards | CardTraits.sol:36; MinePool.sol:247 |
| Stars | 0 to 6, assigned at mint by the seed; +1 on merge | n of 6 | Sealed cards | CardTraits.sol:113-123; MinersNFT.sol:336-338 |
| Sealed | A minted card before reveal; tier and stars hidden | Traits reveal when the seed drops | Sealed cards | MinersNFT.sol:306,371-376 |
| Reveal | reveal(seed), once, after sellout or REVEAL_DEADLINE | Sealed cards | MinersNFT.sol:271-280 | |
| Seed | The secret string whose sha256 hash is on-chain from deploy | Sealed cards | MinersNFT.sol:70-71,135 | |
| One-of-one | Ids 5,041 to 5,050, tier 9, 6 stars, design 63, held by TREASURY | 1 OF 1 | Sealed cards | CardTraits.sol:66-70; MinersNFT.sol:140-144 |
| Table cards | The 5,040 mintable cards, ids 1 to 5,040 | Minted n / 5,040 | Mint | MinersNFT.sol:41 |
| Forge | The app's verb for minting a card and binding a deck | START MINING | Decks | DeckApp.tsx:611-617 |
| Roll | The cycle close, roll(cardsPriceWei) by the keeper or rollStale() by anyone after 2 h | Cycles | MinePool.sol:365-384 | |
| Keeper | The address that rolls and posts the $CARDS/ETH price within +-20% | Cycles | MinePool.sol:52,367-375 | |
| Claim | claim(deckId, minStockOuts), pays a deck's payout as tokenised stock, one swap per vein; never paused | Claim all | Claim | MinePool.sol |
| Pending | What a deck can claim now, per vein, with its cost and pay fraction | Pending | Claim | MinePool.sol |
| Emission | What a vein pays per roll, 1/28 of its balance | Next emission | Cycles | MinePool.sol |
| Payout | What a deck receives at claim: each vein's share swapped into that vein's tokenised stock; there is no ETH payout | Claimed | Claim | MinePool.sol; StockRouterV3.sol |
| Unbind | unbindDeck on a passive, fully claimed deck; cards unlock and the bond is refunded | Shifts | MinePool.sol:332-360 | |
| Locked | A card in a deck; transfer, burn and merge revert CardLocked | IN DECK | Decks | MinersNFT.sol:488-494 |
| Passive / active / retired | The three deck states (Table 10.6) | IDLE / WORKING / RETIRED | Decks | MinePool.sol:112-116 |
| Treasury | The immutable TREASURY address; receives the ETH leg, the 5% royalty and the ten one-of-ones | Money | MinersNFT.sol:63-65,138-144,203 | |
| Tokenised stock | The ERC-20 each vein's share is swapped into at claim, tokenised SPY, NVDA and SPCX on Renie V3 | Claim | MinePool.sol; StockRouterV3.sol | |
| Router | StockRouterV3, the contract every claim routes each vein's ETH through into that stock's Renie V3 pool; minStockOuts[t] is the floor per vein, 0 accepts any amount | Claim | MinePool.sol; StockRouterV3.sol | |
| Timelock | The 48 h propose / apply / cancel delay on keeper, router, stock addresses and baseURI | Money | MinePool.sol:59,586-674; MinersNFT.sol:57,409-441 | |
| Pause | MinePool's instant emergency stop; stops new decks, shifts, unbinding and rolls; claim and fundPool keep working; mint and merge cannot be paused | Contract reverted: EnforcedPause | Money | MinePool.sol:214,283,332,365,380,434-441,539; MinersNFT.sol:29-31 |
| ETH leg / $CARDS leg | The two components of one card's mint price; the $CARDS leg burns, the ETH leg goes to TREASURY | Price / card | Mint | MinersNFT.sol:201,203 |
Error reference #
The app shows the raw revert name, as in "Contract reverted: TrancheBoundary." Find that name below. Full declarations live in IMinePool.sol:112-153 and IMinersNFT.sol.
| Revert | Contract | When it fires | What to do | Source |
|---|---|---|---|---|
ZeroCount | MinersNFT | mint or mintGtd with count 0 | Ask for 1 or more | MinersNFT.sol:172 |
PublicMintNotOpen | MinersNFT | mint before MINT_START, or before MINT_START + 30 min when a GTD root is set | Wait for the opening time | MinersNFT.sol:153-155 |
MintNotStarted | MinersNFT | mintGtd before MINT_START | Wait | MinersNFT.sol:161 |
NotOnGtdList | MinersNFT | Proof does not match GTD_MERKLE_ROOT | Use mint once the public window opens | MinersNFT.sol:164 |
SoldOut | MinersNFT | The call would pass id 5,040 | Nothing; the table is sold out | MinersNFT.sol:175 |
TrancheBoundary | MinersNFT | One call straddles two tranches | Lower the count so every id sits in one tranche | MinersNFT.sol:176-178 |
TooManyPerTx | MinersNFT | More than 100 cards in one call | Split the order; there is no per-wallet cap | MinersNFT.sol:173 |
InsufficientEth | MinersNFT | Sent value below the ETH leg times count | Send the value read live from mintPrice(mintNo) | MinersNFT.sol:184 |
EthTransferFailed | MinersNFT | Forward to TREASURY or refund to you failed | Send the exact value from an address that accepts ETH | MinersNFT.sol:204,209 |
MintNoOutOfRange | MinersNFT | mintPrice or trancheIndex asked for 0 or above 5,040 | Query 1 to 5,040 | MinersNFT.sol:252 |
AlreadyRevealed | MinersNFT | reveal after reveal | Nothing | MinersNFT.sol:272 |
RevealTooEarly | MinersNFT | reveal before sellout and before REVEAL_DEADLINE | Wait | MinersNFT.sol:277-278 |
BadSeed | MinersNFT | sha256 of the seed does not match SEED_COMMITMENT | Only the real seed opens the reveal | MinersNFT.sol:280 |
NotRevealed | MinersNFT | cardTraits or mergeCards before reveal | Wait for reveal | MinersNFT.sol:306,319 |
MergeOrder | MinersNFT | keepId is not lower than burnId | Pass the lower id first | MinersNFT.sol:317 |
NotCardOwner | MinersNFT | You do not own both cards; approvals do not count | Merge only cards in your wallet | MinersNFT.sol:320-321 |
CardLocked | MinersNFT | A card in a deck was sent, burned or merged | Unbind the deck first | MinersNFT.sol:323-324,492 |
UniqueNotMergeable | MinersNFT | A one-of-one in the pair | Nothing; one-of-ones never merge | MinersNFT.sol:328-329 |
ElementMismatch | MinersNFT | The two cards differ in element | Pick two of one element | MinersNFT.sol:330 |
TierMismatch | MinersNFT | The two cards differ in effective tier | Pick two of one tier; a merged card counts at its new tier | MinersNFT.sol:331-332 |
MaxTier | MinersNFT | Both cards are tier 9 | Nothing; tier 9 is the top | MinersNFT.sol:333 |
NoPendingBaseURI / TimelockPending | MinersNFT | Owner applied or cancelled a baseURI with none pending, or before 48 h | Owner only | MinersNFT.sol:421-422,436 |
NotDeployer / PoolAlreadySet | MinersNFT | setPool from another address, or a second time | Deploy only | MinersNFT.sol:460-461 |
NotPool | MinersNFT | setLocked from an address that is not MinePool | Nothing; only the mine locks cards | MinersNFT.sol:473 |
ZeroAddress | Both | A zero address given to the constructor, setPool or a timelock proposal | Deploy and owner only | MinersNFT.sol:129,462; MinePool.sol:191,594,622,650 |
NotRevealedYet | MinePool | bindDeck before reveal | Wait for reveal | MinePool.sol:215 |
EmptyDeck | MinePool | bindDeck with no ids | Pick at least one card | MinePool.sol:217 |
DeckTooLarge | MinePool | More than 128 ids | Split the deck | MinePool.sol:218 |
CardUnavailable | MinePool | A card is not yours or already in a deck; a duplicated id fails the same way | Remove the card from the list | MinePool.sol:235-236 |
BadTraits | MinePool | Traits outside tier 1 to 9, stars 0 to 6, element 0 to 19, design 0 to 63 | Cannot happen with revealed cards | MinePool.sol:240 |
NotDeckOwner | MinePool | buyShifts, unbindDeck or claim on a deck you do not own | Use your own deck id | MinePool.sol:285,334,443 |
ZeroCycles | MinePool | buyShifts with nCycles 0 | Buy 1 or more | MinePool.sol:286 |
CardsTransferFailed | MinePool | transferFrom of the bond, or the refund at unbind, returned false | Approve MinePool for the bond first | MinePool.sol:289,356 |
TooManyCycles | MinePool | endCycle would overflow uint64 | Buy fewer cycles | MinePool.sol:308,316 |
DeckStillActive | MinePool | unbindDeck while endCycle >= currentCycle | Wait for the schedule to run out | MinePool.sol:335 |
PendingNotSettled | MinePool | unbindDeck with pending reward or cost | Claim first | MinePool.sol:337-344 |
NotKeeper | MinePool | roll from an address that is not the keeper | Use rollStale after 2 h | MinePool.sol:367 |
CycleNotOver | MinePool | roll before cycleEndTime | Wait | MinePool.sol:368 |
PriceOutOfBand | MinePool | Posted price outside +-20% of the last price | Keeper only | MinePool.sol:370-374 |
NotStaleYet | MinePool | rollStale before cycleEndTime + 2 h | Wait | MinePool.sol:381 |
ZeroPrice | MinePool | Price 0 at deploy or at roll | Keeper only | MinePool.sol:193,391 |
ZeroCycleLength | MinePool | CYCLE_SECONDS 0 at deploy | Deploy only | MinePool.sol:192 |
EthTransferFailed | MinePool | An ETH transfer out of the mine failed | Claim again; the rewards stay pending | MinePool.sol |
BondBelowMinimum(required) | MinePool | The bond after the deposit is below requiredBond(deckId, nCycles); required is the $CARDS wei the deck must hold | Deposit at least required minus the bond already on the deck, or buy fewer cycles | MinePool.sol |
NothingPending / TimelockNotElapsed | MinePool | Owner applied or cancelled a keeper, router or stock change with none pending, or before 48 h | Owner only | MinePool.sol:603-604,613,631-632,641,660-661,671 |
EnforcedPause | MinePool | bindDeck, buyShifts, unbindDeck, roll or rollStale during a pause | Wait; claim still works | MinePool.sol:214,283,332,365,380 |
Not in the game #
Old copy on the site, on OpenSea and in early README files describes a different game. Mechanic pages carry at most three of these; this is the full list.
| Old claim | Where it appeared | Correct statement | Source |
|---|---|---|---|
| "stake" and "stakers" | site copy; opensea-description.txt:5,12,19 | Deck, bond, shift; the app never uses the word | DeckApp.tsx:441-448 |
| "the vault" | opensea-description.txt:7; site/index.html:195-197 | TREASURY receives the ETH leg, the royalty and the one-of-ones; three ETH veins pay the mine | MinersNFT.sol:63-65; MinePool.sol:106-110 |
| "70% of every fee" | site/index.html:377 | No split exists in code; fundPool is permissionless and the keeper bot forwards the Pons creator fee into the veins on a schedule | MinePool.sol |
| "each tier earns 3x the one below" | opensea-description.txt:5,19 | 2x; weight is 2^(tier-1) | MinePool.sol:247 |
| "hold all 9 tiers and every card doubles" | opensea-description.txt:5,19 | 63 distinct designs of one element in one deck, x2.0 | MinePool.sol:758-764 |
| "stars are upgrades earned after minting" | site/index.html:298 | Assigned at mint by the seed; merge adds one, capped at 6 | CardTraits.sol:113-123; MinersNFT.sol:336-338 |
| "$1 GTD and FCFS, $2 public" | opensea-description.txt:7; site/index.html:106,454-455 | Tranche 1 is 20,000 $CARDS burned plus a $2.00 ETH leg; no flat or ETH-only price | MinersNFT.sol:224,236 |
| "Minelist / FCFS stages" | site/index.html:213-223 | The deploy script sets the root to zero, so everyone mints from MINT_START; the mainnet allowlist is open before mainnet | Deploy.s.sol:97; MinersNFT.sol:153-155 |
| "2 per tranche, 6 lifetime" | older builds and posts | No per-wallet cap; 100 per call | MinersNFT.sol:48,173 |
| "200 team cards" | opensea-description.txt:7 | Only the 10 one-of-ones are held back | MinersNFT.sol:140-144 |
| "a mint can yield a one-of-one" | site/index.html:449-450 | Never; ids 5,041 to 5,050 mint to TREASURY in the constructor | MinersNFT.sol:41,140-144,173-175 |
| "1,260 cards" | site/index.html:6-7 | 1,260 designs, 5,050 cards | CardTraits.sol:21-28 |
| "18 pack designs" | opensea-description.txt:3,19 | 20, one per element, each in 9 colourways | site/tcg.js:430-451 |
| "SPY, NVDA, SPCX and more" | opensea-description.txt:7,21; site/index.html:355,383 | Three veins; TICKER_COUNT is 3 at compile time | MinePool.sol:63 |
| "ETH payout, stock on request" | earlier site copy and docs | Every vein's share is swapped into that vein's tokenised stock at claim through StockRouterV3; there is no ETH payout | MinePool.sol; StockRouterV3.sol |
| "zero-bond mining" | earlier docs | buyShifts reverts unless the bond covers requiredBond(deckId, nCycles) | MinePool.sol |
| "deck bound to one stock" | docs/MINE-PLAN.md:8-16 | Every deck mines all three veins at once | MinePool.sol:22-25,261 |
| "element does not affect power" | site/index.html:288 | The set bonus is per element | MinePool.sol:252-259 |
| "unstake whenever" | site/index.html:96,400-401 | Passive, fully claimed, then unbind | MinePool.sol:332-357 |
| "no energy" | site/index.html:169-170 | A per-cycle $CARDS cost, burned at claim | MinePool.sol |
| "mining is passive" | opensea-description.txt:5,12 | Shifts and bond | MinePool.sol:283-325 |
| "bond refunded at claim" | docs/MINE-PLAN.md:33,73-74 | Leftover bond stays on the deck; refunded at unbind | MinePool.sol:453-455,355-357 |
| "no admin, no pause" | contracts/README.md:36; deploy/README.md:99; docs/AUDIT.md:13 | An emergency pause stops new decks, new shifts, unbinding and cycle rolls; claiming accrued rewards always works, and minting and merging cannot be paused at all. Keeper, router and stock addresses change behind a 48 h timelock | MinePool.sol:59,214,586-686; MinersNFT.sol:29-31 |
| "a dead keeper locks the mine" | docs/AUDIT.md:217-218; docs/MINE-PLAN.md:284,297 | Anyone calls rollStale after 2 h of silence | MinePool.sol:85-87,380-384 |
| "60-card decks" | contracts/README.md:256 | 128 | MinePool.sol:54 |
| "x1.28 per tranche" | contracts/README.md:151-164 | x1.08 | MinersNFT.sol:215 |
| "excess ETH rejected" | contracts/README.md:142 | Refunded | MinersNFT.sol:206-210 |
| "ETH ref frozen at 4,000 USD/ETH" | MintApp.tsx:33-47,84 | 2,500 USD/ETH on this build; re-frozen at the live rate before mainnet | MinersNFT.sol:217-219 |
Changes at mainnet #
Nine things change between this testnet build and mainnet, and only the wei column among them is a bytecode constant (MinersNFT.sol:217-219). Each row names the badged cells it touches. CYCLE_SECONDS is a constructor parameter, so re-read it on the mainnet build (MinePool.sol:73,202).
| Item | Badged cells affected | Source |
|---|---|---|
| ETH wei column re-frozen at the live rate | Table 10.2, ETH leg column, all ten rows | MinersNFT.sol:218-219; deploy/mainnet-config.md:26-28 |
| GTD_MERKLE_ROOT, zero on this build | GTD_MERKLE_ROOT(); the opening time of mint (MINT_START, or +30 min with a root) | Deploy.s.sol:97; MinersNFT.sol:46,153-155 |
| REVEAL_DEADLINE mainnet value | REVEAL_DEADLINE(); testnet is deploy + 14 days | Deploy.s.sol:103; MinersNFT.sol:76 |
| MINT_START | MINT_START(); date to be announced | Deploy.s.sol:100; MinersNFT.sol:69 |
| Real router | Table 10.3 router row; StockRouterV3 into the Renie V3 pools, the path every claim takes | deploy/mainnet-config.md:17-22; MinePool.sol; StockRouterV3.sol |
| $CARDS token address | Table 10.3 CARDS row; Pons token entered at launch | deploy/mainnet-config.md:35-38 |
| One-of-one distribution | None on-chain; the ten cards sit with TREASURY, distribution to be announced | MinersNFT.sol:140-144 |
| Vein funding | Vein balances via pool(ticker); the keeper bot forwards the Pons creator fee on $CARDS trades into the veins on a schedule through fundPool, with no ratio on-chain | MinePool.sol |
| Contract addresses | Every row of Table 10.3; mainnet chainId 4663 | deploy/testnet-addresses.md:11-20; docs/MINE-PLAN.md:236-237 |
Open before mainnet Five items stay open before mainnet, the allowlist, the router address, the wei column, one-of-one distribution and the mainnet REVEAL_DEADLINE. None of them is a row of Table 10.1. Vein funding is no longer open: the keeper bot forwards the Pons creator fee into the veins on a schedule.
Engine versus contract #
The dev API behind the app runs a Python engine with its own numbers, and cycles are 120 s there (app/api/config.py:110), not 21,600 s. Its $CARDS price (config.py:118-120) and the testnet roll seed of 2,750 gwei (Deploy.s.sol:119) are placeholders; neither is the token price. The odd part is the bond. The engine labels what is left "refunded" at settle and keeps it bonded (app/api/game.py:13-14,213); the mine keeps it on the deck and pays it back only at unbind (MinePool.sol:453-455,355-357). Neither refunds at settle.
Read this if you are here to... Top up a bond, read the bond rule. Claim, read Claiming. Merge two of a kind, read Merge. Sell a card, read Locked; a card in a deck cannot move. Start from the top, read Start here.