@haven-fi/solauto-sdk 1.0.606 → 1.0.608
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/solautoPosition/marginfiSolautoPositionEx.js +2 -2
- package/dist/solautoPosition/solautoPositionEx.d.ts +3 -0
- package/dist/solautoPosition/solautoPositionEx.d.ts.map +1 -1
- package/dist/solautoPosition/solautoPositionEx.js +21 -11
- package/dist/utils/marginfiUtils.d.ts +2 -2
- package/dist/utils/marginfiUtils.d.ts.map +1 -1
- package/dist/utils/marginfiUtils.js +11 -11
- package/dist/utils/numberUtils.d.ts +3 -1
- package/dist/utils/numberUtils.d.ts.map +1 -1
- package/dist/utils/numberUtils.js +7 -2
- package/package.json +1 -1
- package/src/solautoPosition/marginfiSolautoPositionEx.ts +3 -3
- package/src/solautoPosition/solautoPositionEx.ts +32 -26
- package/src/utils/marginfiUtils.ts +9 -9
- package/src/utils/numberUtils.ts +11 -2
@@ -41,8 +41,8 @@ class MarginfiSolautoPositionEx extends solautoPositionEx_1.SolautoPositionEx {
|
|
41
41
|
]);
|
42
42
|
}
|
43
43
|
const [supplyPrice] = await (0, utils_1.fetchTokenPrices)([this.supplyMint()]);
|
44
|
-
const [
|
45
|
-
return [
|
44
|
+
const [maxLtvBps, liqThresholdBps] = (0, utils_1.calcMarginfiMaxLtvAndLiqThresholdBps)(this.supplyBank, this.debtBank, supplyPrice);
|
45
|
+
return [maxLtvBps, liqThresholdBps];
|
46
46
|
}
|
47
47
|
supplyLiquidityAvailable() {
|
48
48
|
return (0, utils_1.getBankLiquidityAvailableBaseUnit)(this.supplyBank, false);
|
@@ -67,6 +67,9 @@ export declare abstract class SolautoPositionEx {
|
|
67
67
|
utilizationRateBpsDrift(): Promise<number>;
|
68
68
|
updateWithLatestPrices(supplyPrice?: number, debtPrice?: number): Promise<void>;
|
69
69
|
refetchPositionData(): Promise<void>;
|
70
|
+
updateNetWorth(supplyPrice: number, debtPrice: number): void;
|
71
|
+
updateSupply(newSupplyUsd: number, supplyPrice: number): void;
|
72
|
+
updateDebt(newDebtUsd: number, debtPrice: number): void;
|
70
73
|
simulateRebalance(unixTime: number, supplyPrice: number, debtPrice: number, targetLiqUtilizationRateBps?: number): void;
|
71
74
|
}
|
72
75
|
export {};
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"solautoPositionEx.d.ts","sourceRoot":"","sources":["../../src/solautoPosition/solautoPositionEx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACL,WAAW,EAEX,eAAe,EACf,aAAa,EACb,eAAe,EACf,yBAAyB,EAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAQL,cAAc,EAYf,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAM3C,OAAO,EAAqC,SAAS,EAAE,MAAM,cAAc,CAAC;AAM5E,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,eAAe,CAAC;IACjC,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,aAAa,CAAC,EAAE,SAAS,CAAC;CAC3B;AAED,UAAU,qBAAsB,SAAQ,OAAO,CAAC,eAAe,CAAC;IAC9D,KAAK,EAAE,aAAa,CAAC;CACtB;AAED,UAAU,cAAc;IACtB,GAAG,EAAE,GAAG,CAAC;IACT,SAAS,EAAE,SAAS,CAAC;IACrB,IAAI,EAAE,qBAAqB,CAAC;IAC5B,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED,8BAAsB,iBAAiB;IAC9B,GAAG,EAAG,GAAG,CAAC;IACV,SAAS,EAAG,SAAS,CAAC;IAC7B,SAAS,CAAC,KAAK,EAAG,qBAAqB,CAAC;IACxC,SAAS,CAAC,EAAE,CAAC,EAAE,SAAS,CAAa;IAC9B,aAAa,CAAC,EAAE,SAAS,CAAa;IAC7C,SAAS,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;IAE1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;gBAEhC,IAAI,EAAE,cAAc;IAgBhC,QAAQ,CAAC,WAAW,IAAI,OAAO,CAAC,SAAS,CAAC;IAE1C,MAAM;IAIN,SAAS;IAMT,UAAU;IAIV,YAAY;IAOZ,IAAI,IAAI,qBAAqB;IAI7B,KAAK,IAAI,aAAa;IAItB,QAAQ,IAAI,yBAAyB,GAAG,SAAS;IAIjD,GAAG,IAAI,WAAW,GAAG,SAAS;IAI9B,UAAU,IAAI,SAAS;IAIvB,cAAc,IAAI,SAAS;IAI3B,QAAQ,IAAI,SAAS;IAIrB,YAAY,IAAI,SAAS;IAIzB,UAAU;IAOV,YAAY;IAIZ,UAAU;IAOV,YAAY;IAMZ,QAAQ;IAIR,WAAW;IAIX,WAAW;IAIX,SAAS;IAIT,SAAS;IAIT,OAAO;IAIP,6BAA6B;IAI7B,yBAAyB;IAIzB,QAAQ,CAAC,wBAAwB,IAAI,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9D,QAAQ,CAAC,0BAA0B,IAAI,MAAM;IAC7C,QAAQ,CAAC,wBAAwB,IAAI,MAAM;IAC3C,QAAQ,CAAC,sBAAsB,IAAI,MAAM;IAEzC,0BAA0B;IA0B1B,oBAAoB,CAAC,oBAAoB,SAAI,GAAG,eAAe,GAAG,SAAS;IAqB3E,kBAAkB,IAAI,OAAO;IAS7B,SAAS,CAAC,uBAAuB;IAWjC,QAAQ,CAAC,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAExC,uBAAuB;IAiBvB,sBAAsB,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;IAQ/D,mBAAmB;IAOzB,iBAAiB,CACf,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,2BAA2B,CAAC,EAAE,MAAM;
|
1
|
+
{"version":3,"file":"solautoPositionEx.d.ts","sourceRoot":"","sources":["../../src/solautoPosition/solautoPositionEx.ts"],"names":[],"mappings":"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"}
|
@@ -100,7 +100,8 @@ class SolautoPositionEx {
|
|
100
100
|
const limitsUpToDate = this.debtLiquidityUsdAvailable() !== 0 ||
|
101
101
|
this.supplyLiquidityUsdDepositable() !== 0;
|
102
102
|
if (limitsUpToDate) {
|
103
|
-
const { debtAdjustmentUsd } = (0, rebalance_1.getDebtAdjustment)(this.state().liqThresholdBps, { supplyUsd: this.supplyUsd(), debtUsd: this.debtUsd() }, this.boostToBps(), { solauto: 50, lpBorrow: 50, flashLoan: 50 }
|
103
|
+
const { debtAdjustmentUsd } = (0, rebalance_1.getDebtAdjustment)(this.state().liqThresholdBps, { supplyUsd: this.supplyUsd(), debtUsd: this.debtUsd() }, this.boostToBps(), { solauto: 50, lpBorrow: 50, flashLoan: 50 } // TODO: get true data here instead of magic numbers
|
104
|
+
);
|
104
105
|
const sufficientLiquidity = this.debtLiquidityUsdAvailable() * 0.95 > debtAdjustmentUsd &&
|
105
106
|
this.supplyLiquidityUsdDepositable() * 0.95 > debtAdjustmentUsd;
|
106
107
|
if (!sufficientLiquidity) {
|
@@ -152,19 +153,28 @@ class SolautoPositionEx {
|
|
152
153
|
async refetchPositionData() {
|
153
154
|
this._data = await (0, generated_1.fetchSolautoPosition)(this.umi, (0, umi_web3js_adapters_1.fromWeb3JsPublicKey)(this.publicKey));
|
154
155
|
}
|
155
|
-
|
156
|
-
this.
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
this._data.state.debt.amountUsed.baseUnit = (0, utils_1.toBaseUnit)(newDebtUsd / debtPrice, this.debtMintInfo().decimals);
|
156
|
+
updateNetWorth(supplyPrice, debtPrice) {
|
157
|
+
const netWorthUsd = this.supplyUsd() - this.debtUsd();
|
158
|
+
this._data.state.netWorth.baseAmountUsdValue =
|
159
|
+
(0, utils_1.toRoundedUsdValue)(netWorthUsd);
|
160
|
+
this._data.state.netWorth.baseUnit = (0, utils_1.toBaseUnit)(netWorthUsd / supplyPrice, this.supplyMintInfo().decimals);
|
161
|
+
}
|
162
|
+
updateSupply(newSupplyUsd, supplyPrice) {
|
163
163
|
this._data.state.supply.amountUsed.baseAmountUsdValue =
|
164
164
|
(0, utils_1.toRoundedUsdValue)(newSupplyUsd);
|
165
165
|
this._data.state.supply.amountUsed.baseUnit = (0, utils_1.toBaseUnit)(newSupplyUsd / supplyPrice, this.supplyMintInfo().decimals);
|
166
|
-
|
167
|
-
|
166
|
+
}
|
167
|
+
updateDebt(newDebtUsd, debtPrice) {
|
168
|
+
this._data.state.debt.amountUsed.baseAmountUsdValue =
|
169
|
+
(0, utils_1.toRoundedUsdValue)(newDebtUsd);
|
170
|
+
this._data.state.debt.amountUsed.baseUnit = (0, utils_1.toBaseUnit)(newDebtUsd / debtPrice, this.debtMintInfo().decimals);
|
171
|
+
}
|
172
|
+
simulateRebalance(unixTime, supplyPrice, debtPrice, targetLiqUtilizationRateBps) {
|
173
|
+
this._data.state.lastRefreshed = BigInt(unixTime);
|
174
|
+
const rebalance = (0, rebalance_1.getRebalanceValues)(this, targetLiqUtilizationRateBps, rebalance_1.SolautoFeesBps.create(true, targetLiqUtilizationRateBps, this.netWorthUsd()));
|
175
|
+
this.updateSupply(rebalance.endResult.supplyUsd, supplyPrice);
|
176
|
+
this.updateDebt(rebalance.endResult.debtUsd, debtPrice);
|
177
|
+
this.updateNetWorth(supplyPrice, debtPrice);
|
168
178
|
}
|
169
179
|
}
|
170
180
|
exports.SolautoPositionEx = SolautoPositionEx;
|
@@ -8,8 +8,8 @@ interface AllMarginfiAssetAccounts extends MarginfiAssetAccounts {
|
|
8
8
|
mint: PublicKey;
|
9
9
|
}
|
10
10
|
export declare function findMarginfiAccounts(bank: PublicKey): AllMarginfiAssetAccounts;
|
11
|
-
export declare function
|
12
|
-
export declare function
|
11
|
+
export declare function calcMarginfiMaxLtvAndLiqThresholdBps(supplyBank: Bank, debtBank: Bank, supplyPrice: number): [number, number];
|
12
|
+
export declare function getMarginfiMaxLtvAndLiqThresholdBps(umi: Umi, marginfiGroup: PublicKey, supply: {
|
13
13
|
mint: PublicKey;
|
14
14
|
bank?: Bank | null;
|
15
15
|
}, debt: {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"marginfiUtils.d.ts","sourceRoot":"","sources":["../../src/utils/marginfiUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAa,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EACL,IAAI,EAIJ,eAAe,EAIhB,MAAM,iBAAiB,CAAC;AAczB,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAsB,MAAM,cAAc,CAAC;AAEjE,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAIhD,UAAU,wBAAyB,SAAQ,qBAAqB;IAC9D,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,SAAS,GACd,wBAAwB,CAY1B;AAED,wBAAgB,
|
1
|
+
{"version":3,"file":"marginfiUtils.d.ts","sourceRoot":"","sources":["../../src/utils/marginfiUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAa,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EACL,IAAI,EAIJ,eAAe,EAIhB,MAAM,iBAAiB,CAAC;AAczB,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAsB,MAAM,cAAc,CAAC;AAEjE,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAIhD,UAAU,wBAAyB,SAAQ,qBAAqB;IAC9D,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,SAAS,GACd,wBAAwB,CAY1B;AAED,wBAAgB,oCAAoC,CAClD,UAAU,EAAE,IAAI,EAChB,QAAQ,EAAE,IAAI,EACd,WAAW,EAAE,MAAM,GAClB,CAAC,MAAM,EAAE,MAAM,CAAC,CA6BlB;AAED,wBAAsB,mCAAmC,CACvD,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,mCAAmC,CACvD,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,GACnB,OAAO,CAAC,eAAe,EAAE,CAAC,CA6B5B;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;AAsDD,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;AAsBhE,wBAAsB,+BAA+B,CACnD,GAAG,EAAE,GAAG,EACR,aAAa,EAAE;IAAE,EAAE,CAAC,EAAE,SAAS,CAAC;IAAC,IAAI,CAAC,EAAE,eAAe,GAAG,IAAI,CAAA;CAAE,EAChE,aAAa,CAAC,EAAE,SAAS,EACzB,MAAM,CAAC,EAAE,aAAa,EACtB,IAAI,CAAC,EAAE,aAAa,EACpB,cAAc,CAAC,EAAE,cAAc,GAC9B,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,CAyKA;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"}
|
@@ -1,8 +1,8 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.findMarginfiAccounts = findMarginfiAccounts;
|
4
|
-
exports.
|
5
|
-
exports.
|
4
|
+
exports.calcMarginfiMaxLtvAndLiqThresholdBps = calcMarginfiMaxLtvAndLiqThresholdBps;
|
5
|
+
exports.getMarginfiMaxLtvAndLiqThresholdBps = getMarginfiMaxLtvAndLiqThresholdBps;
|
6
6
|
exports.getEmptyMarginfiAccountsByAuthority = getEmptyMarginfiAccountsByAuthority;
|
7
7
|
exports.getAllMarginfiAccountsByAuthority = getAllMarginfiAccountsByAuthority;
|
8
8
|
exports.getBankLiquidityAvailableBaseUnit = getBankLiquidityAvailableBaseUnit;
|
@@ -31,7 +31,7 @@ function findMarginfiAccounts(bank) {
|
|
31
31
|
}
|
32
32
|
throw new Error(`Marginfi accounts not found by the bank: ${bank}`);
|
33
33
|
}
|
34
|
-
function
|
34
|
+
function calcMarginfiMaxLtvAndLiqThresholdBps(supplyBank, debtBank, supplyPrice) {
|
35
35
|
let maxLtv = (0, numberUtils_1.bytesToI80F48)(supplyBank.config.assetWeightInit.value) /
|
36
36
|
(0, numberUtils_1.bytesToI80F48)(debtBank.config.liabilityWeightInit.value);
|
37
37
|
const liqThreshold = (0, numberUtils_1.bytesToI80F48)(supplyBank.config.assetWeightMaint.value) /
|
@@ -44,9 +44,9 @@ function calcMarginfiMaxLtvAndLiqThreshold(supplyBank, debtBank, supplyPrice) {
|
|
44
44
|
totalDepositedUsdValue;
|
45
45
|
maxLtv = maxLtv * Number(discount);
|
46
46
|
}
|
47
|
-
return [maxLtv, liqThreshold];
|
47
|
+
return [(0, numberUtils_1.toBps)(maxLtv, "Floor"), (0, numberUtils_1.toBps)(liqThreshold, "Floor")];
|
48
48
|
}
|
49
|
-
async function
|
49
|
+
async function getMarginfiMaxLtvAndLiqThresholdBps(umi, marginfiGroup, supply, debt, supplyPrice) {
|
50
50
|
if (!supply.bank && supply.mint.equals(web3_js_1.PublicKey.default)) {
|
51
51
|
return [0, 0];
|
52
52
|
}
|
@@ -66,7 +66,7 @@ async function getMarginfiMaxLtvAndLiqThreshold(umi, marginfiGroup, supply, debt
|
|
66
66
|
if (!debt.bank || debt.bank === null) {
|
67
67
|
return [0, 0];
|
68
68
|
}
|
69
|
-
return
|
69
|
+
return calcMarginfiMaxLtvAndLiqThresholdBps(supply.bank, debt.bank, supplyPrice);
|
70
70
|
}
|
71
71
|
async function getEmptyMarginfiAccountsByAuthority(umi, authority) {
|
72
72
|
const marginfiAccounts = await umi.rpc.getProgramAccounts(marginfi_sdk_1.MARGINFI_PROGRAM_ID, {
|
@@ -155,7 +155,7 @@ function getBankLiquidityAvailableBaseUnit(bank, availableToDeposit) {
|
|
155
155
|
? Number(bank.config.depositLimit) - totalDeposited
|
156
156
|
: Math.min(totalDeposited - totalBorrowed, Math.max(0, Number(bank.config.borrowLimit) - totalBorrowed));
|
157
157
|
}
|
158
|
-
return BigInt(Math.
|
158
|
+
return BigInt(Math.floor(amountCanBeUsed));
|
159
159
|
}
|
160
160
|
async function getTokenUsage(bank, isAsset, shares, amountUsedAdjustment) {
|
161
161
|
let amountUsed = 0;
|
@@ -275,7 +275,7 @@ async function getMarginfiAccountPositionState(umi, lpUserAccount, marginfiGroup
|
|
275
275
|
debtUsage = await getTokenUsage(debtBank, false, 0, contextUpdates?.debtAdjustment);
|
276
276
|
}
|
277
277
|
const supplyPrice = (0, priceUtils_1.safeGetPrice)(supply.mint);
|
278
|
-
let [
|
278
|
+
let [maxLtvBps, liqThresholdBps] = await getMarginfiMaxLtvAndLiqThresholdBps(umi, marginfiGroup ?? new web3_js_1.PublicKey(marginfiAccounts_1.DEFAULT_MARGINFI_GROUP), {
|
279
279
|
mint: (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(supplyBank.mint),
|
280
280
|
bank: supplyBank,
|
281
281
|
}, {
|
@@ -288,15 +288,15 @@ async function getMarginfiAccountPositionState(umi, lpUserAccount, marginfiGroup
|
|
288
288
|
supplyBank,
|
289
289
|
debtBank,
|
290
290
|
state: {
|
291
|
-
liqUtilizationRateBps: (0, numberUtils_1.getLiqUtilzationRateBps)(supplyUsd, debtUsd,
|
291
|
+
liqUtilizationRateBps: (0, numberUtils_1.getLiqUtilzationRateBps)(supplyUsd, debtUsd, liqThresholdBps),
|
292
292
|
netWorth: {
|
293
293
|
baseAmountUsdValue: (0, numberUtils_1.toBaseUnit)(supplyUsd - debtUsd, generalAccounts_1.USD_DECIMALS),
|
294
294
|
baseUnit: (0, numberUtils_1.toBaseUnit)((supplyUsd - debtUsd) / supplyPrice, supplyUsage.decimals),
|
295
295
|
},
|
296
296
|
supply: supplyUsage,
|
297
297
|
debt: debtUsage,
|
298
|
-
maxLtvBps
|
299
|
-
liqThresholdBps
|
298
|
+
maxLtvBps,
|
299
|
+
liqThresholdBps,
|
300
300
|
lastRefreshed: BigInt((0, generalUtils_1.currentUnixSeconds)()),
|
301
301
|
padding1: [],
|
302
302
|
padding2: [],
|
@@ -13,11 +13,13 @@ export declare function getLiqUtilzationRateBps(supplyUsd: number, debtUsd: numb
|
|
13
13
|
export declare function toBaseUnit(value: number, decimals: number): bigint;
|
14
14
|
export declare function fromBaseUnit(value: bigint, decimals: number): number;
|
15
15
|
export declare function fromBps(value: number): number;
|
16
|
-
|
16
|
+
type RoundAction = "Floor" | "Round" | "Ceil";
|
17
|
+
export declare function toBps(value: number, roundAction?: RoundAction): number;
|
17
18
|
export declare function bytesToI80F48(bytes: number[]): number;
|
18
19
|
export declare function uint8ArrayToBigInt(uint8Array: Uint8Array): bigint;
|
19
20
|
export declare function getMaxLiqUtilizationRateBps(maxLtvBps: number, liqThresholdBps: number, offsetFromMaxLtv: number): number;
|
20
21
|
export declare function maxRepayFromBps(maxLtvBps: number, liqThresholdBps: number): number;
|
21
22
|
export declare function maxRepayToBps(maxLtvBps: number, liqThresholdBps: number): number;
|
22
23
|
export declare function maxBoostToBps(maxLtvBps: number, liqThresholdBps: number): number;
|
24
|
+
export {};
|
23
25
|
//# sourceMappingURL=numberUtils.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"numberUtils.d.ts","sourceRoot":"","sources":["../../src/utils/numberUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,wBAAgB,eAAe,CAAC,KAAK,CAAC,EAAE,aAAa,UAEpD;AAED,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,aAAa,UAIlD;AAED,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,aAAa,UAIhD;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,UAI9D;AAED,wBAAgB,6BAA6B,CAAC,KAAK,CAAC,EAAE,aAAa,UAIlE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,UAEjD;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,UAE/C;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,
|
1
|
+
{"version":3,"file":"numberUtils.d.ts","sourceRoot":"","sources":["../../src/utils/numberUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,wBAAgB,eAAe,CAAC,KAAK,CAAC,EAAE,aAAa,UAEpD;AAED,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,aAAa,UAIlD;AAED,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,aAAa,UAIhD;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,UAI9D;AAED,wBAAgB,6BAA6B,CAAC,KAAK,CAAC,EAAE,aAAa,UAIlE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,UAEjD;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,UAE/C;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,KAAK,WAAW,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;AAC9C,wBAAgB,KAAK,CACnB,KAAK,EAAE,MAAM,EACb,WAAW,GAAE,WAAqB,GACjC,MAAM,CAOR;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAqBrD;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAejE;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"}
|
@@ -73,8 +73,13 @@ function fromBaseUnit(value, decimals) {
|
|
73
73
|
function fromBps(value) {
|
74
74
|
return value / constants_1.BASIS_POINTS;
|
75
75
|
}
|
76
|
-
function toBps(value) {
|
77
|
-
|
76
|
+
function toBps(value, roundAction = "Round") {
|
77
|
+
const bps = value * constants_1.BASIS_POINTS;
|
78
|
+
return roundAction === "Round"
|
79
|
+
? Math.round(bps)
|
80
|
+
: roundAction === "Floor"
|
81
|
+
? Math.floor(bps)
|
82
|
+
: Math.ceil(bps);
|
78
83
|
}
|
79
84
|
function bytesToI80F48(bytes) {
|
80
85
|
if (bytes.length !== 16) {
|
package/package.json
CHANGED
@@ -9,7 +9,7 @@ import {
|
|
9
9
|
import { publicKey } from "@metaplex-foundation/umi";
|
10
10
|
import { toWeb3JsPublicKey } from "@metaplex-foundation/umi-web3js-adapters";
|
11
11
|
import {
|
12
|
-
|
12
|
+
calcMarginfiMaxLtvAndLiqThresholdBps,
|
13
13
|
fetchTokenPrices,
|
14
14
|
getBankLiquidityAvailableBaseUnit,
|
15
15
|
getMarginfiAccountPositionState,
|
@@ -62,13 +62,13 @@ export class MarginfiSolautoPositionEx extends SolautoPositionEx {
|
|
62
62
|
}
|
63
63
|
|
64
64
|
const [supplyPrice] = await fetchTokenPrices([this.supplyMint()]);
|
65
|
-
const [
|
65
|
+
const [maxLtvBps, liqThresholdBps] = calcMarginfiMaxLtvAndLiqThresholdBps(
|
66
66
|
this.supplyBank,
|
67
67
|
this.debtBank,
|
68
68
|
supplyPrice
|
69
69
|
);
|
70
70
|
|
71
|
-
return [
|
71
|
+
return [maxLtvBps, liqThresholdBps];
|
72
72
|
}
|
73
73
|
|
74
74
|
supplyLiquidityAvailable(): bigint {
|
@@ -213,7 +213,7 @@ export abstract class SolautoPositionEx {
|
|
213
213
|
this.state().liqThresholdBps,
|
214
214
|
{ supplyUsd: this.supplyUsd(), debtUsd: this.debtUsd() },
|
215
215
|
this.boostToBps(),
|
216
|
-
{ solauto: 50, lpBorrow: 50, flashLoan: 50 }
|
216
|
+
{ solauto: 50, lpBorrow: 50, flashLoan: 50 } // TODO: get true data here instead of magic numbers
|
217
217
|
);
|
218
218
|
|
219
219
|
const sufficientLiquidity =
|
@@ -304,6 +304,34 @@ export abstract class SolautoPositionEx {
|
|
304
304
|
);
|
305
305
|
}
|
306
306
|
|
307
|
+
updateNetWorth(supplyPrice: number, debtPrice: number) {
|
308
|
+
const netWorthUsd = this.supplyUsd() - this.debtUsd();
|
309
|
+
this._data.state.netWorth.baseAmountUsdValue =
|
310
|
+
toRoundedUsdValue(netWorthUsd);
|
311
|
+
this._data.state.netWorth.baseUnit = toBaseUnit(
|
312
|
+
netWorthUsd / supplyPrice,
|
313
|
+
this.supplyMintInfo().decimals
|
314
|
+
);
|
315
|
+
}
|
316
|
+
|
317
|
+
updateSupply(newSupplyUsd: number, supplyPrice: number) {
|
318
|
+
this._data.state.supply.amountUsed.baseAmountUsdValue =
|
319
|
+
toRoundedUsdValue(newSupplyUsd);
|
320
|
+
this._data.state.supply.amountUsed.baseUnit = toBaseUnit(
|
321
|
+
newSupplyUsd / supplyPrice,
|
322
|
+
this.supplyMintInfo().decimals
|
323
|
+
);
|
324
|
+
}
|
325
|
+
|
326
|
+
updateDebt(newDebtUsd: number, debtPrice: number) {
|
327
|
+
this._data.state.debt.amountUsed.baseAmountUsdValue =
|
328
|
+
toRoundedUsdValue(newDebtUsd);
|
329
|
+
this._data.state.debt.amountUsed.baseUnit = toBaseUnit(
|
330
|
+
newDebtUsd / debtPrice,
|
331
|
+
this.debtMintInfo().decimals
|
332
|
+
);
|
333
|
+
}
|
334
|
+
|
307
335
|
simulateRebalance(
|
308
336
|
unixTime: number,
|
309
337
|
supplyPrice: number,
|
@@ -320,30 +348,8 @@ export abstract class SolautoPositionEx {
|
|
320
348
|
this.netWorthUsd()
|
321
349
|
)
|
322
350
|
);
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
this._data.state.debt.amountUsed.baseAmountUsdValue =
|
328
|
-
toRoundedUsdValue(newDebtUsd);
|
329
|
-
this._data.state.debt.amountUsed.baseUnit = toBaseUnit(
|
330
|
-
newDebtUsd / debtPrice,
|
331
|
-
this.debtMintInfo().decimals
|
332
|
-
);
|
333
|
-
|
334
|
-
this._data.state.supply.amountUsed.baseAmountUsdValue =
|
335
|
-
toRoundedUsdValue(newSupplyUsd);
|
336
|
-
this._data.state.supply.amountUsed.baseUnit = toBaseUnit(
|
337
|
-
newSupplyUsd / supplyPrice,
|
338
|
-
this.supplyMintInfo().decimals
|
339
|
-
);
|
340
|
-
|
341
|
-
this._data.state.netWorth.baseAmountUsdValue = toRoundedUsdValue(
|
342
|
-
newSupplyUsd - newDebtUsd
|
343
|
-
);
|
344
|
-
this._data.state.netWorth.baseUnit = toBaseUnit(
|
345
|
-
(newSupplyUsd - newDebtUsd) / supplyPrice,
|
346
|
-
this.supplyMintInfo().decimals
|
347
|
-
);
|
351
|
+
this.updateSupply(rebalance.endResult.supplyUsd, supplyPrice);
|
352
|
+
this.updateDebt(rebalance.endResult.debtUsd, debtPrice);
|
353
|
+
this.updateNetWorth(supplyPrice, debtPrice);
|
348
354
|
}
|
349
355
|
}
|
@@ -51,7 +51,7 @@ export function findMarginfiAccounts(
|
|
51
51
|
throw new Error(`Marginfi accounts not found by the bank: ${bank}`);
|
52
52
|
}
|
53
53
|
|
54
|
-
export function
|
54
|
+
export function calcMarginfiMaxLtvAndLiqThresholdBps(
|
55
55
|
supplyBank: Bank,
|
56
56
|
debtBank: Bank,
|
57
57
|
supplyPrice: number
|
@@ -83,10 +83,10 @@ export function calcMarginfiMaxLtvAndLiqThreshold(
|
|
83
83
|
maxLtv = maxLtv * Number(discount);
|
84
84
|
}
|
85
85
|
|
86
|
-
return [maxLtv, liqThreshold];
|
86
|
+
return [toBps(maxLtv, "Floor"), toBps(liqThreshold, "Floor")];
|
87
87
|
}
|
88
88
|
|
89
|
-
export async function
|
89
|
+
export async function getMarginfiMaxLtvAndLiqThresholdBps(
|
90
90
|
umi: Umi,
|
91
91
|
marginfiGroup: PublicKey,
|
92
92
|
supply: {
|
@@ -137,7 +137,7 @@ export async function getMarginfiMaxLtvAndLiqThreshold(
|
|
137
137
|
return [0, 0];
|
138
138
|
}
|
139
139
|
|
140
|
-
return
|
140
|
+
return calcMarginfiMaxLtvAndLiqThresholdBps(
|
141
141
|
supply.bank!,
|
142
142
|
debt.bank,
|
143
143
|
supplyPrice
|
@@ -266,7 +266,7 @@ export function getBankLiquidityAvailableBaseUnit(
|
|
266
266
|
);
|
267
267
|
}
|
268
268
|
|
269
|
-
return BigInt(Math.
|
269
|
+
return BigInt(Math.floor(amountCanBeUsed));
|
270
270
|
}
|
271
271
|
|
272
272
|
async function getTokenUsage(
|
@@ -479,7 +479,7 @@ export async function getMarginfiAccountPositionState(
|
|
479
479
|
}
|
480
480
|
|
481
481
|
const supplyPrice = safeGetPrice(supply.mint!)!;
|
482
|
-
let [
|
482
|
+
let [maxLtvBps, liqThresholdBps] = await getMarginfiMaxLtvAndLiqThresholdBps(
|
483
483
|
umi,
|
484
484
|
marginfiGroup ?? new PublicKey(DEFAULT_MARGINFI_GROUP),
|
485
485
|
{
|
@@ -508,7 +508,7 @@ export async function getMarginfiAccountPositionState(
|
|
508
508
|
liqUtilizationRateBps: getLiqUtilzationRateBps(
|
509
509
|
supplyUsd,
|
510
510
|
debtUsd,
|
511
|
-
|
511
|
+
liqThresholdBps
|
512
512
|
),
|
513
513
|
netWorth: {
|
514
514
|
baseAmountUsdValue: toBaseUnit(supplyUsd - debtUsd, USD_DECIMALS),
|
@@ -519,8 +519,8 @@ export async function getMarginfiAccountPositionState(
|
|
519
519
|
},
|
520
520
|
supply: supplyUsage!,
|
521
521
|
debt: debtUsage!,
|
522
|
-
maxLtvBps
|
523
|
-
liqThresholdBps
|
522
|
+
maxLtvBps,
|
523
|
+
liqThresholdBps,
|
524
524
|
lastRefreshed: BigInt(currentUnixSeconds()),
|
525
525
|
padding1: [],
|
526
526
|
padding2: [],
|
package/src/utils/numberUtils.ts
CHANGED
@@ -88,8 +88,17 @@ export function fromBps(value: number): number {
|
|
88
88
|
return value / BASIS_POINTS;
|
89
89
|
}
|
90
90
|
|
91
|
-
|
92
|
-
|
91
|
+
type RoundAction = "Floor" | "Round" | "Ceil";
|
92
|
+
export function toBps(
|
93
|
+
value: number,
|
94
|
+
roundAction: RoundAction = "Round"
|
95
|
+
): number {
|
96
|
+
const bps = value * BASIS_POINTS;
|
97
|
+
return roundAction === "Round"
|
98
|
+
? Math.round(bps)
|
99
|
+
: roundAction === "Floor"
|
100
|
+
? Math.floor(bps)
|
101
|
+
: Math.ceil(bps);
|
93
102
|
}
|
94
103
|
|
95
104
|
export function bytesToI80F48(bytes: number[]): number {
|