@123456btc/123456btc-cli 1.0.5 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/dist/api/signals.d.ts +3 -3
  2. package/dist/api/signals.d.ts.map +1 -1
  3. package/dist/api/signals.js +3 -3
  4. package/dist/api/signals.js.map +1 -1
  5. package/dist/api/strategy-stream.d.ts +4 -9
  6. package/dist/api/strategy-stream.d.ts.map +1 -1
  7. package/dist/api/strategy-stream.js +14 -13
  8. package/dist/api/strategy-stream.js.map +1 -1
  9. package/dist/api/strategy.d.ts +3 -1
  10. package/dist/api/strategy.d.ts.map +1 -1
  11. package/dist/api/strategy.js +3 -1
  12. package/dist/api/strategy.js.map +1 -1
  13. package/dist/commands/exchange.d.ts +3 -0
  14. package/dist/commands/exchange.d.ts.map +1 -0
  15. package/dist/commands/exchange.js +141 -0
  16. package/dist/commands/exchange.js.map +1 -0
  17. package/dist/commands/signals.js +7 -7
  18. package/dist/commands/signals.js.map +1 -1
  19. package/dist/commands/strategy.d.ts.map +1 -1
  20. package/dist/commands/strategy.js +181 -8
  21. package/dist/commands/strategy.js.map +1 -1
  22. package/dist/commands/vault.d.ts.map +1 -1
  23. package/dist/commands/vault.js +5 -3
  24. package/dist/commands/vault.js.map +1 -1
  25. package/dist/config/strategy-exchange.d.ts +30 -0
  26. package/dist/config/strategy-exchange.d.ts.map +1 -0
  27. package/dist/config/strategy-exchange.js +130 -0
  28. package/dist/config/strategy-exchange.js.map +1 -0
  29. package/dist/exchange/index.d.ts +106 -0
  30. package/dist/exchange/index.d.ts.map +1 -0
  31. package/dist/exchange/index.js +43 -0
  32. package/dist/exchange/index.js.map +1 -0
  33. package/dist/exchange/v2/adapters/base.d.ts +130 -0
  34. package/dist/exchange/v2/adapters/base.d.ts.map +1 -0
  35. package/dist/exchange/v2/adapters/base.js +296 -0
  36. package/dist/exchange/v2/adapters/base.js.map +1 -0
  37. package/dist/exchange/v2/adapters/binance.d.ts +51 -0
  38. package/dist/exchange/v2/adapters/binance.d.ts.map +1 -0
  39. package/dist/exchange/v2/adapters/binance.js +549 -0
  40. package/dist/exchange/v2/adapters/binance.js.map +1 -0
  41. package/dist/exchange/v2/adapters/bitget.d.ts +43 -0
  42. package/dist/exchange/v2/adapters/bitget.d.ts.map +1 -0
  43. package/dist/exchange/v2/adapters/bitget.js +524 -0
  44. package/dist/exchange/v2/adapters/bitget.js.map +1 -0
  45. package/dist/exchange/v2/adapters/hyperliquid.d.ts +102 -0
  46. package/dist/exchange/v2/adapters/hyperliquid.d.ts.map +1 -0
  47. package/dist/exchange/v2/adapters/hyperliquid.js +536 -0
  48. package/dist/exchange/v2/adapters/hyperliquid.js.map +1 -0
  49. package/dist/exchange/v2/adapters/okx.d.ts +38 -0
  50. package/dist/exchange/v2/adapters/okx.d.ts.map +1 -0
  51. package/dist/exchange/v2/adapters/okx.js +437 -0
  52. package/dist/exchange/v2/adapters/okx.js.map +1 -0
  53. package/dist/exchange/v2/algorithms/index.d.ts +78 -0
  54. package/dist/exchange/v2/algorithms/index.d.ts.map +1 -0
  55. package/dist/exchange/v2/algorithms/index.js +441 -0
  56. package/dist/exchange/v2/algorithms/index.js.map +1 -0
  57. package/dist/exchange/v2/executor/circuit-breaker.d.ts +44 -0
  58. package/dist/exchange/v2/executor/circuit-breaker.d.ts.map +1 -0
  59. package/dist/exchange/v2/executor/circuit-breaker.js +90 -0
  60. package/dist/exchange/v2/executor/circuit-breaker.js.map +1 -0
  61. package/dist/exchange/v2/executor/core.d.ts +64 -0
  62. package/dist/exchange/v2/executor/core.d.ts.map +1 -0
  63. package/dist/exchange/v2/executor/core.js +458 -0
  64. package/dist/exchange/v2/executor/core.js.map +1 -0
  65. package/dist/exchange/v2/executor/risk.d.ts +29 -0
  66. package/dist/exchange/v2/executor/risk.d.ts.map +1 -0
  67. package/dist/exchange/v2/executor/risk.js +144 -0
  68. package/dist/exchange/v2/executor/risk.js.map +1 -0
  69. package/dist/exchange/v2/executor/state.d.ts +29 -0
  70. package/dist/exchange/v2/executor/state.d.ts.map +1 -0
  71. package/dist/exchange/v2/executor/state.js +171 -0
  72. package/dist/exchange/v2/executor/state.js.map +1 -0
  73. package/dist/exchange/v2/index.d.ts +50 -0
  74. package/dist/exchange/v2/index.d.ts.map +1 -0
  75. package/dist/exchange/v2/index.js +82 -0
  76. package/dist/exchange/v2/index.js.map +1 -0
  77. package/dist/exchange/v2/registry.d.ts +50 -0
  78. package/dist/exchange/v2/registry.d.ts.map +1 -0
  79. package/dist/exchange/v2/registry.js +101 -0
  80. package/dist/exchange/v2/registry.js.map +1 -0
  81. package/dist/exchange/v2/types.d.ts +413 -0
  82. package/dist/exchange/v2/types.d.ts.map +1 -0
  83. package/dist/exchange/v2/types.js +3 -0
  84. package/dist/exchange/v2/types.js.map +1 -0
  85. package/dist/index.d.ts +105 -22
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +40 -37
  88. package/dist/index.js.map +1 -1
  89. package/dist/types/financial.d.ts +14 -0
  90. package/dist/types/financial.d.ts.map +1 -0
  91. package/dist/types/financial.js +6 -0
  92. package/dist/types/financial.js.map +1 -0
  93. package/dist/vault/crypto.js +3 -3
  94. package/dist/vault/crypto.js.map +1 -1
  95. package/dist/vault/index.d.ts +28 -0
  96. package/dist/vault/index.d.ts.map +1 -1
  97. package/dist/vault/index.js +70 -0
  98. package/dist/vault/index.js.map +1 -1
  99. package/package.json +1 -1
@@ -0,0 +1,106 @@
1
+ import type { Price, Quantity } from '../types/financial';
2
+ export interface ExchangeConfig {
3
+ apiKey: string;
4
+ apiSecret: string;
5
+ passphrase?: string;
6
+ privateKey?: string;
7
+ }
8
+ export interface OrderRequest {
9
+ symbol: string;
10
+ side: 'buy' | 'sell';
11
+ type: 'market' | 'limit';
12
+ quantity?: Quantity;
13
+ price?: Price;
14
+ }
15
+ export interface OrderResponse {
16
+ orderId: string;
17
+ symbol: string;
18
+ side: string;
19
+ status: string;
20
+ price: string;
21
+ quantity: string;
22
+ executedQty: string;
23
+ }
24
+ export interface PositionInfo {
25
+ symbol: string;
26
+ side: 'long' | 'short';
27
+ entryPrice: string;
28
+ quantity: string;
29
+ unrealizedPnl: string;
30
+ }
31
+ export interface BalanceInfo {
32
+ asset: string;
33
+ free: string;
34
+ locked: string;
35
+ }
36
+ export interface KLine {
37
+ time: number;
38
+ open: number;
39
+ high: number;
40
+ low: number;
41
+ close: number;
42
+ volume: number;
43
+ }
44
+ export declare const EXCHANGE_CONFIG: {
45
+ readonly okx: {
46
+ readonly name: "OKX";
47
+ readonly fields: readonly [{
48
+ readonly key: "apiKey";
49
+ readonly label: "API Key";
50
+ readonly required: true;
51
+ }, {
52
+ readonly key: "apiSecret";
53
+ readonly label: "API Secret";
54
+ readonly required: true;
55
+ }, {
56
+ readonly key: "passphrase";
57
+ readonly label: "Passphrase";
58
+ readonly required: true;
59
+ }];
60
+ readonly docs: "https://www.okx.com/cn/trade-blog/7439";
61
+ };
62
+ readonly bitget: {
63
+ readonly name: "Bitget";
64
+ readonly fields: readonly [{
65
+ readonly key: "apiKey";
66
+ readonly label: "API Key";
67
+ readonly required: true;
68
+ }, {
69
+ readonly key: "apiSecret";
70
+ readonly label: "API Secret";
71
+ readonly required: true;
72
+ }, {
73
+ readonly key: "passphrase";
74
+ readonly label: "Passphrase";
75
+ readonly required: false;
76
+ }];
77
+ readonly docs: "https://www.bitget.com/zh-CN/doc/7843";
78
+ };
79
+ readonly binance: {
80
+ readonly name: "Binance";
81
+ readonly fields: readonly [{
82
+ readonly key: "apiKey";
83
+ readonly label: "API Key";
84
+ readonly required: true;
85
+ }, {
86
+ readonly key: "apiSecret";
87
+ readonly label: "API Secret";
88
+ readonly required: true;
89
+ }];
90
+ readonly docs: "https://www.binance.com/zh-CN/doc/7843";
91
+ };
92
+ readonly hyperliquid: {
93
+ readonly name: "Hyperliquid";
94
+ readonly fields: readonly [{
95
+ readonly key: "apiKey";
96
+ readonly label: "钱包地址 (主账户地址,非API密钥地址)";
97
+ readonly required: true;
98
+ }, {
99
+ readonly key: "privateKey";
100
+ readonly label: "API Private Key (交易密钥私钥)";
101
+ readonly required: true;
102
+ }];
103
+ readonly docs: "https://hyperliquid.gitbook.io/hyperliquid-docs";
104
+ };
105
+ };
106
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/exchange/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC1D,MAAM,WAAW,cAAc;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,KAAK;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CACf;AAKD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmClB,CAAC"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EXCHANGE_CONFIG = void 0;
4
+ // RELEASE_036: OKX/Bitget/Binance/Hyperliquid 类及 createExchange 已迁移至 src/exchange/v2/
5
+ // 此文件保留 EXCHANGE_CONFIG(UI 配置用)和 KLine 类型(指标层使用)
6
+ exports.EXCHANGE_CONFIG = {
7
+ okx: {
8
+ name: 'OKX',
9
+ fields: [
10
+ { key: 'apiKey', label: 'API Key', required: true },
11
+ { key: 'apiSecret', label: 'API Secret', required: true },
12
+ { key: 'passphrase', label: 'Passphrase', required: true },
13
+ ],
14
+ docs: 'https://www.okx.com/cn/trade-blog/7439',
15
+ },
16
+ bitget: {
17
+ name: 'Bitget',
18
+ fields: [
19
+ { key: 'apiKey', label: 'API Key', required: true },
20
+ { key: 'apiSecret', label: 'API Secret', required: true },
21
+ { key: 'passphrase', label: 'Passphrase', required: false },
22
+ ],
23
+ docs: 'https://www.bitget.com/zh-CN/doc/7843',
24
+ },
25
+ binance: {
26
+ name: 'Binance',
27
+ fields: [
28
+ { key: 'apiKey', label: 'API Key', required: true },
29
+ { key: 'apiSecret', label: 'API Secret', required: true },
30
+ ],
31
+ docs: 'https://www.binance.com/zh-CN/doc/7843',
32
+ },
33
+ hyperliquid: {
34
+ name: 'Hyperliquid',
35
+ fields: [
36
+ { key: 'apiKey', label: '钱包地址 (主账户地址,非API密钥地址)', required: true },
37
+ { key: 'privateKey', label: 'API Private Key (交易密钥私钥)', required: true },
38
+ ],
39
+ docs: 'https://hyperliquid.gitbook.io/hyperliquid-docs',
40
+ },
41
+ };
42
+ // v1 类已在 RELEASE_036 移除 — 请使用 src/exchange/v2/ 中的 createAdapter / createEngine
43
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/exchange/index.ts"],"names":[],"mappings":";;;AAiDA,sFAAsF;AACtF,iDAAiD;AAEpC,QAAA,eAAe,GAAG;IAC9B,GAAG,EAAE;QACJ,IAAI,EAAE,KAAK;QACX,MAAM,EAAE;YACP,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE;YACnD,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE;YACzD,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE;SAC1D;QACD,IAAI,EAAE,wCAAwC;KAC9C;IACD,MAAM,EAAE;QACP,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE;YACP,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE;YACnD,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE;YACzD,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE;SAC3D;QACD,IAAI,EAAE,uCAAuC;KAC7C;IACD,OAAO,EAAE;QACR,IAAI,EAAE,SAAS;QACf,MAAM,EAAE;YACP,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE;YACnD,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE;SACzD;QACD,IAAI,EAAE,wCAAwC;KAC9C;IACD,WAAW,EAAE;QACZ,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE;YACP,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,uBAAuB,EAAE,QAAQ,EAAE,IAAI,EAAE;YACjE,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,0BAA0B,EAAE,QAAQ,EAAE,IAAI,EAAE;SACxE;QACD,IAAI,EAAE,iDAAiD;KACvD;CACQ,CAAC;AAEX,+EAA+E"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Institutional Order Execution Module — Abstract Adapter Base
3
+ * Provides: interface contract, HMAC signing, request helpers, error normalisation
4
+ */
5
+ import type { ExchangeId, ExchangeCredentials, MarketType, OrderStatus, OrderResponse, AccountSnapshot, PositionInfo, TickerInfo, SymbolInfo, OHLCVBar, OrderBook, FundingInfo, RawOrderParams, BatchOrderResponse, AmendOrderRequest, OrderHistoryQuery, OrderHistoryResponse, TradeHistoryQuery, TradeHistoryResponse, CancelAllOrdersRequest, MarginModeRequest } from '../types';
6
+ export declare class ExchangeError extends Error {
7
+ readonly exchange: ExchangeId;
8
+ readonly code?: string | number | undefined;
9
+ readonly raw?: unknown | undefined;
10
+ constructor(message: string, exchange: ExchangeId, code?: string | number | undefined, raw?: unknown | undefined);
11
+ }
12
+ export declare class InsufficientFundsError extends ExchangeError {
13
+ }
14
+ export declare class RateLimitError extends ExchangeError {
15
+ }
16
+ export declare class InvalidSymbolError extends ExchangeError {
17
+ }
18
+ export declare class OrderNotFoundError extends ExchangeError {
19
+ }
20
+ export interface IExchangeAdapter {
21
+ readonly exchangeId: ExchangeId;
22
+ getTicker(symbol: string): Promise<TickerInfo>;
23
+ getSymbolInfo(symbol: string): Promise<SymbolInfo>;
24
+ getOHLCV(symbol: string, timeframe: string, limit?: number): Promise<OHLCVBar[]>;
25
+ getOrderBook(symbol: string, depth?: number): Promise<OrderBook>;
26
+ getFundingInfo(symbol: string): Promise<FundingInfo | null>;
27
+ listSymbols(marketType: MarketType): Promise<string[]>;
28
+ getAccount(): Promise<AccountSnapshot>;
29
+ getPositions(symbol?: string): Promise<PositionInfo[]>;
30
+ placeOrder(params: RawOrderParams): Promise<OrderResponse>;
31
+ /** Batch order submission. Default impl falls back to sequential placeOrder calls. */
32
+ placeOrders?(batch: {
33
+ orders: RawOrderParams[];
34
+ grouping?: string;
35
+ }): Promise<BatchOrderResponse>;
36
+ cancelOrder(orderId: string, symbol: string): Promise<boolean>;
37
+ /** Batch cancel. Default impl falls back to sequential cancelOrder calls. */
38
+ cancelOrders?(orderIds: string[], symbol: string): Promise<boolean[]>;
39
+ /** Cancel all open orders for a symbol or globally. */
40
+ cancelAllOrders?(request?: CancelAllOrdersRequest): Promise<boolean>;
41
+ getOrderStatus(orderId: string, symbol: string): Promise<OrderResponse>;
42
+ /** Query order history (closed/cancelled/filled orders). */
43
+ getOrderHistory?(query: OrderHistoryQuery): Promise<OrderHistoryResponse>;
44
+ getOpenOrders(symbol?: string): Promise<OrderResponse[]>;
45
+ /** Query individual fill / trade history. */
46
+ getFills?(query: TradeHistoryQuery): Promise<TradeHistoryResponse>;
47
+ /** Amend an existing order (price / quantity). */
48
+ amendOrder?(request: AmendOrderRequest): Promise<OrderResponse>;
49
+ /** Validate order params against exchange rules before submission. Returns array of error messages (empty = valid). */
50
+ validateOrder?(params: RawOrderParams, symbolInfo: SymbolInfo): Promise<string[]>;
51
+ setLeverage?(symbol: string, leverage: number, marginMode?: 'cross' | 'isolated'): Promise<void>;
52
+ setMarginMode?(request: MarginModeRequest): Promise<void>;
53
+ ping?(): Promise<number>;
54
+ }
55
+ export declare function hmacSha256Hex(secret: string, message: string): Promise<string>;
56
+ export declare function hmacSha256Base64(secret: string, message: string): Promise<string>;
57
+ /** Stable query string builder — sorts keys alphabetically for consistent signing */
58
+ export declare function buildQueryString(params: Record<string, string | number | boolean | undefined>): string;
59
+ /** Unsorted query string (for exchanges that require insertion order) */
60
+ export declare function buildQueryStringOrdered(params: Record<string, string | number | boolean | undefined>): string;
61
+ export interface RequestOptions {
62
+ method: 'GET' | 'POST' | 'PUT' | 'DELETE';
63
+ path: string;
64
+ query?: Record<string, string | number | boolean | undefined>;
65
+ body?: unknown;
66
+ headers?: Record<string, string>;
67
+ baseUrl?: string;
68
+ }
69
+ export interface RateLimitInfo {
70
+ exchange: ExchangeId;
71
+ usedWeight?: number;
72
+ weightLimit?: number;
73
+ remaining?: number;
74
+ resetAt?: number;
75
+ }
76
+ export interface AdapterConfig {
77
+ credentials: ExchangeCredentials;
78
+ baseUrl: string;
79
+ testnetUrl?: string;
80
+ onRateLimit?: (info: RateLimitInfo) => void;
81
+ }
82
+ export declare abstract class BaseExchangeAdapter implements IExchangeAdapter {
83
+ abstract readonly exchangeId: ExchangeId;
84
+ protected readonly creds: ExchangeCredentials;
85
+ protected readonly baseUrl: string;
86
+ protected readonly testnet: boolean;
87
+ private onRateLimit?;
88
+ constructor(config: AdapterConfig);
89
+ protected request<T = unknown>(opts: RequestOptions): Promise<T>;
90
+ /** Override in subclass to unwrap exchange envelope, e.g. { code: 0, data: [...] } */
91
+ protected unwrapResponse<T>(json: unknown, _status: number): T;
92
+ /** Override in subclass to map HTTP error codes to typed errors */
93
+ protected throwExchangeError(status: number, message: string, raw?: unknown): never;
94
+ /** Parse exchange-specific rate limit headers and emit via callback */
95
+ private _parseRateLimitHeaders;
96
+ protected normaliseStatus(raw: string): OrderStatus;
97
+ placeOrders(batch: {
98
+ orders: RawOrderParams[];
99
+ grouping?: string;
100
+ }): Promise<BatchOrderResponse>;
101
+ cancelOrders(orderIds: string[], symbol: string): Promise<boolean[]>;
102
+ cancelAllOrders(_request?: CancelAllOrdersRequest): Promise<boolean>;
103
+ getOrderHistory(_query: OrderHistoryQuery): Promise<OrderHistoryResponse>;
104
+ getFills(_query: TradeHistoryQuery): Promise<TradeHistoryResponse>;
105
+ amendOrder(_request: AmendOrderRequest): Promise<OrderResponse>;
106
+ validateOrder(params: RawOrderParams, symbolInfo: SymbolInfo): Promise<string[]>;
107
+ setLeverage(_symbol: string, _leverage: number, _marginMode?: 'cross' | 'isolated'): Promise<void>;
108
+ setMarginMode(_request: MarginModeRequest): Promise<void>;
109
+ ping(): Promise<number>;
110
+ abstract getTicker(symbol: string): Promise<TickerInfo>;
111
+ abstract getSymbolInfo(symbol: string): Promise<SymbolInfo>;
112
+ abstract getOHLCV(symbol: string, timeframe: string, limit?: number): Promise<OHLCVBar[]>;
113
+ abstract getOrderBook(symbol: string, depth?: number): Promise<OrderBook>;
114
+ abstract getFundingInfo(symbol: string): Promise<FundingInfo | null>;
115
+ abstract listSymbols(marketType: MarketType): Promise<string[]>;
116
+ abstract getAccount(): Promise<AccountSnapshot>;
117
+ abstract getPositions(symbol?: string): Promise<PositionInfo[]>;
118
+ abstract placeOrder(params: RawOrderParams): Promise<OrderResponse>;
119
+ abstract cancelOrder(orderId: string, symbol: string): Promise<boolean>;
120
+ abstract getOrderStatus(orderId: string, symbol: string): Promise<OrderResponse>;
121
+ abstract getOpenOrders(symbol?: string): Promise<OrderResponse[]>;
122
+ }
123
+ export declare const TIMEFRAME_MS: Record<string, number>;
124
+ /** Round quantity to stepSize precision */
125
+ export declare function roundToStep(value: number, step: number): number;
126
+ /** Round price to tickSize precision */
127
+ export declare function roundToTick(value: number, tick: number): number;
128
+ /** Generate a short random client order ID */
129
+ export declare function genClientOrderId(prefix?: string): string;
130
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../src/exchange/v2/adapters/base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,296 @@
1
+ "use strict";
2
+ /**
3
+ * Institutional Order Execution Module — Abstract Adapter Base
4
+ * Provides: interface contract, HMAC signing, request helpers, error normalisation
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.TIMEFRAME_MS = exports.BaseExchangeAdapter = exports.OrderNotFoundError = exports.InvalidSymbolError = exports.RateLimitError = exports.InsufficientFundsError = exports.ExchangeError = void 0;
8
+ exports.hmacSha256Hex = hmacSha256Hex;
9
+ exports.hmacSha256Base64 = hmacSha256Base64;
10
+ exports.buildQueryString = buildQueryString;
11
+ exports.buildQueryStringOrdered = buildQueryStringOrdered;
12
+ exports.roundToStep = roundToStep;
13
+ exports.roundToTick = roundToTick;
14
+ exports.genClientOrderId = genClientOrderId;
15
+ // ─── Normalised Error ──────────────────────────────────────────────────────
16
+ class ExchangeError extends Error {
17
+ exchange;
18
+ code;
19
+ raw;
20
+ constructor(message, exchange, code, raw) {
21
+ super(message);
22
+ this.exchange = exchange;
23
+ this.code = code;
24
+ this.raw = raw;
25
+ this.name = 'ExchangeError';
26
+ }
27
+ }
28
+ exports.ExchangeError = ExchangeError;
29
+ class InsufficientFundsError extends ExchangeError {
30
+ }
31
+ exports.InsufficientFundsError = InsufficientFundsError;
32
+ class RateLimitError extends ExchangeError {
33
+ }
34
+ exports.RateLimitError = RateLimitError;
35
+ class InvalidSymbolError extends ExchangeError {
36
+ }
37
+ exports.InvalidSymbolError = InvalidSymbolError;
38
+ class OrderNotFoundError extends ExchangeError {
39
+ }
40
+ exports.OrderNotFoundError = OrderNotFoundError;
41
+ // ─── HMAC Signing Utilities ────────────────────────────────────────────────
42
+ async function hmacSha256Hex(secret, message) {
43
+ const enc = new TextEncoder();
44
+ const key = await crypto.subtle.importKey('raw', enc.encode(secret), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
45
+ const sig = await crypto.subtle.sign('HMAC', key, enc.encode(message));
46
+ return Array.from(new Uint8Array(sig)).map(b => b.toString(16).padStart(2, '0')).join('');
47
+ }
48
+ async function hmacSha256Base64(secret, message) {
49
+ const enc = new TextEncoder();
50
+ const key = await crypto.subtle.importKey('raw', enc.encode(secret), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
51
+ const sig = await crypto.subtle.sign('HMAC', key, enc.encode(message));
52
+ return btoa(String.fromCharCode(...new Uint8Array(sig)));
53
+ }
54
+ /** Stable query string builder — sorts keys alphabetically for consistent signing */
55
+ function buildQueryString(params) {
56
+ return Object.entries(params)
57
+ .filter(([, v]) => v !== undefined && v !== null)
58
+ .sort(([a], [b]) => a.localeCompare(b))
59
+ .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)
60
+ .join('&');
61
+ }
62
+ /** Unsorted query string (for exchanges that require insertion order) */
63
+ function buildQueryStringOrdered(params) {
64
+ return Object.entries(params)
65
+ .filter(([, v]) => v !== undefined && v !== null)
66
+ .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)
67
+ .join('&');
68
+ }
69
+ // ─── Abstract Base Class ───────────────────────────────────────────────────
70
+ class BaseExchangeAdapter {
71
+ creds;
72
+ baseUrl;
73
+ testnet;
74
+ onRateLimit;
75
+ constructor(config) {
76
+ this.creds = config.credentials;
77
+ this.testnet = config.credentials.testnet ?? false;
78
+ this.baseUrl = this.testnet && config.testnetUrl
79
+ ? config.testnetUrl
80
+ : config.baseUrl;
81
+ this.onRateLimit = config.onRateLimit;
82
+ }
83
+ // ── Core HTTP ──
84
+ async request(opts) {
85
+ const url = new URL(`${opts.baseUrl ?? this.baseUrl}${opts.path}`);
86
+ if (opts.query) {
87
+ for (const [k, v] of Object.entries(opts.query)) {
88
+ if (v !== undefined && v !== null)
89
+ url.searchParams.set(k, String(v));
90
+ }
91
+ }
92
+ const fetchOpts = {
93
+ method: opts.method,
94
+ headers: { 'Content-Type': 'application/json', ...opts.headers },
95
+ };
96
+ if (opts.body !== undefined) {
97
+ fetchOpts.body = JSON.stringify(opts.body);
98
+ }
99
+ const res = await fetch(url.toString(), fetchOpts);
100
+ const text = await res.text();
101
+ // Cloudflare CDN rate-limit page 检测(HTML 响应,包含 "error code: 1015")
102
+ // 交易所 API 均部署在 Cloudflare 后,Cloudflare Worker 与其共享 CDN IP 段,
103
+ // 高频调用时触发 CF 的 Ray-ID 限流,返回 HTML 而非 JSON。
104
+ if (text.includes('error code: 1015') || text.includes('error code:1015')) {
105
+ throw new RateLimitError('交易所 API 请求频率过高(Cloudflare rate limit 1015)。请降低 Bot 运行频率,稍后重试。', this.exchangeId, 1015);
106
+ }
107
+ // Parse rate limit headers from major exchanges
108
+ this._parseRateLimitHeaders(res.headers);
109
+ let json;
110
+ try {
111
+ json = JSON.parse(text);
112
+ }
113
+ catch {
114
+ json = text;
115
+ }
116
+ if (!res.ok) {
117
+ const msg = typeof json === 'object' && json !== null
118
+ ? JSON.stringify(json)
119
+ : text.slice(0, 200); // 截断 HTML 防止超长错误信息
120
+ this.throwExchangeError(res.status, msg, json);
121
+ }
122
+ return this.unwrapResponse(json, res.status);
123
+ }
124
+ /** Override in subclass to unwrap exchange envelope, e.g. { code: 0, data: [...] } */
125
+ unwrapResponse(json, _status) {
126
+ return json;
127
+ }
128
+ /** Override in subclass to map HTTP error codes to typed errors */
129
+ throwExchangeError(status, message, raw) {
130
+ if (status === 429)
131
+ throw new RateLimitError(message, this.exchangeId, status, raw);
132
+ throw new ExchangeError(message, this.exchangeId, status, raw);
133
+ }
134
+ /** Parse exchange-specific rate limit headers and emit via callback */
135
+ _parseRateLimitHeaders(headers) {
136
+ if (!this.onRateLimit)
137
+ return;
138
+ const info = { exchange: this.exchangeId };
139
+ // Binance: X-MBX-USED-WEIGHT-1M
140
+ const binanceWeight = headers.get('x-mbx-used-weight-1m');
141
+ if (binanceWeight) {
142
+ info.usedWeight = parseInt(binanceWeight, 10);
143
+ info.weightLimit = 1200; // Binance default per minute
144
+ }
145
+ // Binance alternative: X-SAPI-USED-IP-WEIGHT-1M
146
+ const sapiWeight = headers.get('x-sapi-used-ip-weight-1m');
147
+ if (sapiWeight && !info.usedWeight) {
148
+ info.usedWeight = parseInt(sapiWeight, 10);
149
+ info.weightLimit = 12000;
150
+ }
151
+ // OKX / generic: X-RateLimit-Remaining
152
+ const remaining = headers.get('x-ratelimit-remaining');
153
+ if (remaining) {
154
+ info.remaining = parseInt(remaining, 10);
155
+ }
156
+ // OKX / generic: X-RateLimit-Limit
157
+ const limit = headers.get('x-ratelimit-limit');
158
+ if (limit) {
159
+ info.weightLimit = parseInt(limit, 10);
160
+ }
161
+ // OKX / generic: X-RateLimit-Reset
162
+ const reset = headers.get('x-ratelimit-reset');
163
+ if (reset) {
164
+ info.resetAt = parseInt(reset, 10) * 1000;
165
+ }
166
+ // Bitget: X-Rate-Limit-Remaining
167
+ const bitgetRemaining = headers.get('x-rate-limit-remaining');
168
+ if (bitgetRemaining && info.remaining === undefined) {
169
+ info.remaining = parseInt(bitgetRemaining, 10);
170
+ }
171
+ // Bitget: X-Rate-Limit-Reset
172
+ const bitgetReset = headers.get('x-rate-limit-reset');
173
+ if (bitgetReset && info.resetAt === undefined) {
174
+ info.resetAt = parseInt(bitgetReset, 10) * 1000;
175
+ }
176
+ if (info.usedWeight !== undefined || info.remaining !== undefined) {
177
+ this.onRateLimit(info);
178
+ }
179
+ }
180
+ // ── Order Status Normalisation ──
181
+ normaliseStatus(raw) {
182
+ const s = raw.toLowerCase();
183
+ if (s.includes('fill') && s.includes('partial'))
184
+ return 'partially_filled';
185
+ if (s.includes('fill') || s === 'closed')
186
+ return 'filled';
187
+ if (s.includes('cancel'))
188
+ return 'cancelled';
189
+ if (s.includes('reject') || s.includes('failed') || s.includes('fail'))
190
+ return 'rejected';
191
+ if (s.includes('expir'))
192
+ return 'expired';
193
+ if (s.includes('open') || s.includes('live') || s === 'new')
194
+ return 'open';
195
+ return 'pending';
196
+ }
197
+ // ── Default no-op implementations for optional methods ──
198
+ // ── Default batch implementations (sequential fallback) ──
199
+ async placeOrders(batch) {
200
+ const results = [];
201
+ const failed = [];
202
+ for (let i = 0; i < batch.orders.length; i++) {
203
+ try {
204
+ const resp = await this.placeOrder(batch.orders[i]);
205
+ results.push(resp);
206
+ }
207
+ catch (err) {
208
+ failed.push({ index: i, error: err instanceof Error ? err.message : String(err) });
209
+ }
210
+ }
211
+ return { results, failed };
212
+ }
213
+ async cancelOrders(orderIds, symbol) {
214
+ return Promise.all(orderIds.map(id => this.cancelOrder(id, symbol)));
215
+ }
216
+ async cancelAllOrders(_request) {
217
+ throw new ExchangeError('cancelAllOrders not implemented for this exchange', this.exchangeId);
218
+ }
219
+ async getOrderHistory(_query) {
220
+ throw new ExchangeError('getOrderHistory not implemented for this exchange', this.exchangeId);
221
+ }
222
+ async getFills(_query) {
223
+ throw new ExchangeError('getFills not implemented for this exchange', this.exchangeId);
224
+ }
225
+ async amendOrder(_request) {
226
+ throw new ExchangeError('amendOrder not implemented for this exchange', this.exchangeId);
227
+ }
228
+ async validateOrder(params, symbolInfo) {
229
+ const errors = [];
230
+ if (params.quantity !== undefined) {
231
+ if (params.quantity < symbolInfo.minQty)
232
+ errors.push(`Quantity ${params.quantity} below min ${symbolInfo.minQty}`);
233
+ if (params.quantity > symbolInfo.maxQty)
234
+ errors.push(`Quantity ${params.quantity} above max ${symbolInfo.maxQty}`);
235
+ const rounded = roundToStep(params.quantity, symbolInfo.stepSize);
236
+ if (Math.abs(rounded - params.quantity) > 1e-12)
237
+ errors.push(`Quantity ${params.quantity} does not match step size ${symbolInfo.stepSize}`);
238
+ }
239
+ if (params.price !== undefined && params.price > 0) {
240
+ const rounded = roundToTick(params.price, symbolInfo.tickSize);
241
+ if (Math.abs(rounded - params.price) > 1e-12)
242
+ errors.push(`Price ${params.price} does not match tick size ${symbolInfo.tickSize}`);
243
+ }
244
+ if (params.price !== undefined && params.quantity !== undefined) {
245
+ const notional = params.price * params.quantity;
246
+ if (notional < symbolInfo.minNotional)
247
+ errors.push(`Notional ${notional} below min ${symbolInfo.minNotional}`);
248
+ }
249
+ return errors;
250
+ }
251
+ // ── Lifecycle defaults ──
252
+ async setLeverage(_symbol, _leverage, _marginMode) {
253
+ // no-op for spot-only adapters; override in futures adapters
254
+ }
255
+ async setMarginMode(_request) {
256
+ throw new ExchangeError('setMarginMode not implemented for this exchange', this.exchangeId);
257
+ }
258
+ async ping() {
259
+ const start = Date.now();
260
+ await this.getTicker('BTC-USDT');
261
+ return Date.now() - start;
262
+ }
263
+ }
264
+ exports.BaseExchangeAdapter = BaseExchangeAdapter;
265
+ // ─── Timeframe Map Helper ──────────────────────────────────────────────────
266
+ exports.TIMEFRAME_MS = {
267
+ '1m': 60_000,
268
+ '3m': 3 * 60_000,
269
+ '5m': 5 * 60_000,
270
+ '15m': 15 * 60_000,
271
+ '30m': 30 * 60_000,
272
+ '1h': 60 * 60_000,
273
+ '2h': 2 * 60 * 60_000,
274
+ '4h': 4 * 60 * 60_000,
275
+ '6h': 6 * 60 * 60_000,
276
+ '12h': 12 * 60 * 60_000,
277
+ '1d': 24 * 60 * 60_000,
278
+ '3d': 3 * 24 * 60 * 60_000,
279
+ '1w': 7 * 24 * 60 * 60_000,
280
+ };
281
+ // ─── Precision Helpers ─────────────────────────────────────────────────────
282
+ /** Round quantity to stepSize precision */
283
+ function roundToStep(value, step) {
284
+ const decimals = Math.max(0, -Math.floor(Math.log10(step)));
285
+ return parseFloat((Math.floor(value / step) * step).toFixed(decimals));
286
+ }
287
+ /** Round price to tickSize precision */
288
+ function roundToTick(value, tick) {
289
+ const decimals = Math.max(0, -Math.floor(Math.log10(tick)));
290
+ return parseFloat((Math.round(value / tick) * tick).toFixed(decimals));
291
+ }
292
+ /** Generate a short random client order ID */
293
+ function genClientOrderId(prefix = 'bbt') {
294
+ return `${prefix}${Date.now()}${crypto.randomUUID().replace(/-/g, '').slice(0, 7)}`;
295
+ }
296
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../src/exchange/v2/adapters/base.ts"],"names":[],"mappings":"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"}