@defisaver/positions-sdk 0.0.23 → 0.0.25

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 (61) hide show
  1. package/README.md +63 -63
  2. package/cjs/helpers/curveUsdHelpers/index.js +0 -1
  3. package/cjs/markets/curveUsd/index.js +15 -15
  4. package/cjs/spark/index.js +1 -0
  5. package/cjs/types/curveUsd.d.ts +5 -6
  6. package/cjs/types/curveUsd.js +5 -5
  7. package/esm/helpers/curveUsdHelpers/index.js +0 -1
  8. package/esm/markets/curveUsd/index.js +15 -15
  9. package/esm/spark/index.js +1 -0
  10. package/esm/types/curveUsd.d.ts +5 -6
  11. package/esm/types/curveUsd.js +5 -5
  12. package/package.json +40 -40
  13. package/src/aaveV2/index.ts +226 -226
  14. package/src/aaveV3/index.ts +561 -561
  15. package/src/assets/index.ts +60 -60
  16. package/src/chickenBonds/index.ts +123 -123
  17. package/src/compoundV2/index.ts +219 -219
  18. package/src/compoundV3/index.ts +275 -275
  19. package/src/config/contracts.js +673 -673
  20. package/src/constants/index.ts +3 -3
  21. package/src/contracts.ts +100 -100
  22. package/src/curveUsd/index.ts +228 -228
  23. package/src/exchange/index.ts +17 -17
  24. package/src/helpers/aaveHelpers/index.ts +134 -134
  25. package/src/helpers/chickenBondsHelpers/index.ts +23 -23
  26. package/src/helpers/compoundHelpers/index.ts +181 -181
  27. package/src/helpers/curveUsdHelpers/index.ts +32 -33
  28. package/src/helpers/index.ts +5 -5
  29. package/src/helpers/makerHelpers/index.ts +94 -94
  30. package/src/helpers/sparkHelpers/index.ts +106 -106
  31. package/src/index.ts +40 -40
  32. package/src/liquity/index.ts +116 -116
  33. package/src/maker/index.ts +101 -101
  34. package/src/markets/aave/index.ts +80 -80
  35. package/src/markets/aave/marketAssets.ts +32 -32
  36. package/src/markets/compound/index.ts +141 -141
  37. package/src/markets/compound/marketsAssets.ts +46 -46
  38. package/src/markets/curveUsd/index.ts +69 -69
  39. package/src/markets/index.ts +3 -3
  40. package/src/markets/spark/index.ts +29 -29
  41. package/src/markets/spark/marketAssets.ts +9 -9
  42. package/src/moneymarket/moneymarketCommonService.ts +75 -75
  43. package/src/morpho/markets.ts +39 -39
  44. package/src/morphoAaveV2/index.ts +255 -255
  45. package/src/morphoAaveV3/index.ts +619 -619
  46. package/src/multicall/index.ts +22 -22
  47. package/src/services/dsrService.ts +15 -15
  48. package/src/services/priceService.ts +21 -21
  49. package/src/services/utils.ts +34 -34
  50. package/src/spark/index.ts +422 -421
  51. package/src/staking/staking.ts +167 -167
  52. package/src/types/aave.ts +256 -256
  53. package/src/types/chickenBonds.ts +45 -45
  54. package/src/types/common.ts +83 -83
  55. package/src/types/compound.ts +128 -128
  56. package/src/types/curveUsd.ts +112 -113
  57. package/src/types/index.ts +6 -6
  58. package/src/types/liquity.ts +30 -30
  59. package/src/types/maker.ts +50 -50
  60. package/src/types/spark.ts +106 -106
  61. package/yarn-error.log +0 -64
@@ -1,107 +1,107 @@
1
- import Dec from 'decimal.js';
2
- import { calcLeverageLiqPrice, getAssetsTotal, isLeveragedPos } from '../../moneymarket';
3
- import {
4
- SparkAggregatedPositionData,
5
- SparkAssetsData, SparkHelperCommon, SparkUsedAssets,
6
- } from '../../types';
7
- import { calculateNetApy } from '../../staking';
8
- import { wethToEth } from '../../services/utils';
9
-
10
- export const sparkIsInIsolationMode = ({ usedAssets, assetsData }: { usedAssets: SparkUsedAssets, assetsData: SparkAssetsData }) => Object.values(usedAssets).some(({ symbol, collateral }) => collateral && assetsData[symbol].isIsolated);
11
-
12
- export const sparkGetCollSuppliedAssets = ({ usedAssets }: { usedAssets: SparkUsedAssets }) => Object.values(usedAssets).filter(({ isSupplied, collateral }) => isSupplied && collateral);
13
-
14
- export const sparkGetSuppliableAssets = ({
15
- usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest
16
- }: SparkHelperCommon) => {
17
- const data = {
18
- usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest,
19
- };
20
-
21
- const collAccountAssets = sparkGetCollSuppliedAssets(data);
22
- const marketAssets = Object.values(assetsData);
23
-
24
- if (sparkIsInIsolationMode(data)) {
25
- const collAsset = collAccountAssets[0].symbol;
26
- return marketAssets.filter(d => d.canBeSupplied).map(({ symbol }) => ({ symbol, canBeCollateral: symbol === collAsset }));
27
- }
28
-
29
- return marketAssets.filter(d => d.canBeSupplied).map(({ symbol, isIsolated }) => ({ symbol, canBeCollateral: !isIsolated }));
30
- };
31
-
32
- export const sparkGetSuppliableAsCollAssets = ({
33
- usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest
34
- }: SparkHelperCommon) => sparkGetSuppliableAssets({
35
- usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest,
36
- }).filter(({ canBeCollateral }) => canBeCollateral);
37
-
38
- export const sparkGetEmodeMutableProps = ({
39
- eModeCategory,
40
- assetsData,
41
- }: SparkHelperCommon,
42
- _asset: string) => {
43
- const asset = wethToEth(_asset);
44
-
45
- const assetData = assetsData[asset];
46
- if (
47
- eModeCategory === 0
48
- || assetData.eModeCategory !== eModeCategory
49
- || new Dec(assetData?.eModeCategoryData?.collateralFactor || 0).eq(0)
50
- ) {
51
- const { liquidationRatio, collateralFactor } = assetData;
52
- return ({ liquidationRatio, collateralFactor });
53
- }
54
- const { liquidationRatio, collateralFactor } = assetData.eModeCategoryData;
55
- return ({ liquidationRatio, collateralFactor });
56
- };
57
-
58
- export const sparkGetAggregatedPositionData = ({
59
- usedAssets,
60
- eModeCategory,
61
- eModeCategories,
62
- assetsData,
63
- selectedMarket,
64
- network,
65
- ...rest
66
- }: SparkHelperCommon): SparkAggregatedPositionData => {
67
- const data = {
68
- usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest,
69
- };
70
- const payload = {} as SparkAggregatedPositionData;
71
- payload.suppliedUsd = getAssetsTotal(usedAssets, ({ isSupplied }: { isSupplied: boolean }) => isSupplied, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
72
- payload.suppliedCollateralUsd = getAssetsTotal(usedAssets, ({ isSupplied, collateral }: { isSupplied: boolean, collateral: boolean }) => isSupplied && collateral, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
73
- payload.borrowedUsd = getAssetsTotal(usedAssets, ({ isBorrowed }: { isBorrowed: boolean }) => isBorrowed, ({ borrowedUsd }: { borrowedUsd: string }) => borrowedUsd);
74
- payload.borrowLimitUsd = getAssetsTotal(
75
- usedAssets,
76
- ({ isSupplied, collateral }: { isSupplied: boolean, collateral: boolean }) => isSupplied && collateral,
77
- ({ symbol, suppliedUsd }: { symbol: string, suppliedUsd: string }) => new Dec(suppliedUsd).mul(sparkGetEmodeMutableProps(data, symbol).collateralFactor),
78
- );
79
- payload.liquidationLimitUsd = getAssetsTotal(
80
- usedAssets,
81
- ({ isSupplied, collateral }: { isSupplied: boolean, collateral: boolean }) => isSupplied && collateral,
82
- ({ symbol, suppliedUsd }: { symbol: string, suppliedUsd: string }) => new Dec(suppliedUsd).mul(sparkGetEmodeMutableProps(data, symbol).liquidationRatio),
83
- );
84
- const leftToBorrowUsd = new Dec(payload.borrowLimitUsd).sub(payload.borrowedUsd);
85
- payload.leftToBorrowUsd = leftToBorrowUsd.lte('0') ? '0' : leftToBorrowUsd.toString();
86
- payload.ratio = +payload.suppliedUsd ? new Dec(payload.borrowLimitUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
87
- payload.collRatio = +payload.suppliedUsd ? new Dec(payload.suppliedCollateralUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
88
- const { netApy, incentiveUsd, totalInterestUsd } = calculateNetApy(usedAssets, assetsData);
89
- payload.netApy = netApy;
90
- payload.incentiveUsd = incentiveUsd;
91
- payload.totalInterestUsd = totalInterestUsd;
92
- payload.liqRatio = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).toString();
93
- payload.liqPercent = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).mul(100).toString();
94
- const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
95
- payload.leveragedType = leveragedType;
96
- if (leveragedType !== '') {
97
- payload.leveragedAsset = leveragedAsset;
98
- let assetPrice = data.assetsData[leveragedAsset].price; // TODO sparkPrice or price??
99
- if (leveragedType === 'lsd-leverage') {
100
- // Treat ETH like a stablecoin in a long stETH position
101
- payload.leveragedLsdAssetRatio = new Dec(assetsData[leveragedAsset].price).div(assetsData.ETH.price).toDP(18).toString();
102
- assetPrice = new Dec(assetPrice).div(assetsData.ETH.price).toString();
103
- }
104
- payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
105
- }
106
- return payload;
1
+ import Dec from 'decimal.js';
2
+ import { calcLeverageLiqPrice, getAssetsTotal, isLeveragedPos } from '../../moneymarket';
3
+ import {
4
+ SparkAggregatedPositionData,
5
+ SparkAssetsData, SparkHelperCommon, SparkUsedAssets,
6
+ } from '../../types';
7
+ import { calculateNetApy } from '../../staking';
8
+ import { wethToEth } from '../../services/utils';
9
+
10
+ export const sparkIsInIsolationMode = ({ usedAssets, assetsData }: { usedAssets: SparkUsedAssets, assetsData: SparkAssetsData }) => Object.values(usedAssets).some(({ symbol, collateral }) => collateral && assetsData[symbol].isIsolated);
11
+
12
+ export const sparkGetCollSuppliedAssets = ({ usedAssets }: { usedAssets: SparkUsedAssets }) => Object.values(usedAssets).filter(({ isSupplied, collateral }) => isSupplied && collateral);
13
+
14
+ export const sparkGetSuppliableAssets = ({
15
+ usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest
16
+ }: SparkHelperCommon) => {
17
+ const data = {
18
+ usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest,
19
+ };
20
+
21
+ const collAccountAssets = sparkGetCollSuppliedAssets(data);
22
+ const marketAssets = Object.values(assetsData);
23
+
24
+ if (sparkIsInIsolationMode(data)) {
25
+ const collAsset = collAccountAssets[0].symbol;
26
+ return marketAssets.filter(d => d.canBeSupplied).map(({ symbol }) => ({ symbol, canBeCollateral: symbol === collAsset }));
27
+ }
28
+
29
+ return marketAssets.filter(d => d.canBeSupplied).map(({ symbol, isIsolated }) => ({ symbol, canBeCollateral: !isIsolated }));
30
+ };
31
+
32
+ export const sparkGetSuppliableAsCollAssets = ({
33
+ usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest
34
+ }: SparkHelperCommon) => sparkGetSuppliableAssets({
35
+ usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest,
36
+ }).filter(({ canBeCollateral }) => canBeCollateral);
37
+
38
+ export const sparkGetEmodeMutableProps = ({
39
+ eModeCategory,
40
+ assetsData,
41
+ }: SparkHelperCommon,
42
+ _asset: string) => {
43
+ const asset = wethToEth(_asset);
44
+
45
+ const assetData = assetsData[asset];
46
+ if (
47
+ eModeCategory === 0
48
+ || assetData.eModeCategory !== eModeCategory
49
+ || new Dec(assetData?.eModeCategoryData?.collateralFactor || 0).eq(0)
50
+ ) {
51
+ const { liquidationRatio, collateralFactor } = assetData;
52
+ return ({ liquidationRatio, collateralFactor });
53
+ }
54
+ const { liquidationRatio, collateralFactor } = assetData.eModeCategoryData;
55
+ return ({ liquidationRatio, collateralFactor });
56
+ };
57
+
58
+ export const sparkGetAggregatedPositionData = ({
59
+ usedAssets,
60
+ eModeCategory,
61
+ eModeCategories,
62
+ assetsData,
63
+ selectedMarket,
64
+ network,
65
+ ...rest
66
+ }: SparkHelperCommon): SparkAggregatedPositionData => {
67
+ const data = {
68
+ usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest,
69
+ };
70
+ const payload = {} as SparkAggregatedPositionData;
71
+ payload.suppliedUsd = getAssetsTotal(usedAssets, ({ isSupplied }: { isSupplied: boolean }) => isSupplied, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
72
+ payload.suppliedCollateralUsd = getAssetsTotal(usedAssets, ({ isSupplied, collateral }: { isSupplied: boolean, collateral: boolean }) => isSupplied && collateral, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
73
+ payload.borrowedUsd = getAssetsTotal(usedAssets, ({ isBorrowed }: { isBorrowed: boolean }) => isBorrowed, ({ borrowedUsd }: { borrowedUsd: string }) => borrowedUsd);
74
+ payload.borrowLimitUsd = getAssetsTotal(
75
+ usedAssets,
76
+ ({ isSupplied, collateral }: { isSupplied: boolean, collateral: boolean }) => isSupplied && collateral,
77
+ ({ symbol, suppliedUsd }: { symbol: string, suppliedUsd: string }) => new Dec(suppliedUsd).mul(sparkGetEmodeMutableProps(data, symbol).collateralFactor),
78
+ );
79
+ payload.liquidationLimitUsd = getAssetsTotal(
80
+ usedAssets,
81
+ ({ isSupplied, collateral }: { isSupplied: boolean, collateral: boolean }) => isSupplied && collateral,
82
+ ({ symbol, suppliedUsd }: { symbol: string, suppliedUsd: string }) => new Dec(suppliedUsd).mul(sparkGetEmodeMutableProps(data, symbol).liquidationRatio),
83
+ );
84
+ const leftToBorrowUsd = new Dec(payload.borrowLimitUsd).sub(payload.borrowedUsd);
85
+ payload.leftToBorrowUsd = leftToBorrowUsd.lte('0') ? '0' : leftToBorrowUsd.toString();
86
+ payload.ratio = +payload.suppliedUsd ? new Dec(payload.borrowLimitUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
87
+ payload.collRatio = +payload.suppliedUsd ? new Dec(payload.suppliedCollateralUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
88
+ const { netApy, incentiveUsd, totalInterestUsd } = calculateNetApy(usedAssets, assetsData);
89
+ payload.netApy = netApy;
90
+ payload.incentiveUsd = incentiveUsd;
91
+ payload.totalInterestUsd = totalInterestUsd;
92
+ payload.liqRatio = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).toString();
93
+ payload.liqPercent = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).mul(100).toString();
94
+ const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
95
+ payload.leveragedType = leveragedType;
96
+ if (leveragedType !== '') {
97
+ payload.leveragedAsset = leveragedAsset;
98
+ let assetPrice = data.assetsData[leveragedAsset].price; // TODO sparkPrice or price??
99
+ if (leveragedType === 'lsd-leverage') {
100
+ // Treat ETH like a stablecoin in a long stETH position
101
+ payload.leveragedLsdAssetRatio = new Dec(assetsData[leveragedAsset].price).div(assetsData.ETH.price).toDP(18).toString();
102
+ assetPrice = new Dec(assetPrice).div(assetsData.ETH.price).toString();
103
+ }
104
+ payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
105
+ }
106
+ return payload;
107
107
  };
package/src/index.ts CHANGED
@@ -1,40 +1,40 @@
1
- import * as aaveV3 from './aaveV3';
2
- import * as morphoAaveV3 from './morphoAaveV3';
3
- import * as aaveV2 from './aaveV2';
4
- import * as morphoAaveV2 from './morphoAaveV2';
5
- import * as compoundV3 from './compoundV3';
6
- import * as compoundV2 from './compoundV2';
7
- import * as spark from './spark';
8
- import * as curveUsd from './curveUsd';
9
- import * as liquity from './liquity';
10
- import * as maker from './maker';
11
- import * as staking from './staking';
12
- import * as multicall from './multicall';
13
- import * as moneymarket from './moneymarket';
14
- import * as assets from './assets';
15
- import * as markets from './markets';
16
- import * as helpers from './helpers';
17
- import * as chickenBonds from './chickenBonds';
18
- import * as exchange from './exchange';
19
-
20
- export * from './types';
21
-
22
- export {
23
- aaveV2,
24
- aaveV3,
25
- morphoAaveV2,
26
- morphoAaveV3,
27
- compoundV2,
28
- compoundV3,
29
- spark,
30
- curveUsd,
31
- liquity,
32
- maker,
33
- chickenBonds,
34
- exchange,
35
- staking,
36
- multicall,
37
- moneymarket,
38
- markets,
39
- helpers,
40
- };
1
+ import * as aaveV3 from './aaveV3';
2
+ import * as morphoAaveV3 from './morphoAaveV3';
3
+ import * as aaveV2 from './aaveV2';
4
+ import * as morphoAaveV2 from './morphoAaveV2';
5
+ import * as compoundV3 from './compoundV3';
6
+ import * as compoundV2 from './compoundV2';
7
+ import * as spark from './spark';
8
+ import * as curveUsd from './curveUsd';
9
+ import * as liquity from './liquity';
10
+ import * as maker from './maker';
11
+ import * as staking from './staking';
12
+ import * as multicall from './multicall';
13
+ import * as moneymarket from './moneymarket';
14
+ import * as assets from './assets';
15
+ import * as markets from './markets';
16
+ import * as helpers from './helpers';
17
+ import * as chickenBonds from './chickenBonds';
18
+ import * as exchange from './exchange';
19
+
20
+ export * from './types';
21
+
22
+ export {
23
+ aaveV2,
24
+ aaveV3,
25
+ morphoAaveV2,
26
+ morphoAaveV3,
27
+ compoundV2,
28
+ compoundV3,
29
+ spark,
30
+ curveUsd,
31
+ liquity,
32
+ maker,
33
+ chickenBonds,
34
+ exchange,
35
+ staking,
36
+ multicall,
37
+ moneymarket,
38
+ markets,
39
+ helpers,
40
+ };
@@ -1,117 +1,117 @@
1
- import Web3 from 'web3';
2
- import Dec from 'decimal.js';
3
- import { assetAmountInEth, getAssetInfo } from '@defisaver/tokens';
4
- import {
5
- Blockish, EthAddress, NetworkNumber, PositionBalances,
6
- } from '../types/common';
7
- import {
8
- LiquityActivePoolContract, LiquityCollSurplusPoolContract, LiquityPriceFeedContract, LiquityTroveManagerContract, LiquityViewContract,
9
- } from '../contracts';
10
- import { multicall } from '../multicall';
11
- import { LIQUITY_TROVE_STATUS_ENUM, LiquityTroveInfo } from '../types';
12
- import { ZERO_ADDRESS } from '../constants';
13
-
14
- export const LIQUITY_NORMAL_MODE_RATIO = 110; // MCR
15
- export const LIQUITY_RECOVERY_MODE_RATIO = 150; // CCR
16
-
17
- export const getLiquityAccountBalances = async (web3: Web3, network: NetworkNumber, block: Blockish, addressMapping: boolean, address: EthAddress): Promise<PositionBalances> => {
18
- let balances: PositionBalances = {
19
- collateral: {},
20
- debt: {},
21
- };
22
-
23
- if (!address) {
24
- return balances;
25
- }
26
-
27
- const viewContract = LiquityViewContract(web3, network, block);
28
- const troveInfo = await viewContract.methods.getTroveInfo(address).call({}, block);
29
-
30
- balances = {
31
- collateral: {
32
- [addressMapping ? getAssetInfo('ETH', network).address.toLowerCase() : 'ETH']: troveInfo[1],
33
- },
34
- debt: {
35
- [addressMapping ? getAssetInfo('LUSD', network).address.toLowerCase() : 'LUSD']: troveInfo[2],
36
- },
37
- };
38
-
39
- return balances;
40
- };
41
-
42
- const _getDebtInFront = async (viewContract: any, address: string, accumulatedSum = '0', iterations = 2000) => viewContract.methods.getDebtInFront(address, accumulatedSum, iterations).call();
43
-
44
- export const getDebtInFront = async (viewContract: any, address: string, accumulatedSum = '0', iterations = 2000): Promise<string> => {
45
- const { debt, next } = await _getDebtInFront(viewContract, address, accumulatedSum, iterations);
46
- if (next === ZERO_ADDRESS) return assetAmountInEth(debt, 'LUSD');
47
- return getDebtInFront(viewContract, next, debt, iterations);
48
- };
49
-
50
- export const getLiquityTroveInfo = async (web3: Web3, network: NetworkNumber, address: string): Promise<LiquityTroveInfo> => {
51
- const viewContract = LiquityViewContract(web3, network);
52
- const collSurplusPoolContract = LiquityCollSurplusPoolContract(web3, network);
53
- const troveManagerContract = LiquityTroveManagerContract(web3, network);
54
- const priceFeedContract = LiquityPriceFeedContract(web3, network);
55
- const activePoolContract = LiquityActivePoolContract(web3, network);
56
-
57
- const multicallData = [
58
- {
59
- target: viewContract.options.address,
60
- abiItem: viewContract.options.jsonInterface.find(({ name }) => name === 'getTroveInfo'),
61
- params: [address],
62
- },
63
- {
64
- target: collSurplusPoolContract.options.address,
65
- abiItem: collSurplusPoolContract.options.jsonInterface.find(({ name }) => name === 'getCollateral'),
66
- params: [address],
67
- },
68
- {
69
- target: troveManagerContract.options.address,
70
- abiItem: troveManagerContract.options.jsonInterface.find(({ name }) => name === 'getBorrowingRateWithDecay'),
71
- params: [],
72
- },
73
- {
74
- target: priceFeedContract.options.address,
75
- abiItem: priceFeedContract.options.jsonInterface.find(({ name }) => name === 'fetchPrice'),
76
- params: [],
77
- },
78
- {
79
- target: activePoolContract.options.address,
80
- abiItem: activePoolContract.options.jsonInterface.find(({ name }) => name === 'getETH'),
81
- params: [],
82
- },
83
- {
84
- target: activePoolContract.options.address,
85
- abiItem: activePoolContract.options.jsonInterface.find(({ name }) => name === 'getLUSDDebt'),
86
- params: [],
87
- },
88
- ];
89
-
90
- const [multiRes, debtInFront] = await Promise.all([
91
- multicall(multicallData, web3, network),
92
- getDebtInFront(viewContract, address),
93
- ]);
94
-
95
- const recoveryMode = multiRes[0][6];
96
- const totalETH = multiRes[4][0];
97
- const totalLUSD = multiRes[5][0];
98
-
99
- const payload = {
100
- troveStatus: LIQUITY_TROVE_STATUS_ENUM[+multiRes[0][0].toString()],
101
- collateral: assetAmountInEth(multiRes[0][1]),
102
- debtInAsset: assetAmountInEth(multiRes[0][2]),
103
- TCRatio: assetAmountInEth(multiRes[0][4]),
104
- recoveryMode,
105
- claimableCollateral: assetAmountInEth(multiRes[1][0]),
106
- borrowingRateWithDecay: assetAmountInEth(multiRes[2][0]),
107
- assetPrice: assetAmountInEth(multiRes[3][0]),
108
- totalETH,
109
- totalLUSD,
110
- debtInFront,
111
- minCollateralRatio: recoveryMode ? LIQUITY_RECOVERY_MODE_RATIO : LIQUITY_NORMAL_MODE_RATIO,
112
- priceForRecovery: new Dec(recoveryMode ? LIQUITY_RECOVERY_MODE_RATIO : LIQUITY_NORMAL_MODE_RATIO).mul(totalLUSD).div(totalETH).div(100)
113
- .toString(),
114
- };
115
-
116
- return payload;
1
+ import Web3 from 'web3';
2
+ import Dec from 'decimal.js';
3
+ import { assetAmountInEth, getAssetInfo } from '@defisaver/tokens';
4
+ import {
5
+ Blockish, EthAddress, NetworkNumber, PositionBalances,
6
+ } from '../types/common';
7
+ import {
8
+ LiquityActivePoolContract, LiquityCollSurplusPoolContract, LiquityPriceFeedContract, LiquityTroveManagerContract, LiquityViewContract,
9
+ } from '../contracts';
10
+ import { multicall } from '../multicall';
11
+ import { LIQUITY_TROVE_STATUS_ENUM, LiquityTroveInfo } from '../types';
12
+ import { ZERO_ADDRESS } from '../constants';
13
+
14
+ export const LIQUITY_NORMAL_MODE_RATIO = 110; // MCR
15
+ export const LIQUITY_RECOVERY_MODE_RATIO = 150; // CCR
16
+
17
+ export const getLiquityAccountBalances = async (web3: Web3, network: NetworkNumber, block: Blockish, addressMapping: boolean, address: EthAddress): Promise<PositionBalances> => {
18
+ let balances: PositionBalances = {
19
+ collateral: {},
20
+ debt: {},
21
+ };
22
+
23
+ if (!address) {
24
+ return balances;
25
+ }
26
+
27
+ const viewContract = LiquityViewContract(web3, network, block);
28
+ const troveInfo = await viewContract.methods.getTroveInfo(address).call({}, block);
29
+
30
+ balances = {
31
+ collateral: {
32
+ [addressMapping ? getAssetInfo('ETH', network).address.toLowerCase() : 'ETH']: troveInfo[1],
33
+ },
34
+ debt: {
35
+ [addressMapping ? getAssetInfo('LUSD', network).address.toLowerCase() : 'LUSD']: troveInfo[2],
36
+ },
37
+ };
38
+
39
+ return balances;
40
+ };
41
+
42
+ const _getDebtInFront = async (viewContract: any, address: string, accumulatedSum = '0', iterations = 2000) => viewContract.methods.getDebtInFront(address, accumulatedSum, iterations).call();
43
+
44
+ export const getDebtInFront = async (viewContract: any, address: string, accumulatedSum = '0', iterations = 2000): Promise<string> => {
45
+ const { debt, next } = await _getDebtInFront(viewContract, address, accumulatedSum, iterations);
46
+ if (next === ZERO_ADDRESS) return assetAmountInEth(debt, 'LUSD');
47
+ return getDebtInFront(viewContract, next, debt, iterations);
48
+ };
49
+
50
+ export const getLiquityTroveInfo = async (web3: Web3, network: NetworkNumber, address: string): Promise<LiquityTroveInfo> => {
51
+ const viewContract = LiquityViewContract(web3, network);
52
+ const collSurplusPoolContract = LiquityCollSurplusPoolContract(web3, network);
53
+ const troveManagerContract = LiquityTroveManagerContract(web3, network);
54
+ const priceFeedContract = LiquityPriceFeedContract(web3, network);
55
+ const activePoolContract = LiquityActivePoolContract(web3, network);
56
+
57
+ const multicallData = [
58
+ {
59
+ target: viewContract.options.address,
60
+ abiItem: viewContract.options.jsonInterface.find(({ name }) => name === 'getTroveInfo'),
61
+ params: [address],
62
+ },
63
+ {
64
+ target: collSurplusPoolContract.options.address,
65
+ abiItem: collSurplusPoolContract.options.jsonInterface.find(({ name }) => name === 'getCollateral'),
66
+ params: [address],
67
+ },
68
+ {
69
+ target: troveManagerContract.options.address,
70
+ abiItem: troveManagerContract.options.jsonInterface.find(({ name }) => name === 'getBorrowingRateWithDecay'),
71
+ params: [],
72
+ },
73
+ {
74
+ target: priceFeedContract.options.address,
75
+ abiItem: priceFeedContract.options.jsonInterface.find(({ name }) => name === 'fetchPrice'),
76
+ params: [],
77
+ },
78
+ {
79
+ target: activePoolContract.options.address,
80
+ abiItem: activePoolContract.options.jsonInterface.find(({ name }) => name === 'getETH'),
81
+ params: [],
82
+ },
83
+ {
84
+ target: activePoolContract.options.address,
85
+ abiItem: activePoolContract.options.jsonInterface.find(({ name }) => name === 'getLUSDDebt'),
86
+ params: [],
87
+ },
88
+ ];
89
+
90
+ const [multiRes, debtInFront] = await Promise.all([
91
+ multicall(multicallData, web3, network),
92
+ getDebtInFront(viewContract, address),
93
+ ]);
94
+
95
+ const recoveryMode = multiRes[0][6];
96
+ const totalETH = multiRes[4][0];
97
+ const totalLUSD = multiRes[5][0];
98
+
99
+ const payload = {
100
+ troveStatus: LIQUITY_TROVE_STATUS_ENUM[+multiRes[0][0].toString()],
101
+ collateral: assetAmountInEth(multiRes[0][1]),
102
+ debtInAsset: assetAmountInEth(multiRes[0][2]),
103
+ TCRatio: assetAmountInEth(multiRes[0][4]),
104
+ recoveryMode,
105
+ claimableCollateral: assetAmountInEth(multiRes[1][0]),
106
+ borrowingRateWithDecay: assetAmountInEth(multiRes[2][0]),
107
+ assetPrice: assetAmountInEth(multiRes[3][0]),
108
+ totalETH,
109
+ totalLUSD,
110
+ debtInFront,
111
+ minCollateralRatio: recoveryMode ? LIQUITY_RECOVERY_MODE_RATIO : LIQUITY_NORMAL_MODE_RATIO,
112
+ priceForRecovery: new Dec(recoveryMode ? LIQUITY_RECOVERY_MODE_RATIO : LIQUITY_NORMAL_MODE_RATIO).mul(totalLUSD).div(totalETH).div(100)
113
+ .toString(),
114
+ };
115
+
116
+ return payload;
117
117
  };