Docs
How SquadFI works onchain — the protocol, not the marketing.
Game loop
Open packs → mint cards → register a 20-card squad before the deadline → squad locks during the stage → Scoring publishes a Merkle root → claim your prize from PrizeDistribution.
Card model
48 nations × (4 Bronze + 8 Silver + 10 Gold + 4 Star) = 1 248 playerTypes. playerTypeId = country×10 000 + rarity×1 000 + seq. Each minted card has a unique serial; identical types share artwork but score independently.
Rarity & odds
Bronze packs skew Bronze-heavy; Star packs only mint via Chainlink VRF for verifiable randomness. Rarity weights and price are onchain on each tier; check getPackTier(tierId) to see them in real time.
Marketplace
Player cards trade in $SQUAD only — never ETH. EIP-712 signed off-chain orders for gasless listing. Every sale burns 7% of the $SQUAD paid (deflationary by design); the remaining 93% goes to the seller.
Stage scoring
Off-chain data feeds publish a candidate stageScore + manager rankings via Scoring.commitStageScore. A 24-hour challenge window can reject corruption. After expiry anyone may executeFinalization to publish the Merkle root.
Prize claim
Once Scoring finalizes, your owed amount is a leaf in PrizeDistribution.managerMerkleRoot. Submit (amount, proof) to claim(). Unclaimed funds expire at claimDeadline and can be swept back to treasury.
Governance
Ownership is held by a TimelockController (1-day delay). The eventual Gnosis Safe is the timelock proposer. PRIZE_GUARDIAN_ROLE retains emergency pause but can't withdraw funds (liability gate enforces).