From 28bc1d5210ca240ca1c6b8f1a8076823fff3f18c Mon Sep 17 00:00:00 2001 From: discountry Date: Wed, 12 Nov 2025 20:34:02 +0800 Subject: [PATCH] feat: improve error handling in OffsetMakerEngine and enhance logging in LighterGateway for better debugging and robustness --- src/exchanges/lighter/adapter.ts | 3 +-- src/exchanges/lighter/gateway.ts | 11 ++++++----- src/strategy/offset-maker-engine.ts | 19 ++++++++++++++++--- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/exchanges/lighter/adapter.ts b/src/exchanges/lighter/adapter.ts index 7bef7fd..f6690cd 100644 --- a/src/exchanges/lighter/adapter.ts +++ b/src/exchanges/lighter/adapter.ts @@ -162,8 +162,7 @@ export class LighterExchangeAdapter implements ExchangeAdapter { return; } if (isSuccessfulResponse(error)) { - console.info(`[LighterExchangeAdapter] ${context}: ${JSON.stringify(error)}`); - return; + return; // success responses are noisy; ignore unless non-200 } console.error(`[LighterExchangeAdapter] ${context} failed: ${extractMessage(error)}`); } diff --git a/src/exchanges/lighter/gateway.ts b/src/exchanges/lighter/gateway.ts index f6b90ad..9c46641 100644 --- a/src/exchanges/lighter/gateway.ts +++ b/src/exchanges/lighter/gateway.ts @@ -174,6 +174,7 @@ export class LighterGateway { private readonly auth = { token: null as string | null, expiresAt: 0 }; private readonly l1Address: string | null; private loggedCreateOrderPayload = false; + private readonly logTxInfo: boolean; private httpEmptySince: number | null = null; private lastWsPositionUpdateAt = 0; @@ -243,6 +244,7 @@ export class LighterGateway { this.tickerPollMs = options.tickerPollMs ?? DEFAULT_TICKER_POLL_MS; this.klinePollMs = options.klinePollMs ?? DEFAULT_KLINE_POLL_MS; this.l1Address = options.l1Address ?? null; + this.logTxInfo = process.env.LIGHTER_LOG_TX === "1" || process.env.LIGHTER_LOG_TX === "true"; } async ensureInitialized(): Promise { @@ -288,10 +290,9 @@ export class LighterGateway { apiKeyIndex, nonce, }); - if (!this.loggedCreateOrderPayload) { - if (process.env.LIGHTER_DEBUG === "1" || process.env.LIGHTER_DEBUG === "true") { - this.logger("createOrder.txInfo", signed.txInfo); - } + const debugEnabled = process.env.LIGHTER_DEBUG === "1" || process.env.LIGHTER_DEBUG === "true"; + if (this.logTxInfo && !this.loggedCreateOrderPayload) { + this.logger("createOrder.txInfo", signed.txInfo); this.loggedCreateOrderPayload = true; } const auth = await this.ensureAuthToken(); @@ -299,7 +300,7 @@ export class LighterGateway { authToken: auth, priceProtection: false, }); - if (process.env.LIGHTER_DEBUG === "1" || process.env.LIGHTER_DEBUG === "true") { + if (debugEnabled && response.code !== 200) { this.logger("createOrder.sendTx.response", response); } const clientOrderIndexStr = signParams.clientOrderIndex.toString(); diff --git a/src/strategy/offset-maker-engine.ts b/src/strategy/offset-maker-engine.ts index fc72140..04fb592 100644 --- a/src/strategy/offset-maker-engine.ts +++ b/src/strategy/offset-maker-engine.ts @@ -546,10 +546,20 @@ export class OffsetMakerEngine { this.lastEntryOrderBySide[target.side] = { price: target.price, ts: Date.now() }; } } catch (error) { - const dustClosed = await this.tryDustMarketClose(target, error); - if (!dustClosed) { - this.tradeLog.push("error", `挂单失败(${target.side} ${target.price}): ${String(error)}`); + if (isRateLimitError(error)) { + throw error; } + let dustClosed = false; + try { + dustClosed = await this.tryDustMarketClose(target, error); + } catch (dustError) { + if (isRateLimitError(dustError)) { + throw dustError; + } + this.tradeLog.push("error", `小额市价平仓失败: ${String(dustError)}`); + } + if (dustClosed) continue; + this.tradeLog.push("error", `挂单失败(${target.side} ${target.price}): ${String(error)}`); } } } @@ -760,6 +770,9 @@ export class OffsetMakerEngine { this.tradeLog.push("order", `小额仓位使用市价平仓 ${target.side} 数量 ${absQty.toFixed(6)}`); return true; } catch (closeError) { + if (isRateLimitError(closeError)) { + throw closeError; + } this.tradeLog.push("error", `小额市价平仓失败: ${String(closeError)}`); return false; }