Files
trading_bot_v4/lib/trading
mindesbunister c607a66239 critical: Fix position close verification to prevent ghost positions
Problem:
- Close transaction confirmed on-chain BUT Drift state takes 5-10s to propagate
- Position Manager immediately checked position after close → still showed open
- Continued monitoring with stale state → eventually ghost detected
- Database marked 'SL closed' but position actually stayed open for 6+ hours
- Position was UNPROTECTED during this time (no monitoring, no TP/SL backup)

Root Cause:
- Transaction confirmation ≠ Drift internal state updated
- SDK needs time to propagate on-chain changes to internal cache
- Position Manager assumed immediate state consistency

Fix (2-layer verification):
1. closePosition(): After 100% close confirmation, wait 5s then verify
   - Query Drift to confirm position actually gone
   - If still exists: Return needsVerification=true flag
   - Log CRITICAL error with transaction signature

2. Position Manager: Handle needsVerification flag
   - DON'T mark position closed in database
   - DON'T remove from monitoring
   - Keep monitoring until ghost detection sees it's actually closed
   - Prevents premature cleanup with wrong exit data

Impact:
- Prevents 6-hour unmonitored position exposure
- Ensures database exit data matches actual Drift closure
- Ghost detection becomes safety net, not primary close mechanism
- User positions always protected until VERIFIED closed

Files:
- lib/drift/orders.ts: Added 5s wait + position verification after close
- lib/trading/position-manager.ts: Check needsVerification flag before cleanup

Incident: Nov 16, 02:51 - Close confirmed but position stayed open until 08:51
2025-11-16 10:00:10 +01:00
..