@defisaver/positions-sdk 1.0.3 → 1.0.4

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 (108) hide show
  1. package/.mocharc.json +4 -4
  2. package/.nvmrc +1 -1
  3. package/README.md +69 -69
  4. package/cjs/aaveV3/index.js +7 -7
  5. package/cjs/curveUsd/index.js +8 -1
  6. package/cjs/fluid/index.d.ts +2 -0
  7. package/cjs/helpers/aaveHelpers/index.js +6 -0
  8. package/cjs/helpers/compoundHelpers/index.js +2 -0
  9. package/cjs/helpers/eulerHelpers/index.js +2 -0
  10. package/cjs/helpers/fluidHelpers/index.js +2 -0
  11. package/cjs/helpers/morphoBlueHelpers/index.js +68 -66
  12. package/cjs/helpers/sparkHelpers/index.js +2 -0
  13. package/cjs/staking/staking.d.ts +2 -1
  14. package/cjs/staking/staking.js +3 -7
  15. package/cjs/types/aave.d.ts +4 -0
  16. package/cjs/types/compound.d.ts +2 -0
  17. package/cjs/types/curveUsd.d.ts +1 -0
  18. package/cjs/types/euler.d.ts +2 -0
  19. package/cjs/types/fluid.d.ts +2 -0
  20. package/cjs/types/morphoBlue.d.ts +2 -0
  21. package/cjs/types/spark.d.ts +2 -0
  22. package/esm/aaveV3/index.js +7 -7
  23. package/esm/curveUsd/index.js +10 -3
  24. package/esm/fluid/index.d.ts +2 -0
  25. package/esm/helpers/aaveHelpers/index.js +6 -0
  26. package/esm/helpers/compoundHelpers/index.js +2 -0
  27. package/esm/helpers/eulerHelpers/index.js +2 -0
  28. package/esm/helpers/fluidHelpers/index.js +2 -0
  29. package/esm/helpers/morphoBlueHelpers/index.js +68 -66
  30. package/esm/helpers/sparkHelpers/index.js +2 -0
  31. package/esm/staking/staking.d.ts +2 -1
  32. package/esm/staking/staking.js +3 -6
  33. package/esm/types/aave.d.ts +4 -0
  34. package/esm/types/compound.d.ts +2 -0
  35. package/esm/types/curveUsd.d.ts +1 -0
  36. package/esm/types/euler.d.ts +2 -0
  37. package/esm/types/fluid.d.ts +2 -0
  38. package/esm/types/morphoBlue.d.ts +2 -0
  39. package/esm/types/spark.d.ts +2 -0
  40. package/package.json +54 -52
  41. package/src/aaveV2/index.ts +227 -227
  42. package/src/aaveV3/index.ts +624 -625
  43. package/src/assets/index.ts +60 -60
  44. package/src/chickenBonds/index.ts +123 -123
  45. package/src/compoundV2/index.ts +220 -220
  46. package/src/compoundV3/index.ts +291 -291
  47. package/src/config/contracts.js +1147 -1147
  48. package/src/constants/index.ts +6 -6
  49. package/src/contracts.ts +134 -134
  50. package/src/curveUsd/index.ts +239 -230
  51. package/src/eulerV2/index.ts +303 -303
  52. package/src/exchange/index.ts +17 -17
  53. package/src/fluid/index.ts +354 -354
  54. package/src/helpers/aaveHelpers/index.ts +204 -198
  55. package/src/helpers/chickenBondsHelpers/index.ts +23 -23
  56. package/src/helpers/compoundHelpers/index.ts +248 -246
  57. package/src/helpers/curveUsdHelpers/index.ts +40 -40
  58. package/src/helpers/eulerHelpers/index.ts +234 -232
  59. package/src/helpers/fluidHelpers/index.ts +56 -53
  60. package/src/helpers/index.ts +11 -11
  61. package/src/helpers/liquityV2Helpers/index.ts +80 -80
  62. package/src/helpers/llamaLendHelpers/index.ts +53 -53
  63. package/src/helpers/makerHelpers/index.ts +94 -94
  64. package/src/helpers/morphoBlueHelpers/index.ts +367 -365
  65. package/src/helpers/sparkHelpers/index.ts +152 -150
  66. package/src/index.ts +52 -52
  67. package/src/liquity/index.ts +116 -116
  68. package/src/liquityV2/index.ts +295 -295
  69. package/src/llamaLend/index.ts +275 -275
  70. package/src/maker/index.ts +117 -117
  71. package/src/markets/aave/index.ts +152 -152
  72. package/src/markets/aave/marketAssets.ts +44 -44
  73. package/src/markets/compound/index.ts +213 -213
  74. package/src/markets/compound/marketsAssets.ts +82 -82
  75. package/src/markets/curveUsd/index.ts +69 -69
  76. package/src/markets/euler/index.ts +26 -26
  77. package/src/markets/fluid/index.ts +2012 -2012
  78. package/src/markets/index.ts +27 -27
  79. package/src/markets/liquityV2/index.ts +54 -54
  80. package/src/markets/llamaLend/contractAddresses.ts +141 -141
  81. package/src/markets/llamaLend/index.ts +235 -235
  82. package/src/markets/morphoBlue/index.ts +895 -895
  83. package/src/markets/spark/index.ts +29 -29
  84. package/src/markets/spark/marketAssets.ts +10 -10
  85. package/src/moneymarket/moneymarketCommonService.ts +80 -80
  86. package/src/morphoAaveV2/index.ts +256 -256
  87. package/src/morphoAaveV3/index.ts +630 -630
  88. package/src/morphoBlue/index.ts +202 -202
  89. package/src/multicall/index.ts +33 -33
  90. package/src/services/priceService.ts +91 -91
  91. package/src/services/utils.ts +59 -59
  92. package/src/setup.ts +8 -8
  93. package/src/spark/index.ts +460 -460
  94. package/src/staking/staking.ts +217 -220
  95. package/src/types/aave.ts +275 -271
  96. package/src/types/chickenBonds.ts +45 -45
  97. package/src/types/common.ts +84 -84
  98. package/src/types/compound.ts +133 -131
  99. package/src/types/curveUsd.ts +119 -118
  100. package/src/types/euler.ts +173 -171
  101. package/src/types/fluid.ts +268 -266
  102. package/src/types/index.ts +11 -11
  103. package/src/types/liquity.ts +30 -30
  104. package/src/types/liquityV2.ts +119 -119
  105. package/src/types/llamaLend.ts +155 -155
  106. package/src/types/maker.ts +50 -50
  107. package/src/types/morphoBlue.ts +194 -192
  108. package/src/types/spark.ts +133 -131
package/.mocharc.json CHANGED
@@ -1,4 +1,4 @@
1
- {
2
- "require": "ts-node/register",
3
- "extension": ["ts"]
4
- }
1
+ {
2
+ "require": "ts-node/register",
3
+ "extension": ["ts"]
4
+ }
package/.nvmrc CHANGED
@@ -1 +1 @@
1
- v20.17.0
1
+ v20.17.0
package/README.md CHANGED
@@ -1,69 +1,69 @@
1
- # DeFi Saver Positions SDK
2
-
3
- Supported protocols:
4
- - [Maker](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/maker)
5
- - [Spark](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/spark)
6
- - [CrvUSD](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/curveUsd)
7
- - [Aave V2](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/aaveV2)
8
- - [Aave V3](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/aaveV3)
9
- - [Morpho Aave V2](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/morphoAaveV2)
10
- - [Morpho Aave V3](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/morphoAaveV3)
11
- - [Compound V2](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/compoundV2)
12
- - [Compound V3](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/compoundV3)
13
- - [Liquity](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/liquity)
14
- - [Chicken Bonds](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/chickenBonds)
15
-
16
- ## Setup
17
- Supported Node version is v10.
18
-
19
- - run `npm install` (first time)
20
- - run `npm run build`
21
-
22
- `build` command will generate contracts and build ejs and esm folders
23
-
24
- ## How to use
25
- [All available imports](https://github.com/defisaver/defisaver-positions-sdk/blob/main/src/index.ts)
26
-
27
- This is a Compound V3 example, and every other protocol is similar
28
- ```js
29
- import Web3 from 'web3';
30
- import { compoundV3 } from '@defisaver/positions-sdk';
31
-
32
-
33
- // every protocol has market data and user data getters
34
- const {
35
- getCompoundV3MarketsData,
36
- getCompoundV3AccountData,
37
- } = compoundV3;
38
-
39
- const provider = 'Your RPC provider';
40
- const web3 = new Web3(provider);
41
-
42
- const user = '0x123...';
43
-
44
- const { assetsData } = await getCompoundV3MarketsData(
45
- web3, // rpc for the network you are using (note: can be tenderly or any other testnet rpc)
46
- 1, // network
47
- selectedMarket, // market object like in /src/markets/compound/index.ts
48
- web3, // this must be mainnet rpc - used for getting prices onchain and calculating apys
49
- );
50
-
51
- const userData = await getCompoundV3AccountData(
52
- web3,
53
- 1, // network
54
- userAddress, // EOA or DSProxy
55
- '', // proxy address of the user, or just empty string if checking for EOA
56
- {
57
- selectedMarket, // market object as in /src/markets/compound/index.ts
58
- assetsData,
59
- }
60
- );
61
- ```
62
-
63
- More examples found [here](https://github.com/defisaver/defisaver-positions-sdk/tree/main/tests)
64
-
65
- ## Testing
66
-
67
- `npm run test` - Run all tests
68
-
69
- `npm run test-single --name=your_test_name` - Run single test for specified name e.g. for MyTest.js test name is MyTest
1
+ # DeFi Saver Positions SDK
2
+
3
+ Supported protocols:
4
+ - [Maker](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/maker)
5
+ - [Spark](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/spark)
6
+ - [CrvUSD](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/curveUsd)
7
+ - [Aave V2](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/aaveV2)
8
+ - [Aave V3](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/aaveV3)
9
+ - [Morpho Aave V2](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/morphoAaveV2)
10
+ - [Morpho Aave V3](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/morphoAaveV3)
11
+ - [Compound V2](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/compoundV2)
12
+ - [Compound V3](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/compoundV3)
13
+ - [Liquity](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/liquity)
14
+ - [Chicken Bonds](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/chickenBonds)
15
+
16
+ ## Setup
17
+ Supported Node version is v10.
18
+
19
+ - run `npm install` (first time)
20
+ - run `npm run build`
21
+
22
+ `build` command will generate contracts and build ejs and esm folders
23
+
24
+ ## How to use
25
+ [All available imports](https://github.com/defisaver/defisaver-positions-sdk/blob/main/src/index.ts)
26
+
27
+ This is a Compound V3 example, and every other protocol is similar
28
+ ```js
29
+ import Web3 from 'web3';
30
+ import { compoundV3 } from '@defisaver/positions-sdk';
31
+
32
+
33
+ // every protocol has market data and user data getters
34
+ const {
35
+ getCompoundV3MarketsData,
36
+ getCompoundV3AccountData,
37
+ } = compoundV3;
38
+
39
+ const provider = 'Your RPC provider';
40
+ const web3 = new Web3(provider);
41
+
42
+ const user = '0x123...';
43
+
44
+ const { assetsData } = await getCompoundV3MarketsData(
45
+ web3, // rpc for the network you are using (note: can be tenderly or any other testnet rpc)
46
+ 1, // network
47
+ selectedMarket, // market object like in /src/markets/compound/index.ts
48
+ web3, // this must be mainnet rpc - used for getting prices onchain and calculating apys
49
+ );
50
+
51
+ const userData = await getCompoundV3AccountData(
52
+ web3,
53
+ 1, // network
54
+ userAddress, // EOA or DSProxy
55
+ '', // proxy address of the user, or just empty string if checking for EOA
56
+ {
57
+ selectedMarket, // market object as in /src/markets/compound/index.ts
58
+ assetsData,
59
+ }
60
+ );
61
+ ```
62
+
63
+ More examples found [here](https://github.com/defisaver/defisaver-positions-sdk/tree/main/tests)
64
+
65
+ ## Testing
66
+
67
+ `npm run test` - Run all tests
68
+
69
+ `npm run test-single --name=your_test_name` - Run single test for specified name e.g. for MyTest.js test name is MyTest
@@ -13,17 +13,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.getAaveV3FullPositionData = exports.getAaveV3AccountData = exports.getAaveV3AccountBalances = exports.EMPTY_AAVE_DATA = exports.getAaveV3MarketData = exports.aaveV3EmodeCategoriesMapping = exports.aaveV3CalculateDiscountRate = exports.test = void 0;
16
- const decimal_js_1 = __importDefault(require("decimal.js"));
17
16
  const tokens_1 = require("@defisaver/tokens");
18
- const contracts_1 = require("../contracts");
19
- const utils_1 = require("../services/utils");
20
- const common_1 = require("../types/common");
21
- const staking_1 = require("../staking");
22
- const multicall_1 = require("../multicall");
17
+ const decimal_js_1 = __importDefault(require("decimal.js"));
23
18
  const assets_1 = require("../assets");
24
- const moneymarket_1 = require("../moneymarket");
19
+ const contracts_1 = require("../contracts");
25
20
  const aaveHelpers_1 = require("../helpers/aaveHelpers");
26
21
  const aave_1 = require("../markets/aave");
22
+ const moneymarket_1 = require("../moneymarket");
23
+ const multicall_1 = require("../multicall");
24
+ const utils_1 = require("../services/utils");
25
+ const staking_1 = require("../staking");
26
+ const common_1 = require("../types/common");
27
27
  const test = (web3, network) => {
28
28
  const contract = (0, contracts_1.AaveV3ViewContract)(web3, 1);
29
29
  return contract.methods.AAVE_REFERRAL_CODE().call();
@@ -79,6 +79,11 @@ const getCurveUsdGlobalData = (web3, network, selectedMarket) => __awaiter(void
79
79
  abiItem: contract.options.jsonInterface.find(({ name }) => name === 'globalData'),
80
80
  params: [selectedMarket.controllerAddress],
81
81
  },
82
+ {
83
+ target: selectedMarket.controllerAddress,
84
+ abiItem: (0, utils_1.getAbiItem)((0, contracts_1.getConfigContractAbi)('crvUSDwstETHController'), 'loan_discount'),
85
+ params: [],
86
+ },
82
87
  ];
83
88
  const multiRes = yield (0, multicall_1.multicall)(multicallData, web3, network);
84
89
  const data = multiRes[2][0];
@@ -96,10 +101,12 @@ const getCurveUsdGlobalData = (web3, network, selectedMarket) => __awaiter(void
96
101
  .toString();
97
102
  const bandsData = yield getAndFormatBands(web3, network, selectedMarket, data.minBand, data.maxBand);
98
103
  const leftToBorrow = new decimal_js_1.default(debtCeiling).minus(totalDebt).toString();
104
+ const loanDiscount = (0, tokens_1.assetAmountInEth)(multiRes[3][0], debtAsset);
99
105
  return Object.assign(Object.assign({}, data), { debtCeiling,
100
106
  totalDebt,
101
107
  ammPrice, oraclePrice: (0, tokens_1.assetAmountInEth)(data.oraclePrice, debtAsset), basePrice: (0, tokens_1.assetAmountInEth)(data.basePrice, debtAsset), minted: (0, tokens_1.assetAmountInEth)(data.minted, debtAsset), redeemed: (0, tokens_1.assetAmountInEth)(data.redeemed, debtAsset), borrowRate,
102
- futureBorrowRate, bands: bandsData, leftToBorrow });
108
+ futureBorrowRate, bands: bandsData, leftToBorrow,
109
+ loanDiscount });
103
110
  });
104
111
  exports.getCurveUsdGlobalData = getCurveUsdGlobalData;
105
112
  const getStatusForUser = (bandRange, activeBand, crvUSDSupplied, collSupplied, healthPercent) => {
@@ -78,6 +78,8 @@ export declare const getUserPositions: (web3: Web3, network: NetworkNumber, user
78
78
  leveragedAsset?: string | undefined;
79
79
  liquidationPrice?: string | undefined;
80
80
  leveragedLsdAssetRatio?: string | undefined;
81
+ minCollRatio?: string | undefined;
82
+ collLiquidationRatio?: string | undefined;
81
83
  owner: string;
82
84
  vaultId: number;
83
85
  usedAssets: FluidUsedAssets;
@@ -134,6 +134,12 @@ const aaveAnyGetAggregatedPositionData = (_a) => {
134
134
  }
135
135
  payload.liquidationPrice = (0, moneymarket_1.calcLeverageLiqPrice)(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
136
136
  }
137
+ payload.minCollRatio = new decimal_js_1.default(payload.suppliedCollateralUsd).div(payload.borrowLimitUsd).mul(100).toString();
138
+ payload.collLiquidationRatio = new decimal_js_1.default(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
139
+ payload.healthRatio = new decimal_js_1.default(payload.suppliedCollateralUsd).mul(payload.liqPercent).div(payload.borrowedUsd).div(100)
140
+ .toString();
141
+ payload.healthLiquidationRatio = new decimal_js_1.default(payload.suppliedCollateralUsd).mul(payload.liqRatio).div(payload.borrowLimitUsd)
142
+ .toString();
137
143
  return payload;
138
144
  };
139
145
  exports.aaveAnyGetAggregatedPositionData = aaveAnyGetAggregatedPositionData;
@@ -135,6 +135,8 @@ const getCompoundV3AggregatedData = (_a) => {
135
135
  }
136
136
  payload.liquidationPrice = (0, moneymarket_1.calcLeverageLiqPrice)(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
137
137
  }
138
+ payload.minCollRatio = new decimal_js_1.default(payload.suppliedCollateralUsd).div(payload.borrowLimitUsd).mul(100).toString();
139
+ payload.collLiquidationRatio = new decimal_js_1.default(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
138
140
  // TO DO: handle strategies
139
141
  /* const subscribedStrategies = rest.compoundStrategies
140
142
  ? compoundV3GetSubscribedStrategies({ selectedMarket, compoundStrategies: rest.compoundStrategies })
@@ -151,6 +151,8 @@ const getEulerV2AggregatedData = (_a) => {
151
151
  }
152
152
  payload.liquidationPrice = (0, moneymarket_1.calcLeverageLiqPrice)(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
153
153
  }
154
+ payload.minCollRatio = new decimal_js_1.default(payload.suppliedCollateralUsd).div(payload.borrowLimitUsd).mul(100).toString();
155
+ payload.collLiquidationRatio = new decimal_js_1.default(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
154
156
  return payload;
155
157
  };
156
158
  exports.getEulerV2AggregatedData = getEulerV2AggregatedData;
@@ -36,6 +36,8 @@ const getFluidAggregatedData = ({ usedAssets, assetsData, marketData, }) => {
36
36
  }
37
37
  payload.liquidationPrice = (0, moneymarket_1.calcLeverageLiqPrice)(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
38
38
  }
39
+ payload.minCollRatio = new decimal_js_1.default(payload.suppliedUsd).div(payload.borrowLimitUsd).mul(100).toString();
40
+ payload.collLiquidationRatio = new decimal_js_1.default(payload.suppliedUsd).div(payload.liquidationLimitUsd).mul(100).toString();
39
41
  return payload;
40
42
  };
41
43
  exports.getFluidAggregatedData = getFluidAggregatedData;
@@ -57,6 +57,8 @@ const getMorphoBlueAggregatedPositionData = ({ usedAssets, assetsData, marketInf
57
57
  }
58
58
  payload.liquidationPrice = (0, moneymarket_1.calcLeverageLiqPrice)(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
59
59
  }
60
+ payload.minCollRatio = new decimal_js_1.default(payload.suppliedCollateralUsd).div(payload.borrowLimitUsd).mul(100).toString();
61
+ payload.collLiquidationRatio = new decimal_js_1.default(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
60
62
  return payload;
61
63
  };
62
64
  exports.getMorphoBlueAggregatedPositionData = getMorphoBlueAggregatedPositionData;
@@ -115,73 +117,73 @@ const getApyAfterValuesEstimation = (selectedMarket, actions, web3, network) =>
115
117
  });
116
118
  exports.getApyAfterValuesEstimation = getApyAfterValuesEstimation;
117
119
  const API_URL = 'https://blue-api.morpho.org/graphql';
118
- const MARKET_QUERY = `
119
- query MarketByUniqueKey($uniqueKey: String!, $chainId: Int!) {
120
- marketByUniqueKey(uniqueKey: $uniqueKey, chainId: $chainId) {
121
- reallocatableLiquidityAssets
122
- targetBorrowUtilization
123
- loanAsset {
124
- address
125
- decimals
126
- priceUsd
127
- }
128
- state {
129
- liquidityAssets
130
- borrowAssets
131
- supplyAssets
132
- }
133
- publicAllocatorSharedLiquidity {
134
- assets
135
- vault {
136
- address
137
- name
138
- }
139
- allocationMarket {
140
- uniqueKey
141
- loanAsset {
142
- address
143
- }
144
- collateralAsset {
145
- address
146
- }
147
- irmAddress
148
- oracle {
149
- address
150
- }
151
- lltv
152
- }
153
- }
154
- loanAsset {
155
- address
156
- }
157
- collateralAsset {
158
- address
159
- }
160
- oracle {
161
- address
162
- }
163
- irmAddress
164
- lltv
165
- }
166
- }
120
+ const MARKET_QUERY = `
121
+ query MarketByUniqueKey($uniqueKey: String!, $chainId: Int!) {
122
+ marketByUniqueKey(uniqueKey: $uniqueKey, chainId: $chainId) {
123
+ reallocatableLiquidityAssets
124
+ targetBorrowUtilization
125
+ loanAsset {
126
+ address
127
+ decimals
128
+ priceUsd
129
+ }
130
+ state {
131
+ liquidityAssets
132
+ borrowAssets
133
+ supplyAssets
134
+ }
135
+ publicAllocatorSharedLiquidity {
136
+ assets
137
+ vault {
138
+ address
139
+ name
140
+ }
141
+ allocationMarket {
142
+ uniqueKey
143
+ loanAsset {
144
+ address
145
+ }
146
+ collateralAsset {
147
+ address
148
+ }
149
+ irmAddress
150
+ oracle {
151
+ address
152
+ }
153
+ lltv
154
+ }
155
+ }
156
+ loanAsset {
157
+ address
158
+ }
159
+ collateralAsset {
160
+ address
161
+ }
162
+ oracle {
163
+ address
164
+ }
165
+ irmAddress
166
+ lltv
167
+ }
168
+ }
167
169
  `;
168
- const REWARDS_QUERY = `
169
- query MarketByUniqueKey($uniqueKey: String!, $chainId: Int!) {
170
- marketByUniqueKey(uniqueKey: $uniqueKey, chainId: $chainId) {
171
- uniqueKey
172
- state {
173
- rewards {
174
- amountPerSuppliedToken
175
- supplyApr
176
- amountPerBorrowedToken
177
- borrowApr
178
- asset {
179
- address
180
- }
181
- }
182
- }
183
- }
184
- }
170
+ const REWARDS_QUERY = `
171
+ query MarketByUniqueKey($uniqueKey: String!, $chainId: Int!) {
172
+ marketByUniqueKey(uniqueKey: $uniqueKey, chainId: $chainId) {
173
+ uniqueKey
174
+ state {
175
+ rewards {
176
+ amountPerSuppliedToken
177
+ supplyApr
178
+ amountPerBorrowedToken
179
+ borrowApr
180
+ asset {
181
+ address
182
+ }
183
+ }
184
+ }
185
+ }
186
+ }
185
187
  `;
186
188
  /**
187
189
  * Get reallocatable liquidity to a given market and target borrow utilization
@@ -98,6 +98,8 @@ const sparkGetAggregatedPositionData = (_a) => {
98
98
  }
99
99
  payload.liquidationPrice = (0, moneymarket_1.calcLeverageLiqPrice)(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
100
100
  }
101
+ payload.minCollRatio = new decimal_js_1.default(payload.suppliedCollateralUsd).div(payload.borrowLimitUsd).mul(100).toString();
102
+ payload.collLiquidationRatio = new decimal_js_1.default(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
101
103
  return payload;
102
104
  };
103
105
  exports.sparkGetAggregatedPositionData = sparkGetAggregatedPositionData;
@@ -1,7 +1,8 @@
1
1
  import Web3 from 'web3';
2
+ import memoize from 'memoizee';
2
3
  import { MMAssetsData, MMUsedAssets } from '../types/common';
3
4
  export declare const STAKING_ASSETS: string[];
4
- export declare const getStakingApy: (asset: string, web3: Web3, blockNumber?: 'latest' | number, fromBlock?: number | undefined) => Promise<string>;
5
+ export declare const getStakingApy: ((asset: string, web3: Web3, blockNumber?: 'latest' | number, fromBlock?: number | undefined) => Promise<string>) & memoize.Memoized<(asset: string, web3: Web3, blockNumber?: 'latest' | number, fromBlock?: number | undefined) => Promise<string>>;
5
6
  export declare const calculateInterestEarned: (principal: string, interest: string, type: string, apy?: boolean) => number;
6
7
  export declare const calculateNetApy: ({ usedAssets, assetsData, isMorpho }: {
7
8
  usedAssets: MMUsedAssets;
@@ -14,6 +14,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.getStETHByWstETHMultiple = exports.getStETHByWstETH = exports.getWstETHByStETH = exports.calculateNetApy = exports.calculateInterestEarned = exports.getStakingApy = exports.STAKING_ASSETS = void 0;
16
16
  const decimal_js_1 = __importDefault(require("decimal.js"));
17
+ const memoizee_1 = __importDefault(require("memoizee"));
17
18
  const contracts_1 = require("../contracts");
18
19
  const common_1 = require("../types/common");
19
20
  const constants_1 = require("../constants");
@@ -110,14 +111,10 @@ const getApyFromDfsApi = (asset) => __awaiter(void 0, void 0, void 0, function*
110
111
  if (!res.ok)
111
112
  throw new Error(`Failed to fetch APY for ${asset}`);
112
113
  const data = yield res.json();
113
- // if our server returns apr, transform it into apy
114
- if (['weETH'].includes(asset)) {
115
- return (0, moneymarket_1.aprToApy)(data.apy);
116
- }
117
114
  return String(data.apy);
118
115
  });
119
116
  exports.STAKING_ASSETS = ['cbETH', 'wstETH', 'cbETH', 'rETH', 'sDAI', 'weETH', 'sUSDe', 'osETH', 'ezETH', 'ETHx', 'rsETH', 'pufETH', 'wrsETH', 'wsuperOETHb', 'sUSDS'];
120
- const getStakingApy = (asset, web3, blockNumber = 'latest', fromBlock = undefined) => __awaiter(void 0, void 0, void 0, function* () {
117
+ exports.getStakingApy = (0, memoizee_1.default)((asset, web3, blockNumber = 'latest', fromBlock = undefined) => __awaiter(void 0, void 0, void 0, function* () {
121
118
  try {
122
119
  if (asset === 'stETH' || asset === 'wstETH')
123
120
  return yield getStETHApy(web3, fromBlock, blockNumber);
@@ -150,8 +147,7 @@ const getStakingApy = (asset, web3, blockNumber = 'latest', fromBlock = undefine
150
147
  console.error(`Failed to fetch APY for ${asset}`);
151
148
  }
152
149
  return '0';
153
- });
154
- exports.getStakingApy = getStakingApy;
150
+ }), { promise: true, maxAge: 2 * 60 * 1000 });
155
151
  const calculateInterestEarned = (principal, interest, type, apy = false) => {
156
152
  let interval = 1;
157
153
  if (+interest === 0)
@@ -229,6 +229,10 @@ export interface AaveV3AggregatedPositionData {
229
229
  leveragedAsset?: string;
230
230
  leveragedLsdAssetRatio?: string;
231
231
  liquidationPrice?: string;
232
+ minCollRatio?: string;
233
+ collLiquidationRatio?: string;
234
+ healthRatio?: string;
235
+ healthLiquidationRatio?: string;
232
236
  }
233
237
  export interface AaveHelperCommon {
234
238
  usedAssets: any;
@@ -96,6 +96,8 @@ export interface CompoundAggregatedPositionData {
96
96
  minRatio: string;
97
97
  debtTooLow: boolean;
98
98
  minDebt: string;
99
+ minCollRatio: string;
100
+ collLiquidationRatio: string;
99
101
  }
100
102
  export interface CompoundPositionData extends MMPositionData {
101
103
  ratio: string;
@@ -59,6 +59,7 @@ export interface CrvUSDGlobalMarketData {
59
59
  futureBorrowRate: string;
60
60
  leftToBorrow: string;
61
61
  bands: BandData[];
62
+ loanDiscount: string;
62
63
  }
63
64
  export interface CrvUSDAggregatedPositionData {
64
65
  ratio: string;
@@ -146,4 +146,6 @@ export interface EulerV2AggregatedPositionData {
146
146
  liquidationPrice?: string;
147
147
  minRatio: string;
148
148
  minDebt: string;
149
+ minCollRatio: string;
150
+ collLiquidationRatio: string;
149
151
  }
@@ -240,6 +240,8 @@ export interface FluidAggregatedVaultData {
240
240
  leveragedAsset?: string;
241
241
  liquidationPrice?: string;
242
242
  leveragedLsdAssetRatio?: string;
243
+ minCollRatio?: string;
244
+ collLiquidationRatio?: string;
243
245
  }
244
246
  export interface BaseFluidVaultData {
245
247
  owner: string;
@@ -122,6 +122,8 @@ export interface MorphoBlueAggregatedPositionData {
122
122
  leveragedAsset?: string;
123
123
  leveragedLsdAssetRatio?: string;
124
124
  liquidationPrice?: string;
125
+ minCollRatio?: string;
126
+ collLiquidationRatio?: string;
125
127
  }
126
128
  export interface MorphoBluePositionData {
127
129
  usedAssets: MMUsedAssets;
@@ -97,6 +97,8 @@ export interface SparkAggregatedPositionData {
97
97
  leveragedAsset?: string;
98
98
  leveragedLsdAssetRatio?: string;
99
99
  liquidationPrice?: string;
100
+ minCollRatio: string;
101
+ collLiquidationRatio: string;
100
102
  }
101
103
  export interface SparkPositionData extends MMPositionData {
102
104
  ratio: string;
@@ -7,17 +7,17 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
- import Dec from 'decimal.js';
11
10
  import { assetAmountInEth, assetAmountInWei, getAssetInfo } from '@defisaver/tokens';
12
- import { AaveIncentiveDataProviderV3Contract, AaveV3ViewContract, createContractWrapper, getConfigContractAbi, getConfigContractAddress, GhoTokenContract, } from '../contracts';
13
- import { addToObjectIf, ethToWeth, getAbiItem, isEnabledOnBitmap, isLayer2Network, wethToEth, wethToEthByAddress, } from '../services/utils';
14
- import { NetworkNumber, } from '../types/common';
15
- import { getStakingApy, STAKING_ASSETS } from '../staking';
16
- import { multicall } from '../multicall';
11
+ import Dec from 'decimal.js';
17
12
  import { getAssetsBalances } from '../assets';
18
- import { aprToApy, calculateBorrowingAssetLimit } from '../moneymarket';
13
+ import { AaveIncentiveDataProviderV3Contract, AaveV3ViewContract, createContractWrapper, getConfigContractAbi, getConfigContractAddress, GhoTokenContract, } from '../contracts';
19
14
  import { aaveAnyGetAggregatedPositionData, aaveV3IsInIsolationMode, aaveV3IsInSiloedMode } from '../helpers/aaveHelpers';
20
15
  import { AAVE_V3 } from '../markets/aave';
16
+ import { aprToApy, calculateBorrowingAssetLimit } from '../moneymarket';
17
+ import { multicall } from '../multicall';
18
+ import { addToObjectIf, ethToWeth, getAbiItem, isEnabledOnBitmap, isLayer2Network, wethToEth, wethToEthByAddress, } from '../services/utils';
19
+ import { getStakingApy, STAKING_ASSETS } from '../staking';
20
+ import { NetworkNumber, } from '../types/common';
21
21
  export const test = (web3, network) => {
22
22
  const contract = AaveV3ViewContract(web3, 1);
23
23
  return contract.methods.AAVE_REFERRAL_CODE().call();
@@ -12,10 +12,10 @@ import { assetAmountInEth, getAssetInfo } from '@defisaver/tokens';
12
12
  import { CrvUSDStatus, } from '../types';
13
13
  import { multicall } from '../multicall';
14
14
  import { NetworkNumber, } from '../types/common';
15
- import { CrvUSDFactoryContract, CrvUSDViewContract } from '../contracts';
15
+ import { CrvUSDFactoryContract, CrvUSDViewContract, getConfigContractAbi } from '../contracts';
16
16
  import { getCrvUsdAggregatedData } from '../helpers/curveUsdHelpers';
17
17
  import { CrvUsdMarkets } from '../markets';
18
- import { wethToEth } from '../services/utils';
18
+ import { getAbiItem, wethToEth } from '../services/utils';
19
19
  const getAndFormatBands = (web3, network, selectedMarket, _minBand, _maxBand) => __awaiter(void 0, void 0, void 0, function* () {
20
20
  const contract = CrvUSDViewContract(web3, network);
21
21
  const minBand = parseInt(_minBand, 10);
@@ -73,6 +73,11 @@ export const getCurveUsdGlobalData = (web3, network, selectedMarket) => __awaite
73
73
  abiItem: contract.options.jsonInterface.find(({ name }) => name === 'globalData'),
74
74
  params: [selectedMarket.controllerAddress],
75
75
  },
76
+ {
77
+ target: selectedMarket.controllerAddress,
78
+ abiItem: getAbiItem(getConfigContractAbi('crvUSDwstETHController'), 'loan_discount'),
79
+ params: [],
80
+ },
76
81
  ];
77
82
  const multiRes = yield multicall(multicallData, web3, network);
78
83
  const data = multiRes[2][0];
@@ -90,10 +95,12 @@ export const getCurveUsdGlobalData = (web3, network, selectedMarket) => __awaite
90
95
  .toString();
91
96
  const bandsData = yield getAndFormatBands(web3, network, selectedMarket, data.minBand, data.maxBand);
92
97
  const leftToBorrow = new Dec(debtCeiling).minus(totalDebt).toString();
98
+ const loanDiscount = assetAmountInEth(multiRes[3][0], debtAsset);
93
99
  return Object.assign(Object.assign({}, data), { debtCeiling,
94
100
  totalDebt,
95
101
  ammPrice, oraclePrice: assetAmountInEth(data.oraclePrice, debtAsset), basePrice: assetAmountInEth(data.basePrice, debtAsset), minted: assetAmountInEth(data.minted, debtAsset), redeemed: assetAmountInEth(data.redeemed, debtAsset), borrowRate,
96
- futureBorrowRate, bands: bandsData, leftToBorrow });
102
+ futureBorrowRate, bands: bandsData, leftToBorrow,
103
+ loanDiscount });
97
104
  });
98
105
  const getStatusForUser = (bandRange, activeBand, crvUSDSupplied, collSupplied, healthPercent) => {
99
106
  // if bands are equal, that can only be [0,0] which means user doesn't have loan (min number of bands is 4)
@@ -78,6 +78,8 @@ export declare const getUserPositions: (web3: Web3, network: NetworkNumber, user
78
78
  leveragedAsset?: string | undefined;
79
79
  liquidationPrice?: string | undefined;
80
80
  leveragedLsdAssetRatio?: string | undefined;
81
+ minCollRatio?: string | undefined;
82
+ collLiquidationRatio?: string | undefined;
81
83
  owner: string;
82
84
  vaultId: number;
83
85
  usedAssets: FluidUsedAssets;
@@ -117,6 +117,12 @@ export const aaveAnyGetAggregatedPositionData = (_a) => {
117
117
  }
118
118
  payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
119
119
  }
120
+ payload.minCollRatio = new Dec(payload.suppliedCollateralUsd).div(payload.borrowLimitUsd).mul(100).toString();
121
+ payload.collLiquidationRatio = new Dec(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
122
+ payload.healthRatio = new Dec(payload.suppliedCollateralUsd).mul(payload.liqPercent).div(payload.borrowedUsd).div(100)
123
+ .toString();
124
+ payload.healthLiquidationRatio = new Dec(payload.suppliedCollateralUsd).mul(payload.liqRatio).div(payload.borrowLimitUsd)
125
+ .toString();
120
126
  return payload;
121
127
  };
122
128
  const getApyAfterValuesEstimationInner = (selectedMarket, actions, viewContract, network) => __awaiter(void 0, void 0, void 0, function* () {
@@ -125,6 +125,8 @@ export const getCompoundV3AggregatedData = (_a) => {
125
125
  }
126
126
  payload.liquidationPrice = calcLeverageLiqPrice(leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
127
127
  }
128
+ payload.minCollRatio = new Dec(payload.suppliedCollateralUsd).div(payload.borrowLimitUsd).mul(100).toString();
129
+ payload.collLiquidationRatio = new Dec(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
128
130
  // TO DO: handle strategies
129
131
  /* const subscribedStrategies = rest.compoundStrategies
130
132
  ? compoundV3GetSubscribedStrategies({ selectedMarket, compoundStrategies: rest.compoundStrategies })