@drift-labs/sdk 2.96.0-beta.9 → 2.97.0-beta.1

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 (69) 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 +36 -8
  19. package/lib/driftClient.js +166 -43
  20. package/lib/driftClientConfig.d.ts +3 -0
  21. package/lib/events/types.js +1 -5
  22. package/lib/idl/drift.json +169 -1
  23. package/lib/index.d.ts +1 -0
  24. package/lib/index.js +1 -0
  25. package/lib/orderParams.js +8 -8
  26. package/lib/orderSubscriber/OrderSubscriber.js +1 -6
  27. package/lib/tokenFaucet.js +2 -1
  28. package/lib/tx/baseTxSender.d.ts +0 -1
  29. package/lib/tx/baseTxSender.js +8 -26
  30. package/lib/tx/fastSingleTxSender.js +2 -2
  31. package/lib/tx/forwardOnlyTxSender.js +2 -2
  32. package/lib/tx/reportTransactionError.d.ts +20 -0
  33. package/lib/tx/reportTransactionError.js +103 -0
  34. package/lib/tx/retryTxSender.js +2 -2
  35. package/lib/tx/txHandler.js +10 -7
  36. package/lib/tx/whileValidTxSender.d.ts +4 -5
  37. package/lib/tx/whileValidTxSender.js +16 -17
  38. package/lib/types.d.ts +22 -1
  39. package/lib/types.js +6 -1
  40. package/lib/util/TransactionConfirmationManager.d.ts +16 -0
  41. package/lib/util/TransactionConfirmationManager.js +174 -0
  42. package/package.json +4 -3
  43. package/src/accounts/pollingDriftClientAccountSubscriber.ts +41 -5
  44. package/src/accounts/types.ts +6 -0
  45. package/src/accounts/utils.ts +42 -0
  46. package/src/accounts/webSocketDriftClientAccountSubscriber.ts +40 -5
  47. package/src/config.ts +17 -1
  48. package/src/constants/perpMarkets.ts +35 -1
  49. package/src/constants/spotMarkets.ts +11 -0
  50. package/src/constants/txConstants.ts +1 -0
  51. package/src/driftClient.ts +346 -53
  52. package/src/driftClientConfig.ts +3 -0
  53. package/src/events/types.ts +1 -5
  54. package/src/idl/drift.json +169 -1
  55. package/src/index.ts +1 -0
  56. package/src/orderParams.ts +20 -12
  57. package/src/orderSubscriber/OrderSubscriber.ts +2 -5
  58. package/src/tokenFaucet.ts +2 -2
  59. package/src/tx/baseTxSender.ts +10 -32
  60. package/src/tx/fastSingleTxSender.ts +2 -2
  61. package/src/tx/forwardOnlyTxSender.ts +2 -2
  62. package/src/tx/reportTransactionError.ts +159 -0
  63. package/src/tx/retryTxSender.ts +2 -2
  64. package/src/tx/txHandler.ts +8 -2
  65. package/src/tx/whileValidTxSender.ts +18 -27
  66. package/src/types.ts +31 -1
  67. package/src/util/TransactionConfirmationManager.ts +292 -0
  68. package/tests/ci/verifyConstants.ts +13 -0
  69. 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.9
1
+ 2.97.0-beta.1
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;
@@ -491,7 +492,7 @@ export declare class DriftClient {
491
492
  getUpdateUserIdleIx(userAccountPublicKey: PublicKey, userAccount: UserAccount, fillerPublicKey?: PublicKey): Promise<TransactionInstruction>;
492
493
  updateUserOpenOrdersCount(userAccountPublicKey: PublicKey, user: UserAccount, txParams?: TxParams, fillerPublicKey?: PublicKey): Promise<TransactionSignature>;
493
494
  getUpdateUserOpenOrdersCountIx(userAccountPublicKey: PublicKey, userAccount: UserAccount, fillerPublicKey?: PublicKey): Promise<TransactionInstruction>;
494
- 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>;
495
496
  preparePlaceAndTakePerpOrderWithAdditionalOrders(orderParams: OptionalOrderParams, makerInfo?: MakerInfo | MakerInfo[], referrerInfo?: ReferrerInfo, bracketOrdersParams?: OptionalOrderParams[], txParams?: TxParams, subAccountId?: number, cancelExistingOrders?: boolean, settlePnl?: boolean, exitEarlyIfSimFails?: boolean): Promise<{
496
497
  placeAndTakeTx: Transaction | VersionedTransaction;
497
498
  cancelExistingOrdersTx: Transaction | VersionedTransaction;
@@ -502,9 +503,36 @@ export declare class DriftClient {
502
503
  signedCancelExistingOrdersTx?: Transaction;
503
504
  signedSettlePnlTx?: Transaction;
504
505
  }>;
505
- 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>;
506
507
  placeAndMakePerpOrder(orderParams: OptionalOrderParams, takerInfo: TakerInfo, referrerInfo?: ReferrerInfo, txParams?: TxParams, subAccountId?: number): Promise<TransactionSignature>;
507
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[]>;
508
536
  preparePlaceAndTakeSpotOrder(orderParams: OptionalOrderParams, fulfillmentConfig?: SerumV3FulfillmentConfigAccount, makerInfo?: MakerInfo, referrerInfo?: ReferrerInfo, txParams?: TxParams, subAccountId?: number): Promise<{
509
537
  placeAndTakeSpotOrderTx: anchor.web3.Transaction | anchor.web3.VersionedTransaction;
510
538
  }>;
@@ -743,7 +771,7 @@ export declare class DriftClient {
743
771
  marketType: MarketType;
744
772
  } | undefined;
745
773
  getReceiverProgram(): Program<PythSolanaReceiver>;
746
- getSwitchboardOnDemandProgram(): Program30<Idl30>;
774
+ getSwitchboardOnDemandProgram(): Promise<Program30<Idl30>>;
747
775
  postPythPullOracleUpdateAtomic(vaaString: string, feedId: string): Promise<TransactionSignature>;
748
776
  postMultiPythPullOracleUpdatesAtomic(vaaString: string, feedIds: string[]): Promise<TransactionSignature>;
749
777
  getPostPythPullOracleUpdateAtomicIxs(vaaString: string, feedIds: string | string[], numSignatures?: number): Promise<TransactionInstruction[]>;