@moonwell-fi/moonwell-sdk 0.10.2 → 0.10.4
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/CHANGELOG.md +14 -0
- package/_cjs/actions/core/markets/getMarketSnapshots.js +8 -0
- package/_cjs/actions/core/markets/getMarketSnapshots.js.map +1 -1
- package/_cjs/actions/governance/common.js +37 -5
- package/_cjs/actions/governance/common.js.map +1 -1
- package/_cjs/actions/governance/getStakingInfo.js +6 -1
- package/_cjs/actions/governance/getStakingInfo.js.map +1 -1
- package/_cjs/actions/governance/getUserStakingInfo.js +2 -10
- package/_cjs/actions/governance/getUserStakingInfo.js.map +1 -1
- package/_cjs/actions/lunar-indexer-transformers.js +2 -0
- package/_cjs/actions/lunar-indexer-transformers.js.map +1 -1
- package/_cjs/actions/morpho/markets/common.js +3 -2
- package/_cjs/actions/morpho/markets/common.js.map +1 -1
- package/_cjs/actions/morpho/markets/getMarketSnapshots.js +6 -0
- package/_cjs/actions/morpho/markets/getMarketSnapshots.js.map +1 -1
- package/_cjs/actions/morpho/markets/lunarIndexerTransform.js +4 -0
- package/_cjs/actions/morpho/markets/lunarIndexerTransform.js.map +1 -1
- package/_cjs/actions/morpho/vaults/common.js +8 -0
- package/_cjs/actions/morpho/vaults/common.js.map +1 -1
- package/_cjs/environments/definitions/base/morpho-vaults.js +24 -0
- package/_cjs/environments/definitions/base/morpho-vaults.js.map +1 -1
- package/_cjs/environments/definitions/base/tokens.js +28 -4
- package/_cjs/environments/definitions/base/tokens.js.map +1 -1
- package/_cjs/errors/version.js +1 -1
- package/_esm/actions/core/markets/getMarketSnapshots.js +8 -0
- package/_esm/actions/core/markets/getMarketSnapshots.js.map +1 -1
- package/_esm/actions/governance/common.js +40 -5
- package/_esm/actions/governance/common.js.map +1 -1
- package/_esm/actions/governance/getStakingInfo.js +6 -1
- package/_esm/actions/governance/getStakingInfo.js.map +1 -1
- package/_esm/actions/governance/getUserStakingInfo.js +3 -12
- package/_esm/actions/governance/getUserStakingInfo.js.map +1 -1
- package/_esm/actions/lunar-indexer-transformers.js +2 -0
- package/_esm/actions/lunar-indexer-transformers.js.map +1 -1
- package/_esm/actions/morpho/markets/common.js +3 -2
- package/_esm/actions/morpho/markets/common.js.map +1 -1
- package/_esm/actions/morpho/markets/getMarketSnapshots.js +6 -0
- package/_esm/actions/morpho/markets/getMarketSnapshots.js.map +1 -1
- package/_esm/actions/morpho/markets/lunarIndexerTransform.js +4 -0
- package/_esm/actions/morpho/markets/lunarIndexerTransform.js.map +1 -1
- package/_esm/actions/morpho/vaults/common.js +11 -0
- package/_esm/actions/morpho/vaults/common.js.map +1 -1
- package/_esm/environments/definitions/base/morpho-vaults.js +24 -0
- package/_esm/environments/definitions/base/morpho-vaults.js.map +1 -1
- package/_esm/environments/definitions/base/tokens.js +28 -4
- package/_esm/environments/definitions/base/tokens.js.map +1 -1
- package/_esm/errors/version.js +1 -1
- package/_types/actions/core/markets/getMarketSnapshots.d.ts.map +1 -1
- package/_types/actions/governance/common.d.ts +8 -1
- package/_types/actions/governance/common.d.ts.map +1 -1
- package/_types/actions/governance/getStakingInfo.d.ts.map +1 -1
- package/_types/actions/governance/getUserStakingInfo.d.ts.map +1 -1
- package/_types/actions/lunar-indexer-transformers.d.ts.map +1 -1
- package/_types/actions/morpho/markets/getMarketSnapshots.d.ts +2 -0
- package/_types/actions/morpho/markets/getMarketSnapshots.d.ts.map +1 -1
- package/_types/actions/morpho/markets/lunarIndexerTransform.d.ts +2 -0
- package/_types/actions/morpho/markets/lunarIndexerTransform.d.ts.map +1 -1
- package/_types/actions/morpho/vaults/common.d.ts.map +1 -1
- package/_types/client/createMoonwellClient.d.ts +104 -8
- package/_types/client/createMoonwellClient.d.ts.map +1 -1
- package/_types/environments/definitions/base/morpho-vaults.d.ts +24 -0
- package/_types/environments/definitions/base/morpho-vaults.d.ts.map +1 -1
- package/_types/environments/definitions/base/tokens.d.ts +28 -4
- package/_types/environments/definitions/base/tokens.d.ts.map +1 -1
- package/_types/environments/index.d.ts +52 -4
- package/_types/environments/index.d.ts.map +1 -1
- package/_types/errors/version.d.ts +1 -1
- package/_types/types/market.d.ts +2 -0
- package/_types/types/market.d.ts.map +1 -1
- package/actions/core/markets/getMarketSnapshots.ts +9 -0
- package/actions/governance/common.ts +75 -7
- package/actions/governance/getStakingInfo.ts +8 -3
- package/actions/governance/getUserStakingInfo.ts +3 -12
- package/actions/lunar-indexer-transformers.ts +2 -0
- package/actions/morpho/markets/common.ts +3 -2
- package/actions/morpho/markets/getMarketSnapshots.ts +23 -0
- package/actions/morpho/markets/lunarIndexerTransform.ts +11 -0
- package/actions/morpho/vaults/common.ts +15 -0
- package/environments/definitions/base/morpho-vaults.ts +28 -0
- package/environments/definitions/base/tokens.ts +28 -4
- package/errors/version.ts +1 -1
- package/package.json +1 -1
- package/types/market.ts +2 -0
|
@@ -326,6 +326,8 @@ async function fetchCoreMarketSnapshotsFromPonder(
|
|
|
326
326
|
totalBorrowsUsd: borrowUsd,
|
|
327
327
|
totalLiquidity: liquidity,
|
|
328
328
|
totalLiquidityUsd: liquidityUsd,
|
|
329
|
+
totalReallocatableLiquidity: 0,
|
|
330
|
+
totalReallocatableLiquidityUsd: 0,
|
|
329
331
|
baseSupplyApy: point.baseSupplyApy,
|
|
330
332
|
baseBorrowApy: point.baseBorrowApy,
|
|
331
333
|
collateralTokenPrice: price,
|
|
@@ -552,12 +554,17 @@ export async function fetchIsolatedMarketSnapshots(
|
|
|
552
554
|
collateralTokenPrice > 0
|
|
553
555
|
? snapshot.totalLiquidityUsd / collateralTokenPrice
|
|
554
556
|
: snapshot.totalLiquidity;
|
|
557
|
+
const totalReallocatableLiquidity =
|
|
558
|
+
collateralTokenPrice > 0
|
|
559
|
+
? snapshot.totalReallocatableLiquidityUsd / collateralTokenPrice
|
|
560
|
+
: snapshot.totalReallocatableLiquidity;
|
|
555
561
|
|
|
556
562
|
return {
|
|
557
563
|
...snapshot,
|
|
558
564
|
collateralTokenPrice,
|
|
559
565
|
totalSupply,
|
|
560
566
|
totalLiquidity,
|
|
567
|
+
totalReallocatableLiquidity,
|
|
561
568
|
};
|
|
562
569
|
});
|
|
563
570
|
}
|
|
@@ -790,6 +797,8 @@ async function fetchIsolatedMarketSnapshotsFromBlueApi(
|
|
|
790
797
|
totalSupplyUsd: Number(supplyAssetsUsd.y),
|
|
791
798
|
totalLiquidity,
|
|
792
799
|
totalLiquidityUsd: Number(liquidityAssetsUsd.y),
|
|
800
|
+
totalReallocatableLiquidity: 0,
|
|
801
|
+
totalReallocatableLiquidityUsd: 0,
|
|
793
802
|
baseSupplyApy: supplyApy.y,
|
|
794
803
|
baseBorrowApy: borrowApy.y,
|
|
795
804
|
loanTokenPrice,
|
|
@@ -54,8 +54,68 @@ type MerklReward = {
|
|
|
54
54
|
pending: string;
|
|
55
55
|
};
|
|
56
56
|
|
|
57
|
+
type MerklCampaign = {
|
|
58
|
+
campaignId: string;
|
|
59
|
+
apr: number;
|
|
60
|
+
startTimestamp: number;
|
|
61
|
+
endTimestamp: number;
|
|
62
|
+
params: {
|
|
63
|
+
targetToken: string;
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
type CampaignIdsCache = {
|
|
68
|
+
ids: string[];
|
|
69
|
+
fetchedAt: number;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const MOONWELL_MERKL_CREATOR = "0x8b621804a7637b781e2BbD58e256a591F2dF7d51";
|
|
73
|
+
const CAMPAIGN_IDS_CACHE_TTL_MS = 4 * 60 * 60 * 1000; // 4 hours
|
|
57
74
|
const MAX_BREAKDOWN_PAGES = 10;
|
|
58
75
|
|
|
76
|
+
let campaignIdsCache: CampaignIdsCache | null = null;
|
|
77
|
+
|
|
78
|
+
/** Resets the in-memory campaign IDs cache. Intended for use in tests only. */
|
|
79
|
+
export function resetMerklCampaignIdsCache(): void {
|
|
80
|
+
campaignIdsCache = null;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Fetches all Moonwell Merkl campaign IDs from the API.
|
|
85
|
+
* Results are cached in memory for 4 hours since campaigns only change monthly.
|
|
86
|
+
*/
|
|
87
|
+
export async function getMerklCampaignIds(): Promise<string[]> {
|
|
88
|
+
const now = Date.now();
|
|
89
|
+
if (
|
|
90
|
+
campaignIdsCache !== null &&
|
|
91
|
+
now - campaignIdsCache.fetchedAt < CAMPAIGN_IDS_CACHE_TTL_MS
|
|
92
|
+
) {
|
|
93
|
+
return campaignIdsCache.ids;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
try {
|
|
97
|
+
const response = await fetch(
|
|
98
|
+
`https://api.merkl.xyz/v4/campaigns?creatorAddress=${MOONWELL_MERKL_CREATOR}&excludeSubCampaigns=true&items=100`,
|
|
99
|
+
{ headers: MOONWELL_FETCH_JSON_HEADERS },
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
if (!response.ok) {
|
|
103
|
+
console.warn(
|
|
104
|
+
`Merkl API request failed: ${response.status} ${response.statusText}`,
|
|
105
|
+
);
|
|
106
|
+
return campaignIdsCache?.ids ?? [];
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const data = (await response.json()) as MerklCampaign[];
|
|
110
|
+
const ids = data.map((c) => c.campaignId);
|
|
111
|
+
campaignIdsCache = { ids, fetchedAt: now };
|
|
112
|
+
return ids;
|
|
113
|
+
} catch (error) {
|
|
114
|
+
console.error("Error in getMerklCampaignIds:", error);
|
|
115
|
+
return campaignIdsCache?.ids ?? [];
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
59
119
|
export async function getMerklRewardsData(
|
|
60
120
|
campaignId: string[],
|
|
61
121
|
chainId: number,
|
|
@@ -152,13 +212,15 @@ export async function getMerklRewardsData(
|
|
|
152
212
|
}
|
|
153
213
|
}
|
|
154
214
|
|
|
155
|
-
export async function getMerklStakingApr(
|
|
215
|
+
export async function getMerklStakingApr(
|
|
216
|
+
contractAddress: string,
|
|
217
|
+
): Promise<number> {
|
|
218
|
+
const now = Math.floor(Date.now() / 1000);
|
|
219
|
+
|
|
156
220
|
try {
|
|
157
221
|
const response = await fetch(
|
|
158
|
-
`https://api.merkl.xyz/v4/campaigns?
|
|
159
|
-
{
|
|
160
|
-
headers: MOONWELL_FETCH_JSON_HEADERS,
|
|
161
|
-
},
|
|
222
|
+
`https://api.merkl.xyz/v4/campaigns?creatorAddress=${MOONWELL_MERKL_CREATOR}&excludeSubCampaigns=true&items=100`,
|
|
223
|
+
{ headers: MOONWELL_FETCH_JSON_HEADERS },
|
|
162
224
|
);
|
|
163
225
|
|
|
164
226
|
if (!response.ok) {
|
|
@@ -168,9 +230,15 @@ export async function getMerklStakingApr(campaignId: string): Promise<number> {
|
|
|
168
230
|
return 0;
|
|
169
231
|
}
|
|
170
232
|
|
|
171
|
-
const data = (await response.json()) as
|
|
233
|
+
const data = (await response.json()) as MerklCampaign[];
|
|
172
234
|
|
|
173
|
-
return data
|
|
235
|
+
return data
|
|
236
|
+
.filter((c) => c.startTimestamp <= now && c.endTimestamp >= now)
|
|
237
|
+
.filter(
|
|
238
|
+
(c) =>
|
|
239
|
+
c.params.targetToken.toLowerCase() === contractAddress.toLowerCase(),
|
|
240
|
+
)
|
|
241
|
+
.reduce((acc, c) => acc + Number(c.apr), 0);
|
|
174
242
|
} catch (error) {
|
|
175
243
|
console.error("Error in getMerklStakingApr:", error);
|
|
176
244
|
return 0;
|
|
@@ -87,9 +87,14 @@ export async function getStakingInfo<
|
|
|
87
87
|
)
|
|
88
88
|
.filter((val) => val !== undefined);
|
|
89
89
|
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
|
|
90
|
+
const baseEnv = envsWithStaking.find((env) => env.chainId === base.id);
|
|
91
|
+
const stakingTokenKey = baseEnv?.config.contracts.stakingToken;
|
|
92
|
+
const baseStkToken =
|
|
93
|
+
baseEnv != null && stakingTokenKey != null
|
|
94
|
+
? baseEnv.config.tokens[stakingTokenKey]
|
|
95
|
+
: undefined;
|
|
96
|
+
const baseStakingApr =
|
|
97
|
+
baseStkToken != null ? await getMerklStakingApr(baseStkToken.address) : 0;
|
|
93
98
|
|
|
94
99
|
const result = envsWithStaking.flatMap((curr, index) => {
|
|
95
100
|
const token =
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
publicEnvironments,
|
|
10
10
|
} from "../../environments/index.js";
|
|
11
11
|
import type { UserStakingInfo } from "../../types/staking.js";
|
|
12
|
-
import { getMerklRewardsData } from "./common.js";
|
|
12
|
+
import { getMerklCampaignIds, getMerklRewardsData } from "./common.js";
|
|
13
13
|
|
|
14
14
|
export type GetUserStakingInfoParameters<
|
|
15
15
|
environments,
|
|
@@ -55,18 +55,9 @@ export async function getUserStakingInfo<
|
|
|
55
55
|
}),
|
|
56
56
|
);
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
const campaignIds = await getMerklCampaignIds();
|
|
59
59
|
const merklRewards = await getMerklRewardsData(
|
|
60
|
-
|
|
61
|
-
"0xcd60ff26dc0b43f14c995c494bc5650087eaae68b279bdbe85e0e8eaa11fd513",
|
|
62
|
-
"0xf2c5b7dd2d3416d3853bcf1e93c1cfdb7b5b5fda079d36408df02f731f7d1499",
|
|
63
|
-
"0x0761f42dda11caa8ef9d8f46a12fc13f073bd11153ff16ac0177c59a536f68ee",
|
|
64
|
-
"0x78a35e1cb13a476120a0d7efa669deda6578d46f8ecc708621291df87e90252b",
|
|
65
|
-
"0xf9e12deb62df71ffe6527b8f9000f93d3f783b3a58f7ec3f2be52cb9156608f3",
|
|
66
|
-
"0xc21b035371d3e8af5b81024a6fe9b713cb047d8c6dbaa4663a5aac9e76663c50",
|
|
67
|
-
"0x0c3ec6a807049edd368e2493b6ab1f71557384c248013f5eee9cb375eead5faa",
|
|
68
|
-
"0xd6481eec8f9bd0d7c3d8ea71ea46df738497264effa46fa0b796c0e65c6c7427",
|
|
69
|
-
],
|
|
60
|
+
campaignIds,
|
|
70
61
|
base.id,
|
|
71
62
|
userAddress,
|
|
72
63
|
);
|
|
@@ -40,6 +40,8 @@ export function transformMarketSnapshot(
|
|
|
40
40
|
totalBorrowsUsd: Number(lunar.totalBorrowsUSD),
|
|
41
41
|
totalLiquidity: Number(lunar.totalLiquidity),
|
|
42
42
|
totalLiquidityUsd: Number(lunar.totalLiquidityUSD),
|
|
43
|
+
totalReallocatableLiquidity: 0,
|
|
44
|
+
totalReallocatableLiquidityUsd: 0,
|
|
43
45
|
baseSupplyApy: Number(lunar.baseSupplyApy),
|
|
44
46
|
baseBorrowApy: Number(lunar.baseBorrowApy),
|
|
45
47
|
timestamp: Number(lunar.timestamp) * 1000, // Convert unix timestamp to milliseconds
|
|
@@ -718,12 +718,13 @@ async function getMorphoMarketRewards(
|
|
|
718
718
|
|
|
719
719
|
if (result) {
|
|
720
720
|
const markets = result.markets.items.map((item) => {
|
|
721
|
+
const loanAssetDecimals = item.loanAsset.decimals;
|
|
721
722
|
const mapping: GetMorphoMarketsRewardsReturnType = {
|
|
722
723
|
chainId: item.morphoBlue.chain.id,
|
|
723
724
|
marketId: item.uniqueKey,
|
|
724
725
|
reallocatableLiquidityAssets: new Amount(
|
|
725
726
|
BigInt(item.reallocatableLiquidityAssets),
|
|
726
|
-
|
|
727
|
+
loanAssetDecimals,
|
|
727
728
|
),
|
|
728
729
|
// Note: The Morpho GraphQL API may return null for collateralAssets and
|
|
729
730
|
// collateralAssetsUsd for markets with no collateral deposited or during data sync.
|
|
@@ -738,7 +739,7 @@ async function getMorphoMarketRewards(
|
|
|
738
739
|
collateralAssetsUsd: item.state.collateralAssetsUsd ?? null,
|
|
739
740
|
publicAllocatorSharedLiquidity: item.publicAllocatorSharedLiquidity.map(
|
|
740
741
|
(item) => ({
|
|
741
|
-
assets: Number(item.assets),
|
|
742
|
+
assets: Number(item.assets) / 10 ** loanAssetDecimals,
|
|
742
743
|
vault: {
|
|
743
744
|
address: item.vault.address,
|
|
744
745
|
name: item.vault.name,
|
|
@@ -16,9 +16,11 @@ export type MarketSnapshot = {
|
|
|
16
16
|
totalSupplyAssets: Amount;
|
|
17
17
|
totalBorrowAssets: Amount;
|
|
18
18
|
totalLiquidity: Amount;
|
|
19
|
+
totalReallocatableLiquidity: Amount;
|
|
19
20
|
totalSupplyAssetsUsd: number;
|
|
20
21
|
totalBorrowAssetsUsd: number;
|
|
21
22
|
totalLiquidityUsd: number;
|
|
23
|
+
totalReallocatableLiquidityUsd: number;
|
|
22
24
|
loanTokenPrice: number;
|
|
23
25
|
collateralTokenPrice: number;
|
|
24
26
|
supplyApy: number;
|
|
@@ -105,9 +107,16 @@ export async function getMarketSnapshots<
|
|
|
105
107
|
BigInt(Math.round(s.totalLiquidity * 10 ** loanToken.decimals)),
|
|
106
108
|
loanToken.decimals,
|
|
107
109
|
),
|
|
110
|
+
totalReallocatableLiquidity: new Amount(
|
|
111
|
+
BigInt(
|
|
112
|
+
Math.round(s.totalReallocatableLiquidity * 10 ** loanToken.decimals),
|
|
113
|
+
),
|
|
114
|
+
loanToken.decimals,
|
|
115
|
+
),
|
|
108
116
|
totalSupplyAssetsUsd: s.totalSupplyUsd,
|
|
109
117
|
totalBorrowAssetsUsd: s.totalBorrowsUsd,
|
|
110
118
|
totalLiquidityUsd: s.totalLiquidityUsd,
|
|
119
|
+
totalReallocatableLiquidityUsd: s.totalReallocatableLiquidityUsd,
|
|
111
120
|
loanTokenPrice: s.loanTokenPrice,
|
|
112
121
|
collateralTokenPrice: s.collateralTokenPrice,
|
|
113
122
|
supplyApy: s.baseSupplyApy,
|
|
@@ -181,15 +190,29 @@ export async function getMarketSnapshots<
|
|
|
181
190
|
loanToken.decimals,
|
|
182
191
|
);
|
|
183
192
|
|
|
193
|
+
const totalReallocatableLiquidity = new Amount(
|
|
194
|
+
BigInt(
|
|
195
|
+
Math.floor(
|
|
196
|
+
Number.parseFloat(snapshot.totalReallocatableLiquidity ?? "0") *
|
|
197
|
+
10 ** loanToken.decimals,
|
|
198
|
+
),
|
|
199
|
+
),
|
|
200
|
+
loanToken.decimals,
|
|
201
|
+
);
|
|
202
|
+
|
|
184
203
|
return {
|
|
185
204
|
timestamp: snapshot.timestamp,
|
|
186
205
|
blockNumber: BigInt(snapshot.blockNumber),
|
|
187
206
|
totalSupplyAssets,
|
|
188
207
|
totalBorrowAssets,
|
|
189
208
|
totalLiquidity,
|
|
209
|
+
totalReallocatableLiquidity,
|
|
190
210
|
totalSupplyAssetsUsd: Number.parseFloat(snapshot.totalSupplyAssetsUsd),
|
|
191
211
|
totalBorrowAssetsUsd: Number.parseFloat(snapshot.totalBorrowAssetsUsd),
|
|
192
212
|
totalLiquidityUsd: Number.parseFloat(snapshot.totalLiquidityUsd),
|
|
213
|
+
totalReallocatableLiquidityUsd: Number.parseFloat(
|
|
214
|
+
snapshot.totalReallocatableLiquidityUsd ?? "0",
|
|
215
|
+
),
|
|
193
216
|
loanTokenPrice: Number.parseFloat(snapshot.loanTokenPrice),
|
|
194
217
|
collateralTokenPrice: Number.parseFloat(snapshot.collateralTokenPrice),
|
|
195
218
|
supplyApy: Number.parseFloat(snapshot.supplyApy),
|
|
@@ -82,6 +82,8 @@ export type LunarIndexerMarketSnapshot = {
|
|
|
82
82
|
totalSupplyAssetsUsd: string;
|
|
83
83
|
totalBorrowAssetsUsd: string;
|
|
84
84
|
totalLiquidityUsd: string;
|
|
85
|
+
totalReallocatableLiquidity?: string;
|
|
86
|
+
totalReallocatableLiquidityUsd?: string;
|
|
85
87
|
loanTokenPrice: string;
|
|
86
88
|
collateralTokenPrice: string;
|
|
87
89
|
supplyApy: string;
|
|
@@ -125,6 +127,13 @@ export function transformIsolatedMarketSnapshotFromIndexer(
|
|
|
125
127
|
? totalLiquidityUsd / collateralTokenPrice
|
|
126
128
|
: Number.parseFloat(snapshot.totalLiquidity);
|
|
127
129
|
|
|
130
|
+
const totalReallocatableLiquidity = Number.parseFloat(
|
|
131
|
+
snapshot.totalReallocatableLiquidity ?? "0",
|
|
132
|
+
);
|
|
133
|
+
const totalReallocatableLiquidityUsd = Number.parseFloat(
|
|
134
|
+
snapshot.totalReallocatableLiquidityUsd ?? "0",
|
|
135
|
+
);
|
|
136
|
+
|
|
128
137
|
return {
|
|
129
138
|
chainId: snapshot.chainId,
|
|
130
139
|
marketId: snapshot.marketId.toLowerCase(),
|
|
@@ -135,6 +144,8 @@ export function transformIsolatedMarketSnapshotFromIndexer(
|
|
|
135
144
|
totalBorrowsUsd: Number.parseFloat(snapshot.totalBorrowAssetsUsd),
|
|
136
145
|
totalLiquidity,
|
|
137
146
|
totalLiquidityUsd,
|
|
147
|
+
totalReallocatableLiquidity,
|
|
148
|
+
totalReallocatableLiquidityUsd,
|
|
138
149
|
baseSupplyApy: Number.parseFloat(snapshot.supplyApy),
|
|
139
150
|
baseBorrowApy: Number.parseFloat(snapshot.borrowApy),
|
|
140
151
|
loanTokenPrice,
|
|
@@ -847,6 +847,21 @@ async function getMorphoVaultsDataFromOnChain(params: {
|
|
|
847
847
|
},
|
|
848
848
|
);
|
|
849
849
|
|
|
850
|
+
// For V2 vaults, normalize allocations to reflect deployed asset distribution
|
|
851
|
+
// V2 vaults may have idle capital not deployed to adapters, which causes
|
|
852
|
+
// raw allocations to sum to less than 100% of total vault assets
|
|
853
|
+
if (vaultConfig.version === 2) {
|
|
854
|
+
const totalAllocation = markets.reduce(
|
|
855
|
+
(sum, m) => sum + m.allocation,
|
|
856
|
+
0,
|
|
857
|
+
);
|
|
858
|
+
if (totalAllocation > 0) {
|
|
859
|
+
for (const market of markets) {
|
|
860
|
+
market.allocation = market.allocation / totalAllocation;
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
}
|
|
864
|
+
|
|
850
865
|
// Only calculate baseApy from markets for v1 vaults
|
|
851
866
|
// v2 vaults already have baseApy from Morpho API
|
|
852
867
|
if (vaultConfig.version !== 2) {
|
|
@@ -9,24 +9,52 @@ export const vaults = createVaultConfig({
|
|
|
9
9
|
vaultToken: "mwETH",
|
|
10
10
|
campaignId:
|
|
11
11
|
"0x1df9a935f6b928b4809c4fda483f16839140864b2b412cc5fea85fd5d9d00e57",
|
|
12
|
+
version: 2,
|
|
13
|
+
},
|
|
14
|
+
mwETHv1: {
|
|
15
|
+
underlyingToken: "ETH",
|
|
16
|
+
vaultToken: "mwETHv1",
|
|
17
|
+
campaignId:
|
|
18
|
+
"0x1df9a935f6b928b4809c4fda483f16839140864b2b412cc5fea85fd5d9d00e57",
|
|
12
19
|
},
|
|
13
20
|
mwUSDC: {
|
|
14
21
|
underlyingToken: "USDC",
|
|
15
22
|
vaultToken: "mwUSDC",
|
|
16
23
|
campaignId:
|
|
17
24
|
"0xec43a3d75ae25c5255eb06b3aac6b79ccb2cdb6b99740ea13553661b0f06b756",
|
|
25
|
+
version: 2,
|
|
26
|
+
},
|
|
27
|
+
mwUSDCv1: {
|
|
28
|
+
underlyingToken: "USDC",
|
|
29
|
+
vaultToken: "mwUSDCv1",
|
|
30
|
+
campaignId:
|
|
31
|
+
"0xec43a3d75ae25c5255eb06b3aac6b79ccb2cdb6b99740ea13553661b0f06b756",
|
|
18
32
|
},
|
|
19
33
|
mwEURC: {
|
|
20
34
|
underlyingToken: "EURC",
|
|
21
35
|
vaultToken: "mwEURC",
|
|
22
36
|
campaignId:
|
|
23
37
|
"0x03430078e052d58b6e80fa8e373c38a75736f1d24768b9c92a2e44bc4ce62b1d",
|
|
38
|
+
version: 2,
|
|
39
|
+
},
|
|
40
|
+
mwEURCv1: {
|
|
41
|
+
underlyingToken: "EURC",
|
|
42
|
+
vaultToken: "mwEURCv1",
|
|
43
|
+
campaignId:
|
|
44
|
+
"0x03430078e052d58b6e80fa8e373c38a75736f1d24768b9c92a2e44bc4ce62b1d",
|
|
24
45
|
},
|
|
25
46
|
mwcbBTC: {
|
|
26
47
|
underlyingToken: "cbBTC",
|
|
27
48
|
vaultToken: "mwcbBTC",
|
|
28
49
|
campaignId:
|
|
29
50
|
"0xb230a09331c22280ae3e02a65caad21a553274912352d8f93c7a92c0f9bb3da4",
|
|
51
|
+
version: 2,
|
|
52
|
+
},
|
|
53
|
+
mwcbBTCv1: {
|
|
54
|
+
underlyingToken: "cbBTC",
|
|
55
|
+
vaultToken: "mwcbBTCv1",
|
|
56
|
+
campaignId:
|
|
57
|
+
"0xb230a09331c22280ae3e02a65caad21a553274912352d8f93c7a92c0f9bb3da4",
|
|
30
58
|
},
|
|
31
59
|
meUSDC: {
|
|
32
60
|
underlyingToken: "USDC",
|
|
@@ -141,29 +141,53 @@ export const tokens = createTokenConfig({
|
|
|
141
141
|
symbol: "mEURC",
|
|
142
142
|
},
|
|
143
143
|
mwETH: {
|
|
144
|
-
address: "
|
|
144
|
+
address: "0x89BeDBB1C4837444Da215A377275Ff96A84D6f53",
|
|
145
145
|
decimals: 18,
|
|
146
146
|
name: "Moonwell Flagship ETH",
|
|
147
147
|
symbol: "mwETH",
|
|
148
148
|
},
|
|
149
|
+
mwETHv1: {
|
|
150
|
+
address: "0xa0E430870c4604CcfC7B38Ca7845B1FF653D0ff1",
|
|
151
|
+
decimals: 18,
|
|
152
|
+
name: "Moonwell Flagship ETH V1",
|
|
153
|
+
symbol: "mwETHv1",
|
|
154
|
+
},
|
|
149
155
|
mwUSDC: {
|
|
150
|
-
address: "
|
|
156
|
+
address: "0x48a90E85be5C56b0A669985A12ee7C449fC79965",
|
|
151
157
|
decimals: 18,
|
|
152
158
|
name: "Moonwell Flagship USDC",
|
|
153
159
|
symbol: "mwUSDC",
|
|
154
160
|
},
|
|
161
|
+
mwUSDCv1: {
|
|
162
|
+
address: "0xc1256Ae5FF1cf2719D4937adb3bbCCab2E00A2Ca",
|
|
163
|
+
decimals: 18,
|
|
164
|
+
name: "Moonwell Flagship USDC V1",
|
|
165
|
+
symbol: "mwUSDCv1",
|
|
166
|
+
},
|
|
155
167
|
mwEURC: {
|
|
156
|
-
address: "
|
|
168
|
+
address: "0x5083b1387Ec3d4Ee6467B83890D98f1AF93F7c48",
|
|
157
169
|
decimals: 18,
|
|
158
170
|
name: "Moonwell Flagship EURC",
|
|
159
171
|
symbol: "mwEURC",
|
|
160
172
|
},
|
|
173
|
+
mwEURCv1: {
|
|
174
|
+
address: "0xf24608E0CCb972b0b0f4A6446a0BBf58c701a026",
|
|
175
|
+
decimals: 18,
|
|
176
|
+
name: "Moonwell Flagship EURC V1",
|
|
177
|
+
symbol: "mwEURCv1",
|
|
178
|
+
},
|
|
161
179
|
mwcbBTC: {
|
|
162
|
-
address: "
|
|
180
|
+
address: "0xdbA76Bc542bb07538e046B40F2e8a215B409F7A8",
|
|
163
181
|
decimals: 18,
|
|
164
182
|
name: "Moonwell Frontier cbBTC",
|
|
165
183
|
symbol: "mwcbBTC",
|
|
166
184
|
},
|
|
185
|
+
mwcbBTCv1: {
|
|
186
|
+
address: "0x543257eF2161176D7C8cD90BA65C2d4CaEF5a796",
|
|
187
|
+
decimals: 18,
|
|
188
|
+
name: "Moonwell Frontier cbBTC V1",
|
|
189
|
+
symbol: "mwcbBTCv1",
|
|
190
|
+
},
|
|
167
191
|
WELL: {
|
|
168
192
|
address: "0xA88594D404727625A9437C3f886C7643872296AE",
|
|
169
193
|
decimals: 18,
|
package/errors/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = '0.10.
|
|
1
|
+
export const version = '0.10.4'
|
package/package.json
CHANGED
package/types/market.ts
CHANGED
|
@@ -51,6 +51,8 @@ export type MarketSnapshot = {
|
|
|
51
51
|
totalBorrowsUsd: number;
|
|
52
52
|
totalLiquidity: number;
|
|
53
53
|
totalLiquidityUsd: number;
|
|
54
|
+
totalReallocatableLiquidity: number;
|
|
55
|
+
totalReallocatableLiquidityUsd: number;
|
|
54
56
|
baseSupplyApy: number;
|
|
55
57
|
baseBorrowApy: number;
|
|
56
58
|
loanTokenPrice: number;
|