@curvefi/llamalend-api 1.0.28 → 1.0.29

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.
@@ -80,6 +80,7 @@ export declare class MintMarketTemplate {
80
80
  }>;
81
81
  };
82
82
  leverage: {
83
+ maxLeverage: (N?: number) => Promise<string>;
83
84
  createLoanMaxRecv: (collateral: number | string, range: number) => Promise<{
84
85
  maxBorrowable: string;
85
86
  maxCollateral: string;
@@ -312,6 +313,8 @@ export declare class MintMarketTemplate {
312
313
  private _leverageCreateLoan;
313
314
  private leverageCreateLoanEstimateGas;
314
315
  private leverageCreateLoan;
316
+ private _get_k_effective_BN;
317
+ private maxLeverage;
315
318
  private _checkDeleverageZap;
316
319
  private deleverageRepayStablecoins;
317
320
  private deleverageGetRouteName;
@@ -294,6 +294,7 @@ export class MintMarketTemplate {
294
294
  balances: this.walletBalances.bind(this),
295
295
  };
296
296
  this.leverage = {
297
+ maxLeverage: this.maxLeverage.bind(this),
297
298
  createLoanMaxRecv: this.leverageCreateLoanMaxRecv.bind(this),
298
299
  createLoanMaxRecvAllRanges: this.leverageCreateLoanMaxRecvAllRanges.bind(this),
299
300
  createLoanCollateral: this.leverageCreateLoanCollateral.bind(this),
@@ -1594,6 +1595,32 @@ export class MintMarketTemplate {
1594
1595
  return yield this._leverageCreateLoan(collateral, debt, range, slippage, false);
1595
1596
  });
1596
1597
  }
1598
+ _get_k_effective_BN(N) {
1599
+ return __awaiter(this, void 0, void 0, function* () {
1600
+ // d_k_effective: uint256 = (1 - loan_discount) * sqrt((A-1)/A) / N
1601
+ // k_effective = d_k_effective * sum_{0..N-1}(((A-1) / A)**k)
1602
+ const { loan_discount } = yield this.statsParameters();
1603
+ console.log("loan_discount", loan_discount);
1604
+ const A = this.A;
1605
+ console.log("A", A);
1606
+ const A_BN = BN(A);
1607
+ const A_ratio_BN = A_BN.minus(1).div(A_BN);
1608
+ console.log("A_ratio_BN", A_ratio_BN, A_ratio_BN.toString());
1609
+ const d_k_effective_BN = BN(100).minus(loan_discount).div(100).times(A_ratio_BN.sqrt()).div(N);
1610
+ let S = BN(0);
1611
+ for (let n = 0; n < N; n++) {
1612
+ S = S.plus(A_ratio_BN.pow(n));
1613
+ }
1614
+ return d_k_effective_BN.times(S);
1615
+ });
1616
+ }
1617
+ maxLeverage() {
1618
+ return __awaiter(this, arguments, void 0, function* (N = 4) {
1619
+ // max_leverage = 1 / (k_effective - 1)
1620
+ const k_effective_BN = yield this._get_k_effective_BN(N);
1621
+ return BN(1).div(BN(1).minus(k_effective_BN)).toString();
1622
+ });
1623
+ }
1597
1624
  // ---------------- DELEVERAGE REPAY ----------------
1598
1625
  _checkDeleverageZap() {
1599
1626
  if (this.deleverageZap === "0x0000000000000000000000000000000000000000")
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@curvefi/llamalend-api",
3
- "version": "1.0.28",
3
+ "version": "1.0.29",
4
4
  "description": "JavaScript library for Curve Lending",
5
5
  "main": "lib/index.js",
6
6
  "author": "Macket",
@@ -90,6 +90,7 @@ export class MintMarketTemplate {
90
90
  balances: (address?: string) => Promise<{ stablecoin: string, collateral: string }>,
91
91
  };
92
92
  leverage: {
93
+ maxLeverage: (N?: number) => Promise<string>,
93
94
  createLoanMaxRecv: (collateral: number | string, range: number) => Promise<{ maxBorrowable: string, maxCollateral: string, leverage: string, routeIdx: number }>,
94
95
  createLoanMaxRecvAllRanges: (collateral: number | string) => Promise<IDict<{ maxBorrowable: string, maxCollateral: string, leverage: string, routeIdx: number }>>,
95
96
  createLoanCollateral: (userCollateral: number | string, debt: number | string) => Promise<{ collateral: string, leverage: string, routeIdx: number }>,
@@ -185,6 +186,7 @@ export class MintMarketTemplate {
185
186
  balances: this.walletBalances.bind(this),
186
187
  }
187
188
  this.leverage = {
189
+ maxLeverage: this.maxLeverage.bind(this),
188
190
  createLoanMaxRecv: this.leverageCreateLoanMaxRecv.bind(this),
189
191
  createLoanMaxRecvAllRanges: this.leverageCreateLoanMaxRecvAllRanges.bind(this),
190
192
  createLoanCollateral: this.leverageCreateLoanCollateral.bind(this),
@@ -1688,6 +1690,33 @@ export class MintMarketTemplate {
1688
1690
  return await this._leverageCreateLoan(collateral, debt, range, slippage, false) as string;
1689
1691
  }
1690
1692
 
1693
+ private async _get_k_effective_BN(N: number): Promise<BigNumber> {
1694
+ // d_k_effective: uint256 = (1 - loan_discount) * sqrt((A-1)/A) / N
1695
+ // k_effective = d_k_effective * sum_{0..N-1}(((A-1) / A)**k)
1696
+ const { loan_discount } = await this.statsParameters();
1697
+ console.log("loan_discount", loan_discount);
1698
+ const A = this.A;
1699
+ console.log("A", A);
1700
+ const A_BN = BN(A);
1701
+ const A_ratio_BN = A_BN.minus(1).div(A_BN);
1702
+ console.log("A_ratio_BN", A_ratio_BN, A_ratio_BN.toString());
1703
+
1704
+ const d_k_effective_BN = BN(100).minus(loan_discount).div(100).times(A_ratio_BN.sqrt()).div(N);
1705
+ let S = BN(0);
1706
+ for (let n = 0; n < N; n++) {
1707
+ S = S.plus(A_ratio_BN.pow(n))
1708
+ }
1709
+
1710
+ return d_k_effective_BN.times(S);
1711
+ }
1712
+
1713
+ private async maxLeverage(N: number = 4): Promise<string> {
1714
+ // max_leverage = 1 / (k_effective - 1)
1715
+ const k_effective_BN = await this._get_k_effective_BN(N);
1716
+
1717
+ return BN(1).div(BN(1).minus(k_effective_BN)).toString()
1718
+ }
1719
+
1691
1720
  // ---------------- DELEVERAGE REPAY ----------------
1692
1721
 
1693
1722
  private _checkDeleverageZap(): void {