@imbingox/acex 0.1.0 → 0.3.0-beta.0
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.
- package/README.md +96 -285
- package/index.ts +1 -0
- package/package.json +40 -23
- package/src/adapters/binance/adapter.ts +80 -0
- package/src/adapters/binance/book-ticker.ts +123 -0
- package/src/adapters/binance/mark-price.ts +126 -0
- package/src/adapters/binance/market-catalog.ts +258 -0
- package/src/adapters/binance/private-adapter.ts +833 -0
- package/src/adapters/types.ts +219 -0
- package/src/client/context.ts +123 -0
- package/src/client/create-client.ts +6 -0
- package/src/client/private-subscription-coordinator.ts +512 -0
- package/src/client/runtime.ts +410 -0
- package/src/errors.ts +27 -0
- package/src/index.ts +5 -0
- package/src/internal/async-event-bus.ts +100 -0
- package/src/internal/filters.ts +117 -0
- package/src/internal/managed-websocket.ts +280 -0
- package/src/managers/account-manager.ts +609 -0
- package/src/managers/market-manager.ts +912 -0
- package/src/managers/order-manager.ts +685 -0
- package/src/types/account.ts +157 -0
- package/src/types/client.ts +79 -0
- package/src/types/index.ts +5 -0
- package/src/types/market.ts +152 -0
- package/src/types/order.ts +177 -0
- package/src/types/shared.ts +93 -0
- package/dist/adapters/binance/composite-adapter.d.ts +0 -116
- package/dist/adapters/binance/composite-adapter.js +0 -121
- package/dist/adapters/binance/market-types.d.ts +0 -63
- package/dist/adapters/binance/market-types.js +0 -1
- package/dist/adapters/binance/native-market-adapter.d.ts +0 -102
- package/dist/adapters/binance/native-market-adapter.js +0 -455
- package/dist/adapters/binance/normalizers.d.ts +0 -8
- package/dist/adapters/binance/normalizers.js +0 -123
- package/dist/adapters/binance/rest-client.d.ts +0 -17
- package/dist/adapters/binance/rest-client.js +0 -66
- package/dist/adapters/binance/symbol-router.d.ts +0 -9
- package/dist/adapters/binance/symbol-router.js +0 -174
- package/dist/adapters/binance/ws-client.d.ts +0 -24
- package/dist/adapters/binance/ws-client.js +0 -261
- package/dist/adapters/ccxt/aster-ccxt-adapter.d.ts +0 -157
- package/dist/adapters/ccxt/aster-ccxt-adapter.js +0 -272
- package/dist/adapters/ccxt/binance-usdm-ccxt-adapter.d.ts +0 -180
- package/dist/adapters/ccxt/binance-usdm-ccxt-adapter.js +0 -539
- package/dist/adapters/ccxt/binance-usdm-exchange.d.ts +0 -22
- package/dist/adapters/ccxt/binance-usdm-exchange.js +0 -23
- package/dist/adapters/fake/fake-aster-adapter.d.ts +0 -130
- package/dist/adapters/fake/fake-aster-adapter.js +0 -283
- package/dist/adapters/types.d.ts +0 -210
- package/dist/adapters/types.js +0 -1
- package/dist/core/client.d.ts +0 -50
- package/dist/core/client.js +0 -403
- package/dist/core/recovery.d.ts +0 -22
- package/dist/core/recovery.js +0 -18
- package/dist/core/runtime.d.ts +0 -26
- package/dist/core/runtime.js +0 -150
- package/dist/errors/acex-error.d.ts +0 -25
- package/dist/errors/acex-error.js +0 -54
- package/dist/index.d.ts +0 -6
- package/dist/index.js +0 -3
- package/dist/managers/account-manager.d.ts +0 -41
- package/dist/managers/account-manager.js +0 -80
- package/dist/managers/market-manager.d.ts +0 -16
- package/dist/managers/market-manager.js +0 -28
- package/dist/managers/order-manager.d.ts +0 -87
- package/dist/managers/order-manager.js +0 -122
- package/dist/runtime/async-queue.d.ts +0 -8
- package/dist/runtime/async-queue.js +0 -88
- package/dist/runtime/request-id.d.ts +0 -1
- package/dist/runtime/request-id.js +0 -5
- package/dist/runtime/ws-connection-supervisor.d.ts +0 -76
- package/dist/runtime/ws-connection-supervisor.js +0 -522
- package/dist/store/account-store.d.ts +0 -52
- package/dist/store/account-store.js +0 -18
- package/dist/store/health-store.d.ts +0 -16
- package/dist/store/health-store.js +0 -29
- package/dist/store/market-store.d.ts +0 -42
- package/dist/store/market-store.js +0 -51
- package/dist/store/order-store.d.ts +0 -38
- package/dist/store/order-store.js +0 -49
- package/dist/testing/create-fake-runtime.d.ts +0 -5
- package/dist/testing/create-fake-runtime.js +0 -7
- package/dist/types/public.d.ts +0 -5
- package/dist/types/public.js +0 -1
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import type BigNumber from "bignumber.js";
|
|
2
|
+
import type {
|
|
3
|
+
Exchange,
|
|
4
|
+
PrivateRuntimeReason,
|
|
5
|
+
PrivateRuntimeStatus,
|
|
6
|
+
SubscriptionActivity,
|
|
7
|
+
} from "./shared.ts";
|
|
8
|
+
|
|
9
|
+
export interface AccountDataStatus {
|
|
10
|
+
accountId: string;
|
|
11
|
+
exchange: Exchange;
|
|
12
|
+
activity: SubscriptionActivity;
|
|
13
|
+
ready: boolean;
|
|
14
|
+
runtimeStatus?: PrivateRuntimeStatus;
|
|
15
|
+
lastReceivedAt?: number;
|
|
16
|
+
lastReadyAt?: number;
|
|
17
|
+
inactiveSince?: number;
|
|
18
|
+
reason?: PrivateRuntimeReason;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface AccountStatusChangedEvent {
|
|
22
|
+
type: "account.status_changed";
|
|
23
|
+
accountId: string;
|
|
24
|
+
exchange: Exchange;
|
|
25
|
+
status: AccountDataStatus;
|
|
26
|
+
ts: number;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export type PositionSide = "long" | "short" | "net";
|
|
30
|
+
|
|
31
|
+
export interface SubscribeAccountInput {
|
|
32
|
+
accountId: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface UnsubscribeAccountInput {
|
|
36
|
+
accountId: string;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface PositionKeyInput {
|
|
40
|
+
accountId: string;
|
|
41
|
+
symbol: string;
|
|
42
|
+
side?: PositionSide;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface AccountEventFilter {
|
|
46
|
+
accountId?: string;
|
|
47
|
+
exchange?: Exchange;
|
|
48
|
+
symbol?: string;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface BalanceSnapshot {
|
|
52
|
+
accountId: string;
|
|
53
|
+
exchange: Exchange;
|
|
54
|
+
asset: string;
|
|
55
|
+
free: BigNumber;
|
|
56
|
+
used: BigNumber;
|
|
57
|
+
total: BigNumber;
|
|
58
|
+
exchangeTs?: number;
|
|
59
|
+
receivedAt: number;
|
|
60
|
+
updatedAt: number;
|
|
61
|
+
seq: number;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export interface PositionSnapshot {
|
|
65
|
+
accountId: string;
|
|
66
|
+
exchange: Exchange;
|
|
67
|
+
symbol: string;
|
|
68
|
+
side: PositionSide;
|
|
69
|
+
size: BigNumber;
|
|
70
|
+
entryPrice?: BigNumber;
|
|
71
|
+
markPrice?: BigNumber;
|
|
72
|
+
unrealizedPnl?: BigNumber;
|
|
73
|
+
leverage?: BigNumber;
|
|
74
|
+
liquidationPrice?: BigNumber;
|
|
75
|
+
exchangeTs?: number;
|
|
76
|
+
receivedAt: number;
|
|
77
|
+
updatedAt: number;
|
|
78
|
+
seq: number;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export interface RiskSnapshot {
|
|
82
|
+
accountId: string;
|
|
83
|
+
exchange: Exchange;
|
|
84
|
+
equity?: BigNumber;
|
|
85
|
+
marginRatio?: BigNumber;
|
|
86
|
+
initialMargin?: BigNumber;
|
|
87
|
+
maintenanceMargin?: BigNumber;
|
|
88
|
+
exchangeTs?: number;
|
|
89
|
+
receivedAt: number;
|
|
90
|
+
updatedAt: number;
|
|
91
|
+
seq: number;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export interface AccountSnapshot {
|
|
95
|
+
accountId: string;
|
|
96
|
+
exchange: Exchange;
|
|
97
|
+
balances: Record<string, BalanceSnapshot>;
|
|
98
|
+
positions: PositionSnapshot[];
|
|
99
|
+
risk?: RiskSnapshot;
|
|
100
|
+
exchangeTs?: number;
|
|
101
|
+
receivedAt: number;
|
|
102
|
+
updatedAt: number;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export interface AccountEventBase {
|
|
106
|
+
accountId: string;
|
|
107
|
+
exchange: Exchange;
|
|
108
|
+
ts: number;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export interface BalanceUpdatedEvent extends AccountEventBase {
|
|
112
|
+
type: "balance.updated";
|
|
113
|
+
asset: string;
|
|
114
|
+
snapshot: BalanceSnapshot;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export interface PositionUpdatedEvent extends AccountEventBase {
|
|
118
|
+
type: "position.updated";
|
|
119
|
+
symbol: string;
|
|
120
|
+
snapshot: PositionSnapshot;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export interface RiskUpdatedEvent extends AccountEventBase {
|
|
124
|
+
type: "risk.updated";
|
|
125
|
+
snapshot: RiskSnapshot;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export interface AccountSnapshotReplacedEvent extends AccountEventBase {
|
|
129
|
+
type: "account.snapshot_replaced";
|
|
130
|
+
snapshot: AccountSnapshot;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export type AccountEvent =
|
|
134
|
+
| BalanceUpdatedEvent
|
|
135
|
+
| PositionUpdatedEvent
|
|
136
|
+
| RiskUpdatedEvent
|
|
137
|
+
| AccountSnapshotReplacedEvent;
|
|
138
|
+
|
|
139
|
+
export interface AccountEventStreams {
|
|
140
|
+
updates(filter?: AccountEventFilter): AsyncIterable<AccountEvent>;
|
|
141
|
+
status(filter?: AccountEventFilter): AsyncIterable<AccountStatusChangedEvent>;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export interface AccountManager {
|
|
145
|
+
readonly events: AccountEventStreams;
|
|
146
|
+
|
|
147
|
+
subscribeAccount(input: SubscribeAccountInput): Promise<void>;
|
|
148
|
+
unsubscribeAccount(input: UnsubscribeAccountInput): Promise<void>;
|
|
149
|
+
|
|
150
|
+
getAccountSnapshot(accountId: string): AccountSnapshot | undefined;
|
|
151
|
+
getBalances(accountId: string): BalanceSnapshot[];
|
|
152
|
+
getBalance(accountId: string, asset: string): BalanceSnapshot | undefined;
|
|
153
|
+
getPositions(accountId: string, symbol?: string): PositionSnapshot[];
|
|
154
|
+
getPosition(input: PositionKeyInput): PositionSnapshot | undefined;
|
|
155
|
+
getRiskSnapshot(accountId: string): RiskSnapshot | undefined;
|
|
156
|
+
getAccountStatus(accountId: string): AccountDataStatus | undefined;
|
|
157
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
AccountDataStatus,
|
|
3
|
+
AccountManager,
|
|
4
|
+
AccountStatusChangedEvent,
|
|
5
|
+
} from "./account.ts";
|
|
6
|
+
import type {
|
|
7
|
+
MarketDataStatus,
|
|
8
|
+
MarketManager,
|
|
9
|
+
MarketStatusChangedEvent,
|
|
10
|
+
} from "./market.ts";
|
|
11
|
+
import type {
|
|
12
|
+
OrderDataStatus,
|
|
13
|
+
OrderManager,
|
|
14
|
+
OrderStatusChangedEvent,
|
|
15
|
+
} from "./order.ts";
|
|
16
|
+
import type {
|
|
17
|
+
AccountCredentials,
|
|
18
|
+
AcexInternalError,
|
|
19
|
+
ClientStatus,
|
|
20
|
+
CreateClientOptions,
|
|
21
|
+
Exchange,
|
|
22
|
+
RegisterAccountInput,
|
|
23
|
+
RegisterAccountResult,
|
|
24
|
+
StopOptions,
|
|
25
|
+
} from "./shared.ts";
|
|
26
|
+
|
|
27
|
+
export interface ClientHealthSnapshot {
|
|
28
|
+
clientStatus: ClientStatus;
|
|
29
|
+
markets: MarketDataStatus[];
|
|
30
|
+
accounts: AccountDataStatus[];
|
|
31
|
+
orders: OrderDataStatus[];
|
|
32
|
+
updatedAt: number;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface ClientStatusChangedEvent {
|
|
36
|
+
type: "client.status_changed";
|
|
37
|
+
status: ClientStatus;
|
|
38
|
+
ts: number;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export type HealthEvent =
|
|
42
|
+
| ClientStatusChangedEvent
|
|
43
|
+
| MarketStatusChangedEvent
|
|
44
|
+
| AccountStatusChangedEvent
|
|
45
|
+
| OrderStatusChangedEvent;
|
|
46
|
+
|
|
47
|
+
export interface HealthEventFilter {
|
|
48
|
+
scope?: "client" | "market" | "account" | "order";
|
|
49
|
+
exchange?: Exchange;
|
|
50
|
+
accountId?: string;
|
|
51
|
+
symbol?: string;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface ClientEventStreams {
|
|
55
|
+
health(filter?: HealthEventFilter): AsyncIterable<HealthEvent>;
|
|
56
|
+
errors(): AsyncIterable<AcexInternalError>;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export interface AcexClient {
|
|
60
|
+
readonly market: MarketManager;
|
|
61
|
+
readonly account: AccountManager;
|
|
62
|
+
readonly order: OrderManager;
|
|
63
|
+
readonly events: ClientEventStreams;
|
|
64
|
+
|
|
65
|
+
getStatus(): ClientStatus;
|
|
66
|
+
getHealth(): ClientHealthSnapshot;
|
|
67
|
+
|
|
68
|
+
registerAccount(input: RegisterAccountInput): Promise<RegisterAccountResult>;
|
|
69
|
+
updateAccountCredentials(
|
|
70
|
+
accountId: string,
|
|
71
|
+
credentials: AccountCredentials,
|
|
72
|
+
): Promise<void>;
|
|
73
|
+
removeAccount(accountId: string): Promise<void>;
|
|
74
|
+
|
|
75
|
+
start(): Promise<void>;
|
|
76
|
+
stop(options?: StopOptions): Promise<void>;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export type CreateClient = (options?: CreateClientOptions) => AcexClient;
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import type BigNumber from "bignumber.js";
|
|
2
|
+
import type {
|
|
3
|
+
Exchange,
|
|
4
|
+
MarketFreshness,
|
|
5
|
+
SubscriptionActivity,
|
|
6
|
+
} from "./shared.ts";
|
|
7
|
+
|
|
8
|
+
export type MarketType = "spot" | "swap" | "future";
|
|
9
|
+
|
|
10
|
+
export interface MarketDefinition {
|
|
11
|
+
exchange: Exchange;
|
|
12
|
+
symbol: string;
|
|
13
|
+
id: string;
|
|
14
|
+
type: MarketType;
|
|
15
|
+
base: string;
|
|
16
|
+
quote: string;
|
|
17
|
+
settle?: string;
|
|
18
|
+
active: boolean;
|
|
19
|
+
contract: boolean;
|
|
20
|
+
linear?: boolean;
|
|
21
|
+
inverse?: boolean;
|
|
22
|
+
contractSize?: BigNumber;
|
|
23
|
+
pricePrecision: number;
|
|
24
|
+
amountPrecision: number;
|
|
25
|
+
priceStep: BigNumber;
|
|
26
|
+
amountStep: BigNumber;
|
|
27
|
+
minAmount?: BigNumber;
|
|
28
|
+
minNotional?: BigNumber;
|
|
29
|
+
expiry?: number;
|
|
30
|
+
raw: Record<string, unknown>;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface MarketDataStatus {
|
|
34
|
+
exchange: Exchange;
|
|
35
|
+
symbol: string;
|
|
36
|
+
activity: SubscriptionActivity;
|
|
37
|
+
ready: boolean;
|
|
38
|
+
freshness?: MarketFreshness;
|
|
39
|
+
lastReceivedAt?: number;
|
|
40
|
+
lastReadyAt?: number;
|
|
41
|
+
inactiveSince?: number;
|
|
42
|
+
reason?: "ws_disconnected" | "heartbeat_timeout" | "reconciling";
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface MarketDataStreamStatus {
|
|
46
|
+
activity: SubscriptionActivity;
|
|
47
|
+
ready: boolean;
|
|
48
|
+
freshness?: MarketFreshness;
|
|
49
|
+
lastReceivedAt?: number;
|
|
50
|
+
lastReadyAt?: number;
|
|
51
|
+
inactiveSince?: number;
|
|
52
|
+
reason?: MarketDataStatus["reason"];
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface MarketKeyInput {
|
|
56
|
+
exchange: Exchange;
|
|
57
|
+
symbol: string;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export interface SubscribeL1BookInput extends MarketKeyInput {}
|
|
61
|
+
|
|
62
|
+
export interface SubscribeFundingRateInput extends MarketKeyInput {}
|
|
63
|
+
|
|
64
|
+
export interface MarketEventFilter {
|
|
65
|
+
exchange?: Exchange;
|
|
66
|
+
symbol?: string;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export interface L1Book {
|
|
70
|
+
exchange: Exchange;
|
|
71
|
+
symbol: string;
|
|
72
|
+
bidPrice: BigNumber;
|
|
73
|
+
bidSize: BigNumber;
|
|
74
|
+
askPrice: BigNumber;
|
|
75
|
+
askSize: BigNumber;
|
|
76
|
+
exchangeTs?: number;
|
|
77
|
+
receivedAt: number;
|
|
78
|
+
updatedAt: number;
|
|
79
|
+
version: number;
|
|
80
|
+
status: MarketDataStreamStatus;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export interface FundingRateSnapshot {
|
|
84
|
+
exchange: Exchange;
|
|
85
|
+
symbol: string;
|
|
86
|
+
fundingRate: BigNumber;
|
|
87
|
+
nextFundingTime?: number;
|
|
88
|
+
markPrice?: BigNumber;
|
|
89
|
+
indexPrice?: BigNumber;
|
|
90
|
+
exchangeTs?: number;
|
|
91
|
+
receivedAt: number;
|
|
92
|
+
updatedAt: number;
|
|
93
|
+
version: number;
|
|
94
|
+
status: MarketDataStreamStatus;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export interface MarketStatusChangedEvent {
|
|
98
|
+
type: "market.status_changed";
|
|
99
|
+
exchange: Exchange;
|
|
100
|
+
symbol: string;
|
|
101
|
+
status: MarketDataStatus;
|
|
102
|
+
ts: number;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export interface L1BookUpdatedEvent {
|
|
106
|
+
type: "l1_book.updated";
|
|
107
|
+
exchange: Exchange;
|
|
108
|
+
symbol: string;
|
|
109
|
+
snapshot: L1Book;
|
|
110
|
+
ts: number;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export interface FundingRateUpdatedEvent {
|
|
114
|
+
type: "funding_rate.updated";
|
|
115
|
+
exchange: Exchange;
|
|
116
|
+
symbol: string;
|
|
117
|
+
snapshot: FundingRateSnapshot;
|
|
118
|
+
ts: number;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export type MarketEvent =
|
|
122
|
+
| L1BookUpdatedEvent
|
|
123
|
+
| FundingRateUpdatedEvent
|
|
124
|
+
| MarketStatusChangedEvent;
|
|
125
|
+
|
|
126
|
+
export interface MarketEventStreams {
|
|
127
|
+
l1BookUpdates(filter?: MarketEventFilter): AsyncIterable<L1BookUpdatedEvent>;
|
|
128
|
+
fundingRateUpdates(
|
|
129
|
+
filter?: MarketEventFilter,
|
|
130
|
+
): AsyncIterable<FundingRateUpdatedEvent>;
|
|
131
|
+
status(filter?: MarketEventFilter): AsyncIterable<MarketStatusChangedEvent>;
|
|
132
|
+
all(filter?: MarketEventFilter): AsyncIterable<MarketEvent>;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export interface MarketManager {
|
|
136
|
+
readonly events: MarketEventStreams;
|
|
137
|
+
|
|
138
|
+
loadMarkets(): Promise<void>;
|
|
139
|
+
subscribeL1Book(input: SubscribeL1BookInput): Promise<void>;
|
|
140
|
+
unsubscribeL1Book(input: SubscribeL1BookInput): Promise<void>;
|
|
141
|
+
subscribeFundingRate(input: SubscribeFundingRateInput): Promise<void>;
|
|
142
|
+
unsubscribeFundingRate(input: SubscribeFundingRateInput): Promise<void>;
|
|
143
|
+
|
|
144
|
+
getMarket(exchange: Exchange, symbol: string): MarketDefinition | undefined;
|
|
145
|
+
getMarkets(symbol: string): MarketDefinition[];
|
|
146
|
+
listMarkets(exchange?: Exchange): MarketDefinition[];
|
|
147
|
+
getL1Book(key: MarketKeyInput): L1Book | undefined;
|
|
148
|
+
getL1Books(symbol: string): L1Book[];
|
|
149
|
+
getFundingRate(key: MarketKeyInput): FundingRateSnapshot | undefined;
|
|
150
|
+
getFundingRates(symbol: string): FundingRateSnapshot[];
|
|
151
|
+
getMarketStatus(key: MarketKeyInput): MarketDataStatus | undefined;
|
|
152
|
+
}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import type BigNumber from "bignumber.js";
|
|
2
|
+
import type { PositionSide } from "./account.ts";
|
|
3
|
+
import type {
|
|
4
|
+
Exchange,
|
|
5
|
+
PrivateRuntimeReason,
|
|
6
|
+
PrivateRuntimeStatus,
|
|
7
|
+
SubscriptionActivity,
|
|
8
|
+
} from "./shared.ts";
|
|
9
|
+
|
|
10
|
+
export interface OrderDataStatus {
|
|
11
|
+
accountId: string;
|
|
12
|
+
exchange: Exchange;
|
|
13
|
+
activity: SubscriptionActivity;
|
|
14
|
+
ready: boolean;
|
|
15
|
+
runtimeStatus?: PrivateRuntimeStatus;
|
|
16
|
+
lastReceivedAt?: number;
|
|
17
|
+
lastReadyAt?: number;
|
|
18
|
+
inactiveSince?: number;
|
|
19
|
+
reason?: PrivateRuntimeReason;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface OrderStatusChangedEvent {
|
|
23
|
+
type: "order.status_changed";
|
|
24
|
+
accountId: string;
|
|
25
|
+
exchange: Exchange;
|
|
26
|
+
status: OrderDataStatus;
|
|
27
|
+
ts: number;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export type OrderSide = "buy" | "sell";
|
|
31
|
+
|
|
32
|
+
export type OrderStatus =
|
|
33
|
+
| "open"
|
|
34
|
+
| "partially_filled"
|
|
35
|
+
| "filled"
|
|
36
|
+
| "canceled"
|
|
37
|
+
| "rejected"
|
|
38
|
+
| "expired";
|
|
39
|
+
|
|
40
|
+
export type CreateOrderType = "limit" | "market";
|
|
41
|
+
|
|
42
|
+
export interface SubscribeOrdersInput {
|
|
43
|
+
accountId: string;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface UnsubscribeOrdersInput {
|
|
47
|
+
accountId: string;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export interface GetOrderInput {
|
|
51
|
+
accountId: string;
|
|
52
|
+
orderId?: string;
|
|
53
|
+
clientOrderId?: string;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
interface CreateOrderInputBase {
|
|
57
|
+
accountId: string;
|
|
58
|
+
symbol: string;
|
|
59
|
+
side: OrderSide;
|
|
60
|
+
amount: string;
|
|
61
|
+
clientOrderId?: string;
|
|
62
|
+
reduceOnly?: boolean;
|
|
63
|
+
positionSide?: PositionSide;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export interface CreateLimitOrderInput extends CreateOrderInputBase {
|
|
67
|
+
type: "limit";
|
|
68
|
+
price: string;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export interface CreateMarketOrderInput extends CreateOrderInputBase {
|
|
72
|
+
type: "market";
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export type CreateOrderInput = CreateLimitOrderInput | CreateMarketOrderInput;
|
|
76
|
+
|
|
77
|
+
export interface CancelOrderInput {
|
|
78
|
+
accountId: string;
|
|
79
|
+
symbol: string;
|
|
80
|
+
orderId?: string;
|
|
81
|
+
clientOrderId?: string;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export interface CancelAllOrdersInput {
|
|
85
|
+
accountId: string;
|
|
86
|
+
symbol: string;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export interface OrderEventFilter {
|
|
90
|
+
accountId?: string;
|
|
91
|
+
exchange?: Exchange;
|
|
92
|
+
symbol?: string;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export interface OrderSnapshot {
|
|
96
|
+
accountId: string;
|
|
97
|
+
exchange: Exchange;
|
|
98
|
+
orderId?: string;
|
|
99
|
+
clientOrderId?: string;
|
|
100
|
+
symbol: string;
|
|
101
|
+
side: OrderSide;
|
|
102
|
+
type: string;
|
|
103
|
+
status: OrderStatus;
|
|
104
|
+
price?: BigNumber;
|
|
105
|
+
triggerPrice?: BigNumber;
|
|
106
|
+
amount: BigNumber;
|
|
107
|
+
filled: BigNumber;
|
|
108
|
+
remaining?: BigNumber;
|
|
109
|
+
reduceOnly?: boolean;
|
|
110
|
+
positionSide?: PositionSide;
|
|
111
|
+
avgFillPrice?: BigNumber;
|
|
112
|
+
exchangeTs?: number;
|
|
113
|
+
receivedAt: number;
|
|
114
|
+
updatedAt: number;
|
|
115
|
+
seq: number;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export interface OrderEventBase {
|
|
119
|
+
accountId: string;
|
|
120
|
+
exchange: Exchange;
|
|
121
|
+
symbol: string;
|
|
122
|
+
ts: number;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export interface OrderUpdatedEvent extends OrderEventBase {
|
|
126
|
+
type: "order.updated";
|
|
127
|
+
snapshot: OrderSnapshot;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export interface OrderFilledEvent extends OrderEventBase {
|
|
131
|
+
type: "order.filled";
|
|
132
|
+
snapshot: OrderSnapshot;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export interface OrderCanceledEvent extends OrderEventBase {
|
|
136
|
+
type: "order.canceled";
|
|
137
|
+
snapshot: OrderSnapshot;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export interface OrderRejectedEvent extends OrderEventBase {
|
|
141
|
+
type: "order.rejected";
|
|
142
|
+
snapshot: OrderSnapshot;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export interface OrderSnapshotReplacedEvent {
|
|
146
|
+
type: "order.snapshot_replaced";
|
|
147
|
+
accountId: string;
|
|
148
|
+
exchange: Exchange;
|
|
149
|
+
snapshot: OrderSnapshot[];
|
|
150
|
+
ts: number;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export type OrderEvent =
|
|
154
|
+
| OrderUpdatedEvent
|
|
155
|
+
| OrderFilledEvent
|
|
156
|
+
| OrderCanceledEvent
|
|
157
|
+
| OrderRejectedEvent
|
|
158
|
+
| OrderSnapshotReplacedEvent;
|
|
159
|
+
|
|
160
|
+
export interface OrderEventStreams {
|
|
161
|
+
updates(filter?: OrderEventFilter): AsyncIterable<OrderEvent>;
|
|
162
|
+
status(filter?: OrderEventFilter): AsyncIterable<OrderStatusChangedEvent>;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export interface OrderManager {
|
|
166
|
+
readonly events: OrderEventStreams;
|
|
167
|
+
|
|
168
|
+
subscribeOrders(input: SubscribeOrdersInput): Promise<void>;
|
|
169
|
+
unsubscribeOrders(input: UnsubscribeOrdersInput): Promise<void>;
|
|
170
|
+
createOrder(input: CreateOrderInput): Promise<OrderSnapshot>;
|
|
171
|
+
cancelOrder(input: CancelOrderInput): Promise<OrderSnapshot>;
|
|
172
|
+
cancelAllOrders(input: CancelAllOrdersInput): Promise<OrderSnapshot[]>;
|
|
173
|
+
|
|
174
|
+
getOrder(input: GetOrderInput): OrderSnapshot | undefined;
|
|
175
|
+
getOpenOrders(accountId: string, symbol?: string): OrderSnapshot[];
|
|
176
|
+
getOrderStatus(accountId: string): OrderDataStatus | undefined;
|
|
177
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
export const SUPPORTED_EXCHANGES = ["binance", "okx", "bybit", "gate"] as const;
|
|
2
|
+
|
|
3
|
+
export type Exchange = (typeof SUPPORTED_EXCHANGES)[number];
|
|
4
|
+
|
|
5
|
+
export type ClientStatus =
|
|
6
|
+
| "idle"
|
|
7
|
+
| "starting"
|
|
8
|
+
| "running"
|
|
9
|
+
| "stopping"
|
|
10
|
+
| "stopped";
|
|
11
|
+
|
|
12
|
+
export type LogLevel = "debug" | "info" | "warn" | "error";
|
|
13
|
+
|
|
14
|
+
export interface Logger {
|
|
15
|
+
debug(msg: string, context?: Record<string, unknown>): void;
|
|
16
|
+
info(msg: string, context?: Record<string, unknown>): void;
|
|
17
|
+
warn(msg: string, context?: Record<string, unknown>): void;
|
|
18
|
+
error(msg: string, context?: Record<string, unknown>): void;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface MarketRuntimeOptions {
|
|
22
|
+
l1InitialMessageTimeoutMs?: number;
|
|
23
|
+
l1StaleAfterMs?: number;
|
|
24
|
+
l1ReconnectDelayMs?: number;
|
|
25
|
+
l1ReconnectMaxDelayMs?: number;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface AccountRuntimeOptions {
|
|
29
|
+
streamOpenTimeoutMs?: number;
|
|
30
|
+
streamReconnectDelayMs?: number;
|
|
31
|
+
streamReconnectMaxDelayMs?: number;
|
|
32
|
+
listenKeyKeepAliveMs?: number;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface CreateClientOptions {
|
|
36
|
+
sandbox?: boolean;
|
|
37
|
+
logger?: Logger;
|
|
38
|
+
logLevel?: LogLevel;
|
|
39
|
+
market?: MarketRuntimeOptions;
|
|
40
|
+
account?: AccountRuntimeOptions;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface AccountCredentials {
|
|
44
|
+
apiKey?: string;
|
|
45
|
+
secret?: string;
|
|
46
|
+
password?: string;
|
|
47
|
+
extra?: Record<string, string>;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export interface RegisterAccountInput {
|
|
51
|
+
accountId: string;
|
|
52
|
+
exchange: Exchange;
|
|
53
|
+
credentials?: AccountCredentials;
|
|
54
|
+
options?: Record<string, unknown>;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface RegisterAccountResult {
|
|
58
|
+
accountId: string;
|
|
59
|
+
exchange: Exchange;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export interface StopOptions {
|
|
63
|
+
graceful?: boolean;
|
|
64
|
+
timeoutMs?: number;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export interface AcexInternalError {
|
|
68
|
+
source: "client" | "market" | "account" | "order" | "adapter" | "runtime";
|
|
69
|
+
exchange?: Exchange;
|
|
70
|
+
accountId?: string;
|
|
71
|
+
symbol?: string;
|
|
72
|
+
error: Error;
|
|
73
|
+
ts: number;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export type SubscriptionActivity = "active" | "inactive";
|
|
77
|
+
|
|
78
|
+
export type MarketFreshness = "fresh" | "stale" | "reconciling";
|
|
79
|
+
|
|
80
|
+
export type PrivateRuntimeStatus =
|
|
81
|
+
| "bootstrap_pending"
|
|
82
|
+
| "healthy"
|
|
83
|
+
| "degraded"
|
|
84
|
+
| "reconnecting"
|
|
85
|
+
| "reconciling"
|
|
86
|
+
| "stopped";
|
|
87
|
+
|
|
88
|
+
export type PrivateRuntimeReason =
|
|
89
|
+
| "credentials_missing"
|
|
90
|
+
| "auth_failed"
|
|
91
|
+
| "ws_disconnected"
|
|
92
|
+
| "heartbeat_timeout"
|
|
93
|
+
| "reconciling";
|