@moonwell-fi/moonwell-sdk 0.13.0 → 0.14.0
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 +20 -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/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/getUserVoteReceipt.js +39 -25
- package/_cjs/actions/governance/getUserVoteReceipt.js.map +1 -1
- package/_cjs/actions/governance/getWellPrice.js +26 -0
- package/_cjs/actions/governance/getWellPrice.js.map +1 -0
- package/_cjs/actions/governance/governor-api-client.js +70 -33
- package/_cjs/actions/governance/governor-api-client.js.map +1 -1
- package/_cjs/actions/governance/proposals/common.js +29 -1
- package/_cjs/actions/governance/proposals/common.js.map +1 -1
- package/_cjs/actions/governance/proposals/getProposal.js +24 -17
- package/_cjs/actions/governance/proposals/getProposal.js.map +1 -1
- package/_cjs/actions/governance/proposals/getProposals.js +27 -9
- package/_cjs/actions/governance/proposals/getProposals.js.map +1 -1
- package/_cjs/actions/morpho/user-rewards/common.js +10 -3
- package/_cjs/actions/morpho/user-rewards/common.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/errors/version.js +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/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/getUserVoteReceipt.js +48 -26
- package/_esm/actions/governance/getUserVoteReceipt.js.map +1 -1
- package/_esm/actions/governance/getWellPrice.js +50 -0
- package/_esm/actions/governance/getWellPrice.js.map +1 -0
- package/_esm/actions/governance/governor-api-client.js +87 -35
- package/_esm/actions/governance/governor-api-client.js.map +1 -1
- package/_esm/actions/governance/proposals/common.js +44 -1
- package/_esm/actions/governance/proposals/common.js.map +1 -1
- package/_esm/actions/governance/proposals/getProposal.js +36 -23
- package/_esm/actions/governance/proposals/getProposal.js.map +1 -1
- package/_esm/actions/governance/proposals/getProposals.js +44 -10
- package/_esm/actions/governance/proposals/getProposals.js.map +1 -1
- package/_esm/actions/morpho/user-rewards/common.js +10 -3
- package/_esm/actions/morpho/user-rewards/common.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/errors/version.js +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/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/getUserVoteReceipt.d.ts +16 -0
- package/_types/actions/governance/getUserVoteReceipt.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/governance/governor-api-client.d.ts +37 -12
- package/_types/actions/governance/governor-api-client.d.ts.map +1 -1
- package/_types/actions/governance/proposals/common.d.ts +14 -1
- package/_types/actions/governance/proposals/common.d.ts.map +1 -1
- package/_types/actions/governance/proposals/getProposal.d.ts +6 -1
- package/_types/actions/governance/proposals/getProposal.d.ts.map +1 -1
- package/_types/actions/governance/proposals/getProposals.d.ts +1 -1
- package/_types/actions/governance/proposals/getProposals.d.ts.map +1 -1
- package/_types/actions/morpho/user-rewards/common.d.ts.map +1 -1
- package/_types/actions/morpho/vaults/common.d.ts.map +1 -1
- package/_types/errors/version.d.ts +1 -1
- package/actions/core/markets/common.ts +11 -6
- package/actions/core/user-rewards/common.ts +6 -5
- package/actions/governance/getStakingInfo.ts +195 -87
- package/actions/governance/getUserStakingInfo.ts +168 -54
- package/actions/governance/getUserVoteReceipt.ts +71 -31
- package/actions/governance/getWellPrice.ts +66 -0
- package/actions/governance/governor-api-client.ts +136 -62
- package/actions/governance/proposals/common.ts +51 -1
- package/actions/governance/proposals/getProposal.ts +46 -26
- package/actions/governance/proposals/getProposals.ts +48 -14
- package/actions/morpho/user-rewards/common.ts +10 -3
- package/actions/morpho/vaults/common.ts +19 -12
- package/errors/version.ts +1 -1
- package/package.json +1 -1
|
@@ -1,64 +1,168 @@
|
|
|
1
1
|
import { base } from "viem/chains";
|
|
2
2
|
import { Amount, DAYS_PER_YEAR, SECONDS_PER_DAY, getEnvironmentsFromArgs, } from "../../common/index.js";
|
|
3
|
-
import { publicEnvironments, } from "../../environments/index.js";
|
|
4
3
|
import { getMerklStakingApr } from "./common.js";
|
|
4
|
+
import { getGovernanceTokenPriceFor } from "./getWellPrice.js";
|
|
5
|
+
const isStakingInfoStruct = (value) => {
|
|
6
|
+
if (typeof value !== "object" || value === null)
|
|
7
|
+
return false;
|
|
8
|
+
const v = value;
|
|
9
|
+
return (typeof v.cooldown === "bigint" &&
|
|
10
|
+
typeof v.distributionEnd === "bigint" &&
|
|
11
|
+
typeof v.emissionPerSecond === "bigint" &&
|
|
12
|
+
typeof v.totalSupply === "bigint" &&
|
|
13
|
+
typeof v.unstakeWindow === "bigint");
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Reads the staking fields directly from the stkWELL token contract when the
|
|
17
|
+
* core views' getStakingInfo() is unavailable or returns zeroed data
|
|
18
|
+
* (e.g. reverts on Moonbeam). Reads each field independently so a single
|
|
19
|
+
* transient RPC failure doesn't erase the whole fallback.
|
|
20
|
+
*
|
|
21
|
+
* The `assets` mapping is keyed by the stkWELL contract's own address — that's
|
|
22
|
+
* the Aave-fork convention (`address(this)` in StakedAave._initialize), not
|
|
23
|
+
* the underlying staked token. Verified on Moonbeam: assets(stkWELL) returns
|
|
24
|
+
* non-zero emissionPerSecond; assets(WELL) returns zero.
|
|
25
|
+
*/
|
|
26
|
+
async function getStakingInfoFromStkWell(environment) {
|
|
27
|
+
const stakingToken = environment.contracts.stakingToken;
|
|
28
|
+
const stakingTokenKey = environment.config.contracts.stakingToken;
|
|
29
|
+
const tokens = environment.config.tokens;
|
|
30
|
+
const stakingTokenAddress = stakingTokenKey
|
|
31
|
+
? tokens[stakingTokenKey]?.address
|
|
32
|
+
: undefined;
|
|
33
|
+
if (!stakingToken || !stakingTokenAddress) {
|
|
34
|
+
environment.onError?.(new Error("getStakingInfoFromStkWell: missing stkWELL config"), { source: "staking-fallback", chainId: environment.chainId });
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
const [cooldownR, unstakeWindowR, distributionEndR, totalSupplyR, assetDataR,] = await Promise.allSettled([
|
|
38
|
+
stakingToken.read.COOLDOWN_SECONDS(),
|
|
39
|
+
stakingToken.read.UNSTAKE_WINDOW(),
|
|
40
|
+
stakingToken.read.DISTRIBUTION_END(),
|
|
41
|
+
stakingToken.read.totalSupply(),
|
|
42
|
+
stakingToken.read.assets([stakingTokenAddress]),
|
|
43
|
+
]);
|
|
44
|
+
// Surface every rejection so operators don't have to guess which read failed.
|
|
45
|
+
for (const r of [
|
|
46
|
+
cooldownR,
|
|
47
|
+
unstakeWindowR,
|
|
48
|
+
distributionEndR,
|
|
49
|
+
totalSupplyR,
|
|
50
|
+
assetDataR,
|
|
51
|
+
]) {
|
|
52
|
+
if (r.status === "rejected") {
|
|
53
|
+
environment.onError?.(r.reason, {
|
|
54
|
+
source: "staking-fallback",
|
|
55
|
+
chainId: environment.chainId,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// totalSupply is load-bearing for APR; if its read failed (vs. legitimately
|
|
60
|
+
// returning 0n on an empty new chain) we can't produce a sensible struct.
|
|
61
|
+
if (totalSupplyR.status === "rejected")
|
|
62
|
+
return undefined;
|
|
63
|
+
const assetData = assetDataR.status === "fulfilled" ? assetDataR.value : undefined;
|
|
64
|
+
// viem returns multi-output reads as a tuple (Readonly<[bigint, bigint, bigint]>)
|
|
65
|
+
// even when the ABI names the outputs.
|
|
66
|
+
const emissionPerSecond = assetData ? assetData[0] : 0n;
|
|
67
|
+
return {
|
|
68
|
+
cooldown: cooldownR.status === "fulfilled" ? cooldownR.value : 0n,
|
|
69
|
+
unstakeWindow: unstakeWindowR.status === "fulfilled" ? unstakeWindowR.value : 0n,
|
|
70
|
+
distributionEnd: distributionEndR.status === "fulfilled" ? distributionEndR.value : 0n,
|
|
71
|
+
totalSupply: totalSupplyR.value,
|
|
72
|
+
emissionPerSecond,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
5
75
|
export async function getStakingInfo(client, args) {
|
|
6
76
|
const environments = getEnvironmentsFromArgs(client, args);
|
|
7
77
|
const envsWithStaking = environments.filter((env) => env.config.contracts.stakingToken);
|
|
78
|
+
const baseEnvironment = client.environments?.base;
|
|
8
79
|
const envStakingInfoSettlements = await Promise.allSettled(envsWithStaking.map(async (environment) => {
|
|
9
|
-
const homeEnvironment = Object.values(publicEnvironments).find((e) => e.custom?.governance?.chainIds?.includes(environment.chainId)) || environment;
|
|
10
80
|
const isBase = environment.chainId === base.id;
|
|
11
|
-
const
|
|
81
|
+
const [viewsStakingResult, historicalStakingResult, priceResult] = await Promise.allSettled([
|
|
12
82
|
environment.contracts.views?.read.getStakingInfo(),
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
]
|
|
20
|
-
: []),
|
|
83
|
+
isBase
|
|
84
|
+
? environment.contracts.views?.read.getStakingInfo({
|
|
85
|
+
blockNumber: BigInt(34149943),
|
|
86
|
+
})
|
|
87
|
+
: Promise.resolve(undefined),
|
|
88
|
+
getGovernanceTokenPriceFor(environment, baseEnvironment),
|
|
21
89
|
]);
|
|
22
|
-
|
|
90
|
+
const viewsStaking = viewsStakingResult.status === "fulfilled"
|
|
91
|
+
? viewsStakingResult.value
|
|
92
|
+
: undefined;
|
|
93
|
+
// Fall back to direct stkWELL reads when the views call rejected (the
|
|
94
|
+
// known Moonbeam failure mode) or returned a fully-zeroed struct
|
|
95
|
+
// (suspicious — a real deployment always has cooldown and unstake
|
|
96
|
+
// window configured > 0). A new chain with zero stakers but real
|
|
97
|
+
// schedule constants still goes through views.
|
|
98
|
+
const allZeroed = isStakingInfoStruct(viewsStaking) &&
|
|
99
|
+
viewsStaking.cooldown === 0n &&
|
|
100
|
+
viewsStaking.unstakeWindow === 0n &&
|
|
101
|
+
viewsStaking.totalSupply === 0n &&
|
|
102
|
+
viewsStaking.emissionPerSecond === 0n;
|
|
103
|
+
const viewsValid = isStakingInfoStruct(viewsStaking) && !allZeroed;
|
|
104
|
+
const stakingInfo = viewsValid
|
|
105
|
+
? viewsStaking
|
|
106
|
+
: await getStakingInfoFromStkWell(environment);
|
|
107
|
+
const historicalStaking = historicalStakingResult.status === "fulfilled"
|
|
108
|
+
? historicalStakingResult.value
|
|
109
|
+
: undefined;
|
|
110
|
+
const price = priceResult.status === "fulfilled" ? priceResult.value : 0n;
|
|
111
|
+
if (priceResult.status === "rejected") {
|
|
112
|
+
environment.onError?.(priceResult.reason, {
|
|
113
|
+
source: "governance-token-price",
|
|
114
|
+
chainId: environment.chainId,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
return { stakingInfo, historicalStaking, price };
|
|
23
118
|
}));
|
|
24
|
-
const envStakingInfo = envStakingInfoSettlements
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
.filter((val) => val !== undefined);
|
|
119
|
+
const envStakingInfo = envStakingInfoSettlements.map((s) => s.status === "fulfilled"
|
|
120
|
+
? s.value
|
|
121
|
+
: { stakingInfo: undefined, historicalStaking: undefined, price: 0n });
|
|
28
122
|
const baseEnv = envsWithStaking.find((env) => env.chainId === base.id);
|
|
29
|
-
const
|
|
30
|
-
const
|
|
31
|
-
|
|
123
|
+
const baseStakingTokenKey = baseEnv?.config.contracts.stakingToken;
|
|
124
|
+
const baseTokens = baseEnv?.config.tokens;
|
|
125
|
+
const baseStkTokenAddress = baseStakingTokenKey
|
|
126
|
+
? baseTokens?.[baseStakingTokenKey]?.address
|
|
32
127
|
: undefined;
|
|
33
|
-
const baseStakingApr =
|
|
128
|
+
const baseStakingApr = baseStkTokenAddress
|
|
129
|
+
? await getMerklStakingApr(baseStkTokenAddress)
|
|
130
|
+
: 0;
|
|
34
131
|
const result = envsWithStaking.flatMap((curr, index) => {
|
|
35
|
-
const
|
|
36
|
-
const
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
132
|
+
const govKey = curr.config.contracts.governanceToken;
|
|
133
|
+
const stkKey = curr.config.contracts.stakingToken;
|
|
134
|
+
const currTokens = curr.config.tokens;
|
|
135
|
+
if (!govKey || !stkKey)
|
|
136
|
+
return [];
|
|
137
|
+
const token = currTokens[govKey];
|
|
138
|
+
const stakingToken = currTokens[stkKey];
|
|
139
|
+
if (!token || !stakingToken)
|
|
140
|
+
return [];
|
|
141
|
+
// envStakingInfo is built via Promise.allSettled with an explicit
|
|
142
|
+
// fallback object at the .map below, so entries are always defined here.
|
|
143
|
+
const { stakingInfo: envStakingInfoData, historicalStaking, price, } = envStakingInfo[index];
|
|
40
144
|
const isBase = curr.chainId === base.id;
|
|
41
|
-
if (!envStakingInfoData ||
|
|
42
|
-
(isBase && !envStakingInfoDataAfterX28Proposal)) {
|
|
145
|
+
if (!envStakingInfoData || (isBase && !historicalStaking)) {
|
|
43
146
|
return [];
|
|
44
147
|
}
|
|
45
148
|
const { cooldown, distributionEnd, emissionPerSecond: emissionPerSecondRaw, totalSupply: totalSupplyRaw, unstakeWindow, } = envStakingInfoData;
|
|
46
|
-
|
|
47
|
-
const governanceTokenPrice = new Amount((envGovernanceTokenPriceData ?? 0n), 18);
|
|
149
|
+
const tokenPrice = new Amount(price, 18);
|
|
48
150
|
const totalSupply = new Amount(totalSupplyRaw, 18);
|
|
49
151
|
const emissionPerSecond = new Amount(emissionPerSecondRaw, 18);
|
|
50
152
|
const emissionPerYear = emissionPerSecond.value * SECONDS_PER_DAY * DAYS_PER_YEAR;
|
|
51
|
-
const apr =
|
|
153
|
+
const apr = totalSupply.value > 0
|
|
154
|
+
? ((emissionPerYear + totalSupply.value) / totalSupply.value - 1) * 100
|
|
155
|
+
: 0;
|
|
52
156
|
const stakingInfo = {
|
|
53
157
|
apr: isBase ? baseStakingApr : apr,
|
|
54
158
|
chainId: curr.chainId,
|
|
55
159
|
cooldown: Number(cooldown),
|
|
56
160
|
distributionEnd: Number(distributionEnd),
|
|
57
161
|
token,
|
|
58
|
-
tokenPrice:
|
|
162
|
+
tokenPrice: tokenPrice.value,
|
|
59
163
|
stakingToken,
|
|
60
164
|
totalSupply,
|
|
61
|
-
totalSupplyUSD: totalSupply.value *
|
|
165
|
+
totalSupplyUSD: totalSupply.value * tokenPrice.value,
|
|
62
166
|
unstakeWindow: Number(unstakeWindow),
|
|
63
167
|
};
|
|
64
168
|
return stakingInfo;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getStakingInfo.js","sourceRoot":"","sources":["../../../actions/governance/getStakingInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEnC,OAAO,EACL,MAAM,EACN,aAAa,EACb,eAAe,EACf,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"getStakingInfo.js","sourceRoot":"","sources":["../../../actions/governance/getStakingInfo.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEnC,OAAO,EAAE,MAAM,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAIxE,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAuB/D;;;GAGG;AACH,KAAK,UAAU,0BAA0B,CACvC,WAAwB,EACxB,WAAoB;IAEpB,MAAM,YAAY,GAAG,WAAW,CAAC,SAAS,CAAC,YAAY,CAAC;IACxD,IAAI,CAAC,YAAY;QAAE,OAAO,SAAS,CAAC;IAEpC,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;QAC/D,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,WAAW,CAAC,CAAC;QACjD,YAAY,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,WAAW,CAAC,CAAC;QACvD,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,CAAC;KAC3C,CAAC,CAAC;IAEH,6EAA6E;IAC7E,8EAA8E;IAC9E,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAC5B,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE;gBAC9B,MAAM,EAAE,uBAAuB;gBAC/B,OAAO,EAAE,WAAW,CAAC,OAAO;aAC7B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IACE,SAAS,CAAC,MAAM,KAAK,UAAU;QAC/B,QAAQ,CAAC,MAAM,KAAK,UAAU;QAC9B,QAAQ,CAAC,MAAM,KAAK,UAAU,EAC9B,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,SAAS,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;QACjE,cAAc,EAAE,QAAQ,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;QACrE,WAAW,EAAE,QAAQ,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;KACnE,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,uBAAuB,CACpC,WAAwB;IAExB,MAAM,YAAY,GAAG,WAAW,CAAC,SAAS,CAAC,YAAY,CAAC;IACxD,IAAI,CAAC,YAAY;QAAE,OAAO,SAAS,CAAC;IAEpC,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;QAC3D,YAAY,CAAC,IAAI,CAAC,gBAAgB,EAAE;QACpC,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE;KACnC,CAAC,CAAC;IAEH,yEAAyE;IACzE,gEAAgE;IAChE,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,CAAC;QAC5C,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAC5B,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE;gBAC9B,MAAM,EAAE,gCAAgC;gBACxC,OAAO,EAAE,WAAW,CAAC,OAAO;aAC7B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,UAAU,IAAI,cAAc,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAC5E,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,SAAS,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;QACjE,aAAa,EACX,cAAc,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;KACpE,CAAC;AACJ,CAAC;AAED,MAAM,kBAAkB,GAAG,CAAC,KAAc,EAA8B,EAAE;IACxE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,OAAO,CACL,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ;QAC9B,OAAO,CAAC,CAAC,cAAc,KAAK,QAAQ;QACpC,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,CAClC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,KAAc,EAAkC,EAAE;IACzE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,OAAO,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,aAAa,KAAK,QAAQ,CAAC;AAC/E,CAAC,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAItC,MAAsB,EACtB,IAAyD;IAEzD,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IAE7B,MAAM,YAAY,GAAG,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAE3D,MAAM,eAAe,GAAG,YAAY,CAAC,MAAM,CACzC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CACpC,CAAC;IAEF,MAAM,eAAe,GACnB,MAAM,CAAC,YACR,EAAE,IAAI,CAAC;IAER,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,GAAG,CACtC,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE;QACxC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;YACvC,WAAW,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC,WAAW,CAAC,CAAC;YACnE,WAAW,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,CAAC;YACpE,WAAW,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE;YAClD,0BAA0B,CAAC,WAAW,EAAE,eAAe,CAAC;SACzD,CAAC,CAAC;QAEH,MAAM,CAAC,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;QAEnE,MAAM,gBAAgB,GACpB,YAAY,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QACvE,MAAM,WAAW,GAAG,kBAAkB,CAAC,gBAAgB,CAAC;YACtD,CAAC,CAAC,gBAAgB;YAClB,CAAC,CAAC,MAAM,0BAA0B,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAE/D,MAAM,aAAa,GACjB,gBAAgB,CAAC,MAAM,KAAK,WAAW;YACrC,CAAC,CAAC,gBAAgB,CAAC,KAAK;YACxB,CAAC,CAAC,SAAS,CAAC;QAChB,MAAM,QAAQ,GAAG,eAAe,CAAC,aAAa,CAAC;YAC7C,CAAC,CAAC,aAAa;YACf,CAAC,CAAC,MAAM,uBAAuB,CAAC,WAAW,CAAC,CAAC;QAE/C,MAAM,YAAY,GAChB,QAAQ,CAAC,MAAM,KAAK,WAAW,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS;YAC7D,CAAC,CAAC,QAAQ,CAAC,KAAK;YAChB,CAAC,CAAC,EAAE,CAAC;QAET,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACjC,WAAW,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE;gBACnC,MAAM,EAAE,wBAAwB;gBAChC,OAAO,EAAE,WAAW,CAAC,OAAO;aAC7B,CAAC,CAAC;QACL,CAAC;QAED,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IACxD,CAAC,CAAC,CACH,CAAC;IAEF,MAAM,WAAW,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAChD,MAAM,YAAY,GAAG,MAAM,mBAAmB,CAC5C,WAAW,EACX,IAAI,CAAC,EAAE,EACP,WAAW,CACZ,CAAC;IAEF,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC;QAClD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,MAG9B,CAAC;QACF,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,IAAI,CAAC,YAAY;YAAE,OAAO,EAAE,CAAC;QAEvC,wEAAwE;QACxE,4CAA4C;QAC5C,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,GAClD,cAAc,CAAC,KAAK,CAAC,CAAC;QAExB,IAAI,CAAC,WAAW,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,CAAC;QAEzC,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,GAAG,WAAW,CAAC;QAC9D,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,aAAa,EAAE,GAAG,QAAQ,CAAC;QAE9D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YACjD,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC7B,OAAO,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACpD,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,MAAM,mBAAmB,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QAEtD,MAAM,cAAc,GAAG,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,MAAM,eAAe,GACnB,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,eAAe,GAAG,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;QAElE,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAEzC,MAAM,eAAe,GAAoB;YACvC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,cAAc,EAAE,QAAQ,GAAG,EAAE;YAC7B,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC;YAC/B,cAAc,EAAE,MAAM,CAAC,cAAc,CAAC;YACtC,cAAc,EAAE,MAAM,CAAC,cAAc,CAAC;YACtC,eAAe,EAAE,MAAM,CAAC,eAAe,CAAC;YACxC,cAAc,EAAE,MAAM;gBACpB,CAAC,CAAC,IAAI,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC;gBACrC,CAAC,CAAC,IAAI,MAAM,CAAC,cAAc,EAAE,EAAE,CAAC;YAClC,KAAK;YACL,YAAY,EAAE,IAAI,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC;YAC1C,UAAU,EAAE,UAAU,CAAC,KAAK;YAC5B,YAAY;YACZ,mBAAmB,EAAE,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;SACjD,CAAC;QAEF,OAAO,eAAe,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,37 +1,59 @@
|
|
|
1
1
|
import { Amount, getEnvironmentFromArgs } from "../../common/index.js";
|
|
2
|
-
import { fetchUserVoteReceipt } from "./governor-api-client.js";
|
|
2
|
+
import { GovernorNotFoundError, SUPPORTED_GOVERNOR_CHAIN_IDS, fetchUserVoteReceipt, isNotFoundError, } from "./governor-api-client.js";
|
|
3
|
+
/**
|
|
4
|
+
* Fetch a user's vote receipts for a proposal.
|
|
5
|
+
*
|
|
6
|
+
* Returns the "didn't vote" stub when the proposal exists on at least one
|
|
7
|
+
* queried chain but the user hasn't voted there. Throws `GovernorNotFoundError`
|
|
8
|
+
* when the proposal doesn't exist on any queried chain — callers can use that
|
|
9
|
+
* to distinguish "the user didn't vote" from "this proposal isn't visible".
|
|
10
|
+
*/
|
|
3
11
|
export async function getUserVoteReceipt(client, args) {
|
|
4
|
-
const { proposalId, userAddress } = args;
|
|
12
|
+
const { proposalId, userAddress, chainId } = args;
|
|
5
13
|
const environment = getEnvironmentFromArgs(client, args);
|
|
6
14
|
if (!environment) {
|
|
7
15
|
return [];
|
|
8
16
|
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
option: 0,
|
|
19
|
-
votes: new Amount(0, 18),
|
|
20
|
-
},
|
|
21
|
-
];
|
|
17
|
+
const tryChains = chainId ? [chainId] : SUPPORTED_GOVERNOR_CHAIN_IDS;
|
|
18
|
+
const collected = [];
|
|
19
|
+
let anyChainAcknowledged = false;
|
|
20
|
+
const notFoundChainIds = [];
|
|
21
|
+
for (const cid of tryChains) {
|
|
22
|
+
try {
|
|
23
|
+
const apiVoteReceipts = await fetchUserVoteReceipt(environment, cid, proposalId, userAddress);
|
|
24
|
+
anyChainAcknowledged = true;
|
|
25
|
+
collected.push(...apiVoteReceipts);
|
|
22
26
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
catch (error) {
|
|
28
|
+
if (isNotFoundError(error)) {
|
|
29
|
+
notFoundChainIds.push(cid);
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
throw error;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (!anyChainAcknowledged) {
|
|
36
|
+
throw new GovernorNotFoundError(notFoundChainIds[0] ?? 0, proposalId);
|
|
31
37
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
38
|
+
if (collected.length === 0) {
|
|
39
|
+
return [
|
|
40
|
+
{
|
|
41
|
+
chainId: environment.chainId,
|
|
42
|
+
proposalId,
|
|
43
|
+
account: userAddress,
|
|
44
|
+
voted: false,
|
|
45
|
+
option: 0,
|
|
46
|
+
votes: new Amount(0, 18),
|
|
47
|
+
},
|
|
48
|
+
];
|
|
35
49
|
}
|
|
50
|
+
return collected.map((apiReceipt) => ({
|
|
51
|
+
chainId: apiReceipt.chainId,
|
|
52
|
+
proposalId,
|
|
53
|
+
account: userAddress,
|
|
54
|
+
voted: true,
|
|
55
|
+
option: apiReceipt.voteValue,
|
|
56
|
+
votes: new Amount(BigInt(apiReceipt.votes), 18),
|
|
57
|
+
}));
|
|
36
58
|
}
|
|
37
59
|
//# sourceMappingURL=getUserVoteReceipt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getUserVoteReceipt.js","sourceRoot":"","sources":["../../../actions/governance/getUserVoteReceipt.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAGvE,OAAO,
|
|
1
|
+
{"version":3,"file":"getUserVoteReceipt.js","sourceRoot":"","sources":["../../../actions/governance/getUserVoteReceipt.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAGvE,OAAO,EAEL,qBAAqB,EACrB,4BAA4B,EAC5B,oBAAoB,EACpB,eAAe,GAChB,MAAM,0BAA0B,CAAC;AAwBlC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAItC,MAAsB,EACtB,IAAyD;IAEzD,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAElD,MAAM,WAAW,GAAG,sBAAsB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,4BAA4B,CAAC;IAErE,MAAM,SAAS,GAAqB,EAAE,CAAC;IACvC,IAAI,oBAAoB,GAAG,KAAK,CAAC;IACjC,MAAM,gBAAgB,GAAa,EAAE,CAAC;IAEtC,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,eAAe,GAAG,MAAM,oBAAoB,CAChD,WAAW,EACX,GAAG,EACH,UAAU,EACV,WAAW,CACZ,CAAC;YACF,oBAAoB,GAAG,IAAI,CAAC;YAC5B,SAAS,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3B,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC3B,SAAS;YACX,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC1B,MAAM,IAAI,qBAAqB,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO;YACL;gBACE,OAAO,EAAE,WAAW,CAAC,OAAO;gBAC5B,UAAU;gBACV,OAAO,EAAE,WAAW;gBACpB,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,CAAC;gBACT,KAAK,EAAE,IAAI,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC;aACzB;SACF,CAAC;IACJ,CAAC;IAED,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACpC,OAAO,EAAE,UAAU,CAAC,OAAO;QAC3B,UAAU;QACV,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,UAAU,CAAC,SAAS;QAC5B,KAAK,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;KAChD,CAAC,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -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"}
|