Launch app

Contracts

Seven contracts, one pool

Responsibilities are split so that a change to rewards or randomness does not require migrating a contract that holds other people's NFTs.

ContractResponsibilityStatus
TuckCore pool — positions, weighting, pricing, selection, settlementImplemented
TuckWhitelistCollection curation with sticky blockingImplemented
TuckRandomnessRouter with swappable beacon adapters; drand adapter firstImplemented
TuckTreasuryProtocol revenue, segregated from operator capitalImplemented
TuckRewardsCrown, on-chain points accrual, epoch accountingPlanned
TuckClaimMerkle distribution of the Phase 1 retroactive allocationImplemented
TuckersThe TUCKERS collection — mint, rarity tiers, fee weightImplemented

Why the split matters

Phase 1 pays no token, but the settlement path still calls a reward distributor with a null implementation behind it. Hardcoding “no reward” instead would turn Phase 3 into a contract migration while the pool holds other people’s NFTs.

The treasury separates third-party revenue from operator capital for the same reason: Phase 2 triggers have to be computed from third-party revenue only, and that is not recoverable after the fact if both were pooled.

Tiers are committed, not announced

Tuckers takes a hash of the tier list in its constructor and only accepts the list itself after the mint has closed. Publishing the list up front would let minters watch the queue and buy the token ids that land on Legendary; publishing only its hash removes that edge while still proving the tiers were not reassigned once the art was seen.

On reveal the contract checks the commitment and recounts the distribution — 1,400 / 400 / 150 / 40 / 10, summing to a total fee weight of 3,600. A list with nine Legendaries instead of ten is rejected on-chain, because every published fee-share figure divides by that total.

Curation, in detail

TuckWhitelist was the first contract implemented. Allowing a collection is reversible; blocking it is not. An owner key that could quietly un-block a collection is a strictly worse trust assumption than one that cannot, so revoking is the reversible action and blocking is permanent.

Allowing also rejects anything that does not advertise ERC-721 through ERC-165, so a typo in a curated list fails loudly instead of sitting there as a dead entry. Blocking deliberately skips that check — a collection that has turned hostile may well have stopped answering introspection, and the owner must still be able to bar it.