@defisaver/positions-sdk 2.0.15-dev.0 → 2.1.1-dev.0

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 (125) hide show
  1. package/cjs/aaveV2/index.js +9 -5
  2. package/cjs/aaveV3/index.d.ts +3 -0
  3. package/cjs/aaveV3/index.js +66 -47
  4. package/cjs/aaveV3/merit.d.ts +7 -0
  5. package/cjs/aaveV3/merit.js +95 -0
  6. package/cjs/aaveV3/merkl.d.ts +9 -0
  7. package/cjs/aaveV3/merkl.js +88 -0
  8. package/cjs/compoundV2/index.js +13 -7
  9. package/cjs/compoundV3/index.js +8 -3
  10. package/cjs/config/contracts.d.ts +6510 -1851
  11. package/cjs/config/contracts.js +33 -12
  12. package/cjs/contracts.d.ts +178 -0
  13. package/cjs/eulerV2/index.js +11 -2
  14. package/cjs/fluid/index.js +108 -34
  15. package/cjs/helpers/aaveHelpers/index.js +0 -1
  16. package/cjs/helpers/compoundHelpers/index.d.ts +5 -7
  17. package/cjs/helpers/compoundHelpers/index.js +31 -11
  18. package/cjs/helpers/eulerHelpers/index.d.ts +0 -5
  19. package/cjs/helpers/eulerHelpers/index.js +2 -31
  20. package/cjs/helpers/fluidHelpers/index.js +2 -0
  21. package/cjs/helpers/liquityV2Helpers/index.js +3 -2
  22. package/cjs/liquityV2/index.js +10 -2
  23. package/cjs/llamaLend/index.js +10 -2
  24. package/cjs/morphoBlue/index.js +20 -6
  25. package/cjs/spark/index.js +20 -30
  26. package/cjs/staking/eligibility.d.ts +19 -0
  27. package/cjs/staking/eligibility.js +67 -0
  28. package/cjs/staking/index.d.ts +1 -0
  29. package/cjs/staking/index.js +1 -0
  30. package/cjs/staking/staking.d.ts +1 -7
  31. package/cjs/staking/staking.js +29 -55
  32. package/cjs/types/aave.d.ts +3 -8
  33. package/cjs/types/common.d.ts +18 -4
  34. package/cjs/types/common.js +12 -1
  35. package/cjs/types/euler.d.ts +3 -3
  36. package/cjs/types/fluid.d.ts +3 -5
  37. package/cjs/types/index.d.ts +2 -0
  38. package/cjs/types/index.js +2 -0
  39. package/cjs/types/liquityV2.d.ts +3 -3
  40. package/cjs/types/llamaLend.d.ts +3 -1
  41. package/cjs/types/merit.d.ts +9 -0
  42. package/cjs/types/merit.js +2 -0
  43. package/cjs/types/merkl.d.ts +75 -0
  44. package/cjs/types/merkl.js +14 -0
  45. package/cjs/types/morphoBlue.d.ts +3 -5
  46. package/cjs/types/spark.d.ts +0 -3
  47. package/esm/aaveV2/index.js +9 -5
  48. package/esm/aaveV3/index.d.ts +3 -0
  49. package/esm/aaveV3/index.js +65 -47
  50. package/esm/aaveV3/merit.d.ts +7 -0
  51. package/esm/aaveV3/merit.js +90 -0
  52. package/esm/aaveV3/merkl.d.ts +9 -0
  53. package/esm/aaveV3/merkl.js +82 -0
  54. package/esm/compoundV2/index.js +13 -7
  55. package/esm/compoundV3/index.js +8 -3
  56. package/esm/config/contracts.d.ts +6510 -1851
  57. package/esm/config/contracts.js +33 -12
  58. package/esm/contracts.d.ts +178 -0
  59. package/esm/eulerV2/index.js +11 -2
  60. package/esm/fluid/index.js +109 -35
  61. package/esm/helpers/aaveHelpers/index.js +0 -1
  62. package/esm/helpers/compoundHelpers/index.d.ts +5 -7
  63. package/esm/helpers/compoundHelpers/index.js +34 -14
  64. package/esm/helpers/eulerHelpers/index.d.ts +0 -5
  65. package/esm/helpers/eulerHelpers/index.js +2 -30
  66. package/esm/helpers/fluidHelpers/index.js +2 -0
  67. package/esm/helpers/liquityV2Helpers/index.js +3 -2
  68. package/esm/liquityV2/index.js +11 -3
  69. package/esm/llamaLend/index.js +11 -3
  70. package/esm/morphoBlue/index.js +21 -7
  71. package/esm/spark/index.js +21 -31
  72. package/esm/staking/eligibility.d.ts +19 -0
  73. package/esm/staking/eligibility.js +58 -0
  74. package/esm/staking/index.d.ts +1 -0
  75. package/esm/staking/index.js +1 -0
  76. package/esm/staking/staking.d.ts +1 -7
  77. package/esm/staking/staking.js +28 -53
  78. package/esm/types/aave.d.ts +3 -8
  79. package/esm/types/common.d.ts +18 -4
  80. package/esm/types/common.js +11 -0
  81. package/esm/types/euler.d.ts +3 -3
  82. package/esm/types/fluid.d.ts +3 -5
  83. package/esm/types/index.d.ts +2 -0
  84. package/esm/types/index.js +2 -0
  85. package/esm/types/liquityV2.d.ts +3 -3
  86. package/esm/types/llamaLend.d.ts +3 -1
  87. package/esm/types/merit.d.ts +9 -0
  88. package/esm/types/merit.js +1 -0
  89. package/esm/types/merkl.d.ts +75 -0
  90. package/esm/types/merkl.js +11 -0
  91. package/esm/types/morphoBlue.d.ts +3 -5
  92. package/esm/types/spark.d.ts +0 -3
  93. package/package.json +1 -1
  94. package/src/aaveV2/index.ts +10 -7
  95. package/src/aaveV3/index.ts +77 -49
  96. package/src/aaveV3/merit.ts +94 -0
  97. package/src/aaveV3/merkl.ts +74 -0
  98. package/src/compoundV2/index.ts +13 -9
  99. package/src/compoundV3/index.ts +8 -4
  100. package/src/config/contracts.ts +34 -13
  101. package/src/eulerV2/index.ts +13 -3
  102. package/src/fluid/index.ts +107 -37
  103. package/src/helpers/aaveHelpers/index.ts +0 -1
  104. package/src/helpers/compoundHelpers/index.ts +41 -19
  105. package/src/helpers/eulerHelpers/index.ts +3 -40
  106. package/src/helpers/fluidHelpers/index.ts +2 -0
  107. package/src/helpers/liquityV2Helpers/index.ts +4 -2
  108. package/src/liquityV2/index.ts +13 -3
  109. package/src/llamaLend/index.ts +13 -4
  110. package/src/morphoBlue/index.ts +21 -7
  111. package/src/spark/index.ts +21 -33
  112. package/src/staking/eligibility.ts +61 -0
  113. package/src/staking/index.ts +2 -1
  114. package/src/staking/staking.ts +29 -54
  115. package/src/types/aave.ts +3 -8
  116. package/src/types/common.ts +21 -4
  117. package/src/types/euler.ts +3 -2
  118. package/src/types/fluid.ts +3 -5
  119. package/src/types/index.ts +3 -1
  120. package/src/types/liquityV2.ts +3 -3
  121. package/src/types/llamaLend.ts +3 -1
  122. package/src/types/merit.ts +2 -0
  123. package/src/types/merkl.ts +71 -0
  124. package/src/types/morphoBlue.ts +5 -5
  125. package/src/types/spark.ts +1 -3
@@ -15,6 +15,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.getAaveV2FullPositionData = exports.getAaveV2AccountData = exports._getAaveV2AccountData = exports.getAaveV2AccountBalances = exports._getAaveV2AccountBalances = exports.getAaveV2MarketsData = exports._getAaveV2MarketsData = void 0;
16
16
  const decimal_js_1 = __importDefault(require("decimal.js"));
17
17
  const tokens_1 = require("@defisaver/tokens");
18
+ const common_1 = require("../types/common");
18
19
  const staking_1 = require("../staking");
19
20
  const utils_1 = require("../services/utils");
20
21
  const contracts_1 = require("../contracts");
@@ -62,15 +63,18 @@ const _getAaveV2MarketsData = (provider, network, selectedMarket) => __awaiter(v
62
63
  totalBorrow: (0, tokens_1.assetAmountInEth)(market.totalBorrow.toString(), selectedMarket.assets[i]),
63
64
  totalBorrowVar: (0, tokens_1.assetAmountInEth)(market.totalBorrowVar.toString(), selectedMarket.assets[i]),
64
65
  priceInEth: new decimal_js_1.default(market.price.toString()).div(1e18).toString(),
65
- incentiveSupplyToken: 'AAVE',
66
- incentiveBorrowToken: 'AAVE',
67
- incentiveSupplyApy: '0',
66
+ supplyIncentives: [],
67
+ borrowIncentives: [],
68
68
  price: new decimal_js_1.default(market.price.toString()).div(1e18).mul(ethPrice).toString(),
69
69
  }));
70
70
  const stEthMarket = markets.find(({ symbol }) => symbol === 'stETH');
71
71
  if (stEthMarket) {
72
- stEthMarket.incentiveSupplyApy = yield (0, staking_1.getStakingApy)('stETH');
73
- stEthMarket.incentiveSupplyToken = 'stETH';
72
+ stEthMarket.supplyIncentives.push({
73
+ apy: yield (0, staking_1.getStakingApy)('stETH'),
74
+ token: 'stETH',
75
+ incentiveKind: common_1.IncentiveKind.Staking,
76
+ description: 'Native stETH yield.',
77
+ });
74
78
  }
75
79
  const payload = {};
76
80
  // Sort by market size
@@ -1,6 +1,8 @@
1
1
  import { Client } from 'viem';
2
2
  import { AaveMarketInfo, AaveV3MarketData, AaveV3PositionData, AaveV3UsedAssets, EModeCategoryDataMapping } from '../types/aave';
3
3
  import { Blockish, EthAddress, EthereumProvider, NetworkNumber, PositionBalances } from '../types/common';
4
+ import { getMeritCampaigns } from './merit';
5
+ import { getMerkleCampaigns } from './merkl';
4
6
  export declare const aaveV3EmodeCategoriesMapping: (extractedState: any, usedAssets: AaveV3UsedAssets) => {
5
7
  [key: number]: EModeCategoryDataMapping;
6
8
  };
@@ -32,3 +34,4 @@ export declare const getAaveV3AccountBalances: (provider: EthereumProvider, netw
32
34
  export declare const _getAaveV3AccountData: (provider: Client, network: NetworkNumber, address: EthAddress, extractedState: any, blockNumber?: "latest" | number) => Promise<AaveV3PositionData>;
33
35
  export declare const getAaveV3AccountData: (provider: EthereumProvider, network: NetworkNumber, address: EthAddress, extractedState: any, blockNumber?: "latest" | number) => Promise<AaveV3PositionData>;
34
36
  export declare const getAaveV3FullPositionData: (provider: EthereumProvider, network: NetworkNumber, address: EthAddress, market: AaveMarketInfo) => Promise<AaveV3PositionData>;
37
+ export { getMeritCampaigns, getMerkleCampaigns, };
@@ -12,7 +12,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
12
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.getAaveV3FullPositionData = exports.getAaveV3AccountData = exports._getAaveV3AccountData = exports.getAaveV3AccountBalances = exports._getAaveV3AccountBalances = exports.EMPTY_AAVE_DATA = exports.aaveV3EmodeCategoriesMapping = void 0;
15
+ exports.getMerkleCampaigns = exports.getMeritCampaigns = exports.getAaveV3FullPositionData = exports.getAaveV3AccountData = exports._getAaveV3AccountData = exports.getAaveV3AccountBalances = exports._getAaveV3AccountBalances = exports.EMPTY_AAVE_DATA = exports.aaveV3EmodeCategoriesMapping = void 0;
16
16
  exports._getAaveV3MarketData = _getAaveV3MarketData;
17
17
  exports.getAaveV3MarketData = getAaveV3MarketData;
18
18
  const tokens_1 = require("@defisaver/tokens");
@@ -25,6 +25,10 @@ const utils_1 = require("../services/utils");
25
25
  const staking_1 = require("../staking");
26
26
  const common_1 = require("../types/common");
27
27
  const viem_1 = require("../services/viem");
28
+ const merit_1 = require("./merit");
29
+ Object.defineProperty(exports, "getMeritCampaigns", { enumerable: true, get: function () { return merit_1.getMeritCampaigns; } });
30
+ const merkl_1 = require("./merkl");
31
+ Object.defineProperty(exports, "getMerkleCampaigns", { enumerable: true, get: function () { return merkl_1.getMerkleCampaigns; } });
28
32
  const aaveV3EmodeCategoriesMapping = (extractedState, usedAssets) => {
29
33
  const { eModeCategoriesData } = extractedState;
30
34
  const usedAssetsValues = Object.values(usedAssets);
@@ -60,11 +64,13 @@ function _getAaveV3MarketData(provider_1, network_1, market_1) {
60
64
  const marketAddress = market.providerAddress;
61
65
  const networksWithIncentives = [common_1.NetworkNumber.Eth, common_1.NetworkNumber.Arb, common_1.NetworkNumber.Opt, common_1.NetworkNumber.Linea];
62
66
  // eslint-disable-next-line prefer-const
63
- let [loanInfo, eModesInfo, isBorrowAllowed, rewardInfo] = yield Promise.all([
67
+ let [loanInfo, eModesInfo, isBorrowAllowed, rewardInfo, merkleRewardsMap, meritRewardsMap] = yield Promise.all([
64
68
  loanInfoContract.read.getFullTokensInfo([marketAddress, _addresses], (0, viem_1.setViemBlockNumber)(blockNumber)),
65
69
  loanInfoContract.read.getAllEmodes([marketAddress], (0, viem_1.setViemBlockNumber)(blockNumber)),
66
70
  loanInfoContract.read.isBorrowAllowed([marketAddress], (0, viem_1.setViemBlockNumber)(blockNumber)), // Used on L2s check for PriceOracleSentinel (mainnet will always return true)
67
71
  networksWithIncentives.includes(network) ? aaveIncentivesContract.read.getReservesIncentivesData([marketAddress], (0, viem_1.setViemBlockNumber)(blockNumber)) : null,
72
+ (0, merkl_1.getMerkleCampaigns)(network),
73
+ (0, merit_1.getMeritCampaigns)(network, market.value),
68
74
  ]);
69
75
  isBorrowAllowed = (0, utils_1.isLayer2Network)(network) ? isBorrowAllowed : true;
70
76
  const eModeCategoriesData = {};
@@ -146,47 +152,74 @@ function _getAaveV3MarketData(provider_1, network_1, market_1) {
146
152
  isolationModeBorrowingEnabled: tokenMarket.isolationModeBorrowingEnabled,
147
153
  isFlashLoanEnabled: tokenMarket.isFlashLoanEnabled,
148
154
  aTokenAddress: tokenMarket.aTokenAddress,
155
+ vTokenAddress: tokenMarket.debtTokenAddress,
156
+ supplyIncentives: [],
157
+ borrowIncentives: [],
149
158
  });
150
159
  })));
151
160
  // Get incentives data
152
- yield Promise.all(assetsData.map((_market) => __awaiter(this, void 0, void 0, function* () {
161
+ yield Promise.all(assetsData.map((_market, index) => __awaiter(this, void 0, void 0, function* () {
162
+ var _a, _b;
153
163
  /* eslint-disable no-param-reassign */
154
164
  // @ts-ignore
155
165
  const rewardForMarket = rewardInfo === null || rewardInfo === void 0 ? void 0 : rewardInfo[_market.underlyingTokenAddress];
156
166
  const isStakingAsset = staking_1.STAKING_ASSETS.includes(_market.symbol);
157
167
  if (isStakingAsset) {
158
- _market.incentiveSupplyApy = yield (0, staking_1.getStakingApy)(_market.symbol);
159
- _market.incentiveSupplyToken = _market.symbol;
160
- if (!_market.supplyIncentives) {
161
- _market.supplyIncentives = [];
162
- }
168
+ const yieldApy = yield (0, staking_1.getStakingApy)(_market.symbol);
163
169
  _market.supplyIncentives.push({
164
- apy: _market.incentiveSupplyApy || '0',
170
+ apy: yieldApy,
165
171
  token: _market.symbol,
166
- incentiveKind: 'staking',
172
+ incentiveKind: common_1.IncentiveKind.Staking,
173
+ description: `Native ${_market.symbol} yield.`,
167
174
  });
168
- }
169
- if (_market.canBeBorrowed && _market.incentiveSupplyApy) {
170
- _market.incentiveBorrowApy = _market.incentiveSupplyApy;
171
- _market.incentiveBorrowToken = _market.incentiveSupplyToken;
172
- if (!_market.borrowIncentives) {
173
- _market.borrowIncentives = [];
175
+ if (_market.canBeBorrowed) {
176
+ // when borrowing assets whose value increases over time
177
+ _market.borrowIncentives.push({
178
+ apy: new decimal_js_1.default(yieldApy).mul(-1).toString(),
179
+ token: _market.symbol,
180
+ incentiveKind: common_1.IncentiveKind.Reward,
181
+ description: `Due to the native yield of ${_market.symbol}, the value of the debt would increase over time.`,
182
+ });
174
183
  }
184
+ }
185
+ const aTokenAddress = _market.aTokenAddress.toLowerCase(); // DEV: Should aTokenAddress be in AaveV3AssetData type?
186
+ if ((_a = merkleRewardsMap[aTokenAddress]) === null || _a === void 0 ? void 0 : _a.supply) {
187
+ const { apy, rewardTokenSymbol, description, identifier, } = merkleRewardsMap[aTokenAddress].supply;
188
+ _market.supplyIncentives.push({
189
+ apy,
190
+ token: rewardTokenSymbol,
191
+ incentiveKind: common_1.IncentiveKind.Reward,
192
+ description,
193
+ eligibilityId: identifier,
194
+ });
195
+ }
196
+ const vTokenAddress = _market.vTokenAddress.toLowerCase(); // DEV: Should vTokenAddress be in AaveV3AssetData type?
197
+ if ((_b = merkleRewardsMap[vTokenAddress]) === null || _b === void 0 ? void 0 : _b.borrow) {
198
+ const { apy, rewardTokenSymbol, description, identifier, } = merkleRewardsMap[vTokenAddress].borrow;
175
199
  _market.borrowIncentives.push({
176
- apy: _market.incentiveBorrowApy,
177
- token: _market.incentiveBorrowToken,
178
- incentiveKind: 'reward',
200
+ apy,
201
+ token: rewardTokenSymbol,
202
+ incentiveKind: common_1.IncentiveKind.Reward,
203
+ description,
204
+ eligibilityId: identifier,
179
205
  });
180
206
  }
181
- if (_market.symbol === 'USDe') {
182
- const merklApy = yield (0, staking_1.getStakingApy)(_market.symbol);
183
- if (!_market.supplyIncentives) {
184
- _market.supplyIncentives = [];
185
- }
207
+ if (meritRewardsMap.supply[_market.symbol]) {
208
+ const { apy, rewardTokenSymbol, description } = meritRewardsMap.supply[_market.symbol];
186
209
  _market.supplyIncentives.push({
187
- apy: merklApy || '0',
188
- token: _market.symbol,
189
- incentiveKind: 'reward',
210
+ apy,
211
+ token: rewardTokenSymbol,
212
+ incentiveKind: common_1.IncentiveKind.Reward,
213
+ description,
214
+ });
215
+ }
216
+ if (meritRewardsMap.borrow[_market.symbol]) {
217
+ const { apy, rewardTokenSymbol, description } = meritRewardsMap.borrow[_market.symbol];
218
+ _market.borrowIncentives.push({
219
+ apy,
220
+ token: rewardTokenSymbol,
221
+ incentiveKind: common_1.IncentiveKind.Reward,
222
+ description,
190
223
  });
191
224
  }
192
225
  if (!rewardForMarket)
@@ -196,10 +229,7 @@ function _getAaveV3MarketData(provider_1, network_1, market_1) {
196
229
  if (supplyRewardData) {
197
230
  if (+(supplyRewardData.emissionEndTimestamp.toString()) * 1000 < Date.now())
198
231
  return;
199
- _market.incentiveSupplyToken = supplyRewardData.rewardTokenSymbol;
200
232
  // reward token is aave asset
201
- if (supplyRewardData.rewardTokenSymbol.startsWith('a') && supplyRewardData.rewardTokenSymbol.includes(_market.symbol))
202
- _market.incentiveSupplyToken = _market.symbol;
203
233
  const supplyEmissionPerSecond = supplyRewardData.emissionPerSecond;
204
234
  const supplyRewardPrice = new decimal_js_1.default(supplyRewardData.rewardPriceFeed).div(Math.pow(10, +supplyRewardData.priceFeedDecimals))
205
235
  .toString();
@@ -209,15 +239,11 @@ function _getAaveV3MarketData(provider_1, network_1, market_1) {
209
239
  .div(_market.price)
210
240
  .div(_market.totalSupply)
211
241
  .toString();
212
- _market.incentiveSupplyApy = new decimal_js_1.default(_market.incentiveSupplyApy || '0').add(rewardApy)
213
- .toString();
214
- if (!_market.supplyIncentives) {
215
- _market.supplyIncentives = [];
216
- }
217
242
  _market.supplyIncentives.push({
218
- token: supplyRewardData.rewardTokenSymbol,
243
+ token: (0, merkl_1.getAaveUnderlyingSymbol)(supplyRewardData.rewardTokenSymbol),
219
244
  apy: rewardApy,
220
- incentiveKind: 'reward',
245
+ incentiveKind: common_1.IncentiveKind.Reward,
246
+ description: 'Eligible for protocol-level incentives.',
221
247
  });
222
248
  }
223
249
  });
@@ -226,9 +252,6 @@ function _getAaveV3MarketData(provider_1, network_1, market_1) {
226
252
  if (borrowRewardData) {
227
253
  if (+(borrowRewardData.emissionEndTimestamp.toString()) * 1000 < Date.now())
228
254
  return;
229
- _market.incentiveBorrowToken = borrowRewardData.rewardTokenSymbol;
230
- if (borrowRewardData.rewardTokenSymbol.startsWith('a') && borrowRewardData.rewardTokenSymbol.includes(_market.symbol))
231
- _market.incentiveBorrowToken = _market.symbol;
232
255
  const supplyEmissionPerSecond = borrowRewardData.emissionPerSecond;
233
256
  const supplyRewardPrice = new decimal_js_1.default(borrowRewardData.rewardPriceFeed).div(Math.pow(10, +borrowRewardData.priceFeedDecimals))
234
257
  .toString();
@@ -238,15 +261,11 @@ function _getAaveV3MarketData(provider_1, network_1, market_1) {
238
261
  .div(_market.price)
239
262
  .div(_market.totalBorrowVar)
240
263
  .toString();
241
- _market.incentiveBorrowApy = new decimal_js_1.default(_market.incentiveBorrowApy || '0').add(rewardApy)
242
- .toString();
243
- if (!_market.borrowIncentives) {
244
- _market.borrowIncentives = [];
245
- }
246
264
  _market.borrowIncentives.push({
247
- token: borrowRewardData.rewardTokenSymbol,
265
+ token: (0, merkl_1.getAaveUnderlyingSymbol)(borrowRewardData.rewardTokenSymbol),
248
266
  apy: rewardApy,
249
- incentiveKind: 'reward',
267
+ incentiveKind: common_1.IncentiveKind.Reward,
268
+ description: 'Eligible for protocol-level incentives.',
250
269
  });
251
270
  }
252
271
  });
@@ -0,0 +1,7 @@
1
+ import { NetworkNumber } from '../types/common';
2
+ import { AaveVersions, MeritTokenRewardMap } from '../types';
3
+ /**
4
+ * Fetches merit rewards data from Aave API
5
+ */
6
+ export declare const fetchMeritRewardsData: () => Promise<Record<string, number | null>>;
7
+ export declare const getMeritCampaigns: (chainId: NetworkNumber, market: AaveVersions) => Promise<MeritTokenRewardMap>;
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.getMeritCampaigns = exports.fetchMeritRewardsData = void 0;
13
+ const utils_1 = require("../services/utils");
14
+ const common_1 = require("../types/common");
15
+ const moneymarket_1 = require("../moneymarket");
16
+ const types_1 = require("../types");
17
+ /**
18
+ * Maps API keys to reward data & actions - hardcoded and needs to be maintained actively.
19
+ * Mapping based on Aave interface implementation: https://github.com/aave/interface/blob/main/src/hooks/useMeritIncentives.ts
20
+ * Active campaigns found here: https://apps.aavechan.com/merit
21
+ */
22
+ const MERIT_DATA_MAP = {
23
+ [common_1.NetworkNumber.Eth]: {
24
+ [types_1.AaveVersions.AaveV3]: {
25
+ 'ethereum-supply-ethx': { rewardTokenSymbol: 'SD', action: 'supply', supplyTokens: ['ETHx'] },
26
+ 'ethereum-supply-rlusd': { rewardTokenSymbol: 'aEthRLUSD', action: 'supply', supplyTokens: ['RLUSD'] },
27
+ // Campaign disabled here as it's present on Merkl API:
28
+ // 'ethereum-borrow-eurc': { rewardTokenSymbol: 'aEthEURC', action: 'borrow', borrowTokens: ['EURC'] },
29
+ },
30
+ [types_1.AaveVersions.AaveV3Lido]: {},
31
+ [types_1.AaveVersions.AaveV3Etherfi]: {},
32
+ },
33
+ [common_1.NetworkNumber.Arb]: {
34
+ [types_1.AaveVersions.AaveV3]: {},
35
+ },
36
+ [common_1.NetworkNumber.Opt]: {
37
+ [types_1.AaveVersions.AaveV3]: {},
38
+ },
39
+ [common_1.NetworkNumber.Base]: {
40
+ [types_1.AaveVersions.AaveV3]: {
41
+ 'base-borrow-usdc': { rewardTokenSymbol: 'USDC', action: 'borrow', borrowTokens: ['USDC'] },
42
+ 'base-borrow-gho': { rewardTokenSymbol: 'GHO', action: 'borrow', borrowTokens: ['GHO'] },
43
+ 'base-borrow-eurc': { rewardTokenSymbol: 'EURC', action: 'borrow', borrowTokens: ['EURC'] },
44
+ },
45
+ },
46
+ [common_1.NetworkNumber.Linea]: {
47
+ [types_1.AaveVersions.AaveV3]: {},
48
+ },
49
+ };
50
+ /**
51
+ * Fetches merit rewards data from Aave API
52
+ */
53
+ const fetchMeritRewardsData = () => __awaiter(void 0, void 0, void 0, function* () {
54
+ try {
55
+ const response = yield fetch('https://apps.aavechan.com/api/merit/aprs', {
56
+ signal: AbortSignal.timeout(utils_1.DEFAULT_TIMEOUT),
57
+ });
58
+ const data = yield response.json();
59
+ return data.currentAPR.actionsAPR;
60
+ }
61
+ catch (error) {
62
+ console.error('Failed to fetch merit rewards data:', error);
63
+ return {};
64
+ }
65
+ });
66
+ exports.fetchMeritRewardsData = fetchMeritRewardsData;
67
+ const getMeritCampaigns = (chainId, market) => __awaiter(void 0, void 0, void 0, function* () {
68
+ var _a;
69
+ const meritData = yield (0, exports.fetchMeritRewardsData)();
70
+ const relevantCampaigns = {
71
+ supply: {},
72
+ borrow: {},
73
+ };
74
+ Object.entries(((_a = MERIT_DATA_MAP[chainId]) === null || _a === void 0 ? void 0 : _a[market]) || {})
75
+ .filter(([key, rewardData]) => !!meritData[key])
76
+ .forEach(([key, rewardData]) => {
77
+ var _a, _b;
78
+ const apr = meritData[key];
79
+ if (!apr)
80
+ return;
81
+ const reward = {
82
+ rewardTokenSymbol: rewardData.rewardTokenSymbol,
83
+ apy: (0, moneymarket_1.aprToApy)(apr).toString(),
84
+ description: `Eligible for Merit rewards in ${rewardData.rewardTokenSymbol}. ${rewardData.message ? `\n${rewardData.message}` : ''}`,
85
+ };
86
+ (_a = rewardData.supplyTokens) === null || _a === void 0 ? void 0 : _a.forEach(token => {
87
+ relevantCampaigns.supply[token] = reward;
88
+ });
89
+ (_b = rewardData.borrowTokens) === null || _b === void 0 ? void 0 : _b.forEach(token => {
90
+ relevantCampaigns.borrow[token] = reward;
91
+ });
92
+ });
93
+ return relevantCampaigns;
94
+ });
95
+ exports.getMeritCampaigns = getMeritCampaigns;
@@ -0,0 +1,9 @@
1
+ import { MerkleRewardMap } from '../types';
2
+ import { NetworkNumber } from '../types/common';
3
+ export declare const getAaveUnderlyingSymbol: (_symbol?: string) => any;
4
+ /**
5
+ * aEthLidoUSDC -> aUSDC
6
+ * USDC -> USDC
7
+ */
8
+ export declare const formatAaveAsset: (_symbol: string) => string;
9
+ export declare const getMerkleCampaigns: (chainId: NetworkNumber) => Promise<MerkleRewardMap>;
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.getMerkleCampaigns = exports.formatAaveAsset = exports.getAaveUnderlyingSymbol = void 0;
13
+ const moneymarket_1 = require("../moneymarket");
14
+ const utils_1 = require("../services/utils");
15
+ const types_1 = require("../types");
16
+ const getAaveUnderlyingSymbol = (_symbol = '') => {
17
+ let symbol = _symbol
18
+ .replace(/^aEthLido/, '')
19
+ .replace(/^aEthEtherFi/, '')
20
+ .replace(/^aEth/, '')
21
+ .replace(/^aArb/, '')
22
+ .replace(/^aOpt/, '')
23
+ .replace(/^aBas/, '')
24
+ .replace(/^aLin/, '');
25
+ if (symbol.startsWith('a'))
26
+ symbol = symbol.slice(1);
27
+ return (0, utils_1.wethToEth)(symbol);
28
+ };
29
+ exports.getAaveUnderlyingSymbol = getAaveUnderlyingSymbol;
30
+ /**
31
+ * aEthLidoUSDC -> aUSDC
32
+ * USDC -> USDC
33
+ */
34
+ const formatAaveAsset = (_symbol) => {
35
+ if (_symbol.startsWith('a')) {
36
+ return `a${(0, exports.getAaveUnderlyingSymbol)(_symbol)}`;
37
+ }
38
+ return _symbol;
39
+ };
40
+ exports.formatAaveAsset = formatAaveAsset;
41
+ const getMerkleCampaigns = (chainId) => __awaiter(void 0, void 0, void 0, function* () {
42
+ try {
43
+ const res = yield fetch('https://api.merkl.xyz/v4/opportunities?mainProtocolId=aave', {
44
+ signal: AbortSignal.timeout(utils_1.DEFAULT_TIMEOUT),
45
+ });
46
+ if (!res.ok)
47
+ throw new Error('Failed to fetch Merkle campaigns');
48
+ const opportunities = yield res.json();
49
+ const relevantOpportunities = opportunities
50
+ .filter((o) => o.chainId === chainId)
51
+ .filter((o) => o.status === types_1.OpportunityStatus.LIVE);
52
+ return relevantOpportunities.reduce((acc, opportunity) => {
53
+ var _a, _b;
54
+ const rewardToken = opportunity.rewardsRecord.breakdowns[0].token;
55
+ const description = `Eligible for ${(0, exports.formatAaveAsset)(rewardToken.symbol)} rewards through Merkl. ${opportunity.description ? `\n${opportunity.description}` : ''}`;
56
+ if (opportunity.action === types_1.OpportunityAction.LEND && opportunity.explorerAddress) {
57
+ const supplyAToken = (_a = opportunity.explorerAddress) === null || _a === void 0 ? void 0 : _a.toLowerCase();
58
+ if (!acc[supplyAToken])
59
+ acc[supplyAToken] = {};
60
+ acc[supplyAToken].supply = {
61
+ apy: (0, moneymarket_1.aprToApy)(opportunity.apr),
62
+ // rewardToken: rewardToken.address,
63
+ rewardTokenSymbol: rewardToken.symbol,
64
+ description,
65
+ identifier: opportunity.identifier,
66
+ };
67
+ }
68
+ if (opportunity.action === types_1.OpportunityAction.BORROW && opportunity.explorerAddress) {
69
+ const borrowAToken = (_b = opportunity.explorerAddress) === null || _b === void 0 ? void 0 : _b.toLowerCase();
70
+ if (!acc[borrowAToken])
71
+ acc[borrowAToken] = {};
72
+ acc[borrowAToken].borrow = {
73
+ apy: (0, moneymarket_1.aprToApy)(opportunity.apr),
74
+ // rewardToken: rewardToken.address,
75
+ rewardTokenSymbol: rewardToken.symbol,
76
+ description,
77
+ identifier: opportunity.identifier,
78
+ };
79
+ }
80
+ return acc;
81
+ }, {});
82
+ }
83
+ catch (e) {
84
+ console.error('Failed to fetch Merkle campaigns', e);
85
+ return {};
86
+ }
87
+ });
88
+ exports.getMerkleCampaigns = getMerkleCampaigns;
@@ -18,6 +18,7 @@ const decimal_js_1 = __importDefault(require("decimal.js"));
18
18
  const constants_1 = require("../constants");
19
19
  const moneymarket_1 = require("../moneymarket");
20
20
  const utils_1 = require("../services/utils");
21
+ const common_1 = require("../types/common");
21
22
  const contracts_1 = require("../contracts");
22
23
  const markets_1 = require("../markets");
23
24
  const compoundHelpers_1 = require("../helpers/compoundHelpers");
@@ -39,9 +40,6 @@ const _getCompoundV2MarketsData = (provider, network) => __awaiter(void 0, void
39
40
  const compBorrowSpeeds = market.compBorrowSpeeds.toString();
40
41
  const assetPrice = market.price.toString();
41
42
  const pricePrecisionDiff = 18 - (0, tokens_1.getAssetInfo)((0, tokens_1.getAssetInfoByAddress)(cAddresses[i]).underlyingAsset).decimals;
42
- // compSupplySpeeds/compBorrowSpeeds is per block per market (borrow & supply are separate markets)
43
- const incentiveSupplyApy = (0, moneymarket_1.aprToApy)((100 * constants_1.BLOCKS_IN_A_YEAR * +compSupplySpeeds * +compPrice) / +assetPrice / +totalSupply).toString();
44
- const incentiveBorrowApy = (0, moneymarket_1.aprToApy)((100 * constants_1.BLOCKS_IN_A_YEAR * +compBorrowSpeeds * +compPrice) / +assetPrice / +totalBorrow).toString();
45
43
  if (cAddresses[i].toLowerCase() === '0xc11b1268c1a384e55c48c2391d8d480264a3a7f4'.toLowerCase()) {
46
44
  symbol = 'WBTC Legacy';
47
45
  isWbtcLegacy = true;
@@ -51,10 +49,18 @@ const _getCompoundV2MarketsData = (provider, network) => __awaiter(void 0, void
51
49
  underlyingTokenAddress: market.underlyingTokenAddress,
52
50
  supplyRate: (0, moneymarket_1.aprToApy)(new decimal_js_1.default(constants_1.BLOCKS_IN_A_YEAR).times(market.supplyRate.toString()).div(1e16).toString()).toString(),
53
51
  borrowRate: (0, moneymarket_1.aprToApy)(new decimal_js_1.default(constants_1.BLOCKS_IN_A_YEAR).times(market.borrowRate.toString()).div(1e16).toString()).toString(),
54
- incentiveSupplyToken: 'COMP',
55
- incentiveBorrowToken: 'COMP',
56
- incentiveSupplyApy,
57
- incentiveBorrowApy,
52
+ supplyIncentives: [{
53
+ token: 'COMP',
54
+ apy: (0, moneymarket_1.aprToApy)((100 * constants_1.BLOCKS_IN_A_YEAR * +compSupplySpeeds * +compPrice) / +assetPrice / +totalSupply).toString(),
55
+ incentiveKind: common_1.IncentiveKind.Reward,
56
+ description: 'Eligible for protocol-level COMP incentives.',
57
+ }],
58
+ borrowIncentives: [{
59
+ token: 'COMP',
60
+ apy: (0, moneymarket_1.aprToApy)((100 * constants_1.BLOCKS_IN_A_YEAR * +compBorrowSpeeds * +compPrice) / +assetPrice / +totalBorrow).toString(),
61
+ incentiveKind: common_1.IncentiveKind.Reward,
62
+ description: 'Eligible for protocol-level COMP incentives.',
63
+ }],
58
64
  collateralFactor: new decimal_js_1.default(market.collateralFactor.toString()).div(1e18).toString(),
59
65
  marketLiquidity: (0, tokens_1.assetAmountInEth)(market.marketLiquidity.toString(), (0, utils_1.handleWbtcLegacy)(symbol)),
60
66
  utilization: new decimal_js_1.default(market.totalBorrow.toString()).div(totalSupply).times(100).toString(),
@@ -16,6 +16,7 @@ exports.getCompoundV3FullPositionData = exports.getCompoundV3AccountData = expor
16
16
  const decimal_js_1 = __importDefault(require("decimal.js"));
17
17
  const tokens_1 = require("@defisaver/tokens");
18
18
  const contracts_1 = require("../contracts");
19
+ const common_1 = require("../types/common");
19
20
  const staking_1 = require("../staking");
20
21
  const utils_1 = require("../services/utils");
21
22
  const constants_1 = require("../constants");
@@ -49,13 +50,17 @@ const _getCompoundV3MarketsData = (provider, network, selectedMarket, defaultPro
49
50
  .map((coll) => (0, compoundHelpers_1.formatMarketData)(coll, network, baseAssetPrice));
50
51
  for (const coll of colls) {
51
52
  if (staking_1.STAKING_ASSETS.includes(coll.symbol)) {
52
- coll.incentiveSupplyApy = yield (0, staking_1.getStakingApy)(coll.symbol);
53
- coll.incentiveSupplyToken = coll.symbol;
53
+ coll.supplyIncentives.push({
54
+ apy: yield (0, staking_1.getStakingApy)(coll.symbol),
55
+ token: coll.symbol,
56
+ incentiveKind: common_1.IncentiveKind.Staking,
57
+ description: `Native ${coll.symbol} yield.`,
58
+ });
54
59
  }
55
60
  }
56
61
  const base = (0, compoundHelpers_1.formatBaseData)(baseTokenInfo, network, baseAssetPrice);
57
62
  const payload = {};
58
- const baseObj = Object.assign(Object.assign({}, base), (0, compoundHelpers_1.getIncentiveApys)(base, compPrice));
63
+ const baseObj = Object.assign(Object.assign({}, base), (yield (0, compoundHelpers_1.getIncentiveApys)(base, compPrice)));
59
64
  const allAssets = [baseObj, ...colls];
60
65
  allAssets
61
66
  .sort((a, b) => {