Quick Read
The 30-Second Version
The whole protocol in five steps. The rest of this guide expands on each.
Stake
Lock any of your BasedUndeads NFTs into the staking contract.
Royalties Arrive
Every secondary sale on OpenSea pays a 7.5% royalty. 50% flows to the staker pool. 50% to the creator wallet.
Your Share
Hold 100 of 1,000 staked? You earn 10% of every royalty deposit. Pure proportional split.
Claim Anytime
Rewards accrue in real time onchain. Claim whenever, no minimum, no delay.
Unstake After 24h
Each stake action locks your entire staked balance for 24 hours.
Why Stake at All?
From Idle to Yield-Bearing
You hold a BasedUndead. It just sits there. Someone buys another one for 1 ETH on OpenSea, the creator earns 0.075 ETH royalty. Without staking, that royalty goes 100% to the creator wallet.
With staking active, half of every royalty flows directly to people who locked their NFTs. The contract handles everything onchain. No admin discretion, no off-chain spreadsheets, no trust required.
The Mechanics
The Math, Plain English
When a royalty arrives at the staking contract, here's what happens:
The reward pool isn't actually held in a literal "pool", it uses a math trick called the Synthetix pull pattern. Instead of paying every staker individually (which would cost a fortune in gas every sale), the contract just bumps a global counter. Each user's earnings are calculated the moment they ask, based on how that counter has moved since they last interacted.
Result: gas costs stay constant whether there are 5 stakers or 5,000.
Walkthrough
A Realistic Scenario
Setup: 700 unique holders, 6,666 NFTs in circulation, mainnet just launched. Three holders enter and exit at different times. Watch the math play out.
Alice stakes 250 NFTs
Alice connects her wallet and stakes all 250 of her BasedUndeads. She is the only staker. Her 24h lock starts now, she can't unstake until tomorrow at this time.
A sale happens. Bob buys an Undead for 1 ETH on OpenSea.
0.0375 ETHโcreator wallet
0.0375 ETHโpool (Alice gets 100%)
Alice's earned = 0.0375 ETH
She can claim()
that 0.0375 ETH any time. Claiming doesn't reset her lock.
A second Bob stakes 100 NFTs
Now there are two stakers. Alice's share drops because the pool grew.
Alice = 250 / 350 = 71.4%
Bob = 100 / 350 = 28.6%
A sale happens. Another 0.075 ETH royalty arrives.
0.0375 ETHโpool, split:
Alice gets 0.02678 ETH (71.4%)
Bob gets 0.01071 ETH (28.6%)
Note: Alice's 0.0375 ETH from Phase 1 is still in her balance, untouched. The new royalty just adds on top.
Carol stakes 250 NFTs
Three stakers now. Pool grows to 600. All three split future royalties by share.
Alice = 250 / 600 = 41.67%
Bob = 100 / 600 = 16.67%
Carol = 250 / 600 = 41.67%
Alice unstakes all 250 (24h+ later)
The lock has expired. When unstake()
runs, the contract automatically:
2. Locks that amount into pendingRewards[Alice], preserved
3. Returns her 250 NFTs
4. stakedBalance[Alice] = 0, totalStaked drops to 350
Alice now has her 250 NFTs back in her wallet (transferable, sellable),
plus an accumulated pendingRewards
balance she can claim anytime.
She does NOT lose her unclaimed rewards by unstaking. They sit there until she calls claim().
Alice re-stakes without claiming
Alice changes her mind and re-stakes (without claiming first).
pendingRewards from Phase 4โuntouched, still claimable
Future earnedโadds on top of pending balance
Translation: re-staking doesn't reset rewards. Only the lock timer resets.
24h+ later, Alice adds 10 more NFTs
Alice has 250 staked. She just bought 10 more and wants to stake them.
totalStaked += 10
stakeTimestamp resetsโ24h lock applies to ALL 260
The
stakeTimestamp
field is per-wallet, not per-NFT. Adding more stake = resetting the entire timer.
More holders join the pool
Dave, Eve, Frank, they all stake. The pool grows. Each new staker:
โข Only earns from royalties arriving after they stake
โข Locks themselves for 24 hours
Existing stakers' earned balances are unaffected by new joiners, but their share percentage drops as the pool grows. If you held 5% when the pool was 1000 NFTs, you'd hold 2.5% when the pool reaches 2000 NFTs (assuming you don't add more stake).
Nothing breaks. The math always sums to 100%.
Quick Reference
Key Rules
The full lifecycle of every action, in one table. Bookmark this section.
| Action | Effect on Lock | Effect on Rewards |
|---|---|---|
| First stake | Starts 24h lock | Begin earning future royalties |
| Add more stake | Resets lock to 24h from now | Past earnings preserved, new flow joins them |
| Claim rewards | No effect on lock | Pays out and zeroes pendingRewards |
| Partial unstake (after 24h) | No effect, remaining NFTs keep their unlocked status | Earnings up to this moment locked into pendingRewards |
| Full unstake (after 24h) | Lock irrelevant once at zero balance | All earnings preserved, claimable anytime |
| Re-stake after full unstake | Restarts 24h lock | Past pendingRewards preserved, future earnings stack on top |
Common Questions
Things People Always Ask
Click any question to expand the answer. Covers every scenario you'll likely hit.
When do I start earning rewards after I stake?
The 24h lock is purely about when you can unstake โ it has zero effect on earnings. You could stake at 3:00 PM, see a sale happen at 3:01 PM, and watch your earned balance tick up immediately. You can even
claim() those rewards before the lock expires โ claiming and unstaking are two separate things.
If I claim rewards, does my staking position change?
If I unstake, do I lose my unclaimed rewards?
Can I stake at any time, or only at launch?
Why does the dashboard ask me to sign an "approval" the first time I stake?
setApprovalForAll. After that single signature, every future stake works without re-approval.This is standard for every NFT marketplace and staking platform, same pattern OpenSea, Magic Eden, and others use. The approval is for the staking contract specifically, not a blanket permission for anyone else. You can revoke it any time by calling
setApprovalForAll(stakingContract, false) if you want โ though you'd just have to re-approve to stake again.
What if no one is staking when a royalty arrives?
Why does adding more NFTs reset my full lock?
stakeTimestamp per wallet, not per NFT. This keeps
the contract simple and gas-efficient. The tradeoff: think carefully before adding to a
stake, you're committing the whole position for another 24 hours.
Can I stake a subset and keep some in my wallet?
Can I sell a staked NFT?
Can I claim my rewards and stake more NFTs in the same transaction?
stakeAndClaim() function that pays out any pending rewards and stakes new NFTs in a single transaction. Saves gas vs. doing both separately.Heads up: the 24h lock will still reset, because adding more stake always counts as a fresh stake action. But at least you only pay gas once. The dashboard will offer this option automatically when you have both unclaimed rewards and NFTs selected to stake.
What's the gas cost?
Unstake: similar.
Claim: ~50k gas regardless of accumulated amount.
On Base, that's typically pennies in ETH.
Where do my rewards go when I claim?
Can the team take my staked NFTs?
unstake() for your tokens. The contract owner can update the royalty
receiver address (used to redirect royalties to a redeployed staking contract if
ever needed) but cannot touch your NFTs or your earned rewards.
What if I lose my wallet or private key?
unstake() or claim() for that wallet.The team has no admin override to recover NFTs from a lost wallet. This is a feature, not a bug it's why the staking contract is genuinely trustless. But it means you should treat your wallet security as protecting both your NFTs and your accumulated rewards.
Use a hardware wallet (Ledger, Trezor) for any wallet holding significant NFTs or staking positions. Back up your seed phrase. Never share it with anyone โ not even people claiming to be from the team.
What if the staking contract gets redeployed?
1. Call
claim() to take your rewards.2. Call
unstake() (after 24h lock passes) to get your NFTs back.3. Stake fresh into the new contract.
There is no automated migration, only YOU control your staked NFTs. The team will announce migrations well in advance.
Pro Tip
A Word on Lock Timing
If you want to stake NFTs in waves and avoid restarting your lock unnecessarily, plan ahead.
Stake in batches, not in dribbles
If your stake plan is "buy more over the next month," consider waiting until you're done buying before staking, or accept that each new stake adds another 24h to the clock for the whole position. You can also treat future Undeads as a separate "round" and keep them in your wallet until you have a clean batch ready.
Final Mental Model
A Yield-Bearing Locker
The Locker Analogy
Think of staking like a yield-bearing locker.
You put NFTs in.
The lock door says: "24h after the most recent deposit."
While locked, the locker pays you ETH based on royalties from secondary sales.
You can withdraw the ETH anytime through a window in the door (claim).
You can take the NFTs out only after the lock door opens.
Adding new NFTs bolts the door shut for another 24h.
Taking some NFTs out doesn't reset the lock, once open, it stays open until you add more.
That's it. Welcome to the horde.
READY?
Open the staking dashboard, connect your wallet, and lock your Undeads. Royalties begin flowing the moment you stake.