fix: prevent panics from unsafe type assertions in trading code + add request body limit

Security & Reliability:
- Add requestBodyLimitMiddleware (1MB) to prevent OOM from oversized API payloads
- Fix defer resp.Body.Close() inside loop in getPublicIPFromAPI (connection leak)
- Add posFloat64/posString safe helpers for position map access

Panic Prevention (critical for trading):
- Convert 30+ unsafe type assertions (pos["key"].(type)) to safe comma-ok
  pattern across all exchange traders: OKX, Hyperliquid, Aster, Bybit,
  KuCoin, Gate, Bitget, Binance
- Fix auto_trader_risk.go: drawdown monitor could panic and silently stop
  monitoring, leaving positions unprotected
- Fix auto_trader_decision.go & auto_trader_loop.go: core trading loop
  position parsing now crash-proof
- All trader/ code now has zero unsafe type assertions

Frontend:
- Fix config.ts: rejected promise cached forever on network error (never retries)
This commit is contained in:
shinchan-zhai
2026-03-23 12:01:44 +08:00
parent 44d1ef42ad
commit acc52f2cf7
16 changed files with 101 additions and 56 deletions

View File

@@ -133,12 +133,12 @@ func (at *AutoTrader) GetAccountInfo() (map[string]interface{}, error) {
totalMarginUsed := 0.0
totalUnrealizedPnLCalculated := 0.0
for _, pos := range positions {
markPrice := pos["markPrice"].(float64)
quantity := pos["positionAmt"].(float64)
markPrice := posFloat64(pos, "markPrice")
quantity := posFloat64(pos, "positionAmt")
if quantity < 0 {
quantity = -quantity
}
unrealizedPnl := pos["unRealizedProfit"].(float64)
unrealizedPnl := posFloat64(pos, "unRealizedProfit")
totalUnrealizedPnLCalculated += unrealizedPnl
leverage := 10
@@ -199,16 +199,16 @@ func (at *AutoTrader) GetPositions() ([]map[string]interface{}, error) {
var result []map[string]interface{}
for _, pos := range positions {
symbol := pos["symbol"].(string)
side := pos["side"].(string)
entryPrice := pos["entryPrice"].(float64)
markPrice := pos["markPrice"].(float64)
quantity := pos["positionAmt"].(float64)
symbol := posString(pos, "symbol")
side := posString(pos, "side")
entryPrice := posFloat64(pos, "entryPrice")
markPrice := posFloat64(pos, "markPrice")
quantity := posFloat64(pos, "positionAmt")
if quantity < 0 {
quantity = -quantity
}
unrealizedPnl := pos["unRealizedProfit"].(float64)
liquidationPrice := pos["liquidationPrice"].(float64)
unrealizedPnl := posFloat64(pos, "unRealizedProfit")
liquidationPrice := posFloat64(pos, "liquidationPrice")
leverage := 10
if lev, ok := pos["leverage"].(float64); ok {