Fix critical balance validation and add comprehensive trading features
- Fixed CoinGecko API rate limiting with fallback SOL price (68.11) - Corrected internal API calls to use proper Docker container ports - Fixed balance validation to prevent trades exceeding wallet funds - Blocked 0.5 SOL trades with only 0.073 SOL available (~2.24) - Added persistent storage for positions, trades, and pending orders - Implemented limit order system with auto-fill monitoring - Created pending orders panel and management API - Added trades history tracking and display panel - Enhanced position tracking with P&L calculations - Added wallet balance validation API endpoint - Positions stored in data/positions.json - Trade history stored in data/trades.json - Pending orders with auto-fill logic - Real-time balance validation before trades - All trades now validate against actual wallet balance - Insufficient balance trades are properly blocked - Added comprehensive error handling and logging - Fixed Docker networking for internal API calls - SPOT and leveraged trading modes - Limit orders with price monitoring - Stop loss and take profit support - DEX integration with Jupiter - Real-time position updates and P&L tracking Tested and verified all balance validation works correctly
This commit is contained in:
@@ -11,7 +11,10 @@ export async function POST(request) {
|
||||
takeProfit,
|
||||
useRealDEX = false,
|
||||
tradingPair,
|
||||
quickSwap = false
|
||||
quickSwap = false,
|
||||
closePosition = false,
|
||||
fromCoin,
|
||||
toCoin
|
||||
} = body
|
||||
|
||||
console.log('🔄 Execute DEX trade request:', {
|
||||
@@ -56,6 +59,47 @@ export async function POST(request) {
|
||||
)
|
||||
}
|
||||
|
||||
// Validate balance before proceeding (skip for position closing)
|
||||
if (!closePosition) {
|
||||
console.log('🔍 Validating wallet balance before DEX trade...')
|
||||
|
||||
try {
|
||||
const validationResponse = await fetch('http://localhost:3000/api/trading/validate', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
symbol,
|
||||
side,
|
||||
amount,
|
||||
tradingMode: 'SPOT',
|
||||
fromCoin,
|
||||
toCoin
|
||||
})
|
||||
})
|
||||
|
||||
const validationResult = await validationResponse.json()
|
||||
|
||||
if (!validationResult.success) {
|
||||
console.log('❌ DEX balance validation failed:', validationResult.message)
|
||||
return NextResponse.json({
|
||||
success: false,
|
||||
error: validationResult.error,
|
||||
message: validationResult.message,
|
||||
validation: validationResult
|
||||
}, { status: validationResponse.status })
|
||||
}
|
||||
|
||||
console.log('✅ DEX balance validation passed')
|
||||
} catch (validationError) {
|
||||
console.error('❌ DEX balance validation error:', validationError)
|
||||
return NextResponse.json({
|
||||
success: false,
|
||||
error: 'VALIDATION_FAILED',
|
||||
message: 'Could not validate wallet balance for DEX trade. Please try again.'
|
||||
}, { status: 500 })
|
||||
}
|
||||
}
|
||||
|
||||
// For now, simulate the trade until Jupiter integration is fully tested
|
||||
if (!useRealDEX) {
|
||||
console.log('🎮 Executing SIMULATED trade (real DEX integration available)')
|
||||
@@ -147,29 +191,54 @@ export async function POST(request) {
|
||||
message: `${side.toUpperCase()} order executed on Jupiter DEX${stopLoss || takeProfit ? ' with TP/SL monitoring' : ''}`
|
||||
}
|
||||
|
||||
// Create position for successful trade
|
||||
// Add trade to history
|
||||
try {
|
||||
const positionResponse = await fetch('http://localhost:3000/api/trading/positions', {
|
||||
await fetch('http://localhost:3000/api/trading/history', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
action: 'add',
|
||||
symbol: tradingPair || `${symbol}/USDC`,
|
||||
symbol: tradingPair || `${fromCoin || symbol}/${toCoin || 'USDC'}`,
|
||||
side: side.toUpperCase(),
|
||||
amount: amount,
|
||||
entryPrice: 168.1, // You'll need to get this from the actual trade execution
|
||||
stopLoss: stopLoss,
|
||||
takeProfit: takeProfit,
|
||||
price: 168.1, // Get from actual execution
|
||||
type: 'market',
|
||||
status: 'executed',
|
||||
txId: tradeResult.txId,
|
||||
leverage: 1
|
||||
dex: 'JUPITER',
|
||||
notes: closePosition ? 'Position closing trade' : null
|
||||
})
|
||||
})
|
||||
|
||||
if (positionResponse.ok) {
|
||||
console.log('✅ Position created for DEX trade')
|
||||
}
|
||||
console.log('✅ Trade added to history')
|
||||
} catch (error) {
|
||||
console.error('❌ Failed to create position:', error)
|
||||
console.error('❌ Failed to add trade to history:', error)
|
||||
}
|
||||
|
||||
// Create position only if not closing an existing position
|
||||
if (!closePosition) {
|
||||
try {
|
||||
const positionResponse = await fetch('http://localhost:3000/api/trading/positions', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
action: 'add',
|
||||
symbol: tradingPair || `${fromCoin || symbol}/${toCoin || 'USDC'}`,
|
||||
side: side.toUpperCase(),
|
||||
amount: amount,
|
||||
entryPrice: 168.1, // Get from actual execution
|
||||
stopLoss: stopLoss,
|
||||
takeProfit: takeProfit,
|
||||
txId: tradeResult.txId,
|
||||
leverage: 1
|
||||
})
|
||||
})
|
||||
|
||||
if (positionResponse.ok) {
|
||||
console.log('✅ Position created for DEX trade')
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('❌ Failed to create position:', error)
|
||||
}
|
||||
}
|
||||
|
||||
return NextResponse.json(tradeResponse)
|
||||
|
||||
Reference in New Issue
Block a user