@haven-fi/solauto-sdk 1.0.311 → 1.0.313

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,CAsH5C;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"}
@@ -355,14 +355,16 @@ async function requiresRefreshBeforeRebalance(client) {
355
355
  }
356
356
  async function buildSolautoRebalanceTransaction(client, targetLiqUtilizationRateBps, attemptNum) {
357
357
  client.solautoPositionState = await client.getFreshPositionState();
358
+ const supplyPrice = (0, utils_1.safeGetPrice)(client.supplyMint) ?? 0;
359
+ const debtPrice = (0, utils_1.safeGetPrice)(client.debtMint) ?? 0;
358
360
  if ((client.solautoPositionState?.supply.amountUsed.baseUnit === BigInt(0) &&
359
361
  client.livePositionUpdates.supplyAdjustment === BigInt(0)) ||
360
362
  (targetLiqUtilizationRateBps === undefined &&
361
- !(0, generalUtils_2.eligibleForRebalance)(client.solautoPositionState, client.solautoPositionSettings(), client.solautoPositionActiveDca(), (0, generalUtils_1.currentUnixSeconds)()))) {
363
+ !(0, generalUtils_2.eligibleForRebalance)(client.solautoPositionState, client.solautoPositionSettings(), client.solautoPositionActiveDca(), (0, generalUtils_1.currentUnixSeconds)(), supplyPrice, debtPrice))) {
362
364
  client.log("Not eligible for a rebalance");
363
365
  return undefined;
364
366
  }
365
- const values = (0, rebalanceUtils_1.getRebalanceValues)(client.solautoPositionState, client.solautoPositionSettings(), client.solautoPositionActiveDca(), (0, generalUtils_1.currentUnixSeconds)(), (0, utils_1.safeGetPrice)(client.supplyMint), (0, utils_1.safeGetPrice)(client.debtMint), targetLiqUtilizationRateBps);
367
+ const values = (0, rebalanceUtils_1.getRebalanceValues)(client.solautoPositionState, client.solautoPositionSettings(), client.solautoPositionActiveDca(), (0, generalUtils_1.currentUnixSeconds)(), supplyPrice, debtPrice, targetLiqUtilizationRateBps);
366
368
  client.log("Rebalance values: ", values);
367
369
  const swapDetails = (0, rebalanceUtils_1.getJupSwapRebalanceDetails)(client, values, targetLiqUtilizationRateBps, attemptNum);
368
370
  const { jupQuote, lookupTableAddresses, setupInstructions, tokenLedgerIx, swapIx, } = await (0, jupiterUtils_1.getJupSwapTransaction)(client.signer, swapDetails, attemptNum);
@@ -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
  }
@@ -81,7 +81,6 @@ async function pollBundleStatus(bundleId, interval = 1000, timeout = 40000) {
81
81
  return [];
82
82
  }
83
83
  async function sendJitoBundle(transactions) {
84
- (0, generalUtils_1.consoleLog)("Sending bundle...");
85
84
  const resp = await axios_1.default.post(`${solautoConstants_1.JITO_BLOCK_ENGINE}/api/v1/bundles`, {
86
85
  jsonrpc: "2.0",
87
86
  id: 1,
@@ -89,14 +88,15 @@ async function sendJitoBundle(transactions) {
89
88
  params: [transactions],
90
89
  });
91
90
  const bundleId = resp.data.result;
92
- return await pollBundleStatus(bundleId);
91
+ (0, generalUtils_1.consoleLog)("Bundle ID:", bundleId);
92
+ return bundleId ? await pollBundleStatus(bundleId) : [];
93
93
  }
94
94
  async function sendJitoBundledTransactions(umi, signer, txs, simulateOnly, priorityFeeSetting = types_1.PriorityFeeSetting.Min) {
95
95
  (0, generalUtils_1.consoleLog)("Sending Jito bundle...");
96
96
  (0, generalUtils_1.consoleLog)("Transactions: ", txs.length);
97
97
  (0, generalUtils_1.consoleLog)("Transaction sizes: ", txs.map((x) => x.getTransactionSize(umi)));
98
98
  txs[0] = txs[0].prepend(await getTipInstruction(signer, 150000));
99
- const feeEstimates = await Promise.all(txs.map(async (x) => (await (0, solanaUtils_1.getComputeUnitPriceEstimate)(umi, x, priorityFeeSetting)) ??
99
+ const feeEstimates = await Promise.all(txs.map(async (x) => (await (0, solanaUtils_1.getComputeUnitPriceEstimate)(umi, x, priorityFeeSetting, true)) ??
100
100
  1000000));
101
101
  let builtTxs = await umiToVersionedTransactions(umi, signer, txs, feeEstimates
102
102
  // Array(txs.length).fill(1_400_000)
@@ -1 +1 @@
1
- {"version":3,"file":"jupiterUtils.d.ts","sourceRoot":"","sources":["../../src/utils/jupiterUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,kBAAkB,EAEnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,SAAS,EAA0B,MAAM,iBAAiB,CAAC;AAGpE,OAAO,EAGL,aAAa,EACd,MAAM,aAAa,CAAC;AAOrB,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,SAAS,CAAC;IACtB,iBAAiB,EAAE,SAAS,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAgBD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,aAAa,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,iBAAiB,EAAE,kBAAkB,CAAC;IACtC,aAAa,EAAE,kBAAkB,CAAC;IAClC,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,cAAc,EAC3B,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,kBAAkB,CAAC,CAmG7B"}
1
+ {"version":3,"file":"jupiterUtils.d.ts","sourceRoot":"","sources":["../../src/utils/jupiterUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,kBAAkB,EAEnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,SAAS,EAA0B,MAAM,iBAAiB,CAAC;AAGpE,OAAO,EAGL,aAAa,EACd,MAAM,aAAa,CAAC;AAOrB,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,SAAS,CAAC;IACtB,iBAAiB,EAAE,SAAS,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAgBD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,aAAa,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,iBAAiB,EAAE,kBAAkB,CAAC;IACtC,aAAa,EAAE,kBAAkB,CAAC;IAClC,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,cAAc,EAC3B,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,kBAAkB,CAAC,CA6F7B"}
@@ -45,12 +45,6 @@ async function getJupSwapTransaction(signer, swapDetails, attemptNum) {
45
45
  quoteResponse.inAmount = (parseInt(quoteResponse.inAmount) +
46
46
  Math.ceil(parseInt(quoteResponse.inAmount) * (0, numberUtils_1.fromBps)(finalPriceSlippageBps))).toString();
47
47
  }
48
- // else {
49
- // quoteResponse.inAmount = (
50
- // parseInt(quoteResponse.inAmount) +
51
- // Math.ceil(parseInt(quoteResponse.inAmount) * fromBps(priceImpactBps))
52
- // ).toString();
53
- // }
54
48
  (0, generalUtils_1.consoleLog)("Getting jup instructions...");
55
49
  const instructions = await (0, generalUtils_1.retryWithExponentialBackoff)(async () => await jupApi.swapInstructionsPost({
56
50
  swapRequest: {
@@ -1 +1 @@
1
- {"version":3,"file":"priceUtils.d.ts","sourceRoot":"","sources":["../../src/utils/priceUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,IAAI,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAYrE,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,SAAS,EAAE,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CAqCnB;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,qBAwCrD;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,SAAS,GACzC,MAAM,GAAG,SAAS,CAKpB;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,qBAsBzD"}
1
+ {"version":3,"file":"priceUtils.d.ts","sourceRoot":"","sources":["../../src/utils/priceUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,IAAI,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAYrE,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,SAAS,EAAE,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CAqCnB;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,qBAwCrD;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,SAAS,GACzC,MAAM,GAAG,SAAS,CAKpB;AAGD,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,qBAoBzD"}
@@ -68,6 +68,7 @@ function safeGetPrice(mint) {
68
68
  }
69
69
  return undefined;
70
70
  }
71
+ // LEGACY, NOT USED
71
72
  async function getJupTokenPrices(mints) {
72
73
  if (mints.length == 0) {
73
74
  return [];
@@ -77,7 +78,6 @@ async function getJupTokenPrices(mints) {
77
78
  mints.map((x) => x.toString()).join(",") + "&showExtraInfo=true")).json();
78
79
  return res;
79
80
  }, 6);
80
- console.log(data.data[mints[0].toString()].extraInfo.quotedPrice);
81
81
  const prices = Object.values(data.data).map((x) => parseFloat(x.price));
82
82
  return prices;
83
83
  }
@@ -14,6 +14,6 @@ export declare function splTokenTransferUmiIx(signer: Signer, fromTa: PublicKey,
14
14
  export declare function getAddressLookupInputs(umi: Umi, lookupTableAddresses: string[]): Promise<AddressLookupTableInput[]>;
15
15
  export declare function addTxOptimizations(signer: Signer, transaction: TransactionBuilder, computeUnitPrice?: number, computeUnitLimit?: number): TransactionBuilder;
16
16
  export declare function assembleFinalTransaction(signer: Signer, transaction: TransactionBuilder, computeUnitPrice?: number, computeUnitLimit?: number): TransactionBuilder;
17
- export declare function getComputeUnitPriceEstimate(umi: Umi, tx: TransactionBuilder, prioritySetting: PriorityFeeSetting): Promise<number | undefined>;
17
+ export declare function getComputeUnitPriceEstimate(umi: Umi, tx: TransactionBuilder, prioritySetting: PriorityFeeSetting, simMayFail: boolean): Promise<number | undefined>;
18
18
  export declare function sendSingleOptimizedTransaction(umi: Umi, connection: Connection, tx: TransactionBuilder, txType?: TransactionRunType, prioritySetting?: PriorityFeeSetting, onAwaitingSign?: () => void): Promise<Uint8Array | undefined>;
19
19
  //# sourceMappingURL=solanaUtils.d.ts.map
@@ -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,EACnC,UAAU,EAAE,OAAO,GAClB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA8B7B;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"}
@@ -150,14 +150,22 @@ async function simulateTransaction(umi, connection, transaction) {
150
150
  }
151
151
  return simulationResult;
152
152
  }
153
- async function getComputeUnitPriceEstimate(umi, tx, prioritySetting) {
153
+ async function getComputeUnitPriceEstimate(umi, tx, prioritySetting, simMayFail) {
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());
155
+ const transaction = simMayFail
156
+ ? undefined
157
+ : bs58_1.default.encode(web3Transaction.serialize());
158
+ const accountKeys = simMayFail
159
+ ? tx
160
+ .getInstructions()
161
+ .flatMap((x) => x.keys.flatMap((x) => x.pubkey.toString()))
162
+ : undefined;
156
163
  let feeEstimate;
157
164
  try {
158
165
  const resp = await umi.rpc.call("getPriorityFeeEstimate", [
159
166
  {
160
- transaction: serializedTransaction,
167
+ transaction,
168
+ accountKeys,
161
169
  options: {
162
170
  priorityLevel: prioritySetting.toString(),
163
171
  },
@@ -208,7 +216,7 @@ async function sendSingleOptimizedTransaction(umi, connection, tx, txType, prior
208
216
  (0, generalUtils_1.consoleLog)("Serialized transaction size: ", tx.getTransactionSize(umi));
209
217
  let cuPrice;
210
218
  if (prioritySetting !== types_1.PriorityFeeSetting.None) {
211
- cuPrice = await getComputeUnitPriceEstimate(umi, tx, prioritySetting);
219
+ cuPrice = await getComputeUnitPriceEstimate(umi, tx, prioritySetting, false);
212
220
  if (!cuPrice) {
213
221
  cuPrice = 1000000;
214
222
  }
@@ -7,7 +7,7 @@ export declare function nextAutomationPeriodTimestamp(automation: AutomationSett
7
7
  export declare function eligibleForNextAutomationPeriod(automation: AutomationSettings, currentUnixTime: number): boolean;
8
8
  export declare function getUpdatedValueFromAutomation(currValue: number, targetValue: number, automation: AutomationSettings, currentUnixTimestamp: number): number;
9
9
  export declare function getAdjustedSettingsFromAutomation(settings: SolautoSettingsParameters, currentUnixTime: number): SolautoSettingsParameters;
10
- export declare function eligibleForRebalance(positionState: PositionState, positionSettings: SolautoSettingsParameters | undefined, positionDca: DCASettings | undefined, currentUnixTime: number, bpsDistanceThreshold?: number): RebalanceAction | undefined;
10
+ export declare function eligibleForRebalance(positionState: PositionState, positionSettings: SolautoSettingsParameters | undefined, positionDca: DCASettings | undefined, currentUnixTime: number, supplyMintPrice: number, debtMintPrice: number, bpsDistanceThreshold?: number): RebalanceAction | undefined;
11
11
  export declare function eligibleForRefresh(positionState: PositionState, positionSettings: SolautoSettingsParameters, currentUnixTime: number): boolean;
12
12
  export declare function getSolautoManagedPositions(umi: Umi, authority?: PublicKey, positionTypeFilter?: PositionType): Promise<SolautoPositionDetails[]>;
13
13
  export declare function getAllReferralStates(umi: Umi): Promise<PublicKey[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"generalUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/solauto/generalUtils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generalUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/solauto/generalUtils.ts"],"names":[],"mappings":"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"}
@@ -25,6 +25,7 @@ const umi_web3js_adapters_1 = require("@metaplex-foundation/umi-web3js-adapters"
25
25
  const constants_1 = require("../../constants");
26
26
  const marginfiUtils_1 = require("../marginfiUtils");
27
27
  const priceUtils_1 = require("../priceUtils");
28
+ const rebalanceUtils_1 = require("./rebalanceUtils");
28
29
  function createDynamicSolautoProgram(programId) {
29
30
  return {
30
31
  name: "solauto",
@@ -72,7 +73,7 @@ function getAdjustedSettingsFromAutomation(settings, currentUnixTime) {
72
73
  boostToBps,
73
74
  };
74
75
  }
75
- function eligibleForRebalance(positionState, positionSettings, positionDca, currentUnixTime, bpsDistanceThreshold = 0) {
76
+ function eligibleForRebalance(positionState, positionSettings, positionDca, currentUnixTime, supplyMintPrice, debtMintPrice, bpsDistanceThreshold = 0) {
76
77
  if (!positionSettings) {
77
78
  return undefined;
78
79
  }
@@ -92,7 +93,14 @@ function eligibleForRebalance(positionState, positionSettings, positionDca, curr
92
93
  const boostFrom = boostToBps - positionSettings.boostGap;
93
94
  if (Math.max(0, positionState.liqUtilizationRateBps - boostFrom) <=
94
95
  bpsDistanceThreshold) {
95
- return "boost";
96
+ const values = (0, rebalanceUtils_1.getRebalanceValues)(positionState, positionSettings, positionDca, (0, generalUtils_1.currentUnixSeconds)(), supplyMintPrice, debtMintPrice);
97
+ const sufficientLiquidity = (0, numberUtils_1.fromBaseUnit)(positionState.debt.amountCanBeUsed.baseAmountUsdValue, constants_1.USD_DECIMALS) *
98
+ 0.95 >
99
+ values.debtAdjustmentUsd;
100
+ if (!sufficientLiquidity) {
101
+ console.log("Insufficient debt liquidity to further boost");
102
+ }
103
+ return sufficientLiquidity ? "boost" : undefined;
96
104
  }
97
105
  else if (Math.max(0, repayFrom - positionState.liqUtilizationRateBps) <=
98
106
  bpsDistanceThreshold) {
@@ -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.311",
3
+ "version": "1.0.313",
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
  }
@@ -646,6 +646,9 @@ export async function buildSolautoRebalanceTransaction(
646
646
  attemptNum?: number
647
647
  ): Promise<TransactionItemInputs | undefined> {
648
648
  client.solautoPositionState = await client.getFreshPositionState();
649
+ const supplyPrice = safeGetPrice(client.supplyMint) ?? 0;
650
+ const debtPrice = safeGetPrice(client.debtMint) ?? 0;
651
+
649
652
  if (
650
653
  (client.solautoPositionState?.supply.amountUsed.baseUnit === BigInt(0) &&
651
654
  client.livePositionUpdates.supplyAdjustment === BigInt(0)) ||
@@ -654,7 +657,9 @@ export async function buildSolautoRebalanceTransaction(
654
657
  client.solautoPositionState!,
655
658
  client.solautoPositionSettings(),
656
659
  client.solautoPositionActiveDca(),
657
- currentUnixSeconds()
660
+ currentUnixSeconds(),
661
+ supplyPrice,
662
+ debtPrice
658
663
  ))
659
664
  ) {
660
665
  client.log("Not eligible for a rebalance");
@@ -666,8 +671,8 @@ export async function buildSolautoRebalanceTransaction(
666
671
  client.solautoPositionSettings(),
667
672
  client.solautoPositionActiveDca(),
668
673
  currentUnixSeconds(),
669
- safeGetPrice(client.supplyMint)!,
670
- safeGetPrice(client.debtMint)!,
674
+ supplyPrice,
675
+ debtPrice,
671
676
  targetLiqUtilizationRateBps
672
677
  );
673
678
  client.log("Rebalance values: ", values);
@@ -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,
@@ -122,7 +122,6 @@ async function pollBundleStatus(
122
122
  }
123
123
 
124
124
  async function sendJitoBundle(transactions: string[]): Promise<string[]> {
125
- consoleLog("Sending bundle...");
126
125
  const resp = await axios.post<{ result: string }>(
127
126
  `${JITO_BLOCK_ENGINE}/api/v1/bundles`,
128
127
  {
@@ -134,7 +133,8 @@ async function sendJitoBundle(transactions: string[]): Promise<string[]> {
134
133
  );
135
134
 
136
135
  const bundleId = resp.data.result;
137
- return await pollBundleStatus(bundleId);
136
+ consoleLog("Bundle ID:", bundleId);
137
+ return bundleId ? await pollBundleStatus(bundleId) : [];
138
138
  }
139
139
 
140
140
  export async function sendJitoBundledTransactions(
@@ -155,7 +155,7 @@ export async function sendJitoBundledTransactions(
155
155
  const feeEstimates = await Promise.all(
156
156
  txs.map(
157
157
  async (x) =>
158
- (await getComputeUnitPriceEstimate(umi, x, priorityFeeSetting)) ??
158
+ (await getComputeUnitPriceEstimate(umi, x, priorityFeeSetting, true)) ??
159
159
  1000000
160
160
  )
161
161
  );
@@ -94,12 +94,6 @@ export async function getJupSwapTransaction(
94
94
  )
95
95
  ).toString();
96
96
  }
97
- // else {
98
- // quoteResponse.inAmount = (
99
- // parseInt(quoteResponse.inAmount) +
100
- // Math.ceil(parseInt(quoteResponse.inAmount) * fromBps(priceImpactBps))
101
- // ).toString();
102
- // }
103
97
 
104
98
  consoleLog("Getting jup instructions...");
105
99
  const instructions = await retryWithExponentialBackoff(
@@ -103,6 +103,7 @@ export function safeGetPrice(
103
103
  return undefined;
104
104
  }
105
105
 
106
+ // LEGACY, NOT USED
106
107
  export async function getJupTokenPrices(mints: PublicKey[]) {
107
108
  if (mints.length == 0) {
108
109
  return [];
@@ -118,8 +119,6 @@ export async function getJupTokenPrices(mints: PublicKey[]) {
118
119
  return res;
119
120
  }, 6);
120
121
 
121
- console.log(data.data[mints[0].toString()].extraInfo.quotedPrice);
122
-
123
122
  const prices = Object.values(data.data as { [key: string]: any }).map(
124
123
  (x) => parseFloat(x.price as string) as number
125
124
  );
@@ -288,18 +288,27 @@ async function simulateTransaction(
288
288
  export async function getComputeUnitPriceEstimate(
289
289
  umi: Umi,
290
290
  tx: TransactionBuilder,
291
- prioritySetting: PriorityFeeSetting
291
+ prioritySetting: PriorityFeeSetting,
292
+ simMayFail: boolean
292
293
  ): Promise<number | undefined> {
293
294
  const web3Transaction = toWeb3JsTransaction(
294
295
  (await tx.setLatestBlockhash(umi, { commitment: "finalized" })).build(umi)
295
296
  );
296
- const serializedTransaction = bs58.encode(web3Transaction.serialize());
297
+ const transaction = simMayFail
298
+ ? undefined
299
+ : bs58.encode(web3Transaction.serialize());
300
+ const accountKeys = simMayFail
301
+ ? tx
302
+ .getInstructions()
303
+ .flatMap((x) => x.keys.flatMap((x) => x.pubkey.toString()))
304
+ : undefined;
297
305
 
298
306
  let feeEstimate: number | undefined;
299
307
  try {
300
308
  const resp = await umi.rpc.call("getPriorityFeeEstimate", [
301
309
  {
302
- transaction: serializedTransaction,
310
+ transaction,
311
+ accountKeys,
303
312
  options: {
304
313
  priorityLevel: prioritySetting.toString(),
305
314
  },
@@ -374,7 +383,7 @@ export async function sendSingleOptimizedTransaction(
374
383
 
375
384
  let cuPrice: number | undefined;
376
385
  if (prioritySetting !== PriorityFeeSetting.None) {
377
- cuPrice = await getComputeUnitPriceEstimate(umi, tx, prioritySetting);
386
+ cuPrice = await getComputeUnitPriceEstimate(umi, tx, prioritySetting, false);
378
387
  if (!cuPrice) {
379
388
  cuPrice = 1000000;
380
389
  }
@@ -41,6 +41,7 @@ import {
41
41
  } from "../marginfiUtils";
42
42
  import { RebalanceAction, SolautoPositionDetails } from "../../types/solauto";
43
43
  import { fetchTokenPrices } from "../priceUtils";
44
+ import { getRebalanceValues } from "./rebalanceUtils";
44
45
 
45
46
  export function createDynamicSolautoProgram(programId: PublicKey): Program {
46
47
  return {
@@ -132,6 +133,8 @@ export function eligibleForRebalance(
132
133
  positionSettings: SolautoSettingsParameters | undefined,
133
134
  positionDca: DCASettings | undefined,
134
135
  currentUnixTime: number,
136
+ supplyMintPrice: number,
137
+ debtMintPrice: number,
135
138
  bpsDistanceThreshold = 0
136
139
  ): RebalanceAction | undefined {
137
140
  if (!positionSettings) {
@@ -167,7 +170,26 @@ export function eligibleForRebalance(
167
170
  Math.max(0, positionState.liqUtilizationRateBps - boostFrom) <=
168
171
  bpsDistanceThreshold
169
172
  ) {
170
- return "boost";
173
+ const values = getRebalanceValues(
174
+ positionState!,
175
+ positionSettings,
176
+ positionDca,
177
+ currentUnixSeconds(),
178
+ supplyMintPrice,
179
+ debtMintPrice
180
+ );
181
+ const sufficientLiquidity =
182
+ fromBaseUnit(
183
+ positionState.debt.amountCanBeUsed.baseAmountUsdValue,
184
+ USD_DECIMALS
185
+ ) *
186
+ 0.95 >
187
+ values.debtAdjustmentUsd;
188
+ if (!sufficientLiquidity) {
189
+ console.log("Insufficient debt liquidity to further boost");
190
+ }
191
+
192
+ return sufficientLiquidity ? "boost" : undefined;
171
193
  } else if (
172
194
  Math.max(0, repayFrom - positionState.liqUtilizationRateBps) <=
173
195
  bpsDistanceThreshold
@@ -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
  );