@haven-fi/solauto-sdk 1.0.528 → 1.0.530
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/utils/jupiterUtils.d.ts.map +1 -1
- package/dist/utils/jupiterUtils.js +4 -6
- package/dist/utils/solauto/generalUtils.d.ts.map +1 -1
- package/dist/utils/solauto/rebalanceUtils.d.ts.map +1 -1
- package/dist/utils/solauto/rebalanceUtils.js +54 -8
- package/package.json +1 -1
- package/src/utils/jupiterUtils.ts +4 -6
- package/src/utils/solauto/generalUtils.ts +0 -2
- package/src/utils/solauto/rebalanceUtils.ts +97 -10
- package/tests/transactions/solautoMarginfi.ts +1 -5
@@ -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;AAUrB,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,SAAS,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,iBAAiB,EAAE,SAAS,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAgBD,wBAAsB,WAAW,CAAC,WAAW,EAAE,YAAY,
|
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;AAUrB,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,SAAS,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,iBAAiB,EAAE,SAAS,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAgBD,wBAAsB,WAAW,CAAC,WAAW,EAAE,YAAY,0BAsB1D;AAED,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,CAmF7B;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,SAAS,CAAC,EAAE,OAAO;;GA0B5E"}
|
@@ -25,7 +25,7 @@ function createTransactionInstruction(instruction) {
|
|
25
25
|
async function getJupQuote(swapDetails) {
|
26
26
|
const memecoinSwap = (0, generalUtils_1.tokenInfo)(swapDetails.inputMint).isMeme ||
|
27
27
|
(0, generalUtils_1.tokenInfo)(swapDetails.outputMint).isMeme;
|
28
|
-
return await (0, generalUtils_1.retryWithExponentialBackoff)(async () => await jupApi.quoteGet({
|
28
|
+
return await (0, generalUtils_1.retryWithExponentialBackoff)(async (attemptNum) => await jupApi.quoteGet({
|
29
29
|
amount: Number(swapDetails.amount),
|
30
30
|
inputMint: swapDetails.inputMint.toString(),
|
31
31
|
outputMint: swapDetails.outputMint.toString(),
|
@@ -35,10 +35,8 @@ async function getJupQuote(swapDetails) {
|
|
35
35
|
? "ExactIn"
|
36
36
|
: undefined,
|
37
37
|
slippageBps: memecoinSwap ? 500 : 200,
|
38
|
-
maxAccounts: !swapDetails.exactOut
|
39
|
-
|
40
|
-
: undefined,
|
41
|
-
}), 2, 200);
|
38
|
+
maxAccounts: !swapDetails.exactOut ? 15 + attemptNum * 5 : undefined,
|
39
|
+
}), 3, 200);
|
42
40
|
}
|
43
41
|
async function getJupSwapTransaction(signer, swapDetails, attemptNum) {
|
44
42
|
const quoteResponse = swapDetails.jupQuote ?? (await getJupQuote(swapDetails));
|
@@ -46,7 +44,7 @@ async function getJupSwapTransaction(signer, swapDetails, attemptNum) {
|
|
46
44
|
const finalPriceSlippageBps = Math.round(Math.max(50, quoteResponse.slippageBps, priceImpactBps) *
|
47
45
|
(1 + (swapDetails.slippageIncFactor ?? 0)));
|
48
46
|
quoteResponse.slippageBps = finalPriceSlippageBps;
|
49
|
-
(0, generalUtils_1.consoleLog)(quoteResponse);
|
47
|
+
(0, generalUtils_1.consoleLog)("Quote:", quoteResponse);
|
50
48
|
(0, generalUtils_1.consoleLog)("Getting jup instructions...");
|
51
49
|
const instructions = await (0, generalUtils_1.retryWithExponentialBackoff)(async () => {
|
52
50
|
const res = await jupApi.swapInstructionsPost({
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"generalUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/solauto/generalUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAGL,OAAO,EAEP,GAAG,EACJ,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,kBAAkB,EAElB,aAAa,EACb,YAAY,EACZ,yBAAyB,EACzB,gCAAgC,EAChC,SAAS,EAMV,MAAM,iBAAiB,CAAC;
|
1
|
+
{"version":3,"file":"generalUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/solauto/generalUtils.ts"],"names":[],"mappings":"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"}
|
@@ -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;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;
|
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;AAoDD,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;AA4CD,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,CA2EzB"}
|
@@ -125,6 +125,25 @@ function getRebalanceValues(state, settings, dca, currentUnixTime, supplyPrice,
|
|
125
125
|
targetRateBps,
|
126
126
|
};
|
127
127
|
}
|
128
|
+
function postRebalanceLiqUtilizationRateBps(client, values, swapOutputAmount) {
|
129
|
+
let supplyUsd = (0, numberUtils_1.fromBaseUnit)(client.solautoPositionState.supply.amountUsed.baseAmountUsdValue, generalAccounts_1.USD_DECIMALS) +
|
130
|
+
(values.dcaTokenType === generated_1.TokenType.Supply ? values.amountUsdToDcaIn : 0);
|
131
|
+
let debtUsd = (0, numberUtils_1.fromBaseUnit)(client.solautoPositionState.debt.amountUsed.baseAmountUsdValue, generalAccounts_1.USD_DECIMALS);
|
132
|
+
const boost = values.rebalanceDirection === generated_1.RebalanceDirection.Boost;
|
133
|
+
const outputToken = (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(boost
|
134
|
+
? client.solautoPositionState.supply.mint
|
135
|
+
: client.solautoPositionState.debt.mint);
|
136
|
+
const debtAdjustmentUsdAbs = Math.abs(values.debtAdjustmentUsd);
|
137
|
+
const swapOutputUsd = swapOutputAmount
|
138
|
+
? (0, numberUtils_1.fromBaseUnit)(swapOutputAmount, (0, generalUtils_2.tokenInfo)(outputToken).decimals) *
|
139
|
+
((0, priceUtils_1.safeGetPrice)(outputToken) ?? 0)
|
140
|
+
: debtAdjustmentUsdAbs;
|
141
|
+
supplyUsd = !boost
|
142
|
+
? supplyUsd - debtAdjustmentUsdAbs
|
143
|
+
: supplyUsd + swapOutputUsd;
|
144
|
+
debtUsd = boost ? debtUsd + debtAdjustmentUsdAbs : debtUsd - swapOutputUsd;
|
145
|
+
return (0, numberUtils_1.getLiqUtilzationRateBps)(supplyUsd, debtUsd, client.solautoPositionState?.liqThresholdBps ?? 0);
|
146
|
+
}
|
128
147
|
function insufficientLiquidity(amountNeeded, liquidity, tokenDecimals, tokenPrice) {
|
129
148
|
return amountNeeded > (0, numberUtils_1.fromBaseUnit)(liquidity, tokenDecimals) * tokenPrice;
|
130
149
|
}
|
@@ -166,7 +185,6 @@ async function getFlashLoanRequirements(client, values, attemptNum) {
|
|
166
185
|
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`);
|
167
186
|
}
|
168
187
|
}
|
169
|
-
// TODO: if not sufficient signer liquidity, throw error with details on how much liquidity is needed and of what token
|
170
188
|
(0, generalUtils_2.consoleLog)("Requires flash loan:", requiresFlashLoan);
|
171
189
|
(0, generalUtils_2.consoleLog)("Use debt liquidity:", useDebtLiquidity);
|
172
190
|
(0, generalUtils_2.consoleLog)("Intermediary liq utilization rate:", tempLiqUtilizationRateBps, `$${supplyUsd}`, `$${debtUsd}`, "Max:", maxLiqUtilizationRateBps);
|
@@ -195,6 +213,31 @@ function getFlashLoanDetails(client, flRequirements, values, jupQuote) {
|
|
195
213
|
mint: (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(flashLoanToken.mint),
|
196
214
|
};
|
197
215
|
}
|
216
|
+
async function findSufficientQuote(client, values, jupSwapInput, criteria) {
|
217
|
+
let jupQuote;
|
218
|
+
let insufficient = false;
|
219
|
+
for (let i = 0; i < 5; i++) {
|
220
|
+
(0, generalUtils_2.consoleLog)("Finding sufficient quote...");
|
221
|
+
jupQuote = await (0, jupiterUtils_1.getJupQuote)(jupSwapInput);
|
222
|
+
const outputAmount = parseInt(jupQuote.outAmount);
|
223
|
+
const postRebalanceRate = postRebalanceLiqUtilizationRateBps(client, values);
|
224
|
+
insufficient = criteria.minOutputAmount
|
225
|
+
? outputAmount < Number(criteria.minOutputAmount)
|
226
|
+
: criteria.minLiqUtilizationRateBps
|
227
|
+
? postRebalanceRate < criteria.minLiqUtilizationRateBps
|
228
|
+
: postRebalanceRate > criteria.maxLiqUtilizationRateBps;
|
229
|
+
if (insufficient) {
|
230
|
+
jupSwapInput.amount =
|
231
|
+
jupSwapInput.amount +
|
232
|
+
BigInt(Math.round(Number(jupSwapInput.amount) * 0.005));
|
233
|
+
(0, generalUtils_2.consoleLog)(jupQuote);
|
234
|
+
}
|
235
|
+
else {
|
236
|
+
break;
|
237
|
+
}
|
238
|
+
}
|
239
|
+
return jupQuote;
|
240
|
+
}
|
198
241
|
async function getJupSwapRebalanceDetails(client, values, flRequirements, targetLiqUtilizationRateBps, attemptNum) {
|
199
242
|
const input = values.rebalanceDirection === generated_1.RebalanceDirection.Boost
|
200
243
|
? client.solautoPositionState.debt
|
@@ -217,6 +260,9 @@ async function getJupSwapRebalanceDetails(client, values, flRequirements, target
|
|
217
260
|
const exactOut = flashLoanRepayFromDebt && !rebalanceToZero;
|
218
261
|
// || rebalanceToZero
|
219
262
|
const exactIn = !exactOut;
|
263
|
+
if (exactIn && rebalanceToZero) {
|
264
|
+
inputAmount = inputAmount + BigInt(Math.round(Number(inputAmount) * 0.005));
|
265
|
+
}
|
220
266
|
const jupSwapInput = {
|
221
267
|
inputMint: (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(input.mint),
|
222
268
|
outputMint: (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(output.mint),
|
@@ -226,13 +272,13 @@ async function getJupSwapRebalanceDetails(client, values, flRequirements, target
|
|
226
272
|
};
|
227
273
|
(0, generalUtils_2.consoleLog)(jupSwapInput);
|
228
274
|
let jupQuote = undefined;
|
229
|
-
if (rebalanceToZero) {
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
}
|
275
|
+
if (exactIn && (rebalanceToZero || values.repayingCloseToMaxLtv)) {
|
276
|
+
jupQuote = await findSufficientQuote(client, values, jupSwapInput, {
|
277
|
+
minOutputAmount: rebalanceToZero ? outputAmount : undefined,
|
278
|
+
maxLiqUtilizationRateBps: values.repayingCloseToMaxLtv
|
279
|
+
? (0, numberUtils_1.maxRepayToBps)(client.solautoPositionState?.maxLtvBps ?? 0, client.solautoPositionState?.liqThresholdBps ?? 0)
|
280
|
+
: undefined,
|
281
|
+
});
|
236
282
|
}
|
237
283
|
const addPadding = exactOut;
|
238
284
|
return {
|
package/package.json
CHANGED
@@ -55,7 +55,7 @@ export async function getJupQuote(swapDetails: JupSwapInput) {
|
|
55
55
|
tokenInfo(swapDetails.outputMint).isMeme;
|
56
56
|
|
57
57
|
return await retryWithExponentialBackoff(
|
58
|
-
async () =>
|
58
|
+
async (attemptNum: number) =>
|
59
59
|
await jupApi.quoteGet({
|
60
60
|
amount: Number(swapDetails.amount),
|
61
61
|
inputMint: swapDetails.inputMint.toString(),
|
@@ -66,11 +66,9 @@ export async function getJupQuote(swapDetails: JupSwapInput) {
|
|
66
66
|
? "ExactIn"
|
67
67
|
: undefined,
|
68
68
|
slippageBps: memecoinSwap ? 500 : 200,
|
69
|
-
maxAccounts: !swapDetails.exactOut
|
70
|
-
? 15
|
71
|
-
: undefined,
|
69
|
+
maxAccounts: !swapDetails.exactOut ? 15 + attemptNum * 5 : undefined,
|
72
70
|
}),
|
73
|
-
|
71
|
+
3,
|
74
72
|
200
|
75
73
|
);
|
76
74
|
}
|
@@ -99,7 +97,7 @@ export async function getJupSwapTransaction(
|
|
99
97
|
(1 + (swapDetails.slippageIncFactor ?? 0))
|
100
98
|
);
|
101
99
|
quoteResponse.slippageBps = finalPriceSlippageBps;
|
102
|
-
consoleLog(quoteResponse);
|
100
|
+
consoleLog("Quote:", quoteResponse);
|
103
101
|
|
104
102
|
consoleLog("Getting jup instructions...");
|
105
103
|
const instructions = await retryWithExponentialBackoff(
|
@@ -27,7 +27,6 @@ import {
|
|
27
27
|
fromBaseUnit,
|
28
28
|
getLiqUtilzationRateBps,
|
29
29
|
toBaseUnit,
|
30
|
-
toBps,
|
31
30
|
} from "../numberUtils";
|
32
31
|
import { getReferralState } from "../accountUtils";
|
33
32
|
import { toWeb3JsPublicKey } from "@metaplex-foundation/umi-web3js-adapters";
|
@@ -39,7 +38,6 @@ import {
|
|
39
38
|
import {
|
40
39
|
findMarginfiAccounts,
|
41
40
|
getAllMarginfiAccountsByAuthority,
|
42
|
-
getMarginfiMaxLtvAndLiqThreshold,
|
43
41
|
} from "../marginfiUtils";
|
44
42
|
import { RebalanceAction, SolautoPositionDetails } from "../../types/solauto";
|
45
43
|
import { fetchTokenPrices } from "../priceUtils";
|
@@ -260,6 +260,47 @@ export function getRebalanceValues(
|
|
260
260
|
};
|
261
261
|
}
|
262
262
|
|
263
|
+
function postRebalanceLiqUtilizationRateBps(
|
264
|
+
client: SolautoClient,
|
265
|
+
values: RebalanceValues,
|
266
|
+
swapOutputAmount?: bigint
|
267
|
+
) {
|
268
|
+
let supplyUsd =
|
269
|
+
fromBaseUnit(
|
270
|
+
client.solautoPositionState!.supply.amountUsed.baseAmountUsdValue,
|
271
|
+
USD_DECIMALS
|
272
|
+
) +
|
273
|
+
(values.dcaTokenType === TokenType.Supply ? values.amountUsdToDcaIn : 0);
|
274
|
+
let debtUsd = fromBaseUnit(
|
275
|
+
client.solautoPositionState!.debt.amountUsed.baseAmountUsdValue,
|
276
|
+
USD_DECIMALS
|
277
|
+
);
|
278
|
+
|
279
|
+
const boost = values.rebalanceDirection === RebalanceDirection.Boost;
|
280
|
+
|
281
|
+
const outputToken = toWeb3JsPublicKey(
|
282
|
+
boost
|
283
|
+
? client.solautoPositionState!.supply.mint
|
284
|
+
: client.solautoPositionState!.debt.mint
|
285
|
+
);
|
286
|
+
const debtAdjustmentUsdAbs = Math.abs(values.debtAdjustmentUsd);
|
287
|
+
const swapOutputUsd = swapOutputAmount
|
288
|
+
? fromBaseUnit(swapOutputAmount, tokenInfo(outputToken).decimals) *
|
289
|
+
(safeGetPrice(outputToken) ?? 0)
|
290
|
+
: debtAdjustmentUsdAbs;
|
291
|
+
|
292
|
+
supplyUsd = !boost
|
293
|
+
? supplyUsd - debtAdjustmentUsdAbs
|
294
|
+
: supplyUsd + swapOutputUsd;
|
295
|
+
debtUsd = boost ? debtUsd + debtAdjustmentUsdAbs : debtUsd - swapOutputUsd;
|
296
|
+
|
297
|
+
return getLiqUtilzationRateBps(
|
298
|
+
supplyUsd,
|
299
|
+
debtUsd,
|
300
|
+
client.solautoPositionState?.liqThresholdBps ?? 0
|
301
|
+
);
|
302
|
+
}
|
303
|
+
|
263
304
|
function insufficientLiquidity(
|
264
305
|
amountNeeded: number,
|
265
306
|
liquidity: bigint,
|
@@ -316,7 +357,7 @@ export async function getFlashLoanRequirements(
|
|
316
357
|
const supplyPrice = safeGetPrice(client.supplyMint) ?? 0;
|
317
358
|
const debtPrice = safeGetPrice(client.debtMint) ?? 0;
|
318
359
|
const debtAdjustmentUsd = Math.abs(values.debtAdjustmentUsd);
|
319
|
-
|
360
|
+
|
320
361
|
const insufficientSupplyLiquidity = insufficientLiquidity(
|
321
362
|
debtAdjustmentUsd,
|
322
363
|
client.supplyLiquidityAvailable(),
|
@@ -364,8 +405,6 @@ export async function getFlashLoanRequirements(
|
|
364
405
|
}
|
365
406
|
}
|
366
407
|
|
367
|
-
// TODO: if not sufficient signer liquidity, throw error with details on how much liquidity is needed and of what token
|
368
|
-
|
369
408
|
consoleLog("Requires flash loan:", requiresFlashLoan);
|
370
409
|
consoleLog("Use debt liquidity:", useDebtLiquidity);
|
371
410
|
consoleLog(
|
@@ -419,6 +458,48 @@ export function getFlashLoanDetails(
|
|
419
458
|
};
|
420
459
|
}
|
421
460
|
|
461
|
+
async function findSufficientQuote(
|
462
|
+
client: SolautoClient,
|
463
|
+
values: RebalanceValues,
|
464
|
+
jupSwapInput: JupSwapInput,
|
465
|
+
criteria: {
|
466
|
+
minOutputAmount?: bigint;
|
467
|
+
minLiqUtilizationRateBps?: number;
|
468
|
+
maxLiqUtilizationRateBps?: number;
|
469
|
+
}
|
470
|
+
): Promise<QuoteResponse> {
|
471
|
+
let jupQuote: QuoteResponse;
|
472
|
+
let insufficient: boolean = false;
|
473
|
+
|
474
|
+
for (let i = 0; i < 5; i++) {
|
475
|
+
consoleLog("Finding sufficient quote...");
|
476
|
+
jupQuote = await getJupQuote(jupSwapInput);
|
477
|
+
|
478
|
+
const outputAmount = parseInt(jupQuote.outAmount);
|
479
|
+
const postRebalanceRate = postRebalanceLiqUtilizationRateBps(
|
480
|
+
client,
|
481
|
+
values
|
482
|
+
);
|
483
|
+
insufficient = criteria.minOutputAmount
|
484
|
+
? outputAmount < Number(criteria.minOutputAmount)
|
485
|
+
: criteria.minLiqUtilizationRateBps
|
486
|
+
? postRebalanceRate < criteria.minLiqUtilizationRateBps
|
487
|
+
: postRebalanceRate > criteria.maxLiqUtilizationRateBps!;
|
488
|
+
|
489
|
+
if (insufficient) {
|
490
|
+
jupSwapInput.amount =
|
491
|
+
jupSwapInput.amount +
|
492
|
+
BigInt(Math.round(Number(jupSwapInput.amount) * 0.005));
|
493
|
+
|
494
|
+
consoleLog(jupQuote);
|
495
|
+
} else {
|
496
|
+
break;
|
497
|
+
}
|
498
|
+
}
|
499
|
+
|
500
|
+
return jupQuote!;
|
501
|
+
}
|
502
|
+
|
422
503
|
export async function getJupSwapRebalanceDetails(
|
423
504
|
client: SolautoClient,
|
424
505
|
values: RebalanceValues,
|
@@ -464,6 +545,9 @@ export async function getJupSwapRebalanceDetails(
|
|
464
545
|
// || rebalanceToZero
|
465
546
|
const exactIn = !exactOut;
|
466
547
|
|
548
|
+
if (exactIn && rebalanceToZero) {
|
549
|
+
inputAmount = inputAmount + BigInt(Math.round(Number(inputAmount) * 0.005));
|
550
|
+
}
|
467
551
|
const jupSwapInput: JupSwapInput = {
|
468
552
|
inputMint: toWeb3JsPublicKey(input.mint),
|
469
553
|
outputMint: toWeb3JsPublicKey(output.mint),
|
@@ -474,13 +558,16 @@ export async function getJupSwapRebalanceDetails(
|
|
474
558
|
consoleLog(jupSwapInput);
|
475
559
|
|
476
560
|
let jupQuote: QuoteResponse | undefined = undefined;
|
477
|
-
if (rebalanceToZero) {
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
561
|
+
if (exactIn && (rebalanceToZero || values.repayingCloseToMaxLtv)) {
|
562
|
+
jupQuote = await findSufficientQuote(client, values, jupSwapInput, {
|
563
|
+
minOutputAmount: rebalanceToZero ? outputAmount : undefined,
|
564
|
+
maxLiqUtilizationRateBps: values.repayingCloseToMaxLtv
|
565
|
+
? maxRepayToBps(
|
566
|
+
client.solautoPositionState?.maxLtvBps ?? 0,
|
567
|
+
client.solautoPositionState?.liqThresholdBps ?? 0
|
568
|
+
)
|
569
|
+
: undefined,
|
570
|
+
});
|
484
571
|
}
|
485
572
|
|
486
573
|
const addPadding = exactOut;
|
@@ -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("EBhRj7jbF2EVE21i19JSuCX1BAbnZFYhoKW64HnaZ3kf"),
|
70
70
|
// new: true,
|
71
71
|
// marginfiAccount: new PublicKey(
|
72
72
|
// ""
|
@@ -76,10 +76,6 @@ describe("Solauto Marginfi tests", async () => {
|
|
76
76
|
// debtMint: new PublicKey(USDC),
|
77
77
|
});
|
78
78
|
|
79
|
-
await client.getFreshPositionState();
|
80
|
-
console.log(fromBaseUnit(client.supplyLiquidityAvailable(), tokenInfo(client.supplyMint).decimals));
|
81
|
-
console.log(fromBaseUnit(client.debtLiquidityAvailable(), tokenInfo(client.debtMint).decimals));
|
82
|
-
|
83
79
|
const transactionItems: TransactionItem[] = [];
|
84
80
|
// const settingParams: SolautoSettingsParametersInpArgs = {
|
85
81
|
// boostToBps: maxBoostToBps(
|