@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,19 @@
1
+ import memoize from "memoizee";
2
+ import type { LendMarketTemplate } from "../../LendMarketTemplate";
3
+ import { IPrices } from "../../interfaces/common";
4
+ export declare class PricesModule implements IPrices {
5
+ private market;
6
+ private llamalend;
7
+ constructor(market: LendMarketTemplate);
8
+ A: (() => Promise<string>) & memoize.Memoized<() => Promise<string>>;
9
+ basePrice: (() => Promise<string>) & memoize.Memoized<() => Promise<string>>;
10
+ oraclePrice: (() => Promise<string>) & memoize.Memoized<() => Promise<string>>;
11
+ oraclePriceBand(): Promise<number>;
12
+ price(): Promise<string>;
13
+ calcTickPrice(n: number): Promise<string>;
14
+ calcBandPrices(n: number): Promise<[string, string]>;
15
+ calcRangePct(range: number): Promise<string>;
16
+ getPrices(_n2: bigint, _n1: bigint): Promise<[string, string]>;
17
+ calcPrices(_n2: bigint, _n1: bigint): Promise<[string, string]>;
18
+ checkRange(range: number): void;
19
+ }
@@ -0,0 +1,104 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import memoize from "memoizee";
11
+ import { BN, formatUnits, _cutZeros, } from "../../../utils";
12
+ export class PricesModule {
13
+ constructor(market) {
14
+ this.A = memoize(() => __awaiter(this, void 0, void 0, function* () {
15
+ const _A = yield this.llamalend.contracts[this.market.addresses.amm].contract.A(this.llamalend.constantOptions);
16
+ return formatUnits(_A, 0);
17
+ }), {
18
+ promise: true,
19
+ maxAge: 86400 * 1000, // 1d
20
+ });
21
+ this.basePrice = memoize(() => __awaiter(this, void 0, void 0, function* () {
22
+ const _price = yield this.llamalend.contracts[this.market.addresses.amm].contract.get_base_price(this.llamalend.constantOptions);
23
+ return formatUnits(_price);
24
+ }), {
25
+ promise: true,
26
+ maxAge: 86400 * 1000, // 1d
27
+ });
28
+ this.oraclePrice = memoize(() => __awaiter(this, void 0, void 0, function* () {
29
+ const _price = yield this.llamalend.contracts[this.market.addresses.amm].contract.price_oracle(this.llamalend.constantOptions);
30
+ return formatUnits(_price);
31
+ }), {
32
+ promise: true,
33
+ maxAge: 60 * 1000, // 1m
34
+ });
35
+ this.market = market;
36
+ this.llamalend = market.getLlamalend();
37
+ }
38
+ oraclePriceBand() {
39
+ return __awaiter(this, void 0, void 0, function* () {
40
+ const oraclePriceBN = BN(yield this.oraclePrice());
41
+ const basePriceBN = BN(yield this.basePrice());
42
+ const A_BN = BN(yield this.A());
43
+ const multiplier = oraclePriceBN.lte(basePriceBN) ? A_BN.minus(1).div(A_BN) : A_BN.div(A_BN.minus(1));
44
+ const term = oraclePriceBN.lte(basePriceBN) ? 1 : -1;
45
+ const compareFunc = oraclePriceBN.lte(basePriceBN) ?
46
+ (oraclePriceBN, currentTickPriceBN) => oraclePriceBN.lte(currentTickPriceBN) :
47
+ (oraclePriceBN, currentTickPriceBN) => oraclePriceBN.gt(currentTickPriceBN);
48
+ let band = 0;
49
+ let currentTickPriceBN = oraclePriceBN.lte(basePriceBN) ? basePriceBN.times(multiplier) : basePriceBN;
50
+ while (compareFunc(oraclePriceBN, currentTickPriceBN)) {
51
+ currentTickPriceBN = currentTickPriceBN.times(multiplier);
52
+ band += term;
53
+ }
54
+ return band;
55
+ });
56
+ }
57
+ price() {
58
+ return __awaiter(this, void 0, void 0, function* () {
59
+ const _price = yield this.llamalend.contracts[this.market.addresses.amm].contract.get_p(this.llamalend.constantOptions);
60
+ return formatUnits(_price);
61
+ });
62
+ }
63
+ calcTickPrice(n) {
64
+ return __awaiter(this, void 0, void 0, function* () {
65
+ const basePrice = yield this.basePrice();
66
+ const basePriceBN = BN(basePrice);
67
+ const A_BN = BN(yield this.A());
68
+ return _cutZeros(basePriceBN.times(A_BN.minus(1).div(A_BN).pow(n)).toFixed(18));
69
+ });
70
+ }
71
+ calcBandPrices(n) {
72
+ return __awaiter(this, void 0, void 0, function* () {
73
+ return [yield this.calcTickPrice(n + 1), yield this.calcTickPrice(n)];
74
+ });
75
+ }
76
+ calcRangePct(range) {
77
+ return __awaiter(this, void 0, void 0, function* () {
78
+ const A_BN = BN(yield this.A());
79
+ const startBN = BN(1);
80
+ const endBN = A_BN.minus(1).div(A_BN).pow(range);
81
+ return startBN.minus(endBN).times(100).toFixed(6);
82
+ });
83
+ }
84
+ getPrices(_n2, _n1) {
85
+ return __awaiter(this, void 0, void 0, function* () {
86
+ const contract = this.llamalend.contracts[this.market.addresses.amm].multicallContract;
87
+ return (yield this.llamalend.multicallProvider.all([
88
+ contract.p_oracle_down(_n2),
89
+ contract.p_oracle_up(_n1),
90
+ ])).map((_p) => formatUnits(_p));
91
+ });
92
+ }
93
+ calcPrices(_n2, _n1) {
94
+ return __awaiter(this, void 0, void 0, function* () {
95
+ return [yield this.calcTickPrice(Number(_n2) + 1), yield this.calcTickPrice(Number(_n1))];
96
+ });
97
+ }
98
+ checkRange(range) {
99
+ if (range < this.market.minBands)
100
+ throw Error(`range must be >= ${this.market.minBands}`);
101
+ if (range > this.market.maxBands)
102
+ throw Error(`range must be <= ${this.market.maxBands}`);
103
+ }
104
+ }
@@ -0,0 +1,69 @@
1
+ import memoize from "memoizee";
2
+ import { TAmount } from "../../../interfaces";
3
+ import type { LendMarketTemplate } from "../../LendMarketTemplate";
4
+ import { Llamalend } from "../../../llamalend";
5
+ export declare class StatsBaseModule {
6
+ protected market: LendMarketTemplate;
7
+ protected llamalend: Llamalend;
8
+ constructor(market: LendMarketTemplate);
9
+ statsParameters: (() => Promise<{
10
+ fee: string;
11
+ admin_fee: string;
12
+ liquidation_discount: string;
13
+ loan_discount: string;
14
+ base_price: string;
15
+ A: string;
16
+ }>) & memoize.Memoized<() => Promise<{
17
+ fee: string;
18
+ admin_fee: string;
19
+ liquidation_discount: string;
20
+ loan_discount: string;
21
+ base_price: string;
22
+ A: string;
23
+ }>>;
24
+ private _getRate;
25
+ private _getFutureRate;
26
+ statsRates(isGetter?: boolean, useAPI?: boolean): Promise<{
27
+ borrowApr: string;
28
+ lendApr: string;
29
+ borrowApy: string;
30
+ lendApy: string;
31
+ }>;
32
+ statsFutureRates(dReserves: TAmount, dDebt: TAmount, useAPI?: boolean): Promise<{
33
+ borrowApr: string;
34
+ lendApr: string;
35
+ borrowApy: string;
36
+ lendApy: string;
37
+ }>;
38
+ statsBalances(): Promise<[string, string]>;
39
+ statsBandsInfo: (() => Promise<{
40
+ activeBand: number;
41
+ maxBand: number;
42
+ minBand: number;
43
+ liquidationBand: number | null;
44
+ }>) & memoize.Memoized<() => Promise<{
45
+ activeBand: number;
46
+ maxBand: number;
47
+ minBand: number;
48
+ liquidationBand: number | null;
49
+ }>>;
50
+ statsBandBalances(n: number): Promise<{
51
+ borrowed: string;
52
+ collateral: string;
53
+ }>;
54
+ statsBandsBalances(): Promise<{
55
+ [index: number]: {
56
+ borrowed: string;
57
+ collateral: string;
58
+ };
59
+ }>;
60
+ statsTotalDebt(isGetter?: boolean, useAPI?: boolean): Promise<string>;
61
+ statsAmmBalances: (isGetter?: boolean, useAPI?: boolean) => Promise<{
62
+ borrowed: string;
63
+ collateral: string;
64
+ }>;
65
+ statsCapAndAvailable(isGetter?: boolean, useAPI?: boolean): Promise<{
66
+ cap: string;
67
+ available: string;
68
+ }>;
69
+ }
@@ -0,0 +1,291 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import memoize from "memoizee";
11
+ import { parseUnits, BN, toBN, formatUnits, formatNumber, } from "../../../utils";
12
+ import { _getMarketsData } from "../../../external-api";
13
+ import { cacheKey, cacheStats } from "../../../cache";
14
+ export class StatsBaseModule {
15
+ constructor(market) {
16
+ this.statsParameters = memoize(() => __awaiter(this, void 0, void 0, function* () {
17
+ const llammaContract = this.llamalend.contracts[this.market.addresses.amm].multicallContract;
18
+ const controllerContract = this.llamalend.contracts[this.market.addresses.controller].multicallContract;
19
+ const calls = [
20
+ llammaContract.fee(),
21
+ llammaContract.admin_fee(), // TODO: removed
22
+ controllerContract.liquidation_discount(),
23
+ controllerContract.loan_discount(),
24
+ llammaContract.get_base_price(),
25
+ llammaContract.A(),
26
+ ];
27
+ const [_fee, _admin_fee, _liquidation_discount, _loan_discount, _base_price, _A] = yield this.llamalend.multicallProvider.all(calls);
28
+ const A = formatUnits(_A, 0);
29
+ const base_price = formatUnits(_base_price);
30
+ const [fee, admin_fee, liquidation_discount, loan_discount] = [_fee, _admin_fee, _liquidation_discount, _loan_discount]
31
+ .map((_x) => formatUnits(_x * BigInt(100)));
32
+ return { fee, admin_fee, liquidation_discount, loan_discount, base_price, A };
33
+ }), {
34
+ promise: true,
35
+ maxAge: 5 * 60 * 1000, // 5m
36
+ });
37
+ this._getRate = (...args_1) => __awaiter(this, [...args_1], void 0, function* (isGetter = true) {
38
+ let _rate;
39
+ if (isGetter) {
40
+ _rate = cacheStats.get(cacheKey(this.market.addresses.amm, 'rate'));
41
+ }
42
+ else {
43
+ _rate = yield this.llamalend.contracts[this.market.addresses.amm].contract.rate(this.llamalend.constantOptions);
44
+ cacheStats.set(cacheKey(this.market.addresses.controller, 'rate'), _rate);
45
+ }
46
+ return _rate;
47
+ });
48
+ this._getFutureRate = (_dReserves, _dDebt) => __awaiter(this, void 0, void 0, function* () {
49
+ const mpContract = this.llamalend.contracts[this.market.addresses.monetary_policy].contract;
50
+ return yield mpContract.future_rate(this.market.addresses.controller, _dReserves, _dDebt);
51
+ });
52
+ this.statsBandsInfo = memoize(() => __awaiter(this, void 0, void 0, function* () {
53
+ const ammContract = this.llamalend.contracts[this.market.addresses.amm].multicallContract;
54
+ const calls = [
55
+ ammContract.active_band_with_skip(),
56
+ ammContract.max_band(),
57
+ ammContract.min_band(),
58
+ ];
59
+ const [activeBand, maxBand, minBand] = (yield this.llamalend.multicallProvider.all(calls)).map((_b) => Number(_b));
60
+ const { borrowed, collateral } = yield this.statsBandBalances(activeBand);
61
+ let liquidationBand = null;
62
+ if (Number(borrowed) > 0 && Number(collateral) > 0)
63
+ liquidationBand = activeBand;
64
+ return { activeBand, maxBand, minBand, liquidationBand };
65
+ }), {
66
+ promise: true,
67
+ maxAge: 60 * 1000, // 1m
68
+ });
69
+ this.statsAmmBalances = (...args_1) => __awaiter(this, [...args_1], void 0, function* (isGetter = true, useAPI = false) {
70
+ if (useAPI) {
71
+ const response = yield _getMarketsData(this.llamalend.constants.NETWORK_NAME);
72
+ const market = response.lendingVaultData.find((item) => item.address.toLowerCase() === this.market.addresses.vault.toLowerCase());
73
+ if (market) {
74
+ return {
75
+ borrowed: market.ammBalances.ammBalanceBorrowed.toString(),
76
+ collateral: market.ammBalances.ammBalanceCollateral.toString(),
77
+ };
78
+ }
79
+ else {
80
+ throw new Error('Market not found in API');
81
+ }
82
+ }
83
+ else {
84
+ const borrowedContract = this.llamalend.contracts[this.market.addresses.borrowed_token].multicallContract;
85
+ const collateralContract = this.llamalend.contracts[this.market.addresses.collateral_token].multicallContract;
86
+ const ammContract = this.llamalend.contracts[this.market.addresses.amm].multicallContract;
87
+ let _balance_x, _fee_x, _balance_y, _fee_y; // TODO: fees are always 0
88
+ if (isGetter) {
89
+ [_balance_x, _fee_x, _balance_y, _fee_y] = [
90
+ cacheStats.get(cacheKey(this.market.addresses.borrowed_token, 'balanceOf', this.market.addresses.amm)),
91
+ cacheStats.get(cacheKey(this.market.addresses.amm, 'admin_fees_x')),
92
+ cacheStats.get(cacheKey(this.market.addresses.collateral_token, 'balanceOf', this.market.addresses.amm)),
93
+ cacheStats.get(cacheKey(this.market.addresses.amm, 'admin_fees_y')),
94
+ ];
95
+ }
96
+ else {
97
+ [_balance_x, _fee_x, _balance_y, _fee_y] = yield this.llamalend.multicallProvider.all([
98
+ borrowedContract.balanceOf(this.market.addresses.amm),
99
+ ammContract.admin_fees_x(),
100
+ collateralContract.balanceOf(this.market.addresses.amm),
101
+ ammContract.admin_fees_y(),
102
+ ]);
103
+ cacheStats.set(cacheKey(this.market.addresses.borrowed_token, 'balanceOf', this.market.addresses.amm), _balance_x);
104
+ cacheStats.set(cacheKey(this.market.addresses.amm, 'admin_fees_x'), _fee_x);
105
+ cacheStats.set(cacheKey(this.market.addresses.collateral_token, 'balanceOf', this.market.addresses.amm), _balance_y);
106
+ cacheStats.set(cacheKey(this.market.addresses.amm, 'admin_fees_y'), _fee_y);
107
+ }
108
+ return {
109
+ borrowed: toBN(_balance_x, this.market.borrowed_token.decimals).minus(toBN(_fee_x, this.market.borrowed_token.decimals)).toString(),
110
+ collateral: toBN(_balance_y, this.market.collateral_token.decimals).minus(toBN(_fee_y, this.market.collateral_token.decimals)).toString(),
111
+ };
112
+ }
113
+ });
114
+ this.market = market;
115
+ this.llamalend = market.getLlamalend();
116
+ }
117
+ statsRates() {
118
+ return __awaiter(this, arguments, void 0, function* (isGetter = true, useAPI = false) {
119
+ if (useAPI) {
120
+ const response = yield _getMarketsData(this.llamalend.constants.NETWORK_NAME);
121
+ const market = response.lendingVaultData.find((item) => item.address.toLowerCase() === this.market.addresses.vault.toLowerCase());
122
+ if (market) {
123
+ return {
124
+ borrowApr: (market.rates.borrowApr * 100).toString(),
125
+ lendApr: (market.rates.lendApr * 100).toString(),
126
+ borrowApy: (market.rates.borrowApy * 100).toString(),
127
+ lendApy: (market.rates.lendApy * 100).toString(),
128
+ };
129
+ }
130
+ else {
131
+ throw new Error('Market not found in API');
132
+ }
133
+ }
134
+ else {
135
+ const _rate = yield this._getRate(isGetter);
136
+ const borrowApr = toBN(_rate).times(365).times(86400).times(100).toString();
137
+ // borrowApy = e**(rate*365*86400) - 1
138
+ const borrowApy = String(((Math.pow(2.718281828459, (toBN(_rate).times(365).times(86400)).toNumber())) - 1) * 100);
139
+ let lendApr = "0";
140
+ let lendApy = "0";
141
+ const debt = yield this.statsTotalDebt(isGetter);
142
+ if (Number(debt) > 0) {
143
+ const { cap } = yield this.statsCapAndAvailable(isGetter);
144
+ lendApr = toBN(_rate).times(365).times(86400).times(debt).div(cap).times(100).toString();
145
+ // lendApy = (debt * e**(rate*365*86400) - debt) / cap
146
+ const debtInAYearBN = BN(debt).times(Math.pow(2.718281828459, (toBN(_rate).times(365).times(86400)).toNumber()));
147
+ lendApy = debtInAYearBN.minus(debt).div(cap).times(100).toString();
148
+ }
149
+ return { borrowApr, lendApr, borrowApy, lendApy };
150
+ }
151
+ });
152
+ }
153
+ statsFutureRates(dReserves_1, dDebt_1) {
154
+ return __awaiter(this, arguments, void 0, function* (dReserves, dDebt, useAPI = true) {
155
+ const _dReserves = parseUnits(dReserves, this.market.borrowed_token.decimals);
156
+ const _dDebt = parseUnits(dDebt, this.market.borrowed_token.decimals);
157
+ const _rate = yield this._getFutureRate(_dReserves, _dDebt);
158
+ const borrowApr = toBN(_rate).times(365).times(86400).times(100).toString();
159
+ // borrowApy = e**(rate*365*86400) - 1
160
+ const borrowApy = String(((Math.pow(2.718281828459, (toBN(_rate).times(365).times(86400)).toNumber())) - 1) * 100);
161
+ let lendApr = "0";
162
+ let lendApy = "0";
163
+ const debt = Number(yield this.statsTotalDebt()) + Number(dDebt);
164
+ if (Number(debt) > 0) {
165
+ const cap = Number((yield this.statsCapAndAvailable(true, useAPI)).cap) + Number(dReserves);
166
+ lendApr = toBN(_rate).times(365).times(86400).times(debt).div(cap).times(100).toString();
167
+ // lendApy = (debt * e**(rate*365*86400) - debt) / cap
168
+ const debtInAYearBN = BN(debt).times(Math.pow(2.718281828459, (toBN(_rate).times(365).times(86400)).toNumber()));
169
+ lendApy = debtInAYearBN.minus(debt).div(cap).times(100).toString();
170
+ }
171
+ return { borrowApr, lendApr, borrowApy, lendApy };
172
+ });
173
+ }
174
+ statsBalances() {
175
+ return __awaiter(this, void 0, void 0, function* () {
176
+ const borrowedContract = this.llamalend.contracts[this.market.borrowed_token.address].multicallContract;
177
+ const collateralContract = this.llamalend.contracts[this.market.collateral_token.address].multicallContract;
178
+ const ammContract = this.llamalend.contracts[this.market.addresses.amm].multicallContract;
179
+ const calls = [
180
+ borrowedContract.balanceOf(this.market.addresses.amm),
181
+ collateralContract.balanceOf(this.market.addresses.amm),
182
+ ammContract.admin_fees_x(), // TODO: always 0
183
+ ammContract.admin_fees_y(), // TODO: always 0
184
+ ];
185
+ const [_borrowedBalance, _collateralBalance, _borrowedAdminFees, _collateralAdminFees] = yield this.llamalend.multicallProvider.all(calls);
186
+ return [
187
+ formatUnits(_borrowedBalance - _borrowedAdminFees, this.market.borrowed_token.decimals),
188
+ formatUnits(_collateralBalance - _collateralAdminFees, this.market.collateral_token.decimals),
189
+ ];
190
+ });
191
+ }
192
+ statsBandBalances(n) {
193
+ return __awaiter(this, void 0, void 0, function* () {
194
+ const ammContract = this.llamalend.contracts[this.market.addresses.amm].multicallContract;
195
+ const calls = [];
196
+ calls.push(ammContract.bands_x(n), ammContract.bands_y(n));
197
+ const _balances = yield this.llamalend.multicallProvider.all(calls);
198
+ // bands_x and bands_y always return amounts with 18 decimals
199
+ return {
200
+ borrowed: formatNumber(formatUnits(_balances[0]), this.market.borrowed_token.decimals),
201
+ collateral: formatNumber(formatUnits(_balances[1]), this.market.collateral_token.decimals),
202
+ };
203
+ });
204
+ }
205
+ statsBandsBalances() {
206
+ return __awaiter(this, void 0, void 0, function* () {
207
+ const { maxBand, minBand } = yield this.statsBandsInfo();
208
+ const ammContract = this.llamalend.contracts[this.market.addresses.amm].multicallContract;
209
+ const calls = [];
210
+ for (let i = minBand; i <= maxBand; i++) {
211
+ calls.push(ammContract.bands_x(i), ammContract.bands_y(i));
212
+ }
213
+ const _bands = yield this.llamalend.multicallProvider.all(calls);
214
+ const bands = {};
215
+ for (let i = minBand; i <= maxBand; i++) {
216
+ const _i = i - minBand;
217
+ // bands_x and bands_y always return amounts with 18 decimals
218
+ bands[i] = {
219
+ borrowed: formatNumber(formatUnits(_bands[2 * _i]), this.market.borrowed_token.decimals),
220
+ collateral: formatNumber(formatUnits(_bands[(2 * _i) + 1]), this.market.collateral_token.decimals),
221
+ };
222
+ }
223
+ return bands;
224
+ });
225
+ }
226
+ statsTotalDebt() {
227
+ return __awaiter(this, arguments, void 0, function* (isGetter = true, useAPI = true) {
228
+ if (useAPI) {
229
+ const response = yield _getMarketsData(this.llamalend.constants.NETWORK_NAME);
230
+ const market = response.lendingVaultData.find((item) => item.address.toLowerCase() === this.market.addresses.vault.toLowerCase());
231
+ if (market) {
232
+ return market.borrowed.total.toString();
233
+ }
234
+ else {
235
+ throw new Error('Market not found in API');
236
+ }
237
+ }
238
+ else {
239
+ let _debt;
240
+ if (isGetter) {
241
+ _debt = cacheStats.get(cacheKey(this.market.addresses.controller, 'total_debt'));
242
+ }
243
+ else {
244
+ _debt = yield this.llamalend.contracts[this.market.addresses.controller].contract.total_debt(this.llamalend.constantOptions);
245
+ cacheStats.set(cacheKey(this.market.addresses.controller, 'total_debt'), _debt);
246
+ }
247
+ return formatUnits(_debt, this.market.borrowed_token.decimals);
248
+ }
249
+ });
250
+ }
251
+ statsCapAndAvailable() {
252
+ return __awaiter(this, arguments, void 0, function* (isGetter = true, useAPI = false) {
253
+ if (useAPI) {
254
+ const response = yield _getMarketsData(this.llamalend.constants.NETWORK_NAME);
255
+ const market = response.lendingVaultData.find((item) => item.address.toLowerCase() === this.market.addresses.vault.toLowerCase());
256
+ if (market) {
257
+ return {
258
+ cap: market.totalSupplied.total.toString(),
259
+ available: market.availableToBorrow.total.toString(),
260
+ };
261
+ }
262
+ else {
263
+ throw new Error('Market not found in API');
264
+ }
265
+ }
266
+ else {
267
+ const vaultContract = this.llamalend.contracts[this.market.addresses.vault].multicallContract;
268
+ const borrowedContract = this.llamalend.contracts[this.market.addresses.borrowed_token].multicallContract;
269
+ let _cap, _available;
270
+ if (isGetter) { // TODO: should call controller.available_balance() instead of borrowed_token.balanceOf(controller)
271
+ _cap = cacheStats.get(cacheKey(this.market.addresses.vault, 'totalAssets', this.market.addresses.controller));
272
+ _available = cacheStats.get(cacheKey(this.market.addresses.borrowed_token, 'balanceOf', this.market.addresses.controller));
273
+ }
274
+ else {
275
+ [_cap, _available] = yield this.llamalend.multicallProvider.all([
276
+ vaultContract.totalAssets(this.market.addresses.controller),
277
+ borrowedContract.balanceOf(this.market.addresses.controller),
278
+ ]);
279
+ cacheStats.set(cacheKey(this.market.addresses.vault, 'totalAssets', this.market.addresses.controller), _cap);
280
+ cacheStats.set(cacheKey(this.market.addresses.borrowed_token, 'balanceOf', this.market.addresses.controller), _available);
281
+ }
282
+ return {
283
+ cap: this.llamalend.formatUnits(_cap, this.market.borrowed_token.decimals),
284
+ available: this.llamalend.formatUnits(_available, this.market.borrowed_token.decimals),
285
+ };
286
+ // cap -> totalAssets
287
+ // add cap: controller.borrow_cap() // Display
288
+ }
289
+ });
290
+ }
291
+ }
@@ -0,0 +1,46 @@
1
+ import { IDict } from "../../../interfaces";
2
+ import type { LendMarketTemplate } from "../../LendMarketTemplate";
3
+ import { IUserPosition } from "../../interfaces/common";
4
+ export declare class UserPositionModule implements IUserPosition {
5
+ private market;
6
+ private llamalend;
7
+ constructor(market: LendMarketTemplate);
8
+ userLoanExists(address?: string): Promise<boolean>;
9
+ private _userState;
10
+ userState(address?: string): Promise<{
11
+ collateral: string;
12
+ borrowed: string;
13
+ debt: string;
14
+ N: string;
15
+ }>;
16
+ userStateBigInt(address?: string): Promise<{
17
+ _collateral: bigint;
18
+ _borrowed: bigint;
19
+ _debt: bigint;
20
+ _N: bigint;
21
+ }>;
22
+ userHealth(full?: boolean, address?: string): Promise<string>;
23
+ private _userBands;
24
+ userBands(address?: string): Promise<number[]>;
25
+ userBandsBigInt(address?: string): Promise<bigint[]>;
26
+ userRange(address?: string): Promise<number>;
27
+ userPrices(address?: string): Promise<string[]>;
28
+ userLoss(userAddress?: string): Promise<{
29
+ deposited_collateral: string;
30
+ current_collateral_estimation: string;
31
+ loss: string;
32
+ loss_pct: string;
33
+ }>;
34
+ userBandsBalances(address?: string): Promise<IDict<{
35
+ collateral: string;
36
+ borrowed: string;
37
+ }>>;
38
+ currentLeverage(userAddress?: string): Promise<string>;
39
+ currentPnL(userAddress?: string): Promise<Record<string, string>>;
40
+ userBoost(address?: string): Promise<string>;
41
+ getCurrentLeverageParams(userAddress: string): Promise<{
42
+ stateCollateral: string;
43
+ totalDepositFromUser: string;
44
+ }>;
45
+ forceUpdateUserState(newTx: string, userAddress?: string): Promise<void>;
46
+ }