@drift-labs/sdk 2.96.0-beta.2 → 2.96.0-beta.20

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 (110) hide show
  1. package/README.md +1 -0
  2. package/VERSION +1 -1
  3. package/bun.lockb +0 -0
  4. package/lib/accounts/pollingDriftClientAccountSubscriber.d.ts +5 -3
  5. package/lib/accounts/pollingDriftClientAccountSubscriber.js +24 -1
  6. package/lib/accounts/types.d.ts +5 -8
  7. package/lib/accounts/types.js +7 -1
  8. package/lib/accounts/utils.d.ts +7 -0
  9. package/lib/accounts/utils.js +33 -1
  10. package/lib/accounts/webSocketAccountSubscriber.d.ts +1 -1
  11. package/lib/accounts/webSocketDriftClientAccountSubscriber.d.ts +8 -7
  12. package/lib/accounts/webSocketDriftClientAccountSubscriber.js +24 -1
  13. package/lib/accounts/webSocketProgramAccountSubscriber.d.ts +1 -1
  14. package/lib/config.d.ts +5 -1
  15. package/lib/config.js +9 -1
  16. package/lib/constants/perpMarkets.js +21 -0
  17. package/lib/constants/spotMarkets.js +12 -1
  18. package/lib/driftClient.d.ts +44 -9
  19. package/lib/driftClient.js +181 -61
  20. package/lib/driftClientConfig.d.ts +2 -6
  21. package/lib/events/eventSubscriber.js +9 -8
  22. package/lib/events/types.js +1 -5
  23. package/lib/idl/drift.json +169 -1
  24. package/lib/index.d.ts +1 -0
  25. package/lib/index.js +1 -0
  26. package/lib/math/margin.d.ts +16 -1
  27. package/lib/math/margin.js +67 -1
  28. package/lib/orderParams.js +8 -8
  29. package/lib/orderSubscriber/OrderSubscriber.d.ts +1 -2
  30. package/lib/orderSubscriber/OrderSubscriber.js +4 -19
  31. package/lib/orderSubscriber/types.d.ts +0 -9
  32. package/lib/tokenFaucet.js +2 -1
  33. package/lib/tx/baseTxSender.js +2 -2
  34. package/lib/tx/fastSingleTxSender.js +2 -2
  35. package/lib/tx/forwardOnlyTxSender.js +2 -2
  36. package/lib/tx/retryTxSender.js +2 -2
  37. package/lib/tx/txHandler.js +10 -7
  38. package/lib/tx/whileValidTxSender.d.ts +2 -4
  39. package/lib/tx/whileValidTxSender.js +16 -17
  40. package/lib/types.d.ts +21 -1
  41. package/lib/types.js +6 -1
  42. package/lib/user.d.ts +4 -1
  43. package/lib/user.js +13 -13
  44. package/lib/userConfig.d.ts +1 -6
  45. package/lib/userMap/userMap.js +0 -14
  46. package/lib/userMap/userMapConfig.d.ts +0 -7
  47. package/lib/userStatsConfig.d.ts +0 -6
  48. package/lib/util/TransactionConfirmationManager.d.ts +14 -0
  49. package/lib/util/TransactionConfirmationManager.js +96 -0
  50. package/package.json +4 -5
  51. package/src/accounts/pollingDriftClientAccountSubscriber.ts +41 -5
  52. package/src/accounts/types.ts +6 -9
  53. package/src/accounts/utils.ts +42 -0
  54. package/src/accounts/webSocketAccountSubscriber.ts +1 -1
  55. package/src/accounts/webSocketDriftClientAccountSubscriber.ts +43 -8
  56. package/src/accounts/webSocketProgramAccountSubscriber.ts +1 -1
  57. package/src/config.ts +15 -1
  58. package/src/constants/perpMarkets.ts +22 -0
  59. package/src/constants/spotMarkets.ts +14 -1
  60. package/src/driftClient.ts +423 -91
  61. package/src/driftClientConfig.ts +2 -7
  62. package/src/events/eventSubscriber.ts +18 -11
  63. package/src/events/types.ts +1 -5
  64. package/src/idl/drift.json +169 -1
  65. package/src/index.ts +1 -0
  66. package/src/math/margin.ts +137 -1
  67. package/src/orderParams.ts +20 -12
  68. package/src/orderSubscriber/OrderSubscriber.ts +1 -15
  69. package/src/orderSubscriber/types.ts +0 -10
  70. package/src/tokenFaucet.ts +2 -2
  71. package/src/tx/baseTxSender.ts +2 -2
  72. package/src/tx/fastSingleTxSender.ts +2 -2
  73. package/src/tx/forwardOnlyTxSender.ts +2 -2
  74. package/src/tx/retryTxSender.ts +2 -2
  75. package/src/tx/txHandler.ts +8 -2
  76. package/src/tx/whileValidTxSender.ts +23 -26
  77. package/src/types.ts +30 -1
  78. package/src/user.ts +35 -13
  79. package/src/userConfig.ts +1 -7
  80. package/src/userMap/userMap.ts +1 -17
  81. package/src/userMap/userMapConfig.ts +0 -8
  82. package/src/userStatsConfig.ts +0 -7
  83. package/src/util/TransactionConfirmationManager.ts +155 -0
  84. package/tests/ci/idl.ts +12 -3
  85. package/tests/ci/verifyConstants.ts +13 -0
  86. package/tests/tx/TransactionConfirmationManager.test.ts +286 -0
  87. package/lib/accounts/grpcAccountSubscriber.d.ts +0 -16
  88. package/lib/accounts/grpcAccountSubscriber.js +0 -155
  89. package/lib/accounts/grpcDriftClientAccountSubscriber.d.ts +0 -13
  90. package/lib/accounts/grpcDriftClientAccountSubscriber.js +0 -96
  91. package/lib/accounts/grpcInsuranceFundStakeAccountSubscriber.d.ts +0 -10
  92. package/lib/accounts/grpcInsuranceFundStakeAccountSubscriber.js +0 -30
  93. package/lib/accounts/grpcProgramAccountSubscriber.d.ts +0 -19
  94. package/lib/accounts/grpcProgramAccountSubscriber.js +0 -161
  95. package/lib/accounts/grpcUserAccountSubscriber.d.ts +0 -10
  96. package/lib/accounts/grpcUserAccountSubscriber.js +0 -28
  97. package/lib/accounts/grpcUserStatsAccountSubscriber.d.ts +0 -10
  98. package/lib/accounts/grpcUserStatsAccountSubscriber.js +0 -28
  99. package/lib/orderSubscriber/grpcSubscription.d.ts +0 -25
  100. package/lib/orderSubscriber/grpcSubscription.js +0 -68
  101. package/lib/userMap/grpcSubscription.d.ts +0 -26
  102. package/lib/userMap/grpcSubscription.js +0 -42
  103. package/src/accounts/grpcAccountSubscriber.ts +0 -158
  104. package/src/accounts/grpcDriftClientAccountSubscriber.ts +0 -196
  105. package/src/accounts/grpcInsuranceFundStakeAccountSubscriber.ts +0 -62
  106. package/src/accounts/grpcProgramAccountSubscriber.ts +0 -181
  107. package/src/accounts/grpcUserAccountSubscriber.ts +0 -48
  108. package/src/accounts/grpcUserStatsAccountSubscriber.ts +0 -51
  109. package/src/orderSubscriber/grpcSubscription.ts +0 -126
  110. package/src/userMap/grpcSubscription.ts +0 -83
@@ -94,7 +94,7 @@ export class WebSocketAccountSubscriber<T> implements AccountSubscriber<T> {
94
94
  };
95
95
  }
96
96
 
97
- protected setTimeout(): void {
97
+ private setTimeout(): void {
98
98
  if (!this.onChange) {
99
99
  throw new Error('onChange callback function must be set');
100
100
  }
@@ -1,19 +1,21 @@
1
1
  import {
2
- DriftClientAccountSubscriber,
3
- DriftClientAccountEvents,
2
+ AccountSubscriber,
4
3
  DataAndSlot,
4
+ DelistedMarketSetting,
5
+ DriftClientAccountEvents,
6
+ DriftClientAccountSubscriber,
7
+ NotSubscribedError,
5
8
  ResubOpts,
6
9
  } from './types';
7
- import { AccountSubscriber, NotSubscribedError } from './types';
8
- import { SpotMarketAccount, PerpMarketAccount, StateAccount } from '../types';
10
+ import { PerpMarketAccount, SpotMarketAccount, StateAccount } from '../types';
9
11
  import { Program } from '@coral-xyz/anchor';
10
12
  import StrictEventEmitter from 'strict-event-emitter-types';
11
13
  import { EventEmitter } from 'events';
12
14
  import {
13
15
  getDriftStateAccountPublicKey,
14
- getSpotMarketPublicKey,
15
16
  getPerpMarketPublicKey,
16
17
  getPerpMarketPublicKeySync,
18
+ getSpotMarketPublicKey,
17
19
  getSpotMarketPublicKeySync,
18
20
  } from '../addresses/pda';
19
21
  import { WebSocketAccountSubscriber } from './webSocketAccountSubscriber';
@@ -23,6 +25,7 @@ import { OracleClientCache } from '../oracles/oracleClientCache';
23
25
  import * as Buffer from 'buffer';
24
26
  import { QUOTE_ORACLE_PRICE_DATA } from '../oracles/quoteAssetOracleClient';
25
27
  import { findAllMarketAndOracles } from '../config';
28
+ import { findDelistedPerpMarketsAndOracles } from './utils';
26
29
 
27
30
  const ORACLE_DEFAULT_KEY = PublicKey.default.toBase58();
28
31
 
@@ -55,14 +58,15 @@ export class WebSocketDriftClientAccountSubscriber
55
58
  spotOracleMap = new Map<number, PublicKey>();
56
59
  spotOracleStringMap = new Map<number, string>();
57
60
  oracleSubscribers = new Map<string, AccountSubscriber<OraclePriceData>>();
61
+ delistedMarketSetting: DelistedMarketSetting;
58
62
 
59
63
  initialPerpMarketAccountData: Map<number, PerpMarketAccount>;
60
64
  initialSpotMarketAccountData: Map<number, SpotMarketAccount>;
61
65
  initialOraclePriceData: Map<string, OraclePriceData>;
62
66
 
63
- protected isSubscribing = false;
64
- protected subscriptionPromise: Promise<boolean>;
65
- protected subscriptionPromiseResolver: (val: boolean) => void;
67
+ private isSubscribing = false;
68
+ private subscriptionPromise: Promise<boolean>;
69
+ private subscriptionPromiseResolver: (val: boolean) => void;
66
70
 
67
71
  public constructor(
68
72
  program: Program,
@@ -70,6 +74,7 @@ export class WebSocketDriftClientAccountSubscriber
70
74
  spotMarketIndexes: number[],
71
75
  oracleInfos: OracleInfo[],
72
76
  shouldFindAllMarketsAndOracles: boolean,
77
+ delistedMarketSetting: DelistedMarketSetting,
73
78
  resubOpts?: ResubOpts,
74
79
  commitment?: Commitment
75
80
  ) {
@@ -80,6 +85,7 @@ export class WebSocketDriftClientAccountSubscriber
80
85
  this.spotMarketIndexes = spotMarketIndexes;
81
86
  this.oracleInfos = oracleInfos;
82
87
  this.shouldFindAllMarketsAndOracles = shouldFindAllMarketsAndOracles;
88
+ this.delistedMarketSetting = delistedMarketSetting;
83
89
  this.resubOpts = resubOpts;
84
90
  this.commitment = commitment;
85
91
  }
@@ -151,6 +157,8 @@ export class WebSocketDriftClientAccountSubscriber
151
157
 
152
158
  this.eventEmitter.emit('update');
153
159
 
160
+ await this.handleDelistedMarkets();
161
+
154
162
  await Promise.all([this.setPerpOracleMap(), this.setSpotOracleMap()]);
155
163
 
156
164
  this.isSubscribing = false;
@@ -480,6 +488,33 @@ export class WebSocketDriftClientAccountSubscriber
480
488
  await Promise.all(addOraclePromises);
481
489
  }
482
490
 
491
+ async handleDelistedMarkets(): Promise<void> {
492
+ if (this.delistedMarketSetting === DelistedMarketSetting.Subscribe) {
493
+ return;
494
+ }
495
+
496
+ const { perpMarketIndexes, oracles } = findDelistedPerpMarketsAndOracles(
497
+ this.getMarketAccountsAndSlots(),
498
+ this.getSpotMarketAccountsAndSlots()
499
+ );
500
+
501
+ for (const perpMarketIndex of perpMarketIndexes) {
502
+ await this.perpMarketAccountSubscribers
503
+ .get(perpMarketIndex)
504
+ .unsubscribe();
505
+ if (this.delistedMarketSetting === DelistedMarketSetting.Discard) {
506
+ this.perpMarketAccountSubscribers.delete(perpMarketIndex);
507
+ }
508
+ }
509
+
510
+ for (const oracle of oracles) {
511
+ await this.oracleSubscribers.get(oracle.toBase58()).unsubscribe();
512
+ if (this.delistedMarketSetting === DelistedMarketSetting.Discard) {
513
+ this.oracleSubscribers.delete(oracle.toBase58());
514
+ }
515
+ }
516
+ }
517
+
483
518
  assertIsSubscribed(): void {
484
519
  if (!this.isSubscribed) {
485
520
  throw new NotSubscribedError(
@@ -98,7 +98,7 @@ export class WebSocketProgramAccountSubscriber<T>
98
98
  }
99
99
  }
100
100
 
101
- protected setTimeout(): void {
101
+ private setTimeout(): void {
102
102
  if (!this.onChange) {
103
103
  throw new Error('onChange callback function must be set');
104
104
  }
package/src/config.ts CHANGED
@@ -1,4 +1,5 @@
1
- import { PerpMarketAccount, SpotMarketAccount } from '.';
1
+ import { ConfirmOptions } from '@solana/web3.js';
2
+ import { PerpMarketAccount, PublicKey, SpotMarketAccount } from '.';
2
3
  import {
3
4
  DevnetPerpMarkets,
4
5
  MainnetPerpMarkets,
@@ -13,6 +14,10 @@ import {
13
14
  } from './constants/spotMarkets';
14
15
  import { OracleInfo } from './oracles/types';
15
16
  import { Program, ProgramAccount } from '@coral-xyz/anchor';
17
+ import {
18
+ ON_DEMAND_DEVNET_PID,
19
+ ON_DEMAND_MAINNET_PID,
20
+ } from '@switchboard-xyz/on-demand';
16
21
 
17
22
  type DriftConfig = {
18
23
  ENV: DriftEnv;
@@ -30,6 +35,7 @@ type DriftConfig = {
30
35
  MARKET_LOOKUP_TABLE: string;
31
36
  SERUM_LOOKUP_TABLE?: string;
32
37
  PYTH_PULL_ORACLE_LOOKUP_TABLE?: string;
38
+ SB_ON_DEMAND_PID: PublicKey;
33
39
  };
34
40
 
35
41
  export type DriftEnv = 'devnet' | 'mainnet-beta';
@@ -37,6 +43,12 @@ export type DriftEnv = 'devnet' | 'mainnet-beta';
37
43
  export const DRIFT_PROGRAM_ID = 'dRiftyHA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH';
38
44
  export const DRIFT_ORACLE_RECEIVER_ID =
39
45
  'G6EoTTTgpkNBtVXo96EQp2m6uwwVh2Kt6YidjkmQqoha';
46
+ export const SWIFT_ID = 'SW1fThqrxLzVprnCMpiybiqYQfoNCdduC5uWsSUKChS';
47
+
48
+ export const DEFAULT_CONFIRMATION_OPTS: ConfirmOptions = {
49
+ preflightCommitment: 'confirmed',
50
+ commitment: 'confirmed',
51
+ };
40
52
 
41
53
  export const configs: { [key in DriftEnv]: DriftConfig } = {
42
54
  devnet: {
@@ -54,6 +66,7 @@ export const configs: { [key in DriftEnv]: DriftConfig } = {
54
66
  SPOT_MARKETS: DevnetSpotMarkets,
55
67
  MARKET_LOOKUP_TABLE: 'FaMS3U4uBojvGn5FSDEPimddcXsCfwkKsFgMVVnDdxGb',
56
68
  DRIFT_ORACLE_RECEIVER_ID,
69
+ SB_ON_DEMAND_PID: ON_DEMAND_DEVNET_PID,
57
70
  },
58
71
  'mainnet-beta': {
59
72
  ENV: 'mainnet-beta',
@@ -71,6 +84,7 @@ export const configs: { [key in DriftEnv]: DriftConfig } = {
71
84
  MARKET_LOOKUP_TABLE: 'D9cnvzswDikQDf53k4HpQ3KJ9y1Fv3HGGDFYMXnK5T6c',
72
85
  SERUM_LOOKUP_TABLE: 'GPZkp76cJtNL2mphCvT6FXkJCVPpouidnacckR6rzKDN',
73
86
  DRIFT_ORACLE_RECEIVER_ID,
87
+ SB_ON_DEMAND_PID: ON_DEMAND_MAINNET_PID,
74
88
  },
75
89
  };
76
90
 
@@ -852,6 +852,28 @@ export const MainnetPerpMarkets: PerpMarketConfig[] = [
852
852
  pythFeedId:
853
853
  '0x8963217838ab4cf5cadc172203c1f0b763fbaa45f346d8ee50ba994bbcac3026',
854
854
  },
855
+ {
856
+ fullName: 'LANDO-F1-SGP-WIN-BET',
857
+ category: ['Prediction', 'Sports'],
858
+ symbol: 'LANDO-F1-SGP-WIN-BET',
859
+ baseAssetSymbol: 'LANDO-F1-SGP-WIN',
860
+ marketIndex: 43,
861
+ oracle: new PublicKey('DpJz7rjTJLxxnuqrqZTUjMWtnaMFAEfZUv5ATdb9HTh1'),
862
+ launchTs: 1726646453000,
863
+ oracleSource: OracleSource.Prelaunch,
864
+ },
865
+ {
866
+ fullName: 'MOTHER',
867
+ category: ['Solana', 'Meme'],
868
+ symbol: 'MOTHER-PERP',
869
+ baseAssetSymbol: 'MOTHER',
870
+ marketIndex: 44,
871
+ oracle: new PublicKey('56ap2coZG7FPWUigVm9XrpQs3xuCwnwQaWtjWZcffEUG'),
872
+ launchTs: 1727291859000,
873
+ oracleSource: OracleSource.PYTH_PULL,
874
+ pythFeedId:
875
+ '0x62742a997d01f7524f791fdb2dd43aaf0e567d765ebf8fd0406a994239e874d4',
876
+ },
855
877
  ];
856
878
 
857
879
  export const PerpMarkets: { [key in DriftEnv]: PerpMarketConfig[] } = {
@@ -133,7 +133,7 @@ export const MainnetSpotMarkets: SpotMarketConfig[] = [
133
133
  precisionExp: EIGHT,
134
134
  serumMarket: new PublicKey('3BAKsQd3RuhZKES2DGysMhjBdwjZYKYmxRqnSMtZ4KSN'),
135
135
  pythFeedId:
136
- '0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43',
136
+ '0xc9d8b075a5c69303365ae23633d4e085199bf5c520a3b90fed1322a0342ffc33',
137
137
  },
138
138
  {
139
139
  symbol: 'wETH',
@@ -353,6 +353,8 @@ export const MainnetSpotMarkets: SpotMarketConfig[] = [
353
353
  precision: new BN(10).pow(SIX),
354
354
  precisionExp: SIX,
355
355
  launchTs: 1719415157000,
356
+ pythFeedId:
357
+ '0xc811abc82b4bad1f9bd711a2773ccaa935b03ecef974236942cec5e0eb845a3a',
356
358
  },
357
359
  {
358
360
  symbol: 'POPCAT',
@@ -423,6 +425,17 @@ export const MainnetSpotMarkets: SpotMarketConfig[] = [
423
425
  pythFeedId:
424
426
  '0xef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d',
425
427
  },
428
+ {
429
+ symbol: 'MOTHER',
430
+ marketIndex: 26,
431
+ oracle: new PublicKey('56ap2coZG7FPWUigVm9XrpQs3xuCwnwQaWtjWZcffEUG'),
432
+ oracleSource: OracleSource.PYTH_PULL,
433
+ mint: new PublicKey('3S8qX1MsMqRbiwKg2cQyx7nis1oHMgaCuc9c4VfvVdPN'),
434
+ precision: new BN(10).pow(SIX),
435
+ precisionExp: SIX,
436
+ pythFeedId:
437
+ '0x62742a997d01f7524f791fdb2dd43aaf0e567d765ebf8fd0406a994239e874d4',
438
+ },
426
439
  ];
427
440
 
428
441
  export const SpotMarkets: { [key in DriftEnv]: SpotMarketConfig[] } = {