@haven-fi/solauto-sdk 1.0.237 → 1.0.239

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.
@@ -3,6 +3,9 @@ import { SolautoClient } from "../clients/solautoClient";
3
3
  import { ErrorsToThrow } from "../utils/generalUtils";
4
4
  import { PriorityFeeSetting, TransactionItemInputs, TransactionRunType } from "../types";
5
5
  import { ReferralStateManager } from "../clients";
6
+ export declare class TransactionTooLargeError extends Error {
7
+ constructor(message: string);
8
+ }
6
9
  export declare class TransactionItem {
7
10
  fetchTx: (attemptNum: number) => Promise<TransactionItemInputs | undefined>;
8
11
  name?: string | undefined;
@@ -32,18 +35,19 @@ export declare class TransactionsManager {
32
35
  private txHandler;
33
36
  private statusCallback?;
34
37
  private txType?;
35
- private mustBeAtomic?;
38
+ private priorityFeeSetting;
36
39
  private errorsToThrow?;
37
40
  private retries;
38
41
  private retryDelay;
39
42
  private statuses;
40
43
  private lookupTables;
41
- 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);
42
45
  private assembleTransactionSets;
43
46
  private updateStatus;
44
47
  private debugAccounts;
45
- clientSend(transactions: TransactionItem[], prioritySetting?: PriorityFeeSetting): Promise<TransactionManagerStatuses>;
46
- 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>;
47
51
  private sendTransaction;
48
52
  }
49
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;AAsC7D,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"}
@@ -3,13 +3,23 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.TransactionsManager = exports.TransactionStatus = exports.TransactionItem = void 0;
6
+ exports.TransactionsManager = exports.TransactionStatus = exports.TransactionItem = exports.TransactionTooLargeError = void 0;
7
7
  const bs58_1 = __importDefault(require("bs58"));
8
8
  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";
15
+ class TransactionTooLargeError extends Error {
16
+ constructor(message) {
17
+ super(message);
18
+ this.name = "TransactionTooLargeError";
19
+ Object.setPrototypeOf(this, TransactionTooLargeError.prototype);
20
+ }
21
+ }
22
+ exports.TransactionTooLargeError = TransactionTooLargeError;
13
23
  class LookupTables {
14
24
  constructor(defaultLuts, umi) {
15
25
  this.defaultLuts = defaultLuts;
@@ -119,11 +129,11 @@ var TransactionStatus;
119
129
  TransactionStatus["Failed"] = "Failed";
120
130
  })(TransactionStatus || (exports.TransactionStatus = TransactionStatus = {}));
121
131
  class TransactionsManager {
122
- 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) {
123
133
  this.txHandler = txHandler;
124
134
  this.statusCallback = statusCallback;
125
135
  this.txType = txType;
126
- this.mustBeAtomic = mustBeAtomic;
136
+ this.priorityFeeSetting = priorityFeeSetting;
127
137
  this.errorsToThrow = errorsToThrow;
128
138
  this.retries = retries;
129
139
  this.retryDelay = retryDelay;
@@ -141,7 +151,7 @@ class TransactionsManager {
141
151
  }
142
152
  const transaction = item.tx.setAddressLookupTables(await this.lookupTables.getLutInputs(item.lookupTableAddresses));
143
153
  if (!transaction.fitsInOneTransaction(this.txHandler.umi)) {
144
- throw new Error(`Transaction exceeds max transaction size (${transaction.getTransactionSize(this.txHandler.umi)})`);
154
+ throw new TransactionTooLargeError(`Exceeds max transaction size (${transaction.getTransactionSize(this.txHandler.umi)})`);
145
155
  }
146
156
  else {
147
157
  let newSet = new TransactionSet(this.txHandler, this.lookupTables, [
@@ -214,7 +224,14 @@ class TransactionsManager {
214
224
  }
215
225
  }
216
226
  }
217
- 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) {
218
235
  const items = [...transactions];
219
236
  const client = this.txHandler;
220
237
  const updateLookupTable = await client.updateLookupTable();
@@ -222,7 +239,7 @@ class TransactionsManager {
222
239
  if (updateLookupTable &&
223
240
  updateLookupTable.updateLutTx.getInstructions().length > 0 &&
224
241
  updateLookupTable?.needsToBeIsolated) {
225
- 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);
226
243
  }
227
244
  this.lookupTables.defaultLuts = client.defaultLookupTables();
228
245
  for (const item of items) {
@@ -246,7 +263,7 @@ class TransactionsManager {
246
263
  items.push(chore);
247
264
  this.txHandler.log("Chores after: ", choresAfter.getInstructions().length);
248
265
  }
249
- const result = await this.send(items, prioritySetting, true).catch((e) => {
266
+ const result = await this.send(items, true).catch((e) => {
250
267
  client.resetLiveTxUpdates(false);
251
268
  throw e;
252
269
  });
@@ -255,7 +272,7 @@ class TransactionsManager {
255
272
  }
256
273
  return result;
257
274
  }
258
- async send(items, prioritySetting, initialized) {
275
+ async send(items, initialized) {
259
276
  this.statuses = [];
260
277
  this.lookupTables.reset();
261
278
  if (!initialized) {
@@ -268,69 +285,56 @@ class TransactionsManager {
268
285
  for (const itemSet of itemSets) {
269
286
  this.updateStatus(itemSet.name(), TransactionStatus.Queued, 0);
270
287
  }
271
- if (this.mustBeAtomic && itemSets.length > 1) {
272
- throw new Error(`${itemSets.length} transactions required but jito bundles are not currently supported`);
273
- // itemSets.forEach((set) => {
274
- // this.updateStatus(set.name(), TransactionStatus.Processing);
275
- // });
276
- // await sendJitoBundledTransactions(
277
- // this.client,
278
- // await Promise.all(itemSets.map((x) => x.getSingleTransaction())),
279
- // this.simulateOnly
280
- // );
281
- // TODO: check if successful or not
282
- // itemSets.forEach((set) => {
283
- // this.updateStatus(set.name(), TransactionStatus.Successful);
284
- // });
288
+ if (this.txType === "only-simulate" && itemSets.length > 1) {
289
+ this.txHandler.log("Only simulate and more than 1 transaction. Skipping...");
290
+ return [];
285
291
  }
286
- else if (this.txType !== "only-simulate" || itemSets.length === 1) {
287
- for (let i = 0; i < itemSets.length; i++) {
288
- const getFreshItemSet = async (itemSet, attemptNum) => {
289
- await itemSet.refetchAll(attemptNum);
290
- const newItemSets = await this.assembleTransactionSets([
291
- ...itemSet.items,
292
- ...itemSets
293
- .slice(i + 1)
294
- .map((x) => x.items)
295
- .flat(),
296
- ]);
297
- if (newItemSets.length > 1) {
298
- this.statuses.splice(statusesStartIdx + i, itemSets.length - i, ...newItemSets.map((x) => ({
299
- name: x.name(),
300
- status: TransactionStatus.Queued,
301
- attemptNum: 0,
302
- })));
303
- this.txHandler.log(this.statuses);
304
- itemSets.splice(i + 1, itemSets.length - i - 1, ...newItemSets.slice(1));
305
- }
306
- return newItemSets.length > 0 ? newItemSets[0] : undefined;
307
- };
308
- let itemSet = itemSets[i];
309
- await (0, generalUtils_1.retryWithExponentialBackoff)(async (attemptNum) => {
310
- itemSet =
311
- i > 0 || attemptNum > 0
312
- ? await getFreshItemSet(itemSet, attemptNum)
313
- : itemSet;
314
- if (!itemSet) {
315
- return;
316
- }
317
- const tx = await itemSet.getSingleTransaction();
318
- if (tx.getInstructions().length === 0) {
319
- this.updateStatus(itemSet.name(), TransactionStatus.Skipped, attemptNum);
320
- }
321
- else {
322
- await this.debugAccounts(itemSet, tx);
323
- await this.sendTransaction(tx, itemSet.name(), attemptNum, prioritySetting);
324
- }
325
- }, this.retries, this.retryDelay, this.errorsToThrow);
326
- }
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);
327
331
  }
328
332
  return this.statuses;
329
333
  }
330
- async sendTransaction(tx, txName, attemptNum, prioritySetting) {
334
+ async sendTransaction(tx, txName, attemptNum, priorityFeeSetting) {
331
335
  this.updateStatus(txName, TransactionStatus.Processing, attemptNum);
332
336
  try {
333
- 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));
334
338
  this.updateStatus(txName, TransactionStatus.Successful, attemptNum, txSig ? bs58_1.default.encode(txSig) : undefined);
335
339
  }
336
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.237",
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,12 +17,22 @@ 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
 
28
+ export class TransactionTooLargeError extends Error {
29
+ constructor(message: string) {
30
+ super(message);
31
+ this.name = "TransactionTooLargeError";
32
+ Object.setPrototypeOf(this, TransactionTooLargeError.prototype);
33
+ }
34
+ }
35
+
26
36
  class LookupTables {
27
37
  cache: AddressLookupTableInput[] = [];
28
38
 
@@ -196,10 +206,10 @@ export class TransactionsManager {
196
206
  private txHandler: SolautoClient | ReferralStateManager,
197
207
  private statusCallback?: (statuses: TransactionManagerStatuses) => void,
198
208
  private txType?: TransactionRunType,
199
- private mustBeAtomic?: boolean,
209
+ private priorityFeeSetting: PriorityFeeSetting = PriorityFeeSetting.Min,
200
210
  private errorsToThrow?: ErrorsToThrow,
201
211
  private retries: number = 4,
202
- private retryDelay: number = 150,
212
+ private retryDelay: number = 150
203
213
  ) {
204
214
  this.lookupTables = new LookupTables(
205
215
  this.txHandler.defaultLookupTables(),
@@ -225,8 +235,8 @@ export class TransactionsManager {
225
235
  await this.lookupTables.getLutInputs(item.lookupTableAddresses)
226
236
  );
227
237
  if (!transaction.fitsInOneTransaction(this.txHandler.umi)) {
228
- throw new Error(
229
- `Transaction exceeds max transaction size (${transaction.getTransactionSize(this.txHandler.umi)})`
238
+ throw new TransactionTooLargeError(
239
+ `Exceeds max transaction size (${transaction.getTransactionSize(this.txHandler.umi)})`
230
240
  );
231
241
  } else {
232
242
  let newSet = new TransactionSet(this.txHandler, this.lookupTables, [
@@ -313,9 +323,18 @@ export class TransactionsManager {
313
323
  }
314
324
  }
315
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
+
316
336
  public async clientSend(
317
- transactions: TransactionItem[],
318
- prioritySetting?: PriorityFeeSetting
337
+ transactions: TransactionItem[]
319
338
  ): Promise<TransactionManagerStatuses> {
320
339
  const items = [...transactions];
321
340
  const client = this.txHandler as SolautoClient;
@@ -328,12 +347,12 @@ export class TransactionsManager {
328
347
  updateLookupTable?.needsToBeIsolated
329
348
  ) {
330
349
  await retryWithExponentialBackoff(
331
- async (attemptNum) =>
350
+ async (attemptNum, prevError) =>
332
351
  await this.sendTransaction(
333
352
  updateLookupTable.updateLutTx,
334
353
  updateLutTxName,
335
354
  attemptNum,
336
- prioritySetting
355
+ this.getUpdatedPriorityFeeSetting(prevError)
337
356
  ),
338
357
  3,
339
358
  150,
@@ -377,7 +396,7 @@ export class TransactionsManager {
377
396
  );
378
397
  }
379
398
 
380
- const result = await this.send(items, prioritySetting, true).catch((e) => {
399
+ const result = await this.send(items, true).catch((e) => {
381
400
  client.resetLiveTxUpdates(false);
382
401
  throw e;
383
402
  });
@@ -391,7 +410,6 @@ export class TransactionsManager {
391
410
 
392
411
  public async send(
393
412
  items: TransactionItem[],
394
- prioritySetting?: PriorityFeeSetting,
395
413
  initialized?: boolean
396
414
  ): Promise<TransactionManagerStatuses> {
397
415
  this.statuses = [];
@@ -409,89 +427,78 @@ export class TransactionsManager {
409
427
  this.updateStatus(itemSet.name(), TransactionStatus.Queued, 0);
410
428
  }
411
429
 
412
- if (this.mustBeAtomic && itemSets.length > 1) {
413
- throw new Error(
414
- `${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..."
415
433
  );
416
- // itemSets.forEach((set) => {
417
- // this.updateStatus(set.name(), TransactionStatus.Processing);
418
- // });
419
- // await sendJitoBundledTransactions(
420
- // this.client,
421
- // await Promise.all(itemSets.map((x) => x.getSingleTransaction())),
422
- // this.simulateOnly
423
- // );
424
- // TODO: check if successful or not
425
- // itemSets.forEach((set) => {
426
- // this.updateStatus(set.name(), TransactionStatus.Successful);
427
- // });
428
- } else if (this.txType !== "only-simulate" || itemSets.length === 1) {
429
- for (let i = 0; i < itemSets.length; i++) {
430
- const getFreshItemSet = async (
431
- itemSet: TransactionSet,
432
- attemptNum: number
433
- ) => {
434
- await itemSet.refetchAll(attemptNum);
435
- const newItemSets = await this.assembleTransactionSets([
436
- ...itemSet.items,
437
- ...itemSets
438
- .slice(i + 1)
439
- .map((x) => x.items)
440
- .flat(),
441
- ]);
442
- if (newItemSets.length > 1) {
443
- this.statuses.splice(
444
- statusesStartIdx + i,
445
- itemSets.length - i,
446
- ...newItemSets.map((x) => ({
447
- name: x.name(),
448
- status: TransactionStatus.Queued,
449
- attemptNum: 0,
450
- }))
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
451
487
  );
452
- this.txHandler.log(this.statuses);
453
- itemSets.splice(
454
- i + 1,
455
- itemSets.length - i - 1,
456
- ...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)
457
495
  );
458
496
  }
459
- return newItemSets.length > 0 ? newItemSets[0] : undefined;
460
- };
461
-
462
- let itemSet: TransactionSet | undefined = itemSets[i];
463
- await retryWithExponentialBackoff(
464
- async (attemptNum) => {
465
- itemSet =
466
- i > 0 || attemptNum > 0
467
- ? await getFreshItemSet(itemSet!, attemptNum)
468
- : itemSet;
469
- if (!itemSet) {
470
- return;
471
- }
472
- const tx = await itemSet.getSingleTransaction();
473
-
474
- if (tx.getInstructions().length === 0) {
475
- this.updateStatus(
476
- itemSet.name(),
477
- TransactionStatus.Skipped,
478
- attemptNum
479
- );
480
- } else {
481
- await this.debugAccounts(itemSet, tx);
482
- await this.sendTransaction(
483
- tx,
484
- itemSet.name(),
485
- attemptNum,
486
- prioritySetting
487
- );
488
- }
489
- },
490
- this.retries,
491
- this.retryDelay,
492
- this.errorsToThrow
493
- );
494
- }
497
+ },
498
+ this.retries,
499
+ this.retryDelay,
500
+ this.errorsToThrow
501
+ );
495
502
  }
496
503
 
497
504
  return this.statuses;
@@ -501,7 +508,7 @@ export class TransactionsManager {
501
508
  tx: TransactionBuilder,
502
509
  txName: string,
503
510
  attemptNum: number,
504
- prioritySetting?: PriorityFeeSetting
511
+ priorityFeeSetting?: PriorityFeeSetting
505
512
  ) {
506
513
  this.updateStatus(txName, TransactionStatus.Processing, attemptNum);
507
514
  try {
@@ -510,7 +517,7 @@ export class TransactionsManager {
510
517
  this.txHandler.connection,
511
518
  tx,
512
519
  this.txType,
513
- prioritySetting,
520
+ priorityFeeSetting,
514
521
  () =>
515
522
  this.updateStatus(
516
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 {