Operator todo — complete airdrop launch checklist
Updated 2026-06-26. Covers everything needed for the full airdrop system. Items marked ✅ are done in code. Items marked 🔧 need your laptop/dashboard.
PHASE 1 — Immediate (tonight, ~45 min)
🔧 STEP 1 — Enable multichain on Alchemy (2 min)
Issue: your Alchemy app currently only has Ethereum mainnet enabled, which is why the eligibility checker shows "HTTP 403" on Arbitrum, Optimism, Base, Polygon, Avalanche.
- Go to https://dashboard.alchemy.com
- Open your existing app (the Hyperlane relayer app you already use)
- Click "Update Networks" (or gear icon → Networks)
- Check: ☑ Arbitrum One, ☑ OP Mainnet, ☑ Base, ☑ Polygon Mainnet, ☑ Avalanche C-Chain
- Save
Free tier covers all 6 chains. Same API key works on all of them.
🔧 STEP 2 — Set ALCHEMY_API_KEY on airdrop-app (2 min)
If not already set:
- Railway → airdrop-app service → Variables
- Add:
ALCHEMY_API_KEY=<your_key>(same key from STEP 1) - Click "Redeploy"
Verify: https://airdrop.sanect.com/eligibility → try vitalik's address (0xd8da6bf26964af9d7eed9e03e53415d37aa96045) → should show 7+ yr OG tier across all 6 chains, ~500ms response.
🔧 STEP 3 — Create LP incentive pairs (5 min)
Locked LP incentive program needs: SNCT/USDC, SNCT/USDT, SNCT/WETH, SNCT/WBTC. First two already exist. Last two need creating.
export RPC_URL=https://rpc.sanect.com
export DEPLOYER_PRIVATE_KEY=<your deployer key>
bash scripts/mainnet/create-lp-incentive-pairs.shWhat this does:
- Idempotent — skips USDC/WSNCT and USDT/WSNCT since they already exist
- Creates WETH/WSNCT and WBTC/WSNCT
- Updates
dex-pairs-deployed.jsonwith the new addresses - Cost: ~0.01 SNCT in gas
🔧 STEP 4 — Add pools to MasterChef (3 min)
export CHEF_OWNER_PRIVATE_KEY=<protocol-governance signer>
bash scripts/mainnet/setup-masterchef-pools.shWhat this does:
- Reads pair addresses from
dex-pairs-deployed.json - Calls
chef.addPool(allocPoint, lpToken)for each, skipping any already registered - Sets allocPoints to 300 / 300 / 200 / 200 (= 30/30/20/20 ratio)
- Cost: ~0.02 SNCT in gas
After this, dex-app's Farm tab will auto-render the 4 pools.
🔧 STEP 5 — Seed initial LP (15-20 min)
Without LP, pools emit SNCT but no one can stake. Use dex-app's "Pool" tab → "Add Liquidity" for each pair:
- SNCT/USDT: ~$100 each side (~1M SNCT + 100 USDT)
- SNCT/USDC: ~$100 each side
- SNCT/WETH: ~$100 each side (~1M SNCT + 0.03 WETH at ETH $3k)
- SNCT/WBTC: ~$100 each side (~1M SNCT + 0.001 WBTC at BTC $100k)
You'll need ~4M SNCT from treasury + ~$400 of stables + ~$100 each of WETH/WBTC. Bridge in USDT/USDC/WETH/WBTC from Ethereum via swap.sanect.com/bridge first. Users can add more liquidity at their own discretion — the bootstrap seed just makes the swap UI functional.
PHASE 2 — Deploy airdrop-indexer (30 min)
The airdrop-indexer v2 is fully rewritten for the locked 13-product points-per-time matrix. It replaces the old binary-engagement design.
🔧 STEP 6 — Create Postgres on Railway
Railway → New → Database → Postgres → copy DATABASE_URL
🔧 STEP 7 — Deploy airdrop-indexer service
Railway → New Service → Deploy from GitHub repo → root directory: airdrop-indexer
Set env vars:
DATABASE_URL=<from step 6>
SANECT_RPC_URL=http://snapshot-publisher.railway.internal:8080
SANECT_REST_URL=http://snapshot-publisher.railway.internal:8080/rest
SANECT_CHAIN_ID=7628
SANECT_START_BLOCK=1
SNCT_USD_PRICE=0.01
CURRENT_PHASE=1
SWEEP_INTERVAL_MINUTES=60Contract addresses default to mainnet values — no need to override unless changed.
What this does:
- Runs the event indexer (block-by-block log scanning for all 13 products)
- Runs the balance sweep (hourly snapshots for LP/shielded/bridge/delegation)
- Serves the points API on port 3001
- Schema auto-migrates on first boot
🔧 STEP 8 — Set custom domain
Add custom domain: airdrop-api.sanect.com (Cloudflare CNAME, DNS-only)
🔧 STEP 9 — Wire airdrop-app to indexer
Railway → airdrop-app → Variables → Add:
INDEXER_URL=https://airdrop-api.sanect.com→ Redeploy
After this, /api/points/0x... returns real on-chain data instead of mock.
Verify indexer health
curl https://airdrop-api.sanect.com/health
curl https://airdrop-api.sanect.com/api/points/0x...
curl https://airdrop-api.sanect.com/api/leaderboard?limit=10PHASE 3 — Marketing launch
🔧 STEP 10 — Deploy landing-site updates (15 min)
Verify https://sanect.com/tokenomics shows the 10-bucket allocation and Day 180/270/360/450 phase dates.
🔧 STEP 11 — Publish blog post (5 min)
Content at docs/marketing/blog-tokenomics-announcement.md → copy to CMS or landing/src/pages/blog/
Title suggestion: "SNCT tokenomics + airdrop: locked"
🔧 STEP 12 — Twitter thread (5 min)
Content at docs/marketing/twitter-thread-tokenomics.md → post via Typefully or manual
Schedule for 9-11am UTC (highest crypto-Twitter engagement) or post live.
🔧 STEP 13 — Pin TG + Discord (5 min)
Content at docs/marketing/telegram-discord-pinned.md → pin in @sanectnetwork TG + Discord #announcements
Optionally repost in #general after 30 min for second wave.
🔧 STEP 14 — Update homepage hero CTA (10 min)
Add a small banner above the fold on landing/src/pages/index.astro:
🪂 30% of supply allocated to community via airdrop.
First snapshot Day 180. Start earning points today →Linking to /airdrop (which is airdrop.sanect.com).
🔧 STEP 15 — Galxe campaign setup (30 min)
Galxe gives you instant off-chain verification (Twitter, TG, Discord, LinkedIn) without building it yourself.
- Sign up at galxe.com as project owner
- Verify sanect.com domain ownership
- Create campaign: "sanect launch quests"
- Add quests: Follow Twitter, Join TG, Join Discord, Retweet, Connect wallet
- Reward: just points (no immediate token — they redeem at Phase 1 claim)
Galxe pro tier is ~$5-10k/month. Worth it for the first 90 days; can drop after.
🔧 STEP 16 — Influencer outreach (1 hour)
Template at docs/marketing/influencer-outreach-template.md
Build a list of 50 mid-tier crypto Twitter accounts (5k-100k followers) in these niches:
- Privacy/ZK (Aztec, Aleo, Penumbra community voices)
- Cosmos ecosystem (Sei, Osmosis, Celestia influencers)
- L1 explainer accounts
- Airdrop hunters who maintain reputation
Send each: 1-line pitch + tokenomics link + airdrop points doc + their unique referral code (?ref=<address>). No payment — referral commission is their incentive.
What's shipped in code (no action needed)
| Component | Status |
|---|---|
| ✅ airdrop-indexer v2 | 13-product points matrix, event indexer, balance sweep, API |
| ✅ Points API endpoints | /api/points/:address, /api/leaderboard, /api/stats |
| ✅ Referral system | Registration + earnings calculation + anti-sybil gates |
| ✅ Off-chain points loading | POST /api/offchain for Galxe-verified social actions |
| ✅ Eligibility checker | 6-chain Alchemy, ~300ms response, wallet-age multiplier |
| ✅ LP farm config | Locked 30/30/20/20 weights, TVL tier caps |
| ✅ Pool creation scripts | Idempotent pair creation + MasterChef setup |
| ✅ airdrop-app → indexer wiring | Automatic fallback to mock when INDEXER_URL not set |
| ✅ Tokenomics doc | 10-bucket allocation locked |
| ✅ Points system doc | 13-product matrix locked |
| ✅ Distributor spec | Registered-claim contract spec |
| ✅ Marketing kit | Blog, Twitter thread, TG/Discord, influencer template |
Files shipped for reference
airdrop-indexer/— Full v2 rewrite (event indexer, balance sweep, API, referrals)scripts/mainnet/create-lp-incentive-pairs.sh— Idempotent pair creationscripts/mainnet/setup-masterchef-pools.sh— Idempotent MasterChef setupairdrop-app/app/api/points/[address]/route.ts— INDEXER_URL proxy + mock fallbackairdrop-app/app/api/leaderboard/route.ts— INDEXER_URL proxy + mock fallbackairdrop-app/app/api/stats/route.ts— INDEXER_URL proxy + mock fallbackairdrop-app/lib/genesisAllocation.ts— Speed + correctness fixesairdrop-app/app/eligibility/page.tsx— UX fixesdocs/airdrop-points-system-design.md— Phase 1 formula lockeddocs/tokenomics.md— 10-bucket allocation lockeddocs/airdrop-distributor-spec.md— Registered-claim contract specdocs/marketing/— Blog, Twitter thread, TG/Discord, influencer template
What's pending (not blocking launch)
| Item | ETA | Notes |
|---|---|---|
| AirdropDistributor.sol contract | Day 7-60 | Build + audit. Not needed until Day 180 claim |
| Anti-sybil clustering pipeline | Day 150 | Run T-30 before Phase 1 snapshot |
| Snapshot CSV publisher | Day 173 | 7 days before Phase 1 claim opens |
| SNCT price oracle integration | Week 2 | Replace fixed SNCT_USD_PRICE with CoinGecko + TWAP |
| Per-token USD oracle for bridge assets | Week 3 | Currently uses SNCT price as proxy |
| Shielded balance per-user tracking | Week 4 | Currently equal-split among known shielders |
Engineering sprint plan
| Week | Focus |
|---|---|
| Week 1 (Days 7-14) | AirdropDistributor contract + Foundry tests |
| Week 2 (Days 14-21) | Internal audit + fuzz |
| Week 3 (Days 21-50) | External audit engagement |
| Week 1-3 in parallel | Price oracle integration |
| Week 4-5 | Frontend claim flow |
| Week 6-7 | Subgraph + dashboard data integration |
| Week 8-13 | Anti-sybil pipeline + appeals system |
What NOT to do today
- Don't announce specific Phase 1 snapshot block height — that's revealed Day 173 (7 days before snapshot)
- Don't promise an exact "you'll get X SNCT for action Y" — points convert proportionally to the pool, not to fixed amounts
- Don't engage with "when claim?" beyond "Day 180 per the public roadmap"
- Don't ship the AirdropDistributor contract today — wait for audit
- Don't post specific multisig addresses publicly until Safe migration completes Day 14
- Don't pay influencers in SNCT directly — referral commission only
- Don't run "trade $X to earn N points" promos — points are time-locked or fee-locked, volume-loops contradict anti-wash design
- Don't extend Phase 1 timeline if launch tweets underperform — credibility of a locked roadmap > first-week metrics
What to track this week
- Twitter thread engagement (likes/RTs/replies in first 24h)
- Galxe campaign signups
- Referral code activations
- Telegram + Discord new joins
- DEX volume on sanect (item #1 in points matrix — early signal of organic activity)
- Bridge inbound (item #9)
If activity surges, the anti-sybil pipeline needs to be ready faster.
Quick command reference
# LP pools
export RPC_URL=https://rpc.sanect.com
export DEPLOYER_PRIVATE_KEY=<key>
bash scripts/mainnet/create-lp-incentive-pairs.sh
export CHEF_OWNER_PRIVATE_KEY=<key>
bash scripts/mainnet/setup-masterchef-pools.sh
# Verify indexer health after deploy
curl https://airdrop-api.sanect.com/health
# Check a wallet's points
curl https://airdrop-api.sanect.com/api/points/0x...
# Check leaderboard
curl https://airdrop-api.sanect.com/api/leaderboard?limit=10
# Load off-chain points (after Galxe verification)
curl -X POST https://airdrop-api.sanect.com/api/offchain \
-H 'Content-Type: application/json' \
-d '{"entries":[{"address":"0x...","channel":"twitter","points":100}]}'