@haven-fi/solauto-sdk 1.0.238 → 1.0.239

Sign up to get free protection for your applications and to get access to all the features.
@@ -35,18 +35,19 @@ export declare class TransactionsManager {
35
35
  private txHandler;
36
36
  private statusCallback?;
37
37
  private txType?;
38
- private mustBeAtomic?;
38
+ private priorityFeeSetting;
39
39
  private errorsToThrow?;
40
40
  private retries;
41
41
  private retryDelay;
42
42
  private statuses;
43
43
  private lookupTables;
44
- constructor(txHandler: SolautoClient | ReferralStateManager, statusCallback?: ((statuses: TransactionManagerStatuses) => void) | undefined, txType?: TransactionRunType | undefined, mustBeAtomic?: boolean | undefined, errorsToThrow?: ErrorsToThrow | undefined, retries?: number, retryDelay?: number);
44
+ constructor(txHandler: SolautoClient | ReferralStateManager, statusCallback?: ((statuses: TransactionManagerStatuses) => void) | undefined, txType?: TransactionRunType | undefined, priorityFeeSetting?: PriorityFeeSetting, errorsToThrow?: ErrorsToThrow | undefined, retries?: number, retryDelay?: number);
45
45
  private assembleTransactionSets;
46
46
  private updateStatus;
47
47
  private debugAccounts;
48
- clientSend(transactions: TransactionItem[], prioritySetting?: PriorityFeeSetting): Promise<TransactionManagerStatuses>;
49
- send(items: TransactionItem[], prioritySetting?: PriorityFeeSetting, initialized?: boolean): Promise<TransactionManagerStatuses>;
48
+ private getUpdatedPriorityFeeSetting;
49
+ clientSend(transactions: TransactionItem[]): Promise<TransactionManagerStatuses>;
50
+ send(items: TransactionItem[], initialized?: boolean): Promise<TransactionManagerStatuses>;
50
51
  private sendTransaction;
51
52
  }
52
53
  //# sourceMappingURL=transactionsManager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"transactionsManager.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionsManager.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,kBAAkB,EAEnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAKzD,OAAO,EACL,aAAa,EAEd,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,oBAAoB,EAAa,MAAM,YAAY,CAAC;AAG7D,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,OAAO,EAAE,MAAM;CAK5B;AAqCD,qBAAa,eAAe;IAKjB,OAAO,EAAE,CACd,UAAU,EAAE,MAAM,KACf,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;IACxC,IAAI,CAAC,EAAE,MAAM;IAPtB,oBAAoB,EAAG,MAAM,EAAE,CAAC;IAChC,EAAE,CAAC,EAAE,kBAAkB,CAAC;gBAGf,OAAO,EAAE,CACd,UAAU,EAAE,MAAM,KACf,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,EACxC,IAAI,CAAC,EAAE,MAAM,YAAA;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;IACzB,MAAM,WAAW;CAClB;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,EAAE,CAAC;AAEJ,qBAAa,mBAAmB;IAK5B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,cAAc,CAAC;IACvB,OAAO,CAAC,MAAM,CAAC;IACf,OAAO,CAAC,YAAY,CAAC;IACrB,OAAO,CAAC,aAAa,CAAC;IACtB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,UAAU;IAVpB,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,YAAY,CAAe;gBAGzB,SAAS,EAAE,aAAa,GAAG,oBAAoB,EAC/C,cAAc,CAAC,GAAE,CAAC,QAAQ,EAAE,0BAA0B,KAAK,IAAI,aAAA,EAC/D,MAAM,CAAC,EAAE,kBAAkB,YAAA,EAC3B,YAAY,CAAC,EAAE,OAAO,YAAA,EACtB,aAAa,CAAC,EAAE,aAAa,YAAA,EAC7B,OAAO,GAAE,MAAU,EACnB,UAAU,GAAE,MAAY;YAQpB,uBAAuB;IAwCrC,OAAO,CAAC,YAAY;YA8CN,aAAa;IAoBd,UAAU,CACrB,YAAY,EAAE,eAAe,EAAE,EAC/B,eAAe,CAAC,EAAE,kBAAkB,GACnC,OAAO,CAAC,0BAA0B,CAAC;IAyEzB,IAAI,CACf,KAAK,EAAE,eAAe,EAAE,EACxB,eAAe,CAAC,EAAE,kBAAkB,EACpC,WAAW,CAAC,EAAE,OAAO,GACpB,OAAO,CAAC,0BAA0B,CAAC;YAwGxB,eAAe;CAkD9B"}
1
+ {"version":3,"file":"transactionsManager.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionsManager.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,kBAAkB,EAEnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAKzD,OAAO,EACL,aAAa,EAEd,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,kBAAkB,EAElB,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,oBAAoB,EAAa,MAAM,YAAY,CAAC;AAI7D,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,OAAO,EAAE,MAAM;CAK5B;AAqCD,qBAAa,eAAe;IAKjB,OAAO,EAAE,CACd,UAAU,EAAE,MAAM,KACf,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;IACxC,IAAI,CAAC,EAAE,MAAM;IAPtB,oBAAoB,EAAG,MAAM,EAAE,CAAC;IAChC,EAAE,CAAC,EAAE,kBAAkB,CAAC;gBAGf,OAAO,EAAE,CACd,UAAU,EAAE,MAAM,KACf,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,EACxC,IAAI,CAAC,EAAE,MAAM,YAAA;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;IACzB,MAAM,WAAW;CAClB;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,EAAE,CAAC;AAEJ,qBAAa,mBAAmB;IAK5B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,cAAc,CAAC;IACvB,OAAO,CAAC,MAAM,CAAC;IACf,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,aAAa,CAAC;IACtB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,UAAU;IAVpB,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,YAAY,CAAe;gBAGzB,SAAS,EAAE,aAAa,GAAG,oBAAoB,EAC/C,cAAc,CAAC,GAAE,CAAC,QAAQ,EAAE,0BAA0B,KAAK,IAAI,aAAA,EAC/D,MAAM,CAAC,EAAE,kBAAkB,YAAA,EAC3B,kBAAkB,GAAE,kBAA2C,EAC/D,aAAa,CAAC,EAAE,aAAa,YAAA,EAC7B,OAAO,GAAE,MAAU,EACnB,UAAU,GAAE,MAAY;YAQpB,uBAAuB;IAwCrC,OAAO,CAAC,YAAY;YA8CN,aAAa;IAoB3B,OAAO,CAAC,4BAA4B;IAUvB,UAAU,CACrB,YAAY,EAAE,eAAe,EAAE,GAC9B,OAAO,CAAC,0BAA0B,CAAC;IAyEzB,IAAI,CACf,KAAK,EAAE,eAAe,EAAE,EACxB,WAAW,CAAC,EAAE,OAAO,GACpB,OAAO,CAAC,0BAA0B,CAAC;YA6FxB,eAAe;CAkD9B"}
@@ -9,11 +9,13 @@ const umi_1 = require("@metaplex-foundation/umi");
9
9
  const solanaUtils_1 = require("../utils/solanaUtils");
10
10
  const generalUtils_1 = require("../utils/generalUtils");
11
11
  const transactionUtils_1 = require("./transactionUtils");
12
+ const types_1 = require("../types");
13
+ const web3_js_1 = require("@solana/web3.js");
12
14
  // import { sendJitoBundledTransactions } from "../utils/jitoUtils";
13
15
  class TransactionTooLargeError extends Error {
14
16
  constructor(message) {
15
17
  super(message);
16
- this.name = 'TransactionTooLargeError';
18
+ this.name = "TransactionTooLargeError";
17
19
  Object.setPrototypeOf(this, TransactionTooLargeError.prototype);
18
20
  }
19
21
  }
@@ -127,11 +129,11 @@ var TransactionStatus;
127
129
  TransactionStatus["Failed"] = "Failed";
128
130
  })(TransactionStatus || (exports.TransactionStatus = TransactionStatus = {}));
129
131
  class TransactionsManager {
130
- constructor(txHandler, statusCallback, txType, mustBeAtomic, errorsToThrow, retries = 4, retryDelay = 150) {
132
+ constructor(txHandler, statusCallback, txType, priorityFeeSetting = types_1.PriorityFeeSetting.Min, errorsToThrow, retries = 4, retryDelay = 150) {
131
133
  this.txHandler = txHandler;
132
134
  this.statusCallback = statusCallback;
133
135
  this.txType = txType;
134
- this.mustBeAtomic = mustBeAtomic;
136
+ this.priorityFeeSetting = priorityFeeSetting;
135
137
  this.errorsToThrow = errorsToThrow;
136
138
  this.retries = retries;
137
139
  this.retryDelay = retryDelay;
@@ -222,7 +224,14 @@ class TransactionsManager {
222
224
  }
223
225
  }
224
226
  }
225
- async clientSend(transactions, prioritySetting) {
227
+ getUpdatedPriorityFeeSetting(prevError) {
228
+ if (prevError instanceof web3_js_1.TransactionExpiredBlockheightExceededError) {
229
+ const currIdx = types_1.priorityFeeSettingValues.indexOf(this.priorityFeeSetting);
230
+ return types_1.priorityFeeSettingValues[Math.min(types_1.priorityFeeSettingValues.length - 1, currIdx + 1)];
231
+ }
232
+ return this.priorityFeeSetting;
233
+ }
234
+ async clientSend(transactions) {
226
235
  const items = [...transactions];
227
236
  const client = this.txHandler;
228
237
  const updateLookupTable = await client.updateLookupTable();
@@ -230,7 +239,7 @@ class TransactionsManager {
230
239
  if (updateLookupTable &&
231
240
  updateLookupTable.updateLutTx.getInstructions().length > 0 &&
232
241
  updateLookupTable?.needsToBeIsolated) {
233
- await (0, generalUtils_1.retryWithExponentialBackoff)(async (attemptNum) => await this.sendTransaction(updateLookupTable.updateLutTx, updateLutTxName, attemptNum, prioritySetting), 3, 150, this.errorsToThrow);
242
+ await (0, generalUtils_1.retryWithExponentialBackoff)(async (attemptNum, prevError) => await this.sendTransaction(updateLookupTable.updateLutTx, updateLutTxName, attemptNum, this.getUpdatedPriorityFeeSetting(prevError)), 3, 150, this.errorsToThrow);
234
243
  }
235
244
  this.lookupTables.defaultLuts = client.defaultLookupTables();
236
245
  for (const item of items) {
@@ -254,7 +263,7 @@ class TransactionsManager {
254
263
  items.push(chore);
255
264
  this.txHandler.log("Chores after: ", choresAfter.getInstructions().length);
256
265
  }
257
- const result = await this.send(items, prioritySetting, true).catch((e) => {
266
+ const result = await this.send(items, true).catch((e) => {
258
267
  client.resetLiveTxUpdates(false);
259
268
  throw e;
260
269
  });
@@ -263,7 +272,7 @@ class TransactionsManager {
263
272
  }
264
273
  return result;
265
274
  }
266
- async send(items, prioritySetting, initialized) {
275
+ async send(items, initialized) {
267
276
  this.statuses = [];
268
277
  this.lookupTables.reset();
269
278
  if (!initialized) {
@@ -276,69 +285,56 @@ class TransactionsManager {
276
285
  for (const itemSet of itemSets) {
277
286
  this.updateStatus(itemSet.name(), TransactionStatus.Queued, 0);
278
287
  }
279
- if (this.mustBeAtomic && itemSets.length > 1) {
280
- throw new Error(`${itemSets.length} transactions required but jito bundles are not currently supported`);
281
- // itemSets.forEach((set) => {
282
- // this.updateStatus(set.name(), TransactionStatus.Processing);
283
- // });
284
- // await sendJitoBundledTransactions(
285
- // this.client,
286
- // await Promise.all(itemSets.map((x) => x.getSingleTransaction())),
287
- // this.simulateOnly
288
- // );
289
- // TODO: check if successful or not
290
- // itemSets.forEach((set) => {
291
- // this.updateStatus(set.name(), TransactionStatus.Successful);
292
- // });
288
+ if (this.txType === "only-simulate" && itemSets.length > 1) {
289
+ this.txHandler.log("Only simulate and more than 1 transaction. Skipping...");
290
+ return [];
293
291
  }
294
- else if (this.txType !== "only-simulate" || itemSets.length === 1) {
295
- for (let i = 0; i < itemSets.length; i++) {
296
- const getFreshItemSet = async (itemSet, attemptNum) => {
297
- await itemSet.refetchAll(attemptNum);
298
- const newItemSets = await this.assembleTransactionSets([
299
- ...itemSet.items,
300
- ...itemSets
301
- .slice(i + 1)
302
- .map((x) => x.items)
303
- .flat(),
304
- ]);
305
- if (newItemSets.length > 1) {
306
- this.statuses.splice(statusesStartIdx + i, itemSets.length - i, ...newItemSets.map((x) => ({
307
- name: x.name(),
308
- status: TransactionStatus.Queued,
309
- attemptNum: 0,
310
- })));
311
- this.txHandler.log(this.statuses);
312
- itemSets.splice(i + 1, itemSets.length - i - 1, ...newItemSets.slice(1));
313
- }
314
- return newItemSets.length > 0 ? newItemSets[0] : undefined;
315
- };
316
- let itemSet = itemSets[i];
317
- await (0, generalUtils_1.retryWithExponentialBackoff)(async (attemptNum) => {
318
- itemSet =
319
- i > 0 || attemptNum > 0
320
- ? await getFreshItemSet(itemSet, attemptNum)
321
- : itemSet;
322
- if (!itemSet) {
323
- return;
324
- }
325
- const tx = await itemSet.getSingleTransaction();
326
- if (tx.getInstructions().length === 0) {
327
- this.updateStatus(itemSet.name(), TransactionStatus.Skipped, attemptNum);
328
- }
329
- else {
330
- await this.debugAccounts(itemSet, tx);
331
- await this.sendTransaction(tx, itemSet.name(), attemptNum, prioritySetting);
332
- }
333
- }, this.retries, this.retryDelay, this.errorsToThrow);
334
- }
292
+ for (let i = 0; i < itemSets.length; i++) {
293
+ const getFreshItemSet = async (itemSet, attemptNum) => {
294
+ await itemSet.refetchAll(attemptNum);
295
+ const newItemSets = await this.assembleTransactionSets([
296
+ ...itemSet.items,
297
+ ...itemSets
298
+ .slice(i + 1)
299
+ .map((x) => x.items)
300
+ .flat(),
301
+ ]);
302
+ if (newItemSets.length > 1) {
303
+ this.statuses.splice(statusesStartIdx + i, itemSets.length - i, ...newItemSets.map((x) => ({
304
+ name: x.name(),
305
+ status: TransactionStatus.Queued,
306
+ attemptNum: 0,
307
+ })));
308
+ this.txHandler.log(this.statuses);
309
+ itemSets.splice(i + 1, itemSets.length - i - 1, ...newItemSets.slice(1));
310
+ }
311
+ return newItemSets.length > 0 ? newItemSets[0] : undefined;
312
+ };
313
+ let itemSet = itemSets[i];
314
+ await (0, generalUtils_1.retryWithExponentialBackoff)(async (attemptNum, prevError) => {
315
+ itemSet =
316
+ i > 0 || attemptNum > 0
317
+ ? await getFreshItemSet(itemSet, attemptNum)
318
+ : itemSet;
319
+ if (!itemSet) {
320
+ return;
321
+ }
322
+ const tx = await itemSet.getSingleTransaction();
323
+ if (tx.getInstructions().length === 0) {
324
+ this.updateStatus(itemSet.name(), TransactionStatus.Skipped, attemptNum);
325
+ }
326
+ else {
327
+ await this.debugAccounts(itemSet, tx);
328
+ await this.sendTransaction(tx, itemSet.name(), attemptNum, this.getUpdatedPriorityFeeSetting(prevError));
329
+ }
330
+ }, this.retries, this.retryDelay, this.errorsToThrow);
335
331
  }
336
332
  return this.statuses;
337
333
  }
338
- async sendTransaction(tx, txName, attemptNum, prioritySetting) {
334
+ async sendTransaction(tx, txName, attemptNum, priorityFeeSetting) {
339
335
  this.updateStatus(txName, TransactionStatus.Processing, attemptNum);
340
336
  try {
341
- const txSig = await (0, solanaUtils_1.sendSingleOptimizedTransaction)(this.txHandler.umi, this.txHandler.connection, tx, this.txType, prioritySetting, () => this.updateStatus(txName, TransactionStatus.Processing, attemptNum, undefined, true));
337
+ const txSig = await (0, solanaUtils_1.sendSingleOptimizedTransaction)(this.txHandler.umi, this.txHandler.connection, tx, this.txType, priorityFeeSetting, () => this.updateStatus(txName, TransactionStatus.Processing, attemptNum, undefined, true));
342
338
  this.updateStatus(txName, TransactionStatus.Successful, attemptNum, txSig ? bs58_1.default.encode(txSig) : undefined);
343
339
  }
344
340
  catch (e) {
@@ -18,6 +18,7 @@ export declare enum PriorityFeeSetting {
18
18
  Default = "Medium",
19
19
  High = "High"
20
20
  }
21
+ export declare const priorityFeeSettingValues: PriorityFeeSetting[];
21
22
  export type RebalanceAction = "boost" | "repay" | "dca";
22
23
  export type TransactionRunType = "skip-simulation" | "only-simulate" | "normal";
23
24
  export interface TransactionItemInputs {
@@ -1 +1 @@
1
- {"version":3,"file":"solauto.d.ts","sourceRoot":"","sources":["../../src/types/solauto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;IAC3B,eAAe,EAAE,eAAe,CAAC;IACjC,eAAe,CAAC,EAAE,SAAS,CAAC;IAC5B,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,oBAAY,kBAAkB;IAC5B,IAAI,SAAS;IACb,GAAG,QAAQ;IACX,GAAG,QAAQ;IACX,OAAO,WAAW;IAClB,IAAI,SAAS;CACd;AAED,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,CAAC;AAExD,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,GAAG,eAAe,GAAG,QAAQ,CAAC;AAEhF,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,kBAAkB,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC"}
1
+ {"version":3,"file":"solauto.d.ts","sourceRoot":"","sources":["../../src/types/solauto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;IAC3B,eAAe,EAAE,eAAe,CAAC;IACjC,eAAe,CAAC,EAAE,SAAS,CAAC;IAC5B,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,oBAAY,kBAAkB;IAC5B,IAAI,SAAS;IACb,GAAG,QAAQ;IACX,GAAG,QAAQ;IACX,OAAO,WAAW;IAClB,IAAI,SAAS;CACd;AAED,eAAO,MAAM,wBAAwB,EAAwC,kBAAkB,EAAE,CAAC;AAElG,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,CAAC;AAExD,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,GAAG,eAAe,GAAG,QAAQ,CAAC;AAEhF,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,kBAAkB,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PriorityFeeSetting = void 0;
3
+ exports.priorityFeeSettingValues = exports.PriorityFeeSetting = void 0;
4
4
  var PriorityFeeSetting;
5
5
  (function (PriorityFeeSetting) {
6
6
  PriorityFeeSetting["None"] = "None";
@@ -9,3 +9,4 @@ var PriorityFeeSetting;
9
9
  PriorityFeeSetting["Default"] = "Medium";
10
10
  PriorityFeeSetting["High"] = "High";
11
11
  })(PriorityFeeSetting || (exports.PriorityFeeSetting = PriorityFeeSetting = {}));
12
+ exports.priorityFeeSettingValues = Object.values(PriorityFeeSetting);
@@ -10,5 +10,5 @@ export declare function arraysAreEqual(arrayA: number[], arrayB: number[]): bool
10
10
  export declare function fetchTokenPrices(mints: PublicKey[]): Promise<number[]>;
11
11
  export declare function safeGetPrice(mint: PublicKey | UmiPublicKey | undefined): number | undefined;
12
12
  export type ErrorsToThrow = Array<new (...args: any[]) => Error>;
13
- export declare function retryWithExponentialBackoff<T>(fn: (attemptNum: number) => Promise<T>, retries?: number, delay?: number, errorsToThrow?: ErrorsToThrow): Promise<T>;
13
+ export declare function retryWithExponentialBackoff<T>(fn: (attemptNum: number, prevErr?: Error) => Promise<T>, retries?: number, delay?: number, errorsToThrow?: ErrorsToThrow): Promise<T>;
14
14
  //# 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,EACL,eAAe,EAEf,GAAG,EACH,SAAS,IAAI,YAAY,EAC1B,MAAM,0BAA0B,CAAC;AAKlC,wBAAgB,UAAU,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAI/C;AACD,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,CAKlB;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,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAsD5E;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,SAAS,GACzC,MAAM,GAAG,SAAS,CAKpB;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"}
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,EACL,eAAe,EAEf,GAAG,EACH,SAAS,IAAI,YAAY,EAC1B,MAAM,0BAA0B,CAAC;AAKlC,wBAAgB,UAAU,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAI/C;AACD,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,CAKlB;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,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAsD5E;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,SAAS,GACzC,MAAM,GAAG,SAAS,CAKpB;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,EAAE,OAAO,CAAC,EAAE,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,EACvD,OAAO,GAAE,MAAU,EACnB,KAAK,GAAE,MAAY,EACnB,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAAC,CAAC,CAAC,CA8BZ"}
@@ -97,8 +97,8 @@ function safeGetPrice(mint) {
97
97
  }
98
98
  function retryWithExponentialBackoff(fn, retries = 5, delay = 150, errorsToThrow) {
99
99
  return new Promise((resolve, reject) => {
100
- const attempt = (attemptNum) => {
101
- fn(attemptNum)
100
+ const attempt = (attemptNum, prevErr) => {
101
+ fn(attemptNum, prevErr)
102
102
  .then(resolve)
103
103
  .catch((error) => {
104
104
  attemptNum++;
@@ -111,7 +111,7 @@ function retryWithExponentialBackoff(fn, retries = 5, delay = 150, errorsToThrow
111
111
  consoleLog(error);
112
112
  setTimeout(() => {
113
113
  consoleLog("Retrying...");
114
- return attempt(attemptNum);
114
+ return attempt(attemptNum, error);
115
115
  }, delay);
116
116
  delay *= 2;
117
117
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haven-fi/solauto-sdk",
3
- "version": "1.0.238",
3
+ "version": "1.0.239",
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",
@@ -17,16 +17,18 @@ import {
17
17
  import { getErrorInfo, getTransactionChores } from "./transactionUtils";
18
18
  import {
19
19
  PriorityFeeSetting,
20
+ priorityFeeSettingValues,
20
21
  TransactionItemInputs,
21
22
  TransactionRunType,
22
23
  } from "../types";
23
24
  import { ReferralStateManager, TxHandler } from "../clients";
25
+ import { TransactionExpiredBlockheightExceededError } from "@solana/web3.js";
24
26
  // import { sendJitoBundledTransactions } from "../utils/jitoUtils";
25
27
 
26
28
  export class TransactionTooLargeError extends Error {
27
29
  constructor(message: string) {
28
30
  super(message);
29
- this.name = 'TransactionTooLargeError';
31
+ this.name = "TransactionTooLargeError";
30
32
  Object.setPrototypeOf(this, TransactionTooLargeError.prototype);
31
33
  }
32
34
  }
@@ -204,10 +206,10 @@ export class TransactionsManager {
204
206
  private txHandler: SolautoClient | ReferralStateManager,
205
207
  private statusCallback?: (statuses: TransactionManagerStatuses) => void,
206
208
  private txType?: TransactionRunType,
207
- private mustBeAtomic?: boolean,
209
+ private priorityFeeSetting: PriorityFeeSetting = PriorityFeeSetting.Min,
208
210
  private errorsToThrow?: ErrorsToThrow,
209
211
  private retries: number = 4,
210
- private retryDelay: number = 150,
212
+ private retryDelay: number = 150
211
213
  ) {
212
214
  this.lookupTables = new LookupTables(
213
215
  this.txHandler.defaultLookupTables(),
@@ -321,9 +323,18 @@ export class TransactionsManager {
321
323
  }
322
324
  }
323
325
 
326
+ private getUpdatedPriorityFeeSetting(prevError?: Error) {
327
+ if (prevError instanceof TransactionExpiredBlockheightExceededError) {
328
+ const currIdx = priorityFeeSettingValues.indexOf(this.priorityFeeSetting);
329
+ return priorityFeeSettingValues[
330
+ Math.min(priorityFeeSettingValues.length - 1, currIdx + 1)
331
+ ];
332
+ }
333
+ return this.priorityFeeSetting;
334
+ }
335
+
324
336
  public async clientSend(
325
- transactions: TransactionItem[],
326
- prioritySetting?: PriorityFeeSetting
337
+ transactions: TransactionItem[]
327
338
  ): Promise<TransactionManagerStatuses> {
328
339
  const items = [...transactions];
329
340
  const client = this.txHandler as SolautoClient;
@@ -336,12 +347,12 @@ export class TransactionsManager {
336
347
  updateLookupTable?.needsToBeIsolated
337
348
  ) {
338
349
  await retryWithExponentialBackoff(
339
- async (attemptNum) =>
350
+ async (attemptNum, prevError) =>
340
351
  await this.sendTransaction(
341
352
  updateLookupTable.updateLutTx,
342
353
  updateLutTxName,
343
354
  attemptNum,
344
- prioritySetting
355
+ this.getUpdatedPriorityFeeSetting(prevError)
345
356
  ),
346
357
  3,
347
358
  150,
@@ -385,7 +396,7 @@ export class TransactionsManager {
385
396
  );
386
397
  }
387
398
 
388
- const result = await this.send(items, prioritySetting, true).catch((e) => {
399
+ const result = await this.send(items, true).catch((e) => {
389
400
  client.resetLiveTxUpdates(false);
390
401
  throw e;
391
402
  });
@@ -399,7 +410,6 @@ export class TransactionsManager {
399
410
 
400
411
  public async send(
401
412
  items: TransactionItem[],
402
- prioritySetting?: PriorityFeeSetting,
403
413
  initialized?: boolean
404
414
  ): Promise<TransactionManagerStatuses> {
405
415
  this.statuses = [];
@@ -417,89 +427,78 @@ export class TransactionsManager {
417
427
  this.updateStatus(itemSet.name(), TransactionStatus.Queued, 0);
418
428
  }
419
429
 
420
- if (this.mustBeAtomic && itemSets.length > 1) {
421
- throw new Error(
422
- `${itemSets.length} transactions required but jito bundles are not currently supported`
430
+ if (this.txType === "only-simulate" && itemSets.length > 1) {
431
+ this.txHandler.log(
432
+ "Only simulate and more than 1 transaction. Skipping..."
423
433
  );
424
- // itemSets.forEach((set) => {
425
- // this.updateStatus(set.name(), TransactionStatus.Processing);
426
- // });
427
- // await sendJitoBundledTransactions(
428
- // this.client,
429
- // await Promise.all(itemSets.map((x) => x.getSingleTransaction())),
430
- // this.simulateOnly
431
- // );
432
- // TODO: check if successful or not
433
- // itemSets.forEach((set) => {
434
- // this.updateStatus(set.name(), TransactionStatus.Successful);
435
- // });
436
- } else if (this.txType !== "only-simulate" || itemSets.length === 1) {
437
- for (let i = 0; i < itemSets.length; i++) {
438
- const getFreshItemSet = async (
439
- itemSet: TransactionSet,
440
- attemptNum: number
441
- ) => {
442
- await itemSet.refetchAll(attemptNum);
443
- const newItemSets = await this.assembleTransactionSets([
444
- ...itemSet.items,
445
- ...itemSets
446
- .slice(i + 1)
447
- .map((x) => x.items)
448
- .flat(),
449
- ]);
450
- if (newItemSets.length > 1) {
451
- this.statuses.splice(
452
- statusesStartIdx + i,
453
- itemSets.length - i,
454
- ...newItemSets.map((x) => ({
455
- name: x.name(),
456
- status: TransactionStatus.Queued,
457
- attemptNum: 0,
458
- }))
434
+ return [];
435
+ }
436
+
437
+ for (let i = 0; i < itemSets.length; i++) {
438
+ const getFreshItemSet = async (
439
+ itemSet: TransactionSet,
440
+ attemptNum: number
441
+ ) => {
442
+ await itemSet.refetchAll(attemptNum);
443
+ const newItemSets = await this.assembleTransactionSets([
444
+ ...itemSet.items,
445
+ ...itemSets
446
+ .slice(i + 1)
447
+ .map((x) => x.items)
448
+ .flat(),
449
+ ]);
450
+ if (newItemSets.length > 1) {
451
+ this.statuses.splice(
452
+ statusesStartIdx + i,
453
+ itemSets.length - i,
454
+ ...newItemSets.map((x) => ({
455
+ name: x.name(),
456
+ status: TransactionStatus.Queued,
457
+ attemptNum: 0,
458
+ }))
459
+ );
460
+ this.txHandler.log(this.statuses);
461
+ itemSets.splice(
462
+ i + 1,
463
+ itemSets.length - i - 1,
464
+ ...newItemSets.slice(1)
465
+ );
466
+ }
467
+ return newItemSets.length > 0 ? newItemSets[0] : undefined;
468
+ };
469
+
470
+ let itemSet: TransactionSet | undefined = itemSets[i];
471
+ await retryWithExponentialBackoff(
472
+ async (attemptNum, prevError) => {
473
+ itemSet =
474
+ i > 0 || attemptNum > 0
475
+ ? await getFreshItemSet(itemSet!, attemptNum)
476
+ : itemSet;
477
+ if (!itemSet) {
478
+ return;
479
+ }
480
+ const tx = await itemSet.getSingleTransaction();
481
+
482
+ if (tx.getInstructions().length === 0) {
483
+ this.updateStatus(
484
+ itemSet.name(),
485
+ TransactionStatus.Skipped,
486
+ attemptNum
459
487
  );
460
- this.txHandler.log(this.statuses);
461
- itemSets.splice(
462
- i + 1,
463
- itemSets.length - i - 1,
464
- ...newItemSets.slice(1)
488
+ } else {
489
+ await this.debugAccounts(itemSet, tx);
490
+ await this.sendTransaction(
491
+ tx,
492
+ itemSet.name(),
493
+ attemptNum,
494
+ this.getUpdatedPriorityFeeSetting(prevError)
465
495
  );
466
496
  }
467
- return newItemSets.length > 0 ? newItemSets[0] : undefined;
468
- };
469
-
470
- let itemSet: TransactionSet | undefined = itemSets[i];
471
- await retryWithExponentialBackoff(
472
- async (attemptNum) => {
473
- itemSet =
474
- i > 0 || attemptNum > 0
475
- ? await getFreshItemSet(itemSet!, attemptNum)
476
- : itemSet;
477
- if (!itemSet) {
478
- return;
479
- }
480
- const tx = await itemSet.getSingleTransaction();
481
-
482
- if (tx.getInstructions().length === 0) {
483
- this.updateStatus(
484
- itemSet.name(),
485
- TransactionStatus.Skipped,
486
- attemptNum
487
- );
488
- } else {
489
- await this.debugAccounts(itemSet, tx);
490
- await this.sendTransaction(
491
- tx,
492
- itemSet.name(),
493
- attemptNum,
494
- prioritySetting
495
- );
496
- }
497
- },
498
- this.retries,
499
- this.retryDelay,
500
- this.errorsToThrow
501
- );
502
- }
497
+ },
498
+ this.retries,
499
+ this.retryDelay,
500
+ this.errorsToThrow
501
+ );
503
502
  }
504
503
 
505
504
  return this.statuses;
@@ -509,7 +508,7 @@ export class TransactionsManager {
509
508
  tx: TransactionBuilder,
510
509
  txName: string,
511
510
  attemptNum: number,
512
- prioritySetting?: PriorityFeeSetting
511
+ priorityFeeSetting?: PriorityFeeSetting
513
512
  ) {
514
513
  this.updateStatus(txName, TransactionStatus.Processing, attemptNum);
515
514
  try {
@@ -518,7 +517,7 @@ export class TransactionsManager {
518
517
  this.txHandler.connection,
519
518
  tx,
520
519
  this.txType,
521
- prioritySetting,
520
+ priorityFeeSetting,
522
521
  () =>
523
522
  this.updateStatus(
524
523
  txName,
@@ -21,6 +21,8 @@ export enum PriorityFeeSetting {
21
21
  High = "High",
22
22
  }
23
23
 
24
+ export const priorityFeeSettingValues = Object.values(PriorityFeeSetting) as PriorityFeeSetting[];
25
+
24
26
  export type RebalanceAction = "boost" | "repay" | "dca";
25
27
 
26
28
  export type TransactionRunType = "skip-simulation" | "only-simulate" | "normal";
@@ -125,14 +125,14 @@ export function safeGetPrice(
125
125
  export type ErrorsToThrow = Array<new (...args: any[]) => Error>;
126
126
 
127
127
  export function retryWithExponentialBackoff<T>(
128
- fn: (attemptNum: number) => Promise<T>,
128
+ fn: (attemptNum: number, prevErr?: Error) => Promise<T>,
129
129
  retries: number = 5,
130
130
  delay: number = 150,
131
131
  errorsToThrow?: ErrorsToThrow
132
132
  ): Promise<T> {
133
133
  return new Promise((resolve, reject) => {
134
- const attempt = (attemptNum: number) => {
135
- fn(attemptNum)
134
+ const attempt = (attemptNum: number, prevErr?: Error) => {
135
+ fn(attemptNum, prevErr)
136
136
  .then(resolve)
137
137
  .catch((error: Error) => {
138
138
  attemptNum++;
@@ -149,7 +149,7 @@ export function retryWithExponentialBackoff<T>(
149
149
  consoleLog(error);
150
150
  setTimeout(() => {
151
151
  consoleLog("Retrying...");
152
- return attempt(attemptNum);
152
+ return attempt(attemptNum, error);
153
153
  }, delay);
154
154
  delay *= 2;
155
155
  } else {