@defisaver/positions-sdk 2.1.10 → 2.1.12

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.
@@ -166,7 +166,7 @@ function _getAaveV3MarketData(provider_1, network_1, market_1) {
166
166
  const rewardForMarket = rewardInfo === null || rewardInfo === void 0 ? void 0 : rewardInfo[_market.underlyingTokenAddress];
167
167
  const isStakingAsset = staking_1.STAKING_ASSETS.includes(_market.symbol);
168
168
  if (isStakingAsset) {
169
- const yieldApy = yield (0, staking_1.getStakingApy)(_market.symbol);
169
+ const yieldApy = yield (0, staking_1.getStakingApy)(_market.symbol, network);
170
170
  _market.supplyIncentives.push({
171
171
  apy: yieldApy,
172
172
  token: _market.symbol,
@@ -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);
@@ -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))
@@ -196,7 +194,7 @@ const _getSparkMarketsData = (provider, network, selectedMarket) => __awaiter(vo
196
194
  });
197
195
  /* eslint-enable no-param-reassign */
198
196
  })));
199
- const payload = {};
197
+ const filteredAssetsData = {};
200
198
  // Sort by market size
201
199
  assetsData
202
200
  .sort((a, b) => {
@@ -205,9 +203,11 @@ const _getSparkMarketsData = (provider, network, selectedMarket) => __awaiter(vo
205
203
  return new decimal_js_1.default(bMarket).minus(aMarket).toNumber();
206
204
  })
207
205
  .forEach((assetData, i) => {
208
- payload[assetData.symbol] = Object.assign(Object.assign({}, assetData), { sortIndex: i });
206
+ filteredAssetsData[assetData.symbol] = Object.assign(Object.assign({}, assetData), { sortIndex: i });
209
207
  });
210
- return { assetsData: payload };
208
+ eModeCategoriesData[0].collateralAssets = Object.values(filteredAssetsData).map(a => a.symbol);
209
+ eModeCategoriesData[0].borrowAssets = Object.values(filteredAssetsData).map(a => a.symbol);
210
+ return { assetsData: filteredAssetsData, 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;
@@ -1,7 +1,7 @@
1
1
  import memoize from 'memoizee';
2
2
  import { MMAssetsData, MMUsedAssets } from '../types/common';
3
3
  export declare const STAKING_ASSETS: string[];
4
- export declare const getStakingApy: ((asset: string) => Promise<string>) & memoize.Memoized<(asset: string) => Promise<string>>;
4
+ export declare const getStakingApy: ((asset: string, network?: number) => Promise<string>) & memoize.Memoized<(asset: string, network?: number) => Promise<string>>;
5
5
  export declare const calculateInterestEarned: (principal: string, interest: string, type: string, apy?: boolean) => number;
6
6
  export declare const calculateNetApy: ({ usedAssets, assetsData, optionalData, }: {
7
7
  usedAssets: MMUsedAssets;
@@ -15,6 +15,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.calculateNetApy = exports.calculateInterestEarned = exports.getStakingApy = exports.STAKING_ASSETS = void 0;
16
16
  const decimal_js_1 = __importDefault(require("decimal.js"));
17
17
  const memoizee_1 = __importDefault(require("memoizee"));
18
+ const common_1 = require("../types/common");
18
19
  const constants_1 = require("../constants");
19
20
  const utils_1 = require("../services/utils");
20
21
  const eligibility_1 = require("./eligibility");
@@ -53,10 +54,10 @@ const getSuperOETHApy = () => __awaiter(void 0, void 0, void 0, function* () {
53
54
  return '0';
54
55
  }
55
56
  });
56
- const getApyFromDfsApi = (asset) => __awaiter(void 0, void 0, void 0, function* () {
57
+ const getApyFromDfsApi = (asset_1, ...args_1) => __awaiter(void 0, [asset_1, ...args_1], void 0, function* (asset, network = common_1.NetworkNumber.Eth) {
57
58
  var _a;
58
59
  try {
59
- const res = yield fetch(`https://fe.defisaver.com/api/staking/apy?asset=${asset}`, { signal: AbortSignal.timeout(utils_1.DEFAULT_TIMEOUT) });
60
+ const res = yield fetch(`http://localhost:8888/api/staking/apy?asset=${asset}&network=${network}`, { signal: AbortSignal.timeout(utils_1.DEFAULT_TIMEOUT) });
60
61
  if (!res.ok)
61
62
  throw new Error(`Failed to fetch APY for ${asset}`);
62
63
  const data = yield res.json();
@@ -68,7 +69,7 @@ const getApyFromDfsApi = (asset) => __awaiter(void 0, void 0, void 0, function*
68
69
  }
69
70
  });
70
71
  exports.STAKING_ASSETS = ['cbETH', 'wstETH', 'cbETH', 'rETH', 'sDAI', 'weETH', 'sUSDe', 'osETH', 'ezETH', 'ETHx', 'rsETH', 'pufETH', 'wrsETH', 'wsuperOETHb', 'sUSDS', 'tETH', 'PT sUSDe Sep', 'PT USDe Sep', 'PT sUSDe Nov', 'PT USDe Nov', 'PT USDe Jan', 'PT sUSDe Jan', 'wrsETH', 'wstETH'];
71
- exports.getStakingApy = (0, memoizee_1.default)((asset) => __awaiter(void 0, void 0, void 0, function* () {
72
+ exports.getStakingApy = (0, memoizee_1.default)((asset_1, ...args_1) => __awaiter(void 0, [asset_1, ...args_1], void 0, function* (asset, network = common_1.NetworkNumber.Eth) {
72
73
  try {
73
74
  if (asset === 'stETH' || asset === 'wstETH')
74
75
  return yield getApyFromDfsApi('wstETH');
@@ -97,29 +98,29 @@ exports.getStakingApy = (0, memoizee_1.default)((asset) => __awaiter(void 0, voi
97
98
  if (asset === 'sUSDS')
98
99
  return yield getSsrApy();
99
100
  if (asset === 'PT eUSDe May')
100
- return yield getApyFromDfsApi('PT eUSDe May');
101
+ return yield getApyFromDfsApi('PT eUSDe May', network);
101
102
  if (asset === 'PT sUSDe July')
102
- return yield getApyFromDfsApi('PT sUSDe July');
103
+ return yield getApyFromDfsApi('PT sUSDe July', network);
103
104
  if (asset === 'PT USDe July')
104
- return yield getApyFromDfsApi('PT USDe July');
105
+ return yield getApyFromDfsApi('PT USDe July', network);
105
106
  if (asset === 'PT eUSDe Aug')
106
- return yield getApyFromDfsApi('PT eUSDe Aug');
107
+ return yield getApyFromDfsApi('PT eUSDe Aug', network);
107
108
  if (asset === 'PT sUSDe Sep')
108
- return yield getApyFromDfsApi('PT sUSDe Sep');
109
+ return yield getApyFromDfsApi('PT sUSDe Sep', network);
109
110
  if (asset === 'PT USDe Sep')
110
- return yield getApyFromDfsApi('PT USDe Sep');
111
+ return yield getApyFromDfsApi('PT USDe Sep', network);
111
112
  if (asset === 'tETH')
112
113
  return yield getApyFromDfsApi('tETH');
113
114
  if (asset === 'USDe')
114
115
  return yield getApyFromDfsApi('USDe');
115
116
  if (asset === 'PT sUSDe Nov')
116
- return yield getApyFromDfsApi('PT sUSDe Nov');
117
+ return yield getApyFromDfsApi('PT sUSDe Nov', network);
117
118
  if (asset === 'PT USDe Nov')
118
- return yield getApyFromDfsApi('PT USDe Nov');
119
+ return yield getApyFromDfsApi('PT USDe Nov', network);
119
120
  if (asset === 'PT USDe Jan')
120
- return yield getApyFromDfsApi('PT USDe Jan');
121
+ return yield getApyFromDfsApi('PT USDe Jan', network);
121
122
  if (asset === 'PT sUSDe Jan')
122
- return yield getApyFromDfsApi('PT sUSDe Jan');
123
+ return yield getApyFromDfsApi('PT sUSDe Jan', network);
123
124
  }
124
125
  catch (e) {
125
126
  console.error(`Failed to fetch APY for ${asset}`);
@@ -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;
@@ -155,7 +155,7 @@ export function _getAaveV3MarketData(provider_1, network_1, market_1) {
155
155
  const rewardForMarket = rewardInfo === null || rewardInfo === void 0 ? void 0 : rewardInfo[_market.underlyingTokenAddress];
156
156
  const isStakingAsset = STAKING_ASSETS.includes(_market.symbol);
157
157
  if (isStakingAsset) {
158
- const yieldApy = yield getStakingApy(_market.symbol);
158
+ const yieldApy = yield getStakingApy(_market.symbol, network);
159
159
  _market.supplyIncentives.push({
160
160
  apy: yieldApy,
161
161
  token: _market.symbol,
@@ -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;
@@ -22,7 +22,7 @@ import Dec from 'decimal.js';
22
22
  import { assetAmountInWei, getAssetInfo, getAssetInfoByAddress } from '@defisaver/tokens';
23
23
  import { aprToApy, calcLeverageLiqPrice, getAssetsTotal, isLeveragedPos, } from '../../moneymarket';
24
24
  import { calculateNetApy } from '../../staking';
25
- import { ethToWeth, wethToEth } from '../../services/utils';
25
+ import { ethToWeth, getNativeAssetFromWrapped, wethToEth } from '../../services/utils';
26
26
  import { SparkViewContractViem } from '../../contracts';
27
27
  import { NetworkNumber } from '../../types/common';
28
28
  import { borrowOperations } from '../../constants';
@@ -30,8 +30,8 @@ import { getViemProvider } from '../../services/viem';
30
30
  export const sparkIsInIsolationMode = ({ usedAssets, assetsData }) => Object.values(usedAssets).some(({ symbol, collateral }) => collateral && assetsData[symbol].isIsolated);
31
31
  export const sparkGetCollSuppliedAssets = ({ usedAssets }) => Object.values(usedAssets).filter(({ isSupplied, collateral }) => isSupplied && collateral);
32
32
  export const sparkGetSuppliableAssets = (_a) => {
33
- var { usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network } = _a, rest = __rest(_a, ["usedAssets", "eModeCategory", "eModeCategories", "assetsData", "selectedMarket", "network"]);
34
- const data = Object.assign({ usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network }, rest);
33
+ var { usedAssets, eModeCategory, assetsData, selectedMarket, network } = _a, rest = __rest(_a, ["usedAssets", "eModeCategory", "assetsData", "selectedMarket", "network"]);
34
+ const data = Object.assign({ usedAssets, eModeCategory, assetsData, selectedMarket, network }, rest);
35
35
  const collAccountAssets = sparkGetCollSuppliedAssets(data);
36
36
  const marketAssets = Object.values(assetsData);
37
37
  if (sparkIsInIsolationMode(data)) {
@@ -41,25 +41,25 @@ export const sparkGetSuppliableAssets = (_a) => {
41
41
  return marketAssets.filter(d => d.canBeSupplied).map(({ symbol, isIsolated }) => ({ symbol, canBeCollateral: !isIsolated }));
42
42
  };
43
43
  export const sparkGetSuppliableAsCollAssets = (_a) => {
44
- var { usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network } = _a, rest = __rest(_a, ["usedAssets", "eModeCategory", "eModeCategories", "assetsData", "selectedMarket", "network"]);
45
- return sparkGetSuppliableAssets(Object.assign({ usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network }, rest)).filter(({ canBeCollateral }) => canBeCollateral);
44
+ var { usedAssets, eModeCategory, assetsData, selectedMarket, network } = _a, rest = __rest(_a, ["usedAssets", "eModeCategory", "assetsData", "selectedMarket", "network"]);
45
+ return sparkGetSuppliableAssets(Object.assign({ usedAssets, eModeCategory, assetsData, selectedMarket, network }, rest)).filter(({ canBeCollateral }) => canBeCollateral);
46
46
  };
47
- export const sparkGetEmodeMutableProps = ({ eModeCategory, assetsData, }, _asset) => {
48
- var _a;
49
- const asset = wethToEth(_asset);
47
+ export const sparkGetEmodeMutableProps = ({ eModeCategory, eModeCategoriesData, assetsData, }, _asset) => {
48
+ const asset = getNativeAssetFromWrapped(_asset);
50
49
  const assetData = assetsData[asset];
50
+ const eModeCategoryData = (eModeCategoriesData === null || eModeCategoriesData === void 0 ? void 0 : eModeCategoriesData[eModeCategory]) || { collateralAssets: [], collateralFactor: '0', liquidationRatio: '0' };
51
51
  if (eModeCategory === 0
52
- || assetData.eModeCategory !== eModeCategory
53
- || new Dec(((_a = assetData === null || assetData === void 0 ? void 0 : assetData.eModeCategoryData) === null || _a === void 0 ? void 0 : _a.collateralFactor) || 0).eq(0)) {
52
+ || !eModeCategoryData.collateralAssets.includes(asset)
53
+ || new Dec(eModeCategoryData.collateralFactor || 0).eq(0)) {
54
54
  const { liquidationRatio, collateralFactor } = assetData;
55
55
  return ({ liquidationRatio, collateralFactor });
56
56
  }
57
- const { liquidationRatio, collateralFactor } = assetData.eModeCategoryData;
57
+ const { liquidationRatio, collateralFactor } = eModeCategoryData;
58
58
  return ({ liquidationRatio, collateralFactor });
59
59
  };
60
60
  export const sparkGetAggregatedPositionData = (_a) => {
61
- var { usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network } = _a, rest = __rest(_a, ["usedAssets", "eModeCategory", "eModeCategories", "assetsData", "selectedMarket", "network"]);
62
- const data = Object.assign({ usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network }, rest);
61
+ var { usedAssets, eModeCategory, eModeCategoriesData, assetsData, selectedMarket, network } = _a, rest = __rest(_a, ["usedAssets", "eModeCategory", "eModeCategoriesData", "assetsData", "selectedMarket", "network"]);
62
+ const data = Object.assign({ usedAssets, eModeCategory, eModeCategoriesData, assetsData, selectedMarket, network }, rest);
63
63
  const payload = {};
64
64
  payload.suppliedUsd = getAssetsTotal(usedAssets, ({ isSupplied }) => isSupplied, ({ suppliedUsd }) => suppliedUsd);
65
65
  payload.suppliedCollateralUsd = getAssetsTotal(usedAssets, ({ isSupplied, collateral }) => isSupplied && collateral, ({ suppliedUsd }) => suppliedUsd);
@@ -446,7 +446,7 @@ export function getPortfolioData(provider, network, defaultProvider, addresses,
446
446
  }))).flat(),
447
447
  ...sparkMarkets.map((market) => allAddresses.map((address) => __awaiter(this, void 0, void 0, function* () {
448
448
  try {
449
- const accData = yield _getSparkAccountData(client, network, address, { selectedMarket: market, assetsData: sparkMarketsData[market.value].assetsData });
449
+ const accData = yield _getSparkAccountData(client, network, address, { selectedMarket: market, assetsData: sparkMarketsData[market.value].assetsData, eModeCategoriesData: sparkMarketsData[market.value].eModeCategoriesData });
450
450
  if (new Dec(accData.suppliedUsd).gt(0))
451
451
  positions[address.toLowerCase()].spark[market.value] = { error: '', data: accData };
452
452
  }
@@ -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>;
@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  };
10
10
  import Dec from 'decimal.js';
11
11
  import { assetAmountInEth, assetAmountInWei, getAssetInfo } from '@defisaver/tokens';
12
- import { IncentiveKind, NetworkNumber, } from '../types/common';
12
+ import { IncentiveKind, } from '../types/common';
13
13
  import { ethToWeth, wethToEth, wethToEthByAddress, } from '../services/utils';
14
14
  import { calculateNetApy, getStakingApy, STAKING_ASSETS, } from '../staking';
15
15
  import { SparkViewContractViem, SparkIncentiveDataProviderContractViem, createViemContractFromConfigFunc, } from '../contracts';
@@ -22,7 +22,6 @@ export const sparkEmodeCategoriesMapping = (extractedState, usedAssets) => {
22
22
  const usedAssetsValues = Object.values(usedAssets);
23
23
  const categoriesMapping = {};
24
24
  Object.values(assetsData).forEach((a) => {
25
- var _a;
26
25
  const borrowingOnlyFromCategory = a.eModeCategory === 0
27
26
  ? true
28
27
  : !usedAssetsValues.filter(u => u.isBorrowed && u.eModeCategory !== a.eModeCategory).length;
@@ -33,8 +32,6 @@ export const sparkEmodeCategoriesMapping = (extractedState, usedAssets) => {
33
32
  enteringTerms,
34
33
  canEnterCategory: !enteringTerms.includes(false),
35
34
  id: a.eModeCategory,
36
- data: a.eModeCategoryData,
37
- assets: a.eModeCategory === 0 ? [] : [...(((_a = categoriesMapping[a.eModeCategory]) === null || _a === void 0 ? void 0 : _a.assets) || []), a.symbol],
38
35
  enabledData: {
39
36
  ratio: afterEnteringCategory.ratio,
40
37
  liqRatio: afterEnteringCategory.liqRatio,
@@ -49,18 +46,17 @@ export const _getSparkMarketsData = (provider, network, selectedMarket) => __awa
49
46
  const marketAddress = selectedMarket.providerAddress;
50
47
  const loanInfoContract = SparkViewContractViem(provider, network);
51
48
  const sparkIncentivesContract = SparkIncentiveDataProviderContractViem(provider, network);
52
- const [loanInfo, _rewardInfo] = yield Promise.all([
49
+ // eslint-disable-next-line prefer-const
50
+ let [loanInfo, rewardInfo] = yield Promise.all([
53
51
  loanInfoContract.read.getFullTokensInfo([marketAddress, selectedMarket.assets.map(a => getAssetInfo(ethToWeth(a)).address)]),
54
- network === NetworkNumber.Opt ? sparkIncentivesContract.read.getReservesIncentivesData([marketAddress]) : [],
52
+ sparkIncentivesContract.read.getReservesIncentivesData([marketAddress]),
55
53
  ]);
56
- let rewardInfo = [];
57
- if (network === NetworkNumber.Opt) {
58
- rewardInfo = rewardInfo.reduce((all, market) => {
59
- // eslint-disable-next-line no-param-reassign
60
- all[market.underlyingAsset] = market;
61
- return all;
62
- }, {});
63
- }
54
+ rewardInfo = rewardInfo.reduce((all, market) => {
55
+ // eslint-disable-next-line no-param-reassign
56
+ all[market.underlyingAsset] = market;
57
+ return all;
58
+ }, {});
59
+ const eModeCategoriesData = {};
64
60
  const assetsData = yield Promise.all(loanInfo
65
61
  .map((market, i) => __awaiter(void 0, void 0, void 0, function* () {
66
62
  const symbol = selectedMarket.assets[i];
@@ -75,6 +71,15 @@ export const _getSparkMarketsData = (provider, network, selectedMarket) => __awa
75
71
  if (new Dec(marketLiquidity).lt(0)) {
76
72
  marketLiquidity = '0';
77
73
  }
74
+ eModeCategoriesData[+market.emodeCategory.toString()] = {
75
+ id: +market.emodeCategory.toString(),
76
+ label: market.label,
77
+ liquidationBonus: new Dec(market.liquidationBonus).div(10000).toString(),
78
+ liquidationRatio: new Dec(market.liquidationThreshold).div(10000).toString(),
79
+ collateralFactor: new Dec(market.ltv).div(10000).toString(),
80
+ collateralAssets: eModeCategoriesData[+market.emodeCategory.toString()] ? [...eModeCategoriesData[+market.emodeCategory.toString()].collateralAssets, selectedMarket.assets[i]] : [selectedMarket.assets[i]],
81
+ borrowAssets: eModeCategoriesData[+market.emodeCategory.toString()] ? [...eModeCategoriesData[+market.emodeCategory.toString()].borrowAssets, selectedMarket.assets[i]] : [selectedMarket.assets[i]],
82
+ };
78
83
  return ({
79
84
  symbol: selectedMarket.assets[i],
80
85
  isIsolated: new Dec(market.debtCeilingForIsolationMode.toString()).gt(0),
@@ -109,13 +114,6 @@ export const _getSparkMarketsData = (provider, network, selectedMarket) => __awa
109
114
  isolationModeBorrowingEnabled: market.isolationModeBorrowingEnabled,
110
115
  isFlashLoanEnabled: market.isFlashLoanEnabled,
111
116
  aTokenAddress: market.aTokenAddress,
112
- eModeCategoryData: {
113
- label: market.label,
114
- liquidationBonus: new Dec(market.liquidationBonus).div(10000).toString(),
115
- liquidationRatio: new Dec(market.liquidationThreshold).div(10000).toString(),
116
- collateralFactor: new Dec(market.ltv).div(10000).toString(),
117
- priceSource: market.priceSource,
118
- },
119
117
  supplyIncentives: [],
120
118
  borrowIncentives: [],
121
119
  });
@@ -147,7 +145,7 @@ export const _getSparkMarketsData = (provider, network, selectedMarket) => __awa
147
145
  return;
148
146
  rewardForMarket.aIncentiveData.rewardsTokenInformation.forEach(supplyRewardData => {
149
147
  if (supplyRewardData) {
150
- if (supplyRewardData.emissionEndTimestamp * 1000 < Date.now())
148
+ if (+(supplyRewardData.emissionEndTimestamp.toString()) * 1000 < Date.now())
151
149
  return;
152
150
  const supplyEmissionPerSecond = supplyRewardData.emissionPerSecond;
153
151
  const supplyRewardPrice = new Dec(supplyRewardData.rewardPriceFeed).div(Math.pow(10, supplyRewardData.priceFeedDecimals))
@@ -168,7 +166,7 @@ export const _getSparkMarketsData = (provider, network, selectedMarket) => __awa
168
166
  });
169
167
  rewardForMarket.vIncentiveData.rewardsTokenInformation.forEach(borrowRewardData => {
170
168
  if (borrowRewardData) {
171
- if (borrowRewardData.emissionEndTimestamp * 1000 < Date.now())
169
+ if (+(borrowRewardData.emissionEndTimestamp.toString()) * 1000 < Date.now())
172
170
  return;
173
171
  const supplyEmissionPerSecond = borrowRewardData.emissionPerSecond;
174
172
  const supplyRewardPrice = new Dec(borrowRewardData.rewardPriceFeed).div(Math.pow(10, borrowRewardData.priceFeedDecimals))
@@ -189,7 +187,7 @@ export const _getSparkMarketsData = (provider, network, selectedMarket) => __awa
189
187
  });
190
188
  /* eslint-enable no-param-reassign */
191
189
  })));
192
- const payload = {};
190
+ const filteredAssetsData = {};
193
191
  // Sort by market size
194
192
  assetsData
195
193
  .sort((a, b) => {
@@ -198,9 +196,11 @@ export const _getSparkMarketsData = (provider, network, selectedMarket) => __awa
198
196
  return new Dec(bMarket).minus(aMarket).toNumber();
199
197
  })
200
198
  .forEach((assetData, i) => {
201
- payload[assetData.symbol] = Object.assign(Object.assign({}, assetData), { sortIndex: i });
199
+ filteredAssetsData[assetData.symbol] = Object.assign(Object.assign({}, assetData), { sortIndex: i });
202
200
  });
203
- return { assetsData: payload };
201
+ eModeCategoriesData[0].collateralAssets = Object.values(filteredAssetsData).map(a => a.symbol);
202
+ eModeCategoriesData[0].borrowAssets = Object.values(filteredAssetsData).map(a => a.symbol);
203
+ return { assetsData: filteredAssetsData, eModeCategoriesData };
204
204
  });
205
205
  export const getSparkMarketsData = (provider, network, selectedMarket) => __awaiter(void 0, void 0, void 0, function* () { return _getSparkMarketsData(getViemProvider(provider, network), network, selectedMarket); });
206
206
  export const EMPTY_SPARK_DATA = {
@@ -336,6 +336,6 @@ export const _getSparkAccountData = (provider, network, address, extractedState)
336
336
  export const getSparkAccountData = (provider, network, address, extractedState) => __awaiter(void 0, void 0, void 0, function* () { return _getSparkAccountData(getViemProvider(provider, network), network, address, extractedState); });
337
337
  export const getSparkFullPositionData = (provider, network, address, market) => __awaiter(void 0, void 0, void 0, function* () {
338
338
  const marketData = yield getSparkMarketsData(provider, network, market);
339
- const positionData = yield getSparkAccountData(provider, network, address, { assetsData: marketData.assetsData, selectedMarket: market });
339
+ const positionData = yield getSparkAccountData(provider, network, address, { assetsData: marketData.assetsData, selectedMarket: market, eModeCategoriesData: marketData.eModeCategoriesData });
340
340
  return positionData;
341
341
  });
@@ -1,7 +1,7 @@
1
1
  import memoize from 'memoizee';
2
2
  import { MMAssetsData, MMUsedAssets } from '../types/common';
3
3
  export declare const STAKING_ASSETS: string[];
4
- export declare const getStakingApy: ((asset: string) => Promise<string>) & memoize.Memoized<(asset: string) => Promise<string>>;
4
+ export declare const getStakingApy: ((asset: string, network?: number) => Promise<string>) & memoize.Memoized<(asset: string, network?: number) => Promise<string>>;
5
5
  export declare const calculateInterestEarned: (principal: string, interest: string, type: string, apy?: boolean) => number;
6
6
  export declare const calculateNetApy: ({ usedAssets, assetsData, optionalData, }: {
7
7
  usedAssets: MMUsedAssets;
@@ -9,6 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  };
10
10
  import Dec from 'decimal.js';
11
11
  import memoize from 'memoizee';
12
+ import { NetworkNumber, } from '../types/common';
12
13
  import { BLOCKS_IN_A_YEAR } from '../constants';
13
14
  import { DEFAULT_TIMEOUT } from '../services/utils';
14
15
  import { EligibilityMapping } from './eligibility';
@@ -47,10 +48,10 @@ const getSuperOETHApy = () => __awaiter(void 0, void 0, void 0, function* () {
47
48
  return '0';
48
49
  }
49
50
  });
50
- const getApyFromDfsApi = (asset) => __awaiter(void 0, void 0, void 0, function* () {
51
+ const getApyFromDfsApi = (asset_1, ...args_1) => __awaiter(void 0, [asset_1, ...args_1], void 0, function* (asset, network = NetworkNumber.Eth) {
51
52
  var _a;
52
53
  try {
53
- const res = yield fetch(`https://fe.defisaver.com/api/staking/apy?asset=${asset}`, { signal: AbortSignal.timeout(DEFAULT_TIMEOUT) });
54
+ const res = yield fetch(`http://localhost:8888/api/staking/apy?asset=${asset}&network=${network}`, { signal: AbortSignal.timeout(DEFAULT_TIMEOUT) });
54
55
  if (!res.ok)
55
56
  throw new Error(`Failed to fetch APY for ${asset}`);
56
57
  const data = yield res.json();
@@ -62,7 +63,7 @@ const getApyFromDfsApi = (asset) => __awaiter(void 0, void 0, void 0, function*
62
63
  }
63
64
  });
64
65
  export const STAKING_ASSETS = ['cbETH', 'wstETH', 'cbETH', 'rETH', 'sDAI', 'weETH', 'sUSDe', 'osETH', 'ezETH', 'ETHx', 'rsETH', 'pufETH', 'wrsETH', 'wsuperOETHb', 'sUSDS', 'tETH', 'PT sUSDe Sep', 'PT USDe Sep', 'PT sUSDe Nov', 'PT USDe Nov', 'PT USDe Jan', 'PT sUSDe Jan', 'wrsETH', 'wstETH'];
65
- export const getStakingApy = memoize((asset) => __awaiter(void 0, void 0, void 0, function* () {
66
+ export const getStakingApy = memoize((asset_1, ...args_1) => __awaiter(void 0, [asset_1, ...args_1], void 0, function* (asset, network = NetworkNumber.Eth) {
66
67
  try {
67
68
  if (asset === 'stETH' || asset === 'wstETH')
68
69
  return yield getApyFromDfsApi('wstETH');
@@ -91,29 +92,29 @@ export const getStakingApy = memoize((asset) => __awaiter(void 0, void 0, void 0
91
92
  if (asset === 'sUSDS')
92
93
  return yield getSsrApy();
93
94
  if (asset === 'PT eUSDe May')
94
- return yield getApyFromDfsApi('PT eUSDe May');
95
+ return yield getApyFromDfsApi('PT eUSDe May', network);
95
96
  if (asset === 'PT sUSDe July')
96
- return yield getApyFromDfsApi('PT sUSDe July');
97
+ return yield getApyFromDfsApi('PT sUSDe July', network);
97
98
  if (asset === 'PT USDe July')
98
- return yield getApyFromDfsApi('PT USDe July');
99
+ return yield getApyFromDfsApi('PT USDe July', network);
99
100
  if (asset === 'PT eUSDe Aug')
100
- return yield getApyFromDfsApi('PT eUSDe Aug');
101
+ return yield getApyFromDfsApi('PT eUSDe Aug', network);
101
102
  if (asset === 'PT sUSDe Sep')
102
- return yield getApyFromDfsApi('PT sUSDe Sep');
103
+ return yield getApyFromDfsApi('PT sUSDe Sep', network);
103
104
  if (asset === 'PT USDe Sep')
104
- return yield getApyFromDfsApi('PT USDe Sep');
105
+ return yield getApyFromDfsApi('PT USDe Sep', network);
105
106
  if (asset === 'tETH')
106
107
  return yield getApyFromDfsApi('tETH');
107
108
  if (asset === 'USDe')
108
109
  return yield getApyFromDfsApi('USDe');
109
110
  if (asset === 'PT sUSDe Nov')
110
- return yield getApyFromDfsApi('PT sUSDe Nov');
111
+ return yield getApyFromDfsApi('PT sUSDe Nov', network);
111
112
  if (asset === 'PT USDe Nov')
112
- return yield getApyFromDfsApi('PT USDe Nov');
113
+ return yield getApyFromDfsApi('PT USDe Nov', network);
113
114
  if (asset === 'PT USDe Jan')
114
- return yield getApyFromDfsApi('PT USDe Jan');
115
+ return yield getApyFromDfsApi('PT USDe Jan', network);
115
116
  if (asset === 'PT sUSDe Jan')
116
- return yield getApyFromDfsApi('PT sUSDe Jan');
117
+ return yield getApyFromDfsApi('PT sUSDe Jan', network);
117
118
  }
118
119
  catch (e) {
119
120
  console.error(`Failed to fetch APY for ${asset}`);
@@ -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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defisaver/positions-sdk",
3
- "version": "2.1.10",
3
+ "version": "2.1.12",
4
4
  "description": "",
5
5
  "main": "./cjs/index.js",
6
6
  "module": "./esm/index.js",
@@ -182,7 +182,7 @@ export async function _getAaveV3MarketData(provider: Client, network: NetworkNum
182
182
  const isStakingAsset = STAKING_ASSETS.includes(_market.symbol);
183
183
 
184
184
  if (isStakingAsset) {
185
- const yieldApy = await getStakingApy(_market.symbol);
185
+ const yieldApy = await getStakingApy(_market.symbol, network as NetworkNumber);
186
186
  _market.supplyIncentives.push({
187
187
  apy: yieldApy,
188
188
  token: _market.symbol,
@@ -8,7 +8,7 @@ import {
8
8
  SparkAssetsData, SparkHelperCommon, SparkMarketData, SparkUsedAssets,
9
9
  } from '../../types';
10
10
  import { calculateNetApy } from '../../staking';
11
- import { ethToWeth, wethToEth } from '../../services/utils';
11
+ import { ethToWeth, getNativeAssetFromWrapped, wethToEth } from '../../services/utils';
12
12
  import { SparkViewContractViem } from '../../contracts';
13
13
  import { EthAddress, EthereumProvider, NetworkNumber } from '../../types/common';
14
14
  import { borrowOperations } from '../../constants';
@@ -19,10 +19,10 @@ export const sparkIsInIsolationMode = ({ usedAssets, assetsData }: { usedAssets:
19
19
  export const sparkGetCollSuppliedAssets = ({ usedAssets }: { usedAssets: SparkUsedAssets }) => Object.values(usedAssets).filter(({ isSupplied, collateral }) => isSupplied && collateral);
20
20
 
21
21
  export const sparkGetSuppliableAssets = ({
22
- usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest
22
+ usedAssets, eModeCategory, assetsData, selectedMarket, network, ...rest
23
23
  }: SparkHelperCommon) => {
24
24
  const data = {
25
- usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest,
25
+ usedAssets, eModeCategory, assetsData, selectedMarket, network, ...rest,
26
26
  };
27
27
 
28
28
  const collAccountAssets = sparkGetCollSuppliedAssets(data);
@@ -37,41 +37,44 @@ export const sparkGetSuppliableAssets = ({
37
37
  };
38
38
 
39
39
  export const sparkGetSuppliableAsCollAssets = ({
40
- usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest
40
+ usedAssets, eModeCategory, assetsData, selectedMarket, network, ...rest
41
41
  }: SparkHelperCommon) => sparkGetSuppliableAssets({
42
- usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest,
42
+ usedAssets, eModeCategory, assetsData, selectedMarket, network, ...rest,
43
43
  }).filter(({ canBeCollateral }) => canBeCollateral);
44
44
 
45
45
  export const sparkGetEmodeMutableProps = ({
46
46
  eModeCategory,
47
+ eModeCategoriesData,
47
48
  assetsData,
48
49
  }: SparkHelperCommon, _asset: string) => {
49
- const asset = wethToEth(_asset);
50
+ const asset = getNativeAssetFromWrapped(_asset);
50
51
 
51
52
  const assetData = assetsData[asset];
53
+ const eModeCategoryData: { collateralAssets: string[], collateralFactor: string, liquidationRatio: string } = eModeCategoriesData?.[eModeCategory] || { collateralAssets: [], collateralFactor: '0', liquidationRatio: '0' };
54
+
52
55
  if (
53
56
  eModeCategory === 0
54
- || assetData.eModeCategory !== eModeCategory
55
- || new Dec(assetData?.eModeCategoryData?.collateralFactor || 0).eq(0)
57
+ || !eModeCategoryData.collateralAssets.includes(asset)
58
+ || new Dec(eModeCategoryData.collateralFactor || 0).eq(0)
56
59
  ) {
57
60
  const { liquidationRatio, collateralFactor } = assetData;
58
61
  return ({ liquidationRatio, collateralFactor });
59
62
  }
60
- const { liquidationRatio, collateralFactor } = assetData.eModeCategoryData;
63
+ const { liquidationRatio, collateralFactor } = eModeCategoryData;
61
64
  return ({ liquidationRatio, collateralFactor });
62
65
  };
63
66
 
64
67
  export const sparkGetAggregatedPositionData = ({
65
68
  usedAssets,
66
69
  eModeCategory,
67
- eModeCategories,
70
+ eModeCategoriesData,
68
71
  assetsData,
69
72
  selectedMarket,
70
73
  network,
71
74
  ...rest
72
75
  }: SparkHelperCommon): SparkAggregatedPositionData => {
73
76
  const data = {
74
- usedAssets, eModeCategory, eModeCategories, assetsData, selectedMarket, network, ...rest,
77
+ usedAssets, eModeCategory, eModeCategoriesData, assetsData, selectedMarket, network, ...rest,
75
78
  };
76
79
  const payload = {} as SparkAggregatedPositionData;
77
80
  payload.suppliedUsd = getAssetsTotal(usedAssets, ({ isSupplied }: { isSupplied: boolean }) => isSupplied, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
@@ -456,7 +456,7 @@ export async function getPortfolioData(provider: EthereumProvider, network: Netw
456
456
  })).flat(),
457
457
  ...sparkMarkets.map((market) => allAddresses.map(async (address) => {
458
458
  try {
459
- const accData = await _getSparkAccountData(client, network, address, { selectedMarket: market, assetsData: sparkMarketsData[market.value].assetsData });
459
+ const accData = await _getSparkAccountData(client, network, address, { selectedMarket: market, assetsData: sparkMarketsData[market.value].assetsData, eModeCategoriesData: sparkMarketsData[market.value].eModeCategoriesData });
460
460
  if (new Dec(accData.suppliedUsd).gt(0)) positions[address.toLowerCase() as EthAddress].spark[market.value] = { error: '', data: accData };
461
461
  } catch (error) {
462
462
  console.error(`Error fetching Spark account data for address ${address} on market ${market.value}:`, error);
@@ -24,6 +24,7 @@ import {
24
24
  SparkPositionData,
25
25
  SparkUsedAsset,
26
26
  SparkUsedAssets,
27
+ EModeCategoriesData,
27
28
  } from '../types';
28
29
  import { sparkGetAggregatedPositionData, sparkIsInIsolationMode } from '../helpers/sparkHelpers';
29
30
  import { aprToApy, calculateBorrowingAssetLimit } from '../moneymarket';
@@ -49,8 +50,6 @@ export const sparkEmodeCategoriesMapping = (extractedState: { assetsData: SparkA
49
50
  enteringTerms,
50
51
  canEnterCategory: !enteringTerms.includes(false),
51
52
  id: a.eModeCategory,
52
- data: a.eModeCategoryData,
53
- assets: a.eModeCategory === 0 ? [] : [...(categoriesMapping[a.eModeCategory]?.assets || []), a.symbol],
54
53
  enabledData: {
55
54
  ratio: afterEnteringCategory.ratio,
56
55
  liqRatio: afterEnteringCategory.liqRatio,
@@ -68,19 +67,19 @@ export const _getSparkMarketsData = async (provider: Client, network: NetworkNum
68
67
  const loanInfoContract = SparkViewContractViem(provider, network);
69
68
  const sparkIncentivesContract = SparkIncentiveDataProviderContractViem(provider, network);
70
69
 
71
- const [loanInfo, _rewardInfo] = await Promise.all([
70
+ // eslint-disable-next-line prefer-const
71
+ let [loanInfo, rewardInfo] = await Promise.all([
72
72
  loanInfoContract.read.getFullTokensInfo([marketAddress, selectedMarket.assets.map(a => getAssetInfo(ethToWeth(a)).address) as EthAddress[]]),
73
- network === NetworkNumber.Opt ? sparkIncentivesContract.read.getReservesIncentivesData([marketAddress]) : [],
73
+ sparkIncentivesContract.read.getReservesIncentivesData([marketAddress]),
74
74
  ]);
75
75
 
76
- let rewardInfo: any[] = [];
77
- if (network === NetworkNumber.Opt) {
78
- rewardInfo = rewardInfo.reduce((all, market) => {
79
- // eslint-disable-next-line no-param-reassign
80
- all[market.underlyingAsset] = market;
81
- return all;
82
- }, {});
83
- }
76
+ rewardInfo = rewardInfo.reduce((all: any, market: any) => {
77
+ // eslint-disable-next-line no-param-reassign
78
+ all[market.underlyingAsset] = market;
79
+ return all;
80
+ }, {});
81
+
82
+ const eModeCategoriesData: EModeCategoriesData = {};
84
83
 
85
84
  const assetsData: SparkAssetData[] = await Promise.all(loanInfo
86
85
  .map(async (market, i) => {
@@ -98,6 +97,17 @@ export const _getSparkMarketsData = async (provider: Client, network: NetworkNum
98
97
  if (new Dec(marketLiquidity).lt(0)) {
99
98
  marketLiquidity = '0';
100
99
  }
100
+
101
+ eModeCategoriesData[+market.emodeCategory.toString()] = {
102
+ id: +market.emodeCategory.toString(),
103
+ label: market.label,
104
+ liquidationBonus: new Dec(market.liquidationBonus).div(10000).toString(),
105
+ liquidationRatio: new Dec(market.liquidationThreshold).div(10000).toString(),
106
+ collateralFactor: new Dec(market.ltv).div(10000).toString(),
107
+ collateralAssets: eModeCategoriesData[+market.emodeCategory.toString()] ? [...eModeCategoriesData[+market.emodeCategory.toString()].collateralAssets, selectedMarket.assets[i]] : [selectedMarket.assets[i]],
108
+ borrowAssets: eModeCategoriesData[+market.emodeCategory.toString()] ? [...eModeCategoriesData[+market.emodeCategory.toString()].borrowAssets, selectedMarket.assets[i]] : [selectedMarket.assets[i]],
109
+ };
110
+
101
111
  return ({
102
112
  symbol: selectedMarket.assets[i],
103
113
  isIsolated: new Dec(market.debtCeilingForIsolationMode.toString()).gt(0),
@@ -132,13 +142,6 @@ export const _getSparkMarketsData = async (provider: Client, network: NetworkNum
132
142
  isolationModeBorrowingEnabled: market.isolationModeBorrowingEnabled,
133
143
  isFlashLoanEnabled: market.isFlashLoanEnabled,
134
144
  aTokenAddress: market.aTokenAddress,
135
- eModeCategoryData: {
136
- label: market.label,
137
- liquidationBonus: new Dec(market.liquidationBonus).div(10000).toString(),
138
- liquidationRatio: new Dec(market.liquidationThreshold).div(10000).toString(),
139
- collateralFactor: new Dec(market.ltv).div(10000).toString(),
140
- priceSource: market.priceSource,
141
- },
142
145
  supplyIncentives: [],
143
146
  borrowIncentives: [],
144
147
  });
@@ -173,7 +176,7 @@ export const _getSparkMarketsData = async (provider: Client, network: NetworkNum
173
176
  if (!rewardForMarket) return;
174
177
  (rewardForMarket.aIncentiveData.rewardsTokenInformation as any[]).forEach(supplyRewardData => {
175
178
  if (supplyRewardData) {
176
- if (supplyRewardData.emissionEndTimestamp * 1000 < Date.now()) return;
179
+ if (+(supplyRewardData.emissionEndTimestamp.toString()) * 1000 < Date.now()) return;
177
180
  const supplyEmissionPerSecond = supplyRewardData.emissionPerSecond;
178
181
  const supplyRewardPrice = new Dec(supplyRewardData.rewardPriceFeed).div(10 ** supplyRewardData.priceFeedDecimals)
179
182
  .toString();
@@ -194,7 +197,7 @@ export const _getSparkMarketsData = async (provider: Client, network: NetworkNum
194
197
  });
195
198
  (rewardForMarket.vIncentiveData.rewardsTokenInformation as any[]).forEach(borrowRewardData => {
196
199
  if (borrowRewardData) {
197
- if (borrowRewardData.emissionEndTimestamp * 1000 < Date.now()) return;
200
+ if (+(borrowRewardData.emissionEndTimestamp.toString()) * 1000 < Date.now()) return;
198
201
  const supplyEmissionPerSecond = borrowRewardData.emissionPerSecond;
199
202
  const supplyRewardPrice = new Dec(borrowRewardData.rewardPriceFeed).div(10 ** borrowRewardData.priceFeedDecimals)
200
203
  .toString();
@@ -215,7 +218,7 @@ export const _getSparkMarketsData = async (provider: Client, network: NetworkNum
215
218
  /* eslint-enable no-param-reassign */
216
219
  }));
217
220
 
218
- const payload: SparkAssetsData = {};
221
+ const filteredAssetsData: SparkAssetsData = {};
219
222
  // Sort by market size
220
223
  assetsData
221
224
  .sort((a, b) => {
@@ -225,10 +228,13 @@ export const _getSparkMarketsData = async (provider: Client, network: NetworkNum
225
228
  return new Dec(bMarket).minus(aMarket).toNumber();
226
229
  })
227
230
  .forEach((assetData: SparkAssetData, i) => {
228
- payload[assetData.symbol] = { ...assetData, sortIndex: i };
231
+ filteredAssetsData[assetData.symbol] = { ...assetData, sortIndex: i };
229
232
  });
230
233
 
231
- return { assetsData: payload };
234
+ eModeCategoriesData[0].collateralAssets = Object.values(filteredAssetsData).map(a => a.symbol);
235
+ eModeCategoriesData[0].borrowAssets = Object.values(filteredAssetsData).map(a => a.symbol);
236
+
237
+ return { assetsData: filteredAssetsData, eModeCategoriesData };
232
238
  };
233
239
 
234
240
  export const getSparkMarketsData = async (
@@ -317,7 +323,12 @@ export const getSparkAccountBalances = async (
317
323
  address: EthAddress,
318
324
  ): Promise<PositionBalances> => _getSparkAccountBalances(getViemProvider(provider, network, { batch: { multicall: true } }), network, block, addressMapping, address);
319
325
 
320
- export const _getSparkAccountData = async (provider: Client, network: NetworkNumber, address: EthAddress, extractedState: { selectedMarket: SparkMarketData, assetsData: SparkAssetsData }) => {
326
+ export const _getSparkAccountData = async (
327
+ provider: Client,
328
+ network: NetworkNumber,
329
+ address: EthAddress,
330
+ extractedState: { selectedMarket: SparkMarketData, assetsData: SparkAssetsData, eModeCategoriesData: EModeCategoriesData },
331
+ ) => {
321
332
  const {
322
333
  selectedMarket: market, assetsData,
323
334
  } = extractedState;
@@ -435,11 +446,11 @@ export const getSparkAccountData = async (
435
446
  provider: EthereumProvider,
436
447
  network: NetworkNumber,
437
448
  address: EthAddress,
438
- extractedState: { selectedMarket: SparkMarketData, assetsData: SparkAssetsData },
449
+ extractedState: { selectedMarket: SparkMarketData, assetsData: SparkAssetsData, eModeCategoriesData: EModeCategoriesData },
439
450
  ) => _getSparkAccountData(getViemProvider(provider, network), network, address, extractedState);
440
451
 
441
452
  export const getSparkFullPositionData = async (provider: EthereumProvider, network: NetworkNumber, address: EthAddress, market: SparkMarketData): Promise<SparkPositionData> => {
442
453
  const marketData = await getSparkMarketsData(provider, network, market);
443
- const positionData = await getSparkAccountData(provider, network, address, { assetsData: marketData.assetsData, selectedMarket: market });
454
+ const positionData = await getSparkAccountData(provider, network, address, { assetsData: marketData.assetsData, selectedMarket: market, eModeCategoriesData: marketData.eModeCategoriesData });
444
455
  return positionData;
445
456
  };
@@ -1,6 +1,10 @@
1
1
  import Dec from 'decimal.js';
2
2
  import memoize from 'memoizee';
3
- import { IncentiveEligibilityId, MMAssetsData, MMUsedAssets } from '../types/common';
3
+ import {
4
+ MMAssetsData,
5
+ MMUsedAssets,
6
+ NetworkNumber,
7
+ } from '../types/common';
4
8
  import { BLOCKS_IN_A_YEAR } from '../constants';
5
9
  import { DEFAULT_TIMEOUT } from '../services/utils';
6
10
  import { EligibilityMapping } from './eligibility';
@@ -43,9 +47,9 @@ const getSuperOETHApy = async () => {
43
47
  }
44
48
  };
45
49
 
46
- const getApyFromDfsApi = async (asset: string) => {
50
+ const getApyFromDfsApi = async (asset: string, network: number = NetworkNumber.Eth) => {
47
51
  try {
48
- const res = await fetch(`https://fe.defisaver.com/api/staking/apy?asset=${asset}`,
52
+ const res = await fetch(`https://fe.defisaver.com/api/staking/apy?asset=${asset}&network=${network}`,
49
53
  { signal: AbortSignal.timeout(DEFAULT_TIMEOUT) });
50
54
  if (!res.ok) throw new Error(`Failed to fetch APY for ${asset}`);
51
55
  const data = await res.json();
@@ -58,7 +62,7 @@ const getApyFromDfsApi = async (asset: string) => {
58
62
 
59
63
  export const STAKING_ASSETS = ['cbETH', 'wstETH', 'cbETH', 'rETH', 'sDAI', 'weETH', 'sUSDe', 'osETH', 'ezETH', 'ETHx', 'rsETH', 'pufETH', 'wrsETH', 'wsuperOETHb', 'sUSDS', 'tETH', 'PT sUSDe Sep', 'PT USDe Sep', 'PT sUSDe Nov', 'PT USDe Nov', 'PT USDe Jan', 'PT sUSDe Jan', 'wrsETH', 'wstETH'];
60
64
 
61
- export const getStakingApy = memoize(async (asset: string) => {
65
+ export const getStakingApy = memoize(async (asset: string, network: number = NetworkNumber.Eth) => {
62
66
  try {
63
67
  if (asset === 'stETH' || asset === 'wstETH') return await getApyFromDfsApi('wstETH');
64
68
  if (asset === 'cbETH') return await getApyFromDfsApi('cbETH');
@@ -73,18 +77,18 @@ export const getStakingApy = memoize(async (asset: string) => {
73
77
  if (asset === 'pufETH') return await getApyFromDfsApi('pufETH');
74
78
  if (asset === 'wsuperOETHb') return await getSuperOETHApy();
75
79
  if (asset === 'sUSDS') return await getSsrApy();
76
- if (asset === 'PT eUSDe May') return await getApyFromDfsApi('PT eUSDe May');
77
- if (asset === 'PT sUSDe July') return await getApyFromDfsApi('PT sUSDe July');
78
- if (asset === 'PT USDe July') return await getApyFromDfsApi('PT USDe July');
79
- if (asset === 'PT eUSDe Aug') return await getApyFromDfsApi('PT eUSDe Aug');
80
- if (asset === 'PT sUSDe Sep') return await getApyFromDfsApi('PT sUSDe Sep');
81
- if (asset === 'PT USDe Sep') return await getApyFromDfsApi('PT USDe Sep');
80
+ if (asset === 'PT eUSDe May') return await getApyFromDfsApi('PT eUSDe May', network);
81
+ if (asset === 'PT sUSDe July') return await getApyFromDfsApi('PT sUSDe July', network);
82
+ if (asset === 'PT USDe July') return await getApyFromDfsApi('PT USDe July', network);
83
+ if (asset === 'PT eUSDe Aug') return await getApyFromDfsApi('PT eUSDe Aug', network);
84
+ if (asset === 'PT sUSDe Sep') return await getApyFromDfsApi('PT sUSDe Sep', network);
85
+ if (asset === 'PT USDe Sep') return await getApyFromDfsApi('PT USDe Sep', network);
82
86
  if (asset === 'tETH') return await getApyFromDfsApi('tETH');
83
87
  if (asset === 'USDe') return await getApyFromDfsApi('USDe');
84
- if (asset === 'PT sUSDe Nov') return await getApyFromDfsApi('PT sUSDe Nov');
85
- if (asset === 'PT USDe Nov') return await getApyFromDfsApi('PT USDe Nov');
86
- if (asset === 'PT USDe Jan') return await getApyFromDfsApi('PT USDe Jan');
87
- if (asset === 'PT sUSDe Jan') return await getApyFromDfsApi('PT sUSDe Jan');
88
+ if (asset === 'PT sUSDe Nov') return await getApyFromDfsApi('PT sUSDe Nov', network);
89
+ if (asset === 'PT USDe Nov') return await getApyFromDfsApi('PT USDe Nov', network);
90
+ if (asset === 'PT USDe Jan') return await getApyFromDfsApi('PT USDe Jan', network);
91
+ if (asset === 'PT sUSDe Jan') return await getApyFromDfsApi('PT sUSDe Jan', network);
88
92
  } catch (e) {
89
93
  console.error(`Failed to fetch APY for ${asset}`);
90
94
  }
@@ -1,3 +1,4 @@
1
+ import { EModeCategoriesData } from './aave';
1
2
  import {
2
3
  EthAddress,
3
4
  IncentiveData,
@@ -20,8 +21,6 @@ export interface SparkEModeCategoryDataMapping {
20
21
  enteringTerms: boolean[],
21
22
  canEnterCategory: boolean,
22
23
  id: number,
23
- data: SparkEModeCategoryData,
24
- assets: string[],
25
24
  enabledData: {
26
25
  ratio: string,
27
26
  liqRatio: string,
@@ -55,7 +54,6 @@ export interface SparkAssetData extends MMAssetData {
55
54
  usageAsCollateralEnabled: boolean,
56
55
  isIsolated: boolean,
57
56
  eModeCategory: number,
58
- eModeCategoryData: SparkEModeCategoryData,
59
57
  liquidationRatio: string,
60
58
  }
61
59
 
@@ -63,7 +61,7 @@ export interface SparkAssetsData {
63
61
  [token: string]: SparkAssetData,
64
62
  }
65
63
 
66
- export type SparkMarketsData = { assetsData: SparkAssetsData };
64
+ export type SparkMarketsData = { assetsData: SparkAssetsData, eModeCategoriesData: EModeCategoriesData };
67
65
 
68
66
  export interface SparkUsedAsset extends MMUsedAsset {
69
67
  stableBorrowRate: string,
@@ -84,7 +82,7 @@ export interface SparkUsedAssets {
84
82
  export interface SparkHelperCommon {
85
83
  usedAssets: SparkUsedAssets,
86
84
  eModeCategory: number,
87
- eModeCategories?: object,
85
+ eModeCategoriesData?: EModeCategoriesData,
88
86
  assetsData: SparkAssetsData,
89
87
  selectedMarket?: SparkMarketData,
90
88
  network?: NetworkNumber,