Abstract
Pullympus is an on-chain gacha for graded trading cards. Each card is a physical slab held by a professional custodian and represented 1:1 by an NFT. Users pay a fixed USDC price per pull; the outcome is drawn from a public randomness beacon (drand) that is verified by the contract itself, against odds the contract publishes. After a pull, users keep the card, sell it back at a guaranteed offer, trade it peer to peer, or redeem the physical slab. Proof of reserve is reconciled continuously against the custodian's inventory.
The problem
Online “mystery pulls” for collectibles ask users to trust an operator they cannot see: the odds, the selection, the existence of the cards and the price of an exit are all off-chain promises. Physical breaks are hard to verify and illiquid. Pullympus moves each of these promises into code that anyone can audit:
- Odds and pools live in the contract and cannot change while pulls are pending.
- Selection comes from randomness that no party, including the operator, can predict or steer.
- Every token is backed by a recorded slab, reconciled publicly.
- Every pull comes with a liquid exit: a buyback offer and an open marketplace.
System overview
| Component | Role |
|---|---|
| GachaMachine | Machines, pools by tier, commit and settlement queue, buyback quotes, sell-back, Turbo |
| CardNFT | ERC-721 + ERC-2981; each token records custodian, reference, grader, grade and certificate |
| DrandVerifier | Verifies drand evmnet BLS signatures on BN254 and caches verified rounds |
| BuybackVault | Holds all USDC: reservations, user credits, outflow breaker, treasury cap |
| PriceRegistry | Fair market value per token, bounded updates, per-machine price freshness |
| Marketplace | Fixed-price USDC listings without escrow |
| Redemption | Request, acknowledge, fulfil (burn), cancel and reclaim for physical delivery |
| AccessManager + Guardian | Role-based permissions, timelocked admin, instant revocation of hot keys |
Off-chain services (keeper, pricer, reconciler, watchdog and an operations API) only act through these contracts. None of them can choose an outcome or move user funds.
Pull lifecycle
- Commit.
commitPullchecks that the machine is open, its prices are fresh, the outflow breaker is not tripped and every tier holds more cards than pending pulls. The price is collected into the vault, which reserves the machine's highest payout cap plus a settlement tip. The pull is bound to the second drand round after the current block. - Settle.
settleNextis permissionless. The caller supplies the drand beacon; the contract verifies it and processes pulls in commit order. Each pull's randomness selects a tier by the published odds, then a card within the tier. The caller earns the settlement tip, so settlement does not depend on any single operator. - Deliver. The NFT is transferred to the user together with a buyback quote locked at settlement. With Turbo, chosen tiers are sold back immediately and the card returns to staging.
- Refund. If the bound round is never published, the user can reclaim the full price 72 hours after it was due. Refunds are refused once the round is verified on-chain, so nobody can skip a known outcome.
Randomness
drand is a distributed randomness beacon operated by the League of Entropy, a group of independent organisations. Its evmnet network publishes a BLS signature every few seconds on the BN254 curve, which EVM precompiles can verify cheaply. Pullympus pins the network's public key and genesis in the contract.
- Unpredictable: the round a pull uses does not exist when the pull is committed.
- Unbiasable: a valid signature is unique; the operator cannot choose among outcomes.
- Verifiable: the contract rejects any beacon that does not verify; anyone can recompute a pull off-chain.
Because pools cannot change while pulls are pending, the set a pull draws from is fixed at commit time.
Custody & reserve
Slabs are held by a professional custodian (a graded-card vault). When a slab enters inventory, a CardNFT is minted that records the custodian and its reference for that slab. The reconciler compares every live token with the custodian's holdings and publishes the result; a mismatch raises an alert and is visible on the proof-of-reserve page.
Redemption is the only way a card leaves custody: the user submits the token and a signed fee quote, the operator ships the slab, and the token is burned with the tracking hash recorded on-chain. Personal shipping details never touch the chain.
Economics
For a machine with pull price P, cards are banded into tiers by fair market value (default bands: Mortal 0.2–0.8 P, Hero 0.8–3.2 P, Olympian above 3.2 P). Prices come from market data and are written by a pricer whose updates the registry bounds to ±25% per 24 hours; a machine stops accepting pulls if its prices go stale.
| Parameter | Default |
|---|---|
| Odds (Mortal / Hero / Olympian) | 70% / 25% / 5% |
| Buyback offer | 85% of FMV, valid 72 h |
| Payout caps per tier | 0.5 P / 1.2 P / 5 P |
| Worst-case expected payout | ≤ 90% of P (enforced on-chain) |
| Settlement tip | 0.05 USDC per pull |
| Marketplace fee | 2% royalty to the treasury |
| Outflow circuit breaker | Pauses commits above 30% net vault outflow in 24 h |
| Treasury withdrawals | Daily cap |
The vault holds a float that backs pending pulls and live buyback quotes. Funds reserved for users or credited to them cannot be withdrawn by the treasury. Revenue comes from the spread between pull prices and the expected value paid out, marketplace fees and redemption handling.
Security
- Every privileged function is gated by an OpenZeppelin AccessManager role. On mainnet the admin role is a multisig with a 48-hour execution delay.
- Hot operational keys (keeper, pricer, operator) hold only the narrow role they need. A Guardian contract lets an emergency key revoke them instantly, while granting stays behind the timelock.
- Settlement, refunds, sell-backs and withdrawals cannot be paused against users.
- The contracts passed an internal security review with every high, medium and low finding fixed and covered by unit, fuzz and invariant tests. An independent external audit precedes mainnet.
$PULLY & points
$PULLY is the planned token of the Pullympus ecosystem. It is planned to launch on a bonding-curve launchpad: a fair launch where everyone buys on the same public curve, with no private sale.
| Element | Plan |
|---|---|
| Launch | Fair launch on a bonding-curve launchpad; launchpad and date to be announced |
| Season rewards | The team buys 10% of the supply at launch, on the same curve as everyone, and holds it only to distribute to players: Season 0, Season 1 and later seasons |
| Buyback | $PULLY trading fees and Pullympus app fees (marketplace fees and the house margin) are used to buy back $PULLY |
| Distribution | Bought-back $PULLY funds the rewards of the next season, starting with Season 1 (mainnet alpha) |
| Points | Each season's points convert to that season's share of $PULLY, pro rata |
Season 0 on testnet awards points for on-chain activity: pulls (scaled by price, with tier bonuses), marketplace sales and sell-backs, with a daily cap per wallet. How the 10% is split between seasons, the conversion ratio, eligibility and timing will be published before any conversion. The reward wallet will be public so anyone can follow its balance and transfers.
Roadmap
- Testnet Season 0 (live): six machines, marketplace, redemption flow, points and leaderboard.
- External audit of the contracts and services.
- Mainnet soft launch: two machines backed by real slabs from a professional custodian.
- $PULLY: fair launch on a bonding-curve launchpad, Season 0 points conversion, Season 1 on mainnet alpha funded by buybacks.
- Growth: more machines and categories, further seasons.
Risks
- Smart-contract risk: audits reduce but do not eliminate the chance of bugs.
- Custody risk: physical slabs depend on the custodian's operations and insurance.
- Market risk: card values move; buyback offers follow fair market value.
- Dependency risk: drand, the Elysium network and price sources are external systems.
- Regulatory risk: availability may be restricted in some jurisdictions.