10 · TCG Miners documentation

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.

Table 10.1 Constants hub
ConstantValueUnitContractSetterOwning pageSource
TABLE_SUPPLY5,040cardsMinersNFTNoMintMinersNFT.sol:41
UNIQUE_COUNT10cardsMinersNFTNoSealed cardsMinersNFT.sol:42
TRANCHE_SIZE500mintsMinersNFTNoMintMinersNFT.sol:43
TRANCHE_COUNT10tranchesMinersNFTNoMintMinersNFT.sol:44
GTD_WINDOW30minMinersNFTNoMintMinersNFT.sol:46
MAX_PER_TX100cards per call (no per-wallet cap)MinersNFTNoMintMinersNFT.sol:48
ROYALTY_BPS500bps (5%)MinersNFTNoMoneyMinersNFT.sol:51
MAX_TIER9tierMinersNFTNoMergeMinersNFT.sol:53
MAX_STARS6starsMinersNFTNoMergeMinersNFT.sol:54
TIMELOCK_DELAY48hMinersNFTNoMoneyMinersNFT.sol:57
EMISSION_DIVISOR28each vein pays 1/28 of its balance per roll (about 3.57%)MinePoolNoCyclesMinePool.sol
BURN_TARGET_BPS1,500bps (15%)MinePoolNoShiftsMinePool.sol
STALE_AFTER2hMinePoolNoCyclesMinePool.sol:50
PRICE_BAND_BPS2,000bps (+-20%)MinePoolNoCyclesMinePool.sol:52
MAX_DECK_CARDS128cardsMinePoolNoDecksMinePool.sol:54
TIMELOCK_DELAY48hMinePoolNoMoneyMinePool.sol:59
TICKER_COUNT3veins; internal constant, no getterMinePoolNoCyclesMinePool.sol:63
CYCLE_SECONDS21,600s (6 h), set at deploy, read live from CYCLE_SECONDS()MinePoolNoCyclesMinePool.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).

Table 10.2 Tranche price table
TrancheMint 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
11 to 50020,000$2.000.000810,000,000MinersNFT.sol:224,​236
2501 to 1,00021,600$2.000.000820,800,000MinersNFT.sol:225,​237
31,001 to 1,50023,328$2.000.000832,464,000MinersNFT.sol:226,​238
41,501 to 2,00025,194$2.000.000845,061,000MinersNFT.sol:227,​239
52,001 to 2,50027,210$2.000.000858,666,000MinersNFT.sol:228,​240
62,501 to 3,00029,387$2.000.000873,359,500MinersNFT.sol:229,​241
73,001 to 3,50031,737$2.000.000889,228,000MinersNFT.sol:230,​242
83,501 to 4,00034,276$2.000.0008106,366,000MinersNFT.sol:231,​243
94,001 to 4,50037,019$2.000.0008124,875,500MinersNFT.sol:232,​244
104,501 to 5,040 (540 cards)39,980$2.000.0008146,464,700MinersNFT.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).

Table 10.3 Contract addresses, Robinhood testnet 46630
ContractAddress (testnet, set at deploy)Real or stand-inExplorerSource
MinersNFT0xB6e6aCC4936f2568112B4cD87D51783d8931De75Realread contractdeploy/testnet-addresses.md:13
MinePool0x523C6fD0DBd17B7F08F4e6650301157BE5643292Realread contractdeploy/testnet-addresses.md:14
CARDS (MockCards)0x9f4182c0079457c8D82a0f4e42cc53C9C4115b70Test stand-in (MockCards) for the Pons $CARDS tokenread contractdeploy/testnet-addresses.md:15; Deploy.s.sol:84
Keeper / Owner0x63B4f25429489dc2ff64D10506c1807C541B6367Deployer address on testnetaddressdeploy/testnet-addresses.md:16
Router (MockStockRouter)0x781A603FeA223634df68BECc07a8a5869561bF34Test stand-in (MockStockRouter); StockRouterV3 into the Renie V3 pools on mainnetread contractdeploy/testnet-addresses.md:17; Deploy.s.sol:88
tSPY0xCF58AA27e72B9f2862e6aad426E4b6a9141e202BTest stand-in (MockStock)read contractdeploy/testnet-addresses.md:18; Deploy.s.sol:85
tNVDA0x62c77b56cac58E749487800000bbEB4e3045c00ETest stand-in (MockStock)read contractdeploy/testnet-addresses.md:19; Deploy.s.sol:86
tSPCX0x9067ed2a4848c637E8d495B69952aab37CE734FFTest stand-in (MockStock)read contractdeploy/testnet-addresses.md:20; Deploy.s.sol:87
Explorer / RPChttps://explorer.testnet.chain.robinhood.com / https://rpc.testnet.chain.robinhood.comTestnetdeploy/testnet-addresses.md:3-4
Mainnet, chainId 4663set at deploy, published at launchReal; 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() and TREASURY(). On MinePool call CYCLE_SECONDS(), currentCycle(), cycleEndTime(), lastCardsPrice(), totalWeight(), keeper() and pool(0). Every constant in Table 10.1 except TICKER_COUNT is a public getter of the same name, so MAX_PER_TX() returns 100, EMISSION_DIVISOR() returns 28 and BURN_TARGET_BPS() returns 1,500 (MinersNFT.sol:41-57; MinePool.sol). requiredBond(deckId, nCycles) returns the $CARDS a deck must hold before buyShifts will sell it nCycles. TICKER_COUNT is internal, so count the three pool(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).

Table 10.4 Elements and id ranges
IndexElementTable idsOne-of-one idSource
0Void1 to 2525,041CardTraits.sol:25,​66-70,​130
1Thunder253 to 5045,042CardTraits.sol:131
2Moon505 to 7565,043CardTraits.sol:132
3Sun757 to 1,0085,044CardTraits.sol:133
4Bleeding1,009 to 1,2605,045CardTraits.sol:134
5Defense1,261 to 1,5125,046CardTraits.sol:135
6Heal1,513 to 1,7645,047CardTraits.sol:136
7Cloud1,765 to 2,0165,048CardTraits.sol:137
8Attack2,017 to 2,2685,049CardTraits.sol:138
9Earth2,269 to 2,5205,050CardTraits.sol:139
10Sound2,521 to 2,772CardTraits.sol:140
11Water2,773 to 3,024CardTraits.sol:141
12Soul3,025 to 3,276CardTraits.sol:142
13Fire3,277 to 3,528CardTraits.sol:143
14Plant3,529 to 3,780CardTraits.sol:144
15Poison3,781 to 4,032CardTraits.sol:145
16Demon4,033 to 4,284CardTraits.sol:146
17Light4,285 to 4,536CardTraits.sol:147
18Charm4,537 to 4,788CardTraits.sol:148
19Slime4,789 to 5,040CardTraits.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
Table 10.5 Weight matrix, card weight by tier and stars
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)11.251.51.7522.252.5MinePool.sol:247
T2 (2)22.503.03.5044.505.0MinePool.sol:247
T3 (4)45.006.07.0089.0010.0MinePool.sol:247
T4 (8)810.0012.014.001618.0020.0MinePool.sol:247
T5 (16)1620.0024.028.003236.0040.0MinePool.sol:247
T6 (32)3240.0048.056.006472.0080.0MinePool.sol:247
T7 (64)6480.0096.0112.00128144.00160.0MinePool.sol:247
T8 (128)128160.00192.0224.00256288.00320.0MinePool.sol:247
T9 (256)256320.00384.0448.00512576.00640.0MinePool.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.

Table 10.6 Deck states
StateConditionCan buyShiftsCan claimCan unbindCards lockedApp labelSource
PassiveendCycle < currentCycle, retired falseYes, starts at currentCycle + nYesYes, once nothing is pendingYesIDLEIMinePool.sol:53-54; MinePool.sol:112-116,​267-268,​307
ActiveendCycle >= currentCycleYes, extends by nYesNo, DeckStillActiveYesWORKINGMinePool.sol:313-322,​335
Retiredretired true; if the deck was still scheduled, its remaining schedule is dropped (endCycle = currentCycle - 1)Yes, clears the flagYesYes, once nothing is pendingYesRETIREDIMinePool.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).

Table 10.7 Glossary
TermDefinitionApp labelOwning pageSource
TrancheOne of ten price steps of 500 mint numbers; the last is 540Tranche k / 10MintMinersNFT.sol:43-44,​251-256
CycleThe mine-wide six-hour period closed by a roll; cycles start at 1CYCLE #nCyclesMinePool.sol:73,​206
ShiftOne scheduled cycle of work for one deck; n bought is n+1 worked from passiveAdd bondShiftsMinePool.sol:283-325
VeinOne of the three ETH balances the mine pays from, SPY, NVDA, SPCX; every deck works all threeSPY, NVDA, SPCXCyclesIMinePool.sol:31-35; MinePool.sol:261
The mineMinePool, as a place and as the contractThe mine is openCyclesMinePool.sol:42
Deck1 to 128 of your cards bound as one unit with bindDeckDeck #idDecksMinePool.sol:54,​214-218
Bond$CARDS locked on a deck as prepayment for cost; it must cover the required bond before a shift is soldBond leftShiftsMinePool.sol
Required bondrequiredBond(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 itBond neededShiftsMinePool.sol
Cost$CARDS a working deck accrues each roll and burns at claim; mine-wide target 15% of the cycle's ETH payout$CARDS burnedShiftsMinePool.sol
WeightA card's or deck's share of the mine; share = weight / totalWeightWDecksMinePool.sol:247,​403
Set bonusPer-element multiplier keyed on distinct designs of that element in the deckSet bonus previewDecksMinePool.sol:242-246,​758-764
Cost weightDeck weight with one-of-ones excluded; the base for costDecksMinePool.sol:249
ElementOne of 20 kinds, Void to Slime in index order{ELEMENT} CARDSealed cardsCardTraits.sol:129-150
DesignOne of 63 drawings per element, 64 with the one-of-oneDnSealed cardsCardTraits.sol:22,​30
EditionOne of four strikes of a design, 0 to 3, consecutive ids; sets the star floorED eSealed cardsCardTraits.sol:23,​75,​122
Tier1 to 9, the base of weight; each tier is 2x the one belowTIER nSealed cardsCardTraits.sol:36; MinePool.sol:247
Stars0 to 6, assigned at mint by the seed; +1 on mergen of 6Sealed cardsCardTraits.sol:113-123; MinersNFT.sol:336-338
SealedA minted card before reveal; tier and stars hiddenTraits reveal when the seed dropsSealed cardsMinersNFT.sol:306,​371-376
Revealreveal(seed), once, after sellout or REVEAL_DEADLINESealed cardsMinersNFT.sol:271-280
SeedThe secret string whose sha256 hash is on-chain from deploySealed cardsMinersNFT.sol:70-71,​135
One-of-oneIds 5,041 to 5,050, tier 9, 6 stars, design 63, held by TREASURY1 OF 1Sealed cardsCardTraits.sol:66-70; MinersNFT.sol:140-144
Table cardsThe 5,040 mintable cards, ids 1 to 5,040Minted n / 5,040MintMinersNFT.sol:41
ForgeThe app's verb for minting a card and binding a deckSTART MININGDecksDeckApp.tsx:611-617
RollThe cycle close, roll(cardsPriceWei) by the keeper or rollStale() by anyone after 2 hCyclesMinePool.sol:365-384
KeeperThe address that rolls and posts the $CARDS/ETH price within +-20%CyclesMinePool.sol:52,​367-375
Claimclaim(deckId, minStockOuts), pays a deck's payout as tokenised stock, one swap per vein; never pausedClaim allClaimMinePool.sol
PendingWhat a deck can claim now, per vein, with its cost and pay fractionPendingClaimMinePool.sol
EmissionWhat a vein pays per roll, 1/28 of its balanceNext emissionCyclesMinePool.sol
PayoutWhat a deck receives at claim: each vein's share swapped into that vein's tokenised stock; there is no ETH payoutClaimedClaimMinePool.sol; StockRouterV3.sol
UnbindunbindDeck on a passive, fully claimed deck; cards unlock and the bond is refundedShiftsMinePool.sol:332-360
LockedA card in a deck; transfer, burn and merge revert CardLockedIN DECKDecksMinersNFT.sol:488-494
Passive / active / retiredThe three deck states (Table 10.6)IDLE / WORKING / RETIREDDecksMinePool.sol:112-116
TreasuryThe immutable TREASURY address; receives the ETH leg, the 5% royalty and the ten one-of-onesMoneyMinersNFT.sol:63-65,​138-144,​203
Tokenised stockThe ERC-20 each vein's share is swapped into at claim, tokenised SPY, NVDA and SPCX on Renie V3ClaimMinePool.sol; StockRouterV3.sol
RouterStockRouterV3, 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 amountClaimMinePool.sol; StockRouterV3.sol
TimelockThe 48 h propose / apply / cancel delay on keeper, router, stock addresses and baseURIMoneyMinePool.sol:59,​586-674; MinersNFT.sol:57,​409-441
PauseMinePool's instant emergency stop; stops new decks, shifts, unbinding and rolls; claim and fundPool keep working; mint and merge cannot be pausedContract reverted: EnforcedPauseMoneyMinePool.sol:214,​283,​332,​365,​380,​434-441,​539; MinersNFT.sol:29-31
ETH leg / $CARDS legThe two components of one card's mint price; the $CARDS leg burns, the ETH leg goes to TREASURYPrice / cardMintMinersNFT.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.

Table 10.8 Error reference
RevertContractWhen it firesWhat to doSource
ZeroCountMinersNFTmint or mintGtd with count 0Ask for 1 or moreMinersNFT.sol:172
PublicMintNotOpenMinersNFTmint before MINT_START, or before MINT_START + 30 min when a GTD root is setWait for the opening timeMinersNFT.sol:153-155
MintNotStartedMinersNFTmintGtd before MINT_STARTWaitMinersNFT.sol:161
NotOnGtdListMinersNFTProof does not match GTD_MERKLE_ROOTUse mint once the public window opensMinersNFT.sol:164
SoldOutMinersNFTThe call would pass id 5,040Nothing; the table is sold outMinersNFT.sol:175
TrancheBoundaryMinersNFTOne call straddles two tranchesLower the count so every id sits in one trancheMinersNFT.sol:176-178
TooManyPerTxMinersNFTMore than 100 cards in one callSplit the order; there is no per-wallet capMinersNFT.sol:173
InsufficientEthMinersNFTSent value below the ETH leg times countSend the value read live from mintPrice(mintNo)MinersNFT.sol:184
EthTransferFailedMinersNFTForward to TREASURY or refund to you failedSend the exact value from an address that accepts ETHMinersNFT.sol:204,​209
MintNoOutOfRangeMinersNFTmintPrice or trancheIndex asked for 0 or above 5,040Query 1 to 5,040MinersNFT.sol:252
AlreadyRevealedMinersNFTreveal after revealNothingMinersNFT.sol:272
RevealTooEarlyMinersNFTreveal before sellout and before REVEAL_DEADLINEWaitMinersNFT.sol:277-278
BadSeedMinersNFTsha256 of the seed does not match SEED_COMMITMENTOnly the real seed opens the revealMinersNFT.sol:280
NotRevealedMinersNFTcardTraits or mergeCards before revealWait for revealMinersNFT.sol:306,​319
MergeOrderMinersNFTkeepId is not lower than burnIdPass the lower id firstMinersNFT.sol:317
NotCardOwnerMinersNFTYou do not own both cards; approvals do not countMerge only cards in your walletMinersNFT.sol:320-321
CardLockedMinersNFTA card in a deck was sent, burned or mergedUnbind the deck firstMinersNFT.sol:323-324,​492
UniqueNotMergeableMinersNFTA one-of-one in the pairNothing; one-of-ones never mergeMinersNFT.sol:328-329
ElementMismatchMinersNFTThe two cards differ in elementPick two of one elementMinersNFT.sol:330
TierMismatchMinersNFTThe two cards differ in effective tierPick two of one tier; a merged card counts at its new tierMinersNFT.sol:331-332
MaxTierMinersNFTBoth cards are tier 9Nothing; tier 9 is the topMinersNFT.sol:333
NoPendingBaseURI / TimelockPendingMinersNFTOwner applied or cancelled a baseURI with none pending, or before 48 hOwner onlyMinersNFT.sol:421-422,​436
NotDeployer / PoolAlreadySetMinersNFTsetPool from another address, or a second timeDeploy onlyMinersNFT.sol:460-461
NotPoolMinersNFTsetLocked from an address that is not MinePoolNothing; only the mine locks cardsMinersNFT.sol:473
ZeroAddressBothA zero address given to the constructor, setPool or a timelock proposalDeploy and owner onlyMinersNFT.sol:129,​462; MinePool.sol:191,​594,​622,​650
NotRevealedYetMinePoolbindDeck before revealWait for revealMinePool.sol:215
EmptyDeckMinePoolbindDeck with no idsPick at least one cardMinePool.sol:217
DeckTooLargeMinePoolMore than 128 idsSplit the deckMinePool.sol:218
CardUnavailableMinePoolA card is not yours or already in a deck; a duplicated id fails the same wayRemove the card from the listMinePool.sol:235-236
BadTraitsMinePoolTraits outside tier 1 to 9, stars 0 to 6, element 0 to 19, design 0 to 63Cannot happen with revealed cardsMinePool.sol:240
NotDeckOwnerMinePoolbuyShifts, unbindDeck or claim on a deck you do not ownUse your own deck idMinePool.sol:285,​334,​443
ZeroCyclesMinePoolbuyShifts with nCycles 0Buy 1 or moreMinePool.sol:286
CardsTransferFailedMinePooltransferFrom of the bond, or the refund at unbind, returned falseApprove MinePool for the bond firstMinePool.sol:289,​356
TooManyCyclesMinePoolendCycle would overflow uint64Buy fewer cyclesMinePool.sol:308,​316
DeckStillActiveMinePoolunbindDeck while endCycle >= currentCycleWait for the schedule to run outMinePool.sol:335
PendingNotSettledMinePoolunbindDeck with pending reward or costClaim firstMinePool.sol:337-344
NotKeeperMinePoolroll from an address that is not the keeperUse rollStale after 2 hMinePool.sol:367
CycleNotOverMinePoolroll before cycleEndTimeWaitMinePool.sol:368
PriceOutOfBandMinePoolPosted price outside +-20% of the last priceKeeper onlyMinePool.sol:370-374
NotStaleYetMinePoolrollStale before cycleEndTime + 2 hWaitMinePool.sol:381
ZeroPriceMinePoolPrice 0 at deploy or at rollKeeper onlyMinePool.sol:193,​391
ZeroCycleLengthMinePoolCYCLE_SECONDS 0 at deployDeploy onlyMinePool.sol:192
EthTransferFailedMinePoolAn ETH transfer out of the mine failedClaim again; the rewards stay pendingMinePool.sol
BondBelowMinimum(required)MinePoolThe bond after the deposit is below requiredBond(deckId, nCycles); required is the $CARDS wei the deck must holdDeposit at least required minus the bond already on the deck, or buy fewer cyclesMinePool.sol
NothingPending / TimelockNotElapsedMinePoolOwner applied or cancelled a keeper, router or stock change with none pending, or before 48 hOwner onlyMinePool.sol:603-604,​613,​631-632,​641,​660-661,​671
EnforcedPauseMinePoolbindDeck, buyShifts, unbindDeck, roll or rollStale during a pauseWait; claim still worksMinePool.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.

Table 10.9 Not in the game
Old claimWhere it appearedCorrect statementSource
"stake" and "stakers"site copy; opensea-description.txt:5,12,19Deck, bond, shift; the app never uses the wordDeckApp.tsx:441-448
"the vault"opensea-description.txt:7; site/index.html:195-197TREASURY receives the ETH leg, the royalty and the one-of-ones; three ETH veins pay the mineMinersNFT.sol:63-65; MinePool.sol:106-110
"70% of every fee"site/index.html:377No split exists in code; fundPool is permissionless and the keeper bot forwards the Pons creator fee into the veins on a scheduleMinePool.sol
"each tier earns 3x the one below"opensea-description.txt:5,192x; weight is 2^(tier-1)MinePool.sol:247
"hold all 9 tiers and every card doubles"opensea-description.txt:5,1963 distinct designs of one element in one deck, x2.0MinePool.sol:758-764
"stars are upgrades earned after minting"site/index.html:298Assigned at mint by the seed; merge adds one, capped at 6CardTraits.sol:113-123; MinersNFT.sol:336-338
"$1 GTD and FCFS, $2 public"opensea-description.txt:7; site/index.html:106,454-455Tranche 1 is 20,000 $CARDS burned plus a $2.00 ETH leg; no flat or ETH-only priceMinersNFT.sol:224,​236
"Minelist / FCFS stages"site/index.html:213-223The deploy script sets the root to zero, so everyone mints from MINT_START; the mainnet allowlist is open before mainnetDeploy.s.sol:97; MinersNFT.sol:153-155
"2 per tranche, 6 lifetime"older builds and postsNo per-wallet cap; 100 per callMinersNFT.sol:48,​173
"200 team cards"opensea-description.txt:7Only the 10 one-of-ones are held backMinersNFT.sol:140-144
"a mint can yield a one-of-one"site/index.html:449-450Never; ids 5,041 to 5,050 mint to TREASURY in the constructorMinersNFT.sol:41,​140-144,​173-175
"1,260 cards"site/index.html:6-71,260 designs, 5,050 cardsCardTraits.sol:21-28
"18 pack designs"opensea-description.txt:3,1920, one per element, each in 9 colourwayssite/tcg.js:430-451
"SPY, NVDA, SPCX and more"opensea-description.txt:7,21; site/index.html:355,383Three veins; TICKER_COUNT is 3 at compile timeMinePool.sol:63
"ETH payout, stock on request"earlier site copy and docsEvery vein's share is swapped into that vein's tokenised stock at claim through StockRouterV3; there is no ETH payoutMinePool.sol; StockRouterV3.sol
"zero-bond mining"earlier docsbuyShifts reverts unless the bond covers requiredBond(deckId, nCycles)MinePool.sol
"deck bound to one stock"docs/MINE-PLAN.md:8-16Every deck mines all three veins at onceMinePool.sol:22-25,​261
"element does not affect power"site/index.html:288The set bonus is per elementMinePool.sol:252-259
"unstake whenever"site/index.html:96,400-401Passive, fully claimed, then unbindMinePool.sol:332-357
"no energy"site/index.html:169-170A per-cycle $CARDS cost, burned at claimMinePool.sol
"mining is passive"opensea-description.txt:5,12Shifts and bondMinePool.sol:283-325
"bond refunded at claim"docs/MINE-PLAN.md:33,73-74Leftover bond stays on the deck; refunded at unbindMinePool.sol:453-455,​355-357
"no admin, no pause"contracts/README.md:36; deploy/README.md:99; docs/AUDIT.md:13An 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 timelockMinePool.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,297Anyone calls rollStale after 2 h of silenceMinePool.sol:85-87,​380-384
"60-card decks"contracts/README.md:256128MinePool.sol:54
"x1.28 per tranche"contracts/README.md:151-164x1.08MinersNFT.sol:215
"excess ETH rejected"contracts/README.md:142RefundedMinersNFT.sol:206-210
"ETH ref frozen at 4,000 USD/ETH"MintApp.tsx:33-47,842,500 USD/ETH on this build; re-frozen at the live rate before mainnetMinersNFT.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).

Table 10.10 Changes at mainnet
ItemBadged cells affectedSource
ETH wei column re-frozen at the live rateTable 10.2, ETH leg column, all ten rowsMinersNFT.sol:218-219; deploy/mainnet-config.md:26-28
GTD_MERKLE_ROOT, zero on this buildGTD_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 valueREVEAL_DEADLINE(); testnet is deploy + 14 daysDeploy.s.sol:103; MinersNFT.sol:76
MINT_STARTMINT_START(); date to be announcedDeploy.s.sol:100; MinersNFT.sol:69
Real routerTable 10.3 router row; StockRouterV3 into the Renie V3 pools, the path every claim takesdeploy/mainnet-config.md:17-22; MinePool.sol; StockRouterV3.sol
$CARDS token addressTable 10.3 CARDS row; Pons token entered at launchdeploy/mainnet-config.md:35-38
One-of-one distributionNone on-chain; the ten cards sit with TREASURY, distribution to be announcedMinersNFT.sol:140-144
Vein fundingVein 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-chainMinePool.sol
Contract addressesEvery row of Table 10.3; mainnet chainId 4663deploy/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.