You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
7-day TWAP window of pl_daily_prices captured cleanly (no missing days)
If TWAP looks manipulated (per R12), delay settlement up to 7d via operator judgment
Bonding-curve depth check (per R17) — if insufficient liquidity for unlock, delay claim opening
T2.7 sweep-enabled MerkleClaim contract code merged + tested on testnet
Scope
This is finalize + review only. NO on-chain execution. The actual contract deploy / unlock / fund / burn / announce all happens in #1263 (T6.2 settlement day).
Run scripts/airdrop-finalize.ts (T2.6) in DRY-RUN mode first
Review output:
Total eligible wallets (matches eligible_activation_count from /status)
Total weighted spend
Per-tier released_pool value based on 7-day TWAP FDV (per §4.3: Bronze 20K / Silver 60K / Gold 100K / Diamond 200K)
Per-wallet share table (CSV)
Merkle root
Distribution dispute audit: publish CSV of per-wallet weighted spends to a public location BEFORE running for-real
Approve: confirm dry-run output looks correct, no anomalies, no is_blacklisted review issues
Run finalize for-real → writes pl_airdrop_proofs table + outputs final Merkle root
Even if the milestone tier is hit, if no wallet has positive weighted_spend (e.g., everyone activated but nobody bought storyline tokens), there are NO recipients to distribute to.
Record decision: ZERO-RECIPIENT in this issue (note: tier was X, but zero eligible recipients)
Detection during T6.1 dry-run: if finalize SQL returns 0 rows (because WHERE weighted_spend > 0 filters everything out), surface this clearly in dry-run output before for-real run. Don't write empty pl_airdrop_proofs.
Critical clarification: this ticket (T6.1) does NO on-chain execution under any branch. The 200K burn for sub-Bronze AND zero-recipient is executed in #1263, not here.
No is_blacklisted anomalies (per §10 q10 manual review if curation active)
Decision recorded in this issue: NORMAL / SUB-BRONZE / ZERO-RECIPIENT branch (RE1 r29: third branch added for FDV ≥ Bronze but no eligible recipients)
If NORMAL: for-real run executed; Merkle root recorded; CLAIM_WINDOW_DAYS value confirmed in this issue
Proof row count check (RE1 r28): pl_airdrop_proofs populated with **proof_count rows = COUNT(wallets where activated AND not blacklisted AND weighted_spend > 0)** — NOT eligible_activation_count`, because activated wallets with zero buy_volume produce zero share and get no proof row. Cross-check:
Epic: #1229 · Spec: §5, §8 Phase 6 · Type: OPERATOR · Estimate: 1 day
Pre-settlement checks
pl_daily_pricescaptured cleanly (no missing days)Scope
This is finalize + review only. NO on-chain execution. The actual contract deploy / unlock / fund / burn / announce all happens in #1263 (T6.2 settlement day).
scripts/airdrop-finalize.ts(T2.6) in DRY-RUN mode firsteligible_activation_countfrom /status)released_poolvalue based on 7-day TWAP FDV (per §4.3: Bronze 20K / Silver 60K / Gold 100K / Diamond 200K)is_blacklistedreview issuespl_airdrop_proofstable + outputs final Merkle rootCLAIM_WINDOW_DAYSvalue (from T2.1 config, default 30) and reference it in this issue for [T6.2] Settlement day (deploy contract + fund + announce) #1263 — actualclaimDeadlineis computed at [T6.2] Settlement day (deploy contract + fund + announce) #1263 Step 1 deploy time based on intended claim-open timestamp, NOT fromCAMPAIGN_END.Branching by tier outcome — hand off to #1263
Normal flow (FDV ≥ Bronze threshold)
claimDeadlineSub-Bronze flow (FDV < $100K)
Zero-recipient flow (FDV ≥ Bronze but
proof_count = 0) — RE1 r29Even if the milestone tier is hit, if no wallet has positive
weighted_spend(e.g., everyone activated but nobody bought storyline tokens), there are NO recipients to distribute to.Detection during T6.1 dry-run: if finalize SQL returns 0 rows (because
WHERE weighted_spend > 0filters everything out), surface this clearly in dry-run output before for-real run. Don't write emptypl_airdrop_proofs.Critical clarification: this ticket (T6.1) does NO on-chain execution under any branch. The 200K burn for sub-Bronze AND zero-recipient is executed in #1263, not here.
What T6.1 does NOT do
claimDeadline(deferred to [T6.2] Settlement day (deploy contract + fund + announce) #1263 deploy time)CLAIM_WINDOW_DAYSvalue for [T6.2] Settlement day (deploy contract + fund + announce) #1263 to useAcceptance
is_blacklistedanomalies (per §10 q10 manual review if curation active)CLAIM_WINDOW_DAYSvalue confirmed in this issuepl_airdrop_proofspopulated with **proof_countrows = COUNT(wallets where activated AND not blacklisted AND weighted_spend > 0)** — NOTeligible_activation_count`, because activated wallets with zero buy_volume produce zero share and get no proof row. Cross-check:proof_count ≤ eligible_activation_count(sanity upper bound)proof_count = COUNT(*)fromv_weighted_spendhelper whereweighted_spend > 0proof_count = 0(with reason — all wallets had weighted_spend ≤ 0); [T6.2] Settlement day (deploy contract + fund + announce) #1263 Zero-Recipient branch flagged; [T6.5] At claimDeadline: sweep unclaimed to dead address #1266 marked skipDependencies
End of 3-month campaign window; #1260 T5.2 launch-day (live with real campaign data — was previously #1261 T5.3 before round-9 merge); T2.6 (#1248 — finalize script merged); T2.7 (#1267 — sweep-enabled contract code merged + tested)