@defisaver/positions-sdk 2.1.75 → 2.1.78-aave-v4-dev

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/cjs/aaveV3/merkl.js +1 -1
  2. package/cjs/aaveV4/index.d.ts +7 -0
  3. package/cjs/aaveV4/index.js +298 -0
  4. package/cjs/aaveV4/lend.d.ts +45 -0
  5. package/cjs/aaveV4/lend.js +141 -0
  6. package/cjs/claiming/aaveV3.js +1 -1
  7. package/cjs/config/contracts.d.ts +1551 -0
  8. package/cjs/config/contracts.js +9 -0
  9. package/cjs/contracts.d.ts +32741 -0
  10. package/cjs/contracts.js +2 -1
  11. package/cjs/helpers/aaveV4Helpers/index.d.ts +12 -0
  12. package/cjs/helpers/aaveV4Helpers/index.js +117 -0
  13. package/cjs/helpers/index.d.ts +1 -0
  14. package/cjs/helpers/index.js +2 -1
  15. package/cjs/index.d.ts +2 -1
  16. package/cjs/index.js +3 -1
  17. package/cjs/markets/aaveV4/index.d.ts +28 -0
  18. package/cjs/markets/aaveV4/index.js +140 -0
  19. package/cjs/markets/index.d.ts +1 -0
  20. package/cjs/markets/index.js +3 -1
  21. package/cjs/portfolio/index.js +20 -0
  22. package/cjs/savings/summerVaults/options.js +8 -8
  23. package/cjs/types/aaveV4.d.ts +153 -0
  24. package/cjs/types/aaveV4.js +19 -0
  25. package/cjs/types/index.d.ts +1 -0
  26. package/cjs/types/index.js +1 -0
  27. package/cjs/types/portfolio.d.ts +4 -0
  28. package/esm/aaveV3/merkl.js +1 -1
  29. package/esm/aaveV4/index.d.ts +7 -0
  30. package/esm/aaveV4/index.js +255 -0
  31. package/esm/aaveV4/lend.d.ts +45 -0
  32. package/esm/aaveV4/lend.js +134 -0
  33. package/esm/claiming/aaveV3.js +1 -1
  34. package/esm/config/contracts.d.ts +1551 -0
  35. package/esm/config/contracts.js +8 -0
  36. package/esm/contracts.d.ts +32741 -0
  37. package/esm/contracts.js +1 -0
  38. package/esm/helpers/aaveV4Helpers/index.d.ts +12 -0
  39. package/esm/helpers/aaveV4Helpers/index.js +108 -0
  40. package/esm/helpers/index.d.ts +1 -0
  41. package/esm/helpers/index.js +1 -0
  42. package/esm/index.d.ts +2 -1
  43. package/esm/index.js +2 -1
  44. package/esm/markets/aaveV4/index.d.ts +28 -0
  45. package/esm/markets/aaveV4/index.js +122 -0
  46. package/esm/markets/index.d.ts +1 -0
  47. package/esm/markets/index.js +1 -0
  48. package/esm/portfolio/index.js +21 -1
  49. package/esm/savings/summerVaults/options.js +8 -8
  50. package/esm/types/aaveV4.d.ts +153 -0
  51. package/esm/types/aaveV4.js +16 -0
  52. package/esm/types/index.d.ts +1 -0
  53. package/esm/types/index.js +1 -0
  54. package/esm/types/portfolio.d.ts +4 -0
  55. package/package.json +2 -2
  56. package/src/aaveV3/merkl.ts +1 -1
  57. package/src/aaveV4/index.ts +291 -0
  58. package/src/aaveV4/lend.ts +180 -0
  59. package/src/claiming/aaveV3.ts +1 -1
  60. package/src/config/contracts.ts +8 -0
  61. package/src/contracts.ts +2 -0
  62. package/src/helpers/aaveV4Helpers/index.ts +133 -0
  63. package/src/helpers/index.ts +1 -0
  64. package/src/index.ts +2 -0
  65. package/src/markets/aaveV4/index.ts +149 -0
  66. package/src/markets/index.ts +6 -1
  67. package/src/portfolio/index.ts +20 -0
  68. package/src/savings/summerVaults/options.ts +8 -8
  69. package/src/types/aaveV4.ts +169 -0
  70. package/src/types/index.ts +2 -1
  71. package/src/types/portfolio.ts +4 -0
@@ -40,7 +40,7 @@ const formatAaveAsset = (_symbol) => {
40
40
  exports.formatAaveAsset = formatAaveAsset;
41
41
  const getMerkleCampaigns = (chainId) => __awaiter(void 0, void 0, void 0, function* () {
42
42
  try {
43
- const res = yield fetch('https://api.merkl.xyz/v4/opportunities?mainProtocolId=aave', {
43
+ const res = yield fetch('https://api-merkl.angle.money/v4/opportunities?mainProtocolId=aave', {
44
44
  signal: AbortSignal.timeout(utils_1.DEFAULT_TIMEOUT),
45
45
  });
46
46
  if (!res.ok)
@@ -0,0 +1,7 @@
1
+ import { Client } from 'viem';
2
+ import { AaveV4AccountData, AaveV4SpokeData, AaveV4SpokeInfo, EthAddress, EthereumProvider, NetworkNumber } from '../types';
3
+ export * as lend from './lend';
4
+ export declare function _getAaveV4SpokeData(provider: Client, network: NetworkNumber, market: AaveV4SpokeInfo, blockNumber?: 'latest' | number): Promise<AaveV4SpokeData>;
5
+ export declare function getAaveV4SpokeData(provider: EthereumProvider, network: NetworkNumber, spoke: AaveV4SpokeInfo, blockNumber?: 'latest' | number): Promise<AaveV4SpokeData>;
6
+ export declare function _getAaveV4AccountData(provider: Client, network: NetworkNumber, spokeData: AaveV4SpokeData, address: EthAddress, blockNumber?: 'latest' | number): Promise<AaveV4AccountData>;
7
+ export declare function getAaveV4AccountData(provider: EthereumProvider, network: NetworkNumber, marketData: AaveV4SpokeData, address: EthAddress, blockNumber?: 'latest' | number): Promise<any>;
@@ -0,0 +1,298 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
36
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
37
+ return new (P || (P = Promise))(function (resolve, reject) {
38
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
39
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
40
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
41
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
42
+ });
43
+ };
44
+ var __importDefault = (this && this.__importDefault) || function (mod) {
45
+ return (mod && mod.__esModule) ? mod : { "default": mod };
46
+ };
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.lend = void 0;
49
+ exports._getAaveV4SpokeData = _getAaveV4SpokeData;
50
+ exports.getAaveV4SpokeData = getAaveV4SpokeData;
51
+ exports._getAaveV4AccountData = _getAaveV4AccountData;
52
+ exports.getAaveV4AccountData = getAaveV4AccountData;
53
+ const decimal_js_1 = __importDefault(require("decimal.js"));
54
+ const tokens_1 = require("@defisaver/tokens");
55
+ const viem_1 = require("../services/viem");
56
+ const types_1 = require("../types");
57
+ const contracts_1 = require("../contracts");
58
+ const staking_1 = require("../staking");
59
+ const utils_1 = require("../services/utils");
60
+ const aaveV4Helpers_1 = require("../helpers/aaveV4Helpers");
61
+ const aaveV4_1 = require("../markets/aaveV4");
62
+ const moneymarket_1 = require("../moneymarket");
63
+ exports.lend = __importStar(require("./lend"));
64
+ const fetchHubData = (viewContract, hubAddress) => __awaiter(void 0, void 0, void 0, function* () {
65
+ const hubData = yield viewContract.read.getHubAllAssetsData([hubAddress]);
66
+ return {
67
+ assets: hubData.reduce((acc, assetOnChainData) => {
68
+ acc[assetOnChainData.assetId] = {
69
+ assetId: assetOnChainData.assetId,
70
+ drawnRate: assetOnChainData.drawnRate,
71
+ liquidity: assetOnChainData.liquidity,
72
+ liquidityFee: assetOnChainData.liquidityFee,
73
+ swept: assetOnChainData.swept,
74
+ totalDrawn: assetOnChainData.totalDrawn,
75
+ totalDrawnShares: assetOnChainData.totalDrawnShares,
76
+ totalPremiumShares: assetOnChainData.totalPremiumShares,
77
+ };
78
+ return acc;
79
+ }, {}),
80
+ };
81
+ });
82
+ // TODO AaveV4: Will be used for after values, onchain data is available when fetching position data
83
+ const calcUserRiskPremiumBps = (usedAssets, assetsData) => {
84
+ const collaterals = [];
85
+ const debts = [];
86
+ Object.entries(usedAssets).forEach(([identifier, asset]) => {
87
+ const reserveData = assetsData[identifier];
88
+ if (!reserveData)
89
+ return;
90
+ const borrowedUsdDec = new decimal_js_1.default(asset.borrowedUsd || '0');
91
+ if (asset.isBorrowed && borrowedUsdDec.gt(0)) {
92
+ debts.push({ valueUsd: borrowedUsdDec });
93
+ }
94
+ const suppliedUsdDec = new decimal_js_1.default(asset.suppliedUsd || '0');
95
+ const isActiveCollateral = asset.collateral
96
+ && asset.isSupplied
97
+ && asset.collateralFactor > 0
98
+ && suppliedUsdDec.gt(0);
99
+ if (isActiveCollateral) {
100
+ // collateralRisk is stored as a fraction (e.g. 0.25), convert back to bps
101
+ const riskBps = new decimal_js_1.default(reserveData.collateralRisk).mul(10000).toNumber();
102
+ collaterals.push({
103
+ riskBps,
104
+ valueUsd: suppliedUsdDec,
105
+ });
106
+ }
107
+ });
108
+ const totalDebtUsd = debts.reduce((sum, d) => sum.add(d.valueUsd), new decimal_js_1.default(0));
109
+ if (totalDebtUsd.lte(0)) {
110
+ return 0;
111
+ }
112
+ // sort by risk ASC, value DESC
113
+ collaterals.sort((a, b) => {
114
+ if (a.riskBps !== b.riskBps)
115
+ return a.riskBps - b.riskBps;
116
+ return b.valueUsd.comparedTo(a.valueUsd);
117
+ });
118
+ let debtLeftToCover = totalDebtUsd;
119
+ let numerator = new decimal_js_1.default(0); // sum(coveredUsd * riskBps)
120
+ let coveredDebt = new decimal_js_1.default(0); // sum(coveredUsd)
121
+ collaterals.forEach(({ riskBps, valueUsd }) => {
122
+ if (debtLeftToCover.lte(0))
123
+ return;
124
+ const coveredUsd = decimal_js_1.default.min(valueUsd, debtLeftToCover);
125
+ numerator = numerator.add(coveredUsd.mul(riskBps));
126
+ coveredDebt = coveredDebt.add(coveredUsd);
127
+ debtLeftToCover = debtLeftToCover.sub(coveredUsd);
128
+ });
129
+ if (coveredDebt.lte(0)) {
130
+ return 0;
131
+ }
132
+ const riskPremiumBps = numerator.div(coveredDebt);
133
+ return riskPremiumBps.toNumber();
134
+ };
135
+ const formatReserveAsset = (reserveAsset, hubAsset, reserveId, oracleDecimals, network) => __awaiter(void 0, void 0, void 0, function* () {
136
+ var _a, _b, _c, _d, _e, _f;
137
+ const assetInfo = (0, tokens_1.getAssetInfoByAddress)(reserveAsset.underlying, network);
138
+ const symbol = (0, utils_1.wethToEth)(assetInfo.symbol);
139
+ const hubInfo = (0, aaveV4_1.getAaveV4HubByAddress)(network, reserveAsset.hub);
140
+ if (!hubInfo) {
141
+ throw new Error(`Hub not found with address: ${reserveAsset.hub}`);
142
+ }
143
+ const isStakingAsset = staking_1.STAKING_ASSETS.includes(symbol);
144
+ const supplyIncentives = [];
145
+ const borrowIncentives = [];
146
+ if (isStakingAsset) {
147
+ const yieldApy = yield (0, staking_1.getStakingApy)(symbol, network);
148
+ supplyIncentives.push({
149
+ apy: yieldApy,
150
+ token: symbol,
151
+ incentiveKind: types_1.IncentiveKind.Staking,
152
+ description: `Native ${symbol} yield.`,
153
+ });
154
+ if (reserveAsset.borrowable) {
155
+ // When borrowing assets whose value increases over time
156
+ borrowIncentives.push({
157
+ apy: new decimal_js_1.default(yieldApy).mul(-1).toString(),
158
+ token: symbol,
159
+ incentiveKind: types_1.IncentiveKind.Reward,
160
+ description: `Due to the native yield of ${symbol}, the value of the debt would increase over time.`,
161
+ });
162
+ }
163
+ }
164
+ const totalSuppliedRaw = (_a = reserveAsset.totalSupplied) !== null && _a !== void 0 ? _a : 0;
165
+ const totalDrawnRaw = (_b = reserveAsset.totalDrawn) !== null && _b !== void 0 ? _b : 0;
166
+ const totalPremiumRaw = (_c = reserveAsset.totalPremium) !== null && _c !== void 0 ? _c : 0;
167
+ const totalDebtRaw = (_d = reserveAsset.totalDebt) !== null && _d !== void 0 ? _d : 0;
168
+ const supplyCapRaw = (_e = reserveAsset.supplyCap) !== null && _e !== void 0 ? _e : 0;
169
+ const borrowCapRaw = (_f = reserveAsset.borrowCap) !== null && _f !== void 0 ? _f : 0;
170
+ const totalSuppliedDec = new decimal_js_1.default(totalSuppliedRaw.toString());
171
+ const totalDrawnDec = new decimal_js_1.default(totalDrawnRaw.toString());
172
+ const utilization = totalSuppliedDec.isZero() ? '0' : totalDrawnDec.times(100).div(totalSuppliedDec).toString();
173
+ /** @DEV Hub related calculations */
174
+ const drawnRate = new decimal_js_1.default(hubAsset.drawnRate.toString()).div(new decimal_js_1.default(10).pow(27));
175
+ const borrowApr = drawnRate.mul(100);
176
+ const totalDrawn = new decimal_js_1.default(hubAsset.totalDrawn.toString());
177
+ const liquidity = new decimal_js_1.default(hubAsset.liquidity.toString());
178
+ const swept = new decimal_js_1.default(hubAsset.swept.toString());
179
+ const hubUtilizationDenominator = totalDrawn.add(swept).add(liquidity);
180
+ const hubUtilization = hubUtilizationDenominator.isZero() ? new decimal_js_1.default(0) : totalDrawn.div(hubUtilizationDenominator);
181
+ const liquidityFee = new decimal_js_1.default(hubAsset.liquidityFee.toString()).div(new decimal_js_1.default(10).pow(4));
182
+ const totalDrawnShares = new decimal_js_1.default(hubAsset.totalDrawnShares.toString());
183
+ const totalPremiumShares = new decimal_js_1.default(hubAsset.totalPremiumShares.toString());
184
+ // TODO JK@JK premiumMultiplier should be added to supplyApr calculation (.mul(premiumMultiplier)
185
+ // TODO JKJ@JK when we confirm that this is the right way to calculate it
186
+ const premiumMultiplier = totalDrawnShares.isZero() ? new decimal_js_1.default(1) : totalDrawnShares.add(totalPremiumShares).div(totalDrawnShares);
187
+ const supplyApr = borrowApr.mul(hubUtilization).mul(new decimal_js_1.default(1).minus(liquidityFee));
188
+ return ({
189
+ symbol,
190
+ underlying: reserveAsset.underlying,
191
+ hub: hubInfo.address,
192
+ hubName: hubInfo === null || hubInfo === void 0 ? void 0 : hubInfo.label,
193
+ assetId: reserveAsset.assetId,
194
+ reserveId,
195
+ paused: reserveAsset.paused,
196
+ frozen: reserveAsset.frozen,
197
+ borrowable: reserveAsset.borrowable,
198
+ collateralRisk: new decimal_js_1.default(reserveAsset.collateralRisk).div(10000).toNumber(),
199
+ collateralFactor: new decimal_js_1.default(reserveAsset.collateralFactor).div(10000).toNumber(),
200
+ liquidationFee: new decimal_js_1.default(reserveAsset.liquidationFee).div(10000).toNumber(),
201
+ price: new decimal_js_1.default(reserveAsset.price).div(new decimal_js_1.default(10).pow(oracleDecimals)).toString(),
202
+ totalSupplied: (0, tokens_1.assetAmountInEth)(totalSuppliedRaw.toString(), symbol),
203
+ totalDrawn: (0, tokens_1.assetAmountInEth)(totalDrawnRaw.toString(), symbol),
204
+ totalPremium: (0, tokens_1.assetAmountInEth)(totalPremiumRaw.toString(), symbol),
205
+ totalDebt: (0, tokens_1.assetAmountInEth)(totalDebtRaw.toString(), symbol),
206
+ supplyCap: (0, tokens_1.assetAmountInEth)(supplyCapRaw.toString(), symbol),
207
+ borrowCap: (0, tokens_1.assetAmountInEth)(borrowCapRaw.toString(), symbol),
208
+ spokeActive: reserveAsset.spokeActive,
209
+ spokeHalted: reserveAsset.spokeHalted,
210
+ drawnRate: drawnRate.toString(),
211
+ borrowRate: (0, moneymarket_1.aprToApy)(borrowApr.toString()),
212
+ supplyRate: (0, moneymarket_1.aprToApy)(supplyApr.toString()),
213
+ supplyIncentives,
214
+ borrowIncentives,
215
+ canBeBorrowed: reserveAsset.spokeActive && !reserveAsset.spokeHalted && !reserveAsset.paused && !reserveAsset.frozen,
216
+ canBeSupplied: reserveAsset.spokeActive && !reserveAsset.spokeHalted && !reserveAsset.paused && !reserveAsset.frozen,
217
+ canBeWithdrawn: reserveAsset.spokeActive && !reserveAsset.spokeHalted && !reserveAsset.paused,
218
+ canBePayBacked: reserveAsset.spokeActive && !reserveAsset.spokeHalted && !reserveAsset.paused,
219
+ utilization,
220
+ });
221
+ });
222
+ function _getAaveV4SpokeData(provider_1, network_1, market_1) {
223
+ return __awaiter(this, arguments, void 0, function* (provider, network, market, blockNumber = 'latest') {
224
+ const viewContract = (0, contracts_1.AaveV4ViewContractViem)(provider, network, blockNumber);
225
+ const hubsData = {};
226
+ const [spokeData] = yield Promise.all([
227
+ viewContract.read.getSpokeDataFull([market.address]),
228
+ ...market.hubs.map((hubAddress) => __awaiter(this, void 0, void 0, function* () {
229
+ hubsData[hubAddress] = yield fetchHubData(viewContract, hubAddress);
230
+ })),
231
+ ]);
232
+ const reserveAssetsArray = yield Promise.all(spokeData[1].map((reserveAssetOnChain, index) => __awaiter(this, void 0, void 0, function* () { return formatReserveAsset(reserveAssetOnChain, hubsData[reserveAssetOnChain.hub].assets[reserveAssetOnChain.assetId], index, +spokeData[0].oracleDecimals.toString(), network); })));
233
+ return {
234
+ assetsData: reserveAssetsArray.reduce((acc, reserveAsset) => {
235
+ acc[`${reserveAsset.symbol}-${reserveAsset.reserveId}`] = reserveAsset;
236
+ return acc;
237
+ }, {}),
238
+ oracle: spokeData[0].oracle,
239
+ oracleDecimals: +spokeData[0].oracleDecimals.toString(),
240
+ address: market.address,
241
+ };
242
+ });
243
+ }
244
+ function getAaveV4SpokeData(provider_1, network_1, spoke_1) {
245
+ return __awaiter(this, arguments, void 0, function* (provider, network, spoke, blockNumber = 'latest') {
246
+ return _getAaveV4SpokeData((0, viem_1.getViemProvider)(provider, network), network, spoke, blockNumber);
247
+ });
248
+ }
249
+ function _getAaveV4AccountData(provider_1, network_1, spokeData_1, address_1) {
250
+ return __awaiter(this, arguments, void 0, function* (provider, network, spokeData, address, blockNumber = 'latest') {
251
+ const viewContract = (0, contracts_1.AaveV4ViewContractViem)(provider, network, blockNumber);
252
+ const loanData = yield viewContract.read.getLoanData([spokeData.address, address]);
253
+ const healthFactor = new decimal_js_1.default(loanData.healthFactor).div(1e18).toString();
254
+ const usedAssets = loanData.reserves.reduce((acc, usedReserveAsset) => {
255
+ const identifier = `${(0, utils_1.wethToEth)((0, tokens_1.getAssetInfoByAddress)(usedReserveAsset.underlying, network).symbol)}-${+usedReserveAsset.reserveId.toString()}`;
256
+ const reserveData = spokeData.assetsData[identifier];
257
+ const price = reserveData.price;
258
+ const supplied = (0, tokens_1.assetAmountInEth)(usedReserveAsset.supplied.toString(), reserveData.symbol);
259
+ const drawn = (0, tokens_1.assetAmountInEth)(usedReserveAsset.drawn.toString(), reserveData.symbol);
260
+ const premium = (0, tokens_1.assetAmountInEth)(usedReserveAsset.premium.toString(), reserveData.symbol);
261
+ const borrowed = (0, tokens_1.assetAmountInEth)(usedReserveAsset.totalDebt.toString(), reserveData.symbol);
262
+ acc[identifier] = {
263
+ symbol: reserveData.symbol,
264
+ hubName: reserveData.hubName,
265
+ assetId: reserveData.assetId,
266
+ reserveId: +usedReserveAsset.reserveId.toString(),
267
+ supplied,
268
+ suppliedUsd: new decimal_js_1.default(supplied).mul(price).toString(),
269
+ drawn,
270
+ drawnUsd: new decimal_js_1.default(drawn).mul(price).toString(),
271
+ premium,
272
+ premiumUsd: new decimal_js_1.default(premium).mul(price).toString(),
273
+ borrowed,
274
+ borrowedUsd: new decimal_js_1.default(borrowed).mul(price).toString(),
275
+ isSupplied: !new decimal_js_1.default(supplied).eq(0),
276
+ isBorrowed: usedReserveAsset.isBorrowing,
277
+ collateral: usedReserveAsset.isUsingAsCollateral,
278
+ collateralFactor: new decimal_js_1.default(usedReserveAsset.collateralFactor).div(10000).toNumber(),
279
+ };
280
+ return acc;
281
+ }, {});
282
+ const aggregated = (0, aaveV4Helpers_1.aaveV4GetAggregatedPositionData)({
283
+ usedAssets,
284
+ assetsData: spokeData.assetsData,
285
+ network,
286
+ useUserCollateralFactor: true,
287
+ });
288
+ const riskPremiumBps = calcUserRiskPremiumBps(usedAssets, spokeData.assetsData);
289
+ return Object.assign(Object.assign({}, aggregated), { usedAssets,
290
+ healthFactor,
291
+ riskPremiumBps });
292
+ });
293
+ }
294
+ function getAaveV4AccountData(provider_1, network_1, marketData_1, address_1) {
295
+ return __awaiter(this, arguments, void 0, function* (provider, network, marketData, address, blockNumber = 'latest') {
296
+ return _getAaveV4AccountData((0, viem_1.getViemProvider)(provider, network), network, marketData, address, blockNumber);
297
+ });
298
+ }
@@ -0,0 +1,45 @@
1
+ import { EthAddress, EthereumProvider, NetworkNumber } from '../types/common';
2
+ export interface AaveV4TokenizationSpokeData {
3
+ underlyingAsset: EthAddress;
4
+ assetId: string;
5
+ decimals: number;
6
+ spoke: EthAddress;
7
+ spokeActive: boolean;
8
+ spokeHalted: boolean;
9
+ spokeDepositCap: string;
10
+ spokeTotalAssets: string;
11
+ spokeTotalShares: string;
12
+ hub: EthAddress;
13
+ hubLiquidity: string;
14
+ hubDrawnRate: string;
15
+ convertToShares: string;
16
+ convertToAssets: string;
17
+ user: EthAddress;
18
+ userSuppliedAssets: string;
19
+ userSuppliedShares: string;
20
+ }
21
+ export declare const AAVE_V4_TOKENIZED_SPOKES: Record<string, EthAddress>;
22
+ export declare const AAVE_V4_TOKENIZED_SPOKE_ADDRESSES: Partial<Record<NetworkNumber, EthAddress[]>>;
23
+ export type AaveV4TokenizedHubKey = 'CORE' | 'PLUS' | 'PRIME';
24
+ export declare const aaveV4GetTokenizedHubKey: (hubNameOrKey?: string | null) => AaveV4TokenizedHubKey | null;
25
+ export declare const aaveV4GetTokenizedVaultKey: (symbol: string, hubNameOrKey?: string | null) => string | null;
26
+ export declare const aaveV4GetTokenizedVaultAddress: (network: NetworkNumber, symbol: string, hubNameOrKey?: string | null) => EthAddress | undefined;
27
+ /** Parsed tokenization spoke data with human-readable supplied amounts for display */
28
+ export interface AaveV4TokenizationSpokeDataParsed {
29
+ vaultAddress: EthAddress;
30
+ key: string | null;
31
+ symbol: string;
32
+ hubKey: string;
33
+ userSuppliedAssetsEth: string;
34
+ userSuppliedSharesEth: string;
35
+ userSuppliedAssets: string;
36
+ userSuppliedShares: string;
37
+ underlyingAsset: EthAddress;
38
+ spoke: EthAddress;
39
+ decimals: number;
40
+ }
41
+ /**
42
+ * Fetches tokenization vault data for the given user via getTokenizationSpokesData.
43
+ * Returns parsed data including userSuppliedAssets in human-readable form for each vault.
44
+ */
45
+ export declare function getAaveV4TokenizationSpokesData(provider: EthereumProvider, network: NetworkNumber, userAddress: EthAddress): Promise<AaveV4TokenizationSpokeDataParsed[]>;
@@ -0,0 +1,141 @@
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.aaveV4GetTokenizedVaultAddress = exports.aaveV4GetTokenizedVaultKey = exports.aaveV4GetTokenizedHubKey = exports.AAVE_V4_TOKENIZED_SPOKE_ADDRESSES = exports.AAVE_V4_TOKENIZED_SPOKES = void 0;
13
+ exports.getAaveV4TokenizationSpokesData = getAaveV4TokenizationSpokesData;
14
+ const tokens_1 = require("@defisaver/tokens");
15
+ const contracts_1 = require("../contracts");
16
+ const viem_1 = require("../services/viem");
17
+ const utils_1 = require("../services/utils");
18
+ const common_1 = require("../types/common");
19
+ exports.AAVE_V4_TOKENIZED_SPOKES = {
20
+ AAVE_CORE: '0x08309234884cF7E015b07Bf22569017Aa035cdeF',
21
+ EURC_CORE: '0x73596dED4B2Eb0aC85e477b3c8dB56FC427E6774',
22
+ GHO_CORE: '0xf7E1f1b43922527e5054bD77E7f863Cf182b194D',
23
+ GHO_PRIME: '0xeF1cAd5c6a2C9cb83c952b4B96bbD35b3F61F18f',
24
+ LBTC_CORE: '0x8f4D423590F22833131e3493bf67A27213398f8e',
25
+ LINK_CORE: '0xBE1197750b423e30137E97d9183065d33E903BE6',
26
+ PT_USDe_PLUS: '0x8cA27Ab284F2aA2BcF33D9129e11c101aD2d16de',
27
+ PT_sUSDe_PLUS: '0xb8A464EC56071a98c854f30fE19CfeCc41FA6233',
28
+ PYUSD_CORE: '0x203FB463087005698d50768FcA837047f738632d',
29
+ RLUSD_CORE: '0xa9afdd0c54fb153CaE39cE86E49626B5e9d15513',
30
+ USDC_CORE: '0xa2e476f4cbB06C7bFA8Ad51bCcbF198cd32CfD35',
31
+ USDC_PLUS: '0x320Bec4fB7a25e64c003A007D0AeF7AB3D6C30d7',
32
+ USDC_PRIME: '0x0A0507F7A1129892b5cf74b8B4e911442c466b87',
33
+ USDG_CORE: '0x87c224256f09a014C1BC3e9FbB094C3AdD8fBaCC',
34
+ USDT_CORE: '0x3f12BD5999b9172550893FF52691c980676f9E73',
35
+ USDT_PLUS: '0xa4E74a78bED2d3ab8971e8AB26fb39f26DD8eEd9',
36
+ USDT_PRIME: '0xF565fB55bc96d65561887898bfeb25C1dE7e06d2',
37
+ USDe_PLUS: '0xA0d346ab2699B689AC67aba5174164A84206BB73',
38
+ WBTC_CORE: '0x837Ab872A665e0CF467d41cF56a054031b4A38bc',
39
+ WBTC_PRIME: '0xeae98b8a1798738182B2123DF1eB93d97BD29F34',
40
+ WETH_CORE: '0x3961a75099E986F59a1a31c6f945061641dFD2b2',
41
+ WETH_PRIME: '0xa411826a6ef5d289c0FAa7d5B45FE8aAB52257F6',
42
+ XAUt_CORE: '0x470341bC0e2B833C54D0120642713BdF762A494F',
43
+ cbBTC_CORE: '0xe8D5E595d5b6b5EFf84B7064765fd0e8DfD214C9',
44
+ cbBTC_PRIME: '0x0E986545150DcDDe46Ea9df355D0fD2af33bd75D',
45
+ frxUSD_CORE: '0x00C8A6a42947Cc4E7B6f27963Cab0143ccaaD2B5',
46
+ frxUSD_PLUS: '0xCAB288d37CAb5a9db7b503F086455276Dcde61F1',
47
+ rsETH_CORE: '0x6eEce89caE2163584bA7Ff9743861B9633c245E0',
48
+ sUSDe_PLUS: '0xdf47fc43c88B06edC47753b7d647ff18037D2F3d',
49
+ weETH_CORE: '0xB67F20bFF413C8E5d633B54BD28899c4c9e33ed0',
50
+ wstETH_CORE: '0x474602394d0B02F43AC3D7C8c5cFc0814b03fd40',
51
+ wstETH_PRIME: '0xAcCdAb49ECB9A801CfF62a92fc80D52339b33770',
52
+ };
53
+ exports.AAVE_V4_TOKENIZED_SPOKE_ADDRESSES = {
54
+ [common_1.NetworkNumber.Eth]: Object.values(exports.AAVE_V4_TOKENIZED_SPOKES),
55
+ };
56
+ const aaveV4GetTokenizedHubKey = (hubNameOrKey) => {
57
+ if (!hubNameOrKey)
58
+ return null;
59
+ const normalized = hubNameOrKey.trim().toUpperCase();
60
+ // TODO AaveV4 Maybe turn into constants
61
+ if (normalized === 'CORE' || normalized === 'CORE HUB')
62
+ return 'CORE';
63
+ if (normalized === 'PLUS' || normalized === 'PLUS HUB')
64
+ return 'PLUS';
65
+ if (normalized === 'PRIME' || normalized === 'PRIME HUB')
66
+ return 'PRIME';
67
+ if (normalized.includes('CORE'))
68
+ return 'CORE';
69
+ if (normalized.includes('PLUS'))
70
+ return 'PLUS';
71
+ if (normalized.includes('PRIME'))
72
+ return 'PRIME';
73
+ return null;
74
+ };
75
+ exports.aaveV4GetTokenizedHubKey = aaveV4GetTokenizedHubKey;
76
+ const aaveV4GetTokenizedVaultKey = (symbol, hubNameOrKey) => {
77
+ if (!symbol)
78
+ return null;
79
+ const hubKey = (0, exports.aaveV4GetTokenizedHubKey)(hubNameOrKey);
80
+ if (!hubKey)
81
+ return null;
82
+ const normalizedSymbol = symbol.trim().replace(/-/g, '_');
83
+ return `${normalizedSymbol}_${hubKey}`;
84
+ };
85
+ exports.aaveV4GetTokenizedVaultKey = aaveV4GetTokenizedVaultKey;
86
+ const aaveV4GetTokenizedVaultAddress = (network, symbol, hubNameOrKey) => {
87
+ if (network !== common_1.NetworkNumber.Eth)
88
+ return undefined;
89
+ const key = (0, exports.aaveV4GetTokenizedVaultKey)(symbol, hubNameOrKey);
90
+ if (!key)
91
+ return undefined;
92
+ return exports.AAVE_V4_TOKENIZED_SPOKES[key];
93
+ };
94
+ exports.aaveV4GetTokenizedVaultAddress = aaveV4GetTokenizedVaultAddress;
95
+ const AAVE_V4_TOKENIZED_SPOKE_ADDRESS_TO_KEY = Object.entries(exports.AAVE_V4_TOKENIZED_SPOKES).reduce((acc, [k, v]) => {
96
+ acc[v.toLowerCase()] = k;
97
+ return acc;
98
+ }, {});
99
+ /**
100
+ * Fetches tokenization vault data for the given user via getTokenizationSpokesData.
101
+ * Returns parsed data including userSuppliedAssets in human-readable form for each vault.
102
+ */
103
+ function getAaveV4TokenizationSpokesData(provider, network, userAddress) {
104
+ return __awaiter(this, void 0, void 0, function* () {
105
+ var _a;
106
+ const spokes = (_a = exports.AAVE_V4_TOKENIZED_SPOKE_ADDRESSES[network]) !== null && _a !== void 0 ? _a : [];
107
+ if (spokes.length === 0)
108
+ return [];
109
+ const client = (0, viem_1.getViemProvider)(provider, network);
110
+ const viewContract = (0, contracts_1.AaveV4ViewContractViem)(client, network);
111
+ const raw = yield viewContract.read.getTokenizationSpokesData([spokes, userAddress]);
112
+ return raw.map((r, i) => {
113
+ var _a, _b, _c, _d, _e;
114
+ const vaultAddress = spokes[i];
115
+ const key = (_a = AAVE_V4_TOKENIZED_SPOKE_ADDRESS_TO_KEY[vaultAddress.toLowerCase()]) !== null && _a !== void 0 ? _a : null;
116
+ const symbol = (0, utils_1.wethToEth)((0, tokens_1.getAssetInfoByAddress)(r.underlyingAsset, network).symbol);
117
+ if (symbol === '?') { // unsupported asset
118
+ return null;
119
+ }
120
+ const hubKey = key ? (_b = key.split('_').pop()) !== null && _b !== void 0 ? _b : '' : '';
121
+ const decimals = Number((_c = r.decimals) !== null && _c !== void 0 ? _c : 18);
122
+ const userSuppliedAssetsRaw = (_d = r.userSuppliedAssets) !== null && _d !== void 0 ? _d : 0;
123
+ const userSuppliedSharesRaw = (_e = r.userSuppliedShares) !== null && _e !== void 0 ? _e : 0;
124
+ const userSuppliedAssetsEth = (0, tokens_1.assetAmountInEth)(userSuppliedAssetsRaw.toString(), symbol);
125
+ const userSuppliedSharesEth = (0, tokens_1.assetAmountInEth)(userSuppliedSharesRaw.toString(), symbol);
126
+ return {
127
+ vaultAddress,
128
+ key,
129
+ symbol,
130
+ hubKey,
131
+ userSuppliedAssetsEth,
132
+ userSuppliedSharesEth,
133
+ userSuppliedAssets: userSuppliedAssetsRaw.toString(),
134
+ userSuppliedShares: userSuppliedSharesRaw.toString(),
135
+ underlyingAsset: r.underlyingAsset,
136
+ spoke: r.spoke,
137
+ decimals,
138
+ };
139
+ }).filter(item => item != null);
140
+ });
141
+ }
@@ -99,7 +99,7 @@ function getMeritUnclaimedRewards(account_1, network_1) {
99
99
  return __awaiter(this, arguments, void 0, function* (account, network, acceptMorpho = true) {
100
100
  let data;
101
101
  try {
102
- const res = yield fetch(`https://api.merkl.xyz/v4/users/${account}/rewards?chainId=${network}`, { signal: AbortSignal.timeout(3000) });
102
+ const res = yield fetch(`https://api-merkl.angle.money/v4/users/${account}/rewards?chainId=${network}`, { signal: AbortSignal.timeout(3000) });
103
103
  data = yield res.json();
104
104
  }
105
105
  catch (error) {