@moonwell-fi/moonwell-sdk 0.12.2 → 0.13.1
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 +22 -0
- package/_cjs/actions/core/markets/common.js +11 -4
- package/_cjs/actions/core/markets/common.js.map +1 -1
- package/_cjs/actions/core/user-rewards/common.js +6 -5
- package/_cjs/actions/core/user-rewards/common.js.map +1 -1
- package/_cjs/actions/governance/getDelegates.js.map +1 -1
- package/_cjs/actions/governance/getStakingInfo.js +113 -31
- package/_cjs/actions/governance/getStakingInfo.js.map +1 -1
- package/_cjs/actions/governance/getUserStakingInfo.js +106 -18
- package/_cjs/actions/governance/getUserStakingInfo.js.map +1 -1
- package/_cjs/actions/governance/getUserVotingPowers.js +21 -6
- package/_cjs/actions/governance/getUserVotingPowers.js.map +1 -1
- package/_cjs/actions/governance/getWellPrice.js +26 -0
- package/_cjs/actions/governance/getWellPrice.js.map +1 -0
- package/_cjs/actions/morpho/user-rewards/common.js +87 -12
- package/_cjs/actions/morpho/user-rewards/common.js.map +1 -1
- package/_cjs/actions/morpho/user-rewards/getMorphoUserRewards.js +46 -10
- package/_cjs/actions/morpho/user-rewards/getMorphoUserRewards.js.map +1 -1
- package/_cjs/actions/morpho/vaults/common.js +19 -6
- package/_cjs/actions/morpho/vaults/common.js.map +1 -1
- package/_cjs/environments/definitions/ethereum/contracts.js +12 -0
- package/_cjs/environments/definitions/ethereum/contracts.js.map +1 -0
- package/_cjs/environments/definitions/ethereum/custom.js +18 -0
- package/_cjs/environments/definitions/ethereum/custom.js.map +1 -0
- package/_cjs/environments/definitions/ethereum/environment.js +9 -5
- package/_cjs/environments/definitions/ethereum/environment.js.map +1 -1
- package/_cjs/environments/definitions/ethereum/tokens.js +12 -0
- package/_cjs/environments/definitions/ethereum/tokens.js.map +1 -1
- package/_cjs/environments/definitions/governance.js +1 -1
- package/_cjs/environments/definitions/governance.js.map +1 -1
- package/_cjs/errors/version.js +1 -1
- package/_cjs/index.js +5 -1
- package/_cjs/index.js.map +1 -1
- package/_esm/actions/core/markets/common.js +11 -4
- package/_esm/actions/core/markets/common.js.map +1 -1
- package/_esm/actions/core/user-rewards/common.js +6 -5
- package/_esm/actions/core/user-rewards/common.js.map +1 -1
- package/_esm/actions/governance/getDelegates.js +2 -0
- package/_esm/actions/governance/getDelegates.js.map +1 -1
- package/_esm/actions/governance/getStakingInfo.js +136 -32
- package/_esm/actions/governance/getStakingInfo.js.map +1 -1
- package/_esm/actions/governance/getUserStakingInfo.js +120 -19
- package/_esm/actions/governance/getUserStakingInfo.js.map +1 -1
- package/_esm/actions/governance/getUserVotingPowers.js +24 -6
- package/_esm/actions/governance/getUserVotingPowers.js.map +1 -1
- package/_esm/actions/governance/getWellPrice.js +50 -0
- package/_esm/actions/governance/getWellPrice.js.map +1 -0
- package/_esm/actions/morpho/user-rewards/common.js +93 -12
- package/_esm/actions/morpho/user-rewards/common.js.map +1 -1
- package/_esm/actions/morpho/user-rewards/getMorphoUserRewards.js +51 -11
- package/_esm/actions/morpho/user-rewards/getMorphoUserRewards.js.map +1 -1
- package/_esm/actions/morpho/vaults/common.js +19 -6
- package/_esm/actions/morpho/vaults/common.js.map +1 -1
- package/_esm/environments/definitions/ethereum/contracts.js +10 -0
- package/_esm/environments/definitions/ethereum/contracts.js.map +1 -0
- package/_esm/environments/definitions/ethereum/custom.js +15 -0
- package/_esm/environments/definitions/ethereum/custom.js.map +1 -0
- package/_esm/environments/definitions/ethereum/environment.js +11 -5
- package/_esm/environments/definitions/ethereum/environment.js.map +1 -1
- package/_esm/environments/definitions/ethereum/tokens.js +12 -0
- package/_esm/environments/definitions/ethereum/tokens.js.map +1 -1
- package/_esm/environments/definitions/governance.js +2 -2
- package/_esm/environments/definitions/governance.js.map +1 -1
- package/_esm/errors/version.js +1 -1
- package/_esm/index.js +2 -0
- package/_esm/index.js.map +1 -1
- package/_types/actions/core/markets/common.d.ts.map +1 -1
- package/_types/actions/core/user-rewards/common.d.ts.map +1 -1
- package/_types/actions/governance/getDelegates.d.ts.map +1 -1
- package/_types/actions/governance/getStakingInfo.d.ts +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/getUserVotingPowers.d.ts.map +1 -1
- package/_types/actions/governance/getWellPrice.d.ts +29 -0
- package/_types/actions/governance/getWellPrice.d.ts.map +1 -0
- package/_types/actions/morpho/user-rewards/common.d.ts +23 -0
- package/_types/actions/morpho/user-rewards/common.d.ts.map +1 -1
- package/_types/actions/morpho/user-rewards/getMorphoUserRewards.d.ts +22 -0
- package/_types/actions/morpho/user-rewards/getMorphoUserRewards.d.ts.map +1 -1
- package/_types/actions/morpho/vaults/common.d.ts.map +1 -1
- package/_types/client/createMoonwellClient.d.ts +62 -2
- package/_types/client/createMoonwellClient.d.ts.map +1 -1
- package/_types/environments/definitions/ethereum/contracts.d.ts +4 -0
- package/_types/environments/definitions/ethereum/contracts.d.ts.map +1 -0
- package/_types/environments/definitions/ethereum/custom.d.ts +18 -0
- package/_types/environments/definitions/ethereum/custom.d.ts.map +1 -0
- package/_types/environments/definitions/ethereum/environment.d.ts +52 -2
- package/_types/environments/definitions/ethereum/environment.d.ts.map +1 -1
- package/_types/environments/definitions/ethereum/tokens.d.ts +12 -0
- package/_types/environments/definitions/ethereum/tokens.d.ts.map +1 -1
- package/_types/environments/definitions/governance.d.ts.map +1 -1
- package/_types/environments/index.d.ts +34 -4
- package/_types/environments/index.d.ts.map +1 -1
- package/_types/errors/version.d.ts +1 -1
- package/_types/index.d.ts +2 -0
- package/_types/index.d.ts.map +1 -1
- package/actions/core/markets/common.ts +11 -6
- package/actions/core/user-rewards/common.ts +6 -5
- package/actions/governance/getDelegates.ts +2 -0
- package/actions/governance/getStakingInfo.ts +195 -87
- package/actions/governance/getUserStakingInfo.ts +168 -54
- package/actions/governance/getUserVotingPowers.ts +30 -15
- package/actions/governance/getWellPrice.ts +66 -0
- package/actions/morpho/user-rewards/common.ts +91 -14
- package/actions/morpho/user-rewards/getMorphoUserRewards.ts +77 -12
- package/actions/morpho/vaults/common.ts +19 -12
- package/environments/definitions/ethereum/contracts.ts +10 -0
- package/environments/definitions/ethereum/custom.ts +15 -0
- package/environments/definitions/ethereum/environment.ts +15 -6
- package/environments/definitions/ethereum/tokens.ts +12 -0
- package/environments/definitions/governance.ts +2 -2
- package/errors/version.ts +1 -1
- package/index.ts +3 -0
- package/package.json +1 -1
|
@@ -1,31 +1,139 @@
|
|
|
1
1
|
import { base } from "viem/chains";
|
|
2
2
|
import { Amount, getEnvironmentsFromArgs } from "../../common/index.js";
|
|
3
|
-
import { publicEnvironments, } from "../../environments/index.js";
|
|
4
3
|
import { getMerklCampaignIds, getMerklRewardsData } from "./common.js";
|
|
4
|
+
import { getGovernanceTokenPriceFor } from "./getWellPrice.js";
|
|
5
|
+
/**
|
|
6
|
+
* Reads per-user staking fields directly from stkWELL when views.getUserStakingInfo()
|
|
7
|
+
* is unavailable (e.g. reverts on Moonbeam).
|
|
8
|
+
*/
|
|
9
|
+
async function readUserStakingFromStkWell(environment, userAddress) {
|
|
10
|
+
const stakingToken = environment.contracts.stakingToken;
|
|
11
|
+
if (!stakingToken)
|
|
12
|
+
return undefined;
|
|
13
|
+
const [cooldownR, rewardsR, balanceR] = await Promise.allSettled([
|
|
14
|
+
stakingToken.read.stakersCooldowns([userAddress]),
|
|
15
|
+
stakingToken.read.getTotalRewardsBalance([userAddress]),
|
|
16
|
+
stakingToken.read.balanceOf([userAddress]),
|
|
17
|
+
]);
|
|
18
|
+
// Surface every rejection so a single failed read (e.g. balanceOf throttled)
|
|
19
|
+
// doesn't silently zero a field that the UI would then display as "no stake".
|
|
20
|
+
for (const r of [cooldownR, rewardsR, balanceR]) {
|
|
21
|
+
if (r.status === "rejected") {
|
|
22
|
+
environment.onError?.(r.reason, {
|
|
23
|
+
source: "user-staking-fallback",
|
|
24
|
+
chainId: environment.chainId,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (cooldownR.status === "rejected" &&
|
|
29
|
+
rewardsR.status === "rejected" &&
|
|
30
|
+
balanceR.status === "rejected") {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
cooldown: cooldownR.status === "fulfilled" ? cooldownR.value : 0n,
|
|
35
|
+
pendingRewards: rewardsR.status === "fulfilled" ? rewardsR.value : 0n,
|
|
36
|
+
totalStaked: balanceR.status === "fulfilled" ? balanceR.value : 0n,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Reads global cooldown/unstakeWindow constants from stkWELL when
|
|
41
|
+
* views.getStakingInfo() is unavailable.
|
|
42
|
+
*/
|
|
43
|
+
async function readScheduleFromStkWell(environment) {
|
|
44
|
+
const stakingToken = environment.contracts.stakingToken;
|
|
45
|
+
if (!stakingToken)
|
|
46
|
+
return undefined;
|
|
47
|
+
const [cooldownR, unstakeWindowR] = await Promise.allSettled([
|
|
48
|
+
stakingToken.read.COOLDOWN_SECONDS(),
|
|
49
|
+
stakingToken.read.UNSTAKE_WINDOW(),
|
|
50
|
+
]);
|
|
51
|
+
// Surface every rejection. A silent cooldown=0n would corrupt downstream
|
|
52
|
+
// cooldownEnding math even if the unstakeWindow read succeeded.
|
|
53
|
+
for (const r of [cooldownR, unstakeWindowR]) {
|
|
54
|
+
if (r.status === "rejected") {
|
|
55
|
+
environment.onError?.(r.reason, {
|
|
56
|
+
source: "user-staking-schedule-fallback",
|
|
57
|
+
chainId: environment.chainId,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (cooldownR.status === "rejected" && unstakeWindowR.status === "rejected") {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
cooldown: cooldownR.status === "fulfilled" ? cooldownR.value : 0n,
|
|
66
|
+
unstakeWindow: unstakeWindowR.status === "fulfilled" ? unstakeWindowR.value : 0n,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
const isUserStakingShape = (value) => {
|
|
70
|
+
if (typeof value !== "object" || value === null)
|
|
71
|
+
return false;
|
|
72
|
+
const v = value;
|
|
73
|
+
return (typeof v.cooldown === "bigint" &&
|
|
74
|
+
typeof v.pendingRewards === "bigint" &&
|
|
75
|
+
typeof v.totalStaked === "bigint");
|
|
76
|
+
};
|
|
77
|
+
const isScheduleShape = (value) => {
|
|
78
|
+
if (typeof value !== "object" || value === null)
|
|
79
|
+
return false;
|
|
80
|
+
const v = value;
|
|
81
|
+
return typeof v.cooldown === "bigint" && typeof v.unstakeWindow === "bigint";
|
|
82
|
+
};
|
|
5
83
|
export async function getUserStakingInfo(client, args) {
|
|
6
84
|
const { userAddress } = args;
|
|
7
85
|
const environments = getEnvironmentsFromArgs(client, args);
|
|
8
86
|
const envsWithStaking = environments.filter((env) => env.contracts.stakingToken);
|
|
87
|
+
const baseEnvironment = client.environments?.base;
|
|
9
88
|
const envStakingInfo = await Promise.all(envsWithStaking.map(async (environment) => {
|
|
10
|
-
const homeEnvironment = Object.values(publicEnvironments).find((e) => e.custom?.governance?.chainIds?.includes(environment.chainId)) || environment;
|
|
11
89
|
const settled = await Promise.allSettled([
|
|
12
90
|
environment.contracts.views?.read.getUserStakingInfo([userAddress]),
|
|
13
91
|
environment.contracts.governanceToken?.read.balanceOf([userAddress]),
|
|
14
|
-
homeEnvironment.contracts.views?.read.getGovernanceTokenPrice(),
|
|
15
92
|
environment.contracts.views?.read.getStakingInfo(),
|
|
93
|
+
getGovernanceTokenPriceFor(environment, baseEnvironment),
|
|
16
94
|
]);
|
|
17
|
-
|
|
95
|
+
const [userStakingR, balanceR, stakingScheduleR, priceR] = settled;
|
|
96
|
+
const viewsUserStaking = userStakingR.status === "fulfilled" ? userStakingR.value : undefined;
|
|
97
|
+
const userStaking = isUserStakingShape(viewsUserStaking)
|
|
98
|
+
? viewsUserStaking
|
|
99
|
+
: await readUserStakingFromStkWell(environment, userAddress);
|
|
100
|
+
const viewsSchedule = stakingScheduleR.status === "fulfilled"
|
|
101
|
+
? stakingScheduleR.value
|
|
102
|
+
: undefined;
|
|
103
|
+
const schedule = isScheduleShape(viewsSchedule)
|
|
104
|
+
? viewsSchedule
|
|
105
|
+
: await readScheduleFromStkWell(environment);
|
|
106
|
+
const tokenBalance = balanceR.status === "fulfilled" && balanceR.value !== undefined
|
|
107
|
+
? balanceR.value
|
|
108
|
+
: 0n;
|
|
109
|
+
const price = priceR.status === "fulfilled" ? priceR.value : 0n;
|
|
110
|
+
if (priceR.status === "rejected") {
|
|
111
|
+
environment.onError?.(priceR.reason, {
|
|
112
|
+
source: "governance-token-price",
|
|
113
|
+
chainId: environment.chainId,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
return { userStaking, schedule, tokenBalance, price };
|
|
18
117
|
}));
|
|
19
118
|
const campaignIds = await getMerklCampaignIds();
|
|
20
119
|
const merklRewards = await getMerklRewardsData(campaignIds, base.id, userAddress);
|
|
21
120
|
const result = envsWithStaking.flatMap((curr, index) => {
|
|
22
|
-
const
|
|
23
|
-
const
|
|
24
|
-
const
|
|
25
|
-
if (!
|
|
121
|
+
const govKey = curr.config.contracts.governanceToken;
|
|
122
|
+
const stkKey = curr.config.contracts.stakingToken;
|
|
123
|
+
const currTokens = curr.config.tokens;
|
|
124
|
+
if (!govKey || !stkKey)
|
|
125
|
+
return [];
|
|
126
|
+
const token = currTokens[govKey];
|
|
127
|
+
const stakingToken = currTokens[stkKey];
|
|
128
|
+
if (!token || !stakingToken)
|
|
26
129
|
return [];
|
|
27
|
-
|
|
28
|
-
//
|
|
130
|
+
// envStakingInfo is built via Promise.all over the same envsWithStaking
|
|
131
|
+
// array, so index access is always defined.
|
|
132
|
+
const { userStaking, schedule, tokenBalance, price } = envStakingInfo[index];
|
|
133
|
+
if (!userStaking || !schedule)
|
|
134
|
+
return [];
|
|
135
|
+
const { cooldown, pendingRewards, totalStaked } = userStaking;
|
|
136
|
+
const { cooldown: cooldownSeconds, unstakeWindow } = schedule;
|
|
29
137
|
const isBase = curr.chainId === base.id;
|
|
30
138
|
const merklReward = merklRewards.reduce((acc, r) => {
|
|
31
139
|
if (r.chain === curr.chainId) {
|
|
@@ -34,16 +142,9 @@ export async function getUserStakingInfo(client, args) {
|
|
|
34
142
|
return acc;
|
|
35
143
|
}, 0n);
|
|
36
144
|
const merklPendingRewards = isBase ? merklReward : 0n;
|
|
37
|
-
const tokenBalance = (envStakingInfo[index]?.[1] ?? 0n);
|
|
38
|
-
const governanceTokenPriceRaw = (envStakingInfo[index]?.[2] ??
|
|
39
|
-
0n);
|
|
40
|
-
const stakingInfoData = envStakingInfo[index]?.[3];
|
|
41
|
-
if (!stakingInfoData)
|
|
42
|
-
return [];
|
|
43
|
-
const { cooldown: cooldownSeconds, unstakeWindow } = stakingInfoData;
|
|
44
145
|
const cooldownEnding = cooldown > 0n ? cooldown + cooldownSeconds : 0n;
|
|
45
146
|
const unstakingEnding = cooldown > 0n ? cooldown + cooldownSeconds + unstakeWindow : 0n;
|
|
46
|
-
const
|
|
147
|
+
const tokenPrice = new Amount(price, 18);
|
|
47
148
|
const userStakingInfo = {
|
|
48
149
|
chainId: curr.chainId,
|
|
49
150
|
cooldownActive: cooldown > 0n,
|
|
@@ -56,7 +157,7 @@ export async function getUserStakingInfo(client, args) {
|
|
|
56
157
|
: new Amount(pendingRewards, 18),
|
|
57
158
|
token,
|
|
58
159
|
tokenBalance: new Amount(tokenBalance, 18),
|
|
59
|
-
tokenPrice:
|
|
160
|
+
tokenPrice: tokenPrice.value,
|
|
60
161
|
stakingToken,
|
|
61
162
|
stakingTokenBalance: new Amount(totalStaked, 18),
|
|
62
163
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getUserStakingInfo.js","sourceRoot":"","sources":["../../../actions/governance/getUserStakingInfo.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEnC,OAAO,EAAE,MAAM,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"getUserStakingInfo.js","sourceRoot":"","sources":["../../../actions/governance/getUserStakingInfo.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +1,40 @@
|
|
|
1
1
|
import { zeroAddress } from "viem";
|
|
2
2
|
import { Amount, getBlockNumberAtTimestamp, getEnvironmentsFromArgs, } from "../../common/index.js";
|
|
3
|
+
const warnedNoViewsEnvs = new Set();
|
|
3
4
|
export async function getUserVotingPowers(client, args) {
|
|
4
5
|
const { governanceToken, userAddress, blockNumber, snapshotTimestamp } = args;
|
|
5
6
|
const environments = getEnvironmentsFromArgs(client, args);
|
|
6
|
-
|
|
7
|
+
// A chain can hold a governance token without deploying a views contract
|
|
8
|
+
// (voting reads run on the hub). Skipping the no-views case here lets the
|
|
9
|
+
// read site below call views.read.getUserVotingPower directly.
|
|
10
|
+
const tokenEnvironments = environments.flatMap((env) => {
|
|
11
|
+
if (env.custom?.governance?.token !== governanceToken) {
|
|
12
|
+
return [];
|
|
13
|
+
}
|
|
14
|
+
const views = env.contracts.views;
|
|
15
|
+
if (views === undefined) {
|
|
16
|
+
const key = `${env.chainId}:${governanceToken}`;
|
|
17
|
+
if (!warnedNoViewsEnvs.has(key)) {
|
|
18
|
+
warnedNoViewsEnvs.add(key);
|
|
19
|
+
console.warn(`[moonwell-sdk] getUserVotingPowers: skipping chainId=${env.chainId} for governanceToken=${governanceToken} — environment holds the token but has no views contract.`);
|
|
20
|
+
}
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
return [{ env, views }];
|
|
24
|
+
});
|
|
7
25
|
const perChainBlockNumbers = snapshotTimestamp !== undefined
|
|
8
|
-
? await Promise.all(tokenEnvironments.map((env) => getBlockNumberAtTimestamp(env.publicClient, BigInt(snapshotTimestamp))))
|
|
26
|
+
? await Promise.all(tokenEnvironments.map(({ env }) => getBlockNumberAtTimestamp(env.publicClient, BigInt(snapshotTimestamp))))
|
|
9
27
|
: undefined;
|
|
10
|
-
const
|
|
28
|
+
const resolvedVotingPowers = await Promise.all(tokenEnvironments.map(async ({ env, views }, index) => {
|
|
11
29
|
const blockForChain = perChainBlockNumbers
|
|
12
30
|
? perChainBlockNumbers[index]
|
|
13
31
|
: blockNumber;
|
|
14
|
-
|
|
32
|
+
const votingPowers = await views.read.getUserVotingPower([userAddress], {
|
|
15
33
|
blockNumber: blockForChain,
|
|
16
34
|
});
|
|
35
|
+
return { env, votingPowers };
|
|
17
36
|
}));
|
|
18
|
-
return
|
|
19
|
-
const votingPowers = environmentsUserVotingPowers[index];
|
|
37
|
+
return resolvedVotingPowers.map(({ env: environment, votingPowers }) => {
|
|
20
38
|
return {
|
|
21
39
|
chainId: environment.chainId,
|
|
22
40
|
//Claims balances
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getUserVotingPowers.js","sourceRoot":"","sources":["../../../actions/governance/getUserVotingPowers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,WAAW,EAAE,MAAM,MAAM,CAAC;AAEjD,OAAO,EACL,MAAM,EACN,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"getUserVotingPowers.js","sourceRoot":"","sources":["../../../actions/governance/getUserVotingPowers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { publicEnvironments, } from "../../environments/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Reads WELL/USD from Base's lending oracle via getUnderlyingPrice(mWELL).
|
|
4
|
+
*
|
|
5
|
+
* The Base oracle is Chainlink-fed and shared by the lending markets, so it's
|
|
6
|
+
* the authoritative WELL/USD source. Used in place of the per-chain
|
|
7
|
+
* views.getGovernanceTokenPrice() which is unreliable on Moonbeam (returns
|
|
8
|
+
* stale data) and Base (returns 0).
|
|
9
|
+
*
|
|
10
|
+
* Returns a uint256 already scaled to 18 decimals.
|
|
11
|
+
*
|
|
12
|
+
* @param baseEnvironment Pass the caller's Base environment when available so
|
|
13
|
+
* user-configured RPCs / onError handlers are honored. Falls back to the
|
|
14
|
+
* SDK's default public Base environment otherwise.
|
|
15
|
+
*/
|
|
16
|
+
export async function getWellPriceFromBaseOracle(baseEnvironment) {
|
|
17
|
+
const baseEnv = baseEnvironment ?? publicEnvironments.base;
|
|
18
|
+
const tokens = baseEnv.config.tokens;
|
|
19
|
+
const mWELL = tokens.MOONWELL_WELL?.address;
|
|
20
|
+
const oracle = baseEnv.contracts.oracle;
|
|
21
|
+
if (!mWELL || !oracle) {
|
|
22
|
+
// A custom Base env without MOONWELL_WELL or an oracle would silently
|
|
23
|
+
// zero out every WELL-priced read across the SDK. Surface it instead.
|
|
24
|
+
baseEnv.onError?.(new Error(`getWellPriceFromBaseOracle: missing ${!mWELL ? "MOONWELL_WELL token" : "oracle contract"} on Base env`), { source: "well-price", chainId: baseEnv.chainId });
|
|
25
|
+
return 0n;
|
|
26
|
+
}
|
|
27
|
+
return await oracle.read.getUnderlyingPrice([mWELL]);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Returns the governance-token-in-USD price for an environment.
|
|
31
|
+
*
|
|
32
|
+
* - For WELL-governed chains (Base, Optimism, Moonbeam), reads from the Base
|
|
33
|
+
* lending oracle's mWELL underlying price (authoritative, Chainlink-fed).
|
|
34
|
+
* - For non-WELL chains (currently only Moonriver / MFAM), reads from the
|
|
35
|
+
* env's own views.getGovernanceTokenPrice() — Moonriver has its own MFAM
|
|
36
|
+
* oracle and isn't priced from Base.
|
|
37
|
+
*
|
|
38
|
+
* Returns 0n if the lookup fails.
|
|
39
|
+
*/
|
|
40
|
+
export async function getGovernanceTokenPriceFor(environment, baseEnvironment) {
|
|
41
|
+
if (environment.custom?.governance?.token === "WELL") {
|
|
42
|
+
return getWellPriceFromBaseOracle(baseEnvironment);
|
|
43
|
+
}
|
|
44
|
+
// Non-WELL (e.g. Moonriver / MFAM): the env itself is the governance "home".
|
|
45
|
+
const views = environment.contracts.views;
|
|
46
|
+
if (!views)
|
|
47
|
+
return 0n;
|
|
48
|
+
return (await views.read.getGovernanceTokenPrice()) ?? 0n;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=getWellPrice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getWellPrice.js","sourceRoot":"","sources":["../../../actions/governance/getWellPrice.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,kBAAkB,GACnB,MAAM,6BAA6B,CAAC;AAErC;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,eAA6B;IAE7B,MAAM,OAAO,GAAG,eAAe,IAAI,kBAAkB,CAAC,IAAI,CAAC;IAC3D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAG7B,CAAC;IACF,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,EAAE,OAAO,CAAC;IAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC;IACxC,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;QACtB,sEAAsE;QACtE,sEAAsE;QACtE,OAAO,CAAC,OAAO,EAAE,CACf,IAAI,KAAK,CACP,uCAAuC,CAAC,KAAK,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,iBAAiB,cAAc,CACxG,EACD,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CACnD,CAAC;QACF,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,MAAM,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACvD,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,WAAwB,EACxB,eAA6B;IAE7B,IAAI,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,KAAK,MAAM,EAAE,CAAC;QACrD,OAAO,0BAA0B,CAAC,eAAe,CAAC,CAAC;IACrD,CAAC;IACD,6EAA6E;IAC7E,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC;IAC1C,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC,IAAI,EAAE,CAAC;AAC5D,CAAC"}
|
|
@@ -3,11 +3,54 @@ import { Amount } from "../../../common/amount.js";
|
|
|
3
3
|
import { MOONWELL_FETCH_JSON_HEADERS } from "../../../common/fetch-headers.js";
|
|
4
4
|
import { publicEnvironments, } from "../../../environments/index.js";
|
|
5
5
|
import { findMarketByAddress, findTokenByAddress, } from "../../../environments/utils/index.js";
|
|
6
|
+
import { getGovernanceTokenPriceFor } from "../../governance/getWellPrice.js";
|
|
7
|
+
/**
|
|
8
|
+
* Error thrown for any failure communicating with the Merkl API: non-ok HTTP
|
|
9
|
+
* responses, network rejections (fetch threw), and response-body parse errors.
|
|
10
|
+
*
|
|
11
|
+
* - HTTP failures populate `status` and `statusText`.
|
|
12
|
+
* - Network and parse failures leave `status`/`statusText` undefined and
|
|
13
|
+
* carry the original error via `cause`.
|
|
14
|
+
*/
|
|
15
|
+
export class MerklApiError extends Error {
|
|
16
|
+
constructor(params) {
|
|
17
|
+
super(params.message, params.cause !== undefined ? { cause: params.cause } : undefined);
|
|
18
|
+
Object.defineProperty(this, "status", {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
configurable: true,
|
|
21
|
+
writable: true,
|
|
22
|
+
value: void 0
|
|
23
|
+
});
|
|
24
|
+
Object.defineProperty(this, "statusText", {
|
|
25
|
+
enumerable: true,
|
|
26
|
+
configurable: true,
|
|
27
|
+
writable: true,
|
|
28
|
+
value: void 0
|
|
29
|
+
});
|
|
30
|
+
Object.defineProperty(this, "url", {
|
|
31
|
+
enumerable: true,
|
|
32
|
+
configurable: true,
|
|
33
|
+
writable: true,
|
|
34
|
+
value: void 0
|
|
35
|
+
});
|
|
36
|
+
Object.defineProperty(this, "chainId", {
|
|
37
|
+
enumerable: true,
|
|
38
|
+
configurable: true,
|
|
39
|
+
writable: true,
|
|
40
|
+
value: void 0
|
|
41
|
+
});
|
|
42
|
+
this.name = "MerklApiError";
|
|
43
|
+
this.url = params.url;
|
|
44
|
+
this.chainId = params.chainId;
|
|
45
|
+
this.status = params.status;
|
|
46
|
+
this.statusText = params.statusText;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
6
49
|
export async function getUserMorphoRewardsData(params) {
|
|
7
50
|
// The Morpho URD distributions endpoint (rewards.morpho.org) was
|
|
8
51
|
// deprecated and now 301-redirects to a SPA, so JSON parsing fails.
|
|
9
52
|
// Surface only Merkl rewards.
|
|
10
|
-
const merklRewards = await getMerklRewardsData(params.environment, params.account);
|
|
53
|
+
const merklRewards = await getMerklRewardsData(params.environment, params.account, { throwOnError: params.throwOnExternalApiError ?? false });
|
|
11
54
|
const isFullDeployment = params.environment.custom.morpho?.minimalDeployment === false;
|
|
12
55
|
// For full deployments (Base), restrict to Moonwell vault campaigns so the
|
|
13
56
|
// result excludes staking and other Moonwell campaigns; those are returned
|
|
@@ -69,10 +112,16 @@ export async function getUserMorphoStakingRewardsData(params) {
|
|
|
69
112
|
const [allMarkets, nativeTokenPriceRaw, governanceTokenPriceRaw] = await Promise.all([
|
|
70
113
|
viewsContract?.read.getAllMarketsInfo(),
|
|
71
114
|
homeViewsContract?.read.getNativeTokenPrice(),
|
|
72
|
-
|
|
115
|
+
getGovernanceTokenPriceFor(params.environment).catch((err) => {
|
|
116
|
+
params.environment.onError?.(err, {
|
|
117
|
+
source: "governance-token-price",
|
|
118
|
+
chainId: params.environment.chainId,
|
|
119
|
+
});
|
|
120
|
+
return 0n;
|
|
121
|
+
}),
|
|
73
122
|
]);
|
|
74
|
-
const governanceTokenPrice = new Amount(governanceTokenPriceRaw
|
|
75
|
-
const nativeTokenPrice = new Amount(nativeTokenPriceRaw
|
|
123
|
+
const governanceTokenPrice = new Amount(governanceTokenPriceRaw, 18);
|
|
124
|
+
const nativeTokenPrice = new Amount(nativeTokenPriceRaw ?? 0n, 18);
|
|
76
125
|
let tokenPrices = allMarkets
|
|
77
126
|
?.map((marketInfo) => {
|
|
78
127
|
const marketFound = findMarketByAddress(params.environment, marketInfo.market);
|
|
@@ -155,24 +204,56 @@ const getRewardsEarnedData = async (environment, userAddress, multiRewardsAddres
|
|
|
155
204
|
}));
|
|
156
205
|
return rewards.filter(Boolean);
|
|
157
206
|
};
|
|
158
|
-
async function getMerklRewardsData(environment, account) {
|
|
207
|
+
async function getMerklRewardsData(environment, account, options = { throwOnError: false }) {
|
|
208
|
+
const url = `https://api.merkl.xyz/v4/users/${account}/rewards?chainId=${environment.chainId}&test=false&breakdownPage=0&reloadChainId=${environment.chainId}`;
|
|
209
|
+
let response;
|
|
159
210
|
try {
|
|
160
211
|
// Merkl campaigns always distribute rewards on the same chain as the
|
|
161
212
|
// opportunity, so environment.chainId is the only chain we need to query.
|
|
162
213
|
// The previous two-phase approach (fetch opportunities per vault → extract
|
|
163
214
|
// chain IDs → fetch rewards per chain) made N+1 HTTP calls to discover
|
|
164
215
|
// a chain ID we already know.
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
if (
|
|
169
|
-
|
|
170
|
-
|
|
216
|
+
response = await fetch(url, { headers: MOONWELL_FETCH_JSON_HEADERS });
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
if (options.throwOnError) {
|
|
220
|
+
throw new MerklApiError({
|
|
221
|
+
message: `Merkl API network error for chain ${environment.chainId}`,
|
|
222
|
+
url,
|
|
223
|
+
chainId: environment.chainId,
|
|
224
|
+
cause: error,
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
console.error(`[getMerklRewardsData:network] chain=${environment.chainId} url=${url}`, error);
|
|
228
|
+
return [];
|
|
229
|
+
}
|
|
230
|
+
if (!response.ok) {
|
|
231
|
+
const message = `Merkl API request failed for chain ${environment.chainId}: ${response.status} ${response.statusText}`;
|
|
232
|
+
if (options.throwOnError) {
|
|
233
|
+
throw new MerklApiError({
|
|
234
|
+
message,
|
|
235
|
+
url,
|
|
236
|
+
chainId: environment.chainId,
|
|
237
|
+
status: response.status,
|
|
238
|
+
statusText: response.statusText,
|
|
239
|
+
});
|
|
171
240
|
}
|
|
241
|
+
console.warn(`${message} (url=${url})`);
|
|
242
|
+
return [];
|
|
243
|
+
}
|
|
244
|
+
try {
|
|
172
245
|
return (await response.json());
|
|
173
246
|
}
|
|
174
247
|
catch (error) {
|
|
175
|
-
|
|
248
|
+
if (options.throwOnError) {
|
|
249
|
+
throw new MerklApiError({
|
|
250
|
+
message: `Merkl API response parse error for chain ${environment.chainId}`,
|
|
251
|
+
url,
|
|
252
|
+
chainId: environment.chainId,
|
|
253
|
+
cause: error,
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
console.error(`[getMerklRewardsData:parse] chain=${environment.chainId} url=${url}`, error);
|
|
176
257
|
return [];
|
|
177
258
|
}
|
|
178
259
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../actions/morpho/user-rewards/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACnD,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAGL,kBAAkB,GACnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../actions/morpho/user-rewards/common.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,55 @@
|
|
|
1
1
|
import { getEnvironmentsFromArgs } from "../../../common/index.js";
|
|
2
|
-
import { getUserMorphoRewardsData } from "./common.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
2
|
+
import { MerklApiError, getUserMorphoRewardsData } from "./common.js";
|
|
3
|
+
/**
|
|
4
|
+
* AggregateError thrown by `getMorphoUserRewards` when one or more chains
|
|
5
|
+
* fail and `throwOnExternalApiError` is `true`. The `rewards` property
|
|
6
|
+
* carries the rewards from any chains that succeeded so callers can still
|
|
7
|
+
* surface partial results alongside the per-chain failures in `errors`.
|
|
8
|
+
*/
|
|
9
|
+
export class MorphoUserRewardsAggregateError extends AggregateError {
|
|
10
|
+
constructor(errors, message, rewards) {
|
|
11
|
+
super(errors, message);
|
|
12
|
+
Object.defineProperty(this, "rewards", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
configurable: true,
|
|
15
|
+
writable: true,
|
|
16
|
+
value: void 0
|
|
11
17
|
});
|
|
12
|
-
|
|
13
|
-
|
|
18
|
+
this.name = "MorphoUserRewardsAggregateError";
|
|
19
|
+
this.rewards = rewards;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export async function getMorphoUserRewards(client, args) {
|
|
23
|
+
const targetEnvironments = getEnvironmentsFromArgs(client, args).filter((environment) => environment.contracts.morphoViews !== undefined);
|
|
24
|
+
const settled = await Promise.allSettled(targetEnvironments.map((environment) => getUserMorphoRewardsData({
|
|
25
|
+
environment,
|
|
26
|
+
account: args.userAddress,
|
|
27
|
+
...(args.throwOnExternalApiError !== undefined && {
|
|
28
|
+
throwOnExternalApiError: args.throwOnExternalApiError,
|
|
29
|
+
}),
|
|
30
|
+
})));
|
|
31
|
+
const fulfilled = [];
|
|
32
|
+
const failures = [];
|
|
33
|
+
const failedChainIds = [];
|
|
34
|
+
for (const [i, result] of settled.entries()) {
|
|
35
|
+
const environment = targetEnvironments[i];
|
|
36
|
+
if (result.status === "fulfilled") {
|
|
37
|
+
fulfilled.push(...result.value);
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
const reason = result.reason;
|
|
41
|
+
if (reason instanceof MerklApiError) {
|
|
42
|
+
failures.push(reason);
|
|
43
|
+
failedChainIds.push(reason.chainId);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const baseError = reason instanceof Error ? reason : new Error(String(reason));
|
|
47
|
+
failures.push(new Error(`getMorphoUserRewards failed for chain ${environment.chainId}: ${baseError.message}`, { cause: baseError }));
|
|
48
|
+
failedChainIds.push(environment.chainId);
|
|
49
|
+
}
|
|
50
|
+
if (failures.length > 0 && args.throwOnExternalApiError === true) {
|
|
51
|
+
throw new MorphoUserRewardsAggregateError(failures, `getMorphoUserRewards failed for chains: ${failedChainIds.join(", ")}`, fulfilled);
|
|
52
|
+
}
|
|
53
|
+
return fulfilled;
|
|
14
54
|
}
|
|
15
55
|
//# sourceMappingURL=getMorphoUserRewards.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getMorphoUserRewards.js","sourceRoot":"","sources":["../../../../actions/morpho/user-rewards/getMorphoUserRewards.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAInE,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"getMorphoUserRewards.js","sourceRoot":"","sources":["../../../../actions/morpho/user-rewards/getMorphoUserRewards.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAInE,OAAO,EAAE,aAAa,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAEtE;;;;;GAKG;AACH,MAAM,OAAO,+BAAgC,SAAQ,cAAc;IAGjE,YAAY,MAAe,EAAE,OAAe,EAAE,OAA2B;QACvE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAHhB;;;;;WAA4B;QAInC,IAAI,CAAC,IAAI,GAAG,iCAAiC,CAAC;QAC9C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAuBD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAIxC,MAAsB,EACtB,IAA2D;IAE3D,MAAM,kBAAkB,GAAG,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,MAAM,CACrE,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,WAAW,KAAK,SAAS,CACjE,CAAC;IAEF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,kBAAkB,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CACrC,wBAAwB,CAAC;QACvB,WAAW;QACX,OAAO,EAAE,IAAI,CAAC,WAAW;QACzB,GAAG,CAAC,IAAI,CAAC,uBAAuB,KAAK,SAAS,IAAI;YAChD,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;SACtD,CAAC;KACH,CAAC,CACH,CACF,CAAC;IAEF,MAAM,SAAS,GAAuB,EAAE,CAAC;IACzC,MAAM,QAAQ,GAAY,EAAE,CAAC;IAC7B,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,KAAK,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5C,MAAM,WAAW,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;QAC1C,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAChC,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,IAAI,MAAM,YAAY,aAAa,EAAE,CAAC;YACpC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtB,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACpC,SAAS;QACX,CAAC;QACD,MAAM,SAAS,GACb,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/D,QAAQ,CAAC,IAAI,CACX,IAAI,KAAK,CACP,yCAAyC,WAAW,CAAC,OAAO,KAAK,SAAS,CAAC,OAAO,EAAE,EACpF,EAAE,KAAK,EAAE,SAAS,EAAE,CACrB,CACF,CAAC;QACF,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,uBAAuB,KAAK,IAAI,EAAE,CAAC;QACjE,MAAM,IAAI,+BAA+B,CACvC,QAAQ,EACR,2CAA2C,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACtE,SAAS,CACV,CAAC;IACJ,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
|