@moonwell-fi/moonwell-sdk 0.21.0 → 0.22.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 +41 -0
- package/README.md +9 -3
- package/_cjs/actions/beam/common.js +1 -2
- package/_cjs/actions/beam/common.js.map +1 -1
- package/_cjs/actions/core/markets/common.js +146 -96
- package/_cjs/actions/core/markets/common.js.map +1 -1
- package/_cjs/actions/governance/getDelegates.js +2 -7
- package/_cjs/actions/governance/getDelegates.js.map +1 -1
- package/_cjs/actions/governance/getGovernanceTokenInfo.js +7 -12
- package/_cjs/actions/governance/getGovernanceTokenInfo.js.map +1 -1
- package/_cjs/actions/governance/getUserVoteReceipt.js +5 -4
- package/_cjs/actions/governance/getUserVoteReceipt.js.map +1 -1
- package/_cjs/actions/governance/governor-api-client.js.map +1 -1
- package/_cjs/actions/governance/proposals/common.js +73 -6
- package/_cjs/actions/governance/proposals/common.js.map +1 -1
- package/_cjs/actions/governance/proposals/getProposal.js +6 -73
- package/_cjs/actions/governance/proposals/getProposal.js.map +1 -1
- package/_cjs/actions/governance/proposals/getProposals.js +12 -92
- package/_cjs/actions/governance/proposals/getProposals.js.map +1 -1
- package/_cjs/client/createMoonwellClient.js +17 -15
- package/_cjs/client/createMoonwellClient.js.map +1 -1
- package/_cjs/common/index.js +4 -4
- package/_cjs/common/index.js.map +1 -1
- package/_cjs/environments/definitions/governance.js +1 -8
- package/_cjs/environments/definitions/governance.js.map +1 -1
- package/_cjs/environments/index.js +28 -42
- package/_cjs/environments/index.js.map +1 -1
- package/_cjs/environments/types/config.js.map +1 -1
- package/_cjs/errors/version.js +1 -1
- package/_esm/actions/beam/common.js +3 -2
- package/_esm/actions/beam/common.js.map +1 -1
- package/_esm/actions/core/markets/common.js +192 -104
- package/_esm/actions/core/markets/common.js.map +1 -1
- package/_esm/actions/governance/getDelegates.js +8 -8
- package/_esm/actions/governance/getDelegates.js.map +1 -1
- package/_esm/actions/governance/getGovernanceTokenInfo.js +20 -13
- package/_esm/actions/governance/getGovernanceTokenInfo.js.map +1 -1
- package/_esm/actions/governance/getUserVoteReceipt.js +16 -5
- package/_esm/actions/governance/getUserVoteReceipt.js.map +1 -1
- package/_esm/actions/governance/governor-api-client.js +14 -5
- package/_esm/actions/governance/governor-api-client.js.map +1 -1
- package/_esm/actions/governance/proposals/common.js +122 -10
- package/_esm/actions/governance/proposals/common.js.map +1 -1
- package/_esm/actions/governance/proposals/getProposal.js +16 -93
- package/_esm/actions/governance/proposals/getProposal.js.map +1 -1
- package/_esm/actions/governance/proposals/getProposals.js +37 -132
- package/_esm/actions/governance/proposals/getProposals.js.map +1 -1
- package/_esm/client/createMoonwellClient.js +24 -16
- package/_esm/client/createMoonwellClient.js.map +1 -1
- package/_esm/common/index.js +15 -4
- package/_esm/common/index.js.map +1 -1
- package/_esm/environments/definitions/governance.js +5 -9
- package/_esm/environments/definitions/governance.js.map +1 -1
- package/_esm/environments/index.js +2 -14
- package/_esm/environments/index.js.map +1 -1
- package/_esm/environments/types/config.js.map +1 -1
- package/_esm/errors/version.js +1 -1
- package/_types/actions/beam/common.d.ts +1 -1
- package/_types/actions/beam/common.d.ts.map +1 -1
- package/_types/actions/core/markets/common.d.ts.map +1 -1
- package/_types/actions/governance/getGovernanceTokenInfo.d.ts.map +1 -1
- package/_types/actions/governance/getUserVoteReceipt.d.ts.map +1 -1
- package/_types/actions/governance/governor-api-client.d.ts +14 -5
- package/_types/actions/governance/governor-api-client.d.ts.map +1 -1
- package/_types/actions/governance/proposals/common.d.ts +41 -6
- package/_types/actions/governance/proposals/common.d.ts.map +1 -1
- package/_types/actions/governance/proposals/getProposal.d.ts +1 -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/client/createMoonwellClient.d.ts +9 -839
- package/_types/client/createMoonwellClient.d.ts.map +1 -1
- package/_types/common/index.d.ts +11 -0
- package/_types/common/index.d.ts.map +1 -1
- package/_types/environments/definitions/governance.d.ts +0 -7
- package/_types/environments/definitions/governance.d.ts.map +1 -1
- package/_types/environments/index.d.ts +5 -516
- package/_types/environments/index.d.ts.map +1 -1
- package/_types/environments/types/config.d.ts +14 -0
- package/_types/environments/types/config.d.ts.map +1 -1
- package/_types/errors/version.d.ts +1 -1
- package/actions/beam/common.ts +4 -9
- package/actions/core/markets/common.ts +307 -166
- package/actions/governance/getDelegates.ts +8 -8
- package/actions/governance/getGovernanceTokenInfo.ts +23 -15
- package/actions/governance/getUserVoteReceipt.ts +19 -5
- package/actions/governance/governor-api-client.ts +14 -5
- package/actions/governance/proposals/common.ts +143 -10
- package/actions/governance/proposals/getProposal.ts +29 -112
- package/actions/governance/proposals/getProposals.ts +52 -153
- package/client/createMoonwellClient.ts +32 -40
- package/common/index.ts +17 -6
- package/environments/definitions/governance.ts +5 -9
- package/environments/index.ts +28 -70
- package/environments/types/config.ts +14 -0
- package/errors/version.ts +1 -1
- package/package.json +1 -1
- package/_cjs/environments/definitions/moonbeam/contracts.js +0 -22
- package/_cjs/environments/definitions/moonbeam/contracts.js.map +0 -1
- package/_cjs/environments/definitions/moonbeam/core-markets.js +0 -65
- package/_cjs/environments/definitions/moonbeam/core-markets.js.map +0 -1
- package/_cjs/environments/definitions/moonbeam/custom.js +0 -24
- package/_cjs/environments/definitions/moonbeam/custom.js.map +0 -1
- package/_cjs/environments/definitions/moonbeam/environment.js +0 -38
- package/_cjs/environments/definitions/moonbeam/environment.js.map +0 -1
- package/_cjs/environments/definitions/moonbeam/tokens.js +0 -176
- package/_cjs/environments/definitions/moonbeam/tokens.js.map +0 -1
- package/_cjs/environments/definitions/moonriver/contracts.js +0 -19
- package/_cjs/environments/definitions/moonriver/contracts.js.map +0 -1
- package/_cjs/environments/definitions/moonriver/core-markets.js +0 -46
- package/_cjs/environments/definitions/moonriver/core-markets.js.map +0 -1
- package/_cjs/environments/definitions/moonriver/custom.js +0 -12
- package/_cjs/environments/definitions/moonriver/custom.js.map +0 -1
- package/_cjs/environments/definitions/moonriver/environment.js +0 -36
- package/_cjs/environments/definitions/moonriver/environment.js.map +0 -1
- package/_cjs/environments/definitions/moonriver/tokens.js +0 -110
- package/_cjs/environments/definitions/moonriver/tokens.js.map +0 -1
- package/_esm/environments/definitions/moonbeam/contracts.js +0 -19
- package/_esm/environments/definitions/moonbeam/contracts.js.map +0 -1
- package/_esm/environments/definitions/moonbeam/core-markets.js +0 -62
- package/_esm/environments/definitions/moonbeam/core-markets.js.map +0 -1
- package/_esm/environments/definitions/moonbeam/custom.js +0 -21
- package/_esm/environments/definitions/moonbeam/custom.js.map +0 -1
- package/_esm/environments/definitions/moonbeam/environment.js +0 -32
- package/_esm/environments/definitions/moonbeam/environment.js.map +0 -1
- package/_esm/environments/definitions/moonbeam/tokens.js +0 -173
- package/_esm/environments/definitions/moonbeam/tokens.js.map +0 -1
- package/_esm/environments/definitions/moonriver/contracts.js +0 -16
- package/_esm/environments/definitions/moonriver/contracts.js.map +0 -1
- package/_esm/environments/definitions/moonriver/core-markets.js +0 -43
- package/_esm/environments/definitions/moonriver/core-markets.js.map +0 -1
- package/_esm/environments/definitions/moonriver/custom.js +0 -9
- package/_esm/environments/definitions/moonriver/custom.js.map +0 -1
- package/_esm/environments/definitions/moonriver/environment.js +0 -31
- package/_esm/environments/definitions/moonriver/environment.js.map +0 -1
- package/_esm/environments/definitions/moonriver/tokens.js +0 -107
- package/_esm/environments/definitions/moonriver/tokens.js.map +0 -1
- package/_types/environments/definitions/moonbeam/contracts.d.ts +0 -14
- package/_types/environments/definitions/moonbeam/contracts.d.ts.map +0 -1
- package/_types/environments/definitions/moonbeam/core-markets.d.ts +0 -57
- package/_types/environments/definitions/moonbeam/core-markets.d.ts.map +0 -1
- package/_types/environments/definitions/moonbeam/custom.d.ts +0 -25
- package/_types/environments/definitions/moonbeam/custom.d.ts.map +0 -1
- package/_types/environments/definitions/moonbeam/environment.d.ts +0 -265
- package/_types/environments/definitions/moonbeam/environment.d.ts.map +0 -1
- package/_types/environments/definitions/moonbeam/tokens.d.ts +0 -171
- package/_types/environments/definitions/moonbeam/tokens.d.ts.map +0 -1
- package/_types/environments/definitions/moonriver/contracts.d.ts +0 -11
- package/_types/environments/definitions/moonriver/contracts.d.ts.map +0 -1
- package/_types/environments/definitions/moonriver/core-markets.d.ts +0 -38
- package/_types/environments/definitions/moonriver/core-markets.d.ts.map +0 -1
- package/_types/environments/definitions/moonriver/custom.d.ts +0 -8
- package/_types/environments/definitions/moonriver/custom.d.ts.map +0 -1
- package/_types/environments/definitions/moonriver/environment.d.ts +0 -159
- package/_types/environments/definitions/moonriver/environment.d.ts.map +0 -1
- package/_types/environments/definitions/moonriver/tokens.d.ts +0 -105
- package/_types/environments/definitions/moonriver/tokens.d.ts.map +0 -1
- package/environments/definitions/moonbeam/contracts.ts +0 -19
- package/environments/definitions/moonbeam/core-markets.ts +0 -62
- package/environments/definitions/moonbeam/custom.ts +0 -21
- package/environments/definitions/moonbeam/environment.ts +0 -39
- package/environments/definitions/moonbeam/tokens.ts +0 -173
- package/environments/definitions/moonriver/contracts.ts +0 -16
- package/environments/definitions/moonriver/core-markets.ts +0 -43
- package/environments/definitions/moonriver/custom.ts +0 -9
- package/environments/definitions/moonriver/environment.ts +0 -38
- package/environments/definitions/moonriver/tokens.ts +0 -107
|
@@ -1,16 +1,20 @@
|
|
|
1
|
-
import { moonbeam, moonriver } from "viem/chains";
|
|
2
1
|
import type { MoonwellClient } from "../../../client/createMoonwellClient.js";
|
|
3
|
-
import {
|
|
2
|
+
import { getEnvironmentsFromArgs } from "../../../common/index.js";
|
|
4
3
|
import type { OptionalNetworkParameterType } from "../../../common/types.js";
|
|
5
4
|
import type { Chain, Environment } from "../../../environments/index.js";
|
|
6
5
|
import * as logger from "../../../logger/console.js";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
6
|
+
import type { Proposal } from "../../../types/proposal.js";
|
|
7
|
+
import {
|
|
8
|
+
type ApiProposal,
|
|
9
|
+
SUPPORTED_GOVERNOR_CHAIN_IDS,
|
|
10
|
+
fetchAllProposals,
|
|
11
|
+
} from "../governor-api-client.js";
|
|
9
12
|
import { resolveIpfsDescriptions } from "../ipfs.js";
|
|
10
13
|
import {
|
|
11
|
-
formatApiProposalData,
|
|
12
14
|
getProposalsOnChainData,
|
|
15
|
+
mapApiProposalToProposal,
|
|
13
16
|
readCrossChainQuorums,
|
|
17
|
+
resolveGovernanceEnvironment,
|
|
14
18
|
} from "./common.js";
|
|
15
19
|
|
|
16
20
|
export type GetProposalsParameters<
|
|
@@ -31,30 +35,14 @@ export async function getProposals<
|
|
|
31
35
|
|
|
32
36
|
const environments = getEnvironmentsFromArgs(client, args);
|
|
33
37
|
|
|
34
|
-
const
|
|
35
|
-
(environment) =>
|
|
36
|
-
environment.chainId === moonbeam.id ||
|
|
37
|
-
environment.chainId === moonriver.id,
|
|
38
|
-
);
|
|
38
|
+
const governanceEnvironment = resolveGovernanceEnvironment(environments);
|
|
39
39
|
|
|
40
|
-
if (
|
|
40
|
+
if (!governanceEnvironment) {
|
|
41
41
|
logger.end(logId);
|
|
42
42
|
return [];
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
const
|
|
46
|
-
governanceEnvironments.map(async (governanceEnvironment) => {
|
|
47
|
-
if (governanceEnvironment.chainId === moonbeam.id) {
|
|
48
|
-
// Moonbeam + Ethereum: Governor API (chainIds 1 and 1284)
|
|
49
|
-
return getMoonbeamProposals(governanceEnvironment);
|
|
50
|
-
} else {
|
|
51
|
-
// Moonriver: Governor API, single legacy governor (chainId 1285)
|
|
52
|
-
return getMoonriverProposals(governanceEnvironment);
|
|
53
|
-
}
|
|
54
|
-
}),
|
|
55
|
-
);
|
|
56
|
-
|
|
57
|
-
const proposals = allProposals.flat();
|
|
45
|
+
const proposals = await fetchGovernorProposals(governanceEnvironment);
|
|
58
46
|
// Newer multigov-ethereum proposals (chainId=1) and historical Moonbeam
|
|
59
47
|
// proposals (chainId=1284) restart their proposalId counters from 1, so IDs
|
|
60
48
|
// may collide across chains. Sort by proposalId desc with chainId as a
|
|
@@ -70,27 +58,34 @@ export async function getProposals<
|
|
|
70
58
|
}
|
|
71
59
|
|
|
72
60
|
/**
|
|
73
|
-
* Fetch
|
|
61
|
+
* Fetch every proposal the Governor API serves, across all governance chains.
|
|
74
62
|
*
|
|
75
|
-
*
|
|
76
|
-
* - chainId=1
|
|
77
|
-
* - chainId=1284 (Moonbeam)
|
|
63
|
+
* One indexer DO serves them all:
|
|
64
|
+
* - chainId=1 (Ethereum) — the active multigov contract
|
|
65
|
+
* - chainId=1284 (Moonbeam) — historical archive, chain halted
|
|
66
|
+
* - chainId=1285 (Moonriver) — legacy Apollo governor, chain halted
|
|
78
67
|
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
68
|
+
* The sunset chains keep appearing here on purpose: the indexer still has their
|
|
69
|
+
* proposals even though no RPC exists for them any more, so the governance
|
|
70
|
+
* record stays readable (MOO-551). What they lose is the on-chain half —
|
|
71
|
+
* `getProposalsOnChainData` finds no environment for 1284/1285 and derives their
|
|
72
|
+
* state from indexer events, leaving quorum and eta unset.
|
|
73
|
+
*
|
|
74
|
+
* `Promise.allSettled` so one chain's outage degrades to a missing slice rather
|
|
75
|
+
* than an empty list.
|
|
81
76
|
*/
|
|
82
|
-
async function
|
|
77
|
+
async function fetchGovernorProposals(
|
|
83
78
|
governanceEnvironment: Environment,
|
|
84
79
|
): Promise<Proposal[]> {
|
|
85
|
-
const results = await Promise.allSettled(
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
80
|
+
const results = await Promise.allSettled(
|
|
81
|
+
SUPPORTED_GOVERNOR_CHAIN_IDS.map((chainId) =>
|
|
82
|
+
fetchAllProposals(governanceEnvironment, { chainId }),
|
|
83
|
+
),
|
|
84
|
+
);
|
|
89
85
|
|
|
90
|
-
const chainsAttempted: ReadonlyArray<1 | 1284> = [1, 1284];
|
|
91
86
|
const apiProposals: ApiProposal[] = [];
|
|
92
87
|
results.forEach((result, index) => {
|
|
93
|
-
const chainId =
|
|
88
|
+
const chainId = SUPPORTED_GOVERNOR_CHAIN_IDS[index];
|
|
94
89
|
if (result.status === "fulfilled") {
|
|
95
90
|
apiProposals.push(...result.value);
|
|
96
91
|
} else if (chainId !== undefined) {
|
|
@@ -109,44 +104,13 @@ async function getMoonbeamProposals(
|
|
|
109
104
|
}
|
|
110
105
|
|
|
111
106
|
/**
|
|
112
|
-
*
|
|
107
|
+
* Governor-API pipeline: resolve IPFS descriptions + cross-chain quorums in
|
|
108
|
+
* parallel, read on-chain data, then map each ApiProposal to a Proposal.
|
|
113
109
|
*
|
|
114
|
-
*
|
|
115
|
-
*
|
|
116
|
-
*
|
|
117
|
-
*
|
|
118
|
-
*/
|
|
119
|
-
async function getMoonriverProposals(
|
|
120
|
-
governanceEnvironment: Environment,
|
|
121
|
-
): Promise<Proposal[]> {
|
|
122
|
-
// Moonriver is a single chain, so there's no other chain to "continue with"
|
|
123
|
-
// like the Moonbeam fan-out — but a bare throw would reject the whole
|
|
124
|
-
// `Promise.all` in getProposals and drop Moonbeam/Ethereum results too. Mirror
|
|
125
|
-
// the per-chain handling getMoonbeamProposals uses: report the outage via
|
|
126
|
-
// onError and degrade to an empty Moonriver list instead of rejecting.
|
|
127
|
-
let apiProposals: ApiProposal[] = [];
|
|
128
|
-
try {
|
|
129
|
-
apiProposals = await fetchAllProposals(governanceEnvironment, {
|
|
130
|
-
chainId: moonriver.id,
|
|
131
|
-
});
|
|
132
|
-
} catch (reason) {
|
|
133
|
-
console.warn(
|
|
134
|
-
`[getProposals] Failed to fetch proposals for chainId=${moonriver.id}; continuing with an empty Moonriver list.`,
|
|
135
|
-
reason,
|
|
136
|
-
);
|
|
137
|
-
governanceEnvironment.onError?.(reason, {
|
|
138
|
-
source: "governance-proposals",
|
|
139
|
-
chainId: moonriver.id,
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
return buildProposals(apiProposals, governanceEnvironment);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
* Shared Governor-API pipeline: resolve IPFS descriptions + cross-chain quorums
|
|
147
|
-
* in parallel, read on-chain data, then map each ApiProposal to a Proposal.
|
|
148
|
-
* Used by both the Moonbeam/Ethereum and Moonriver paths so the mapping stays
|
|
149
|
-
* in one place.
|
|
110
|
+
* Single caller (`fetchGovernorProposals`) since the sunset removed the separate
|
|
111
|
+
* `getMoonbeamProposals` / `getMoonriverProposals` entry points (MOO-551) —
|
|
112
|
+
* kept as its own function because it is the list-shaped counterpart to
|
|
113
|
+
* `getProposal`'s single-proposal pipeline, and the two are read together.
|
|
150
114
|
*/
|
|
151
115
|
async function buildProposals(
|
|
152
116
|
apiProposals: ApiProposal[],
|
|
@@ -164,85 +128,20 @@ async function buildProposals(
|
|
|
164
128
|
{ crossChainQuorums },
|
|
165
129
|
);
|
|
166
130
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
now <= apiProposal.votingEndTime
|
|
182
|
-
) {
|
|
183
|
-
proposalState = ProposalState.Active;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
if (formattedData.executed) {
|
|
187
|
-
proposalState = ProposalState.Executed;
|
|
188
|
-
} else if (
|
|
189
|
-
isMultichain &&
|
|
190
|
-
onChainData.votesCollected &&
|
|
191
|
-
now > apiProposal.votingEndTime &&
|
|
192
|
-
proposalState === ProposalState.Succeeded
|
|
193
|
-
) {
|
|
194
|
-
// Succeeded with collection done means "awaiting execution" — surface
|
|
195
|
-
// as Queued so the frontend renders the "Ready to Execute" timeline
|
|
196
|
-
// step. Defeated/Canceled/Executed must NOT be promoted: under the new
|
|
197
|
-
// state-machine-based votesCollected, those terminal states also
|
|
198
|
-
// satisfy `votesCollected: true`, so a `< Queued` gate would mislabel
|
|
199
|
-
// them.
|
|
200
|
-
proposalState = ProposalState.Queued;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
const proposal: Proposal = {
|
|
204
|
-
id: apiProposal.proposalId,
|
|
205
|
-
chainId: apiProposal.chainId,
|
|
206
|
-
proposalId: apiProposal.proposalId,
|
|
207
|
-
proposer: apiProposal.proposer as `0x${string}`,
|
|
208
|
-
eta: onChainData.eta,
|
|
209
|
-
startTimestamp: apiProposal.votingStartTime,
|
|
210
|
-
endTimestamp: apiProposal.votingEndTime,
|
|
211
|
-
startBlock: Number(apiProposal.blockNumber),
|
|
212
|
-
forVotes: formattedData.forVotes,
|
|
213
|
-
againstVotes: formattedData.againstVotes,
|
|
214
|
-
abstainVotes: formattedData.abstainVotes,
|
|
215
|
-
totalVotes: formattedData.totalVotes,
|
|
216
|
-
canceled: formattedData.canceled,
|
|
217
|
-
executed: formattedData.executed,
|
|
218
|
-
quorum: new Amount(onChainData.quorum, 18),
|
|
219
|
-
state: proposalState,
|
|
220
|
-
// Extended data
|
|
221
|
-
title: formattedData.title,
|
|
222
|
-
subtitle: formattedData.subtitle,
|
|
223
|
-
description: apiProposal.description,
|
|
224
|
-
targets: apiProposal.targets,
|
|
225
|
-
calldatas: apiProposal.calldatas,
|
|
226
|
-
// Legacy-governor proposals (Moonriver, early Moonbeam) carry the function
|
|
227
|
-
// signature separately from the selector-less calldata; pass it through so
|
|
228
|
-
// consumers can decode the call. Empty for multichain-governor proposals.
|
|
229
|
-
signatures: apiProposal.signatures ?? [],
|
|
230
|
-
stateChanges: formattedData.stateChanges,
|
|
231
|
-
environment: governanceEnvironment,
|
|
232
|
-
};
|
|
233
|
-
|
|
234
|
-
if (apiProposal.snapshotBlocks) {
|
|
235
|
-
proposal.snapshotBlocks = apiProposal.snapshotBlocks;
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
if (isMultichain) {
|
|
239
|
-
proposal.multichain = {
|
|
240
|
-
id: apiProposal.proposalId,
|
|
241
|
-
votesCollected: onChainData.votesCollected,
|
|
242
|
-
};
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
return proposal;
|
|
131
|
+
// `getProposalsOnChainData` maps 1:1 over its input, so every index resolves —
|
|
132
|
+
// guard rather than assert, so the invariant is enforced instead of asserted
|
|
133
|
+
// away if that ever stops holding.
|
|
134
|
+
const proposals: Proposal[] = apiProposals.flatMap((apiProposal, index) => {
|
|
135
|
+
const onChainData = onChainDataList[index];
|
|
136
|
+
return onChainData
|
|
137
|
+
? [
|
|
138
|
+
mapApiProposalToProposal(
|
|
139
|
+
apiProposal,
|
|
140
|
+
onChainData,
|
|
141
|
+
governanceEnvironment,
|
|
142
|
+
),
|
|
143
|
+
]
|
|
144
|
+
: [];
|
|
246
145
|
});
|
|
247
146
|
|
|
248
147
|
return proposals;
|
|
@@ -5,8 +5,6 @@ import {
|
|
|
5
5
|
type BaseEnvironment,
|
|
6
6
|
type Environment,
|
|
7
7
|
type EthereumEnvironment,
|
|
8
|
-
type MoonbeamEnvironment,
|
|
9
|
-
type MoonriverEnvironment,
|
|
10
8
|
type OptimismEnvironment,
|
|
11
9
|
type PolygonEnvironment,
|
|
12
10
|
type SupportedChains,
|
|
@@ -15,10 +13,9 @@ import {
|
|
|
15
13
|
base,
|
|
16
14
|
createEnvironment,
|
|
17
15
|
ethereum,
|
|
18
|
-
moonbeam,
|
|
19
|
-
moonriver,
|
|
20
16
|
optimism,
|
|
21
17
|
polygon,
|
|
18
|
+
supportedChains,
|
|
22
19
|
} from "../environments/index.js";
|
|
23
20
|
import { actions } from "./createActions.js";
|
|
24
21
|
|
|
@@ -33,16 +30,6 @@ export type MoonwellClient<
|
|
|
33
30
|
name,
|
|
34
31
|
"optimism"
|
|
35
32
|
>]: OptimismEnvironment;
|
|
36
|
-
} & {
|
|
37
|
-
[name in keyof environments as Extract<
|
|
38
|
-
name,
|
|
39
|
-
"moonbeam"
|
|
40
|
-
>]: MoonbeamEnvironment;
|
|
41
|
-
} & {
|
|
42
|
-
[name in keyof environments as Extract<
|
|
43
|
-
name,
|
|
44
|
-
"moonriver"
|
|
45
|
-
>]: MoonriverEnvironment;
|
|
46
33
|
} & {
|
|
47
34
|
[name in keyof environments as Extract<
|
|
48
35
|
name,
|
|
@@ -86,25 +73,40 @@ export const createMoonwellClient = <const networks>(config: {
|
|
|
86
73
|
config.networks as NetworksConfig<SupportedChains>,
|
|
87
74
|
).reduce((prev, [curr, networkConfig]) => {
|
|
88
75
|
if (!networkConfig) return prev;
|
|
76
|
+
|
|
77
|
+
// Every supported key gets its own branch and unknown keys throw. The old
|
|
78
|
+
// shape ended in a bare `: polygon` fallthrough, so a key TypeScript would
|
|
79
|
+
// have rejected — `moonbeam`/`moonriver` after the sunset (MOO-551), or any
|
|
80
|
+
// typo from a JS consumer — silently built a *Polygon* environment stored
|
|
81
|
+
// under that key, wired with Polygon addresses over the caller's RPC. Fail
|
|
82
|
+
// loudly instead, matching `createEnvironment`'s "Unsupported chainId".
|
|
83
|
+
const chain =
|
|
84
|
+
curr === "base"
|
|
85
|
+
? base
|
|
86
|
+
: curr === "optimism"
|
|
87
|
+
? optimism
|
|
88
|
+
: curr === "ethereum"
|
|
89
|
+
? ethereum
|
|
90
|
+
: curr === "avalanche"
|
|
91
|
+
? avalanche
|
|
92
|
+
: curr === "arbitrum"
|
|
93
|
+
? arbitrum
|
|
94
|
+
: curr === "polygon"
|
|
95
|
+
? polygon
|
|
96
|
+
: undefined;
|
|
97
|
+
|
|
98
|
+
if (!chain) {
|
|
99
|
+
throw new Error(
|
|
100
|
+
`Unsupported network "${curr}". Supported networks: ${Object.keys(
|
|
101
|
+
supportedChains,
|
|
102
|
+
).join(", ")}.`,
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
89
106
|
return {
|
|
90
107
|
...prev,
|
|
91
108
|
[curr]: createEnvironment({
|
|
92
|
-
chain
|
|
93
|
-
curr === "base"
|
|
94
|
-
? base
|
|
95
|
-
: curr === "optimism"
|
|
96
|
-
? optimism
|
|
97
|
-
: curr === "moonbeam"
|
|
98
|
-
? moonbeam
|
|
99
|
-
: curr === "moonriver"
|
|
100
|
-
? moonriver
|
|
101
|
-
: curr === "ethereum"
|
|
102
|
-
? ethereum
|
|
103
|
-
: curr === "avalanche"
|
|
104
|
-
? avalanche
|
|
105
|
-
: curr === "arbitrum"
|
|
106
|
-
? arbitrum
|
|
107
|
-
: polygon,
|
|
109
|
+
chain,
|
|
108
110
|
rpcUrls: networkConfig.rpcUrls,
|
|
109
111
|
}),
|
|
110
112
|
};
|
|
@@ -116,16 +118,6 @@ export const createMoonwellClient = <const networks>(config: {
|
|
|
116
118
|
name,
|
|
117
119
|
"optimism"
|
|
118
120
|
>]: OptimismEnvironment;
|
|
119
|
-
} & {
|
|
120
|
-
[name in keyof networks as Extract<
|
|
121
|
-
name,
|
|
122
|
-
"moonbeam"
|
|
123
|
-
>]: MoonbeamEnvironment;
|
|
124
|
-
} & {
|
|
125
|
-
[name in keyof networks as Extract<
|
|
126
|
-
name,
|
|
127
|
-
"moonriver"
|
|
128
|
-
>]: MoonriverEnvironment;
|
|
129
121
|
} & {
|
|
130
122
|
[name in keyof networks as Extract<
|
|
131
123
|
name,
|
package/common/index.ts
CHANGED
|
@@ -136,6 +136,17 @@ export const getEnvironmentFromArgs = (
|
|
|
136
136
|
return undefined;
|
|
137
137
|
};
|
|
138
138
|
|
|
139
|
+
/**
|
|
140
|
+
* Resolve the environments an action should run against.
|
|
141
|
+
*
|
|
142
|
+
* A `chainId`/`network` that matches no registered environment yields an EMPTY
|
|
143
|
+
* array, not `[undefined]`. The single-element-holding-undefined shape used to
|
|
144
|
+
* leak out of here and every caller dereferences what it gets back, so an
|
|
145
|
+
* unmatched selector crashed with an opaque `Cannot read properties of
|
|
146
|
+
* undefined` instead of hitting the caller's own "nothing to do" guard. That
|
|
147
|
+
* became reachable on ordinary input once Moonbeam/Moonriver stopped being
|
|
148
|
+
* registrable (MOO-551) while `getProposal` still teaches callers to pass 1284.
|
|
149
|
+
*/
|
|
139
150
|
export const getEnvironmentsFromArgs = (
|
|
140
151
|
client: MoonwellClient,
|
|
141
152
|
args?: { chainId?: number; network?: any },
|
|
@@ -150,15 +161,15 @@ export const getEnvironmentsFromArgs = (
|
|
|
150
161
|
};
|
|
151
162
|
|
|
152
163
|
if (Number.isInteger(chainId)) {
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
] as Environment[];
|
|
164
|
+
const matched = Object.values(client.environments).find(
|
|
165
|
+
(env) => env.chainId === chainId,
|
|
166
|
+
);
|
|
167
|
+
return matched ? [matched] : [];
|
|
158
168
|
}
|
|
159
169
|
|
|
160
170
|
if (network) {
|
|
161
|
-
|
|
171
|
+
const matched = client.environments[network];
|
|
172
|
+
return matched ? [matched] : [];
|
|
162
173
|
}
|
|
163
174
|
}
|
|
164
175
|
return Object.values(client.environments as Environment[]).filter((r) =>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { base, mainnet,
|
|
1
|
+
import { base, mainnet, optimism } from "viem/chains";
|
|
2
2
|
|
|
3
3
|
export interface GovernanceTokenInfo {
|
|
4
4
|
id: string;
|
|
@@ -23,14 +23,10 @@ export const GovernanceTokensConfig = createGovernanceTokensConfig({
|
|
|
23
23
|
id: "WELL",
|
|
24
24
|
symbol: "WELL",
|
|
25
25
|
name: "WELL",
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
id: "MFAM",
|
|
31
|
-
symbol: "MFAM",
|
|
32
|
-
name: "MFAM",
|
|
33
|
-
chainIds: [moonriver.id] as number[],
|
|
26
|
+
// Moonbeam (1284) dropped with the sunset (MOO-551): the chain is halted, so
|
|
27
|
+
// it can no longer serve voting-power reads. MFAM/Moonriver is gone for the
|
|
28
|
+
// same reason — Apollo governance ended with the chain.
|
|
29
|
+
chainIds: [base.id, optimism.id, mainnet.id] as number[],
|
|
34
30
|
testnet: false,
|
|
35
31
|
},
|
|
36
32
|
});
|
package/environments/index.ts
CHANGED
|
@@ -15,18 +15,6 @@ import {
|
|
|
15
15
|
createEnvironment as createBaseEnvironment,
|
|
16
16
|
} from "./definitions/base/environment.js";
|
|
17
17
|
|
|
18
|
-
import {
|
|
19
|
-
createEnvironment as createMoonbeamEnvironment,
|
|
20
|
-
type markets as moonbeamMarkets,
|
|
21
|
-
type tokens as moonbeamTokens,
|
|
22
|
-
} from "./definitions/moonbeam/environment.js";
|
|
23
|
-
|
|
24
|
-
import {
|
|
25
|
-
createEnvironment as createMoonriverEnvironment,
|
|
26
|
-
type markets as moonriverMarkets,
|
|
27
|
-
type tokens as moonriverTokens,
|
|
28
|
-
} from "./definitions/moonriver/environment.js";
|
|
29
|
-
|
|
30
18
|
import {
|
|
31
19
|
createEnvironment as createOptimismEnvironment,
|
|
32
20
|
type markets as optimismMarkets,
|
|
@@ -60,7 +48,7 @@ import {
|
|
|
60
48
|
type tokens as polygonTokens,
|
|
61
49
|
} from "./definitions/polygon/environment.js";
|
|
62
50
|
|
|
63
|
-
import {
|
|
51
|
+
import { optimism } from "viem/chains";
|
|
64
52
|
import type { Environment, TokenConfig } from "./types/config.js";
|
|
65
53
|
|
|
66
54
|
export {
|
|
@@ -69,8 +57,6 @@ export {
|
|
|
69
57
|
base,
|
|
70
58
|
ethereum,
|
|
71
59
|
GovernanceTokensConfig,
|
|
72
|
-
moonbeam,
|
|
73
|
-
moonriver,
|
|
74
60
|
optimism,
|
|
75
61
|
polygon,
|
|
76
62
|
supportedChains,
|
|
@@ -92,8 +78,6 @@ export type {
|
|
|
92
78
|
const supportedChainsIds: { [id: number]: keyof typeof supportedChains } = {
|
|
93
79
|
[base.id]: "base",
|
|
94
80
|
[optimism.id]: "optimism",
|
|
95
|
-
[moonriver.id]: "moonriver",
|
|
96
|
-
[moonbeam.id]: "moonbeam",
|
|
97
81
|
[ethereum.id]: "ethereum",
|
|
98
82
|
[avalanche.id]: "avalanche",
|
|
99
83
|
[arbitrum.id]: "arbitrum",
|
|
@@ -103,8 +87,6 @@ const supportedChainsIds: { [id: number]: keyof typeof supportedChains } = {
|
|
|
103
87
|
const supportedChains = {
|
|
104
88
|
base: base,
|
|
105
89
|
optimism: optimism,
|
|
106
|
-
moonriver: moonriver,
|
|
107
|
-
moonbeam: moonbeam,
|
|
108
90
|
ethereum: ethereum,
|
|
109
91
|
avalanche: avalanche,
|
|
110
92
|
arbitrum: arbitrum,
|
|
@@ -115,10 +97,6 @@ type SupportedChains = Prettify<keyof typeof supportedChains>;
|
|
|
115
97
|
type SupportedChainsIds = Prettify<keyof typeof supportedChainsIds>;
|
|
116
98
|
|
|
117
99
|
export type BaseEnvironment = ReturnType<typeof createBaseEnvironment>;
|
|
118
|
-
export type MoonbeamEnvironment = ReturnType<typeof createMoonbeamEnvironment>;
|
|
119
|
-
export type MoonriverEnvironment = ReturnType<
|
|
120
|
-
typeof createMoonriverEnvironment
|
|
121
|
-
>;
|
|
122
100
|
export type OptimismEnvironment = ReturnType<typeof createOptimismEnvironment>;
|
|
123
101
|
export type EthereumEnvironment = ReturnType<typeof createEthereumEnvironment>;
|
|
124
102
|
export type AvalancheEnvironment = ReturnType<
|
|
@@ -129,21 +107,17 @@ export type PolygonEnvironment = ReturnType<typeof createPolygonEnvironment>;
|
|
|
129
107
|
|
|
130
108
|
export type GetEnvironment<chain> = chain extends typeof base
|
|
131
109
|
? BaseEnvironment
|
|
132
|
-
: chain extends typeof
|
|
133
|
-
?
|
|
134
|
-
: chain extends typeof
|
|
135
|
-
?
|
|
136
|
-
: chain extends typeof
|
|
137
|
-
?
|
|
138
|
-
: chain extends typeof
|
|
139
|
-
?
|
|
140
|
-
: chain extends typeof
|
|
141
|
-
?
|
|
142
|
-
:
|
|
143
|
-
? ArbitrumEnvironment
|
|
144
|
-
: chain extends typeof polygon
|
|
145
|
-
? PolygonEnvironment
|
|
146
|
-
: undefined;
|
|
110
|
+
: chain extends typeof optimism
|
|
111
|
+
? OptimismEnvironment
|
|
112
|
+
: chain extends typeof ethereum
|
|
113
|
+
? EthereumEnvironment
|
|
114
|
+
: chain extends typeof avalanche
|
|
115
|
+
? AvalancheEnvironment
|
|
116
|
+
: chain extends typeof arbitrum
|
|
117
|
+
? ArbitrumEnvironment
|
|
118
|
+
: chain extends typeof polygon
|
|
119
|
+
? PolygonEnvironment
|
|
120
|
+
: undefined;
|
|
147
121
|
|
|
148
122
|
export const createEnvironment = <const chain extends Chain>(config: {
|
|
149
123
|
chain: chain;
|
|
@@ -152,12 +126,6 @@ export const createEnvironment = <const chain extends Chain>(config: {
|
|
|
152
126
|
switch (config.chain.id) {
|
|
153
127
|
case base.id:
|
|
154
128
|
return createBaseEnvironment(config.rpcUrls) as GetEnvironment<chain>;
|
|
155
|
-
case moonbeam.id:
|
|
156
|
-
return createMoonbeamEnvironment(config.rpcUrls) as GetEnvironment<chain>;
|
|
157
|
-
case moonriver.id:
|
|
158
|
-
return createMoonriverEnvironment(
|
|
159
|
-
config.rpcUrls,
|
|
160
|
-
) as GetEnvironment<chain>;
|
|
161
129
|
case optimism.id:
|
|
162
130
|
return createOptimismEnvironment(config.rpcUrls) as GetEnvironment<chain>;
|
|
163
131
|
case ethereum.id:
|
|
@@ -177,8 +145,6 @@ export const createEnvironment = <const chain extends Chain>(config: {
|
|
|
177
145
|
|
|
178
146
|
export const publicEnvironments = {
|
|
179
147
|
base: createBaseEnvironment(),
|
|
180
|
-
moonbeam: createMoonbeamEnvironment(),
|
|
181
|
-
moonriver: createMoonriverEnvironment(),
|
|
182
148
|
optimism: createOptimismEnvironment(),
|
|
183
149
|
ethereum: createEthereumEnvironment(),
|
|
184
150
|
avalanche: createAvalancheEnvironment(),
|
|
@@ -188,33 +154,25 @@ export const publicEnvironments = {
|
|
|
188
154
|
|
|
189
155
|
export type TokensType<environment> = environment extends BaseEnvironment
|
|
190
156
|
? typeof baseTokens
|
|
191
|
-
: environment extends
|
|
192
|
-
? typeof
|
|
193
|
-
: environment extends
|
|
194
|
-
? typeof
|
|
195
|
-
: environment extends
|
|
196
|
-
? typeof
|
|
197
|
-
: environment extends
|
|
198
|
-
? typeof
|
|
199
|
-
: environment extends
|
|
200
|
-
? typeof
|
|
201
|
-
:
|
|
202
|
-
? typeof arbitrumTokens
|
|
203
|
-
: environment extends PolygonEnvironment
|
|
204
|
-
? typeof polygonTokens
|
|
205
|
-
: undefined;
|
|
157
|
+
: environment extends OptimismEnvironment
|
|
158
|
+
? typeof optimismTokens
|
|
159
|
+
: environment extends EthereumEnvironment
|
|
160
|
+
? typeof ethereumTokens
|
|
161
|
+
: environment extends AvalancheEnvironment
|
|
162
|
+
? typeof avalancheTokens
|
|
163
|
+
: environment extends ArbitrumEnvironment
|
|
164
|
+
? typeof arbitrumTokens
|
|
165
|
+
: environment extends PolygonEnvironment
|
|
166
|
+
? typeof polygonTokens
|
|
167
|
+
: undefined;
|
|
206
168
|
|
|
207
169
|
export type MarketsType<environment> = environment extends BaseEnvironment
|
|
208
170
|
? typeof baseMarkets
|
|
209
|
-
: environment extends
|
|
210
|
-
? typeof
|
|
211
|
-
: environment extends
|
|
212
|
-
? typeof
|
|
213
|
-
:
|
|
214
|
-
? typeof optimismMarkets
|
|
215
|
-
: environment extends EthereumEnvironment
|
|
216
|
-
? typeof ethereumMarkets
|
|
217
|
-
: undefined;
|
|
171
|
+
: environment extends OptimismEnvironment
|
|
172
|
+
? typeof optimismMarkets
|
|
173
|
+
: environment extends EthereumEnvironment
|
|
174
|
+
? typeof ethereumMarkets
|
|
175
|
+
: undefined;
|
|
218
176
|
|
|
219
177
|
export type VaultsType<environment> = environment extends BaseEnvironment
|
|
220
178
|
? typeof baseVaults
|
|
@@ -175,6 +175,20 @@ export type CustomConfigType = {
|
|
|
175
175
|
};
|
|
176
176
|
governance?: {
|
|
177
177
|
token: GovernanceToken;
|
|
178
|
+
/**
|
|
179
|
+
* Satellite chains this environment acts as the governance home for.
|
|
180
|
+
*
|
|
181
|
+
* Consumed as a `homeEnvironment` membership test — a satellite prices its
|
|
182
|
+
* native-token rewards through whichever environment claims its chainId.
|
|
183
|
+
* Only Moonbeam ever claimed any, so since the sunset (MOO-551) every
|
|
184
|
+
* surviving environment ships `[]` and each chain resolves to itself via
|
|
185
|
+
* the call sites' `|| environment` fallback. The
|
|
186
|
+
* `ethereum/environment.test.ts` invariant keeps it that way.
|
|
187
|
+
*
|
|
188
|
+
* Kept as an extension point for a future hub that genuinely fronts other
|
|
189
|
+
* chains; collapsing the lookups and retiring the field is a separate
|
|
190
|
+
* cleanup, since it would change `Environment["custom"]`.
|
|
191
|
+
*/
|
|
178
192
|
chainIds: number[];
|
|
179
193
|
proposalIdOffset?: number;
|
|
180
194
|
snapshotEnsName?: string;
|
package/errors/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = '0.
|
|
1
|
+
export const version = '0.22.0'
|
package/package.json
CHANGED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.contracts = void 0;
|
|
4
|
-
const config_js_1 = require("../../types/config.js");
|
|
5
|
-
const tokens_js_1 = require("./tokens.js");
|
|
6
|
-
exports.contracts = (0, config_js_1.createContractsConfig)({
|
|
7
|
-
tokens: tokens_js_1.tokens,
|
|
8
|
-
contracts: {
|
|
9
|
-
governanceToken: "WELL",
|
|
10
|
-
stakingToken: "stkWELL",
|
|
11
|
-
wrappedNativeToken: "WGLMR",
|
|
12
|
-
tokenSale: "0x933fCDf708481c57E9FD82f6BAA084f42e98B60e",
|
|
13
|
-
comptroller: "0x8E00D5e02E65A19337Cdba98bbA9F84d4186a180",
|
|
14
|
-
maximillion: "0xe5Ef9310cC7E3437bAD83466675f24FD62A380c3",
|
|
15
|
-
views: "0xe76C8B8706faC85a8Fbdcac3C42e3E7823c73994",
|
|
16
|
-
oracle: "0xED301cd3EB27217BDB05C4E9B820a8A3c8B665f9",
|
|
17
|
-
governor: "0xfc4DFB17101A12C5CEc5eeDd8E92B5b16557666d",
|
|
18
|
-
multichainGovernor: "0x9A8464C4C11CeA17e191653Deb7CdC1bE30F1Af4",
|
|
19
|
-
voteCollector: "0xB8A798a50a7274A13449B7f2Dd6Df22faF2d40E5",
|
|
20
|
-
},
|
|
21
|
-
});
|
|
22
|
-
//# sourceMappingURL=contracts.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../../../environments/definitions/moonbeam/contracts.ts"],"names":[],"mappings":";;;AAAA,qDAA8D;AAC9D,2CAAqC;AAExB,QAAA,SAAS,GAAG,IAAA,iCAAqB,EAAC;IAC7C,MAAM,EAAN,kBAAM;IACN,SAAS,EAAE;QACT,eAAe,EAAE,MAAM;QACvB,YAAY,EAAE,SAAS;QACvB,kBAAkB,EAAE,OAAO;QAC3B,SAAS,EAAE,4CAA4C;QACvD,WAAW,EAAE,4CAA4C;QACzD,WAAW,EAAE,4CAA4C;QACzD,KAAK,EAAE,4CAA4C;QACnD,MAAM,EAAE,4CAA4C;QACpD,QAAQ,EAAE,4CAA4C;QACtD,kBAAkB,EAAE,4CAA4C;QAChE,aAAa,EAAE,4CAA4C;KAC5D;CACF,CAAC,CAAC"}
|