From 728cb5b07d8b68c89dfb5c40b2292f9ea7060e73 Mon Sep 17 00:00:00 2001 From: Cho Young-Hwi Date: Tue, 21 Apr 2026 18:38:32 +0900 Subject: [PATCH] [#914] Add pl_airdrop_proofs table and remove type workarounds - Create migration 00036 with pl_airdrop_proofs table (address PK, amount, proof, merkle_root) - Add TypeScript types for pl_airdrop_proofs in Database interface - Remove `as never` assertions from proof and results API routes - Bump patch version to 0.1.28 Fixes #914 Co-Authored-By: Claude Opus 4.6 (1M context) --- lib/supabase.ts | 28 ++++++++++++++++++++ package.json | 2 +- src/app/api/airdrop/proof/route.ts | 6 ++--- src/app/api/airdrop/results/route.ts | 4 +-- supabase/migrations/00036_airdrop_proofs.sql | 11 ++++++++ 5 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 supabase/migrations/00036_airdrop_proofs.sql diff --git a/lib/supabase.ts b/lib/supabase.ts index d3312477..25646197 100644 --- a/lib/supabase.ts +++ b/lib/supabase.ts @@ -457,6 +457,33 @@ export interface Database { }; Relationships: []; }; + pl_airdrop_proofs: { + Row: { + address: string; + amount: string; + proof: string; + merkle_root: string; + created_at: string; + updated_at: string; + }; + Insert: { + address: string; + amount: string; + proof: string; + merkle_root: string; + created_at?: string; + updated_at?: string; + }; + Update: { + address?: string; + amount?: string; + proof?: string; + merkle_root?: string; + created_at?: string; + updated_at?: string; + }; + Relationships: []; + }; pl_weekly_snapshots: { Row: { id: number; @@ -721,3 +748,4 @@ export type PlReferralCode = Database["public"]["Tables"]["pl_referral_codes"][" export type PlStreak = Database["public"]["Tables"]["pl_streaks"]["Row"]; export type PlDailyPrice = Database["public"]["Tables"]["pl_daily_prices"]["Row"]; export type PlWeeklySnapshot = Database["public"]["Tables"]["pl_weekly_snapshots"]["Row"]; +export type PlAirdropProof = Database["public"]["Tables"]["pl_airdrop_proofs"]["Row"]; diff --git a/package.json b/package.json index 267269fd..1d9c269e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "plotlink", - "version": "0.1.27", + "version": "0.1.28", "private": true, "workspaces": [ "packages/*" diff --git a/src/app/api/airdrop/proof/route.ts b/src/app/api/airdrop/proof/route.ts index 82f52cf5..4dafd813 100644 --- a/src/app/api/airdrop/proof/route.ts +++ b/src/app/api/airdrop/proof/route.ts @@ -18,10 +18,10 @@ export async function GET(req: NextRequest) { } const { data, error } = await supabase - .from("pl_airdrop_proofs" as never) + .from("pl_airdrop_proofs") .select("amount, proof, merkle_root") - .eq("address" as never, address) - .single() as { data: { amount: string; proof: string; merkle_root: string } | null; error: unknown }; + .eq("address", address) + .single(); if (error || !data) { return NextResponse.json({ eligible: false, amount: null, proof: null, claimed: false }); diff --git a/src/app/api/airdrop/results/route.ts b/src/app/api/airdrop/results/route.ts index 3ff2c7ef..9ebf7582 100644 --- a/src/app/api/airdrop/results/route.ts +++ b/src/app/api/airdrop/results/route.ts @@ -18,8 +18,8 @@ export async function GET() { // Read all finalized proof amounts const { data, error } = await supabase - .from("pl_airdrop_proofs" as never) - .select("amount") as { data: { amount: string }[] | null; error: unknown }; + .from("pl_airdrop_proofs") + .select("amount"); if (error || !data || data.length === 0) { return NextResponse.json({ finalized: false }); diff --git a/supabase/migrations/00036_airdrop_proofs.sql b/supabase/migrations/00036_airdrop_proofs.sql new file mode 100644 index 00000000..ea2de384 --- /dev/null +++ b/supabase/migrations/00036_airdrop_proofs.sql @@ -0,0 +1,11 @@ +-- Airdrop proof storage (#914) +-- Stores finalized Merkle proofs generated by airdrop-finalize script + +CREATE TABLE pl_airdrop_proofs ( + address TEXT PRIMARY KEY, + amount TEXT NOT NULL, -- wei amount as string (bigint precision) + proof TEXT NOT NULL, -- JSON-stringified array of bytes32 hashes + merkle_root TEXT NOT NULL, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +);