@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.
- package/dist/clients/solautoClient.d.ts +6 -0
- package/dist/clients/solautoClient.d.ts.map +1 -1
- package/dist/clients/solautoClient.js +23 -0
- package/dist/transactions/transactionUtils.js +1 -1
- package/dist/utils/solauto/rebalanceUtils.d.ts +1 -1
- package/dist/utils/solauto/rebalanceUtils.d.ts.map +1 -1
- package/dist/utils/solauto/rebalanceUtils.js +23 -17
- package/package.json +1 -1
- package/src/clients/solautoClient.ts +46 -0
- package/src/transactions/transactionUtils.ts +1 -1
- package/src/utils/solauto/rebalanceUtils.ts +56 -24
- package/tests/transactions/solautoMarginfi.ts +3 -3
@@ -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":"AAAA,OAAO,gCAAgC,CAAC;AACxC,OAAO,EAA6B,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAEL,kBAAkB,EAMnB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,wBAAwB,EACxB,yBAAyB,EACzB,gCAAgC,EAEhC,sBAAsB,EAKvB,MAAM,cAAc,CAAC;AAUtB,OAAO,EACL,gBAAgB,EAChB,eAAe,EAChB,MAAM,iCAAiC,CAAC;AAMzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,WAAW,iBAAkB,SAAQ,wBAAwB;IACjE,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,8BAAsB,aAAc,SAAQ,oBAAoB;IACvD,eAAe,CAAC,EAAE,eAAe,CAAC;IAElC,SAAS,EAAG,SAAS,CAAC;IAEtB,UAAU,EAAG,MAAM,CAAC;IACpB,WAAW,EAAG,OAAO,CAAC;IACtB,eAAe,EAAG,SAAS,CAAC;IAC5B,mBAAmB,EAAG,eAAe,GAAG,IAAI,CAAC;IAC7C,oBAAoB,EAAG,aAAa,GAAG,SAAS,CAAC;IAEjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,UAAU,EAAG,SAAS,CAAC;IACvB,gBAAgB,EAAG,SAAS,CAAC;IAC7B,cAAc,EAAG,SAAS,CAAC;IAE3B,QAAQ,EAAG,SAAS,CAAC;IACrB,cAAc,EAAG,SAAS,CAAC;IAC3B,YAAY,EAAG,SAAS,CAAC;IAEzB,mBAAmB,EAAG,SAAS,CAAC;IAChC,iBAAiB,EAAG,SAAS,CAAC;IAE9B,mBAAmB,CAAC,EAAE,SAAS,CAAC;IAEhC,mBAAmB,EAAE,mBAAmB,CAA6B;
|
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;
|
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
|
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
|
145
|
-
|
146
|
-
|
147
|
-
const insufficientDebtLiquidity =
|
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
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
(
|
158
|
-
|
159
|
-
|
160
|
-
|
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 =
|
216
|
+
const exactOut = flashLoanRepayFromDebt && !rebalanceToZero;
|
211
217
|
// || rebalanceToZero
|
212
218
|
const exactIn = !exactOut;
|
213
219
|
const jupSwapInput = {
|
package/package.json
CHANGED
@@ -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 {
|
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
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
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
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
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 =
|
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 =
|
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("
|
69
|
+
authority: new PublicKey("7yk7HcAJfwNao3NSbYiPNtJvCPTxsgkzuJmyMLyP297E"),
|
70
70
|
// new: true,
|
71
71
|
// marginfiAccount: new PublicKey(
|
72
72
|
// ""
|