feat: 添加 Paradex 适配器支持,更新环境变量配置和适配器构建逻辑

This commit is contained in:
discountry
2025-10-06 18:06:23 +08:00
parent ccc3a2bf89
commit cfd5f4309d
18 changed files with 1681 additions and 177 deletions
+46
View File
@@ -0,0 +1,46 @@
import { afterEach, beforeEach, describe, expect, it } from "vitest";
import { resolveSymbolFromEnv } from "../src/config";
const ORIGINAL_ENV = { ...process.env };
beforeEach(() => {
process.env = { ...ORIGINAL_ENV };
});
afterEach(() => {
process.env = { ...ORIGINAL_ENV };
});
describe("resolveSymbolFromEnv", () => {
it("prefers exchange-specific symbol when available", () => {
process.env.EXCHANGE = "backpack";
process.env.BACKPACK_SYMBOL = "ETHUSDC";
process.env.TRADE_SYMBOL = "BTCUSDT";
expect(resolveSymbolFromEnv()).toBe("ETHUSDC");
});
it("falls back to TRADE_SYMBOL when exchange symbol is missing", () => {
process.env.EXCHANGE = "paradex";
process.env.TRADE_SYMBOL = "ETH/USDC";
delete process.env.PARADEX_SYMBOL;
expect(resolveSymbolFromEnv()).toBe("ETH/USDC");
});
it("uses exchange-specific fallback when no env is defined", () => {
process.env.EXCHANGE = "paradex";
delete process.env.PARADEX_SYMBOL;
delete process.env.TRADE_SYMBOL;
expect(resolveSymbolFromEnv()).toBe("BTC/USDC");
});
it("supports resolving symbol for an explicit exchange id", () => {
delete process.env.EXCHANGE;
process.env.GRVT_SYMBOL = "ETHUSDT";
expect(resolveSymbolFromEnv("grvt")).toBe("ETHUSDT");
});
});
+13
View File
@@ -3,6 +3,7 @@ import { createExchangeAdapter, resolveExchangeId } from "../src/exchanges/creat
import { AsterExchangeAdapter } from "../src/exchanges/aster-adapter";
import { GrvtExchangeAdapter } from "../src/exchanges/grvt/adapter";
import { BackpackExchangeAdapter } from "../src/exchanges/backpack/adapter";
import { ParadexExchangeAdapter } from "../src/exchanges/paradex/adapter";
const ORIGINAL_ENV = { ...process.env };
@@ -28,6 +29,7 @@ describe("exchange factory", () => {
expect(resolveExchangeId("Grvt")).toBe("grvt");
expect(resolveExchangeId("ASTER")).toBe("aster");
expect(resolveExchangeId("BACKPACK")).toBe("backpack");
expect(resolveExchangeId("PaRaDeX")).toBe("paradex");
});
it("creates grvt adapter when EXCHANGE=grvt", () => {
@@ -54,4 +56,15 @@ describe("exchange factory", () => {
expect(adapter).toBeInstanceOf(BackpackExchangeAdapter);
expect(adapter.id).toBe("backpack");
});
it("creates paradex adapter when EXCHANGE=paradex", () => {
process.env.EXCHANGE = "paradex";
process.env.PARADEX_PRIVATE_KEY = "0x" + "1".repeat(64);
process.env.PARADEX_WALLET_ADDRESS = "0x" + "2".repeat(40);
process.env.PARADEX_SYMBOL = "BTC/USDC";
const adapter = createExchangeAdapter({ symbol: "BTC/USDC" });
expect(adapter).toBeInstanceOf(ParadexExchangeAdapter);
expect(adapter.id).toBe("paradex");
});
});