@drift-labs/sdk 2.96.0-beta.8 → 2.97.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.
Files changed (76) hide show
  1. package/README.md +3 -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 -0
  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/webSocketDriftClientAccountSubscriber.d.ts +5 -4
  11. package/lib/accounts/webSocketDriftClientAccountSubscriber.js +24 -1
  12. package/lib/config.d.ts +6 -1
  13. package/lib/config.js +10 -1
  14. package/lib/constants/perpMarkets.js +33 -1
  15. package/lib/constants/spotMarkets.js +10 -0
  16. package/lib/constants/txConstants.d.ts +1 -0
  17. package/lib/constants/txConstants.js +4 -0
  18. package/lib/driftClient.d.ts +45 -9
  19. package/lib/driftClient.js +191 -49
  20. package/lib/driftClientConfig.d.ts +3 -0
  21. package/lib/events/types.js +1 -5
  22. package/lib/idl/drift.json +170 -2
  23. package/lib/index.d.ts +1 -0
  24. package/lib/index.js +1 -0
  25. package/lib/math/margin.d.ts +16 -1
  26. package/lib/math/margin.js +67 -1
  27. package/lib/orderParams.js +8 -8
  28. package/lib/orderSubscriber/OrderSubscriber.js +1 -6
  29. package/lib/tokenFaucet.js +2 -1
  30. package/lib/tx/baseTxSender.d.ts +0 -1
  31. package/lib/tx/baseTxSender.js +8 -26
  32. package/lib/tx/fastSingleTxSender.js +2 -2
  33. package/lib/tx/forwardOnlyTxSender.js +2 -2
  34. package/lib/tx/reportTransactionError.d.ts +20 -0
  35. package/lib/tx/reportTransactionError.js +103 -0
  36. package/lib/tx/retryTxSender.js +2 -2
  37. package/lib/tx/txHandler.js +10 -7
  38. package/lib/tx/whileValidTxSender.d.ts +4 -5
  39. package/lib/tx/whileValidTxSender.js +16 -17
  40. package/lib/types.d.ts +22 -1
  41. package/lib/types.js +6 -1
  42. package/lib/user.d.ts +4 -1
  43. package/lib/user.js +9 -2
  44. package/lib/util/TransactionConfirmationManager.d.ts +16 -0
  45. package/lib/util/TransactionConfirmationManager.js +174 -0
  46. package/package.json +4 -3
  47. package/src/accounts/pollingDriftClientAccountSubscriber.ts +41 -5
  48. package/src/accounts/types.ts +6 -0
  49. package/src/accounts/utils.ts +42 -0
  50. package/src/accounts/webSocketDriftClientAccountSubscriber.ts +40 -5
  51. package/src/config.ts +17 -1
  52. package/src/constants/perpMarkets.ts +35 -1
  53. package/src/constants/spotMarkets.ts +11 -0
  54. package/src/constants/txConstants.ts +1 -0
  55. package/src/driftClient.ts +426 -64
  56. package/src/driftClientConfig.ts +3 -0
  57. package/src/events/types.ts +1 -5
  58. package/src/idl/drift.json +170 -2
  59. package/src/index.ts +1 -0
  60. package/src/math/margin.ts +137 -1
  61. package/src/orderParams.ts +20 -12
  62. package/src/orderSubscriber/OrderSubscriber.ts +2 -5
  63. package/src/tokenFaucet.ts +2 -2
  64. package/src/tx/baseTxSender.ts +10 -32
  65. package/src/tx/fastSingleTxSender.ts +2 -2
  66. package/src/tx/forwardOnlyTxSender.ts +2 -2
  67. package/src/tx/reportTransactionError.ts +159 -0
  68. package/src/tx/retryTxSender.ts +2 -2
  69. package/src/tx/txHandler.ts +8 -2
  70. package/src/tx/whileValidTxSender.ts +18 -27
  71. package/src/types.ts +31 -1
  72. package/src/user.ts +35 -2
  73. package/src/util/TransactionConfirmationManager.ts +292 -0
  74. package/tests/ci/idl.ts +12 -3
  75. package/tests/ci/verifyConstants.ts +13 -0
  76. package/tests/tx/TransactionConfirmationManager.test.ts +305 -0
package/README.md CHANGED
@@ -22,6 +22,7 @@ npm i @drift-labs/sdk
22
22
  Documentation:
23
23
 
24
24
  - [API docs](https://drift-labs.github.io/v2-teacher/)
25
+ - [Typescript API docs](https://drift-labs.github.io/protocol-v2/sdk/)
25
26
  - [overview docs](https://docs.drift.trade/)
26
27
 
27
28
  The below is a light overview of using solana and drift's typescript sdk, but not as comprehensive as the [API docs](https://drift-labs.github.io/v2-teacher/).
@@ -264,3 +265,5 @@ Drift Protocol v2 is licensed under [Apache 2.0](./LICENSE).
264
265
  Unless you explicitly state otherwise, any contribution intentionally submitted
265
266
  for inclusion in Drift SDK by you, as defined in the Apache-2.0 license, shall be
266
267
  licensed as above, without any additional terms or conditions.
268
+
269
+
package/VERSION CHANGED
@@ -1 +1 @@
1
- 2.96.0-beta.8
1
+ 2.97.0-beta.0
package/bun.lockb CHANGED
Binary file
@@ -1,9 +1,9 @@
1
1
  /// <reference types="node" />
2
- import { DataAndSlot, AccountToPoll, DriftClientAccountEvents, DriftClientAccountSubscriber, OraclesToPoll } from './types';
2
+ import { AccountToPoll, DataAndSlot, DelistedMarketSetting, DriftClientAccountEvents, DriftClientAccountSubscriber, OraclesToPoll } from './types';
3
3
  import { Program } from '@coral-xyz/anchor';
4
4
  import StrictEventEmitter from 'strict-event-emitter-types';
5
5
  import { EventEmitter } from 'events';
6
- import { SpotMarketAccount, PerpMarketAccount, StateAccount, UserAccount } from '../types';
6
+ import { PerpMarketAccount, SpotMarketAccount, StateAccount, UserAccount } from '../types';
7
7
  import { BulkAccountLoader } from './bulkAccountLoader';
8
8
  import { PublicKey } from '@solana/web3.js';
9
9
  import { OracleInfo, OraclePriceData } from '../oracles/types';
@@ -30,10 +30,11 @@ export declare class PollingDriftClientAccountSubscriber implements DriftClientA
30
30
  spotOracleStringMap: Map<number, string>;
31
31
  oracles: Map<string, DataAndSlot<OraclePriceData>>;
32
32
  user?: DataAndSlot<UserAccount>;
33
+ delistedMarketSetting: DelistedMarketSetting;
33
34
  private isSubscribing;
34
35
  private subscriptionPromise;
35
36
  private subscriptionPromiseResolver;
36
- constructor(program: Program, accountLoader: BulkAccountLoader, perpMarketIndexes: number[], spotMarketIndexes: number[], oracleInfos: OracleInfo[], shouldFindAllMarketsAndOracles: boolean);
37
+ constructor(program: Program, accountLoader: BulkAccountLoader, perpMarketIndexes: number[], spotMarketIndexes: number[], oracleInfos: OracleInfo[], shouldFindAllMarketsAndOracles: boolean, delistedMarketSetting: DelistedMarketSetting);
37
38
  subscribe(): Promise<boolean>;
38
39
  updateAccountsToPoll(): Promise<void>;
39
40
  updatePerpMarketAccountsToPoll(): Promise<boolean>;
@@ -54,6 +55,7 @@ export declare class PollingDriftClientAccountSubscriber implements DriftClientA
54
55
  private pauseForOracleToBeAdded;
55
56
  setPerpOracleMap(): Promise<void>;
56
57
  setSpotOracleMap(): Promise<void>;
58
+ handleDelistedMarkets(): void;
57
59
  assertIsSubscribed(): void;
58
60
  getStateAccountAndSlot(): DataAndSlot<StateAccount>;
59
61
  getMarketAccountAndSlot(marketIndex: number): DataAndSlot<PerpMarketAccount> | undefined;
@@ -11,7 +11,7 @@ const quoteAssetOracleClient_1 = require("../oracles/quoteAssetOracleClient");
11
11
  const config_1 = require("../config");
12
12
  const ORACLE_DEFAULT_KEY = web3_js_1.PublicKey.default.toBase58();
13
13
  class PollingDriftClientAccountSubscriber {
14
- constructor(program, accountLoader, perpMarketIndexes, spotMarketIndexes, oracleInfos, shouldFindAllMarketsAndOracles) {
14
+ constructor(program, accountLoader, perpMarketIndexes, spotMarketIndexes, oracleInfos, shouldFindAllMarketsAndOracles, delistedMarketSetting) {
15
15
  this.oracleClientCache = new oracleClientCache_1.OracleClientCache();
16
16
  this.accountsToPoll = new Map();
17
17
  this.oraclesToPoll = new Map();
@@ -31,6 +31,7 @@ class PollingDriftClientAccountSubscriber {
31
31
  this.spotMarketIndexes = spotMarketIndexes;
32
32
  this.oracleInfos = oracleInfos;
33
33
  this.shouldFindAllMarketsAndOracles = shouldFindAllMarketsAndOracles;
34
+ this.delistedMarketSetting = delistedMarketSetting;
34
35
  }
35
36
  async subscribe() {
36
37
  if (this.isSubscribed) {
@@ -62,6 +63,7 @@ class PollingDriftClientAccountSubscriber {
62
63
  if (subscriptionSucceeded) {
63
64
  this.eventEmitter.emit('update');
64
65
  }
66
+ this.handleDelistedMarkets();
65
67
  await Promise.all([this.setPerpOracleMap(), this.setSpotOracleMap()]);
66
68
  this.isSubscribing = false;
67
69
  this.isSubscribed = subscriptionSucceeded;
@@ -325,6 +327,27 @@ class PollingDriftClientAccountSubscriber {
325
327
  }
326
328
  await Promise.all(oraclePromises);
327
329
  }
330
+ handleDelistedMarkets() {
331
+ if (this.delistedMarketSetting === types_1.DelistedMarketSetting.Subscribe) {
332
+ return;
333
+ }
334
+ const { perpMarketIndexes, oracles } = (0, utils_1.findDelistedPerpMarketsAndOracles)(this.getMarketAccountsAndSlots(), this.getSpotMarketAccountsAndSlots());
335
+ for (const perpMarketIndex of perpMarketIndexes) {
336
+ const perpMarketPubkey = this.perpMarket.get(perpMarketIndex).data.pubkey;
337
+ const callbackId = this.accountsToPoll.get(perpMarketPubkey.toBase58()).callbackId;
338
+ this.accountLoader.removeAccount(perpMarketPubkey, callbackId);
339
+ if (this.delistedMarketSetting === types_1.DelistedMarketSetting.Discard) {
340
+ this.perpMarket.delete(perpMarketIndex);
341
+ }
342
+ }
343
+ for (const oracle of oracles) {
344
+ const callbackId = this.oraclesToPoll.get(oracle.toBase58()).callbackId;
345
+ this.accountLoader.removeAccount(oracle, callbackId);
346
+ if (this.delistedMarketSetting === types_1.DelistedMarketSetting.Discard) {
347
+ this.oracles.delete(oracle.toBase58());
348
+ }
349
+ }
350
+ }
328
351
  assertIsSubscribed() {
329
352
  if (!this.isSubscribed) {
330
353
  throw new types_1.NotSubscribedError('You must call `subscribe` before using this function');
@@ -50,6 +50,11 @@ export interface DriftClientAccountSubscriber {
50
50
  getOraclePriceDataAndSlotForSpotMarket(marketIndex: number): DataAndSlot<OraclePriceData> | undefined;
51
51
  updateAccountLoaderPollingFrequency?: (pollingFrequency: number) => void;
52
52
  }
53
+ export declare enum DelistedMarketSetting {
54
+ Unsubscribe = 0,
55
+ Subscribe = 1,
56
+ Discard = 2
57
+ }
53
58
  export interface UserAccountEvents {
54
59
  userAccountUpdate: (payload: UserAccount) => void;
55
60
  update: void;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.NotSubscribedError = void 0;
3
+ exports.DelistedMarketSetting = exports.NotSubscribedError = void 0;
4
4
  class NotSubscribedError extends Error {
5
5
  constructor() {
6
6
  super(...arguments);
@@ -8,3 +8,9 @@ class NotSubscribedError extends Error {
8
8
  }
9
9
  }
10
10
  exports.NotSubscribedError = NotSubscribedError;
11
+ var DelistedMarketSetting;
12
+ (function (DelistedMarketSetting) {
13
+ DelistedMarketSetting[DelistedMarketSetting["Unsubscribe"] = 0] = "Unsubscribe";
14
+ DelistedMarketSetting[DelistedMarketSetting["Subscribe"] = 1] = "Subscribe";
15
+ DelistedMarketSetting[DelistedMarketSetting["Discard"] = 2] = "Discard";
16
+ })(DelistedMarketSetting = exports.DelistedMarketSetting || (exports.DelistedMarketSetting = {}));
@@ -1 +1,8 @@
1
+ import { PublicKey } from '@solana/web3.js';
2
+ import { DataAndSlot } from './types';
3
+ import { PerpMarketAccount, SpotMarketAccount } from '../types';
1
4
  export declare function capitalize(value: string): string;
5
+ export declare function findDelistedPerpMarketsAndOracles(perpMarkets: DataAndSlot<PerpMarketAccount>[], spotMarkets: DataAndSlot<SpotMarketAccount>[]): {
6
+ perpMarketIndexes: number[];
7
+ oracles: PublicKey[];
8
+ };
@@ -1,7 +1,39 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.capitalize = void 0;
3
+ exports.findDelistedPerpMarketsAndOracles = exports.capitalize = void 0;
4
+ const types_1 = require("../types");
4
5
  function capitalize(value) {
5
6
  return value[0].toUpperCase() + value.slice(1);
6
7
  }
7
8
  exports.capitalize = capitalize;
9
+ function findDelistedPerpMarketsAndOracles(perpMarkets, spotMarkets) {
10
+ const delistedPerpMarketIndexes = [];
11
+ const delistedOracles = [];
12
+ for (const perpMarket of perpMarkets) {
13
+ if (!perpMarket.data) {
14
+ continue;
15
+ }
16
+ if ((0, types_1.isVariant)(perpMarket.data.status, 'delisted')) {
17
+ delistedPerpMarketIndexes.push(perpMarket.data.marketIndex);
18
+ delistedOracles.push(perpMarket.data.amm.oracle);
19
+ }
20
+ }
21
+ // make sure oracle isn't used by spot market
22
+ const filteredDelistedOracles = [];
23
+ for (const delistedOracle of delistedOracles) {
24
+ for (const spotMarket of spotMarkets) {
25
+ if (!spotMarket.data) {
26
+ continue;
27
+ }
28
+ if (spotMarket.data.oracle.equals(delistedOracle)) {
29
+ break;
30
+ }
31
+ }
32
+ filteredDelistedOracles.push(delistedOracle);
33
+ }
34
+ return {
35
+ perpMarketIndexes: delistedPerpMarketIndexes,
36
+ oracles: filteredDelistedOracles,
37
+ };
38
+ }
39
+ exports.findDelistedPerpMarketsAndOracles = findDelistedPerpMarketsAndOracles;
@@ -1,7 +1,6 @@
1
1
  /// <reference types="node" />
2
- import { DriftClientAccountSubscriber, DriftClientAccountEvents, DataAndSlot, ResubOpts } from './types';
3
- import { AccountSubscriber } from './types';
4
- import { SpotMarketAccount, PerpMarketAccount, StateAccount } from '../types';
2
+ import { AccountSubscriber, DataAndSlot, DelistedMarketSetting, DriftClientAccountEvents, DriftClientAccountSubscriber, ResubOpts } from './types';
3
+ import { PerpMarketAccount, SpotMarketAccount, StateAccount } from '../types';
5
4
  import { Program } from '@coral-xyz/anchor';
6
5
  import StrictEventEmitter from 'strict-event-emitter-types';
7
6
  import { EventEmitter } from 'events';
@@ -27,13 +26,14 @@ export declare class WebSocketDriftClientAccountSubscriber implements DriftClien
27
26
  spotOracleMap: Map<number, PublicKey>;
28
27
  spotOracleStringMap: Map<number, string>;
29
28
  oracleSubscribers: Map<string, AccountSubscriber<OraclePriceData>>;
29
+ delistedMarketSetting: DelistedMarketSetting;
30
30
  initialPerpMarketAccountData: Map<number, PerpMarketAccount>;
31
31
  initialSpotMarketAccountData: Map<number, SpotMarketAccount>;
32
32
  initialOraclePriceData: Map<string, OraclePriceData>;
33
33
  private isSubscribing;
34
34
  private subscriptionPromise;
35
35
  private subscriptionPromiseResolver;
36
- constructor(program: Program, perpMarketIndexes: number[], spotMarketIndexes: number[], oracleInfos: OracleInfo[], shouldFindAllMarketsAndOracles: boolean, resubOpts?: ResubOpts, commitment?: Commitment);
36
+ constructor(program: Program, perpMarketIndexes: number[], spotMarketIndexes: number[], oracleInfos: OracleInfo[], shouldFindAllMarketsAndOracles: boolean, delistedMarketSetting: DelistedMarketSetting, resubOpts?: ResubOpts, commitment?: Commitment);
37
37
  subscribe(): Promise<boolean>;
38
38
  setInitialData(): Promise<void>;
39
39
  removeInitialData(): void;
@@ -53,6 +53,7 @@ export declare class WebSocketDriftClientAccountSubscriber implements DriftClien
53
53
  addOracle(oracleInfo: OracleInfo): Promise<boolean>;
54
54
  setPerpOracleMap(): Promise<void>;
55
55
  setSpotOracleMap(): Promise<void>;
56
+ handleDelistedMarkets(): Promise<void>;
56
57
  assertIsSubscribed(): void;
57
58
  getStateAccountAndSlot(): DataAndSlot<StateAccount>;
58
59
  getMarketAccountAndSlot(marketIndex: number): DataAndSlot<PerpMarketAccount> | undefined;
@@ -9,9 +9,10 @@ const web3_js_1 = require("@solana/web3.js");
9
9
  const oracleClientCache_1 = require("../oracles/oracleClientCache");
10
10
  const quoteAssetOracleClient_1 = require("../oracles/quoteAssetOracleClient");
11
11
  const config_1 = require("../config");
12
+ const utils_1 = require("./utils");
12
13
  const ORACLE_DEFAULT_KEY = web3_js_1.PublicKey.default.toBase58();
13
14
  class WebSocketDriftClientAccountSubscriber {
14
- constructor(program, perpMarketIndexes, spotMarketIndexes, oracleInfos, shouldFindAllMarketsAndOracles, resubOpts, commitment) {
15
+ constructor(program, perpMarketIndexes, spotMarketIndexes, oracleInfos, shouldFindAllMarketsAndOracles, delistedMarketSetting, resubOpts, commitment) {
15
16
  this.oracleClientCache = new oracleClientCache_1.OracleClientCache();
16
17
  this.perpMarketAccountSubscribers = new Map();
17
18
  this.perpOracleMap = new Map();
@@ -28,6 +29,7 @@ class WebSocketDriftClientAccountSubscriber {
28
29
  this.spotMarketIndexes = spotMarketIndexes;
29
30
  this.oracleInfos = oracleInfos;
30
31
  this.shouldFindAllMarketsAndOracles = shouldFindAllMarketsAndOracles;
32
+ this.delistedMarketSetting = delistedMarketSetting;
31
33
  this.resubOpts = resubOpts;
32
34
  this.commitment = commitment;
33
35
  }
@@ -69,6 +71,7 @@ class WebSocketDriftClientAccountSubscriber {
69
71
  this.subscribeToOracles(),
70
72
  ]);
71
73
  this.eventEmitter.emit('update');
74
+ await this.handleDelistedMarkets();
72
75
  await Promise.all([this.setPerpOracleMap(), this.setSpotOracleMap()]);
73
76
  this.isSubscribing = false;
74
77
  this.isSubscribed = true;
@@ -263,6 +266,26 @@ class WebSocketDriftClientAccountSubscriber {
263
266
  }
264
267
  await Promise.all(addOraclePromises);
265
268
  }
269
+ async handleDelistedMarkets() {
270
+ if (this.delistedMarketSetting === types_1.DelistedMarketSetting.Subscribe) {
271
+ return;
272
+ }
273
+ const { perpMarketIndexes, oracles } = (0, utils_1.findDelistedPerpMarketsAndOracles)(this.getMarketAccountsAndSlots(), this.getSpotMarketAccountsAndSlots());
274
+ for (const perpMarketIndex of perpMarketIndexes) {
275
+ await this.perpMarketAccountSubscribers
276
+ .get(perpMarketIndex)
277
+ .unsubscribe();
278
+ if (this.delistedMarketSetting === types_1.DelistedMarketSetting.Discard) {
279
+ this.perpMarketAccountSubscribers.delete(perpMarketIndex);
280
+ }
281
+ }
282
+ for (const oracle of oracles) {
283
+ await this.oracleSubscribers.get(oracle.toBase58()).unsubscribe();
284
+ if (this.delistedMarketSetting === types_1.DelistedMarketSetting.Discard) {
285
+ this.oracleSubscribers.delete(oracle.toBase58());
286
+ }
287
+ }
288
+ }
266
289
  assertIsSubscribed() {
267
290
  if (!this.isSubscribed) {
268
291
  throw new types_1.NotSubscribedError('You must call `subscribe` before using this function');
package/lib/config.d.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 { PerpMarketConfig } from './constants/perpMarkets';
3
4
  import { SpotMarketConfig } from './constants/spotMarkets';
4
5
  import { OracleInfo } from './oracles/types';
@@ -19,10 +20,14 @@ type DriftConfig = {
19
20
  MARKET_LOOKUP_TABLE: string;
20
21
  SERUM_LOOKUP_TABLE?: string;
21
22
  PYTH_PULL_ORACLE_LOOKUP_TABLE?: string;
23
+ SB_ON_DEMAND_PID: PublicKey;
22
24
  };
23
25
  export type DriftEnv = 'devnet' | 'mainnet-beta';
24
26
  export declare const DRIFT_PROGRAM_ID = "dRiftyHA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH";
25
27
  export declare const DRIFT_ORACLE_RECEIVER_ID = "G6EoTTTgpkNBtVXo96EQp2m6uwwVh2Kt6YidjkmQqoha";
28
+ export declare const SWIFT_ID = "SW1fThqrxLzVprnCMpiybiqYQfoNCdduC5uWsSUKChS";
29
+ export declare const ANCHOR_TEST_SWIFT_ID = "DpaEdAPW3ZX67fnczT14AoX12Lx9VMkxvtT81nCHy3Nv";
30
+ export declare const DEFAULT_CONFIRMATION_OPTS: ConfirmOptions;
26
31
  export declare const configs: {
27
32
  [key in DriftEnv]: DriftConfig;
28
33
  };
package/lib/config.js CHANGED
@@ -1,10 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.findAllMarketAndOracles = exports.getMarketsAndOraclesForSubscription = exports.initialize = exports.getConfig = exports.configs = exports.DRIFT_ORACLE_RECEIVER_ID = exports.DRIFT_PROGRAM_ID = void 0;
3
+ exports.findAllMarketAndOracles = exports.getMarketsAndOraclesForSubscription = exports.initialize = exports.getConfig = exports.configs = exports.DEFAULT_CONFIRMATION_OPTS = exports.ANCHOR_TEST_SWIFT_ID = exports.SWIFT_ID = exports.DRIFT_ORACLE_RECEIVER_ID = exports.DRIFT_PROGRAM_ID = void 0;
4
4
  const perpMarkets_1 = require("./constants/perpMarkets");
5
5
  const spotMarkets_1 = require("./constants/spotMarkets");
6
+ const on_demand_1 = require("@switchboard-xyz/on-demand");
6
7
  exports.DRIFT_PROGRAM_ID = 'dRiftyHA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH';
7
8
  exports.DRIFT_ORACLE_RECEIVER_ID = 'G6EoTTTgpkNBtVXo96EQp2m6uwwVh2Kt6YidjkmQqoha';
9
+ exports.SWIFT_ID = 'SW1fThqrxLzVprnCMpiybiqYQfoNCdduC5uWsSUKChS';
10
+ exports.ANCHOR_TEST_SWIFT_ID = 'DpaEdAPW3ZX67fnczT14AoX12Lx9VMkxvtT81nCHy3Nv';
11
+ exports.DEFAULT_CONFIRMATION_OPTS = {
12
+ preflightCommitment: 'confirmed',
13
+ commitment: 'confirmed',
14
+ };
8
15
  exports.configs = {
9
16
  devnet: {
10
17
  ENV: 'devnet',
@@ -20,6 +27,7 @@ exports.configs = {
20
27
  SPOT_MARKETS: spotMarkets_1.DevnetSpotMarkets,
21
28
  MARKET_LOOKUP_TABLE: 'FaMS3U4uBojvGn5FSDEPimddcXsCfwkKsFgMVVnDdxGb',
22
29
  DRIFT_ORACLE_RECEIVER_ID: exports.DRIFT_ORACLE_RECEIVER_ID,
30
+ SB_ON_DEMAND_PID: on_demand_1.ON_DEMAND_DEVNET_PID,
23
31
  },
24
32
  'mainnet-beta': {
25
33
  ENV: 'mainnet-beta',
@@ -36,6 +44,7 @@ exports.configs = {
36
44
  MARKET_LOOKUP_TABLE: 'D9cnvzswDikQDf53k4HpQ3KJ9y1Fv3HGGDFYMXnK5T6c',
37
45
  SERUM_LOOKUP_TABLE: 'GPZkp76cJtNL2mphCvT6FXkJCVPpouidnacckR6rzKDN',
38
46
  DRIFT_ORACLE_RECEIVER_ID: exports.DRIFT_ORACLE_RECEIVER_ID,
47
+ SB_ON_DEMAND_PID: on_demand_1.ON_DEMAND_MAINNET_PID,
39
48
  },
40
49
  };
41
50
  let currentConfig = exports.configs.devnet;
@@ -263,7 +263,7 @@ exports.DevnetPerpMarkets = [
263
263
  symbol: 'W-PERP',
264
264
  baseAssetSymbol: 'W',
265
265
  marketIndex: 23,
266
- oracle: new web3_js_1.PublicKey('4iCi4DvXrubHQne8jzbMaWL3pd7v1Fip8iTe4H9vHNXB'),
266
+ oracle: new web3_js_1.PublicKey('J9nrFWjDUeDVZ4BhhxsbQXWgLcLEgQyNBrCbwSADmJdr'),
267
267
  launchTs: 1709852537000,
268
268
  oracleSource: __1.OracleSource.SWITCHBOARD_ON_DEMAND,
269
269
  pythFeedId: '0xeff7446475e218517566ea99e72a4abec2e1bd8498b43b7d8331e29dcb059389',
@@ -788,6 +788,38 @@ exports.MainnetPerpMarkets = [
788
788
  launchTs: 1726646453000,
789
789
  oracleSource: __1.OracleSource.Prelaunch,
790
790
  },
791
+ {
792
+ fullName: 'MOTHER',
793
+ category: ['Solana', 'Meme'],
794
+ symbol: 'MOTHER-PERP',
795
+ baseAssetSymbol: 'MOTHER',
796
+ marketIndex: 44,
797
+ oracle: new web3_js_1.PublicKey('56ap2coZG7FPWUigVm9XrpQs3xuCwnwQaWtjWZcffEUG'),
798
+ launchTs: 1727291859000,
799
+ oracleSource: __1.OracleSource.PYTH_PULL,
800
+ pythFeedId: '0x62742a997d01f7524f791fdb2dd43aaf0e567d765ebf8fd0406a994239e874d4',
801
+ },
802
+ {
803
+ fullName: 'MOODENG',
804
+ category: ['Solana', 'Meme'],
805
+ symbol: 'MOODENG-PERP',
806
+ baseAssetSymbol: 'MOODENG',
807
+ marketIndex: 45,
808
+ oracle: new web3_js_1.PublicKey('21gjgEcuDppthwV16J1QpFzje3vmgMp2uSzh7pJsG7ob'),
809
+ launchTs: 1727965864000,
810
+ oracleSource: __1.OracleSource.PYTH_PULL,
811
+ pythFeedId: '0xffff73128917a90950cd0473fd2551d7cd274fd5a6cc45641881bbcc6ee73417',
812
+ },
813
+ {
814
+ fullName: 'WARWICK-FIGHT-WIN-BET',
815
+ category: ['Prediction', 'Sport'],
816
+ symbol: 'WARWICK-FIGHT-WIN-BET',
817
+ baseAssetSymbol: 'WARWICK-FIGHT-WIN',
818
+ marketIndex: 46,
819
+ oracle: new web3_js_1.PublicKey('Dz5Nvxo1hv7Zfyu11hy8e97twLMRKk6heTWCDGXytj7N'),
820
+ launchTs: 1727965864000,
821
+ oracleSource: __1.OracleSource.Prelaunch,
822
+ },
791
823
  ];
792
824
  exports.PerpMarkets = {
793
825
  devnet: exports.DevnetPerpMarkets,
@@ -344,6 +344,16 @@ exports.MainnetSpotMarkets = [
344
344
  precisionExp: numericConstants_1.LAMPORTS_EXP,
345
345
  pythFeedId: '0xef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d',
346
346
  },
347
+ {
348
+ symbol: 'MOTHER',
349
+ marketIndex: 26,
350
+ oracle: new web3_js_1.PublicKey('56ap2coZG7FPWUigVm9XrpQs3xuCwnwQaWtjWZcffEUG'),
351
+ oracleSource: __1.OracleSource.PYTH_PULL,
352
+ mint: new web3_js_1.PublicKey('3S8qX1MsMqRbiwKg2cQyx7nis1oHMgaCuc9c4VfvVdPN'),
353
+ precision: new __1.BN(10).pow(numericConstants_1.SIX),
354
+ precisionExp: numericConstants_1.SIX,
355
+ pythFeedId: '0x62742a997d01f7524f791fdb2dd43aaf0e567d765ebf8fd0406a994239e874d4',
356
+ },
347
357
  ];
348
358
  exports.SpotMarkets = {
349
359
  devnet: exports.DevnetSpotMarkets,
@@ -0,0 +1 @@
1
+ export declare const NOT_CONFIRMED_ERROR_CODE = -1001;
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NOT_CONFIRMED_ERROR_CODE = void 0;
4
+ exports.NOT_CONFIRMED_ERROR_CODE = -1001;
@@ -1,16 +1,15 @@
1
1
  /// <reference types="node" />
2
2
  /// <reference types="bn.js" />
3
3
  /// <reference types="node" />
4
+ import * as anchor from '@coral-xyz/anchor';
4
5
  import { AnchorProvider, BN, Program, ProgramAccount } from '@coral-xyz/anchor';
5
6
  import { Idl as Idl30, Program as Program30 } from '@coral-xyz/anchor-30';
6
- import { StateAccount, IWallet, PositionDirection, UserAccount, PerpMarketAccount, OrderParams, Order, SpotMarketAccount, SpotPosition, MakerInfo, TakerInfo, OptionalOrderParams, ReferrerInfo, MarketType, TxParams, SerumV3FulfillmentConfigAccount, ReferrerNameAccount, OrderTriggerCondition, PerpMarketExtendedInfo, UserStatsAccount, PhoenixV1FulfillmentConfigAccount, ModifyOrderPolicy, SwapReduceOnly, SettlePnlMode, SignedTxData, MappedRecord, OpenbookV2FulfillmentConfigAccount } from './types';
7
- import * as anchor from '@coral-xyz/anchor';
8
- import { Connection, PublicKey, TransactionSignature, ConfirmOptions, Transaction, TransactionInstruction, AccountMeta, Signer, AddressLookupTableAccount, TransactionVersion, VersionedTransaction, BlockhashWithExpiryBlockHeight } from '@solana/web3.js';
7
+ import { DriftClientMetricsEvents, IWallet, MakerInfo, MappedRecord, MarketType, ModifyOrderPolicy, OpenbookV2FulfillmentConfigAccount, OptionalOrderParams, Order, OrderParams, OrderTriggerCondition, PerpMarketAccount, PerpMarketExtendedInfo, PhoenixV1FulfillmentConfigAccount, PlaceAndTakeOrderSuccessCondition, PositionDirection, ReferrerInfo, ReferrerNameAccount, SerumV3FulfillmentConfigAccount, SettlePnlMode, SignedTxData, SpotMarketAccount, SpotPosition, StateAccount, SwapReduceOnly, SwiftOrderParamsMessage, SwiftServerMessage, TakerInfo, TxParams, UserAccount, UserStatsAccount } from './types';
8
+ import { AccountMeta, AddressLookupTableAccount, BlockhashWithExpiryBlockHeight, ConfirmOptions, Connection, Keypair, PublicKey, Signer, Transaction, TransactionInstruction, TransactionSignature, TransactionVersion, VersionedTransaction } from '@solana/web3.js';
9
9
  import { TokenFaucet } from './tokenFaucet';
10
10
  import { EventEmitter } from 'events';
11
11
  import StrictEventEmitter from 'strict-event-emitter-types';
12
- import { DriftClientAccountSubscriber, DriftClientAccountEvents, DataAndSlot } from './accounts/types';
13
- import { DriftClientMetricsEvents } from './types';
12
+ import { DataAndSlot, DriftClientAccountEvents, DriftClientAccountSubscriber } from './accounts/types';
14
13
  import { TxSender, TxSigAndSlot } from './tx/types';
15
14
  import { OraclePriceData } from './oracles/types';
16
15
  import { DriftClientConfig } from './driftClientConfig';
@@ -38,6 +37,7 @@ export declare class DriftClient {
38
37
  connection: Connection;
39
38
  wallet: IWallet;
40
39
  program: Program;
40
+ swiftID: PublicKey;
41
41
  provider: AnchorProvider;
42
42
  opts?: ConfirmOptions;
43
43
  users: Map<string, User>;
@@ -66,6 +66,7 @@ export declare class DriftClient {
66
66
  txHandler: TxHandler;
67
67
  receiverProgram?: Program<PythSolanaReceiver>;
68
68
  wormholeProgram?: Program<WormholeCoreBridgeSolana>;
69
+ sbOnDemandProgramdId: PublicKey;
69
70
  sbOnDemandProgram?: Program30<Idl30>;
70
71
  sbProgramFeedConfigs?: Map<string, any>;
71
72
  get isSubscribed(): boolean;
@@ -239,6 +240,7 @@ export declare class DriftClient {
239
240
  */
240
241
  getAssociatedTokenAccount(marketIndex: number, useNative?: boolean, tokenProgram?: anchor.web3.PublicKey): Promise<PublicKey>;
241
242
  createAssociatedTokenAccountIdempotentInstruction(account: PublicKey, payer: PublicKey, owner: PublicKey, mint: PublicKey, tokenProgram?: anchor.web3.PublicKey): TransactionInstruction;
243
+ getDepositTxnIx(amount: BN, marketIndex: number, associatedTokenAccount: PublicKey, subAccountId?: number, reduceOnly?: boolean): Promise<TransactionInstruction[]>;
242
244
  createDepositTxn(amount: BN, marketIndex: number, associatedTokenAccount: PublicKey, subAccountId?: number, reduceOnly?: boolean, txParams?: TxParams): Promise<VersionedTransaction | Transaction>;
243
245
  /**
244
246
  * Deposit funds into the given spot market
@@ -261,6 +263,10 @@ export declare class DriftClient {
261
263
  getTokenProgramForSpotMarket(spotMarketAccount: SpotMarketAccount): PublicKey;
262
264
  addTokenMintToRemainingAccounts(spotMarketAccount: SpotMarketAccount, remainingAccounts: AccountMeta[]): void;
263
265
  getAssociatedTokenAccountCreationIx(tokenMintAddress: PublicKey, associatedTokenAddress: PublicKey, tokenProgram: PublicKey): anchor.web3.TransactionInstruction;
266
+ createInitializeUserAccountAndDepositCollateralIxs(amount: BN, userTokenAccount: PublicKey, marketIndex?: number, subAccountId?: number, name?: string, fromSubAccountId?: number, referrerInfo?: ReferrerInfo, donateAmount?: BN, customMaxMarginRatio?: number): Promise<{
267
+ ixs: TransactionInstruction[];
268
+ userAccountPublicKey: PublicKey;
269
+ }>;
264
270
  createInitializeUserAccountAndDepositCollateral(amount: BN, userTokenAccount: PublicKey, marketIndex?: number, subAccountId?: number, name?: string, fromSubAccountId?: number, referrerInfo?: ReferrerInfo, donateAmount?: BN, txParams?: TxParams, customMaxMarginRatio?: number): Promise<[Transaction | VersionedTransaction, PublicKey]>;
265
271
  /**
266
272
  * Creates the User account for a user, and deposits some initial collateral
@@ -340,7 +346,10 @@ export declare class DriftClient {
340
346
  signedSettlePnlTx?: Transaction;
341
347
  }>;
342
348
  placePerpOrder(orderParams: OptionalOrderParams, txParams?: TxParams, subAccountId?: number): Promise<TransactionSignature>;
343
- getPlacePerpOrderIx(orderParams: OptionalOrderParams, subAccountId?: number): Promise<TransactionInstruction>;
349
+ getPlacePerpOrderIx(orderParams: OptionalOrderParams, subAccountId?: number, depositToTradeArgs?: {
350
+ isMakingNewAccount: boolean;
351
+ depositMarketIndex: number;
352
+ }): Promise<TransactionInstruction>;
344
353
  updateAMMs(marketIndexes: number[], txParams?: TxParams): Promise<TransactionSignature>;
345
354
  getUpdateAMMsIx(marketIndexes: number[]): Promise<TransactionInstruction>;
346
355
  settleExpiredMarket(marketIndex: number, txParams?: TxParams): Promise<TransactionSignature>;
@@ -483,7 +492,7 @@ export declare class DriftClient {
483
492
  getUpdateUserIdleIx(userAccountPublicKey: PublicKey, userAccount: UserAccount, fillerPublicKey?: PublicKey): Promise<TransactionInstruction>;
484
493
  updateUserOpenOrdersCount(userAccountPublicKey: PublicKey, user: UserAccount, txParams?: TxParams, fillerPublicKey?: PublicKey): Promise<TransactionSignature>;
485
494
  getUpdateUserOpenOrdersCountIx(userAccountPublicKey: PublicKey, userAccount: UserAccount, fillerPublicKey?: PublicKey): Promise<TransactionInstruction>;
486
- placeAndTakePerpOrder(orderParams: OptionalOrderParams, makerInfo?: MakerInfo | MakerInfo[], referrerInfo?: ReferrerInfo, txParams?: TxParams, subAccountId?: number): Promise<TransactionSignature>;
495
+ placeAndTakePerpOrder(orderParams: OptionalOrderParams, makerInfo?: MakerInfo | MakerInfo[], referrerInfo?: ReferrerInfo, successCondition?: PlaceAndTakeOrderSuccessCondition, txParams?: TxParams, subAccountId?: number): Promise<TransactionSignature>;
487
496
  preparePlaceAndTakePerpOrderWithAdditionalOrders(orderParams: OptionalOrderParams, makerInfo?: MakerInfo | MakerInfo[], referrerInfo?: ReferrerInfo, bracketOrdersParams?: OptionalOrderParams[], txParams?: TxParams, subAccountId?: number, cancelExistingOrders?: boolean, settlePnl?: boolean, exitEarlyIfSimFails?: boolean): Promise<{
488
497
  placeAndTakeTx: Transaction | VersionedTransaction;
489
498
  cancelExistingOrdersTx: Transaction | VersionedTransaction;
@@ -494,9 +503,36 @@ export declare class DriftClient {
494
503
  signedCancelExistingOrdersTx?: Transaction;
495
504
  signedSettlePnlTx?: Transaction;
496
505
  }>;
497
- getPlaceAndTakePerpOrderIx(orderParams: OptionalOrderParams, makerInfo?: MakerInfo | MakerInfo[], referrerInfo?: ReferrerInfo, subAccountId?: number): Promise<TransactionInstruction>;
506
+ getPlaceAndTakePerpOrderIx(orderParams: OptionalOrderParams, makerInfo?: MakerInfo | MakerInfo[], referrerInfo?: ReferrerInfo, successCondition?: PlaceAndTakeOrderSuccessCondition, subAccountId?: number): Promise<TransactionInstruction>;
498
507
  placeAndMakePerpOrder(orderParams: OptionalOrderParams, takerInfo: TakerInfo, referrerInfo?: ReferrerInfo, txParams?: TxParams, subAccountId?: number): Promise<TransactionSignature>;
499
508
  getPlaceAndMakePerpOrderIx(orderParams: OptionalOrderParams, takerInfo: TakerInfo, referrerInfo?: ReferrerInfo, subAccountId?: number): Promise<TransactionInstruction>;
509
+ encodeSwiftServerMessage(message: SwiftServerMessage): Buffer;
510
+ decodeSwiftServerMessage(encodedMessage: Buffer): SwiftServerMessage;
511
+ signSwiftServerMessage(message: SwiftServerMessage): Promise<Buffer>;
512
+ signSwiftOrderParamsMessage(orderParamsMessage: SwiftOrderParamsMessage): Promise<Buffer>;
513
+ encodeSwiftOrderParamsMessage(orderParamsMessage: SwiftOrderParamsMessage): Buffer;
514
+ decodeSwiftOrderParamsMessage(encodedMessage: Buffer): SwiftOrderParamsMessage;
515
+ signMessage(message: Uint8Array, keypair?: Keypair): Promise<Buffer>;
516
+ placeSwiftTakerOrder(swiftServerMessage: Buffer, swiftSignature: Buffer, swiftOrderParamsMessage: Buffer, swiftOrderParamsSignature: Buffer, marketIndex: number, takerInfo: {
517
+ taker: PublicKey;
518
+ takerStats: PublicKey;
519
+ takerUserAccount: UserAccount;
520
+ }, txParams?: TxParams): Promise<TransactionSignature>;
521
+ getPlaceSwiftTakerPerpOrderIxs(encodedSwiftServerMessage: Buffer, swiftSignature: Buffer, encodedSwiftOrderParamsMessage: Buffer, swiftOrderParamsSignature: Buffer, marketIndex: number, takerInfo: {
522
+ taker: PublicKey;
523
+ takerStats: PublicKey;
524
+ takerUserAccount: UserAccount;
525
+ }): Promise<TransactionInstruction[]>;
526
+ placeAndMakeSwiftPerpOrder(encodedSwiftMessage: Buffer, swiftSignature: Buffer, encodedSwiftOrderParamsMessage: Buffer, swiftOrderParamsSignature: Buffer, takerExpectedOrderId: number, takerInfo: {
527
+ taker: PublicKey;
528
+ takerStats: PublicKey;
529
+ takerUserAccount: UserAccount;
530
+ }, orderParams: OptionalOrderParams, referrerInfo?: ReferrerInfo, txParams?: TxParams, subAccountId?: number): Promise<TransactionSignature>;
531
+ getPlaceAndMakeSwiftPerpOrderIxs(encodedSwiftMessage: Buffer, swiftSignature: Buffer, encodedSwiftOrderParamsMessage: Buffer, swiftOrderParamsSignature: Buffer, takerExpectedOrderId: number, takerInfo: {
532
+ taker: PublicKey;
533
+ takerStats: PublicKey;
534
+ takerUserAccount: UserAccount;
535
+ }, orderParams: OptionalOrderParams, referrerInfo?: ReferrerInfo, subAccountId?: number): Promise<TransactionInstruction[]>;
500
536
  preparePlaceAndTakeSpotOrder(orderParams: OptionalOrderParams, fulfillmentConfig?: SerumV3FulfillmentConfigAccount, makerInfo?: MakerInfo, referrerInfo?: ReferrerInfo, txParams?: TxParams, subAccountId?: number): Promise<{
501
537
  placeAndTakeSpotOrderTx: anchor.web3.Transaction | anchor.web3.VersionedTransaction;
502
538
  }>;
@@ -735,7 +771,7 @@ export declare class DriftClient {
735
771
  marketType: MarketType;
736
772
  } | undefined;
737
773
  getReceiverProgram(): Program<PythSolanaReceiver>;
738
- getSwitchboardOnDemandProgram(): Program30<Idl30>;
774
+ getSwitchboardOnDemandProgram(): Promise<Program30<Idl30>>;
739
775
  postPythPullOracleUpdateAtomic(vaaString: string, feedId: string): Promise<TransactionSignature>;
740
776
  postMultiPythPullOracleUpdatesAtomic(vaaString: string, feedIds: string[]): Promise<TransactionSignature>;
741
777
  getPostPythPullOracleUpdateAtomicIxs(vaaString: string, feedIds: string | string[], numSignatures?: number): Promise<TransactionInstruction[]>;