@curvefi/llamalend-api 1.1.6 → 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 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 [userCollateral, { collateral: currentCollateral }] = yield Promise.all([
1727
- _getUserCollateral(this.llamalend.constants.NETWORK_NAME, this.addresses.controller, userAddress),
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 [userCollateral, { collateral: currentCollateral }] = yield Promise.all([
1806
- _getUserCollateral(this.llamalend.constants.NETWORK_NAME, this.addresses.controller, userAddress),
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
- currentLeverage() {
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
- const [userCollateral, { collateral }] = yield Promise.all([
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 total_deposit_from_user = userCollateral.total_deposit_from_user_precise;
2802
- return BN(collateral).div(total_deposit_from_user).toString();
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;
@@ -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),
@@ -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 [userCollateral, { collateral: currentCollateral }] = yield Promise.all([
969
- _getUserCollateralCrvUsdFull(this.llamalend.constants.NETWORK_NAME, this.controller, userAddress),
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 [userCollateral, { collateral: currentCollateral }] = yield Promise.all([
1053
- _getUserCollateralCrvUsdFull(this.llamalend.constants.NETWORK_NAME, this.controller, userAddress),
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 [userCollateral, { collateral }] = yield Promise.all([
1782
- _getUserCollateralCrvUsdFull(this.llamalend.constants.NETWORK_NAME, this.controller, userAddress),
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@curvefi/llamalend-api",
3
- "version": "1.1.6",
3
+ "version": "1.1.7",
4
4
  "description": "JavaScript library for Curve Lending",
5
5
  "main": "lib/index.js",
6
6
  "author": "Macket",
@@ -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 [userCollateral, {collateral: currentCollateral}] = await Promise.all([
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
- const total_deposit_from_user = userCollateral.total_deposit_from_user_precise;
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 [userCollateral, {collateral: currentCollateral}] = await Promise.all([
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(currentCollateral, total_deposit_from_user, collateral, 'remove');
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
- public async currentLeverage(userAddress = ''): Promise<string> {
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
- const [userCollateral, {collateral}] = await Promise.all([
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 total_deposit_from_user = userCollateral.total_deposit_from_user_precise;
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(collateral).div(total_deposit_from_user).toString();
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),
@@ -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 [userCollateral, {collateral: currentCollateral}] = await Promise.all([
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(currentCollateral, total_deposit_from_user, collateral, 'add');
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 [userCollateral, {collateral: currentCollateral}] = await Promise.all([
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(currentCollateral, total_deposit_from_user, collateral, 'remove');
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 [userCollateral, {collateral}] = await Promise.all([
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(collateral).div(total_deposit_from_user).toString();
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
  }