@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.
Files changed (167) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/README.md +9 -3
  3. package/_cjs/actions/beam/common.js +1 -2
  4. package/_cjs/actions/beam/common.js.map +1 -1
  5. package/_cjs/actions/core/markets/common.js +146 -96
  6. package/_cjs/actions/core/markets/common.js.map +1 -1
  7. package/_cjs/actions/governance/getDelegates.js +2 -7
  8. package/_cjs/actions/governance/getDelegates.js.map +1 -1
  9. package/_cjs/actions/governance/getGovernanceTokenInfo.js +7 -12
  10. package/_cjs/actions/governance/getGovernanceTokenInfo.js.map +1 -1
  11. package/_cjs/actions/governance/getUserVoteReceipt.js +5 -4
  12. package/_cjs/actions/governance/getUserVoteReceipt.js.map +1 -1
  13. package/_cjs/actions/governance/governor-api-client.js.map +1 -1
  14. package/_cjs/actions/governance/proposals/common.js +73 -6
  15. package/_cjs/actions/governance/proposals/common.js.map +1 -1
  16. package/_cjs/actions/governance/proposals/getProposal.js +6 -73
  17. package/_cjs/actions/governance/proposals/getProposal.js.map +1 -1
  18. package/_cjs/actions/governance/proposals/getProposals.js +12 -92
  19. package/_cjs/actions/governance/proposals/getProposals.js.map +1 -1
  20. package/_cjs/client/createMoonwellClient.js +17 -15
  21. package/_cjs/client/createMoonwellClient.js.map +1 -1
  22. package/_cjs/common/index.js +4 -4
  23. package/_cjs/common/index.js.map +1 -1
  24. package/_cjs/environments/definitions/governance.js +1 -8
  25. package/_cjs/environments/definitions/governance.js.map +1 -1
  26. package/_cjs/environments/index.js +28 -42
  27. package/_cjs/environments/index.js.map +1 -1
  28. package/_cjs/environments/types/config.js.map +1 -1
  29. package/_cjs/errors/version.js +1 -1
  30. package/_esm/actions/beam/common.js +3 -2
  31. package/_esm/actions/beam/common.js.map +1 -1
  32. package/_esm/actions/core/markets/common.js +192 -104
  33. package/_esm/actions/core/markets/common.js.map +1 -1
  34. package/_esm/actions/governance/getDelegates.js +8 -8
  35. package/_esm/actions/governance/getDelegates.js.map +1 -1
  36. package/_esm/actions/governance/getGovernanceTokenInfo.js +20 -13
  37. package/_esm/actions/governance/getGovernanceTokenInfo.js.map +1 -1
  38. package/_esm/actions/governance/getUserVoteReceipt.js +16 -5
  39. package/_esm/actions/governance/getUserVoteReceipt.js.map +1 -1
  40. package/_esm/actions/governance/governor-api-client.js +14 -5
  41. package/_esm/actions/governance/governor-api-client.js.map +1 -1
  42. package/_esm/actions/governance/proposals/common.js +122 -10
  43. package/_esm/actions/governance/proposals/common.js.map +1 -1
  44. package/_esm/actions/governance/proposals/getProposal.js +16 -93
  45. package/_esm/actions/governance/proposals/getProposal.js.map +1 -1
  46. package/_esm/actions/governance/proposals/getProposals.js +37 -132
  47. package/_esm/actions/governance/proposals/getProposals.js.map +1 -1
  48. package/_esm/client/createMoonwellClient.js +24 -16
  49. package/_esm/client/createMoonwellClient.js.map +1 -1
  50. package/_esm/common/index.js +15 -4
  51. package/_esm/common/index.js.map +1 -1
  52. package/_esm/environments/definitions/governance.js +5 -9
  53. package/_esm/environments/definitions/governance.js.map +1 -1
  54. package/_esm/environments/index.js +2 -14
  55. package/_esm/environments/index.js.map +1 -1
  56. package/_esm/environments/types/config.js.map +1 -1
  57. package/_esm/errors/version.js +1 -1
  58. package/_types/actions/beam/common.d.ts +1 -1
  59. package/_types/actions/beam/common.d.ts.map +1 -1
  60. package/_types/actions/core/markets/common.d.ts.map +1 -1
  61. package/_types/actions/governance/getGovernanceTokenInfo.d.ts.map +1 -1
  62. package/_types/actions/governance/getUserVoteReceipt.d.ts.map +1 -1
  63. package/_types/actions/governance/governor-api-client.d.ts +14 -5
  64. package/_types/actions/governance/governor-api-client.d.ts.map +1 -1
  65. package/_types/actions/governance/proposals/common.d.ts +41 -6
  66. package/_types/actions/governance/proposals/common.d.ts.map +1 -1
  67. package/_types/actions/governance/proposals/getProposal.d.ts +1 -1
  68. package/_types/actions/governance/proposals/getProposal.d.ts.map +1 -1
  69. package/_types/actions/governance/proposals/getProposals.d.ts +1 -1
  70. package/_types/actions/governance/proposals/getProposals.d.ts.map +1 -1
  71. package/_types/client/createMoonwellClient.d.ts +9 -839
  72. package/_types/client/createMoonwellClient.d.ts.map +1 -1
  73. package/_types/common/index.d.ts +11 -0
  74. package/_types/common/index.d.ts.map +1 -1
  75. package/_types/environments/definitions/governance.d.ts +0 -7
  76. package/_types/environments/definitions/governance.d.ts.map +1 -1
  77. package/_types/environments/index.d.ts +5 -516
  78. package/_types/environments/index.d.ts.map +1 -1
  79. package/_types/environments/types/config.d.ts +14 -0
  80. package/_types/environments/types/config.d.ts.map +1 -1
  81. package/_types/errors/version.d.ts +1 -1
  82. package/actions/beam/common.ts +4 -9
  83. package/actions/core/markets/common.ts +307 -166
  84. package/actions/governance/getDelegates.ts +8 -8
  85. package/actions/governance/getGovernanceTokenInfo.ts +23 -15
  86. package/actions/governance/getUserVoteReceipt.ts +19 -5
  87. package/actions/governance/governor-api-client.ts +14 -5
  88. package/actions/governance/proposals/common.ts +143 -10
  89. package/actions/governance/proposals/getProposal.ts +29 -112
  90. package/actions/governance/proposals/getProposals.ts +52 -153
  91. package/client/createMoonwellClient.ts +32 -40
  92. package/common/index.ts +17 -6
  93. package/environments/definitions/governance.ts +5 -9
  94. package/environments/index.ts +28 -70
  95. package/environments/types/config.ts +14 -0
  96. package/errors/version.ts +1 -1
  97. package/package.json +1 -1
  98. package/_cjs/environments/definitions/moonbeam/contracts.js +0 -22
  99. package/_cjs/environments/definitions/moonbeam/contracts.js.map +0 -1
  100. package/_cjs/environments/definitions/moonbeam/core-markets.js +0 -65
  101. package/_cjs/environments/definitions/moonbeam/core-markets.js.map +0 -1
  102. package/_cjs/environments/definitions/moonbeam/custom.js +0 -24
  103. package/_cjs/environments/definitions/moonbeam/custom.js.map +0 -1
  104. package/_cjs/environments/definitions/moonbeam/environment.js +0 -38
  105. package/_cjs/environments/definitions/moonbeam/environment.js.map +0 -1
  106. package/_cjs/environments/definitions/moonbeam/tokens.js +0 -176
  107. package/_cjs/environments/definitions/moonbeam/tokens.js.map +0 -1
  108. package/_cjs/environments/definitions/moonriver/contracts.js +0 -19
  109. package/_cjs/environments/definitions/moonriver/contracts.js.map +0 -1
  110. package/_cjs/environments/definitions/moonriver/core-markets.js +0 -46
  111. package/_cjs/environments/definitions/moonriver/core-markets.js.map +0 -1
  112. package/_cjs/environments/definitions/moonriver/custom.js +0 -12
  113. package/_cjs/environments/definitions/moonriver/custom.js.map +0 -1
  114. package/_cjs/environments/definitions/moonriver/environment.js +0 -36
  115. package/_cjs/environments/definitions/moonriver/environment.js.map +0 -1
  116. package/_cjs/environments/definitions/moonriver/tokens.js +0 -110
  117. package/_cjs/environments/definitions/moonriver/tokens.js.map +0 -1
  118. package/_esm/environments/definitions/moonbeam/contracts.js +0 -19
  119. package/_esm/environments/definitions/moonbeam/contracts.js.map +0 -1
  120. package/_esm/environments/definitions/moonbeam/core-markets.js +0 -62
  121. package/_esm/environments/definitions/moonbeam/core-markets.js.map +0 -1
  122. package/_esm/environments/definitions/moonbeam/custom.js +0 -21
  123. package/_esm/environments/definitions/moonbeam/custom.js.map +0 -1
  124. package/_esm/environments/definitions/moonbeam/environment.js +0 -32
  125. package/_esm/environments/definitions/moonbeam/environment.js.map +0 -1
  126. package/_esm/environments/definitions/moonbeam/tokens.js +0 -173
  127. package/_esm/environments/definitions/moonbeam/tokens.js.map +0 -1
  128. package/_esm/environments/definitions/moonriver/contracts.js +0 -16
  129. package/_esm/environments/definitions/moonriver/contracts.js.map +0 -1
  130. package/_esm/environments/definitions/moonriver/core-markets.js +0 -43
  131. package/_esm/environments/definitions/moonriver/core-markets.js.map +0 -1
  132. package/_esm/environments/definitions/moonriver/custom.js +0 -9
  133. package/_esm/environments/definitions/moonriver/custom.js.map +0 -1
  134. package/_esm/environments/definitions/moonriver/environment.js +0 -31
  135. package/_esm/environments/definitions/moonriver/environment.js.map +0 -1
  136. package/_esm/environments/definitions/moonriver/tokens.js +0 -107
  137. package/_esm/environments/definitions/moonriver/tokens.js.map +0 -1
  138. package/_types/environments/definitions/moonbeam/contracts.d.ts +0 -14
  139. package/_types/environments/definitions/moonbeam/contracts.d.ts.map +0 -1
  140. package/_types/environments/definitions/moonbeam/core-markets.d.ts +0 -57
  141. package/_types/environments/definitions/moonbeam/core-markets.d.ts.map +0 -1
  142. package/_types/environments/definitions/moonbeam/custom.d.ts +0 -25
  143. package/_types/environments/definitions/moonbeam/custom.d.ts.map +0 -1
  144. package/_types/environments/definitions/moonbeam/environment.d.ts +0 -265
  145. package/_types/environments/definitions/moonbeam/environment.d.ts.map +0 -1
  146. package/_types/environments/definitions/moonbeam/tokens.d.ts +0 -171
  147. package/_types/environments/definitions/moonbeam/tokens.d.ts.map +0 -1
  148. package/_types/environments/definitions/moonriver/contracts.d.ts +0 -11
  149. package/_types/environments/definitions/moonriver/contracts.d.ts.map +0 -1
  150. package/_types/environments/definitions/moonriver/core-markets.d.ts +0 -38
  151. package/_types/environments/definitions/moonriver/core-markets.d.ts.map +0 -1
  152. package/_types/environments/definitions/moonriver/custom.d.ts +0 -8
  153. package/_types/environments/definitions/moonriver/custom.d.ts.map +0 -1
  154. package/_types/environments/definitions/moonriver/environment.d.ts +0 -159
  155. package/_types/environments/definitions/moonriver/environment.d.ts.map +0 -1
  156. package/_types/environments/definitions/moonriver/tokens.d.ts +0 -105
  157. package/_types/environments/definitions/moonriver/tokens.d.ts.map +0 -1
  158. package/environments/definitions/moonbeam/contracts.ts +0 -19
  159. package/environments/definitions/moonbeam/core-markets.ts +0 -62
  160. package/environments/definitions/moonbeam/custom.ts +0 -21
  161. package/environments/definitions/moonbeam/environment.ts +0 -39
  162. package/environments/definitions/moonbeam/tokens.ts +0 -173
  163. package/environments/definitions/moonriver/contracts.ts +0 -16
  164. package/environments/definitions/moonriver/core-markets.ts +0 -43
  165. package/environments/definitions/moonriver/custom.ts +0 -9
  166. package/environments/definitions/moonriver/environment.ts +0 -38
  167. 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 { Amount, getEnvironmentsFromArgs } from "../../../common/index.js";
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 { type Proposal, ProposalState } from "../../../types/proposal.js";
8
- import { type ApiProposal, fetchAllProposals } from "../governor-api-client.js";
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 governanceEnvironments = environments.filter(
35
- (environment) =>
36
- environment.chainId === moonbeam.id ||
37
- environment.chainId === moonriver.id,
38
- );
38
+ const governanceEnvironment = resolveGovernanceEnvironment(environments);
39
39
 
40
- if (governanceEnvironments.length === 0) {
40
+ if (!governanceEnvironment) {
41
41
  logger.end(logId);
42
42
  return [];
43
43
  }
44
44
 
45
- const allProposals = await Promise.all(
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 proposals for Moonbeam using the Governor API.
61
+ * Fetch every proposal the Governor API serves, across all governance chains.
74
62
  *
75
- * The same indexer DO serves two chains:
76
- * - chainId=1 (Ethereum) — the active multigov contract
77
- * - chainId=1284 (Moonbeam) — historical proposals
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
- * Uses `Promise.allSettled` so a transient outage on one chain doesn't take
80
- * down the other — partial results are preferred over a hard failure.
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 getMoonbeamProposals(
77
+ async function fetchGovernorProposals(
83
78
  governanceEnvironment: Environment,
84
79
  ): Promise<Proposal[]> {
85
- const results = await Promise.allSettled([
86
- fetchAllProposals(governanceEnvironment, { chainId: 1 }),
87
- fetchAllProposals(governanceEnvironment, { chainId: 1284 }),
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 = chainsAttempted[index];
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
- * Fetch proposals for Moonriver using the Governor API.
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
- * Moonriver runs a single legacy standalone governor (no multichain governor),
115
- * so we fetch only its chainId from the same lunar indexer and reuse the shared
116
- * pipeline. `getProposalsOnChainData` classifies these as non-multichain and
117
- * reads state/quorum from the legacy governor (via `getQuorum`).
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
- const proposals: Proposal[] = apiProposals.map((apiProposal, index) => {
168
- const onChainData = onChainDataList[index]!;
169
- const formattedData = formatApiProposalData(apiProposal);
170
- // Single source of truth — see getProposal.ts. getProposalsOnChainData
171
- // classified with the Artemis cutoff and routed the reads accordingly;
172
- // re-classifying here without the cutoff would drift and drop `multichain`.
173
- const isMultichain = onChainData.isMultichain;
174
-
175
- const now = Math.floor(Date.now() / 1000);
176
- let proposalState = onChainData.state;
177
-
178
- if (
179
- proposalState === ProposalState.Pending &&
180
- now >= apiProposal.votingStartTime &&
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
- return [
154
- Object.values(client.environments).find(
155
- (env) => env.chainId === chainId,
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
- return [client.environments[network]] as Environment[];
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, moonbeam, moonriver, optimism } from "viem/chains";
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
- chainIds: [moonbeam.id, base.id, optimism.id, mainnet.id] as number[],
27
- testnet: false,
28
- },
29
- MFAM: {
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
  });
@@ -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 { moonbeam, moonriver, optimism } from "viem/chains";
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 moonbeam
133
- ? MoonbeamEnvironment
134
- : chain extends typeof moonriver
135
- ? MoonriverEnvironment
136
- : chain extends typeof optimism
137
- ? OptimismEnvironment
138
- : chain extends typeof ethereum
139
- ? EthereumEnvironment
140
- : chain extends typeof avalanche
141
- ? AvalancheEnvironment
142
- : chain extends typeof arbitrum
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 MoonbeamEnvironment
192
- ? typeof moonbeamTokens
193
- : environment extends MoonriverEnvironment
194
- ? typeof moonriverTokens
195
- : environment extends OptimismEnvironment
196
- ? typeof optimismTokens
197
- : environment extends EthereumEnvironment
198
- ? typeof ethereumTokens
199
- : environment extends AvalancheEnvironment
200
- ? typeof avalancheTokens
201
- : environment extends ArbitrumEnvironment
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 MoonbeamEnvironment
210
- ? typeof moonbeamMarkets
211
- : environment extends MoonriverEnvironment
212
- ? typeof moonriverMarkets
213
- : environment extends OptimismEnvironment
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.21.0'
1
+ export const version = '0.22.0'
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@moonwell-fi/moonwell-sdk",
3
3
  "description": "TypeScript Interface for Moonwell",
4
- "version": "0.21.0",
4
+ "version": "0.22.0",
5
5
  "main": "./_cjs/index.js",
6
6
  "module": "./_esm/index.js",
7
7
  "types": "./_types/index.d.ts",
@@ -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"}