@haven-fi/solauto-sdk 1.0.526 → 1.0.528
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.d.ts +1 -2
- package/dist/transactions/transactionUtils.d.ts.map +1 -1
- package/dist/transactions/transactionUtils.js +3 -4
- 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 +24 -17
- package/package.json +1 -1
- package/src/clients/solautoClient.ts +46 -0
- package/src/transactions/transactionUtils.ts +2 -4
- package/src/utils/solauto/rebalanceUtils.ts +58 -24
- package/tests/transactions/solautoMarginfi.ts +4 -12
@@ -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);
|
@@ -1,12 +1,11 @@
|
|
1
1
|
import { TransactionBuilder, Umi } from "@metaplex-foundation/umi";
|
2
2
|
import { PublicKey } from "@solana/web3.js";
|
3
3
|
import { SolautoClient } from "../clients/solautoClient";
|
4
|
-
import { RebalanceValues } from "../utils/solauto/rebalanceUtils";
|
5
4
|
import { ReferralStateManager } from "../clients";
|
6
5
|
import { TransactionItemInputs } from "../types";
|
7
6
|
export declare function rebalanceChoresBefore(client: SolautoClient, tx: TransactionBuilder, accountsGettingCreated: string[]): Promise<TransactionBuilder>;
|
8
7
|
export declare function getTransactionChores(client: SolautoClient, tx: TransactionBuilder): Promise<[TransactionBuilder, TransactionBuilder]>;
|
9
|
-
export declare function requiresRefreshBeforeRebalance(client: SolautoClient
|
8
|
+
export declare function requiresRefreshBeforeRebalance(client: SolautoClient): Promise<boolean>;
|
10
9
|
export declare function buildSolautoRebalanceTransaction(client: SolautoClient, targetLiqUtilizationRateBps?: number, attemptNum?: number): Promise<TransactionItemInputs | undefined>;
|
11
10
|
export declare function convertReferralFeesToDestination(referralManager: ReferralStateManager, tokenAccount: PublicKey, destinationMint: PublicKey): Promise<TransactionItemInputs | undefined>;
|
12
11
|
export declare function getErrorInfo(umi: Umi, txs: TransactionBuilder[], error: Error, simulationSuccessful?: boolean): {
|
@@ -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;AAoBxE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;
|
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;AAoBxE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAuCzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAOlD,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AA6LjD,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,CAClD,MAAM,EAAE,aAAa,oBAsDtB;AAED,wBAAsB,gCAAgC,CACpD,MAAM,EAAE,aAAa,EACrB,2BAA2B,CAAC,EAAE,MAAM,EACpC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAyI5C;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,CAC1B,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,kBAAkB,EAAE,EACzB,KAAK,EAAE,KAAK,EACZ,oBAAoB,CAAC,EAAE,OAAO;;;;EA0G/B"}
|
@@ -329,7 +329,7 @@ async function getTransactionChores(client, tx) {
|
|
329
329
|
choresAfter = choresAfter.add(transactionChoresAfter(client, solautoActions, client.livePositionUpdates.cancellingDca));
|
330
330
|
return [choresBefore, choresAfter];
|
331
331
|
}
|
332
|
-
async function requiresRefreshBeforeRebalance(client
|
332
|
+
async function requiresRefreshBeforeRebalance(client) {
|
333
333
|
const neverRefreshedBefore = client.solautoPositionData &&
|
334
334
|
client.solautoPositionData.state.supply.amountCanBeUsed.baseUnit ===
|
335
335
|
BigInt(0) &&
|
@@ -373,15 +373,14 @@ 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
|
380
380
|
? (0, rebalanceUtils_1.getFlashLoanDetails)(client, flRequirements, values, jupQuote)
|
381
381
|
: undefined;
|
382
382
|
let tx = (0, umi_1.transactionBuilder)();
|
383
|
-
|
384
|
-
if (await requiresRefreshBeforeRebalance(client, values)) {
|
383
|
+
if (await requiresRefreshBeforeRebalance(client)) {
|
385
384
|
tx = tx.add(client.refresh());
|
386
385
|
}
|
387
386
|
if (flashLoan) {
|
@@ -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,CAoG5C;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"}
|
@@ -86,7 +86,7 @@ function getTargetRateAndDcaAmount(state, settings, dca, currentUnixTime, target
|
|
86
86
|
}
|
87
87
|
function getRebalanceValues(state, settings, dca, currentUnixTime, supplyPrice, debtPrice, targetLiqUtilizationRateBps) {
|
88
88
|
let { targetRateBps, amountToDcaIn } = getTargetRateAndDcaAmount(state, settings, dca, currentUnixTime, targetLiqUtilizationRateBps);
|
89
|
-
// REVERT ME AND GET TO THE ROOT OF THIS ISSUE
|
89
|
+
// TODO: REVERT ME AND GET TO THE ROOT OF THIS ISSUE
|
90
90
|
const supplyMint = (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(state.supply.mint);
|
91
91
|
if (constants_1.BROKEN_TOKENS.includes(supplyMint.toString()) &&
|
92
92
|
((0, umi_web3js_adapters_1.toWeb3JsPublicKey)(state.debt.mint).equals(new web3_js_1.PublicKey(constants_1.USDC)) ||
|
@@ -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,27 @@ 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
|
148
|
-
|
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 debtAdjustmentUsd = Math.abs(values.debtAdjustmentUsd);
|
150
|
+
const insufficientSupplyLiquidity = insufficientLiquidity(debtAdjustmentUsd, client.supplyLiquidityAvailable(), (0, generalUtils_2.tokenInfo)(client.supplyMint).decimals, supplyPrice);
|
151
|
+
const insufficientDebtLiquidity = insufficientLiquidity(debtAdjustmentUsd, client.debtLiquidityAvailable(), (0, generalUtils_2.tokenInfo)(client.debtMint).decimals, debtPrice);
|
150
152
|
let useDebtLiquidity = values.rebalanceDirection === generated_1.RebalanceDirection.Boost ||
|
151
153
|
insufficientSupplyLiquidity;
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
(
|
158
|
-
|
159
|
-
|
160
|
-
|
154
|
+
let signerFlashLoan = false;
|
155
|
+
if ((attemptNum ?? 0) > 3 ||
|
156
|
+
(insufficientSupplyLiquidity && insufficientDebtLiquidity)) {
|
157
|
+
const { supplyBalance, debtBalance } = await client.signerBalances();
|
158
|
+
const sufficientSignerSupplyLiquidity = !insufficientLiquidity(debtAdjustmentUsd, supplyBalance, (0, generalUtils_2.tokenInfo)(client.supplyMint).decimals, supplyPrice);
|
159
|
+
const sufficientSignerDebtLiquidity = !insufficientLiquidity(debtAdjustmentUsd, debtBalance, (0, generalUtils_2.tokenInfo)(client.debtMint).decimals, debtPrice);
|
160
|
+
signerFlashLoan =
|
161
|
+
sufficientSignerSupplyLiquidity || sufficientSignerDebtLiquidity;
|
162
|
+
if (signerFlashLoan) {
|
163
|
+
useDebtLiquidity = !sufficientSignerSupplyLiquidity;
|
164
|
+
}
|
165
|
+
else {
|
166
|
+
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
|
+
}
|
161
168
|
}
|
162
169
|
// TODO: if not sufficient signer liquidity, throw error with details on how much liquidity is needed and of what token
|
163
170
|
(0, generalUtils_2.consoleLog)("Requires flash loan:", requiresFlashLoan);
|
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 ??
|
@@ -603,7 +603,6 @@ export async function getTransactionChores(
|
|
603
603
|
|
604
604
|
export async function requiresRefreshBeforeRebalance(
|
605
605
|
client: SolautoClient,
|
606
|
-
values: RebalanceValues
|
607
606
|
) {
|
608
607
|
const neverRefreshedBefore =
|
609
608
|
client.solautoPositionData &&
|
@@ -696,7 +695,7 @@ export async function buildSolautoRebalanceTransaction(
|
|
696
695
|
);
|
697
696
|
client.log("Rebalance values: ", values);
|
698
697
|
|
699
|
-
const flRequirements = getFlashLoanRequirements(client, values, attemptNum);
|
698
|
+
const flRequirements = await getFlashLoanRequirements(client, values, attemptNum);
|
700
699
|
const swapDetails = await getJupSwapRebalanceDetails(
|
701
700
|
client,
|
702
701
|
values,
|
@@ -718,8 +717,7 @@ export async function buildSolautoRebalanceTransaction(
|
|
718
717
|
|
719
718
|
let tx = transactionBuilder();
|
720
719
|
|
721
|
-
|
722
|
-
if (await requiresRefreshBeforeRebalance(client, values)) {
|
720
|
+
if (await requiresRefreshBeforeRebalance(client)) {
|
723
721
|
tx = tx.add(client.refresh());
|
724
722
|
}
|
725
723
|
|
@@ -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)) {
|
@@ -190,7 +191,7 @@ export function getRebalanceValues(
|
|
190
191
|
targetLiqUtilizationRateBps
|
191
192
|
);
|
192
193
|
|
193
|
-
// REVERT ME AND GET TO THE ROOT OF THIS ISSUE
|
194
|
+
// TODO: REVERT ME AND GET TO THE ROOT OF THIS ISSUE
|
194
195
|
const supplyMint = toWeb3JsPublicKey(state.supply.mint);
|
195
196
|
if (
|
196
197
|
BROKEN_TOKENS.includes(supplyMint.toString()) &&
|
@@ -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,55 @@ export function getFlashLoanRequirements(
|
|
303
313
|
const requiresFlashLoan =
|
304
314
|
supplyUsd <= 0 || tempLiqUtilizationRateBps > maxLiqUtilizationRateBps;
|
305
315
|
|
306
|
-
const
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
const
|
311
|
-
|
312
|
-
|
313
|
-
|
316
|
+
const supplyPrice = safeGetPrice(client.supplyMint) ?? 0;
|
317
|
+
const debtPrice = safeGetPrice(client.debtMint) ?? 0;
|
318
|
+
const debtAdjustmentUsd = Math.abs(values.debtAdjustmentUsd);
|
319
|
+
|
320
|
+
const insufficientSupplyLiquidity = insufficientLiquidity(
|
321
|
+
debtAdjustmentUsd,
|
322
|
+
client.supplyLiquidityAvailable(),
|
323
|
+
tokenInfo(client.supplyMint).decimals,
|
324
|
+
supplyPrice
|
325
|
+
);
|
326
|
+
const insufficientDebtLiquidity = insufficientLiquidity(
|
327
|
+
debtAdjustmentUsd,
|
328
|
+
client.debtLiquidityAvailable(),
|
329
|
+
tokenInfo(client.debtMint).decimals,
|
330
|
+
debtPrice
|
331
|
+
);
|
314
332
|
|
315
333
|
let useDebtLiquidity =
|
316
334
|
values.rebalanceDirection === RebalanceDirection.Boost ||
|
317
335
|
insufficientSupplyLiquidity;
|
318
336
|
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
337
|
+
let signerFlashLoan = false;
|
338
|
+
if (
|
339
|
+
(attemptNum ?? 0) > 3 ||
|
340
|
+
(insufficientSupplyLiquidity && insufficientDebtLiquidity)
|
341
|
+
) {
|
342
|
+
const { supplyBalance, debtBalance } = await client.signerBalances();
|
343
|
+
const sufficientSignerSupplyLiquidity = !insufficientLiquidity(
|
344
|
+
debtAdjustmentUsd,
|
345
|
+
supplyBalance,
|
346
|
+
tokenInfo(client.supplyMint).decimals,
|
347
|
+
supplyPrice
|
348
|
+
);
|
349
|
+
const sufficientSignerDebtLiquidity = !insufficientLiquidity(
|
350
|
+
debtAdjustmentUsd,
|
351
|
+
debtBalance,
|
352
|
+
tokenInfo(client.debtMint).decimals,
|
353
|
+
debtPrice
|
354
|
+
);
|
355
|
+
|
356
|
+
signerFlashLoan =
|
357
|
+
sufficientSignerSupplyLiquidity || sufficientSignerDebtLiquidity;
|
358
|
+
if (signerFlashLoan) {
|
359
|
+
useDebtLiquidity = !sufficientSignerSupplyLiquidity;
|
360
|
+
} else {
|
361
|
+
throw new Error(
|
362
|
+
`Need at least ${values.debtAdjustmentUsd / debtPrice} ${tokenInfo(client.debtMint).ticker} or ${values.debtAdjustmentUsd / supplyPrice} ${tokenInfo(client.supplyMint).ticker} to perform the transaction`
|
363
|
+
);
|
364
|
+
}
|
331
365
|
}
|
332
366
|
|
333
367
|
// TODO: if not sufficient signer liquidity, throw error with details on how much liquidity is needed and of what token
|
@@ -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 () => {
|
@@ -76,17 +76,9 @@ describe("Solauto Marginfi tests", async () => {
|
|
76
76
|
// debtMint: new PublicKey(USDC),
|
77
77
|
});
|
78
78
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
// client.umi,
|
83
|
-
// new PublicKey(JUPITER_PROGRAM_ID)
|
84
|
-
// ),
|
85
|
-
// null,
|
86
|
-
// 2
|
87
|
-
// )
|
88
|
-
// );
|
89
|
-
// return;
|
79
|
+
await client.getFreshPositionState();
|
80
|
+
console.log(fromBaseUnit(client.supplyLiquidityAvailable(), tokenInfo(client.supplyMint).decimals));
|
81
|
+
console.log(fromBaseUnit(client.debtLiquidityAvailable(), tokenInfo(client.debtMint).decimals));
|
90
82
|
|
91
83
|
const transactionItems: TransactionItem[] = [];
|
92
84
|
// const settingParams: SolautoSettingsParametersInpArgs = {
|