@curvefi/llamalend-api 1.1.6 → 1.1.8
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/README.md +14 -0
- package/lib/interfaces.d.ts +6 -0
- package/lib/lendMarkets/LendMarketTemplate.d.ts +10 -0
- package/lib/lendMarkets/LendMarketTemplate.js +67 -17
- package/lib/lendMarkets/interfaces/leverageZapV2.d.ts +14 -0
- package/lib/lendMarkets/modules/leverageZapV2.d.ts +13 -0
- package/lib/lendMarkets/modules/leverageZapV2.js +28 -0
- package/lib/mintMarkets/MintMarketTemplate.d.ts +14 -7
- package/lib/mintMarkets/MintMarketTemplate.js +60 -26
- package/lib/mintMarkets/interfaces/leverage.d.ts +2 -0
- package/lib/mintMarkets/modules/leverageV2.d.ts +2 -0
- package/lib/mintMarkets/modules/leverageV2.js +22 -0
- package/package.json +1 -1
- package/src/interfaces.ts +8 -1
- package/src/lendMarkets/LendMarketTemplate.ts +98 -21
- package/src/lendMarkets/interfaces/leverageZapV2.ts +14 -0
- package/src/lendMarkets/modules/leverageZapV2.ts +45 -0
- package/src/mintMarkets/MintMarketTemplate.ts +66 -30
- package/src/mintMarkets/interfaces/leverage.ts +2 -0
- package/src/mintMarkets/modules/leverageV2.ts +39 -0
package/README.md
CHANGED
|
@@ -891,6 +891,20 @@ import llamalend from "@curvefi/llamalend-api";
|
|
|
891
891
|
})()
|
|
892
892
|
```
|
|
893
893
|
|
|
894
|
+
### Future Leverage methods for lendMarket
|
|
895
|
+
|
|
896
|
+
Estimate future leverage after an operation
|
|
897
|
+
|
|
898
|
+
```ts
|
|
899
|
+
await lendMarket.borrowMoreFutureLeverage(0.1, 500);
|
|
900
|
+
|
|
901
|
+
await lendMarket.repayFutureLeverage(1000);
|
|
902
|
+
|
|
903
|
+
await lendMarket.leverage.borrowMoreFutureLeverage(userCollateral, userBorrowed, debt);
|
|
904
|
+
|
|
905
|
+
await lendMarket.leverage.repayFutureLeverage(stateCollateral, userCollateral, userBorrowed);
|
|
906
|
+
```
|
|
907
|
+
|
|
894
908
|
### Force Update User State for lendMarket
|
|
895
909
|
|
|
896
910
|
After executing certain transactions, it's recommended to force update the user's state in the cache to ensure data consistency:
|
package/lib/interfaces.d.ts
CHANGED
|
@@ -229,4 +229,10 @@ export interface ILeverageMetrics {
|
|
|
229
229
|
health: string;
|
|
230
230
|
}
|
|
231
231
|
export type GetExpectedFn = (fromToken: string, toToken: string, amountIn: bigint, blacklist: string | string[]) => Promise<IQuote>;
|
|
232
|
+
export interface IRates {
|
|
233
|
+
borrowApr: string;
|
|
234
|
+
lendApr: string;
|
|
235
|
+
borrowApy: string;
|
|
236
|
+
lendApy: string;
|
|
237
|
+
}
|
|
232
238
|
export {};
|
|
@@ -227,6 +227,7 @@ export declare class LendMarketTemplate {
|
|
|
227
227
|
borrowMoreApprove: (userCollateral: TAmount, userBorrowed: TAmount) => Promise<string[]>;
|
|
228
228
|
borrowMoreRouteImage: (userBorrowed: TAmount, debt: TAmount) => Promise<string>;
|
|
229
229
|
borrowMore: (userCollateral: TAmount, userBorrowed: TAmount, debt: TAmount, slippage?: number) => Promise<string>;
|
|
230
|
+
borrowMoreFutureLeverage: (userCollateral: TAmount, userBorrowed: TAmount, debt: TAmount, userAddress?: string, slippage?: number) => Promise<string>;
|
|
230
231
|
repayExpectedBorrowed: (stateCollateral: TAmount, userCollateral: TAmount, userBorrowed: TAmount, slippage?: number) => Promise<{
|
|
231
232
|
totalBorrowed: string;
|
|
232
233
|
borrowedFromStateCollateral: string;
|
|
@@ -244,6 +245,7 @@ export declare class LendMarketTemplate {
|
|
|
244
245
|
repayApprove: (userCollateral: TAmount, userBorrowed: TAmount) => Promise<string[]>;
|
|
245
246
|
repayRouteImage: (stateCollateral: TAmount, userCollateral: TAmount) => Promise<string>;
|
|
246
247
|
repay: (stateCollateral: TAmount, userCollateral: TAmount, userBorrowed: TAmount, slippage?: number) => Promise<string>;
|
|
248
|
+
repayFutureLeverage: (stateCollateral: TAmount, userCollateral: TAmount, userBorrowed: TAmount, userAddress?: string, slippage?: number) => Promise<string>;
|
|
247
249
|
estimateGas: {
|
|
248
250
|
createLoanApprove: (userCollateral: TAmount, userBorrowed: TAmount) => Promise<TGas>;
|
|
249
251
|
createLoan: (userCollateral: TAmount, userBorrowed: TAmount, debt: TAmount, range: number, slippage?: number) => Promise<number>;
|
|
@@ -399,6 +401,11 @@ export declare class LendMarketTemplate {
|
|
|
399
401
|
private _borrowMore;
|
|
400
402
|
borrowMoreEstimateGas(collateral: number | string, debt: number | string): Promise<TGas>;
|
|
401
403
|
borrowMore(collateral: number | string, debt: number | string): Promise<string>;
|
|
404
|
+
_getCurrentLeverageParams(userAddress: string): Promise<{
|
|
405
|
+
stateCollateral: string;
|
|
406
|
+
totalDepositFromUser: number;
|
|
407
|
+
}>;
|
|
408
|
+
borrowMoreFutureLeverage(collateral: number | string, debt: number | string, userAddress?: string): Promise<string>;
|
|
402
409
|
private _addCollateralBands;
|
|
403
410
|
addCollateralBands(collateral: number | string, address?: string): Promise<[number, number]>;
|
|
404
411
|
addCollateralPrices(collateral: number | string, address?: string): Promise<string[]>;
|
|
@@ -429,6 +436,7 @@ export declare class LendMarketTemplate {
|
|
|
429
436
|
private _repay;
|
|
430
437
|
repayEstimateGas(debt: number | string, address?: string): Promise<TGas>;
|
|
431
438
|
repay(debt: number | string, address?: string): Promise<string>;
|
|
439
|
+
repayFutureLeverage(debt: number | string, userAddress?: string): Promise<string>;
|
|
432
440
|
private _fullRepayAmount;
|
|
433
441
|
fullRepayIsApproved(address?: string): Promise<boolean>;
|
|
434
442
|
private fullRepayApproveEstimateGas;
|
|
@@ -504,6 +512,7 @@ export declare class LendMarketTemplate {
|
|
|
504
512
|
private _leverageBorrowMore;
|
|
505
513
|
private leverageBorrowMoreEstimateGas;
|
|
506
514
|
private leverageBorrowMore;
|
|
515
|
+
private leverageBorrowMoreFutureLeverage;
|
|
507
516
|
private _leverageRepayExpectedBorrowed;
|
|
508
517
|
private leverageRepayExpectedBorrowed;
|
|
509
518
|
private leverageRepayPriceImpact;
|
|
@@ -520,6 +529,7 @@ export declare class LendMarketTemplate {
|
|
|
520
529
|
private _leverageRepay;
|
|
521
530
|
private leverageRepayEstimateGas;
|
|
522
531
|
private leverageRepay;
|
|
532
|
+
private leverageRepayFutureLeverage;
|
|
523
533
|
currentLeverage(userAddress?: string): Promise<string>;
|
|
524
534
|
currentPnL(userAddress?: string): Promise<Record<string, string>>;
|
|
525
535
|
userBoost(address?: string): Promise<string>;
|
|
@@ -600,6 +600,7 @@ export class LendMarketTemplate {
|
|
|
600
600
|
borrowMoreApprove: this.leverageCreateLoanApprove.bind(this),
|
|
601
601
|
borrowMoreRouteImage: this.leverageBorrowMoreRouteImage.bind(this),
|
|
602
602
|
borrowMore: this.leverageBorrowMore.bind(this),
|
|
603
|
+
borrowMoreFutureLeverage: this.leverageBorrowMoreFutureLeverage.bind(this),
|
|
603
604
|
repayExpectedBorrowed: this.leverageRepayExpectedBorrowed.bind(this),
|
|
604
605
|
repayPriceImpact: this.leverageRepayPriceImpact.bind(this),
|
|
605
606
|
repayIsFull: this.leverageRepayIsFull.bind(this),
|
|
@@ -611,6 +612,7 @@ export class LendMarketTemplate {
|
|
|
611
612
|
repayApprove: this.leverageRepayApprove.bind(this),
|
|
612
613
|
repayRouteImage: this.leverageRepayRouteImage.bind(this),
|
|
613
614
|
repay: this.leverageRepay.bind(this),
|
|
615
|
+
repayFutureLeverage: this.leverageRepayFutureLeverage.bind(this),
|
|
614
616
|
estimateGas: {
|
|
615
617
|
createLoanApprove: this.leverageCreateLoanApproveEstimateGas.bind(this),
|
|
616
618
|
createLoan: this.leverageCreateLoanEstimateGas.bind(this),
|
|
@@ -640,6 +642,7 @@ export class LendMarketTemplate {
|
|
|
640
642
|
borrowMoreApprove: leverageZapV2.leverageCreateLoanApprove.bind(leverageZapV2),
|
|
641
643
|
borrowMoreExpectedMetrics: leverageZapV2.leverageBorrowMoreExpectedMetrics.bind(leverageZapV2),
|
|
642
644
|
borrowMore: leverageZapV2.leverageBorrowMore.bind(leverageZapV2),
|
|
645
|
+
borrowMoreFutureLeverage: leverageZapV2.leverageBorrowMoreFutureLeverage.bind(leverageZapV2),
|
|
643
646
|
repayExpectedBorrowed: leverageZapV2.leverageRepayExpectedBorrowed.bind(leverageZapV2),
|
|
644
647
|
repayIsFull: leverageZapV2.leverageRepayIsFull.bind(leverageZapV2),
|
|
645
648
|
repayIsAvailable: leverageZapV2.leverageRepayIsAvailable.bind(leverageZapV2),
|
|
@@ -647,6 +650,7 @@ export class LendMarketTemplate {
|
|
|
647
650
|
repayIsApproved: leverageZapV2.leverageRepayIsApproved.bind(leverageZapV2),
|
|
648
651
|
repayApprove: leverageZapV2.leverageRepayApprove.bind(leverageZapV2),
|
|
649
652
|
repay: leverageZapV2.leverageRepay.bind(leverageZapV2),
|
|
653
|
+
repayFutureLeverage: leverageZapV2.leverageRepayFutureLeverage.bind(leverageZapV2),
|
|
650
654
|
estimateGas: {
|
|
651
655
|
createLoanApprove: leverageZapV2.leverageCreateLoanApproveEstimateGas.bind(leverageZapV2),
|
|
652
656
|
createLoan: leverageZapV2.leverageCreateLoanEstimateGas.bind(leverageZapV2),
|
|
@@ -1638,6 +1642,28 @@ export class LendMarketTemplate {
|
|
|
1638
1642
|
return yield this._borrowMore(collateral, debt, false);
|
|
1639
1643
|
});
|
|
1640
1644
|
}
|
|
1645
|
+
_getCurrentLeverageParams(userAddress) {
|
|
1646
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1647
|
+
const [userCollateralData, { collateral: stateCollateral }] = yield Promise.all([
|
|
1648
|
+
_getUserCollateral(this.llamalend.constants.NETWORK_NAME, this.addresses.controller, userAddress),
|
|
1649
|
+
this.userState(userAddress),
|
|
1650
|
+
]);
|
|
1651
|
+
return {
|
|
1652
|
+
stateCollateral,
|
|
1653
|
+
totalDepositFromUser: userCollateralData.total_deposit_from_user_precise,
|
|
1654
|
+
};
|
|
1655
|
+
});
|
|
1656
|
+
}
|
|
1657
|
+
borrowMoreFutureLeverage(collateral_1, debt_1) {
|
|
1658
|
+
return __awaiter(this, arguments, void 0, function* (collateral, debt, userAddress = '') {
|
|
1659
|
+
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
1660
|
+
const { stateCollateral, totalDepositFromUser } = yield this._getCurrentLeverageParams(userAddress);
|
|
1661
|
+
const collateralFromDebt = yield this.swapExpected(0, 1, debt);
|
|
1662
|
+
const futureCollateralState = BN(stateCollateral).plus(collateralFromDebt);
|
|
1663
|
+
const futureTotalDepositFromUserPrecise = BN(totalDepositFromUser).plus(collateral);
|
|
1664
|
+
return futureCollateralState.div(futureTotalDepositFromUserPrecise).toString();
|
|
1665
|
+
});
|
|
1666
|
+
}
|
|
1641
1667
|
// ---------------- ADD COLLATERAL ----------------
|
|
1642
1668
|
_addCollateralBands(collateral_1) {
|
|
1643
1669
|
return __awaiter(this, arguments, void 0, function* (collateral, address = "") {
|
|
@@ -1723,12 +1749,8 @@ export class LendMarketTemplate {
|
|
|
1723
1749
|
addCollateralFutureLeverage(collateral_1) {
|
|
1724
1750
|
return __awaiter(this, arguments, void 0, function* (collateral, userAddress = '') {
|
|
1725
1751
|
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
1726
|
-
const
|
|
1727
|
-
|
|
1728
|
-
this.userState(userAddress),
|
|
1729
|
-
]);
|
|
1730
|
-
const total_deposit_from_user = userCollateral.total_deposit_from_user_precise;
|
|
1731
|
-
return calculateFutureLeverage(currentCollateral, total_deposit_from_user, collateral, 'add');
|
|
1752
|
+
const { stateCollateral, totalDepositFromUser } = yield this._getCurrentLeverageParams(userAddress);
|
|
1753
|
+
return calculateFutureLeverage(stateCollateral, totalDepositFromUser, collateral, 'add');
|
|
1732
1754
|
});
|
|
1733
1755
|
}
|
|
1734
1756
|
// ---------------- REMOVE COLLATERAL ----------------
|
|
@@ -1802,12 +1824,8 @@ export class LendMarketTemplate {
|
|
|
1802
1824
|
removeCollateralFutureLeverage(collateral_1) {
|
|
1803
1825
|
return __awaiter(this, arguments, void 0, function* (collateral, userAddress = '') {
|
|
1804
1826
|
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
1805
|
-
const
|
|
1806
|
-
|
|
1807
|
-
this.userState(userAddress),
|
|
1808
|
-
]);
|
|
1809
|
-
const total_deposit_from_user = userCollateral.total_deposit_from_user_precise;
|
|
1810
|
-
return calculateFutureLeverage(currentCollateral, total_deposit_from_user, collateral, 'remove');
|
|
1827
|
+
const { stateCollateral, totalDepositFromUser } = yield this._getCurrentLeverageParams(userAddress);
|
|
1828
|
+
return calculateFutureLeverage(stateCollateral, totalDepositFromUser, collateral, 'remove');
|
|
1811
1829
|
});
|
|
1812
1830
|
}
|
|
1813
1831
|
// ---------------- REPAY ----------------
|
|
@@ -1893,6 +1911,16 @@ export class LendMarketTemplate {
|
|
|
1893
1911
|
return yield this._repay(debt, address, false);
|
|
1894
1912
|
});
|
|
1895
1913
|
}
|
|
1914
|
+
repayFutureLeverage(debt_1) {
|
|
1915
|
+
return __awaiter(this, arguments, void 0, function* (debt, userAddress = '') {
|
|
1916
|
+
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
1917
|
+
const { stateCollateral, totalDepositFromUser } = yield this._getCurrentLeverageParams(userAddress);
|
|
1918
|
+
const collateralFromDebt = yield this.swapExpected(0, 1, debt);
|
|
1919
|
+
const futureCollateralState = BN(stateCollateral);
|
|
1920
|
+
const futureTotalDepositFromUserPrecise = BN(totalDepositFromUser).plus(collateralFromDebt);
|
|
1921
|
+
return futureCollateralState.div(futureTotalDepositFromUserPrecise).toString();
|
|
1922
|
+
});
|
|
1923
|
+
}
|
|
1896
1924
|
// ---------------- FULL REPAY ----------------
|
|
1897
1925
|
_fullRepayAmount() {
|
|
1898
1926
|
return __awaiter(this, arguments, void 0, function* (address = "") {
|
|
@@ -2650,6 +2678,17 @@ export class LendMarketTemplate {
|
|
|
2650
2678
|
return yield this._leverageBorrowMore(userCollateral, userBorrowed, debt, slippage, false);
|
|
2651
2679
|
});
|
|
2652
2680
|
}
|
|
2681
|
+
leverageBorrowMoreFutureLeverage(userCollateral_1, userBorrowed_1, debt_1) {
|
|
2682
|
+
return __awaiter(this, arguments, void 0, function* (userCollateral, userBorrowed, debt, userAddress = '', slippage = 0.1) {
|
|
2683
|
+
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
2684
|
+
this._checkLeverageZap();
|
|
2685
|
+
const { stateCollateral, totalDepositFromUser } = yield this._getCurrentLeverageParams(userAddress);
|
|
2686
|
+
const expected = yield this.leverageBorrowMoreExpectedCollateral(userCollateral, userBorrowed, debt, slippage, userAddress);
|
|
2687
|
+
const futureCollateralState = BN(stateCollateral).plus(expected.totalCollateral);
|
|
2688
|
+
const futureTotalDepositFromUserPrecise = BN(totalDepositFromUser).plus(userCollateral).plus(expected.collateralFromUserBorrowed);
|
|
2689
|
+
return futureCollateralState.div(futureTotalDepositFromUserPrecise).toString();
|
|
2690
|
+
});
|
|
2691
|
+
}
|
|
2653
2692
|
leverageRepayPriceImpact(stateCollateral, userCollateral) {
|
|
2654
2693
|
return __awaiter(this, void 0, void 0, function* () {
|
|
2655
2694
|
this._checkLeverageZap();
|
|
@@ -2791,15 +2830,26 @@ export class LendMarketTemplate {
|
|
|
2791
2830
|
return yield this._leverageRepay(stateCollateral, userCollateral, userBorrowed, slippage, false);
|
|
2792
2831
|
});
|
|
2793
2832
|
}
|
|
2794
|
-
|
|
2795
|
-
return __awaiter(this, arguments, void 0, function* (userAddress = '') {
|
|
2833
|
+
leverageRepayFutureLeverage(stateCollateral_1, userCollateral_1, userBorrowed_1) {
|
|
2834
|
+
return __awaiter(this, arguments, void 0, function* (stateCollateral, userCollateral, userBorrowed, userAddress = '') {
|
|
2796
2835
|
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
2797
|
-
|
|
2836
|
+
this._checkLeverageZap();
|
|
2837
|
+
const [userCollateralData, { collateral: currentStateCollateral }] = yield Promise.all([
|
|
2798
2838
|
_getUserCollateral(this.llamalend.constants.NETWORK_NAME, this.addresses.controller, userAddress),
|
|
2799
2839
|
this.userState(userAddress),
|
|
2800
2840
|
]);
|
|
2801
|
-
const
|
|
2802
|
-
|
|
2841
|
+
const totalDepositFromUser = userCollateralData.total_deposit_from_user_precise;
|
|
2842
|
+
const collateralFromUserBorrowed = yield this.swapExpected(0, 1, userBorrowed);
|
|
2843
|
+
const futureCollateralState = BN(currentStateCollateral).minus(stateCollateral);
|
|
2844
|
+
const futureTotalDepositFromUserPrecise = BN(totalDepositFromUser).plus(userCollateral).plus(collateralFromUserBorrowed);
|
|
2845
|
+
return futureCollateralState.div(futureTotalDepositFromUserPrecise).toString();
|
|
2846
|
+
});
|
|
2847
|
+
}
|
|
2848
|
+
currentLeverage() {
|
|
2849
|
+
return __awaiter(this, arguments, void 0, function* (userAddress = '') {
|
|
2850
|
+
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
2851
|
+
const { stateCollateral, totalDepositFromUser } = yield this._getCurrentLeverageParams(userAddress);
|
|
2852
|
+
return BN(stateCollateral).div(totalDepositFromUser).toString();
|
|
2803
2853
|
});
|
|
2804
2854
|
}
|
|
2805
2855
|
currentPnL() {
|
|
@@ -135,6 +135,13 @@ export interface ILeverageZapV2 {
|
|
|
135
135
|
router: string;
|
|
136
136
|
calldata: string;
|
|
137
137
|
}) => Promise<string>;
|
|
138
|
+
borrowMoreFutureLeverage: ({ userCollateral, userBorrowed, debt, quote, address }: {
|
|
139
|
+
userCollateral: TAmount;
|
|
140
|
+
userBorrowed: TAmount;
|
|
141
|
+
debt: TAmount;
|
|
142
|
+
quote: IQuote;
|
|
143
|
+
address?: string;
|
|
144
|
+
}) => Promise<string>;
|
|
138
145
|
repayExpectedBorrowed: ({ stateCollateral, userCollateral, userBorrowed, quote }: {
|
|
139
146
|
stateCollateral: TAmount;
|
|
140
147
|
userCollateral: TAmount;
|
|
@@ -184,6 +191,13 @@ export interface ILeverageZapV2 {
|
|
|
184
191
|
router: string;
|
|
185
192
|
calldata: string;
|
|
186
193
|
}) => Promise<string>;
|
|
194
|
+
repayFutureLeverage: ({ stateCollateral, userCollateral, userBorrowed, quote, address }: {
|
|
195
|
+
stateCollateral: TAmount;
|
|
196
|
+
userCollateral: TAmount;
|
|
197
|
+
userBorrowed: TAmount;
|
|
198
|
+
quote: IQuote;
|
|
199
|
+
address?: string;
|
|
200
|
+
}) => Promise<string>;
|
|
187
201
|
estimateGas: {
|
|
188
202
|
createLoanApprove: ({ userCollateral, userBorrowed }: {
|
|
189
203
|
userCollateral: TAmount;
|
|
@@ -186,6 +186,13 @@ export declare class LeverageZapV2Module {
|
|
|
186
186
|
router: string;
|
|
187
187
|
calldata: string;
|
|
188
188
|
}): Promise<string>;
|
|
189
|
+
leverageBorrowMoreFutureLeverage({ userCollateral, userBorrowed, debt, quote, address }: {
|
|
190
|
+
userCollateral: TAmount;
|
|
191
|
+
userBorrowed: TAmount;
|
|
192
|
+
debt: TAmount;
|
|
193
|
+
quote: IQuote;
|
|
194
|
+
address?: string;
|
|
195
|
+
}): Promise<string>;
|
|
189
196
|
private _leverageRepayExpectedBorrowed;
|
|
190
197
|
leverageRepayExpectedBorrowed: ({ stateCollateral, userCollateral, userBorrowed, quote }: {
|
|
191
198
|
stateCollateral: TAmount;
|
|
@@ -250,4 +257,10 @@ export declare class LeverageZapV2Module {
|
|
|
250
257
|
router: string;
|
|
251
258
|
calldata: string;
|
|
252
259
|
}): Promise<string>;
|
|
260
|
+
leverageRepayFutureLeverage({ stateCollateral, userCollateral, userBorrowed, address }: {
|
|
261
|
+
stateCollateral: TAmount;
|
|
262
|
+
userCollateral: TAmount;
|
|
263
|
+
userBorrowed: TAmount;
|
|
264
|
+
address?: string;
|
|
265
|
+
}): Promise<string>;
|
|
253
266
|
}
|
|
@@ -557,6 +557,23 @@ export class LeverageZapV2Module {
|
|
|
557
557
|
return yield this._leverageBorrowMore(userCollateral, userBorrowed, debt, router, calldata, false);
|
|
558
558
|
});
|
|
559
559
|
}
|
|
560
|
+
leverageBorrowMoreFutureLeverage(_a) {
|
|
561
|
+
return __awaiter(this, arguments, void 0, function* ({ userCollateral, userBorrowed, debt, quote, address = "" }) {
|
|
562
|
+
address = _getAddress.call(this.llamalend, address);
|
|
563
|
+
this._checkLeverageZap();
|
|
564
|
+
const { stateCollateral, totalDepositFromUser } = yield this.market._getCurrentLeverageParams(address);
|
|
565
|
+
const expected = yield this.leverageBorrowMoreExpectedCollateral({
|
|
566
|
+
userCollateral,
|
|
567
|
+
userBorrowed,
|
|
568
|
+
dDebt: debt,
|
|
569
|
+
quote,
|
|
570
|
+
address,
|
|
571
|
+
});
|
|
572
|
+
const futureCollateralState = BN(stateCollateral).plus(expected.totalCollateral);
|
|
573
|
+
const futureTotalDepositFromUserPrecise = BN(totalDepositFromUser).plus(userCollateral).plus(expected.collateralFromUserBorrowed);
|
|
574
|
+
return futureCollateralState.div(futureTotalDepositFromUserPrecise).toString();
|
|
575
|
+
});
|
|
576
|
+
}
|
|
560
577
|
leverageRepayIsFull(_a) {
|
|
561
578
|
return __awaiter(this, arguments, void 0, function* ({ stateCollateral, userCollateral, userBorrowed, quote, address = "" }) {
|
|
562
579
|
this._checkLeverageZap();
|
|
@@ -678,4 +695,15 @@ export class LeverageZapV2Module {
|
|
|
678
695
|
return yield this._leverageRepay(stateCollateral, userCollateral, userBorrowed, router, calldata, false);
|
|
679
696
|
});
|
|
680
697
|
}
|
|
698
|
+
leverageRepayFutureLeverage(_a) {
|
|
699
|
+
return __awaiter(this, arguments, void 0, function* ({ stateCollateral, userCollateral, userBorrowed, address = "" }) {
|
|
700
|
+
address = _getAddress.call(this.llamalend, address);
|
|
701
|
+
this._checkLeverageZap();
|
|
702
|
+
const { stateCollateral: currentStateCollateral, totalDepositFromUser } = yield this.market._getCurrentLeverageParams(address);
|
|
703
|
+
const collateralFromUserBorrowed = yield this.market.swapExpected(0, 1, userBorrowed);
|
|
704
|
+
const futureCollateralState = BN(currentStateCollateral).minus(stateCollateral);
|
|
705
|
+
const futureTotalDepositFromUserPrecise = BN(totalDepositFromUser).plus(userCollateral).plus(collateralFromUserBorrowed);
|
|
706
|
+
return futureCollateralState.div(futureTotalDepositFromUserPrecise).toString();
|
|
707
|
+
});
|
|
708
|
+
}
|
|
681
709
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import memoize from "memoizee";
|
|
2
2
|
import type { Llamalend } from "../llamalend.js";
|
|
3
|
-
import { IDict, ILlamma, TGas } from "../interfaces.js";
|
|
3
|
+
import { IDict, ILlamma, TGas, IRates } from "../interfaces.js";
|
|
4
4
|
import { ILeverageV2 } from "./interfaces/leverage.js";
|
|
5
5
|
export declare class MintMarketTemplate {
|
|
6
6
|
private llamalend;
|
|
@@ -46,8 +46,8 @@ export declare class MintMarketTemplate {
|
|
|
46
46
|
parameters: () => Promise<{
|
|
47
47
|
fee: string;
|
|
48
48
|
admin_fee: string;
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
rates: IRates;
|
|
50
|
+
future_rates: IRates;
|
|
51
51
|
liquidation_discount: string;
|
|
52
52
|
loan_discount: string;
|
|
53
53
|
}>;
|
|
@@ -134,18 +134,19 @@ export declare class MintMarketTemplate {
|
|
|
134
134
|
};
|
|
135
135
|
};
|
|
136
136
|
constructor(id: string, llammaData: ILlamma, llamalend: Llamalend);
|
|
137
|
+
private _buildRatesObject;
|
|
137
138
|
statsParameters: (() => Promise<{
|
|
138
139
|
fee: string;
|
|
139
140
|
admin_fee: string;
|
|
140
|
-
|
|
141
|
-
|
|
141
|
+
rates: IRates;
|
|
142
|
+
future_rates: IRates;
|
|
142
143
|
liquidation_discount: string;
|
|
143
144
|
loan_discount: string;
|
|
144
145
|
}>) & memoize.Memoized<() => Promise<{
|
|
145
146
|
fee: string;
|
|
146
147
|
admin_fee: string;
|
|
147
|
-
|
|
148
|
-
|
|
148
|
+
rates: IRates;
|
|
149
|
+
future_rates: IRates;
|
|
149
150
|
liquidation_discount: string;
|
|
150
151
|
loan_discount: string;
|
|
151
152
|
}>>;
|
|
@@ -234,6 +235,11 @@ export declare class MintMarketTemplate {
|
|
|
234
235
|
private _borrowMore;
|
|
235
236
|
borrowMoreEstimateGas(collateral: number | string, debt: number | string): Promise<number>;
|
|
236
237
|
borrowMore(collateral: number | string, debt: number | string): Promise<string>;
|
|
238
|
+
_getCurrentLeverageParams(userAddress: string): Promise<{
|
|
239
|
+
stateCollateral: string;
|
|
240
|
+
totalDepositFromUser: number;
|
|
241
|
+
}>;
|
|
242
|
+
borrowMoreFutureLeverage(collateral: number | string, debt: number | string, userAddress?: string): Promise<string>;
|
|
237
243
|
private _addCollateralBands;
|
|
238
244
|
addCollateralBands(collateral: number | string, address?: string): Promise<[number, number]>;
|
|
239
245
|
addCollateralPrices(collateral: number | string, address?: string): Promise<string[]>;
|
|
@@ -264,6 +270,7 @@ export declare class MintMarketTemplate {
|
|
|
264
270
|
private _repay;
|
|
265
271
|
repayEstimateGas(debt: number | string, address?: string): Promise<number>;
|
|
266
272
|
repay(debt: number | string, address?: string): Promise<string>;
|
|
273
|
+
repayFutureLeverage(debt: number | string, userAddress?: string): Promise<string>;
|
|
267
274
|
private _fullRepayAmount;
|
|
268
275
|
fullRepayIsApproved(address?: string): Promise<boolean>;
|
|
269
276
|
private fullRepayApproveEstimateGas;
|
|
@@ -15,7 +15,6 @@ import { LeverageV2Module } from "./modules/index.js";
|
|
|
15
15
|
export class MintMarketTemplate {
|
|
16
16
|
constructor(id, llammaData, llamalend) {
|
|
17
17
|
var _a;
|
|
18
|
-
// ---------------- STATS ----------------
|
|
19
18
|
this.statsParameters = memoize(() => __awaiter(this, void 0, void 0, function* () {
|
|
20
19
|
const llammaContract = this.llamalend.contracts[this.address].multicallContract;
|
|
21
20
|
const controllerContract = this.llamalend.contracts[this.controller].multicallContract;
|
|
@@ -31,10 +30,9 @@ export class MintMarketTemplate {
|
|
|
31
30
|
const [_fee, _admin_fee, _rate, _mp_rate, _liquidation_discount, _loan_discount] = yield this.llamalend.multicallProvider.all(calls);
|
|
32
31
|
const [fee, admin_fee, liquidation_discount, loan_discount] = [_fee, _admin_fee, _liquidation_discount, _loan_discount]
|
|
33
32
|
.map((x) => formatUnits(x * BigInt(100)));
|
|
34
|
-
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
return { fee, admin_fee, rate, future_rate, liquidation_discount, loan_discount };
|
|
33
|
+
const rates = this._buildRatesObject(_rate);
|
|
34
|
+
const future_rates = this._buildRatesObject(_mp_rate);
|
|
35
|
+
return { fee, admin_fee, rates, future_rates, liquidation_discount, loan_discount };
|
|
38
36
|
}), {
|
|
39
37
|
promise: true,
|
|
40
38
|
maxAge: 5 * 60 * 1000, // 5m
|
|
@@ -341,6 +339,7 @@ export class MintMarketTemplate {
|
|
|
341
339
|
borrowMoreApprove: leverageV2.leverageCreateLoanApprove.bind(leverageV2),
|
|
342
340
|
borrowMoreRouteImage: leverageV2.leverageBorrowMoreRouteImage.bind(leverageV2),
|
|
343
341
|
borrowMore: leverageV2.leverageBorrowMore.bind(leverageV2),
|
|
342
|
+
borrowMoreFutureLeverage: leverageV2.leverageBorrowMoreFutureLeverage.bind(leverageV2),
|
|
344
343
|
repayExpectedBorrowed: leverageV2.leverageRepayExpectedBorrowed.bind(leverageV2),
|
|
345
344
|
repayPriceImpact: leverageV2.leverageRepayPriceImpact.bind(leverageV2),
|
|
346
345
|
repayIsFull: leverageV2.leverageRepayIsFull.bind(leverageV2),
|
|
@@ -352,6 +351,7 @@ export class MintMarketTemplate {
|
|
|
352
351
|
repayApprove: leverageV2.leverageRepayApprove.bind(leverageV2),
|
|
353
352
|
repayRouteImage: leverageV2.leverageRepayRouteImage.bind(leverageV2),
|
|
354
353
|
repay: leverageV2.leverageRepay.bind(leverageV2),
|
|
354
|
+
repayFutureLeverage: leverageV2.leverageRepayFutureLeverage.bind(leverageV2),
|
|
355
355
|
estimateGas: {
|
|
356
356
|
createLoanApprove: leverageV2.leverageCreateLoanApproveEstimateGas.bind(leverageV2),
|
|
357
357
|
createLoan: leverageV2.leverageCreateLoanEstimateGas.bind(leverageV2),
|
|
@@ -376,6 +376,18 @@ export class MintMarketTemplate {
|
|
|
376
376
|
},
|
|
377
377
|
};
|
|
378
378
|
}
|
|
379
|
+
// ---------------- STATS ----------------
|
|
380
|
+
_buildRatesObject(rate) {
|
|
381
|
+
const borrowApr = toBN(rate).times(365).times(86400).times(100).toString();
|
|
382
|
+
// borrowApy = e**(rate*365*86400) - 1
|
|
383
|
+
const borrowApy = String(((Math.pow(2.718281828459, (toBN(rate).times(365).times(86400)).toNumber())) - 1) * 100);
|
|
384
|
+
return {
|
|
385
|
+
borrowApr,
|
|
386
|
+
borrowApy,
|
|
387
|
+
lendApr: "0",
|
|
388
|
+
lendApy: "0",
|
|
389
|
+
};
|
|
390
|
+
}
|
|
379
391
|
statsBalances() {
|
|
380
392
|
return __awaiter(this, void 0, void 0, function* () {
|
|
381
393
|
const crvusdContract = this.llamalend.contracts[this.llamalend.crvUsdAddress].multicallContract;
|
|
@@ -875,6 +887,31 @@ export class MintMarketTemplate {
|
|
|
875
887
|
return yield this._borrowMore(collateral, debt, false);
|
|
876
888
|
});
|
|
877
889
|
}
|
|
890
|
+
_getCurrentLeverageParams(userAddress) {
|
|
891
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
892
|
+
var _a;
|
|
893
|
+
const [userCollateralData, { collateral: stateCollateral }] = yield Promise.all([
|
|
894
|
+
_getUserCollateralCrvUsdFull(this.llamalend.constants.NETWORK_NAME, this.controller, userAddress),
|
|
895
|
+
this.userState(userAddress),
|
|
896
|
+
]);
|
|
897
|
+
return {
|
|
898
|
+
stateCollateral,
|
|
899
|
+
totalDepositFromUser: (_a = userCollateralData.total_deposit_from_user_precise) !== null && _a !== void 0 ? _a : userCollateralData.total_deposit_precise,
|
|
900
|
+
};
|
|
901
|
+
});
|
|
902
|
+
}
|
|
903
|
+
borrowMoreFutureLeverage(collateral_1, debt_1) {
|
|
904
|
+
return __awaiter(this, arguments, void 0, function* (collateral, debt, userAddress = '') {
|
|
905
|
+
if (!this.isDeleverageSupported)
|
|
906
|
+
throw Error("This market does not support borrowMoreFutureLeverage");
|
|
907
|
+
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
908
|
+
const { stateCollateral, totalDepositFromUser } = yield this._getCurrentLeverageParams(userAddress);
|
|
909
|
+
const collateralFromDebt = yield this.swapExpected(0, 1, debt);
|
|
910
|
+
const futureCollateralState = BN(stateCollateral).plus(collateralFromDebt);
|
|
911
|
+
const futureTotalDepositFromUserPrecise = BN(totalDepositFromUser).plus(collateral);
|
|
912
|
+
return futureCollateralState.div(futureTotalDepositFromUserPrecise).toString();
|
|
913
|
+
});
|
|
914
|
+
}
|
|
878
915
|
// ---------------- ADD COLLATERAL ----------------
|
|
879
916
|
_addCollateralBands(collateral_1) {
|
|
880
917
|
return __awaiter(this, arguments, void 0, function* (collateral, address = "") {
|
|
@@ -962,15 +999,10 @@ export class MintMarketTemplate {
|
|
|
962
999
|
}
|
|
963
1000
|
addCollateralFutureLeverage(collateral_1) {
|
|
964
1001
|
return __awaiter(this, arguments, void 0, function* (collateral, userAddress = '') {
|
|
965
|
-
var _a;
|
|
966
1002
|
this._checkLeverageForStats();
|
|
967
1003
|
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
968
|
-
const
|
|
969
|
-
|
|
970
|
-
this.userState(userAddress),
|
|
971
|
-
]);
|
|
972
|
-
const total_deposit_from_user = (_a = userCollateral.total_deposit_from_user_precise) !== null && _a !== void 0 ? _a : userCollateral.total_deposit_precise;
|
|
973
|
-
return calculateFutureLeverage(currentCollateral, total_deposit_from_user, collateral, 'add');
|
|
1004
|
+
const { stateCollateral, totalDepositFromUser } = yield this._getCurrentLeverageParams(userAddress);
|
|
1005
|
+
return calculateFutureLeverage(stateCollateral, totalDepositFromUser, collateral, 'add');
|
|
974
1006
|
});
|
|
975
1007
|
}
|
|
976
1008
|
// ---------------- REMOVE COLLATERAL ----------------
|
|
@@ -1046,15 +1078,10 @@ export class MintMarketTemplate {
|
|
|
1046
1078
|
}
|
|
1047
1079
|
removeCollateralFutureLeverage(collateral_1) {
|
|
1048
1080
|
return __awaiter(this, arguments, void 0, function* (collateral, userAddress = '') {
|
|
1049
|
-
var _a;
|
|
1050
1081
|
this._checkLeverageForStats();
|
|
1051
1082
|
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
1052
|
-
const
|
|
1053
|
-
|
|
1054
|
-
this.userState(userAddress),
|
|
1055
|
-
]);
|
|
1056
|
-
const total_deposit_from_user = (_a = userCollateral.total_deposit_from_user_precise) !== null && _a !== void 0 ? _a : userCollateral.total_deposit_precise;
|
|
1057
|
-
return calculateFutureLeverage(currentCollateral, total_deposit_from_user, collateral, 'remove');
|
|
1083
|
+
const { stateCollateral, totalDepositFromUser } = yield this._getCurrentLeverageParams(userAddress);
|
|
1084
|
+
return calculateFutureLeverage(stateCollateral, totalDepositFromUser, collateral, 'remove');
|
|
1058
1085
|
});
|
|
1059
1086
|
}
|
|
1060
1087
|
// ---------------- REPAY ----------------
|
|
@@ -1140,6 +1167,18 @@ export class MintMarketTemplate {
|
|
|
1140
1167
|
return yield this._repay(debt, address, false);
|
|
1141
1168
|
});
|
|
1142
1169
|
}
|
|
1170
|
+
repayFutureLeverage(debt_1) {
|
|
1171
|
+
return __awaiter(this, arguments, void 0, function* (debt, userAddress = '') {
|
|
1172
|
+
if (!this.isDeleverageSupported)
|
|
1173
|
+
throw Error("This market does not support repayFutureLeverage");
|
|
1174
|
+
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
1175
|
+
const { stateCollateral, totalDepositFromUser } = yield this._getCurrentLeverageParams(userAddress);
|
|
1176
|
+
const collateralFromDebt = yield this.swapExpected(0, 1, debt);
|
|
1177
|
+
const futureCollateralState = BN(stateCollateral);
|
|
1178
|
+
const futureTotalDepositFromUserPrecise = BN(totalDepositFromUser).plus(collateralFromDebt);
|
|
1179
|
+
return futureCollateralState.div(futureTotalDepositFromUserPrecise).toString();
|
|
1180
|
+
});
|
|
1181
|
+
}
|
|
1143
1182
|
// ---------------- FULL REPAY ----------------
|
|
1144
1183
|
_fullRepayAmount() {
|
|
1145
1184
|
return __awaiter(this, arguments, void 0, function* (address = "") {
|
|
@@ -1775,15 +1814,10 @@ export class MintMarketTemplate {
|
|
|
1775
1814
|
}
|
|
1776
1815
|
currentLeverage() {
|
|
1777
1816
|
return __awaiter(this, arguments, void 0, function* (userAddress = '') {
|
|
1778
|
-
var _a;
|
|
1779
1817
|
this._checkLeverageForStats();
|
|
1780
1818
|
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
1781
|
-
const
|
|
1782
|
-
|
|
1783
|
-
this.userState(userAddress),
|
|
1784
|
-
]);
|
|
1785
|
-
const total_deposit_from_user = (_a = userCollateral.total_deposit_from_user_precise) !== null && _a !== void 0 ? _a : userCollateral.total_deposit_precise;
|
|
1786
|
-
return BN(collateral).div(total_deposit_from_user).toString();
|
|
1819
|
+
const { stateCollateral, totalDepositFromUser } = yield this._getCurrentLeverageParams(userAddress);
|
|
1820
|
+
return BN(stateCollateral).div(totalDepositFromUser).toString();
|
|
1787
1821
|
});
|
|
1788
1822
|
}
|
|
1789
1823
|
currentPnL() {
|
|
@@ -62,6 +62,7 @@ export interface ILeverageV2 {
|
|
|
62
62
|
borrowMoreApprove: (userCollateral: TAmount, userBorrowed: TAmount) => Promise<string[]>;
|
|
63
63
|
borrowMoreRouteImage: (userBorrowed: TAmount, debt: TAmount) => Promise<string>;
|
|
64
64
|
borrowMore: (userCollateral: TAmount, userBorrowed: TAmount, debt: TAmount, slippage?: number) => Promise<string>;
|
|
65
|
+
borrowMoreFutureLeverage: (userCollateral: TAmount, userBorrowed: TAmount, debt: TAmount, userAddress?: string, slippage?: number) => Promise<string>;
|
|
65
66
|
repayExpectedBorrowed: (stateCollateral: TAmount, userCollateral: TAmount, userBorrowed: TAmount, slippage?: number) => Promise<{
|
|
66
67
|
totalBorrowed: string;
|
|
67
68
|
borrowedFromStateCollateral: string;
|
|
@@ -79,6 +80,7 @@ export interface ILeverageV2 {
|
|
|
79
80
|
repayApprove: (userCollateral: TAmount, userBorrowed: TAmount) => Promise<string[]>;
|
|
80
81
|
repayRouteImage: (stateCollateral: TAmount, userCollateral: TAmount) => Promise<string>;
|
|
81
82
|
repay: (stateCollateral: TAmount, userCollateral: TAmount, userBorrowed: TAmount, slippage?: number) => Promise<string>;
|
|
83
|
+
repayFutureLeverage: (stateCollateral: TAmount, userCollateral: TAmount, userBorrowed: TAmount, userAddress?: string, slippage?: number) => Promise<string>;
|
|
82
84
|
estimateGas: {
|
|
83
85
|
createLoanApprove: (userCollateral: TAmount, userBorrowed: TAmount) => Promise<TGas>;
|
|
84
86
|
createLoan: (userCollateral: TAmount, userBorrowed: TAmount, debt: TAmount, range: number, slippage?: number) => Promise<number>;
|
|
@@ -102,6 +102,7 @@ export declare class LeverageV2Module {
|
|
|
102
102
|
_leverageBorrowMore(userCollateral: TAmount, userBorrowed: TAmount, debt: TAmount, slippage: number, estimateGas: boolean): Promise<string | TGas>;
|
|
103
103
|
leverageBorrowMoreEstimateGas(userCollateral: TAmount, userBorrowed: TAmount, debt: TAmount, slippage?: number): Promise<number>;
|
|
104
104
|
leverageBorrowMore(userCollateral: TAmount, userBorrowed: TAmount, debt: TAmount, slippage?: number): Promise<string>;
|
|
105
|
+
leverageBorrowMoreFutureLeverage(userCollateral: TAmount, userBorrowed: TAmount, debt: TAmount, userAddress?: string, slippage?: number): Promise<string>;
|
|
105
106
|
_leverageRepayExpectedBorrowed: (stateCollateral: TAmount, userCollateral: TAmount, userBorrowed: TAmount) => {
|
|
106
107
|
_totalBorrowed: bigint;
|
|
107
108
|
_borrowedFromStateCollateral: bigint;
|
|
@@ -129,4 +130,5 @@ export declare class LeverageV2Module {
|
|
|
129
130
|
_leverageRepay(stateCollateral: TAmount, userCollateral: TAmount, userBorrowed: TAmount, slippage: number, estimateGas: boolean): Promise<string | TGas>;
|
|
130
131
|
leverageRepayEstimateGas(stateCollateral: TAmount, userCollateral: TAmount, userBorrowed: TAmount, slippage?: number): Promise<number>;
|
|
131
132
|
leverageRepay(stateCollateral: TAmount, userCollateral: TAmount, userBorrowed: TAmount, slippage?: number): Promise<string>;
|
|
133
|
+
leverageRepayFutureLeverage(stateCollateral: TAmount, userCollateral: TAmount, userBorrowed: TAmount, userAddress?: string): Promise<string>;
|
|
132
134
|
}
|
|
@@ -643,6 +643,17 @@ export class LeverageV2Module {
|
|
|
643
643
|
return yield this._leverageBorrowMore(userCollateral, userBorrowed, debt, slippage, false);
|
|
644
644
|
});
|
|
645
645
|
}
|
|
646
|
+
leverageBorrowMoreFutureLeverage(userCollateral_1, userBorrowed_1, debt_1) {
|
|
647
|
+
return __awaiter(this, arguments, void 0, function* (userCollateral, userBorrowed, debt, userAddress = '', slippage = 0.1) {
|
|
648
|
+
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
649
|
+
this._checkLeverageZap();
|
|
650
|
+
const { stateCollateral, totalDepositFromUser } = yield this.market._getCurrentLeverageParams(userAddress);
|
|
651
|
+
const expected = yield this.leverageBorrowMoreExpectedCollateral(userCollateral, userBorrowed, debt, slippage, userAddress);
|
|
652
|
+
const futureCollateralState = BN(stateCollateral).plus(expected.totalCollateral);
|
|
653
|
+
const futureTotalDepositFromUserPrecise = BN(totalDepositFromUser).plus(userCollateral).plus(expected.collateralFromUserBorrowed);
|
|
654
|
+
return futureCollateralState.div(futureTotalDepositFromUserPrecise).toString();
|
|
655
|
+
});
|
|
656
|
+
}
|
|
646
657
|
leverageRepayPriceImpact(stateCollateral, userCollateral) {
|
|
647
658
|
return __awaiter(this, void 0, void 0, function* () {
|
|
648
659
|
this._checkLeverageZap();
|
|
@@ -786,4 +797,15 @@ export class LeverageV2Module {
|
|
|
786
797
|
return yield this._leverageRepay(stateCollateral, userCollateral, userBorrowed, slippage, false);
|
|
787
798
|
});
|
|
788
799
|
}
|
|
800
|
+
leverageRepayFutureLeverage(stateCollateral_1, userCollateral_1, userBorrowed_1) {
|
|
801
|
+
return __awaiter(this, arguments, void 0, function* (stateCollateral, userCollateral, userBorrowed, userAddress = '') {
|
|
802
|
+
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
803
|
+
this._checkLeverageZap();
|
|
804
|
+
const { stateCollateral: currentStateCollateral, totalDepositFromUser } = yield this.market._getCurrentLeverageParams(userAddress);
|
|
805
|
+
const collateralFromUserBorrowed = yield this.market.swapExpected(0, 1, userBorrowed);
|
|
806
|
+
const futureCollateralState = BN(currentStateCollateral).minus(stateCollateral);
|
|
807
|
+
const futureTotalDepositFromUserPrecise = BN(totalDepositFromUser).plus(userCollateral).plus(collateralFromUserBorrowed);
|
|
808
|
+
return futureCollateralState.div(futureTotalDepositFromUserPrecise).toString();
|
|
809
|
+
});
|
|
810
|
+
}
|
|
789
811
|
}
|
package/package.json
CHANGED
package/src/interfaces.ts
CHANGED
|
@@ -248,4 +248,11 @@ export type GetExpectedFn = (
|
|
|
248
248
|
toToken: string,
|
|
249
249
|
amountIn: bigint,
|
|
250
250
|
blacklist: string | string[],
|
|
251
|
-
) => Promise<IQuote>;
|
|
251
|
+
) => Promise<IQuote>;
|
|
252
|
+
|
|
253
|
+
export interface IRates {
|
|
254
|
+
borrowApr: string;
|
|
255
|
+
lendApr: string;
|
|
256
|
+
borrowApy: string;
|
|
257
|
+
lendApy: string;
|
|
258
|
+
}
|
|
@@ -23,7 +23,7 @@ import {
|
|
|
23
23
|
smartNumber,
|
|
24
24
|
calculateFutureLeverage,
|
|
25
25
|
} from "../utils.js";
|
|
26
|
-
import {IDict, TGas, TAmount, IReward, IQuoteOdos, IOneWayMarket, IPartialFrac} from "../interfaces.js";
|
|
26
|
+
import {IDict, TGas, TAmount, IReward, IQuoteOdos, IOneWayMarket, IPartialFrac, IRates} from "../interfaces.js";
|
|
27
27
|
import { _getExpectedOdos, _getQuoteOdos, _assembleTxOdos, _getUserCollateral, _getUserCollateralForce, _getMarketsData } from "../external-api.js";
|
|
28
28
|
import ERC20Abi from '../constants/abis/ERC20.json' with {type: 'json'};
|
|
29
29
|
import {cacheKey, cacheStats} from "../cache/index.js";
|
|
@@ -214,6 +214,7 @@ export class LendMarketTemplate {
|
|
|
214
214
|
borrowMoreApprove: (userCollateral: TAmount, userBorrowed: TAmount) => Promise<string[]>,
|
|
215
215
|
borrowMoreRouteImage: (userBorrowed: TAmount, debt: TAmount) => Promise<string>,
|
|
216
216
|
borrowMore: (userCollateral: TAmount, userBorrowed: TAmount, debt: TAmount, slippage?: number) => Promise<string>,
|
|
217
|
+
borrowMoreFutureLeverage: (userCollateral: TAmount, userBorrowed: TAmount, debt: TAmount, userAddress?: string, slippage?: number) => Promise<string>,
|
|
217
218
|
|
|
218
219
|
repayExpectedBorrowed: (stateCollateral: TAmount, userCollateral: TAmount, userBorrowed: TAmount, slippage?: number) =>
|
|
219
220
|
Promise<{ totalBorrowed: string, borrowedFromStateCollateral: string, borrowedFromUserCollateral: string, userBorrowed: string, avgPrice: string }>,
|
|
@@ -227,6 +228,7 @@ export class LendMarketTemplate {
|
|
|
227
228
|
repayApprove: (userCollateral: TAmount, userBorrowed: TAmount) => Promise<string[]>,
|
|
228
229
|
repayRouteImage: (stateCollateral: TAmount, userCollateral: TAmount) => Promise<string>,
|
|
229
230
|
repay: (stateCollateral: TAmount, userCollateral: TAmount, userBorrowed: TAmount, slippage?: number) => Promise<string>,
|
|
231
|
+
repayFutureLeverage: (stateCollateral: TAmount, userCollateral: TAmount, userBorrowed: TAmount, userAddress?: string, slippage?: number) => Promise<string>,
|
|
230
232
|
|
|
231
233
|
estimateGas: {
|
|
232
234
|
createLoanApprove: (userCollateral: TAmount, userBorrowed: TAmount) => Promise<TGas>,
|
|
@@ -365,6 +367,7 @@ export class LendMarketTemplate {
|
|
|
365
367
|
borrowMoreApprove: this.leverageCreateLoanApprove.bind(this),
|
|
366
368
|
borrowMoreRouteImage: this.leverageBorrowMoreRouteImage.bind(this),
|
|
367
369
|
borrowMore: this.leverageBorrowMore.bind(this),
|
|
370
|
+
borrowMoreFutureLeverage: this.leverageBorrowMoreFutureLeverage.bind(this),
|
|
368
371
|
|
|
369
372
|
repayExpectedBorrowed: this.leverageRepayExpectedBorrowed.bind(this),
|
|
370
373
|
repayPriceImpact: this.leverageRepayPriceImpact.bind(this),
|
|
@@ -377,6 +380,7 @@ export class LendMarketTemplate {
|
|
|
377
380
|
repayApprove: this.leverageRepayApprove.bind(this),
|
|
378
381
|
repayRouteImage: this.leverageRepayRouteImage.bind(this),
|
|
379
382
|
repay: this.leverageRepay.bind(this),
|
|
383
|
+
repayFutureLeverage: this.leverageRepayFutureLeverage.bind(this),
|
|
380
384
|
|
|
381
385
|
estimateGas: {
|
|
382
386
|
createLoanApprove: this.leverageCreateLoanApproveEstimateGas.bind(this),
|
|
@@ -414,6 +418,7 @@ export class LendMarketTemplate {
|
|
|
414
418
|
borrowMoreApprove: leverageZapV2.leverageCreateLoanApprove.bind(leverageZapV2),
|
|
415
419
|
borrowMoreExpectedMetrics: leverageZapV2.leverageBorrowMoreExpectedMetrics.bind(leverageZapV2),
|
|
416
420
|
borrowMore: leverageZapV2.leverageBorrowMore.bind(leverageZapV2),
|
|
421
|
+
borrowMoreFutureLeverage: leverageZapV2.leverageBorrowMoreFutureLeverage.bind(leverageZapV2),
|
|
417
422
|
|
|
418
423
|
repayExpectedBorrowed: leverageZapV2.leverageRepayExpectedBorrowed.bind(leverageZapV2),
|
|
419
424
|
repayIsFull: leverageZapV2.leverageRepayIsFull.bind(leverageZapV2),
|
|
@@ -422,6 +427,7 @@ export class LendMarketTemplate {
|
|
|
422
427
|
repayIsApproved: leverageZapV2.leverageRepayIsApproved.bind(leverageZapV2),
|
|
423
428
|
repayApprove: leverageZapV2.leverageRepayApprove.bind(leverageZapV2),
|
|
424
429
|
repay: leverageZapV2.leverageRepay.bind(leverageZapV2),
|
|
430
|
+
repayFutureLeverage: leverageZapV2.leverageRepayFutureLeverage.bind(leverageZapV2),
|
|
425
431
|
|
|
426
432
|
estimateGas: {
|
|
427
433
|
createLoanApprove: leverageZapV2.leverageCreateLoanApproveEstimateGas.bind(leverageZapV2),
|
|
@@ -1010,7 +1016,7 @@ export class LendMarketTemplate {
|
|
|
1010
1016
|
return await mpContract.future_rate(this.addresses.controller, _dReserves, _dDebt);
|
|
1011
1017
|
}
|
|
1012
1018
|
|
|
1013
|
-
private async statsRates(isGetter = true, useAPI = false): Promise<
|
|
1019
|
+
private async statsRates(isGetter = true, useAPI = false): Promise<IRates> {
|
|
1014
1020
|
if(useAPI) {
|
|
1015
1021
|
const response = await _getMarketsData(this.llamalend.constants.NETWORK_NAME);
|
|
1016
1022
|
|
|
@@ -1046,7 +1052,7 @@ export class LendMarketTemplate {
|
|
|
1046
1052
|
}
|
|
1047
1053
|
}
|
|
1048
1054
|
|
|
1049
|
-
private async statsFutureRates(dReserves: TAmount, dDebt: TAmount, useAPI = true): Promise<
|
|
1055
|
+
private async statsFutureRates(dReserves: TAmount, dDebt: TAmount, useAPI = true): Promise<IRates> {
|
|
1050
1056
|
const _dReserves = parseUnits(dReserves, this.borrowed_token.decimals);
|
|
1051
1057
|
const _dDebt = parseUnits(dDebt, this.borrowed_token.decimals);
|
|
1052
1058
|
const _rate = await this._getFutureRate(_dReserves, _dDebt);
|
|
@@ -1718,6 +1724,30 @@ export class LendMarketTemplate {
|
|
|
1718
1724
|
return await this._borrowMore(collateral, debt, false) as string;
|
|
1719
1725
|
}
|
|
1720
1726
|
|
|
1727
|
+
public async _getCurrentLeverageParams(userAddress: string) {
|
|
1728
|
+
const [userCollateralData, { collateral: stateCollateral }] = await Promise.all([
|
|
1729
|
+
_getUserCollateral(this.llamalend.constants.NETWORK_NAME, this.addresses.controller, userAddress),
|
|
1730
|
+
this.userState(userAddress),
|
|
1731
|
+
]);
|
|
1732
|
+
|
|
1733
|
+
return {
|
|
1734
|
+
stateCollateral,
|
|
1735
|
+
totalDepositFromUser: userCollateralData.total_deposit_from_user_precise,
|
|
1736
|
+
};
|
|
1737
|
+
}
|
|
1738
|
+
|
|
1739
|
+
public async borrowMoreFutureLeverage(collateral: number | string, debt: number | string, userAddress = ''): Promise<string> {
|
|
1740
|
+
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
1741
|
+
const { stateCollateral, totalDepositFromUser } = await this._getCurrentLeverageParams(userAddress);
|
|
1742
|
+
|
|
1743
|
+
const collateralFromDebt = await this.swapExpected(0, 1, debt);
|
|
1744
|
+
|
|
1745
|
+
const futureCollateralState = BN(stateCollateral).plus(collateralFromDebt);
|
|
1746
|
+
const futureTotalDepositFromUserPrecise = BN(totalDepositFromUser).plus(collateral);
|
|
1747
|
+
|
|
1748
|
+
return futureCollateralState.div(futureTotalDepositFromUserPrecise).toString();
|
|
1749
|
+
}
|
|
1750
|
+
|
|
1721
1751
|
// ---------------- ADD COLLATERAL ----------------
|
|
1722
1752
|
|
|
1723
1753
|
private async _addCollateralBands(collateral: number | string, address = ""): Promise<[bigint, bigint]> {
|
|
@@ -1796,14 +1826,9 @@ export class LendMarketTemplate {
|
|
|
1796
1826
|
|
|
1797
1827
|
public async addCollateralFutureLeverage(collateral: number | string, userAddress = ''): Promise<string> {
|
|
1798
1828
|
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
1799
|
-
const
|
|
1800
|
-
_getUserCollateral(this.llamalend.constants.NETWORK_NAME, this.addresses.controller, userAddress),
|
|
1801
|
-
this.userState(userAddress),
|
|
1802
|
-
]);
|
|
1829
|
+
const { stateCollateral, totalDepositFromUser } = await this._getCurrentLeverageParams(userAddress);
|
|
1803
1830
|
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
return calculateFutureLeverage(currentCollateral, total_deposit_from_user, collateral, 'add');
|
|
1831
|
+
return calculateFutureLeverage(stateCollateral, totalDepositFromUser, collateral, 'add');
|
|
1807
1832
|
}
|
|
1808
1833
|
|
|
1809
1834
|
// ---------------- REMOVE COLLATERAL ----------------
|
|
@@ -1874,14 +1899,9 @@ export class LendMarketTemplate {
|
|
|
1874
1899
|
|
|
1875
1900
|
public async removeCollateralFutureLeverage(collateral: number | string, userAddress = ''): Promise<string> {
|
|
1876
1901
|
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
1877
|
-
const
|
|
1878
|
-
_getUserCollateral(this.llamalend.constants.NETWORK_NAME, this.addresses.controller, userAddress),
|
|
1879
|
-
this.userState(userAddress),
|
|
1880
|
-
]);
|
|
1881
|
-
|
|
1882
|
-
const total_deposit_from_user = userCollateral.total_deposit_from_user_precise;
|
|
1902
|
+
const { stateCollateral, totalDepositFromUser } = await this._getCurrentLeverageParams(userAddress);
|
|
1883
1903
|
|
|
1884
|
-
return calculateFutureLeverage(
|
|
1904
|
+
return calculateFutureLeverage(stateCollateral, totalDepositFromUser, collateral, 'remove');
|
|
1885
1905
|
}
|
|
1886
1906
|
|
|
1887
1907
|
// ---------------- REPAY ----------------
|
|
@@ -1961,6 +1981,18 @@ export class LendMarketTemplate {
|
|
|
1961
1981
|
return await this._repay(debt, address, false) as string;
|
|
1962
1982
|
}
|
|
1963
1983
|
|
|
1984
|
+
public async repayFutureLeverage(debt: number | string, userAddress = ''): Promise<string> {
|
|
1985
|
+
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
1986
|
+
const { stateCollateral, totalDepositFromUser } = await this._getCurrentLeverageParams(userAddress);
|
|
1987
|
+
|
|
1988
|
+
const collateralFromDebt = await this.swapExpected(0, 1, debt);
|
|
1989
|
+
|
|
1990
|
+
const futureCollateralState = BN(stateCollateral);
|
|
1991
|
+
const futureTotalDepositFromUserPrecise = BN(totalDepositFromUser).plus(collateralFromDebt);
|
|
1992
|
+
|
|
1993
|
+
return futureCollateralState.div(futureTotalDepositFromUserPrecise).toString();
|
|
1994
|
+
}
|
|
1995
|
+
|
|
1964
1996
|
// ---------------- FULL REPAY ----------------
|
|
1965
1997
|
|
|
1966
1998
|
private async _fullRepayAmount(address = ""): Promise<string> {
|
|
@@ -2930,6 +2962,32 @@ export class LendMarketTemplate {
|
|
|
2930
2962
|
return await this._leverageBorrowMore(userCollateral, userBorrowed, debt, slippage, false) as string;
|
|
2931
2963
|
}
|
|
2932
2964
|
|
|
2965
|
+
private async leverageBorrowMoreFutureLeverage(
|
|
2966
|
+
userCollateral: TAmount,
|
|
2967
|
+
userBorrowed: TAmount,
|
|
2968
|
+
debt: TAmount,
|
|
2969
|
+
userAddress = '',
|
|
2970
|
+
slippage = 0.1
|
|
2971
|
+
): Promise<string> {
|
|
2972
|
+
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
2973
|
+
this._checkLeverageZap();
|
|
2974
|
+
|
|
2975
|
+
const { stateCollateral, totalDepositFromUser } = await this._getCurrentLeverageParams(userAddress);
|
|
2976
|
+
|
|
2977
|
+
const expected = await this.leverageBorrowMoreExpectedCollateral(
|
|
2978
|
+
userCollateral,
|
|
2979
|
+
userBorrowed,
|
|
2980
|
+
debt,
|
|
2981
|
+
slippage,
|
|
2982
|
+
userAddress
|
|
2983
|
+
);
|
|
2984
|
+
|
|
2985
|
+
const futureCollateralState = BN(stateCollateral).plus(expected.totalCollateral);
|
|
2986
|
+
const futureTotalDepositFromUserPrecise = BN(totalDepositFromUser).plus(userCollateral).plus(expected.collateralFromUserBorrowed);
|
|
2987
|
+
|
|
2988
|
+
return futureCollateralState.div(futureTotalDepositFromUserPrecise).toString();
|
|
2989
|
+
}
|
|
2990
|
+
|
|
2933
2991
|
// ---------------- LEVERAGE REPAY ----------------
|
|
2934
2992
|
|
|
2935
2993
|
private _leverageRepayExpectedBorrowed = (stateCollateral: TAmount, userCollateral: TAmount, userBorrowed: TAmount):
|
|
@@ -3153,16 +3211,35 @@ export class LendMarketTemplate {
|
|
|
3153
3211
|
return await this._leverageRepay(stateCollateral, userCollateral, userBorrowed, slippage, false) as string;
|
|
3154
3212
|
}
|
|
3155
3213
|
|
|
3156
|
-
|
|
3214
|
+
private async leverageRepayFutureLeverage(
|
|
3215
|
+
stateCollateral: TAmount,
|
|
3216
|
+
userCollateral: TAmount,
|
|
3217
|
+
userBorrowed: TAmount,
|
|
3218
|
+
userAddress = ''
|
|
3219
|
+
): Promise<string> {
|
|
3157
3220
|
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
3158
|
-
|
|
3221
|
+
this._checkLeverageZap();
|
|
3222
|
+
|
|
3223
|
+
const [userCollateralData, { collateral: currentStateCollateral }] = await Promise.all([
|
|
3159
3224
|
_getUserCollateral(this.llamalend.constants.NETWORK_NAME, this.addresses.controller, userAddress),
|
|
3160
3225
|
this.userState(userAddress),
|
|
3161
3226
|
]);
|
|
3162
3227
|
|
|
3163
|
-
const
|
|
3228
|
+
const totalDepositFromUser = userCollateralData.total_deposit_from_user_precise;
|
|
3229
|
+
|
|
3230
|
+
const collateralFromUserBorrowed = await this.swapExpected(0, 1, userBorrowed);
|
|
3231
|
+
|
|
3232
|
+
const futureCollateralState = BN(currentStateCollateral).minus(stateCollateral);
|
|
3233
|
+
const futureTotalDepositFromUserPrecise = BN(totalDepositFromUser).plus(userCollateral).plus(collateralFromUserBorrowed);
|
|
3234
|
+
|
|
3235
|
+
return futureCollateralState.div(futureTotalDepositFromUserPrecise).toString();
|
|
3236
|
+
}
|
|
3237
|
+
|
|
3238
|
+
public async currentLeverage(userAddress = ''): Promise<string> {
|
|
3239
|
+
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
3240
|
+
const { stateCollateral, totalDepositFromUser } = await this._getCurrentLeverageParams(userAddress);
|
|
3164
3241
|
|
|
3165
|
-
return BN(
|
|
3242
|
+
return BN(stateCollateral).div(totalDepositFromUser).toString();
|
|
3166
3243
|
}
|
|
3167
3244
|
|
|
3168
3245
|
public async currentPnL(userAddress = ''): Promise<Record<string, string>> {
|
|
@@ -190,6 +190,13 @@ export interface ILeverageZapV2 {
|
|
|
190
190
|
router: string,
|
|
191
191
|
calldata: string
|
|
192
192
|
}) => Promise<string>,
|
|
193
|
+
borrowMoreFutureLeverage: ({ userCollateral, userBorrowed, debt, quote, address }: {
|
|
194
|
+
userCollateral: TAmount,
|
|
195
|
+
userBorrowed: TAmount,
|
|
196
|
+
debt: TAmount,
|
|
197
|
+
quote: IQuote,
|
|
198
|
+
address?: string
|
|
199
|
+
}) => Promise<string>,
|
|
193
200
|
|
|
194
201
|
repayExpectedBorrowed: ({ stateCollateral, userCollateral, userBorrowed, quote }: {
|
|
195
202
|
stateCollateral: TAmount,
|
|
@@ -240,6 +247,13 @@ export interface ILeverageZapV2 {
|
|
|
240
247
|
router: string,
|
|
241
248
|
calldata: string
|
|
242
249
|
}) => Promise<string>,
|
|
250
|
+
repayFutureLeverage: ({ stateCollateral, userCollateral, userBorrowed, quote, address }: {
|
|
251
|
+
stateCollateral: TAmount,
|
|
252
|
+
userCollateral: TAmount,
|
|
253
|
+
userBorrowed: TAmount,
|
|
254
|
+
quote: IQuote,
|
|
255
|
+
address?: string
|
|
256
|
+
}) => Promise<string>,
|
|
243
257
|
|
|
244
258
|
estimateGas: {
|
|
245
259
|
createLoanApprove: ({ userCollateral, userBorrowed }: {
|
|
@@ -740,6 +740,32 @@ export class LeverageZapV2Module {
|
|
|
740
740
|
return await this._leverageBorrowMore(userCollateral, userBorrowed, debt, router, calldata, false) as string;
|
|
741
741
|
}
|
|
742
742
|
|
|
743
|
+
public async leverageBorrowMoreFutureLeverage({ userCollateral, userBorrowed, debt, quote, address = "" }: {
|
|
744
|
+
userCollateral: TAmount,
|
|
745
|
+
userBorrowed: TAmount,
|
|
746
|
+
debt: TAmount,
|
|
747
|
+
quote: IQuote,
|
|
748
|
+
address?: string
|
|
749
|
+
}): Promise<string> {
|
|
750
|
+
address = _getAddress.call(this.llamalend, address);
|
|
751
|
+
this._checkLeverageZap();
|
|
752
|
+
|
|
753
|
+
const { stateCollateral, totalDepositFromUser } = await this.market._getCurrentLeverageParams(address);
|
|
754
|
+
|
|
755
|
+
const expected = await this.leverageBorrowMoreExpectedCollateral({
|
|
756
|
+
userCollateral,
|
|
757
|
+
userBorrowed,
|
|
758
|
+
dDebt: debt,
|
|
759
|
+
quote,
|
|
760
|
+
address,
|
|
761
|
+
});
|
|
762
|
+
|
|
763
|
+
const futureCollateralState = BN(stateCollateral).plus(expected.totalCollateral);
|
|
764
|
+
const futureTotalDepositFromUserPrecise = BN(totalDepositFromUser).plus(userCollateral).plus(expected.collateralFromUserBorrowed);
|
|
765
|
+
|
|
766
|
+
return futureCollateralState.div(futureTotalDepositFromUserPrecise).toString();
|
|
767
|
+
}
|
|
768
|
+
|
|
743
769
|
// ---------------- LEVERAGE REPAY ----------------
|
|
744
770
|
|
|
745
771
|
private _leverageRepayExpectedBorrowed = (stateCollateral: TAmount, userCollateral: TAmount, userBorrowed: TAmount, quote: IQuote):
|
|
@@ -988,4 +1014,23 @@ export class LeverageZapV2Module {
|
|
|
988
1014
|
await this.leverageRepayApprove({ userCollateral, userBorrowed });
|
|
989
1015
|
return await this._leverageRepay(stateCollateral, userCollateral, userBorrowed, router, calldata, false) as string;
|
|
990
1016
|
}
|
|
1017
|
+
|
|
1018
|
+
public async leverageRepayFutureLeverage({ stateCollateral, userCollateral, userBorrowed, address = "" }: {
|
|
1019
|
+
stateCollateral: TAmount,
|
|
1020
|
+
userCollateral: TAmount,
|
|
1021
|
+
userBorrowed: TAmount,
|
|
1022
|
+
address?: string
|
|
1023
|
+
}): Promise<string> {
|
|
1024
|
+
address = _getAddress.call(this.llamalend, address);
|
|
1025
|
+
this._checkLeverageZap();
|
|
1026
|
+
|
|
1027
|
+
const { stateCollateral: currentStateCollateral, totalDepositFromUser } = await this.market._getCurrentLeverageParams(address);
|
|
1028
|
+
|
|
1029
|
+
const collateralFromUserBorrowed = await this.market.swapExpected(0, 1, userBorrowed);
|
|
1030
|
+
|
|
1031
|
+
const futureCollateralState = BN(currentStateCollateral).minus(stateCollateral);
|
|
1032
|
+
const futureTotalDepositFromUserPrecise = BN(totalDepositFromUser).plus(userCollateral).plus(collateralFromUserBorrowed);
|
|
1033
|
+
|
|
1034
|
+
return futureCollateralState.div(futureTotalDepositFromUserPrecise).toString();
|
|
1035
|
+
}
|
|
991
1036
|
}
|
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
DIGas,
|
|
22
22
|
calculateFutureLeverage,
|
|
23
23
|
} from "../utils.js";
|
|
24
|
-
import {IDict, ILlamma, TGas} from "../interfaces.js";
|
|
24
|
+
import {IDict, ILlamma, TGas, IRates} from "../interfaces.js";
|
|
25
25
|
import {_getUserCollateralCrvUsd, _getUserCollateralCrvUsdFull} from "../external-api.js";
|
|
26
26
|
import { ILeverageV2 } from "./interfaces/leverage.js";
|
|
27
27
|
import { LeverageV2Module } from "./modules/index.js";
|
|
@@ -71,8 +71,8 @@ export class MintMarketTemplate {
|
|
|
71
71
|
parameters: () => Promise<{
|
|
72
72
|
fee: string, // %
|
|
73
73
|
admin_fee: string, // %
|
|
74
|
-
|
|
75
|
-
|
|
74
|
+
rates: IRates,
|
|
75
|
+
future_rates: IRates,
|
|
76
76
|
liquidation_discount: string, // %
|
|
77
77
|
loan_discount: string, // %
|
|
78
78
|
}>,
|
|
@@ -238,6 +238,7 @@ export class MintMarketTemplate {
|
|
|
238
238
|
borrowMoreApprove: leverageV2.leverageCreateLoanApprove.bind(leverageV2),
|
|
239
239
|
borrowMoreRouteImage: leverageV2.leverageBorrowMoreRouteImage.bind(leverageV2),
|
|
240
240
|
borrowMore: leverageV2.leverageBorrowMore.bind(leverageV2),
|
|
241
|
+
borrowMoreFutureLeverage: leverageV2.leverageBorrowMoreFutureLeverage.bind(leverageV2),
|
|
241
242
|
|
|
242
243
|
repayExpectedBorrowed: leverageV2.leverageRepayExpectedBorrowed.bind(leverageV2),
|
|
243
244
|
repayPriceImpact: leverageV2.leverageRepayPriceImpact.bind(leverageV2),
|
|
@@ -250,6 +251,7 @@ export class MintMarketTemplate {
|
|
|
250
251
|
repayApprove: leverageV2.leverageRepayApprove.bind(leverageV2),
|
|
251
252
|
repayRouteImage: leverageV2.leverageRepayRouteImage.bind(leverageV2),
|
|
252
253
|
repay: leverageV2.leverageRepay.bind(leverageV2),
|
|
254
|
+
repayFutureLeverage: leverageV2.leverageRepayFutureLeverage.bind(leverageV2),
|
|
253
255
|
|
|
254
256
|
estimateGas: {
|
|
255
257
|
createLoanApprove: leverageV2.leverageCreateLoanApproveEstimateGas.bind(leverageV2),
|
|
@@ -280,11 +282,23 @@ export class MintMarketTemplate {
|
|
|
280
282
|
|
|
281
283
|
// ---------------- STATS ----------------
|
|
282
284
|
|
|
285
|
+
private _buildRatesObject(rate: bigint): IRates {
|
|
286
|
+
const borrowApr = toBN(rate).times(365).times(86400).times(100).toString();
|
|
287
|
+
// borrowApy = e**(rate*365*86400) - 1
|
|
288
|
+
const borrowApy = String(((2.718281828459 ** (toBN(rate).times(365).times(86400)).toNumber()) - 1) * 100);
|
|
289
|
+
return {
|
|
290
|
+
borrowApr,
|
|
291
|
+
borrowApy,
|
|
292
|
+
lendApr: "0",
|
|
293
|
+
lendApy: "0",
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
|
|
283
297
|
public statsParameters = memoize(async (): Promise<{
|
|
284
298
|
fee: string, // %
|
|
285
299
|
admin_fee: string, // %
|
|
286
|
-
|
|
287
|
-
|
|
300
|
+
rates: IRates,
|
|
301
|
+
future_rates: IRates,
|
|
288
302
|
liquidation_discount: string, // %
|
|
289
303
|
loan_discount: string, // %
|
|
290
304
|
}> => {
|
|
@@ -305,11 +319,10 @@ export class MintMarketTemplate {
|
|
|
305
319
|
const [fee, admin_fee, liquidation_discount, loan_discount] = [_fee, _admin_fee, _liquidation_discount, _loan_discount]
|
|
306
320
|
.map((x) => formatUnits(x * BigInt(100)));
|
|
307
321
|
|
|
308
|
-
|
|
309
|
-
const
|
|
310
|
-
const future_rate = String(((2.718281828459 ** Number((toBN(_mp_rate).times(365).times(86400)))) - 1) * 100);
|
|
322
|
+
const rates = this._buildRatesObject(_rate);
|
|
323
|
+
const future_rates = this._buildRatesObject(_mp_rate);
|
|
311
324
|
|
|
312
|
-
return { fee, admin_fee,
|
|
325
|
+
return { fee, admin_fee, rates, future_rates, liquidation_discount, loan_discount }
|
|
313
326
|
},
|
|
314
327
|
{
|
|
315
328
|
promise: true,
|
|
@@ -924,6 +937,31 @@ export class MintMarketTemplate {
|
|
|
924
937
|
return await this._borrowMore(collateral, debt, false) as string;
|
|
925
938
|
}
|
|
926
939
|
|
|
940
|
+
public async _getCurrentLeverageParams(userAddress: string) {
|
|
941
|
+
const [userCollateralData, { collateral: stateCollateral }] = await Promise.all([
|
|
942
|
+
_getUserCollateralCrvUsdFull(this.llamalend.constants.NETWORK_NAME, this.controller, userAddress),
|
|
943
|
+
this.userState(userAddress),
|
|
944
|
+
]);
|
|
945
|
+
|
|
946
|
+
return {
|
|
947
|
+
stateCollateral,
|
|
948
|
+
totalDepositFromUser: userCollateralData.total_deposit_from_user_precise ?? userCollateralData.total_deposit_precise,
|
|
949
|
+
};
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
public async borrowMoreFutureLeverage(collateral: number | string, debt: number | string, userAddress = ''): Promise<string> {
|
|
953
|
+
if (!this.isDeleverageSupported) throw Error("This market does not support borrowMoreFutureLeverage");
|
|
954
|
+
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
955
|
+
const { stateCollateral, totalDepositFromUser } = await this._getCurrentLeverageParams(userAddress);
|
|
956
|
+
|
|
957
|
+
const collateralFromDebt = await this.swapExpected(0, 1, debt);
|
|
958
|
+
|
|
959
|
+
const futureCollateralState = BN(stateCollateral).plus(collateralFromDebt);
|
|
960
|
+
const futureTotalDepositFromUserPrecise = BN(totalDepositFromUser).plus(collateral);
|
|
961
|
+
|
|
962
|
+
return futureCollateralState.div(futureTotalDepositFromUserPrecise).toString();
|
|
963
|
+
}
|
|
964
|
+
|
|
927
965
|
// ---------------- ADD COLLATERAL ----------------
|
|
928
966
|
|
|
929
967
|
private async _addCollateralBands(collateral: number | string, address = ""): Promise<[bigint, bigint]> {
|
|
@@ -1005,14 +1043,9 @@ export class MintMarketTemplate {
|
|
|
1005
1043
|
public async addCollateralFutureLeverage(collateral: number | string, userAddress = ''): Promise<string> {
|
|
1006
1044
|
this._checkLeverageForStats();
|
|
1007
1045
|
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
1008
|
-
const
|
|
1009
|
-
_getUserCollateralCrvUsdFull(this.llamalend.constants.NETWORK_NAME, this.controller, userAddress),
|
|
1010
|
-
this.userState(userAddress),
|
|
1011
|
-
]);
|
|
1046
|
+
const { stateCollateral, totalDepositFromUser } = await this._getCurrentLeverageParams(userAddress);
|
|
1012
1047
|
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
return calculateFutureLeverage(currentCollateral, total_deposit_from_user, collateral, 'add');
|
|
1048
|
+
return calculateFutureLeverage(stateCollateral, totalDepositFromUser, collateral, 'add');
|
|
1016
1049
|
}
|
|
1017
1050
|
|
|
1018
1051
|
// ---------------- REMOVE COLLATERAL ----------------
|
|
@@ -1086,14 +1119,9 @@ export class MintMarketTemplate {
|
|
|
1086
1119
|
public async removeCollateralFutureLeverage(collateral: number | string, userAddress = ''): Promise<string> {
|
|
1087
1120
|
this._checkLeverageForStats();
|
|
1088
1121
|
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
1089
|
-
const
|
|
1090
|
-
_getUserCollateralCrvUsdFull(this.llamalend.constants.NETWORK_NAME, this.controller, userAddress),
|
|
1091
|
-
this.userState(userAddress),
|
|
1092
|
-
]);
|
|
1122
|
+
const { stateCollateral, totalDepositFromUser } = await this._getCurrentLeverageParams(userAddress);
|
|
1093
1123
|
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
return calculateFutureLeverage(currentCollateral, total_deposit_from_user, collateral, 'remove');
|
|
1124
|
+
return calculateFutureLeverage(stateCollateral, totalDepositFromUser, collateral, 'remove');
|
|
1097
1125
|
}
|
|
1098
1126
|
|
|
1099
1127
|
// ---------------- REPAY ----------------
|
|
@@ -1173,6 +1201,19 @@ export class MintMarketTemplate {
|
|
|
1173
1201
|
return await this._repay(debt, address, false) as string;
|
|
1174
1202
|
}
|
|
1175
1203
|
|
|
1204
|
+
public async repayFutureLeverage(debt: number | string, userAddress = ''): Promise<string> {
|
|
1205
|
+
if (!this.isDeleverageSupported) throw Error("This market does not support repayFutureLeverage");
|
|
1206
|
+
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
1207
|
+
const { stateCollateral, totalDepositFromUser } = await this._getCurrentLeverageParams(userAddress);
|
|
1208
|
+
|
|
1209
|
+
const collateralFromDebt = await this.swapExpected(0, 1, debt);
|
|
1210
|
+
|
|
1211
|
+
const futureCollateralState = BN(stateCollateral);
|
|
1212
|
+
const futureTotalDepositFromUserPrecise = BN(totalDepositFromUser).plus(collateralFromDebt);
|
|
1213
|
+
|
|
1214
|
+
return futureCollateralState.div(futureTotalDepositFromUserPrecise).toString();
|
|
1215
|
+
}
|
|
1216
|
+
|
|
1176
1217
|
// ---------------- FULL REPAY ----------------
|
|
1177
1218
|
|
|
1178
1219
|
private async _fullRepayAmount(address = ""): Promise<string> {
|
|
@@ -1911,14 +1952,9 @@ export class MintMarketTemplate {
|
|
|
1911
1952
|
this._checkLeverageForStats();
|
|
1912
1953
|
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
1913
1954
|
|
|
1914
|
-
const
|
|
1915
|
-
_getUserCollateralCrvUsdFull(this.llamalend.constants.NETWORK_NAME, this.controller, userAddress),
|
|
1916
|
-
this.userState(userAddress),
|
|
1917
|
-
]);
|
|
1918
|
-
|
|
1919
|
-
const total_deposit_from_user = userCollateral.total_deposit_from_user_precise ?? userCollateral.total_deposit_precise;
|
|
1955
|
+
const { stateCollateral, totalDepositFromUser } = await this._getCurrentLeverageParams(userAddress);
|
|
1920
1956
|
|
|
1921
|
-
return BN(
|
|
1957
|
+
return BN(stateCollateral).div(totalDepositFromUser).toString();
|
|
1922
1958
|
}
|
|
1923
1959
|
|
|
1924
1960
|
public async currentPnL(userAddress = ''): Promise<Record<string, string>> {
|
|
@@ -71,6 +71,7 @@ export interface ILeverageV2 {
|
|
|
71
71
|
borrowMoreApprove: (userCollateral: TAmount, userBorrowed: TAmount) => Promise<string[]>,
|
|
72
72
|
borrowMoreRouteImage: (userBorrowed: TAmount, debt: TAmount) => Promise<string>,
|
|
73
73
|
borrowMore: (userCollateral: TAmount, userBorrowed: TAmount, debt: TAmount, slippage?: number) => Promise<string>,
|
|
74
|
+
borrowMoreFutureLeverage: (userCollateral: TAmount, userBorrowed: TAmount, debt: TAmount, userAddress?: string, slippage?: number) => Promise<string>,
|
|
74
75
|
|
|
75
76
|
repayExpectedBorrowed: (stateCollateral: TAmount, userCollateral: TAmount, userBorrowed: TAmount, slippage?: number) =>
|
|
76
77
|
Promise<{
|
|
@@ -90,6 +91,7 @@ export interface ILeverageV2 {
|
|
|
90
91
|
repayApprove: (userCollateral: TAmount, userBorrowed: TAmount) => Promise<string[]>,
|
|
91
92
|
repayRouteImage: (stateCollateral: TAmount, userCollateral: TAmount) => Promise<string>,
|
|
92
93
|
repay: (stateCollateral: TAmount, userCollateral: TAmount, userBorrowed: TAmount, slippage?: number) => Promise<string>,
|
|
94
|
+
repayFutureLeverage: (stateCollateral: TAmount, userCollateral: TAmount, userBorrowed: TAmount, userAddress?: string, slippage?: number) => Promise<string>,
|
|
93
95
|
|
|
94
96
|
estimateGas: {
|
|
95
97
|
createLoanApprove: (userCollateral: TAmount, userBorrowed: TAmount) => Promise<TGas>,
|
|
@@ -704,6 +704,26 @@ export class LeverageV2Module {
|
|
|
704
704
|
return await this._leverageBorrowMore(userCollateral, userBorrowed, debt, slippage, false) as string;
|
|
705
705
|
}
|
|
706
706
|
|
|
707
|
+
public async leverageBorrowMoreFutureLeverage(
|
|
708
|
+
userCollateral: TAmount,
|
|
709
|
+
userBorrowed: TAmount,
|
|
710
|
+
debt: TAmount,
|
|
711
|
+
userAddress = '',
|
|
712
|
+
slippage = 0.1
|
|
713
|
+
): Promise<string> {
|
|
714
|
+
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
715
|
+
this._checkLeverageZap();
|
|
716
|
+
|
|
717
|
+
const { stateCollateral, totalDepositFromUser } = await this.market._getCurrentLeverageParams(userAddress);
|
|
718
|
+
|
|
719
|
+
const expected = await this.leverageBorrowMoreExpectedCollateral(userCollateral, userBorrowed, debt, slippage, userAddress);
|
|
720
|
+
|
|
721
|
+
const futureCollateralState = BN(stateCollateral).plus(expected.totalCollateral);
|
|
722
|
+
const futureTotalDepositFromUserPrecise = BN(totalDepositFromUser).plus(userCollateral).plus(expected.collateralFromUserBorrowed);
|
|
723
|
+
|
|
724
|
+
return futureCollateralState.div(futureTotalDepositFromUserPrecise).toString();
|
|
725
|
+
}
|
|
726
|
+
|
|
707
727
|
// ---------------- LEVERAGE REPAY ----------------
|
|
708
728
|
|
|
709
729
|
public _leverageRepayExpectedBorrowed = (stateCollateral: TAmount, userCollateral: TAmount, userBorrowed: TAmount):
|
|
@@ -929,4 +949,23 @@ export class LeverageV2Module {
|
|
|
929
949
|
await this.leverageRepayApprove(userCollateral, userBorrowed);
|
|
930
950
|
return await this._leverageRepay(stateCollateral, userCollateral, userBorrowed, slippage, false) as string;
|
|
931
951
|
}
|
|
952
|
+
|
|
953
|
+
public async leverageRepayFutureLeverage(
|
|
954
|
+
stateCollateral: TAmount,
|
|
955
|
+
userCollateral: TAmount,
|
|
956
|
+
userBorrowed: TAmount,
|
|
957
|
+
userAddress = ''
|
|
958
|
+
): Promise<string> {
|
|
959
|
+
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
960
|
+
this._checkLeverageZap();
|
|
961
|
+
|
|
962
|
+
const { stateCollateral: currentStateCollateral, totalDepositFromUser } = await this.market._getCurrentLeverageParams(userAddress);
|
|
963
|
+
|
|
964
|
+
const collateralFromUserBorrowed = await this.market.swapExpected(0, 1, userBorrowed);
|
|
965
|
+
|
|
966
|
+
const futureCollateralState = BN(currentStateCollateral).minus(stateCollateral);
|
|
967
|
+
const futureTotalDepositFromUserPrecise = BN(totalDepositFromUser).plus(userCollateral).plus(collateralFromUserBorrowed);
|
|
968
|
+
|
|
969
|
+
return futureCollateralState.div(futureTotalDepositFromUserPrecise).toString();
|
|
970
|
+
}
|
|
932
971
|
}
|