impermax-sdk 1.0.0

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 (103) hide show
  1. package/.idea/impermax-sdk.iml +12 -0
  2. package/.idea/misc.xml +6 -0
  3. package/.idea/modules.xml +8 -0
  4. package/.idea/workspace.xml +642 -0
  5. package/abis/ImpermaxABI.ts +3 -0
  6. package/abis/contracts/BAllowance.json +4735 -0
  7. package/abis/contracts/BDeployer.json +1195 -0
  8. package/abis/contracts/BInterestRateModel.json +10796 -0
  9. package/abis/contracts/BSetter.json +6219 -0
  10. package/abis/contracts/BStorage.json +2613 -0
  11. package/abis/contracts/Borrowable.json +19937 -0
  12. package/abis/contracts/CDeployer.json +1104 -0
  13. package/abis/contracts/CSetter.json +5094 -0
  14. package/abis/contracts/CStorage.json +516 -0
  15. package/abis/contracts/ClaimAggregator.json +2015 -0
  16. package/abis/contracts/Collateral.json +21615 -0
  17. package/abis/contracts/ERC20.json +819 -0
  18. package/abis/contracts/Factory.json +21986 -0
  19. package/abis/contracts/FarmingPool.json +8601 -0
  20. package/abis/contracts/IBDeployer.json +351 -0
  21. package/abis/contracts/IBorrowTracker.json +346 -0
  22. package/abis/contracts/IBorrowable.json +13207 -0
  23. package/abis/contracts/ICDeployer.json +294 -0
  24. package/abis/contracts/IClaimable.json +406 -0
  25. package/abis/contracts/ICollateral.json +8952 -0
  26. package/abis/contracts/IERC20.json +2376 -0
  27. package/abis/contracts/IFactory.json +3660 -0
  28. package/abis/contracts/IFarmingPool.json +3584 -0
  29. package/abis/contracts/IImpermaxCallee.json +679 -0
  30. package/abis/contracts/IMerkleDistributor.json +1134 -0
  31. package/abis/contracts/IPoolToken.json +5343 -0
  32. package/abis/contracts/IRouter01.json +6891 -0
  33. package/abis/contracts/IRouter02.json +7283 -0
  34. package/abis/contracts/ISimpleUniswapOracle.json +1469 -0
  35. package/abis/contracts/IStakedLPToken.json +7309 -0
  36. package/abis/contracts/IStakingRewards.json +1036 -0
  37. package/abis/contracts/IUniswapV2Callee.json +403 -0
  38. package/abis/contracts/IUniswapV2ERC20.json +3155 -0
  39. package/abis/contracts/IUniswapV2Factory.json +1690 -0
  40. package/abis/contracts/IUniswapV2Pair.json +6761 -0
  41. package/abis/contracts/IWETH.json +561 -0
  42. package/abis/contracts/ImpermaxChef.json +20945 -0
  43. package/abis/contracts/ImpermaxERC20.json +12095 -0
  44. package/abis/contracts/Math.json +1966 -0
  45. package/abis/contracts/MockERC20.json +8884 -0
  46. package/abis/contracts/PoolToken.json +10784 -0
  47. package/abis/contracts/Router01.json +43963 -0
  48. package/abis/contracts/SafeMath.json +6828 -0
  49. package/abis/contracts/SimpleUniswapOracle.json +9640 -0
  50. package/abis/contracts/TransferHelper.json +4875 -0
  51. package/abis/contracts/UQ112x112.json +1201 -0
  52. package/abis/contracts/UniswapV2ERC20.json +10969 -0
  53. package/abis/contracts/UniswapV2Factory.json +5521 -0
  54. package/abis/contracts/UniswapV2Library.json +13789 -0
  55. package/abis/contracts/UniswapV2Pair.json +30782 -0
  56. package/abis/contracts/WETH9.json +6613 -0
  57. package/config/amms.ts +199 -0
  58. package/config/contracts/claim-aggregators.ts +16 -0
  59. package/config/contracts/impermax-chef.ts +16 -0
  60. package/config/contracts/imxes.ts +16 -0
  61. package/config/contracts/merkle-distributors.ts +13 -0
  62. package/config/contracts/routers.ts +36 -0
  63. package/config/contracts/simple-uniswap-oracles.ts +33 -0
  64. package/config/contracts/weths.ts +18 -0
  65. package/config/debank-ids.ts +15 -0
  66. package/config/endpoints/merkle-distributors.ts +13 -0
  67. package/config/eth.ts +32 -0
  68. package/config/factories.ts +26 -0
  69. package/config/farms.ts +119 -0
  70. package/config/general.ts +8 -0
  71. package/config/subgraphs.ts +69 -0
  72. package/config/types.ts +81 -0
  73. package/impermax-router/Account.ts +123 -0
  74. package/impermax-router/AccountBorrowable.ts +110 -0
  75. package/impermax-router/AccountCollateral.ts +40 -0
  76. package/impermax-router/AccountLendingPool.ts +231 -0
  77. package/impermax-router/AccountPoolToken.ts +76 -0
  78. package/impermax-router/Borrowable.ts +86 -0
  79. package/impermax-router/Collateral.ts +26 -0
  80. package/impermax-router/ContractsHelper.ts +64 -0
  81. package/impermax-router/ImpermaxFactory.ts +47 -0
  82. package/impermax-router/Interactions.ts +94 -0
  83. package/impermax-router/InteractionsLendingPool.ts +129 -0
  84. package/impermax-router/InteractionsPoolToken.ts +187 -0
  85. package/impermax-router/LendingPool.ts +256 -0
  86. package/impermax-router/PoolToken.ts +112 -0
  87. package/impermax-router/index.ts +49 -0
  88. package/impermax-router/interfaces.ts +233 -0
  89. package/index.ts +5 -0
  90. package/package.json +23 -0
  91. package/subgraph/Account.ts +93 -0
  92. package/subgraph/AccountLendingPool.ts +60 -0
  93. package/subgraph/AccountPoolToken.ts +60 -0
  94. package/subgraph/LendingPool.ts +179 -0
  95. package/subgraph/PoolToken.ts +381 -0
  96. package/subgraph/PriceHelper.ts +150 -0
  97. package/subgraph/SolidexHelper.ts +54 -0
  98. package/subgraph/index.ts +166 -0
  99. package/subgraph/initializer.ts +509 -0
  100. package/subgraph/query.ts +224 -0
  101. package/tsconfig.json +16 -0
  102. package/utils/ether-utils.ts +22 -0
  103. package/utils/index.ts +12 -0
@@ -0,0 +1,93 @@
1
+ import { UserData } from "../impermax-router/interfaces";
2
+
3
+ import Subgraph from ".";
4
+ import AccountLendingPool from "./AccountLendingPool";
5
+ import { Address, Factory, FactoryIndex, LendingPoolIndex, PoolTokenType } from '../config/types';
6
+
7
+ export default class Account {
8
+ subgraph: Subgraph;
9
+ account: Address;
10
+ accountLLPs: LendingPoolIndex<Promise<AccountLendingPool>>;
11
+
12
+ constructor(subgraph: Subgraph, account: Address) {
13
+ this.subgraph = subgraph;
14
+ this.account = account;
15
+ this.accountLLPs = {}
16
+ }
17
+
18
+ private async initializeAccountLendingPool(factory: Factory, pair: Address) : Promise<AccountLendingPool> {
19
+ const lendingPool = await this.subgraph.getLendingPool(factory, pair);
20
+ return new AccountLendingPool(this, lendingPool);
21
+ }
22
+ async getAccountLendingPool(factory: Factory, pair: Address) : Promise<AccountLendingPool> {
23
+ if (!this.accountLLPs[factory]) this.accountLLPs[factory] = {};
24
+ if (!this.accountLLPs[factory][pair]) this.accountLLPs[factory][pair] = this.initializeAccountLendingPool(factory, pair);
25
+ return this.accountLLPs[factory][pair];
26
+ }
27
+
28
+ async getUserData() : Promise<FactoryIndex<UserData>> {
29
+ return this.subgraph.getUserData(this.account);
30
+ }
31
+
32
+ async getBorrowPositions() : Promise<FactoryIndex<Address[]>> {
33
+ const result: FactoryIndex<Address[]> = {};
34
+ const userData = await this.getUserData();
35
+ for (const factory of Object.keys(userData) as Factory[]) {
36
+ result[factory] = Object.keys(userData[factory].collateralPositions);
37
+ }
38
+ return result;
39
+ }
40
+
41
+ async getSupplyPositions() : Promise<FactoryIndex<Address[]>> {
42
+ const result: FactoryIndex<Address[]> = {};
43
+ const userData = await this.getUserData();
44
+ for (const factory of Object.keys(userData) as Factory[]) {
45
+ result[factory] = Object.keys(userData[factory].supplyPositions);
46
+ }
47
+ return result;
48
+ }
49
+
50
+ async getAccountTotalValueLocked() : Promise<number> {
51
+ const borrowPositions = await this.getBorrowPositions();
52
+ const supplyPositions = await this.getSupplyPositions();
53
+ let tvl = 0;
54
+ for (const factory of Object.keys(borrowPositions) as Factory[]) {
55
+ for (const uniswapV2PairAddress of borrowPositions[factory]) {
56
+ const accountLendingPool = await this.getAccountLendingPool(factory, uniswapV2PairAddress);
57
+ tvl += await accountLendingPool.getBorrowerEquityValue();
58
+ }
59
+ for (const uniswapV2PairAddress of supplyPositions[factory]) {
60
+ const accountLendingPool = await this.getAccountLendingPool(factory, uniswapV2PairAddress);
61
+ tvl += await accountLendingPool.accountPoolTokens[PoolTokenType.BorrowableA].getSuppliedValue();
62
+ tvl += await accountLendingPool.accountPoolTokens[PoolTokenType.BorrowableB].getSuppliedValue();
63
+ }
64
+ }
65
+ return tvl;
66
+ }
67
+
68
+ async getAccountTotalValueSupplied() : Promise<number> {
69
+ const supplyPositions = await this.getSupplyPositions();
70
+ let tvl = 0;
71
+ for (const factory of Object.keys(supplyPositions) as Factory[]) {
72
+ for (const uniswapV2PairAddress of supplyPositions[factory]) {
73
+ const accountLendingPool = await this.getAccountLendingPool(factory, uniswapV2PairAddress);
74
+ tvl += await accountLendingPool.accountPoolTokens[PoolTokenType.BorrowableA].getSuppliedValue();
75
+ tvl += await accountLendingPool.accountPoolTokens[PoolTokenType.BorrowableB].getSuppliedValue();
76
+ }
77
+ }
78
+ return tvl;
79
+ }
80
+
81
+ async getAccountTotalValueBorrowed() : Promise<number> {
82
+ const borrowPositions = await this.getBorrowPositions();
83
+ let tvl = 0;
84
+ for (const factory of Object.keys(borrowPositions) as Factory[]) {
85
+ for (const uniswapV2PairAddress of borrowPositions[factory]) {
86
+ const accountLendingPool = await this.getAccountLendingPool(factory, uniswapV2PairAddress);
87
+ tvl += await accountLendingPool.accountPoolTokens[PoolTokenType.BorrowableA].getBorrowedValue();
88
+ tvl += await accountLendingPool.accountPoolTokens[PoolTokenType.BorrowableB].getBorrowedValue();
89
+ }
90
+ }
91
+ return tvl;
92
+ }
93
+ }
@@ -0,0 +1,60 @@
1
+ import { CollateralPosition, UserData } from "../impermax-router/interfaces";
2
+ import Account from "./Account";
3
+ import AccountPoolToken from "./AccountPoolToken";
4
+
5
+ import LendingPool from "./LendingPool";
6
+ import { PoolTokenType } from '../config/types';
7
+
8
+ export default class AccountLendingPool {
9
+ account: Account;
10
+ lendingPool: LendingPool;
11
+ accountPoolTokens: {
12
+ [key in PoolTokenType]?: AccountPoolToken
13
+ }
14
+
15
+ constructor(account: Account, lendingPool: LendingPool) {
16
+ this.account = account;
17
+ this.lendingPool = lendingPool;
18
+ this.accountPoolTokens = {};
19
+ this.accountPoolTokens[PoolTokenType.Collateral] = new AccountPoolToken(this, PoolTokenType.Collateral);
20
+ this.accountPoolTokens[PoolTokenType.BorrowableA] = new AccountPoolToken(this, PoolTokenType.BorrowableA);
21
+ this.accountPoolTokens[PoolTokenType.BorrowableB] = new AccountPoolToken(this, PoolTokenType.BorrowableB);
22
+ }
23
+
24
+ getAccountPoolToken(poolTokenType: PoolTokenType) : AccountPoolToken {
25
+ return this.accountPoolTokens[poolTokenType];
26
+ }
27
+
28
+ async getUserData() : Promise<UserData> {
29
+ const userData = await this.account.getUserData();
30
+ if(!userData) return null;
31
+ return userData[this.lendingPool.factory];
32
+ }
33
+
34
+ async getCollateralPosition() : Promise<CollateralPosition> {
35
+ const userData = await this.getUserData();
36
+ if(!userData) return null;
37
+ return userData.collateralPositions[this.lendingPool.pairAddress];
38
+ }
39
+
40
+ async getCollateralAmount() : Promise<number> {
41
+ const collateralPosition = await this.getCollateralPosition();
42
+ if(!collateralPosition) return 0;
43
+ const exchangeRate = await this.lendingPool.poolTokens[PoolTokenType.Collateral].getExchangeRate();
44
+ const collateralBalance = parseFloat(collateralPosition.balance);
45
+ return collateralBalance * exchangeRate;
46
+ }
47
+
48
+ async getCollateralValue() : Promise<number> {
49
+ const tokenPrice = await this.lendingPool.poolTokens[PoolTokenType.Collateral].getTokenPriceAccurate();
50
+ const collateralAmount = await this.getCollateralAmount();
51
+ return collateralAmount * tokenPrice;
52
+ }
53
+
54
+ async getBorrowerEquityValue() : Promise<number> {
55
+ const collateralValue = await this.getCollateralValue();
56
+ const borrowedValueA = await this.accountPoolTokens[PoolTokenType.BorrowableA].getBorrowedValue();
57
+ const borrowedValueB = await this.accountPoolTokens[PoolTokenType.BorrowableB].getBorrowedValue();
58
+ return collateralValue - borrowedValueA - borrowedValueB;
59
+ }
60
+ }
@@ -0,0 +1,60 @@
1
+ import { BorrowPosition, SupplyPosition } from "../impermax-router/interfaces";
2
+ import AccountLendingPool from "./AccountLendingPool";
3
+
4
+ import PoolToken from "./PoolToken";
5
+ import { PoolTokenType } from '../config/types';
6
+
7
+ export default class AccountPoolToken {
8
+ accountLendingPool: AccountLendingPool;
9
+ poolToken: PoolToken;
10
+
11
+ constructor(accountLendingPool: AccountLendingPool, poolTokenType: PoolTokenType) {
12
+ this.accountLendingPool = accountLendingPool;
13
+ this.poolToken = accountLendingPool.lendingPool.poolTokens[poolTokenType];
14
+ }
15
+
16
+ private async getBorrowPosition() : Promise<BorrowPosition> {
17
+ const userData = await this.accountLendingPool.getUserData();
18
+ if(!userData) return null;
19
+ const borrowPositions = userData.borrowPositions[this.poolToken.lendingPool.pairAddress];
20
+ if(!borrowPositions) return null;
21
+ return borrowPositions[this.poolToken.poolTokenType];
22
+ }
23
+
24
+ private async getSupplyPosition() : Promise<SupplyPosition> {
25
+ const userData = await this.accountLendingPool.getUserData();
26
+ if(!userData) return null;
27
+ const supplyPositions = userData.supplyPositions[this.poolToken.lendingPool.pairAddress];
28
+ if(!supplyPositions) return null;
29
+ return supplyPositions[this.poolToken.poolTokenType];
30
+ }
31
+
32
+ async getBorrowedAmount() : Promise<number> {
33
+ const borrowPosition = await this.getBorrowPosition();
34
+ const borrowIndex = await this.poolToken.getBorrowIndex();
35
+ if(!borrowPosition) return 0;
36
+ const borrowBalance = parseFloat(borrowPosition.borrowBalance);
37
+ const userBorrowIndex = parseFloat(borrowPosition.borrowIndex);
38
+ return borrowBalance * borrowIndex / userBorrowIndex;
39
+ }
40
+
41
+ async getBorrowedValue() : Promise<number> {
42
+ const tokenPrice = await this.poolToken.getTokenPriceAccurate();
43
+ const borrowedAmount = await this.getBorrowedAmount();
44
+ return borrowedAmount * tokenPrice;
45
+ }
46
+
47
+ async getSuppliedAmount() : Promise<number> {
48
+ const supplyPosition = await this.getSupplyPosition();
49
+ if(!supplyPosition) return 0;
50
+ const exchangeRate = await this.poolToken.getExchangeRate();
51
+ const supplyBalance = parseFloat(supplyPosition.balance);
52
+ return supplyBalance * exchangeRate;
53
+ }
54
+
55
+ async getSuppliedValue() : Promise<number> {
56
+ const tokenPrice = await this.poolToken.getTokenPriceAccurate();
57
+ const suppliedAmount = await this.getSuppliedAmount();
58
+ return suppliedAmount * tokenPrice;
59
+ }
60
+ }
@@ -0,0 +1,179 @@
1
+ import { LendingPoolData, LendingPoolPastData } from "../impermax-router/interfaces";
2
+
3
+ import Subgraph from ".";
4
+ import PoolToken from "./PoolToken";
5
+ import { toAPR } from "../utils";
6
+ import { Address, Amms, Factory, PoolTokenType } from '../config/types';
7
+ import { getAmmByFactory } from '../config/amms';
8
+ import { OLD_KINK_MULTIPLIER_FACTORIES } from '../config/factories';
9
+ import { Farms, getFarmByStakedLPFactory } from '../config/farms';
10
+
11
+ export default class LendingPool {
12
+ subgraph: Subgraph;
13
+ factory: Factory;
14
+ pairAddress: Address;
15
+ poolTokens: {
16
+ [key in PoolTokenType]?: PoolToken
17
+ };
18
+
19
+ constructor(subgraph: Subgraph, factory: Factory, pairAddress: Address) {
20
+ this.subgraph = subgraph;
21
+ this.factory = factory;
22
+ this.pairAddress = pairAddress;
23
+ this.poolTokens = {};
24
+ this.poolTokens[PoolTokenType.Collateral] = new PoolToken(this, PoolTokenType.Collateral);
25
+ this.poolTokens[PoolTokenType.BorrowableA] = new PoolToken(this, PoolTokenType.BorrowableA);
26
+ this.poolTokens[PoolTokenType.BorrowableB] = new PoolToken(this, PoolTokenType.BorrowableB);
27
+ }
28
+
29
+ getPoolToken(poolTokenType: PoolTokenType) : PoolToken {
30
+ return this.poolTokens[poolTokenType];
31
+ }
32
+
33
+ // Subgraph calls
34
+ async getLendingPoolData() : Promise<LendingPoolData> {
35
+ return this.subgraph.getLendingPoolData(this.factory, this.pairAddress);
36
+ }
37
+
38
+ // Safety Margin
39
+ async getSafetyMargin() : Promise<number> {
40
+ const lendingPoolData = await this.getLendingPoolData();
41
+ return parseFloat(lendingPoolData[PoolTokenType.Collateral].safetyMargin);
42
+ }
43
+
44
+ // Liquidation Penalty
45
+ async getLiquidationIncentive() : Promise<number> {
46
+ const lendingPoolData = await this.getLendingPoolData();
47
+ return parseFloat(lendingPoolData[PoolTokenType.Collateral].liquidationIncentive);
48
+ }
49
+ async getLiquidationFee() : Promise<number> {
50
+ const lendingPoolData = await this.getLendingPoolData();
51
+ const liquidationFee = lendingPoolData[PoolTokenType.Collateral].liquidationFee;
52
+ return liquidationFee ? parseFloat(liquidationFee) : 0;
53
+ }
54
+ async getLiquidationPenalty() : Promise<number> {
55
+ return await this.getLiquidationIncentive() + await this.getLiquidationFee();
56
+ }
57
+
58
+ // Uniswap APR
59
+ async getUniswapAPR() : Promise<number> {
60
+ const lendingPoolData = await this.getLendingPoolData();
61
+ return lendingPoolData.pair.uniswapAPR;
62
+ }
63
+
64
+ // Staking
65
+ async isStakedLPToken() : Promise<boolean> {
66
+ const lendingPoolData = await this.getLendingPoolData();
67
+ return lendingPoolData.pair.isStakedLPToken;
68
+ }
69
+ async getStakedLPExchangeRate() : Promise<number> {
70
+ const lendingPoolData = await this.getLendingPoolData();
71
+ return parseFloat(lendingPoolData.pair.exchangeRate);
72
+ }
73
+ async getStakingRewards(): Promise<Array<{
74
+ APR: number,
75
+ symbol: string,
76
+ }>> {
77
+ const farm = await this.getFarm();
78
+ const lendingPoolData = await this.getLendingPoolData();
79
+
80
+ if (farm === Farms.solidex || farm === Farms.solidexB || farm === Farms.solidexUSDC || farm === Farms.solidexUSDCB) {
81
+ const solidexLPDetails = await this.subgraph.solidexHelper.getSolidexLPDetails();
82
+ const result = solidexLPDetails[lendingPoolData.pair.uniswapV2PairAddress];
83
+ if (result) return result;
84
+ }
85
+
86
+ const FINISH_DELAY = 3600 * 24 * 1;
87
+ const rewards = [];
88
+ const stakedTotalSupply = parseFloat(lendingPoolData.pair.stakedTotalSupply);
89
+ const underlyingLPPrice = await this.getUnderlyingLPPrice(true);
90
+ for(const reward of lendingPoolData.pair.rewards) {
91
+ const multiplier = farm === Farms.traderJoeV2 ? 0.5 : 1;
92
+ const periodFinish = parseInt(reward.periodFinish);
93
+ if ((new Date).getTime() / 1000 - FINISH_DELAY > periodFinish && periodFinish !== 0) continue;
94
+ let rewardRate = parseFloat(reward.rewardRate);
95
+ if (farm == Farms.traderJoeV4) rewardRate = rewardRate * 0.45;
96
+ const rewardPrice = await this.subgraph.priceHelper.getDebankTokenPrice(reward.rewardsToken.id);
97
+ rewards.push({
98
+ APR: toAPR((rewardPrice * rewardRate) / (stakedTotalSupply * underlyingLPPrice) * multiplier),
99
+ symbol: reward.rewardsToken.symbol,
100
+ });
101
+ }
102
+ return rewards;
103
+ }
104
+ async getStakingAPR() : Promise<number> {
105
+ const rewards = await this.getStakingRewards();
106
+ let APR = 0;
107
+ for (const reward of rewards) {
108
+ APR += reward.APR
109
+ }
110
+ return APR;
111
+ }
112
+
113
+ //Shown Leverage
114
+ async getShownLeverage() : Promise<number> {
115
+ const safetyMargin = await this.getSafetyMargin();
116
+ if (safetyMargin < 1.25) return 20;
117
+ if (safetyMargin < 1.51) return 10;
118
+ if (safetyMargin < 2.01) return 5;
119
+ return 3;
120
+ }
121
+
122
+ // Past Data
123
+ async getLendingPoolDataPast24h() : Promise<LendingPoolPastData> {
124
+ return (await this.getLendingPoolData()).past24h;
125
+ }
126
+ async getLendingPoolDataPast7d() : Promise<LendingPoolPastData> {
127
+ return (await this.getLendingPoolData()).past7d;
128
+ }
129
+
130
+ // Amms and farms
131
+ async getAmm() : Promise<Amms> {
132
+ const lendingPoolData = await this.getLendingPoolData();
133
+ return getAmmByFactory(this.subgraph.network, lendingPoolData.pair.uniswapV2Factory);
134
+ }
135
+ async getFarm() : Promise<Farms> {
136
+ const lendingPoolData = await this.getLendingPoolData();
137
+ return getFarmByStakedLPFactory(this.subgraph.network, lendingPoolData.pair.factory);
138
+ }
139
+
140
+ // getCollateralPrice -> returns the price of the collateral, not necessarily of the underlying LP
141
+ private calculateCollateralPrice(reserve0: number, reserve1: number, totalSupply: number, price0: number, price1: number) : number {
142
+ if (totalSupply === 0) return 0;
143
+ const reserve0USD = reserve0 * price0;
144
+ const reserve1USD = reserve1 * price1;
145
+ // adjust reserves taking the latest price passed as parameters
146
+ const adjustedReserveUSD = Math.sqrt(reserve0USD * reserve1USD) * 2;
147
+ return adjustedReserveUSD / totalSupply;
148
+ }
149
+ async getCollateralPrice(fast: boolean = true) : Promise<number> {
150
+ const lendingPoolData = await this.getLendingPoolData();
151
+ return this.calculateCollateralPrice(
152
+ parseFloat(lendingPoolData.pair.reserve0),
153
+ parseFloat(lendingPoolData.pair.reserve1),
154
+ parseFloat(lendingPoolData.pair.totalSupply),
155
+ fast ?
156
+ await this.poolTokens[PoolTokenType.BorrowableA].getTokenPriceFast() :
157
+ await this.poolTokens[PoolTokenType.BorrowableA].getTokenPriceAccurate(),
158
+ fast ?
159
+ await this.poolTokens[PoolTokenType.BorrowableB].getTokenPriceFast() :
160
+ await this.poolTokens[PoolTokenType.BorrowableB].getTokenPriceAccurate(),
161
+ );
162
+ }
163
+ async getUnderlyingLPPrice(fast: boolean = true) {
164
+ return await this.getCollateralPrice(fast) / await this.getStakedLPExchangeRate();
165
+ }
166
+
167
+ // Kink Multiplier
168
+ getKinkMultiplier() {
169
+ if (OLD_KINK_MULTIPLIER_FACTORIES.includes(this.factory)) return 5;
170
+ return 2;
171
+ }
172
+
173
+ // Stats
174
+ async getTotalBorrowsUSD() {
175
+ const totalBorrowsUSDA = await this.poolTokens[PoolTokenType.BorrowableA].getTotalBorrowsUSD();
176
+ const totalBorrowsUSDB = await this.poolTokens[PoolTokenType.BorrowableB].getTotalBorrowsUSD();
177
+ return totalBorrowsUSDA + totalBorrowsUSDB;
178
+ }
179
+ }