@defisaver/positions-sdk 2.1.42 → 2.1.43-dev-stats-test-1-dev

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 (114) hide show
  1. package/.mocharc.json +4 -4
  2. package/.nvmrc +1 -1
  3. package/README.md +64 -64
  4. package/cjs/aaveV3/index.js +31 -9
  5. package/cjs/aaveV3/merit.js +5 -1
  6. package/cjs/aaveV3/merkl.js +1 -0
  7. package/cjs/helpers/morphoBlueHelpers/index.js +66 -66
  8. package/cjs/savings/morphoVaults/index.js +17 -17
  9. package/esm/aaveV3/index.js +31 -9
  10. package/esm/aaveV3/merit.js +5 -1
  11. package/esm/aaveV3/merkl.js +1 -0
  12. package/esm/helpers/morphoBlueHelpers/index.js +66 -66
  13. package/esm/savings/morphoVaults/index.js +17 -17
  14. package/package.json +48 -48
  15. package/src/aaveV2/index.ts +240 -240
  16. package/src/aaveV3/index.ts +648 -625
  17. package/src/aaveV3/merit.ts +99 -97
  18. package/src/aaveV3/merkl.ts +75 -74
  19. package/src/claiming/aaveV3.ts +154 -154
  20. package/src/claiming/compV3.ts +22 -22
  21. package/src/claiming/ethena.ts +61 -61
  22. package/src/claiming/index.ts +12 -12
  23. package/src/claiming/king.ts +66 -66
  24. package/src/claiming/morphoBlue.ts +118 -118
  25. package/src/claiming/spark.ts +225 -225
  26. package/src/compoundV2/index.ts +244 -244
  27. package/src/compoundV3/index.ts +274 -274
  28. package/src/config/contracts.ts +1295 -1295
  29. package/src/constants/index.ts +10 -10
  30. package/src/contracts.ts +171 -171
  31. package/src/curveUsd/index.ts +254 -254
  32. package/src/eulerV2/index.ts +324 -324
  33. package/src/exchange/index.ts +25 -25
  34. package/src/fluid/index.ts +1800 -1800
  35. package/src/helpers/aaveHelpers/index.ts +187 -187
  36. package/src/helpers/compoundHelpers/index.ts +283 -283
  37. package/src/helpers/curveUsdHelpers/index.ts +40 -40
  38. package/src/helpers/eulerHelpers/index.ts +222 -222
  39. package/src/helpers/fluidHelpers/index.ts +326 -326
  40. package/src/helpers/index.ts +10 -10
  41. package/src/helpers/liquityV2Helpers/index.ts +82 -82
  42. package/src/helpers/llamaLendHelpers/index.ts +53 -53
  43. package/src/helpers/makerHelpers/index.ts +52 -52
  44. package/src/helpers/morphoBlueHelpers/index.ts +396 -396
  45. package/src/helpers/sparkHelpers/index.ts +158 -158
  46. package/src/index.ts +49 -49
  47. package/src/liquity/index.ts +159 -159
  48. package/src/liquityV2/index.ts +703 -703
  49. package/src/llamaLend/index.ts +305 -305
  50. package/src/maker/index.ts +223 -223
  51. package/src/markets/aave/index.ts +118 -118
  52. package/src/markets/aave/marketAssets.ts +54 -54
  53. package/src/markets/compound/index.ts +243 -243
  54. package/src/markets/compound/marketsAssets.ts +97 -97
  55. package/src/markets/curveUsd/index.ts +69 -69
  56. package/src/markets/euler/index.ts +26 -26
  57. package/src/markets/fluid/index.ts +2900 -2900
  58. package/src/markets/index.ts +25 -25
  59. package/src/markets/liquityV2/index.ts +102 -102
  60. package/src/markets/llamaLend/contractAddresses.ts +141 -141
  61. package/src/markets/llamaLend/index.ts +235 -235
  62. package/src/markets/morphoBlue/index.ts +971 -971
  63. package/src/markets/spark/index.ts +29 -29
  64. package/src/markets/spark/marketAssets.ts +12 -12
  65. package/src/moneymarket/moneymarketCommonService.ts +85 -85
  66. package/src/morphoBlue/index.ts +274 -274
  67. package/src/portfolio/index.ts +598 -598
  68. package/src/savings/index.ts +95 -95
  69. package/src/savings/makerDsr/index.ts +53 -53
  70. package/src/savings/makerDsr/options.ts +9 -9
  71. package/src/savings/morphoVaults/index.ts +80 -80
  72. package/src/savings/morphoVaults/options.ts +193 -193
  73. package/src/savings/skyOptions/index.ts +95 -95
  74. package/src/savings/skyOptions/options.ts +10 -10
  75. package/src/savings/sparkSavingsVaults/index.ts +60 -60
  76. package/src/savings/sparkSavingsVaults/options.ts +35 -35
  77. package/src/savings/yearnV3Vaults/index.ts +61 -61
  78. package/src/savings/yearnV3Vaults/options.ts +55 -55
  79. package/src/savings/yearnVaults/index.ts +73 -73
  80. package/src/savings/yearnVaults/options.ts +32 -32
  81. package/src/services/priceService.ts +278 -278
  82. package/src/services/utils.ts +115 -115
  83. package/src/services/viem.ts +34 -34
  84. package/src/setup.ts +8 -8
  85. package/src/spark/index.ts +458 -458
  86. package/src/staking/eligibility.ts +53 -53
  87. package/src/staking/index.ts +1 -1
  88. package/src/staking/staking.ts +186 -186
  89. package/src/types/aave.ts +196 -196
  90. package/src/types/claiming.ts +114 -114
  91. package/src/types/common.ts +107 -107
  92. package/src/types/compound.ts +144 -144
  93. package/src/types/curveUsd.ts +123 -123
  94. package/src/types/euler.ts +175 -175
  95. package/src/types/fluid.ts +483 -483
  96. package/src/types/index.ts +14 -14
  97. package/src/types/liquity.ts +30 -30
  98. package/src/types/liquityV2.ts +126 -126
  99. package/src/types/llamaLend.ts +159 -159
  100. package/src/types/maker.ts +63 -63
  101. package/src/types/merit.ts +1 -1
  102. package/src/types/merkl.ts +70 -70
  103. package/src/types/morphoBlue.ts +200 -200
  104. package/src/types/portfolio.ts +60 -60
  105. package/src/types/savings/index.ts +23 -23
  106. package/src/types/savings/makerDsr.ts +13 -13
  107. package/src/types/savings/morphoVaults.ts +32 -32
  108. package/src/types/savings/sky.ts +14 -14
  109. package/src/types/savings/sparkSavingsVaults.ts +15 -15
  110. package/src/types/savings/yearnV3Vaults.ts +17 -17
  111. package/src/types/savings/yearnVaults.ts +14 -14
  112. package/src/types/spark.ts +134 -134
  113. package/src/umbrella/index.ts +69 -69
  114. package/src/umbrella/umbrellaUtils.ts +29 -29
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,64 +1,64 @@
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
- - [Compound V2](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/compoundV2)
10
- - [Compound V3](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/compoundV3)
11
- - [Liquity](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/liquity)
12
-
13
- ## Setup
14
- Supported Node version is v10.
15
-
16
- - run `npm install` (first time)
17
- - run `npm run build`
18
-
19
- `build` command will generate contracts and build ejs and esm folders
20
-
21
- ## How to use
22
- [All available imports](https://github.com/defisaver/defisaver-positions-sdk/blob/main/src/index.ts)
23
-
24
- This is a Compound V3 example, and every other protocol is similar
25
- ```js
26
- import { compoundV3 } from '@defisaver/positions-sdk';
27
-
28
-
29
- // every protocol has market data and user data getters
30
- const {
31
- getCompoundV3MarketsData,
32
- getCompoundV3AccountData,
33
- } = compoundV3;
34
-
35
- const provider = 'Your RPC provider';
36
-
37
- const user = '0x123...';
38
-
39
- const { assetsData } = await getCompoundV3MarketsData(
40
- provider, // rpc for the network you are using (note: can be tenderly or any other testnet rpc)
41
- 1, // network
42
- selectedMarket, // market object like in /src/markets/compound/index.ts
43
- provider, // this must be mainnet rpc - used for getting prices onchain and calculating apys
44
- );
45
-
46
- const userData = await getCompoundV3AccountData(
47
- provider,
48
- 1, // network
49
- userAddress, // EOA or DSProxy
50
- '', // proxy address of the user, or just empty string if checking for EOA
51
- {
52
- selectedMarket, // market object as in /src/markets/compound/index.ts
53
- assetsData,
54
- }
55
- );
56
- ```
57
-
58
- More examples found [here](https://github.com/defisaver/defisaver-positions-sdk/tree/main/tests)
59
-
60
- ## Testing
61
-
62
- `npm run test` - Run all tests
63
-
64
- `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
+ - [Compound V2](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/compoundV2)
10
+ - [Compound V3](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/compoundV3)
11
+ - [Liquity](https://github.com/defisaver/defisaver-positions-sdk/tree/main/src/liquity)
12
+
13
+ ## Setup
14
+ Supported Node version is v10.
15
+
16
+ - run `npm install` (first time)
17
+ - run `npm run build`
18
+
19
+ `build` command will generate contracts and build ejs and esm folders
20
+
21
+ ## How to use
22
+ [All available imports](https://github.com/defisaver/defisaver-positions-sdk/blob/main/src/index.ts)
23
+
24
+ This is a Compound V3 example, and every other protocol is similar
25
+ ```js
26
+ import { compoundV3 } from '@defisaver/positions-sdk';
27
+
28
+
29
+ // every protocol has market data and user data getters
30
+ const {
31
+ getCompoundV3MarketsData,
32
+ getCompoundV3AccountData,
33
+ } = compoundV3;
34
+
35
+ const provider = 'Your RPC provider';
36
+
37
+ const user = '0x123...';
38
+
39
+ const { assetsData } = await getCompoundV3MarketsData(
40
+ provider, // rpc for the network you are using (note: can be tenderly or any other testnet rpc)
41
+ 1, // network
42
+ selectedMarket, // market object like in /src/markets/compound/index.ts
43
+ provider, // this must be mainnet rpc - used for getting prices onchain and calculating apys
44
+ );
45
+
46
+ const userData = await getCompoundV3AccountData(
47
+ provider,
48
+ 1, // network
49
+ userAddress, // EOA or DSProxy
50
+ '', // proxy address of the user, or just empty string if checking for EOA
51
+ {
52
+ selectedMarket, // market object as in /src/markets/compound/index.ts
53
+ assetsData,
54
+ }
55
+ );
56
+ ```
57
+
58
+ More examples found [here](https://github.com/defisaver/defisaver-positions-sdk/tree/main/tests)
59
+
60
+ ## Testing
61
+
62
+ `npm run test` - Run all tests
63
+
64
+ `npm run test-single --name=your_test_name` - Run single test for specified name e.g. for MyTest.js test name is MyTest
@@ -59,20 +59,31 @@ exports.aaveV3EmodeCategoriesMapping = aaveV3EmodeCategoriesMapping;
59
59
  function _getAaveV3MarketData(provider_1, network_1, market_1) {
60
60
  return __awaiter(this, arguments, void 0, function* (provider, network, market, blockNumber = 'latest') {
61
61
  const _addresses = market.assets.map(a => (0, tokens_1.getAssetInfo)((0, utils_1.getWrappedNativeAssetFromUnwrapped)(a), network).address);
62
+ console.log('Fetched addresses');
62
63
  const isL2 = (0, utils_1.isLayer2Network)(network);
63
64
  const loanInfoContract = (0, contracts_1.AaveV3ViewContractViem)(provider, network);
64
65
  const aaveIncentivesContract = (0, contracts_1.AaveIncentiveDataProviderV3ContractViem)(provider, network);
65
66
  const marketAddress = market.providerAddress;
66
67
  const networksWithIncentives = [common_1.NetworkNumber.Eth, common_1.NetworkNumber.Arb, common_1.NetworkNumber.Opt, common_1.NetworkNumber.Linea, common_1.NetworkNumber.Plasma];
67
- // eslint-disable-next-line prefer-const
68
- let [loanInfo, eModesInfo, isBorrowAllowed, rewardInfo, merkleRewardsMap, meritRewardsMap] = yield Promise.all([
69
- loanInfoContract.read.getFullTokensInfo([marketAddress, _addresses], (0, viem_1.setViemBlockNumber)(blockNumber)),
70
- loanInfoContract.read.getAllEmodes([marketAddress], (0, viem_1.setViemBlockNumber)(blockNumber)),
71
- loanInfoContract.read.isBorrowAllowed([marketAddress], (0, viem_1.setViemBlockNumber)(blockNumber)), // Used on L2s check for PriceOracleSentinel (mainnet will always return true)
72
- networksWithIncentives.includes(network) ? aaveIncentivesContract.read.getReservesIncentivesData([marketAddress], (0, viem_1.setViemBlockNumber)(blockNumber)) : null,
73
- (0, merkl_1.getMerkleCampaigns)(network),
74
- (0, merit_1.getMeritCampaigns)(network, market.value),
75
- ]);
68
+ console.log({ marketAddress, blockNumber });
69
+ console.log('Fetching loan info...');
70
+ const loanInfo = yield loanInfoContract.read.getFullTokensInfo([marketAddress, _addresses], (0, viem_1.setViemBlockNumber)(blockNumber));
71
+ console.log('Fetched loan info');
72
+ console.log('Fetching eModes info...');
73
+ const eModesInfo = yield loanInfoContract.read.getAllEmodes([marketAddress], (0, viem_1.setViemBlockNumber)(blockNumber));
74
+ console.log('Fetched eModes info');
75
+ console.log('Fetching borrow allowed status...');
76
+ let isBorrowAllowed = yield loanInfoContract.read.isBorrowAllowed([marketAddress], (0, viem_1.setViemBlockNumber)(blockNumber)); // Used on L2s check for PriceOracleSentinel (mainnet will always return true)
77
+ console.log('Fetched borrow allowed status');
78
+ console.log('Fetching reward info...');
79
+ let rewardInfo = networksWithIncentives.includes(network) ? yield aaveIncentivesContract.read.getReservesIncentivesData([marketAddress], (0, viem_1.setViemBlockNumber)(blockNumber)) : null;
80
+ console.log('Fetched reward info');
81
+ console.log('Fetching Merkle campaigns...');
82
+ const merkleRewardsMap = yield (0, merkl_1.getMerkleCampaigns)(network);
83
+ console.log('Fetched Merkle campaigns');
84
+ console.log('Fetching Merit campaigns...');
85
+ const meritRewardsMap = yield (0, merit_1.getMeritCampaigns)(network, market.value);
86
+ console.log('Fetched Merit campaigns');
76
87
  isBorrowAllowed = (0, utils_1.isLayer2Network)(network) ? isBorrowAllowed : true;
77
88
  const eModeCategoriesData = {};
78
89
  for (let i = 0; i < eModesInfo.length; i++) {
@@ -90,6 +101,7 @@ function _getAaveV3MarketData(provider_1, network_1, market_1) {
90
101
  collateralAssets: [],
91
102
  };
92
103
  }
104
+ console.log('Parsed e modes info');
93
105
  if (networksWithIncentives.includes(network) && rewardInfo) {
94
106
  rewardInfo = rewardInfo.reduce((all, _market) => {
95
107
  // eslint-disable-next-line no-param-reassign
@@ -97,6 +109,7 @@ function _getAaveV3MarketData(provider_1, network_1, market_1) {
97
109
  return all;
98
110
  }, {});
99
111
  }
112
+ console.log('Parsed reward info');
100
113
  const assetsData = yield Promise.all(loanInfo
101
114
  .map((tokenMarket, i) => __awaiter(this, void 0, void 0, function* () {
102
115
  const symbol = market.assets[i];
@@ -158,6 +171,7 @@ function _getAaveV3MarketData(provider_1, network_1, market_1) {
158
171
  borrowIncentives: [],
159
172
  });
160
173
  })));
174
+ console.log('Parsed assets data');
161
175
  // Get incentives data
162
176
  yield Promise.all(assetsData.map((_market, index) => __awaiter(this, void 0, void 0, function* () {
163
177
  var _a, _b;
@@ -165,8 +179,10 @@ function _getAaveV3MarketData(provider_1, network_1, market_1) {
165
179
  // @ts-ignore
166
180
  const rewardForMarket = rewardInfo === null || rewardInfo === void 0 ? void 0 : rewardInfo[_market.underlyingTokenAddress];
167
181
  const isStakingAsset = staking_1.STAKING_ASSETS.includes(_market.symbol);
182
+ console.log('Processing market', _market.symbol);
168
183
  if (isStakingAsset) {
169
184
  const yieldApy = yield (0, staking_1.getStakingApy)(_market.symbol, network);
185
+ console.log('Got yield apy', yieldApy);
170
186
  _market.supplyIncentives.push({
171
187
  apy: yieldApy,
172
188
  token: _market.symbol,
@@ -194,6 +210,7 @@ function _getAaveV3MarketData(provider_1, network_1, market_1) {
194
210
  eligibilityId: identifier,
195
211
  });
196
212
  }
213
+ console.log('Processed merkle a incentives');
197
214
  const vTokenAddress = _market.vTokenAddress.toLowerCase(); // DEV: Should vTokenAddress be in AaveV3AssetData type?
198
215
  if ((_b = merkleRewardsMap[vTokenAddress]) === null || _b === void 0 ? void 0 : _b.borrow) {
199
216
  const { apy, rewardTokenSymbol, description, identifier, } = merkleRewardsMap[vTokenAddress].borrow;
@@ -205,6 +222,7 @@ function _getAaveV3MarketData(provider_1, network_1, market_1) {
205
222
  eligibilityId: identifier,
206
223
  });
207
224
  }
225
+ console.log('Processed merkle v incentives');
208
226
  if (meritRewardsMap.supply[_market.symbol]) {
209
227
  const { apy, rewardTokenSymbol, description } = meritRewardsMap.supply[_market.symbol];
210
228
  _market.supplyIncentives.push({
@@ -214,6 +232,7 @@ function _getAaveV3MarketData(provider_1, network_1, market_1) {
214
232
  description,
215
233
  });
216
234
  }
235
+ console.log('Processed merit supply incentives');
217
236
  if (meritRewardsMap.borrow[_market.symbol]) {
218
237
  const { apy, rewardTokenSymbol, description } = meritRewardsMap.borrow[_market.symbol];
219
238
  _market.borrowIncentives.push({
@@ -223,8 +242,10 @@ function _getAaveV3MarketData(provider_1, network_1, market_1) {
223
242
  description,
224
243
  });
225
244
  }
245
+ console.log('Processed merit borrow incentives');
226
246
  if (!rewardForMarket)
227
247
  return;
248
+ console.log('Reward for market', rewardForMarket);
228
249
  // @ts-ignore
229
250
  rewardForMarket.aIncentiveData.rewardsTokenInformation.forEach(supplyRewardData => {
230
251
  if (supplyRewardData) {
@@ -291,6 +312,7 @@ function _getAaveV3MarketData(provider_1, network_1, market_1) {
291
312
  collateralAssets: assetsData.map((a) => a.symbol),
292
313
  borrowAssets: assetsData.map((a) => a.symbol),
293
314
  };
315
+ console.log('Parsed payload');
294
316
  return { assetsData: payload, eModeCategoriesData };
295
317
  });
296
318
  }
@@ -53,12 +53,15 @@ const MERIT_DATA_MAP = {
53
53
  * Fetches merit rewards data from Aave API
54
54
  */
55
55
  const fetchMeritRewardsData = () => __awaiter(void 0, void 0, void 0, function* () {
56
+ var _a;
56
57
  try {
57
58
  const response = yield fetch('https://apps.aavechan.com/api/merit/aprs', {
58
59
  signal: AbortSignal.timeout(5000),
59
60
  });
61
+ if (!response.ok)
62
+ throw new Error('Failed to fetch Merit rewards data');
60
63
  const data = yield response.json();
61
- return data.currentAPR.actionsAPR;
64
+ return ((_a = data === null || data === void 0 ? void 0 : data.currentAPR) === null || _a === void 0 ? void 0 : _a.actionsAPR) || {};
62
65
  }
63
66
  catch (error) {
64
67
  console.error('External API Failure: Failed to fetch merit rewards data:', error);
@@ -68,6 +71,7 @@ const fetchMeritRewardsData = () => __awaiter(void 0, void 0, void 0, function*
68
71
  exports.fetchMeritRewardsData = fetchMeritRewardsData;
69
72
  const getMeritCampaigns = (chainId, market) => __awaiter(void 0, void 0, void 0, function* () {
70
73
  var _a;
74
+ console.log('Fetching Merit campaigns');
71
75
  const meritData = yield (0, exports.fetchMeritRewardsData)();
72
76
  const relevantCampaigns = {
73
77
  supply: {},
@@ -39,6 +39,7 @@ const formatAaveAsset = (_symbol) => {
39
39
  };
40
40
  exports.formatAaveAsset = formatAaveAsset;
41
41
  const getMerkleCampaigns = (chainId) => __awaiter(void 0, void 0, void 0, function* () {
42
+ console.log('Fetching Merkle campaigns');
42
43
  try {
43
44
  const res = yield fetch('https://api.merkl.xyz/v4/opportunities?mainProtocolId=aave', {
44
45
  signal: AbortSignal.timeout(utils_1.DEFAULT_TIMEOUT),
@@ -128,73 +128,73 @@ const getApyAfterValuesEstimation = (selectedMarket, actions, provider, network)
128
128
  });
129
129
  exports.getApyAfterValuesEstimation = getApyAfterValuesEstimation;
130
130
  const API_URL = 'https://blue-api.morpho.org/graphql';
131
- const MARKET_QUERY = `
132
- query MarketByUniqueKey($uniqueKey: String!, $chainId: Int!) {
133
- marketByUniqueKey(uniqueKey: $uniqueKey, chainId: $chainId) {
134
- reallocatableLiquidityAssets
135
- targetBorrowUtilization
136
- loanAsset {
137
- address
138
- decimals
139
- priceUsd
140
- }
141
- state {
142
- liquidityAssets
143
- borrowAssets
144
- supplyAssets
145
- }
146
- publicAllocatorSharedLiquidity {
147
- assets
148
- vault {
149
- address
150
- name
151
- }
152
- allocationMarket {
153
- uniqueKey
154
- loanAsset {
155
- address
156
- }
157
- collateralAsset {
158
- address
159
- }
160
- irmAddress
161
- oracle {
162
- address
163
- }
164
- lltv
165
- }
166
- }
167
- loanAsset {
168
- address
169
- }
170
- collateralAsset {
171
- address
172
- }
173
- oracle {
174
- address
175
- }
176
- irmAddress
177
- lltv
178
- }
179
- }
131
+ const MARKET_QUERY = `
132
+ query MarketByUniqueKey($uniqueKey: String!, $chainId: Int!) {
133
+ marketByUniqueKey(uniqueKey: $uniqueKey, chainId: $chainId) {
134
+ reallocatableLiquidityAssets
135
+ targetBorrowUtilization
136
+ loanAsset {
137
+ address
138
+ decimals
139
+ priceUsd
140
+ }
141
+ state {
142
+ liquidityAssets
143
+ borrowAssets
144
+ supplyAssets
145
+ }
146
+ publicAllocatorSharedLiquidity {
147
+ assets
148
+ vault {
149
+ address
150
+ name
151
+ }
152
+ allocationMarket {
153
+ uniqueKey
154
+ loanAsset {
155
+ address
156
+ }
157
+ collateralAsset {
158
+ address
159
+ }
160
+ irmAddress
161
+ oracle {
162
+ address
163
+ }
164
+ lltv
165
+ }
166
+ }
167
+ loanAsset {
168
+ address
169
+ }
170
+ collateralAsset {
171
+ address
172
+ }
173
+ oracle {
174
+ address
175
+ }
176
+ irmAddress
177
+ lltv
178
+ }
179
+ }
180
180
  `;
181
- const REWARDS_QUERY = `
182
- query MarketByUniqueKey($uniqueKey: String!, $chainId: Int!) {
183
- marketByUniqueKey(uniqueKey: $uniqueKey, chainId: $chainId) {
184
- uniqueKey
185
- state {
186
- rewards {
187
- amountPerSuppliedToken
188
- supplyApr
189
- amountPerBorrowedToken
190
- borrowApr
191
- asset {
192
- address
193
- }
194
- }
195
- }
196
- }
197
- }
181
+ const REWARDS_QUERY = `
182
+ query MarketByUniqueKey($uniqueKey: String!, $chainId: Int!) {
183
+ marketByUniqueKey(uniqueKey: $uniqueKey, chainId: $chainId) {
184
+ uniqueKey
185
+ state {
186
+ rewards {
187
+ amountPerSuppliedToken
188
+ supplyApr
189
+ amountPerBorrowedToken
190
+ borrowApr
191
+ asset {
192
+ address
193
+ }
194
+ }
195
+ }
196
+ }
197
+ }
198
198
  `;
199
199
  /**
200
200
  * Get reallocatable liquidity to a given market and target borrow utilization
@@ -54,23 +54,23 @@ const morphoVaultsOptions = __importStar(require("./options"));
54
54
  exports.morphoVaultsOptions = morphoVaultsOptions;
55
55
  const viem_1 = require("../../services/viem");
56
56
  const contracts_1 = require("../../contracts");
57
- const vaultDataQuery = (vaultAddress) => `query vaultByAddress {
58
- vaultByAddress(chainId: 1, address: "${vaultAddress}") {
59
- id,
60
- dailyApy,
61
- dailyApys {
62
- apy, netApy
63
- },
64
- monthlyApys {
65
- apy, netApy
66
- },
67
- liquidity {
68
- underlying, usd,
69
- },
70
- asset {
71
- priceUsd
72
- }
73
- }
57
+ const vaultDataQuery = (vaultAddress) => `query vaultByAddress {
58
+ vaultByAddress(chainId: 1, address: "${vaultAddress}") {
59
+ id,
60
+ dailyApy,
61
+ dailyApys {
62
+ apy, netApy
63
+ },
64
+ monthlyApys {
65
+ apy, netApy
66
+ },
67
+ liquidity {
68
+ underlying, usd,
69
+ },
70
+ asset {
71
+ priceUsd
72
+ }
73
+ }
74
74
  }`;
75
75
  const MORPHO_BLUE_API = 'https://blue-api.morpho.org/graphql';
76
76
  const _getMorphoVaultData = (provider, network, morphoVault, accounts) => __awaiter(void 0, void 0, void 0, function* () {
@@ -48,20 +48,31 @@ export const aaveV3EmodeCategoriesMapping = (extractedState, usedAssets) => {
48
48
  export function _getAaveV3MarketData(provider_1, network_1, market_1) {
49
49
  return __awaiter(this, arguments, void 0, function* (provider, network, market, blockNumber = 'latest') {
50
50
  const _addresses = market.assets.map(a => getAssetInfo(getWrappedNativeAssetFromUnwrapped(a), network).address);
51
+ console.log('Fetched addresses');
51
52
  const isL2 = isLayer2Network(network);
52
53
  const loanInfoContract = AaveV3ViewContractViem(provider, network);
53
54
  const aaveIncentivesContract = AaveIncentiveDataProviderV3ContractViem(provider, network);
54
55
  const marketAddress = market.providerAddress;
55
56
  const networksWithIncentives = [NetworkNumber.Eth, NetworkNumber.Arb, NetworkNumber.Opt, NetworkNumber.Linea, NetworkNumber.Plasma];
56
- // eslint-disable-next-line prefer-const
57
- let [loanInfo, eModesInfo, isBorrowAllowed, rewardInfo, merkleRewardsMap, meritRewardsMap] = yield Promise.all([
58
- loanInfoContract.read.getFullTokensInfo([marketAddress, _addresses], setViemBlockNumber(blockNumber)),
59
- loanInfoContract.read.getAllEmodes([marketAddress], setViemBlockNumber(blockNumber)),
60
- loanInfoContract.read.isBorrowAllowed([marketAddress], setViemBlockNumber(blockNumber)), // Used on L2s check for PriceOracleSentinel (mainnet will always return true)
61
- networksWithIncentives.includes(network) ? aaveIncentivesContract.read.getReservesIncentivesData([marketAddress], setViemBlockNumber(blockNumber)) : null,
62
- getMerkleCampaigns(network),
63
- getMeritCampaigns(network, market.value),
64
- ]);
57
+ console.log({ marketAddress, blockNumber });
58
+ console.log('Fetching loan info...');
59
+ const loanInfo = yield loanInfoContract.read.getFullTokensInfo([marketAddress, _addresses], setViemBlockNumber(blockNumber));
60
+ console.log('Fetched loan info');
61
+ console.log('Fetching eModes info...');
62
+ const eModesInfo = yield loanInfoContract.read.getAllEmodes([marketAddress], setViemBlockNumber(blockNumber));
63
+ console.log('Fetched eModes info');
64
+ console.log('Fetching borrow allowed status...');
65
+ let isBorrowAllowed = yield loanInfoContract.read.isBorrowAllowed([marketAddress], setViemBlockNumber(blockNumber)); // Used on L2s check for PriceOracleSentinel (mainnet will always return true)
66
+ console.log('Fetched borrow allowed status');
67
+ console.log('Fetching reward info...');
68
+ let rewardInfo = networksWithIncentives.includes(network) ? yield aaveIncentivesContract.read.getReservesIncentivesData([marketAddress], setViemBlockNumber(blockNumber)) : null;
69
+ console.log('Fetched reward info');
70
+ console.log('Fetching Merkle campaigns...');
71
+ const merkleRewardsMap = yield getMerkleCampaigns(network);
72
+ console.log('Fetched Merkle campaigns');
73
+ console.log('Fetching Merit campaigns...');
74
+ const meritRewardsMap = yield getMeritCampaigns(network, market.value);
75
+ console.log('Fetched Merit campaigns');
65
76
  isBorrowAllowed = isLayer2Network(network) ? isBorrowAllowed : true;
66
77
  const eModeCategoriesData = {};
67
78
  for (let i = 0; i < eModesInfo.length; i++) {
@@ -79,6 +90,7 @@ export function _getAaveV3MarketData(provider_1, network_1, market_1) {
79
90
  collateralAssets: [],
80
91
  };
81
92
  }
93
+ console.log('Parsed e modes info');
82
94
  if (networksWithIncentives.includes(network) && rewardInfo) {
83
95
  rewardInfo = rewardInfo.reduce((all, _market) => {
84
96
  // eslint-disable-next-line no-param-reassign
@@ -86,6 +98,7 @@ export function _getAaveV3MarketData(provider_1, network_1, market_1) {
86
98
  return all;
87
99
  }, {});
88
100
  }
101
+ console.log('Parsed reward info');
89
102
  const assetsData = yield Promise.all(loanInfo
90
103
  .map((tokenMarket, i) => __awaiter(this, void 0, void 0, function* () {
91
104
  const symbol = market.assets[i];
@@ -147,6 +160,7 @@ export function _getAaveV3MarketData(provider_1, network_1, market_1) {
147
160
  borrowIncentives: [],
148
161
  });
149
162
  })));
163
+ console.log('Parsed assets data');
150
164
  // Get incentives data
151
165
  yield Promise.all(assetsData.map((_market, index) => __awaiter(this, void 0, void 0, function* () {
152
166
  var _a, _b;
@@ -154,8 +168,10 @@ export function _getAaveV3MarketData(provider_1, network_1, market_1) {
154
168
  // @ts-ignore
155
169
  const rewardForMarket = rewardInfo === null || rewardInfo === void 0 ? void 0 : rewardInfo[_market.underlyingTokenAddress];
156
170
  const isStakingAsset = STAKING_ASSETS.includes(_market.symbol);
171
+ console.log('Processing market', _market.symbol);
157
172
  if (isStakingAsset) {
158
173
  const yieldApy = yield getStakingApy(_market.symbol, network);
174
+ console.log('Got yield apy', yieldApy);
159
175
  _market.supplyIncentives.push({
160
176
  apy: yieldApy,
161
177
  token: _market.symbol,
@@ -183,6 +199,7 @@ export function _getAaveV3MarketData(provider_1, network_1, market_1) {
183
199
  eligibilityId: identifier,
184
200
  });
185
201
  }
202
+ console.log('Processed merkle a incentives');
186
203
  const vTokenAddress = _market.vTokenAddress.toLowerCase(); // DEV: Should vTokenAddress be in AaveV3AssetData type?
187
204
  if ((_b = merkleRewardsMap[vTokenAddress]) === null || _b === void 0 ? void 0 : _b.borrow) {
188
205
  const { apy, rewardTokenSymbol, description, identifier, } = merkleRewardsMap[vTokenAddress].borrow;
@@ -194,6 +211,7 @@ export function _getAaveV3MarketData(provider_1, network_1, market_1) {
194
211
  eligibilityId: identifier,
195
212
  });
196
213
  }
214
+ console.log('Processed merkle v incentives');
197
215
  if (meritRewardsMap.supply[_market.symbol]) {
198
216
  const { apy, rewardTokenSymbol, description } = meritRewardsMap.supply[_market.symbol];
199
217
  _market.supplyIncentives.push({
@@ -203,6 +221,7 @@ export function _getAaveV3MarketData(provider_1, network_1, market_1) {
203
221
  description,
204
222
  });
205
223
  }
224
+ console.log('Processed merit supply incentives');
206
225
  if (meritRewardsMap.borrow[_market.symbol]) {
207
226
  const { apy, rewardTokenSymbol, description } = meritRewardsMap.borrow[_market.symbol];
208
227
  _market.borrowIncentives.push({
@@ -212,8 +231,10 @@ export function _getAaveV3MarketData(provider_1, network_1, market_1) {
212
231
  description,
213
232
  });
214
233
  }
234
+ console.log('Processed merit borrow incentives');
215
235
  if (!rewardForMarket)
216
236
  return;
237
+ console.log('Reward for market', rewardForMarket);
217
238
  // @ts-ignore
218
239
  rewardForMarket.aIncentiveData.rewardsTokenInformation.forEach(supplyRewardData => {
219
240
  if (supplyRewardData) {
@@ -280,6 +301,7 @@ export function _getAaveV3MarketData(provider_1, network_1, market_1) {
280
301
  collateralAssets: assetsData.map((a) => a.symbol),
281
302
  borrowAssets: assetsData.map((a) => a.symbol),
282
303
  };
304
+ console.log('Parsed payload');
283
305
  return { assetsData: payload, eModeCategoriesData };
284
306
  });
285
307
  }
@@ -50,12 +50,15 @@ const MERIT_DATA_MAP = {
50
50
  * Fetches merit rewards data from Aave API
51
51
  */
52
52
  export const fetchMeritRewardsData = () => __awaiter(void 0, void 0, void 0, function* () {
53
+ var _a;
53
54
  try {
54
55
  const response = yield fetch('https://apps.aavechan.com/api/merit/aprs', {
55
56
  signal: AbortSignal.timeout(5000),
56
57
  });
58
+ if (!response.ok)
59
+ throw new Error('Failed to fetch Merit rewards data');
57
60
  const data = yield response.json();
58
- return data.currentAPR.actionsAPR;
61
+ return ((_a = data === null || data === void 0 ? void 0 : data.currentAPR) === null || _a === void 0 ? void 0 : _a.actionsAPR) || {};
59
62
  }
60
63
  catch (error) {
61
64
  console.error('External API Failure: Failed to fetch merit rewards data:', error);
@@ -64,6 +67,7 @@ export const fetchMeritRewardsData = () => __awaiter(void 0, void 0, void 0, fun
64
67
  });
65
68
  export const getMeritCampaigns = (chainId, market) => __awaiter(void 0, void 0, void 0, function* () {
66
69
  var _a;
70
+ console.log('Fetching Merit campaigns');
67
71
  const meritData = yield fetchMeritRewardsData();
68
72
  const relevantCampaigns = {
69
73
  supply: {},
@@ -34,6 +34,7 @@ export const formatAaveAsset = (_symbol) => {
34
34
  return _symbol;
35
35
  };
36
36
  export const getMerkleCampaigns = (chainId) => __awaiter(void 0, void 0, void 0, function* () {
37
+ console.log('Fetching Merkle campaigns');
37
38
  try {
38
39
  const res = yield fetch('https://api.merkl.xyz/v4/opportunities?mainProtocolId=aave', {
39
40
  signal: AbortSignal.timeout(DEFAULT_TIMEOUT),