Files
ritmex-bot/tests/exchange-factory.test.ts
DisneyandGitHub d6399b92aa Feat/support binance (#22)
* add docs

* Add Binance exchange support

- Updated the environment configuration to include Binance as a selectable exchange option.
- Enhanced the README documentation to reflect the addition of Binance.
- Implemented the Binance exchange adapter and integrated it into the existing exchange framework.
- Modified the basis arbitrage strategy to support Binance alongside existing exchanges.
- Added tests to ensure proper functionality and integration of Binance within the trading system.

* Enhance README with detailed Binance exchange configuration

- Added comprehensive instructions for setting up Binance as an exchange option.
- Included environment variable specifications for API keys, market types, and trading symbols.
- Provided examples for both perpetual and spot trading strategies.
- Clarified the use of WebSocket and REST for the Binance adapter.

* Enhance exchange support and testing framework

- Added a new test suite for exchange contracts to ensure consistency and functionality across supported exchanges.
- Refactored exchange ID handling to utilize a centralized list of supported exchanges, improving maintainability.
- Updated CLI argument parsing and help documentation to reflect the new exchange structure.
- Introduced utility functions for validating supported exchanges and their display names.
- Enhanced the BasisApp and strategy runner to leverage the new exchange validation logic.
- Added a new test command for running exchange-related tests.

* Refactor exchange contract tests and update CLI commands

- Removed the trailing supported exchanges set and simplified the logic for trailing stop support in the exchange contract tests.
- Updated the test command for exchange contracts to exclude unnecessary tests, streamlining the testing process.
- Enhanced test descriptions for clarity and improved understanding of the functionality being tested.
2026-02-27 11:37:44 +08:00

96 lines
3.6 KiB
TypeScript

import { describe, expect, it, beforeEach, afterEach } from "vitest";
import { createExchangeAdapter, resolveExchangeId } from "../src/exchanges/create-adapter";
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";
import { StandxExchangeAdapter } from "../src/exchanges/standx/adapter";
import { BinanceExchangeAdapter } from "../src/exchanges/binance/adapter";
const ORIGINAL_ENV = { ...process.env };
beforeEach(() => {
process.env = { ...ORIGINAL_ENV };
});
afterEach(() => {
process.env = { ...ORIGINAL_ENV };
});
describe("exchange factory", () => {
it("defaults to aster when no env is provided", () => {
delete process.env.EXCHANGE;
process.env.ASTER_API_KEY = "key";
process.env.ASTER_API_SECRET = "secret";
const adapter = createExchangeAdapter({ symbol: "BTCUSDT" });
expect(adapter).toBeInstanceOf(AsterExchangeAdapter);
expect(adapter.id).toBe("aster");
});
it("resolves exchange id case-insensitively", () => {
expect(resolveExchangeId("Grvt")).toBe("grvt");
expect(resolveExchangeId("ASTER")).toBe("aster");
expect(resolveExchangeId("BACKPACK")).toBe("backpack");
expect(resolveExchangeId("PaRaDeX")).toBe("paradex");
expect(resolveExchangeId("StandX")).toBe("standx");
expect(resolveExchangeId("BiNaNcE")).toBe("binance");
});
it("creates grvt adapter when EXCHANGE=grvt", () => {
process.env.EXCHANGE = "grvt";
process.env.GRVT_API_KEY = "api-key";
process.env.GRVT_API_SECRET = "0x" + "1".repeat(64);
process.env.GRVT_SUB_ACCOUNT_ID = "sub";
process.env.GRVT_INSTRUMENT = "BTC_USDT_Perp";
process.env.GRVT_SYMBOL = "BTCUSDT";
delete process.env.GRVT_SIGNER_PATH;
const adapter = createExchangeAdapter({ symbol: "BTCUSDT" });
expect(adapter).toBeInstanceOf(GrvtExchangeAdapter);
expect(adapter.id).toBe("grvt");
});
it("creates backpack adapter when EXCHANGE=backpack", () => {
process.env.EXCHANGE = "backpack";
process.env.BACKPACK_API_KEY = "api-key";
process.env.BACKPACK_API_SECRET = "secret";
process.env.TRADE_SYMBOL = "BTCUSDC";
const adapter = createExchangeAdapter({ symbol: "BTCUSDC" });
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");
});
it("creates standx adapter when EXCHANGE=standx", () => {
process.env.EXCHANGE = "standx";
process.env.STANDX_TOKEN = "token";
process.env.STANDX_SYMBOL = "BTC-USD";
const adapter = createExchangeAdapter({ symbol: "BTC-USD" });
expect(adapter).toBeInstanceOf(StandxExchangeAdapter);
expect(adapter.id).toBe("standx");
});
it("creates binance adapter when EXCHANGE=binance", () => {
process.env.EXCHANGE = "binance";
process.env.BINANCE_API_KEY = "api-key";
process.env.BINANCE_API_SECRET = "api-secret";
process.env.BINANCE_SYMBOL = "BTCUSDT";
const adapter = createExchangeAdapter({ symbol: "BTCUSDT" });
expect(adapter).toBeInstanceOf(BinanceExchangeAdapter);
expect(adapter.id).toBe("binance");
});
});