@haven-fi/solauto-sdk 1.0.536 → 1.0.538
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 +0 -1
- package/dist/utils/solauto/generalUtils.d.ts.map +1 -1
- package/dist/utils/solauto/generalUtils.js +4 -6
- package/dist/utils/solauto/rebalanceUtils.d.ts.map +1 -1
- package/dist/utils/solauto/rebalanceUtils.js +11 -14
- 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 +0 -1
- package/src/utils/solauto/generalUtils.ts +8 -14
- package/src/utils/solauto/rebalanceUtils.ts +16 -30
- package/tests/transactions/solautoMarginfi.ts +20 -52
- 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,
|
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,qBAa/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
@@ -45,7 +45,6 @@ async function fetchTokenPrices(mints) {
|
|
45
45
|
const pythMints = mints.filter((x) => x.toString() in pythConstants_1.PYTH_PRICE_FEED_IDS);
|
46
46
|
const switchboardMints = mints.filter((x) => x.toString() in switchboardConstants_1.SWITCHBOARD_PRICE_FEED_IDS);
|
47
47
|
const otherMints = mints.filter((x) => !pythMints.includes(x) && !switchboardMints.includes(x));
|
48
|
-
console.log(mints.length, otherMints.length);
|
49
48
|
const [pythData, switchboardData, jupData] = await Promise.all([
|
50
49
|
(0, generalUtils_1.zip)(pythMints, await getPythPrices(pythMints)),
|
51
50
|
(0, generalUtils_1.zip)(switchboardMints, await getSwitchboardPrices(switchboardMints)),
|
@@ -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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"}
|
@@ -96,8 +96,8 @@ function eligibleForRebalance(positionState, positionSettings, positionDca, curr
|
|
96
96
|
positionState.debt.amountCanBeUsed.baseUnit > BigInt(0);
|
97
97
|
if (limitsUpToDate && positionState.liqUtilizationRateBps < boostFrom) {
|
98
98
|
const values = (0, rebalanceUtils_1.getRebalanceValues)(positionState, positionSettings, positionDca, (0, generalUtils_1.currentUnixSeconds)(), supplyMintPrice, debtMintPrice);
|
99
|
-
const debtAvailable = (0, numberUtils_1.
|
100
|
-
const supplyDepositable = (0, numberUtils_1.
|
99
|
+
const debtAvailable = (0, numberUtils_1.debtLiquidityUsdAvailable)(positionState);
|
100
|
+
const supplyDepositable = (0, numberUtils_1.supplyLiquidityUsdDepositable)(positionState);
|
101
101
|
const sufficientLiquidity = debtAvailable * 0.95 > values.debtAdjustmentUsd &&
|
102
102
|
supplyDepositable * 0.95 > values.debtAdjustmentUsd;
|
103
103
|
if (!sufficientLiquidity) {
|
@@ -277,10 +277,8 @@ async function positionStateWithLatestPrices(state, supplyPrice, debtPrice) {
|
|
277
277
|
(0, umi_web3js_adapters_1.toWeb3JsPublicKey)(state.debt.mint),
|
278
278
|
]);
|
279
279
|
}
|
280
|
-
const supplyUsd = (0, numberUtils_1.
|
281
|
-
|
282
|
-
const debtUsd = (0, numberUtils_1.fromBaseUnit)(state.debt.amountUsed.baseUnit, state.debt.decimals) *
|
283
|
-
debtPrice;
|
280
|
+
const supplyUsd = (0, numberUtils_1.calcTotalSupply)(state) * supplyPrice;
|
281
|
+
const debtUsd = (0, numberUtils_1.calcTotalDebt)(state) * debtPrice;
|
284
282
|
return {
|
285
283
|
...state,
|
286
284
|
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
|
@@ -179,7 +174,9 @@ async function getFlashLoanRequirements(client, values, attemptNum) {
|
|
179
174
|
signerFlashLoan =
|
180
175
|
sufficientSignerSupplyLiquidity || sufficientSignerDebtLiquidity;
|
181
176
|
if (signerFlashLoan) {
|
182
|
-
useDebtLiquidity =
|
177
|
+
useDebtLiquidity =
|
178
|
+
values.rebalanceDirection === generated_1.RebalanceDirection.Boost ||
|
179
|
+
!sufficientSignerSupplyLiquidity;
|
183
180
|
}
|
184
181
|
else {
|
185
182
|
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`);
|
@@ -249,7 +246,7 @@ async function getJupSwapRebalanceDetails(client, values, flRequirements, target
|
|
249
246
|
const usdToSwap = Math.abs(values.debtAdjustmentUsd) +
|
250
247
|
(values.dcaTokenType === generated_1.TokenType.Debt ? values.amountUsdToDcaIn : 0);
|
251
248
|
let inputAmount = (0, numberUtils_1.toBaseUnit)(usdToSwap / (0, priceUtils_1.safeGetPrice)(input.mint), input.decimals);
|
252
|
-
|
249
|
+
let outputAmount = rebalanceToZero
|
253
250
|
? output.amountUsed.baseUnit +
|
254
251
|
BigInt(Math.round(Number(output.amountUsed.baseUnit) *
|
255
252
|
// Add this small percentage to account for the APR on the debt between now and the transaction
|
@@ -260,7 +257,7 @@ async function getJupSwapRebalanceDetails(client, values, flRequirements, target
|
|
260
257
|
const exactOut = flashLoanRepayFromDebt && !rebalanceToZero;
|
261
258
|
// || rebalanceToZero
|
262
259
|
const exactIn = !exactOut;
|
263
|
-
if (exactIn && rebalanceToZero) {
|
260
|
+
if (exactIn && (rebalanceToZero || values.repayingCloseToMaxLtv)) {
|
264
261
|
inputAmount = inputAmount + BigInt(Math.round(Number(inputAmount) * 0.005));
|
265
262
|
}
|
266
263
|
const jupSwapInput = {
|
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
@@ -33,7 +33,6 @@ export async function fetchTokenPrices(mints: PublicKey[]): Promise<number[]> {
|
|
33
33
|
const otherMints = mints.filter(
|
34
34
|
(x) => !pythMints.includes(x) && !switchboardMints.includes(x)
|
35
35
|
);
|
36
|
-
console.log(mints.length, otherMints.length);
|
37
36
|
|
38
37
|
const [pythData, switchboardData, jupData] = await Promise.all([
|
39
38
|
zip(pythMints, await getPythPrices(pythMints)),
|
@@ -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";
|
@@ -181,14 +185,8 @@ export function eligibleForRebalance(
|
|
181
185
|
debtMintPrice
|
182
186
|
);
|
183
187
|
|
184
|
-
const debtAvailable =
|
185
|
-
|
186
|
-
USD_DECIMALS
|
187
|
-
);
|
188
|
-
const supplyDepositable = fromBaseUnit(
|
189
|
-
positionState.supply.amountCanBeUsed.baseAmountUsdValue,
|
190
|
-
USD_DECIMALS
|
191
|
-
);
|
188
|
+
const debtAvailable = debtLiquidityUsdAvailable(positionState);
|
189
|
+
const supplyDepositable = supplyLiquidityUsdDepositable(positionState);
|
192
190
|
const sufficientLiquidity =
|
193
191
|
debtAvailable * 0.95 > values.debtAdjustmentUsd &&
|
194
192
|
supplyDepositable * 0.95 > values.debtAdjustmentUsd;
|
@@ -440,12 +438,8 @@ export async function positionStateWithLatestPrices(
|
|
440
438
|
]);
|
441
439
|
}
|
442
440
|
|
443
|
-
const supplyUsd =
|
444
|
-
|
445
|
-
supplyPrice;
|
446
|
-
const debtUsd =
|
447
|
-
fromBaseUnit(state.debt.amountUsed.baseUnit, state.debt.decimals) *
|
448
|
-
debtPrice;
|
441
|
+
const supplyUsd = calcTotalSupply(state) * supplyPrice;
|
442
|
+
const debtUsd = calcTotalDebt(state) * debtPrice;
|
449
443
|
return {
|
450
444
|
...state,
|
451
445
|
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 =
|
@@ -397,7 +380,9 @@ export async function getFlashLoanRequirements(
|
|
397
380
|
signerFlashLoan =
|
398
381
|
sufficientSignerSupplyLiquidity || sufficientSignerDebtLiquidity;
|
399
382
|
if (signerFlashLoan) {
|
400
|
-
useDebtLiquidity =
|
383
|
+
useDebtLiquidity =
|
384
|
+
values.rebalanceDirection === RebalanceDirection.Boost ||
|
385
|
+
!sufficientSignerSupplyLiquidity;
|
401
386
|
} else {
|
402
387
|
throw new Error(
|
403
388
|
`Need at least ${values.debtAdjustmentUsd / debtPrice} ${tokenInfo(client.debtMint).ticker} or ${values.debtAdjustmentUsd / supplyPrice} ${tokenInfo(client.supplyMint).ticker} to perform the transaction`
|
@@ -525,7 +510,7 @@ export async function getJupSwapRebalanceDetails(
|
|
525
510
|
usdToSwap / safeGetPrice(input.mint)!,
|
526
511
|
input.decimals
|
527
512
|
);
|
528
|
-
|
513
|
+
let outputAmount = rebalanceToZero
|
529
514
|
? output.amountUsed.baseUnit +
|
530
515
|
BigInt(
|
531
516
|
Math.round(
|
@@ -545,9 +530,10 @@ export async function getJupSwapRebalanceDetails(
|
|
545
530
|
// || rebalanceToZero
|
546
531
|
const exactIn = !exactOut;
|
547
532
|
|
548
|
-
if (exactIn && rebalanceToZero) {
|
533
|
+
if (exactIn && (rebalanceToZero || values.repayingCloseToMaxLtv)) {
|
549
534
|
inputAmount = inputAmount + BigInt(Math.round(Number(inputAmount) * 0.005));
|
550
535
|
}
|
536
|
+
|
551
537
|
const jupSwapInput: JupSwapInput = {
|
552
538
|
inputMint: toWeb3JsPublicKey(input.mint),
|
553
539
|
outputMint: toWeb3JsPublicKey(output.mint),
|
@@ -18,7 +18,7 @@ import {
|
|
18
18
|
maxRepayToBps,
|
19
19
|
toBaseUnit,
|
20
20
|
} from "../../src/utils/numberUtils";
|
21
|
-
import { NATIVE_MINT
|
21
|
+
import { NATIVE_MINT } from "@solana/spl-token";
|
22
22
|
import {
|
23
23
|
TransactionItem,
|
24
24
|
TransactionsManager,
|
@@ -34,34 +34,22 @@ import {
|
|
34
34
|
} from "../../src/constants";
|
35
35
|
import {
|
36
36
|
buildHeliusApiUrl,
|
37
|
-
fetchTokenPrices,
|
38
37
|
getAllPositionsByAuthority,
|
39
38
|
getQnComputeUnitPriceEstimate,
|
40
39
|
getSolautoManagedPositions,
|
41
40
|
getSolautoPositionAccount,
|
42
|
-
getTokenAccount,
|
43
41
|
retryWithExponentialBackoff,
|
44
42
|
} from "../../src/utils";
|
45
43
|
import { PriorityFeeSetting } from "../../src/types";
|
46
|
-
import {
|
47
|
-
ALL_SUPPORTED_TOKENS,
|
48
|
-
buildIronforgeApiUrl,
|
49
|
-
fromBaseUnit,
|
50
|
-
tokenInfo,
|
51
|
-
USD_DECIMALS,
|
52
|
-
} from "../../dist";
|
53
|
-
import {
|
54
|
-
RawAccount as TokenAccountData,
|
55
|
-
AccountLayout as SplTokenAccountLayout,
|
56
|
-
} from "@solana/spl-token";
|
44
|
+
import { buildIronforgeApiUrl, fromBaseUnit, tokenInfo, USD_DECIMALS } from "../../dist";
|
57
45
|
|
58
46
|
describe("Solauto Marginfi tests", async () => {
|
59
|
-
const signer = setupTest();
|
60
|
-
|
47
|
+
// const signer = setupTest();
|
48
|
+
const signer = setupTest("solauto-manager");
|
61
49
|
|
62
|
-
const payForTransactions =
|
63
|
-
const testProgram =
|
64
|
-
const positionId =
|
50
|
+
const payForTransactions = true;
|
51
|
+
const testProgram = false;
|
52
|
+
const positionId = 3;
|
65
53
|
|
66
54
|
it("open - deposit - borrow - rebalance to 0 - withdraw - close", async () => {
|
67
55
|
const client = new SolautoMarginfiClient(
|
@@ -74,38 +62,18 @@ describe("Solauto Marginfi tests", async () => {
|
|
74
62
|
const supplyDecimals = 6;
|
75
63
|
const debtDecimals = 6;
|
76
64
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
const tokenAccounts = (
|
91
|
-
await client.connection.getTokenAccountsByOwner(
|
92
|
-
new PublicKey("He4ka5Q3N1UvZikZvykdi47xyk5PoVP2tcQL5sVp31Sz"),
|
93
|
-
{ programId: TOKEN_PROGRAM_ID },
|
94
|
-
{ commitment: "confirmed" }
|
95
|
-
)
|
96
|
-
).value;
|
97
|
-
|
98
|
-
const tokenAccountsData = tokenAccounts
|
99
|
-
.map(
|
100
|
-
(x) => SplTokenAccountLayout.decode(x.account.data) as TokenAccountData
|
101
|
-
)
|
102
|
-
.filter((x) => Boolean(x));
|
103
|
-
|
104
|
-
console.log(tokenAccountsData);
|
105
|
-
console.log(tokenAccountsData.length);
|
106
|
-
|
107
|
-
console.log(await fetchTokenPrices(tokenAccountsData.map((x) => x.mint)));
|
108
|
-
return;
|
65
|
+
await client.initialize({
|
66
|
+
signer,
|
67
|
+
positionId,
|
68
|
+
authority: new PublicKey("EBhRj7jbF2EVE21i19JSuCX1BAbnZFYhoKW64HnaZ3kf"),
|
69
|
+
// new: true,
|
70
|
+
// marginfiAccount: new PublicKey(
|
71
|
+
// ""
|
72
|
+
// ),
|
73
|
+
// marginfiGroup: new PublicKey(""),
|
74
|
+
// supplyMint: new PublicKey(""),
|
75
|
+
// debtMint: new PublicKey(USDC),
|
76
|
+
});
|
109
77
|
|
110
78
|
const transactionItems: TransactionItem[] = [];
|
111
79
|
// const settingParams: SolautoSettingsParametersInpArgs = {
|
@@ -177,7 +145,7 @@ describe("Solauto Marginfi tests", async () => {
|
|
177
145
|
transactionItems.push(
|
178
146
|
new TransactionItem(
|
179
147
|
async (attemptNum) =>
|
180
|
-
await buildSolautoRebalanceTransaction(client,
|
148
|
+
await buildSolautoRebalanceTransaction(client, undefined, attemptNum),
|
181
149
|
"rebalance"
|
182
150
|
)
|
183
151
|
);
|
@@ -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,
|