@defisaver/positions-sdk 2.1.8 → 2.1.9-dev-spark-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.
@@ -1099,19 +1099,21 @@ const _getFluidTokenData = (provider, network, token) => __awaiter(void 0, void
1099
1099
  exports._getFluidTokenData = _getFluidTokenData;
1100
1100
  const getFluidTokenData = (provider, network, token) => __awaiter(void 0, void 0, void 0, function* () { return (0, exports._getFluidTokenData)((0, viem_1.getViemProvider)(provider, network), network, token); });
1101
1101
  exports.getFluidTokenData = getFluidTokenData;
1102
- const parseFDepositTokenData = (fTokenData, userPosition, fTokenAddress) => {
1103
- const supplyRate = new decimal_js_1.default(fTokenData.supplyRate).div(100).toString();
1104
- const rewardsRate = new decimal_js_1.default(fTokenData.rewardsRate).div(1e12).toString();
1102
+ const parseFDepositTokenData = (fTokenData, userPosition, apiData, fTokenAddress) => {
1103
+ var _a, _b;
1105
1104
  const decimals = fTokenData.decimals.toString();
1106
1105
  const depositRate = new decimal_js_1.default((0, utils_1.getEthAmountForDecimals)(fTokenData.convertToShares.toString(), decimals)).toString();
1107
1106
  const withdrawRate = new decimal_js_1.default((0, utils_1.getEthAmountForDecimals)(fTokenData.convertToAssets.toString(), decimals)).toString();
1107
+ const supplyRate = new decimal_js_1.default((apiData === null || apiData === void 0 ? void 0 : apiData.supplyRate) || '0').div(100).toString();
1108
+ const rewardRates = ((_a = apiData === null || apiData === void 0 ? void 0 : apiData.rewards) === null || _a === void 0 ? void 0 : _a.reduce((acc, item) => acc.add(new decimal_js_1.default(item.rate || '0').div(100)), new decimal_js_1.default(0))) || '0';
1109
+ const stakeRate = new decimal_js_1.default(((_b = apiData === null || apiData === void 0 ? void 0 : apiData.asset) === null || _b === void 0 ? void 0 : _b.stakingApr) || '0').div(100).toString();
1108
1110
  return {
1109
1111
  fTokenAddress,
1110
1112
  fTokenSymbol: fTokenData.symbol,
1111
1113
  decimals,
1112
1114
  totalDeposited: (0, utils_1.getEthAmountForDecimals)(fTokenData.totalAssets.toString(), decimals),
1113
1115
  withdrawable: (0, utils_1.getEthAmountForDecimals)(fTokenData.withdrawable.toString(), decimals),
1114
- apy: new decimal_js_1.default(supplyRate).add(rewardsRate).toString(),
1116
+ apy: new decimal_js_1.default(supplyRate).plus(rewardRates).plus(stakeRate).toString(),
1115
1117
  depositRate,
1116
1118
  withdrawRate,
1117
1119
  deposited: (0, utils_1.getEthAmountForDecimals)(userPosition.underlyingAssets.toString(), decimals),
@@ -1121,21 +1123,44 @@ const parseFDepositTokenData = (fTokenData, userPosition, fTokenAddress) => {
1121
1123
  const _getFluidDepositData = (provider, network, token, address) => __awaiter(void 0, void 0, void 0, function* () {
1122
1124
  const view = (0, contracts_1.FluidViewContractViem)(provider, network);
1123
1125
  const fTokenAddress = (0, markets_1.getFTokenAddress)(token, network);
1124
- const [userPosition, fTokenData] = yield view.read.getUserEarnPositionWithFToken([fTokenAddress, address]);
1125
- return parseFDepositTokenData(fTokenData, userPosition, fTokenAddress);
1126
+ const [[userPosition, fTokenData], rewardsApiResponse,] = yield Promise.all([
1127
+ view.read.getUserEarnPositionWithFToken([fTokenAddress, address]),
1128
+ fetch(`https://api.fluid.instadapp.io/v2/lending/${network}/tokens/${fTokenAddress}`),
1129
+ ]);
1130
+ let rewardsData = { rewards: [] };
1131
+ if (!rewardsApiResponse.ok) {
1132
+ console.log('External API Failure: Failed to fetch fluid rewards APY');
1133
+ }
1134
+ else {
1135
+ rewardsData = yield rewardsApiResponse.json();
1136
+ }
1137
+ return parseFDepositTokenData(fTokenData, userPosition, rewardsData, fTokenAddress);
1126
1138
  });
1127
1139
  exports._getFluidDepositData = _getFluidDepositData;
1128
1140
  const getFluidDepositData = (provider, network, token, address) => __awaiter(void 0, void 0, void 0, function* () { return (0, exports._getFluidDepositData)((0, viem_1.getViemProvider)(provider, network), network, token, address); });
1129
1141
  exports.getFluidDepositData = getFluidDepositData;
1130
1142
  const _getAllUserEarnPositionsWithFTokens = (provider, network, user) => __awaiter(void 0, void 0, void 0, function* () {
1131
1143
  const view = (0, contracts_1.FluidViewContractViem)(provider, network);
1132
- const [userPositions, fTokensData] = yield view.read.getAllUserEarnPositionsWithFTokens([user]);
1144
+ const [[userPositions, fTokensData], rewardsApiResponse,] = yield Promise.all([
1145
+ view.read.getAllUserEarnPositionsWithFTokens([user]),
1146
+ fetch(`https://api.fluid.instadapp.io/v2/lending/${network}/tokens`),
1147
+ ]);
1148
+ let rewardsData = {
1149
+ data: [{ address: constants_1.ZERO_ADDRESS, rewards: [] }],
1150
+ };
1151
+ if (!rewardsApiResponse.ok) {
1152
+ console.log('External API Failure: Failed to fetch fluid rewards APY');
1153
+ }
1154
+ else {
1155
+ rewardsData = yield rewardsApiResponse.json();
1156
+ }
1133
1157
  const parsedRes = fTokensData.reduce((acc, fTokenData, i) => {
1134
1158
  const userPosition = userPositions[i];
1135
1159
  const deposited = userPosition === null || userPosition === void 0 ? void 0 : userPosition.underlyingAssets;
1136
1160
  if (Number(deposited) > 0) {
1137
1161
  const fTokenAddress = fTokenData.tokenAddress;
1138
- acc.push(parseFDepositTokenData(fTokenData, userPosition, fTokenAddress));
1162
+ const apiData = rewardsData.data.find((item) => (0, utils_1.compareAddresses)(item.address, fTokenAddress));
1163
+ acc.push(parseFDepositTokenData(fTokenData, userPosition, apiData, fTokenAddress));
1139
1164
  }
1140
1165
  return acc;
1141
1166
  }, []);
@@ -1184,19 +1209,22 @@ const getTokenPricePortfolio = (token, provider, network) => __awaiter(void 0, v
1184
1209
  const tokensWithoutChainlinkPrices = ['sUSDS', 'USDA', 'ezETH', 'rsETH', 'weETHs', 'LBTC'];
1185
1210
  const handleTokenWithoutChainlinkPrice = (token, prices) => {
1186
1211
  if (token === 'sUSDS') {
1187
- return new decimal_js_1.default('105276929').div(1e8).toString();
1212
+ return new decimal_js_1.default('107057929').div(1e8).toString();
1188
1213
  }
1189
1214
  if (token === 'USDA') {
1190
1215
  return new decimal_js_1.default('100000000').div(1e8).toString();
1191
1216
  }
1217
+ if (token === 'wstUSR') {
1218
+ return new decimal_js_1.default('111280000').div(1e8).toString();
1219
+ }
1192
1220
  if (token === 'ezETH') {
1193
- return new decimal_js_1.default(prices.ETH).mul(1.049).toString();
1221
+ return new decimal_js_1.default(prices.ETH).mul(1.06).toString();
1194
1222
  }
1195
1223
  if (token === 'rsETH') {
1196
- return new decimal_js_1.default(prices.wstETH).mul(1.0454).toString();
1224
+ return new decimal_js_1.default(prices.wstETH).mul(1.0557).toString();
1197
1225
  }
1198
1226
  if (token === 'weETHs') {
1199
- return new decimal_js_1.default(prices.wstETH).mul(1.026).toString();
1227
+ return new decimal_js_1.default(prices.wstETH).mul(1.032).toString();
1200
1228
  }
1201
1229
  if (token === 'LBTC') {
1202
1230
  return prices.WBTC;
@@ -7,19 +7,19 @@ export declare const sparkIsInIsolationMode: ({ usedAssets, assetsData }: {
7
7
  export declare const sparkGetCollSuppliedAssets: ({ usedAssets }: {
8
8
  usedAssets: SparkUsedAssets;
9
9
  }) => import("../../types").SparkUsedAsset[];
10
- export declare const sparkGetSuppliableAssets: ({ usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest }: SparkHelperCommon) => {
10
+ export declare const sparkGetSuppliableAssets: ({ usedAssets, eModeCategory, assetsData, selectedMarket, network, ...rest }: SparkHelperCommon) => {
11
11
  symbol: string;
12
12
  canBeCollateral: boolean;
13
13
  }[];
14
- export declare const sparkGetSuppliableAsCollAssets: ({ usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest }: SparkHelperCommon) => {
14
+ export declare const sparkGetSuppliableAsCollAssets: ({ usedAssets, eModeCategory, assetsData, selectedMarket, network, ...rest }: SparkHelperCommon) => {
15
15
  symbol: string;
16
16
  canBeCollateral: boolean;
17
17
  }[];
18
- export declare const sparkGetEmodeMutableProps: ({ eModeCategory, assetsData, }: SparkHelperCommon, _asset: string) => {
18
+ export declare const sparkGetEmodeMutableProps: ({ eModeCategory, eModeCategoriesData, assetsData, }: SparkHelperCommon, _asset: string) => {
19
19
  liquidationRatio: string;
20
20
  collateralFactor: string;
21
21
  };
22
- export declare const sparkGetAggregatedPositionData: ({ usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest }: SparkHelperCommon) => SparkAggregatedPositionData;
22
+ export declare const sparkGetAggregatedPositionData: ({ usedAssets, eModeCategory, eModeCategoriesData, assetsData, selectedMarket, network, ...rest }: SparkHelperCommon) => SparkAggregatedPositionData;
23
23
  export declare const getApyAfterValuesEstimation: (selectedMarket: SparkMarketData, actions: [{
24
24
  action: string;
25
25
  amount: string;
@@ -38,8 +38,8 @@ exports.sparkIsInIsolationMode = sparkIsInIsolationMode;
38
38
  const sparkGetCollSuppliedAssets = ({ usedAssets }) => Object.values(usedAssets).filter(({ isSupplied, collateral }) => isSupplied && collateral);
39
39
  exports.sparkGetCollSuppliedAssets = sparkGetCollSuppliedAssets;
40
40
  const sparkGetSuppliableAssets = (_a) => {
41
- var { usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network } = _a, rest = __rest(_a, ["usedAssets", "eModeCategory", "eModeCategories", "assetsData", "selectedMarket", "network"]);
42
- const data = Object.assign({ usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network }, rest);
41
+ var { usedAssets, eModeCategory, assetsData, selectedMarket, network } = _a, rest = __rest(_a, ["usedAssets", "eModeCategory", "assetsData", "selectedMarket", "network"]);
42
+ const data = Object.assign({ usedAssets, eModeCategory, assetsData, selectedMarket, network }, rest);
43
43
  const collAccountAssets = (0, exports.sparkGetCollSuppliedAssets)(data);
44
44
  const marketAssets = Object.values(assetsData);
45
45
  if ((0, exports.sparkIsInIsolationMode)(data)) {
@@ -50,27 +50,27 @@ const sparkGetSuppliableAssets = (_a) => {
50
50
  };
51
51
  exports.sparkGetSuppliableAssets = sparkGetSuppliableAssets;
52
52
  const sparkGetSuppliableAsCollAssets = (_a) => {
53
- var { usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network } = _a, rest = __rest(_a, ["usedAssets", "eModeCategory", "eModeCategories", "assetsData", "selectedMarket", "network"]);
54
- return (0, exports.sparkGetSuppliableAssets)(Object.assign({ usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network }, rest)).filter(({ canBeCollateral }) => canBeCollateral);
53
+ var { usedAssets, eModeCategory, assetsData, selectedMarket, network } = _a, rest = __rest(_a, ["usedAssets", "eModeCategory", "assetsData", "selectedMarket", "network"]);
54
+ return (0, exports.sparkGetSuppliableAssets)(Object.assign({ usedAssets, eModeCategory, assetsData, selectedMarket, network }, rest)).filter(({ canBeCollateral }) => canBeCollateral);
55
55
  };
56
56
  exports.sparkGetSuppliableAsCollAssets = sparkGetSuppliableAsCollAssets;
57
- const sparkGetEmodeMutableProps = ({ eModeCategory, assetsData, }, _asset) => {
58
- var _a;
59
- const asset = (0, utils_1.wethToEth)(_asset);
57
+ const sparkGetEmodeMutableProps = ({ eModeCategory, eModeCategoriesData, assetsData, }, _asset) => {
58
+ const asset = (0, utils_1.getNativeAssetFromWrapped)(_asset);
60
59
  const assetData = assetsData[asset];
60
+ const eModeCategoryData = (eModeCategoriesData === null || eModeCategoriesData === void 0 ? void 0 : eModeCategoriesData[eModeCategory]) || { collateralAssets: [], collateralFactor: '0', liquidationRatio: '0' };
61
61
  if (eModeCategory === 0
62
- || assetData.eModeCategory !== eModeCategory
63
- || new decimal_js_1.default(((_a = assetData === null || assetData === void 0 ? void 0 : assetData.eModeCategoryData) === null || _a === void 0 ? void 0 : _a.collateralFactor) || 0).eq(0)) {
62
+ || !eModeCategoryData.collateralAssets.includes(asset)
63
+ || new decimal_js_1.default(eModeCategoryData.collateralFactor || 0).eq(0)) {
64
64
  const { liquidationRatio, collateralFactor } = assetData;
65
65
  return ({ liquidationRatio, collateralFactor });
66
66
  }
67
- const { liquidationRatio, collateralFactor } = assetData.eModeCategoryData;
67
+ const { liquidationRatio, collateralFactor } = eModeCategoryData;
68
68
  return ({ liquidationRatio, collateralFactor });
69
69
  };
70
70
  exports.sparkGetEmodeMutableProps = sparkGetEmodeMutableProps;
71
71
  const sparkGetAggregatedPositionData = (_a) => {
72
- var { usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network } = _a, rest = __rest(_a, ["usedAssets", "eModeCategory", "eModeCategories", "assetsData", "selectedMarket", "network"]);
73
- const data = Object.assign({ usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network }, rest);
72
+ var { usedAssets, eModeCategory, eModeCategoriesData, assetsData, selectedMarket, network } = _a, rest = __rest(_a, ["usedAssets", "eModeCategory", "eModeCategoriesData", "assetsData", "selectedMarket", "network"]);
73
+ const data = Object.assign({ usedAssets, eModeCategory, eModeCategoriesData, assetsData, selectedMarket, network }, rest);
74
74
  const payload = {};
75
75
  payload.suppliedUsd = (0, moneymarket_1.getAssetsTotal)(usedAssets, ({ isSupplied }) => isSupplied, ({ suppliedUsd }) => suppliedUsd);
76
76
  payload.suppliedCollateralUsd = (0, moneymarket_1.getAssetsTotal)(usedAssets, ({ isSupplied, collateral }) => isSupplied && collateral, ({ suppliedUsd }) => suppliedUsd);
@@ -244,17 +244,21 @@ export declare const FluidFTokens: (networkId: NetworkNumber) => {
244
244
  wstETH: string;
245
245
  GHO: string;
246
246
  sUSDS: string;
247
+ USDtb: string;
247
248
  } | {
248
249
  ETH: string;
249
250
  USDC: string;
250
251
  USDT: string;
251
252
  wstETH: string;
252
253
  ARB: string;
254
+ GHO: string;
255
+ sUSDS: string;
253
256
  } | {
254
257
  ETH: string;
255
258
  USDC: string;
256
259
  EURC: string;
257
260
  wstETH: string;
258
261
  sUSDS: string;
262
+ GHO: string;
259
263
  };
260
264
  export declare const getFTokenAddress: (token: string, networkId: NetworkNumber) => any;
@@ -2415,6 +2415,7 @@ const FluidMainnetFTokenAddresses = {
2415
2415
  [types_1.FluidMainnetDepositToken.wstETH]: '0x2411802D8BEA09be0aF8fD8D08314a63e706b29C',
2416
2416
  [types_1.FluidMainnetDepositToken.GHO]: '0x6A29A46E21C730DcA1d8b23d637c101cec605C5B',
2417
2417
  [types_1.FluidMainnetDepositToken.sUSDS]: '0x2BBE31d63E6813E3AC858C04dae43FB2a72B0D11',
2418
+ [types_1.FluidMainnetDepositToken.USDtb]: '0x15e8c742614b5D8Db4083A41Df1A14F5D2bFB400',
2418
2419
  };
2419
2420
  const FluidArbitrumFTokenAddresses = {
2420
2421
  [types_1.FluidArbitrumDepositToken.ETH]: '0x45Df0656F8aDf017590009d2f1898eeca4F0a205',
@@ -2422,6 +2423,8 @@ const FluidArbitrumFTokenAddresses = {
2422
2423
  [types_1.FluidArbitrumDepositToken.USDT]: '0x4A03F37e7d3fC243e3f99341d36f4b829BEe5E03',
2423
2424
  [types_1.FluidArbitrumDepositToken.wstETH]: '0x66C25Cd75EBdAA7E04816F643d8E46cecd3183c9',
2424
2425
  [types_1.FluidArbitrumDepositToken.ARB]: '0xbE3860FD4c3facDf8ad57Aa8c1A36D6dc4390a49',
2426
+ [types_1.FluidArbitrumDepositToken.GHO]: '0x037dFf1C12805707d7c29F163E0F09fC9102657A',
2427
+ [types_1.FluidArbitrumDepositToken.sUSDS]: '0x3459fcc94390C3372c0F7B4cD3F8795F0E5aFE96',
2425
2428
  };
2426
2429
  const FluidBaseFTokenAddresses = {
2427
2430
  [types_1.FluidBaseDepositToken.ETH]: '0x9272D6153133175175Bc276512B2336BE3931CE9',
@@ -2429,6 +2432,7 @@ const FluidBaseFTokenAddresses = {
2429
2432
  [types_1.FluidBaseDepositToken.EURC]: '0x1943FA26360f038230442525Cf1B9125b5DCB401',
2430
2433
  [types_1.FluidBaseDepositToken.wstETH]: '0x896E39f0E9af61ECA9dD2938E14543506ef2c2b5',
2431
2434
  [types_1.FluidBaseDepositToken.sUSDS]: '0xf62e339f21d8018940f188F6987Bcdf02A849619',
2435
+ [types_1.FluidBaseDepositToken.GHO]: '0x8DdbfFA3CFda2355a23d6B11105AC624BDbE3631',
2432
2436
  };
2433
2437
  const FluidFTokens = (networkId) => {
2434
2438
  switch (networkId) {
@@ -452,7 +452,7 @@ function getPortfolioData(provider, network, defaultProvider, addresses, summerF
452
452
  }))).flat(),
453
453
  ...sparkMarkets.map((market) => allAddresses.map((address) => __awaiter(this, void 0, void 0, function* () {
454
454
  try {
455
- const accData = yield (0, spark_1._getSparkAccountData)(client, network, address, { selectedMarket: market, assetsData: sparkMarketsData[market.value].assetsData });
455
+ const accData = yield (0, spark_1._getSparkAccountData)(client, network, address, { selectedMarket: market, assetsData: sparkMarketsData[market.value].assetsData, eModeCategoriesData: sparkMarketsData[market.value].eModeCategoriesData });
456
456
  if (new decimal_js_1.default(accData.suppliedUsd).gt(0))
457
457
  positions[address.toLowerCase()].spark[market.value] = { error: '', data: accData };
458
458
  }
@@ -1,6 +1,6 @@
1
1
  import { Client } from 'viem';
2
2
  import { Blockish, EthAddress, EthereumProvider, NetworkNumber, PositionBalances } from '../types/common';
3
- import { SparkEModeCategoryDataMapping, SparkAssetsData, SparkMarketData, SparkMarketsData, SparkPositionData, SparkUsedAssets } from '../types';
3
+ import { SparkEModeCategoryDataMapping, SparkAssetsData, SparkMarketData, SparkMarketsData, SparkPositionData, SparkUsedAssets, EModeCategoriesData } from '../types';
4
4
  export declare const sparkEmodeCategoriesMapping: (extractedState: {
5
5
  assetsData: SparkAssetsData;
6
6
  }, usedAssets: SparkUsedAssets) => {
@@ -32,9 +32,11 @@ export declare const getSparkAccountBalances: (provider: EthereumProvider, netwo
32
32
  export declare const _getSparkAccountData: (provider: Client, network: NetworkNumber, address: EthAddress, extractedState: {
33
33
  selectedMarket: SparkMarketData;
34
34
  assetsData: SparkAssetsData;
35
+ eModeCategoriesData: EModeCategoriesData;
35
36
  }) => Promise<SparkPositionData>;
36
37
  export declare const getSparkAccountData: (provider: EthereumProvider, network: NetworkNumber, address: EthAddress, extractedState: {
37
38
  selectedMarket: SparkMarketData;
38
39
  assetsData: SparkAssetsData;
40
+ eModeCategoriesData: EModeCategoriesData;
39
41
  }) => Promise<SparkPositionData>;
40
42
  export declare const getSparkFullPositionData: (provider: EthereumProvider, network: NetworkNumber, address: EthAddress, market: SparkMarketData) => Promise<SparkPositionData>;
@@ -28,7 +28,6 @@ const sparkEmodeCategoriesMapping = (extractedState, usedAssets) => {
28
28
  const usedAssetsValues = Object.values(usedAssets);
29
29
  const categoriesMapping = {};
30
30
  Object.values(assetsData).forEach((a) => {
31
- var _a;
32
31
  const borrowingOnlyFromCategory = a.eModeCategory === 0
33
32
  ? true
34
33
  : !usedAssetsValues.filter(u => u.isBorrowed && u.eModeCategory !== a.eModeCategory).length;
@@ -39,8 +38,6 @@ const sparkEmodeCategoriesMapping = (extractedState, usedAssets) => {
39
38
  enteringTerms,
40
39
  canEnterCategory: !enteringTerms.includes(false),
41
40
  id: a.eModeCategory,
42
- data: a.eModeCategoryData,
43
- assets: a.eModeCategory === 0 ? [] : [...(((_a = categoriesMapping[a.eModeCategory]) === null || _a === void 0 ? void 0 : _a.assets) || []), a.symbol],
44
41
  enabledData: {
45
42
  ratio: afterEnteringCategory.ratio,
46
43
  liqRatio: afterEnteringCategory.liqRatio,
@@ -56,18 +53,17 @@ const _getSparkMarketsData = (provider, network, selectedMarket) => __awaiter(vo
56
53
  const marketAddress = selectedMarket.providerAddress;
57
54
  const loanInfoContract = (0, contracts_1.SparkViewContractViem)(provider, network);
58
55
  const sparkIncentivesContract = (0, contracts_1.SparkIncentiveDataProviderContractViem)(provider, network);
59
- const [loanInfo, _rewardInfo] = yield Promise.all([
56
+ // eslint-disable-next-line prefer-const
57
+ let [loanInfo, rewardInfo] = yield Promise.all([
60
58
  loanInfoContract.read.getFullTokensInfo([marketAddress, selectedMarket.assets.map(a => (0, tokens_1.getAssetInfo)((0, utils_1.ethToWeth)(a)).address)]),
61
- network === common_1.NetworkNumber.Opt ? sparkIncentivesContract.read.getReservesIncentivesData([marketAddress]) : [],
59
+ sparkIncentivesContract.read.getReservesIncentivesData([marketAddress]),
62
60
  ]);
63
- let rewardInfo = [];
64
- if (network === common_1.NetworkNumber.Opt) {
65
- rewardInfo = rewardInfo.reduce((all, market) => {
66
- // eslint-disable-next-line no-param-reassign
67
- all[market.underlyingAsset] = market;
68
- return all;
69
- }, {});
70
- }
61
+ rewardInfo = rewardInfo.reduce((all, market) => {
62
+ // eslint-disable-next-line no-param-reassign
63
+ all[market.underlyingAsset] = market;
64
+ return all;
65
+ }, {});
66
+ const eModeCategoriesData = {};
71
67
  const assetsData = yield Promise.all(loanInfo
72
68
  .map((market, i) => __awaiter(void 0, void 0, void 0, function* () {
73
69
  const symbol = selectedMarket.assets[i];
@@ -82,6 +78,15 @@ const _getSparkMarketsData = (provider, network, selectedMarket) => __awaiter(vo
82
78
  if (new decimal_js_1.default(marketLiquidity).lt(0)) {
83
79
  marketLiquidity = '0';
84
80
  }
81
+ eModeCategoriesData[+market.emodeCategory.toString()] = {
82
+ id: +market.emodeCategory.toString(),
83
+ label: market.label,
84
+ liquidationBonus: new decimal_js_1.default(market.liquidationBonus).div(10000).toString(),
85
+ liquidationRatio: new decimal_js_1.default(market.liquidationThreshold).div(10000).toString(),
86
+ collateralFactor: new decimal_js_1.default(market.ltv).div(10000).toString(),
87
+ collateralAssets: eModeCategoriesData[+market.emodeCategory.toString()] ? [...eModeCategoriesData[+market.emodeCategory.toString()].collateralAssets, selectedMarket.assets[i]] : [selectedMarket.assets[i]],
88
+ borrowAssets: eModeCategoriesData[+market.emodeCategory.toString()] ? [...eModeCategoriesData[+market.emodeCategory.toString()].borrowAssets, selectedMarket.assets[i]] : [selectedMarket.assets[i]],
89
+ };
85
90
  return ({
86
91
  symbol: selectedMarket.assets[i],
87
92
  isIsolated: new decimal_js_1.default(market.debtCeilingForIsolationMode.toString()).gt(0),
@@ -116,13 +121,6 @@ const _getSparkMarketsData = (provider, network, selectedMarket) => __awaiter(vo
116
121
  isolationModeBorrowingEnabled: market.isolationModeBorrowingEnabled,
117
122
  isFlashLoanEnabled: market.isFlashLoanEnabled,
118
123
  aTokenAddress: market.aTokenAddress,
119
- eModeCategoryData: {
120
- label: market.label,
121
- liquidationBonus: new decimal_js_1.default(market.liquidationBonus).div(10000).toString(),
122
- liquidationRatio: new decimal_js_1.default(market.liquidationThreshold).div(10000).toString(),
123
- collateralFactor: new decimal_js_1.default(market.ltv).div(10000).toString(),
124
- priceSource: market.priceSource,
125
- },
126
124
  supplyIncentives: [],
127
125
  borrowIncentives: [],
128
126
  });
@@ -154,7 +152,7 @@ const _getSparkMarketsData = (provider, network, selectedMarket) => __awaiter(vo
154
152
  return;
155
153
  rewardForMarket.aIncentiveData.rewardsTokenInformation.forEach(supplyRewardData => {
156
154
  if (supplyRewardData) {
157
- if (supplyRewardData.emissionEndTimestamp * 1000 < Date.now())
155
+ if (+(supplyRewardData.emissionEndTimestamp.toString()) * 1000 < Date.now())
158
156
  return;
159
157
  const supplyEmissionPerSecond = supplyRewardData.emissionPerSecond;
160
158
  const supplyRewardPrice = new decimal_js_1.default(supplyRewardData.rewardPriceFeed).div(Math.pow(10, supplyRewardData.priceFeedDecimals))
@@ -175,7 +173,7 @@ const _getSparkMarketsData = (provider, network, selectedMarket) => __awaiter(vo
175
173
  });
176
174
  rewardForMarket.vIncentiveData.rewardsTokenInformation.forEach(borrowRewardData => {
177
175
  if (borrowRewardData) {
178
- if (borrowRewardData.emissionEndTimestamp * 1000 < Date.now())
176
+ if (+(borrowRewardData.emissionEndTimestamp.toString()) * 1000 < Date.now())
179
177
  return;
180
178
  const supplyEmissionPerSecond = borrowRewardData.emissionPerSecond;
181
179
  const supplyRewardPrice = new decimal_js_1.default(borrowRewardData.rewardPriceFeed).div(Math.pow(10, borrowRewardData.priceFeedDecimals))
@@ -207,7 +205,9 @@ const _getSparkMarketsData = (provider, network, selectedMarket) => __awaiter(vo
207
205
  .forEach((assetData, i) => {
208
206
  payload[assetData.symbol] = Object.assign(Object.assign({}, assetData), { sortIndex: i });
209
207
  });
210
- return { assetsData: payload };
208
+ eModeCategoriesData[0].collateralAssets = Object.values(payload).map(a => a.symbol);
209
+ eModeCategoriesData[0].borrowAssets = Object.values(payload).map(a => a.symbol);
210
+ return { assetsData: payload, eModeCategoriesData };
211
211
  });
212
212
  exports._getSparkMarketsData = _getSparkMarketsData;
213
213
  const getSparkMarketsData = (provider, network, selectedMarket) => __awaiter(void 0, void 0, void 0, function* () { return (0, exports._getSparkMarketsData)((0, viem_1.getViemProvider)(provider, network), network, selectedMarket); });
@@ -349,7 +349,7 @@ const getSparkAccountData = (provider, network, address, extractedState) => __aw
349
349
  exports.getSparkAccountData = getSparkAccountData;
350
350
  const getSparkFullPositionData = (provider, network, address, market) => __awaiter(void 0, void 0, void 0, function* () {
351
351
  const marketData = yield (0, exports.getSparkMarketsData)(provider, network, market);
352
- const positionData = yield (0, exports.getSparkAccountData)(provider, network, address, { assetsData: marketData.assetsData, selectedMarket: market });
352
+ const positionData = yield (0, exports.getSparkAccountData)(provider, network, address, { assetsData: marketData.assetsData, selectedMarket: market, eModeCategoriesData: marketData.eModeCategoriesData });
353
353
  return positionData;
354
354
  });
355
355
  exports.getSparkFullPositionData = getSparkFullPositionData;
@@ -149,21 +149,25 @@ export declare enum FluidMainnetDepositToken {
149
149
  USDC = "USDC",
150
150
  USDT = "USDT",
151
151
  GHO = "GHO",
152
- sUSDS = "sUSDS"
152
+ sUSDS = "sUSDS",
153
+ USDtb = "USDtb"
153
154
  }
154
155
  export declare enum FluidArbitrumDepositToken {
155
156
  ETH = "ETH",
156
157
  wstETH = "wstETH",
157
158
  USDC = "USDC",
158
159
  USDT = "USDT",
159
- ARB = "ARB"
160
+ ARB = "ARB",
161
+ GHO = "GHO",
162
+ sUSDS = "sUSDS"
160
163
  }
161
164
  export declare enum FluidBaseDepositToken {
162
165
  ETH = "ETH",
163
166
  USDC = "USDC",
164
167
  wstETH = "wstETH",
165
168
  EURC = "EURC",
166
- sUSDS = "sUSDS"
169
+ sUSDS = "sUSDS",
170
+ GHO = "GHO"
167
171
  }
168
172
  export type FluidDepositTokenByNetwork = {
169
173
  [NetworkNumber.Eth]: FluidMainnetDepositToken;
@@ -136,6 +136,7 @@ var FluidMainnetDepositToken;
136
136
  FluidMainnetDepositToken["USDT"] = "USDT";
137
137
  FluidMainnetDepositToken["GHO"] = "GHO";
138
138
  FluidMainnetDepositToken["sUSDS"] = "sUSDS";
139
+ FluidMainnetDepositToken["USDtb"] = "USDtb";
139
140
  })(FluidMainnetDepositToken || (exports.FluidMainnetDepositToken = FluidMainnetDepositToken = {}));
140
141
  var FluidArbitrumDepositToken;
141
142
  (function (FluidArbitrumDepositToken) {
@@ -144,6 +145,8 @@ var FluidArbitrumDepositToken;
144
145
  FluidArbitrumDepositToken["USDC"] = "USDC";
145
146
  FluidArbitrumDepositToken["USDT"] = "USDT";
146
147
  FluidArbitrumDepositToken["ARB"] = "ARB";
148
+ FluidArbitrumDepositToken["GHO"] = "GHO";
149
+ FluidArbitrumDepositToken["sUSDS"] = "sUSDS";
147
150
  })(FluidArbitrumDepositToken || (exports.FluidArbitrumDepositToken = FluidArbitrumDepositToken = {}));
148
151
  var FluidBaseDepositToken;
149
152
  (function (FluidBaseDepositToken) {
@@ -152,6 +155,7 @@ var FluidBaseDepositToken;
152
155
  FluidBaseDepositToken["wstETH"] = "wstETH";
153
156
  FluidBaseDepositToken["EURC"] = "EURC";
154
157
  FluidBaseDepositToken["sUSDS"] = "sUSDS";
158
+ FluidBaseDepositToken["GHO"] = "GHO";
155
159
  })(FluidBaseDepositToken || (exports.FluidBaseDepositToken = FluidBaseDepositToken = {}));
156
160
  var FluidVaultType;
157
161
  (function (FluidVaultType) {
@@ -1,3 +1,4 @@
1
+ import { EModeCategoriesData } from './aave';
1
2
  import { EthAddress, MMAssetData, MMPositionData, MMUsedAsset, NetworkNumber } from './common';
2
3
  export declare enum SparkVersions {
3
4
  SparkV1 = "v1default"
@@ -13,8 +14,6 @@ export interface SparkEModeCategoryDataMapping {
13
14
  enteringTerms: boolean[];
14
15
  canEnterCategory: boolean;
15
16
  id: number;
16
- data: SparkEModeCategoryData;
17
- assets: string[];
18
17
  enabledData: {
19
18
  ratio: string;
20
19
  liqRatio: string;
@@ -45,7 +44,6 @@ export interface SparkAssetData extends MMAssetData {
45
44
  usageAsCollateralEnabled: boolean;
46
45
  isIsolated: boolean;
47
46
  eModeCategory: number;
48
- eModeCategoryData: SparkEModeCategoryData;
49
47
  liquidationRatio: string;
50
48
  }
51
49
  export interface SparkAssetsData {
@@ -53,6 +51,7 @@ export interface SparkAssetsData {
53
51
  }
54
52
  export type SparkMarketsData = {
55
53
  assetsData: SparkAssetsData;
54
+ eModeCategoriesData: EModeCategoriesData;
56
55
  };
57
56
  export interface SparkUsedAsset extends MMUsedAsset {
58
57
  stableBorrowRate: string;
@@ -71,7 +70,7 @@ export interface SparkUsedAssets {
71
70
  export interface SparkHelperCommon {
72
71
  usedAssets: SparkUsedAssets;
73
72
  eModeCategory: number;
74
- eModeCategories?: object;
73
+ eModeCategoriesData?: EModeCategoriesData;
75
74
  assetsData: SparkAssetsData;
76
75
  selectedMarket?: SparkMarketData;
77
76
  network?: NetworkNumber;
@@ -1081,19 +1081,21 @@ export const _getFluidTokenData = (provider, network, token) => __awaiter(void 0
1081
1081
  };
1082
1082
  });
1083
1083
  export const getFluidTokenData = (provider, network, token) => __awaiter(void 0, void 0, void 0, function* () { return _getFluidTokenData(getViemProvider(provider, network), network, token); });
1084
- const parseFDepositTokenData = (fTokenData, userPosition, fTokenAddress) => {
1085
- const supplyRate = new Dec(fTokenData.supplyRate).div(100).toString();
1086
- const rewardsRate = new Dec(fTokenData.rewardsRate).div(1e12).toString();
1084
+ const parseFDepositTokenData = (fTokenData, userPosition, apiData, fTokenAddress) => {
1085
+ var _a, _b;
1087
1086
  const decimals = fTokenData.decimals.toString();
1088
1087
  const depositRate = new Dec(getEthAmountForDecimals(fTokenData.convertToShares.toString(), decimals)).toString();
1089
1088
  const withdrawRate = new Dec(getEthAmountForDecimals(fTokenData.convertToAssets.toString(), decimals)).toString();
1089
+ const supplyRate = new Dec((apiData === null || apiData === void 0 ? void 0 : apiData.supplyRate) || '0').div(100).toString();
1090
+ const rewardRates = ((_a = apiData === null || apiData === void 0 ? void 0 : apiData.rewards) === null || _a === void 0 ? void 0 : _a.reduce((acc, item) => acc.add(new Dec(item.rate || '0').div(100)), new Dec(0))) || '0';
1091
+ const stakeRate = new Dec(((_b = apiData === null || apiData === void 0 ? void 0 : apiData.asset) === null || _b === void 0 ? void 0 : _b.stakingApr) || '0').div(100).toString();
1090
1092
  return {
1091
1093
  fTokenAddress,
1092
1094
  fTokenSymbol: fTokenData.symbol,
1093
1095
  decimals,
1094
1096
  totalDeposited: getEthAmountForDecimals(fTokenData.totalAssets.toString(), decimals),
1095
1097
  withdrawable: getEthAmountForDecimals(fTokenData.withdrawable.toString(), decimals),
1096
- apy: new Dec(supplyRate).add(rewardsRate).toString(),
1098
+ apy: new Dec(supplyRate).plus(rewardRates).plus(stakeRate).toString(),
1097
1099
  depositRate,
1098
1100
  withdrawRate,
1099
1101
  deposited: getEthAmountForDecimals(userPosition.underlyingAssets.toString(), decimals),
@@ -1103,19 +1105,42 @@ const parseFDepositTokenData = (fTokenData, userPosition, fTokenAddress) => {
1103
1105
  export const _getFluidDepositData = (provider, network, token, address) => __awaiter(void 0, void 0, void 0, function* () {
1104
1106
  const view = FluidViewContractViem(provider, network);
1105
1107
  const fTokenAddress = getFTokenAddress(token, network);
1106
- const [userPosition, fTokenData] = yield view.read.getUserEarnPositionWithFToken([fTokenAddress, address]);
1107
- return parseFDepositTokenData(fTokenData, userPosition, fTokenAddress);
1108
+ const [[userPosition, fTokenData], rewardsApiResponse,] = yield Promise.all([
1109
+ view.read.getUserEarnPositionWithFToken([fTokenAddress, address]),
1110
+ fetch(`https://api.fluid.instadapp.io/v2/lending/${network}/tokens/${fTokenAddress}`),
1111
+ ]);
1112
+ let rewardsData = { rewards: [] };
1113
+ if (!rewardsApiResponse.ok) {
1114
+ console.log('External API Failure: Failed to fetch fluid rewards APY');
1115
+ }
1116
+ else {
1117
+ rewardsData = yield rewardsApiResponse.json();
1118
+ }
1119
+ return parseFDepositTokenData(fTokenData, userPosition, rewardsData, fTokenAddress);
1108
1120
  });
1109
1121
  export const getFluidDepositData = (provider, network, token, address) => __awaiter(void 0, void 0, void 0, function* () { return _getFluidDepositData(getViemProvider(provider, network), network, token, address); });
1110
1122
  export const _getAllUserEarnPositionsWithFTokens = (provider, network, user) => __awaiter(void 0, void 0, void 0, function* () {
1111
1123
  const view = FluidViewContractViem(provider, network);
1112
- const [userPositions, fTokensData] = yield view.read.getAllUserEarnPositionsWithFTokens([user]);
1124
+ const [[userPositions, fTokensData], rewardsApiResponse,] = yield Promise.all([
1125
+ view.read.getAllUserEarnPositionsWithFTokens([user]),
1126
+ fetch(`https://api.fluid.instadapp.io/v2/lending/${network}/tokens`),
1127
+ ]);
1128
+ let rewardsData = {
1129
+ data: [{ address: ZERO_ADDRESS, rewards: [] }],
1130
+ };
1131
+ if (!rewardsApiResponse.ok) {
1132
+ console.log('External API Failure: Failed to fetch fluid rewards APY');
1133
+ }
1134
+ else {
1135
+ rewardsData = yield rewardsApiResponse.json();
1136
+ }
1113
1137
  const parsedRes = fTokensData.reduce((acc, fTokenData, i) => {
1114
1138
  const userPosition = userPositions[i];
1115
1139
  const deposited = userPosition === null || userPosition === void 0 ? void 0 : userPosition.underlyingAssets;
1116
1140
  if (Number(deposited) > 0) {
1117
1141
  const fTokenAddress = fTokenData.tokenAddress;
1118
- acc.push(parseFDepositTokenData(fTokenData, userPosition, fTokenAddress));
1142
+ const apiData = rewardsData.data.find((item) => compareAddresses(item.address, fTokenAddress));
1143
+ acc.push(parseFDepositTokenData(fTokenData, userPosition, apiData, fTokenAddress));
1119
1144
  }
1120
1145
  return acc;
1121
1146
  }, []);
@@ -1160,19 +1185,22 @@ const getTokenPricePortfolio = (token, provider, network) => __awaiter(void 0, v
1160
1185
  const tokensWithoutChainlinkPrices = ['sUSDS', 'USDA', 'ezETH', 'rsETH', 'weETHs', 'LBTC'];
1161
1186
  const handleTokenWithoutChainlinkPrice = (token, prices) => {
1162
1187
  if (token === 'sUSDS') {
1163
- return new Dec('105276929').div(1e8).toString();
1188
+ return new Dec('107057929').div(1e8).toString();
1164
1189
  }
1165
1190
  if (token === 'USDA') {
1166
1191
  return new Dec('100000000').div(1e8).toString();
1167
1192
  }
1193
+ if (token === 'wstUSR') {
1194
+ return new Dec('111280000').div(1e8).toString();
1195
+ }
1168
1196
  if (token === 'ezETH') {
1169
- return new Dec(prices.ETH).mul(1.049).toString();
1197
+ return new Dec(prices.ETH).mul(1.06).toString();
1170
1198
  }
1171
1199
  if (token === 'rsETH') {
1172
- return new Dec(prices.wstETH).mul(1.0454).toString();
1200
+ return new Dec(prices.wstETH).mul(1.0557).toString();
1173
1201
  }
1174
1202
  if (token === 'weETHs') {
1175
- return new Dec(prices.wstETH).mul(1.026).toString();
1203
+ return new Dec(prices.wstETH).mul(1.032).toString();
1176
1204
  }
1177
1205
  if (token === 'LBTC') {
1178
1206
  return prices.WBTC;
@@ -7,19 +7,19 @@ export declare const sparkIsInIsolationMode: ({ usedAssets, assetsData }: {
7
7
  export declare const sparkGetCollSuppliedAssets: ({ usedAssets }: {
8
8
  usedAssets: SparkUsedAssets;
9
9
  }) => import("../../types").SparkUsedAsset[];
10
- export declare const sparkGetSuppliableAssets: ({ usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest }: SparkHelperCommon) => {
10
+ export declare const sparkGetSuppliableAssets: ({ usedAssets, eModeCategory, assetsData, selectedMarket, network, ...rest }: SparkHelperCommon) => {
11
11
  symbol: string;
12
12
  canBeCollateral: boolean;
13
13
  }[];
14
- export declare const sparkGetSuppliableAsCollAssets: ({ usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest }: SparkHelperCommon) => {
14
+ export declare const sparkGetSuppliableAsCollAssets: ({ usedAssets, eModeCategory, assetsData, selectedMarket, network, ...rest }: SparkHelperCommon) => {
15
15
  symbol: string;
16
16
  canBeCollateral: boolean;
17
17
  }[];
18
- export declare const sparkGetEmodeMutableProps: ({ eModeCategory, assetsData, }: SparkHelperCommon, _asset: string) => {
18
+ export declare const sparkGetEmodeMutableProps: ({ eModeCategory, eModeCategoriesData, assetsData, }: SparkHelperCommon, _asset: string) => {
19
19
  liquidationRatio: string;
20
20
  collateralFactor: string;
21
21
  };
22
- export declare const sparkGetAggregatedPositionData: ({ usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest }: SparkHelperCommon) => SparkAggregatedPositionData;
22
+ export declare const sparkGetAggregatedPositionData: ({ usedAssets, eModeCategory, eModeCategoriesData, assetsData, selectedMarket, network, ...rest }: SparkHelperCommon) => SparkAggregatedPositionData;
23
23
  export declare const getApyAfterValuesEstimation: (selectedMarket: SparkMarketData, actions: [{
24
24
  action: string;
25
25
  amount: string;