Epic: #1229 · Spec: §3.3, §6.3 · Type: CODE · Estimate: 0.3 day
Scope
Create lib/airdrop/activation-verify.ts exporting:
```ts
export async function verifyFc(
username: string,
plotlinkFid: number
): Promise<
| { ok: true; fid: number }
| { ok: false; error: 'user_not_found' | 'not_following' | 'neynar_error' }
```
Wraps the 2 Neynar calls:
getUserByUsername(username) → fid
checkFollow(fid, plotlinkFid) → boolean
Partial-failure semantics (per §6.3):
- (1) 4xx/not-found →
{ ok: false, error: 'user_not_found' }
- (1) succeeds, (2) returns false →
{ ok: false, error: 'not_following' }
- (1) succeeds, (2) returns true →
{ ok: true, fid }
- Any 5xx / network →
{ ok: false, error: 'neynar_error' }
Use existing Neynar SDK / API key already used by DropCast.
Acceptance
Dependencies
None (Neynar key already configured)
Epic: #1229 · Spec: §3.3, §6.3 · Type: CODE · Estimate: 0.3 day
Scope
Create
lib/airdrop/activation-verify.tsexporting:```ts
export async function verifyFc(
username: string,
plotlinkFid: number
): Promise<
| { ok: true; fid: number }
| { ok: false; error: 'user_not_found' | 'not_following' | 'neynar_error' }
```
Wraps the 2 Neynar calls:
getUserByUsername(username)→ fidcheckFollow(fid, plotlinkFid)→ booleanPartial-failure semantics (per §6.3):
{ ok: false, error: 'user_not_found' }{ ok: false, error: 'not_following' }{ ok: true, fid }{ ok: false, error: 'neynar_error' }Use existing Neynar SDK / API key already used by DropCast.
Acceptance
{ ok: true, fid }neynar_errorDependencies
None (Neynar key already configured)