@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
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/).
package/VERSION CHANGED
@@ -1 +1 @@
1
- 2.96.0-beta.2
1
+ 2.96.0-beta.20
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');
@@ -6,8 +6,6 @@ import { EventEmitter } from 'events';
6
6
  import { Context, PublicKey } from '@solana/web3.js';
7
7
  import { Account } from '@solana/spl-token';
8
8
  import { OracleInfo, OraclePriceData } from '..';
9
- import { CommitmentLevel } from '@triton-one/yellowstone-grpc';
10
- import { ChannelOptions } from '@grpc/grpc-js';
11
9
  export interface AccountSubscriber<T> {
12
10
  dataAndSlot?: DataAndSlot<T>;
13
11
  subscribe(onChange: (data: T) => void): Promise<void>;
@@ -52,6 +50,11 @@ export interface DriftClientAccountSubscriber {
52
50
  getOraclePriceDataAndSlotForSpotMarket(marketIndex: number): DataAndSlot<OraclePriceData> | undefined;
53
51
  updateAccountLoaderPollingFrequency?: (pollingFrequency: number) => void;
54
52
  }
53
+ export declare enum DelistedMarketSetting {
54
+ Unsubscribe = 0,
55
+ Subscribe = 1,
56
+ Discard = 2
57
+ }
55
58
  export interface UserAccountEvents {
56
59
  userAccountUpdate: (payload: UserAccount) => void;
57
60
  update: void;
@@ -142,9 +145,3 @@ export interface UserStatsAccountSubscriber {
142
145
  unsubscribe(): Promise<void>;
143
146
  getUserStatsAccountAndSlot(): DataAndSlot<UserStatsAccount>;
144
147
  }
145
- export type GrpcConfigs = {
146
- endpoint: string;
147
- token: string;
148
- commitmentLevel?: CommitmentLevel;
149
- channelOptions?: ChannelOptions;
150
- };
@@ -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;
@@ -20,7 +20,7 @@ export declare class WebSocketAccountSubscriber<T> implements AccountSubscriber<
20
20
  constructor(accountName: string, program: Program, accountPublicKey: PublicKey, decodeBuffer?: (buffer: Buffer) => T, resubOpts?: ResubOpts, commitment?: Commitment);
21
21
  subscribe(onChange: (data: T) => void): Promise<void>;
22
22
  setData(data: T, slot?: number): void;
23
- protected setTimeout(): void;
23
+ private setTimeout;
24
24
  fetch(): Promise<void>;
25
25
  handleRpcResponse(context: Context, accountInfo?: AccountInfo<Buffer>): void;
26
26
  decodeBuffer(buffer: Buffer): T;
@@ -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
- protected isSubscribing: boolean;
34
- protected subscriptionPromise: Promise<boolean>;
35
- protected subscriptionPromiseResolver: (val: boolean) => void;
36
- constructor(program: Program, perpMarketIndexes: number[], spotMarketIndexes: number[], oracleInfos: OracleInfo[], shouldFindAllMarketsAndOracles: boolean, resubOpts?: ResubOpts, commitment?: Commitment);
33
+ private isSubscribing;
34
+ private subscriptionPromise;
35
+ private subscriptionPromiseResolver;
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');
@@ -27,7 +27,7 @@ export declare class WebSocketProgramAccountSubscriber<T> implements ProgramAcco
27
27
  commitment?: Commitment;
28
28
  }, resubOpts?: ResubOpts);
29
29
  subscribe(onChange: (accountId: PublicKey, data: T, context: Context, buffer: Buffer) => void): Promise<void>;
30
- protected setTimeout(): void;
30
+ private setTimeout;
31
31
  handleRpcResponse(context: Context, keyedAccountInfo: KeyedAccountInfo): void;
32
32
  unsubscribe(onResub?: boolean): Promise<void>;
33
33
  }
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,13 @@ 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 DEFAULT_CONFIRMATION_OPTS: ConfirmOptions;
26
30
  export declare const configs: {
27
31
  [key in DriftEnv]: DriftConfig;
28
32
  };
package/lib/config.js CHANGED
@@ -1,10 +1,16 @@
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.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.DEFAULT_CONFIRMATION_OPTS = {
11
+ preflightCommitment: 'confirmed',
12
+ commitment: 'confirmed',
13
+ };
8
14
  exports.configs = {
9
15
  devnet: {
10
16
  ENV: 'devnet',
@@ -20,6 +26,7 @@ exports.configs = {
20
26
  SPOT_MARKETS: spotMarkets_1.DevnetSpotMarkets,
21
27
  MARKET_LOOKUP_TABLE: 'FaMS3U4uBojvGn5FSDEPimddcXsCfwkKsFgMVVnDdxGb',
22
28
  DRIFT_ORACLE_RECEIVER_ID: exports.DRIFT_ORACLE_RECEIVER_ID,
29
+ SB_ON_DEMAND_PID: on_demand_1.ON_DEMAND_DEVNET_PID,
23
30
  },
24
31
  'mainnet-beta': {
25
32
  ENV: 'mainnet-beta',
@@ -36,6 +43,7 @@ exports.configs = {
36
43
  MARKET_LOOKUP_TABLE: 'D9cnvzswDikQDf53k4HpQ3KJ9y1Fv3HGGDFYMXnK5T6c',
37
44
  SERUM_LOOKUP_TABLE: 'GPZkp76cJtNL2mphCvT6FXkJCVPpouidnacckR6rzKDN',
38
45
  DRIFT_ORACLE_RECEIVER_ID: exports.DRIFT_ORACLE_RECEIVER_ID,
46
+ SB_ON_DEMAND_PID: on_demand_1.ON_DEMAND_MAINNET_PID,
39
47
  },
40
48
  };
41
49
  let currentConfig = exports.configs.devnet;
@@ -778,6 +778,27 @@ exports.MainnetPerpMarkets = [
778
778
  oracleSource: __1.OracleSource.PYTH_PULL,
779
779
  pythFeedId: '0x8963217838ab4cf5cadc172203c1f0b763fbaa45f346d8ee50ba994bbcac3026',
780
780
  },
781
+ {
782
+ fullName: 'LANDO-F1-SGP-WIN-BET',
783
+ category: ['Prediction', 'Sports'],
784
+ symbol: 'LANDO-F1-SGP-WIN-BET',
785
+ baseAssetSymbol: 'LANDO-F1-SGP-WIN',
786
+ marketIndex: 43,
787
+ oracle: new web3_js_1.PublicKey('DpJz7rjTJLxxnuqrqZTUjMWtnaMFAEfZUv5ATdb9HTh1'),
788
+ launchTs: 1726646453000,
789
+ oracleSource: __1.OracleSource.Prelaunch,
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
+ },
781
802
  ];
782
803
  exports.PerpMarkets = {
783
804
  devnet: exports.DevnetPerpMarkets,
@@ -94,7 +94,7 @@ exports.MainnetSpotMarkets = [
94
94
  precision: new __1.BN(10).pow(numericConstants_1.EIGHT),
95
95
  precisionExp: numericConstants_1.EIGHT,
96
96
  serumMarket: new web3_js_1.PublicKey('3BAKsQd3RuhZKES2DGysMhjBdwjZYKYmxRqnSMtZ4KSN'),
97
- pythFeedId: '0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43',
97
+ pythFeedId: '0xc9d8b075a5c69303365ae23633d4e085199bf5c520a3b90fed1322a0342ffc33',
98
98
  },
99
99
  {
100
100
  symbol: 'wETH',
@@ -280,6 +280,7 @@ exports.MainnetSpotMarkets = [
280
280
  precision: new __1.BN(10).pow(numericConstants_1.SIX),
281
281
  precisionExp: numericConstants_1.SIX,
282
282
  launchTs: 1719415157000,
283
+ pythFeedId: '0xc811abc82b4bad1f9bd711a2773ccaa935b03ecef974236942cec5e0eb845a3a',
283
284
  },
284
285
  {
285
286
  symbol: 'POPCAT',
@@ -343,6 +344,16 @@ exports.MainnetSpotMarkets = [
343
344
  precisionExp: numericConstants_1.LAMPORTS_EXP,
344
345
  pythFeedId: '0xef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d',
345
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
+ },
346
357
  ];
347
358
  exports.SpotMarkets = {
348
359
  devnet: exports.DevnetSpotMarkets,
@@ -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';
@@ -66,6 +65,7 @@ export declare class DriftClient {
66
65
  txHandler: TxHandler;
67
66
  receiverProgram?: Program<PythSolanaReceiver>;
68
67
  wormholeProgram?: Program<WormholeCoreBridgeSolana>;
68
+ sbOnDemandProgramdId: PublicKey;
69
69
  sbOnDemandProgram?: Program30<Idl30>;
70
70
  sbProgramFeedConfigs?: Map<string, any>;
71
71
  get isSubscribed(): boolean;
@@ -239,6 +239,7 @@ export declare class DriftClient {
239
239
  */
240
240
  getAssociatedTokenAccount(marketIndex: number, useNative?: boolean, tokenProgram?: anchor.web3.PublicKey): Promise<PublicKey>;
241
241
  createAssociatedTokenAccountIdempotentInstruction(account: PublicKey, payer: PublicKey, owner: PublicKey, mint: PublicKey, tokenProgram?: anchor.web3.PublicKey): TransactionInstruction;
242
+ getDepositTxnIx(amount: BN, marketIndex: number, associatedTokenAccount: PublicKey, subAccountId?: number, reduceOnly?: boolean): Promise<TransactionInstruction[]>;
242
243
  createDepositTxn(amount: BN, marketIndex: number, associatedTokenAccount: PublicKey, subAccountId?: number, reduceOnly?: boolean, txParams?: TxParams): Promise<VersionedTransaction | Transaction>;
243
244
  /**
244
245
  * Deposit funds into the given spot market
@@ -261,6 +262,10 @@ export declare class DriftClient {
261
262
  getTokenProgramForSpotMarket(spotMarketAccount: SpotMarketAccount): PublicKey;
262
263
  addTokenMintToRemainingAccounts(spotMarketAccount: SpotMarketAccount, remainingAccounts: AccountMeta[]): void;
263
264
  getAssociatedTokenAccountCreationIx(tokenMintAddress: PublicKey, associatedTokenAddress: PublicKey, tokenProgram: PublicKey): anchor.web3.TransactionInstruction;
265
+ createInitializeUserAccountAndDepositCollateralIxs(amount: BN, userTokenAccount: PublicKey, marketIndex?: number, subAccountId?: number, name?: string, fromSubAccountId?: number, referrerInfo?: ReferrerInfo, donateAmount?: BN, customMaxMarginRatio?: number): Promise<{
266
+ ixs: TransactionInstruction[];
267
+ userAccountPublicKey: PublicKey;
268
+ }>;
264
269
  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
270
  /**
266
271
  * Creates the User account for a user, and deposits some initial collateral
@@ -340,7 +345,10 @@ export declare class DriftClient {
340
345
  signedSettlePnlTx?: Transaction;
341
346
  }>;
342
347
  placePerpOrder(orderParams: OptionalOrderParams, txParams?: TxParams, subAccountId?: number): Promise<TransactionSignature>;
343
- getPlacePerpOrderIx(orderParams: OptionalOrderParams, subAccountId?: number): Promise<TransactionInstruction>;
348
+ getPlacePerpOrderIx(orderParams: OptionalOrderParams, subAccountId?: number, depositToTradeArgs?: {
349
+ isMakingNewAccount: boolean;
350
+ depositMarketIndex: number;
351
+ }): Promise<TransactionInstruction>;
344
352
  updateAMMs(marketIndexes: number[], txParams?: TxParams): Promise<TransactionSignature>;
345
353
  getUpdateAMMsIx(marketIndexes: number[]): Promise<TransactionInstruction>;
346
354
  settleExpiredMarket(marketIndex: number, txParams?: TxParams): Promise<TransactionSignature>;
@@ -483,7 +491,7 @@ export declare class DriftClient {
483
491
  getUpdateUserIdleIx(userAccountPublicKey: PublicKey, userAccount: UserAccount, fillerPublicKey?: PublicKey): Promise<TransactionInstruction>;
484
492
  updateUserOpenOrdersCount(userAccountPublicKey: PublicKey, user: UserAccount, txParams?: TxParams, fillerPublicKey?: PublicKey): Promise<TransactionSignature>;
485
493
  getUpdateUserOpenOrdersCountIx(userAccountPublicKey: PublicKey, userAccount: UserAccount, fillerPublicKey?: PublicKey): Promise<TransactionInstruction>;
486
- placeAndTakePerpOrder(orderParams: OptionalOrderParams, makerInfo?: MakerInfo | MakerInfo[], referrerInfo?: ReferrerInfo, txParams?: TxParams, subAccountId?: number): Promise<TransactionSignature>;
494
+ placeAndTakePerpOrder(orderParams: OptionalOrderParams, makerInfo?: MakerInfo | MakerInfo[], referrerInfo?: ReferrerInfo, successCondition?: PlaceAndTakeOrderSuccessCondition, txParams?: TxParams, subAccountId?: number): Promise<TransactionSignature>;
487
495
  preparePlaceAndTakePerpOrderWithAdditionalOrders(orderParams: OptionalOrderParams, makerInfo?: MakerInfo | MakerInfo[], referrerInfo?: ReferrerInfo, bracketOrdersParams?: OptionalOrderParams[], txParams?: TxParams, subAccountId?: number, cancelExistingOrders?: boolean, settlePnl?: boolean, exitEarlyIfSimFails?: boolean): Promise<{
488
496
  placeAndTakeTx: Transaction | VersionedTransaction;
489
497
  cancelExistingOrdersTx: Transaction | VersionedTransaction;
@@ -494,9 +502,36 @@ export declare class DriftClient {
494
502
  signedCancelExistingOrdersTx?: Transaction;
495
503
  signedSettlePnlTx?: Transaction;
496
504
  }>;
497
- getPlaceAndTakePerpOrderIx(orderParams: OptionalOrderParams, makerInfo?: MakerInfo | MakerInfo[], referrerInfo?: ReferrerInfo, subAccountId?: number): Promise<TransactionInstruction>;
505
+ getPlaceAndTakePerpOrderIx(orderParams: OptionalOrderParams, makerInfo?: MakerInfo | MakerInfo[], referrerInfo?: ReferrerInfo, successCondition?: PlaceAndTakeOrderSuccessCondition, subAccountId?: number): Promise<TransactionInstruction>;
498
506
  placeAndMakePerpOrder(orderParams: OptionalOrderParams, takerInfo: TakerInfo, referrerInfo?: ReferrerInfo, txParams?: TxParams, subAccountId?: number): Promise<TransactionSignature>;
499
507
  getPlaceAndMakePerpOrderIx(orderParams: OptionalOrderParams, takerInfo: TakerInfo, referrerInfo?: ReferrerInfo, subAccountId?: number): Promise<TransactionInstruction>;
508
+ encodeSwiftServerMessage(message: SwiftServerMessage): Buffer;
509
+ decodeSwiftServerMessage(encodedMessage: Buffer): SwiftServerMessage;
510
+ signSwiftServerMessage(message: SwiftServerMessage): Promise<Buffer>;
511
+ signSwiftOrderParamsMessage(orderParamsMessage: SwiftOrderParamsMessage): Promise<Buffer>;
512
+ encodeSwiftOrderParamsMessage(orderParamsMessage: SwiftOrderParamsMessage): Buffer;
513
+ decodeSwiftOrderParamsMessage(encodedMessage: Buffer): SwiftOrderParamsMessage;
514
+ signMessage(message: Uint8Array, keypair?: Keypair): Promise<Buffer>;
515
+ placeSwiftTakerOrder(swiftServerMessage: Buffer, swiftSignature: Buffer, swiftOrderParamsMessage: Buffer, swiftOrderParamsSignature: Buffer, marketIndex: number, takerInfo: {
516
+ taker: PublicKey;
517
+ takerStats: PublicKey;
518
+ takerUserAccount: UserAccount;
519
+ }, txParams?: TxParams): Promise<TransactionSignature>;
520
+ getPlaceSwiftTakerPerpOrderIxs(encodedSwiftServerMessage: Buffer, swiftSignature: Buffer, encodedSwiftOrderParamsMessage: Buffer, swiftOrderParamsSignature: Buffer, marketIndex: number, takerInfo: {
521
+ taker: PublicKey;
522
+ takerStats: PublicKey;
523
+ takerUserAccount: UserAccount;
524
+ }): Promise<TransactionInstruction[]>;
525
+ placeAndMakeSwiftPerpOrder(encodedSwiftMessage: Buffer, swiftSignature: Buffer, encodedSwiftOrderParamsMessage: Buffer, swiftOrderParamsSignature: Buffer, takerExpectedOrderId: number, takerInfo: {
526
+ taker: PublicKey;
527
+ takerStats: PublicKey;
528
+ takerUserAccount: UserAccount;
529
+ }, orderParams: OptionalOrderParams, referrerInfo?: ReferrerInfo, txParams?: TxParams, subAccountId?: number): Promise<TransactionSignature>;
530
+ getPlaceAndMakeSwiftPerpOrderIxs(encodedSwiftMessage: Buffer, swiftSignature: Buffer, encodedSwiftOrderParamsMessage: Buffer, swiftOrderParamsSignature: Buffer, takerExpectedOrderId: number, takerInfo: {
531
+ taker: PublicKey;
532
+ takerStats: PublicKey;
533
+ takerUserAccount: UserAccount;
534
+ }, orderParams: OptionalOrderParams, referrerInfo?: ReferrerInfo, subAccountId?: number): Promise<TransactionInstruction[]>;
500
535
  preparePlaceAndTakeSpotOrder(orderParams: OptionalOrderParams, fulfillmentConfig?: SerumV3FulfillmentConfigAccount, makerInfo?: MakerInfo, referrerInfo?: ReferrerInfo, txParams?: TxParams, subAccountId?: number): Promise<{
501
536
  placeAndTakeSpotOrderTx: anchor.web3.Transaction | anchor.web3.VersionedTransaction;
502
537
  }>;
@@ -735,7 +770,7 @@ export declare class DriftClient {
735
770
  marketType: MarketType;
736
771
  } | undefined;
737
772
  getReceiverProgram(): Program<PythSolanaReceiver>;
738
- getSwitchboardOnDemandProgram(): Program30<Idl30>;
773
+ getSwitchboardOnDemandProgram(): Promise<Program30<Idl30>>;
739
774
  postPythPullOracleUpdateAtomic(vaaString: string, feedId: string): Promise<TransactionSignature>;
740
775
  postMultiPythPullOracleUpdatesAtomic(vaaString: string, feedIds: string[]): Promise<TransactionSignature>;
741
776
  getPostPythPullOracleUpdateAtomicIxs(vaaString: string, feedIds: string | string[], numSignatures?: number): Promise<TransactionInstruction[]>;