@moonwell-fi/moonwell-sdk 0.10.1 → 0.10.3
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/common.js +17 -7
- package/_cjs/actions/core/markets/common.js.map +1 -1
- package/_cjs/actions/core/markets/getMarkets.js +17 -7
- package/_cjs/actions/core/markets/getMarkets.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/getDelegates.js +17 -7
- package/_cjs/actions/governance/getDelegates.js.map +1 -1
- package/_cjs/actions/governance/getDiscussions.js +17 -7
- package/_cjs/actions/governance/getDiscussions.js.map +1 -1
- package/_cjs/actions/governance/getGovernanceTokenInfo.js +17 -7
- package/_cjs/actions/governance/getGovernanceTokenInfo.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/governance/proposals/getProposals.js +17 -7
- package/_cjs/actions/governance/proposals/getProposals.js.map +1 -1
- package/_cjs/actions/governance/snapshot/getSnapshotProposals.js +17 -7
- package/_cjs/actions/governance/snapshot/getSnapshotProposals.js.map +1 -1
- package/_cjs/actions/morpho/markets/getMorphoMarkets.js +17 -7
- package/_cjs/actions/morpho/markets/getMorphoMarkets.js.map +1 -1
- package/_cjs/actions/morpho/user-rewards/common.js +62 -89
- package/_cjs/actions/morpho/user-rewards/common.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/actions/morpho/vaults/getMorphoVaults.js +17 -7
- package/_cjs/actions/morpho/vaults/getMorphoVaults.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/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/morpho/user-rewards/common.js +71 -96
- package/_esm/actions/morpho/user-rewards/common.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/common.d.ts.map +1 -1
- package/_types/actions/core/user-positions/common.d.ts.map +1 -1
- package/_types/actions/core/user-rewards/common.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/governance/proposals/common.d.ts.map +1 -1
- package/_types/actions/governance/snapshot/common.d.ts.map +1 -1
- package/_types/actions/morpho/user-rewards/common.d.ts.map +1 -1
- package/_types/actions/morpho/utils/accrueInterests.d.ts.map +1 -1
- package/_types/actions/morpho/utils/math.d.ts.map +1 -1
- package/_types/actions/morpho/vaults/common.d.ts.map +1 -1
- package/_types/client/createActions.d.ts.map +1 -1
- package/_types/client/createMoonwellClient.d.ts +107 -2433
- package/_types/client/createMoonwellClient.d.ts.map +1 -1
- package/_types/common/index.d.ts.map +1 -1
- package/_types/environments/definitions/arbitrum/environment.d.ts.map +1 -1
- package/_types/environments/definitions/avalanche/environment.d.ts.map +1 -1
- package/_types/environments/definitions/base/environment.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/definitions/ethereum/environment.d.ts.map +1 -1
- package/_types/environments/definitions/moonbeam/environment.d.ts.map +1 -1
- package/_types/environments/definitions/moonriver/environment.d.ts.map +1 -1
- package/_types/environments/definitions/optimism/environment.d.ts.map +1 -1
- package/_types/environments/definitions/polygon/environment.d.ts.map +1 -1
- package/_types/environments/index.d.ts +52 -4
- package/_types/environments/index.d.ts.map +1 -1
- package/_types/environments/types/config.d.ts.map +1 -1
- package/_types/environments/utils/index.d.ts.map +1 -1
- package/_types/errors/version.d.ts +1 -1
- package/actions/governance/common.ts +75 -7
- package/actions/governance/getStakingInfo.ts +8 -3
- package/actions/governance/getUserStakingInfo.ts +3 -12
- package/actions/morpho/user-rewards/common.ts +113 -226
- 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
|
@@ -20,17 +20,19 @@ export async function getUserMorphoRewardsData(params: {
|
|
|
20
20
|
environment: Environment;
|
|
21
21
|
account: `0x${string}`;
|
|
22
22
|
}): Promise<MorphoUserReward[]> {
|
|
23
|
-
const
|
|
24
|
-
params.environment
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
const isFullDeployment =
|
|
24
|
+
params.environment.custom.morpho?.minimalDeployment === false;
|
|
25
|
+
|
|
26
|
+
const emptyMorphoRewards: MorphoRewardsResponse[] = [];
|
|
27
|
+
const [merklRewards, morphoRewards] = await Promise.all([
|
|
28
|
+
getMerklRewardsData(params.environment, params.account),
|
|
29
|
+
isFullDeployment
|
|
30
|
+
? getMorphoRewardsData(params.environment, params.account)
|
|
31
|
+
: Promise.resolve(emptyMorphoRewards),
|
|
32
|
+
]);
|
|
27
33
|
|
|
28
|
-
if (
|
|
29
|
-
|
|
30
|
-
params.environment,
|
|
31
|
-
params.account,
|
|
32
|
-
);
|
|
33
|
-
// Process Morpho rewards
|
|
34
|
+
if (isFullDeployment) {
|
|
35
|
+
// Process Morpho rewards (GraphQL query depends on morphoRewards result)
|
|
34
36
|
const morphoAssets = await getMorphoAssetsData(
|
|
35
37
|
params.environment,
|
|
36
38
|
morphoRewards.map((r) => r.asset.address),
|
|
@@ -189,6 +191,28 @@ export async function getUserMorphoRewardsData(params: {
|
|
|
189
191
|
);
|
|
190
192
|
|
|
191
193
|
// Process Merkl rewards
|
|
194
|
+
const vaultCampaignIds = new Set<string>(
|
|
195
|
+
(Object.values(publicEnvironments) as Environment[]).flatMap(
|
|
196
|
+
(environment) =>
|
|
197
|
+
Object.values(environment.config.vaults ?? {})
|
|
198
|
+
.map((vault) => vault.campaignId)
|
|
199
|
+
.filter((id): id is string => id !== undefined),
|
|
200
|
+
),
|
|
201
|
+
);
|
|
202
|
+
|
|
203
|
+
const getVaultRewardAmount = (
|
|
204
|
+
breakdowns: any[],
|
|
205
|
+
field: "amount" | "claimed" | "pending",
|
|
206
|
+
) => {
|
|
207
|
+
return breakdowns.reduce(
|
|
208
|
+
(acc, curr) =>
|
|
209
|
+
vaultCampaignIds.has(curr.campaignId)
|
|
210
|
+
? acc + BigInt(curr[field])
|
|
211
|
+
: acc,
|
|
212
|
+
0n,
|
|
213
|
+
);
|
|
214
|
+
};
|
|
215
|
+
|
|
192
216
|
const merklResult: MorphoUserReward[] = [];
|
|
193
217
|
|
|
194
218
|
for (const chainData of merklRewards) {
|
|
@@ -205,30 +229,6 @@ export async function getUserMorphoRewardsData(params: {
|
|
|
205
229
|
name: morphoAsset?.name ?? reward.token.symbol,
|
|
206
230
|
};
|
|
207
231
|
|
|
208
|
-
const getVaultRewardAmount = (
|
|
209
|
-
breakdowns: any[],
|
|
210
|
-
field: "amount" | "claimed" | "pending",
|
|
211
|
-
) => {
|
|
212
|
-
return breakdowns.reduce((acc, curr) => {
|
|
213
|
-
// Check if campaign exists in vaults across all chains
|
|
214
|
-
const isVaultCampaign = Object.values(publicEnvironments).some(
|
|
215
|
-
(environment) => {
|
|
216
|
-
// Check if environment has vaults
|
|
217
|
-
if (
|
|
218
|
-
environment.config.vaults &&
|
|
219
|
-
Object.keys(environment.config.vaults).length > 0
|
|
220
|
-
) {
|
|
221
|
-
return Object.values(environment.config.vaults).some(
|
|
222
|
-
(vault) => vault.campaignId === curr.campaignId,
|
|
223
|
-
);
|
|
224
|
-
}
|
|
225
|
-
return false;
|
|
226
|
-
},
|
|
227
|
-
);
|
|
228
|
-
return isVaultCampaign ? acc + BigInt(curr[field]) : acc;
|
|
229
|
-
}, 0n);
|
|
230
|
-
};
|
|
231
|
-
|
|
232
232
|
const amount = getVaultRewardAmount(reward.breakdowns, "amount");
|
|
233
233
|
const claimed = getVaultRewardAmount(reward.breakdowns, "claimed");
|
|
234
234
|
const pending = getVaultRewardAmount(reward.breakdowns, "pending");
|
|
@@ -319,6 +319,69 @@ export async function getUserMorphoStakingRewardsData(params: {
|
|
|
319
319
|
return [];
|
|
320
320
|
}
|
|
321
321
|
|
|
322
|
+
// Hoist shared contract reads outside the per-vault loop
|
|
323
|
+
const homeEnvironment =
|
|
324
|
+
(Object.values(publicEnvironments) as Environment[]).find((e) =>
|
|
325
|
+
e.custom?.governance?.chainIds?.includes(params.environment.chainId),
|
|
326
|
+
) || params.environment;
|
|
327
|
+
|
|
328
|
+
const viewsContract = params.environment.contracts.views;
|
|
329
|
+
const homeViewsContract = homeEnvironment.contracts.views;
|
|
330
|
+
|
|
331
|
+
const [allMarkets, nativeTokenPriceRaw, governanceTokenPriceRaw] =
|
|
332
|
+
await Promise.all([
|
|
333
|
+
viewsContract?.read.getAllMarketsInfo(),
|
|
334
|
+
homeViewsContract?.read.getNativeTokenPrice(),
|
|
335
|
+
homeViewsContract?.read.getGovernanceTokenPrice(),
|
|
336
|
+
]);
|
|
337
|
+
|
|
338
|
+
const governanceTokenPrice = new Amount(governanceTokenPriceRaw || 0n, 18);
|
|
339
|
+
const nativeTokenPrice = new Amount(nativeTokenPriceRaw || 0n, 18);
|
|
340
|
+
|
|
341
|
+
let tokenPrices =
|
|
342
|
+
allMarkets
|
|
343
|
+
?.map((marketInfo) => {
|
|
344
|
+
const marketFound = findMarketByAddress(
|
|
345
|
+
params.environment,
|
|
346
|
+
marketInfo.market,
|
|
347
|
+
);
|
|
348
|
+
if (marketFound) {
|
|
349
|
+
return {
|
|
350
|
+
token: marketFound.underlyingToken,
|
|
351
|
+
tokenPrice: new Amount(
|
|
352
|
+
marketInfo.underlyingPrice,
|
|
353
|
+
36 - marketFound.underlyingToken.decimals,
|
|
354
|
+
),
|
|
355
|
+
};
|
|
356
|
+
} else {
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
})
|
|
360
|
+
.filter((token) => !!token) || [];
|
|
361
|
+
|
|
362
|
+
// Add governance token to token prices
|
|
363
|
+
if (params.environment.custom?.governance?.token) {
|
|
364
|
+
tokenPrices = [
|
|
365
|
+
...tokenPrices,
|
|
366
|
+
{
|
|
367
|
+
token:
|
|
368
|
+
params.environment.config.tokens[
|
|
369
|
+
params.environment.custom.governance.token
|
|
370
|
+
]!,
|
|
371
|
+
tokenPrice: governanceTokenPrice,
|
|
372
|
+
},
|
|
373
|
+
];
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
// Add native token to token prices
|
|
377
|
+
tokenPrices = [
|
|
378
|
+
...tokenPrices,
|
|
379
|
+
{
|
|
380
|
+
token: findTokenByAddress(params.environment, zeroAddress)!,
|
|
381
|
+
tokenPrice: nativeTokenPrice,
|
|
382
|
+
},
|
|
383
|
+
];
|
|
384
|
+
|
|
322
385
|
const rewards = await Promise.all(
|
|
323
386
|
vaultsWithStaking.map(async (vault) => {
|
|
324
387
|
if (!vault.multiReward) return [];
|
|
@@ -329,73 +392,6 @@ export async function getUserMorphoStakingRewardsData(params: {
|
|
|
329
392
|
vault.multiReward,
|
|
330
393
|
);
|
|
331
394
|
|
|
332
|
-
const homeEnvironment =
|
|
333
|
-
(Object.values(publicEnvironments) as Environment[]).find((e) =>
|
|
334
|
-
e.custom?.governance?.chainIds?.includes(params.environment.chainId),
|
|
335
|
-
) || params.environment;
|
|
336
|
-
|
|
337
|
-
const viewsContract = params.environment.contracts.views;
|
|
338
|
-
const homeViewsContract = homeEnvironment.contracts.views;
|
|
339
|
-
|
|
340
|
-
const userData = await Promise.all([
|
|
341
|
-
viewsContract?.read.getAllMarketsInfo(),
|
|
342
|
-
homeViewsContract?.read.getNativeTokenPrice(),
|
|
343
|
-
homeViewsContract?.read.getGovernanceTokenPrice(),
|
|
344
|
-
]);
|
|
345
|
-
|
|
346
|
-
const [allMarkets, nativeTokenPriceRaw, governanceTokenPriceRaw] =
|
|
347
|
-
userData;
|
|
348
|
-
|
|
349
|
-
const governanceTokenPrice = new Amount(
|
|
350
|
-
governanceTokenPriceRaw || 0n,
|
|
351
|
-
18,
|
|
352
|
-
);
|
|
353
|
-
const nativeTokenPrice = new Amount(nativeTokenPriceRaw || 0n, 18);
|
|
354
|
-
|
|
355
|
-
let tokenPrices =
|
|
356
|
-
allMarkets
|
|
357
|
-
?.map((marketInfo) => {
|
|
358
|
-
const marketFound = findMarketByAddress(
|
|
359
|
-
params.environment,
|
|
360
|
-
marketInfo.market,
|
|
361
|
-
);
|
|
362
|
-
if (marketFound) {
|
|
363
|
-
return {
|
|
364
|
-
token: marketFound.underlyingToken,
|
|
365
|
-
tokenPrice: new Amount(
|
|
366
|
-
marketInfo.underlyingPrice,
|
|
367
|
-
36 - marketFound.underlyingToken.decimals,
|
|
368
|
-
),
|
|
369
|
-
};
|
|
370
|
-
} else {
|
|
371
|
-
return;
|
|
372
|
-
}
|
|
373
|
-
})
|
|
374
|
-
.filter((token) => !!token) || [];
|
|
375
|
-
|
|
376
|
-
// Add governance token to token prices
|
|
377
|
-
if (params.environment.custom?.governance?.token) {
|
|
378
|
-
tokenPrices = [
|
|
379
|
-
...tokenPrices,
|
|
380
|
-
{
|
|
381
|
-
token:
|
|
382
|
-
params.environment.config.tokens[
|
|
383
|
-
params.environment.custom.governance.token
|
|
384
|
-
]!,
|
|
385
|
-
tokenPrice: governanceTokenPrice,
|
|
386
|
-
},
|
|
387
|
-
];
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
// Add native token to token prices
|
|
391
|
-
tokenPrices = [
|
|
392
|
-
...tokenPrices,
|
|
393
|
-
{
|
|
394
|
-
token: findTokenByAddress(params.environment, zeroAddress)!,
|
|
395
|
-
tokenPrice: nativeTokenPrice,
|
|
396
|
-
},
|
|
397
|
-
];
|
|
398
|
-
|
|
399
395
|
return vaultRewards
|
|
400
396
|
.filter((reward): reward is { amount: Amount; token: TokenConfig } => {
|
|
401
397
|
return reward !== undefined && reward.amount.value > 0;
|
|
@@ -587,140 +583,31 @@ type MerklRewardsResponse = {
|
|
|
587
583
|
}>;
|
|
588
584
|
};
|
|
589
585
|
|
|
590
|
-
// Types for Merkl Opportunities API
|
|
591
|
-
type MerklToken = {
|
|
592
|
-
id: string;
|
|
593
|
-
name: string;
|
|
594
|
-
chainId: number;
|
|
595
|
-
address: string;
|
|
596
|
-
decimals: number;
|
|
597
|
-
symbol: string;
|
|
598
|
-
displaySymbol: string;
|
|
599
|
-
icon: string;
|
|
600
|
-
verified: boolean;
|
|
601
|
-
isTest: boolean;
|
|
602
|
-
type: string;
|
|
603
|
-
isNative: boolean;
|
|
604
|
-
price: number;
|
|
605
|
-
};
|
|
606
|
-
|
|
607
|
-
type MerklRewardBreakdown = {
|
|
608
|
-
token: MerklToken;
|
|
609
|
-
amount: string;
|
|
610
|
-
value: number;
|
|
611
|
-
distributionType: string;
|
|
612
|
-
id: string;
|
|
613
|
-
timestamp: string;
|
|
614
|
-
campaignId: string;
|
|
615
|
-
dailyRewardsRecordId: string;
|
|
616
|
-
};
|
|
617
|
-
|
|
618
|
-
type MerklOpportunity = {
|
|
619
|
-
chainId: number;
|
|
620
|
-
type: string;
|
|
621
|
-
identifier: string;
|
|
622
|
-
name: string;
|
|
623
|
-
description: string;
|
|
624
|
-
howToSteps: string[];
|
|
625
|
-
status: string;
|
|
626
|
-
action: string;
|
|
627
|
-
tvl: number;
|
|
628
|
-
apr: number;
|
|
629
|
-
dailyRewards: number;
|
|
630
|
-
tags: any[];
|
|
631
|
-
id: string;
|
|
632
|
-
depositUrl: string;
|
|
633
|
-
explorerAddress: string;
|
|
634
|
-
lastCampaignCreatedAt: number;
|
|
635
|
-
aprRecord: {
|
|
636
|
-
cumulated: number;
|
|
637
|
-
timestamp: string;
|
|
638
|
-
breakdowns: {
|
|
639
|
-
distributionType: string;
|
|
640
|
-
identifier: string;
|
|
641
|
-
type: string;
|
|
642
|
-
value: number;
|
|
643
|
-
timestamp: string;
|
|
644
|
-
}[];
|
|
645
|
-
};
|
|
646
|
-
rewardsRecord: {
|
|
647
|
-
id: string;
|
|
648
|
-
total: number;
|
|
649
|
-
timestamp: string;
|
|
650
|
-
breakdowns: MerklRewardBreakdown[];
|
|
651
|
-
};
|
|
652
|
-
};
|
|
653
|
-
|
|
654
586
|
async function getMerklRewardsData(
|
|
655
587
|
environment: Environment,
|
|
656
588
|
account: Address,
|
|
657
589
|
): Promise<MerklRewardsResponse[]> {
|
|
658
590
|
try {
|
|
659
|
-
//
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
);
|
|
669
|
-
|
|
670
|
-
if (!response.ok) {
|
|
671
|
-
console.warn(
|
|
672
|
-
`Failed to fetch opportunities: ${response.status} ${response.statusText}`,
|
|
673
|
-
);
|
|
674
|
-
return [];
|
|
675
|
-
}
|
|
676
|
-
|
|
677
|
-
const data: MerklOpportunity[] = await response.json();
|
|
678
|
-
return data.flatMap((opportunity) =>
|
|
679
|
-
opportunity.rewardsRecord.breakdowns.map(
|
|
680
|
-
(breakdown) => breakdown.token.chainId,
|
|
681
|
-
),
|
|
682
|
-
);
|
|
683
|
-
} catch (error) {
|
|
684
|
-
console.warn(
|
|
685
|
-
`Error fetching opportunities for vault ${vault.vaultToken}:`,
|
|
686
|
-
error,
|
|
687
|
-
);
|
|
688
|
-
return [];
|
|
689
|
-
}
|
|
591
|
+
// Merkl campaigns always distribute rewards on the same chain as the
|
|
592
|
+
// opportunity, so environment.chainId is the only chain we need to query.
|
|
593
|
+
// The previous two-phase approach (fetch opportunities per vault → extract
|
|
594
|
+
// chain IDs → fetch rewards per chain) made N+1 HTTP calls to discover
|
|
595
|
+
// a chain ID we already know.
|
|
596
|
+
const response = await fetch(
|
|
597
|
+
`https://api.merkl.xyz/v4/users/${account}/rewards?chainId=${environment.chainId}&test=false&breakdownPage=0&reloadChainId=${environment.chainId}`,
|
|
598
|
+
{
|
|
599
|
+
headers: MOONWELL_FETCH_JSON_HEADERS,
|
|
690
600
|
},
|
|
691
601
|
);
|
|
692
602
|
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
`https://api.merkl.xyz/v4/users/${account}/rewards?chainId=${chainId}&test=false&breakdownPage=0&reloadChainId=${chainId}`,
|
|
700
|
-
{
|
|
701
|
-
headers: MOONWELL_FETCH_JSON_HEADERS,
|
|
702
|
-
},
|
|
703
|
-
);
|
|
704
|
-
|
|
705
|
-
if (!response.ok) {
|
|
706
|
-
console.warn(
|
|
707
|
-
`Merkl API request failed: ${response.status} ${response.statusText}`,
|
|
708
|
-
);
|
|
709
|
-
return [];
|
|
710
|
-
}
|
|
711
|
-
|
|
712
|
-
return (await response.json()) as MerklRewardsResponse[];
|
|
713
|
-
} catch (error) {
|
|
714
|
-
console.warn(
|
|
715
|
-
`Error fetching Merkl rewards for chain ${chainId}:`,
|
|
716
|
-
error,
|
|
717
|
-
);
|
|
718
|
-
return [];
|
|
719
|
-
}
|
|
720
|
-
});
|
|
603
|
+
if (!response.ok) {
|
|
604
|
+
console.warn(
|
|
605
|
+
`Merkl API request failed: ${response.status} ${response.statusText}`,
|
|
606
|
+
);
|
|
607
|
+
return [];
|
|
608
|
+
}
|
|
721
609
|
|
|
722
|
-
|
|
723
|
-
return allRewards.flat();
|
|
610
|
+
return (await response.json()) as MerklRewardsResponse[];
|
|
724
611
|
} catch (error) {
|
|
725
612
|
console.error("Error in getMerklRewardsData:", error);
|
|
726
613
|
return [];
|
|
@@ -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.3'
|