@drift-labs/sdk-browser 2.124.0-beta.4 → 2.124.0-beta.5

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.
package/VERSION CHANGED
@@ -1 +1 @@
1
- 2.124.0-beta.4
1
+ 2.124.0-beta.5
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BulkAccountLoader = void 0;
4
4
  const uuid_1 = require("uuid");
5
5
  const promiseTimeout_1 = require("../util/promiseTimeout");
6
- const GET_MULTIPLE_ACCOUNTS_CHUNK_SIZE = 99;
6
+ const numericConstants_1 = require("../constants/numericConstants");
7
7
  const oneMinute = 60 * 1000;
8
8
  class BulkAccountLoader {
9
9
  constructor(connection, commitment, pollingFrequency) {
@@ -84,7 +84,7 @@ class BulkAccountLoader {
84
84
  });
85
85
  this.lastTimeLoadingPromiseCleared = Date.now();
86
86
  try {
87
- const chunks = this.chunks(this.chunks(Array.from(this.accountsToLoad.values()), GET_MULTIPLE_ACCOUNTS_CHUNK_SIZE), 10);
87
+ const chunks = this.chunks(this.chunks(Array.from(this.accountsToLoad.values()), numericConstants_1.GET_MULTIPLE_ACCOUNTS_CHUNK_SIZE), 10);
88
88
  await Promise.all(chunks.map((chunk) => {
89
89
  return this.loadChunk(chunk);
90
90
  }));
@@ -0,0 +1,36 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import { BulkAccountLoader } from './bulkAccountLoader';
4
+ import { Commitment, Connection, PublicKey } from '@solana/web3.js';
5
+ export declare class CustomizedCadenceBulkAccountLoader extends BulkAccountLoader {
6
+ private customIntervalId;
7
+ private accountFrequencies;
8
+ private lastPollingTime;
9
+ private defaultPollingFrequency;
10
+ constructor(connection: Connection, commitment: Commitment, defaultPollingFrequency: number);
11
+ private getAccountsToLoad;
12
+ load(): Promise<void>;
13
+ private handleAccountLoading;
14
+ setCustomPollingFrequency(publicKey: PublicKey, newFrequency: number): void;
15
+ private restartPollingIfNeeded;
16
+ /**
17
+ * Adds an account to be monitored by the bulk account loader
18
+ * @param publicKey The public key of the account to monitor
19
+ * @param callback Function to be called when account data is received
20
+ * @param customPollingFrequency Optional custom polling frequency in ms for this specific account.
21
+ * If not provided, will use the default polling frequency
22
+ * @returns A unique callback ID that can be used to remove this specific callback later
23
+ *
24
+ * The method will:
25
+ * 1. Create a new callback mapping for the account
26
+ * 2. Set up polling frequency tracking for the account
27
+ * 3. Reset last polling time to 0 to ensure immediate data fetch
28
+ * 4. Automatically restart polling if this account needs a faster frequency than existing accounts
29
+ */
30
+ addAccount(publicKey: PublicKey, callback: (buffer: Buffer, slot: number) => void, customPollingFrequency?: number): Promise<string>;
31
+ removeAccount(publicKey: PublicKey): void;
32
+ getAccountCadence(publicKey: PublicKey): number | null;
33
+ startPolling(): void;
34
+ stopPolling(): void;
35
+ clearAccountFrequencies(): void;
36
+ }
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CustomizedCadenceBulkAccountLoader = void 0;
4
+ const numericConstants_1 = require("../constants/numericConstants");
5
+ const bulkAccountLoader_1 = require("./bulkAccountLoader");
6
+ const uuid_1 = require("uuid");
7
+ class CustomizedCadenceBulkAccountLoader extends bulkAccountLoader_1.BulkAccountLoader {
8
+ constructor(connection, commitment, defaultPollingFrequency) {
9
+ super(connection, commitment, defaultPollingFrequency);
10
+ this.customIntervalId = null;
11
+ this.accountFrequencies = new Map();
12
+ this.lastPollingTime = new Map();
13
+ this.defaultPollingFrequency = defaultPollingFrequency;
14
+ }
15
+ getAccountsToLoad() {
16
+ const currentTime = Date.now();
17
+ const accountsToLoad = [];
18
+ for (const [key, frequency] of this.accountFrequencies.entries()) {
19
+ const lastPollTime = this.lastPollingTime.get(key) || 0;
20
+ if (currentTime - lastPollTime >= frequency) {
21
+ const account = this.accountsToLoad.get(key);
22
+ if (account) {
23
+ accountsToLoad.push(account);
24
+ this.lastPollingTime.set(key, currentTime);
25
+ }
26
+ }
27
+ }
28
+ return accountsToLoad;
29
+ }
30
+ async load() {
31
+ return this.handleAccountLoading();
32
+ }
33
+ async handleAccountLoading() {
34
+ const accounts = this.getAccountsToLoad();
35
+ if (accounts.length > 0) {
36
+ const chunks = this.chunks(this.chunks(accounts, numericConstants_1.GET_MULTIPLE_ACCOUNTS_CHUNK_SIZE), 10);
37
+ await Promise.all(chunks.map((chunk) => {
38
+ return this.loadChunk(chunk);
39
+ }));
40
+ }
41
+ }
42
+ setCustomPollingFrequency(publicKey, newFrequency) {
43
+ const key = publicKey.toBase58();
44
+ this.accountFrequencies.set(key, newFrequency);
45
+ this.lastPollingTime.set(key, 0); // Reset last polling time to ensure immediate load
46
+ this.restartPollingIfNeeded(newFrequency);
47
+ }
48
+ restartPollingIfNeeded(newFrequency) {
49
+ const currentMinFrequency = Math.min(...Array.from(this.accountFrequencies.values()), this.defaultPollingFrequency);
50
+ if (newFrequency < currentMinFrequency || !this.customIntervalId) {
51
+ this.stopPolling();
52
+ this.startPolling();
53
+ }
54
+ }
55
+ /**
56
+ * Adds an account to be monitored by the bulk account loader
57
+ * @param publicKey The public key of the account to monitor
58
+ * @param callback Function to be called when account data is received
59
+ * @param customPollingFrequency Optional custom polling frequency in ms for this specific account.
60
+ * If not provided, will use the default polling frequency
61
+ * @returns A unique callback ID that can be used to remove this specific callback later
62
+ *
63
+ * The method will:
64
+ * 1. Create a new callback mapping for the account
65
+ * 2. Set up polling frequency tracking for the account
66
+ * 3. Reset last polling time to 0 to ensure immediate data fetch
67
+ * 4. Automatically restart polling if this account needs a faster frequency than existing accounts
68
+ */
69
+ async addAccount(publicKey, callback, customPollingFrequency) {
70
+ const callbackId = (0, uuid_1.v4)();
71
+ const callbacks = new Map();
72
+ callbacks.set(callbackId, callback);
73
+ const newAccountToLoad = {
74
+ publicKey,
75
+ callbacks,
76
+ };
77
+ this.accountsToLoad.set(publicKey.toString(), newAccountToLoad);
78
+ const key = publicKey.toBase58();
79
+ const frequency = customPollingFrequency || this.defaultPollingFrequency;
80
+ this.accountFrequencies.set(key, frequency);
81
+ this.lastPollingTime.set(key, 0); // Reset last polling time to ensure immediate load
82
+ this.restartPollingIfNeeded(frequency);
83
+ return callbackId;
84
+ }
85
+ removeAccount(publicKey) {
86
+ const key = publicKey.toBase58();
87
+ this.accountFrequencies.delete(key);
88
+ this.lastPollingTime.delete(key);
89
+ if (this.accountsToLoad.size === 0) {
90
+ this.stopPolling();
91
+ }
92
+ else {
93
+ // Restart polling in case we removed the account with the smallest frequency
94
+ this.restartPollingIfNeeded(this.defaultPollingFrequency);
95
+ }
96
+ }
97
+ getAccountCadence(publicKey) {
98
+ const key = publicKey.toBase58();
99
+ return this.accountFrequencies.get(key) || null;
100
+ }
101
+ startPolling() {
102
+ if (this.customIntervalId) {
103
+ return;
104
+ }
105
+ const minFrequency = Math.min(...Array.from(this.accountFrequencies.values()), this.defaultPollingFrequency);
106
+ this.customIntervalId = setInterval(() => {
107
+ this.handleAccountLoading().catch((error) => {
108
+ console.error('Error in account loading:', error);
109
+ });
110
+ }, minFrequency);
111
+ }
112
+ stopPolling() {
113
+ super.stopPolling();
114
+ if (this.customIntervalId) {
115
+ clearInterval(this.customIntervalId);
116
+ this.customIntervalId = null;
117
+ }
118
+ this.lastPollingTime.clear();
119
+ }
120
+ clearAccountFrequencies() {
121
+ this.accountFrequencies.clear();
122
+ }
123
+ }
124
+ exports.CustomizedCadenceBulkAccountLoader = CustomizedCadenceBulkAccountLoader;
@@ -1,5 +1,5 @@
1
1
  /// <reference types="bn.js" />
2
- import { BN } from '../';
2
+ import { BN } from '@coral-xyz/anchor';
3
3
  export declare const ZERO: BN;
4
4
  export declare const ONE: BN;
5
5
  export declare const TWO: BN;
@@ -70,3 +70,4 @@ export declare const DUST_POSITION_SIZE: BN;
70
70
  export declare const FUEL_WINDOW: BN;
71
71
  export declare const FUEL_START_TS: BN;
72
72
  export declare const MAX_PREDICTION_PRICE: BN;
73
+ export declare const GET_MULTIPLE_ACCOUNTS_CHUNK_SIZE = 99;
@@ -1,52 +1,52 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MARGIN_PRECISION = exports.AMM_TIMES_PEG_TO_QUOTE_PRECISION_RATIO = exports.PRICE_TO_QUOTE_PRECISION = exports.PRICE_DIV_PEG = exports.AMM_TO_QUOTE_PRECISION_RATIO = exports.BASE_PRECISION_EXP = exports.BASE_PRECISION = exports.AMM_RESERVE_PRECISION = exports.PEG_PRECISION = exports.FUNDING_RATE_BUFFER_PRECISION = exports.FUNDING_RATE_PRECISION = exports.PRICE_PRECISION = exports.QUOTE_PRECISION = exports.LIQUIDATION_FEE_PRECISION = exports.SPOT_MARKET_IMF_PRECISION = exports.SPOT_MARKET_IMF_PRECISION_EXP = exports.SPOT_MARKET_BALANCE_PRECISION = exports.SPOT_MARKET_BALANCE_PRECISION_EXP = exports.SPOT_MARKET_WEIGHT_PRECISION = exports.SPOT_MARKET_UTILIZATION_PRECISION = exports.SPOT_MARKET_UTILIZATION_PRECISION_EXP = exports.SPOT_MARKET_CUMULATIVE_INTEREST_PRECISION = exports.SPOT_MARKET_CUMULATIVE_INTEREST_PRECISION_EXP = exports.SPOT_MARKET_RATE_PRECISION = exports.SPOT_MARKET_RATE_PRECISION_EXP = exports.AMM_RESERVE_PRECISION_EXP = exports.PEG_PRECISION_EXP = exports.FUNDING_RATE_PRECISION_EXP = exports.PRICE_PRECISION_EXP = exports.FUNDING_RATE_BUFFER_PRECISION_EXP = exports.QUOTE_PRECISION_EXP = exports.CONCENTRATION_PRECISION = exports.PERCENTAGE_PRECISION = exports.PERCENTAGE_PRECISION_EXP = exports.MAX_LEVERAGE_ORDER_SIZE = exports.MAX_LEVERAGE = exports.TEN_MILLION = exports.BN_MAX = exports.TEN_THOUSAND = exports.TEN = exports.NINE = exports.EIGHT = exports.SEVEN = exports.SIX = exports.FIVE = exports.FOUR = exports.THREE = exports.TWO = exports.ONE = exports.ZERO = void 0;
4
- exports.MAX_PREDICTION_PRICE = exports.FUEL_START_TS = exports.FUEL_WINDOW = exports.DUST_POSITION_SIZE = exports.SLOT_TIME_ESTIMATE_MS = exports.IDLE_TIME_SLOTS = exports.ACCOUNT_AGE_DELETION_CUTOFF_SECONDS = exports.DEFAULT_REVENUE_SINCE_LAST_FUNDING_SPREAD_RETREAT = exports.OPEN_ORDER_MARGIN_REQUIREMENT = exports.LAMPORTS_EXP = exports.LAMPORTS_PRECISION = exports.GOV_SPOT_MARKET_INDEX = exports.QUOTE_SPOT_MARKET_INDEX = exports.ONE_YEAR = exports.ONE_HOUR = exports.FIVE_MINUTE = exports.PRICE_TIMES_AMM_TO_QUOTE_PRECISION_RATIO = exports.FUNDING_RATE_OFFSET_DENOMINATOR = exports.LIQUIDATION_PCT_PRECISION = exports.BID_ASK_SPREAD_PRECISION = void 0;
4
+ exports.GET_MULTIPLE_ACCOUNTS_CHUNK_SIZE = exports.MAX_PREDICTION_PRICE = exports.FUEL_START_TS = exports.FUEL_WINDOW = exports.DUST_POSITION_SIZE = exports.SLOT_TIME_ESTIMATE_MS = exports.IDLE_TIME_SLOTS = exports.ACCOUNT_AGE_DELETION_CUTOFF_SECONDS = exports.DEFAULT_REVENUE_SINCE_LAST_FUNDING_SPREAD_RETREAT = exports.OPEN_ORDER_MARGIN_REQUIREMENT = exports.LAMPORTS_EXP = exports.LAMPORTS_PRECISION = exports.GOV_SPOT_MARKET_INDEX = exports.QUOTE_SPOT_MARKET_INDEX = exports.ONE_YEAR = exports.ONE_HOUR = exports.FIVE_MINUTE = exports.PRICE_TIMES_AMM_TO_QUOTE_PRECISION_RATIO = exports.FUNDING_RATE_OFFSET_DENOMINATOR = exports.LIQUIDATION_PCT_PRECISION = exports.BID_ASK_SPREAD_PRECISION = void 0;
5
5
  const web3_js_1 = require("@solana/web3.js");
6
- const __1 = require("../");
7
- exports.ZERO = new __1.BN(0);
8
- exports.ONE = new __1.BN(1);
9
- exports.TWO = new __1.BN(2);
10
- exports.THREE = new __1.BN(3);
11
- exports.FOUR = new __1.BN(4);
12
- exports.FIVE = new __1.BN(5);
13
- exports.SIX = new __1.BN(6);
14
- exports.SEVEN = new __1.BN(7);
15
- exports.EIGHT = new __1.BN(8);
16
- exports.NINE = new __1.BN(9);
17
- exports.TEN = new __1.BN(10);
18
- exports.TEN_THOUSAND = new __1.BN(10000);
19
- exports.BN_MAX = new __1.BN(Number.MAX_SAFE_INTEGER);
6
+ const anchor_1 = require("@coral-xyz/anchor");
7
+ exports.ZERO = new anchor_1.BN(0);
8
+ exports.ONE = new anchor_1.BN(1);
9
+ exports.TWO = new anchor_1.BN(2);
10
+ exports.THREE = new anchor_1.BN(3);
11
+ exports.FOUR = new anchor_1.BN(4);
12
+ exports.FIVE = new anchor_1.BN(5);
13
+ exports.SIX = new anchor_1.BN(6);
14
+ exports.SEVEN = new anchor_1.BN(7);
15
+ exports.EIGHT = new anchor_1.BN(8);
16
+ exports.NINE = new anchor_1.BN(9);
17
+ exports.TEN = new anchor_1.BN(10);
18
+ exports.TEN_THOUSAND = new anchor_1.BN(10000);
19
+ exports.BN_MAX = new anchor_1.BN(Number.MAX_SAFE_INTEGER);
20
20
  exports.TEN_MILLION = exports.TEN_THOUSAND.mul(exports.TEN_THOUSAND);
21
- exports.MAX_LEVERAGE = new __1.BN(5);
22
- exports.MAX_LEVERAGE_ORDER_SIZE = new __1.BN('18446744073709551615');
23
- exports.PERCENTAGE_PRECISION_EXP = new __1.BN(6);
24
- exports.PERCENTAGE_PRECISION = new __1.BN(10).pow(exports.PERCENTAGE_PRECISION_EXP);
21
+ exports.MAX_LEVERAGE = new anchor_1.BN(5);
22
+ exports.MAX_LEVERAGE_ORDER_SIZE = new anchor_1.BN('18446744073709551615');
23
+ exports.PERCENTAGE_PRECISION_EXP = new anchor_1.BN(6);
24
+ exports.PERCENTAGE_PRECISION = new anchor_1.BN(10).pow(exports.PERCENTAGE_PRECISION_EXP);
25
25
  exports.CONCENTRATION_PRECISION = exports.PERCENTAGE_PRECISION;
26
- exports.QUOTE_PRECISION_EXP = new __1.BN(6);
27
- exports.FUNDING_RATE_BUFFER_PRECISION_EXP = new __1.BN(3);
28
- exports.PRICE_PRECISION_EXP = new __1.BN(6);
26
+ exports.QUOTE_PRECISION_EXP = new anchor_1.BN(6);
27
+ exports.FUNDING_RATE_BUFFER_PRECISION_EXP = new anchor_1.BN(3);
28
+ exports.PRICE_PRECISION_EXP = new anchor_1.BN(6);
29
29
  exports.FUNDING_RATE_PRECISION_EXP = exports.PRICE_PRECISION_EXP.add(exports.FUNDING_RATE_BUFFER_PRECISION_EXP);
30
- exports.PEG_PRECISION_EXP = new __1.BN(6);
31
- exports.AMM_RESERVE_PRECISION_EXP = new __1.BN(9);
32
- exports.SPOT_MARKET_RATE_PRECISION_EXP = new __1.BN(6);
33
- exports.SPOT_MARKET_RATE_PRECISION = new __1.BN(10).pow(exports.SPOT_MARKET_RATE_PRECISION_EXP);
34
- exports.SPOT_MARKET_CUMULATIVE_INTEREST_PRECISION_EXP = new __1.BN(10);
35
- exports.SPOT_MARKET_CUMULATIVE_INTEREST_PRECISION = new __1.BN(10).pow(exports.SPOT_MARKET_CUMULATIVE_INTEREST_PRECISION_EXP);
36
- exports.SPOT_MARKET_UTILIZATION_PRECISION_EXP = new __1.BN(6);
37
- exports.SPOT_MARKET_UTILIZATION_PRECISION = new __1.BN(10).pow(exports.SPOT_MARKET_UTILIZATION_PRECISION_EXP);
38
- exports.SPOT_MARKET_WEIGHT_PRECISION = new __1.BN(10000);
39
- exports.SPOT_MARKET_BALANCE_PRECISION_EXP = new __1.BN(9);
40
- exports.SPOT_MARKET_BALANCE_PRECISION = new __1.BN(10).pow(exports.SPOT_MARKET_BALANCE_PRECISION_EXP);
41
- exports.SPOT_MARKET_IMF_PRECISION_EXP = new __1.BN(6);
42
- exports.SPOT_MARKET_IMF_PRECISION = new __1.BN(10).pow(exports.SPOT_MARKET_IMF_PRECISION_EXP);
43
- exports.LIQUIDATION_FEE_PRECISION = new __1.BN(1000000);
44
- exports.QUOTE_PRECISION = new __1.BN(10).pow(exports.QUOTE_PRECISION_EXP);
45
- exports.PRICE_PRECISION = new __1.BN(10).pow(exports.PRICE_PRECISION_EXP);
46
- exports.FUNDING_RATE_PRECISION = new __1.BN(10).pow(exports.FUNDING_RATE_PRECISION_EXP);
47
- exports.FUNDING_RATE_BUFFER_PRECISION = new __1.BN(10).pow(exports.FUNDING_RATE_BUFFER_PRECISION_EXP);
48
- exports.PEG_PRECISION = new __1.BN(10).pow(exports.PEG_PRECISION_EXP);
49
- exports.AMM_RESERVE_PRECISION = new __1.BN(10).pow(exports.AMM_RESERVE_PRECISION_EXP);
30
+ exports.PEG_PRECISION_EXP = new anchor_1.BN(6);
31
+ exports.AMM_RESERVE_PRECISION_EXP = new anchor_1.BN(9);
32
+ exports.SPOT_MARKET_RATE_PRECISION_EXP = new anchor_1.BN(6);
33
+ exports.SPOT_MARKET_RATE_PRECISION = new anchor_1.BN(10).pow(exports.SPOT_MARKET_RATE_PRECISION_EXP);
34
+ exports.SPOT_MARKET_CUMULATIVE_INTEREST_PRECISION_EXP = new anchor_1.BN(10);
35
+ exports.SPOT_MARKET_CUMULATIVE_INTEREST_PRECISION = new anchor_1.BN(10).pow(exports.SPOT_MARKET_CUMULATIVE_INTEREST_PRECISION_EXP);
36
+ exports.SPOT_MARKET_UTILIZATION_PRECISION_EXP = new anchor_1.BN(6);
37
+ exports.SPOT_MARKET_UTILIZATION_PRECISION = new anchor_1.BN(10).pow(exports.SPOT_MARKET_UTILIZATION_PRECISION_EXP);
38
+ exports.SPOT_MARKET_WEIGHT_PRECISION = new anchor_1.BN(10000);
39
+ exports.SPOT_MARKET_BALANCE_PRECISION_EXP = new anchor_1.BN(9);
40
+ exports.SPOT_MARKET_BALANCE_PRECISION = new anchor_1.BN(10).pow(exports.SPOT_MARKET_BALANCE_PRECISION_EXP);
41
+ exports.SPOT_MARKET_IMF_PRECISION_EXP = new anchor_1.BN(6);
42
+ exports.SPOT_MARKET_IMF_PRECISION = new anchor_1.BN(10).pow(exports.SPOT_MARKET_IMF_PRECISION_EXP);
43
+ exports.LIQUIDATION_FEE_PRECISION = new anchor_1.BN(1000000);
44
+ exports.QUOTE_PRECISION = new anchor_1.BN(10).pow(exports.QUOTE_PRECISION_EXP);
45
+ exports.PRICE_PRECISION = new anchor_1.BN(10).pow(exports.PRICE_PRECISION_EXP);
46
+ exports.FUNDING_RATE_PRECISION = new anchor_1.BN(10).pow(exports.FUNDING_RATE_PRECISION_EXP);
47
+ exports.FUNDING_RATE_BUFFER_PRECISION = new anchor_1.BN(10).pow(exports.FUNDING_RATE_BUFFER_PRECISION_EXP);
48
+ exports.PEG_PRECISION = new anchor_1.BN(10).pow(exports.PEG_PRECISION_EXP);
49
+ exports.AMM_RESERVE_PRECISION = new anchor_1.BN(10).pow(exports.AMM_RESERVE_PRECISION_EXP);
50
50
  exports.BASE_PRECISION = exports.AMM_RESERVE_PRECISION;
51
51
  exports.BASE_PRECISION_EXP = exports.AMM_RESERVE_PRECISION_EXP;
52
52
  exports.AMM_TO_QUOTE_PRECISION_RATIO = exports.AMM_RESERVE_PRECISION.div(exports.QUOTE_PRECISION); // 10^3
@@ -54,23 +54,24 @@ exports.PRICE_DIV_PEG = exports.PRICE_PRECISION.div(exports.PEG_PRECISION); //10
54
54
  exports.PRICE_TO_QUOTE_PRECISION = exports.PRICE_PRECISION.div(exports.QUOTE_PRECISION); // 10^1
55
55
  exports.AMM_TIMES_PEG_TO_QUOTE_PRECISION_RATIO = exports.AMM_RESERVE_PRECISION.mul(exports.PEG_PRECISION).div(exports.QUOTE_PRECISION); // 10^9
56
56
  exports.MARGIN_PRECISION = exports.TEN_THOUSAND;
57
- exports.BID_ASK_SPREAD_PRECISION = new __1.BN(1000000); // 10^6
57
+ exports.BID_ASK_SPREAD_PRECISION = new anchor_1.BN(1000000); // 10^6
58
58
  exports.LIQUIDATION_PCT_PRECISION = exports.TEN_THOUSAND;
59
- exports.FUNDING_RATE_OFFSET_DENOMINATOR = new __1.BN(5000);
59
+ exports.FUNDING_RATE_OFFSET_DENOMINATOR = new anchor_1.BN(5000);
60
60
  exports.PRICE_TIMES_AMM_TO_QUOTE_PRECISION_RATIO = exports.PRICE_PRECISION.mul(exports.AMM_TO_QUOTE_PRECISION_RATIO);
61
- exports.FIVE_MINUTE = new __1.BN(60 * 5);
62
- exports.ONE_HOUR = new __1.BN(60 * 60);
63
- exports.ONE_YEAR = new __1.BN(31536000);
61
+ exports.FIVE_MINUTE = new anchor_1.BN(60 * 5);
62
+ exports.ONE_HOUR = new anchor_1.BN(60 * 60);
63
+ exports.ONE_YEAR = new anchor_1.BN(31536000);
64
64
  exports.QUOTE_SPOT_MARKET_INDEX = 0;
65
65
  exports.GOV_SPOT_MARKET_INDEX = 15;
66
- exports.LAMPORTS_PRECISION = new __1.BN(web3_js_1.LAMPORTS_PER_SOL);
67
- exports.LAMPORTS_EXP = new __1.BN(Math.log10(web3_js_1.LAMPORTS_PER_SOL));
68
- exports.OPEN_ORDER_MARGIN_REQUIREMENT = exports.QUOTE_PRECISION.div(new __1.BN(100));
69
- exports.DEFAULT_REVENUE_SINCE_LAST_FUNDING_SPREAD_RETREAT = new __1.BN(-25).mul(exports.QUOTE_PRECISION);
66
+ exports.LAMPORTS_PRECISION = new anchor_1.BN(web3_js_1.LAMPORTS_PER_SOL);
67
+ exports.LAMPORTS_EXP = new anchor_1.BN(Math.log10(web3_js_1.LAMPORTS_PER_SOL));
68
+ exports.OPEN_ORDER_MARGIN_REQUIREMENT = exports.QUOTE_PRECISION.div(new anchor_1.BN(100));
69
+ exports.DEFAULT_REVENUE_SINCE_LAST_FUNDING_SPREAD_RETREAT = new anchor_1.BN(-25).mul(exports.QUOTE_PRECISION);
70
70
  exports.ACCOUNT_AGE_DELETION_CUTOFF_SECONDS = 60 * 60 * 24 * 13; // 13 days
71
71
  exports.IDLE_TIME_SLOTS = 9000;
72
72
  exports.SLOT_TIME_ESTIMATE_MS = 400;
73
73
  exports.DUST_POSITION_SIZE = exports.QUOTE_PRECISION.divn(100); // Dust position is any position smaller than 1c
74
- exports.FUEL_WINDOW = new __1.BN(60 * 60 * 24 * 28); // 28 days
75
- exports.FUEL_START_TS = new __1.BN(1723147200); // unix timestamp
74
+ exports.FUEL_WINDOW = new anchor_1.BN(60 * 60 * 24 * 28); // 28 days
75
+ exports.FUEL_START_TS = new anchor_1.BN(1723147200); // unix timestamp
76
76
  exports.MAX_PREDICTION_PRICE = exports.PRICE_PRECISION;
77
+ exports.GET_MULTIPLE_ACCOUNTS_CHUNK_SIZE = 99;
@@ -14,6 +14,7 @@ export * from './accounts/webSocketHighLeverageModeConfigAccountSubscriber';
14
14
  export * from './accounts/bulkAccountLoader';
15
15
  export * from './accounts/bulkUserSubscription';
16
16
  export * from './accounts/bulkUserStatsSubscription';
17
+ export { CustomizedCadenceBulkAccountLoader } from './accounts/customizedCadenceBulkAccountLoader';
17
18
  export * from './accounts/pollingDriftClientAccountSubscriber';
18
19
  export * from './accounts/pollingOracleAccountSubscriber';
19
20
  export * from './accounts/pollingTokenAccountSubscriber';
@@ -17,7 +17,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
17
17
  return (mod && mod.__esModule) ? mod : { "default": mod };
18
18
  };
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.pyth = exports.PublicKey = exports.BN = void 0;
20
+ exports.pyth = exports.PublicKey = exports.BN = exports.CustomizedCadenceBulkAccountLoader = void 0;
21
21
  const anchor_1 = require("@coral-xyz/anchor");
22
22
  Object.defineProperty(exports, "BN", { enumerable: true, get: function () { return anchor_1.BN; } });
23
23
  const web3_js_1 = require("@solana/web3.js");
@@ -37,6 +37,8 @@ __exportStar(require("./accounts/webSocketHighLeverageModeConfigAccountSubscribe
37
37
  __exportStar(require("./accounts/bulkAccountLoader"), exports);
38
38
  __exportStar(require("./accounts/bulkUserSubscription"), exports);
39
39
  __exportStar(require("./accounts/bulkUserStatsSubscription"), exports);
40
+ var customizedCadenceBulkAccountLoader_1 = require("./accounts/customizedCadenceBulkAccountLoader");
41
+ Object.defineProperty(exports, "CustomizedCadenceBulkAccountLoader", { enumerable: true, get: function () { return customizedCadenceBulkAccountLoader_1.CustomizedCadenceBulkAccountLoader; } });
40
42
  __exportStar(require("./accounts/pollingDriftClientAccountSubscriber"), exports);
41
43
  __exportStar(require("./accounts/pollingOracleAccountSubscriber"), exports);
42
44
  __exportStar(require("./accounts/pollingTokenAccountSubscriber"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"bulkAccountLoader.d.ts","sourceRoot":"","sources":["../../../src/accounts/bulkAccountLoader.ts"],"names":[],"mappings":";;AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE1D,MAAM,MAAM,aAAa,GAAG;IAC3B,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC;CAC/D,CAAC;AAMF,qBAAa,iBAAiB;IAC7B,UAAU,EAAE,UAAU,CAAC;IACvB,UAAU,EAAE,UAAU,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,6BAAoC;IAClD,gBAAgB,6BAAoC;IACpD,cAAc,0BAA0B,IAAI,EAAI;IAChD,UAAU,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;IAE3C,WAAW,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,mBAAmB,EAAE,MAAM,IAAI,CAAC;IAChC,6BAA6B,SAAc;IAC3C,cAAc,SAAK;gBAGlB,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,UAAU,EACtB,gBAAgB,EAAE,MAAM;IAOZ,UAAU,CACtB,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,GAC9C,OAAO,CAAC,MAAM,CAAC;IAkCX,aAAa,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAe7D,iBAAiB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,MAAM;IAM3D,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIrD,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,EAAE;IAOtC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAyC5B,SAAS,CAAC,oBAAoB,EAAE,aAAa,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAsFvE,sBAAsB,CACrB,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACV,IAAI;IAgBA,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,aAAa,GAAG,SAAS;IAIjE,OAAO,IAAI,MAAM;IAIjB,YAAY,IAAI,IAAI;IAYpB,WAAW,IAAI,IAAI;IAOnB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAItB,sBAAsB,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI;CAO7D"}
1
+ {"version":3,"file":"bulkAccountLoader.d.ts","sourceRoot":"","sources":["../../../src/accounts/bulkAccountLoader.ts"],"names":[],"mappings":";;AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAG1D,MAAM,MAAM,aAAa,GAAG;IAC3B,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,CAAC;CAC/D,CAAC;AAIF,qBAAa,iBAAiB;IAC7B,UAAU,EAAE,UAAU,CAAC;IACvB,UAAU,EAAE,UAAU,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,6BAAoC;IAClD,gBAAgB,6BAAoC;IACpD,cAAc,0BAA0B,IAAI,EAAI;IAChD,UAAU,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;IAE3C,WAAW,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,mBAAmB,EAAE,MAAM,IAAI,CAAC;IAChC,6BAA6B,SAAc;IAC3C,cAAc,SAAK;gBAGlB,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,UAAU,EACtB,gBAAgB,EAAE,MAAM;IAOZ,UAAU,CACtB,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,GAC9C,OAAO,CAAC,MAAM,CAAC;IAkCX,aAAa,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAe7D,iBAAiB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,MAAM;IAM3D,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIrD,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,EAAE;IAOtC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAyC5B,SAAS,CAAC,oBAAoB,EAAE,aAAa,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAsFvE,sBAAsB,CACrB,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACV,IAAI;IAgBA,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,aAAa,GAAG,SAAS;IAIjE,OAAO,IAAI,MAAM;IAIjB,YAAY,IAAI,IAAI;IAYpB,WAAW,IAAI,IAAI;IAOnB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAItB,sBAAsB,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI;CAO7D"}
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BulkAccountLoader = void 0;
4
4
  const uuid_1 = require("uuid");
5
5
  const promiseTimeout_1 = require("../util/promiseTimeout");
6
- const GET_MULTIPLE_ACCOUNTS_CHUNK_SIZE = 99;
6
+ const numericConstants_1 = require("../constants/numericConstants");
7
7
  const oneMinute = 60 * 1000;
8
8
  class BulkAccountLoader {
9
9
  constructor(connection, commitment, pollingFrequency) {
@@ -84,7 +84,7 @@ class BulkAccountLoader {
84
84
  });
85
85
  this.lastTimeLoadingPromiseCleared = Date.now();
86
86
  try {
87
- const chunks = this.chunks(this.chunks(Array.from(this.accountsToLoad.values()), GET_MULTIPLE_ACCOUNTS_CHUNK_SIZE), 10);
87
+ const chunks = this.chunks(this.chunks(Array.from(this.accountsToLoad.values()), numericConstants_1.GET_MULTIPLE_ACCOUNTS_CHUNK_SIZE), 10);
88
88
  await Promise.all(chunks.map((chunk) => {
89
89
  return this.loadChunk(chunk);
90
90
  }));
@@ -0,0 +1,37 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import { BulkAccountLoader } from './bulkAccountLoader';
4
+ import { Commitment, Connection, PublicKey } from '@solana/web3.js';
5
+ export declare class CustomizedCadenceBulkAccountLoader extends BulkAccountLoader {
6
+ private customIntervalId;
7
+ private accountFrequencies;
8
+ private lastPollingTime;
9
+ private defaultPollingFrequency;
10
+ constructor(connection: Connection, commitment: Commitment, defaultPollingFrequency: number);
11
+ private getAccountsToLoad;
12
+ load(): Promise<void>;
13
+ private handleAccountLoading;
14
+ setCustomPollingFrequency(publicKey: PublicKey, newFrequency: number): void;
15
+ private restartPollingIfNeeded;
16
+ /**
17
+ * Adds an account to be monitored by the bulk account loader
18
+ * @param publicKey The public key of the account to monitor
19
+ * @param callback Function to be called when account data is received
20
+ * @param customPollingFrequency Optional custom polling frequency in ms for this specific account.
21
+ * If not provided, will use the default polling frequency
22
+ * @returns A unique callback ID that can be used to remove this specific callback later
23
+ *
24
+ * The method will:
25
+ * 1. Create a new callback mapping for the account
26
+ * 2. Set up polling frequency tracking for the account
27
+ * 3. Reset last polling time to 0 to ensure immediate data fetch
28
+ * 4. Automatically restart polling if this account needs a faster frequency than existing accounts
29
+ */
30
+ addAccount(publicKey: PublicKey, callback: (buffer: Buffer, slot: number) => void, customPollingFrequency?: number): Promise<string>;
31
+ removeAccount(publicKey: PublicKey): void;
32
+ getAccountCadence(publicKey: PublicKey): number | null;
33
+ startPolling(): void;
34
+ stopPolling(): void;
35
+ clearAccountFrequencies(): void;
36
+ }
37
+ //# sourceMappingURL=customizedCadenceBulkAccountLoader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customizedCadenceBulkAccountLoader.d.ts","sourceRoot":"","sources":["../../../src/accounts/customizedCadenceBulkAccountLoader.ts"],"names":[],"mappings":";;AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGpE,qBAAa,kCAAmC,SAAQ,iBAAiB;IACxE,OAAO,CAAC,gBAAgB,CAAwB;IAChD,OAAO,CAAC,kBAAkB,CAAsB;IAChD,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,uBAAuB,CAAS;gBAGvC,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,UAAU,EACtB,uBAAuB,EAAE,MAAM;IAShC,OAAO,CAAC,iBAAiB;IAwBZ,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAIpB,oBAAoB;IAiB3B,yBAAyB,CAC/B,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,MAAM,GAClB,IAAI;IAOP,OAAO,CAAC,sBAAsB;IAY9B;;;;;;;;;;;;;OAaG;IACU,UAAU,CACtB,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,EAChD,sBAAsB,CAAC,EAAE,MAAM,GAC7B,OAAO,CAAC,MAAM,CAAC;IAoBX,aAAa,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAazC,iBAAiB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI;IAKtD,YAAY,IAAI,IAAI;IAiBpB,WAAW,IAAI,IAAI;IAUnB,uBAAuB,IAAI,IAAI;CAGtC"}
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CustomizedCadenceBulkAccountLoader = void 0;
4
+ const numericConstants_1 = require("../constants/numericConstants");
5
+ const bulkAccountLoader_1 = require("./bulkAccountLoader");
6
+ const uuid_1 = require("uuid");
7
+ class CustomizedCadenceBulkAccountLoader extends bulkAccountLoader_1.BulkAccountLoader {
8
+ constructor(connection, commitment, defaultPollingFrequency) {
9
+ super(connection, commitment, defaultPollingFrequency);
10
+ this.customIntervalId = null;
11
+ this.accountFrequencies = new Map();
12
+ this.lastPollingTime = new Map();
13
+ this.defaultPollingFrequency = defaultPollingFrequency;
14
+ }
15
+ getAccountsToLoad() {
16
+ const currentTime = Date.now();
17
+ const accountsToLoad = [];
18
+ for (const [key, frequency] of this.accountFrequencies.entries()) {
19
+ const lastPollTime = this.lastPollingTime.get(key) || 0;
20
+ if (currentTime - lastPollTime >= frequency) {
21
+ const account = this.accountsToLoad.get(key);
22
+ if (account) {
23
+ accountsToLoad.push(account);
24
+ this.lastPollingTime.set(key, currentTime);
25
+ }
26
+ }
27
+ }
28
+ return accountsToLoad;
29
+ }
30
+ async load() {
31
+ return this.handleAccountLoading();
32
+ }
33
+ async handleAccountLoading() {
34
+ const accounts = this.getAccountsToLoad();
35
+ if (accounts.length > 0) {
36
+ const chunks = this.chunks(this.chunks(accounts, numericConstants_1.GET_MULTIPLE_ACCOUNTS_CHUNK_SIZE), 10);
37
+ await Promise.all(chunks.map((chunk) => {
38
+ return this.loadChunk(chunk);
39
+ }));
40
+ }
41
+ }
42
+ setCustomPollingFrequency(publicKey, newFrequency) {
43
+ const key = publicKey.toBase58();
44
+ this.accountFrequencies.set(key, newFrequency);
45
+ this.lastPollingTime.set(key, 0); // Reset last polling time to ensure immediate load
46
+ this.restartPollingIfNeeded(newFrequency);
47
+ }
48
+ restartPollingIfNeeded(newFrequency) {
49
+ const currentMinFrequency = Math.min(...Array.from(this.accountFrequencies.values()), this.defaultPollingFrequency);
50
+ if (newFrequency < currentMinFrequency || !this.customIntervalId) {
51
+ this.stopPolling();
52
+ this.startPolling();
53
+ }
54
+ }
55
+ /**
56
+ * Adds an account to be monitored by the bulk account loader
57
+ * @param publicKey The public key of the account to monitor
58
+ * @param callback Function to be called when account data is received
59
+ * @param customPollingFrequency Optional custom polling frequency in ms for this specific account.
60
+ * If not provided, will use the default polling frequency
61
+ * @returns A unique callback ID that can be used to remove this specific callback later
62
+ *
63
+ * The method will:
64
+ * 1. Create a new callback mapping for the account
65
+ * 2. Set up polling frequency tracking for the account
66
+ * 3. Reset last polling time to 0 to ensure immediate data fetch
67
+ * 4. Automatically restart polling if this account needs a faster frequency than existing accounts
68
+ */
69
+ async addAccount(publicKey, callback, customPollingFrequency) {
70
+ const callbackId = (0, uuid_1.v4)();
71
+ const callbacks = new Map();
72
+ callbacks.set(callbackId, callback);
73
+ const newAccountToLoad = {
74
+ publicKey,
75
+ callbacks,
76
+ };
77
+ this.accountsToLoad.set(publicKey.toString(), newAccountToLoad);
78
+ const key = publicKey.toBase58();
79
+ const frequency = customPollingFrequency || this.defaultPollingFrequency;
80
+ this.accountFrequencies.set(key, frequency);
81
+ this.lastPollingTime.set(key, 0); // Reset last polling time to ensure immediate load
82
+ this.restartPollingIfNeeded(frequency);
83
+ return callbackId;
84
+ }
85
+ removeAccount(publicKey) {
86
+ const key = publicKey.toBase58();
87
+ this.accountFrequencies.delete(key);
88
+ this.lastPollingTime.delete(key);
89
+ if (this.accountsToLoad.size === 0) {
90
+ this.stopPolling();
91
+ }
92
+ else {
93
+ // Restart polling in case we removed the account with the smallest frequency
94
+ this.restartPollingIfNeeded(this.defaultPollingFrequency);
95
+ }
96
+ }
97
+ getAccountCadence(publicKey) {
98
+ const key = publicKey.toBase58();
99
+ return this.accountFrequencies.get(key) || null;
100
+ }
101
+ startPolling() {
102
+ if (this.customIntervalId) {
103
+ return;
104
+ }
105
+ const minFrequency = Math.min(...Array.from(this.accountFrequencies.values()), this.defaultPollingFrequency);
106
+ this.customIntervalId = setInterval(() => {
107
+ this.handleAccountLoading().catch((error) => {
108
+ console.error('Error in account loading:', error);
109
+ });
110
+ }, minFrequency);
111
+ }
112
+ stopPolling() {
113
+ super.stopPolling();
114
+ if (this.customIntervalId) {
115
+ clearInterval(this.customIntervalId);
116
+ this.customIntervalId = null;
117
+ }
118
+ this.lastPollingTime.clear();
119
+ }
120
+ clearAccountFrequencies() {
121
+ this.accountFrequencies.clear();
122
+ }
123
+ }
124
+ exports.CustomizedCadenceBulkAccountLoader = CustomizedCadenceBulkAccountLoader;
@@ -1,5 +1,5 @@
1
1
  /// <reference types="bn.js" />
2
- import { BN } from '../';
2
+ import { BN } from '@coral-xyz/anchor';
3
3
  export declare const ZERO: BN;
4
4
  export declare const ONE: BN;
5
5
  export declare const TWO: BN;
@@ -70,4 +70,5 @@ export declare const DUST_POSITION_SIZE: BN;
70
70
  export declare const FUEL_WINDOW: BN;
71
71
  export declare const FUEL_START_TS: BN;
72
72
  export declare const MAX_PREDICTION_PRICE: BN;
73
+ export declare const GET_MULTIPLE_ACCOUNTS_CHUNK_SIZE = 99;
73
74
  //# sourceMappingURL=numericConstants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"numericConstants.d.ts","sourceRoot":"","sources":["../../../src/constants/numericConstants.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"numericConstants.d.ts","sourceRoot":"","sources":["../../../src/constants/numericConstants.ts"],"names":[],"mappings":"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"}
@@ -1,52 +1,52 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MARGIN_PRECISION = exports.AMM_TIMES_PEG_TO_QUOTE_PRECISION_RATIO = exports.PRICE_TO_QUOTE_PRECISION = exports.PRICE_DIV_PEG = exports.AMM_TO_QUOTE_PRECISION_RATIO = exports.BASE_PRECISION_EXP = exports.BASE_PRECISION = exports.AMM_RESERVE_PRECISION = exports.PEG_PRECISION = exports.FUNDING_RATE_BUFFER_PRECISION = exports.FUNDING_RATE_PRECISION = exports.PRICE_PRECISION = exports.QUOTE_PRECISION = exports.LIQUIDATION_FEE_PRECISION = exports.SPOT_MARKET_IMF_PRECISION = exports.SPOT_MARKET_IMF_PRECISION_EXP = exports.SPOT_MARKET_BALANCE_PRECISION = exports.SPOT_MARKET_BALANCE_PRECISION_EXP = exports.SPOT_MARKET_WEIGHT_PRECISION = exports.SPOT_MARKET_UTILIZATION_PRECISION = exports.SPOT_MARKET_UTILIZATION_PRECISION_EXP = exports.SPOT_MARKET_CUMULATIVE_INTEREST_PRECISION = exports.SPOT_MARKET_CUMULATIVE_INTEREST_PRECISION_EXP = exports.SPOT_MARKET_RATE_PRECISION = exports.SPOT_MARKET_RATE_PRECISION_EXP = exports.AMM_RESERVE_PRECISION_EXP = exports.PEG_PRECISION_EXP = exports.FUNDING_RATE_PRECISION_EXP = exports.PRICE_PRECISION_EXP = exports.FUNDING_RATE_BUFFER_PRECISION_EXP = exports.QUOTE_PRECISION_EXP = exports.CONCENTRATION_PRECISION = exports.PERCENTAGE_PRECISION = exports.PERCENTAGE_PRECISION_EXP = exports.MAX_LEVERAGE_ORDER_SIZE = exports.MAX_LEVERAGE = exports.TEN_MILLION = exports.BN_MAX = exports.TEN_THOUSAND = exports.TEN = exports.NINE = exports.EIGHT = exports.SEVEN = exports.SIX = exports.FIVE = exports.FOUR = exports.THREE = exports.TWO = exports.ONE = exports.ZERO = void 0;
4
- exports.MAX_PREDICTION_PRICE = exports.FUEL_START_TS = exports.FUEL_WINDOW = exports.DUST_POSITION_SIZE = exports.SLOT_TIME_ESTIMATE_MS = exports.IDLE_TIME_SLOTS = exports.ACCOUNT_AGE_DELETION_CUTOFF_SECONDS = exports.DEFAULT_REVENUE_SINCE_LAST_FUNDING_SPREAD_RETREAT = exports.OPEN_ORDER_MARGIN_REQUIREMENT = exports.LAMPORTS_EXP = exports.LAMPORTS_PRECISION = exports.GOV_SPOT_MARKET_INDEX = exports.QUOTE_SPOT_MARKET_INDEX = exports.ONE_YEAR = exports.ONE_HOUR = exports.FIVE_MINUTE = exports.PRICE_TIMES_AMM_TO_QUOTE_PRECISION_RATIO = exports.FUNDING_RATE_OFFSET_DENOMINATOR = exports.LIQUIDATION_PCT_PRECISION = exports.BID_ASK_SPREAD_PRECISION = void 0;
4
+ exports.GET_MULTIPLE_ACCOUNTS_CHUNK_SIZE = exports.MAX_PREDICTION_PRICE = exports.FUEL_START_TS = exports.FUEL_WINDOW = exports.DUST_POSITION_SIZE = exports.SLOT_TIME_ESTIMATE_MS = exports.IDLE_TIME_SLOTS = exports.ACCOUNT_AGE_DELETION_CUTOFF_SECONDS = exports.DEFAULT_REVENUE_SINCE_LAST_FUNDING_SPREAD_RETREAT = exports.OPEN_ORDER_MARGIN_REQUIREMENT = exports.LAMPORTS_EXP = exports.LAMPORTS_PRECISION = exports.GOV_SPOT_MARKET_INDEX = exports.QUOTE_SPOT_MARKET_INDEX = exports.ONE_YEAR = exports.ONE_HOUR = exports.FIVE_MINUTE = exports.PRICE_TIMES_AMM_TO_QUOTE_PRECISION_RATIO = exports.FUNDING_RATE_OFFSET_DENOMINATOR = exports.LIQUIDATION_PCT_PRECISION = exports.BID_ASK_SPREAD_PRECISION = void 0;
5
5
  const web3_js_1 = require("@solana/web3.js");
6
- const __1 = require("../");
7
- exports.ZERO = new __1.BN(0);
8
- exports.ONE = new __1.BN(1);
9
- exports.TWO = new __1.BN(2);
10
- exports.THREE = new __1.BN(3);
11
- exports.FOUR = new __1.BN(4);
12
- exports.FIVE = new __1.BN(5);
13
- exports.SIX = new __1.BN(6);
14
- exports.SEVEN = new __1.BN(7);
15
- exports.EIGHT = new __1.BN(8);
16
- exports.NINE = new __1.BN(9);
17
- exports.TEN = new __1.BN(10);
18
- exports.TEN_THOUSAND = new __1.BN(10000);
19
- exports.BN_MAX = new __1.BN(Number.MAX_SAFE_INTEGER);
6
+ const anchor_1 = require("@coral-xyz/anchor");
7
+ exports.ZERO = new anchor_1.BN(0);
8
+ exports.ONE = new anchor_1.BN(1);
9
+ exports.TWO = new anchor_1.BN(2);
10
+ exports.THREE = new anchor_1.BN(3);
11
+ exports.FOUR = new anchor_1.BN(4);
12
+ exports.FIVE = new anchor_1.BN(5);
13
+ exports.SIX = new anchor_1.BN(6);
14
+ exports.SEVEN = new anchor_1.BN(7);
15
+ exports.EIGHT = new anchor_1.BN(8);
16
+ exports.NINE = new anchor_1.BN(9);
17
+ exports.TEN = new anchor_1.BN(10);
18
+ exports.TEN_THOUSAND = new anchor_1.BN(10000);
19
+ exports.BN_MAX = new anchor_1.BN(Number.MAX_SAFE_INTEGER);
20
20
  exports.TEN_MILLION = exports.TEN_THOUSAND.mul(exports.TEN_THOUSAND);
21
- exports.MAX_LEVERAGE = new __1.BN(5);
22
- exports.MAX_LEVERAGE_ORDER_SIZE = new __1.BN('18446744073709551615');
23
- exports.PERCENTAGE_PRECISION_EXP = new __1.BN(6);
24
- exports.PERCENTAGE_PRECISION = new __1.BN(10).pow(exports.PERCENTAGE_PRECISION_EXP);
21
+ exports.MAX_LEVERAGE = new anchor_1.BN(5);
22
+ exports.MAX_LEVERAGE_ORDER_SIZE = new anchor_1.BN('18446744073709551615');
23
+ exports.PERCENTAGE_PRECISION_EXP = new anchor_1.BN(6);
24
+ exports.PERCENTAGE_PRECISION = new anchor_1.BN(10).pow(exports.PERCENTAGE_PRECISION_EXP);
25
25
  exports.CONCENTRATION_PRECISION = exports.PERCENTAGE_PRECISION;
26
- exports.QUOTE_PRECISION_EXP = new __1.BN(6);
27
- exports.FUNDING_RATE_BUFFER_PRECISION_EXP = new __1.BN(3);
28
- exports.PRICE_PRECISION_EXP = new __1.BN(6);
26
+ exports.QUOTE_PRECISION_EXP = new anchor_1.BN(6);
27
+ exports.FUNDING_RATE_BUFFER_PRECISION_EXP = new anchor_1.BN(3);
28
+ exports.PRICE_PRECISION_EXP = new anchor_1.BN(6);
29
29
  exports.FUNDING_RATE_PRECISION_EXP = exports.PRICE_PRECISION_EXP.add(exports.FUNDING_RATE_BUFFER_PRECISION_EXP);
30
- exports.PEG_PRECISION_EXP = new __1.BN(6);
31
- exports.AMM_RESERVE_PRECISION_EXP = new __1.BN(9);
32
- exports.SPOT_MARKET_RATE_PRECISION_EXP = new __1.BN(6);
33
- exports.SPOT_MARKET_RATE_PRECISION = new __1.BN(10).pow(exports.SPOT_MARKET_RATE_PRECISION_EXP);
34
- exports.SPOT_MARKET_CUMULATIVE_INTEREST_PRECISION_EXP = new __1.BN(10);
35
- exports.SPOT_MARKET_CUMULATIVE_INTEREST_PRECISION = new __1.BN(10).pow(exports.SPOT_MARKET_CUMULATIVE_INTEREST_PRECISION_EXP);
36
- exports.SPOT_MARKET_UTILIZATION_PRECISION_EXP = new __1.BN(6);
37
- exports.SPOT_MARKET_UTILIZATION_PRECISION = new __1.BN(10).pow(exports.SPOT_MARKET_UTILIZATION_PRECISION_EXP);
38
- exports.SPOT_MARKET_WEIGHT_PRECISION = new __1.BN(10000);
39
- exports.SPOT_MARKET_BALANCE_PRECISION_EXP = new __1.BN(9);
40
- exports.SPOT_MARKET_BALANCE_PRECISION = new __1.BN(10).pow(exports.SPOT_MARKET_BALANCE_PRECISION_EXP);
41
- exports.SPOT_MARKET_IMF_PRECISION_EXP = new __1.BN(6);
42
- exports.SPOT_MARKET_IMF_PRECISION = new __1.BN(10).pow(exports.SPOT_MARKET_IMF_PRECISION_EXP);
43
- exports.LIQUIDATION_FEE_PRECISION = new __1.BN(1000000);
44
- exports.QUOTE_PRECISION = new __1.BN(10).pow(exports.QUOTE_PRECISION_EXP);
45
- exports.PRICE_PRECISION = new __1.BN(10).pow(exports.PRICE_PRECISION_EXP);
46
- exports.FUNDING_RATE_PRECISION = new __1.BN(10).pow(exports.FUNDING_RATE_PRECISION_EXP);
47
- exports.FUNDING_RATE_BUFFER_PRECISION = new __1.BN(10).pow(exports.FUNDING_RATE_BUFFER_PRECISION_EXP);
48
- exports.PEG_PRECISION = new __1.BN(10).pow(exports.PEG_PRECISION_EXP);
49
- exports.AMM_RESERVE_PRECISION = new __1.BN(10).pow(exports.AMM_RESERVE_PRECISION_EXP);
30
+ exports.PEG_PRECISION_EXP = new anchor_1.BN(6);
31
+ exports.AMM_RESERVE_PRECISION_EXP = new anchor_1.BN(9);
32
+ exports.SPOT_MARKET_RATE_PRECISION_EXP = new anchor_1.BN(6);
33
+ exports.SPOT_MARKET_RATE_PRECISION = new anchor_1.BN(10).pow(exports.SPOT_MARKET_RATE_PRECISION_EXP);
34
+ exports.SPOT_MARKET_CUMULATIVE_INTEREST_PRECISION_EXP = new anchor_1.BN(10);
35
+ exports.SPOT_MARKET_CUMULATIVE_INTEREST_PRECISION = new anchor_1.BN(10).pow(exports.SPOT_MARKET_CUMULATIVE_INTEREST_PRECISION_EXP);
36
+ exports.SPOT_MARKET_UTILIZATION_PRECISION_EXP = new anchor_1.BN(6);
37
+ exports.SPOT_MARKET_UTILIZATION_PRECISION = new anchor_1.BN(10).pow(exports.SPOT_MARKET_UTILIZATION_PRECISION_EXP);
38
+ exports.SPOT_MARKET_WEIGHT_PRECISION = new anchor_1.BN(10000);
39
+ exports.SPOT_MARKET_BALANCE_PRECISION_EXP = new anchor_1.BN(9);
40
+ exports.SPOT_MARKET_BALANCE_PRECISION = new anchor_1.BN(10).pow(exports.SPOT_MARKET_BALANCE_PRECISION_EXP);
41
+ exports.SPOT_MARKET_IMF_PRECISION_EXP = new anchor_1.BN(6);
42
+ exports.SPOT_MARKET_IMF_PRECISION = new anchor_1.BN(10).pow(exports.SPOT_MARKET_IMF_PRECISION_EXP);
43
+ exports.LIQUIDATION_FEE_PRECISION = new anchor_1.BN(1000000);
44
+ exports.QUOTE_PRECISION = new anchor_1.BN(10).pow(exports.QUOTE_PRECISION_EXP);
45
+ exports.PRICE_PRECISION = new anchor_1.BN(10).pow(exports.PRICE_PRECISION_EXP);
46
+ exports.FUNDING_RATE_PRECISION = new anchor_1.BN(10).pow(exports.FUNDING_RATE_PRECISION_EXP);
47
+ exports.FUNDING_RATE_BUFFER_PRECISION = new anchor_1.BN(10).pow(exports.FUNDING_RATE_BUFFER_PRECISION_EXP);
48
+ exports.PEG_PRECISION = new anchor_1.BN(10).pow(exports.PEG_PRECISION_EXP);
49
+ exports.AMM_RESERVE_PRECISION = new anchor_1.BN(10).pow(exports.AMM_RESERVE_PRECISION_EXP);
50
50
  exports.BASE_PRECISION = exports.AMM_RESERVE_PRECISION;
51
51
  exports.BASE_PRECISION_EXP = exports.AMM_RESERVE_PRECISION_EXP;
52
52
  exports.AMM_TO_QUOTE_PRECISION_RATIO = exports.AMM_RESERVE_PRECISION.div(exports.QUOTE_PRECISION); // 10^3
@@ -54,23 +54,24 @@ exports.PRICE_DIV_PEG = exports.PRICE_PRECISION.div(exports.PEG_PRECISION); //10
54
54
  exports.PRICE_TO_QUOTE_PRECISION = exports.PRICE_PRECISION.div(exports.QUOTE_PRECISION); // 10^1
55
55
  exports.AMM_TIMES_PEG_TO_QUOTE_PRECISION_RATIO = exports.AMM_RESERVE_PRECISION.mul(exports.PEG_PRECISION).div(exports.QUOTE_PRECISION); // 10^9
56
56
  exports.MARGIN_PRECISION = exports.TEN_THOUSAND;
57
- exports.BID_ASK_SPREAD_PRECISION = new __1.BN(1000000); // 10^6
57
+ exports.BID_ASK_SPREAD_PRECISION = new anchor_1.BN(1000000); // 10^6
58
58
  exports.LIQUIDATION_PCT_PRECISION = exports.TEN_THOUSAND;
59
- exports.FUNDING_RATE_OFFSET_DENOMINATOR = new __1.BN(5000);
59
+ exports.FUNDING_RATE_OFFSET_DENOMINATOR = new anchor_1.BN(5000);
60
60
  exports.PRICE_TIMES_AMM_TO_QUOTE_PRECISION_RATIO = exports.PRICE_PRECISION.mul(exports.AMM_TO_QUOTE_PRECISION_RATIO);
61
- exports.FIVE_MINUTE = new __1.BN(60 * 5);
62
- exports.ONE_HOUR = new __1.BN(60 * 60);
63
- exports.ONE_YEAR = new __1.BN(31536000);
61
+ exports.FIVE_MINUTE = new anchor_1.BN(60 * 5);
62
+ exports.ONE_HOUR = new anchor_1.BN(60 * 60);
63
+ exports.ONE_YEAR = new anchor_1.BN(31536000);
64
64
  exports.QUOTE_SPOT_MARKET_INDEX = 0;
65
65
  exports.GOV_SPOT_MARKET_INDEX = 15;
66
- exports.LAMPORTS_PRECISION = new __1.BN(web3_js_1.LAMPORTS_PER_SOL);
67
- exports.LAMPORTS_EXP = new __1.BN(Math.log10(web3_js_1.LAMPORTS_PER_SOL));
68
- exports.OPEN_ORDER_MARGIN_REQUIREMENT = exports.QUOTE_PRECISION.div(new __1.BN(100));
69
- exports.DEFAULT_REVENUE_SINCE_LAST_FUNDING_SPREAD_RETREAT = new __1.BN(-25).mul(exports.QUOTE_PRECISION);
66
+ exports.LAMPORTS_PRECISION = new anchor_1.BN(web3_js_1.LAMPORTS_PER_SOL);
67
+ exports.LAMPORTS_EXP = new anchor_1.BN(Math.log10(web3_js_1.LAMPORTS_PER_SOL));
68
+ exports.OPEN_ORDER_MARGIN_REQUIREMENT = exports.QUOTE_PRECISION.div(new anchor_1.BN(100));
69
+ exports.DEFAULT_REVENUE_SINCE_LAST_FUNDING_SPREAD_RETREAT = new anchor_1.BN(-25).mul(exports.QUOTE_PRECISION);
70
70
  exports.ACCOUNT_AGE_DELETION_CUTOFF_SECONDS = 60 * 60 * 24 * 13; // 13 days
71
71
  exports.IDLE_TIME_SLOTS = 9000;
72
72
  exports.SLOT_TIME_ESTIMATE_MS = 400;
73
73
  exports.DUST_POSITION_SIZE = exports.QUOTE_PRECISION.divn(100); // Dust position is any position smaller than 1c
74
- exports.FUEL_WINDOW = new __1.BN(60 * 60 * 24 * 28); // 28 days
75
- exports.FUEL_START_TS = new __1.BN(1723147200); // unix timestamp
74
+ exports.FUEL_WINDOW = new anchor_1.BN(60 * 60 * 24 * 28); // 28 days
75
+ exports.FUEL_START_TS = new anchor_1.BN(1723147200); // unix timestamp
76
76
  exports.MAX_PREDICTION_PRICE = exports.PRICE_PRECISION;
77
+ exports.GET_MULTIPLE_ACCOUNTS_CHUNK_SIZE = 99;
@@ -14,6 +14,7 @@ export * from './accounts/webSocketHighLeverageModeConfigAccountSubscriber';
14
14
  export * from './accounts/bulkAccountLoader';
15
15
  export * from './accounts/bulkUserSubscription';
16
16
  export * from './accounts/bulkUserStatsSubscription';
17
+ export { CustomizedCadenceBulkAccountLoader } from './accounts/customizedCadenceBulkAccountLoader';
17
18
  export * from './accounts/pollingDriftClientAccountSubscriber';
18
19
  export * from './accounts/pollingOracleAccountSubscriber';
19
20
  export * from './accounts/pollingTokenAccountSubscriber';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,IAAI,MAAM,qBAAqB,CAAC;AAEvC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,SAAS,CAAC;AACxB,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kDAAkD,CAAC;AACjE,cAAc,yDAAyD,CAAC;AACxE,cAAc,6DAA6D,CAAC;AAC5E,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,sCAAsC,CAAC;AACrD,cAAc,gDAAgD,CAAC;AAC/D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,0CAA0C,CAAC;AACzD,cAAc,yCAAyC,CAAC;AACxD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,uDAAuD,CAAC;AACtE,cAAc,2DAA2D,CAAC;AAC1E,cAAc,uCAAuC,CAAC;AACtD,cAAc,yCAAyC,CAAC;AACxD,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,mCAAmC,CAAC;AAClD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,eAAe,CAAC;AAC9B,cAAc,uCAAuC,CAAC;AACtD,cAAc,iCAAiC,CAAC;AAChD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qCAAqC,CAAC;AACpD,cAAc,oBAAoB,CAAC;AACnC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wCAAwC,CAAC;AACvD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uCAAuC,CAAC;AACtD,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,4CAA4C,CAAC;AAE3D,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
package/lib/node/index.js CHANGED
@@ -17,7 +17,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
17
17
  return (mod && mod.__esModule) ? mod : { "default": mod };
18
18
  };
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.pyth = exports.PublicKey = exports.BN = void 0;
20
+ exports.pyth = exports.PublicKey = exports.BN = exports.CustomizedCadenceBulkAccountLoader = void 0;
21
21
  const anchor_1 = require("@coral-xyz/anchor");
22
22
  Object.defineProperty(exports, "BN", { enumerable: true, get: function () { return anchor_1.BN; } });
23
23
  const web3_js_1 = require("@solana/web3.js");
@@ -37,6 +37,8 @@ __exportStar(require("./accounts/webSocketHighLeverageModeConfigAccountSubscribe
37
37
  __exportStar(require("./accounts/bulkAccountLoader"), exports);
38
38
  __exportStar(require("./accounts/bulkUserSubscription"), exports);
39
39
  __exportStar(require("./accounts/bulkUserStatsSubscription"), exports);
40
+ var customizedCadenceBulkAccountLoader_1 = require("./accounts/customizedCadenceBulkAccountLoader");
41
+ Object.defineProperty(exports, "CustomizedCadenceBulkAccountLoader", { enumerable: true, get: function () { return customizedCadenceBulkAccountLoader_1.CustomizedCadenceBulkAccountLoader; } });
40
42
  __exportStar(require("./accounts/pollingDriftClientAccountSubscriber"), exports);
41
43
  __exportStar(require("./accounts/pollingOracleAccountSubscriber"), exports);
42
44
  __exportStar(require("./accounts/pollingTokenAccountSubscriber"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@drift-labs/sdk-browser",
3
- "version": "2.124.0-beta.4",
3
+ "version": "2.124.0-beta.5",
4
4
  "main": "lib/node/index.js",
5
5
  "types": "lib/node/index.d.ts",
6
6
  "browser": "./lib/browser/index.js",
@@ -3,14 +3,13 @@ import { v4 as uuidv4 } from 'uuid';
3
3
  import { BufferAndSlot } from './types';
4
4
  import { promiseTimeout } from '../util/promiseTimeout';
5
5
  import { Connection } from '../bankrun/bankrunConnection';
6
+ import { GET_MULTIPLE_ACCOUNTS_CHUNK_SIZE } from '../constants/numericConstants';
6
7
 
7
8
  export type AccountToLoad = {
8
9
  publicKey: PublicKey;
9
10
  callbacks: Map<string, (buffer: Buffer, slot: number) => void>;
10
11
  };
11
12
 
12
- const GET_MULTIPLE_ACCOUNTS_CHUNK_SIZE = 99;
13
-
14
13
  const oneMinute = 60 * 1000;
15
14
 
16
15
  export class BulkAccountLoader {
@@ -0,0 +1,177 @@
1
+ import { GET_MULTIPLE_ACCOUNTS_CHUNK_SIZE } from '../constants/numericConstants';
2
+ import { BulkAccountLoader } from './bulkAccountLoader';
3
+ import { Commitment, Connection, PublicKey } from '@solana/web3.js';
4
+ import { v4 as uuidv4 } from 'uuid';
5
+
6
+ export class CustomizedCadenceBulkAccountLoader extends BulkAccountLoader {
7
+ private customIntervalId: NodeJS.Timeout | null;
8
+ private accountFrequencies: Map<string, number>;
9
+ private lastPollingTime: Map<string, number>;
10
+ private defaultPollingFrequency: number;
11
+
12
+ constructor(
13
+ connection: Connection,
14
+ commitment: Commitment,
15
+ defaultPollingFrequency: number
16
+ ) {
17
+ super(connection, commitment, defaultPollingFrequency);
18
+ this.customIntervalId = null;
19
+ this.accountFrequencies = new Map();
20
+ this.lastPollingTime = new Map();
21
+ this.defaultPollingFrequency = defaultPollingFrequency;
22
+ }
23
+
24
+ private getAccountsToLoad(): Array<{
25
+ publicKey: PublicKey;
26
+ callbacks: Map<string, (buffer: Buffer, slot: number) => void>;
27
+ }> {
28
+ const currentTime = Date.now();
29
+ const accountsToLoad: Array<{
30
+ publicKey: PublicKey;
31
+ callbacks: Map<string, (buffer: Buffer, slot: number) => void>;
32
+ }> = [];
33
+
34
+ for (const [key, frequency] of this.accountFrequencies.entries()) {
35
+ const lastPollTime = this.lastPollingTime.get(key) || 0;
36
+ if (currentTime - lastPollTime >= frequency) {
37
+ const account = this.accountsToLoad.get(key);
38
+ if (account) {
39
+ accountsToLoad.push(account);
40
+ this.lastPollingTime.set(key, currentTime);
41
+ }
42
+ }
43
+ }
44
+
45
+ return accountsToLoad;
46
+ }
47
+
48
+ public async load(): Promise<void> {
49
+ return this.handleAccountLoading();
50
+ }
51
+
52
+ private async handleAccountLoading(): Promise<void> {
53
+ const accounts = this.getAccountsToLoad();
54
+
55
+ if (accounts.length > 0) {
56
+ const chunks = this.chunks(
57
+ this.chunks(accounts, GET_MULTIPLE_ACCOUNTS_CHUNK_SIZE),
58
+ 10
59
+ );
60
+
61
+ await Promise.all(
62
+ chunks.map((chunk) => {
63
+ return this.loadChunk(chunk);
64
+ })
65
+ );
66
+ }
67
+ }
68
+
69
+ public setCustomPollingFrequency(
70
+ publicKey: PublicKey,
71
+ newFrequency: number
72
+ ): void {
73
+ const key = publicKey.toBase58();
74
+ this.accountFrequencies.set(key, newFrequency);
75
+ this.lastPollingTime.set(key, 0); // Reset last polling time to ensure immediate load
76
+ this.restartPollingIfNeeded(newFrequency);
77
+ }
78
+
79
+ private restartPollingIfNeeded(newFrequency: number): void {
80
+ const currentMinFrequency = Math.min(
81
+ ...Array.from(this.accountFrequencies.values()),
82
+ this.defaultPollingFrequency
83
+ );
84
+
85
+ if (newFrequency < currentMinFrequency || !this.customIntervalId) {
86
+ this.stopPolling();
87
+ this.startPolling();
88
+ }
89
+ }
90
+
91
+ /**
92
+ * Adds an account to be monitored by the bulk account loader
93
+ * @param publicKey The public key of the account to monitor
94
+ * @param callback Function to be called when account data is received
95
+ * @param customPollingFrequency Optional custom polling frequency in ms for this specific account.
96
+ * If not provided, will use the default polling frequency
97
+ * @returns A unique callback ID that can be used to remove this specific callback later
98
+ *
99
+ * The method will:
100
+ * 1. Create a new callback mapping for the account
101
+ * 2. Set up polling frequency tracking for the account
102
+ * 3. Reset last polling time to 0 to ensure immediate data fetch
103
+ * 4. Automatically restart polling if this account needs a faster frequency than existing accounts
104
+ */
105
+ public async addAccount(
106
+ publicKey: PublicKey,
107
+ callback: (buffer: Buffer, slot: number) => void,
108
+ customPollingFrequency?: number
109
+ ): Promise<string> {
110
+ const callbackId = uuidv4();
111
+ const callbacks = new Map<string, (buffer: Buffer, slot: number) => void>();
112
+ callbacks.set(callbackId, callback);
113
+ const newAccountToLoad = {
114
+ publicKey,
115
+ callbacks,
116
+ };
117
+ this.accountsToLoad.set(publicKey.toString(), newAccountToLoad);
118
+
119
+ const key = publicKey.toBase58();
120
+ const frequency = customPollingFrequency || this.defaultPollingFrequency;
121
+ this.accountFrequencies.set(key, frequency);
122
+ this.lastPollingTime.set(key, 0); // Reset last polling time to ensure immediate load
123
+
124
+ this.restartPollingIfNeeded(frequency);
125
+
126
+ return callbackId;
127
+ }
128
+
129
+ public removeAccount(publicKey: PublicKey): void {
130
+ const key = publicKey.toBase58();
131
+ this.accountFrequencies.delete(key);
132
+ this.lastPollingTime.delete(key);
133
+
134
+ if (this.accountsToLoad.size === 0) {
135
+ this.stopPolling();
136
+ } else {
137
+ // Restart polling in case we removed the account with the smallest frequency
138
+ this.restartPollingIfNeeded(this.defaultPollingFrequency);
139
+ }
140
+ }
141
+
142
+ public getAccountCadence(publicKey: PublicKey): number | null {
143
+ const key = publicKey.toBase58();
144
+ return this.accountFrequencies.get(key) || null;
145
+ }
146
+
147
+ public startPolling(): void {
148
+ if (this.customIntervalId) {
149
+ return;
150
+ }
151
+
152
+ const minFrequency = Math.min(
153
+ ...Array.from(this.accountFrequencies.values()),
154
+ this.defaultPollingFrequency
155
+ );
156
+
157
+ this.customIntervalId = setInterval(() => {
158
+ this.handleAccountLoading().catch((error) => {
159
+ console.error('Error in account loading:', error);
160
+ });
161
+ }, minFrequency);
162
+ }
163
+
164
+ public stopPolling(): void {
165
+ super.stopPolling();
166
+
167
+ if (this.customIntervalId) {
168
+ clearInterval(this.customIntervalId);
169
+ this.customIntervalId = null;
170
+ }
171
+ this.lastPollingTime.clear();
172
+ }
173
+
174
+ public clearAccountFrequencies(): void {
175
+ this.accountFrequencies.clear();
176
+ }
177
+ }
@@ -1,5 +1,5 @@
1
1
  import { LAMPORTS_PER_SOL } from '@solana/web3.js';
2
- import { BN } from '../';
2
+ import { BN } from '@coral-xyz/anchor';
3
3
 
4
4
  export const ZERO = new BN(0);
5
5
  export const ONE = new BN(1);
@@ -114,3 +114,5 @@ export const FUEL_WINDOW = new BN(60 * 60 * 24 * 28); // 28 days
114
114
  export const FUEL_START_TS = new BN(1723147200); // unix timestamp
115
115
 
116
116
  export const MAX_PREDICTION_PRICE = PRICE_PRECISION;
117
+
118
+ export const GET_MULTIPLE_ACCOUNTS_CHUNK_SIZE = 99;
package/src/index.ts CHANGED
@@ -15,6 +15,7 @@ export * from './accounts/webSocketHighLeverageModeConfigAccountSubscriber';
15
15
  export * from './accounts/bulkAccountLoader';
16
16
  export * from './accounts/bulkUserSubscription';
17
17
  export * from './accounts/bulkUserStatsSubscription';
18
+ export { CustomizedCadenceBulkAccountLoader } from './accounts/customizedCadenceBulkAccountLoader';
18
19
  export * from './accounts/pollingDriftClientAccountSubscriber';
19
20
  export * from './accounts/pollingOracleAccountSubscriber';
20
21
  export * from './accounts/pollingTokenAccountSubscriber';
@@ -0,0 +1,202 @@
1
+ import { Connection, Keypair, PublicKey } from '@solana/web3.js';
2
+ import { CustomizedCadenceBulkAccountLoader } from '../../src/accounts/customizedCadenceBulkAccountLoader';
3
+ import { expect } from 'chai';
4
+
5
+ describe('CustomizedCadenceBulkAccountLoader', () => {
6
+ let connection: Connection;
7
+ let loader: CustomizedCadenceBulkAccountLoader;
8
+ const defaultPollingFrequency = 1000;
9
+
10
+ beforeEach(() => {
11
+ connection = {
12
+ _rpcBatchRequest: async () => {
13
+ return Promise.resolve([
14
+ {
15
+ result: {
16
+ context: { slot: 1 },
17
+ value: Array(10)
18
+ .fill(null)
19
+ .map(() => ({
20
+ data: [
21
+ Buffer.from(Math.random().toString()).toString('base64'),
22
+ 'base64',
23
+ ],
24
+ })),
25
+ },
26
+ },
27
+ ]);
28
+ },
29
+ } as unknown as Connection;
30
+ loader = new CustomizedCadenceBulkAccountLoader(
31
+ connection,
32
+ 'processed',
33
+ defaultPollingFrequency
34
+ );
35
+ });
36
+
37
+ afterEach(() => {
38
+ loader.stopPolling();
39
+ });
40
+
41
+ it('should add account with custom polling frequency', async () => {
42
+ const pubkey = new PublicKey(Keypair.generate().publicKey);
43
+ const customFrequency = 500;
44
+ const callback = () => {}; // Empty spy function for mocha
45
+
46
+ const id = await loader.addAccount(pubkey, callback, customFrequency);
47
+
48
+ expect(id).to.exist;
49
+ expect(loader.getAccountCadence(pubkey)).to.equal(customFrequency);
50
+ });
51
+
52
+ it('should remove account and clean up polling', async () => {
53
+ const pubkey = new PublicKey(Keypair.generate().publicKey);
54
+ const customFrequency = 500;
55
+ const callback = () => {};
56
+
57
+ await loader.addAccount(pubkey, callback, customFrequency);
58
+ loader.removeAccount(pubkey);
59
+
60
+ expect(loader.getAccountCadence(pubkey)).to.equal(null);
61
+ });
62
+
63
+ it('should update custom polling frequency', async () => {
64
+ const pubkey = new PublicKey(Keypair.generate().publicKey);
65
+ const initialFrequency = 500;
66
+ const newFrequency = 200;
67
+ const callback = () => {};
68
+
69
+ await loader.addAccount(pubkey, callback, initialFrequency);
70
+ loader.setCustomPollingFrequency(pubkey, newFrequency);
71
+
72
+ expect(loader.getAccountCadence(pubkey)).to.equal(newFrequency);
73
+ });
74
+
75
+ it('should use default polling frequency when no custom frequency provided', async () => {
76
+ const pubkey = new PublicKey(Keypair.generate().publicKey);
77
+ const callback = () => {};
78
+
79
+ await loader.addAccount(pubkey, callback);
80
+
81
+ expect(loader.getAccountCadence(pubkey)).to.equal(defaultPollingFrequency);
82
+ });
83
+
84
+ it('should clear all polling on clearAccountFrequencies', async () => {
85
+ const pubkey1 = new PublicKey(Keypair.generate().publicKey);
86
+ const pubkey2 = new PublicKey(Keypair.generate().publicKey);
87
+ const callback = () => {};
88
+
89
+ await loader.addAccount(pubkey1, callback, 500);
90
+ await loader.addAccount(pubkey2, callback, 1000);
91
+ loader.clearAccountFrequencies();
92
+
93
+ expect(loader.getAccountCadence(pubkey1)).to.equal(null);
94
+ expect(loader.getAccountCadence(pubkey2)).to.equal(null);
95
+ });
96
+
97
+ it('should remove key from previous polling group when setting new frequency', async () => {
98
+ const pubkey = new PublicKey(Keypair.generate().publicKey);
99
+ const pubkey2 = new PublicKey(Keypair.generate().publicKey);
100
+ const pubkey3 = new PublicKey(Keypair.generate().publicKey);
101
+ const initialFrequency = 500;
102
+ const newFrequency = 1000;
103
+ const callback = () => {};
104
+
105
+ // Add accounts with initial frequency
106
+ await loader.addAccount(pubkey, callback, initialFrequency);
107
+ await loader.addAccount(pubkey2, callback, initialFrequency);
108
+ await loader.addAccount(pubkey3, callback, initialFrequency);
109
+
110
+ // Verify they're all in the initial frequency group
111
+ expect(loader.getAccountCadence(pubkey)).to.equal(initialFrequency);
112
+ expect(loader.getAccountCadence(pubkey2)).to.equal(initialFrequency);
113
+ expect(loader.getAccountCadence(pubkey3)).to.equal(initialFrequency);
114
+
115
+ // Change polling frequency for first pubkey only
116
+ loader.setCustomPollingFrequency(pubkey, newFrequency);
117
+
118
+ // Verify first pubkey is updated to new frequency
119
+ expect(loader.getAccountCadence(pubkey)).to.equal(newFrequency);
120
+
121
+ // Verify other pubkeys remain in initial group
122
+ expect(loader.getAccountCadence(pubkey2)).to.equal(initialFrequency);
123
+ expect(loader.getAccountCadence(pubkey3)).to.equal(initialFrequency);
124
+ });
125
+
126
+ it('accounts in different polling groups fire at appropriate intervals', async () => {
127
+ const loader = new CustomizedCadenceBulkAccountLoader(
128
+ connection,
129
+ 'processed',
130
+ 1000
131
+ );
132
+
133
+ // Create test accounts and callbacks with counters
134
+ const oneSecGroupPubkey = new PublicKey(Keypair.generate().publicKey);
135
+ const oneSecGroup = {
136
+ pubkey: oneSecGroupPubkey,
137
+ callCount: 0,
138
+ };
139
+
140
+ const threeSecGroup = Array.from({ length: 5 }, () => ({
141
+ pubkey: new PublicKey(Keypair.generate().publicKey),
142
+ callCount: 0,
143
+ }));
144
+
145
+ const fourSecGroup = Array.from({ length: 10 }, () => ({
146
+ pubkey: new PublicKey(Keypair.generate().publicKey),
147
+ callCount: 0,
148
+ }));
149
+
150
+ // Add accounts with different frequencies
151
+ await loader.addAccount(
152
+ oneSecGroup.pubkey,
153
+ () => {
154
+ oneSecGroup.callCount += 1;
155
+ },
156
+ 1000
157
+ );
158
+
159
+ for (const account of threeSecGroup) {
160
+ await loader.addAccount(
161
+ account.pubkey,
162
+ () => {
163
+ account.callCount++;
164
+ },
165
+ 3000
166
+ );
167
+ }
168
+
169
+ for (const account of fourSecGroup) {
170
+ await loader.addAccount(
171
+ account.pubkey,
172
+ () => {
173
+ account.callCount++;
174
+ },
175
+ 4000
176
+ );
177
+ }
178
+
179
+ loader.startPolling();
180
+
181
+ // Wait for 6 seconds to allow multiple intervals to fire
182
+ await new Promise((resolve) => setTimeout(resolve, 4500));
183
+
184
+ // 1s group should have fired ~4 times
185
+ expect(oneSecGroup.callCount).to.be.greaterThanOrEqual(3);
186
+ expect(oneSecGroup.callCount).to.be.lessThanOrEqual(5);
187
+
188
+ // 3s group should have fired ~2 times
189
+ for (const account of threeSecGroup) {
190
+ expect(account.callCount).to.be.greaterThanOrEqual(1);
191
+ expect(account.callCount).to.be.lessThanOrEqual(3);
192
+ }
193
+
194
+ // 5s group should have fired ~1 time
195
+ for (const account of fourSecGroup) {
196
+ expect(account.callCount).to.be.greaterThanOrEqual(1);
197
+ expect(account.callCount).to.be.lessThanOrEqual(2);
198
+ }
199
+
200
+ loader.stopPolling();
201
+ });
202
+ });