@curvefi/llamalend-api 1.1.5 → 1.1.7
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/constants/abis/crvUSD/controller_v2.json +4 -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 +6 -0
- package/lib/mintMarkets/MintMarketTemplate.js +48 -24
- 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/constants/abis/crvUSD/controller_v2.json +4 -0
- package/src/lendMarkets/LendMarketTemplate.ts +95 -18
- package/src/lendMarkets/interfaces/leverageZapV2.ts +14 -0
- package/src/lendMarkets/modules/leverageZapV2.ts +45 -0
- package/src/mintMarkets/MintMarketTemplate.ts +49 -24
- 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:
|
|
@@ -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
|
}
|
|
@@ -234,6 +234,11 @@ export declare class MintMarketTemplate {
|
|
|
234
234
|
private _borrowMore;
|
|
235
235
|
borrowMoreEstimateGas(collateral: number | string, debt: number | string): Promise<number>;
|
|
236
236
|
borrowMore(collateral: number | string, debt: number | string): Promise<string>;
|
|
237
|
+
_getCurrentLeverageParams(userAddress: string): Promise<{
|
|
238
|
+
stateCollateral: string;
|
|
239
|
+
totalDepositFromUser: number;
|
|
240
|
+
}>;
|
|
241
|
+
borrowMoreFutureLeverage(collateral: number | string, debt: number | string, userAddress?: string): Promise<string>;
|
|
237
242
|
private _addCollateralBands;
|
|
238
243
|
addCollateralBands(collateral: number | string, address?: string): Promise<[number, number]>;
|
|
239
244
|
addCollateralPrices(collateral: number | string, address?: string): Promise<string[]>;
|
|
@@ -264,6 +269,7 @@ export declare class MintMarketTemplate {
|
|
|
264
269
|
private _repay;
|
|
265
270
|
repayEstimateGas(debt: number | string, address?: string): Promise<number>;
|
|
266
271
|
repay(debt: number | string, address?: string): Promise<string>;
|
|
272
|
+
repayFutureLeverage(debt: number | string, userAddress?: string): Promise<string>;
|
|
267
273
|
private _fullRepayAmount;
|
|
268
274
|
fullRepayIsApproved(address?: string): Promise<boolean>;
|
|
269
275
|
private fullRepayApproveEstimateGas;
|
|
@@ -119,7 +119,7 @@ export class MintMarketTemplate {
|
|
|
119
119
|
const _collateral = parseUnits(collateral, this.collateralDecimals);
|
|
120
120
|
const calls = [];
|
|
121
121
|
for (let N = this.minBands; N <= this.maxBands; N++) {
|
|
122
|
-
calls.push(this.llamalend.contracts[this.controller].multicallContract.max_borrowable(_collateral, N));
|
|
122
|
+
calls.push(this.llamalend.contracts[this.controller].multicallContract.max_borrowable(...(this.isDeleverageSupported ? [_collateral, N, 0] : [_collateral, N])));
|
|
123
123
|
}
|
|
124
124
|
const _amounts = yield this.llamalend.multicallProvider.all(calls);
|
|
125
125
|
const res = {};
|
|
@@ -341,6 +341,7 @@ export class MintMarketTemplate {
|
|
|
341
341
|
borrowMoreApprove: leverageV2.leverageCreateLoanApprove.bind(leverageV2),
|
|
342
342
|
borrowMoreRouteImage: leverageV2.leverageBorrowMoreRouteImage.bind(leverageV2),
|
|
343
343
|
borrowMore: leverageV2.leverageBorrowMore.bind(leverageV2),
|
|
344
|
+
borrowMoreFutureLeverage: leverageV2.leverageBorrowMoreFutureLeverage.bind(leverageV2),
|
|
344
345
|
repayExpectedBorrowed: leverageV2.leverageRepayExpectedBorrowed.bind(leverageV2),
|
|
345
346
|
repayPriceImpact: leverageV2.leverageRepayPriceImpact.bind(leverageV2),
|
|
346
347
|
repayIsFull: leverageV2.leverageRepayIsFull.bind(leverageV2),
|
|
@@ -352,6 +353,7 @@ export class MintMarketTemplate {
|
|
|
352
353
|
repayApprove: leverageV2.leverageRepayApprove.bind(leverageV2),
|
|
353
354
|
repayRouteImage: leverageV2.leverageRepayRouteImage.bind(leverageV2),
|
|
354
355
|
repay: leverageV2.leverageRepay.bind(leverageV2),
|
|
356
|
+
repayFutureLeverage: leverageV2.leverageRepayFutureLeverage.bind(leverageV2),
|
|
355
357
|
estimateGas: {
|
|
356
358
|
createLoanApprove: leverageV2.leverageCreateLoanApproveEstimateGas.bind(leverageV2),
|
|
357
359
|
createLoan: leverageV2.leverageCreateLoanEstimateGas.bind(leverageV2),
|
|
@@ -617,7 +619,7 @@ export class MintMarketTemplate {
|
|
|
617
619
|
return __awaiter(this, void 0, void 0, function* () {
|
|
618
620
|
this._checkRange(range);
|
|
619
621
|
const _collateral = parseUnits(collateral, this.collateralDecimals);
|
|
620
|
-
return formatUnits(yield this.llamalend.contracts[this.controller].contract.max_borrowable(_collateral, range, this.llamalend.constantOptions));
|
|
622
|
+
return formatUnits(yield this.llamalend.contracts[this.controller].contract.max_borrowable(...(this.isDeleverageSupported ? [_collateral, range, 0] : [_collateral, range]), this.llamalend.constantOptions));
|
|
621
623
|
});
|
|
622
624
|
}
|
|
623
625
|
getMaxRange(collateral, debt) {
|
|
@@ -787,7 +789,7 @@ export class MintMarketTemplate {
|
|
|
787
789
|
const N = yield this.userRange();
|
|
788
790
|
const _collateral = _currentCollateral + parseUnits(collateralAmount, this.collateralDecimals);
|
|
789
791
|
const contract = this.llamalend.contracts[this.controller].contract;
|
|
790
|
-
const _debt = yield contract.max_borrowable(_collateral, N, this.llamalend.constantOptions);
|
|
792
|
+
const _debt = yield contract.max_borrowable(...(this.isDeleverageSupported ? [_collateral, N, _currentDebt] : [_collateral, N]), this.llamalend.constantOptions);
|
|
791
793
|
return formatUnits(_debt - _currentDebt);
|
|
792
794
|
});
|
|
793
795
|
}
|
|
@@ -875,6 +877,31 @@ export class MintMarketTemplate {
|
|
|
875
877
|
return yield this._borrowMore(collateral, debt, false);
|
|
876
878
|
});
|
|
877
879
|
}
|
|
880
|
+
_getCurrentLeverageParams(userAddress) {
|
|
881
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
882
|
+
var _a;
|
|
883
|
+
const [userCollateralData, { collateral: stateCollateral }] = yield Promise.all([
|
|
884
|
+
_getUserCollateralCrvUsdFull(this.llamalend.constants.NETWORK_NAME, this.controller, userAddress),
|
|
885
|
+
this.userState(userAddress),
|
|
886
|
+
]);
|
|
887
|
+
return {
|
|
888
|
+
stateCollateral,
|
|
889
|
+
totalDepositFromUser: (_a = userCollateralData.total_deposit_from_user_precise) !== null && _a !== void 0 ? _a : userCollateralData.total_deposit_precise,
|
|
890
|
+
};
|
|
891
|
+
});
|
|
892
|
+
}
|
|
893
|
+
borrowMoreFutureLeverage(collateral_1, debt_1) {
|
|
894
|
+
return __awaiter(this, arguments, void 0, function* (collateral, debt, userAddress = '') {
|
|
895
|
+
if (!this.isDeleverageSupported)
|
|
896
|
+
throw Error("This market does not support borrowMoreFutureLeverage");
|
|
897
|
+
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
898
|
+
const { stateCollateral, totalDepositFromUser } = yield this._getCurrentLeverageParams(userAddress);
|
|
899
|
+
const collateralFromDebt = yield this.swapExpected(0, 1, debt);
|
|
900
|
+
const futureCollateralState = BN(stateCollateral).plus(collateralFromDebt);
|
|
901
|
+
const futureTotalDepositFromUserPrecise = BN(totalDepositFromUser).plus(collateral);
|
|
902
|
+
return futureCollateralState.div(futureTotalDepositFromUserPrecise).toString();
|
|
903
|
+
});
|
|
904
|
+
}
|
|
878
905
|
// ---------------- ADD COLLATERAL ----------------
|
|
879
906
|
_addCollateralBands(collateral_1) {
|
|
880
907
|
return __awaiter(this, arguments, void 0, function* (collateral, address = "") {
|
|
@@ -962,15 +989,10 @@ export class MintMarketTemplate {
|
|
|
962
989
|
}
|
|
963
990
|
addCollateralFutureLeverage(collateral_1) {
|
|
964
991
|
return __awaiter(this, arguments, void 0, function* (collateral, userAddress = '') {
|
|
965
|
-
var _a;
|
|
966
992
|
this._checkLeverageForStats();
|
|
967
993
|
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');
|
|
994
|
+
const { stateCollateral, totalDepositFromUser } = yield this._getCurrentLeverageParams(userAddress);
|
|
995
|
+
return calculateFutureLeverage(stateCollateral, totalDepositFromUser, collateral, 'add');
|
|
974
996
|
});
|
|
975
997
|
}
|
|
976
998
|
// ---------------- REMOVE COLLATERAL ----------------
|
|
@@ -1046,15 +1068,10 @@ export class MintMarketTemplate {
|
|
|
1046
1068
|
}
|
|
1047
1069
|
removeCollateralFutureLeverage(collateral_1) {
|
|
1048
1070
|
return __awaiter(this, arguments, void 0, function* (collateral, userAddress = '') {
|
|
1049
|
-
var _a;
|
|
1050
1071
|
this._checkLeverageForStats();
|
|
1051
1072
|
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');
|
|
1073
|
+
const { stateCollateral, totalDepositFromUser } = yield this._getCurrentLeverageParams(userAddress);
|
|
1074
|
+
return calculateFutureLeverage(stateCollateral, totalDepositFromUser, collateral, 'remove');
|
|
1058
1075
|
});
|
|
1059
1076
|
}
|
|
1060
1077
|
// ---------------- REPAY ----------------
|
|
@@ -1140,6 +1157,18 @@ export class MintMarketTemplate {
|
|
|
1140
1157
|
return yield this._repay(debt, address, false);
|
|
1141
1158
|
});
|
|
1142
1159
|
}
|
|
1160
|
+
repayFutureLeverage(debt_1) {
|
|
1161
|
+
return __awaiter(this, arguments, void 0, function* (debt, userAddress = '') {
|
|
1162
|
+
if (!this.isDeleverageSupported)
|
|
1163
|
+
throw Error("This market does not support repayFutureLeverage");
|
|
1164
|
+
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
1165
|
+
const { stateCollateral, totalDepositFromUser } = yield this._getCurrentLeverageParams(userAddress);
|
|
1166
|
+
const collateralFromDebt = yield this.swapExpected(0, 1, debt);
|
|
1167
|
+
const futureCollateralState = BN(stateCollateral);
|
|
1168
|
+
const futureTotalDepositFromUserPrecise = BN(totalDepositFromUser).plus(collateralFromDebt);
|
|
1169
|
+
return futureCollateralState.div(futureTotalDepositFromUserPrecise).toString();
|
|
1170
|
+
});
|
|
1171
|
+
}
|
|
1143
1172
|
// ---------------- FULL REPAY ----------------
|
|
1144
1173
|
_fullRepayAmount() {
|
|
1145
1174
|
return __awaiter(this, arguments, void 0, function* (address = "") {
|
|
@@ -1775,15 +1804,10 @@ export class MintMarketTemplate {
|
|
|
1775
1804
|
}
|
|
1776
1805
|
currentLeverage() {
|
|
1777
1806
|
return __awaiter(this, arguments, void 0, function* (userAddress = '') {
|
|
1778
|
-
var _a;
|
|
1779
1807
|
this._checkLeverageForStats();
|
|
1780
1808
|
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();
|
|
1809
|
+
const { stateCollateral, totalDepositFromUser } = yield this._getCurrentLeverageParams(userAddress);
|
|
1810
|
+
return BN(stateCollateral).div(totalDepositFromUser).toString();
|
|
1787
1811
|
});
|
|
1788
1812
|
}
|
|
1789
1813
|
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
|
@@ -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),
|
|
@@ -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
|
}
|
|
@@ -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),
|
|
@@ -661,7 +663,7 @@ export class MintMarketTemplate {
|
|
|
661
663
|
this._checkRange(range);
|
|
662
664
|
const _collateral = parseUnits(collateral, this.collateralDecimals);
|
|
663
665
|
|
|
664
|
-
return formatUnits(await this.llamalend.contracts[this.controller].contract.max_borrowable(_collateral, range, this.llamalend.constantOptions));
|
|
666
|
+
return formatUnits(await this.llamalend.contracts[this.controller].contract.max_borrowable(...(this.isDeleverageSupported ? [_collateral, range, 0] : [_collateral, range]), this.llamalend.constantOptions));
|
|
665
667
|
}
|
|
666
668
|
|
|
667
669
|
public createLoanMaxRecvAllRanges = memoize(async (collateral: number | string): Promise<{ [index: number]: string }> => {
|
|
@@ -669,7 +671,7 @@ export class MintMarketTemplate {
|
|
|
669
671
|
|
|
670
672
|
const calls = [];
|
|
671
673
|
for (let N = this.minBands; N <= this.maxBands; N++) {
|
|
672
|
-
calls.push(this.llamalend.contracts[this.controller].multicallContract.max_borrowable(_collateral, N));
|
|
674
|
+
calls.push(this.llamalend.contracts[this.controller].multicallContract.max_borrowable(...(this.isDeleverageSupported ? [_collateral, N, 0] : [_collateral, N])));
|
|
673
675
|
}
|
|
674
676
|
const _amounts = await this.llamalend.multicallProvider.all(calls) as bigint[];
|
|
675
677
|
|
|
@@ -842,7 +844,7 @@ export class MintMarketTemplate {
|
|
|
842
844
|
const _collateral = _currentCollateral + parseUnits(collateralAmount, this.collateralDecimals);
|
|
843
845
|
|
|
844
846
|
const contract = this.llamalend.contracts[this.controller].contract;
|
|
845
|
-
const _debt: bigint = await contract.max_borrowable(_collateral, N, this.llamalend.constantOptions);
|
|
847
|
+
const _debt: bigint = await contract.max_borrowable(...(this.isDeleverageSupported ? [_collateral, N, _currentDebt] : [_collateral, N]), this.llamalend.constantOptions);
|
|
846
848
|
|
|
847
849
|
return formatUnits(_debt - _currentDebt);
|
|
848
850
|
}
|
|
@@ -924,6 +926,31 @@ export class MintMarketTemplate {
|
|
|
924
926
|
return await this._borrowMore(collateral, debt, false) as string;
|
|
925
927
|
}
|
|
926
928
|
|
|
929
|
+
public async _getCurrentLeverageParams(userAddress: string) {
|
|
930
|
+
const [userCollateralData, { collateral: stateCollateral }] = await Promise.all([
|
|
931
|
+
_getUserCollateralCrvUsdFull(this.llamalend.constants.NETWORK_NAME, this.controller, userAddress),
|
|
932
|
+
this.userState(userAddress),
|
|
933
|
+
]);
|
|
934
|
+
|
|
935
|
+
return {
|
|
936
|
+
stateCollateral,
|
|
937
|
+
totalDepositFromUser: userCollateralData.total_deposit_from_user_precise ?? userCollateralData.total_deposit_precise,
|
|
938
|
+
};
|
|
939
|
+
}
|
|
940
|
+
|
|
941
|
+
public async borrowMoreFutureLeverage(collateral: number | string, debt: number | string, userAddress = ''): Promise<string> {
|
|
942
|
+
if (!this.isDeleverageSupported) throw Error("This market does not support borrowMoreFutureLeverage");
|
|
943
|
+
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
944
|
+
const { stateCollateral, totalDepositFromUser } = await this._getCurrentLeverageParams(userAddress);
|
|
945
|
+
|
|
946
|
+
const collateralFromDebt = await this.swapExpected(0, 1, debt);
|
|
947
|
+
|
|
948
|
+
const futureCollateralState = BN(stateCollateral).plus(collateralFromDebt);
|
|
949
|
+
const futureTotalDepositFromUserPrecise = BN(totalDepositFromUser).plus(collateral);
|
|
950
|
+
|
|
951
|
+
return futureCollateralState.div(futureTotalDepositFromUserPrecise).toString();
|
|
952
|
+
}
|
|
953
|
+
|
|
927
954
|
// ---------------- ADD COLLATERAL ----------------
|
|
928
955
|
|
|
929
956
|
private async _addCollateralBands(collateral: number | string, address = ""): Promise<[bigint, bigint]> {
|
|
@@ -1005,14 +1032,9 @@ export class MintMarketTemplate {
|
|
|
1005
1032
|
public async addCollateralFutureLeverage(collateral: number | string, userAddress = ''): Promise<string> {
|
|
1006
1033
|
this._checkLeverageForStats();
|
|
1007
1034
|
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
1008
|
-
const
|
|
1009
|
-
_getUserCollateralCrvUsdFull(this.llamalend.constants.NETWORK_NAME, this.controller, userAddress),
|
|
1010
|
-
this.userState(userAddress),
|
|
1011
|
-
]);
|
|
1012
|
-
|
|
1013
|
-
const total_deposit_from_user = userCollateral.total_deposit_from_user_precise ?? userCollateral.total_deposit_precise;
|
|
1035
|
+
const { stateCollateral, totalDepositFromUser } = await this._getCurrentLeverageParams(userAddress);
|
|
1014
1036
|
|
|
1015
|
-
return calculateFutureLeverage(
|
|
1037
|
+
return calculateFutureLeverage(stateCollateral, totalDepositFromUser, collateral, 'add');
|
|
1016
1038
|
}
|
|
1017
1039
|
|
|
1018
1040
|
// ---------------- REMOVE COLLATERAL ----------------
|
|
@@ -1086,14 +1108,9 @@ export class MintMarketTemplate {
|
|
|
1086
1108
|
public async removeCollateralFutureLeverage(collateral: number | string, userAddress = ''): Promise<string> {
|
|
1087
1109
|
this._checkLeverageForStats();
|
|
1088
1110
|
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
1089
|
-
const
|
|
1090
|
-
_getUserCollateralCrvUsdFull(this.llamalend.constants.NETWORK_NAME, this.controller, userAddress),
|
|
1091
|
-
this.userState(userAddress),
|
|
1092
|
-
]);
|
|
1093
|
-
|
|
1094
|
-
const total_deposit_from_user = userCollateral.total_deposit_from_user_precise ?? userCollateral.total_deposit_precise;
|
|
1111
|
+
const { stateCollateral, totalDepositFromUser } = await this._getCurrentLeverageParams(userAddress);
|
|
1095
1112
|
|
|
1096
|
-
return calculateFutureLeverage(
|
|
1113
|
+
return calculateFutureLeverage(stateCollateral, totalDepositFromUser, collateral, 'remove');
|
|
1097
1114
|
}
|
|
1098
1115
|
|
|
1099
1116
|
// ---------------- REPAY ----------------
|
|
@@ -1173,6 +1190,19 @@ export class MintMarketTemplate {
|
|
|
1173
1190
|
return await this._repay(debt, address, false) as string;
|
|
1174
1191
|
}
|
|
1175
1192
|
|
|
1193
|
+
public async repayFutureLeverage(debt: number | string, userAddress = ''): Promise<string> {
|
|
1194
|
+
if (!this.isDeleverageSupported) throw Error("This market does not support repayFutureLeverage");
|
|
1195
|
+
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
1196
|
+
const { stateCollateral, totalDepositFromUser } = await this._getCurrentLeverageParams(userAddress);
|
|
1197
|
+
|
|
1198
|
+
const collateralFromDebt = await this.swapExpected(0, 1, debt);
|
|
1199
|
+
|
|
1200
|
+
const futureCollateralState = BN(stateCollateral);
|
|
1201
|
+
const futureTotalDepositFromUserPrecise = BN(totalDepositFromUser).plus(collateralFromDebt);
|
|
1202
|
+
|
|
1203
|
+
return futureCollateralState.div(futureTotalDepositFromUserPrecise).toString();
|
|
1204
|
+
}
|
|
1205
|
+
|
|
1176
1206
|
// ---------------- FULL REPAY ----------------
|
|
1177
1207
|
|
|
1178
1208
|
private async _fullRepayAmount(address = ""): Promise<string> {
|
|
@@ -1911,14 +1941,9 @@ export class MintMarketTemplate {
|
|
|
1911
1941
|
this._checkLeverageForStats();
|
|
1912
1942
|
userAddress = _getAddress.call(this.llamalend, userAddress);
|
|
1913
1943
|
|
|
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;
|
|
1944
|
+
const { stateCollateral, totalDepositFromUser } = await this._getCurrentLeverageParams(userAddress);
|
|
1920
1945
|
|
|
1921
|
-
return BN(
|
|
1946
|
+
return BN(stateCollateral).div(totalDepositFromUser).toString();
|
|
1922
1947
|
}
|
|
1923
1948
|
|
|
1924
1949
|
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
|
}
|