@haven-fi/solauto-sdk 1.0.438 → 1.0.439

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.
@@ -375,7 +375,7 @@ async function buildSolautoRebalanceTransaction(client, targetLiqUtilizationRate
375
375
  client.log("Rebalance values: ", values);
376
376
  const swapDetails = (0, rebalanceUtils_1.getJupSwapRebalanceDetails)(client, values, targetLiqUtilizationRateBps, attemptNum);
377
377
  const { jupQuote, lookupTableAddresses, setupInstructions, tokenLedgerIx, swapIx, } = await (0, jupiterUtils_1.getJupSwapTransaction)(client.signer, swapDetails, attemptNum);
378
- const flashLoan = (0, rebalanceUtils_1.getFlashLoanDetails)(client, values, jupQuote);
378
+ const flashLoan = (0, rebalanceUtils_1.getFlashLoanDetails)(client, values, swapDetails, jupQuote);
379
379
  let tx = (0, umi_1.transactionBuilder)();
380
380
  if (await requiresRefreshBeforeRebalance(client)) {
381
381
  tx = tx.add(client.refresh());
@@ -15,11 +15,15 @@ export interface RebalanceValues {
15
15
  feesUsd: number;
16
16
  }
17
17
  export declare function getRebalanceValues(state: PositionState, settings: SolautoSettingsParameters | undefined, dca: DCASettings | undefined, currentUnixTime: number, supplyPrice: number, debtPrice: number, targetLiqUtilizationRateBps?: number): RebalanceValues;
18
+ export declare function rebalanceRequiresFlashLoan(client: SolautoClient, values: RebalanceValues): {
19
+ requiresFlashLoan: boolean;
20
+ useDebtLiquidity: boolean;
21
+ };
18
22
  export interface FlashLoanDetails {
19
23
  baseUnitAmount: bigint;
20
24
  mint: PublicKey;
21
25
  useDebtLiquidity: boolean;
22
26
  }
23
- export declare function getFlashLoanDetails(client: SolautoClient, values: RebalanceValues, jupQuote: QuoteResponse): FlashLoanDetails | undefined;
27
+ export declare function getFlashLoanDetails(client: SolautoClient, values: RebalanceValues, swapDetails: JupSwapDetails, jupQuote: QuoteResponse): FlashLoanDetails | undefined;
24
28
  export declare function getJupSwapRebalanceDetails(client: SolautoClient, values: RebalanceValues, targetLiqUtilizationRateBps?: number, attemptNum?: number): JupSwapDetails;
25
29
  //# sourceMappingURL=rebalanceUtils.d.ts.map
@@ -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;AAoI9C,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;IAChB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,eAAe,EACvB,QAAQ,EAAE,aAAa,GACtB,gBAAgB,GAAG,SAAS,CAqF9B;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,eAAe,EACvB,2BAA2B,CAAC,EAAE,MAAM,EACpC,UAAU,CAAC,EAAE,MAAM,GAClB,cAAc,CA6ChB"}
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;AAoI9C,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,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,eAAe;;;EAsDxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,SAAS,CAAC;IAChB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,eAAe,EACvB,WAAW,EAAE,cAAc,EAC3B,QAAQ,EAAE,aAAa,GACtB,gBAAgB,GAAG,SAAS,CAmC9B;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,eAAe,EACvB,2BAA2B,CAAC,EAAE,MAAM,EACpC,UAAU,CAAC,EAAE,MAAM,GAClB,cAAc,CAwDhB"}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getRebalanceValues = getRebalanceValues;
4
+ exports.rebalanceRequiresFlashLoan = rebalanceRequiresFlashLoan;
4
5
  exports.getFlashLoanDetails = getFlashLoanDetails;
5
6
  exports.getJupSwapRebalanceDetails = getJupSwapRebalanceDetails;
6
7
  const generated_1 = require("../../generated");
@@ -108,7 +109,7 @@ function getRebalanceValues(state, settings, dca, currentUnixTime, supplyPrice,
108
109
  feesUsd: Math.abs(debtAdjustmentUsd * (0, numberUtils_1.fromBps)(adjustmentFeeBps)),
109
110
  };
110
111
  }
111
- function getFlashLoanDetails(client, values, jupQuote) {
112
+ function rebalanceRequiresFlashLoan(client, values) {
112
113
  let supplyUsd = (0, numberUtils_1.fromBaseUnit)(client.solautoPositionState.supply.amountUsed.baseAmountUsdValue, generalAccounts_1.USD_DECIMALS) +
113
114
  (values.dcaTokenType === generated_1.TokenType.Supply ? values.amountUsdToDcaIn : 0);
114
115
  let debtUsd = (0, numberUtils_1.fromBaseUnit)(client.solautoPositionState.debt.amountUsed.baseAmountUsdValue, generalAccounts_1.USD_DECIMALS);
@@ -126,15 +127,19 @@ function getFlashLoanDetails(client, values, jupQuote) {
126
127
  const requiresFlashLoan = supplyUsd <= 0 || tempLiqUtilizationRateBps > maxLiqUtilizationRateBps;
127
128
  (0, generalUtils_2.consoleLog)("Requires flash loan:", requiresFlashLoan);
128
129
  (0, generalUtils_2.consoleLog)("Intermediary liq utilization rate:", tempLiqUtilizationRateBps, `$${supplyUsd}`, `$${debtUsd}`, "Max:", maxLiqUtilizationRateBps);
130
+ const useDebtLiquidity = Math.abs(values.debtAdjustmentUsd) * 1.1 <=
131
+ (0, numberUtils_1.fromBaseUnit)(client.solautoPositionState?.debt.amountCanBeUsed.baseAmountUsdValue ??
132
+ BigInt(0), generalAccounts_1.USD_DECIMALS);
133
+ return { requiresFlashLoan, useDebtLiquidity };
134
+ }
135
+ function getFlashLoanDetails(client, values, swapDetails, jupQuote) {
136
+ const { requiresFlashLoan, useDebtLiquidity } = rebalanceRequiresFlashLoan(client, values);
129
137
  let flashLoanToken = undefined;
130
138
  let flashLoanTokenPrice = 0;
131
139
  const inAmount = BigInt(parseInt(jupQuote.inAmount));
132
140
  const outAmount = BigInt(parseInt(jupQuote.outAmount));
133
- const sufficientDebtLiquidity = debtAdjustmentUsdAbs * 1.1 <=
134
- (0, numberUtils_1.fromBaseUnit)(client.solautoPositionState?.debt.amountCanBeUsed.baseAmountUsdValue ??
135
- BigInt(0), generalAccounts_1.USD_DECIMALS);
136
141
  const boosting = values.rebalanceDirection === generated_1.RebalanceDirection.Boost;
137
- if (boosting || sufficientDebtLiquidity) {
142
+ if (boosting || useDebtLiquidity) {
138
143
  flashLoanToken = client.solautoPositionState.debt;
139
144
  flashLoanTokenPrice = (0, priceUtils_1.safeGetPrice)(client.debtMint);
140
145
  }
@@ -145,7 +150,6 @@ function getFlashLoanDetails(client, values, jupQuote) {
145
150
  if (jupQuote.swapMode !== "ExactOut" && jupQuote.swapMode !== "ExactIn") {
146
151
  throw new Error("Token ledger swap not currently supported");
147
152
  }
148
- const useDebtLiquidity = (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(flashLoanToken.mint).equals(client.debtMint);
149
153
  const baseUnitAmount = boosting || (!boosting && !useDebtLiquidity) ? inAmount : outAmount;
150
154
  return requiresFlashLoan
151
155
  ? {
@@ -171,13 +175,20 @@ function getJupSwapRebalanceDetails(client, values, targetLiqUtilizationRateBps,
171
175
  // Add this small percentage to account for the APR on the debt between now and the transaction
172
176
  0.0001))
173
177
  : (0, numberUtils_1.toBaseUnit)(usdToSwap / (0, priceUtils_1.safeGetPrice)(output.mint), output.decimals);
174
- const exactOut = values.rebalanceDirection === generated_1.RebalanceDirection.Repay;
178
+ const repaying = values.rebalanceDirection === generated_1.RebalanceDirection.Repay;
179
+ const { requiresFlashLoan, useDebtLiquidity } = rebalanceRequiresFlashLoan(client, values);
180
+ const flashLoanRepayFromDebt = repaying && requiresFlashLoan && useDebtLiquidity;
181
+ const exactOut = targetLiqUtilizationRateBps === 0 ||
182
+ values.repayingCloseToMaxLtv ||
183
+ flashLoanRepayFromDebt;
175
184
  const exactIn = !exactOut;
176
185
  const addPadding = targetLiqUtilizationRateBps === 0;
177
186
  return {
178
187
  inputMint: (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(input.mint),
179
188
  outputMint: (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(output.mint),
180
- destinationWallet: client.solautoPosition,
189
+ destinationWallet: flashLoanRepayFromDebt
190
+ ? (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(client.signer.publicKey)
191
+ : client.solautoPosition,
181
192
  slippageIncFactor: 0.5 + (attemptNum ?? 0) * 0.25,
182
193
  amount: exactOut ? outputAmount : inputAmount,
183
194
  exactIn: exactIn,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haven-fi/solauto-sdk",
3
- "version": "1.0.438",
3
+ "version": "1.0.439",
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",
@@ -703,7 +703,7 @@ export async function buildSolautoRebalanceTransaction(
703
703
  tokenLedgerIx,
704
704
  swapIx,
705
705
  } = await getJupSwapTransaction(client.signer, swapDetails, attemptNum);
706
- const flashLoan = getFlashLoanDetails(client, values, jupQuote);
706
+ const flashLoan = getFlashLoanDetails(client, values, swapDetails, jupQuote);
707
707
 
708
708
  let tx = transactionBuilder();
709
709
 
@@ -237,17 +237,10 @@ export function getRebalanceValues(
237
237
  };
238
238
  }
239
239
 
240
- export interface FlashLoanDetails {
241
- baseUnitAmount: bigint;
242
- mint: PublicKey;
243
- useDebtLiquidity: boolean;
244
- }
245
-
246
- export function getFlashLoanDetails(
240
+ export function rebalanceRequiresFlashLoan(
247
241
  client: SolautoClient,
248
- values: RebalanceValues,
249
- jupQuote: QuoteResponse
250
- ): FlashLoanDetails | undefined {
242
+ values: RebalanceValues
243
+ ) {
251
244
  let supplyUsd =
252
245
  fromBaseUnit(
253
246
  client.solautoPositionState!.supply.amountUsed.baseAmountUsdValue,
@@ -292,22 +285,41 @@ export function getFlashLoanDetails(
292
285
  maxLiqUtilizationRateBps
293
286
  );
294
287
 
295
- let flashLoanToken: PositionTokenUsage | undefined = undefined;
296
- let flashLoanTokenPrice = 0;
297
-
298
- const inAmount = BigInt(parseInt(jupQuote.inAmount));
299
- const outAmount = BigInt(parseInt(jupQuote.outAmount));
300
-
301
- const sufficientDebtLiquidity =
302
- debtAdjustmentUsdAbs * 1.1 <=
288
+ const useDebtLiquidity =
289
+ Math.abs(values.debtAdjustmentUsd) * 1.1 <=
303
290
  fromBaseUnit(
304
291
  client.solautoPositionState?.debt.amountCanBeUsed.baseAmountUsdValue ??
305
292
  BigInt(0),
306
293
  USD_DECIMALS
307
294
  );
295
+ return { requiresFlashLoan, useDebtLiquidity };
296
+ }
297
+
298
+ export interface FlashLoanDetails {
299
+ baseUnitAmount: bigint;
300
+ mint: PublicKey;
301
+ useDebtLiquidity: boolean;
302
+ }
303
+
304
+ export function getFlashLoanDetails(
305
+ client: SolautoClient,
306
+ values: RebalanceValues,
307
+ swapDetails: JupSwapDetails,
308
+ jupQuote: QuoteResponse
309
+ ): FlashLoanDetails | undefined {
310
+ const { requiresFlashLoan, useDebtLiquidity } = rebalanceRequiresFlashLoan(
311
+ client,
312
+ values
313
+ );
314
+
315
+ let flashLoanToken: PositionTokenUsage | undefined = undefined;
316
+ let flashLoanTokenPrice = 0;
317
+
318
+ const inAmount = BigInt(parseInt(jupQuote.inAmount));
319
+ const outAmount = BigInt(parseInt(jupQuote.outAmount));
308
320
 
309
321
  const boosting = values.rebalanceDirection === RebalanceDirection.Boost;
310
- if (boosting || sufficientDebtLiquidity) {
322
+ if (boosting || useDebtLiquidity) {
311
323
  flashLoanToken = client.solautoPositionState!.debt;
312
324
  flashLoanTokenPrice = safeGetPrice(client.debtMint)!;
313
325
  } else {
@@ -319,9 +331,6 @@ export function getFlashLoanDetails(
319
331
  throw new Error("Token ledger swap not currently supported");
320
332
  }
321
333
 
322
- const useDebtLiquidity = toWeb3JsPublicKey(flashLoanToken.mint).equals(
323
- client.debtMint
324
- );
325
334
  const baseUnitAmount =
326
335
  boosting || (!boosting && !useDebtLiquidity) ? inAmount : outAmount;
327
336
 
@@ -369,7 +378,16 @@ export function getJupSwapRebalanceDetails(
369
378
  )
370
379
  : toBaseUnit(usdToSwap / safeGetPrice(output.mint)!, output.decimals);
371
380
 
372
- const exactOut = values.rebalanceDirection === RebalanceDirection.Repay;
381
+ const repaying = values.rebalanceDirection === RebalanceDirection.Repay;
382
+
383
+ const { requiresFlashLoan, useDebtLiquidity } = rebalanceRequiresFlashLoan(client, values);
384
+ const flashLoanRepayFromDebt =
385
+ repaying && requiresFlashLoan && useDebtLiquidity;
386
+
387
+ const exactOut =
388
+ targetLiqUtilizationRateBps === 0 ||
389
+ values.repayingCloseToMaxLtv ||
390
+ flashLoanRepayFromDebt;
373
391
  const exactIn = !exactOut;
374
392
 
375
393
  const addPadding = targetLiqUtilizationRateBps === 0;
@@ -377,7 +395,9 @@ export function getJupSwapRebalanceDetails(
377
395
  return {
378
396
  inputMint: toWeb3JsPublicKey(input.mint),
379
397
  outputMint: toWeb3JsPublicKey(output.mint),
380
- destinationWallet: client.solautoPosition,
398
+ destinationWallet: flashLoanRepayFromDebt
399
+ ? toWeb3JsPublicKey(client.signer.publicKey)
400
+ : client.solautoPosition,
381
401
  slippageIncFactor: 0.5 + (attemptNum ?? 0) * 0.25,
382
402
  amount: exactOut ? outputAmount : inputAmount,
383
403
  exactIn: exactIn,