@defisaver/positions-sdk 2.1.127-midnight-8-dev → 2.1.127-midnight-9-dev
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/aaveV4/index.js +26 -10
- package/cjs/aaveV4/merkl.d.ts +2 -1
- package/cjs/aaveV4/merkl.js +42 -35
- package/cjs/config/contracts.d.ts +0 -938
- package/cjs/config/contracts.js +2 -8
- package/cjs/contracts.d.ts +0 -23433
- package/cjs/contracts.js +2 -3
- package/cjs/helpers/aaveV4Helpers/index.d.ts +7 -1
- package/cjs/helpers/aaveV4Helpers/index.js +22 -10
- package/cjs/helpers/index.d.ts +0 -1
- package/cjs/helpers/index.js +1 -2
- package/cjs/index.d.ts +1 -2
- package/cjs/index.js +1 -3
- package/cjs/markets/index.d.ts +0 -1
- package/cjs/markets/index.js +1 -3
- package/cjs/markets/morphoBlue/index.d.ts +6 -0
- package/cjs/markets/morphoBlue/index.js +53 -2
- package/cjs/portfolio/discovery.d.ts +1 -1
- package/cjs/portfolio/discovery.js +1 -1
- package/cjs/portfolio/index.js +0 -32
- package/cjs/services/utils.d.ts +1 -0
- package/cjs/services/utils.js +3 -1
- package/cjs/staking/staking.js +1 -2
- package/cjs/types/aaveV4.d.ts +5 -0
- package/cjs/types/common.d.ts +4 -0
- package/cjs/types/common.js +6 -1
- package/cjs/types/index.d.ts +0 -1
- package/cjs/types/index.js +0 -1
- package/cjs/types/merkl.d.ts +3 -4
- package/cjs/types/morphoBlue.d.ts +3 -0
- package/cjs/types/morphoBlue.js +3 -0
- package/cjs/types/portfolio.d.ts +0 -4
- package/esm/aaveV4/index.js +27 -11
- package/esm/aaveV4/merkl.d.ts +2 -1
- package/esm/aaveV4/merkl.js +41 -35
- package/esm/config/contracts.d.ts +0 -938
- package/esm/config/contracts.js +0 -6
- package/esm/contracts.d.ts +0 -23433
- package/esm/contracts.js +0 -1
- package/esm/helpers/aaveV4Helpers/index.d.ts +7 -1
- package/esm/helpers/aaveV4Helpers/index.js +21 -10
- package/esm/helpers/index.d.ts +0 -1
- package/esm/helpers/index.js +0 -1
- package/esm/index.d.ts +1 -2
- package/esm/index.js +1 -2
- package/esm/markets/index.d.ts +0 -1
- package/esm/markets/index.js +0 -1
- package/esm/markets/morphoBlue/index.d.ts +6 -0
- package/esm/markets/morphoBlue/index.js +48 -0
- package/esm/portfolio/discovery.d.ts +1 -1
- package/esm/portfolio/discovery.js +1 -1
- package/esm/portfolio/index.js +1 -33
- package/esm/services/utils.d.ts +1 -0
- package/esm/services/utils.js +1 -0
- package/esm/staking/staking.js +1 -2
- package/esm/types/aaveV4.d.ts +5 -0
- package/esm/types/common.d.ts +4 -0
- package/esm/types/common.js +5 -0
- package/esm/types/index.d.ts +0 -1
- package/esm/types/index.js +0 -1
- package/esm/types/merkl.d.ts +3 -4
- package/esm/types/morphoBlue.d.ts +3 -0
- package/esm/types/morphoBlue.js +3 -0
- package/esm/types/portfolio.d.ts +0 -4
- package/package.json +1 -1
- package/src/aaveV4/index.ts +29 -11
- package/src/aaveV4/merkl.ts +41 -32
- package/src/config/contracts.ts +0 -6
- package/src/contracts.ts +0 -1
- package/src/helpers/aaveV4Helpers/index.ts +22 -9
- package/src/helpers/index.ts +0 -1
- package/src/index.ts +0 -2
- package/src/markets/index.ts +0 -1
- package/src/markets/morphoBlue/index.ts +49 -1
- package/src/portfolio/discovery.ts +1 -1
- package/src/portfolio/index.ts +0 -33
- package/src/services/utils.ts +2 -0
- package/src/staking/staking.ts +1 -2
- package/src/types/aaveV4.ts +5 -0
- package/src/types/common.ts +5 -0
- package/src/types/index.ts +0 -1
- package/src/types/merkl.ts +3 -3
- package/src/types/morphoBlue.ts +3 -0
- package/src/types/portfolio.ts +0 -4
- package/cjs/eulerV2/index.d.ts +0 -47
- package/cjs/eulerV2/index.js +0 -225
- package/cjs/helpers/eulerHelpers/index.d.ts +0 -22
- package/cjs/helpers/eulerHelpers/index.js +0 -231
- package/cjs/markets/euler/index.d.ts +0 -8
- package/cjs/markets/euler/index.js +0 -30
- package/cjs/types/euler.d.ts +0 -153
- package/cjs/types/euler.js +0 -14
- package/esm/eulerV2/index.d.ts +0 -47
- package/esm/eulerV2/index.js +0 -215
- package/esm/helpers/eulerHelpers/index.d.ts +0 -22
- package/esm/helpers/eulerHelpers/index.js +0 -218
- package/esm/markets/euler/index.d.ts +0 -8
- package/esm/markets/euler/index.js +0 -24
- package/esm/types/euler.d.ts +0 -153
- package/esm/types/euler.js +0 -11
- package/src/eulerV2/index.ts +0 -331
- package/src/helpers/eulerHelpers/index.ts +0 -232
- package/src/markets/euler/index.ts +0 -27
- package/src/types/euler.ts +0 -178
package/src/aaveV4/merkl.ts
CHANGED
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
AaveV4ReserveAssetData,
|
|
6
6
|
IncentiveData,
|
|
7
7
|
IncentiveKind,
|
|
8
|
+
IncentiveSide,
|
|
8
9
|
MerklOpportunity,
|
|
9
10
|
OpportunityAction,
|
|
10
11
|
OpportunityStatus,
|
|
@@ -13,12 +14,15 @@ import {
|
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
16
|
* Merkl tags Aave V4 reward campaigns by scope via the `type` field:
|
|
16
|
-
* - AAVE_V4_HUB_SUPPLY / AAVE_V4_HUB_BORROW → reward tied to a hub (matched per underlying
|
|
17
|
+
* - AAVE_V4_HUB_SUPPLY / AAVE_V4_HUB_BORROW → reward tied to a hub (matched per hub contract + underlying)
|
|
17
18
|
* - AAVE_V4_SPOKE_SUPPLY / AAVE_V4_SPOKE_BORROW → reward tied to a spoke (matched per spoke contract + underlying)
|
|
18
|
-
*
|
|
19
|
+
* Campaigns identify the underlying via `tokens[0]` and the scoping contract (the hub or spoke) via
|
|
20
|
+
* `explorerAddress`. The same underlying exists on several hubs (e.g. USDC on Prime and Paxos), so a
|
|
21
|
+
* hub campaign matched by underlying alone would leak onto every hub's reserves — a campaign whose
|
|
22
|
+
* `explorerAddress` isn't a contract any fetched reserve points to simply never matches.
|
|
19
23
|
*/
|
|
20
24
|
|
|
21
|
-
const
|
|
25
|
+
const scopeKey = (scopeAddress: string, underlying: string) => `${scopeAddress.toLowerCase()}_${underlying.toLowerCase()}`;
|
|
22
26
|
|
|
23
27
|
const buildIncentive = (opportunity: MerklOpportunity): IncentiveData => {
|
|
24
28
|
const rewardToken = opportunity.rewardsRecord?.breakdowns?.[0]?.token;
|
|
@@ -31,42 +35,47 @@ const buildIncentive = (opportunity: MerklOpportunity): IncentiveData => {
|
|
|
31
35
|
};
|
|
32
36
|
};
|
|
33
37
|
|
|
34
|
-
export const
|
|
38
|
+
export const buildAaveV4MerklRewardMap = (opportunities: MerklOpportunity[], chainId: NetworkNumber): AaveV4MerklRewardMap => {
|
|
35
39
|
const result: AaveV4MerklRewardMap = { hub: {}, spoke: {} };
|
|
40
|
+
|
|
41
|
+
opportunities
|
|
42
|
+
.filter((o) => o.chainId === chainId)
|
|
43
|
+
.filter((o) => o.status === OpportunityStatus.LIVE)
|
|
44
|
+
.filter((o) => typeof o.type === 'string' && o.type.startsWith('AAVE_V4_'))
|
|
45
|
+
.forEach((o) => {
|
|
46
|
+
const underlying = o.tokens?.[0]?.address?.toLowerCase();
|
|
47
|
+
if (!underlying) return;
|
|
48
|
+
|
|
49
|
+
const scopeAddress = o.explorerAddress?.toLowerCase();
|
|
50
|
+
if (!scopeAddress) return;
|
|
51
|
+
|
|
52
|
+
const side = o.action === OpportunityAction.BORROW ? IncentiveSide.Borrow : IncentiveSide.Supply;
|
|
53
|
+
const incentive = buildIncentive(o);
|
|
54
|
+
const key = scopeKey(scopeAddress, underlying);
|
|
55
|
+
|
|
56
|
+
if (o.type.includes('HUB')) {
|
|
57
|
+
if (!result.hub[key]) result.hub[key] = {};
|
|
58
|
+
result.hub[key][side] = incentive;
|
|
59
|
+
} else if (o.type.includes('SPOKE')) {
|
|
60
|
+
if (!result.spoke[key]) result.spoke[key] = {};
|
|
61
|
+
result.spoke[key][side] = incentive;
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
return result;
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
export const getAaveV4MerkleCampaigns = async (chainId: NetworkNumber): Promise<AaveV4MerklRewardMap> => {
|
|
36
69
|
try {
|
|
37
70
|
const res = await fetch('https://fe.defisaver.com/api/merkl/opportunities?mainProtocolId=aave&type=AAVE_V4_HUB_SUPPLY,AAVE_V4_HUB_BORROW,AAVE_V4_SPOKE_SUPPLY,AAVE_V4_SPOKE_BORROW', {
|
|
38
71
|
signal: AbortSignal.timeout(LONGER_TIMEOUT),
|
|
39
72
|
});
|
|
40
73
|
if (!res.ok) throw new Error('Failed to fetch Aave V4 Merkle campaigns');
|
|
41
74
|
const opportunities = await res.json() as MerklOpportunity[];
|
|
42
|
-
|
|
43
|
-
opportunities
|
|
44
|
-
.filter((o) => o.chainId === chainId)
|
|
45
|
-
.filter((o) => o.status === OpportunityStatus.LIVE)
|
|
46
|
-
.filter((o) => typeof o.type === 'string' && o.type.startsWith('AAVE_V4_'))
|
|
47
|
-
.forEach((o) => {
|
|
48
|
-
const underlying = o.tokens?.[0]?.address?.toLowerCase();
|
|
49
|
-
if (!underlying) return;
|
|
50
|
-
|
|
51
|
-
const side: 'supply' | 'borrow' = o.action === OpportunityAction.BORROW ? 'borrow' : 'supply';
|
|
52
|
-
const incentive = buildIncentive(o);
|
|
53
|
-
|
|
54
|
-
if (o.type.includes('HUB')) {
|
|
55
|
-
if (!result.hub[underlying]) result.hub[underlying] = {};
|
|
56
|
-
result.hub[underlying][side] = incentive;
|
|
57
|
-
} else if (o.type.includes('SPOKE')) {
|
|
58
|
-
const spokeAddress = o.explorerAddress?.toLowerCase();
|
|
59
|
-
if (!spokeAddress) return;
|
|
60
|
-
const key = spokeKey(spokeAddress, underlying);
|
|
61
|
-
if (!result.spoke[key]) result.spoke[key] = {};
|
|
62
|
-
result.spoke[key][side] = incentive;
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
return result;
|
|
75
|
+
return buildAaveV4MerklRewardMap(opportunities, chainId);
|
|
67
76
|
} catch (e) {
|
|
68
77
|
console.error('Failed to fetch Aave V4 Merkle campaigns', e);
|
|
69
|
-
return
|
|
78
|
+
return { hub: {}, spoke: {} };
|
|
70
79
|
}
|
|
71
80
|
};
|
|
72
81
|
|
|
@@ -79,8 +88,8 @@ export const attachAaveV4MerklIncentives = (asset: AaveV4ReserveAssetData, spoke
|
|
|
79
88
|
const baseSupply = asset.supplyIncentives || [];
|
|
80
89
|
const baseBorrow = asset.borrowIncentives || [];
|
|
81
90
|
|
|
82
|
-
const spokeScoped = (spokeAddress && underlying) ? campaigns.spoke[
|
|
83
|
-
const hubScoped = underlying ? campaigns.hub[underlying] : undefined;
|
|
91
|
+
const spokeScoped = (spokeAddress && underlying) ? campaigns.spoke[scopeKey(spokeAddress, underlying)] : undefined;
|
|
92
|
+
const hubScoped = (asset.hub && underlying) ? campaigns.hub[scopeKey(asset.hub, underlying)] : undefined;
|
|
84
93
|
|
|
85
94
|
return {
|
|
86
95
|
...asset,
|
package/src/config/contracts.ts
CHANGED
|
@@ -1178,12 +1178,6 @@ export const LiquityV2TroveNFT = {
|
|
|
1178
1178
|
"abi": [{"inputs":[{"internalType":"contract IAddressesRegistry","name":"_addressesRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_troveId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataNFT","outputs":[{"internalType":"contract IMetadataNFT","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_troveId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"troveManager","outputs":[{"internalType":"contract ITroveManager","name":"","type":"address"}],"stateMutability":"view","type":"function"}],
|
|
1179
1179
|
"networks": {}
|
|
1180
1180
|
} as const;
|
|
1181
|
-
export const EulerV2View = {
|
|
1182
|
-
"abi": [{"inputs":[],"name":"USD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feedRegistry","outputs":[{"internalType":"contract IFeedRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_page","type":"uint256"},{"internalType":"uint256","name":"_perPage","type":"uint256"}],"name":"fetchUsedAccounts","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address[]","name":"accounts","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"}],"name":"getAaveTokenPriceInETH","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"}],"name":"getAaveTokenPriceInUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"}],"name":"getAaveV3TokenPriceInETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"}],"name":"getAaveV3TokenPriceInUSD","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_inputTokenAddr","type":"address"}],"name":"getAddrForChainlinkOracle","outputs":[{"internalType":"address","name":"tokenAddrForChainlinkUsage","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"bool","name":"isBorrowOperation","type":"bool"},{"internalType":"uint256","name":"liquidityAdded","type":"uint256"},{"internalType":"uint256","name":"liquidityRemoved","type":"uint256"}],"internalType":"struct EulerV2View.LiquidityChangeParams[]","name":"params","type":"tuple[]"}],"name":"getApyAfterValuesEstimation","outputs":[{"internalType":"uint256[]","name":"estimatedBorrowRates","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_inputTokenAddr","type":"address"}],"name":"getChainlinkPriceInETH","outputs":[{"internalType":"int256","name":"chainlinkPriceInETH","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_inputTokenAddr","type":"address"},{"internalType":"bool","name":"_useFallback","type":"bool"}],"name":"getChainlinkPriceInUSD","outputs":[{"internalType":"int256","name":"chainlinkPriceInUSD","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_inputTokenAddr","type":"address"}],"name":"getPriceInETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_inputTokenAddr","type":"address"}],"name":"getPriceInUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_inputTokenAddr","type":"address"},{"internalType":"uint80","name":"_roundId","type":"uint80"},{"internalType":"contract IAggregatorV3","name":"aggregator","type":"address"}],"name":"getRoundInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"updateTimestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_inputTokenAddr","type":"address"},{"internalType":"uint80","name":"_roundId","type":"uint80"}],"name":"getRoundInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"updateTimestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"}],"name":"getSparkTokenPriceInETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"}],"name":"getSparkTokenPriceInUSD","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserData","outputs":[{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"bool","name":"inLockDownMode","type":"bool"},{"internalType":"bool","name":"inPermitDisabledMode","type":"bool"},{"internalType":"address","name":"borrowVault","type":"address"},{"internalType":"uint256","name":"borrowAmountInUnit","type":"uint256"},{"internalType":"uint256","name":"borrowAmountInAsset","type":"uint256"},{"components":[{"internalType":"address","name":"collateralVault","type":"address"},{"internalType":"bool","name":"usedInBorrow","type":"bool"},{"internalType":"uint256","name":"collateralAmountInUnit","type":"uint256"},{"internalType":"uint256","name":"collateralAmountInAsset","type":"uint256"},{"internalType":"uint256","name":"collateralAmountInUSD","type":"uint256"}],"internalType":"struct EulerV2View.UserCollateralInfo[]","name":"collaterals","type":"tuple[]"}],"internalType":"struct EulerV2View.UserData","name":"data","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"getUsersData","outputs":[{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"bool","name":"inLockDownMode","type":"bool"},{"internalType":"bool","name":"inPermitDisabledMode","type":"bool"},{"internalType":"address","name":"borrowVault","type":"address"},{"internalType":"uint256","name":"borrowAmountInUnit","type":"uint256"},{"internalType":"uint256","name":"borrowAmountInAsset","type":"uint256"},{"components":[{"internalType":"address","name":"collateralVault","type":"address"},{"internalType":"bool","name":"usedInBorrow","type":"bool"},{"internalType":"uint256","name":"collateralAmountInUnit","type":"uint256"},{"internalType":"uint256","name":"collateralAmountInAsset","type":"uint256"},{"internalType":"uint256","name":"collateralAmountInUSD","type":"uint256"}],"internalType":"struct EulerV2View.UserCollateralInfo[]","name":"collaterals","type":"tuple[]"}],"internalType":"struct EulerV2View.UserData[]","name":"data","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"getVaultCollaterals","outputs":[{"components":[{"internalType":"address","name":"vaultAddr","type":"address"},{"internalType":"address","name":"assetAddr","type":"address"},{"internalType":"string","name":"vaultSymbol","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"governorAdmin","type":"address"},{"internalType":"bool","name":"isEscrowed","type":"bool"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"uint256","name":"sharePriceInUnit","type":"uint256"},{"internalType":"uint256","name":"assetPriceInUnit","type":"uint256"},{"internalType":"uint256","name":"cash","type":"uint256"},{"internalType":"uint256","name":"totalBorrows","type":"uint256"},{"internalType":"uint256","name":"supplyCap","type":"uint256"},{"internalType":"uint16","name":"borrowLTV","type":"uint16"},{"internalType":"uint16","name":"liquidationLTV","type":"uint16"},{"internalType":"uint16","name":"initialLiquidationLTV","type":"uint16"},{"internalType":"uint48","name":"targetTimestamp","type":"uint48"},{"internalType":"uint32","name":"rampDuration","type":"uint32"},{"internalType":"uint256","name":"interestFee","type":"uint256"},{"internalType":"uint256","name":"interestRate","type":"uint256"}],"internalType":"struct EulerV2View.CollateralInfo[]","name":"collateralsInfo","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"getVaultInfoFull","outputs":[{"components":[{"internalType":"address","name":"vaultAddr","type":"address"},{"internalType":"address","name":"assetAddr","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"uint256","name":"totalSupplyShares","type":"uint256"},{"internalType":"uint256","name":"cash","type":"uint256"},{"internalType":"uint256","name":"totalBorrows","type":"uint256"},{"internalType":"uint256","name":"totalAssets","type":"uint256"},{"internalType":"uint256","name":"supplyCap","type":"uint256"},{"internalType":"uint256","name":"borrowCap","type":"uint256"},{"components":[{"internalType":"address","name":"vaultAddr","type":"address"},{"internalType":"address","name":"assetAddr","type":"address"},{"internalType":"string","name":"vaultSymbol","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"governorAdmin","type":"address"},{"internalType":"bool","name":"isEscrowed","type":"bool"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"uint256","name":"sharePriceInUnit","type":"uint256"},{"internalType":"uint256","name":"assetPriceInUnit","type":"uint256"},{"internalType":"uint256","name":"cash","type":"uint256"},{"internalType":"uint256","name":"totalBorrows","type":"uint256"},{"internalType":"uint256","name":"supplyCap","type":"uint256"},{"internalType":"uint16","name":"borrowLTV","type":"uint16"},{"internalType":"uint16","name":"liquidationLTV","type":"uint16"},{"internalType":"uint16","name":"initialLiquidationLTV","type":"uint16"},{"internalType":"uint48","name":"targetTimestamp","type":"uint48"},{"internalType":"uint32","name":"rampDuration","type":"uint32"},{"internalType":"uint256","name":"interestFee","type":"uint256"},{"internalType":"uint256","name":"interestRate","type":"uint256"}],"internalType":"struct EulerV2View.CollateralInfo[]","name":"collaterals","type":"tuple[]"},{"internalType":"uint16","name":"maxLiquidationDiscount","type":"uint16"},{"internalType":"uint256","name":"liquidationCoolOffTime","type":"uint256"},{"internalType":"bool","name":"badDebtSocializationEnabled","type":"bool"},{"internalType":"address","name":"unitOfAccount","type":"address"},{"internalType":"uint256","name":"unitOfAccountInUsd","type":"uint256"},{"internalType":"address","name":"oracle","type":"address"},{"internalType":"uint256","name":"assetPriceInUnit","type":"uint256"},{"internalType":"uint256","name":"sharePriceInUnit","type":"uint256"},{"internalType":"uint256","name":"interestRate","type":"uint256"},{"internalType":"address","name":"irm","type":"address"},{"internalType":"address","name":"balanceTrackerAddress","type":"address"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"address","name":"governorAdmin","type":"address"},{"internalType":"uint256","name":"interestFee","type":"uint256"}],"internalType":"struct EulerV2View.VaultInfoFull","name":"data","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_vaults","type":"address[]"}],"name":"getVaultsInfosFull","outputs":[{"components":[{"internalType":"address","name":"vaultAddr","type":"address"},{"internalType":"address","name":"assetAddr","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"uint256","name":"totalSupplyShares","type":"uint256"},{"internalType":"uint256","name":"cash","type":"uint256"},{"internalType":"uint256","name":"totalBorrows","type":"uint256"},{"internalType":"uint256","name":"totalAssets","type":"uint256"},{"internalType":"uint256","name":"supplyCap","type":"uint256"},{"internalType":"uint256","name":"borrowCap","type":"uint256"},{"components":[{"internalType":"address","name":"vaultAddr","type":"address"},{"internalType":"address","name":"assetAddr","type":"address"},{"internalType":"string","name":"vaultSymbol","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"governorAdmin","type":"address"},{"internalType":"bool","name":"isEscrowed","type":"bool"},{"internalType":"uint256","name":"decimals","type":"uint256"},{"internalType":"uint256","name":"sharePriceInUnit","type":"uint256"},{"internalType":"uint256","name":"assetPriceInUnit","type":"uint256"},{"internalType":"uint256","name":"cash","type":"uint256"},{"internalType":"uint256","name":"totalBorrows","type":"uint256"},{"internalType":"uint256","name":"supplyCap","type":"uint256"},{"internalType":"uint16","name":"borrowLTV","type":"uint16"},{"internalType":"uint16","name":"liquidationLTV","type":"uint16"},{"internalType":"uint16","name":"initialLiquidationLTV","type":"uint16"},{"internalType":"uint48","name":"targetTimestamp","type":"uint48"},{"internalType":"uint32","name":"rampDuration","type":"uint32"},{"internalType":"uint256","name":"interestFee","type":"uint256"},{"internalType":"uint256","name":"interestRate","type":"uint256"}],"internalType":"struct EulerV2View.CollateralInfo[]","name":"collaterals","type":"tuple[]"},{"internalType":"uint16","name":"maxLiquidationDiscount","type":"uint16"},{"internalType":"uint256","name":"liquidationCoolOffTime","type":"uint256"},{"internalType":"bool","name":"badDebtSocializationEnabled","type":"bool"},{"internalType":"address","name":"unitOfAccount","type":"address"},{"internalType":"uint256","name":"unitOfAccountInUsd","type":"uint256"},{"internalType":"address","name":"oracle","type":"address"},{"internalType":"uint256","name":"assetPriceInUnit","type":"uint256"},{"internalType":"uint256","name":"sharePriceInUnit","type":"uint256"},{"internalType":"uint256","name":"interestRate","type":"uint256"},{"internalType":"address","name":"irm","type":"address"},{"internalType":"address","name":"balanceTrackerAddress","type":"address"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"address","name":"governorAdmin","type":"address"},{"internalType":"uint256","name":"interestFee","type":"uint256"}],"internalType":"struct EulerV2View.VaultInfoFull[]","name":"data","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int256","name":"_btcPrice","type":"int256"}],"name":"getWBtcPrice","outputs":[{"internalType":"int256","name":"wBtcPrice","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int256","name":"_stEthPrice","type":"int256"}],"name":"getWStEthPrice","outputs":[{"internalType":"int256","name":"wStEthPrice","type":"int256"}],"stateMutability":"view","type":"function"}],
|
|
1183
|
-
"networks": {
|
|
1184
|
-
"1": { "address": "0x8932E46Ecf96b5Fe033F5e27Ab6dC755Cb668967" }
|
|
1185
|
-
}
|
|
1186
|
-
} as const;
|
|
1187
1181
|
export const LiquityV2StabilityPool = {
|
|
1188
1182
|
"abi": [{"inputs":[{"internalType":"contract IAddressesRegistry","name":"_addressesRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_newActivePoolAddress","type":"address"}],"name":"ActivePoolAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_B","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"_epoch","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"_scale","type":"uint128"}],"name":"B_Updated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_newBoldTokenAddress","type":"address"}],"name":"BoldTokenAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_newDefaultPoolAddress","type":"address"}],"name":"DefaultPoolAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_depositor","type":"address"},{"indexed":false,"internalType":"enum IStabilityPoolEvents.Operation","name":"_operation","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"_depositLossSinceLastOperation","type":"uint256"},{"indexed":false,"internalType":"int256","name":"_depositChange","type":"int256"},{"indexed":false,"internalType":"uint256","name":"_yieldGainSinceLastOperation","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_yieldGainClaimed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_ethGainSinceLastOperation","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_ethGainClaimed","type":"uint256"}],"name":"DepositOperation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_depositor","type":"address"},{"indexed":false,"internalType":"uint256","name":"_newDeposit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_stashedColl","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_snapshotP","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_snapshotS","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_snapshotB","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_snapshotScale","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_snapshotEpoch","type":"uint256"}],"name":"DepositUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint128","name":"_currentEpoch","type":"uint128"}],"name":"EpochUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"EtherSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_P","type":"uint256"}],"name":"P_Updated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_newPriceFeedAddress","type":"address"}],"name":"PriceFeedAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_S","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"_epoch","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"_scale","type":"uint128"}],"name":"S_Updated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint128","name":"_currentScale","type":"uint128"}],"name":"ScaleUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_newBalance","type":"uint256"}],"name":"StabilityPoolBoldBalanceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_newBalance","type":"uint256"}],"name":"StabilityPoolCollBalanceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_newTroveManagerAddress","type":"address"}],"name":"TroveManagerAddressChanged","type":"event"},{"inputs":[],"name":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"P","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SCALE_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activePool","outputs":[{"internalType":"contract IActivePool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"boldToken","outputs":[{"internalType":"contract IBoldToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimAllCollGains","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentEpoch","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentScale","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"depositSnapshots","outputs":[{"internalType":"uint256","name":"S","type":"uint256"},{"internalType":"uint256","name":"P","type":"uint256"},{"internalType":"uint256","name":"B","type":"uint256"},{"internalType":"uint128","name":"scale","type":"uint128"},{"internalType":"uint128","name":"epoch","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"deposits","outputs":[{"internalType":"uint256","name":"initialValue","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"","type":"uint128"},{"internalType":"uint128","name":"","type":"uint128"}],"name":"epochToScaleToB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"","type":"uint128"},{"internalType":"uint128","name":"","type":"uint128"}],"name":"epochToScaleToS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCollBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"getCompoundedBoldDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"getDepositorCollGain","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"getDepositorYieldGain","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"getDepositorYieldGainWithPending","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEntireSystemColl","outputs":[{"internalType":"uint256","name":"entireSystemColl","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEntireSystemDebt","outputs":[{"internalType":"uint256","name":"entireSystemDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalBoldDeposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getYieldGainsOwed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getYieldGainsPending","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastBoldLossError_Offset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastBoldLossError_TotalDeposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastCollError_Offset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastYieldError","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_debtToOffset","type":"uint256"},{"internalType":"uint256","name":"_collToAdd","type":"uint256"}],"name":"offset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_topUp","type":"uint256"},{"internalType":"bool","name":"_doClaim","type":"bool"}],"name":"provideToSP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stashedColl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_boldYield","type":"uint256"}],"name":"triggerBoldRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"troveManager","outputs":[{"internalType":"contract ITroveManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_doClaim","type":"bool"}],"name":"withdrawFromSP","outputs":[],"stateMutability":"nonpayable","type":"function"}],
|
|
1189
1183
|
"networks": {}
|
package/src/contracts.ts
CHANGED
|
@@ -135,7 +135,6 @@ export const WstETHPriceFeedContractViem = createViemContractFromConfigFunc('Wst
|
|
|
135
135
|
export const CompV3ViewContractViem = createViemContractFromConfigFunc('CompV3View');
|
|
136
136
|
export const SparkViewContractViem = createViemContractFromConfigFunc('SparkView');
|
|
137
137
|
export const SparkIncentiveDataProviderContractViem = createViemContractFromConfigFunc('SparkIncentiveDataProvider');
|
|
138
|
-
export const EulerV2ViewContractViem = createViemContractFromConfigFunc('EulerV2View');
|
|
139
138
|
export const CrvUSDViewContractViem = createViemContractFromConfigFunc('crvUSDView');
|
|
140
139
|
export const CrvUSDFactoryContractViem = createViemContractFromConfigFunc('crvUSDFactory');
|
|
141
140
|
export const LlamaLendViewContractViem = createViemContractFromConfigFunc('LlamaLendView');
|
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
AaveV4UsedReserveAssets,
|
|
18
18
|
EthereumProvider,
|
|
19
19
|
IncentiveData,
|
|
20
|
+
IncentiveSide,
|
|
20
21
|
LeverageType,
|
|
21
22
|
NetworkNumber,
|
|
22
23
|
} from '../../types';
|
|
@@ -93,14 +94,26 @@ export const calcUserRiskPremiumBps = (usedAssets: AaveV4UsedReserveAssets, asse
|
|
|
93
94
|
|
|
94
95
|
/**
|
|
95
96
|
* `spokeXIncentives`/`hubXIncentives` are each the intrinsic `base` list with at most one Merkl
|
|
96
|
-
* reward appended (see attachAaveV4MerklIncentives).
|
|
97
|
-
*
|
|
97
|
+
* reward appended (see attachAaveV4MerklIncentives). Merkl regularly publishes the same reward
|
|
98
|
+
* stream at both scopes (a spoke campaign and a hub campaign covering the same borrows, e.g. USDC
|
|
99
|
+
* borrowed from the Prime Hub via the Bluechip Spoke), so the scopes must never be summed — the
|
|
100
|
+
* more specific spoke reward wins and the hub reward only applies when no spoke campaign exists,
|
|
101
|
+
* which is also what every per-asset APY badge (and Aave's own UI) shows.
|
|
98
102
|
*/
|
|
99
|
-
const mergeScopedIncentives = (base: IncentiveData[] = [], spokeScoped?: IncentiveData[], hubScoped?: IncentiveData[]): IncentiveData[] =>
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
...
|
|
103
|
-
|
|
103
|
+
const mergeScopedIncentives = (base: IncentiveData[] = [], spokeScoped?: IncentiveData[], hubScoped?: IncentiveData[]): IncentiveData[] => {
|
|
104
|
+
const spokeExtras = spokeScoped ? spokeScoped.slice(base.length) : [];
|
|
105
|
+
const hubExtras = hubScoped ? hubScoped.slice(base.length) : [];
|
|
106
|
+
return [...base, ...(spokeExtras.length ? spokeExtras : hubExtras)];
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* The incentives that actually accrue to a position on this reserve for the given side: the
|
|
111
|
+
* intrinsic (staking) incentives plus the single applicable Merkl reward. Display surfaces should
|
|
112
|
+
* use this rather than picking a scoped list directly, so badges always match the net APY math.
|
|
113
|
+
*/
|
|
114
|
+
export const getAaveV4ApplicableIncentives = (assetData: AaveV4ReserveAssetData, side: IncentiveSide): IncentiveData[] => (side === IncentiveSide.Supply
|
|
115
|
+
? mergeScopedIncentives(assetData.supplyIncentives, assetData.spokeSupplyIncentives, assetData.hubSupplyIncentives)
|
|
116
|
+
: mergeScopedIncentives(assetData.borrowIncentives, assetData.spokeBorrowIncentives, assetData.hubBorrowIncentives));
|
|
104
117
|
|
|
105
118
|
export const calculateNetApyAaveV4 = ({
|
|
106
119
|
usedAssets,
|
|
@@ -123,7 +136,7 @@ export const calculateNetApyAaveV4 = ({
|
|
|
123
136
|
const supplyInterest = calculateInterestEarned(amount, assetData.supplyRate, 'year', true);
|
|
124
137
|
acc.supplyInterest = new Dec(acc.supplyInterest).add(supplyInterest.toString()).toString();
|
|
125
138
|
|
|
126
|
-
const supplyIncentives =
|
|
139
|
+
const supplyIncentives = getAaveV4ApplicableIncentives(assetData, IncentiveSide.Supply);
|
|
127
140
|
for (const supplyIncentive of supplyIncentives) {
|
|
128
141
|
const incentiveInterest = calculateInterestEarned(amount, supplyIncentive.apy, 'year', true);
|
|
129
142
|
acc.incentiveUsd = new Dec(acc.incentiveUsd).add(incentiveInterest).toString();
|
|
@@ -141,7 +154,7 @@ export const calculateNetApyAaveV4 = ({
|
|
|
141
154
|
const borrowInterest = calculateInterestEarned(amount, userBorrowRate, 'year', true);
|
|
142
155
|
acc.borrowInterest = new Dec(acc.borrowInterest).sub(borrowInterest.toString()).toString();
|
|
143
156
|
|
|
144
|
-
const borrowIncentives =
|
|
157
|
+
const borrowIncentives = getAaveV4ApplicableIncentives(assetData, IncentiveSide.Borrow);
|
|
145
158
|
for (const borrowIncentive of borrowIncentives) {
|
|
146
159
|
const incentiveInterest = calculateInterestEarned(amount, borrowIncentive.apy, 'year', true);
|
|
147
160
|
acc.incentiveUsd = new Dec(acc.incentiveUsd).add(incentiveInterest).toString();
|
package/src/helpers/index.ts
CHANGED
|
@@ -7,6 +7,5 @@ export * as morphoBlueHelpers from './morphoBlueHelpers';
|
|
|
7
7
|
export * as morphoMidnightHelpers from './morphoMidnightHelpers';
|
|
8
8
|
export * as llamaLendHelpers from './llamaLendHelpers';
|
|
9
9
|
export * as liquityV2Helpers from './liquityV2Helpers';
|
|
10
|
-
export * as eulerV2Helpers from './eulerHelpers';
|
|
11
10
|
export * as fluidHelpers from './fluidHelpers';
|
|
12
11
|
export * as aaveV4Helpers from './aaveV4Helpers';
|
package/src/index.ts
CHANGED
|
@@ -19,7 +19,6 @@ import * as exchange from './exchange';
|
|
|
19
19
|
import * as morphoBlue from './morphoBlue';
|
|
20
20
|
import * as morphoMidnight from './morphoMidnight';
|
|
21
21
|
import * as llamaLend from './llamaLend';
|
|
22
|
-
import * as eulerV2 from './eulerV2';
|
|
23
22
|
import * as portfolio from './portfolio';
|
|
24
23
|
import * as claiming from './claiming';
|
|
25
24
|
import * as savings from './savings';
|
|
@@ -45,7 +44,6 @@ export {
|
|
|
45
44
|
morphoBlue,
|
|
46
45
|
morphoMidnight,
|
|
47
46
|
llamaLend,
|
|
48
|
-
eulerV2,
|
|
49
47
|
fluid,
|
|
50
48
|
portfolio,
|
|
51
49
|
claiming,
|
package/src/markets/index.ts
CHANGED
|
@@ -22,7 +22,6 @@ export {
|
|
|
22
22
|
} from './morphoMidnight';
|
|
23
23
|
export { LlamaLendMarkets } from './llamaLend';
|
|
24
24
|
export { LiquityV2Markets, findLiquityV2MarketByAddress } from './liquityV2';
|
|
25
|
-
export { EulerV2Markets } from './euler';
|
|
26
25
|
export {
|
|
27
26
|
FluidMarkets,
|
|
28
27
|
getFluidVersionsDataForNetwork,
|
|
@@ -997,6 +997,36 @@ export const MORPHO_BLUE_WEETH_USDC_770 = (networkId: NetworkNumber = NetworkNum
|
|
|
997
997
|
marketId: '0x34377fc4f617c51818e92c79df31ff270c6a91bc94ad32e367fdf59b9f4ac5dd',
|
|
998
998
|
protocolName: 'morpho-blue',
|
|
999
999
|
});
|
|
1000
|
+
export const MORPHO_BLUE_WEETH_USDC_860 = (networkId: NetworkNumber = NetworkNumber.Eth): MorphoBlueMarketData => ({
|
|
1001
|
+
chainIds: [NetworkNumber.Eth],
|
|
1002
|
+
label: 'Morpho',
|
|
1003
|
+
shortLabel: 'weETH/USDC',
|
|
1004
|
+
value: MorphoBlueVersions.MorphoBlueWeEthUSDC_860,
|
|
1005
|
+
url: 'weethusdc-61765602',
|
|
1006
|
+
loanToken: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
|
|
1007
|
+
collateralToken: '0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee',
|
|
1008
|
+
oracle: '0x5635a2F38c5dFd1d8fDB176d9CB5AEFA07bf6A68',
|
|
1009
|
+
oracleType: MorphoBlueOracleType.MARKET_RATE,
|
|
1010
|
+
irm: '0x870aC11D48B15DB9a138Cf899d20F13F79Ba00BC',
|
|
1011
|
+
lltv: 0.86,
|
|
1012
|
+
marketId: '0x61765602144e91e5ac9f9e98b8584eae308f9951596fd7f5e0f59f21cd2bf664',
|
|
1013
|
+
protocolName: 'morpho-blue',
|
|
1014
|
+
});
|
|
1015
|
+
export const MORPHO_BLUE_WEETH_USDC_860_85252BB8 = (networkId: NetworkNumber = NetworkNumber.Eth): MorphoBlueMarketData => ({
|
|
1016
|
+
chainIds: [NetworkNumber.Eth],
|
|
1017
|
+
label: 'Morpho',
|
|
1018
|
+
shortLabel: 'weETH/USDC',
|
|
1019
|
+
value: MorphoBlueVersions.MorphoBlueWeEthUSDC_860_85252bb8,
|
|
1020
|
+
url: 'weethusdc-85252bb8',
|
|
1021
|
+
loanToken: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
|
|
1022
|
+
collateralToken: '0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee',
|
|
1023
|
+
oracle: '0xa3A7A3ceFee206f9d7Fe00eC3C83324ED4228411',
|
|
1024
|
+
oracleType: MorphoBlueOracleType.MARKET_RATE,
|
|
1025
|
+
irm: '0x870aC11D48B15DB9a138Cf899d20F13F79Ba00BC',
|
|
1026
|
+
lltv: 0.86,
|
|
1027
|
+
marketId: '0x85252bb8485c99bba46fe149c7dd2aad83672640f53c630890673cf1848ba16e',
|
|
1028
|
+
protocolName: 'morpho-blue',
|
|
1029
|
+
});
|
|
1000
1030
|
export const MORPHO_BLUE_ETH_USDC_860_94B823E6 = (networkId: NetworkNumber = NetworkNumber.Eth): MorphoBlueMarketData => ({
|
|
1001
1031
|
chainIds: [NetworkNumber.Eth],
|
|
1002
1032
|
label: 'Morpho',
|
|
@@ -1102,6 +1132,21 @@ export const MORPHO_BLUE_WEETH_USDT_860 = (networkId: NetworkNumber = NetworkNum
|
|
|
1102
1132
|
marketId: '0xc2c53d2b868e163da71de14a5113cc2743fc9b5ad7488334720ed2846566a8f6',
|
|
1103
1133
|
protocolName: 'morpho-blue',
|
|
1104
1134
|
});
|
|
1135
|
+
export const MORPHO_BLUE_WEETH_USDT_860_A6A4C1F1 = (networkId: NetworkNumber = NetworkNumber.Eth): MorphoBlueMarketData => ({
|
|
1136
|
+
chainIds: [NetworkNumber.Eth],
|
|
1137
|
+
label: 'Morpho',
|
|
1138
|
+
shortLabel: 'weETH/USDT',
|
|
1139
|
+
value: MorphoBlueVersions.MorphoBlueWeEthUSDT_860_a6a4c1f1,
|
|
1140
|
+
url: 'weethusdt-a6a4c1f1',
|
|
1141
|
+
loanToken: '0xdAC17F958D2ee523a2206206994597C13D831ec7',
|
|
1142
|
+
collateralToken: '0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee',
|
|
1143
|
+
oracle: '0xa3A7A3ceFee206f9d7Fe00eC3C83324ED4228411',
|
|
1144
|
+
oracleType: MorphoBlueOracleType.MARKET_RATE,
|
|
1145
|
+
irm: '0x870aC11D48B15DB9a138Cf899d20F13F79Ba00BC',
|
|
1146
|
+
lltv: 0.86,
|
|
1147
|
+
marketId: '0xa6a4c1f15490a1ff39d9de3a366b408dd5647a436d8b179726d3e0562aff1292',
|
|
1148
|
+
protocolName: 'morpho-blue',
|
|
1149
|
+
});
|
|
1105
1150
|
export const MORPHO_BLUE_SYRUPUSDT_USDT_915 = (networkId: NetworkNumber = NetworkNumber.Eth): MorphoBlueMarketData => ({
|
|
1106
1151
|
chainIds: [NetworkNumber.Eth],
|
|
1107
1152
|
label: 'Morpho',
|
|
@@ -1865,6 +1910,8 @@ export const MorphoBlueMarkets = (networkId: NetworkNumber) => ({
|
|
|
1865
1910
|
[MorphoBlueVersions.MorphoBlueWstEthUSDT_860]: MORPHO_BLUE_WSTETH_USDT_860(networkId),
|
|
1866
1911
|
[MorphoBlueVersions.MorphoBlueSyrupUSDCRLUSD_915]: MORPHO_BLUE_SYRUPUSDC_RLUSD_915(networkId),
|
|
1867
1912
|
[MorphoBlueVersions.MorphoBlueWeEthUSDC_770]: MORPHO_BLUE_WEETH_USDC_770(networkId),
|
|
1913
|
+
[MorphoBlueVersions.MorphoBlueWeEthUSDC_860]: MORPHO_BLUE_WEETH_USDC_860(networkId),
|
|
1914
|
+
[MorphoBlueVersions.MorphoBlueWeEthUSDC_860_85252bb8]: MORPHO_BLUE_WEETH_USDC_860_85252BB8(networkId),
|
|
1868
1915
|
[MorphoBlueVersions.MorphoBlueEthUSDC_860_94b823e6]: MORPHO_BLUE_ETH_USDC_860_94B823E6(networkId),
|
|
1869
1916
|
[MorphoBlueVersions.MorphoBlueUSD3USDC_915]: MORPHO_BLUE_USD3_USDC_915(networkId),
|
|
1870
1917
|
[MorphoBlueVersions.MorphoBlueStUSDSUSDC_860]: MORPHO_BLUE_STUSDS_USDC_860(networkId),
|
|
@@ -1872,6 +1919,7 @@ export const MorphoBlueMarkets = (networkId: NetworkNumber) => ({
|
|
|
1872
1919
|
[MorphoBlueVersions.MorphoBlueWBTCEth_915]: MORPHO_BLUE_WBTC_ETH_915(networkId),
|
|
1873
1920
|
[MorphoBlueVersions.MorphoBlueCbBTCEth_915_12dbf493]: MORPHO_BLUE_CBBTC_ETH_915_12DBF493(networkId),
|
|
1874
1921
|
[MorphoBlueVersions.MorphoBlueWeEthUSDT_860]: MORPHO_BLUE_WEETH_USDT_860(networkId),
|
|
1922
|
+
[MorphoBlueVersions.MorphoBlueWeEthUSDT_860_a6a4c1f1]: MORPHO_BLUE_WEETH_USDT_860_A6A4C1F1(networkId),
|
|
1875
1923
|
[MorphoBlueVersions.MorphoBlueSyrupUSDTUSDT_915]: MORPHO_BLUE_SYRUPUSDT_USDT_915(networkId),
|
|
1876
1924
|
[MorphoBlueVersions.MorphoBlueCbBTCPYUSD_860]: MORPHO_BLUE_CBBTC_PYUSD_860(networkId),
|
|
1877
1925
|
[MorphoBlueVersions.MorphoBlueWeEthUSDT_770]: MORPHO_BLUE_WEETH_USDT_770(networkId),
|
|
@@ -1930,4 +1978,4 @@ export const findMorphoBlueMarket = (collateralToken: string, loanToken: string,
|
|
|
1930
1978
|
}
|
|
1931
1979
|
}
|
|
1932
1980
|
return null;
|
|
1933
|
-
};
|
|
1981
|
+
};
|
|
@@ -37,7 +37,7 @@ const hasAnyBalance = (balances: PositionBalances): boolean => (
|
|
|
37
37
|
* Uses one shared, multicall-batched viem client (same pattern as getPortfolioData) so all
|
|
38
38
|
* per-market reads collapse into a handful of RPC round trips.
|
|
39
39
|
*
|
|
40
|
-
* Not covered: Maker, Liquity, Liquity V2, Fluid
|
|
40
|
+
* Not covered: Maker, Liquity, Liquity V2, Fluid — these already expose cheap,
|
|
41
41
|
* user-scoped discovery entry points elsewhere in the SDK (e.g. _getUserCdps, _getUserPositionsPortfolio).
|
|
42
42
|
*/
|
|
43
43
|
export async function getUserPositionsExistence(
|
package/src/portfolio/index.ts
CHANGED
|
@@ -5,7 +5,6 @@ import {
|
|
|
5
5
|
AaveV4Spokes,
|
|
6
6
|
CompoundMarkets,
|
|
7
7
|
CrvUsdMarkets,
|
|
8
|
-
EulerV2Markets,
|
|
9
8
|
LiquityV2Markets,
|
|
10
9
|
LlamaLendMarkets,
|
|
11
10
|
MorphoBlueMarkets,
|
|
@@ -24,7 +23,6 @@ import {
|
|
|
24
23
|
CompoundV3MarketsData,
|
|
25
24
|
CompoundVersions,
|
|
26
25
|
CrvUSDGlobalMarketData,
|
|
27
|
-
EulerV2FullMarketData,
|
|
28
26
|
LiquityV2MarketData,
|
|
29
27
|
LlamaLendGlobalMarketData,
|
|
30
28
|
MorphoBlueMarketInfo,
|
|
@@ -34,7 +32,6 @@ import {
|
|
|
34
32
|
} from '../types';
|
|
35
33
|
import { _getCompoundV3AccountData, _getCompoundV3MarketsData } from '../compoundV3';
|
|
36
34
|
import { _getSparkAccountData, _getSparkMarketsData } from '../spark';
|
|
37
|
-
import { _getEulerV2AccountData, _getEulerV2MarketsData } from '../eulerV2';
|
|
38
35
|
import { _getCurveUsdGlobalData, _getCurveUsdUserData } from '../curveUsd';
|
|
39
36
|
import { _getLlamaLendGlobalData, _getLlamaLendUserData } from '../llamaLend';
|
|
40
37
|
import { _getAaveV3AccountData, _getAaveV3MarketData, getStakeAaveData } from '../aaveV3';
|
|
@@ -46,7 +43,6 @@ import { getViemProvider } from '../services/viem';
|
|
|
46
43
|
import { _getLiquityTroveInfo, getLiquityStakingData } from '../liquity';
|
|
47
44
|
import { _getLiquityV2MarketData, getLiquitySAndYBold, getLiquityV2Staking } from '../liquityV2';
|
|
48
45
|
import { _getAllUserEarnPositionsWithFTokens, _getUserPositionsPortfolio } from '../fluid';
|
|
49
|
-
import { getEulerV2SubAccounts } from '../helpers/eulerHelpers';
|
|
50
46
|
import { getUmbrellaData } from '../umbrella';
|
|
51
47
|
import { getMeritUnclaimedRewards, getUnclaimedRewardsForAllMarkets } from '../claiming/aaveV3';
|
|
52
48
|
import { getCompoundV3Rewards } from '../claiming/compV3';
|
|
@@ -69,7 +65,6 @@ export async function getPortfolioData(provider: EthereumProvider, network: Netw
|
|
|
69
65
|
const morphoMidnightMarkets = Object.values(MorphoMidnightMarkets(network)).filter((market) => market.chainIds.includes(network));
|
|
70
66
|
const compoundV3Markets = Object.values(CompoundMarkets(network)).filter((market) => market.chainIds.includes(network) && market.value !== CompoundVersions.CompoundV2);
|
|
71
67
|
const sparkMarkets = Object.values(SparkMarkets(network)).filter((market) => market.chainIds.includes(network));
|
|
72
|
-
const eulerV2Markets = Object.values(EulerV2Markets(network)).filter((market) => market.chainIds.includes(network));
|
|
73
68
|
const aaveV3Markets = [AaveVersions.AaveV3, AaveVersions.AaveV3Lido, AaveVersions.AaveV3Etherfi].map((version) => AaveMarkets(network)[version]).filter((market) => market.chainIds.includes(network));
|
|
74
69
|
const aaveV2Markets = [AaveVersions.AaveV2].map((version) => AaveMarkets(network)[version]).filter((market) => market.chainIds.includes(network));
|
|
75
70
|
const compoundV2Markets = [CompoundVersions.CompoundV2].map((version) => CompoundMarkets(network)[version]).filter((market) => market.chainIds.includes(network));
|
|
@@ -88,7 +83,6 @@ export async function getPortfolioData(provider: EthereumProvider, network: Netw
|
|
|
88
83
|
const morphoMidnightMarketsData: Record<string, MorphoMidnightMarketInfo> = {};
|
|
89
84
|
const compoundV3MarketsData: Record<string, CompoundV3MarketsData> = {};
|
|
90
85
|
const sparkMarketsData: Record<string, SparkMarketsData> = {};
|
|
91
|
-
const eulerV2MarketsData: Record<string, EulerV2FullMarketData> = {};
|
|
92
86
|
const aaveV3MarketsData: Record<string, AaveV3MarketData> = {};
|
|
93
87
|
const makerCdps: Record<string, CdpInfo[]> = {};
|
|
94
88
|
const aaveV2MarketsData: Record<string, AaveV2MarketData> = {};
|
|
@@ -103,7 +97,6 @@ export async function getPortfolioData(provider: EthereumProvider, network: Netw
|
|
|
103
97
|
morphoMidnightMarketsData,
|
|
104
98
|
compoundV3MarketsData,
|
|
105
99
|
sparkMarketsData,
|
|
106
|
-
eulerV2MarketsData,
|
|
107
100
|
aaveV3MarketsData,
|
|
108
101
|
aaveV2MarketsData,
|
|
109
102
|
compoundV2MarketsData,
|
|
@@ -126,7 +119,6 @@ export async function getPortfolioData(provider: EthereumProvider, network: Netw
|
|
|
126
119
|
morphoMidnight: {},
|
|
127
120
|
compoundV3: {},
|
|
128
121
|
spark: {},
|
|
129
|
-
eulerV2: {},
|
|
130
122
|
maker: {},
|
|
131
123
|
aaveV2: {},
|
|
132
124
|
compoundV2: {},
|
|
@@ -187,10 +179,6 @@ export async function getPortfolioData(provider: EthereumProvider, network: Netw
|
|
|
187
179
|
const marketData = await _getSparkMarketsData(client, network, market);
|
|
188
180
|
sparkMarketsData[market.value] = marketData;
|
|
189
181
|
}),
|
|
190
|
-
...eulerV2Markets.map(async (market) => {
|
|
191
|
-
const marketData = await _getEulerV2MarketsData(client, network, market);
|
|
192
|
-
eulerV2MarketsData[market.value] = marketData;
|
|
193
|
-
}),
|
|
194
182
|
...aaveV3Markets.map(async (market) => {
|
|
195
183
|
const marketData = await _getAaveV3MarketData(client, network, market);
|
|
196
184
|
aaveV3MarketsData[market.value] = marketData;
|
|
@@ -547,27 +535,6 @@ export async function getPortfolioData(provider: EthereumProvider, network: Netw
|
|
|
547
535
|
positions[address.toLowerCase() as EthAddress].spark[market.value] = { error: `Error fetching Spark account data for address ${address} on market ${market.value}`, data: null };
|
|
548
536
|
}
|
|
549
537
|
})).flat(),
|
|
550
|
-
...eulerV2Markets.map((market) => addresses.map((address) => {
|
|
551
|
-
const eulerV2SubAccounts = getEulerV2SubAccounts(address);
|
|
552
|
-
const eulerV2Addresses = [address, ...eulerV2SubAccounts];
|
|
553
|
-
return Promise.all(eulerV2Addresses.map(async (eulerAddress) => {
|
|
554
|
-
try {
|
|
555
|
-
const accData = await _getEulerV2AccountData(client, network, eulerAddress, eulerAddress, { selectedMarket: market, ...eulerV2MarketsData[market.value] });
|
|
556
|
-
if (new Dec(accData.suppliedUsd).gt(0) || new Dec(accData.borrowedUsd).gt(0)) {
|
|
557
|
-
if (!positions[address.toLowerCase() as EthAddress].eulerV2[market.value]) {
|
|
558
|
-
positions[address.toLowerCase() as EthAddress].eulerV2[market.value] = {};
|
|
559
|
-
}
|
|
560
|
-
positions[address.toLowerCase() as EthAddress].eulerV2[market.value]![eulerAddress.toLowerCase() as EthAddress] = { error: '', data: accData };
|
|
561
|
-
}
|
|
562
|
-
} catch (error) {
|
|
563
|
-
console.error(`Error fetching EulerV2 account data for address ${eulerAddress} on market ${market.value}:`, error);
|
|
564
|
-
if (!positions[address.toLowerCase() as EthAddress].eulerV2[market.value]) {
|
|
565
|
-
positions[address.toLowerCase() as EthAddress].eulerV2[market.value] = {};
|
|
566
|
-
}
|
|
567
|
-
positions[address.toLowerCase() as EthAddress].eulerV2[market.value]![eulerAddress.toLowerCase() as EthAddress] = { error: `Error fetching EulerV2 account data for address ${eulerAddress} on market ${market.value}`, data: null };
|
|
568
|
-
}
|
|
569
|
-
}));
|
|
570
|
-
}).flat()).flat(),
|
|
571
538
|
...addresses.map(async (address) => makerCdps[address.toLowerCase() as EthAddress]?.map(async (cdpInfo) => {
|
|
572
539
|
try {
|
|
573
540
|
const cdpData = await _getMakerCdpData(client, network, cdpInfo);
|
package/src/services/utils.ts
CHANGED
|
@@ -20,6 +20,8 @@ export const isAddress = (address: string) => typeof address === 'string' && (ne
|
|
|
20
20
|
|
|
21
21
|
export const compareAddresses = (addr1 = '', addr2 = '') => addr1.toLowerCase() === addr2.toLowerCase();
|
|
22
22
|
|
|
23
|
+
export const shortenAddress = (address = '', start = 8, end = 4) => `${address.substring(0, start)}...${address.slice(-end)}`;
|
|
24
|
+
|
|
23
25
|
export const getWeiAmountForDecimals = (amount: string | number, decimals: number) => new Dec(amount).mul(10 ** decimals).floor().toString();
|
|
24
26
|
|
|
25
27
|
export const getEthAmountForDecimals = (amount: string | number, decimals: string | number) => new Dec(amount).div(10 ** +decimals).toString();
|
package/src/staking/staking.ts
CHANGED
|
@@ -8,7 +8,6 @@ import {
|
|
|
8
8
|
import { BLOCKS_IN_A_YEAR } from '../constants';
|
|
9
9
|
import { DEFAULT_TIMEOUT } from '../services/utils';
|
|
10
10
|
import { EligibilityMapping } from './eligibility';
|
|
11
|
-
import { EulerV2UsedAsset } from '../types';
|
|
12
11
|
|
|
13
12
|
const getSsrApy = async () => {
|
|
14
13
|
try {
|
|
@@ -143,7 +142,7 @@ export const calculateNetApy = ({
|
|
|
143
142
|
}: { usedAssets: MMUsedAssets, assetsData: MMAssetsData, optionalData?: any }) => {
|
|
144
143
|
const sumValues = Object.values(usedAssets).reduce((_acc, usedAsset) => {
|
|
145
144
|
const acc = { ..._acc };
|
|
146
|
-
const assetData = assetsData[usedAsset.symbol]
|
|
145
|
+
const assetData = assetsData[usedAsset.symbol];
|
|
147
146
|
|
|
148
147
|
if (usedAsset.isSupplied) {
|
|
149
148
|
const amount = usedAsset.suppliedUsd;
|
package/src/types/aaveV4.ts
CHANGED
|
@@ -52,6 +52,11 @@ export interface AaveV4SpokeInfo {
|
|
|
52
52
|
value: AaveV4SpokesType,
|
|
53
53
|
url: string,
|
|
54
54
|
address: EthAddress,
|
|
55
|
+
/**
|
|
56
|
+
* Known hub addresses, used only to prefetch hub data in parallel with the spoke data.
|
|
57
|
+
* The on-chain reserves are the source of truth — hubs found there but missing here are
|
|
58
|
+
* fetched dynamically, so this list going stale can't break spoke loading.
|
|
59
|
+
*/
|
|
55
60
|
hubs: EthAddress[],
|
|
56
61
|
}
|
|
57
62
|
|
package/src/types/common.ts
CHANGED
|
@@ -3,6 +3,11 @@ export enum IncentiveKind {
|
|
|
3
3
|
Reward = 'reward',
|
|
4
4
|
}
|
|
5
5
|
|
|
6
|
+
export enum IncentiveSide {
|
|
7
|
+
Supply = 'supply',
|
|
8
|
+
Borrow = 'borrow',
|
|
9
|
+
}
|
|
10
|
+
|
|
6
11
|
export enum IncentiveEligibilityId {
|
|
7
12
|
AaveV3EthenaLiquidLeverage = '0x0dC599DBB180E64E42b87332FDeC3a551445ea44BORROW_BL',
|
|
8
13
|
AaveV3ArbitrumEthSupply = '0x5d16261c6715a653248269861bbacf68a9774cde',
|
package/src/types/index.ts
CHANGED
package/src/types/merkl.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EthAddress, IncentiveData } from './common';
|
|
1
|
+
import { EthAddress, IncentiveData, IncentiveSide } from './common';
|
|
2
2
|
|
|
3
3
|
export enum OpportunityAction {
|
|
4
4
|
LEND = 'LEND',
|
|
@@ -70,11 +70,11 @@ export type MerklOpportunity = {
|
|
|
70
70
|
export type MerkleRewardInfo = { apy: string; rewardTokenSymbol: string, description: string, identifier: string };
|
|
71
71
|
export type MerkleRewardMap = Record<EthAddress, { supply?: MerkleRewardInfo; borrow?: MerkleRewardInfo }>;
|
|
72
72
|
|
|
73
|
-
export type AaveV4MerklScopedReward = {
|
|
73
|
+
export type AaveV4MerklScopedReward = { [side in IncentiveSide]?: IncentiveData };
|
|
74
74
|
|
|
75
75
|
/**
|
|
76
76
|
* Aave V4 Merkl reward campaigns split by scope:
|
|
77
|
-
* - `hub`: keyed by
|
|
77
|
+
* - `hub`: keyed by `${hubAddress}_${underlyingAddress}` (both lowercase) — rewards for supplying/borrowing via a hub
|
|
78
78
|
* - `spoke`: keyed by `${spokeAddress}_${underlyingAddress}` (both lowercase) — rewards for supplying/borrowing on a spoke
|
|
79
79
|
*/
|
|
80
80
|
export type AaveV4MerklRewardMap = {
|