@haven-fi/solauto-sdk 1.0.525 → 1.0.527

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.
@@ -32,6 +32,8 @@ export declare abstract class SolautoClient extends ReferralStateManager {
32
32
  solautoFeesDebtTa: PublicKey;
33
33
  authorityLutAddress?: PublicKey;
34
34
  livePositionUpdates: LivePositionUpdates;
35
+ private signerSupplyBalance;
36
+ private signerDebtBalance;
35
37
  initialize(args: SolautoClientArgs): Promise<void>;
36
38
  referredBySupplyTa(): PublicKey | undefined;
37
39
  referredByDebtTa(): PublicKey | undefined;
@@ -45,6 +47,10 @@ export declare abstract class SolautoClient extends ReferralStateManager {
45
47
  new: boolean;
46
48
  accountsToAdd: PublicKey[];
47
49
  } | undefined>;
50
+ signerBalances(): Promise<{
51
+ supplyBalance: bigint;
52
+ debtBalance: bigint;
53
+ }>;
48
54
  solautoPositionSettings(): SolautoSettingsParameters | undefined;
49
55
  solautoPositionActiveDca(): DCASettings | undefined;
50
56
  maxLtvAndLiqThresholdBps(): Promise<[number, number] | undefined>;
@@ -1 +1 @@
1
- {"version":3,"file":"solautoClient.d.ts","sourceRoot":"","sources":["../../src/clients/solautoClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"solautoClient.d.ts","sourceRoot":"","sources":["../../src/clients/solautoClient.ts"],"names":[],"mappings":"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"}
@@ -161,6 +161,29 @@ class SolautoClient extends referralStateManager_1.ReferralStateManager {
161
161
  accountsToAdd,
162
162
  };
163
163
  }
164
+ async signerBalances() {
165
+ if (this.signerSupplyBalance !== undefined &&
166
+ this.signerDebtBalance !== undefined) {
167
+ return {
168
+ supplyBalance: this.signerSupplyBalance,
169
+ debtBalance: this.signerDebtBalance,
170
+ };
171
+ }
172
+ [this.signerSupplyBalance, this.signerDebtBalance] = await Promise.all([
173
+ (async () => {
174
+ const data = await this.connection.getTokenAccountBalance((0, accountUtils_1.getTokenAccount)((0, umi_web3js_adapters_1.toWeb3JsPublicKey)(this.signer.publicKey), this.supplyMint), "confirmed");
175
+ return BigInt(parseInt(data?.value.amount ?? "0"));
176
+ })(),
177
+ (async () => {
178
+ const data = await this.connection.getTokenAccountBalance((0, accountUtils_1.getTokenAccount)((0, umi_web3js_adapters_1.toWeb3JsPublicKey)(this.signer.publicKey), this.debtMint), "confirmed");
179
+ return BigInt(parseInt(data?.value.amount ?? "0"));
180
+ })(),
181
+ ]);
182
+ return {
183
+ supplyBalance: this.signerSupplyBalance,
184
+ debtBalance: this.signerDebtBalance,
185
+ };
186
+ }
164
187
  solautoPositionSettings() {
165
188
  return (this.livePositionUpdates.settings ??
166
189
  this.solautoPositionData?.position.settingParams);
@@ -373,7 +373,7 @@ async function buildSolautoRebalanceTransaction(client, targetLiqUtilizationRate
373
373
  }
374
374
  const values = (0, rebalanceUtils_1.getRebalanceValues)(client.solautoPositionState, client.solautoPositionSettings(), client.solautoPositionActiveDca(), (0, generalUtils_1.currentUnixSeconds)(), supplyPrice, debtPrice, targetLiqUtilizationRateBps);
375
375
  client.log("Rebalance values: ", values);
376
- const flRequirements = (0, rebalanceUtils_1.getFlashLoanRequirements)(client, values, attemptNum);
376
+ const flRequirements = await (0, rebalanceUtils_1.getFlashLoanRequirements)(client, values, attemptNum);
377
377
  const swapDetails = await (0, rebalanceUtils_1.getJupSwapRebalanceDetails)(client, values, flRequirements, targetLiqUtilizationRateBps, attemptNum);
378
378
  const { jupQuote, lookupTableAddresses, setupInstructions, tokenLedgerIx, swapIx, } = await (0, jupiterUtils_1.getJupSwapTransaction)(client.signer, swapDetails, attemptNum);
379
379
  const flashLoan = flRequirements
@@ -20,7 +20,7 @@ export interface FlashLoanRequirements {
20
20
  useDebtLiquidity: boolean;
21
21
  signerFlashLoan: boolean;
22
22
  }
23
- export declare function getFlashLoanRequirements(client: SolautoClient, values: RebalanceValues, attemptNum?: number): FlashLoanRequirements | undefined;
23
+ export declare function getFlashLoanRequirements(client: SolautoClient, values: RebalanceValues, attemptNum?: number): Promise<FlashLoanRequirements | undefined>;
24
24
  export interface FlashLoanDetails extends FlashLoanRequirements {
25
25
  baseUnitAmount: bigint;
26
26
  mint: PublicKey;
@@ -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,EAAgB,MAAM,iBAAiB,CAAC;AAc5E,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;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;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,CA4EjB;AAED,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,eAAe,EACvB,UAAU,CAAC,EAAE,MAAM,GAClB,qBAAqB,GAAG,SAAS,CA4EnC;AAED,MAAM,WAAW,gBAAiB,SAAQ,qBAAqB;IAC7D,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,cAAc,EAAE,qBAAqB,EACrC,MAAM,EAAE,eAAe,EACvB,QAAQ,EAAE,aAAa,GACtB,gBAAgB,GAAG,SAAS,CA2B9B;AAED,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,eAAe,EACvB,cAAc,CAAC,EAAE,qBAAqB,EACtC,2BAA2B,CAAC,EAAE,MAAM,EACpC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,cAAc,CAAC,CAqEzB"}
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,EAAgB,MAAM,iBAAiB,CAAC;AAc5E,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAqI9C,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;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;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,CA4EjB;AAWD,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,eAAe,EACvB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAkG5C;AAED,MAAM,WAAW,gBAAiB,SAAQ,qBAAqB;IAC7D,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,cAAc,EAAE,qBAAqB,EACrC,MAAM,EAAE,eAAe,EACvB,QAAQ,EAAE,aAAa,GACtB,gBAAgB,GAAG,SAAS,CA2B9B;AAED,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,eAAe,EACvB,cAAc,CAAC,EAAE,qBAAqB,EACtC,2BAA2B,CAAC,EAAE,MAAM,EACpC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,cAAc,CAAC,CAqEzB"}
@@ -125,7 +125,10 @@ function getRebalanceValues(state, settings, dca, currentUnixTime, supplyPrice,
125
125
  targetRateBps,
126
126
  };
127
127
  }
128
- function getFlashLoanRequirements(client, values, attemptNum) {
128
+ function insufficientLiquidity(amountNeeded, liquidity, tokenDecimals, tokenPrice) {
129
+ return amountNeeded > (0, numberUtils_1.fromBaseUnit)(liquidity, tokenDecimals) * tokenPrice;
130
+ }
131
+ async function getFlashLoanRequirements(client, values, attemptNum) {
129
132
  let supplyUsd = (0, numberUtils_1.fromBaseUnit)(client.solautoPositionState.supply.amountUsed.baseAmountUsdValue, generalAccounts_1.USD_DECIMALS) +
130
133
  (values.dcaTokenType === generated_1.TokenType.Supply ? values.amountUsdToDcaIn : 0);
131
134
  let debtUsd = (0, numberUtils_1.fromBaseUnit)(client.solautoPositionState.debt.amountUsed.baseAmountUsdValue, generalAccounts_1.USD_DECIMALS);
@@ -141,23 +144,26 @@ function getFlashLoanRequirements(client, values, attemptNum) {
141
144
  const tempLiqUtilizationRateBps = (0, numberUtils_1.getLiqUtilzationRateBps)(supplyUsd, debtUsd, client.solautoPositionState.liqThresholdBps);
142
145
  const maxLiqUtilizationRateBps = (0, numberUtils_1.getMaxLiqUtilizationRateBps)(client.solautoPositionState.maxLtvBps, client.solautoPositionState.liqThresholdBps, 0.02);
143
146
  const requiresFlashLoan = supplyUsd <= 0 || tempLiqUtilizationRateBps > maxLiqUtilizationRateBps;
144
- const insufficientSupplyLiquidity = Math.abs(values.debtAdjustmentUsd) * 0.9 >
145
- (0, numberUtils_1.fromBaseUnit)(client.supplyLiquidityAvailable(), generalAccounts_1.USD_DECIMALS) *
146
- ((0, priceUtils_1.safeGetPrice)(client.supplyMint) ?? 0);
147
- const insufficientDebtLiquidity = Math.abs(values.debtAdjustmentUsd) * 0.9 >
148
- (0, numberUtils_1.fromBaseUnit)(client.debtLiquidityAvailable(), generalAccounts_1.USD_DECIMALS) *
149
- ((0, priceUtils_1.safeGetPrice)(client.debtMint) ?? 0);
147
+ const supplyPrice = (0, priceUtils_1.safeGetPrice)(client.supplyMint) ?? 0;
148
+ const debtPrice = (0, priceUtils_1.safeGetPrice)(client.debtMint) ?? 0;
149
+ const insufficientSupplyLiquidity = insufficientLiquidity(values.debtAdjustmentUsd, client.supplyLiquidityAvailable(), (0, generalUtils_2.tokenInfo)(client.supplyMint).decimals, supplyPrice);
150
+ const insufficientDebtLiquidity = insufficientLiquidity(values.debtAdjustmentUsd, client.debtLiquidityAvailable(), (0, generalUtils_2.tokenInfo)(client.debtMint).decimals, debtPrice);
150
151
  let useDebtLiquidity = values.rebalanceDirection === generated_1.RebalanceDirection.Boost ||
151
152
  insufficientSupplyLiquidity;
152
- const isJupLong = client.supplyMint.equals(new web3_js_1.PublicKey(constants_1.JUP)) &&
153
- (0, generalUtils_2.tokenInfo)(client.debtMint).isStableCoin;
154
- const sufficientSignerSupplyLiquidity = false; // TODO
155
- const sufficientSignerDebtLiquidity = isJupLong; // TODO
156
- const signerFlashLoan = Boolean(((attemptNum ?? 0) > 3 ||
157
- (insufficientSupplyLiquidity && insufficientDebtLiquidity)) &&
158
- (sufficientSignerSupplyLiquidity || sufficientSignerDebtLiquidity));
159
- if (signerFlashLoan) {
160
- useDebtLiquidity = !sufficientSignerSupplyLiquidity;
153
+ let signerFlashLoan = false;
154
+ if ((attemptNum ?? 0) > 3 ||
155
+ (insufficientSupplyLiquidity && insufficientDebtLiquidity)) {
156
+ const { supplyBalance, debtBalance } = await client.signerBalances();
157
+ const sufficientSignerSupplyLiquidity = !insufficientLiquidity(values.debtAdjustmentUsd, supplyBalance, (0, generalUtils_2.tokenInfo)(client.supplyMint).decimals, supplyPrice);
158
+ const sufficientSignerDebtLiquidity = !insufficientLiquidity(values.debtAdjustmentUsd, debtBalance, (0, generalUtils_2.tokenInfo)(client.debtMint).decimals, debtPrice);
159
+ signerFlashLoan =
160
+ sufficientSignerSupplyLiquidity || sufficientSignerDebtLiquidity;
161
+ if (signerFlashLoan) {
162
+ useDebtLiquidity = !sufficientSignerSupplyLiquidity;
163
+ }
164
+ else {
165
+ throw new Error(`Need at least ${values.debtAdjustmentUsd / debtPrice} ${(0, generalUtils_2.tokenInfo)(client.debtMint).ticker} or ${values.debtAdjustmentUsd / supplyPrice} ${(0, generalUtils_2.tokenInfo)(client.supplyMint).ticker} to perform the transaction`);
166
+ }
161
167
  }
162
168
  // TODO: if not sufficient signer liquidity, throw error with details on how much liquidity is needed and of what token
163
169
  (0, generalUtils_2.consoleLog)("Requires flash loan:", requiresFlashLoan);
@@ -207,7 +213,7 @@ async function getJupSwapRebalanceDetails(client, values, flRequirements, target
207
213
  : (0, numberUtils_1.toBaseUnit)(usdToSwap / (0, priceUtils_1.safeGetPrice)(output.mint), output.decimals);
208
214
  const repaying = values.rebalanceDirection === generated_1.RebalanceDirection.Repay;
209
215
  const flashLoanRepayFromDebt = repaying && flRequirements && flRequirements.useDebtLiquidity;
210
- const exactOut = false;
216
+ const exactOut = flashLoanRepayFromDebt && !rebalanceToZero;
211
217
  // || rebalanceToZero
212
218
  const exactIn = !exactOut;
213
219
  const jupSwapInput = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haven-fi/solauto-sdk",
3
- "version": "1.0.525",
3
+ "version": "1.0.527",
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",
@@ -89,6 +89,9 @@ export abstract class SolautoClient extends ReferralStateManager {
89
89
 
90
90
  public livePositionUpdates: LivePositionUpdates = new LivePositionUpdates();
91
91
 
92
+ private signerSupplyBalance: bigint | undefined;
93
+ private signerDebtBalance: bigint | undefined;
94
+
92
95
  async initialize(args: SolautoClientArgs) {
93
96
  await super.initialize(args);
94
97
 
@@ -309,6 +312,49 @@ export abstract class SolautoClient extends ReferralStateManager {
309
312
  };
310
313
  }
311
314
 
315
+ async signerBalances(): Promise<{
316
+ supplyBalance: bigint;
317
+ debtBalance: bigint;
318
+ }> {
319
+ if (
320
+ this.signerSupplyBalance !== undefined &&
321
+ this.signerDebtBalance !== undefined
322
+ ) {
323
+ return {
324
+ supplyBalance: this.signerSupplyBalance,
325
+ debtBalance: this.signerDebtBalance,
326
+ };
327
+ }
328
+
329
+ [this.signerSupplyBalance, this.signerDebtBalance] = await Promise.all([
330
+ (async () => {
331
+ const data = await this.connection.getTokenAccountBalance(
332
+ getTokenAccount(
333
+ toWeb3JsPublicKey(this.signer.publicKey),
334
+ this.supplyMint
335
+ ),
336
+ "confirmed"
337
+ );
338
+ return BigInt(parseInt(data?.value.amount ?? "0"));
339
+ })(),
340
+ (async () => {
341
+ const data = await this.connection.getTokenAccountBalance(
342
+ getTokenAccount(
343
+ toWeb3JsPublicKey(this.signer.publicKey),
344
+ this.debtMint
345
+ ),
346
+ "confirmed"
347
+ );
348
+ return BigInt(parseInt(data?.value.amount ?? "0"));
349
+ })(),
350
+ ]);
351
+
352
+ return {
353
+ supplyBalance: this.signerSupplyBalance,
354
+ debtBalance: this.signerDebtBalance,
355
+ };
356
+ }
357
+
312
358
  solautoPositionSettings(): SolautoSettingsParameters | undefined {
313
359
  return (
314
360
  this.livePositionUpdates.settings ??
@@ -696,7 +696,7 @@ export async function buildSolautoRebalanceTransaction(
696
696
  );
697
697
  client.log("Rebalance values: ", values);
698
698
 
699
- const flRequirements = getFlashLoanRequirements(client, values, attemptNum);
699
+ const flRequirements = await getFlashLoanRequirements(client, values, attemptNum);
700
700
  const swapDetails = await getJupSwapRebalanceDetails(
701
701
  client,
702
702
  values,
@@ -30,8 +30,9 @@ import {
30
30
  } from "../numberUtils";
31
31
  import { USD_DECIMALS } from "../../constants/generalAccounts";
32
32
  import { RebalanceAction } from "../../types";
33
- import { getPriceImpact, safeGetPrice } from "../priceUtils";
33
+ import { safeGetPrice } from "../priceUtils";
34
34
  import { BROKEN_TOKENS, JUP, USDC, USDT } from "../../constants";
35
+ import { Umi } from "@metaplex-foundation/umi";
35
36
 
36
37
  function getAdditionalAmountToDcaIn(dca: DCASettings): number {
37
38
  if (dca.dcaInBaseUnit === BigInt(0)) {
@@ -259,16 +260,25 @@ export function getRebalanceValues(
259
260
  };
260
261
  }
261
262
 
263
+ function insufficientLiquidity(
264
+ amountNeeded: number,
265
+ liquidity: bigint,
266
+ tokenDecimals: number,
267
+ tokenPrice: number
268
+ ) {
269
+ return amountNeeded > fromBaseUnit(liquidity, tokenDecimals) * tokenPrice;
270
+ }
271
+
262
272
  export interface FlashLoanRequirements {
263
273
  useDebtLiquidity: boolean;
264
274
  signerFlashLoan: boolean;
265
275
  }
266
276
 
267
- export function getFlashLoanRequirements(
277
+ export async function getFlashLoanRequirements(
268
278
  client: SolautoClient,
269
279
  values: RebalanceValues,
270
280
  attemptNum?: number
271
- ): FlashLoanRequirements | undefined {
281
+ ): Promise<FlashLoanRequirements | undefined> {
272
282
  let supplyUsd =
273
283
  fromBaseUnit(
274
284
  client.solautoPositionState!.supply.amountUsed.baseAmountUsdValue,
@@ -303,31 +313,53 @@ export function getFlashLoanRequirements(
303
313
  const requiresFlashLoan =
304
314
  supplyUsd <= 0 || tempLiqUtilizationRateBps > maxLiqUtilizationRateBps;
305
315
 
306
- const insufficientSupplyLiquidity =
307
- Math.abs(values.debtAdjustmentUsd) * 0.9 >
308
- fromBaseUnit(client.supplyLiquidityAvailable(), USD_DECIMALS) *
309
- (safeGetPrice(client.supplyMint) ?? 0);
310
- const insufficientDebtLiquidity =
311
- Math.abs(values.debtAdjustmentUsd) * 0.9 >
312
- fromBaseUnit(client.debtLiquidityAvailable(), USD_DECIMALS) *
313
- (safeGetPrice(client.debtMint) ?? 0);
316
+ const supplyPrice = safeGetPrice(client.supplyMint) ?? 0;
317
+ const debtPrice = safeGetPrice(client.debtMint) ?? 0;
318
+ const insufficientSupplyLiquidity = insufficientLiquidity(
319
+ values.debtAdjustmentUsd,
320
+ client.supplyLiquidityAvailable(),
321
+ tokenInfo(client.supplyMint).decimals,
322
+ supplyPrice
323
+ );
324
+ const insufficientDebtLiquidity = insufficientLiquidity(
325
+ values.debtAdjustmentUsd,
326
+ client.debtLiquidityAvailable(),
327
+ tokenInfo(client.debtMint).decimals,
328
+ debtPrice
329
+ );
314
330
 
315
331
  let useDebtLiquidity =
316
332
  values.rebalanceDirection === RebalanceDirection.Boost ||
317
333
  insufficientSupplyLiquidity;
318
334
 
319
- const isJupLong =
320
- client.supplyMint.equals(new PublicKey(JUP)) &&
321
- tokenInfo(client.debtMint).isStableCoin;
322
- const sufficientSignerSupplyLiquidity = false; // TODO
323
- const sufficientSignerDebtLiquidity = isJupLong; // TODO
324
- const signerFlashLoan = Boolean(
325
- ((attemptNum ?? 0) > 3 ||
326
- (insufficientSupplyLiquidity && insufficientDebtLiquidity)) &&
327
- (sufficientSignerSupplyLiquidity || sufficientSignerDebtLiquidity)
328
- );
329
- if (signerFlashLoan) {
330
- useDebtLiquidity = !sufficientSignerSupplyLiquidity;
335
+ let signerFlashLoan = false;
336
+ if (
337
+ (attemptNum ?? 0) > 3 ||
338
+ (insufficientSupplyLiquidity && insufficientDebtLiquidity)
339
+ ) {
340
+ const { supplyBalance, debtBalance } = await client.signerBalances();
341
+ const sufficientSignerSupplyLiquidity = !insufficientLiquidity(
342
+ values.debtAdjustmentUsd,
343
+ supplyBalance,
344
+ tokenInfo(client.supplyMint).decimals,
345
+ supplyPrice
346
+ );
347
+ const sufficientSignerDebtLiquidity = !insufficientLiquidity(
348
+ values.debtAdjustmentUsd,
349
+ debtBalance,
350
+ tokenInfo(client.debtMint).decimals,
351
+ debtPrice
352
+ );
353
+
354
+ signerFlashLoan =
355
+ sufficientSignerSupplyLiquidity || sufficientSignerDebtLiquidity;
356
+ if (signerFlashLoan) {
357
+ useDebtLiquidity = !sufficientSignerSupplyLiquidity;
358
+ } else {
359
+ throw new Error(
360
+ `Need at least ${values.debtAdjustmentUsd / debtPrice} ${tokenInfo(client.debtMint).ticker} or ${values.debtAdjustmentUsd / supplyPrice} ${tokenInfo(client.supplyMint).ticker} to perform the transaction`
361
+ );
362
+ }
331
363
  }
332
364
 
333
365
  // TODO: if not sufficient signer liquidity, throw error with details on how much liquidity is needed and of what token
@@ -426,7 +458,7 @@ export async function getJupSwapRebalanceDetails(
426
458
  const flashLoanRepayFromDebt =
427
459
  repaying && flRequirements && flRequirements.useDebtLiquidity;
428
460
 
429
- const exactOut = false;
461
+ const exactOut = flashLoanRepayFromDebt && !rebalanceToZero;
430
462
  // || rebalanceToZero
431
463
  const exactIn = !exactOut;
432
464
 
@@ -41,7 +41,7 @@ import {
41
41
  retryWithExponentialBackoff,
42
42
  } from "../../src/utils";
43
43
  import { PriorityFeeSetting } from "../../src/types";
44
- import { buildIronforgeApiUrl } from "../../dist";
44
+ import { buildIronforgeApiUrl, fromBaseUnit, tokenInfo, USD_DECIMALS } from "../../dist";
45
45
  import { JUPITER_PROGRAM_ID } from "../../src/jupiter-sdk";
46
46
 
47
47
  describe("Solauto Marginfi tests", async () => {
@@ -50,7 +50,7 @@ describe("Solauto Marginfi tests", async () => {
50
50
 
51
51
  const payForTransactions = true;
52
52
  const testProgram = false;
53
- const positionId = 1;
53
+ const positionId = 2;
54
54
 
55
55
  it("open - deposit - borrow - rebalance to 0 - withdraw - close", async () => {
56
56
  const client = new SolautoMarginfiClient(
@@ -66,7 +66,7 @@ describe("Solauto Marginfi tests", async () => {
66
66
  await client.initialize({
67
67
  signer,
68
68
  positionId,
69
- authority: new PublicKey("7F6v4HWZsyFP6yVFq92HQWygUgoYm5khUX8pXWGLoqUN"),
69
+ authority: new PublicKey("7yk7HcAJfwNao3NSbYiPNtJvCPTxsgkzuJmyMLyP297E"),
70
70
  // new: true,
71
71
  // marginfiAccount: new PublicKey(
72
72
  // ""