@haven-fi/solauto-sdk 1.0.312 → 1.0.314

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.
@@ -319,7 +319,7 @@ class SolautoClient extends referralStateManager_1.ReferralStateManager {
319
319
  this.livePositionUpdates.new({
320
320
  type: "supply",
321
321
  value: (this.solautoPositionState?.supply.amountUsed.baseUnit ??
322
- BigInt(0)) + this.livePositionUpdates.supplyAdjustment,
322
+ BigInt(0)) * BigInt(-1),
323
323
  });
324
324
  }
325
325
  }
@@ -339,8 +339,8 @@ class SolautoClient extends referralStateManager_1.ReferralStateManager {
339
339
  else {
340
340
  this.livePositionUpdates.new({
341
341
  type: "debt",
342
- value: (this.solautoPositionState?.debt.amountUsed.baseUnit ?? BigInt(0)) +
343
- this.livePositionUpdates.debtAdjustment,
342
+ value: (this.solautoPositionState?.debt.amountUsed.baseUnit ?? BigInt(0)) *
343
+ BigInt(-1),
344
344
  });
345
345
  }
346
346
  }
@@ -1 +1 @@
1
- {"version":3,"file":"transactionUtils.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,kBAAkB,EAClB,GAAG,EAGJ,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AAmBxE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAoCzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAOlD,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AA2LjD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,kBAAkB,EACtB,sBAAsB,EAAE,MAAM,EAAE,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAoH7B;AA2LD,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,kBAAkB,GACrB,OAAO,CAAC,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,CA0BnD;AAED,wBAAsB,8BAA8B,CAAC,MAAM,EAAE,aAAa,oBA2CzE;AAED,wBAAsB,gCAAgC,CACpD,MAAM,EAAE,aAAa,EACrB,2BAA2B,CAAC,EAAE,MAAM,EACpC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CA4H5C;AAED,wBAAsB,gCAAgC,CACpD,eAAe,EAAE,oBAAoB,EACrC,YAAY,EAAE,SAAS,EACvB,eAAe,EAAE,SAAS,GACzB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAsC5C;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,GAAG;;;;EA0DxE"}
1
+ {"version":3,"file":"transactionUtils.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,kBAAkB,EAClB,GAAG,EAGJ,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AAmBxE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAoCzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAOlD,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AA2LjD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,kBAAkB,EACtB,sBAAsB,EAAE,MAAM,EAAE,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAoH7B;AA2LD,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,kBAAkB,GACrB,OAAO,CAAC,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,CA0BnD;AAED,wBAAsB,8BAA8B,CAAC,MAAM,EAAE,aAAa,oBA2CzE;AAED,wBAAsB,gCAAgC,CACpD,MAAM,EAAE,aAAa,EACrB,2BAA2B,CAAC,EAAE,MAAM,EACpC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CA2H5C;AAED,wBAAsB,gCAAgC,CACpD,eAAe,EAAE,oBAAoB,EACrC,YAAY,EAAE,SAAS,EACvB,eAAe,EAAE,SAAS,GACzB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAsC5C;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,GAAG;;;;EA0DxE"}
@@ -360,7 +360,7 @@ async function buildSolautoRebalanceTransaction(client, targetLiqUtilizationRate
360
360
  if ((client.solautoPositionState?.supply.amountUsed.baseUnit === BigInt(0) &&
361
361
  client.livePositionUpdates.supplyAdjustment === BigInt(0)) ||
362
362
  (targetLiqUtilizationRateBps === undefined &&
363
- !(0, generalUtils_2.eligibleForRebalance)(client.solautoPositionState, client.solautoPositionSettings(), client.solautoPositionActiveDca(), (0, generalUtils_1.currentUnixSeconds)(), supplyPrice, debtPrice, 0))) {
363
+ !(0, generalUtils_2.eligibleForRebalance)(client.solautoPositionState, client.solautoPositionSettings(), client.solautoPositionActiveDca(), (0, generalUtils_1.currentUnixSeconds)(), supplyPrice, debtPrice))) {
364
364
  client.log("Not eligible for a rebalance");
365
365
  return undefined;
366
366
  }
@@ -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;AAMzD,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;AAW7D,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,OAAO,EAAE,MAAM;CAK5B;AAqCD,qBAAa,eAAe;IAMjB,OAAO,EAAE,CACd,UAAU,EAAE,MAAM,KACf,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;IACxC,IAAI,CAAC,EAAE,MAAM;IARtB,oBAAoB,EAAG,MAAM,EAAE,CAAC;IAChC,EAAE,CAAC,EAAE,kBAAkB,CAAC;IACjB,WAAW,EAAE,OAAO,CAAS;gBAG3B,OAAO,EAAE,CACd,UAAU,EAAE,MAAM,KACf,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,EACxC,IAAI,CAAC,EAAE,MAAM,YAAA;IAGhB,UAAU;IAKV,OAAO,CAAC,UAAU,EAAE,MAAM;IAMhC,cAAc,IAAI,MAAM,EAAE;CAY3B;AAmFD,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,UAAU;IAClB,OAAO,CAAC,aAAa,CAAC;IACtB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,UAAU;IAXpB,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,UAAU,GAAE,OAAe,EAC3B,aAAa,CAAC,EAAE,aAAa,YAAA,EAC7B,OAAO,GAAE,MAAU,EACnB,UAAU,GAAE,MAAY;YAQpB,uBAAuB;IAwCrC,OAAO,CAAC,YAAY;YA6CN,aAAa;IAoB3B,OAAO,CAAC,4BAA4B;IAgBpC,OAAO,CAAC,mBAAmB;YAMb,SAAS;IAgBV,UAAU,CACrB,YAAY,EAAE,eAAe,EAAE,GAC9B,OAAO,CAAC,0BAA0B,CAAC;IA0FzB,IAAI,CACf,KAAK,EAAE,eAAe,EAAE,GACvB,OAAO,CAAC,0BAA0B,CAAC;YAmCxB,6BAA6B;YA8D7B,qBAAqB;YAuDrB,cAAc;YAqCd,eAAe;CAmD9B"}
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;AAMzD,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;AAW7D,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,OAAO,EAAE,MAAM;CAK5B;AAqCD,qBAAa,eAAe;IAMjB,OAAO,EAAE,CACd,UAAU,EAAE,MAAM,KACf,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;IACxC,IAAI,CAAC,EAAE,MAAM;IARtB,oBAAoB,EAAG,MAAM,EAAE,CAAC;IAChC,EAAE,CAAC,EAAE,kBAAkB,CAAC;IACjB,WAAW,EAAE,OAAO,CAAS;gBAG3B,OAAO,EAAE,CACd,UAAU,EAAE,MAAM,KACf,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,EACxC,IAAI,CAAC,EAAE,MAAM,YAAA;IAGhB,UAAU;IAKV,OAAO,CAAC,UAAU,EAAE,MAAM;IAMhC,cAAc,IAAI,MAAM,EAAE;CAY3B;AAyFD,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,UAAU;IAClB,OAAO,CAAC,aAAa,CAAC;IACtB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,UAAU;IAXpB,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,UAAU,GAAE,OAAe,EAC3B,aAAa,CAAC,EAAE,aAAa,YAAA,EAC7B,OAAO,GAAE,MAAU,EACnB,UAAU,GAAE,MAAY;YAQpB,uBAAuB;IAwCrC,OAAO,CAAC,YAAY;YA6CN,aAAa;IAoB3B,OAAO,CAAC,4BAA4B;IAgBpC,OAAO,CAAC,mBAAmB;YAMb,SAAS;IAgBV,UAAU,CACrB,YAAY,EAAE,eAAe,EAAE,GAC9B,OAAO,CAAC,0BAA0B,CAAC;IA4FzB,IAAI,CACf,KAAK,EAAE,eAAe,EAAE,GACvB,OAAO,CAAC,0BAA0B,CAAC;YAmCxB,6BAA6B;YAyE7B,qBAAqB;YAuDrB,cAAc;YAqCd,eAAe;CAmD9B"}
@@ -97,6 +97,9 @@ class TransactionSet {
97
97
  add(...items) {
98
98
  this.items.push(...items.filter((x) => x.tx && x.tx.getInstructions().length > 0));
99
99
  }
100
+ prepend(...items) {
101
+ this.items.unshift(...items.filter((x) => x.tx && x.tx.getInstructions().length > 0));
102
+ }
100
103
  async refetchAll(attemptNum) {
101
104
  await this.txHandler.resetLiveTxUpdates();
102
105
  for (const item of this.items) {
@@ -117,7 +120,7 @@ class TransactionSet {
117
120
  }
118
121
  name() {
119
122
  let names = this.items
120
- .filter((x) => x.tx && x.name !== undefined)
123
+ .filter((x) => x.tx && Boolean(x.name))
121
124
  .map((x) => x.name.toLowerCase());
122
125
  if (names.length > 1) {
123
126
  names = names.filter((x) => x !== CHORES_TX_NAME);
@@ -154,9 +157,9 @@ class TransactionsManager {
154
157
  async assembleTransactionSets(items) {
155
158
  let transactionSets = [];
156
159
  this.txHandler.log(`Reassembling ${items.length} items`);
157
- for (let i = 0; i < items.length;) {
160
+ for (let i = items.length - 1; i >= 0;) {
158
161
  let item = items[i];
159
- i++;
162
+ i--;
160
163
  if (!item.tx) {
161
164
  continue;
162
165
  }
@@ -168,16 +171,16 @@ class TransactionsManager {
168
171
  let newSet = new TransactionSet(this.txHandler, this.lookupTables, [
169
172
  item,
170
173
  ]);
171
- for (let j = i; j < items.length; j++) {
174
+ for (let j = i; j >= 0; j--) {
172
175
  if (await newSet.fitsWith(items[j])) {
173
- newSet.add(items[j]);
174
- i++;
176
+ newSet.prepend(items[j]);
177
+ i--;
175
178
  }
176
179
  else {
177
180
  break;
178
181
  }
179
182
  }
180
- transactionSets.push(newSet);
183
+ transactionSets.unshift(newSet);
181
184
  }
182
185
  }
183
186
  return transactionSets;
@@ -270,7 +273,9 @@ class TransactionsManager {
270
273
  const stale = (await (0, utils_1.getSwitchboardFeedData)(client.connection, [mint]))[0]
271
274
  .stale;
272
275
  if (stale) {
273
- const swbTx = new TransactionItem(async () => (0, utils_1.buildSwbSubmitResponseTx)(client.connection, client.signer, mint), items.length === 1 ? "Update oracle" : "");
276
+ this.txHandler.log("Requires oracle update...");
277
+ const swbTx = new TransactionItem(async () => (0, utils_1.buildSwbSubmitResponseTx)(client.connection, client.signer, mint), "Update oracle");
278
+ await swbTx.initialize();
274
279
  items.unshift(swbTx);
275
280
  }
276
281
  }
@@ -331,23 +336,33 @@ class TransactionsManager {
331
336
  }
332
337
  async processTransactionsAtomically(itemSets) {
333
338
  let num = 0;
339
+ let sets = itemSets;
334
340
  await (0, generalUtils_1.retryWithExponentialBackoff)(async (attemptNum) => {
335
341
  num = attemptNum;
342
+ if (attemptNum > 0) {
343
+ sets = [];
344
+ for (let i = 0; i < itemSets.length; i++) {
345
+ const txSet = await this.refreshItemSet(itemSets, i, attemptNum);
346
+ if (txSet) {
347
+ sets.push(txSet);
348
+ }
349
+ }
350
+ }
336
351
  let transactions = [];
337
- for (const set of itemSets) {
352
+ for (const set of sets) {
338
353
  transactions.push(await set.getSingleTransaction());
339
354
  }
340
- itemSets.forEach((x) => this.updateStatus(x.name(), TransactionStatus.Processing, attemptNum));
355
+ sets.forEach((x) => this.updateStatus(x.name(), TransactionStatus.Processing, attemptNum));
341
356
  const txSigs = await (0, jitoUtils_1.sendJitoBundledTransactions)(this.txHandler.umi, this.txHandler.signer, transactions, false, this.priorityFeeSetting);
342
357
  if (txSigs) {
343
- itemSets.forEach((x, i) => this.updateStatus(x.name(), TransactionStatus.Successful, attemptNum, txSigs[i]));
358
+ sets.forEach((x, i) => this.updateStatus(x.name(), TransactionStatus.Successful, attemptNum, txSigs[i]));
344
359
  }
345
360
  else {
346
- itemSets.forEach((x) => this.updateStatus(x.name(), TransactionStatus.Failed, attemptNum, undefined, true));
361
+ sets.forEach((x) => this.updateStatus(x.name(), TransactionStatus.Failed, attemptNum, undefined, true));
347
362
  throw new Error("Unknown error");
348
363
  }
349
364
  }, this.retries, this.retryDelay, this.errorsToThrow).catch((e) => {
350
- itemSets.forEach((x) => this.updateStatus(x.name(), TransactionStatus.Failed, num, undefined, true, e.message));
365
+ sets.forEach((x) => this.updateStatus(x.name(), TransactionStatus.Failed, num, undefined, true, e.message));
351
366
  throw e;
352
367
  });
353
368
  }
@@ -1 +1 @@
1
- {"version":3,"file":"jitoUtils.d.ts","sourceRoot":"","sources":["../../src/utils/jitoUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAwB,MAAM,iBAAiB,CAAC;AAGlE,OAAO,EACL,MAAM,EACN,kBAAkB,EAClB,GAAG,EAEJ,MAAM,0BAA0B,CAAC;AAOlC,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAI9C,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,SAAS,CAAC,CAa9D;AA2GD,wBAAsB,2BAA2B,CAC/C,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,kBAAkB,EAAE,EACzB,YAAY,CAAC,EAAE,OAAO,EACtB,kBAAkB,GAAE,kBAA2C,GAC9D,OAAO,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,CA0C/B"}
1
+ {"version":3,"file":"jitoUtils.d.ts","sourceRoot":"","sources":["../../src/utils/jitoUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAwB,MAAM,iBAAiB,CAAC;AAGlE,OAAO,EACL,MAAM,EACN,kBAAkB,EAClB,GAAG,EAEJ,MAAM,0BAA0B,CAAC;AAQlC,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAK9C,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,SAAS,CAAC,CAa9D;AA0GD,wBAAsB,2BAA2B,CAC/C,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,kBAAkB,EAAE,EACzB,YAAY,CAAC,EAAE,OAAO,EACtB,kBAAkB,GAAE,kBAA2C,GAC9D,OAAO,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,CAyC/B"}
@@ -30,23 +30,24 @@ async function getRandomTipAccount() {
30
30
  async function getTipInstruction(signer, tipLamports) {
31
31
  return (0, solanaUtils_1.systemTransferUmiIx)(signer, await getRandomTipAccount(), BigInt(tipLamports));
32
32
  }
33
- // async function simulateJitoBundle(
34
- // txs: VersionedTransaction[]
35
- // ): Promise<SimulatedBundleTransactionResult[]> {
36
- // const simulationResult = await JITO_CONNECTION.simulateBundle(txs, {
37
- // preExecutionAccountsConfigs: txs.map((x) => null),
38
- // postExecutionAccountsConfigs: txs.map((x) => null),
39
- // skipSigVerify: true,
40
- // });
41
- // simulationResult.value.transactionResults.forEach((tx) => {
42
- // if (tx.err) {
43
- // tx.logs?.forEach((x) => {
44
- // consoleLog(x);
45
- // });
46
- // throw tx.err;
33
+ // TODO: fix
34
+ // async function simulateJitoBundle(umi: Umi, txs: VersionedTransaction[]) {
35
+ // const simulationResult = await axios.post(
36
+ // `${JITO_BLOCK_ENGINE}/api/v1/bundles`,
37
+ // {
38
+ // method: "simulateBundle",
39
+ // id: 1,
40
+ // jsonrpc: "2.0",
41
+ // params: [
42
+ // {
43
+ // encodedTransactions: txs.map((x) => bs58.encode(x.serialize())),
44
+ // preExecutionAccountsConfigs: txs.map((_) => ""),
45
+ // postExecutionAccountsConfigs: txs.map((_) => ""),
46
+ // skipSigVerify: true,
47
+ // },
48
+ // ],
47
49
  // }
48
- // });
49
- // return simulationResult.value.transactionResults;
50
+ // );
50
51
  // }
51
52
  async function umiToVersionedTransactions(umi, signer, txs, feeEstimates, computeUnitLimits) {
52
53
  return await Promise.all(txs.map(async (tx, i) => {
@@ -81,7 +82,6 @@ async function pollBundleStatus(bundleId, interval = 1000, timeout = 40000) {
81
82
  return [];
82
83
  }
83
84
  async function sendJitoBundle(transactions) {
84
- (0, generalUtils_1.consoleLog)("Sending bundle...");
85
85
  const resp = await axios_1.default.post(`${solautoConstants_1.JITO_BLOCK_ENGINE}/api/v1/bundles`, {
86
86
  jsonrpc: "2.0",
87
87
  id: 1,
@@ -89,7 +89,8 @@ async function sendJitoBundle(transactions) {
89
89
  params: [transactions],
90
90
  });
91
91
  const bundleId = resp.data.result;
92
- return await pollBundleStatus(bundleId);
92
+ (0, generalUtils_1.consoleLog)("Bundle ID:", bundleId);
93
+ return bundleId ? await pollBundleStatus(bundleId) : [];
93
94
  }
94
95
  async function sendJitoBundledTransactions(umi, signer, txs, simulateOnly, priorityFeeSetting = types_1.PriorityFeeSetting.Min) {
95
96
  (0, generalUtils_1.consoleLog)("Sending Jito bundle...");
@@ -98,11 +99,8 @@ async function sendJitoBundledTransactions(umi, signer, txs, simulateOnly, prior
98
99
  txs[0] = txs[0].prepend(await getTipInstruction(signer, 150000));
99
100
  const feeEstimates = await Promise.all(txs.map(async (x) => (await (0, solanaUtils_1.getComputeUnitPriceEstimate)(umi, x, priorityFeeSetting)) ??
100
101
  1000000));
101
- let builtTxs = await umiToVersionedTransactions(umi, signer, txs, feeEstimates
102
- // Array(txs.length).fill(1_400_000)
103
- );
104
- // // TODO: Skip over this for now, and instead don't specify a compute unit limit in the final bundle transactions
105
- // const simulationResults = await simulateJitoBundle(builtTxs);
102
+ let builtTxs = await umiToVersionedTransactions(umi, signer, txs, feeEstimates);
103
+ // const simulationResults = await simulateJitoBundle(umi, builtTxs);
106
104
  if (!simulateOnly) {
107
105
  // let builtTxs = await umiToVersionedTransactions(
108
106
  // client.signer,
@@ -1 +1 @@
1
- {"version":3,"file":"solanaUtils.d.ts","sourceRoot":"","sources":["../../src/utils/solanaUtils.ts"],"names":[],"mappings":"AACA,OAAO,EACL,uBAAuB,EACvB,MAAM,EACN,kBAAkB,EAClB,GAAG,EACH,kBAAkB,EAGnB,MAAM,0BAA0B,CAAC;AAOlC,OAAO,EAIL,UAAU,EACV,SAAS,EAKT,sBAAsB,EAEvB,MAAM,iBAAiB,CAAC;AAgBzB,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAIlE,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,UAErD;AAED,wBAAgB,oBAAoB,CAAC,eAAe,EAAE,MAAM,UAE3D;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,SAAS,GAAE,SAAgC,GAC1C,CAAC,UAAU,EAAE,GAAG,CAAC,CAQnB;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,sBAAsB,GACzB,kBAAkB,CAMpB;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,GACtB,kBAAkB,CAOpB;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,kBAAkB,CAOpB;AAED,wBAAgB,iCAAiC,CAC/C,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,SAAS,GACd,kBAAkB,CAUpB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,SAAS,EACtB,QAAQ,EAAE,MAAM,GACf,kBAAkB,CASpB;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,SAAS,EACvB,SAAS,EAAE,SAAS,GACnB,kBAAkB,CAKpB;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,SAAS,EACf,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,GACb,kBAAkB,CAKpB;AAED,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,GAAG,EACR,oBAAoB,EAAE,MAAM,EAAE,GAC7B,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAkBpC;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,kBAAkB,EAC/B,gBAAgB,CAAC,EAAE,MAAM,EACzB,gBAAgB,CAAC,EAAE,MAAM,sBAa1B;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,kBAAkB,EAC/B,gBAAgB,CAAC,EAAE,MAAM,EACzB,gBAAgB,CAAC,EAAE,MAAM,sBA2D1B;AAuBD,wBAAsB,2BAA2B,CAC/C,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,kBAAkB,EACtB,eAAe,EAAE,kBAAkB,GAClC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAsB7B;AAiDD,wBAAsB,8BAA8B,CAClD,GAAG,EAAE,GAAG,EACR,UAAU,EAAE,UAAU,EACtB,EAAE,EAAE,kBAAkB,EACtB,MAAM,CAAC,EAAE,kBAAkB,EAC3B,eAAe,GAAE,kBAA2C,EAC5D,cAAc,CAAC,EAAE,MAAM,IAAI,GAC1B,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CA2DjC"}
1
+ {"version":3,"file":"solanaUtils.d.ts","sourceRoot":"","sources":["../../src/utils/solanaUtils.ts"],"names":[],"mappings":"AACA,OAAO,EACL,uBAAuB,EACvB,MAAM,EACN,kBAAkB,EAClB,GAAG,EACH,kBAAkB,EAGnB,MAAM,0BAA0B,CAAC;AAOlC,OAAO,EAIL,UAAU,EACV,SAAS,EAKT,sBAAsB,EAEvB,MAAM,iBAAiB,CAAC;AAgBzB,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAIlE,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,UAErD;AAED,wBAAgB,oBAAoB,CAAC,eAAe,EAAE,MAAM,UAE3D;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,SAAS,GAAE,SAAgC,GAC1C,CAAC,UAAU,EAAE,GAAG,CAAC,CAQnB;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,sBAAsB,GACzB,kBAAkB,CAMpB;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,GACtB,kBAAkB,CAOpB;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,kBAAkB,CAOpB;AAED,wBAAgB,iCAAiC,CAC/C,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,SAAS,GACd,kBAAkB,CAUpB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,SAAS,EACtB,QAAQ,EAAE,MAAM,GACf,kBAAkB,CASpB;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,SAAS,EACvB,SAAS,EAAE,SAAS,GACnB,kBAAkB,CAKpB;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,SAAS,EACf,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,GACb,kBAAkB,CAKpB;AAED,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,GAAG,EACR,oBAAoB,EAAE,MAAM,EAAE,GAC7B,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAkBpC;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,kBAAkB,EAC/B,gBAAgB,CAAC,EAAE,MAAM,EACzB,gBAAgB,CAAC,EAAE,MAAM,sBAa1B;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,kBAAkB,EAC/B,gBAAgB,CAAC,EAAE,MAAM,EACzB,gBAAgB,CAAC,EAAE,MAAM,sBA2D1B;AAuBD,wBAAsB,2BAA2B,CAC/C,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,kBAAkB,EACtB,eAAe,EAAE,kBAAkB,GAClC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAmC7B;AAiDD,wBAAsB,8BAA8B,CAClD,GAAG,EAAE,GAAG,EACR,UAAU,EAAE,UAAU,EACtB,EAAE,EAAE,kBAAkB,EACtB,MAAM,CAAC,EAAE,kBAAkB,EAC3B,eAAe,GAAE,kBAA2C,EAC5D,cAAc,CAAC,EAAE,MAAM,IAAI,GAC1B,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CA+DjC"}
@@ -152,12 +152,11 @@ async function simulateTransaction(umi, connection, transaction) {
152
152
  }
153
153
  async function getComputeUnitPriceEstimate(umi, tx, prioritySetting) {
154
154
  const web3Transaction = (0, umi_web3js_adapters_1.toWeb3JsTransaction)((await tx.setLatestBlockhash(umi, { commitment: "finalized" })).build(umi));
155
- const serializedTransaction = bs58_1.default.encode(web3Transaction.serialize());
156
155
  let feeEstimate;
157
156
  try {
158
157
  const resp = await umi.rpc.call("getPriorityFeeEstimate", [
159
158
  {
160
- transaction: serializedTransaction,
159
+ transaction: bs58_1.default.encode(web3Transaction.serialize()),
161
160
  options: {
162
161
  priorityLevel: prioritySetting.toString(),
163
162
  },
@@ -166,7 +165,22 @@ async function getComputeUnitPriceEstimate(umi, tx, prioritySetting) {
166
165
  feeEstimate = Math.round(resp.priorityFeeEstimate);
167
166
  }
168
167
  catch (e) {
169
- console.error(e);
168
+ try {
169
+ const resp = await umi.rpc.call("getPriorityFeeEstimate", [
170
+ {
171
+ accountKeys: tx
172
+ .getInstructions()
173
+ .flatMap((x) => x.keys.flatMap((x) => x.pubkey.toString())),
174
+ options: {
175
+ priorityLevel: prioritySetting.toString(),
176
+ },
177
+ },
178
+ ]);
179
+ feeEstimate = Math.round(resp.priorityFeeEstimate);
180
+ }
181
+ catch (e) {
182
+ console.error(e);
183
+ }
170
184
  }
171
185
  return feeEstimate;
172
186
  }
@@ -1 +1 @@
1
- {"version":3,"file":"rebalanceUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/solauto/rebalanceUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EACL,WAAW,EACX,aAAa,EAEb,kBAAkB,EAClB,yBAAyB,EACzB,SAAS,EACV,MAAM,iBAAiB,CAAC;AAOzB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAajD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAmI9C,MAAM,WAAW,eAAe;IAC9B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,eAAe,EAAE,eAAe,CAAC;IACjC,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,yBAAyB,GAAG,SAAS,EAC/C,GAAG,EAAE,WAAW,GAAG,SAAS,EAC5B,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,2BAA2B,CAAC,EAAE,MAAM,GACnC,eAAe,CAiDjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,eAAe,EACvB,QAAQ,EAAE,aAAa,GACtB,gBAAgB,GAAG,SAAS,CA0D9B;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,eAAe,EACvB,2BAA2B,CAAC,EAAE,MAAM,EACpC,UAAU,CAAC,EAAE,MAAM,GAClB,cAAc,CAyChB"}
1
+ {"version":3,"file":"rebalanceUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/solauto/rebalanceUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EACL,WAAW,EACX,aAAa,EAEb,kBAAkB,EAClB,yBAAyB,EACzB,SAAS,EACV,MAAM,iBAAiB,CAAC;AAOzB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAajD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAmI9C,MAAM,WAAW,eAAe;IAC9B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,eAAe,EAAE,eAAe,CAAC;IACjC,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,yBAAyB,GAAG,SAAS,EAC/C,GAAG,EAAE,WAAW,GAAG,SAAS,EAC5B,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,2BAA2B,CAAC,EAAE,MAAM,GACnC,eAAe,CAwDjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,eAAe,EACvB,QAAQ,EAAE,aAAa,GACtB,gBAAgB,GAAG,SAAS,CA8D9B;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,eAAe,EACvB,2BAA2B,CAAC,EAAE,MAAM,EACpC,UAAU,CAAC,EAAE,MAAM,GAClB,cAAc,CA2ChB"}
@@ -84,7 +84,9 @@ function getRebalanceValues(state, settings, dca, currentUnixTime, supplyPrice,
84
84
  const { targetRateBps, amountToDcaIn } = getTargetRateAndDcaAmount(state, settings, dca, currentUnixTime, targetLiqUtilizationRateBps);
85
85
  const amountUsdToDcaIn = (0, numberUtils_1.fromBaseUnit)(BigInt(Math.round(amountToDcaIn ?? 0)), state.debt.decimals) *
86
86
  (dca?.tokenType === generated_1.TokenType.Debt ? debtPrice : supplyPrice);
87
- const rebalanceDirection = amountUsdToDcaIn > 0 || state.liqUtilizationRateBps <= targetRateBps ? generated_1.RebalanceDirection.Boost : generated_1.RebalanceDirection.Repay;
87
+ const rebalanceDirection = amountUsdToDcaIn > 0 || state.liqUtilizationRateBps <= targetRateBps
88
+ ? generated_1.RebalanceDirection.Boost
89
+ : generated_1.RebalanceDirection.Repay;
88
90
  const adjustmentFeeBps = (0, numberUtils_1.getSolautoFeesBps)(false, targetLiqUtilizationRateBps, (0, numberUtils_1.fromBaseUnit)(state.netWorth.baseAmountUsdValue, generalAccounts_1.USD_DECIMALS), rebalanceDirection).total;
89
91
  const supplyUsd = (0, numberUtils_1.fromBaseUnit)(state.supply.amountUsed.baseAmountUsdValue, generalAccounts_1.USD_DECIMALS) +
90
92
  amountUsdToDcaIn;
@@ -97,24 +99,32 @@ function getRebalanceValues(state, settings, dca, currentUnixTime, supplyPrice,
97
99
  amountToDcaIn: amountToDcaIn ?? 0,
98
100
  amountUsdToDcaIn,
99
101
  dcaTokenType: dca?.tokenType,
100
- rebalanceAction: (amountToDcaIn ?? 0) > 0 ? "dca" : rebalanceDirection === generated_1.RebalanceDirection.Boost ? "boost" : "repay",
102
+ rebalanceAction: (amountToDcaIn ?? 0) > 0
103
+ ? "dca"
104
+ : rebalanceDirection === generated_1.RebalanceDirection.Boost
105
+ ? "boost"
106
+ : "repay",
101
107
  rebalanceDirection,
102
- feesUsd: debtAdjustmentUsd * (0, numberUtils_1.fromBps)(adjustmentFeeBps)
108
+ feesUsd: debtAdjustmentUsd * (0, numberUtils_1.fromBps)(adjustmentFeeBps),
103
109
  };
104
110
  }
105
111
  function getFlashLoanDetails(client, values, jupQuote) {
106
112
  let supplyUsd = (0, numberUtils_1.fromBaseUnit)(client.solautoPositionState.supply.amountUsed.baseAmountUsdValue, generalAccounts_1.USD_DECIMALS) +
107
113
  (values.dcaTokenType === generated_1.TokenType.Supply ? values.amountUsdToDcaIn : 0);
108
114
  let debtUsd = (0, numberUtils_1.fromBaseUnit)(client.solautoPositionState.debt.amountUsed.baseAmountUsdValue, generalAccounts_1.USD_DECIMALS);
109
- const debtAdjustmentUsd = Math.abs(values.debtAdjustmentUsd);
115
+ const debtAdjustmentUsdAbs = Math.abs(values.debtAdjustmentUsd);
110
116
  supplyUsd =
111
- values.debtAdjustmentUsd < 0 ? supplyUsd - debtAdjustmentUsd : supplyUsd;
117
+ values.rebalanceDirection === generated_1.RebalanceDirection.Repay
118
+ ? supplyUsd - debtAdjustmentUsdAbs
119
+ : supplyUsd;
112
120
  debtUsd =
113
- values.debtAdjustmentUsd > 0 ? debtUsd + debtAdjustmentUsd : debtUsd;
121
+ values.rebalanceDirection === generated_1.RebalanceDirection.Boost
122
+ ? debtUsd + debtAdjustmentUsdAbs
123
+ : debtUsd;
114
124
  const tempLiqUtilizationRateBps = (0, numberUtils_1.getLiqUtilzationRateBps)(supplyUsd, debtUsd, client.solautoPositionState.liqThresholdBps);
115
125
  const requiresFlashLoan = supplyUsd <= 0 ||
116
126
  tempLiqUtilizationRateBps >
117
- (0, numberUtils_1.getMaxLiqUtilizationRateBps)(client.solautoPositionState.maxLtvBps, client.solautoPositionState.liqThresholdBps, 0.01);
127
+ (0, numberUtils_1.getMaxLiqUtilizationRateBps)(client.solautoPositionState.maxLtvBps, client.solautoPositionState.liqThresholdBps, 0.015);
118
128
  let flashLoanToken = undefined;
119
129
  let flashLoanTokenPrice = 0;
120
130
  if (values.rebalanceDirection === generated_1.RebalanceDirection.Boost) {
@@ -132,7 +142,7 @@ function getFlashLoanDetails(client, values, jupQuote) {
132
142
  ? {
133
143
  baseUnitAmount: exactAmountBaseUnit
134
144
  ? exactAmountBaseUnit
135
- : (0, numberUtils_1.toBaseUnit)(debtAdjustmentUsd / flashLoanTokenPrice, flashLoanToken.decimals),
145
+ : (0, numberUtils_1.toBaseUnit)(debtAdjustmentUsdAbs / flashLoanTokenPrice, flashLoanToken.decimals),
136
146
  mint: (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(flashLoanToken.mint),
137
147
  }
138
148
  : undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haven-fi/solauto-sdk",
3
- "version": "1.0.312",
3
+ "version": "1.0.314",
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",
@@ -517,7 +517,7 @@ export abstract class SolautoClient extends ReferralStateManager {
517
517
  type: "supply",
518
518
  value:
519
519
  (this.solautoPositionState?.supply.amountUsed.baseUnit ??
520
- BigInt(0)) + this.livePositionUpdates.supplyAdjustment,
520
+ BigInt(0)) * BigInt(-1),
521
521
  });
522
522
  }
523
523
  } else if (args.__kind === "Borrow") {
@@ -535,8 +535,8 @@ export abstract class SolautoClient extends ReferralStateManager {
535
535
  this.livePositionUpdates.new({
536
536
  type: "debt",
537
537
  value:
538
- (this.solautoPositionState?.debt.amountUsed.baseUnit ?? BigInt(0)) +
539
- this.livePositionUpdates.debtAdjustment,
538
+ (this.solautoPositionState?.debt.amountUsed.baseUnit ?? BigInt(0)) *
539
+ BigInt(-1),
540
540
  });
541
541
  }
542
542
  }
@@ -659,8 +659,7 @@ export async function buildSolautoRebalanceTransaction(
659
659
  client.solautoPositionActiveDca(),
660
660
  currentUnixSeconds(),
661
661
  supplyPrice,
662
- debtPrice,
663
- 0
662
+ debtPrice
664
663
  ))
665
664
  ) {
666
665
  client.log("Not eligible for a rebalance");
@@ -153,6 +153,12 @@ class TransactionSet {
153
153
  );
154
154
  }
155
155
 
156
+ prepend(...items: TransactionItem[]) {
157
+ this.items.unshift(
158
+ ...items.filter((x) => x.tx && x.tx.getInstructions().length > 0)
159
+ );
160
+ }
161
+
156
162
  async refetchAll(attemptNum: number) {
157
163
  await this.txHandler.resetLiveTxUpdates();
158
164
  for (const item of this.items) {
@@ -179,7 +185,7 @@ class TransactionSet {
179
185
 
180
186
  name(): string {
181
187
  let names = this.items
182
- .filter((x) => x.tx && x.name !== undefined)
188
+ .filter((x) => x.tx && Boolean(x.name))
183
189
  .map((x) => x.name!.toLowerCase());
184
190
  if (names.length > 1) {
185
191
  names = names.filter((x) => x !== CHORES_TX_NAME);
@@ -237,9 +243,9 @@ export class TransactionsManager {
237
243
  let transactionSets: TransactionSet[] = [];
238
244
  this.txHandler.log(`Reassembling ${items.length} items`);
239
245
 
240
- for (let i = 0; i < items.length; ) {
246
+ for (let i = items.length - 1; i >= 0; ) {
241
247
  let item = items[i];
242
- i++;
248
+ i--;
243
249
 
244
250
  if (!item.tx) {
245
251
  continue;
@@ -256,15 +262,15 @@ export class TransactionsManager {
256
262
  let newSet = new TransactionSet(this.txHandler, this.lookupTables, [
257
263
  item,
258
264
  ]);
259
- for (let j = i; j < items.length; j++) {
265
+ for (let j = i; j >= 0; j--) {
260
266
  if (await newSet.fitsWith(items[j])) {
261
- newSet.add(items[j]);
262
- i++;
267
+ newSet.prepend(items[j]);
268
+ i--;
263
269
  } else {
264
270
  break;
265
271
  }
266
272
  }
267
- transactionSets.push(newSet);
273
+ transactionSets.unshift(newSet);
268
274
  }
269
275
  }
270
276
 
@@ -409,11 +415,13 @@ export class TransactionsManager {
409
415
  .stale;
410
416
 
411
417
  if (stale) {
418
+ this.txHandler.log("Requires oracle update...");
412
419
  const swbTx = new TransactionItem(
413
420
  async () =>
414
421
  buildSwbSubmitResponseTx(client.connection, client.signer, mint),
415
- items.length === 1 ? "Update oracle" : ""
422
+ "Update oracle"
416
423
  );
424
+ await swbTx.initialize();
417
425
  items.unshift(swbTx);
418
426
  }
419
427
  }
@@ -505,17 +513,28 @@ export class TransactionsManager {
505
513
 
506
514
  private async processTransactionsAtomically(itemSets: TransactionSet[]) {
507
515
  let num = 0;
516
+ let sets = itemSets;
508
517
 
509
518
  await retryWithExponentialBackoff(
510
519
  async (attemptNum) => {
511
520
  num = attemptNum;
512
521
 
522
+ if (attemptNum > 0) {
523
+ sets = [];
524
+ for (let i = 0; i < itemSets.length; i++) {
525
+ const txSet = await this.refreshItemSet(itemSets, i, attemptNum);
526
+ if (txSet) {
527
+ sets.push(txSet);
528
+ }
529
+ }
530
+ }
531
+
513
532
  let transactions = [];
514
- for (const set of itemSets) {
533
+ for (const set of sets) {
515
534
  transactions.push(await set.getSingleTransaction());
516
535
  }
517
536
 
518
- itemSets.forEach((x) =>
537
+ sets.forEach((x) =>
519
538
  this.updateStatus(x.name(), TransactionStatus.Processing, attemptNum)
520
539
  );
521
540
  const txSigs = await sendJitoBundledTransactions(
@@ -526,7 +545,7 @@ export class TransactionsManager {
526
545
  this.priorityFeeSetting
527
546
  );
528
547
  if (txSigs) {
529
- itemSets.forEach((x, i) =>
548
+ sets.forEach((x, i) =>
530
549
  this.updateStatus(
531
550
  x.name(),
532
551
  TransactionStatus.Successful,
@@ -535,7 +554,7 @@ export class TransactionsManager {
535
554
  )
536
555
  );
537
556
  } else {
538
- itemSets.forEach((x) =>
557
+ sets.forEach((x) =>
539
558
  this.updateStatus(
540
559
  x.name(),
541
560
  TransactionStatus.Failed,
@@ -551,7 +570,7 @@ export class TransactionsManager {
551
570
  this.retryDelay,
552
571
  this.errorsToThrow
553
572
  ).catch((e: Error) => {
554
- itemSets.forEach((x) =>
573
+ sets.forEach((x) =>
555
574
  this.updateStatus(
556
575
  x.name(),
557
576
  TransactionStatus.Failed,
@@ -9,6 +9,7 @@ import {
9
9
  } from "@metaplex-foundation/umi";
10
10
  import {
11
11
  assembleFinalTransaction,
12
+ buildIronforgeApiUrl,
12
13
  getComputeUnitPriceEstimate,
13
14
  systemTransferUmiIx,
14
15
  } from "./solanaUtils";
@@ -16,6 +17,7 @@ import { consoleLog } from "./generalUtils";
16
17
  import { PriorityFeeSetting } from "../types";
17
18
  import axios from "axios";
18
19
  import base58 from "bs58";
20
+ import { bs58 } from "@coral-xyz/anchor/dist/cjs/utils/bytes";
19
21
 
20
22
  export async function getRandomTipAccount(): Promise<PublicKey> {
21
23
  const tipAccounts = [
@@ -43,25 +45,24 @@ async function getTipInstruction(
43
45
  );
44
46
  }
45
47
 
46
- // async function simulateJitoBundle(
47
- // txs: VersionedTransaction[]
48
- // ): Promise<SimulatedBundleTransactionResult[]> {
49
- // const simulationResult = await JITO_CONNECTION.simulateBundle(txs, {
50
- // preExecutionAccountsConfigs: txs.map((x) => null),
51
- // postExecutionAccountsConfigs: txs.map((x) => null),
52
- // skipSigVerify: true,
53
- // });
54
-
55
- // simulationResult.value.transactionResults.forEach((tx) => {
56
- // if (tx.err) {
57
- // tx.logs?.forEach((x) => {
58
- // consoleLog(x);
59
- // });
60
- // throw tx.err;
48
+ // TODO: fix
49
+ // async function simulateJitoBundle(umi: Umi, txs: VersionedTransaction[]) {
50
+ // const simulationResult = await axios.post(
51
+ // `${JITO_BLOCK_ENGINE}/api/v1/bundles`,
52
+ // {
53
+ // method: "simulateBundle",
54
+ // id: 1,
55
+ // jsonrpc: "2.0",
56
+ // params: [
57
+ // {
58
+ // encodedTransactions: txs.map((x) => bs58.encode(x.serialize())),
59
+ // preExecutionAccountsConfigs: txs.map((_) => ""),
60
+ // postExecutionAccountsConfigs: txs.map((_) => ""),
61
+ // skipSigVerify: true,
62
+ // },
63
+ // ],
61
64
  // }
62
- // });
63
-
64
- // return simulationResult.value.transactionResults;
65
+ // );
65
66
  // }
66
67
 
67
68
  async function umiToVersionedTransactions(
@@ -122,7 +123,6 @@ async function pollBundleStatus(
122
123
  }
123
124
 
124
125
  async function sendJitoBundle(transactions: string[]): Promise<string[]> {
125
- consoleLog("Sending bundle...");
126
126
  const resp = await axios.post<{ result: string }>(
127
127
  `${JITO_BLOCK_ENGINE}/api/v1/bundles`,
128
128
  {
@@ -134,7 +134,8 @@ async function sendJitoBundle(transactions: string[]): Promise<string[]> {
134
134
  );
135
135
 
136
136
  const bundleId = resp.data.result;
137
- return await pollBundleStatus(bundleId);
137
+ consoleLog("Bundle ID:", bundleId);
138
+ return bundleId ? await pollBundleStatus(bundleId) : [];
138
139
  }
139
140
 
140
141
  export async function sendJitoBundledTransactions(
@@ -165,10 +166,9 @@ export async function sendJitoBundledTransactions(
165
166
  signer,
166
167
  txs,
167
168
  feeEstimates
168
- // Array(txs.length).fill(1_400_000)
169
169
  );
170
- // // TODO: Skip over this for now, and instead don't specify a compute unit limit in the final bundle transactions
171
- // const simulationResults = await simulateJitoBundle(builtTxs);
170
+
171
+ // const simulationResults = await simulateJitoBundle(umi, builtTxs);
172
172
 
173
173
  if (!simulateOnly) {
174
174
  // let builtTxs = await umiToVersionedTransactions(
@@ -293,13 +293,12 @@ export async function getComputeUnitPriceEstimate(
293
293
  const web3Transaction = toWeb3JsTransaction(
294
294
  (await tx.setLatestBlockhash(umi, { commitment: "finalized" })).build(umi)
295
295
  );
296
- const serializedTransaction = bs58.encode(web3Transaction.serialize());
297
296
 
298
297
  let feeEstimate: number | undefined;
299
298
  try {
300
299
  const resp = await umi.rpc.call("getPriorityFeeEstimate", [
301
300
  {
302
- transaction: serializedTransaction,
301
+ transaction: bs58.encode(web3Transaction.serialize()),
303
302
  options: {
304
303
  priorityLevel: prioritySetting.toString(),
305
304
  },
@@ -307,7 +306,21 @@ export async function getComputeUnitPriceEstimate(
307
306
  ]);
308
307
  feeEstimate = Math.round((resp as any).priorityFeeEstimate as number);
309
308
  } catch (e) {
310
- console.error(e);
309
+ try {
310
+ const resp = await umi.rpc.call("getPriorityFeeEstimate", [
311
+ {
312
+ accountKeys: tx
313
+ .getInstructions()
314
+ .flatMap((x) => x.keys.flatMap((x) => x.pubkey.toString())),
315
+ options: {
316
+ priorityLevel: prioritySetting.toString(),
317
+ },
318
+ },
319
+ ]);
320
+ feeEstimate = Math.round((resp as any).priorityFeeEstimate as number);
321
+ } catch (e) {
322
+ console.error(e);
323
+ }
311
324
  }
312
325
 
313
326
  return feeEstimate;
@@ -374,7 +387,11 @@ export async function sendSingleOptimizedTransaction(
374
387
 
375
388
  let cuPrice: number | undefined;
376
389
  if (prioritySetting !== PriorityFeeSetting.None) {
377
- cuPrice = await getComputeUnitPriceEstimate(umi, tx, prioritySetting);
390
+ cuPrice = await getComputeUnitPriceEstimate(
391
+ umi,
392
+ tx,
393
+ prioritySetting,
394
+ );
378
395
  if (!cuPrice) {
379
396
  cuPrice = 1000000;
380
397
  }
@@ -191,7 +191,10 @@ export function getRebalanceValues(
191
191
  fromBaseUnit(BigInt(Math.round(amountToDcaIn ?? 0)), state.debt.decimals) *
192
192
  (dca?.tokenType === TokenType.Debt ? debtPrice : supplyPrice);
193
193
 
194
- const rebalanceDirection = amountUsdToDcaIn > 0 || state.liqUtilizationRateBps <= targetRateBps ? RebalanceDirection.Boost : RebalanceDirection.Repay;
194
+ const rebalanceDirection =
195
+ amountUsdToDcaIn > 0 || state.liqUtilizationRateBps <= targetRateBps
196
+ ? RebalanceDirection.Boost
197
+ : RebalanceDirection.Repay;
195
198
  const adjustmentFeeBps = getSolautoFeesBps(
196
199
  false,
197
200
  targetLiqUtilizationRateBps,
@@ -223,9 +226,13 @@ export function getRebalanceValues(
223
226
  amountUsdToDcaIn,
224
227
  dcaTokenType: dca?.tokenType,
225
228
  rebalanceAction:
226
- (amountToDcaIn ?? 0) > 0 ? "dca" : rebalanceDirection === RebalanceDirection.Boost ? "boost" : "repay",
229
+ (amountToDcaIn ?? 0) > 0
230
+ ? "dca"
231
+ : rebalanceDirection === RebalanceDirection.Boost
232
+ ? "boost"
233
+ : "repay",
227
234
  rebalanceDirection,
228
- feesUsd: debtAdjustmentUsd * fromBps(adjustmentFeeBps)
235
+ feesUsd: debtAdjustmentUsd * fromBps(adjustmentFeeBps),
229
236
  };
230
237
  }
231
238
 
@@ -250,11 +257,15 @@ export function getFlashLoanDetails(
250
257
  USD_DECIMALS
251
258
  );
252
259
 
253
- const debtAdjustmentUsd = Math.abs(values.debtAdjustmentUsd);
260
+ const debtAdjustmentUsdAbs = Math.abs(values.debtAdjustmentUsd);
254
261
  supplyUsd =
255
- values.debtAdjustmentUsd < 0 ? supplyUsd - debtAdjustmentUsd : supplyUsd;
262
+ values.rebalanceDirection === RebalanceDirection.Repay
263
+ ? supplyUsd - debtAdjustmentUsdAbs
264
+ : supplyUsd;
256
265
  debtUsd =
257
- values.debtAdjustmentUsd > 0 ? debtUsd + debtAdjustmentUsd : debtUsd;
266
+ values.rebalanceDirection === RebalanceDirection.Boost
267
+ ? debtUsd + debtAdjustmentUsdAbs
268
+ : debtUsd;
258
269
 
259
270
  const tempLiqUtilizationRateBps = getLiqUtilzationRateBps(
260
271
  supplyUsd,
@@ -267,7 +278,7 @@ export function getFlashLoanDetails(
267
278
  getMaxLiqUtilizationRateBps(
268
279
  client.solautoPositionState!.maxLtvBps,
269
280
  client.solautoPositionState!.liqThresholdBps,
270
- 0.01
281
+ 0.015
271
282
  );
272
283
 
273
284
  let flashLoanToken: PositionTokenUsage | undefined = undefined;
@@ -290,7 +301,7 @@ export function getFlashLoanDetails(
290
301
  baseUnitAmount: exactAmountBaseUnit
291
302
  ? exactAmountBaseUnit
292
303
  : toBaseUnit(
293
- debtAdjustmentUsd / flashLoanTokenPrice,
304
+ debtAdjustmentUsdAbs / flashLoanTokenPrice,
294
305
  flashLoanToken.decimals
295
306
  ),
296
307
  mint: toWeb3JsPublicKey(flashLoanToken.mint),
@@ -304,12 +315,14 @@ export function getJupSwapRebalanceDetails(
304
315
  targetLiqUtilizationRateBps?: number,
305
316
  attemptNum?: number
306
317
  ): JupSwapDetails {
307
- const input = values.rebalanceDirection === RebalanceDirection.Boost
308
- ? client.solautoPositionState!.debt
309
- : client.solautoPositionState!.supply;
310
- const output = values.rebalanceDirection === RebalanceDirection.Boost
311
- ? client.solautoPositionState!.supply
312
- : client.solautoPositionState!.debt;
318
+ const input =
319
+ values.rebalanceDirection === RebalanceDirection.Boost
320
+ ? client.solautoPositionState!.debt
321
+ : client.solautoPositionState!.supply;
322
+ const output =
323
+ values.rebalanceDirection === RebalanceDirection.Boost
324
+ ? client.solautoPositionState!.supply
325
+ : client.solautoPositionState!.debt;
313
326
 
314
327
  const usdToSwap =
315
328
  Math.abs(values.debtAdjustmentUsd) +
@@ -16,7 +16,6 @@ import {
16
16
  toBaseUnit,
17
17
  } from "../../src/utils/numberUtils";
18
18
  import { NATIVE_MINT } from "@solana/spl-token";
19
- import { consoleLog } from "../../src/utils/generalUtils";
20
19
  import {
21
20
  TransactionItem,
22
21
  TransactionsManager,
@@ -34,9 +33,9 @@ describe("Solauto Marginfi tests", async () => {
34
33
  const signer = setupTest();
35
34
  // const signer = setupTest("solauto-manager");
36
35
 
37
- const payForTransactions = true;
36
+ const payForTransactions = false;
38
37
  const testProgram = true;
39
- const positionId = 3;
38
+ const positionId = 1;
40
39
 
41
40
  it("open - deposit - borrow - rebalance to 0 - withdraw - close", async () => {
42
41
  const client = new SolautoMarginfiClient(
@@ -52,7 +51,7 @@ describe("Solauto Marginfi tests", async () => {
52
51
  await client.initialize({
53
52
  signer,
54
53
  positionId,
55
- authority: new PublicKey("rC5dMP5dmSsfQ66rynzfFzuc122Eex9h1RJHVDkeH6D"), // positions 1 & 3 are taken
54
+ authority: new PublicKey("rC5dMP5dmSsfQ66rynzfFzuc122Eex9h1RJHVDkeH6D"),
56
55
  // new: true,
57
56
  // marginfiAccount: new PublicKey(
58
57
  // "4nNvUXF5YqHFcH2nGweSiuvy1ct7V5FXfoCLKFYUN36z"
@@ -123,7 +122,7 @@ describe("Solauto Marginfi tests", async () => {
123
122
  transactionItems.push(
124
123
  new TransactionItem(
125
124
  async (attemptNum) =>
126
- await buildSolautoRebalanceTransaction(client, 5000, attemptNum),
125
+ await buildSolautoRebalanceTransaction(client, undefined, attemptNum),
127
126
  "rebalance"
128
127
  )
129
128
  );