Context
The airdrop campaign has automated point accrual, price recording, and a claim UI — but the post-campaign resolution requires ~5 manual steps in sequence with no documentation or safety checks.
Post-Campaign Runbook (current state)
After CAMPAIGN_END passes:
Step 1: Run finalization script
npx tsx scripts/airdrop-finalize.ts
- Computes 7-day TWAP FDV from
pl_daily_prices
- Determines highest reached milestone tier
- Calculates per-address distribution (points-proportional, largest-remainder)
- Generates Merkle tree + per-address proofs
- Writes to
scripts/airdrop-proofs.json + pl_airdrop_proofs DB table
Step 2: Unlock PLOT from Mint Club Locker
- Manual tx on Base to unlock from Locker contract (0xA3dCf3Ca587D9929d540868c924f208726DC9aB6)
- Locker ID: stored in
AIRDROP_CONFIG.LOCKER_ID
- Requires unlock time to have passed
Step 3: Deploy MerkleClaim.sol
- Deploy with: PLOT token address + Merkle root from Step 1
- Verify contract on Basescan
Step 4: Transfer PLOT to claim contract
- Send the distributed amount (pool × milestone pct) to the MerkleClaim contract address
- UI auto-switches to
<ClaimPanel/> — users can now claim
Step 5: Burn remaining PLOT
- Calculate:
poolAmount × (1 - pct/100)
- Send to dead address (0x000...dead)
- If no milestone reached: burn 100%
Gaps / Missing automation
- No runbook doc — these steps exist only in code comments and tribal knowledge
- Burn not automated — finalization script calculates burn amount but doesn't execute
- No contract deployment script — manual Foundry/Hardhat deploy
- No emergency stop — no way to pause or terminate campaign early
- No unclaimed token handling — no sweep deadline for unclaimed PLOT after claim period
- No post-deploy verification — no script to verify claim contract has correct balance + root
- No alerts — no notification when campaign ends or when finalization should run
Acceptance Criteria
Context
The airdrop campaign has automated point accrual, price recording, and a claim UI — but the post-campaign resolution requires ~5 manual steps in sequence with no documentation or safety checks.
Post-Campaign Runbook (current state)
After
CAMPAIGN_ENDpasses:Step 1: Run finalization script
pl_daily_pricesscripts/airdrop-proofs.json+pl_airdrop_proofsDB tableStep 2: Unlock PLOT from Mint Club Locker
AIRDROP_CONFIG.LOCKER_IDStep 3: Deploy MerkleClaim.sol
Step 4: Transfer PLOT to claim contract
<ClaimPanel/>— users can now claimStep 5: Burn remaining PLOT
poolAmount × (1 - pct/100)Gaps / Missing automation
Acceptance Criteria
docs/(step-by-step with exact commands and addresses)