@moonwell-fi/moonwell-sdk 0.20.5 → 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 (195) hide show
  1. package/CHANGELOG.md +55 -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/core/markets/getMarketSnapshots.js +1 -83
  8. package/_cjs/actions/core/markets/getMarketSnapshots.js.map +1 -1
  9. package/_cjs/actions/core/user-positions/getUserPositionSnapshots.js +1 -59
  10. package/_cjs/actions/core/user-positions/getUserPositionSnapshots.js.map +1 -1
  11. package/_cjs/actions/governance/getCirculatingSupplySnapshots.js +1 -49
  12. package/_cjs/actions/governance/getCirculatingSupplySnapshots.js.map +1 -1
  13. package/_cjs/actions/governance/getDelegates.js +2 -7
  14. package/_cjs/actions/governance/getDelegates.js.map +1 -1
  15. package/_cjs/actions/governance/getGovernanceTokenInfo.js +7 -12
  16. package/_cjs/actions/governance/getGovernanceTokenInfo.js.map +1 -1
  17. package/_cjs/actions/governance/getStakingSnapshots.js +1 -41
  18. package/_cjs/actions/governance/getStakingSnapshots.js.map +1 -1
  19. package/_cjs/actions/governance/getUserVoteReceipt.js +5 -4
  20. package/_cjs/actions/governance/getUserVoteReceipt.js.map +1 -1
  21. package/_cjs/actions/governance/governor-api-client.js.map +1 -1
  22. package/_cjs/actions/governance/proposals/common.js +74 -7
  23. package/_cjs/actions/governance/proposals/common.js.map +1 -1
  24. package/_cjs/actions/governance/proposals/getProposal.js +6 -73
  25. package/_cjs/actions/governance/proposals/getProposal.js.map +1 -1
  26. package/_cjs/actions/governance/proposals/getProposals.js +12 -92
  27. package/_cjs/actions/governance/proposals/getProposals.js.map +1 -1
  28. package/_cjs/client/createMoonwellClient.js +17 -15
  29. package/_cjs/client/createMoonwellClient.js.map +1 -1
  30. package/_cjs/common/index.js +4 -4
  31. package/_cjs/common/index.js.map +1 -1
  32. package/_cjs/environments/definitions/governance.js +1 -15
  33. package/_cjs/environments/definitions/governance.js.map +1 -1
  34. package/_cjs/environments/index.js +28 -42
  35. package/_cjs/environments/index.js.map +1 -1
  36. package/_cjs/environments/types/config.js.map +1 -1
  37. package/_cjs/errors/version.js +1 -1
  38. package/_esm/actions/beam/common.js +3 -2
  39. package/_esm/actions/beam/common.js.map +1 -1
  40. package/_esm/actions/core/markets/common.js +192 -104
  41. package/_esm/actions/core/markets/common.js.map +1 -1
  42. package/_esm/actions/core/markets/getMarketSnapshots.js +1 -83
  43. package/_esm/actions/core/markets/getMarketSnapshots.js.map +1 -1
  44. package/_esm/actions/core/user-positions/getUserPositionSnapshots.js +3 -62
  45. package/_esm/actions/core/user-positions/getUserPositionSnapshots.js.map +1 -1
  46. package/_esm/actions/governance/getCirculatingSupplySnapshots.js +2 -50
  47. package/_esm/actions/governance/getCirculatingSupplySnapshots.js.map +1 -1
  48. package/_esm/actions/governance/getDelegates.js +8 -8
  49. package/_esm/actions/governance/getDelegates.js.map +1 -1
  50. package/_esm/actions/governance/getGovernanceTokenInfo.js +20 -13
  51. package/_esm/actions/governance/getGovernanceTokenInfo.js.map +1 -1
  52. package/_esm/actions/governance/getStakingSnapshots.js +1 -41
  53. package/_esm/actions/governance/getStakingSnapshots.js.map +1 -1
  54. package/_esm/actions/governance/getUserVoteReceipt.js +16 -5
  55. package/_esm/actions/governance/getUserVoteReceipt.js.map +1 -1
  56. package/_esm/actions/governance/governor-api-client.js +14 -5
  57. package/_esm/actions/governance/governor-api-client.js.map +1 -1
  58. package/_esm/actions/governance/proposals/common.js +134 -11
  59. package/_esm/actions/governance/proposals/common.js.map +1 -1
  60. package/_esm/actions/governance/proposals/getProposal.js +16 -93
  61. package/_esm/actions/governance/proposals/getProposal.js.map +1 -1
  62. package/_esm/actions/governance/proposals/getProposals.js +37 -132
  63. package/_esm/actions/governance/proposals/getProposals.js.map +1 -1
  64. package/_esm/actions/lunar-indexer-client.js +1 -1
  65. package/_esm/client/createMoonwellClient.js +24 -16
  66. package/_esm/client/createMoonwellClient.js.map +1 -1
  67. package/_esm/common/index.js +15 -4
  68. package/_esm/common/index.js.map +1 -1
  69. package/_esm/environments/definitions/governance.js +5 -16
  70. package/_esm/environments/definitions/governance.js.map +1 -1
  71. package/_esm/environments/index.js +2 -14
  72. package/_esm/environments/index.js.map +1 -1
  73. package/_esm/environments/types/config.js.map +1 -1
  74. package/_esm/errors/version.js +1 -1
  75. package/_types/actions/beam/common.d.ts +1 -1
  76. package/_types/actions/beam/common.d.ts.map +1 -1
  77. package/_types/actions/core/markets/common.d.ts.map +1 -1
  78. package/_types/actions/core/markets/getMarketSnapshots.d.ts.map +1 -1
  79. package/_types/actions/core/user-positions/getUserPositionSnapshots.d.ts +1 -2
  80. package/_types/actions/core/user-positions/getUserPositionSnapshots.d.ts.map +1 -1
  81. package/_types/actions/governance/getCirculatingSupplySnapshots.d.ts.map +1 -1
  82. package/_types/actions/governance/getGovernanceTokenInfo.d.ts.map +1 -1
  83. package/_types/actions/governance/getStakingSnapshots.d.ts.map +1 -1
  84. package/_types/actions/governance/getUserVoteReceipt.d.ts.map +1 -1
  85. package/_types/actions/governance/governor-api-client.d.ts +14 -5
  86. package/_types/actions/governance/governor-api-client.d.ts.map +1 -1
  87. package/_types/actions/governance/proposals/common.d.ts +41 -6
  88. package/_types/actions/governance/proposals/common.d.ts.map +1 -1
  89. package/_types/actions/governance/proposals/getProposal.d.ts +1 -1
  90. package/_types/actions/governance/proposals/getProposal.d.ts.map +1 -1
  91. package/_types/actions/governance/proposals/getProposals.d.ts +1 -1
  92. package/_types/actions/governance/proposals/getProposals.d.ts.map +1 -1
  93. package/_types/actions/lunar-indexer-client.d.ts +1 -1
  94. package/_types/client/createMoonwellClient.d.ts +9 -839
  95. package/_types/client/createMoonwellClient.d.ts.map +1 -1
  96. package/_types/common/index.d.ts +11 -0
  97. package/_types/common/index.d.ts.map +1 -1
  98. package/_types/environments/definitions/governance.d.ts +0 -14
  99. package/_types/environments/definitions/governance.d.ts.map +1 -1
  100. package/_types/environments/index.d.ts +5 -516
  101. package/_types/environments/index.d.ts.map +1 -1
  102. package/_types/environments/types/config.d.ts +14 -0
  103. package/_types/environments/types/config.d.ts.map +1 -1
  104. package/_types/errors/version.d.ts +1 -1
  105. package/actions/beam/common.ts +4 -9
  106. package/actions/core/markets/common.ts +307 -166
  107. package/actions/core/markets/getMarketSnapshots.ts +1 -118
  108. package/actions/core/user-positions/getUserPositionSnapshots.ts +2 -91
  109. package/actions/governance/getCirculatingSupplySnapshots.ts +3 -72
  110. package/actions/governance/getDelegates.ts +8 -8
  111. package/actions/governance/getGovernanceTokenInfo.ts +23 -15
  112. package/actions/governance/getStakingSnapshots.ts +1 -59
  113. package/actions/governance/getUserVoteReceipt.ts +19 -5
  114. package/actions/governance/governor-api-client.ts +14 -5
  115. package/actions/governance/proposals/common.ts +155 -11
  116. package/actions/governance/proposals/getProposal.ts +29 -112
  117. package/actions/governance/proposals/getProposals.ts +52 -153
  118. package/actions/lunar-indexer-client.ts +1 -1
  119. package/client/createMoonwellClient.ts +32 -40
  120. package/common/index.ts +17 -6
  121. package/environments/definitions/governance.ts +5 -16
  122. package/environments/index.ts +28 -70
  123. package/environments/types/config.ts +14 -0
  124. package/errors/version.ts +1 -1
  125. package/package.json +2 -2
  126. package/_cjs/environments/definitions/moonbeam/contracts.js +0 -22
  127. package/_cjs/environments/definitions/moonbeam/contracts.js.map +0 -1
  128. package/_cjs/environments/definitions/moonbeam/core-markets.js +0 -65
  129. package/_cjs/environments/definitions/moonbeam/core-markets.js.map +0 -1
  130. package/_cjs/environments/definitions/moonbeam/custom.js +0 -24
  131. package/_cjs/environments/definitions/moonbeam/custom.js.map +0 -1
  132. package/_cjs/environments/definitions/moonbeam/environment.js +0 -38
  133. package/_cjs/environments/definitions/moonbeam/environment.js.map +0 -1
  134. package/_cjs/environments/definitions/moonbeam/tokens.js +0 -176
  135. package/_cjs/environments/definitions/moonbeam/tokens.js.map +0 -1
  136. package/_cjs/environments/definitions/moonriver/contracts.js +0 -19
  137. package/_cjs/environments/definitions/moonriver/contracts.js.map +0 -1
  138. package/_cjs/environments/definitions/moonriver/core-markets.js +0 -46
  139. package/_cjs/environments/definitions/moonriver/core-markets.js.map +0 -1
  140. package/_cjs/environments/definitions/moonriver/custom.js +0 -12
  141. package/_cjs/environments/definitions/moonriver/custom.js.map +0 -1
  142. package/_cjs/environments/definitions/moonriver/environment.js +0 -36
  143. package/_cjs/environments/definitions/moonriver/environment.js.map +0 -1
  144. package/_cjs/environments/definitions/moonriver/tokens.js +0 -110
  145. package/_cjs/environments/definitions/moonriver/tokens.js.map +0 -1
  146. package/_esm/environments/definitions/moonbeam/contracts.js +0 -19
  147. package/_esm/environments/definitions/moonbeam/contracts.js.map +0 -1
  148. package/_esm/environments/definitions/moonbeam/core-markets.js +0 -62
  149. package/_esm/environments/definitions/moonbeam/core-markets.js.map +0 -1
  150. package/_esm/environments/definitions/moonbeam/custom.js +0 -21
  151. package/_esm/environments/definitions/moonbeam/custom.js.map +0 -1
  152. package/_esm/environments/definitions/moonbeam/environment.js +0 -32
  153. package/_esm/environments/definitions/moonbeam/environment.js.map +0 -1
  154. package/_esm/environments/definitions/moonbeam/tokens.js +0 -173
  155. package/_esm/environments/definitions/moonbeam/tokens.js.map +0 -1
  156. package/_esm/environments/definitions/moonriver/contracts.js +0 -16
  157. package/_esm/environments/definitions/moonriver/contracts.js.map +0 -1
  158. package/_esm/environments/definitions/moonriver/core-markets.js +0 -43
  159. package/_esm/environments/definitions/moonriver/core-markets.js.map +0 -1
  160. package/_esm/environments/definitions/moonriver/custom.js +0 -9
  161. package/_esm/environments/definitions/moonriver/custom.js.map +0 -1
  162. package/_esm/environments/definitions/moonriver/environment.js +0 -31
  163. package/_esm/environments/definitions/moonriver/environment.js.map +0 -1
  164. package/_esm/environments/definitions/moonriver/tokens.js +0 -107
  165. package/_esm/environments/definitions/moonriver/tokens.js.map +0 -1
  166. package/_types/environments/definitions/moonbeam/contracts.d.ts +0 -14
  167. package/_types/environments/definitions/moonbeam/contracts.d.ts.map +0 -1
  168. package/_types/environments/definitions/moonbeam/core-markets.d.ts +0 -57
  169. package/_types/environments/definitions/moonbeam/core-markets.d.ts.map +0 -1
  170. package/_types/environments/definitions/moonbeam/custom.d.ts +0 -25
  171. package/_types/environments/definitions/moonbeam/custom.d.ts.map +0 -1
  172. package/_types/environments/definitions/moonbeam/environment.d.ts +0 -265
  173. package/_types/environments/definitions/moonbeam/environment.d.ts.map +0 -1
  174. package/_types/environments/definitions/moonbeam/tokens.d.ts +0 -171
  175. package/_types/environments/definitions/moonbeam/tokens.d.ts.map +0 -1
  176. package/_types/environments/definitions/moonriver/contracts.d.ts +0 -11
  177. package/_types/environments/definitions/moonriver/contracts.d.ts.map +0 -1
  178. package/_types/environments/definitions/moonriver/core-markets.d.ts +0 -38
  179. package/_types/environments/definitions/moonriver/core-markets.d.ts.map +0 -1
  180. package/_types/environments/definitions/moonriver/custom.d.ts +0 -8
  181. package/_types/environments/definitions/moonriver/custom.d.ts.map +0 -1
  182. package/_types/environments/definitions/moonriver/environment.d.ts +0 -159
  183. package/_types/environments/definitions/moonriver/environment.d.ts.map +0 -1
  184. package/_types/environments/definitions/moonriver/tokens.d.ts +0 -105
  185. package/_types/environments/definitions/moonriver/tokens.d.ts.map +0 -1
  186. package/environments/definitions/moonbeam/contracts.ts +0 -19
  187. package/environments/definitions/moonbeam/core-markets.ts +0 -62
  188. package/environments/definitions/moonbeam/custom.ts +0 -21
  189. package/environments/definitions/moonbeam/environment.ts +0 -39
  190. package/environments/definitions/moonbeam/tokens.ts +0 -173
  191. package/environments/definitions/moonriver/contracts.ts +0 -16
  192. package/environments/definitions/moonriver/core-markets.ts +0 -43
  193. package/environments/definitions/moonriver/custom.ts +0 -9
  194. package/environments/definitions/moonriver/environment.ts +0 -38
  195. package/environments/definitions/moonriver/tokens.ts +0 -107
@@ -11,7 +11,6 @@ import { buildMarketId } from "../../../common/lunar-indexer-helpers.js";
11
11
  import type { NetworkParameterType } from "../../../common/types.js";
12
12
  import type { Chain, Environment } from "../../../environments/index.js";
13
13
  import type { MarketSnapshot } from "../../../types/market.js";
14
- import { postWithRetry } from "../../axiosWithRetry.js";
15
14
  import {
16
15
  DEFAULT_LUNAR_TIMEOUT_MS,
17
16
  createLunarIndexerClient,
@@ -141,23 +140,7 @@ async function fetchCoreMarketSnapshots(
141
140
  endTime?: number,
142
141
  ): Promise<MarketSnapshot[]> {
143
142
  if (!environment.lunarIndexerUrl) {
144
- if (!environment.indexerUrl) return [];
145
- try {
146
- return await fetchCoreMarketSnapshotsFromPonder(
147
- marketAddress,
148
- environment,
149
- );
150
- } catch (error) {
151
- console.warn(
152
- `[getMarketSnapshots] Ponder failed for chain ${environment.chainId}:`,
153
- error,
154
- );
155
- environment.onError?.(error, {
156
- source: "market-snapshots-ponder",
157
- chainId: environment.chainId,
158
- });
159
- return [];
160
- }
143
+ return [];
161
144
  }
162
145
  try {
163
146
  return await fetchCoreMarketSnapshotsFromLunar(
@@ -180,106 +163,6 @@ async function fetchCoreMarketSnapshots(
180
163
  }
181
164
  }
182
165
 
183
- async function fetchCoreMarketSnapshotsFromPonder(
184
- marketAddress: string,
185
- environment: Environment,
186
- ): Promise<MarketSnapshot[]> {
187
- if (!environment.indexerUrl) return [];
188
-
189
- interface MarketDailyData {
190
- totalBorrows: number;
191
- totalBorrowsUSD: number;
192
- totalSupplies: number;
193
- totalSuppliesUSD: number;
194
- totalLiquidity: number;
195
- totalLiquidityUSD: number;
196
- baseSupplyApy: number;
197
- baseBorrowApy: number;
198
- timestamp: number;
199
- }
200
-
201
- const dailyData: MarketDailyData[] = [];
202
- let hasNextPage = true;
203
- let endCursor: string | undefined;
204
-
205
- while (hasNextPage) {
206
- const result = await postWithRetry<{
207
- data: {
208
- marketDailySnapshots: {
209
- items: MarketDailyData[];
210
- pageInfo: { hasNextPage: boolean; endCursor: string };
211
- };
212
- };
213
- }>(environment.indexerUrl, {
214
- query: `
215
- query {
216
- marketDailySnapshots (
217
- limit: 1000,
218
- orderBy: "timestamp"
219
- orderDirection: "desc"
220
- where: {marketAddress: "${marketAddress.toLowerCase()}", chainId: ${environment.chainId}}
221
- ${endCursor ? `after: "${endCursor}"` : ""}
222
- ) {
223
- items {
224
- totalBorrows
225
- totalBorrowsUSD
226
- totalSupplies
227
- totalSuppliesUSD
228
- totalLiquidity
229
- totalLiquidityUSD
230
- baseSupplyApy
231
- baseBorrowApy
232
- timestamp
233
- }
234
- pageInfo {
235
- hasNextPage
236
- endCursor
237
- }
238
- }
239
- }
240
- `,
241
- });
242
-
243
- dailyData.push(
244
- ...result.data.data.marketDailySnapshots.items.filter(
245
- (f: { timestamp: number }) => isStartOfDay(f.timestamp),
246
- ),
247
- );
248
- hasNextPage = result.data.data.marketDailySnapshots.pageInfo.hasNextPage;
249
- endCursor = result.data.data.marketDailySnapshots.pageInfo.endCursor;
250
- }
251
-
252
- if (dailyData.length === 0) return [];
253
-
254
- return dailyData.map((point) => {
255
- const supplied = Number(point.totalSupplies);
256
- const borrow = Number(point.totalBorrows);
257
- const borrowUsd = Number(point.totalBorrowsUSD);
258
- const suppliedUsd = Number(point.totalSuppliesUSD);
259
- const liquidity = Math.max(point.totalLiquidity, 0);
260
- const liquidityUsd = Math.max(point.totalLiquidityUSD, 0);
261
- const price = suppliedUsd / supplied;
262
-
263
- return {
264
- marketId: marketAddress.toLowerCase(),
265
- chainId: environment.chainId,
266
- timestamp: point.timestamp * 1000,
267
- totalSupply: supplied,
268
- totalSupplyUsd: suppliedUsd,
269
- totalBorrows: borrow,
270
- totalBorrowsUsd: borrowUsd,
271
- totalLiquidity: liquidity,
272
- totalLiquidityUsd: liquidityUsd,
273
- totalReallocatableLiquidity: 0,
274
- totalReallocatableLiquidityUsd: 0,
275
- baseSupplyApy: point.baseSupplyApy,
276
- baseBorrowApy: point.baseBorrowApy,
277
- collateralTokenPrice: price,
278
- loanTokenPrice: price,
279
- };
280
- });
281
- }
282
-
283
166
  async function fetchCoreMarketSnapshotsFromLunar(
284
167
  marketAddress: string,
285
168
  environment: Environment,
@@ -5,13 +5,11 @@ import {
5
5
  applyGranularity,
6
6
  calculateTimeRange,
7
7
  getEnvironmentFromArgs,
8
- isStartOfDay,
9
8
  toApiGranularity,
10
9
  } from "../../../common/index.js";
11
10
  import type { NetworkParameterType } from "../../../common/types.js";
12
11
  import type { Chain, Environment } from "../../../environments/index.js";
13
12
  import type { UserPositionSnapshot } from "../../../types/userPosition.js";
14
- import { postWithRetry } from "../../axiosWithRetry.js";
15
13
  import {
16
14
  DEFAULT_LUNAR_TIMEOUT_MS,
17
15
  createLunarIndexerClient,
@@ -54,8 +52,7 @@ export type GetUserPositionSnapshotsReturnType = Promise<
54
52
  * @remarks
55
53
  * - Default behavior (no time parameters): Returns 365 days of history
56
54
  * - Parameter priority: Custom timestamps > period > default (365 days)
57
- * - When using Lunar Indexer, custom time ranges are supported
58
- * - Snapshots are filtered to start-of-day for "1d" granularity
55
+ * - Environments without a Lunar Indexer configured return an empty array
59
56
  */
60
57
  export async function getUserPositionSnapshots<
61
58
  environments,
@@ -89,23 +86,7 @@ async function fetchUserPositionSnapshots(
89
86
  granularity?: "6h" | "1d",
90
87
  ): Promise<UserPositionSnapshot[]> {
91
88
  if (!environment.lunarIndexerUrl) {
92
- if (!environment.indexerUrl) return [];
93
- try {
94
- return await fetchUserPositionSnapshotsFromPonder(
95
- userAddress,
96
- environment,
97
- );
98
- } catch (error) {
99
- console.warn(
100
- `[getUserPositionSnapshots] Ponder failed for chain ${environment.chainId}:`,
101
- error,
102
- );
103
- environment.onError?.(error, {
104
- source: "user-position-snapshots-ponder",
105
- chainId: environment.chainId,
106
- });
107
- return [];
108
- }
89
+ return [];
109
90
  }
110
91
  try {
111
92
  return await fetchUserPositionSnapshotsFromLunar(
@@ -186,73 +167,3 @@ async function fetchUserPositionSnapshotsFromLunar(
186
167
  resolvedGranularity,
187
168
  );
188
169
  }
189
-
190
- async function fetchUserPositionSnapshotsFromPonder(
191
- userAddress: Address,
192
- environment: Environment,
193
- ): Promise<UserPositionSnapshot[]> {
194
- if (!environment.indexerUrl) return [];
195
-
196
- interface UserDailyData {
197
- totalBorrowsUSD: string;
198
- totalSuppliesUSD: string;
199
- totalCollateralUSD: string;
200
- timestamp: number;
201
- }
202
-
203
- const dailyData: UserDailyData[] = [];
204
- let hasNextPage = true;
205
- let endCursor: string | undefined;
206
-
207
- while (hasNextPage) {
208
- const result = await postWithRetry<{
209
- data: {
210
- accountDailySnapshots: {
211
- items: UserDailyData[];
212
- pageInfo: { hasNextPage: boolean; endCursor: string };
213
- };
214
- };
215
- }>(environment.indexerUrl, {
216
- query: `
217
- query {
218
- accountDailySnapshots(
219
- limit: 365,
220
- orderDirection: "desc",
221
- orderBy: "timestamp",
222
- where: { accountAddress: "${userAddress.toLowerCase()}", chainId: ${environment.chainId} }
223
- ${endCursor ? `after: "${endCursor}"` : ""}
224
- ) {
225
- items {
226
- timestamp,
227
- totalBorrowsUSD,
228
- totalSuppliesUSD,
229
- totalCollateralUSD,
230
- }
231
- pageInfo {
232
- hasNextPage
233
- endCursor
234
- }
235
- }
236
- }
237
- `,
238
- });
239
-
240
- dailyData.push(
241
- ...result.data.data.accountDailySnapshots.items.filter(
242
- (f: { timestamp: number }) => isStartOfDay(f.timestamp),
243
- ),
244
- );
245
- hasNextPage = result.data.data.accountDailySnapshots.pageInfo.hasNextPage;
246
- endCursor = result.data.data.accountDailySnapshots.pageInfo.endCursor;
247
- }
248
-
249
- if (dailyData.length === 0) return [];
250
-
251
- return dailyData.map((point) => ({
252
- chainId: environment.chainId,
253
- timestamp: point.timestamp * 1000,
254
- totalSupplyUsd: Number(point.totalSuppliesUSD),
255
- totalBorrowsUsd: Number(point.totalBorrowsUSD),
256
- totalCollateralUsd: Number(point.totalCollateralUSD),
257
- }));
258
- }
@@ -1,9 +1,9 @@
1
1
  import type { MoonwellClient } from "../../client/createMoonwellClient.js";
2
2
  import { getEnvironmentFromArgs } from "../../common/index.js";
3
3
  import type { OptionalNetworkParameterType } from "../../common/types.js";
4
- import type { Chain, Environment } from "../../environments/index.js";
4
+ import type { Chain } from "../../environments/index.js";
5
5
  import type { CirculatingSupplySnapshot } from "../../types/circulatingSupply.js";
6
- import { getWithRetry, postWithRetry } from "../axiosWithRetry.js";
6
+ import { getWithRetry } from "../axiosWithRetry.js";
7
7
 
8
8
  export type GetCirculatingSupplySnapshotsParameters<
9
9
  environments,
@@ -74,9 +74,7 @@ export async function getCirculatingSupplySnapshots<
74
74
  }
75
75
 
76
76
  if (!environment.lunarIndexerUrl) {
77
- return environment.indexerUrl
78
- ? fetchCirculatingSupplyFromPonder(environment)
79
- : [];
77
+ return [];
80
78
  }
81
79
 
82
80
  try {
@@ -112,70 +110,3 @@ export async function getCirculatingSupplySnapshots<
112
110
  return [];
113
111
  }
114
112
  }
115
-
116
- async function fetchCirculatingSupplyFromPonder(
117
- environment: Environment,
118
- ): Promise<CirculatingSupplySnapshot[]> {
119
- if (!environment.indexerUrl) return [];
120
- try {
121
- const response = await postWithRetry<{
122
- data: {
123
- circulatingSupplyDailySnapshots: {
124
- items: {
125
- chainId: number;
126
- tokenAddress: string;
127
- circulatingSupply: number;
128
- timestamp: number;
129
- }[];
130
- };
131
- };
132
- }>(environment.indexerUrl, {
133
- query: `
134
- {
135
- circulatingSupplyDailySnapshots(
136
- where: { chainId: ${environment.chainId} }
137
- orderBy: "timestamp"
138
- orderDirection: "desc"
139
- limit: 1000
140
- ) {
141
- items {
142
- chainId
143
- tokenAddress
144
- circulatingSupply
145
- timestamp
146
- }
147
- }
148
- }
149
- `,
150
- });
151
-
152
- if (
153
- response.status === 200 &&
154
- response.data?.data?.circulatingSupplyDailySnapshots
155
- ) {
156
- return response.data.data.circulatingSupplyDailySnapshots.items.flatMap(
157
- (item) => {
158
- const token = Object.values(environment.config.tokens).find(
159
- (t) => t.address.toLowerCase() === item.tokenAddress.toLowerCase(),
160
- );
161
- if (!token) return [];
162
- return [
163
- {
164
- chainId: item.chainId,
165
- token,
166
- circulatingSupply: item.circulatingSupply,
167
- timestamp: item.timestamp,
168
- },
169
- ];
170
- },
171
- );
172
- }
173
- return [];
174
- } catch (ex) {
175
- console.error(
176
- "An error occurred while fetching getCirculatingSupplySnapshots...",
177
- ex,
178
- );
179
- return [];
180
- }
181
- }
@@ -1,5 +1,5 @@
1
1
  import { isAddress } from "viem";
2
- import { base, mainnet, moonbeam, optimism } from "viem/chains";
2
+ import { base, mainnet, optimism } from "viem/chains";
3
3
  import type { MoonwellClient } from "../../client/createMoonwellClient.js";
4
4
  import {
5
5
  type Environment,
@@ -23,17 +23,17 @@ export async function getDelegates(
23
23
  ): GetDelegatesReturnType {
24
24
  const logId = logger.start("getDelegates", "Starting to get delegates...");
25
25
 
26
- const governanceEnvironment = publicEnvironments.moonbeam;
26
+ // Any environment resolves the same `governanceIndexerUrl`; the Ethereum hub
27
+ // replaces Moonbeam here now that the sunset chain is gone (MOO-551).
28
+ const governanceEnvironment = publicEnvironments.ethereum;
27
29
 
28
30
  const apiVoters = await fetchAllVoters(governanceEnvironment);
29
31
  const forumProfiles = await getForumProfiles();
30
32
 
31
- const targetChainIds = [
32
- moonbeam.id,
33
- base.id,
34
- optimism.id,
35
- mainnet.id,
36
- ] as const;
33
+ // Moonbeam dropped with the sunset: the chain is halted, so it can no longer
34
+ // serve `getUserVotingPower`. Delegate totals therefore no longer include any
35
+ // WELL that remained on Moonbeam.
36
+ const targetChainIds = [base.id, optimism.id, mainnet.id] as const;
37
37
  const envs = Object.values(client.environments as Environment[]).filter(
38
38
  (env) =>
39
39
  env.contracts.views !== undefined &&
@@ -19,6 +19,8 @@ export type GetGovernanceTokenInfoReturnType = Promise<
19
19
 
20
20
  export async function getGovernanceTokenInfo(
21
21
  _client: MoonwellClient,
22
+ // Retained for API compatibility, but WELL is the only governance token left
23
+ // now that MFAM went with Moonriver (MOO-551), so there is nothing to branch on.
22
24
  args: GetGovernanceTokenInfoParameters,
23
25
  ): GetGovernanceTokenInfoReturnType {
24
26
  const logId = logger.start(
@@ -26,22 +28,28 @@ export async function getGovernanceTokenInfo(
26
28
  "Starting to get governance token info...",
27
29
  );
28
30
 
29
- if (args.governanceToken === "WELL") {
30
- const totalSupply =
31
- await publicEnvironments.moonbeam.contracts.governanceToken.read.totalSupply();
32
-
31
+ // TypeScript already narrows `GovernanceToken` to "WELL", but a JS consumer
32
+ // still passing "MFAM" would otherwise receive WELL's supply as a normal
33
+ // success — silently wrong data where TS consumers get a compile error.
34
+ // Reject it rather than let the removed token look like it still resolves.
35
+ if (args.governanceToken !== undefined && args.governanceToken !== "WELL") {
33
36
  logger.end(logId);
37
+ throw new Error(
38
+ `Unsupported governance token "${args.governanceToken}". MFAM was removed with the Moonriver sunset (MOO-551); WELL is the only governance token.`,
39
+ );
40
+ }
34
41
 
35
- return {
36
- totalSupply: new Amount(totalSupply || 0n, 18),
37
- };
38
- } else {
39
- const totalSupply =
40
- await publicEnvironments.moonriver.contracts.governanceToken.read.totalSupply();
42
+ // WELL supply used to be read from Moonbeam, the original mint. That chain is
43
+ // halted (MOO-551), so the read now targets the Ethereum multigov hub — the
44
+ // home of live governance. Note this reports the hub's xWELL supply rather
45
+ // than Moonbeam's historical total, so the number can differ from pre-sunset
46
+ // releases. MFAM is gone entirely: Apollo governance ended with Moonriver.
47
+ const totalSupply =
48
+ await publicEnvironments.ethereum.contracts.governanceToken.read.totalSupply();
41
49
 
42
- logger.end(logId);
43
- return {
44
- totalSupply: new Amount(totalSupply || 0n, 18),
45
- };
46
- }
50
+ logger.end(logId);
51
+
52
+ return {
53
+ totalSupply: new Amount(totalSupply || 0n, 18),
54
+ };
47
55
  }
@@ -9,7 +9,6 @@ import {
9
9
  import type { NetworkParameterType } from "../../common/types.js";
10
10
  import type { Chain } from "../../environments/index.js";
11
11
  import type { StakingSnapshot } from "../../types/staking.js";
12
- import { postWithRetry } from "../axiosWithRetry.js";
13
12
  import {
14
13
  DEFAULT_LUNAR_TIMEOUT_MS,
15
14
  createLunarIndexerClient,
@@ -47,18 +46,7 @@ export async function getStakingSnapshots<
47
46
  } = (args ?? {}) as GetStakingSnapshotsParameters<environments, undefined>;
48
47
 
49
48
  if (!environment.lunarIndexerUrl) {
50
- const { startTime } = calculateTimeRange(
51
- period,
52
- customStartTime,
53
- customEndTime,
54
- );
55
- return environment.indexerUrl
56
- ? fetchStakingSnapshotsFromPonder(
57
- environment.chainId,
58
- environment.indexerUrl,
59
- startTime,
60
- )
61
- : [];
49
+ return [];
62
50
  }
63
51
 
64
52
  try {
@@ -122,49 +110,3 @@ async function fetchStakingSnapshotsFromLunar(
122
110
  allSnapshots.sort((a, b) => a.timestamp - b.timestamp);
123
111
  return applyGranularity(allSnapshots, granularity);
124
112
  }
125
-
126
- async function fetchStakingSnapshotsFromPonder(
127
- chainId: number,
128
- indexerUrl: string,
129
- startTime?: number,
130
- ): Promise<StakingSnapshot[]> {
131
- try {
132
- const response = await postWithRetry<{
133
- data: {
134
- stakingDailySnapshots: {
135
- items: StakingSnapshot[];
136
- };
137
- };
138
- }>(indexerUrl, {
139
- query: `
140
- query {
141
- stakingDailySnapshots(
142
- limit: 365,
143
- orderBy: "timestamp"
144
- orderDirection: "desc"
145
- where: {chainId: ${chainId}}
146
- ) {
147
- items {
148
- chainId
149
- totalStaked
150
- totalStakedUSD
151
- timestamp
152
- }
153
- }
154
- }
155
- `,
156
- });
157
-
158
- if (response.status === 200 && response.data?.data?.stakingDailySnapshots) {
159
- const items = response.data.data.stakingDailySnapshots.items;
160
- return startTime
161
- ? items.filter((item) => item.timestamp >= startTime)
162
- : items;
163
- } else {
164
- return [];
165
- }
166
- } catch (ex) {
167
- console.error("An error occured while fetching getStakingSnapshots...", ex);
168
- return [];
169
- }
170
- }
@@ -1,7 +1,8 @@
1
1
  import type { Address, Chain } from "viem";
2
2
  import type { MoonwellClient } from "../../client/createMoonwellClient.js";
3
- import { Amount, getEnvironmentFromArgs } from "../../common/index.js";
3
+ import { Amount } from "../../common/index.js";
4
4
  import type { NetworkParameterType } from "../../common/types.js";
5
+ import type { Environment } from "../../environments/index.js";
5
6
  import type { VoteReceipt } from "../../types/voteReceipt.js";
6
7
  import {
7
8
  type ApiVoteReceipt,
@@ -10,6 +11,7 @@ import {
10
11
  fetchUserVoteReceipt,
11
12
  isNotFoundError,
12
13
  } from "./governor-api-client.js";
14
+ import { resolveGovernanceEnvironment } from "./proposals/common.js";
13
15
 
14
16
  export type GetUserVoteReceiptParameters<
15
17
  environments,
@@ -50,8 +52,17 @@ export async function getUserVoteReceipt<
50
52
  ): GetUserVoteReceiptReturnType {
51
53
  const { proposalId, userAddress, chainId } = args;
52
54
 
53
- const environment = getEnvironmentFromArgs(client, args);
54
- if (!environment) {
55
+ // `args.chainId` identifies the chain the PROPOSAL lives on, not the
56
+ // environment we read through — the same distinction `getProposal` draws
57
+ // (MOO-551). Resolving the environment from it meant an archive lookup
58
+ // (1284/1285) matched no registered environment post-sunset and returned `[]`,
59
+ // a third shape callers don't handle: every historical vote read as "didn't
60
+ // vote". Resolve the indexer source independently and pass `chainId` through
61
+ // untouched.
62
+ const governanceEnvironment = resolveGovernanceEnvironment(
63
+ Object.values(client.environments as Record<string, Environment>),
64
+ );
65
+ if (!governanceEnvironment) {
55
66
  return [];
56
67
  }
57
68
 
@@ -64,7 +75,7 @@ export async function getUserVoteReceipt<
64
75
  for (const cid of tryChains) {
65
76
  try {
66
77
  const apiVoteReceipts = await fetchUserVoteReceipt(
67
- environment,
78
+ governanceEnvironment,
68
79
  cid,
69
80
  proposalId,
70
81
  userAddress,
@@ -87,7 +98,10 @@ export async function getUserVoteReceipt<
87
98
  if (collected.length === 0) {
88
99
  return [
89
100
  {
90
- chainId: environment.chainId,
101
+ // An explicit request names the chain the stub is about; a bare lookup
102
+ // queried every supported chain, so the source we read through is the
103
+ // only chain it can honestly claim.
104
+ chainId: chainId ?? governanceEnvironment.chainId,
91
105
  proposalId,
92
106
  account: userAddress,
93
107
  voted: false,
@@ -15,11 +15,20 @@ const getGovernorApiUrl = (environment: Environment): string => {
15
15
  * active multigov contract lives; Moonbeam follows for the historical archive,
16
16
  * then Moonriver (legacy standalone governor).
17
17
  *
18
- * This is the fan-out set for `getUserVoteReceipt` — a bare proposalId is
19
- * queried on every chain and non-empty receipts are concatenated. Do NOT use it
20
- * as the single-proposal fallback in `getProposal`: Moonriver has its own
21
- * explicit route there, and reaching a 1285 proposal through a Moonbeam env
22
- * would surface a degraded result (see `MULTIGOV_PROPOSAL_FALLBACK_CHAIN_IDS`).
18
+ * The fan-out set for two consumers: `getUserVoteReceipt` (a bare proposalId is
19
+ * queried on every chain and non-empty receipts are concatenated) and
20
+ * `getProposals` (every chain's list is fetched and merged, so the archive stays
21
+ * listable after the sunset).
22
+ *
23
+ * Since MOO-551 no Moonbeam/Moonriver environment exists, so 1284 and 1285 are
24
+ * served through whichever governance environment resolved — reporting
25
+ * `quorum: 0` and no `eta` because nothing on-chain can be read for a halted
26
+ * chain. That degradation is the accepted post-sunset design here, not a bug.
27
+ *
28
+ * Still do NOT use this set as the *single-proposal* fallback in `getProposal`:
29
+ * a bare lookup must not silently resolve to a 1285 proposal it wasn't asked
30
+ * for — that stays an explicit `chainId` route (see
31
+ * `MULTIGOV_PROPOSAL_FALLBACK_CHAIN_IDS`).
23
32
  */
24
33
  export const SUPPORTED_GOVERNOR_CHAIN_IDS = [1, 1284, 1285] as const;
25
34