02 · TCG Miners documentation

The mint and its ten tranches

Revised mint-tranches page: all four fact-check refutations and the missing explorer link fixed from the contracts (Minted event fields, once-rounded 1.08^(n-1) formula, vector test pins wei via cents

MintRevealDeckShiftsCycleClaim

You mint a sealed card in one transaction. A $CARDS leg is burned from your wallet and a small ETH leg goes to the treasury. The price climbs ten steps with mint order, from 20,000 $CARDS to 39,980 $CARDS, plus a flat $2.00 ETH leg, and nobody can edit the table.

Before this page This page assumes a wallet on Robinhood Chain that already holds $CARDS, and the loop from Start here. Every constant named here has a row on Reference.

What it is #

A tranche is a price step. The 5,040 table cards mint in strict id order, and the price moves every 500 cards. Tranche 1 is mint numbers 1 to 500, tranche 2 is 501 to 1,000, and tranche 10 takes 4,501 to 5,040, the last 540. Mint number and token id are the same number, so trancheIndex(mintNo) is (mintNo - 1) / 500, clamped to 9.

The ladder exists so that price tracks order, not the clock. Tranche n costs 20,000 x 1.08^(n-1) $CARDS, rounded to whole $CARDS, and the ETH leg is a flat $2.00 in every tranche. Early minters pay less, and the burn at sellout lands at 14.65% of the 1 B supply. The odd part is that you do not pick your tranche. Ids go out in sequence, so your price depends on how many cards minted before you.

Rules #

  • mint(count) mints count sealed cards in one transaction. burnFrom destroys the $CARDS leg straight from your wallet. The ETH leg goes in full to the immutable TREASURY and the excess comes back in the same call, else EthTransferFailed.
  • Approve MinersNFT for the $CARDS total first. The app asks once, for a max allowance.
  • The price is read from the first id in the call and applied to every card in it.
  • count is 1 or more, else ZeroCount.
  • The last id in the call is 5,040 at most, else SoldOut.
  • One call stays inside one tranche, else TrancheBoundary.
  • No per-wallet cap. A wallet mints as many as it pays for. One call takes up to 100 cards (MAX_PER_TX), else TooManyPerTx; call again for more.
  • The value sent covers the ETH leg times count, else InsufficientEth.
  • mintPrice(mintNo) and trancheIndex take 1 to 5,040, else MintNoOutOfRange.
  • mint opens at MINT_START when GTD_MERKLE_ROOT is zero, and 30 min later when a root is set, else PublicMintNotOpen. Listed wallets call mintGtd(count, proof) from MINT_START, with no cutoff and no tranche restriction, else MintNotStarted or NotOnGtdList. On this build the deploy script sets the root to zero, so everyone mints from MINT_START; the allowlist is open before mainnet. No other entry point exists in code.
  • The mint has no end time and no pause, and it stays open after reveal. MINT_START is set at deploy.
  • Cards go out with _mint rather than _safeMint, so no onERC721Received hook runs. Each call emits Minted(to, firstId, count, cardsBurned, ethPaid).
  • You receive a sealed card. Element, design and edition are readable from the id; tier and stars come with reveal. The app says "Traits reveal when the seed drops."
Figure 2.1 One mint transaction

your wallet  → approve, once             → MinersNFT allowance                 contracts/interfaces/ICards.sol:9-11; app/web/src/app/mint/MintApp.tsx:403-411
your wallet  → burnFrom(cardsTotal)      → $CARDS supply, destroyed            contracts/src/MinersNFT.sol:201
your wallet  → msg.value                 → MinersNFT → ethTotal → TREASURY     MinersNFT.sol:203
your wallet  ← msg.value less ethTotal   ← MinersNFT                           MinersNFT.sol:206-210

the second approval, of MinePool for the bond, belongs to the deck page       contracts/src/MinePool.sol:288-291

Numbers #

The table is a bytecode constant with no setter; its ETH column is frozen to wei at 2,500 USD/ETH and re-frozen at the live rate before mainnet. The USD figure is the one that holds; the wei is read live from mintPrice(). The vector test pins the $CARDS column and derives the wei from the cent figures at that rate, so a re-frozen column changes the test's rate factor too (contracts/test/MinersNFT.t.sol:131-150). At sellout 146,464,700 $CARDS are burned and 4.032 ETH, $10,080 nominal, goes to the treasury. Both totals are derived.

Table 2.1 Ten-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
Table 2.2 Reverts on the mint path
ConditionRevertPlain triggerSource
count is 0ZeroCountYou asked for nothingMinersNFT.sol:172
Last id above 5,040SoldOutThe table is sold out, or your count runs past itMinersNFT.sol:173-175
First and last id in different tranchesTrancheBoundaryYour call straddles a price step; lower countMinersNFT.sol:176-178
count above 100TooManyPerTxOne call mints at most 100; split the orderMinersNFT.sol:48,​173
Value below ETH leg times countInsufficientEthSend the figure read live from mintPrice(mintNo)MinersNFT.sol:181-184
mintNo is 0 or above 5,040MintNoOutOfRangemintPrice or trancheIndex asked outside 1 to 5,040MinersNFT.sol:252
Before MINT_START, or before MINT_START + 30 min with a root setPublicMintNotOpenmint called too earlyMinersNFT.sol:46,​153-155
mintGtd before MINT_STARTMintNotStartedListed wallet called too earlyMinersNFT.sol:161
Proof fails against GTD_MERKLE_ROOTNotOnGtdListWallet not on the list; use mint once it opensMinersNFT.sol:163-164
Forward to TREASURY or refund to you failsEthTransferFailedThe receiving address rejected ETHMinersNFT.sol:203-209

Worked example #

Alice mints the wallet maximum, two cards in each of the first three tranches.

tranche 1   approve MinersNFT for at least 40,000 $CARDS
            2 x 20,000 = 40,000 $CARDS burned
            2 x 0.0008 = 0.0016 ETH to the treasury
            she sent 0.0020 ETH, so 0.0020 - 0.0016 = 0.0004 ETH refunded
            a third, a tenth or a hundredth card in tranche 1 is fine; there is no wallet cap
tranche 2   2 x 21,600 = 43,200 $CARDS; 2 x 0.0008 = 0.0016 ETH
tranche 3   2 x 23,328 = 46,656 $CARDS; 2 x 0.0008 = 0.0016 ETH
lifetime    40,000 + 43,200 + 46,656 = 129,856 $CARDS burned
            0.0016 + 0.0016 + 0.0016 = 0.0048 ETH ($12 nominal)
            101 cards in one call revert TooManyPerTx; 100 + 1 in two calls go through
one call for mint numbers 500 and 501 reverts TrancheBoundary
                                              MinersNFT.sol:178-184,201-210,224-226,236-238
Table 2.3 Worked example A ledger
TrancheCards$CARDS per card$CARDS burnedETH leg per cardETH sentRefund (ETH)Running $CARDS burnedRunning ETH to treasurySource
1220,00040,0000.00080.00200.000440,0000.0016MinersNFT.sol:181-183,​201-210,​224,​236
2221,60043,2000.00080.00160.000083,2000.0032MinersNFT.sol:225,​237
3223,32846,6560.00080.00160.0000129,8560.0048MinersNFT.sol:226,​238
Total6129,8560.00520.0004129,8560.0048MinersNFT.sol:180

Edge cases #

  • No team reserve and no airdrop allocation. The only held-back cards are the 10 one-of-ones, minted to TREASURY in the constructor. A mint never yields a one-of-one.
  • If a merkle list ships at mainnet, listed wallets mint from MINT_START and everyone else 30 min later. Nothing else changes; the limits and the table are the same through both entry points.
  • The app caps the number you can pick from a poll up to 10 s old. If the tranche turns between poll and transaction, the contract prices from the first id and reverts TrancheBoundary or InsufficientEth.
  • Reveal follows sellout or REVEAL_DEADLINE, set at deploy, and the table does not change after it.

Verify it on-chain #

Open the MinersNFT read-contract tab (address on Reference) and call mintPrice(1), mintPrice(5040), trancheIndex(500), trancheIndex(501), totalMinted(), totalSupply(), MAX_PER_TX(), GTD_MERKLE_ROOT(), MINT_START() and TREASURY(). mintPrice(1) returns 800000000000000 wei, 0.0008 ETH, and 20000e18, 20,000 $CARDS. trancheIndex(501) returns 1; the index is zero-based, so that is tranche 2 here. totalSupply() is minted table cards plus 10, less cards burned by merge. GTD_MERKLE_ROOT() returns zero on this build (MinersNFT.sol:41-49,63-69,132,221-256,264-266; contracts/script/Deploy.s.sol:97).

Not in the game #

  • "$1 in 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 exists (MinersNFT.sol:224,236).
  • "2 per tranche, 6 lifetime" (older builds and posts). No per-wallet cap exists; only 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).

Next #

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.

Next page, Sealed cards, reveal and traits, what the id tells you before the seed drops.