@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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@drift-labs/sdk",
3
- "version": "0.1.28",
3
+ "version": "0.1.29-master.0",
4
4
  "main": "lib/index.js",
5
5
  "types": "lib/index.d.ts",
6
6
  "author": "crispheaney",
@@ -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,
@@ -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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"}