@raintree-technology/perps 0.1.2 → 0.1.4

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 (36) hide show
  1. package/CHANGELOG.md +19 -1
  2. package/README.md +42 -4
  3. package/dist/adapters/aevo.d.ts +1 -6
  4. package/dist/adapters/aevo.js +0 -21
  5. package/dist/adapters/certification.js +55 -9
  6. package/dist/adapters/decibel/order-manager.d.ts +41 -0
  7. package/dist/adapters/decibel/order-manager.js +216 -0
  8. package/dist/adapters/decibel/rest-client.d.ts +21 -0
  9. package/dist/adapters/decibel/rest-client.js +15 -8
  10. package/dist/adapters/decibel/ws-feed.js +19 -4
  11. package/dist/adapters/decibel.d.ts +15 -10
  12. package/dist/adapters/decibel.js +371 -50
  13. package/dist/adapters/hyperliquid.d.ts +1 -6
  14. package/dist/adapters/hyperliquid.js +0 -18
  15. package/dist/adapters/interface.d.ts +15 -14
  16. package/dist/adapters/orderly.d.ts +1 -9
  17. package/dist/adapters/orderly.js +0 -33
  18. package/dist/adapters/paradex.d.ts +1 -9
  19. package/dist/adapters/paradex.js +1 -34
  20. package/dist/cli/experience.js +0 -1
  21. package/dist/cli/program.js +28 -5
  22. package/dist/commands/arb/alert.d.ts +0 -4
  23. package/dist/commands/arb/alert.js +4 -14
  24. package/dist/commands/markets/index.js +2 -0
  25. package/dist/commands/markets/read-simple.d.ts +2 -0
  26. package/dist/commands/markets/read-simple.js +130 -0
  27. package/dist/commands/order/advanced-simple.d.ts +2 -0
  28. package/dist/commands/order/advanced-simple.js +820 -0
  29. package/dist/commands/order/index.js +2 -0
  30. package/dist/index.js +35 -1
  31. package/dist/lib/exit-codes.js +5 -1
  32. package/dist/lib/prompts.d.ts +0 -18
  33. package/dist/lib/prompts.js +1 -22
  34. package/dist/lib/schema.d.ts +8 -8
  35. package/dist/lib/schema.js +47 -8
  36. package/package.json +5 -2
@@ -32,16 +32,16 @@ export class DecibelRestClient {
32
32
  return this.unwrapRows(payload);
33
33
  }
34
34
  async getOpenOrders(accountAddr) {
35
- const payload = await this.fetchApi("api/v1/open_orders", { user: accountAddr }, true);
35
+ const payload = await this.fetchApi("api/v1/open_orders", { account: accountAddr }, true);
36
36
  return this.unwrapRows(payload);
37
37
  }
38
38
  async getOrderHistory(accountAddr, limit = 200, offset = 0) {
39
- const payload = await this.fetchApi("api/v1/order_history", { user: accountAddr, limit, offset }, true);
39
+ const payload = await this.fetchApi("api/v1/order_history", { account: accountAddr, limit, offset }, true);
40
40
  return this.unwrapRows(payload);
41
41
  }
42
42
  async getTradeHistory(accountAddr, marketAddr, limit = 200, offset = 0) {
43
43
  const params = {
44
- user: accountAddr,
44
+ account: accountAddr,
45
45
  limit,
46
46
  offset,
47
47
  };
@@ -74,6 +74,14 @@ export class DecibelRestClient {
74
74
  const payload = await this.fetchApi("api/v1/funding_rate_history", { account: accountAddr, limit, offset }, true);
75
75
  return this.unwrapRows(payload);
76
76
  }
77
+ async getActiveTwaps(accountAddr, limit = 200) {
78
+ const payload = await this.fetchApi("api/v1/active_twaps", { account: accountAddr, limit }, true);
79
+ return this.unwrapRows(payload);
80
+ }
81
+ async getTwapHistory(accountAddr, limit = 200, offset = 0) {
82
+ const payload = await this.fetchApi("api/v1/twap_history", { account: accountAddr, limit, offset }, true);
83
+ return this.unwrapRows(payload);
84
+ }
77
85
  async getOrderById(accountAddr, marketAddr, orderId, clientOrderId) {
78
86
  const params = {
79
87
  account: accountAddr,
@@ -93,11 +101,11 @@ export class DecibelRestClient {
93
101
  };
94
102
  if (orderId)
95
103
  params.order_id = orderId;
96
- const payload = await this.fetchApi("api/v1/trades", params);
104
+ const payload = await this.fetchApi("api/v1/trades", params, true);
97
105
  return this.unwrapRows(payload);
98
106
  }
99
107
  async getFundHistory(accountAddr, limit = 200, offset = 0) {
100
- const payload = await this.fetchApi("api/v1/fund_history", { account: accountAddr, limit, offset }, true);
108
+ const payload = await this.fetchApi("api/v1/account_fund_history", { account: accountAddr, limit, offset }, true);
101
109
  return this.unwrapRows(payload);
102
110
  }
103
111
  async fetchApi(path, params, requiresAuth = false) {
@@ -116,9 +124,6 @@ export class DecibelRestClient {
116
124
  }
117
125
  headers.Authorization = `Bearer ${this.bearerToken}`;
118
126
  }
119
- else if (this.bearerToken) {
120
- headers.Authorization = `Bearer ${this.bearerToken}`;
121
- }
122
127
  log.debug(`GET ${url.pathname}${url.search}`);
123
128
  const json = await fetchWithTimeout(url.toString(), {
124
129
  headers,
@@ -138,8 +143,10 @@ export class DecibelRestClient {
138
143
  }
139
144
  if (isRecord(payload)) {
140
145
  const candidates = [
146
+ payload.items,
141
147
  payload.results,
142
148
  payload.data,
149
+ isRecord(payload.data) ? payload.data.items : undefined,
143
150
  isRecord(payload.data) ? payload.data.rows : undefined,
144
151
  isRecord(payload.data) ? payload.data.orders : undefined,
145
152
  isRecord(payload.data) ? payload.data.trades : undefined,
@@ -65,10 +65,9 @@ export class DecibelWsFeed extends EventEmitter {
65
65
  return;
66
66
  }
67
67
  log.info(`WebSocket connecting: ${this.wsUrl}`);
68
- const options = this.bearerToken
69
- ? { headers: { "Sec-WebSocket-Protocol": `decibel, ${this.bearerToken}` } }
70
- : undefined;
71
- this.ws = options ? new WebSocket(this.wsUrl, options) : new WebSocket(this.wsUrl);
68
+ this.ws = this.bearerToken
69
+ ? new WebSocket(this.wsUrl, ["decibel", this.bearerToken])
70
+ : new WebSocket(this.wsUrl);
72
71
  this.ws.on("open", () => {
73
72
  log.info("WebSocket connected");
74
73
  this.startPing();
@@ -157,18 +156,34 @@ export class DecibelWsFeed extends EventEmitter {
157
156
  this.emit("account_positions", { accountAddr: topic.split(":")[1], data: payload });
158
157
  return;
159
158
  }
159
+ if (topic.startsWith("user_positions:")) {
160
+ this.emit("account_positions", { accountAddr: topic.split(":")[1], data: payload });
161
+ return;
162
+ }
160
163
  if (topic.startsWith("account_open_orders:")) {
161
164
  this.emit("account_open_orders", { accountAddr: topic.split(":")[1], data: payload });
162
165
  return;
163
166
  }
167
+ if (topic.startsWith("user_open_orders:")) {
168
+ this.emit("account_open_orders", { accountAddr: topic.split(":")[1], data: payload });
169
+ return;
170
+ }
164
171
  if (topic.startsWith("order_updates:")) {
165
172
  this.emit("order_updates", { accountAddr: topic.split(":")[1], data: payload });
166
173
  return;
167
174
  }
175
+ if (topic.startsWith("user_order_history:")) {
176
+ this.emit("order_updates", { accountAddr: topic.split(":")[1], data: payload });
177
+ return;
178
+ }
168
179
  if (topic.startsWith("user_trades:")) {
169
180
  this.emit("user_trades", { accountAddr: topic.split(":")[1], data: payload });
170
181
  return;
171
182
  }
183
+ if (topic.startsWith("user_active_twaps:")) {
184
+ this.emit("user_active_twaps", { accountAddr: topic.split(":")[1], data: payload });
185
+ return;
186
+ }
172
187
  if (topic.startsWith("notifications:")) {
173
188
  this.emit("notifications", { accountAddr: topic.split(":")[1], data: payload });
174
189
  return;
@@ -2,7 +2,7 @@
2
2
  * Decibel Adapter
3
3
  * Implements PerpDEXAdapter interface for Decibel (Aptos)
4
4
  */
5
- import { type Balance, type CancelOrderParams, type ExchangeConfig, type ExchangeInfo, type FundingPayment, type FundingRate, type MarginType, type Market, type ModifyOrderParams, type Order, type OrderBook, type OrderParams, type PerpDEXAdapter, type Position, type PublicTrade, type SubscriptionCallbacks, type Ticker, type Trade, type Unsubscribe, type MMPConfig, type MMPStatus, type TWAPParams, type TWAPStatus } from "./interface.js";
5
+ import { type Balance, type CancelOrderParams, type ExchangeConfig, type ExchangeInfo, type FundingPayment, type FundingRate, type MarginType, type Market, type ModifyOrderParams, type Order, type OrderBook, type OrderParams, type PerpDEXAdapter, type Position, type PublicTrade, type SubscriptionCallbacks, type Ticker, type Trade, type Unsubscribe, type TWAPParams, type TWAPStatus } from "./interface.js";
6
6
  export declare class DecibelAdapter implements PerpDEXAdapter {
7
7
  readonly info: ExchangeInfo;
8
8
  private config;
@@ -19,6 +19,8 @@ export declare class DecibelAdapter implements PerpDEXAdapter {
19
19
  private readonly assetContextsByMarketAddr;
20
20
  private assetContextsTimestamp;
21
21
  private readonly trackedMarketAddrs;
22
+ private readonly depthAggregationSize;
23
+ private readonly twapStatusById;
22
24
  private readonly tickerSubscribers;
23
25
  private readonly orderBookSubscribers;
24
26
  private readonly globalSubscribers;
@@ -45,19 +47,15 @@ export declare class DecibelAdapter implements PerpDEXAdapter {
45
47
  cancelAllOrders(market?: string): Promise<number>;
46
48
  setLeverage(market: string, leverage: number): Promise<void>;
47
49
  setMarginType(market: string, type: MarginType): Promise<void>;
48
- modifyOrder(_params: ModifyOrderParams): Promise<Order>;
50
+ modifyOrder(params: ModifyOrderParams): Promise<Order>;
49
51
  batchPlaceOrders(paramsList: OrderParams[]): Promise<Order[]>;
50
52
  batchCancelOrders(paramsList: CancelOrderParams[]): Promise<boolean[]>;
51
- cancelAllAfter(_timeoutMs: number): Promise<void>;
52
53
  getOrderHistory(market?: string, limit?: number): Promise<Order[]>;
53
- getFundingHistory(_market?: string, _limit?: number): Promise<FundingPayment[]>;
54
+ getFundingHistory(market?: string, limit?: number): Promise<FundingPayment[]>;
54
55
  getPublicTrades(market: string, limit?: number): Promise<PublicTrade[]>;
55
- setMMP(_config: MMPConfig): Promise<void>;
56
- getMMP(_market: string): Promise<MMPStatus>;
57
- resetMMP(_market: string): Promise<void>;
58
- placeTWAP(_params: TWAPParams): Promise<TWAPStatus>;
59
- cancelTWAP(_twapId: string): Promise<boolean>;
60
- getTWAPStatus(_twapId: string): Promise<TWAPStatus | null>;
56
+ placeTWAP(params: TWAPParams): Promise<TWAPStatus>;
57
+ cancelTWAP(twapId: string): Promise<boolean>;
58
+ getTWAPStatus(twapId: string): Promise<TWAPStatus | null>;
61
59
  updateIsolatedMargin(_market: string, _amount: string): Promise<void>;
62
60
  subscribe(callbacks: SubscriptionCallbacks): Unsubscribe;
63
61
  subscribeOrderBook(market: string, callback: (book: OrderBook) => void): Unsubscribe;
@@ -70,6 +68,7 @@ export declare class DecibelAdapter implements PerpDEXAdapter {
70
68
  private handleWsAccountOpenOrders;
71
69
  private handleWsUserTrades;
72
70
  private handleWsOrderUpdate;
71
+ private handleWsActiveTwaps;
73
72
  private handleWsNotification;
74
73
  private resolveNetwork;
75
74
  private loadMarkets;
@@ -83,6 +82,12 @@ export declare class DecibelAdapter implements PerpDEXAdapter {
83
82
  private toPosition;
84
83
  private toOrder;
85
84
  private toTrade;
85
+ private toTwapStatus;
86
+ private mapTwapState;
87
+ private cacheTwapStatus;
88
+ private findAndCacheTwap;
89
+ private normalizeTwapLookupId;
90
+ private isMatchingTwapLookupId;
86
91
  private resolveMarketSymbol;
87
92
  private mapOrderStatus;
88
93
  private mapOrderType;