@haven-fi/solauto-sdk 1.0.537 → 1.0.539
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/marginfiUtils.d.ts.map +1 -1
- package/dist/utils/marginfiUtils.js +1 -2
- package/dist/utils/numberUtils.d.ts +9 -1
- package/dist/utils/numberUtils.d.ts.map +1 -1
- package/dist/utils/numberUtils.js +32 -0
- package/dist/utils/priceUtils.d.ts.map +1 -1
- package/dist/utils/priceUtils.js +8 -1
- package/dist/utils/solauto/generalUtils.d.ts +1 -0
- package/dist/utils/solauto/generalUtils.d.ts.map +1 -1
- package/dist/utils/solauto/generalUtils.js +21 -18
- package/dist/utils/solauto/rebalanceUtils.d.ts.map +1 -1
- package/dist/utils/solauto/rebalanceUtils.js +6 -11
- package/local/logPositions.ts +6 -12
- package/package.json +1 -1
- package/src/utils/marginfiUtils.ts +2 -11
- package/src/utils/numberUtils.ts +58 -2
- package/src/utils/priceUtils.ts +9 -1
- package/src/utils/solauto/generalUtils.ts +50 -39
- package/src/utils/solauto/rebalanceUtils.ts +10 -27
- package/tests/unit/rebalanceCalculations.ts +6 -13
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"marginfiUtils.d.ts","sourceRoot":"","sources":["../../src/utils/marginfiUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAa,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EACL,IAAI,EAGJ,eAAe,EAIhB,MAAM,iBAAiB,CAAC;
|
1
|
+
{"version":3,"file":"marginfiUtils.d.ts","sourceRoot":"","sources":["../../src/utils/marginfiUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAa,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EACL,IAAI,EAGJ,eAAe,EAIhB,MAAM,iBAAiB,CAAC;AAczB,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAsB,MAAM,cAAc,CAAC;AAEjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAI7D,UAAU,wBAAyB,SAAQ,qBAAqB;IAC9D,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,SAAS,GACd,wBAAwB,CAY1B;AAED,wBAAgB,iCAAiC,CAC/C,UAAU,EAAE,IAAI,EAChB,QAAQ,EAAE,IAAI,EACd,WAAW,EAAE,MAAM,GAClB,CAAC,MAAM,EAAE,MAAM,CAAC,CA6BlB;AAED,wBAAsB,gCAAgC,CACpD,GAAG,EAAE,GAAG,EACR,aAAa,EAAE,SAAS,EACxB,MAAM,EAAE;IACN,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACpB,EACD,IAAI,EAAE;IACJ,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACpB,EACD,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA4C3B;AAED,wBAAsB,iCAAiC,CACrD,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,EACpB,KAAK,CAAC,EAAE,SAAS,EACjB,qBAAqB,CAAC,EAAE,OAAO,GAC9B,OAAO,CACR;IAAE,eAAe,EAAE,SAAS,CAAC;IAAC,UAAU,CAAC,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,EAAE,CAC/E,CAyDA;AAED,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,IAAI,GAAG,IAAI,EACjB,kBAAkB,EAAE,OAAO,UAqB5B;AAmDD,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,KAAK,UAAU,GAAG;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;CAAE,CAAC;AAEhE,wBAAsB,+BAA+B,CACnD,GAAG,EAAE,GAAG,EACR,eAAe,EAAE;IAAE,EAAE,EAAE,SAAS,CAAC;IAAC,IAAI,CAAC,EAAE,eAAe,CAAA;CAAE,EAC1D,aAAa,CAAC,EAAE,SAAS,EACzB,MAAM,CAAC,EAAE,aAAa,EACtB,IAAI,CAAC,EAAE,aAAa,EACpB,mBAAmB,CAAC,EAAE,mBAAmB,GACxC,OAAO,CACN;IAAE,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,aAAa,CAAA;CAAE,GACxE,SAAS,CACZ,CAiMA;AA+DD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,oBAU7C;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAgBnE;AAED,wBAAgB,oBAAoB,CAAC,eAAe,EAAE,eAAe,WASpE"}
|
@@ -104,8 +104,7 @@ async function getAllMarginfiAccountsByAuthority(umi, authority, group, compatib
|
|
104
104
|
}))?.state,
|
105
105
|
})));
|
106
106
|
return positionStates
|
107
|
-
.sort((a, b) => (0, numberUtils_1.
|
108
|
-
(0, numberUtils_1.fromBaseUnit)(a.state?.netWorth.baseAmountUsdValue ?? BigInt(0), generalAccounts_1.USD_DECIMALS))
|
107
|
+
.sort((a, b) => (0, numberUtils_1.calcNetWorthUsd)(b.state) - (0, numberUtils_1.calcNetWorthUsd)(a.state))
|
109
108
|
.filter((x) => x.state !== undefined)
|
110
109
|
.map((x) => ({
|
111
110
|
marginfiAccount: (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(x.publicKey),
|
@@ -1,4 +1,12 @@
|
|
1
|
-
import { RebalanceDirection } from "../generated";
|
1
|
+
import { PositionState, RebalanceDirection } from "../generated";
|
2
|
+
export declare function calcNetWorthUsd(state?: PositionState): number;
|
3
|
+
export declare function calcSupplyUsd(state?: PositionState): number;
|
4
|
+
export declare function calcDebtUsd(state?: PositionState): number;
|
5
|
+
export declare function calcNetWorth(state?: PositionState): number;
|
6
|
+
export declare function calcTotalSupply(state?: PositionState): number;
|
7
|
+
export declare function calcTotalDebt(state?: PositionState): number;
|
8
|
+
export declare function debtLiquidityUsdAvailable(state?: PositionState): number;
|
9
|
+
export declare function supplyLiquidityUsdDepositable(state?: PositionState): number;
|
2
10
|
export declare function getLiqUtilzationRateBps(supplyUsd: number, debtUsd: number, liqThresholdBps: number): number;
|
3
11
|
export declare function toBaseUnit(value: number, decimals: number): bigint;
|
4
12
|
export declare function fromBaseUnit(value: bigint, decimals: number): number;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"numberUtils.d.ts","sourceRoot":"","sources":["../../src/utils/numberUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;
|
1
|
+
{"version":3,"file":"numberUtils.d.ts","sourceRoot":"","sources":["../../src/utils/numberUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEjE,wBAAgB,eAAe,CAAC,KAAK,CAAC,EAAE,aAAa,UAKpD;AAED,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,aAAa,UAKlD;AAED,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,aAAa,UAKhD;AAED,wBAAgB,YAAY,CAAC,KAAK,CAAC,EAAE,aAAa,UAKjD;AAED,wBAAgB,eAAe,CAAC,KAAK,CAAC,EAAE,aAAa,UAKpD;AAED,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,aAAa,UAKlD;AAED,wBAAgB,yBAAyB,CAAC,KAAK,CAAC,EAAE,aAAa,UAK9D;AAED,wBAAgB,6BAA6B,CAAC,KAAK,CAAC,EAAE,aAAa,UAKlE;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,MAAM,GACtB,MAAM,CAMR;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKlE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKpE;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAqBrD;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAejE;AAED,wBAAgB,oBAAoB,CAClC,eAAe,EAAE,MAAM,EACvB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,2BAA2B,EAAE,MAAM,EACnC,gBAAgB,CAAC,EAAE,MAAM,UAW1B;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,OAAO,EACnB,2BAA2B,EAAE,MAAM,GAAG,SAAS,EAC/C,mBAAmB,EAAE,MAAM,EAC3B,kBAAkB,EAAE,kBAAkB,GACrC;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAiDA;AAED,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,EACvB,gBAAgB,EAAE,MAAM,GACvB,MAAM,CAKR;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,UAKzE;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,UAKvE;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,UAKvE"}
|
@@ -1,5 +1,13 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.calcNetWorthUsd = calcNetWorthUsd;
|
4
|
+
exports.calcSupplyUsd = calcSupplyUsd;
|
5
|
+
exports.calcDebtUsd = calcDebtUsd;
|
6
|
+
exports.calcNetWorth = calcNetWorth;
|
7
|
+
exports.calcTotalSupply = calcTotalSupply;
|
8
|
+
exports.calcTotalDebt = calcTotalDebt;
|
9
|
+
exports.debtLiquidityUsdAvailable = debtLiquidityUsdAvailable;
|
10
|
+
exports.supplyLiquidityUsdDepositable = supplyLiquidityUsdDepositable;
|
3
11
|
exports.getLiqUtilzationRateBps = getLiqUtilzationRateBps;
|
4
12
|
exports.toBaseUnit = toBaseUnit;
|
5
13
|
exports.fromBaseUnit = fromBaseUnit;
|
@@ -15,6 +23,30 @@ exports.maxRepayToBps = maxRepayToBps;
|
|
15
23
|
exports.maxBoostToBps = maxBoostToBps;
|
16
24
|
const constants_1 = require("../constants");
|
17
25
|
const generated_1 = require("../generated");
|
26
|
+
function calcNetWorthUsd(state) {
|
27
|
+
return fromBaseUnit(state?.netWorth.baseAmountUsdValue ?? BigInt(0), constants_1.USD_DECIMALS);
|
28
|
+
}
|
29
|
+
function calcSupplyUsd(state) {
|
30
|
+
return fromBaseUnit(state?.supply.amountUsed.baseAmountUsdValue ?? BigInt(0), constants_1.USD_DECIMALS);
|
31
|
+
}
|
32
|
+
function calcDebtUsd(state) {
|
33
|
+
return fromBaseUnit(state?.debt.amountUsed.baseAmountUsdValue ?? BigInt(0), constants_1.USD_DECIMALS);
|
34
|
+
}
|
35
|
+
function calcNetWorth(state) {
|
36
|
+
return fromBaseUnit(state?.netWorth.baseUnit ?? BigInt(0), state?.supply.decimals ?? 1);
|
37
|
+
}
|
38
|
+
function calcTotalSupply(state) {
|
39
|
+
return fromBaseUnit(state?.supply.amountUsed.baseUnit ?? BigInt(0), state?.supply.decimals ?? 1);
|
40
|
+
}
|
41
|
+
function calcTotalDebt(state) {
|
42
|
+
return fromBaseUnit(state?.debt.amountUsed.baseUnit ?? BigInt(0), state?.debt.decimals ?? 1);
|
43
|
+
}
|
44
|
+
function debtLiquidityUsdAvailable(state) {
|
45
|
+
return fromBaseUnit(state?.debt.amountCanBeUsed.baseAmountUsdValue ?? BigInt(0), constants_1.USD_DECIMALS);
|
46
|
+
}
|
47
|
+
function supplyLiquidityUsdDepositable(state) {
|
48
|
+
return fromBaseUnit(state?.supply.amountCanBeUsed.baseAmountUsdValue ?? BigInt(0), constants_1.USD_DECIMALS);
|
49
|
+
}
|
18
50
|
function getLiqUtilzationRateBps(supplyUsd, debtUsd, liqThresholdBps) {
|
19
51
|
if (supplyUsd === 0 || debtUsd === 0) {
|
20
52
|
return 0;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"priceUtils.d.ts","sourceRoot":"","sources":["../../src/utils/priceUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,IAAI,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAarE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAyC5E;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,qBAwCrD;AAED,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,SAAS,EAAE,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CAoDnB;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,SAAS,EAAE,EAClB,oBAAoB,CAAC,EAAE,OAAO,
|
1
|
+
{"version":3,"file":"priceUtils.d.ts","sourceRoot":"","sources":["../../src/utils/priceUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,IAAI,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAarE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAyC5E;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,qBAwCrD;AAED,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,SAAS,EAAE,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CAoDnB;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,SAAS,EAAE,EAClB,oBAAoB,CAAC,EAAE,OAAO,qBAqB/B;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,SAAS,GACzC,MAAM,GAAG,SAAS,CAKpB;AAED,wBAAsB,cAAc,CAClC,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,SAAS,EACrB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,oBAAoB;;;GAc/B"}
|
package/dist/utils/priceUtils.js
CHANGED
@@ -123,7 +123,14 @@ async function getJupTokenPrices(mints, mayIncludeSpamTokens) {
|
|
123
123
|
return [];
|
124
124
|
}
|
125
125
|
const data = await (0, jupiterUtils_1.getJupPriceData)(mints, false, mayIncludeSpamTokens);
|
126
|
-
|
126
|
+
const sortedData = {};
|
127
|
+
for (const mint of mints) {
|
128
|
+
const key = mint.toString();
|
129
|
+
if (data.hasOwnProperty(key)) {
|
130
|
+
sortedData[key] = data[key];
|
131
|
+
}
|
132
|
+
}
|
133
|
+
return Object.values(sortedData).map((x) => x !== null && typeof x === "object" && "price" in x
|
127
134
|
? parseFloat(x.price)
|
128
135
|
: 0);
|
129
136
|
}
|
@@ -7,6 +7,7 @@ export declare function nextAutomationPeriodTimestamp(automation: AutomationSett
|
|
7
7
|
export declare function eligibleForNextAutomationPeriod(automation: AutomationSettings, currentUnixTime: number): boolean;
|
8
8
|
export declare function getUpdatedValueFromAutomation(currValue: number, targetValue: number, automation: AutomationSettings, currentUnixTimestamp: number): number;
|
9
9
|
export declare function getAdjustedSettingsFromAutomation(settings: SolautoSettingsParameters, currentUnixTime: number): SolautoSettingsParameters;
|
10
|
+
export declare function sufficientLiquidityToBoost(positionState: PositionState, positionSettings: SolautoSettingsParameters | undefined, positionDca: DCASettings | undefined, supplyMintPrice: number, debtMintPrice: number): boolean;
|
10
11
|
export declare function eligibleForRebalance(positionState: PositionState, positionSettings: SolautoSettingsParameters | undefined, positionDca: DCASettings | undefined, currentUnixTime: number, supplyMintPrice: number, debtMintPrice: number, bpsDistanceThreshold?: number): RebalanceAction | undefined;
|
11
12
|
export declare function eligibleForRefresh(positionState: PositionState, positionSettings: SolautoSettingsParameters, currentUnixTime: number): boolean;
|
12
13
|
export declare function getSolautoManagedPositions(umi: Umi, authority?: PublicKey, positionTypeFilter?: PositionType): Promise<SolautoPositionDetails[]>;
|
@@ -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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"}
|
@@ -6,6 +6,7 @@ exports.nextAutomationPeriodTimestamp = nextAutomationPeriodTimestamp;
|
|
6
6
|
exports.eligibleForNextAutomationPeriod = eligibleForNextAutomationPeriod;
|
7
7
|
exports.getUpdatedValueFromAutomation = getUpdatedValueFromAutomation;
|
8
8
|
exports.getAdjustedSettingsFromAutomation = getAdjustedSettingsFromAutomation;
|
9
|
+
exports.sufficientLiquidityToBoost = sufficientLiquidityToBoost;
|
9
10
|
exports.eligibleForRebalance = eligibleForRebalance;
|
10
11
|
exports.eligibleForRefresh = eligibleForRefresh;
|
11
12
|
exports.getSolautoManagedPositions = getSolautoManagedPositions;
|
@@ -73,6 +74,22 @@ function getAdjustedSettingsFromAutomation(settings, currentUnixTime) {
|
|
73
74
|
boostToBps,
|
74
75
|
};
|
75
76
|
}
|
77
|
+
function sufficientLiquidityToBoost(positionState, positionSettings, positionDca, supplyMintPrice, debtMintPrice) {
|
78
|
+
const limitsUpToDate = positionState.supply.amountCanBeUsed.baseUnit > BigInt(0) ||
|
79
|
+
positionState.debt.amountCanBeUsed.baseUnit > BigInt(0);
|
80
|
+
if (limitsUpToDate) {
|
81
|
+
const values = (0, rebalanceUtils_1.getRebalanceValues)(positionState, positionSettings, positionDca, (0, generalUtils_1.currentUnixSeconds)(), supplyMintPrice, debtMintPrice);
|
82
|
+
const debtAvailable = (0, numberUtils_1.debtLiquidityUsdAvailable)(positionState);
|
83
|
+
const supplyDepositable = (0, numberUtils_1.supplyLiquidityUsdDepositable)(positionState);
|
84
|
+
const sufficientLiquidity = debtAvailable * 0.95 > values.debtAdjustmentUsd &&
|
85
|
+
supplyDepositable * 0.95 > values.debtAdjustmentUsd;
|
86
|
+
if (!sufficientLiquidity) {
|
87
|
+
(0, generalUtils_1.consoleLog)("Insufficient liquidity to further boost");
|
88
|
+
}
|
89
|
+
return sufficientLiquidity;
|
90
|
+
}
|
91
|
+
return true;
|
92
|
+
}
|
76
93
|
function eligibleForRebalance(positionState, positionSettings, positionDca, currentUnixTime, supplyMintPrice, debtMintPrice, bpsDistanceThreshold = 0) {
|
77
94
|
if (!positionSettings) {
|
78
95
|
return undefined;
|
@@ -92,20 +109,8 @@ function eligibleForRebalance(positionState, positionSettings, positionDca, curr
|
|
92
109
|
const repayFrom = positionSettings.repayToBps + positionSettings.repayGap;
|
93
110
|
const boostFrom = boostToBps - positionSettings.boostGap;
|
94
111
|
if (positionState.liqUtilizationRateBps - boostFrom <= bpsDistanceThreshold) {
|
95
|
-
const
|
96
|
-
|
97
|
-
if (limitsUpToDate && positionState.liqUtilizationRateBps < boostFrom) {
|
98
|
-
const values = (0, rebalanceUtils_1.getRebalanceValues)(positionState, positionSettings, positionDca, (0, generalUtils_1.currentUnixSeconds)(), supplyMintPrice, debtMintPrice);
|
99
|
-
const debtAvailable = (0, numberUtils_1.fromBaseUnit)(positionState.debt.amountCanBeUsed.baseAmountUsdValue, constants_1.USD_DECIMALS);
|
100
|
-
const supplyDepositable = (0, numberUtils_1.fromBaseUnit)(positionState.supply.amountCanBeUsed.baseAmountUsdValue, constants_1.USD_DECIMALS);
|
101
|
-
const sufficientLiquidity = debtAvailable * 0.95 > values.debtAdjustmentUsd &&
|
102
|
-
supplyDepositable * 0.95 > values.debtAdjustmentUsd;
|
103
|
-
if (!sufficientLiquidity) {
|
104
|
-
(0, generalUtils_1.consoleLog)("Insufficient liquidity to further boost");
|
105
|
-
}
|
106
|
-
return sufficientLiquidity ? "boost" : undefined;
|
107
|
-
}
|
108
|
-
return "boost";
|
112
|
+
const sufficientLiquidity = sufficientLiquidityToBoost(positionState, positionSettings, positionDca, supplyMintPrice, debtMintPrice);
|
113
|
+
return sufficientLiquidity ? "boost" : undefined;
|
109
114
|
}
|
110
115
|
else if (repayFrom - positionState.liqUtilizationRateBps <=
|
111
116
|
bpsDistanceThreshold) {
|
@@ -277,10 +282,8 @@ async function positionStateWithLatestPrices(state, supplyPrice, debtPrice) {
|
|
277
282
|
(0, umi_web3js_adapters_1.toWeb3JsPublicKey)(state.debt.mint),
|
278
283
|
]);
|
279
284
|
}
|
280
|
-
const supplyUsd = (0, numberUtils_1.
|
281
|
-
|
282
|
-
const debtUsd = (0, numberUtils_1.fromBaseUnit)(state.debt.amountUsed.baseUnit, state.debt.decimals) *
|
283
|
-
debtPrice;
|
285
|
+
const supplyUsd = (0, numberUtils_1.calcTotalSupply)(state) * supplyPrice;
|
286
|
+
const debtUsd = (0, numberUtils_1.calcTotalDebt)(state) * debtPrice;
|
284
287
|
return {
|
285
288
|
...state,
|
286
289
|
liqUtilizationRateBps: (0, numberUtils_1.getLiqUtilzationRateBps)(supplyUsd, debtUsd, state.liqThresholdBps),
|
@@ -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;
|
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;AAiB5E,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,CAqEjB;AA6CD,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,CA8F5C;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,CA4EzB"}
|
@@ -11,7 +11,6 @@ const umi_web3js_adapters_1 = require("@metaplex-foundation/umi-web3js-adapters"
|
|
11
11
|
const jupiterUtils_1 = require("../jupiterUtils");
|
12
12
|
const generalUtils_2 = require("../generalUtils");
|
13
13
|
const numberUtils_1 = require("../numberUtils");
|
14
|
-
const generalAccounts_1 = require("../../constants/generalAccounts");
|
15
14
|
const priceUtils_1 = require("../priceUtils");
|
16
15
|
const constants_1 = require("../../constants");
|
17
16
|
function getAdditionalAmountToDcaIn(dca) {
|
@@ -102,11 +101,8 @@ function getRebalanceValues(state, settings, dca, currentUnixTime, supplyPrice,
|
|
102
101
|
const rebalanceDirection = amountUsdToDcaIn > 0 || state.liqUtilizationRateBps <= targetRateBps
|
103
102
|
? generated_1.RebalanceDirection.Boost
|
104
103
|
: generated_1.RebalanceDirection.Repay;
|
105
|
-
const adjustmentFeeBps = (0, numberUtils_1.getSolautoFeesBps)(false, targetLiqUtilizationRateBps, (0, numberUtils_1.
|
106
|
-
|
107
|
-
amountUsdToDcaIn;
|
108
|
-
const debtUsd = (0, numberUtils_1.fromBaseUnit)(state.debt.amountUsed.baseAmountUsdValue, generalAccounts_1.USD_DECIMALS);
|
109
|
-
let debtAdjustmentUsd = (0, numberUtils_1.getDebtAdjustmentUsd)(state.liqThresholdBps, supplyUsd, debtUsd, targetRateBps, adjustmentFeeBps);
|
104
|
+
const adjustmentFeeBps = (0, numberUtils_1.getSolautoFeesBps)(false, targetLiqUtilizationRateBps, (0, numberUtils_1.calcNetWorthUsd)(state), rebalanceDirection).total;
|
105
|
+
let debtAdjustmentUsd = (0, numberUtils_1.getDebtAdjustmentUsd)(state.liqThresholdBps, (0, numberUtils_1.calcSupplyUsd)(state) + amountUsdToDcaIn, (0, numberUtils_1.calcDebtUsd)(state), targetRateBps, adjustmentFeeBps);
|
110
106
|
(0, generalUtils_2.consoleLog)("Target rate:", targetRateBps, (0, numberUtils_1.maxBoostToBps)(state.maxLtvBps, state.liqThresholdBps));
|
111
107
|
const maxRepayTo = (0, numberUtils_1.maxRepayToBps)(state.maxLtvBps, state.liqThresholdBps);
|
112
108
|
return {
|
@@ -126,9 +122,8 @@ function getRebalanceValues(state, settings, dca, currentUnixTime, supplyPrice,
|
|
126
122
|
};
|
127
123
|
}
|
128
124
|
function postRebalanceLiqUtilizationRateBps(client, values, swapOutputAmount) {
|
129
|
-
let supplyUsd = (0, numberUtils_1.
|
130
|
-
|
131
|
-
let debtUsd = (0, numberUtils_1.fromBaseUnit)(client.solautoPositionState.debt.amountUsed.baseAmountUsdValue, generalAccounts_1.USD_DECIMALS);
|
125
|
+
let supplyUsd = (0, numberUtils_1.calcSupplyUsd)(client.solautoPositionState) + values.amountUsdToDcaIn;
|
126
|
+
let debtUsd = (0, numberUtils_1.calcDebtUsd)(client.solautoPositionState);
|
132
127
|
const boost = values.rebalanceDirection === generated_1.RebalanceDirection.Boost;
|
133
128
|
const outputToken = (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(boost
|
134
129
|
? client.solautoPositionState.supply.mint
|
@@ -148,9 +143,9 @@ function insufficientLiquidity(amountNeededUsd, liquidity, tokenDecimals, tokenP
|
|
148
143
|
return amountNeededUsd > (0, numberUtils_1.fromBaseUnit)(liquidity, tokenDecimals) * tokenPrice;
|
149
144
|
}
|
150
145
|
async function getFlashLoanRequirements(client, values, attemptNum) {
|
151
|
-
let supplyUsd = (0, numberUtils_1.
|
146
|
+
let supplyUsd = (0, numberUtils_1.calcSupplyUsd)(client.solautoPositionState) +
|
152
147
|
(values.dcaTokenType === generated_1.TokenType.Supply ? values.amountUsdToDcaIn : 0);
|
153
|
-
let debtUsd = (0, numberUtils_1.
|
148
|
+
let debtUsd = (0, numberUtils_1.calcDebtUsd)(client.solautoPositionState);
|
154
149
|
const debtAdjustmentUsdAbs = Math.abs(values.debtAdjustmentUsd);
|
155
150
|
supplyUsd =
|
156
151
|
values.rebalanceDirection === generated_1.RebalanceDirection.Repay
|
package/local/logPositions.ts
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
import { publicKey } from "@metaplex-foundation/umi";
|
2
2
|
import {
|
3
3
|
buildHeliusApiUrl,
|
4
|
+
calcNetWorthUsd,
|
5
|
+
calcSupplyUsd,
|
4
6
|
currentUnixSeconds,
|
5
7
|
eligibleForRebalance,
|
6
8
|
fetchTokenPrices,
|
7
|
-
fromBaseUnit,
|
8
9
|
getSolanaRpcConnection,
|
9
10
|
getSolautoManagedPositions,
|
10
11
|
PositionState,
|
@@ -14,7 +15,6 @@ import {
|
|
14
15
|
safeGetPrice,
|
15
16
|
SOLAUTO_PROD_PROGRAM,
|
16
17
|
solautoStrategyName,
|
17
|
-
USD_DECIMALS,
|
18
18
|
} from "../src";
|
19
19
|
import { PublicKey } from "@solana/web3.js";
|
20
20
|
import { toWeb3JsPublicKey } from "@metaplex-foundation/umi-web3js-adapters";
|
@@ -125,11 +125,7 @@ async function main(filterWhitelist: boolean) {
|
|
125
125
|
)
|
126
126
|
)
|
127
127
|
.flat()
|
128
|
-
.sort(
|
129
|
-
(a, b) =>
|
130
|
-
fromBaseUnit(a.state.netWorth.baseAmountUsdValue, USD_DECIMALS) -
|
131
|
-
fromBaseUnit(b.state.netWorth.baseAmountUsdValue, USD_DECIMALS)
|
132
|
-
);
|
128
|
+
.sort((a, b) => calcNetWorthUsd(a.state) - calcNetWorthUsd(b.state));
|
133
129
|
|
134
130
|
const tokensUsed = Array.from(
|
135
131
|
new Set(
|
@@ -198,7 +194,7 @@ async function main(filterWhitelist: boolean) {
|
|
198
194
|
`(${pos.authority.toString()} ${pos.positionId})`
|
199
195
|
);
|
200
196
|
console.log(
|
201
|
-
`${strategy}: $${formatNumber(
|
197
|
+
`${strategy}: $${formatNumber(calcNetWorthUsd(latestState), 2, 10000, 2)} ${healthText} ${boostText}`
|
202
198
|
);
|
203
199
|
}
|
204
200
|
|
@@ -215,12 +211,10 @@ async function main(filterWhitelist: boolean) {
|
|
215
211
|
);
|
216
212
|
|
217
213
|
const tvl = latestStates
|
218
|
-
.map((x) =>
|
219
|
-
fromBaseUnit(x.supply.amountUsed.baseAmountUsdValue, USD_DECIMALS)
|
220
|
-
)
|
214
|
+
.map((x) => calcSupplyUsd(x))
|
221
215
|
.reduce((acc, curr) => acc + curr, 0);
|
222
216
|
const netWorth = latestStates
|
223
|
-
.map((x) =>
|
217
|
+
.map((x) => calcNetWorthUsd(x))
|
224
218
|
.reduce((acc, curr) => acc + curr, 0);
|
225
219
|
|
226
220
|
console.log(`TVL: $${formatNumber(tvl, 2, 10000, 2)}`);
|
package/package.json
CHANGED
@@ -13,6 +13,7 @@ import {
|
|
13
13
|
import { currentUnixSeconds } from "./generalUtils";
|
14
14
|
import {
|
15
15
|
bytesToI80F48,
|
16
|
+
calcNetWorthUsd,
|
16
17
|
fromBaseUnit,
|
17
18
|
getLiqUtilzationRateBps,
|
18
19
|
toBaseUnit,
|
@@ -194,17 +195,7 @@ export async function getAllMarginfiAccountsByAuthority(
|
|
194
195
|
}))
|
195
196
|
);
|
196
197
|
return positionStates
|
197
|
-
.sort(
|
198
|
-
(a, b) =>
|
199
|
-
fromBaseUnit(
|
200
|
-
b.state?.netWorth.baseAmountUsdValue ?? BigInt(0),
|
201
|
-
USD_DECIMALS
|
202
|
-
) -
|
203
|
-
fromBaseUnit(
|
204
|
-
a.state?.netWorth.baseAmountUsdValue ?? BigInt(0),
|
205
|
-
USD_DECIMALS
|
206
|
-
)
|
207
|
-
)
|
198
|
+
.sort((a, b) => calcNetWorthUsd(b.state) - calcNetWorthUsd(a.state))
|
208
199
|
.filter((x) => x.state !== undefined)
|
209
200
|
.map((x) => ({
|
210
201
|
marginfiAccount: toWeb3JsPublicKey(x.publicKey),
|
package/src/utils/numberUtils.ts
CHANGED
@@ -1,5 +1,61 @@
|
|
1
|
-
import { BASIS_POINTS, MIN_REPAY_GAP_BPS } from "../constants";
|
2
|
-
import { RebalanceDirection } from "../generated";
|
1
|
+
import { BASIS_POINTS, MIN_REPAY_GAP_BPS, USD_DECIMALS } from "../constants";
|
2
|
+
import { PositionState, RebalanceDirection } from "../generated";
|
3
|
+
|
4
|
+
export function calcNetWorthUsd(state?: PositionState) {
|
5
|
+
return fromBaseUnit(
|
6
|
+
state?.netWorth.baseAmountUsdValue ?? BigInt(0),
|
7
|
+
USD_DECIMALS
|
8
|
+
);
|
9
|
+
}
|
10
|
+
|
11
|
+
export function calcSupplyUsd(state?: PositionState) {
|
12
|
+
return fromBaseUnit(
|
13
|
+
state?.supply.amountUsed.baseAmountUsdValue ?? BigInt(0),
|
14
|
+
USD_DECIMALS
|
15
|
+
);
|
16
|
+
}
|
17
|
+
|
18
|
+
export function calcDebtUsd(state?: PositionState) {
|
19
|
+
return fromBaseUnit(
|
20
|
+
state?.debt.amountUsed.baseAmountUsdValue ?? BigInt(0),
|
21
|
+
USD_DECIMALS
|
22
|
+
);
|
23
|
+
}
|
24
|
+
|
25
|
+
export function calcNetWorth(state?: PositionState) {
|
26
|
+
return fromBaseUnit(
|
27
|
+
state?.netWorth.baseUnit ?? BigInt(0),
|
28
|
+
state?.supply.decimals ?? 1
|
29
|
+
);
|
30
|
+
}
|
31
|
+
|
32
|
+
export function calcTotalSupply(state?: PositionState) {
|
33
|
+
return fromBaseUnit(
|
34
|
+
state?.supply.amountUsed.baseUnit ?? BigInt(0),
|
35
|
+
state?.supply.decimals ?? 1
|
36
|
+
);
|
37
|
+
}
|
38
|
+
|
39
|
+
export function calcTotalDebt(state?: PositionState) {
|
40
|
+
return fromBaseUnit(
|
41
|
+
state?.debt.amountUsed.baseUnit ?? BigInt(0),
|
42
|
+
state?.debt.decimals ?? 1
|
43
|
+
);
|
44
|
+
}
|
45
|
+
|
46
|
+
export function debtLiquidityUsdAvailable(state?: PositionState) {
|
47
|
+
return fromBaseUnit(
|
48
|
+
state?.debt.amountCanBeUsed.baseAmountUsdValue ?? BigInt(0),
|
49
|
+
USD_DECIMALS
|
50
|
+
);
|
51
|
+
}
|
52
|
+
|
53
|
+
export function supplyLiquidityUsdDepositable(state?: PositionState) {
|
54
|
+
return fromBaseUnit(
|
55
|
+
state?.supply.amountCanBeUsed.baseAmountUsdValue ?? BigInt(0),
|
56
|
+
USD_DECIMALS
|
57
|
+
);
|
58
|
+
}
|
3
59
|
|
4
60
|
export function getLiqUtilzationRateBps(
|
5
61
|
supplyUsd: number,
|
package/src/utils/priceUtils.ts
CHANGED
@@ -165,7 +165,15 @@ export async function getJupTokenPrices(
|
|
165
165
|
|
166
166
|
const data = await getJupPriceData(mints, false, mayIncludeSpamTokens);
|
167
167
|
|
168
|
-
|
168
|
+
const sortedData: { [key: string]: any } = {};
|
169
|
+
for (const mint of mints) {
|
170
|
+
const key = mint.toString();
|
171
|
+
if (data.hasOwnProperty(key)) {
|
172
|
+
sortedData[key] = data[key];
|
173
|
+
}
|
174
|
+
}
|
175
|
+
|
176
|
+
return Object.values(sortedData).map((x) =>
|
169
177
|
x !== null && typeof x === "object" && "price" in x
|
170
178
|
? parseFloat(x.price as string)
|
171
179
|
: 0
|
@@ -24,8 +24,12 @@ import {
|
|
24
24
|
} from "../../generated";
|
25
25
|
import { consoleLog, currentUnixSeconds } from "../generalUtils";
|
26
26
|
import {
|
27
|
+
calcTotalDebt,
|
28
|
+
calcTotalSupply,
|
29
|
+
debtLiquidityUsdAvailable,
|
27
30
|
fromBaseUnit,
|
28
31
|
getLiqUtilzationRateBps,
|
32
|
+
supplyLiquidityUsdDepositable,
|
29
33
|
toBaseUnit,
|
30
34
|
} from "../numberUtils";
|
31
35
|
import { getReferralState } from "../accountUtils";
|
@@ -128,6 +132,42 @@ export function getAdjustedSettingsFromAutomation(
|
|
128
132
|
};
|
129
133
|
}
|
130
134
|
|
135
|
+
export function sufficientLiquidityToBoost(
|
136
|
+
positionState: PositionState,
|
137
|
+
positionSettings: SolautoSettingsParameters | undefined,
|
138
|
+
positionDca: DCASettings | undefined,
|
139
|
+
supplyMintPrice: number,
|
140
|
+
debtMintPrice: number
|
141
|
+
) {
|
142
|
+
const limitsUpToDate =
|
143
|
+
positionState.supply.amountCanBeUsed.baseUnit > BigInt(0) ||
|
144
|
+
positionState.debt.amountCanBeUsed.baseUnit > BigInt(0);
|
145
|
+
|
146
|
+
if (limitsUpToDate) {
|
147
|
+
const values = getRebalanceValues(
|
148
|
+
positionState!,
|
149
|
+
positionSettings,
|
150
|
+
positionDca,
|
151
|
+
currentUnixSeconds(),
|
152
|
+
supplyMintPrice,
|
153
|
+
debtMintPrice
|
154
|
+
);
|
155
|
+
|
156
|
+
const debtAvailable = debtLiquidityUsdAvailable(positionState);
|
157
|
+
const supplyDepositable = supplyLiquidityUsdDepositable(positionState);
|
158
|
+
const sufficientLiquidity =
|
159
|
+
debtAvailable * 0.95 > values.debtAdjustmentUsd &&
|
160
|
+
supplyDepositable * 0.95 > values.debtAdjustmentUsd;
|
161
|
+
|
162
|
+
if (!sufficientLiquidity) {
|
163
|
+
consoleLog("Insufficient liquidity to further boost");
|
164
|
+
}
|
165
|
+
return sufficientLiquidity;
|
166
|
+
}
|
167
|
+
|
168
|
+
return true;
|
169
|
+
}
|
170
|
+
|
131
171
|
export function eligibleForRebalance(
|
132
172
|
positionState: PositionState,
|
133
173
|
positionSettings: SolautoSettingsParameters | undefined,
|
@@ -167,39 +207,14 @@ export function eligibleForRebalance(
|
|
167
207
|
const boostFrom = boostToBps - positionSettings.boostGap;
|
168
208
|
|
169
209
|
if (positionState.liqUtilizationRateBps - boostFrom <= bpsDistanceThreshold) {
|
170
|
-
const
|
171
|
-
positionState
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
positionDca,
|
179
|
-
currentUnixSeconds(),
|
180
|
-
supplyMintPrice,
|
181
|
-
debtMintPrice
|
182
|
-
);
|
183
|
-
|
184
|
-
const debtAvailable = fromBaseUnit(
|
185
|
-
positionState.debt.amountCanBeUsed.baseAmountUsdValue,
|
186
|
-
USD_DECIMALS
|
187
|
-
);
|
188
|
-
const supplyDepositable = fromBaseUnit(
|
189
|
-
positionState.supply.amountCanBeUsed.baseAmountUsdValue,
|
190
|
-
USD_DECIMALS
|
191
|
-
);
|
192
|
-
const sufficientLiquidity =
|
193
|
-
debtAvailable * 0.95 > values.debtAdjustmentUsd &&
|
194
|
-
supplyDepositable * 0.95 > values.debtAdjustmentUsd;
|
195
|
-
|
196
|
-
if (!sufficientLiquidity) {
|
197
|
-
consoleLog("Insufficient liquidity to further boost");
|
198
|
-
}
|
199
|
-
return sufficientLiquidity ? "boost" : undefined;
|
200
|
-
}
|
201
|
-
|
202
|
-
return "boost";
|
210
|
+
const sufficientLiquidity = sufficientLiquidityToBoost(
|
211
|
+
positionState,
|
212
|
+
positionSettings,
|
213
|
+
positionDca,
|
214
|
+
supplyMintPrice,
|
215
|
+
debtMintPrice
|
216
|
+
);
|
217
|
+
return sufficientLiquidity ? "boost" : undefined;
|
203
218
|
} else if (
|
204
219
|
repayFrom - positionState.liqUtilizationRateBps <=
|
205
220
|
bpsDistanceThreshold
|
@@ -440,12 +455,8 @@ export async function positionStateWithLatestPrices(
|
|
440
455
|
]);
|
441
456
|
}
|
442
457
|
|
443
|
-
const supplyUsd =
|
444
|
-
|
445
|
-
supplyPrice;
|
446
|
-
const debtUsd =
|
447
|
-
fromBaseUnit(state.debt.amountUsed.baseUnit, state.debt.decimals) *
|
448
|
-
debtPrice;
|
458
|
+
const supplyUsd = calcTotalSupply(state) * supplyPrice;
|
459
|
+
const debtUsd = calcTotalDebt(state) * debtPrice;
|
449
460
|
return {
|
450
461
|
...state,
|
451
462
|
liqUtilizationRateBps: getLiqUtilzationRateBps(
|
@@ -18,6 +18,9 @@ import { QuoteResponse } from "@jup-ag/api";
|
|
18
18
|
import { getJupQuote, JupSwapDetails, JupSwapInput } from "../jupiterUtils";
|
19
19
|
import { consoleLog, currentUnixSeconds, tokenInfo } from "../generalUtils";
|
20
20
|
import {
|
21
|
+
calcDebtUsd,
|
22
|
+
calcNetWorthUsd,
|
23
|
+
calcSupplyUsd,
|
21
24
|
fromBaseUnit,
|
22
25
|
fromBps,
|
23
26
|
getDebtAdjustmentUsd,
|
@@ -216,21 +219,14 @@ export function getRebalanceValues(
|
|
216
219
|
const adjustmentFeeBps = getSolautoFeesBps(
|
217
220
|
false,
|
218
221
|
targetLiqUtilizationRateBps,
|
219
|
-
|
222
|
+
calcNetWorthUsd(state),
|
220
223
|
rebalanceDirection
|
221
224
|
).total;
|
222
225
|
|
223
|
-
const supplyUsd =
|
224
|
-
fromBaseUnit(state.supply.amountUsed.baseAmountUsdValue, USD_DECIMALS) +
|
225
|
-
amountUsdToDcaIn;
|
226
|
-
const debtUsd = fromBaseUnit(
|
227
|
-
state.debt.amountUsed.baseAmountUsdValue,
|
228
|
-
USD_DECIMALS
|
229
|
-
);
|
230
226
|
let debtAdjustmentUsd = getDebtAdjustmentUsd(
|
231
227
|
state.liqThresholdBps,
|
232
|
-
|
233
|
-
|
228
|
+
calcSupplyUsd(state) + amountUsdToDcaIn,
|
229
|
+
calcDebtUsd(state),
|
234
230
|
targetRateBps,
|
235
231
|
adjustmentFeeBps
|
236
232
|
);
|
@@ -266,15 +262,8 @@ function postRebalanceLiqUtilizationRateBps(
|
|
266
262
|
swapOutputAmount?: bigint
|
267
263
|
) {
|
268
264
|
let supplyUsd =
|
269
|
-
|
270
|
-
|
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
|
-
);
|
265
|
+
calcSupplyUsd(client.solautoPositionState) + values.amountUsdToDcaIn;
|
266
|
+
let debtUsd = calcDebtUsd(client.solautoPositionState);
|
278
267
|
|
279
268
|
const boost = values.rebalanceDirection === RebalanceDirection.Boost;
|
280
269
|
|
@@ -321,15 +310,9 @@ export async function getFlashLoanRequirements(
|
|
321
310
|
attemptNum?: number
|
322
311
|
): Promise<FlashLoanRequirements | undefined> {
|
323
312
|
let supplyUsd =
|
324
|
-
|
325
|
-
client.solautoPositionState!.supply.amountUsed.baseAmountUsdValue,
|
326
|
-
USD_DECIMALS
|
327
|
-
) +
|
313
|
+
calcSupplyUsd(client.solautoPositionState) +
|
328
314
|
(values.dcaTokenType === TokenType.Supply ? values.amountUsdToDcaIn : 0);
|
329
|
-
let debtUsd =
|
330
|
-
client.solautoPositionState!.debt.amountUsed.baseAmountUsdValue,
|
331
|
-
USD_DECIMALS
|
332
|
-
);
|
315
|
+
let debtUsd = calcDebtUsd(client.solautoPositionState);
|
333
316
|
|
334
317
|
const debtAdjustmentUsdAbs = Math.abs(values.debtAdjustmentUsd);
|
335
318
|
supplyUsd =
|
@@ -17,6 +17,9 @@ import {
|
|
17
17
|
TokenType,
|
18
18
|
} from "../../src/generated";
|
19
19
|
import {
|
20
|
+
calcDebtUsd,
|
21
|
+
calcNetWorthUsd,
|
22
|
+
calcSupplyUsd,
|
20
23
|
fromBaseUnit,
|
21
24
|
fromBps,
|
22
25
|
getLiqUtilzationRateBps,
|
@@ -66,10 +69,7 @@ function assertAccurateRebalance(
|
|
66
69
|
adjustmentFeeBps = getSolautoFeesBps(
|
67
70
|
client.referredBy !== undefined,
|
68
71
|
targetLiqUtilizationRateBps,
|
69
|
-
|
70
|
-
client.solautoPositionState?.netWorth.baseAmountUsdValue ?? BigInt(0),
|
71
|
-
USD_DECIMALS
|
72
|
-
),
|
72
|
+
calcNetWorthUsd(client.solautoPositionState),
|
73
73
|
rebalanceDirection
|
74
74
|
).total;
|
75
75
|
|
@@ -81,17 +81,10 @@ function assertAccurateRebalance(
|
|
81
81
|
);
|
82
82
|
|
83
83
|
const newSupply =
|
84
|
-
|
85
|
-
client.solautoPositionState!.supply.amountUsed.baseAmountUsdValue,
|
86
|
-
USD_DECIMALS
|
87
|
-
) +
|
84
|
+
calcSupplyUsd(client.solautoPositionState) +
|
88
85
|
(debtAdjustmentUsd - debtAdjustmentUsd * fromBps(adjustmentFeeBps)) +
|
89
86
|
amountUsdToDcaIn;
|
90
|
-
const newDebt =
|
91
|
-
fromBaseUnit(
|
92
|
-
client.solautoPositionState!.debt.amountUsed.baseAmountUsdValue,
|
93
|
-
USD_DECIMALS
|
94
|
-
) + debtAdjustmentUsd;
|
87
|
+
const newDebt = calcDebtUsd(client.solautoPositionState) + debtAdjustmentUsd;
|
95
88
|
|
96
89
|
const newLiqUtilizationRateBps = getLiqUtilzationRateBps(
|
97
90
|
newSupply,
|