The ShamaRSVP airdrop distributes 10,000 SHAMA tokens across a maximum of 2,000 RSVP passes. To participate, users mint an ERC-721 RSVP pass for 0.003 ETH each — a one-time reservation fee that funds the project. Each pass entitles its holder to claim 5 SHAMA tokens after a 90-day waiting period from the moment the pass was minted. On a successful claim, the NFT is permanently burned and the SHAMA is transferred directly to the caller’s wallet. Passes can be freely transferred, meaning it is the holder at claim time — not necessarily the original minter — who receives the tokens. There is no wallet cap on how many passes a single address can hold or mint, so users who want a larger allocation can mint in bulk using batchMint.Once a pass is claimed it is gone — there is no double-claiming. The contract stores a permanent, on-chain record of every mint and every claim (including burned tokens), giving the ecosystem a single source of truth for full audit history at any time.
After minting, the pass is locked for 90 days. During this period the pass behaves like a normal ERC-721 token and can be held or transferred. You can check how much time remains before a pass becomes claimable with timeUntilClaimable(tokenId).
Once the 90-day lock has elapsed, call claimAirdrop(tokenId):
You must be the current holder of the pass at claim time.
5 SHAMA are transferred to your wallet.
The NFT is burned — one claim per pass, forever.
The claim is recorded permanently on-chain.
If you hold multiple passes, you must call claimAirdrop separately for each one. Each pass has its own independent 90-day timer starting from its individual mint timestamp.
Every minted pass has a permanent TokenInfo record that is never deleted, even after the NFT is burned.
struct TokenInfo { uint256 tokenId; // Unique pass ID address originalMinter; // Wallet that paid to mint uint256 mintTimestamp; // Block timestamp of mint (starts the 90-day clock) bool claimed; // True once claimAirdrop has been executed uint256 claimTimestamp; // Block timestamp of the successful claim (0 if unclaimed) address claimer; // Address that executed the claim (may differ from originalMinter)}