@helium/spl-utils 0.0.26 → 0.0.27

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.
@@ -0,0 +1,410 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.TpuConnection = exports.LeaderTpuService = exports.TpuClient = exports.RecentLeaderSlots = exports.MAX_FANOUT_SLOTS = exports.DEFAULT_FANOUT_SLOTS = exports.MAX_SLOT_SKIP_DISTANCE = exports.LeaderTpuCache = void 0;
16
+ // Taken from https://raw.githubusercontent.com/lmvdz/tpu-client/main/src/index.ts bec of supply chain risk
17
+ const web3_js_1 = require("@solana/web3.js");
18
+ const denque_1 = __importDefault(require("denque"));
19
+ const dgram_1 = __importDefault(require("dgram"));
20
+ const bs58_1 = __importDefault(require("bs58"));
21
+ class LeaderTpuCache {
22
+ constructor(connection, startSlot) {
23
+ this.connection = connection;
24
+ this.first_slot = startSlot;
25
+ }
26
+ static load(connection, startSlot) {
27
+ return new Promise((resolve) => {
28
+ const leaderTpuCache = new LeaderTpuCache(connection, startSlot);
29
+ leaderTpuCache.connection.getEpochInfo().then((epochInfo) => {
30
+ leaderTpuCache.slots_in_epoch = epochInfo.slotsInEpoch;
31
+ leaderTpuCache
32
+ .fetchSlotLeaders(leaderTpuCache.first_slot, leaderTpuCache.slots_in_epoch)
33
+ .then((leaders) => {
34
+ leaderTpuCache.leaders = leaders;
35
+ leaderTpuCache.fetchClusterTpuSockets().then((leaderTpuMap) => {
36
+ leaderTpuCache.leaderTpuMap = leaderTpuMap;
37
+ resolve(leaderTpuCache);
38
+ });
39
+ });
40
+ });
41
+ });
42
+ }
43
+ fetchClusterTpuSockets() {
44
+ return new Promise((resolve, reject) => {
45
+ const map = new Map();
46
+ this.connection
47
+ .getClusterNodes()
48
+ .then((contactInfo) => {
49
+ contactInfo.forEach((contactInfo) => {
50
+ map.set(contactInfo.pubkey, contactInfo.tpu);
51
+ });
52
+ resolve(map);
53
+ })
54
+ .catch((error) => {
55
+ reject(error);
56
+ });
57
+ });
58
+ }
59
+ fetchSlotLeaders(start_slot, slots_in_epoch) {
60
+ const fanout = Math.min(2 * exports.MAX_FANOUT_SLOTS, slots_in_epoch);
61
+ return this.connection.getSlotLeaders(start_slot, fanout);
62
+ }
63
+ lastSlot() {
64
+ return this.first_slot + this.leaders.length - 1;
65
+ }
66
+ getSlotLeader(slot) {
67
+ if (slot >= this.first_slot) {
68
+ const index = slot - this.first_slot;
69
+ return this.leaders[index];
70
+ }
71
+ else {
72
+ return null;
73
+ }
74
+ }
75
+ getLeaderSockets(fanout_slots) {
76
+ return new Promise((resolve) => {
77
+ const leaderSet = new Set();
78
+ const leaderSockets = new Array();
79
+ let checkedSlots = 0;
80
+ this.leaders.forEach((leader) => {
81
+ const tpu_socket = this.leaderTpuMap.get(leader.toBase58());
82
+ if (tpu_socket !== undefined && tpu_socket !== null) {
83
+ if (!leaderSet.has(leader.toBase58())) {
84
+ leaderSet.add(leader.toBase58());
85
+ leaderSockets.push(tpu_socket);
86
+ }
87
+ }
88
+ else {
89
+ console.log("TPU not available for leader: ", leader.toBase58());
90
+ }
91
+ checkedSlots++;
92
+ if (checkedSlots === fanout_slots) {
93
+ resolve(leaderSockets);
94
+ }
95
+ });
96
+ });
97
+ }
98
+ }
99
+ exports.LeaderTpuCache = LeaderTpuCache;
100
+ exports.MAX_SLOT_SKIP_DISTANCE = 48;
101
+ exports.DEFAULT_FANOUT_SLOTS = 12;
102
+ exports.MAX_FANOUT_SLOTS = 100;
103
+ class RecentLeaderSlots {
104
+ //@ts-check
105
+ /**
106
+ *
107
+ * @param current_slot {number}
108
+ */
109
+ constructor(current_slot) {
110
+ this.recent_slots = new denque_1.default();
111
+ this.recent_slots.push(current_slot);
112
+ }
113
+ //@ts-check
114
+ /**
115
+ *
116
+ * @param current_slot {number}
117
+ */
118
+ recordSlot(current_slot) {
119
+ this.recent_slots.push(current_slot);
120
+ while (this.recent_slots.length > 12) {
121
+ this.recent_slots.pop();
122
+ }
123
+ }
124
+ //@ts-check
125
+ /**
126
+ *
127
+ * @returns {number}
128
+ */
129
+ estimatedCurrentSlot() {
130
+ if (this.recent_slots.isEmpty()) {
131
+ throw new Error("recent slots is empty");
132
+ }
133
+ const sortedRecentSlots = this.recent_slots.toArray().sort((a, b) => a - b);
134
+ const max_index = sortedRecentSlots.length - 1;
135
+ const median_index = max_index / 2;
136
+ const median_recent_slot = sortedRecentSlots[median_index];
137
+ const expected_current_slot = median_recent_slot + (max_index - median_index);
138
+ const max_reasonable_current_slot = expected_current_slot + exports.MAX_SLOT_SKIP_DISTANCE;
139
+ return sortedRecentSlots
140
+ .reverse()
141
+ .find((slot) => slot <= max_reasonable_current_slot);
142
+ }
143
+ }
144
+ exports.RecentLeaderSlots = RecentLeaderSlots;
145
+ class TpuClient {
146
+ //@ts-check
147
+ /**
148
+ *
149
+ * @param connection {Connection}
150
+ * @param config {TpuClientConfig}
151
+ */
152
+ constructor(connection, config = { fanoutSlots: exports.DEFAULT_FANOUT_SLOTS }) {
153
+ this.connection = connection;
154
+ this.exit = false;
155
+ this.sendSocket = dgram_1.default.createSocket("udp4");
156
+ this.fanoutSlots = Math.max(Math.min(config.fanoutSlots, exports.MAX_FANOUT_SLOTS), 1);
157
+ }
158
+ //@ts-check
159
+ /**
160
+ *
161
+ * @param connection {Connection}
162
+ * @param websocketUrl {string}
163
+ * @param config {TpuClientConfig}
164
+ * @returns {Promise<TpuClient>}
165
+ */
166
+ static load(connection, websocketUrl = "", config = { fanoutSlots: exports.DEFAULT_FANOUT_SLOTS }) {
167
+ return new Promise((resolve) => {
168
+ const tpuClient = new TpuClient(connection, config);
169
+ LeaderTpuService.load(tpuClient.connection, websocketUrl).then((leaderTpuService) => {
170
+ tpuClient.leaderTpuService = leaderTpuService;
171
+ resolve(tpuClient);
172
+ });
173
+ });
174
+ }
175
+ //@ts-check
176
+ /**
177
+ *
178
+ * @param transaction {Transaction}
179
+ * @param signers {Array<Signer>}
180
+ * @returns {Promise<string>}
181
+ */
182
+ sendTransaction(transaction, signers) {
183
+ return __awaiter(this, void 0, void 0, function* () {
184
+ if (transaction.nonceInfo) {
185
+ transaction.sign(...signers);
186
+ }
187
+ else {
188
+ transaction.recentBlockhash = (yield this.connection.getRecentBlockhash()).blockhash;
189
+ transaction.sign(...signers);
190
+ }
191
+ const rawTransaction = transaction.serialize();
192
+ return this.sendRawTransaction(rawTransaction);
193
+ });
194
+ }
195
+ //@ts-check
196
+ /**
197
+ *
198
+ * @param rawTransaction {Buffer | number[] | Uint8ARray}
199
+ * @returns {Promise<string>}
200
+ */
201
+ sendRawTransaction(rawTransaction) {
202
+ return __awaiter(this, void 0, void 0, function* () {
203
+ return new Promise((resolve, reject) => {
204
+ this.leaderTpuService
205
+ .leaderTpuSockets(this.fanoutSlots)
206
+ .then((tpu_addresses) => {
207
+ tpu_addresses.forEach((tpu_address) => {
208
+ this.sendSocket.send(rawTransaction, parseInt(tpu_address.split(":")[1]), tpu_address.split(":")[0], (error) => {
209
+ if (!error) {
210
+ const message = web3_js_1.Transaction.from(rawTransaction);
211
+ resolve(bs58_1.default.encode(message.signature));
212
+ }
213
+ else {
214
+ console.error(error);
215
+ reject(error);
216
+ }
217
+ });
218
+ });
219
+ });
220
+ });
221
+ });
222
+ }
223
+ }
224
+ exports.TpuClient = TpuClient;
225
+ class LeaderTpuService {
226
+ //@ts-check
227
+ /**
228
+ *
229
+ * @param connection {Connection}
230
+ */
231
+ constructor(connection) {
232
+ this.connection = connection;
233
+ }
234
+ //@ts-check
235
+ /**
236
+ *
237
+ * @param connection {Connection}
238
+ * @param websocket_url {string}
239
+ * @returns {Promise<LeaderTpuService}
240
+ */
241
+ static load(connection, websocket_url = "") {
242
+ return new Promise((resolve) => {
243
+ const leaderTpuService = new LeaderTpuService(connection);
244
+ leaderTpuService.connection.getSlot("processed").then((start_slot) => {
245
+ leaderTpuService.recentSlots = new RecentLeaderSlots(start_slot);
246
+ LeaderTpuCache.load(connection, start_slot).then((leaderTpuCache) => {
247
+ leaderTpuService.leaderTpuCache = leaderTpuCache;
248
+ if (websocket_url !== "") {
249
+ leaderTpuService.subscription = connection.onSlotUpdate((slotUpdate) => {
250
+ if (slotUpdate.type === "completed") {
251
+ slotUpdate.slot++;
252
+ }
253
+ leaderTpuService.recentSlots.recordSlot(slotUpdate.slot);
254
+ });
255
+ }
256
+ else {
257
+ leaderTpuService.subscription = null;
258
+ }
259
+ leaderTpuService.run();
260
+ resolve(leaderTpuService);
261
+ });
262
+ });
263
+ });
264
+ }
265
+ //@ts-check
266
+ /**
267
+ *
268
+ * @param fanout_slots {number}
269
+ * @returns {Promise<string[]>}
270
+ */
271
+ leaderTpuSockets(fanout_slots) {
272
+ return this.leaderTpuCache.getLeaderSockets(fanout_slots);
273
+ }
274
+ //@ts-check
275
+ /**
276
+ * @returns {void}
277
+ */
278
+ run() {
279
+ return __awaiter(this, void 0, void 0, function* () {
280
+ const last_cluster_refresh = Date.now();
281
+ let sleep_ms = 1000;
282
+ setTimeout(() => __awaiter(this, void 0, void 0, function* () {
283
+ sleep_ms = 1000;
284
+ if (Date.now() - last_cluster_refresh > 1000 * 5 * 60) {
285
+ try {
286
+ this.leaderTpuCache.leaderTpuMap =
287
+ yield this.leaderTpuCache.fetchClusterTpuSockets();
288
+ }
289
+ catch (error) {
290
+ console.warn("Failed to fetch cluster tpu sockets", error);
291
+ sleep_ms = 1000;
292
+ }
293
+ }
294
+ const estimatedCurrentSlot = this.recentSlots.estimatedCurrentSlot();
295
+ if (estimatedCurrentSlot >=
296
+ this.leaderTpuCache.last_epoch_info_slot -
297
+ this.leaderTpuCache.slots_in_epoch) {
298
+ try {
299
+ const epochInfo = yield this.connection.getEpochInfo("recent");
300
+ this.leaderTpuCache.slots_in_epoch = epochInfo.slotsInEpoch;
301
+ this.leaderTpuCache.last_epoch_info_slot = estimatedCurrentSlot;
302
+ }
303
+ catch (error) {
304
+ console.warn("failed to get epoch info");
305
+ }
306
+ }
307
+ if (estimatedCurrentSlot >=
308
+ this.leaderTpuCache.lastSlot() - exports.MAX_FANOUT_SLOTS) {
309
+ try {
310
+ const slot_leaders = yield this.leaderTpuCache.fetchSlotLeaders(estimatedCurrentSlot, this.leaderTpuCache.slots_in_epoch);
311
+ this.leaderTpuCache.first_slot = estimatedCurrentSlot;
312
+ this.leaderTpuCache.leaders = slot_leaders;
313
+ }
314
+ catch (error) {
315
+ console.warn(`Failed to fetch slot leaders (current estimated slot: ${estimatedCurrentSlot})`, error);
316
+ sleep_ms = 1000;
317
+ }
318
+ }
319
+ this.run();
320
+ }), sleep_ms);
321
+ });
322
+ }
323
+ }
324
+ exports.LeaderTpuService = LeaderTpuService;
325
+ class TpuConnection extends web3_js_1.Connection {
326
+ //@ts-check
327
+ /**
328
+ *
329
+ * @param endpoint {string}
330
+ * @param commitmentOrConfig {Commitment | ConnectionConfig}
331
+ */
332
+ constructor(endpoint, commitmentOrConfig) {
333
+ super(endpoint, commitmentOrConfig);
334
+ }
335
+ /**
336
+ *
337
+ * @param transaction {Transaction}
338
+ * @param signers {Array<Signer>}
339
+ * @returns {Promise<string>}
340
+ */
341
+ //@ts-ignore
342
+ sendTransaction(transaction, signers) {
343
+ return this.tpuClient.sendTransaction(transaction, signers);
344
+ }
345
+ /**
346
+ *
347
+ * @param rawTransaction {Buffer | Array<number> | Uint8Array}
348
+ * @returns {Promise<string>}
349
+ */
350
+ //@ts-ignore
351
+ sendRawTransaction(rawTransaction) {
352
+ return this.tpuClient.sendRawTransaction(rawTransaction);
353
+ }
354
+ ///@ts-check
355
+ /**
356
+ *
357
+ * @param connection {TpuConnection}
358
+ * @param transaction {Transaction}
359
+ * @param signers {Array<Signer>}
360
+ * @param options {ConfirmOptions}
361
+ * @returns {Promise<TransactionSignature>}
362
+ */
363
+ sendAndConfirmTransaction(connection, transaction, signers, options) {
364
+ return __awaiter(this, void 0, void 0, function* () {
365
+ const signature = yield this.sendTransaction(transaction, signers);
366
+ const status = (yield connection.confirmTransaction(signature, options.commitment)).value;
367
+ if (status.err) {
368
+ throw new Error(`Transaction ${signature} failed (${JSON.stringify(status)})`);
369
+ }
370
+ return signature;
371
+ });
372
+ }
373
+ //@ts-check
374
+ /**
375
+ *
376
+ * @param connection {TpuConnection}
377
+ * @param rawTransaction {Buffer | Array<number> | Uint8Array}
378
+ * @param options {ConfirmOptions}
379
+ * @returns {Promise<string>}
380
+ */
381
+ sendAndConfirmRawTransaction(connection, rawTransaction, options) {
382
+ return __awaiter(this, void 0, void 0, function* () {
383
+ const signature = yield this.sendRawTransaction(rawTransaction);
384
+ const status = (yield connection.confirmTransaction(signature, options.commitment)).value;
385
+ if (status.err) {
386
+ throw new Error(`Transaction ${signature} failed (${JSON.stringify(status)})`);
387
+ }
388
+ return signature;
389
+ });
390
+ }
391
+ //@ts-check
392
+ /**
393
+ *
394
+ * @param endpoint {string}
395
+ * @param commitmentOrConfig {Commitment | ConnectionConfig}
396
+ * @returns {Promise<TpuConnection>}
397
+ */
398
+ static load(endpoint, commitmentOrConfig) {
399
+ return new Promise((resolve) => {
400
+ const tpuConnection = new TpuConnection(endpoint, commitmentOrConfig);
401
+ //@ts-ignore
402
+ TpuClient.load(tpuConnection).then((tpuClient) => {
403
+ tpuConnection.tpuClient = tpuClient;
404
+ resolve(tpuConnection);
405
+ });
406
+ });
407
+ }
408
+ }
409
+ exports.TpuConnection = TpuConnection;
410
+ //# sourceMappingURL=TpuClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TpuClient.js","sourceRoot":"","sources":["../../src/TpuClient.ts"],"names":[],"mappings":"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"}
@@ -8,9 +8,25 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
9
  });
10
10
  };
11
+ var __rest = (this && this.__rest) || function (s, e) {
12
+ var t = {};
13
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
14
+ t[p] = s[p];
15
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
16
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
17
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
18
+ t[p[i]] = s[p[i]];
19
+ }
20
+ return t;
21
+ };
22
+ var __importDefault = (this && this.__importDefault) || function (mod) {
23
+ return (mod && mod.__esModule) ? mod : { "default": mod };
24
+ };
11
25
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.bufferToTransaction = exports.stringToTransaction = exports.sendAndConfirmWithRetry = exports.awaitTransactionSignatureConfirmation = exports.executeBig = exports.execute = exports.sendMultipleInstructions = exports.sendInstructions = void 0;
26
+ exports.bulkSendRawTransactions = exports.bulkSendTransactions = exports.bufferToTransaction = exports.stringToTransaction = exports.sendAndConfirmWithRetry = exports.awaitTransactionSignatureConfirmation = exports.executeBig = exports.execute = exports.sendMultipleInstructions = exports.sendInstructions = void 0;
13
27
  const web3_js_1 = require("@solana/web3.js");
28
+ const accountFetchCache_1 = require("./accountFetchCache");
29
+ const bs58_1 = __importDefault(require("bs58"));
14
30
  const anchorError_1 = require("./anchorError");
15
31
  function sleep(ms) {
16
32
  return __awaiter(this, void 0, void 0, function* () {
@@ -32,7 +48,7 @@ function sendInstructions(provider, instructions, signers = [], payer = provider
32
48
  return "";
33
49
  }
34
50
  let tx = new web3_js_1.Transaction();
35
- tx.recentBlockhash = (yield provider.connection.getRecentBlockhash()).blockhash;
51
+ tx.recentBlockhash = (yield provider.connection.getLatestBlockhash()).blockhash;
36
52
  tx.feePayer = payer || provider.wallet.publicKey;
37
53
  tx.add(...instructions);
38
54
  if (signers.length > 0) {
@@ -61,7 +77,7 @@ function truthy(value) {
61
77
  }
62
78
  function sendMultipleInstructions(provider, instructionGroups, signerGroups, payer, finality = "confirmed", idlErrors = new Map()) {
63
79
  return __awaiter(this, void 0, void 0, function* () {
64
- const recentBlockhash = (yield provider.connection.getRecentBlockhash("confirmed")).blockhash;
80
+ const recentBlockhash = (yield provider.connection.getLatestBlockhash("confirmed")).blockhash;
65
81
  const ixAndSigners = instructionGroups
66
82
  .map((instructions, i) => {
67
83
  const signers = signerGroups[i];
@@ -143,6 +159,7 @@ exports.executeBig = executeBig;
143
159
  function getUnixTime() {
144
160
  return new Date().valueOf() / 1000;
145
161
  }
162
+ const SEND_TRANSACTION_INTERVAL = 10;
146
163
  const awaitTransactionSignatureConfirmation = (txid, timeout, connection, commitment = "recent", queryStatus = false) => __awaiter(void 0, void 0, void 0, function* () {
147
164
  let done = false;
148
165
  let status = {
@@ -319,4 +336,134 @@ function bufferToTransaction(solanaTransaction) {
319
336
  return web3_js_1.Transaction.from(solanaTransaction);
320
337
  }
321
338
  exports.bufferToTransaction = bufferToTransaction;
339
+ function withRetries(tries, input) {
340
+ return __awaiter(this, void 0, void 0, function* () {
341
+ for (let i = 0; i < tries; i++) {
342
+ try {
343
+ return yield input();
344
+ }
345
+ catch (e) {
346
+ console.log(`Retrying ${i}...`, e);
347
+ }
348
+ }
349
+ throw new Error("Failed after retries");
350
+ });
351
+ }
352
+ const TX_BATCH_SIZE = 200;
353
+ function bulkSendTransactions(provider, txs, onProgress, triesRemaining = 5 // Number of blockhashes to try resending txs with before giving up
354
+ ) {
355
+ return __awaiter(this, void 0, void 0, function* () {
356
+ let ret = [];
357
+ // attempt to chunk by blockhash bounds (so signing doesn't take too long)
358
+ for (let chunk of (0, accountFetchCache_1.chunks)(txs, TX_BATCH_SIZE)) {
359
+ const thisRet = [];
360
+ // Continually send in bulk while resetting blockhash until we send them all
361
+ while (true) {
362
+ const recentBlockhash = yield withRetries(5, () => provider.connection.getLatestBlockhash("confirmed"));
363
+ const signedTxs = yield Promise.all(chunk.map((tx) => __awaiter(this, void 0, void 0, function* () {
364
+ tx.recentBlockhash = recentBlockhash.blockhash;
365
+ // @ts-ignore
366
+ const signed = yield provider.wallet.signTransaction(tx);
367
+ tx.signatures[0].signature;
368
+ return signed;
369
+ })));
370
+ const txsWithSigs = signedTxs.map((tx, index) => {
371
+ return {
372
+ transaction: chunk[index],
373
+ sig: bs58_1.default.encode(tx.signatures[0].signature),
374
+ };
375
+ });
376
+ const confirmedTxs = yield bulkSendRawTransactions(provider.connection, signedTxs.map((s) => s.serialize()), (_a) => {
377
+ var { totalProgress } = _a, rest = __rest(_a, ["totalProgress"]);
378
+ return onProgress &&
379
+ onProgress(Object.assign(Object.assign({}, rest), { totalProgress: totalProgress + ret.length }));
380
+ }, recentBlockhash.lastValidBlockHeight);
381
+ thisRet.push(...confirmedTxs);
382
+ if (confirmedTxs.length == signedTxs.length) {
383
+ break;
384
+ }
385
+ const retSet = new Set(thisRet);
386
+ chunk = txsWithSigs
387
+ .filter(({ sig }) => !retSet.has(sig))
388
+ .map(({ transaction }) => transaction);
389
+ triesRemaining--;
390
+ if (triesRemaining <= 0) {
391
+ throw new Error(`Failed to submit all txs after ${triesRemaining} blockhashes expired`);
392
+ }
393
+ }
394
+ ret.push(...thisRet);
395
+ }
396
+ return ret;
397
+ });
398
+ }
399
+ exports.bulkSendTransactions = bulkSendTransactions;
400
+ // Returns the list of succesfully sent txns
401
+ // NOTE: The return signatures are ordered by confirmation, not by order they are passed
402
+ // This list should be in order. Seom txns may fail
403
+ // due to blockhash exp
404
+ function bulkSendRawTransactions(connection, txs, onProgress, lastValidBlockHeight) {
405
+ return __awaiter(this, void 0, void 0, function* () {
406
+ const txBatchSize = TX_BATCH_SIZE;
407
+ let totalProgress = 0;
408
+ const ret = [];
409
+ if (!lastValidBlockHeight) {
410
+ const blockhash = yield withRetries(5, () => connection.getLatestBlockhash("confirmed"));
411
+ lastValidBlockHeight = blockhash.lastValidBlockHeight;
412
+ }
413
+ for (let chunk of (0, accountFetchCache_1.chunks)(txs, txBatchSize)) {
414
+ let currentBatchProgress = 0;
415
+ let pendingCount = txs.length;
416
+ let txids = [];
417
+ let lastRetry = 0;
418
+ while (pendingCount > 0) {
419
+ if ((yield withRetries(5, () => connection.getBlockHeight())) >
420
+ lastValidBlockHeight) {
421
+ return ret;
422
+ }
423
+ // only resend txs every 4s
424
+ if (lastRetry < new Date().valueOf() - 4 * 1000) {
425
+ lastRetry = new Date().valueOf();
426
+ txids = [];
427
+ for (const tx of chunk) {
428
+ const txid = yield connection.sendRawTransaction(tx, {
429
+ skipPreflight: true,
430
+ });
431
+ txids.push(txid);
432
+ }
433
+ }
434
+ const statuses = yield getAllTxns(connection, txids);
435
+ const completed = statuses.filter((status) => status !== null);
436
+ totalProgress += completed.length;
437
+ currentBatchProgress += completed.length;
438
+ onProgress &&
439
+ onProgress({
440
+ totalProgress: totalProgress,
441
+ currentBatchProgress: currentBatchProgress,
442
+ currentBatchSize: txBatchSize,
443
+ });
444
+ const failures = completed
445
+ .map((status) => { var _a; return status !== null && ((_a = status.meta) === null || _a === void 0 ? void 0 : _a.err); })
446
+ .filter(truthy);
447
+ if (failures.length > 0) {
448
+ console.error(failures);
449
+ throw new Error("Failed to run txs");
450
+ }
451
+ pendingCount -= completed.length;
452
+ chunk = chunk.filter((_, index) => statuses[index] === null);
453
+ ret.push(...completed
454
+ .map((status, idx) => (status ? txids[idx] : null))
455
+ .filter(truthy));
456
+ yield sleep(1000); // Wait one seconds before querying again
457
+ }
458
+ }
459
+ return ret;
460
+ });
461
+ }
462
+ exports.bulkSendRawTransactions = bulkSendRawTransactions;
463
+ const MAX_GET_SIGNATURE_STATUSES_QUERY_ITEMS = 200;
464
+ function getAllTxns(connection, txids) {
465
+ return __awaiter(this, void 0, void 0, function* () {
466
+ return (yield Promise.all((0, accountFetchCache_1.chunks)(txids, MAX_GET_SIGNATURE_STATUSES_QUERY_ITEMS).map((txids) => connection.getTransactions(txids, "confirmed")))).flat();
467
+ });
468
+ }
322
469
  //# sourceMappingURL=transaction.js.map