@defisaver/positions-sdk 2.1.48 → 2.1.49-aave-v4-dev-2

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 (162) hide show
  1. package/.mocharc.json +4 -4
  2. package/.nvmrc +1 -1
  3. package/README.md +64 -64
  4. package/cjs/aaveV4/index.d.ts +7 -0
  5. package/cjs/aaveV4/index.js +167 -0
  6. package/cjs/config/contracts.d.ts +1277 -0
  7. package/cjs/config/contracts.js +9 -0
  8. package/cjs/contracts.d.ts +23120 -0
  9. package/cjs/contracts.js +2 -1
  10. package/cjs/helpers/aaveV4Helpers/index.d.ts +13 -0
  11. package/cjs/helpers/aaveV4Helpers/index.js +109 -0
  12. package/cjs/helpers/index.d.ts +1 -0
  13. package/cjs/helpers/index.js +2 -1
  14. package/cjs/helpers/morphoBlueHelpers/index.js +66 -66
  15. package/cjs/index.d.ts +2 -1
  16. package/cjs/index.js +3 -1
  17. package/cjs/markets/aave/marketAssets.js +1 -1
  18. package/cjs/markets/aaveV4/index.d.ts +7 -0
  19. package/cjs/markets/aaveV4/index.js +22 -0
  20. package/cjs/markets/index.d.ts +1 -0
  21. package/cjs/markets/index.js +3 -1
  22. package/cjs/moneymarket/moneymarketCommonService.js +1 -1
  23. package/cjs/portfolio/index.js +20 -0
  24. package/cjs/savings/morphoVaults/index.js +17 -17
  25. package/cjs/staking/staking.js +5 -1
  26. package/cjs/types/aaveV4.d.ts +129 -0
  27. package/cjs/types/aaveV4.js +11 -0
  28. package/cjs/types/index.d.ts +1 -0
  29. package/cjs/types/index.js +1 -0
  30. package/cjs/types/portfolio.d.ts +4 -0
  31. package/esm/aaveV4/index.d.ts +7 -0
  32. package/esm/aaveV4/index.js +158 -0
  33. package/esm/config/contracts.d.ts +1277 -0
  34. package/esm/config/contracts.js +8 -0
  35. package/esm/contracts.d.ts +23120 -0
  36. package/esm/contracts.js +1 -0
  37. package/esm/helpers/aaveV4Helpers/index.d.ts +13 -0
  38. package/esm/helpers/aaveV4Helpers/index.js +100 -0
  39. package/esm/helpers/index.d.ts +1 -0
  40. package/esm/helpers/index.js +1 -0
  41. package/esm/helpers/morphoBlueHelpers/index.js +66 -66
  42. package/esm/index.d.ts +2 -1
  43. package/esm/index.js +2 -1
  44. package/esm/markets/aave/marketAssets.js +1 -1
  45. package/esm/markets/aaveV4/index.d.ts +7 -0
  46. package/esm/markets/aaveV4/index.js +16 -0
  47. package/esm/markets/index.d.ts +1 -0
  48. package/esm/markets/index.js +1 -0
  49. package/esm/moneymarket/moneymarketCommonService.js +1 -1
  50. package/esm/portfolio/index.js +21 -1
  51. package/esm/savings/morphoVaults/index.js +17 -17
  52. package/esm/staking/staking.js +5 -1
  53. package/esm/types/aaveV4.d.ts +129 -0
  54. package/esm/types/aaveV4.js +8 -0
  55. package/esm/types/index.d.ts +1 -0
  56. package/esm/types/index.js +1 -0
  57. package/esm/types/portfolio.d.ts +4 -0
  58. package/package.json +48 -48
  59. package/src/aaveV2/index.ts +240 -240
  60. package/src/aaveV3/index.ts +635 -635
  61. package/src/aaveV3/merit.ts +97 -97
  62. package/src/aaveV3/merkl.ts +74 -74
  63. package/src/aaveV4/index.ts +169 -0
  64. package/src/claiming/aaveV3.ts +154 -154
  65. package/src/claiming/compV3.ts +22 -22
  66. package/src/claiming/ethena.ts +61 -61
  67. package/src/claiming/index.ts +12 -12
  68. package/src/claiming/king.ts +66 -66
  69. package/src/claiming/morphoBlue.ts +118 -118
  70. package/src/claiming/spark.ts +225 -225
  71. package/src/compoundV2/index.ts +244 -244
  72. package/src/compoundV3/index.ts +274 -274
  73. package/src/config/contracts.ts +1328 -1320
  74. package/src/constants/index.ts +10 -10
  75. package/src/contracts.ts +174 -172
  76. package/src/curveUsd/index.ts +254 -254
  77. package/src/eulerV2/index.ts +324 -324
  78. package/src/exchange/index.ts +25 -25
  79. package/src/fluid/index.ts +1800 -1800
  80. package/src/helpers/aaveHelpers/index.ts +191 -191
  81. package/src/helpers/aaveV4Helpers/index.ts +121 -0
  82. package/src/helpers/compoundHelpers/index.ts +283 -283
  83. package/src/helpers/curveUsdHelpers/index.ts +40 -40
  84. package/src/helpers/eulerHelpers/index.ts +222 -222
  85. package/src/helpers/fluidHelpers/index.ts +326 -326
  86. package/src/helpers/index.ts +11 -10
  87. package/src/helpers/liquityV2Helpers/index.ts +82 -82
  88. package/src/helpers/llamaLendHelpers/index.ts +53 -53
  89. package/src/helpers/makerHelpers/index.ts +52 -52
  90. package/src/helpers/morphoBlueHelpers/index.ts +396 -396
  91. package/src/helpers/sparkHelpers/index.ts +158 -158
  92. package/src/index.ts +51 -49
  93. package/src/liquity/index.ts +159 -159
  94. package/src/liquityV2/index.ts +703 -703
  95. package/src/llamaLend/index.ts +305 -305
  96. package/src/maker/index.ts +223 -223
  97. package/src/markets/aave/index.ts +118 -118
  98. package/src/markets/aave/marketAssets.ts +54 -54
  99. package/src/markets/aaveV4/index.ts +19 -0
  100. package/src/markets/compound/index.ts +243 -243
  101. package/src/markets/compound/marketsAssets.ts +97 -97
  102. package/src/markets/curveUsd/index.ts +69 -69
  103. package/src/markets/euler/index.ts +26 -26
  104. package/src/markets/fluid/index.ts +2900 -2900
  105. package/src/markets/index.ts +26 -25
  106. package/src/markets/liquityV2/index.ts +102 -102
  107. package/src/markets/llamaLend/contractAddresses.ts +141 -141
  108. package/src/markets/llamaLend/index.ts +235 -235
  109. package/src/markets/morphoBlue/index.ts +971 -971
  110. package/src/markets/spark/index.ts +29 -29
  111. package/src/markets/spark/marketAssets.ts +12 -12
  112. package/src/moneymarket/moneymarketCommonService.ts +85 -85
  113. package/src/morphoBlue/index.ts +274 -274
  114. package/src/portfolio/index.ts +618 -598
  115. package/src/savings/index.ts +95 -95
  116. package/src/savings/makerDsr/index.ts +53 -53
  117. package/src/savings/makerDsr/options.ts +9 -9
  118. package/src/savings/morphoVaults/index.ts +80 -80
  119. package/src/savings/morphoVaults/options.ts +193 -193
  120. package/src/savings/skyOptions/index.ts +95 -95
  121. package/src/savings/skyOptions/options.ts +10 -10
  122. package/src/savings/sparkSavingsVaults/index.ts +60 -60
  123. package/src/savings/sparkSavingsVaults/options.ts +35 -35
  124. package/src/savings/yearnV3Vaults/index.ts +61 -61
  125. package/src/savings/yearnV3Vaults/options.ts +55 -55
  126. package/src/savings/yearnVaults/index.ts +73 -73
  127. package/src/savings/yearnVaults/options.ts +32 -32
  128. package/src/services/priceService.ts +278 -278
  129. package/src/services/utils.ts +115 -115
  130. package/src/services/viem.ts +34 -34
  131. package/src/setup.ts +8 -8
  132. package/src/spark/index.ts +459 -459
  133. package/src/staking/eligibility.ts +53 -53
  134. package/src/staking/index.ts +1 -1
  135. package/src/staking/staking.ts +192 -190
  136. package/src/types/aave.ts +198 -198
  137. package/src/types/aaveV4.ts +142 -0
  138. package/src/types/claiming.ts +114 -114
  139. package/src/types/common.ts +107 -107
  140. package/src/types/compound.ts +144 -144
  141. package/src/types/curveUsd.ts +123 -123
  142. package/src/types/euler.ts +175 -175
  143. package/src/types/fluid.ts +483 -483
  144. package/src/types/index.ts +16 -15
  145. package/src/types/liquity.ts +30 -30
  146. package/src/types/liquityV2.ts +126 -126
  147. package/src/types/llamaLend.ts +159 -159
  148. package/src/types/maker.ts +63 -63
  149. package/src/types/merit.ts +1 -1
  150. package/src/types/merkl.ts +70 -70
  151. package/src/types/morphoBlue.ts +200 -200
  152. package/src/types/portfolio.ts +64 -60
  153. package/src/types/savings/index.ts +23 -23
  154. package/src/types/savings/makerDsr.ts +13 -13
  155. package/src/types/savings/morphoVaults.ts +32 -32
  156. package/src/types/savings/sky.ts +14 -14
  157. package/src/types/savings/sparkSavingsVaults.ts +15 -15
  158. package/src/types/savings/yearnV3Vaults.ts +17 -17
  159. package/src/types/savings/yearnVaults.ts +14 -14
  160. package/src/types/spark.ts +134 -134
  161. package/src/umbrella/index.ts +69 -69
  162. package/src/umbrella/umbrellaUtils.ts +29 -29
@@ -1,155 +1,155 @@
1
- import { Client } from 'viem';
2
- import Dec from 'decimal.js';
3
- import { EthAddress, NetworkNumber } from '../types/common';
4
- import { ClaimableToken, ClaimType } from '../types/claiming';
5
- import {
6
- AaveIncentiveDataProviderV3ContractViem,
7
- AaveRewardsControllerViem,
8
- } from '../contracts';
9
- import { compareAddresses, getEthAmountForDecimals } from '../services/utils';
10
- import { getAaveUnderlyingSymbol } from '../helpers/aaveHelpers';
11
-
12
- type AaveReward = {
13
- amount: string;
14
- symbol: string;
15
- underlyingAsset: string;
16
- rewardTokenAddress: string;
17
- aTokenAddresses: string[];
18
- };
19
-
20
- const mapAaveRewardsToClaimableTokens = (aaveRewards: AaveReward[], marketAddress: EthAddress, walletAddress: EthAddress) => aaveRewards.map(reward => ({
21
- symbol: reward.symbol,
22
- amount: reward.amount,
23
- claimType: ClaimType.AAVE_REWARDS as const,
24
- tokenAddress: reward.rewardTokenAddress as EthAddress,
25
- underlyingSymbol: reward.underlyingAsset,
26
- walletAddress,
27
- label: 'AAVE Rewards',
28
- additionalClaimFields: {
29
- marketAddress,
30
- aTokenAddresses: reward.aTokenAddresses,
31
- isAaveToken: reward.symbol.startsWith('a'),
32
- },
33
- }));
34
-
35
- export async function getUnclaimedRewardsForAllMarkets(
36
- provider: Client,
37
- network: NetworkNumber,
38
- walletAddress: EthAddress,
39
- marketAddress: EthAddress,
40
- ): Promise<ClaimableToken[]> {
41
- const contract = AaveIncentiveDataProviderV3ContractViem(provider, network);
42
- const tokensData = await contract.read.getUserReservesIncentivesData([marketAddress, walletAddress]);
43
- const allTokensDataArrays = tokensData.reduce((acc: any[], val) => {
44
- acc.push(val.aTokenIncentivesUserData.userRewardsInformation);
45
- acc.push(val.vTokenIncentivesUserData.userRewardsInformation);
46
- return acc;
47
- }, []);
48
- const allATokens = tokensData.reduce((acc, val) => {
49
- acc.push(val.aTokenIncentivesUserData.tokenAddress);
50
- acc.push(val.vTokenIncentivesUserData.tokenAddress);
51
- return acc;
52
- }, [] as string[]);
53
- // array of rewards for each market (aToken/vToken)
54
- // reward can be any token like wstETH, but also aToken like aWETH
55
- const aaveRewardsController = AaveRewardsControllerViem(provider, network);
56
- const rewardsPerAAsset = await Promise.all(allATokens.map(
57
- (token: string) => aaveRewardsController.read.getAllUserRewards([[token as EthAddress], walletAddress])));
58
-
59
- // match amounts to token symbol, parse decimal amounts
60
- const rewardsPerAAssetWithInfo = rewardsPerAAsset.map((rewardForAAsset, aaIndex) => {
61
- const rewardsList = rewardForAAsset[0];
62
- const amounts = rewardForAAsset[1];
63
-
64
- const rewardsDataArraysForAAsset = allTokensDataArrays[aaIndex];
65
- const aTokenAddress = allATokens[aaIndex];
66
- return rewardsList.map((rewardTokenAddress, rewardIndex) => {
67
- const dataArrIndex = rewardsDataArraysForAAsset.findIndex((arr: { rewardTokenAddress: string | undefined; }) => compareAddresses(arr.rewardTokenAddress, rewardTokenAddress));
68
- const amountWei = amounts[rewardIndex];
69
- const amount = getEthAmountForDecimals(amountWei.toString(), rewardsDataArraysForAAsset[dataArrIndex]?.rewardTokenDecimals);
70
- const symbol = rewardsDataArraysForAAsset[dataArrIndex]?.rewardTokenSymbol || '';
71
- const underlyingAsset = getAaveUnderlyingSymbol(symbol);
72
- return ({
73
- amount,
74
- symbol,
75
- underlyingAsset,
76
- rewardTokenAddress,
77
- aTokenAddress,
78
- });
79
- });
80
- });
81
-
82
- // sum all unclaimed rewards of all markets per each token
83
- // (e.g. how much awstETH is claimable in total from both aUSDC and awstETH markets)
84
- const totalUnclaimedPerRewardToken: Record<string, any> = {};
85
- rewardsPerAAssetWithInfo
86
- .flat()
87
- .forEach(({
88
- amount, symbol, underlyingAsset, rewardTokenAddress, aTokenAddress,
89
- }) => {
90
- if (+amount > 0) {
91
- if (!totalUnclaimedPerRewardToken[symbol]) {
92
- totalUnclaimedPerRewardToken[symbol] = {
93
- amount, symbol, underlyingAsset, rewardTokenAddress, aTokenAddresses: [aTokenAddress],
94
- };
95
- } else {
96
- totalUnclaimedPerRewardToken[symbol].amount =
97
- new Dec(totalUnclaimedPerRewardToken[symbol].amount).add(amount).toString();
98
- totalUnclaimedPerRewardToken[symbol].aTokenAddresses.push(aTokenAddress);
99
- }
100
- }
101
- }, []);
102
-
103
- return mapAaveRewardsToClaimableTokens(Object.values(totalUnclaimedPerRewardToken), marketAddress, walletAddress);
104
- }
105
-
106
- export async function getMeritUnclaimedRewards(account: EthAddress, network: NetworkNumber, acceptMorpho: boolean = true): Promise<ClaimableToken[]> {
107
- let data;
108
- try {
109
- const res = await fetch(`https://api.merkl.xyz/v4/users/${account}/rewards?chainId=${network}`,
110
- { signal: AbortSignal.timeout(3000) });
111
- data = await res.json();
112
- } catch (error) {
113
- console.error('External API Failure: Aave Merit', error);
114
- data = [];
115
- }
116
-
117
- const claimableTokens: ClaimableToken[] = [];
118
-
119
- data.forEach((item: { rewards: any[]; }) => {
120
- item.rewards.forEach(reward => {
121
- const {
122
- token,
123
- amount,
124
- claimed,
125
- proofs,
126
- } = reward;
127
-
128
- const isTokenMorpho = token.symbol === 'MORPHO';
129
- if (!token || !token.symbol || amount === '0' || (isTokenMorpho && !acceptMorpho)) return;
130
-
131
- const unclaimedAmount = new Dec(amount).minus(claimed || 0).toString();
132
- if (unclaimedAmount === '0') return;
133
-
134
- const unclaimed = getEthAmountForDecimals(unclaimedAmount, token.decimals);
135
-
136
- claimableTokens.push({
137
- claimType: ClaimType.AAVE_MERIT_REWARDS,
138
- amount: unclaimed,
139
- symbol: token.symbol,
140
- tokenAddress: token.address,
141
- walletAddress: account,
142
- label: 'AAVE Merit Rewards',
143
- underlyingSymbol: getAaveUnderlyingSymbol(token.symbol),
144
- additionalClaimFields: {
145
- accumulated: amount,
146
- proof: proofs,
147
- decimals: token.decimals,
148
- unclaimed: unclaimedAmount,
149
- },
150
- });
151
- });
152
- });
153
-
154
- return claimableTokens;
1
+ import { Client } from 'viem';
2
+ import Dec from 'decimal.js';
3
+ import { EthAddress, NetworkNumber } from '../types/common';
4
+ import { ClaimableToken, ClaimType } from '../types/claiming';
5
+ import {
6
+ AaveIncentiveDataProviderV3ContractViem,
7
+ AaveRewardsControllerViem,
8
+ } from '../contracts';
9
+ import { compareAddresses, getEthAmountForDecimals } from '../services/utils';
10
+ import { getAaveUnderlyingSymbol } from '../helpers/aaveHelpers';
11
+
12
+ type AaveReward = {
13
+ amount: string;
14
+ symbol: string;
15
+ underlyingAsset: string;
16
+ rewardTokenAddress: string;
17
+ aTokenAddresses: string[];
18
+ };
19
+
20
+ const mapAaveRewardsToClaimableTokens = (aaveRewards: AaveReward[], marketAddress: EthAddress, walletAddress: EthAddress) => aaveRewards.map(reward => ({
21
+ symbol: reward.symbol,
22
+ amount: reward.amount,
23
+ claimType: ClaimType.AAVE_REWARDS as const,
24
+ tokenAddress: reward.rewardTokenAddress as EthAddress,
25
+ underlyingSymbol: reward.underlyingAsset,
26
+ walletAddress,
27
+ label: 'AAVE Rewards',
28
+ additionalClaimFields: {
29
+ marketAddress,
30
+ aTokenAddresses: reward.aTokenAddresses,
31
+ isAaveToken: reward.symbol.startsWith('a'),
32
+ },
33
+ }));
34
+
35
+ export async function getUnclaimedRewardsForAllMarkets(
36
+ provider: Client,
37
+ network: NetworkNumber,
38
+ walletAddress: EthAddress,
39
+ marketAddress: EthAddress,
40
+ ): Promise<ClaimableToken[]> {
41
+ const contract = AaveIncentiveDataProviderV3ContractViem(provider, network);
42
+ const tokensData = await contract.read.getUserReservesIncentivesData([marketAddress, walletAddress]);
43
+ const allTokensDataArrays = tokensData.reduce((acc: any[], val) => {
44
+ acc.push(val.aTokenIncentivesUserData.userRewardsInformation);
45
+ acc.push(val.vTokenIncentivesUserData.userRewardsInformation);
46
+ return acc;
47
+ }, []);
48
+ const allATokens = tokensData.reduce((acc, val) => {
49
+ acc.push(val.aTokenIncentivesUserData.tokenAddress);
50
+ acc.push(val.vTokenIncentivesUserData.tokenAddress);
51
+ return acc;
52
+ }, [] as string[]);
53
+ // array of rewards for each market (aToken/vToken)
54
+ // reward can be any token like wstETH, but also aToken like aWETH
55
+ const aaveRewardsController = AaveRewardsControllerViem(provider, network);
56
+ const rewardsPerAAsset = await Promise.all(allATokens.map(
57
+ (token: string) => aaveRewardsController.read.getAllUserRewards([[token as EthAddress], walletAddress])));
58
+
59
+ // match amounts to token symbol, parse decimal amounts
60
+ const rewardsPerAAssetWithInfo = rewardsPerAAsset.map((rewardForAAsset, aaIndex) => {
61
+ const rewardsList = rewardForAAsset[0];
62
+ const amounts = rewardForAAsset[1];
63
+
64
+ const rewardsDataArraysForAAsset = allTokensDataArrays[aaIndex];
65
+ const aTokenAddress = allATokens[aaIndex];
66
+ return rewardsList.map((rewardTokenAddress, rewardIndex) => {
67
+ const dataArrIndex = rewardsDataArraysForAAsset.findIndex((arr: { rewardTokenAddress: string | undefined; }) => compareAddresses(arr.rewardTokenAddress, rewardTokenAddress));
68
+ const amountWei = amounts[rewardIndex];
69
+ const amount = getEthAmountForDecimals(amountWei.toString(), rewardsDataArraysForAAsset[dataArrIndex]?.rewardTokenDecimals);
70
+ const symbol = rewardsDataArraysForAAsset[dataArrIndex]?.rewardTokenSymbol || '';
71
+ const underlyingAsset = getAaveUnderlyingSymbol(symbol);
72
+ return ({
73
+ amount,
74
+ symbol,
75
+ underlyingAsset,
76
+ rewardTokenAddress,
77
+ aTokenAddress,
78
+ });
79
+ });
80
+ });
81
+
82
+ // sum all unclaimed rewards of all markets per each token
83
+ // (e.g. how much awstETH is claimable in total from both aUSDC and awstETH markets)
84
+ const totalUnclaimedPerRewardToken: Record<string, any> = {};
85
+ rewardsPerAAssetWithInfo
86
+ .flat()
87
+ .forEach(({
88
+ amount, symbol, underlyingAsset, rewardTokenAddress, aTokenAddress,
89
+ }) => {
90
+ if (+amount > 0) {
91
+ if (!totalUnclaimedPerRewardToken[symbol]) {
92
+ totalUnclaimedPerRewardToken[symbol] = {
93
+ amount, symbol, underlyingAsset, rewardTokenAddress, aTokenAddresses: [aTokenAddress],
94
+ };
95
+ } else {
96
+ totalUnclaimedPerRewardToken[symbol].amount =
97
+ new Dec(totalUnclaimedPerRewardToken[symbol].amount).add(amount).toString();
98
+ totalUnclaimedPerRewardToken[symbol].aTokenAddresses.push(aTokenAddress);
99
+ }
100
+ }
101
+ }, []);
102
+
103
+ return mapAaveRewardsToClaimableTokens(Object.values(totalUnclaimedPerRewardToken), marketAddress, walletAddress);
104
+ }
105
+
106
+ export async function getMeritUnclaimedRewards(account: EthAddress, network: NetworkNumber, acceptMorpho: boolean = true): Promise<ClaimableToken[]> {
107
+ let data;
108
+ try {
109
+ const res = await fetch(`https://api.merkl.xyz/v4/users/${account}/rewards?chainId=${network}`,
110
+ { signal: AbortSignal.timeout(3000) });
111
+ data = await res.json();
112
+ } catch (error) {
113
+ console.error('External API Failure: Aave Merit', error);
114
+ data = [];
115
+ }
116
+
117
+ const claimableTokens: ClaimableToken[] = [];
118
+
119
+ data.forEach((item: { rewards: any[]; }) => {
120
+ item.rewards.forEach(reward => {
121
+ const {
122
+ token,
123
+ amount,
124
+ claimed,
125
+ proofs,
126
+ } = reward;
127
+
128
+ const isTokenMorpho = token.symbol === 'MORPHO';
129
+ if (!token || !token.symbol || amount === '0' || (isTokenMorpho && !acceptMorpho)) return;
130
+
131
+ const unclaimedAmount = new Dec(amount).minus(claimed || 0).toString();
132
+ if (unclaimedAmount === '0') return;
133
+
134
+ const unclaimed = getEthAmountForDecimals(unclaimedAmount, token.decimals);
135
+
136
+ claimableTokens.push({
137
+ claimType: ClaimType.AAVE_MERIT_REWARDS,
138
+ amount: unclaimed,
139
+ symbol: token.symbol,
140
+ tokenAddress: token.address,
141
+ walletAddress: account,
142
+ label: 'AAVE Merit Rewards',
143
+ underlyingSymbol: getAaveUnderlyingSymbol(token.symbol),
144
+ additionalClaimFields: {
145
+ accumulated: amount,
146
+ proof: proofs,
147
+ decimals: token.decimals,
148
+ unclaimed: unclaimedAmount,
149
+ },
150
+ });
151
+ });
152
+ });
153
+
154
+ return claimableTokens;
155
155
  }
@@ -1,23 +1,23 @@
1
- import { Client } from 'viem';
2
- import { assetAmountInEth, getAssetInfoByAddress } from '@defisaver/tokens';
3
- import { EthAddress, NetworkNumber } from '../types/common';
4
- import { CompV3ViewContractViem } from '../contracts';
5
- import { ClaimType } from '../types/claiming';
6
-
7
- export const getCompoundV3Rewards = async (provider: Client, network: NetworkNumber, user: EthAddress, market: any) => {
8
- const compV3View = CompV3ViewContractViem(provider, network);
9
- const rewards = await compV3View.read.getRewardsOwed([market, user]);
10
- if (!rewards || rewards.owed.toString() === '0' || getAssetInfoByAddress(rewards.token, network).symbol !== 'COMP') return [];
11
- return [{
12
- symbol: 'COMP',
13
- underlyingSymbol: 'COMP',
14
- tokenAddress: rewards.token,
15
- amount: assetAmountInEth(rewards.owed.toString() || 0, 'COMP'),
16
- walletAddress: user,
17
- label: 'Compound V3',
18
- claimType: ClaimType.COMPOUND_V3_COMP,
19
- additionalClaimFields: {
20
- marketAddress: market,
21
- },
22
- }];
1
+ import { Client } from 'viem';
2
+ import { assetAmountInEth, getAssetInfoByAddress } from '@defisaver/tokens';
3
+ import { EthAddress, NetworkNumber } from '../types/common';
4
+ import { CompV3ViewContractViem } from '../contracts';
5
+ import { ClaimType } from '../types/claiming';
6
+
7
+ export const getCompoundV3Rewards = async (provider: Client, network: NetworkNumber, user: EthAddress, market: any) => {
8
+ const compV3View = CompV3ViewContractViem(provider, network);
9
+ const rewards = await compV3View.read.getRewardsOwed([market, user]);
10
+ if (!rewards || rewards.owed.toString() === '0' || getAssetInfoByAddress(rewards.token, network).symbol !== 'COMP') return [];
11
+ return [{
12
+ symbol: 'COMP',
13
+ underlyingSymbol: 'COMP',
14
+ tokenAddress: rewards.token,
15
+ amount: assetAmountInEth(rewards.owed.toString() || 0, 'COMP'),
16
+ walletAddress: user,
17
+ label: 'Compound V3',
18
+ claimType: ClaimType.COMPOUND_V3_COMP,
19
+ additionalClaimFields: {
20
+ marketAddress: market,
21
+ },
22
+ }];
23
23
  };
@@ -1,61 +1,61 @@
1
- import { getAssetInfo } from '@defisaver/tokens';
2
- import Dec from 'decimal.js';
3
- import { getAddress } from 'viem';
4
- import { EthAddress } from '../types/common';
5
- import { ClaimType } from '../types/claiming';
6
- import { getEthAmountForDecimals } from '../services/utils';
7
-
8
- export const fetchEthenaAirdropReward = async (address: EthAddress) => {
9
- try {
10
- const checksumAddress = getAddress(address);
11
- const response = await fetch(`https://airdrop-data-ethena-s4.s3.us-west-2.amazonaws.com/${checksumAddress}/0x3d99219fbd49ace3f48d6ca1340e505ec1bdf27d1f8d0e15ec9f286cc9215fcd-${checksumAddress}.json`);
12
-
13
- if (!response.ok) {
14
- if (response.status === 403) {
15
- // This is also okay, means that there are no rewards for the address
16
- return;
17
- }
18
- throw new Error(`HTTP error! status: ${response.status}`);
19
- }
20
-
21
- return await response.json();
22
- } catch (error) {
23
- console.error('Error fetching Ethena airdrop rewards:', error);
24
- }
25
- };
26
-
27
- export const fetchEthenaAirdropRewards = async (walletAddresses: EthAddress[]): Promise<Record<string, any[]>> => {
28
- const apiDataPromises = walletAddresses.map(address => fetchEthenaAirdropReward(address));
29
- const apiDataArray = await Promise.all(apiDataPromises);
30
-
31
- const results: Record<string, any[]> = {};
32
- for (let i = 0; i < walletAddresses.length; i++) {
33
- const walletAddress = walletAddresses[i];
34
- const data = apiDataArray[i];
35
-
36
- if (!data || data.claimed) {
37
- continue;
38
- }
39
-
40
- const processedRewards = [];
41
- const assetInfo = getAssetInfo('sENA');
42
-
43
- const amount = getEthAmountForDecimals(data.events[0].awardAmount, assetInfo.decimals);
44
-
45
- if (new Dec(amount).gt('0')) {
46
- processedRewards.push({
47
- symbol: assetInfo.symbol,
48
- underlyingSymbol: assetInfo.symbol,
49
- amount,
50
- claimType: ClaimType.ETHENA_AIRDROP,
51
- tokenAddress: assetInfo.address,
52
- walletAddress,
53
- label: 'Ethena Airdrop',
54
- });
55
- }
56
-
57
- results[walletAddress.toLowerCase() as EthAddress] = processedRewards;
58
- }
59
-
60
- return results;
61
- };
1
+ import { getAssetInfo } from '@defisaver/tokens';
2
+ import Dec from 'decimal.js';
3
+ import { getAddress } from 'viem';
4
+ import { EthAddress } from '../types/common';
5
+ import { ClaimType } from '../types/claiming';
6
+ import { getEthAmountForDecimals } from '../services/utils';
7
+
8
+ export const fetchEthenaAirdropReward = async (address: EthAddress) => {
9
+ try {
10
+ const checksumAddress = getAddress(address);
11
+ const response = await fetch(`https://airdrop-data-ethena-s4.s3.us-west-2.amazonaws.com/${checksumAddress}/0x3d99219fbd49ace3f48d6ca1340e505ec1bdf27d1f8d0e15ec9f286cc9215fcd-${checksumAddress}.json`);
12
+
13
+ if (!response.ok) {
14
+ if (response.status === 403) {
15
+ // This is also okay, means that there are no rewards for the address
16
+ return;
17
+ }
18
+ throw new Error(`HTTP error! status: ${response.status}`);
19
+ }
20
+
21
+ return await response.json();
22
+ } catch (error) {
23
+ console.error('Error fetching Ethena airdrop rewards:', error);
24
+ }
25
+ };
26
+
27
+ export const fetchEthenaAirdropRewards = async (walletAddresses: EthAddress[]): Promise<Record<string, any[]>> => {
28
+ const apiDataPromises = walletAddresses.map(address => fetchEthenaAirdropReward(address));
29
+ const apiDataArray = await Promise.all(apiDataPromises);
30
+
31
+ const results: Record<string, any[]> = {};
32
+ for (let i = 0; i < walletAddresses.length; i++) {
33
+ const walletAddress = walletAddresses[i];
34
+ const data = apiDataArray[i];
35
+
36
+ if (!data || data.claimed) {
37
+ continue;
38
+ }
39
+
40
+ const processedRewards = [];
41
+ const assetInfo = getAssetInfo('sENA');
42
+
43
+ const amount = getEthAmountForDecimals(data.events[0].awardAmount, assetInfo.decimals);
44
+
45
+ if (new Dec(amount).gt('0')) {
46
+ processedRewards.push({
47
+ symbol: assetInfo.symbol,
48
+ underlyingSymbol: assetInfo.symbol,
49
+ amount,
50
+ claimType: ClaimType.ETHENA_AIRDROP,
51
+ tokenAddress: assetInfo.address,
52
+ walletAddress,
53
+ label: 'Ethena Airdrop',
54
+ });
55
+ }
56
+
57
+ results[walletAddress.toLowerCase() as EthAddress] = processedRewards;
58
+ }
59
+
60
+ return results;
61
+ };
@@ -1,13 +1,13 @@
1
- import * as aaveV3Claim from './aaveV3';
2
- import * as compV3Claim from './compV3';
3
- import * as kingV3Claim from './king';
4
- import * as morphoBlueClaim from './morphoBlue';
5
- import * as sparkClaim from './spark';
6
-
7
- export {
8
- aaveV3Claim,
9
- compV3Claim,
10
- kingV3Claim,
11
- morphoBlueClaim,
12
- sparkClaim,
1
+ import * as aaveV3Claim from './aaveV3';
2
+ import * as compV3Claim from './compV3';
3
+ import * as kingV3Claim from './king';
4
+ import * as morphoBlueClaim from './morphoBlue';
5
+ import * as sparkClaim from './spark';
6
+
7
+ export {
8
+ aaveV3Claim,
9
+ compV3Claim,
10
+ kingV3Claim,
11
+ morphoBlueClaim,
12
+ sparkClaim,
13
13
  };
@@ -1,66 +1,66 @@
1
- import Dec from 'decimal.js';
2
- import { assetAmountInEth } from '@defisaver/tokens';
3
- import { Client } from 'viem';
4
- import { UUPSViem } from '../contracts';
5
- import { EthAddress, HexString, NetworkNumber } from '../types/common';
6
- import { ClaimType } from '../types/claiming';
7
-
8
- export const fetchKingRewards = async (walletAddress: EthAddress) => {
9
- try {
10
- const res = await fetch(`https://fe.defisaver.com/api/etherfi/get-king-rewards/${walletAddress}`,
11
- { signal: AbortSignal.timeout(5000) });
12
-
13
- if (!res.ok) throw new Error(await res.text());
14
-
15
- return await res.json();
16
- } catch (err) {
17
- console.error('External API Error: Error fetching KING rewards:', err);
18
- return { Amount: '0', Root: '', Proofs: [] };
19
- }
20
- };
21
-
22
- export const getKingRewards = async (provider: Client, network: NetworkNumber, walletAddresses: EthAddress[]) => {
23
- // Fetch all API data in parallel (these are external API calls, can't be batched with multicall)
24
- const apiDataPromises = walletAddresses.map(address => fetchKingRewards(address));
25
- const apiDataArray = await Promise.all(apiDataPromises);
26
-
27
- // Batch all contract calls using multicall
28
- const contract = UUPSViem(provider, network);
29
- const cumulativePromises = walletAddresses.map(address => contract.read.cumulativeClaimed([address]),
30
- );
31
- const cumulativeResults = await Promise.all(cumulativePromises);
32
-
33
- // Process results
34
- const results: Record<string, any[]> = {};
35
-
36
- for (let i = 0; i < walletAddresses.length; i++) {
37
- const walletAddress = walletAddresses[i];
38
- const data = apiDataArray[i];
39
- const cumulative = cumulativeResults[i];
40
-
41
- const allRewardsAmount = assetAmountInEth(data.Amount, 'KING');
42
- const claimedAmount = assetAmountInEth(cumulative.toString(), 'KING');
43
- const amountToClaim = new Dec(allRewardsAmount).sub(claimedAmount);
44
-
45
- if (amountToClaim.lessThanOrEqualTo('0')) {
46
- results[walletAddress.toLowerCase() as EthAddress] = [];
47
- } else {
48
- results[walletAddress.toLowerCase() as EthAddress] = [{
49
- symbol: 'KING',
50
- underlyingSymbol: 'KING',
51
- tokenAddress: '0x8F08B70456eb22f6109F57b8fafE862ED28E6040',
52
- amount: amountToClaim.toString(),
53
- walletAddress,
54
- label: 'weETH',
55
- claimType: ClaimType.KING_REWARDS,
56
- additionalClaimFields: {
57
- allRewardsAmount,
58
- merkleRoot: data.Root,
59
- merkleProofs: data.Proofs,
60
- },
61
- }];
62
- }
63
- }
64
-
65
- return results;
66
- };
1
+ import Dec from 'decimal.js';
2
+ import { assetAmountInEth } from '@defisaver/tokens';
3
+ import { Client } from 'viem';
4
+ import { UUPSViem } from '../contracts';
5
+ import { EthAddress, HexString, NetworkNumber } from '../types/common';
6
+ import { ClaimType } from '../types/claiming';
7
+
8
+ export const fetchKingRewards = async (walletAddress: EthAddress) => {
9
+ try {
10
+ const res = await fetch(`https://fe.defisaver.com/api/etherfi/get-king-rewards/${walletAddress}`,
11
+ { signal: AbortSignal.timeout(5000) });
12
+
13
+ if (!res.ok) throw new Error(await res.text());
14
+
15
+ return await res.json();
16
+ } catch (err) {
17
+ console.error('External API Error: Error fetching KING rewards:', err);
18
+ return { Amount: '0', Root: '', Proofs: [] };
19
+ }
20
+ };
21
+
22
+ export const getKingRewards = async (provider: Client, network: NetworkNumber, walletAddresses: EthAddress[]) => {
23
+ // Fetch all API data in parallel (these are external API calls, can't be batched with multicall)
24
+ const apiDataPromises = walletAddresses.map(address => fetchKingRewards(address));
25
+ const apiDataArray = await Promise.all(apiDataPromises);
26
+
27
+ // Batch all contract calls using multicall
28
+ const contract = UUPSViem(provider, network);
29
+ const cumulativePromises = walletAddresses.map(address => contract.read.cumulativeClaimed([address]),
30
+ );
31
+ const cumulativeResults = await Promise.all(cumulativePromises);
32
+
33
+ // Process results
34
+ const results: Record<string, any[]> = {};
35
+
36
+ for (let i = 0; i < walletAddresses.length; i++) {
37
+ const walletAddress = walletAddresses[i];
38
+ const data = apiDataArray[i];
39
+ const cumulative = cumulativeResults[i];
40
+
41
+ const allRewardsAmount = assetAmountInEth(data.Amount, 'KING');
42
+ const claimedAmount = assetAmountInEth(cumulative.toString(), 'KING');
43
+ const amountToClaim = new Dec(allRewardsAmount).sub(claimedAmount);
44
+
45
+ if (amountToClaim.lessThanOrEqualTo('0')) {
46
+ results[walletAddress.toLowerCase() as EthAddress] = [];
47
+ } else {
48
+ results[walletAddress.toLowerCase() as EthAddress] = [{
49
+ symbol: 'KING',
50
+ underlyingSymbol: 'KING',
51
+ tokenAddress: '0x8F08B70456eb22f6109F57b8fafE862ED28E6040',
52
+ amount: amountToClaim.toString(),
53
+ walletAddress,
54
+ label: 'weETH',
55
+ claimType: ClaimType.KING_REWARDS,
56
+ additionalClaimFields: {
57
+ allRewardsAmount,
58
+ merkleRoot: data.Root,
59
+ merkleProofs: data.Proofs,
60
+ },
61
+ }];
62
+ }
63
+ }
64
+
65
+ return results;
66
+ };