Parent: #877
Depends on: #886, #887, #893
Scope
Update /airdrop page to show final campaign results and allow users to claim their PLOT.
Built and tested during Phase 0 test run (#892), reused at actual campaign end.
Campaign End State
When CAMPAIGN_END has passed, the /airdrop page transitions to show:
Final Results
- Campaign complete badge
- Final TWAP mcap + milestone achieved (or "No milestone reached")
- Pool distribution: X PLOT distributed, Y PLOT burned
- Burn tx link
Claim Section (replaces points panel)
- If user is eligible:
- Show allocated amount: "You earned X PLOT"
- [Claim PLOT] button → calls
MerkleClaim.claim(amount, proof)
- Proof fetched from API:
GET /api/airdrop/proof?address=0x...
- After claim: show "Claimed" + tx link
- If already claimed: show "Claimed" status + tx link
- If not eligible: "You did not earn any PLOT in this campaign"
API Addition
GET /api/airdrop/proof?address=0x...
Returns Merkle proof for the user's claim:
{
"amount": "1150000000000000000000",
"proof": ["0x...", "0x...", ...],
"claimed": false
}
Files
- Update:
src/app/airdrop/page.tsx (campaign end state)
src/components/airdrop/ClaimPanel.tsx
src/app/api/airdrop/proof/route.ts
Acceptance Criteria
Parent: #877
Depends on: #886, #887, #893
Scope
Update
/airdroppage to show final campaign results and allow users to claim their PLOT.Built and tested during Phase 0 test run (#892), reused at actual campaign end.
Campaign End State
When
CAMPAIGN_ENDhas passed, the/airdroppage transitions to show:Final Results
Claim Section (replaces points panel)
MerkleClaim.claim(amount, proof)GET /api/airdrop/proof?address=0x...API Addition
GET /api/airdrop/proof?address=0x...Returns Merkle proof for the user's claim:
{ "amount": "1150000000000000000000", "proof": ["0x...", "0x...", ...], "claimed": false }Files
src/app/airdrop/page.tsx(campaign end state)src/components/airdrop/ClaimPanel.tsxsrc/app/api/airdrop/proof/route.tsAcceptance Criteria