@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.
- package/cjs/aaveV3/index.js +1 -1
- package/cjs/helpers/sparkHelpers/index.d.ts +4 -4
- package/cjs/helpers/sparkHelpers/index.js +12 -12
- package/cjs/portfolio/index.js +1 -1
- package/cjs/spark/index.d.ts +3 -1
- package/cjs/spark/index.js +26 -26
- package/cjs/staking/staking.d.ts +1 -1
- package/cjs/staking/staking.js +14 -13
- package/cjs/types/spark.d.ts +3 -4
- package/esm/aaveV3/index.js +1 -1
- package/esm/helpers/sparkHelpers/index.d.ts +4 -4
- package/esm/helpers/sparkHelpers/index.js +13 -13
- package/esm/portfolio/index.js +1 -1
- package/esm/spark/index.d.ts +3 -1
- package/esm/spark/index.js +27 -27
- package/esm/staking/staking.d.ts +1 -1
- package/esm/staking/staking.js +14 -13
- package/esm/types/spark.d.ts +3 -4
- package/package.json +1 -1
- package/src/aaveV3/index.ts +1 -1
- package/src/helpers/sparkHelpers/index.ts +14 -11
- package/src/portfolio/index.ts +1 -1
- package/src/spark/index.ts +38 -27
- package/src/staking/staking.ts +18 -14
- package/src/types/spark.ts +3 -5
package/cjs/aaveV3/index.js
CHANGED
|
@@ -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,
|
|
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,
|
|
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,
|
|
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,
|
|
42
|
-
const data = Object.assign({ usedAssets, eModeCategory,
|
|
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,
|
|
54
|
-
return (0, exports.sparkGetSuppliableAssets)(Object.assign({ usedAssets, eModeCategory,
|
|
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
|
-
|
|
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
|
-
||
|
|
63
|
-
|| new decimal_js_1.default(
|
|
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 } =
|
|
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,
|
|
73
|
-
const data = Object.assign({ usedAssets, eModeCategory,
|
|
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);
|
package/cjs/portfolio/index.js
CHANGED
|
@@ -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
|
}
|
package/cjs/spark/index.d.ts
CHANGED
|
@@ -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>;
|
package/cjs/spark/index.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
59
|
+
sparkIncentivesContract.read.getReservesIncentivesData([marketAddress]),
|
|
62
60
|
]);
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
|
|
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
|
-
|
|
206
|
+
filteredAssetsData[assetData.symbol] = Object.assign(Object.assign({}, assetData), { sortIndex: i });
|
|
209
207
|
});
|
|
210
|
-
|
|
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;
|
package/cjs/staking/staking.d.ts
CHANGED
|
@@ -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;
|
package/cjs/staking/staking.js
CHANGED
|
@@ -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 = (
|
|
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(`
|
|
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)((
|
|
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}`);
|
package/cjs/types/spark.d.ts
CHANGED
|
@@ -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
|
-
|
|
73
|
+
eModeCategoriesData?: EModeCategoriesData;
|
|
75
74
|
assetsData: SparkAssetsData;
|
|
76
75
|
selectedMarket?: SparkMarketData;
|
|
77
76
|
network?: NetworkNumber;
|
package/esm/aaveV3/index.js
CHANGED
|
@@ -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,
|
|
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,
|
|
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,
|
|
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,
|
|
34
|
-
const data = Object.assign({ usedAssets, eModeCategory,
|
|
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,
|
|
45
|
-
return sparkGetSuppliableAssets(Object.assign({ usedAssets, eModeCategory,
|
|
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
|
-
|
|
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
|
-
||
|
|
53
|
-
|| new Dec(
|
|
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 } =
|
|
57
|
+
const { liquidationRatio, collateralFactor } = eModeCategoryData;
|
|
58
58
|
return ({ liquidationRatio, collateralFactor });
|
|
59
59
|
};
|
|
60
60
|
export const sparkGetAggregatedPositionData = (_a) => {
|
|
61
|
-
var { usedAssets, eModeCategory,
|
|
62
|
-
const data = Object.assign({ usedAssets, eModeCategory,
|
|
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);
|
package/esm/portfolio/index.js
CHANGED
|
@@ -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
|
}
|
package/esm/spark/index.d.ts
CHANGED
|
@@ -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>;
|
package/esm/spark/index.js
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
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
|
-
|
|
52
|
+
sparkIncentivesContract.read.getReservesIncentivesData([marketAddress]),
|
|
55
53
|
]);
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
|
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
|
-
|
|
199
|
+
filteredAssetsData[assetData.symbol] = Object.assign(Object.assign({}, assetData), { sortIndex: i });
|
|
202
200
|
});
|
|
203
|
-
|
|
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
|
});
|
package/esm/staking/staking.d.ts
CHANGED
|
@@ -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;
|
package/esm/staking/staking.js
CHANGED
|
@@ -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 = (
|
|
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(`
|
|
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((
|
|
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}`);
|
package/esm/types/spark.d.ts
CHANGED
|
@@ -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
|
-
|
|
73
|
+
eModeCategoriesData?: EModeCategoriesData;
|
|
75
74
|
assetsData: SparkAssetsData;
|
|
76
75
|
selectedMarket?: SparkMarketData;
|
|
77
76
|
network?: NetworkNumber;
|
package/package.json
CHANGED
package/src/aaveV3/index.ts
CHANGED
|
@@ -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,
|
|
22
|
+
usedAssets, eModeCategory, assetsData, selectedMarket, network, ...rest
|
|
23
23
|
}: SparkHelperCommon) => {
|
|
24
24
|
const data = {
|
|
25
|
-
usedAssets, eModeCategory,
|
|
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,
|
|
40
|
+
usedAssets, eModeCategory, assetsData, selectedMarket, network, ...rest
|
|
41
41
|
}: SparkHelperCommon) => sparkGetSuppliableAssets({
|
|
42
|
-
usedAssets, eModeCategory,
|
|
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 =
|
|
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
|
-
|
|
55
|
-
|
|
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 } =
|
|
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
|
-
|
|
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,
|
|
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);
|
package/src/portfolio/index.ts
CHANGED
|
@@ -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);
|
package/src/spark/index.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
73
|
+
sparkIncentivesContract.read.getReservesIncentivesData([marketAddress]),
|
|
74
74
|
]);
|
|
75
75
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
|
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
|
-
|
|
231
|
+
filteredAssetsData[assetData.symbol] = { ...assetData, sortIndex: i };
|
|
229
232
|
});
|
|
230
233
|
|
|
231
|
-
|
|
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 (
|
|
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
|
};
|
package/src/staking/staking.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import Dec from 'decimal.js';
|
|
2
2
|
import memoize from 'memoizee';
|
|
3
|
-
import {
|
|
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
|
}
|
package/src/types/spark.ts
CHANGED
|
@@ -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
|
-
|
|
85
|
+
eModeCategoriesData?: EModeCategoriesData,
|
|
88
86
|
assetsData: SparkAssetsData,
|
|
89
87
|
selectedMarket?: SparkMarketData,
|
|
90
88
|
network?: NetworkNumber,
|