Game Guide
How Spirit Cards actually works — the five-node loop and the current mechanics of every node. The numbers below are the live defaults from the game's Config contract; they are gameplay parameters that the team (owner multi-sig) can retune, not financial promises.
// On this page
// 00 · The World
What is Spirit Cards
Spirit Cards is an on-chain world of elemental creatures. A card is not an abstract token but a spirit-character with an element, battle stats and a 'personality' — all derived deterministically from its on-chain seed. You don't buy a picture; you mine a creature.
Each card is rendered from layered art derived from its seed, so the same token always looks identical in the app, in its metadata and in the explorer.
- 16 species in Season 1 — 8 universal (Emberback · Ripplefin · Mossroot · Cloudwhisk · Flashbound · Frostpuff · Quicksilver · Moonglimmer) and 8 dragons (Cindermaw · Tidecoil · Rootwaker · Zephyrcrest · Voltrush · Frostmane · Silvervein · Starwisp).
- 6 rarity tiers: Common, Rare, Super Rare, Ultra Rare, Secret Rare and Prism (1-of-1). Rarity is read from the top bits of the seed and scales base HP / ATK / DEF.
- 4 elements forming a rock–paper–scissors cycle: Ember › Stone › Gale › Tide › Ember.
- A finite supply — at most 8888 cards (maxSupply). Minting and burns only ever reduce what is left.
A fight's outcome is not guaranteed by stats alone — element, skill and per-battle variance all matter. See Battle.
// 01 · The Loop
The Loop
The whole game is a five-node cycle you repeat hundreds of times. There are no hundred-page rule trees: the home screen is one big MINE button, and everything else is a clear section.
挖 MINE → 熔 MERGE → ⚔ BATTLE → 押 STAKE → 榜 POINTS → repeat
| Node | What you do | What it feeds |
|---|---|---|
| Mine | Grind a nonce to mint a card (real proof-of-work). | Cards + a chip + points. |
| Merge | Burn 2 cards into 1 higher tier (evolution). | Stronger cards; fewer cards in circulation. |
| Battle | Duel another card for a stake. | Wins, provenance, and rake into the pool. |
| Stake | Lock a card in the vault for a term. | A share of real fees; cards leave free circulation. |
| Points | Every action accrues activity points. | Leaderboard position and season standing. |
The nodes feed each other: weak cards become merge fuel, stronger cards fight better, winning cards are worth staking, and the pool share encourages another round. Every action also earns points.
// 02 · Mining
Mining (PoW)
You can't buy a card in a shop — you mine it. Mining here is real proof-of-work: your device searches nonces until a hash clears the difficulty threshold. The grind happens off-chain and is free; you only pay gas at the moment of mint.
work = keccak256(chainId ‖ contract ‖ miner ‖ nonce) valid ⟺ leadingZeroBits(work) ≥ requiredBits()
leadingZeroBits is the count of leading zero bits in the hash. The SpiritCards contract enforces this rule, and the on-chain Mined event carries exactly the same work a CLI miner computes.
| Difficulty | Default | Meaning |
|---|---|---|
| baseBits | 20 | Starting difficulty (required leading-zero bits) |
| bitsStepX100 | 33 | +0.33 bit per price era |
| requiredBits() | baseBits + era × bitsStepX100 / 100 | Current threshold |
Difficulty is fixed for the season and rises only alongside price eras — there is no 'difficulty ratchet', the fast-up / slow-down regulator that killed many earlier projects. Pace is set by the protocol (emission gate + price), not by a hashpower race, so a phone and a farm earn the same reward per card.
| Rate limit | Default | Meaning |
|---|---|---|
| mineCooldown | 45 s | Pause between mints per wallet |
| epochCap | 1000 cards | Cards per epoch, network-wide |
| epochLength | 3600 s (1 h) | Epoch length → hourly network cap |
| Price era | Default | Meaning |
|---|---|---|
| eraPrice | 0.00037 ETH | Starting price of an era |
| priceStepBps | 2500 | +25% per era (soft, not ×2) |
| eraSize | 1111 cards | Cards per price era |
| maxSupply | 8888 | Final, finite supply |
With eraSize 1111 and maxSupply 8888 there are ≈8 price eras: the price walks from the first era up to a few dollars in the last one — a soft step, not a doubling.
Chip (ERC-1155): a full-price mint grants one chip; using a chip takes −30% off your next mint and the chip is burned. A discounted mint only spends the chip and grants no new one.
All of these are Config knobs — the owner can retune difficulty, rate limits and prices without redeploying.
// 03 · Merge
Merge
Merge is the reroll: two weak cards fuse into one stronger card. The world's supply shrinks (deflation), and junk that nobody would buy at mint price becomes a chance at rarity.
- Pick two of your cards (neither may be staked).
- Pay a small merge fee.
- Both cards burn; one new card a tier higher is born (evolution).
The child's seed is decided after inclusion, so you cannot pre-compute a winning pair before the transaction. base = max(rankA, rankB); the child is a weighted pick that can stay the same or, rarely, drop.
| Parameter | Default | Meaning |
|---|---|---|
| mergeFee | 0.00002 ETH | Fee per merge |
| mergeFailBps | 700 | 7% chance of an empty merge |
If a merge comes up empty (dud), both cards burn and no new card appears — this is anti-arbitrage protection (it closes the '2×N is always worth less than N+1' loop). Set mergeFailBps = 0 to disable it. Invariants: you can't merge a card with itself, nor a card you don't own or that is staked; the operation is atomic.
// 04 · Staking
Staking (6 tiers)
Staking is the card bank. You lock a card in the StakeVault for a chosen term and receive a share of the pool — a portion of the real fees the game actually collects. Longer locks carry more weight and therefore a bigger share.
| Tier | Lock | Weight | Multiplier |
|---|---|---|---|
| t0 | flexible (0 days) | 1000 | ×1 |
| t1 | 7 days | 5000 | ×5 |
| t2 | 30 days | 10000 | ×10 |
| t3 | 90 days | 20000 | ×20 |
| t4 | 180 days | 30000 | ×30 |
| t5 | 365 days | 40000 | ×40 |
t0 is flexible (withdraw any time); t1–t5 are hard locks — the card can't be withdrawn before the term ends. Weight sets what fraction of the pool a card receives relative to every other staked card.
The pool is filled by project fees (a share of mint, merge and pack revenue) and external revenue (duel rake), then distributed proportional to weight inside the StakeVault (accRewardPerWeight). If no cards are staked, inflows accrue and go to the first staker. You can claim at any time without unstaking, and stakeBatch / claimBatch / unstakeBatch move many cards in one transaction.
A staked card can still fight: it never leaves the vault — it is only locked for the duel (lockForBattle), dividends keep accruing, and no NFT approval is needed. If it loses its last life in battle, the vault itself burns it and settles any unclaimed rewards to the staker.
Honest warning: the pool is tied to real activity. No mints or turnover → no inflows → payouts fall, down to zero. This is a revenue-share of what the project actually earned, not 'interest on a deposit' and not a promise of return. No APY, no percentage returns and no payback dates are published or guaranteed.
// 05 · Battle
Battle
Battle v2 is a staked duel-escrow. Two players each commit one card and an equal stake in ETH; the winner takes the pot minus a rake, and the loser loses one of the card's three lives. Fights are resolved deterministically on-chain, but the outcome is gambling — not simply 'the stronger card always wins'.
Format: you create an open duel with a card + stake; an opponent accepts with their card + the same stake and the fight resolves in that same transaction; you can cancel your own open duel (card and stake return). You cannot accept your own duel. The pot is stake × 2.
Elements
| # | Element | Beats | Loses to |
|---|---|---|---|
| 0 | Ember | Stone | Tide |
| 1 | Stone | Gale | Ember |
| 2 | Gale | Tide | Stone |
| 3 | Tide | Ember | Gale |
Cycle: Ember › Stone › Gale › Tide › Ember. The winning element deals +20% damage; the losing one deals −20% (typeAdvBps = 2000).
Skills
| # | Skill | Effect |
|---|---|---|
| 0 | None | No effect |
| 1 | Crit | 20% chance to deal ×2 damage |
| 2 | Shield | Incoming damage −30% |
| 3 | Pierce | Ignores the defender's DEF |
| 4 | Precision | +15% damage, always |
| 5 | Vigor | +20% maximum HP |
A card's skill is derived from its seed (skill = (seed >> 208) % 6); the player doesn't control it.
Every attack is multiplied by a random factor in ±40% (atkVarianceBps = 4000). Add ±20% from element plus the skill effects, and the result is genuine variance: roughly equal cards are close to a coin flip, and a card about 25% stronger wins ≈72% of fights — the underdog still wins ≈28%. A clearly stronger card wins almost always.
Honest detail: the exact outcome also depends on the executing block's prevrandao, which the accepter does not know at signing time — so nobody can pick a guaranteed-winning moment. Because the fight is deterministic on-chain, anyone can replay the result off-chain from the card seeds, the stake and prevrandao.
Lives: each card has 3 lives. The loser loses one life; the winner takes the pot minus rake and gains +1 on its win counter. A card with 0 lives burns (a real supply sink), and every card keeps a win/loss history as its provenance.
| Share of rake | Where it goes | Parameter |
|---|---|---|
| 70% | Treasury (team) | remainder of rakeToPoolBps |
| 30% | Staker pool | rakeToPoolBps = 3000 |
The rake is 10% of the pot (pvpRakeBps = 1000). It is external revenue (not from mints), so duels feed the dividend pool. A duel is a zero-sum game between players plus the rake — not a pyramid.
Battle is a zero-sum gambling mechanic (plus rake): you can lose both money and cards. No income is guaranteed.
// 06 · Packs
Packs
Packs are buying a bundle of cards at a discount. The Packs contract mints N real cards to the buyer — normal token ids, normal rarity, normal rights. Buying a pack bypasses PoW, the epoch cap and the cooldown, because that is the product.
| Pack | Size (cards) | Discount |
|---|---|---|
| 0 | 5 | 3% |
| 1 | 10 | 6% |
| 2 | 25 | 12% |
| 3 | 50 | 20% |
| 4 | 100 | 30% |
Pack price = size × (currentPrice() × 2) − volume discount (packPriceBps = 20000): a pack skips proof-of-work, so each card costs ×2 the mint price minus the size discount. Revenue flows through the same shared split as every other fee (pool 60 / referral 10 / treasury 30 / reserve 0). Each card comes out of the 8888 max supply with rarity derived from its seed.
The contract keeps a pity counter for the buyer, and the public pull rates for rarities are disclosed on the dashboard.
A pack does not guarantee a specific card or a payback; a card's value is set by the market (secondary sales), not by the project. No income is guaranteed.
// 07 · Points
Points
Points are on-chain activity points plus a leaderboard. The game rewards activity — mining, merging, staking and PvP wins — and that competition is the retention engine.
| Action | Points (default) | Parameter |
|---|---|---|
| Mine | 1 | pointsMine |
| Merge | 2 | pointsMerge |
| Stake | 2 | pointsStake |
| PvP win | 3 | pointsPvpWin |
Points are credited by authorised modules (SpiritCards, StakeVault, Battle) through the Points contract and stored on-chain as points[address]; the leaderboard reads the same contract. Seasons are off-chain (by snapshot). The contract emits PointsAdded(user, amount, reason), so activity is verifiable.
Points have no monetary value and are not exchangeable for money — they are a gameplay metric. Season rewards are skins or unique items, not money. A new season resets only the leaderboard; your collection never rotates out of the game.
// 08 · Economy
Economy & Referral
Spirit Cards is a game; its money layer is built on the real fees the project actually collects. There is no guaranteed yield and no 'deposit at interest'. Everything distributed is a share of collected fees.
| Source | What it is |
|---|---|
| Mint | Payment to mine a card (eraPrice by price era) |
| Merge | The merge fee |
| Packs | Pack revenue (discounted) |
| PvP rake | 10% of each duel pot — external revenue |
| Royalty | 5% of secondary sales (ERC-2981) → treasury |
| Share | Where it goes | Parameter |
|---|---|---|
| 60% | Pool (staker dividends) | poolBps = 6000 |
| 10% | Referral fund | referralBps = 1000 |
| 30% | Treasury (team) | houseBps = 3000 |
| 0% | Reserve | reserveBps = 0 |
Every project fee is split by these fixed shares (they can be retuned via setSplit, but must always sum to 100%). Royalties (5%, ERC-2981) go to the treasury, not the pool, and come from secondary sales on OpenSea.
Referral: an invite is a percentage of the invitee's activity, not of their deposit. A player sets a referrer once, and the referrer must have mined at least once. From the 10% referral fund, 3% of the gross payment goes to the master referrer (a fixed top-level referrer for every payer) and 7% goes to the payer's own referrer. If a payer has no referrer, that 7% stays in the undistributed fund. Amounts credited to referrers are protected and cannot be withdrawn by the owner as 'leftover'.
The pool is filled by: 60% of mint fees, 60% of merge fees, 60% of pack revenue, 30% of the duel rake, and (planned) external sponsorship. Royalties do not go to the pool. A permissionless pumpPool() moves the accumulated pool into the StakeVault as dividends — anyone can call it, and the funds always go to the vault, never to the caller.
Honest math: the pool share is tied to activity — no fees means no inflows and payouts fall to zero. There are no APY figures, no percentage returns and no payback dates. There is no 'interest on a deposit' — referral is paid on activity only, and there is no manual floor-push or wash volume.
// 09 · Chain
Chain & Contracts
Spirit Cards deploys on Robinhood Chain, an Arbitrum Orbit L2, with gas paid in ETH. chainId 4663.
The core contracts are Config, SpiritCards, ChipToken (ERC-1155 chip), StakeVault, Battle, Points and Packs. Ownership moves to a multi-signature Safe (and later a timelock); every economic parameter is a Config knob, changeable without redeployment.
Trading happens on OpenSea, the marketplace native to the chain. There is no ERC-20 token and no LP — the project does not use Uniswap.
Contract addresses are maintained in the project's ops/ADDRESSES.md and are updated whenever the stack is redeployed. Treat that file as the single source of truth; we deliberately do not hard-code addresses in this guide, since they change.
Spirit Cards is a game. Points have no monetary value. Nothing here is financial advice, and nothing here promises a return — the pool is a revenue-share of real fees the game actually earns, with no guarantees.