@haven-fi/solauto-sdk 1.0.140 → 1.0.142

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.
@@ -43,12 +43,14 @@ export declare enum TransactionStatus {
43
43
  Skipped = "Skipped",
44
44
  Processing = "Processing",
45
45
  Queued = "Queued",
46
- Successful = "Successful"
46
+ Successful = "Successful",
47
+ Failed = "Failed"
47
48
  }
48
49
  export type TransactionManagerStatuses = {
49
50
  name: string;
50
51
  status: TransactionStatus;
51
52
  txSig?: string;
53
+ attemptNum: number;
52
54
  }[];
53
55
  export declare class TransactionsManager {
54
56
  private txHandler;
@@ -60,7 +62,7 @@ export declare class TransactionsManager {
60
62
  private lookupTables;
61
63
  constructor(txHandler: SolautoClient | ReferralStateManager, statusCallback?: ((statuses: TransactionManagerStatuses) => void) | undefined, txType?: TransactionRunType | undefined, mustBeAtomic?: boolean | undefined, errorsToThrow?: ErrorsToThrow | undefined);
62
64
  private assembleTransactionSets;
63
- updateStatus(name: string, status: TransactionStatus, txSig?: string): void;
65
+ updateStatus(name: string, status: TransactionStatus, attemptNum: number, txSig?: string): void;
64
66
  debugAccounts(itemSet: TransactionSet, tx: TransactionBuilder): Promise<void>;
65
67
  clientSend(transactions: TransactionItem[], prioritySetting?: PriorityFeeSetting): Promise<TransactionManagerStatuses>;
66
68
  send(items: TransactionItem[], prioritySetting?: PriorityFeeSetting, initialized?: boolean): Promise<TransactionManagerStatuses>;
@@ -1 +1 @@
1
- {"version":3,"file":"transactionsManager.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionsManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transactionsManager.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionsManager.ts"],"names":[],"mappings":"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"}
@@ -27,7 +27,7 @@ class LookupTables {
27
27
  return this.cache;
28
28
  }
29
29
  reset() {
30
- this.cache = this.cache.filter(x => this.defaultLuts.includes(x.publicKey.toString()));
30
+ this.cache = this.cache.filter((x) => this.defaultLuts.includes(x.publicKey.toString()));
31
31
  }
32
32
  }
33
33
  class TransactionItem {
@@ -116,6 +116,7 @@ var TransactionStatus;
116
116
  TransactionStatus["Processing"] = "Processing";
117
117
  TransactionStatus["Queued"] = "Queued";
118
118
  TransactionStatus["Successful"] = "Successful";
119
+ TransactionStatus["Failed"] = "Failed";
119
120
  })(TransactionStatus || (exports.TransactionStatus = TransactionStatus = {}));
120
121
  class TransactionsManager {
121
122
  constructor(txHandler, statusCallback, txType, mustBeAtomic, errorsToThrow) {
@@ -158,18 +159,18 @@ class TransactionsManager {
158
159
  }
159
160
  return transactionSets;
160
161
  }
161
- updateStatus(name, status, txSig) {
162
+ updateStatus(name, status, attemptNum, txSig) {
162
163
  if (!this.statuses.filter((x) => x.name === name)) {
163
- this.statuses.push({ name, status, txSig });
164
+ this.statuses.push({ name, status, txSig, attemptNum });
164
165
  }
165
166
  else {
166
- const idx = this.statuses.findIndex((x) => x.name === name);
167
+ const idx = this.statuses.findIndex((x) => x.name === name && x.attemptNum === attemptNum);
167
168
  if (idx !== -1) {
168
169
  this.statuses[idx].status = status;
169
170
  this.statuses[idx].txSig = txSig;
170
171
  }
171
172
  else {
172
- this.statuses.push({ name, status, txSig });
173
+ this.statuses.push({ name, status, txSig, attemptNum });
173
174
  }
174
175
  }
175
176
  this.txHandler.log(`${name} is ${status.toString().toLowerCase()}`);
@@ -199,9 +200,17 @@ class TransactionsManager {
199
200
  if (updateLookupTable &&
200
201
  updateLookupTable.updateLutTx.getInstructions().length > 0 &&
201
202
  updateLookupTable?.needsToBeIsolated) {
202
- this.updateStatus(updateLutTxName, TransactionStatus.Processing);
203
- await (0, generalUtils_1.retryWithExponentialBackoff)(async (attemptNum) => await (0, solanaUtils_1.sendSingleOptimizedTransaction)(this.txHandler.umi, this.txHandler.connection, updateLookupTable.updateLutTx, this.txType, attemptNum, prioritySetting), 3, 150, this.errorsToThrow);
204
- this.updateStatus(updateLutTxName, TransactionStatus.Successful);
203
+ await (0, generalUtils_1.retryWithExponentialBackoff)(async (attemptNum) => {
204
+ this.updateStatus(updateLutTxName, TransactionStatus.Processing, attemptNum);
205
+ try {
206
+ const txSig = await (0, solanaUtils_1.sendSingleOptimizedTransaction)(this.txHandler.umi, this.txHandler.connection, updateLookupTable.updateLutTx, this.txType, attemptNum, prioritySetting);
207
+ this.updateStatus(updateLutTxName, TransactionStatus.Successful, attemptNum, txSig ? bs58_1.default.encode(txSig) : undefined);
208
+ }
209
+ catch (e) {
210
+ this.updateStatus(updateLutTxName, TransactionStatus.Failed, attemptNum);
211
+ throw e;
212
+ }
213
+ }, 3, 150, this.errorsToThrow);
205
214
  }
206
215
  this.lookupTables.defaultLuts = client.defaultLookupTables();
207
216
  for (const item of items) {
@@ -245,7 +254,7 @@ class TransactionsManager {
245
254
  const itemSets = await this.assembleTransactionSets(items);
246
255
  const statusesStartIdx = this.statuses.length;
247
256
  for (const itemSet of itemSets) {
248
- this.updateStatus(itemSet.name(), TransactionStatus.Queued);
257
+ this.updateStatus(itemSet.name(), TransactionStatus.Queued, 0);
249
258
  }
250
259
  if (this.mustBeAtomic && itemSets.length > 1) {
251
260
  throw new Error(`${itemSets.length} transactions required but jito bundles are not currently supported`);
@@ -277,6 +286,7 @@ class TransactionsManager {
277
286
  this.statuses.splice(statusesStartIdx + i, itemSets.length - i, ...newItemSets.map((x) => ({
278
287
  name: x.name(),
279
288
  status: TransactionStatus.Queued,
289
+ attemptNum: 0,
280
290
  })));
281
291
  this.txHandler.log(this.statuses);
282
292
  itemSets.splice(i + 1, itemSets.length - i - 1, ...newItemSets.slice(1));
@@ -294,15 +304,21 @@ class TransactionsManager {
294
304
  }
295
305
  const tx = await itemSet.getSingleTransaction();
296
306
  if (tx.getInstructions().length === 0) {
297
- this.updateStatus(itemSet.name(), TransactionStatus.Skipped);
307
+ this.updateStatus(itemSet.name(), TransactionStatus.Skipped, attemptNum);
298
308
  }
299
309
  else {
300
- this.updateStatus(itemSet.name(), TransactionStatus.Processing);
310
+ this.updateStatus(itemSet.name(), TransactionStatus.Processing, attemptNum);
301
311
  if (this.txHandler.localTest) {
302
312
  await this.debugAccounts(itemSet, tx);
303
313
  }
304
- const txSig = await (0, solanaUtils_1.sendSingleOptimizedTransaction)(this.txHandler.umi, this.txHandler.connection, tx, this.txType, attemptNum, prioritySetting);
305
- this.updateStatus(itemSet.name(), TransactionStatus.Successful, txSig ? bs58_1.default.encode(txSig) : undefined);
314
+ try {
315
+ const txSig = await (0, solanaUtils_1.sendSingleOptimizedTransaction)(this.txHandler.umi, this.txHandler.connection, tx, this.txType, attemptNum, prioritySetting);
316
+ this.updateStatus(itemSet.name(), TransactionStatus.Successful, attemptNum, txSig ? bs58_1.default.encode(txSig) : undefined);
317
+ }
318
+ catch (e) {
319
+ this.updateStatus(itemSet.name(), TransactionStatus.Failed, attemptNum);
320
+ throw e;
321
+ }
306
322
  }
307
323
  }, 4, 150, this.errorsToThrow);
308
324
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haven-fi/solauto-sdk",
3
- "version": "1.0.140",
3
+ "version": "1.0.142",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "description": "Typescript SDK for the Solauto program on the Solana blockchain",
@@ -48,7 +48,9 @@ class LookupTables {
48
48
  }
49
49
 
50
50
  reset() {
51
- this.cache = this.cache.filter(x => this.defaultLuts.includes(x.publicKey.toString()));
51
+ this.cache = this.cache.filter((x) =>
52
+ this.defaultLuts.includes(x.publicKey.toString())
53
+ );
52
54
  }
53
55
  }
54
56
 
@@ -172,12 +174,14 @@ export enum TransactionStatus {
172
174
  Processing = "Processing",
173
175
  Queued = "Queued",
174
176
  Successful = "Successful",
177
+ Failed = "Failed",
175
178
  }
176
179
 
177
180
  export type TransactionManagerStatuses = {
178
181
  name: string;
179
182
  status: TransactionStatus;
180
183
  txSig?: string;
184
+ attemptNum: number;
181
185
  }[];
182
186
 
183
187
  export class TransactionsManager {
@@ -237,16 +241,23 @@ export class TransactionsManager {
237
241
  return transactionSets;
238
242
  }
239
243
 
240
- updateStatus(name: string, status: TransactionStatus, txSig?: string) {
244
+ updateStatus(
245
+ name: string,
246
+ status: TransactionStatus,
247
+ attemptNum: number,
248
+ txSig?: string
249
+ ) {
241
250
  if (!this.statuses.filter((x) => x.name === name)) {
242
- this.statuses.push({ name, status, txSig });
251
+ this.statuses.push({ name, status, txSig, attemptNum });
243
252
  } else {
244
- const idx = this.statuses.findIndex((x) => x.name === name);
253
+ const idx = this.statuses.findIndex(
254
+ (x) => x.name === name && x.attemptNum === attemptNum
255
+ );
245
256
  if (idx !== -1) {
246
257
  this.statuses[idx].status = status;
247
258
  this.statuses[idx].txSig = txSig;
248
259
  } else {
249
- this.statuses.push({ name, status, txSig });
260
+ this.statuses.push({ name, status, txSig, attemptNum });
250
261
  }
251
262
  }
252
263
  this.txHandler.log(`${name} is ${status.toString().toLowerCase()}`);
@@ -288,22 +299,41 @@ export class TransactionsManager {
288
299
  updateLookupTable.updateLutTx.getInstructions().length > 0 &&
289
300
  updateLookupTable?.needsToBeIsolated
290
301
  ) {
291
- this.updateStatus(updateLutTxName, TransactionStatus.Processing);
292
302
  await retryWithExponentialBackoff(
293
- async (attemptNum) =>
294
- await sendSingleOptimizedTransaction(
295
- this.txHandler.umi,
296
- this.txHandler.connection,
297
- updateLookupTable.updateLutTx,
298
- this.txType,
299
- attemptNum,
300
- prioritySetting
301
- ),
303
+ async (attemptNum) => {
304
+ this.updateStatus(
305
+ updateLutTxName,
306
+ TransactionStatus.Processing,
307
+ attemptNum
308
+ );
309
+ try {
310
+ const txSig = await sendSingleOptimizedTransaction(
311
+ this.txHandler.umi,
312
+ this.txHandler.connection,
313
+ updateLookupTable.updateLutTx,
314
+ this.txType,
315
+ attemptNum,
316
+ prioritySetting
317
+ );
318
+ this.updateStatus(
319
+ updateLutTxName,
320
+ TransactionStatus.Successful,
321
+ attemptNum,
322
+ txSig ? bs58.encode(txSig) : undefined
323
+ );
324
+ } catch (e) {
325
+ this.updateStatus(
326
+ updateLutTxName,
327
+ TransactionStatus.Failed,
328
+ attemptNum
329
+ );
330
+ throw e;
331
+ }
332
+ },
302
333
  3,
303
334
  150,
304
335
  this.errorsToThrow
305
336
  );
306
- this.updateStatus(updateLutTxName, TransactionStatus.Successful);
307
337
  }
308
338
 
309
339
  this.lookupTables.defaultLuts = client.defaultLookupTables();
@@ -359,7 +389,7 @@ export class TransactionsManager {
359
389
  prioritySetting?: PriorityFeeSetting,
360
390
  initialized?: boolean
361
391
  ): Promise<TransactionManagerStatuses> {
362
- this.statuses = []
392
+ this.statuses = [];
363
393
  this.lookupTables.reset();
364
394
 
365
395
  if (!initialized) {
@@ -371,7 +401,7 @@ export class TransactionsManager {
371
401
  const itemSets = await this.assembleTransactionSets(items);
372
402
  const statusesStartIdx = this.statuses.length;
373
403
  for (const itemSet of itemSets) {
374
- this.updateStatus(itemSet.name(), TransactionStatus.Queued);
404
+ this.updateStatus(itemSet.name(), TransactionStatus.Queued, 0);
375
405
  }
376
406
 
377
407
  if (this.mustBeAtomic && itemSets.length > 1) {
@@ -411,6 +441,7 @@ export class TransactionsManager {
411
441
  ...newItemSets.map((x) => ({
412
442
  name: x.name(),
413
443
  status: TransactionStatus.Queued,
444
+ attemptNum: 0,
414
445
  }))
415
446
  );
416
447
  this.txHandler.log(this.statuses);
@@ -436,27 +467,45 @@ export class TransactionsManager {
436
467
  const tx = await itemSet.getSingleTransaction();
437
468
 
438
469
  if (tx.getInstructions().length === 0) {
439
- this.updateStatus(itemSet.name(), TransactionStatus.Skipped);
470
+ this.updateStatus(
471
+ itemSet.name(),
472
+ TransactionStatus.Skipped,
473
+ attemptNum
474
+ );
440
475
  } else {
441
- this.updateStatus(itemSet.name(), TransactionStatus.Processing);
476
+ this.updateStatus(
477
+ itemSet.name(),
478
+ TransactionStatus.Processing,
479
+ attemptNum
480
+ );
442
481
 
443
482
  if (this.txHandler.localTest) {
444
483
  await this.debugAccounts(itemSet, tx);
445
484
  }
446
485
 
447
- const txSig = await sendSingleOptimizedTransaction(
448
- this.txHandler.umi,
449
- this.txHandler.connection,
450
- tx,
451
- this.txType,
452
- attemptNum,
453
- prioritySetting
454
- );
455
- this.updateStatus(
456
- itemSet.name(),
457
- TransactionStatus.Successful,
458
- txSig ? bs58.encode(txSig) : undefined
459
- );
486
+ try {
487
+ const txSig = await sendSingleOptimizedTransaction(
488
+ this.txHandler.umi,
489
+ this.txHandler.connection,
490
+ tx,
491
+ this.txType,
492
+ attemptNum,
493
+ prioritySetting
494
+ );
495
+ this.updateStatus(
496
+ itemSet.name(),
497
+ TransactionStatus.Successful,
498
+ attemptNum,
499
+ txSig ? bs58.encode(txSig) : undefined
500
+ );
501
+ } catch (e) {
502
+ this.updateStatus(
503
+ itemSet.name(),
504
+ TransactionStatus.Failed,
505
+ attemptNum
506
+ );
507
+ throw e;
508
+ }
460
509
  }
461
510
  },
462
511
  4,