@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 +1 -1
- package/lib/browser/accounts/bulkAccountLoader.js +2 -2
- package/lib/browser/accounts/customizedCadenceBulkAccountLoader.d.ts +36 -0
- package/lib/browser/accounts/customizedCadenceBulkAccountLoader.js +124 -0
- package/lib/browser/constants/numericConstants.d.ts +2 -1
- package/lib/browser/constants/numericConstants.js +54 -53
- package/lib/browser/index.d.ts +1 -0
- package/lib/browser/index.js +3 -1
- package/lib/node/accounts/bulkAccountLoader.d.ts.map +1 -1
- package/lib/node/accounts/bulkAccountLoader.js +2 -2
- package/lib/node/accounts/customizedCadenceBulkAccountLoader.d.ts +37 -0
- package/lib/node/accounts/customizedCadenceBulkAccountLoader.d.ts.map +1 -0
- package/lib/node/accounts/customizedCadenceBulkAccountLoader.js +124 -0
- package/lib/node/constants/numericConstants.d.ts +2 -1
- package/lib/node/constants/numericConstants.d.ts.map +1 -1
- package/lib/node/constants/numericConstants.js +54 -53
- package/lib/node/index.d.ts +1 -0
- package/lib/node/index.d.ts.map +1 -1
- package/lib/node/index.js +3 -1
- package/package.json +1 -1
- package/src/accounts/bulkAccountLoader.ts +1 -2
- package/src/accounts/customizedCadenceBulkAccountLoader.ts +177 -0
- package/src/constants/numericConstants.ts +3 -1
- package/src/index.ts +1 -0
- package/tests/accounts/customizedCadenceBulkAccountLoader.test.ts +202 -0
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
2.124.0-beta.
|
|
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
|
|
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
|
|
7
|
-
exports.ZERO = new
|
|
8
|
-
exports.ONE = new
|
|
9
|
-
exports.TWO = new
|
|
10
|
-
exports.THREE = new
|
|
11
|
-
exports.FOUR = new
|
|
12
|
-
exports.FIVE = new
|
|
13
|
-
exports.SIX = new
|
|
14
|
-
exports.SEVEN = new
|
|
15
|
-
exports.EIGHT = new
|
|
16
|
-
exports.NINE = new
|
|
17
|
-
exports.TEN = new
|
|
18
|
-
exports.TEN_THOUSAND = new
|
|
19
|
-
exports.BN_MAX = new
|
|
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
|
|
22
|
-
exports.MAX_LEVERAGE_ORDER_SIZE = new
|
|
23
|
-
exports.PERCENTAGE_PRECISION_EXP = new
|
|
24
|
-
exports.PERCENTAGE_PRECISION = new
|
|
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
|
|
27
|
-
exports.FUNDING_RATE_BUFFER_PRECISION_EXP = new
|
|
28
|
-
exports.PRICE_PRECISION_EXP = new
|
|
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
|
|
31
|
-
exports.AMM_RESERVE_PRECISION_EXP = new
|
|
32
|
-
exports.SPOT_MARKET_RATE_PRECISION_EXP = new
|
|
33
|
-
exports.SPOT_MARKET_RATE_PRECISION = new
|
|
34
|
-
exports.SPOT_MARKET_CUMULATIVE_INTEREST_PRECISION_EXP = new
|
|
35
|
-
exports.SPOT_MARKET_CUMULATIVE_INTEREST_PRECISION = new
|
|
36
|
-
exports.SPOT_MARKET_UTILIZATION_PRECISION_EXP = new
|
|
37
|
-
exports.SPOT_MARKET_UTILIZATION_PRECISION = new
|
|
38
|
-
exports.SPOT_MARKET_WEIGHT_PRECISION = new
|
|
39
|
-
exports.SPOT_MARKET_BALANCE_PRECISION_EXP = new
|
|
40
|
-
exports.SPOT_MARKET_BALANCE_PRECISION = new
|
|
41
|
-
exports.SPOT_MARKET_IMF_PRECISION_EXP = new
|
|
42
|
-
exports.SPOT_MARKET_IMF_PRECISION = new
|
|
43
|
-
exports.LIQUIDATION_FEE_PRECISION = new
|
|
44
|
-
exports.QUOTE_PRECISION = new
|
|
45
|
-
exports.PRICE_PRECISION = new
|
|
46
|
-
exports.FUNDING_RATE_PRECISION = new
|
|
47
|
-
exports.FUNDING_RATE_BUFFER_PRECISION = new
|
|
48
|
-
exports.PEG_PRECISION = new
|
|
49
|
-
exports.AMM_RESERVE_PRECISION = new
|
|
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
|
|
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
|
|
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
|
|
62
|
-
exports.ONE_HOUR = new
|
|
63
|
-
exports.ONE_YEAR = new
|
|
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
|
|
67
|
-
exports.LAMPORTS_EXP = new
|
|
68
|
-
exports.OPEN_ORDER_MARGIN_REQUIREMENT = exports.QUOTE_PRECISION.div(new
|
|
69
|
-
exports.DEFAULT_REVENUE_SINCE_LAST_FUNDING_SPREAD_RETREAT = new
|
|
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
|
|
75
|
-
exports.FUEL_START_TS = new
|
|
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;
|
package/lib/browser/index.d.ts
CHANGED
|
@@ -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';
|
package/lib/browser/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);
|
|
@@ -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;
|
|
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
|
|
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":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"numericConstants.d.ts","sourceRoot":"","sources":["../../../src/constants/numericConstants.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAEvC,eAAO,MAAM,IAAI,IAAY,CAAC;AAC9B,eAAO,MAAM,GAAG,IAAY,CAAC;AAC7B,eAAO,MAAM,GAAG,IAAY,CAAC;AAC7B,eAAO,MAAM,KAAK,IAAY,CAAC;AAC/B,eAAO,MAAM,IAAI,IAAY,CAAC;AAC9B,eAAO,MAAM,IAAI,IAAY,CAAC;AAC9B,eAAO,MAAM,GAAG,IAAY,CAAC;AAC7B,eAAO,MAAM,KAAK,IAAY,CAAC;AAC/B,eAAO,MAAM,KAAK,IAAY,CAAC;AAC/B,eAAO,MAAM,IAAI,IAAY,CAAC;AAC9B,eAAO,MAAM,GAAG,IAAa,CAAC;AAC9B,eAAO,MAAM,YAAY,IAAgB,CAAC;AAC1C,eAAO,MAAM,MAAM,IAAkC,CAAC;AACtD,eAAO,MAAM,WAAW,IAAiC,CAAC;AAE1D,eAAO,MAAM,YAAY,IAAY,CAAC;AACtC,eAAO,MAAM,uBAAuB,IAAiC,CAAC;AAEtE,eAAO,MAAM,wBAAwB,IAAY,CAAC;AAClD,eAAO,MAAM,oBAAoB,IAA2C,CAAC;AAC7E,eAAO,MAAM,uBAAuB,IAAuB,CAAC;AAE5D,eAAO,MAAM,mBAAmB,IAAY,CAAC;AAC7C,eAAO,MAAM,iCAAiC,IAAY,CAAC;AAC3D,eAAO,MAAM,mBAAmB,IAAY,CAAC;AAC7C,eAAO,MAAM,0BAA0B,IAEtC,CAAC;AACF,eAAO,MAAM,iBAAiB,IAAY,CAAC;AAC3C,eAAO,MAAM,yBAAyB,IAAY,CAAC;AAEnD,eAAO,MAAM,8BAA8B,IAAY,CAAC;AACxD,eAAO,MAAM,0BAA0B,IAEtC,CAAC;AAEF,eAAO,MAAM,6CAA6C,IAAa,CAAC;AACxE,eAAO,MAAM,yCAAyC,IAErD,CAAC;AAEF,eAAO,MAAM,qCAAqC,IAAY,CAAC;AAC/D,eAAO,MAAM,iCAAiC,IAE7C,CAAC;AAEF,eAAO,MAAM,4BAA4B,IAAgB,CAAC;AAC1D,eAAO,MAAM,iCAAiC,IAAY,CAAC;AAC3D,eAAO,MAAM,6BAA6B,IAEzC,CAAC;AACF,eAAO,MAAM,6BAA6B,IAAY,CAAC;AAEvD,eAAO,MAAM,yBAAyB,IAErC,CAAC;AACF,eAAO,MAAM,yBAAyB,IAAkB,CAAC;AAEzD,eAAO,MAAM,eAAe,IAAsC,CAAC;AACnE,eAAO,MAAM,eAAe,IAAsC,CAAC;AACnE,eAAO,MAAM,sBAAsB,IAElC,CAAC;AACF,eAAO,MAAM,6BAA6B,IAEzC,CAAC;AACF,eAAO,MAAM,aAAa,IAAoC,CAAC;AAE/D,eAAO,MAAM,qBAAqB,IAA4C,CAAC;AAE/E,eAAO,MAAM,cAAc,IAAwB,CAAC;AACpD,eAAO,MAAM,kBAAkB,IAA4B,CAAC;AAE5D,eAAO,MAAM,4BAA4B,IACE,CAAC;AAC5C,eAAO,MAAM,aAAa,IAAqC,CAAC;AAChE,eAAO,MAAM,wBAAwB,IAAuC,CAAC;AAC7E,eAAO,MAAM,sCAAsC,IACW,CAAC;AAC/D,eAAO,MAAM,gBAAgB,IAAe,CAAC;AAC7C,eAAO,MAAM,wBAAwB,IAAkB,CAAC;AACxD,eAAO,MAAM,yBAAyB,IAAe,CAAC;AACtD,eAAO,MAAM,+BAA+B,IAAe,CAAC;AAC5D,eAAO,MAAM,wCAAwC,IAEpD,CAAC;AAEF,eAAO,MAAM,WAAW,IAAiB,CAAC;AAC1C,eAAO,MAAM,QAAQ,IAAkB,CAAC;AACxC,eAAO,MAAM,QAAQ,IAAmB,CAAC;AAEzC,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC,eAAO,MAAM,kBAAkB,IAA2B,CAAC;AAC3D,eAAO,MAAM,YAAY,IAAuC,CAAC;AAEjE,eAAO,MAAM,6BAA6B,IAAmC,CAAC;AAE9E,eAAO,MAAM,iDAAiD,IAExC,CAAC;AAEvB,eAAO,MAAM,mCAAmC,QAAoB,CAAC;AACrE,eAAO,MAAM,eAAe,OAAO,CAAC;AACpC,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC,eAAO,MAAM,kBAAkB,IAA4B,CAAC;AAE5D,eAAO,MAAM,WAAW,IAA4B,CAAC;AACrD,eAAO,MAAM,aAAa,IAAqB,CAAC;AAEhD,eAAO,MAAM,oBAAoB,IAAkB,CAAC;AAEpD,eAAO,MAAM,gCAAgC,KAAK,CAAC"}
|
|
@@ -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
|
|
7
|
-
exports.ZERO = new
|
|
8
|
-
exports.ONE = new
|
|
9
|
-
exports.TWO = new
|
|
10
|
-
exports.THREE = new
|
|
11
|
-
exports.FOUR = new
|
|
12
|
-
exports.FIVE = new
|
|
13
|
-
exports.SIX = new
|
|
14
|
-
exports.SEVEN = new
|
|
15
|
-
exports.EIGHT = new
|
|
16
|
-
exports.NINE = new
|
|
17
|
-
exports.TEN = new
|
|
18
|
-
exports.TEN_THOUSAND = new
|
|
19
|
-
exports.BN_MAX = new
|
|
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
|
|
22
|
-
exports.MAX_LEVERAGE_ORDER_SIZE = new
|
|
23
|
-
exports.PERCENTAGE_PRECISION_EXP = new
|
|
24
|
-
exports.PERCENTAGE_PRECISION = new
|
|
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
|
|
27
|
-
exports.FUNDING_RATE_BUFFER_PRECISION_EXP = new
|
|
28
|
-
exports.PRICE_PRECISION_EXP = new
|
|
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
|
|
31
|
-
exports.AMM_RESERVE_PRECISION_EXP = new
|
|
32
|
-
exports.SPOT_MARKET_RATE_PRECISION_EXP = new
|
|
33
|
-
exports.SPOT_MARKET_RATE_PRECISION = new
|
|
34
|
-
exports.SPOT_MARKET_CUMULATIVE_INTEREST_PRECISION_EXP = new
|
|
35
|
-
exports.SPOT_MARKET_CUMULATIVE_INTEREST_PRECISION = new
|
|
36
|
-
exports.SPOT_MARKET_UTILIZATION_PRECISION_EXP = new
|
|
37
|
-
exports.SPOT_MARKET_UTILIZATION_PRECISION = new
|
|
38
|
-
exports.SPOT_MARKET_WEIGHT_PRECISION = new
|
|
39
|
-
exports.SPOT_MARKET_BALANCE_PRECISION_EXP = new
|
|
40
|
-
exports.SPOT_MARKET_BALANCE_PRECISION = new
|
|
41
|
-
exports.SPOT_MARKET_IMF_PRECISION_EXP = new
|
|
42
|
-
exports.SPOT_MARKET_IMF_PRECISION = new
|
|
43
|
-
exports.LIQUIDATION_FEE_PRECISION = new
|
|
44
|
-
exports.QUOTE_PRECISION = new
|
|
45
|
-
exports.PRICE_PRECISION = new
|
|
46
|
-
exports.FUNDING_RATE_PRECISION = new
|
|
47
|
-
exports.FUNDING_RATE_BUFFER_PRECISION = new
|
|
48
|
-
exports.PEG_PRECISION = new
|
|
49
|
-
exports.AMM_RESERVE_PRECISION = new
|
|
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
|
|
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
|
|
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
|
|
62
|
-
exports.ONE_HOUR = new
|
|
63
|
-
exports.ONE_YEAR = new
|
|
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
|
|
67
|
-
exports.LAMPORTS_EXP = new
|
|
68
|
-
exports.OPEN_ORDER_MARGIN_REQUIREMENT = exports.QUOTE_PRECISION.div(new
|
|
69
|
-
exports.DEFAULT_REVENUE_SINCE_LAST_FUNDING_SPREAD_RETREAT = new
|
|
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
|
|
75
|
-
exports.FUEL_START_TS = new
|
|
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;
|
package/lib/node/index.d.ts
CHANGED
|
@@ -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';
|
package/lib/node/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
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
|
@@ -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
|
+
});
|