@curvefi/llamalend-api 1.1.10 → 2.0.1

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.
Files changed (138) hide show
  1. package/docs/MIGRATION.md +325 -0
  2. package/docs/SUPPORT_LLv2.md +409 -0
  3. package/lib/constants/abis/OneWayLendingFactoryV2ABI.json +543 -0
  4. package/lib/constants/aliases.d.ts +0 -11
  5. package/lib/constants/aliases.js +1 -86
  6. package/lib/constants/coins.d.ts +0 -11
  7. package/lib/constants/coins.js +0 -14
  8. package/lib/constants/utils.d.ts +2 -0
  9. package/lib/constants/utils.js +2 -0
  10. package/lib/index.d.ts +10 -4
  11. package/lib/interfaces.d.ts +3 -2
  12. package/lib/lendMarkets/LendMarketTemplate.d.ts +13 -502
  13. package/lib/lendMarkets/LendMarketTemplate.js +245 -2860
  14. package/lib/lendMarkets/fetch/fetchFactoryData.d.ts +13 -0
  15. package/lib/lendMarkets/fetch/fetchFactoryData.js +101 -0
  16. package/lib/lendMarkets/fetch/fetchLendMarkets.d.ts +3 -0
  17. package/lib/lendMarkets/fetch/fetchLendMarkets.js +94 -0
  18. package/lib/lendMarkets/interfaces/common/amm.d.ts +10 -0
  19. package/lib/lendMarkets/interfaces/common/amm.js +1 -0
  20. package/lib/lendMarkets/interfaces/common/index.d.ts +5 -0
  21. package/lib/lendMarkets/interfaces/common/index.js +5 -0
  22. package/lib/lendMarkets/interfaces/common/prices.d.ts +13 -0
  23. package/lib/lendMarkets/interfaces/common/prices.js +1 -0
  24. package/lib/lendMarkets/interfaces/common/userPosition.d.ts +39 -0
  25. package/lib/lendMarkets/interfaces/common/userPosition.js +1 -0
  26. package/lib/lendMarkets/interfaces/common/vault.d.ts +55 -0
  27. package/lib/lendMarkets/interfaces/common/vault.js +1 -0
  28. package/lib/lendMarkets/interfaces/common/wallet.d.ts +8 -0
  29. package/lib/lendMarkets/interfaces/common/wallet.js +1 -0
  30. package/lib/lendMarkets/interfaces/v1/index.d.ts +4 -0
  31. package/lib/lendMarkets/interfaces/v1/index.js +4 -0
  32. package/lib/lendMarkets/interfaces/v1/leverageV1.d.ts +90 -0
  33. package/lib/lendMarkets/interfaces/v1/leverageV1.js +1 -0
  34. package/lib/lendMarkets/interfaces/v1/loanV1.d.ts +81 -0
  35. package/lib/lendMarkets/interfaces/v1/loanV1.js +1 -0
  36. package/lib/lendMarkets/interfaces/v1/statsV1.d.ts +49 -0
  37. package/lib/lendMarkets/interfaces/v1/statsV1.js +1 -0
  38. package/lib/lendMarkets/interfaces/v2/index.d.ts +3 -0
  39. package/lib/lendMarkets/interfaces/v2/index.js +3 -0
  40. package/lib/lendMarkets/interfaces/v2/leverageV2.d.ts +90 -0
  41. package/lib/lendMarkets/interfaces/v2/leverageV2.js +1 -0
  42. package/lib/lendMarkets/interfaces/v2/loanV2.d.ts +81 -0
  43. package/lib/lendMarkets/interfaces/v2/loanV2.js +1 -0
  44. package/lib/lendMarkets/interfaces/v2/statsV2.d.ts +49 -0
  45. package/lib/lendMarkets/interfaces/v2/statsV2.js +1 -0
  46. package/lib/lendMarkets/lendMarketConstructor.js +1 -1
  47. package/lib/lendMarkets/modules/common/amm.d.ts +19 -0
  48. package/lib/lendMarkets/modules/common/amm.js +137 -0
  49. package/lib/lendMarkets/modules/common/index.d.ts +9 -0
  50. package/lib/lendMarkets/modules/common/index.js +9 -0
  51. package/lib/lendMarkets/modules/common/leverageZapV1Base.d.ts +118 -0
  52. package/lib/lendMarkets/modules/common/leverageZapV1Base.js +770 -0
  53. package/lib/lendMarkets/modules/{leverageZapV2.d.ts → common/leverageZapV2Base.d.ts} +10 -5
  54. package/lib/lendMarkets/modules/{leverageZapV2.js → common/leverageZapV2Base.js} +36 -32
  55. package/lib/lendMarkets/modules/common/loanBase.d.ts +123 -0
  56. package/lib/lendMarkets/modules/common/loanBase.js +801 -0
  57. package/lib/lendMarkets/modules/common/prices.d.ts +19 -0
  58. package/lib/lendMarkets/modules/common/prices.js +104 -0
  59. package/lib/lendMarkets/modules/common/statsBase.d.ts +69 -0
  60. package/lib/lendMarkets/modules/common/statsBase.js +291 -0
  61. package/lib/lendMarkets/modules/common/userPosition.d.ts +46 -0
  62. package/lib/lendMarkets/modules/common/userPosition.js +223 -0
  63. package/lib/lendMarkets/modules/common/vault.d.ts +69 -0
  64. package/lib/lendMarkets/modules/common/vault.js +535 -0
  65. package/lib/lendMarkets/modules/common/wallet.d.ts +13 -0
  66. package/lib/lendMarkets/modules/common/wallet.js +28 -0
  67. package/lib/lendMarkets/modules/index.d.ts +1 -1
  68. package/lib/lendMarkets/modules/index.js +1 -1
  69. package/lib/lendMarkets/modules/v1/index.d.ts +4 -0
  70. package/lib/lendMarkets/modules/v1/index.js +4 -0
  71. package/lib/lendMarkets/modules/v1/leverageV1ZapV1.d.ts +3 -0
  72. package/lib/lendMarkets/modules/v1/leverageV1ZapV1.js +3 -0
  73. package/lib/lendMarkets/modules/v1/leverageV1ZapV2.d.ts +3 -0
  74. package/lib/lendMarkets/modules/v1/leverageV1ZapV2.js +3 -0
  75. package/lib/lendMarkets/modules/v1/loanV1.d.ts +4 -0
  76. package/lib/lendMarkets/modules/v1/loanV1.js +3 -0
  77. package/lib/lendMarkets/modules/v1/statsV1.d.ts +3 -0
  78. package/lib/lendMarkets/modules/v1/statsV1.js +3 -0
  79. package/lib/lendMarkets/modules/v2/index.d.ts +4 -0
  80. package/lib/lendMarkets/modules/v2/index.js +4 -0
  81. package/lib/lendMarkets/modules/v2/leverageV2ZapV1.d.ts +3 -0
  82. package/lib/lendMarkets/modules/v2/leverageV2ZapV1.js +3 -0
  83. package/lib/lendMarkets/modules/v2/leverageV2ZapV2.d.ts +3 -0
  84. package/lib/lendMarkets/modules/v2/leverageV2ZapV2.js +3 -0
  85. package/lib/lendMarkets/modules/v2/loanV2.d.ts +4 -0
  86. package/lib/lendMarkets/modules/v2/loanV2.js +3 -0
  87. package/lib/lendMarkets/modules/v2/statsV2.d.ts +3 -0
  88. package/lib/lendMarkets/modules/v2/statsV2.js +3 -0
  89. package/lib/llamalend.d.ts +6 -6
  90. package/lib/llamalend.js +46 -210
  91. package/lib/utils.js +2 -33
  92. package/package.json +1 -1
  93. package/src/constants/abis/OneWayLendingFactoryV2ABI.json +543 -0
  94. package/src/constants/aliases.ts +1 -97
  95. package/src/constants/coins.ts +0 -25
  96. package/src/constants/utils.ts +4 -0
  97. package/src/interfaces.ts +3 -2
  98. package/src/lendMarkets/LendMarketTemplate.ts +327 -3223
  99. package/src/lendMarkets/fetch/fetchFactoryData.ts +113 -0
  100. package/src/lendMarkets/fetch/fetchLendMarkets.ts +108 -0
  101. package/src/lendMarkets/interfaces/common/amm.ts +11 -0
  102. package/src/lendMarkets/interfaces/common/index.ts +5 -0
  103. package/src/lendMarkets/interfaces/common/prices.ts +13 -0
  104. package/src/lendMarkets/interfaces/common/userPosition.ts +24 -0
  105. package/src/lendMarkets/interfaces/common/vault.ts +48 -0
  106. package/src/lendMarkets/interfaces/common/wallet.ts +3 -0
  107. package/src/lendMarkets/interfaces/v1/index.ts +4 -0
  108. package/src/lendMarkets/interfaces/v1/leverageV1.ts +84 -0
  109. package/src/lendMarkets/interfaces/v1/loanV1.ts +85 -0
  110. package/src/lendMarkets/interfaces/v1/statsV1.ts +21 -0
  111. package/src/lendMarkets/interfaces/v2/index.ts +3 -0
  112. package/src/lendMarkets/interfaces/v2/leverageV2.ts +84 -0
  113. package/src/lendMarkets/interfaces/v2/loanV2.ts +85 -0
  114. package/src/lendMarkets/interfaces/v2/statsV2.ts +21 -0
  115. package/src/lendMarkets/lendMarketConstructor.ts +1 -1
  116. package/src/lendMarkets/modules/common/amm.ts +132 -0
  117. package/src/lendMarkets/modules/common/index.ts +9 -0
  118. package/src/lendMarkets/modules/common/leverageZapV1Base.ts +912 -0
  119. package/src/lendMarkets/modules/{leverageZapV2.ts → common/leverageZapV2Base.ts} +41 -37
  120. package/src/lendMarkets/modules/common/loanBase.ts +781 -0
  121. package/src/lendMarkets/modules/common/prices.ts +111 -0
  122. package/src/lendMarkets/modules/common/statsBase.ts +313 -0
  123. package/src/lendMarkets/modules/common/userPosition.ts +243 -0
  124. package/src/lendMarkets/modules/common/vault.ts +551 -0
  125. package/src/lendMarkets/modules/common/wallet.ts +29 -0
  126. package/src/lendMarkets/modules/index.ts +1 -1
  127. package/src/lendMarkets/modules/v1/index.ts +4 -0
  128. package/src/lendMarkets/modules/v1/leverageV1ZapV1.ts +3 -0
  129. package/src/lendMarkets/modules/v1/leverageV1ZapV2.ts +3 -0
  130. package/src/lendMarkets/modules/v1/loanV1.ts +4 -0
  131. package/src/lendMarkets/modules/v1/statsV1.ts +3 -0
  132. package/src/lendMarkets/modules/v2/index.ts +4 -0
  133. package/src/lendMarkets/modules/v2/leverageV2ZapV1.ts +3 -0
  134. package/src/lendMarkets/modules/v2/leverageV2ZapV2.ts +3 -0
  135. package/src/lendMarkets/modules/v2/loanV2.ts +4 -0
  136. package/src/lendMarkets/modules/v2/statsV2.ts +3 -0
  137. package/src/llamalend.ts +47 -244
  138. package/src/utils.ts +2 -35
@@ -0,0 +1,85 @@
1
+ import {TAmount, TGas, IPartialFrac} from "../../../interfaces";
2
+
3
+ export interface ILoanV2 {
4
+ createLoanMaxRecv: (collateral: TAmount, range: number) => Promise<string>;
5
+ createLoanMaxRecvAllRanges: (collateral: TAmount) => Promise<{ [index: number]: string }>;
6
+ getMaxRange: (collateral: TAmount, debt: TAmount) => Promise<number>;
7
+ createLoanBands: (collateral: TAmount, debt: TAmount, range: number) => Promise<[number, number]>;
8
+ createLoanBandsAllRanges: (collateral: TAmount, debt: TAmount) => Promise<{ [index: number]: [number, number] | null }>;
9
+ createLoanPrices: (collateral: TAmount, debt: TAmount, range: number) => Promise<string[]>;
10
+ createLoanPricesAllRanges: (collateral: TAmount, debt: TAmount) => Promise<{ [index: number]: [string, string] | null }>;
11
+ createLoanHealth: (collateral: TAmount, debt: TAmount, range: number, full?: boolean) => Promise<string>;
12
+ createLoanIsApproved: (collateral: TAmount) => Promise<boolean>;
13
+ createLoanApprove: (collateral: TAmount) => Promise<string[]>;
14
+ createLoan: (collateral: TAmount, debt: TAmount, range: number) => Promise<string>;
15
+
16
+ borrowMoreMaxRecv: (collateralAmount: TAmount) => Promise<string>;
17
+ borrowMoreBands: (collateral: TAmount, debt: TAmount) => Promise<[number, number]>;
18
+ borrowMorePrices: (collateral: TAmount, debt: TAmount) => Promise<string[]>;
19
+ borrowMoreHealth: (collateral: TAmount, debt: TAmount, full?: boolean, address?: string) => Promise<string>;
20
+ borrowMoreIsApproved: (collateral: TAmount) => Promise<boolean>;
21
+ borrowMoreApprove: (collateral: TAmount) => Promise<string[]>;
22
+ borrowMore: (collateral: TAmount, debt: TAmount) => Promise<string>;
23
+ borrowMoreFutureLeverage: (collateral: TAmount, debt: TAmount, userAddress?: string) => Promise<string>;
24
+
25
+ addCollateralBands: (collateral: TAmount, address?: string) => Promise<[number, number]>;
26
+ addCollateralPrices: (collateral: TAmount, address?: string) => Promise<string[]>;
27
+ addCollateralHealth: (collateral: TAmount, full?: boolean, address?: string) => Promise<string>;
28
+ addCollateralIsApproved: (collateral: TAmount) => Promise<boolean>;
29
+ addCollateralApprove: (collateral: TAmount) => Promise<string[]>;
30
+ addCollateral: (collateral: TAmount, address?: string) => Promise<string>;
31
+ addCollateralFutureLeverage: (collateral: TAmount, userAddress?: string) => Promise<string>;
32
+
33
+ maxRemovable: () => Promise<string>;
34
+ removeCollateralBands: (collateral: TAmount) => Promise<[number, number]>;
35
+ removeCollateralPrices: (collateral: TAmount) => Promise<string[]>;
36
+ removeCollateralHealth: (collateral: TAmount, full?: boolean, address?: string) => Promise<string>;
37
+ removeCollateral: (collateral: TAmount) => Promise<string>;
38
+ removeCollateralFutureLeverage: (collateral: TAmount, userAddress?: string) => Promise<string>;
39
+
40
+ repayBands: (debt: TAmount, address?: string) => Promise<[number, number]>;
41
+ repayPrices: (debt: TAmount, address?: string) => Promise<string[]>;
42
+ repayIsApproved: (debt: TAmount) => Promise<boolean>;
43
+ repayApprove: (debt: TAmount) => Promise<string[]>;
44
+ repayHealth: (debt: TAmount, full?: boolean, address?: string) => Promise<string>;
45
+ repay: (debt: TAmount, address?: string) => Promise<string>;
46
+ repayFutureLeverage: (debt: TAmount, userAddress?: string) => Promise<string>;
47
+
48
+ fullRepayIsApproved: (address?: string) => Promise<boolean>;
49
+ fullRepayApprove: (address?: string) => Promise<string[]>;
50
+ fullRepay: (address?: string) => Promise<string>;
51
+
52
+ tokensToLiquidate: (address?: string) => Promise<string>;
53
+ calcPartialFrac: (amount: TAmount, address?: string) => Promise<IPartialFrac>;
54
+ liquidateIsApproved: (address?: string) => Promise<boolean>;
55
+ liquidateApprove: (address?: string) => Promise<string[]>;
56
+ liquidate: (address: string, slippage?: number) => Promise<string>;
57
+
58
+ selfLiquidateIsApproved: () => Promise<boolean>;
59
+ selfLiquidateApprove: () => Promise<string[]>;
60
+ selfLiquidate: (slippage?: number) => Promise<string>;
61
+
62
+ partialSelfLiquidateIsApproved: (partialFrac: IPartialFrac) => Promise<boolean>;
63
+ partialSelfLiquidateApprove: (partialFrac: IPartialFrac) => Promise<string[]>;
64
+ partialSelfLiquidate: (partialFrac: IPartialFrac, slippage?: number) => Promise<string>;
65
+
66
+ estimateGas: {
67
+ createLoanApprove: (collateral: TAmount) => Promise<TGas>;
68
+ createLoan: (collateral: TAmount, debt: TAmount, range: number) => Promise<TGas>;
69
+ borrowMoreApprove: (collateral: TAmount) => Promise<TGas>;
70
+ borrowMore: (collateral: TAmount, debt: TAmount) => Promise<TGas>;
71
+ addCollateralApprove: (collateral: TAmount) => Promise<TGas>;
72
+ addCollateral: (collateral: TAmount, address?: string) => Promise<TGas>;
73
+ removeCollateral: (collateral: TAmount) => Promise<TGas>;
74
+ repayApprove: (debt: TAmount) => Promise<TGas>;
75
+ repay: (debt: TAmount, address?: string) => Promise<TGas>;
76
+ fullRepayApprove: (address?: string) => Promise<TGas>;
77
+ fullRepay: (address?: string) => Promise<TGas>;
78
+ liquidateApprove: (address?: string) => Promise<TGas>;
79
+ liquidate: (address: string, slippage?: number) => Promise<TGas>;
80
+ selfLiquidateApprove: () => Promise<TGas>;
81
+ selfLiquidate: (slippage?: number) => Promise<TGas>;
82
+ partialSelfLiquidateApprove: (partialFrac: IPartialFrac) => Promise<TGas>;
83
+ partialSelfLiquidate: (partialFrac: IPartialFrac, slippage?: number) => Promise<TGas>;
84
+ };
85
+ }
@@ -0,0 +1,21 @@
1
+ import {TAmount} from "../../../interfaces";
2
+
3
+ export interface IStatsV2 {
4
+ parameters: () => Promise<{
5
+ fee: string, // %
6
+ admin_fee: string, // %
7
+ liquidation_discount: string, // %
8
+ loan_discount: string, // %
9
+ base_price: string,
10
+ A: string,
11
+ }>,
12
+ rates: (isGetter?: boolean, useAPI?: boolean) => Promise<{borrowApr: string, lendApr: string, borrowApy: string, lendApy: string}>,
13
+ futureRates: (dReserves: TAmount, dDebt: TAmount) => Promise<{borrowApr: string, lendApr: string, borrowApy: string, lendApy: string}>,
14
+ balances: () => Promise<[string, string]>,
15
+ bandsInfo: () => Promise<{ activeBand: number, maxBand: number, minBand: number, liquidationBand: number | null }>
16
+ bandBalances:(n: number) => Promise<{ borrowed: string, collateral: string }>,
17
+ bandsBalances: () => Promise<{ [index: number]: { borrowed: string, collateral: string } }>,
18
+ totalDebt: (isGetter?: boolean, useAPI?: boolean) => Promise<string>,
19
+ ammBalances: (isGetter?: boolean, useAPI?: boolean) => Promise<{ borrowed: string, collateral: string }>,
20
+ capAndAvailable: (isGetter?: boolean, useAPI?: boolean) => Promise<{ cap: string, available: string }>,
21
+ }
@@ -3,7 +3,7 @@ import type { Llamalend } from "../llamalend.js";
3
3
 
4
4
  export const getLendMarket = function (this: Llamalend, lendMarketId: string): LendMarketTemplate {
5
5
  if (!(lendMarketId in this.lendMarkets)) {
6
- const marketData = this.constants.ONE_WAY_MARKETS[lendMarketId];
6
+ const marketData = this.constants.ONE_WAY_MARKETS[lendMarketId] || this.constants.ONE_WAY_MARKETS_V2[lendMarketId];
7
7
  if (!marketData) throw new Error(`Lend market with id ${lendMarketId} not found`);
8
8
  this.lendMarkets[lendMarketId] = new LendMarketTemplate(lendMarketId, marketData, this);
9
9
  }
@@ -0,0 +1,132 @@
1
+ import type { LendMarketTemplate } from "../../LendMarketTemplate";
2
+ import {
3
+ _cutZeros, _mulBy1_3,
4
+ BN, DIGas, ensureAllowance, ensureAllowanceEstimateGas,
5
+ formatUnits, fromBN,
6
+ hasAllowance, MAX_ALLOWANCE, parseUnits, smartNumber, toBN,
7
+ } from "../../../utils";
8
+ import {Llamalend} from "../../../llamalend";
9
+ import BigNumber from "bignumber.js";
10
+ import {TGas} from "../../../interfaces";
11
+ import {IAmm} from "../../interfaces/common";
12
+
13
+
14
+ export class AmmModule implements IAmm {
15
+ private market: LendMarketTemplate;
16
+ private llamalend: Llamalend;
17
+
18
+ constructor(market: LendMarketTemplate) {
19
+ this.market = market;
20
+ this.llamalend = market.getLlamalend();
21
+ }
22
+
23
+ public async maxSwappable(i: number, j: number): Promise<string> {
24
+ if (!(i === 0 && j === 1) && !(i === 1 && j === 0)) throw Error("Wrong index");
25
+ const inDecimals = this.market.coinDecimals[i];
26
+ const contract = this.llamalend.contracts[this.market.addresses.amm].contract;
27
+ const [_inAmount, _outAmount] = await contract.get_dxdy(i, j, MAX_ALLOWANCE, this.llamalend.constantOptions) as bigint[];
28
+ if (_outAmount === BigInt(0)) return "0";
29
+
30
+ return formatUnits(_inAmount, inDecimals)
31
+ }
32
+
33
+ private async _swapExpected(i: number, j: number, _amount: bigint): Promise<bigint> {
34
+ return await this.llamalend.contracts[this.market.addresses.amm].contract.get_dy(i, j, _amount, this.llamalend.constantOptions) as bigint;
35
+ }
36
+
37
+ public async swapExpected(i: number, j: number, amount: number | string): Promise<string> {
38
+ if (!(i === 0 && j === 1) && !(i === 1 && j === 0)) throw Error("Wrong index");
39
+ const [inDecimals, outDecimals] = this.market.coinDecimals;
40
+ const _amount = parseUnits(amount, inDecimals);
41
+ const _expected = await this._swapExpected(i, j, _amount);
42
+
43
+ return formatUnits(_expected, outDecimals)
44
+ }
45
+
46
+ public async swapRequired(i: number, j: number, outAmount: number | string): Promise<string> {
47
+ if (!(i === 0 && j === 1) && !(i === 1 && j === 0)) throw Error("Wrong index");
48
+ const [inDecimals, outDecimals] = this.market.coinDecimals;
49
+ const _amount = parseUnits(outAmount, outDecimals);
50
+ const _expected = await this.llamalend.contracts[this.market.addresses.amm].contract.get_dx(i, j, _amount, this.llamalend.constantOptions) as bigint;
51
+
52
+ return formatUnits(_expected, inDecimals)
53
+ }
54
+
55
+ public async swapPriceImpact(i: number, j: number, amount: number | string): Promise<string> {
56
+ if (!(i === 0 && j === 1) && !(i === 1 && j === 0)) throw Error("Wrong index");
57
+ const [inDecimals, outDecimals] = this.market.coinDecimals;
58
+ const _amount = parseUnits(amount, inDecimals);
59
+ const _output = await this._swapExpected(i, j, _amount);
60
+
61
+ // Find k for which x * k = 10^15 or y * k = 10^15: k = max(10^15 / x, 10^15 / y)
62
+ // For coins with d (decimals) <= 15: k = min(k, 0.2), and x0 = min(x * k, 10^d)
63
+ // x0 = min(x * min(max(10^15 / x, 10^15 / y), 0.2), 10^d), if x0 == 0 then priceImpact = 0
64
+ const target = BN(10 ** 15);
65
+ const amountIntBN = BN(amount).times(10 ** inDecimals);
66
+ const outputIntBN = toBN(_output, 0);
67
+ const k = BigNumber.min(BigNumber.max(target.div(amountIntBN), target.div(outputIntBN)), 0.2);
68
+ const smallAmountIntBN = BigNumber.min(amountIntBN.times(k), BN(10 ** inDecimals));
69
+ if (smallAmountIntBN.toFixed(0) === '0') return '0';
70
+
71
+ const _smallAmount = fromBN(smallAmountIntBN.div(10 ** inDecimals), inDecimals);
72
+ const _smallOutput = await this._swapExpected(i, j, _smallAmount);
73
+
74
+ const amountBN = BN(amount);
75
+ const outputBN = toBN(_output, outDecimals);
76
+ const smallAmountBN = toBN(_smallAmount, inDecimals);
77
+ const smallOutputBN = toBN(_smallOutput, outDecimals);
78
+
79
+ const rateBN = outputBN.div(amountBN);
80
+ const smallRateBN = smallOutputBN.div(smallAmountBN);
81
+ if (rateBN.gt(smallRateBN)) return "0";
82
+
83
+ const slippageBN = BN(1).minus(rateBN.div(smallRateBN)).times(100);
84
+
85
+ return _cutZeros(slippageBN.toFixed(6));
86
+ }
87
+
88
+ public async swapIsApproved(i: number, amount: number | string): Promise<boolean> {
89
+ if (i !== 0 && i !== 1) throw Error("Wrong index");
90
+
91
+ return await hasAllowance.call(this.llamalend, [this.market.coinAddresses[i]], [amount], this.llamalend.signerAddress, this.market.addresses.amm);
92
+ }
93
+
94
+ private async swapApproveEstimateGas (i: number, amount: number | string): Promise<TGas> {
95
+ if (i !== 0 && i !== 1) throw Error("Wrong index");
96
+
97
+ return await ensureAllowanceEstimateGas.call(this.llamalend, [this.market.coinAddresses[i]], [amount], this.market.addresses.amm);
98
+ }
99
+
100
+ public async swapApprove(i: number, amount: number | string): Promise<string[]> {
101
+ if (i !== 0 && i !== 1) throw Error("Wrong index");
102
+
103
+ return await ensureAllowance.call(this.llamalend, [this.market.coinAddresses[i]], [amount], this.market.addresses.amm);
104
+ }
105
+
106
+ private async _swap(i: number, j: number, amount: number | string, slippage: number, estimateGas: boolean): Promise<string | TGas> {
107
+ if (!(i === 0 && j === 1) && !(i === 1 && j === 0)) throw Error("Wrong index");
108
+
109
+ const [inDecimals, outDecimals] = [this.market.coinDecimals[i], this.market.coinDecimals[j]];
110
+ const _amount = parseUnits(amount, inDecimals);
111
+ const _expected = await this._swapExpected(i, j, _amount);
112
+ const minRecvAmountBN: BigNumber = toBN(_expected, outDecimals).times(100 - slippage).div(100);
113
+ const _minRecvAmount = fromBN(minRecvAmountBN, outDecimals);
114
+ const contract = this.llamalend.contracts[this.market.addresses.amm].contract;
115
+ const gas = await contract.exchange.estimateGas(i, j, _amount, _minRecvAmount, this.llamalend.constantOptions);
116
+ if (estimateGas) return smartNumber(gas);
117
+
118
+ await this.llamalend.updateFeeData();
119
+ const gasLimit = _mulBy1_3(DIGas(gas));
120
+ return (await contract.exchange(i, j, _amount, _minRecvAmount, { ...this.llamalend.options, gasLimit })).hash
121
+ }
122
+
123
+ public async swapEstimateGas(i: number, j: number, amount: number | string, slippage = 0.1): Promise<TGas> {
124
+ if (!(await this.swapIsApproved(i, amount))) throw Error("Approval is needed for gas estimation");
125
+ return await this._swap(i, j, amount, slippage, true) as TGas;
126
+ }
127
+
128
+ public async swap(i: number, j: number, amount: number | string, slippage = 0.1): Promise<string> {
129
+ await this.swapApprove(i, amount);
130
+ return await this._swap(i, j, amount, slippage, false) as string;
131
+ }
132
+ }
@@ -0,0 +1,9 @@
1
+ export { UserPositionModule } from './userPosition.js';
2
+ export { WalletModule } from './wallet.js'
3
+ export { PricesModule} from './prices.js'
4
+ export { AmmModule } from './amm.js';
5
+ export { VaultModule } from './vault.js';
6
+ export { StatsBaseModule } from './statsBase.js';
7
+ export { LoanBaseModule } from './loanBase.js';
8
+ export { LeverageZapV1BaseModule } from './leverageZapV1Base.js';
9
+ export { LeverageZapV2BaseModule } from './leverageZapV2Base.js';