critical: Emergency close unprotected positions when exit orders missing (Bug #76 recurring)

This commit is contained in:
mindesbunister
2025-12-10 07:40:07 +01:00
parent d8ea7718ac
commit f67128b916

View File

@@ -956,9 +956,10 @@ export async function POST(request: NextRequest): Promise<NextResponse<ExecuteTr
console.error(` Expected: ${expectedCount} signatures (TP1 + TP2 + ${config.useDualStops ? 'Soft SL + Hard SL' : 'SL'})`)
console.error(` Got: ${exitOrderSignatures.length} signatures`)
console.error(` Position is UNPROTECTED! Missing stop loss!`)
console.error(` ⚠️ CLOSING POSITION IMMEDIATELY FOR SAFETY`)
// Log to persistent file for post-mortem
logCriticalError('MISSING_EXIT_ORDERS', {
await logCriticalError('MISSING_EXIT_ORDERS', {
symbol: driftSymbol,
direction: body.direction,
entryPrice,
@@ -970,7 +971,25 @@ export async function POST(request: NextRequest): Promise<NextResponse<ExecuteTr
useDualStops: config.useDualStops
})
// Continue with trade creation but flag as needing verification
// CRITICAL: Close the unprotected position immediately
try {
const driftService = getDriftService()
const closeResult = await driftService.closePosition(driftMarketIndex, 100)
console.log(`✅ Emergency closed unprotected position: ${closeResult}`)
} catch (closeError) {
console.error(`❌ Failed to emergency close unprotected position:`, closeError)
}
// Return error response - DO NOT create trade in database
return NextResponse.json({
success: false,
error: `Missing exit orders: expected ${expectedCount}, got ${exitOrderSignatures.length}. Position emergency closed for safety.`,
details: {
entryTx: openResult.transactionSignature,
expectedOrders: expectedCount,
actualOrders: exitOrderSignatures.length
}
}, { status: 500 })
}
}
} catch (err) {