@haven-fi/solauto-sdk 1.0.16 → 1.0.18

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,6 @@
1
1
  import { TransactionBuilder } from "@metaplex-foundation/umi";
2
2
  import { SolautoClient } from "../clients/solautoClient";
3
+ import { ErrorsToThrow } from "../utils/generalUtils";
3
4
  export declare class TransactionItem {
4
5
  fetchTx: (attemptNum: number) => Promise<{
5
6
  tx: TransactionBuilder;
@@ -33,9 +34,10 @@ export declare class TransactionsManager {
33
34
  private statusCallback?;
34
35
  private simulateOnly?;
35
36
  private mustBeAtomic?;
37
+ private errorsToThrow?;
36
38
  private statuses;
37
39
  private lookupTables;
38
- constructor(client: SolautoClient, items: TransactionItem[], statusCallback?: ((statuses: TransactionManagerStatuses) => void) | undefined, simulateOnly?: boolean | undefined, mustBeAtomic?: boolean | undefined);
40
+ constructor(client: SolautoClient, items: TransactionItem[], statusCallback?: ((statuses: TransactionManagerStatuses) => void) | undefined, simulateOnly?: boolean | undefined, mustBeAtomic?: boolean | undefined, errorsToThrow?: ErrorsToThrow | undefined);
39
41
  private assembleTransactionSets;
40
42
  updateStatus(name: string, status: TransactionStatus, txSig?: string): void;
41
43
  send(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"transactionsManager.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionsManager.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAyCzD,qBAAa,eAAe;IAKjB,OAAO,EAAE,CACd,UAAU,EAAE,MAAM,KACf,OAAO,CACV;QAAE,EAAE,EAAE,kBAAkB,CAAC;QAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,SAAS,CACxE;IACM,IAAI,CAAC;IATd,oBAAoB,EAAG,MAAM,EAAE,CAAC;IAChC,EAAE,CAAC,EAAE,kBAAkB,CAAC;gBAGf,OAAO,EAAE,CACd,UAAU,EAAE,MAAM,KACf,OAAO,CACV;QAAE,EAAE,EAAE,kBAAkB,CAAC;QAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,SAAS,CACxE,EACM,IAAI,CAAC,oBAAQ;IAGhB,UAAU;IAIV,OAAO,CAAC,UAAU,EAAE,MAAM;IAMhC,cAAc,IAAI,MAAM,EAAE;CAY3B;AAgFD,oBAAY,iBAAiB;IAC3B,OAAO,YAAY;IACnB,UAAU,eAAe;IACzB,MAAM,WAAW;IACjB,UAAU,eAAe;CAC1B;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,iBAAiB,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,EAAE,CAAC;AAEJ,qBAAa,mBAAmB;IAK5B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,cAAc,CAAC;IACvB,OAAO,CAAC,YAAY,CAAC;IACrB,OAAO,CAAC,YAAY,CAAC;IARvB,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,YAAY,CAAe;gBAGzB,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,eAAe,EAAE,EACxB,cAAc,CAAC,6CAA4C,IAAI,aAAA,EAC/D,YAAY,CAAC,qBAAS,EACtB,YAAY,CAAC,qBAAS;YAKlB,uBAAuB;IAsCrC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,KAAK,CAAC,EAAE,MAAM;IAgB9D,IAAI;CAuIX"}
1
+ {"version":3,"file":"transactionsManager.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionsManager.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAKzD,OAAO,EACL,aAAa,EAEd,MAAM,uBAAuB,CAAC;AAqC/B,qBAAa,eAAe;IAKjB,OAAO,EAAE,CACd,UAAU,EAAE,MAAM,KACf,OAAO,CACV;QAAE,EAAE,EAAE,kBAAkB,CAAC;QAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,SAAS,CACxE;IACM,IAAI,CAAC;IATd,oBAAoB,EAAG,MAAM,EAAE,CAAC;IAChC,EAAE,CAAC,EAAE,kBAAkB,CAAC;gBAGf,OAAO,EAAE,CACd,UAAU,EAAE,MAAM,KACf,OAAO,CACV;QAAE,EAAE,EAAE,kBAAkB,CAAC;QAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,SAAS,CACxE,EACM,IAAI,CAAC,oBAAQ;IAGhB,UAAU;IAIV,OAAO,CAAC,UAAU,EAAE,MAAM;IAMhC,cAAc,IAAI,MAAM,EAAE;CAY3B;AAgFD,oBAAY,iBAAiB;IAC3B,OAAO,YAAY;IACnB,UAAU,eAAe;IACzB,MAAM,WAAW;IACjB,UAAU,eAAe;CAC1B;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,iBAAiB,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,EAAE,CAAC;AAEJ,qBAAa,mBAAmB;IAK5B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,cAAc,CAAC;IACvB,OAAO,CAAC,YAAY,CAAC;IACrB,OAAO,CAAC,YAAY,CAAC;IACrB,OAAO,CAAC,aAAa,CAAC;IATxB,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,YAAY,CAAe;gBAGzB,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,eAAe,EAAE,EACxB,cAAc,CAAC,6CAA4C,IAAI,aAAA,EAC/D,YAAY,CAAC,qBAAS,EACtB,YAAY,CAAC,qBAAS,EACtB,aAAa,CAAC,2BAAe;YAKzB,uBAAuB;IAsCrC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,KAAK,CAAC,EAAE,MAAM;IAgB9D,IAAI;CA8IX"}
@@ -15,13 +15,14 @@ class LookupTables {
15
15
  this.client = client;
16
16
  this.defaultLuts = [];
17
17
  this.cache = [];
18
- this.defaultLuts = [
19
- client.authorityLutAddress.toString(),
20
- ...client.defaultLookupTables(),
21
- ];
18
+ this.defaultLuts = [...client.defaultLookupTables()];
22
19
  }
23
20
  async getLutInputs(additionalAddresses) {
24
- const addresses = [...this.defaultLuts, ...additionalAddresses];
21
+ const addresses = [
22
+ ...this.defaultLuts,
23
+ this.client.authorityLutAddress.toString(),
24
+ ...additionalAddresses,
25
+ ];
25
26
  const currentCacheAddresses = this.cache.map((x) => x.publicKey.toString());
26
27
  const missingAddresses = addresses.filter((x) => !currentCacheAddresses.includes(x));
27
28
  if (missingAddresses) {
@@ -119,12 +120,13 @@ var TransactionStatus;
119
120
  TransactionStatus["Successful"] = "Successful";
120
121
  })(TransactionStatus = exports.TransactionStatus || (exports.TransactionStatus = {}));
121
122
  class TransactionsManager {
122
- constructor(client, items, statusCallback, simulateOnly, mustBeAtomic) {
123
+ constructor(client, items, statusCallback, simulateOnly, mustBeAtomic, errorsToThrow) {
123
124
  this.client = client;
124
125
  this.items = items;
125
126
  this.statusCallback = statusCallback;
126
127
  this.simulateOnly = simulateOnly;
127
128
  this.mustBeAtomic = mustBeAtomic;
129
+ this.errorsToThrow = errorsToThrow;
128
130
  this.statuses = [];
129
131
  this.lookupTables = new LookupTables(client);
130
132
  }
@@ -178,7 +180,7 @@ class TransactionsManager {
178
180
  const updateLookupTable = await this.client.updateLookupTable();
179
181
  if (updateLookupTable && updateLookupTable?.needsToBeIsolated) {
180
182
  this.updateStatus("update lookup table", TransactionStatus.Processing);
181
- await (0, generalUtils_1.retryWithExponentialBackoff)(async (attemptNum) => await (0, solanaUtils_1.sendSingleOptimizedTransaction)(this.client.umi, this.client.connection, updateLookupTable.updateLutTx, this.simulateOnly, attemptNum), 2);
183
+ await (0, generalUtils_1.retryWithExponentialBackoff)(async (attemptNum) => await (0, solanaUtils_1.sendSingleOptimizedTransaction)(this.client.umi, this.client.connection, updateLookupTable.updateLutTx, this.simulateOnly, attemptNum), 2, undefined, this.errorsToThrow);
182
184
  this.updateStatus("update lookup table", TransactionStatus.Successful);
183
185
  }
184
186
  for (const item of this.items) {
@@ -254,7 +256,7 @@ class TransactionsManager {
254
256
  const txSig = await (0, solanaUtils_1.sendSingleOptimizedTransaction)(this.client.umi, this.client.connection, tx, this.simulateOnly, attemptNum);
255
257
  this.updateStatus(itemSet.name(), TransactionStatus.Successful, txSig ? bs58_1.default.encode(txSig) : undefined);
256
258
  }
257
- }, 3);
259
+ }, 3, undefined, this.errorsToThrow);
258
260
  }
259
261
  }
260
262
  if (!this.simulateOnly) {
@@ -7,5 +7,6 @@ export declare function getSolanaAccountCreated(umi: Umi, pk: PublicKey): Promis
7
7
  export declare function rpcAccountCreated(account: MaybeRpcAccount): boolean;
8
8
  export declare function arraysAreEqual(arrayA: number[], arrayB: number[]): boolean;
9
9
  export declare function getTokenPrices(mints: PublicKey[]): Promise<number[]>;
10
- export declare function retryWithExponentialBackoff<T>(fn: (attemptNum: number) => Promise<T>, retries?: number, delay?: number, errorsToRetry?: Set<Function>): Promise<T>;
10
+ export type ErrorsToThrow = Array<new (...args: any[]) => Error>;
11
+ export declare function retryWithExponentialBackoff<T>(fn: (attemptNum: number) => Promise<T>, retries?: number, delay?: number, errorsToThrow?: ErrorsToThrow): Promise<T>;
11
12
  //# sourceMappingURL=generalUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"generalUtils.d.ts","sourceRoot":"","sources":["../../src/utils/generalUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAa,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAK3E,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAO1C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAGvF;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAEnE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAU1E;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA+C1E;AAED,wBAAgB,2BAA2B,CAAC,CAAC,EAC3C,EAAE,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EACtC,OAAO,GAAE,MAAU,EACnB,KAAK,GAAE,MAAY,EACnB,aAAa,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,GAC5B,OAAO,CAAC,CAAC,CAAC,CAwBZ"}
1
+ {"version":3,"file":"generalUtils.d.ts","sourceRoot":"","sources":["../../src/utils/generalUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAa,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAK3E,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAO1C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,SAAS,GACZ,OAAO,CAAC,OAAO,CAAC,CAGlB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAEnE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAU1E;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAiD1E;AAED,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,KAAK,CAAC,CAAC;AAEjE,wBAAgB,2BAA2B,CAAC,CAAC,EAC3C,EAAE,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EACtC,OAAO,GAAE,MAAU,EACnB,KAAK,GAAE,MAAY,EACnB,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAAC,CAAC,CAAC,CA8BZ"}
@@ -45,9 +45,10 @@ function arraysAreEqual(arrayA, arrayB) {
45
45
  exports.arraysAreEqual = arraysAreEqual;
46
46
  async function getTokenPrices(mints) {
47
47
  const currentTime = currentUnixSeconds();
48
- if (!mints.some(mint => !(mint.toString() in solautoConstants_1.PRICES) || currentTime - solautoConstants_1.PRICES[mint.toString()].time > 3)) {
48
+ if (!mints.some((mint) => !(mint.toString() in solautoConstants_1.PRICES) ||
49
+ currentTime - solautoConstants_1.PRICES[mint.toString()].time > 3)) {
49
50
  console.log("Accessing price cache");
50
- return mints.map(mint => solautoConstants_1.PRICES[mint.toString()].price);
51
+ return mints.map((mint) => solautoConstants_1.PRICES[mint.toString()].price);
51
52
  }
52
53
  console.log("Fetching prices...");
53
54
  const priceFeedIds = mints.map((mint) => pythConstants_1.PYTH_PRICE_FEED_IDS[mint.toString()]);
@@ -74,21 +75,25 @@ async function getTokenPrices(mints) {
74
75
  for (var i = 0; i < mints.length; i++) {
75
76
  solautoConstants_1.PRICES[mints[i].toString()] = {
76
77
  price: prices[i],
77
- time: currentUnixSeconds()
78
+ time: currentUnixSeconds(),
78
79
  };
79
80
  }
80
81
  return prices;
81
82
  }
82
83
  exports.getTokenPrices = getTokenPrices;
83
- function retryWithExponentialBackoff(fn, retries = 5, delay = 150, errorsToRetry) {
84
+ function retryWithExponentialBackoff(fn, retries = 5, delay = 150, errorsToThrow) {
84
85
  return new Promise((resolve, reject) => {
85
86
  const attempt = (attemptNum) => {
86
87
  fn(attemptNum)
87
88
  .then(resolve)
88
89
  .catch((error) => {
89
90
  attemptNum++;
90
- if (attemptNum < retries &&
91
- (!errorsToRetry || errorsToRetry.has(error.constructor))) {
91
+ if (errorsToThrow &&
92
+ errorsToThrow.some((errorType) => error instanceof errorType)) {
93
+ reject(error);
94
+ return;
95
+ }
96
+ if (attemptNum < retries) {
92
97
  console.log(error);
93
98
  setTimeout(() => {
94
99
  console.log("Retrying...");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haven-fi/solauto-sdk",
3
- "version": "1.0.16",
3
+ "version": "1.0.18",
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",
@@ -9,7 +9,10 @@ import {
9
9
  getAdressLookupInputs,
10
10
  sendSingleOptimizedTransaction,
11
11
  } from "../utils/solanaUtils";
12
- import { retryWithExponentialBackoff } from "../utils/generalUtils";
12
+ import {
13
+ ErrorsToThrow,
14
+ retryWithExponentialBackoff,
15
+ } from "../utils/generalUtils";
13
16
  import { getTransactionChores } from "./transactionUtils";
14
17
  // import { sendJitoBundledTransactions } from "../utils/jitoUtils";
15
18
 
@@ -18,16 +21,17 @@ class LookupTables {
18
21
  cache: AddressLookupTableInput[] = [];
19
22
 
20
23
  constructor(private client: SolautoClient) {
21
- this.defaultLuts = [
22
- client.authorityLutAddress!.toString(),
23
- ...client.defaultLookupTables(),
24
- ];
24
+ this.defaultLuts = [...client.defaultLookupTables()];
25
25
  }
26
26
 
27
27
  async getLutInputs(
28
28
  additionalAddresses: string[]
29
29
  ): Promise<AddressLookupTableInput[]> {
30
- const addresses = [...this.defaultLuts, ...additionalAddresses];
30
+ const addresses = [
31
+ ...this.defaultLuts,
32
+ this.client.authorityLutAddress!.toString(),
33
+ ...additionalAddresses,
34
+ ];
31
35
  const currentCacheAddresses = this.cache.map((x) => x.publicKey.toString());
32
36
 
33
37
  const missingAddresses = addresses.filter(
@@ -182,7 +186,8 @@ export class TransactionsManager {
182
186
  private items: TransactionItem[],
183
187
  private statusCallback?: (statuses: TransactionManagerStatuses) => void,
184
188
  private simulateOnly?: boolean,
185
- private mustBeAtomic?: boolean
189
+ private mustBeAtomic?: boolean,
190
+ private errorsToThrow?: ErrorsToThrow
186
191
  ) {
187
192
  this.lookupTables = new LookupTables(client);
188
193
  }
@@ -254,7 +259,9 @@ export class TransactionsManager {
254
259
  this.simulateOnly,
255
260
  attemptNum
256
261
  ),
257
- 2
262
+ 2,
263
+ undefined,
264
+ this.errorsToThrow
258
265
  );
259
266
  this.updateStatus("update lookup table", TransactionStatus.Successful);
260
267
  }
@@ -344,31 +351,36 @@ export class TransactionsManager {
344
351
  };
345
352
 
346
353
  let itemSet = itemSets[i];
347
- await retryWithExponentialBackoff(async (attemptNum) => {
348
- itemSet =
349
- i > 0 || attemptNum > 0
350
- ? await getFreshItemSet(itemSet, attemptNum)
351
- : itemSet;
352
- const tx = await itemSet.getSingleTransaction();
353
-
354
- if (tx.getInstructions().length === 0) {
355
- this.updateStatus(itemSet.name(), TransactionStatus.Skipped);
356
- } else {
357
- this.updateStatus(itemSet.name(), TransactionStatus.Processing);
358
- const txSig = await sendSingleOptimizedTransaction(
359
- this.client.umi,
360
- this.client.connection,
361
- tx,
362
- this.simulateOnly,
363
- attemptNum
364
- );
365
- this.updateStatus(
366
- itemSet.name(),
367
- TransactionStatus.Successful,
368
- txSig ? bs58.encode(txSig) : undefined
369
- );
370
- }
371
- }, 3);
354
+ await retryWithExponentialBackoff(
355
+ async (attemptNum) => {
356
+ itemSet =
357
+ i > 0 || attemptNum > 0
358
+ ? await getFreshItemSet(itemSet, attemptNum)
359
+ : itemSet;
360
+ const tx = await itemSet.getSingleTransaction();
361
+
362
+ if (tx.getInstructions().length === 0) {
363
+ this.updateStatus(itemSet.name(), TransactionStatus.Skipped);
364
+ } else {
365
+ this.updateStatus(itemSet.name(), TransactionStatus.Processing);
366
+ const txSig = await sendSingleOptimizedTransaction(
367
+ this.client.umi,
368
+ this.client.connection,
369
+ tx,
370
+ this.simulateOnly,
371
+ attemptNum
372
+ );
373
+ this.updateStatus(
374
+ itemSet.name(),
375
+ TransactionStatus.Successful,
376
+ txSig ? bs58.encode(txSig) : undefined
377
+ );
378
+ }
379
+ },
380
+ 3,
381
+ undefined,
382
+ this.errorsToThrow
383
+ );
372
384
  }
373
385
  }
374
386
 
@@ -21,7 +21,10 @@ export function currentUnixSeconds(): number {
21
21
  return Math.round(new Date().getTime() / 1000);
22
22
  }
23
23
 
24
- export async function getSolanaAccountCreated(umi: Umi, pk: PublicKey): Promise<boolean> {
24
+ export async function getSolanaAccountCreated(
25
+ umi: Umi,
26
+ pk: PublicKey
27
+ ): Promise<boolean> {
25
28
  const account = await umi.rpc.getAccount(publicKey(pk));
26
29
  return rpcAccountCreated(account);
27
30
  }
@@ -44,9 +47,15 @@ export function arraysAreEqual(arrayA: number[], arrayB: number[]): boolean {
44
47
 
45
48
  export async function getTokenPrices(mints: PublicKey[]): Promise<number[]> {
46
49
  const currentTime = currentUnixSeconds();
47
- if (!mints.some(mint => !(mint.toString() in PRICES) || currentTime - PRICES[mint.toString()].time > 3)) {
50
+ if (
51
+ !mints.some(
52
+ (mint) =>
53
+ !(mint.toString() in PRICES) ||
54
+ currentTime - PRICES[mint.toString()].time > 3
55
+ )
56
+ ) {
48
57
  console.log("Accessing price cache");
49
- return mints.map(mint => PRICES[mint.toString()].price);
58
+ return mints.map((mint) => PRICES[mint.toString()].price);
50
59
  }
51
60
 
52
61
  console.log("Fetching prices...");
@@ -71,10 +80,7 @@ export async function getTokenPrices(mints: PublicKey[]): Promise<number[]> {
71
80
  if (x.price.expo > 0) {
72
81
  return Number(toBaseUnit(Number(x.price.price), x.price.expo));
73
82
  } else if (x.price.expo < 0) {
74
- return fromBaseUnit(
75
- BigInt(x.price.price),
76
- Math.abs(x.price.expo)
77
- );
83
+ return fromBaseUnit(BigInt(x.price.price), Math.abs(x.price.expo));
78
84
  } else {
79
85
  return Number(x.price.price);
80
86
  }
@@ -83,19 +89,20 @@ export async function getTokenPrices(mints: PublicKey[]): Promise<number[]> {
83
89
  for (var i = 0; i < mints.length; i++) {
84
90
  PRICES[mints[i].toString()] = {
85
91
  price: prices[i],
86
- time: currentUnixSeconds()
92
+ time: currentUnixSeconds(),
87
93
  };
88
94
  }
89
95
 
90
-
91
96
  return prices;
92
97
  }
93
98
 
99
+ export type ErrorsToThrow = Array<new (...args: any[]) => Error>;
100
+
94
101
  export function retryWithExponentialBackoff<T>(
95
102
  fn: (attemptNum: number) => Promise<T>,
96
103
  retries: number = 5,
97
104
  delay: number = 150,
98
- errorsToRetry?: Set<Function>
105
+ errorsToThrow?: ErrorsToThrow
99
106
  ): Promise<T> {
100
107
  return new Promise((resolve, reject) => {
101
108
  const attempt = (attemptNum: number) => {
@@ -103,10 +110,16 @@ export function retryWithExponentialBackoff<T>(
103
110
  .then(resolve)
104
111
  .catch((error: Error) => {
105
112
  attemptNum++;
113
+
106
114
  if (
107
- attemptNum < retries &&
108
- (!errorsToRetry || errorsToRetry.has(error.constructor))
115
+ errorsToThrow &&
116
+ errorsToThrow.some((errorType) => error instanceof errorType)
109
117
  ) {
118
+ reject(error);
119
+ return;
120
+ }
121
+
122
+ if (attemptNum < retries) {
110
123
  console.log(error);
111
124
  setTimeout(() => {
112
125
  console.log("Retrying...");