@defisaver/positions-sdk 2.0.12 → 2.0.14-dev-portfolio

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 (170) hide show
  1. package/.mocharc.json +4 -4
  2. package/.nvmrc +1 -1
  3. package/CLAUDE.md +32 -0
  4. package/README.md +64 -64
  5. package/cjs/aaveV2/index.js +1 -0
  6. package/cjs/aaveV3/index.d.ts +12 -0
  7. package/cjs/aaveV3/index.js +93 -1
  8. package/cjs/claiming/aaveV3.d.ts +9 -0
  9. package/cjs/claiming/aaveV3.js +148 -0
  10. package/cjs/claiming/compV3.d.ts +15 -0
  11. package/cjs/claiming/compV3.js +34 -0
  12. package/cjs/claiming/index.d.ts +6 -0
  13. package/cjs/claiming/index.js +46 -0
  14. package/cjs/claiming/king.d.ts +4 -0
  15. package/cjs/claiming/king.js +72 -0
  16. package/cjs/claiming/morphoBlue.d.ts +6 -0
  17. package/cjs/claiming/morphoBlue.js +113 -0
  18. package/cjs/claiming/spark.d.ts +6 -0
  19. package/cjs/claiming/spark.js +188 -0
  20. package/cjs/config/contracts.d.ts +2667 -0
  21. package/cjs/config/contracts.js +103 -2
  22. package/cjs/constants/index.d.ts +4 -0
  23. package/cjs/constants/index.js +6 -2
  24. package/cjs/contracts.d.ts +2882 -23
  25. package/cjs/contracts.js +10 -1
  26. package/cjs/helpers/morphoBlueHelpers/index.js +66 -66
  27. package/cjs/index.d.ts +2 -1
  28. package/cjs/index.js +3 -1
  29. package/cjs/liquity/index.d.ts +11 -0
  30. package/cjs/liquity/index.js +39 -1
  31. package/cjs/liquityV2/index.d.ts +8 -0
  32. package/cjs/liquityV2/index.js +161 -0
  33. package/cjs/markets/aave/marketAssets.js +1 -1
  34. package/cjs/markets/compound/marketsAssets.js +2 -2
  35. package/cjs/markets/spark/marketAssets.js +1 -1
  36. package/cjs/morphoBlue/index.d.ts +5 -0
  37. package/cjs/morphoBlue/index.js +38 -4
  38. package/cjs/portfolio/index.d.ts +6 -1
  39. package/cjs/portfolio/index.js +256 -10
  40. package/cjs/services/utils.d.ts +5 -0
  41. package/cjs/services/utils.js +33 -1
  42. package/cjs/services/viem.d.ts +12 -12
  43. package/cjs/spark/index.js +1 -0
  44. package/cjs/staking/staking.js +3 -1
  45. package/cjs/types/claiming.d.ts +93 -0
  46. package/cjs/types/claiming.js +27 -0
  47. package/cjs/umbrella/index.d.ts +5 -0
  48. package/cjs/umbrella/index.js +50 -0
  49. package/cjs/umbrella/umbrellaUtils.d.ts +22 -0
  50. package/cjs/umbrella/umbrellaUtils.js +34 -0
  51. package/esm/aaveV2/index.js +1 -0
  52. package/esm/aaveV3/index.d.ts +12 -0
  53. package/esm/aaveV3/index.js +91 -1
  54. package/esm/claiming/aaveV3.d.ts +9 -0
  55. package/esm/claiming/aaveV3.js +139 -0
  56. package/esm/claiming/compV3.d.ts +15 -0
  57. package/esm/claiming/compV3.js +30 -0
  58. package/esm/claiming/index.d.ts +6 -0
  59. package/esm/claiming/index.js +6 -0
  60. package/esm/claiming/king.d.ts +4 -0
  61. package/esm/claiming/king.js +64 -0
  62. package/esm/claiming/morphoBlue.d.ts +6 -0
  63. package/esm/claiming/morphoBlue.js +104 -0
  64. package/esm/claiming/spark.d.ts +6 -0
  65. package/esm/claiming/spark.js +179 -0
  66. package/esm/config/contracts.d.ts +2667 -0
  67. package/esm/config/contracts.js +102 -1
  68. package/esm/constants/index.d.ts +4 -0
  69. package/esm/constants/index.js +5 -1
  70. package/esm/contracts.d.ts +2882 -23
  71. package/esm/contracts.js +9 -0
  72. package/esm/helpers/morphoBlueHelpers/index.js +66 -66
  73. package/esm/index.d.ts +2 -1
  74. package/esm/index.js +2 -1
  75. package/esm/liquity/index.d.ts +11 -0
  76. package/esm/liquity/index.js +38 -1
  77. package/esm/liquityV2/index.d.ts +8 -0
  78. package/esm/liquityV2/index.js +162 -1
  79. package/esm/markets/aave/marketAssets.js +1 -1
  80. package/esm/markets/compound/marketsAssets.js +2 -2
  81. package/esm/markets/spark/marketAssets.js +1 -1
  82. package/esm/morphoBlue/index.d.ts +5 -0
  83. package/esm/morphoBlue/index.js +38 -5
  84. package/esm/portfolio/index.d.ts +6 -1
  85. package/esm/portfolio/index.js +260 -14
  86. package/esm/services/utils.d.ts +5 -0
  87. package/esm/services/utils.js +31 -0
  88. package/esm/services/viem.d.ts +12 -12
  89. package/esm/spark/index.js +1 -0
  90. package/esm/staking/staking.js +3 -1
  91. package/esm/types/claiming.d.ts +93 -0
  92. package/esm/types/claiming.js +24 -0
  93. package/esm/umbrella/index.d.ts +5 -0
  94. package/esm/umbrella/index.js +46 -0
  95. package/esm/umbrella/umbrellaUtils.d.ts +22 -0
  96. package/esm/umbrella/umbrellaUtils.js +28 -0
  97. package/package.json +47 -47
  98. package/src/aaveV2/index.ts +237 -236
  99. package/src/aaveV3/index.ts +586 -488
  100. package/src/claiming/aaveV3.ts +163 -0
  101. package/src/claiming/compV3.ts +23 -0
  102. package/src/claiming/index.ts +13 -0
  103. package/src/claiming/king.ts +66 -0
  104. package/src/claiming/morphoBlue.ts +119 -0
  105. package/src/claiming/spark.ts +226 -0
  106. package/src/compoundV2/index.ts +240 -240
  107. package/src/compoundV3/index.ts +270 -270
  108. package/src/config/contracts.ts +1208 -1108
  109. package/src/constants/index.ts +10 -6
  110. package/src/contracts.ts +121 -108
  111. package/src/curveUsd/index.ts +250 -250
  112. package/src/eulerV2/index.ts +314 -314
  113. package/src/exchange/index.ts +25 -25
  114. package/src/fluid/index.ts +1568 -1568
  115. package/src/helpers/aaveHelpers/index.ts +170 -170
  116. package/src/helpers/compoundHelpers/index.ts +261 -261
  117. package/src/helpers/curveUsdHelpers/index.ts +40 -40
  118. package/src/helpers/eulerHelpers/index.ts +259 -259
  119. package/src/helpers/fluidHelpers/index.ts +324 -324
  120. package/src/helpers/index.ts +10 -10
  121. package/src/helpers/liquityV2Helpers/index.ts +80 -80
  122. package/src/helpers/llamaLendHelpers/index.ts +53 -53
  123. package/src/helpers/makerHelpers/index.ts +52 -52
  124. package/src/helpers/morphoBlueHelpers/index.ts +390 -390
  125. package/src/helpers/sparkHelpers/index.ts +155 -155
  126. package/src/index.ts +47 -45
  127. package/src/liquity/index.ts +160 -105
  128. package/src/liquityV2/index.ts +583 -408
  129. package/src/llamaLend/index.ts +296 -296
  130. package/src/maker/index.ts +223 -223
  131. package/src/markets/aave/index.ts +116 -116
  132. package/src/markets/aave/marketAssets.ts +49 -49
  133. package/src/markets/compound/index.ts +227 -227
  134. package/src/markets/compound/marketsAssets.ts +90 -90
  135. package/src/markets/curveUsd/index.ts +69 -69
  136. package/src/markets/euler/index.ts +26 -26
  137. package/src/markets/fluid/index.ts +2456 -2456
  138. package/src/markets/index.ts +25 -25
  139. package/src/markets/liquityV2/index.ts +102 -102
  140. package/src/markets/llamaLend/contractAddresses.ts +141 -141
  141. package/src/markets/llamaLend/index.ts +235 -235
  142. package/src/markets/morphoBlue/index.ts +895 -895
  143. package/src/markets/spark/index.ts +29 -29
  144. package/src/markets/spark/marketAssets.ts +11 -11
  145. package/src/moneymarket/moneymarketCommonService.ts +80 -80
  146. package/src/morphoBlue/index.ts +259 -222
  147. package/src/portfolio/index.ts +533 -285
  148. package/src/services/priceService.ts +159 -159
  149. package/src/services/utils.ts +100 -64
  150. package/src/services/viem.ts +32 -32
  151. package/src/setup.ts +8 -8
  152. package/src/spark/index.ts +457 -456
  153. package/src/staking/staking.ts +194 -193
  154. package/src/types/aave.ts +194 -194
  155. package/src/types/claiming.ts +109 -0
  156. package/src/types/common.ts +88 -88
  157. package/src/types/compound.ts +136 -136
  158. package/src/types/curveUsd.ts +121 -121
  159. package/src/types/euler.ts +174 -174
  160. package/src/types/fluid.ts +450 -450
  161. package/src/types/index.ts +11 -11
  162. package/src/types/liquity.ts +30 -30
  163. package/src/types/liquityV2.ts +126 -126
  164. package/src/types/llamaLend.ts +157 -157
  165. package/src/types/maker.ts +63 -63
  166. package/src/types/morphoBlue.ts +194 -194
  167. package/src/types/portfolio.ts +60 -60
  168. package/src/types/spark.ts +137 -137
  169. package/src/umbrella/index.ts +70 -0
  170. package/src/umbrella/umbrellaUtils.ts +30 -0
@@ -10,22 +10,28 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  import Dec from 'decimal.js';
11
11
  import { NetworkNumber } from '../types/common';
12
12
  import { AaveMarkets, CompoundMarkets, CrvUsdMarkets, EulerV2Markets, LlamaLendMarkets, MorphoBlueMarkets, SparkMarkets, } from '../markets';
13
- import { _getMorphoBlueAccountData, _getMorphoBlueMarketData } from '../morphoBlue';
13
+ import { _getMorphoBlueAccountData, _getMorphoBlueMarketData, getMorphoEarn } from '../morphoBlue';
14
14
  import { AaveVersions, CompoundVersions, } from '../types';
15
15
  import { _getCompoundV3AccountData, _getCompoundV3MarketsData } from '../compoundV3';
16
16
  import { _getSparkAccountData, _getSparkMarketsData } from '../spark';
17
17
  import { _getEulerV2AccountData, _getEulerV2MarketsData } from '../eulerV2';
18
18
  import { _getCurveUsdGlobalData, _getCurveUsdUserData } from '../curveUsd';
19
19
  import { _getLlamaLendGlobalData, _getLlamaLendUserData } from '../llamaLend';
20
- import { _getAaveV3AccountData, _getAaveV3MarketData } from '../aaveV3';
20
+ import { _getAaveV3AccountData, _getAaveV3MarketData, getStakeAaveData } from '../aaveV3';
21
21
  import { ZERO_ADDRESS } from '../constants';
22
22
  import { _getMakerCdpData, _getUserCdps } from '../maker';
23
23
  import { _getAaveV2AccountData, _getAaveV2MarketsData } from '../aaveV2';
24
24
  import { _getCompoundV2AccountData, _getCompoundV2MarketsData } from '../compoundV2';
25
25
  import { getViemProvider } from '../services/viem';
26
- import { _getLiquityTroveInfo } from '../liquity';
27
- import { _getUserPositionsPortfolio } from '../fluid';
26
+ import { _getLiquityTroveInfo, getLiquityStakingData } from '../liquity';
27
+ import { _getAllUserEarnPositionsWithFTokens, _getUserPositionsPortfolio } from '../fluid';
28
28
  import { getEulerV2SubAccounts } from '../helpers/eulerHelpers';
29
+ import { getUmbrellaData } from '../umbrella';
30
+ import { getMeritUnclaimedRewards, getUnclaimedRewardsForAllMarkets } from '../claiming/aaveV3';
31
+ import { getCompoundV3Rewards } from '../claiming/compV3';
32
+ import { fetchSparkAirdropRewards, fetchSparkRewards } from '../claiming/spark';
33
+ import { fetchMorphoBlueRewards } from '../claiming/morphoBlue';
34
+ import { getKingRewards } from '../claiming/king';
29
35
  export function getPortfolioData(provider, network, defaultProvider, addresses, summerFiAddresses) {
30
36
  return __awaiter(this, void 0, void 0, function* () {
31
37
  const isMainnet = network === NetworkNumber.Eth;
@@ -63,7 +69,20 @@ export function getPortfolioData(provider, network, defaultProvider, addresses,
63
69
  const compoundV2MarketsData = {};
64
70
  const crvUsdMarketsData = {};
65
71
  const llamaLendMarketsData = {};
72
+ const markets = {
73
+ morphoMarketsData,
74
+ compoundV3MarketsData,
75
+ sparkMarketsData,
76
+ eulerV2MarketsData,
77
+ aaveV3MarketsData,
78
+ aaveV2MarketsData,
79
+ compoundV2MarketsData,
80
+ crvUsdMarketsData,
81
+ llamaLendMarketsData,
82
+ };
66
83
  const positions = {};
84
+ const stakingPositions = {};
85
+ const rewardsData = {};
67
86
  const allAddresses = [...addresses, ...summerFiAddresses];
68
87
  for (const address of allAddresses) {
69
88
  positions[address.toLowerCase()] = {
@@ -84,7 +103,33 @@ export function getPortfolioData(provider, network, defaultProvider, addresses,
84
103
  },
85
104
  };
86
105
  }
106
+ // TODO: check default values, probably needed when fetching portfolio on unsupported networks
107
+ for (const address of addresses) {
108
+ stakingPositions[address.toLowerCase()] = {
109
+ aaveV3: {},
110
+ morphoBlue: {},
111
+ compoundV3: {},
112
+ spark: {},
113
+ aaveV2: {},
114
+ compoundV2: {},
115
+ liquity: {},
116
+ fluid: {
117
+ error: '',
118
+ data: {},
119
+ },
120
+ };
121
+ rewardsData[address.toLowerCase()] = {
122
+ aaveV3merit: {},
123
+ aaveV3: {},
124
+ compV3: {},
125
+ spark: {},
126
+ spk: {},
127
+ king: {},
128
+ morpho: {},
129
+ };
130
+ }
87
131
  yield Promise.allSettled([
132
+ // === MARKET DATA (needs to be fetched first) ===
88
133
  ...morphoMarkets.map((market) => __awaiter(this, void 0, void 0, function* () {
89
134
  const marketData = yield _getMorphoBlueMarketData(client, network, market);
90
135
  morphoMarketsData[market.value] = marketData;
@@ -105,12 +150,6 @@ export function getPortfolioData(provider, network, defaultProvider, addresses,
105
150
  const marketData = yield _getAaveV3MarketData(client, network, market);
106
151
  aaveV3MarketsData[market.value] = marketData;
107
152
  })),
108
- ...addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
109
- if (!isMainnet)
110
- return; // Maker CDPs are only available on mainnet
111
- const makerCdp = yield _getUserCdps(client, network, address);
112
- makerCdps[address.toLowerCase()] = makerCdp;
113
- })),
114
153
  ...aaveV2Markets.map((market) => __awaiter(this, void 0, void 0, function* () {
115
154
  const marketData = yield _getAaveV2MarketsData(client, network, market);
116
155
  aaveV2MarketsData[market.value] = marketData;
@@ -127,6 +166,13 @@ export function getPortfolioData(provider, network, defaultProvider, addresses,
127
166
  const marketData = yield _getLlamaLendGlobalData(client, network, market);
128
167
  llamaLendMarketsData[market.value] = marketData;
129
168
  })),
169
+ // === INDEPENDENT USER DATA (doesn't depend on market data) ===
170
+ ...addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
171
+ if (!isMainnet)
172
+ return; // Maker CDPs are only available on mainnet
173
+ const makerCdp = yield _getUserCdps(client, network, address);
174
+ makerCdps[address.toLowerCase()] = makerCdp;
175
+ })),
130
176
  ...addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
131
177
  try {
132
178
  if (!isFluidSupported)
@@ -146,6 +192,178 @@ export function getPortfolioData(provider, network, defaultProvider, addresses,
146
192
  };
147
193
  }
148
194
  })),
195
+ // === STAKING DATA (independent of market data) ===
196
+ ...addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
197
+ try {
198
+ if (!isFluidSupported)
199
+ return;
200
+ const fluidLendData = yield _getAllUserEarnPositionsWithFTokens(client, network, address);
201
+ stakingPositions[address.toLowerCase()].fluid = fluidLendData;
202
+ }
203
+ catch (error) {
204
+ console.error(`Error fetching Fluid lend data for address ${address}:`, error);
205
+ stakingPositions[address.toLowerCase()].fluid = { error: `Error fetching Fluid lend data for address ${address}`, data: null };
206
+ }
207
+ })),
208
+ ...addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
209
+ try {
210
+ if (!isMainnet)
211
+ return;
212
+ const liquityStakingData = yield getLiquityStakingData(client, network, address);
213
+ stakingPositions[address.toLowerCase()].liquity = liquityStakingData;
214
+ }
215
+ catch (error) {
216
+ console.error(`Error fetching Liquity staking data for address ${address}:`, error);
217
+ stakingPositions[address.toLowerCase()].liquity = { error: `Error fetching Liquity staking data for address ${address}`, data: null };
218
+ }
219
+ })),
220
+ ...addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
221
+ try {
222
+ if (!isMainnet)
223
+ return;
224
+ stakingPositions[address.toLowerCase()].aaveV3 = yield getStakeAaveData(client, network, address);
225
+ }
226
+ catch (error) {
227
+ console.error(`Error fetching Aave V3 staking data for address ${address}:`, error);
228
+ stakingPositions[address.toLowerCase()].aaveV3 = { error: `Error fetching Aave V3 staking data for address ${address}`, data: null };
229
+ }
230
+ })),
231
+ ...addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
232
+ try {
233
+ if (!isMainnet)
234
+ return;
235
+ const umbrellaStakingData = yield getUmbrellaData(client, network, address);
236
+ stakingPositions[address.toLowerCase()].umbrella = umbrellaStakingData;
237
+ }
238
+ catch (error) {
239
+ console.error(`Error fetching Umbrella staking data for address ${address}:`, error);
240
+ stakingPositions[address.toLowerCase()].umbrella = { error: `Error fetching Umbrella staking data for address ${address}`, data: null };
241
+ }
242
+ })),
243
+ // === REWARDS DATA (independent of market data) ===
244
+ // Batch King rewards
245
+ (() => __awaiter(this, void 0, void 0, function* () {
246
+ try {
247
+ if (!isMainnet) {
248
+ for (const address of addresses) {
249
+ rewardsData[address.toLowerCase()].king = { error: '', data: [] };
250
+ }
251
+ return;
252
+ }
253
+ const kingRewards = yield getKingRewards(client, network, addresses);
254
+ for (const address of addresses) {
255
+ const lowerAddress = address.toLowerCase();
256
+ rewardsData[lowerAddress].king = {
257
+ error: '',
258
+ data: kingRewards[lowerAddress] || [],
259
+ };
260
+ }
261
+ }
262
+ catch (error) {
263
+ console.error('Error fetching King rewards data in batch:', error);
264
+ for (const address of addresses) {
265
+ rewardsData[address.toLowerCase()].king = {
266
+ error: 'Error fetching King rewards data in batch',
267
+ data: null,
268
+ };
269
+ }
270
+ }
271
+ }))(),
272
+ ...sparkMarkets.map((market) => addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
273
+ try {
274
+ if (!isMainnet) {
275
+ rewardsData[address.toLowerCase()].spark[market.value] = { error: '', data: [] };
276
+ return;
277
+ }
278
+ const sparkData = yield fetchSparkRewards(client, network, address, market.providerAddress);
279
+ rewardsData[address.toLowerCase()].spark[market.value] = { error: '', data: sparkData };
280
+ }
281
+ catch (error) {
282
+ console.error(`Error fetching Spark rewards data for address ${address}, market ${market.value}:`, error);
283
+ rewardsData[address.toLowerCase()].spark[market.value] = { error: `Error fetching Spark rewards data for address ${address}`, data: null };
284
+ }
285
+ }))).flat(),
286
+ // CompV3 rewards
287
+ ...compoundV3Markets.map(market => addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
288
+ try {
289
+ const compV3Rewards = yield getCompoundV3Rewards(client, network, address, market.baseMarketAddress);
290
+ rewardsData[address.toLowerCase()].compV3[market.value] = { error: '', data: compV3Rewards };
291
+ }
292
+ catch (error) {
293
+ console.error(`Error fetching Compound V3 rewards data for address ${address}:`, error);
294
+ rewardsData[address.toLowerCase()].compV3[market.value] = { error: `Error fetching Compound V3 rewards data for address ${address}`, data: null };
295
+ }
296
+ }))).flat(),
297
+ ...addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
298
+ try {
299
+ const aaveMeritData = yield getMeritUnclaimedRewards(address, network);
300
+ rewardsData[address.toLowerCase()].aaveV3merit = { error: '', data: aaveMeritData };
301
+ }
302
+ catch (error) {
303
+ console.error(`Error fetching Aave V3 Merit rewards data for address ${address}:`, error);
304
+ rewardsData[address.toLowerCase()].aaveV3merit = { error: `Error fetching Aave V3 Merit rewards data for address ${address}`, data: null };
305
+ }
306
+ })),
307
+ ...aaveV3Markets.map(market => addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
308
+ try {
309
+ const aaveData = yield getUnclaimedRewardsForAllMarkets(client, network, address, market.providerAddress);
310
+ rewardsData[address.toLowerCase()].aaveV3[market.value] = { error: '', data: aaveData };
311
+ }
312
+ catch (error) {
313
+ console.error(`Error fetching Aave V3 Merit rewards data for address ${address}:`, error);
314
+ rewardsData[address.toLowerCase()].aaveV3 = { error: `Error fetching Aave V3 rewards data for address ${address}`, data: null };
315
+ }
316
+ }))).flat(),
317
+ // Batch Morpho Blue rewards
318
+ (() => __awaiter(this, void 0, void 0, function* () {
319
+ try {
320
+ const morphoRewards = yield fetchMorphoBlueRewards(client, network, addresses);
321
+ for (const address of addresses) {
322
+ const lowerAddress = address.toLowerCase();
323
+ rewardsData[lowerAddress].morpho = {
324
+ error: '',
325
+ data: morphoRewards[lowerAddress] || [],
326
+ };
327
+ }
328
+ }
329
+ catch (error) {
330
+ console.error('Error fetching Morpho Blue rewards data in batch:', error);
331
+ for (const address of addresses) {
332
+ rewardsData[address.toLowerCase()].morpho = {
333
+ error: 'Error fetching Morpho Blue rewards data in batch',
334
+ data: null,
335
+ };
336
+ }
337
+ }
338
+ }))(),
339
+ // Batch Spark Airdrop rewards
340
+ (() => __awaiter(this, void 0, void 0, function* () {
341
+ try {
342
+ if (!isMainnet) {
343
+ for (const address of addresses) {
344
+ rewardsData[address.toLowerCase()].king = { error: '', data: [] };
345
+ }
346
+ return;
347
+ }
348
+ const sparkAirdropRewards = yield fetchSparkAirdropRewards(client, network, addresses);
349
+ for (const address of addresses) {
350
+ const lowerAddress = address.toLowerCase();
351
+ rewardsData[lowerAddress].spk = {
352
+ error: '',
353
+ data: sparkAirdropRewards[lowerAddress] || [],
354
+ };
355
+ }
356
+ }
357
+ catch (error) {
358
+ console.error('Error fetching Spark Airdrop rewards data in batch:', error);
359
+ for (const address of addresses) {
360
+ rewardsData[address.toLowerCase()].spk = {
361
+ error: 'Error fetching Spark Airdrop rewards data in batch',
362
+ data: null,
363
+ };
364
+ }
365
+ }
366
+ }))(),
149
367
  ]);
150
368
  yield Promise.all([
151
369
  ...aaveV3Markets.map((market) => allAddresses.map((address) => __awaiter(this, void 0, void 0, function* () {
@@ -161,9 +379,32 @@ export function getPortfolioData(provider, network, defaultProvider, addresses,
161
379
  }))).flat(),
162
380
  ...morphoMarkets.map((market) => addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
163
381
  try {
164
- const accData = yield _getMorphoBlueAccountData(client, network, address, market, morphoMarketsData[market.value]);
165
- if (new Dec(accData.suppliedUsd).gt(0))
166
- positions[address.toLowerCase()].morphoBlue[market.value] = { error: '', data: accData };
382
+ const [accDataPromise, earnDataPromise] = yield Promise.allSettled([
383
+ _getMorphoBlueAccountData(client, network, address, market, morphoMarketsData[market.value]),
384
+ getMorphoEarn(client, network, address, market, morphoMarketsData[market.value]),
385
+ ]);
386
+ if (accDataPromise.status === 'rejected') {
387
+ console.error(`Error fetching MorphoBlue account data for address ${address} on market ${market.value}:`, accDataPromise.reason);
388
+ positions[address.toLowerCase()].morphoBlue[market.value] = { error: `Error fetching MorphoBlue account data for address ${address} on market ${market.value}`, data: null };
389
+ }
390
+ if (earnDataPromise.status === 'rejected') {
391
+ console.error(`Error fetching MorphoBlue account data for address ${address} on market ${market.value}:`, earnDataPromise.reason);
392
+ positions[address.toLowerCase()].morphoBlue[market.value] = { error: `Error fetching MorphoBlue account data for address ${address} on market ${market.value}`, data: null };
393
+ }
394
+ if (accDataPromise.status !== 'rejected') {
395
+ const accData = accDataPromise.value;
396
+ if (new Dec(accData.suppliedUsd).gt(0))
397
+ positions[address.toLowerCase()].morphoBlue[market.value] = { error: '', data: accData };
398
+ }
399
+ if (earnDataPromise.status !== 'rejected') {
400
+ const earnData = earnDataPromise.value;
401
+ if (earnData && new Dec(earnData.amount).gt(0)) {
402
+ stakingPositions[address.toLowerCase()].morphoBlue[market.value] = {
403
+ error: '',
404
+ data: earnData,
405
+ };
406
+ }
407
+ }
167
408
  }
168
409
  catch (error) {
169
410
  console.error(`Error fetching MorphoBlue account data for address ${address} on market ${market.value}:`, error);
@@ -289,6 +530,11 @@ export function getPortfolioData(provider, network, defaultProvider, addresses,
289
530
  }
290
531
  }))).flat(),
291
532
  ]);
292
- return positions;
533
+ return {
534
+ positions,
535
+ stakingPositions,
536
+ rewardsData,
537
+ markets,
538
+ };
293
539
  });
294
540
  }
@@ -25,3 +25,8 @@ export declare const MAXUINT: string;
25
25
  export declare const isMaxuint: (amount: string) => boolean;
26
26
  export declare const isMainnetNetwork: (network: NetworkNumber) => network is NetworkNumber.Eth;
27
27
  export declare const DEFAULT_TIMEOUT = 2000;
28
+ /**
29
+ * Converts web3 hybrid response (that can be used as objects and arrays, so has duplicated values) to objects.
30
+ * @param value
31
+ */
32
+ export declare const convertHybridArraysToObjects: (value: any) => any;
@@ -38,3 +38,34 @@ export const MAXUINT = '11579208923731619542357098500868790785326998466564056403
38
38
  export const isMaxuint = (amount) => compareAddresses(MAXUINT, amount);
39
39
  export const isMainnetNetwork = (network) => network === NetworkNumber.Eth;
40
40
  export const DEFAULT_TIMEOUT = 2000; // 2 seconds
41
+ /**
42
+ * Converts web3 hybrid response (that can be used as objects and arrays, so has duplicated values) to objects.
43
+ * @param value
44
+ */
45
+ export const convertHybridArraysToObjects = (value) => {
46
+ if (Array.isArray(value)) {
47
+ const keys = Object.keys(value);
48
+ const hasNamedKeys = keys.some((key) => Number.isNaN(Number(key)));
49
+ // If array has named keys, treat it as an object and keep only those
50
+ if (hasNamedKeys) {
51
+ const result = {};
52
+ for (const [key, val] of Object.entries(value)) {
53
+ if (Number.isNaN(Number(key))) {
54
+ result[key] = convertHybridArraysToObjects(val);
55
+ }
56
+ }
57
+ return result;
58
+ }
59
+ // Else, treat as a regular array
60
+ return value.map(convertHybridArraysToObjects);
61
+ }
62
+ // If it's an object (but not an array), recurse into its values
63
+ if (value && typeof value === 'object') {
64
+ const result = {};
65
+ for (const [key, val] of Object.entries(value)) {
66
+ result[key] = convertHybridArraysToObjects(val);
67
+ }
68
+ return result;
69
+ }
70
+ return value;
71
+ };
@@ -795,9 +795,9 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
795
795
  s: import("viem").Hex;
796
796
  value: bigint;
797
797
  v: bigint;
798
+ nonce: number;
798
799
  type: "legacy";
799
800
  gas: bigint;
800
- nonce: number;
801
801
  maxFeePerBlobGas?: undefined | undefined;
802
802
  gasPrice: bigint;
803
803
  maxFeePerGas?: undefined | undefined;
@@ -820,9 +820,9 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
820
820
  s: import("viem").Hex;
821
821
  value: bigint;
822
822
  v: bigint;
823
+ nonce: number;
823
824
  type: "eip2930";
824
825
  gas: bigint;
825
- nonce: number;
826
826
  maxFeePerBlobGas?: undefined | undefined;
827
827
  gasPrice: bigint;
828
828
  maxFeePerGas?: undefined | undefined;
@@ -845,9 +845,9 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
845
845
  s: import("viem").Hex;
846
846
  value: bigint;
847
847
  v: bigint;
848
+ nonce: number;
848
849
  type: "eip1559";
849
850
  gas: bigint;
850
- nonce: number;
851
851
  maxFeePerBlobGas?: undefined | undefined;
852
852
  gasPrice?: undefined | undefined;
853
853
  maxFeePerGas: bigint;
@@ -870,9 +870,9 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
870
870
  s: import("viem").Hex;
871
871
  value: bigint;
872
872
  v: bigint;
873
+ nonce: number;
873
874
  type: "eip4844";
874
875
  gas: bigint;
875
- nonce: number;
876
876
  maxFeePerBlobGas: bigint;
877
877
  gasPrice?: undefined | undefined;
878
878
  maxFeePerGas: bigint;
@@ -895,9 +895,9 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
895
895
  s: import("viem").Hex;
896
896
  value: bigint;
897
897
  v: bigint;
898
+ nonce: number;
898
899
  type: "eip7702";
899
900
  gas: bigint;
900
- nonce: number;
901
901
  maxFeePerBlobGas?: undefined | undefined;
902
902
  gasPrice?: undefined | undefined;
903
903
  maxFeePerGas: bigint;
@@ -945,9 +945,9 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
945
945
  s: import("viem").Hex;
946
946
  value: bigint;
947
947
  v: bigint;
948
+ nonce: number;
948
949
  type: "legacy";
949
950
  gas: bigint;
950
- nonce: number;
951
951
  maxFeePerBlobGas?: undefined | undefined;
952
952
  gasPrice: bigint;
953
953
  maxFeePerGas?: undefined | undefined;
@@ -970,9 +970,9 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
970
970
  s: import("viem").Hex;
971
971
  value: bigint;
972
972
  v: bigint;
973
+ nonce: number;
973
974
  type: "eip2930";
974
975
  gas: bigint;
975
- nonce: number;
976
976
  maxFeePerBlobGas?: undefined | undefined;
977
977
  gasPrice: bigint;
978
978
  maxFeePerGas?: undefined | undefined;
@@ -995,9 +995,9 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
995
995
  s: import("viem").Hex;
996
996
  value: bigint;
997
997
  v: bigint;
998
+ nonce: number;
998
999
  type: "eip1559";
999
1000
  gas: bigint;
1000
- nonce: number;
1001
1001
  maxFeePerBlobGas?: undefined | undefined;
1002
1002
  gasPrice?: undefined | undefined;
1003
1003
  maxFeePerGas: bigint;
@@ -1020,9 +1020,9 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
1020
1020
  s: import("viem").Hex;
1021
1021
  value: bigint;
1022
1022
  v: bigint;
1023
+ nonce: number;
1023
1024
  type: "eip4844";
1024
1025
  gas: bigint;
1025
- nonce: number;
1026
1026
  maxFeePerBlobGas: bigint;
1027
1027
  gasPrice?: undefined | undefined;
1028
1028
  maxFeePerGas: bigint;
@@ -1045,9 +1045,9 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
1045
1045
  s: import("viem").Hex;
1046
1046
  value: bigint;
1047
1047
  v: bigint;
1048
+ nonce: number;
1048
1049
  type: "eip7702";
1049
1050
  gas: bigint;
1050
- nonce: number;
1051
1051
  maxFeePerBlobGas?: undefined | undefined;
1052
1052
  gasPrice?: undefined | undefined;
1053
1053
  maxFeePerGas: bigint;
@@ -4320,7 +4320,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
4320
4320
  authorizationList: import("viem").TransactionSerializableEIP7702["authorizationList"];
4321
4321
  } ? "eip7702" : never) | (request["type"] extends string | undefined ? Extract<request["type"], string> : never)>) ? T_25 extends "eip7702" ? import("viem").TransactionRequestEIP7702 : never : never : never)>> & {
4322
4322
  chainId?: number | undefined;
4323
- }, (request["parameters"] extends readonly import("viem").PrepareTransactionRequestParameterType[] ? request["parameters"][number] : "type" | "gas" | "nonce" | "blobVersionedHashes" | "fees" | "chainId") extends infer T_26 ? T_26 extends (request["parameters"] extends readonly import("viem").PrepareTransactionRequestParameterType[] ? request["parameters"][number] : "type" | "gas" | "nonce" | "blobVersionedHashes" | "fees" | "chainId") ? T_26 extends "fees" ? "gasPrice" | "maxFeePerGas" | "maxPriorityFeePerGas" : T_26 : never : never> & (unknown extends request["kzg"] ? {} : Pick<request, "kzg">) extends infer T ? { [K in keyof T]: (import("viem").UnionRequiredBy<Extract<import("viem").UnionOmit<import("viem").ExtractChainFormatterParameters<import("viem").DeriveChain<undefined, chainOverride>, "transactionRequest", import("viem").TransactionRequest>, "from"> & (import("viem").DeriveChain<undefined, chainOverride> extends infer T_1 ? T_1 extends import("viem").DeriveChain<undefined, chainOverride> ? T_1 extends import("viem").Chain ? {
4323
+ }, (request["parameters"] extends readonly import("viem").PrepareTransactionRequestParameterType[] ? request["parameters"][number] : "nonce" | "type" | "gas" | "blobVersionedHashes" | "fees" | "chainId") extends infer T_26 ? T_26 extends (request["parameters"] extends readonly import("viem").PrepareTransactionRequestParameterType[] ? request["parameters"][number] : "nonce" | "type" | "gas" | "blobVersionedHashes" | "fees" | "chainId") ? T_26 extends "fees" ? "gasPrice" | "maxFeePerGas" | "maxPriorityFeePerGas" : T_26 : never : never> & (unknown extends request["kzg"] ? {} : Pick<request, "kzg">) extends infer T ? { [K in keyof T]: (import("viem").UnionRequiredBy<Extract<import("viem").UnionOmit<import("viem").ExtractChainFormatterParameters<import("viem").DeriveChain<undefined, chainOverride>, "transactionRequest", import("viem").TransactionRequest>, "from"> & (import("viem").DeriveChain<undefined, chainOverride> extends infer T_1 ? T_1 extends import("viem").DeriveChain<undefined, chainOverride> ? T_1 extends import("viem").Chain ? {
4324
4324
  chain: T_1;
4325
4325
  } : {
4326
4326
  chain?: undefined;
@@ -7572,7 +7572,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
7572
7572
  authorizationList: import("viem").TransactionSerializableEIP7702["authorizationList"];
7573
7573
  } ? "eip7702" : never) | (request["type"] extends string | undefined ? Extract<request["type"], string> : never)>) ? T_12 extends "eip7702" ? import("viem").TransactionRequestEIP7702 : never : never : never)>> & {
7574
7574
  chainId?: number | undefined;
7575
- }, (request["parameters"] extends readonly import("viem").PrepareTransactionRequestParameterType[] ? request["parameters"][number] : "type" | "gas" | "nonce" | "blobVersionedHashes" | "fees" | "chainId") extends infer T_13 ? T_13 extends (request["parameters"] extends readonly import("viem").PrepareTransactionRequestParameterType[] ? request["parameters"][number] : "type" | "gas" | "nonce" | "blobVersionedHashes" | "fees" | "chainId") ? T_13 extends "fees" ? "gasPrice" | "maxFeePerGas" | "maxPriorityFeePerGas" : T_13 : never : never> & (unknown extends request["kzg"] ? {} : Pick<request, "kzg">))[K]; } : never>;
7575
+ }, (request["parameters"] extends readonly import("viem").PrepareTransactionRequestParameterType[] ? request["parameters"][number] : "nonce" | "type" | "gas" | "blobVersionedHashes" | "fees" | "chainId") extends infer T_13 ? T_13 extends (request["parameters"] extends readonly import("viem").PrepareTransactionRequestParameterType[] ? request["parameters"][number] : "nonce" | "type" | "gas" | "blobVersionedHashes" | "fees" | "chainId") ? T_13 extends "fees" ? "gasPrice" | "maxFeePerGas" | "maxPriorityFeePerGas" : T_13 : never : never> & (unknown extends request["kzg"] ? {} : Pick<request, "kzg">))[K]; } : never>;
7576
7576
  readContract: <const abi extends import("viem").Abi | readonly unknown[], functionName extends import("viem").ContractFunctionName<abi, "pure" | "view">, const args extends import("viem").ContractFunctionArgs<abi, "pure" | "view", functionName>>(args: import("viem").ReadContractParameters<abi, functionName, args>) => Promise<import("viem").ReadContractReturnType<abi, functionName, args>>;
7577
7577
  sendRawTransaction: (args: import("viem").SendRawTransactionParameters) => Promise<import("viem").SendRawTransactionReturnType>;
7578
7578
  simulate: <const calls extends readonly unknown[]>(args: import("viem").SimulateBlocksParameters<calls>) => Promise<import("viem").SimulateBlocksReturnType<calls>>;
@@ -245,6 +245,7 @@ export const _getSparkAccountBalances = (provider, network, block, addressMappin
245
245
  const marketAddress = market.providerAddress;
246
246
  // @ts-ignore
247
247
  const protocolDataProviderContract = createViemContractFromConfigFunc(market.protocolData, market.protocolDataAddress)(provider, network);
248
+ // @ts-ignore
248
249
  const reserveTokens = yield protocolDataProviderContract.read.getAllReservesTokens(setViemBlockNumber(block));
249
250
  const symbols = reserveTokens.map(({ symbol }) => symbol);
250
251
  const _addresses = reserveTokens.map(({ tokenAddress }) => tokenAddress);
@@ -59,7 +59,7 @@ const getApyFromDfsApi = (asset) => __awaiter(void 0, void 0, void 0, function*
59
59
  return '0';
60
60
  }
61
61
  });
62
- export const STAKING_ASSETS = ['cbETH', 'wstETH', 'cbETH', 'rETH', 'sDAI', 'weETH', 'sUSDe', 'osETH', 'ezETH', 'ETHx', 'rsETH', 'pufETH', 'wrsETH', 'wsuperOETHb', 'sUSDS', 'tETH', 'PT sUSDe Sep', 'PT USDe Sep', 'PT sUSDe Nov'];
62
+ export const STAKING_ASSETS = ['cbETH', 'wstETH', 'cbETH', 'rETH', 'sDAI', 'weETH', 'sUSDe', 'osETH', 'ezETH', 'ETHx', 'rsETH', 'pufETH', 'wrsETH', 'wsuperOETHb', 'sUSDS', 'tETH', 'PT sUSDe Sep', 'PT USDe Sep', 'PT sUSDe Nov', 'PT USDe Nov'];
63
63
  export const getStakingApy = memoize((asset) => __awaiter(void 0, void 0, void 0, function* () {
64
64
  try {
65
65
  if (asset === 'stETH' || asset === 'wstETH')
@@ -106,6 +106,8 @@ export const getStakingApy = memoize((asset) => __awaiter(void 0, void 0, void 0
106
106
  return yield getApyFromDfsApi('USDe');
107
107
  if (asset === 'PT sUSDe Nov')
108
108
  return yield getApyFromDfsApi('PT sUSDe Nov');
109
+ if (asset === 'PT USDe Nov')
110
+ return yield getApyFromDfsApi('PT USDe Nov');
109
111
  }
110
112
  catch (e) {
111
113
  console.error(`Failed to fetch APY for ${asset}`);
@@ -0,0 +1,93 @@
1
+ import { EthAddress } from './common';
2
+ export declare enum ClaimType {
3
+ /** Rewards from AAVE - various tokens & aTokens (supplied to protocol) */
4
+ AAVE_REWARDS = "AAVE_REWARDS",
5
+ /** Merit rewards from AAVE (various tokens) */
6
+ AAVE_MERIT_REWARDS = "AAVE_MERIT_REWARDS",
7
+ /** Rewards from Compound V3 (only in COMP) */
8
+ COMPOUND_V3_COMP = "COMPOUND_V3_COMP",
9
+ /** Rewards from Spark (wstETH only for now) */
10
+ SPARK_REWARDS = "SPARK_REWARDS",
11
+ /** Rewards from Morpho */
12
+ MORPHO = "MORPHO",
13
+ /** Rewards from King (prev LTR^2 - received for weETH holding) */
14
+ KING_REWARDS = "KING_REWARDS",
15
+ /** Spark Airdrop */
16
+ SPARK_AIRDROP = "SPARK_AIRDROP",
17
+ /** Spark Airdrop */
18
+ SPARK_WST_ETH_REWARDS = "SPARK_WST_ETH_REWARDS"
19
+ }
20
+ type _ClaimableTokenPartial = {
21
+ symbol: string;
22
+ underlyingSymbol: string;
23
+ tokenAddress: EthAddress;
24
+ amount: string;
25
+ walletAddress: EthAddress;
26
+ label: string;
27
+ };
28
+ export type AaveRewardsClaimableToken = _ClaimableTokenPartial & {
29
+ claimType: ClaimType.AAVE_REWARDS;
30
+ additionalClaimFields: {
31
+ marketAddress: EthAddress;
32
+ aTokenAddresses: string[];
33
+ isAaveToken: boolean;
34
+ };
35
+ };
36
+ export type AaveMeritRewardsClaimableToken = _ClaimableTokenPartial & {
37
+ claimType: ClaimType.AAVE_MERIT_REWARDS;
38
+ additionalClaimFields: {
39
+ accumulated: string;
40
+ proof: string[];
41
+ decimals: string;
42
+ unclaimed: string;
43
+ };
44
+ };
45
+ export type SparkRewardsClaimableToken = _ClaimableTokenPartial & {
46
+ claimType: ClaimType.SPARK_REWARDS;
47
+ additionalClaimFields: {
48
+ sparkAssetAddresses: string[];
49
+ };
50
+ };
51
+ export type KingRewardsClaimableToken = _ClaimableTokenPartial & {
52
+ claimType: ClaimType.KING_REWARDS;
53
+ additionalClaimFields: {
54
+ allRewardsAmount: string;
55
+ merkleRoot: string;
56
+ merkleProofs: string[];
57
+ };
58
+ };
59
+ export type MorphoClaimableToken = _ClaimableTokenPartial & {
60
+ claimType: ClaimType.MORPHO;
61
+ additionalClaimFields: {
62
+ originalAmount: string;
63
+ merkleProofs: string[];
64
+ distributor: EthAddress;
65
+ isLegacy: boolean;
66
+ txData: string;
67
+ };
68
+ };
69
+ export type CompoundV3CompClaimableToken = _ClaimableTokenPartial & {
70
+ claimType: ClaimType.COMPOUND_V3_COMP;
71
+ additionalClaimFields: {
72
+ marketAddress: EthAddress;
73
+ };
74
+ };
75
+ export declare enum SparkAirdropType {
76
+ SPARK_IGNITION = "spark-ignition",
77
+ PRE_FARMING_AND_SOCIAL = "pre-farming-and-social"
78
+ }
79
+ export type SparkAirdropClaimableToken = _ClaimableTokenPartial & {
80
+ claimType: ClaimType.SPARK_AIRDROP;
81
+ additionalClaimFields: {
82
+ merkleRoot: string;
83
+ merkleProofs: string[];
84
+ epoch: number;
85
+ rewardType: SparkAirdropType;
86
+ allRewardsAmount: string;
87
+ };
88
+ };
89
+ export type SparkWstEthRewardsClaimableToken = _ClaimableTokenPartial & {
90
+ claimType: ClaimType.SPARK_WST_ETH_REWARDS;
91
+ };
92
+ export type ClaimableToken = AaveRewardsClaimableToken | AaveMeritRewardsClaimableToken | CompoundV3CompClaimableToken | MorphoClaimableToken | SparkRewardsClaimableToken | KingRewardsClaimableToken | SparkAirdropClaimableToken | SparkWstEthRewardsClaimableToken;
93
+ export {};
@@ -0,0 +1,24 @@
1
+ export var ClaimType;
2
+ (function (ClaimType) {
3
+ /** Rewards from AAVE - various tokens & aTokens (supplied to protocol) */
4
+ ClaimType["AAVE_REWARDS"] = "AAVE_REWARDS";
5
+ /** Merit rewards from AAVE (various tokens) */
6
+ ClaimType["AAVE_MERIT_REWARDS"] = "AAVE_MERIT_REWARDS";
7
+ /** Rewards from Compound V3 (only in COMP) */
8
+ ClaimType["COMPOUND_V3_COMP"] = "COMPOUND_V3_COMP";
9
+ /** Rewards from Spark (wstETH only for now) */
10
+ ClaimType["SPARK_REWARDS"] = "SPARK_REWARDS";
11
+ /** Rewards from Morpho */
12
+ ClaimType["MORPHO"] = "MORPHO";
13
+ /** Rewards from King (prev LTR^2 - received for weETH holding) */
14
+ ClaimType["KING_REWARDS"] = "KING_REWARDS";
15
+ /** Spark Airdrop */
16
+ ClaimType["SPARK_AIRDROP"] = "SPARK_AIRDROP";
17
+ /** Spark Airdrop */
18
+ ClaimType["SPARK_WST_ETH_REWARDS"] = "SPARK_WST_ETH_REWARDS";
19
+ })(ClaimType || (ClaimType = {}));
20
+ export var SparkAirdropType;
21
+ (function (SparkAirdropType) {
22
+ SparkAirdropType["SPARK_IGNITION"] = "spark-ignition";
23
+ SparkAirdropType["PRE_FARMING_AND_SOCIAL"] = "pre-farming-and-social";
24
+ })(SparkAirdropType || (SparkAirdropType = {}));