@n1xyz/nord-ts 0.0.17 → 0.0.18

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 (48) hide show
  1. package/.local/qa.ts +77 -0
  2. package/.local/test-atomic.ts +112 -0
  3. package/check.sh +4 -0
  4. package/default.nix +47 -0
  5. package/dist/api/client.d.ts +14 -0
  6. package/dist/api/client.js +45 -0
  7. package/dist/gen/nord.d.ts +52 -23
  8. package/dist/gen/nord.js +322 -170
  9. package/dist/gen/openapi.d.ts +2244 -0
  10. package/dist/gen/openapi.js +6 -0
  11. package/dist/index.d.ts +0 -1
  12. package/dist/index.js +0 -9
  13. package/dist/nord/api/actions.d.ts +30 -1
  14. package/dist/nord/api/actions.js +60 -3
  15. package/dist/nord/api/core.d.ts +1 -34
  16. package/dist/nord/api/core.js +0 -71
  17. package/dist/nord/client/Nord.d.ts +31 -33
  18. package/dist/nord/client/Nord.js +100 -60
  19. package/dist/nord/client/NordUser.d.ts +64 -11
  20. package/dist/nord/client/NordUser.js +91 -33
  21. package/dist/nord/index.d.ts +0 -2
  22. package/dist/nord/index.js +0 -2
  23. package/dist/nord/models/Subscriber.d.ts +2 -2
  24. package/dist/types.d.ts +43 -190
  25. package/dist/utils.d.ts +1 -28
  26. package/dist/utils.js +5 -58
  27. package/dist/websocket/NordWebSocketClient.js +18 -13
  28. package/dist/websocket/index.d.ts +1 -1
  29. package/package.json +23 -31
  30. package/src/index.ts +0 -16
  31. package/src/nord/api/actions.ts +131 -9
  32. package/src/nord/api/core.ts +0 -71
  33. package/src/nord/client/Nord.ts +142 -76
  34. package/src/nord/client/NordUser.ts +171 -51
  35. package/src/nord/index.ts +0 -2
  36. package/src/nord/models/Subscriber.ts +2 -2
  37. package/src/types.ts +55 -216
  38. package/src/utils.ts +6 -63
  39. package/src/websocket/NordWebSocketClient.ts +23 -15
  40. package/src/websocket/index.ts +1 -1
  41. package/tests/utils.spec.ts +1 -34
  42. package/dist/idl/bridge.json +0 -1506
  43. package/jest.config.ts +0 -9
  44. package/nodemon.json +0 -4
  45. package/protoc-generate.sh +0 -23
  46. package/src/idl/bridge.json +0 -1506
  47. package/src/nord/api/market.ts +0 -122
  48. package/src/nord/api/queries.ts +0 -135
@@ -9,15 +9,15 @@ import Decimal from "decimal.js";
9
9
  import * as ed from "@noble/ed25519";
10
10
  import { sha512 } from "@noble/hashes/sha512";
11
11
  ed.etc.sha512Sync = sha512;
12
- import { SPLTokenInfo, DepositSplParams } from "@n1xyz/proton";
13
- import { FillMode, Order, Side } from "../../types";
12
+ import { floatToScaledBigIntLossy } from "@n1xyz/proton";
13
+ import { FillMode, Order, Side, SPLTokenInfo } from "../../types";
14
+ import * as proto from "../../gen/nord";
14
15
  import {
15
16
  BigIntValue,
16
17
  checkedFetch,
17
18
  findMarket,
18
19
  findToken,
19
20
  optExpect,
20
- toBN as utilsToBN,
21
21
  keypairFromPrivateKey,
22
22
  } from "../../utils";
23
23
  import {
@@ -27,6 +27,8 @@ import {
27
27
  revokeSession,
28
28
  transfer,
29
29
  withdraw,
30
+ atomic as atomicAction,
31
+ AtomicSubaction as ApiAtomicSubaction,
30
32
  } from "../api/actions";
31
33
  import { NordError } from "../utils/NordError";
32
34
  import { Nord } from "./Nord";
@@ -48,7 +50,7 @@ export interface NordUserParams {
48
50
  sessionSignFn: (message: Uint8Array) => Promise<Uint8Array>;
49
51
 
50
52
  /** Function to sign transactions with the user's wallet (optional) */
51
- transactionSignFn: (transaction: any) => Promise<any>;
53
+ transactionSignFn: <T extends Transaction>(tx: T) => Promise<T>;
52
54
 
53
55
  /** Solana connection (optional) */
54
56
  connection?: Connection;
@@ -112,6 +114,41 @@ export interface TransferParams {
112
114
  toAccountId: number;
113
115
  }
114
116
 
117
+ /**
118
+ * Parameters for individual atomic subactions (user-friendly version)
119
+ */
120
+ export interface UserAtomicSubaction {
121
+ /** The type of action to perform. */
122
+ kind: "place" | "cancel";
123
+
124
+ /** The market ID to place the order in. */
125
+ marketId?: number;
126
+
127
+ /** The order ID to cancel. */
128
+ orderId?: BigIntValue;
129
+
130
+ /** Order side (bid or ask) */
131
+ side?: Side;
132
+
133
+ /** Fill mode (limit, market, etc.) */
134
+ fillMode?: FillMode;
135
+
136
+ /** Whether the order is reduce-only. */
137
+ isReduceOnly?: boolean;
138
+
139
+ /** The size of the order. */
140
+ size?: Decimal.Value;
141
+
142
+ /** Order price */
143
+ price?: Decimal.Value;
144
+
145
+ /** Quote size (for market orders) */
146
+ quoteSize?: Decimal.Value;
147
+
148
+ /** The client order ID of the order. */
149
+ clientOrderId?: BigIntValue;
150
+ }
151
+
115
152
  /**
116
153
  * User class for interacting with the Nord protocol
117
154
  */
@@ -131,16 +168,15 @@ export class NordUser {
131
168
  public readonly sessionSignFn: (message: Uint8Array) => Promise<Uint8Array>;
132
169
 
133
170
  /** Function to sign transactions with the user's wallet */
134
- public readonly transactionSignFn: (transaction: any) => Promise<any>;
171
+ public readonly transactionSignFn: <T extends Transaction>(
172
+ tx: T,
173
+ ) => Promise<T>;
135
174
 
136
175
  /** User balances by token symbol */
137
176
  public balances: {
138
177
  [key: string]: { accountId: number; balance: number; symbol: string }[];
139
178
  } = {};
140
179
 
141
- /** User orders by market symbol */
142
- public orders: { [key: string]: Order[] } = {};
143
-
144
180
  /** User positions by account ID */
145
181
  public positions: {
146
182
  [key: string]: {
@@ -276,7 +312,6 @@ export class NordUser {
276
312
 
277
313
  // Copy other properties
278
314
  cloned.balances = { ...this.balances };
279
- cloned.orders = { ...this.orders };
280
315
  cloned.positions = { ...this.positions };
281
316
  cloned.margins = { ...this.margins };
282
317
  cloned.accountIds = this.accountIds ? [...this.accountIds] : undefined;
@@ -417,10 +452,37 @@ export class NordUser {
417
452
  *
418
453
  * @param amount - Amount to deposit
419
454
  * @param tokenId - Token ID
455
+ * @param recipient - Recipient address; defaults to the user's address
420
456
  * @returns Transaction signature
457
+ * @deprecated Use deposit instead
421
458
  * @throws {NordError} If required parameters are missing or operation fails
422
459
  */
423
- async depositSpl(amount: number, tokenId: number): Promise<string> {
460
+ async depositSpl(
461
+ amount: number,
462
+ tokenId: number,
463
+ recipient?: PublicKey,
464
+ ): Promise<string> {
465
+ return this.deposit({ amount, tokenId, recipient });
466
+ }
467
+
468
+ /**
469
+ * Deposit SPL tokens to the bridge
470
+ *
471
+ * @param amount - Amount to deposit
472
+ * @param tokenId - Token ID
473
+ * @param recipient - Recipient address; defaults to the user's address
474
+ * @returns Transaction signature
475
+ * @throws {NordError} If required parameters are missing or operation fails
476
+ */
477
+ async deposit({
478
+ amount,
479
+ tokenId,
480
+ recipient,
481
+ }: Readonly<{
482
+ amount: number;
483
+ tokenId: number;
484
+ recipient?: PublicKey;
485
+ }>): Promise<string> {
424
486
  try {
425
487
  // Find the token info
426
488
  const tokenInfo = this.splTokenInfos.find((t) => t.tokenId === tokenId);
@@ -429,35 +491,28 @@ export class NordUser {
429
491
  }
430
492
 
431
493
  const mint = new PublicKey(tokenInfo.mint);
432
- // Get the user's token account
433
494
  const fromAccount = await this.getAssociatedTokenAccount(mint);
495
+ const payer = this.getSolanaPublicKey();
434
496
 
435
- // Convert amount to BN with proper decimals
436
- const amountBN = utilsToBN(amount, tokenInfo.precision);
437
-
438
- // Create deposit parameters
439
- const depositParams: DepositSplParams = {
440
- amount: amountBN,
497
+ const { ix, extraSigner } = await this.nord.protonClient.buildDepositIx({
498
+ payer,
499
+ recipient: recipient ?? payer,
500
+ quantAmount: floatToScaledBigIntLossy(amount, tokenInfo.precision),
441
501
  mint,
442
- fromAccount,
443
- };
444
-
445
- // Build the deposit transaction using proton client
446
- const depositTx = await this.nord.protonClient.buildDepositTx(
447
- depositParams,
448
- this.getSolanaPublicKey(),
449
- this.connection,
450
- );
502
+ sourceTokenAccount: fromAccount,
503
+ });
451
504
 
452
- const { blockhash } = await this.connection.getLatestBlockhash();
505
+ const { blockhash } =
506
+ await this.connection.getLatestBlockhash("confirmed");
507
+ const tx = new Transaction();
453
508
 
454
- depositTx.recentBlockhash = blockhash;
455
- depositTx.feePayer = this.getSolanaPublicKey();
509
+ tx.add(ix);
510
+ tx.recentBlockhash = blockhash;
511
+ tx.feePayer = payer;
456
512
 
457
- const signedTx = await this.transactionSignFn(depositTx);
513
+ const signedTx = await this.transactionSignFn(tx);
514
+ signedTx.partialSign(extraSigner);
458
515
 
459
- // TODO: should use `VersionedTransaction` and remove any for `transactionSignFn`,
460
- // this is incredibly annoying to debug and i could've saved 30 mins.
461
516
  const signature = await this.connection.sendRawTransaction(
462
517
  signedTx.serialize(),
463
518
  );
@@ -491,10 +546,14 @@ export class NordUser {
491
546
  throw new NordError("Public key is required to update account ID");
492
547
  }
493
548
 
494
- const resp = await this.nord.getUserAccountIds({
549
+ const resp = await this.nord.getUser({
495
550
  pubkey: this.publicKey.toBase58(),
496
551
  });
497
552
 
553
+ if (!resp) {
554
+ throw new NordError(`User ${this.publicKey.toBase58()} not found`);
555
+ }
556
+
498
557
  this.accountIds = resp.accountIds;
499
558
  } catch (error) {
500
559
  throw new NordError("Failed to update account ID", { cause: error });
@@ -583,19 +642,6 @@ export class NordUser {
583
642
  });
584
643
  }
585
644
 
586
- // Process orders
587
- this.orders[accountData.accountId] = accountData.orders.map(
588
- (order: OpenOrder) => {
589
- return {
590
- orderId: order.orderId,
591
- isLong: order.side === "bid",
592
- size: order.size,
593
- price: order.price,
594
- marketId: order.marketId,
595
- };
596
- },
597
- );
598
-
599
645
  // Process positions
600
646
  this.positions[accountData.accountId] = accountData.positions;
601
647
 
@@ -611,7 +657,6 @@ export class NordUser {
611
657
  * @throws {NordError} If the operation fails
612
658
  */
613
659
  async refreshSession(): Promise<void> {
614
- console.log(this.publicKey);
615
660
  this.sessionId = await createSession(
616
661
  this.nord.webServerUrl,
617
662
  this.walletSignFn,
@@ -667,10 +712,13 @@ export class NordUser {
667
712
  * @param amount - Amount to withdraw
668
713
  * @throws {NordError} If the operation fails
669
714
  */
670
- async withdraw(
671
- tokenId: number,
672
- amount: number,
673
- ): Promise<{ actionId: bigint }> {
715
+ async withdraw({
716
+ amount,
717
+ tokenId,
718
+ }: Readonly<{
719
+ tokenId: number;
720
+ amount: number;
721
+ }>): Promise<{ actionId: bigint }> {
674
722
  try {
675
723
  this.checkSessionValidity();
676
724
  const { actionId } = await withdraw(
@@ -797,6 +845,78 @@ export class NordUser {
797
845
  }
798
846
  }
799
847
 
848
+ /**
849
+ * Execute up to four place/cancel operations atomically.
850
+ * Per Market:
851
+ * 1. cancels can only be in the start (one cannot predict future order ids)
852
+ * 2. intermediate trades can trade only
853
+ * 3. placements go last
854
+ *
855
+ * Across Markets, order action can be any
856
+ *
857
+ * @param userActions array of user-friendly subactions
858
+ * @param providedAccountId optional account performing the action (defaults to first account)
859
+ */
860
+ async atomic(
861
+ userActions: UserAtomicSubaction[],
862
+ providedAccountId?: number,
863
+ ): Promise<proto.Receipt_AtomicResult> {
864
+ try {
865
+ this.checkSessionValidity();
866
+
867
+ const accountId =
868
+ providedAccountId != null ? providedAccountId : this.accountIds?.[0];
869
+
870
+ if (accountId == null) {
871
+ throw new NordError(
872
+ "Account ID is undefined. Make sure to call updateAccountId() before atomic operations.",
873
+ );
874
+ }
875
+
876
+ const apiActions: ApiAtomicSubaction[] = userActions.map((act) => {
877
+ if (act.kind === "place") {
878
+ const market = findMarket(this.nord.markets, act.marketId!);
879
+ if (!market) {
880
+ throw new NordError(`Market ${act.marketId} not found`);
881
+ }
882
+ return {
883
+ kind: "place",
884
+ marketId: act.marketId,
885
+ side: act.side,
886
+ fillMode: act.fillMode,
887
+ isReduceOnly: act.isReduceOnly,
888
+ sizeDecimals: market.sizeDecimals,
889
+ priceDecimals: market.priceDecimals,
890
+ size: act.size,
891
+ price: act.price,
892
+ quoteSizeSize: act.quoteSize, // treated as quote size; we pass only size component
893
+ quoteSizePrice: undefined,
894
+ clientOrderId: act.clientOrderId,
895
+ } as ApiAtomicSubaction;
896
+ }
897
+ return {
898
+ kind: "cancel",
899
+ orderId: act.orderId,
900
+ } as ApiAtomicSubaction;
901
+ });
902
+
903
+ const result = await atomicAction(
904
+ this.nord.webServerUrl,
905
+ this.sessionSignFn,
906
+ await this.nord.getTimestamp(),
907
+ this.getNonce(),
908
+ {
909
+ sessionId: optExpect(this.sessionId, "No session"),
910
+ accountId: accountId,
911
+ actions: apiActions,
912
+ },
913
+ );
914
+ return result;
915
+ } catch (error) {
916
+ throw new NordError("Atomic operation failed", { cause: error });
917
+ }
918
+ }
919
+
800
920
  /**
801
921
  * Helper function to retry a promise with exponential backoff
802
922
  *
package/src/nord/index.ts CHANGED
@@ -8,8 +8,6 @@ export { NordError } from "./utils/NordError";
8
8
  // Export API modules
9
9
  export * from "./api/core";
10
10
  export * from "./api/metrics";
11
- export * from "./api/queries";
12
- export * from "./api/market";
13
11
  export * from "./api/actions";
14
12
 
15
13
  // Export models
@@ -4,7 +4,7 @@ import {
4
4
  DeltaEvent,
5
5
  OrderbookResponse,
6
6
  SubscriberConfig,
7
- Trade,
7
+ StreamTrade,
8
8
  Trades,
9
9
  } from "../../types";
10
10
  import { MAX_BUFFER_LEN } from "../../utils";
@@ -49,7 +49,7 @@ export interface OrderbookSubscription extends EventEmitter {
49
49
  * Interface for trade subscription
50
50
  */
51
51
  export interface TradeSubscription extends EventEmitter {
52
- on(event: "message", listener: (data: Trade[]) => void): this;
52
+ on(event: "message", listener: (data: StreamTrade[]) => void): this;
53
53
  on(event: "error", listener: (error: Error) => void): this;
54
54
  close(): void;
55
55
  removeAllListeners(event?: string): this;
package/src/types.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import * as proto from "./gen/nord";
2
+ import type { components } from "./gen/openapi.ts";
2
3
 
3
4
  /**
4
5
  * The peak TPS rate is queried over the specified period.
@@ -46,6 +47,46 @@ export interface NordConfig {
46
47
  initWebSockets?: boolean;
47
48
  }
48
49
 
50
+ export type Info = components["schemas"]["Info2"];
51
+ export type Market = Info["markets"][number];
52
+ export type Token = Info["tokens"][number];
53
+ export type Account = components["schemas"]["Account"];
54
+ export type TradesResponse =
55
+ components["schemas"]["PageResult_for_String_and_Trade"];
56
+ export type User = components["schemas"]["User"];
57
+ export type OrderbookResponse = components["schemas"]["OrderbookInfo"];
58
+ export type MarketStats = components["schemas"]["MarketStats"];
59
+ export type OrderbookInfo = components["schemas"]["OrderbookInfo"];
60
+ export type MarketStatsFromApi = components["schemas"]["MarketStats"];
61
+ export type TradeFromApi = components["schemas"]["Trade"];
62
+ // Generic PageResult type - note that K and V must match existing schema keys
63
+ export type PageResult<K extends string, V extends string> = K extends "String"
64
+ ? V extends "OrderInfo"
65
+ ? components["schemas"]["PageResult_for_String_and_OrderInfo"]
66
+ : V extends "Trade"
67
+ ? components["schemas"]["PageResult_for_String_and_Trade"]
68
+ : never
69
+ : never;
70
+ export type PageResultStringOrderInfo =
71
+ components["schemas"]["PageResult_for_String_and_OrderInfo"];
72
+ export type PageResultStringTrade =
73
+ components["schemas"]["PageResult_for_String_and_Trade"];
74
+ export type OrderInfoFromApi = components["schemas"]["OrderInfo"];
75
+ export type OpenOrder = components["schemas"]["OpenOrder"];
76
+ export type Balance = components["schemas"]["Balance"];
77
+ export type PositionSummary = components["schemas"]["PositionSummary"];
78
+ export type PerpPosition = components["schemas"]["PerpPosition"];
79
+ export type AccountMarginsView = components["schemas"]["AccountMarginsView"];
80
+ export type SideSummary = components["schemas"]["SideSummary"];
81
+ export type UserSession = components["schemas"]["UserSession"];
82
+ export type ActionsItem = components["schemas"]["ActionsItem"];
83
+ export type FillRole = components["schemas"]["FillRole"];
84
+ export type PerpMarketStatsFromApi = components["schemas"]["PerpMarketStats"];
85
+ export type SideFromApi = components["schemas"]["Side"];
86
+ export type FillModeFromApi = components["schemas"]["FillMode"];
87
+ export type PlacementOrigin = components["schemas"]["PlacementOrigin"];
88
+ export type FinalizationReason = components["schemas"]["FinalizationReason"];
89
+
49
90
  /**
50
91
  * Configuration options for the Nord client
51
92
  */
@@ -87,28 +128,6 @@ export interface SubscriberConfig {
87
128
  maxBufferLen?: number;
88
129
  }
89
130
 
90
- export interface Market {
91
- marketId: number;
92
- symbol: string;
93
- priceDecimals: number;
94
- sizeDecimals: number;
95
- baseTokenId: number;
96
- quoteTokenId: number;
97
- frozen: boolean;
98
- }
99
-
100
- export interface Token {
101
- tokenId: number;
102
- symbol: string;
103
- decimals: number;
104
- mintAddr: string;
105
- }
106
-
107
- export interface Info {
108
- markets: Market[];
109
- tokens: Token[];
110
- }
111
-
112
131
  export interface DeltaEvent {
113
132
  last_update_id: number;
114
133
  update_id: number;
@@ -117,7 +136,7 @@ export interface DeltaEvent {
117
136
  bids: OrderbookEntry[];
118
137
  }
119
138
 
120
- export interface Trade {
139
+ export interface StreamTrade {
121
140
  side: Side;
122
141
  price: number;
123
142
  size: number;
@@ -128,95 +147,26 @@ export interface Trades {
128
147
  last_update_id: number;
129
148
  update_id: number;
130
149
  market_symbol: string;
131
- trades: Trade[];
150
+ trades: StreamTrade[];
132
151
  }
133
152
 
134
- export interface OrderInfo {
153
+ export interface LocalOrderInfo {
135
154
  id: number;
136
155
  reduce_only: boolean;
137
156
  limit_price: number;
138
157
  size: number;
139
158
  account_id: number;
159
+ sender_tracking_id?: number;
140
160
  }
141
161
 
142
162
  export interface HashMap<T> {
143
163
  [key: number]: T;
144
164
  }
145
165
 
146
- export interface Account {
147
- last_update_id: number;
148
- update_id: number;
149
- account_id: number;
150
- fills: HashMap<number>;
151
- places: HashMap<OrderInfo>;
152
- cancels: HashMap<OrderInfo>;
153
- balances: HashMap<number>;
154
- }
155
-
156
- /**
157
- * Query the transactions in the specified L2 block.
158
- * block_number specifies the block number to query.
159
- * If not specified, transactions from latest block are returned.
160
- */
161
- export interface BlockQuery {
162
- block_number?: number;
163
- }
164
-
165
- /**
166
- * Response for BlockQuery.
167
- * block_number specifies the block number being returned.
168
- * actions are the list of transactions from the block.
169
- */
170
- export interface BlockResponse {
171
- block_number: number;
172
- actions: ActionInfo[];
173
- }
174
-
175
- /**
176
- * Response for BlockSummaryQuery.
177
- * block_summary is the summary of upto the last N blocks.
178
- * The server can return fewer than last_n block summary if
179
- * fewer blocks are available or if it exceeds a max cap.
180
- */
181
- export interface BlockSummaryResponse {
182
- block_summary: BlockSummary[];
183
- }
184
-
185
- /**
186
- * Query the action for the specified action id.
187
- * action_id specifies the action to query.
188
- */
189
- export interface ActionQuery {
190
- action_id: number;
191
- }
192
-
193
- /**
194
- * Response for ActionQuery.
195
- * block_number the block the action is part of.
196
- * If the action is not yet included in any block, null is returned.
197
- * action the transaction.
198
- */
199
166
  export interface ActionResponse {
200
- block_number?: number;
167
+ actionId: number;
201
168
  action: proto.Action;
202
- }
203
-
204
- /**
205
- * Query the recent actions
206
- * last_n requests last N actions.
207
- */
208
- export interface ActionsQuery {
209
- last_n: number;
210
- }
211
-
212
- /**
213
- * Response for ActionsQuery.
214
- * actions returns upto the last N actions.
215
- * The server can return fewer than last_n actions if
216
- * fewer actions are available or if it exceeds a max cap.
217
- */
218
- export interface ActionsResponse {
219
- actions: ActionsExtendedInfo[];
169
+ physicalExecTime: Date;
220
170
  }
221
171
 
222
172
  /**
@@ -231,31 +181,6 @@ export interface BlockSummary {
231
181
  to_action_id: number;
232
182
  }
233
183
 
234
- /**
235
- * Info about the block transaction.
236
- * action_id is the action identifier.
237
- * action in protobuf format.
238
- * exec_timestamp is the execution timestamp.
239
- */
240
- export interface ActionInfo {
241
- action_id: number;
242
- action: proto.Action;
243
- exec_timestamp: number;
244
- }
245
-
246
- /**
247
- * Extended info about the block transaction.
248
- * block_number the block the action is part of.
249
- * If the action is not yet included in any block, null is returned.
250
- * action_id of the action.
251
- * action the transaction.
252
- */
253
- export interface ActionsExtendedInfo {
254
- block_number?: number;
255
- action_id: number;
256
- action: proto.Action;
257
- }
258
-
259
184
  /**
260
185
  * Aggregate metrics
261
186
  * blocks_total: Total number of L2 blocks.
@@ -272,54 +197,6 @@ export interface AggregateMetrics {
272
197
  request_latency_average: number;
273
198
  }
274
199
 
275
- // The JSON types returned by rollman, that need to be translated to TS format.
276
- export interface RollmanBlockResponse {
277
- block_number: number;
278
- actions: RollmanActionInfo[];
279
- }
280
-
281
- export interface RollmanActionResponse {
282
- block_number?: number;
283
- action_pb: Uint8Array;
284
- exec_timestamp: number;
285
- }
286
-
287
- export interface RollmanActionsResponse {
288
- actions: RollmanActionExtendedInfo[];
289
- }
290
-
291
- export interface RollmanActionInfo {
292
- action_id: number;
293
- action_pb: Uint8Array;
294
- exec_timestamp: number;
295
- }
296
-
297
- export interface RollmanActionExtendedInfo {
298
- block_number?: number;
299
- action_id: number;
300
- action_pb: Uint8Array;
301
- }
302
-
303
- export interface MarketsStatsResponse {
304
- markets: MarketStats[];
305
- }
306
-
307
- export interface MarketStats {
308
- market_id: number;
309
- index_price: [number, number];
310
- volume_24h: number;
311
- high_24h: number;
312
- low_24h: number;
313
- perp_stats?: PerpMarketStats;
314
- }
315
-
316
- export interface PerpMarketStats {
317
- mark_price?: number;
318
- funding_rate?: number;
319
- next_funding_time?: Date;
320
- open_interest?: number;
321
- }
322
-
323
200
  /**
324
201
  * Converts a `FillMode` enum to its corresponding protobuf representation.
325
202
  *
@@ -337,41 +214,6 @@ export function fillModeToProtoFillMode(x: FillMode): proto.FillMode {
337
214
  throw new Error("Invalid fill mode");
338
215
  }
339
216
 
340
- /**
341
- * Response for trades query with pagination support
342
- */
343
- export interface TradesResponse {
344
- trades: Trade[];
345
- accountId: number;
346
- since?: string; // RFC3339 timestamp
347
- until?: string; // RFC3339 timestamp
348
- nextPageId?: string;
349
- }
350
-
351
- /**
352
- * Query parameters for trades endpoint
353
- */
354
- export interface TradesQuery {
355
- accountId: number;
356
- since?: string; // RFC3339 timestamp
357
- until?: string; // RFC3339 timestamp
358
- pageId?: string;
359
- }
360
-
361
- /**
362
- * Response for user account IDs query
363
- */
364
- export interface UserAccountIdsResponse {
365
- accountIds: number[];
366
- }
367
-
368
- /**
369
- * Query parameters for user account IDs
370
- */
371
- export interface UserAccountIdsQuery {
372
- pubkey: string; // secp256k1 public key in hex format
373
- }
374
-
375
217
  /**
376
218
  * Orderbook entry representing price and size
377
219
  */
@@ -380,16 +222,6 @@ export interface OrderbookEntry {
380
222
  size: number;
381
223
  }
382
224
 
383
- /**
384
- * Response for orderbook query
385
- */
386
- export interface OrderbookResponse {
387
- symbol: string;
388
- asks: OrderbookEntry[];
389
- bids: OrderbookEntry[];
390
- timestamp: number;
391
- }
392
-
393
225
  /**
394
226
  * Query parameters for orderbook
395
227
  *
@@ -440,7 +272,7 @@ export interface WebSocketSubscription {
440
272
  export interface WebSocketTradeUpdate {
441
273
  e: WebSocketMessageType.TradeUpdate;
442
274
  symbol: string;
443
- trades: Trade[];
275
+ trades: StreamTrade[];
444
276
  timestamp: number;
445
277
  }
446
278
 
@@ -472,3 +304,10 @@ export type WebSocketMessage =
472
304
  | WebSocketTradeUpdate
473
305
  | WebSocketDeltaUpdate
474
306
  | WebSocketAccountUpdate;
307
+
308
+ export interface SPLTokenInfo {
309
+ mint: string;
310
+ precision: number;
311
+ tokenId: number;
312
+ name: string;
313
+ }