2 Commits

Author SHA1 Message Date
mindesbunister
b813a38ae9 fix: Handle multiple DB trades for single Drift position in validator
PROBLEM (User identified):
- Analytics showed 3 open trades when Drift UI showed only 1 position
- Database had 3 separate trade records all marked as 'open'
- Root cause: Drift has 1 POSITION + 3 ORDERS (TP/SL exit orders)
- Validator was incorrectly treating each as separate position

SOLUTION:
- Group database trades by symbol before validation
- If multiple DB trades exist for one Drift position, keep only MOST RECENT
- Close older duplicate trades with exitReason='DUPLICATE_CLEANUP'
- Properly handles: 1 Drift position → 1 DB trade (correct state)

RESULT:
- Database: 1 open trade (matches Drift reality)
- Analytics: Shows accurate position count
- Runs automatically every 10 minutes + manual trigger available
2025-11-16 21:36:21 +01:00
mindesbunister
66c3c42547 feat: Add automated database sync validator for ghost position detection
PROBLEM:
- Analytics page showed 3 open trades when only 1 actually open on Drift
- Ghost positions in database (realizedPnL set but exitReason = NULL)
- Happens when on-chain orders fill but database update fails
- Manual cleanup required = unreliable dashboard

SOLUTION: Automated Database Sync Validator
1. Runs every 10 minutes (independent of Position Manager)
2. Validates ALL 'open' database trades against actual Drift positions
3. Auto-fixes ghost positions (marks as closed with exitReason)
4. Provides manual validation endpoint: GET /api/admin/validate-db

FEATURES:
- Detects ghost positions (DB open, Drift closed)
- Detects orphan positions (DB closed, Drift open)
- Provides detailed validation reports
- Runs on server startup + periodic intervals
- Zero manual intervention required

FILES:
- lib/database/sync-validator.ts: Core validation logic
- app/api/admin/validate-db/route.ts: Manual validation endpoint
- instrumentation.ts: Auto-start on server initialization

RESULT: Reliable dashboard data - always matches Drift reality
2025-11-16 21:30:29 +01:00