@drift-labs/sdk 0.1.28 → 0.1.29-master.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -13,6 +13,7 @@ exports.BulkAccountLoader = void 0;
|
|
|
13
13
|
const web3_js_1 = require("@solana/web3.js");
|
|
14
14
|
const uuid_1 = require("uuid");
|
|
15
15
|
const GET_MULTIPLE_ACCOUNTS_CHUNK_SIZE = 99;
|
|
16
|
+
const oneMinute = 60 * 1000;
|
|
16
17
|
const fiveMinutes = 5 * 60 * 1000;
|
|
17
18
|
class BulkAccountLoader {
|
|
18
19
|
constructor(connection, commitment, pollingFrequency) {
|
|
@@ -82,9 +83,6 @@ class BulkAccountLoader {
|
|
|
82
83
|
this.loadPromise = new Promise((resolver) => {
|
|
83
84
|
this.loadPromiseResolver = resolver;
|
|
84
85
|
});
|
|
85
|
-
if (this.loggingEnabled) {
|
|
86
|
-
console.log('Loading accounts');
|
|
87
|
-
}
|
|
88
86
|
try {
|
|
89
87
|
const chunks = this.chunks(Array.from(this.accountsToLoad.values()), GET_MULTIPLE_ACCOUNTS_CHUNK_SIZE);
|
|
90
88
|
yield Promise.all(chunks.map((chunk) => {
|
|
@@ -126,6 +124,10 @@ class BulkAccountLoader {
|
|
|
126
124
|
];
|
|
127
125
|
// @ts-ignore
|
|
128
126
|
const rpcResponse = yield this.connection._rpcRequest('getMultipleAccounts', args);
|
|
127
|
+
const oneMinuteSinceLastUpdate = Date.now() - this.lastUpdate > oneMinute;
|
|
128
|
+
if (this.loggingEnabled && oneMinuteSinceLastUpdate) {
|
|
129
|
+
console.log('rpcResponse', JSON.stringify(rpcResponse));
|
|
130
|
+
}
|
|
129
131
|
const newSlot = rpcResponse.result.context.slot;
|
|
130
132
|
for (const i in accountsToLoad) {
|
|
131
133
|
const accountToLoad = accountsToLoad[i];
|
|
@@ -137,6 +139,9 @@ class BulkAccountLoader {
|
|
|
137
139
|
const dataType = rpcResponse.result.value[i].data[1];
|
|
138
140
|
newBuffer = Buffer.from(raw, dataType);
|
|
139
141
|
}
|
|
142
|
+
if (this.loggingEnabled && oneMinuteSinceLastUpdate) {
|
|
143
|
+
console.log('oldRPCResponse', oldRPCResponse);
|
|
144
|
+
}
|
|
140
145
|
if (!oldRPCResponse) {
|
|
141
146
|
this.accountData.set(key, {
|
|
142
147
|
slot: newSlot,
|
package/package.json
CHANGED
|
@@ -9,6 +9,7 @@ type AccountToLoad = {
|
|
|
9
9
|
|
|
10
10
|
const GET_MULTIPLE_ACCOUNTS_CHUNK_SIZE = 99;
|
|
11
11
|
|
|
12
|
+
const oneMinute = 60 * 1000;
|
|
12
13
|
const fiveMinutes = 5 * 60 * 1000;
|
|
13
14
|
|
|
14
15
|
export class BulkAccountLoader {
|
|
@@ -104,10 +105,6 @@ export class BulkAccountLoader {
|
|
|
104
105
|
this.loadPromiseResolver = resolver;
|
|
105
106
|
});
|
|
106
107
|
|
|
107
|
-
if (this.loggingEnabled) {
|
|
108
|
-
console.log('Loading accounts');
|
|
109
|
-
}
|
|
110
|
-
|
|
111
108
|
try {
|
|
112
109
|
const chunks = this.chunks(
|
|
113
110
|
Array.from(this.accountsToLoad.values()),
|
|
@@ -163,6 +160,11 @@ export class BulkAccountLoader {
|
|
|
163
160
|
args
|
|
164
161
|
);
|
|
165
162
|
|
|
163
|
+
const oneMinuteSinceLastUpdate = Date.now() - this.lastUpdate > oneMinute;
|
|
164
|
+
if (this.loggingEnabled && oneMinuteSinceLastUpdate) {
|
|
165
|
+
console.log('rpcResponse', JSON.stringify(rpcResponse));
|
|
166
|
+
}
|
|
167
|
+
|
|
166
168
|
const newSlot = rpcResponse.result.context.slot;
|
|
167
169
|
|
|
168
170
|
for (const i in accountsToLoad) {
|
|
@@ -177,6 +179,10 @@ export class BulkAccountLoader {
|
|
|
177
179
|
newBuffer = Buffer.from(raw, dataType);
|
|
178
180
|
}
|
|
179
181
|
|
|
182
|
+
if (this.loggingEnabled && oneMinuteSinceLastUpdate) {
|
|
183
|
+
console.log('oldRPCResponse', oldRPCResponse);
|
|
184
|
+
}
|
|
185
|
+
|
|
180
186
|
if (!oldRPCResponse) {
|
|
181
187
|
this.accountData.set(key, {
|
|
182
188
|
slot: newSlot,
|
package/src/constants/markets.ts
CHANGED
|
@@ -186,7 +186,7 @@ export const Markets: MarketConfig[] = [
|
|
|
186
186
|
mainnetPublicKey: 'FsSM3s38PX9K7Dn6eGzuE29S2Dsk1Sss1baytTQdCaQj',
|
|
187
187
|
launchTs: 1648607439000,
|
|
188
188
|
oracleSource: OracleSource.PYTH,
|
|
189
|
-
},
|
|
189
|
+
},
|
|
190
190
|
// {
|
|
191
191
|
// symbol: 'mSOL-PERP',
|
|
192
192
|
// baseAssetSymbol: 'mSOL',
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.BulkAccountLoader = void 0;
|
|
4
|
-
const web3_js_1 = require("@solana/web3.js");
|
|
5
|
-
const uuid_1 = require("uuid");
|
|
6
|
-
const GET_MULTIPLE_ACCOUNTS_CHUNK_SIZE = 99;
|
|
7
|
-
const fiveMinutes = 5 * 60 * 1000;
|
|
8
|
-
class BulkAccountLoader {
|
|
9
|
-
constructor(connection, commitment, pollingFrequency) {
|
|
10
|
-
this.accountsToLoad = new Map();
|
|
11
|
-
this.accountData = new Map();
|
|
12
|
-
this.errorCallbacks = new Map();
|
|
13
|
-
this.loggingEnabled = false;
|
|
14
|
-
this.lastUpdate = Date.now();
|
|
15
|
-
this.connection = connection;
|
|
16
|
-
this.commitment = commitment;
|
|
17
|
-
this.pollingFrequency = pollingFrequency;
|
|
18
|
-
}
|
|
19
|
-
addAccount(publicKey, callback) {
|
|
20
|
-
const existingSize = this.accountsToLoad.size;
|
|
21
|
-
const callbackId = (0, uuid_1.v4)();
|
|
22
|
-
const existingAccountToLoad = this.accountsToLoad.get(publicKey.toString());
|
|
23
|
-
if (existingAccountToLoad) {
|
|
24
|
-
existingAccountToLoad.callbacks.set(callbackId, callback);
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
const callbacks = new Map();
|
|
28
|
-
callbacks.set(callbackId, callback);
|
|
29
|
-
const newAccountToLoad = {
|
|
30
|
-
publicKey,
|
|
31
|
-
callbacks,
|
|
32
|
-
};
|
|
33
|
-
this.accountsToLoad.set(publicKey.toString(), newAccountToLoad);
|
|
34
|
-
}
|
|
35
|
-
if (existingSize === 0) {
|
|
36
|
-
this.startPolling();
|
|
37
|
-
}
|
|
38
|
-
// if a new account needs to be polled, remove the cached loadPromise in case client calls load immediately after
|
|
39
|
-
this.loadPromise = undefined;
|
|
40
|
-
return callbackId;
|
|
41
|
-
}
|
|
42
|
-
removeAccount(publicKey, callbackId) {
|
|
43
|
-
const existingAccountToLoad = this.accountsToLoad.get(publicKey.toString());
|
|
44
|
-
if (existingAccountToLoad) {
|
|
45
|
-
existingAccountToLoad.callbacks.delete(callbackId);
|
|
46
|
-
if (existingAccountToLoad.callbacks.size === 0) {
|
|
47
|
-
this.accountsToLoad.delete(existingAccountToLoad.publicKey.toString());
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
if (this.accountsToLoad.size === 0) {
|
|
51
|
-
this.stopPolling();
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
addErrorCallbacks(callback) {
|
|
55
|
-
const callbackId = (0, uuid_1.v4)();
|
|
56
|
-
this.errorCallbacks.set(callbackId, callback);
|
|
57
|
-
return callbackId;
|
|
58
|
-
}
|
|
59
|
-
removeErrorCallbacks(callbackId) {
|
|
60
|
-
this.errorCallbacks.delete(callbackId);
|
|
61
|
-
}
|
|
62
|
-
chunks(array, size) {
|
|
63
|
-
return new Array(Math.ceil(array.length / size))
|
|
64
|
-
.fill(null)
|
|
65
|
-
.map((_, index) => index * size)
|
|
66
|
-
.map((begin) => array.slice(begin, begin + size));
|
|
67
|
-
}
|
|
68
|
-
async load() {
|
|
69
|
-
if (this.loadPromise) {
|
|
70
|
-
return this.loadPromise;
|
|
71
|
-
}
|
|
72
|
-
this.loadPromise = new Promise((resolver) => {
|
|
73
|
-
this.loadPromiseResolver = resolver;
|
|
74
|
-
});
|
|
75
|
-
if (this.loggingEnabled) {
|
|
76
|
-
console.log('Loading accounts');
|
|
77
|
-
}
|
|
78
|
-
try {
|
|
79
|
-
const chunks = this.chunks(Array.from(this.accountsToLoad.values()), GET_MULTIPLE_ACCOUNTS_CHUNK_SIZE);
|
|
80
|
-
await Promise.all(chunks.map((chunk) => {
|
|
81
|
-
return this.loadChunk(chunk);
|
|
82
|
-
}));
|
|
83
|
-
}
|
|
84
|
-
catch (e) {
|
|
85
|
-
console.error(`Error in bulkAccountLoader.load()`);
|
|
86
|
-
console.error(e);
|
|
87
|
-
for (const [_, callback] of this.errorCallbacks) {
|
|
88
|
-
callback(e);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
finally {
|
|
92
|
-
this.loadPromiseResolver();
|
|
93
|
-
this.loadPromise = undefined;
|
|
94
|
-
const now = Date.now();
|
|
95
|
-
if (now - this.lastUpdate > fiveMinutes) {
|
|
96
|
-
if (this.loggingEnabled) {
|
|
97
|
-
console.log("Haven't seen updated account in five minutes. Bulk account loader creating new Connection Object");
|
|
98
|
-
}
|
|
99
|
-
this.connection = new web3_js_1.Connection(
|
|
100
|
-
// @ts-ignore
|
|
101
|
-
this.connection._rpcEndpoint, this.connection.commitment);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
async loadChunk(accountsToLoad) {
|
|
106
|
-
if (accountsToLoad.length === 0) {
|
|
107
|
-
return;
|
|
108
|
-
}
|
|
109
|
-
const args = [
|
|
110
|
-
accountsToLoad.map((accountToLoad) => {
|
|
111
|
-
return accountToLoad.publicKey.toBase58();
|
|
112
|
-
}),
|
|
113
|
-
{ commitment: this.commitment },
|
|
114
|
-
];
|
|
115
|
-
// @ts-ignore
|
|
116
|
-
const rpcResponse = await this.connection._rpcRequest('getMultipleAccounts', args);
|
|
117
|
-
const newSlot = rpcResponse.result.context.slot;
|
|
118
|
-
for (const i in accountsToLoad) {
|
|
119
|
-
const accountToLoad = accountsToLoad[i];
|
|
120
|
-
const key = accountToLoad.publicKey.toString();
|
|
121
|
-
const oldRPCResponse = this.accountData.get(key);
|
|
122
|
-
let newBuffer = undefined;
|
|
123
|
-
if (rpcResponse.result.value[i]) {
|
|
124
|
-
const raw = rpcResponse.result.value[i].data[0];
|
|
125
|
-
const dataType = rpcResponse.result.value[i].data[1];
|
|
126
|
-
newBuffer = Buffer.from(raw, dataType);
|
|
127
|
-
}
|
|
128
|
-
if (!oldRPCResponse) {
|
|
129
|
-
this.accountData.set(key, {
|
|
130
|
-
slot: newSlot,
|
|
131
|
-
buffer: newBuffer,
|
|
132
|
-
});
|
|
133
|
-
this.handleAccountCallbacks(accountToLoad, newBuffer);
|
|
134
|
-
this.lastUpdate = Date.now();
|
|
135
|
-
continue;
|
|
136
|
-
}
|
|
137
|
-
if (newSlot <= oldRPCResponse.slot) {
|
|
138
|
-
continue;
|
|
139
|
-
}
|
|
140
|
-
const oldBuffer = oldRPCResponse.buffer;
|
|
141
|
-
if (newBuffer && (!oldBuffer || !newBuffer.equals(oldBuffer))) {
|
|
142
|
-
this.accountData.set(key, {
|
|
143
|
-
slot: newSlot,
|
|
144
|
-
buffer: newBuffer,
|
|
145
|
-
});
|
|
146
|
-
this.handleAccountCallbacks(accountToLoad, newBuffer);
|
|
147
|
-
this.lastUpdate = Date.now();
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
handleAccountCallbacks(accountToLoad, buffer) {
|
|
152
|
-
for (const [_, callback] of accountToLoad.callbacks) {
|
|
153
|
-
callback(buffer);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
getAccountData(publicKey) {
|
|
157
|
-
const accountData = this.accountData.get(publicKey.toString());
|
|
158
|
-
return accountData === null || accountData === void 0 ? void 0 : accountData.buffer;
|
|
159
|
-
}
|
|
160
|
-
startPolling() {
|
|
161
|
-
if (this.intervalId) {
|
|
162
|
-
return;
|
|
163
|
-
}
|
|
164
|
-
if (this.loggingEnabled) {
|
|
165
|
-
console.log(`startPolling`);
|
|
166
|
-
}
|
|
167
|
-
this.intervalId = setInterval(this.load.bind(this), this.pollingFrequency);
|
|
168
|
-
}
|
|
169
|
-
stopPolling() {
|
|
170
|
-
if (this.intervalId) {
|
|
171
|
-
clearInterval(this.intervalId);
|
|
172
|
-
this.intervalId = undefined;
|
|
173
|
-
if (this.loggingEnabled) {
|
|
174
|
-
console.log(`stopPolling`);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
exports.BulkAccountLoader = BulkAccountLoader;
|
|
180
|
-
//# sourceMappingURL=bulkAccountLoader.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bulkAccountLoader.js","sourceRoot":"","sources":["bulkAccountLoader.ts"],"names":[],"mappings":"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"}
|