@moonwell-fi/moonwell-sdk 0.11.0 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/_cjs/actions/axiosWithRetry.js +25 -0
  3. package/_cjs/actions/axiosWithRetry.js.map +1 -0
  4. package/_cjs/actions/beam/getBeamTokenLimits.js +2 -5
  5. package/_cjs/actions/beam/getBeamTokenLimits.js.map +1 -1
  6. package/_cjs/actions/beam/getBeamTokenRoutes.js +3 -6
  7. package/_cjs/actions/beam/getBeamTokenRoutes.js.map +1 -1
  8. package/_cjs/actions/core/markets/common.js +26 -12
  9. package/_cjs/actions/core/markets/common.js.map +1 -1
  10. package/_cjs/actions/core/markets/getMarketSnapshots.js +175 -326
  11. package/_cjs/actions/core/markets/getMarketSnapshots.js.map +1 -1
  12. package/_cjs/actions/core/user-positions/getUserPositionSnapshots.js +33 -31
  13. package/_cjs/actions/core/user-positions/getUserPositionSnapshots.js.map +1 -1
  14. package/_cjs/actions/governance/getCirculatingSupplySnapshots.js +38 -35
  15. package/_cjs/actions/governance/getCirculatingSupplySnapshots.js.map +1 -1
  16. package/_cjs/actions/governance/getDelegates.js +2 -5
  17. package/_cjs/actions/governance/getDelegates.js.map +1 -1
  18. package/_cjs/actions/governance/getDiscussions.js +3 -3
  19. package/_cjs/actions/governance/getDiscussions.js.map +1 -1
  20. package/_cjs/actions/governance/getStakingSnapshots.js +18 -17
  21. package/_cjs/actions/governance/getStakingSnapshots.js.map +1 -1
  22. package/_cjs/actions/governance/getUserVotingPowers.js +12 -4
  23. package/_cjs/actions/governance/getUserVotingPowers.js.map +1 -1
  24. package/_cjs/actions/governance/governor-api-client.js +10 -13
  25. package/_cjs/actions/governance/governor-api-client.js.map +1 -1
  26. package/_cjs/actions/governance/proposals/common.js +248 -211
  27. package/_cjs/actions/governance/proposals/common.js.map +1 -1
  28. package/_cjs/actions/governance/snapshot/common.js +2 -5
  29. package/_cjs/actions/governance/snapshot/common.js.map +1 -1
  30. package/_cjs/actions/lunar-indexer-client.js +4 -0
  31. package/_cjs/actions/lunar-indexer-client.js.map +1 -1
  32. package/_cjs/actions/morpho/markets/common.js +28 -34
  33. package/_cjs/actions/morpho/markets/common.js.map +1 -1
  34. package/_cjs/actions/morpho/markets/lunarIndexerTransform.js +5 -8
  35. package/_cjs/actions/morpho/markets/lunarIndexerTransform.js.map +1 -1
  36. package/_cjs/actions/morpho/user-positions/getMorphoVaultUserPositionSnapshots.js +12 -69
  37. package/_cjs/actions/morpho/user-positions/getMorphoVaultUserPositionSnapshots.js.map +1 -1
  38. package/_cjs/actions/morpho/vaults/common.js +7 -4
  39. package/_cjs/actions/morpho/vaults/common.js.map +1 -1
  40. package/_cjs/actions/morpho/vaults/getMorphoVaultSnapshots.js +21 -78
  41. package/_cjs/actions/morpho/vaults/getMorphoVaultSnapshots.js.map +1 -1
  42. package/_cjs/actions/morpho/vaults/getMorphoVaultStakingSnapshots.js +13 -66
  43. package/_cjs/actions/morpho/vaults/getMorphoVaultStakingSnapshots.js.map +1 -1
  44. package/_cjs/actions/retry.js +63 -0
  45. package/_cjs/actions/retry.js.map +1 -0
  46. package/_cjs/client/createMoonwellClient.js +9 -3
  47. package/_cjs/client/createMoonwellClient.js.map +1 -1
  48. package/_cjs/common/getBlockNumberAtTimestamp.js +42 -0
  49. package/_cjs/common/getBlockNumberAtTimestamp.js.map +1 -0
  50. package/_cjs/common/index.js +3 -1
  51. package/_cjs/common/index.js.map +1 -1
  52. package/_cjs/environments/definitions/arbitrum/environment.js +1 -2
  53. package/_cjs/environments/definitions/arbitrum/environment.js.map +1 -1
  54. package/_cjs/environments/definitions/avalanche/environment.js +1 -2
  55. package/_cjs/environments/definitions/avalanche/environment.js.map +1 -1
  56. package/_cjs/environments/definitions/base/custom.js +0 -1
  57. package/_cjs/environments/definitions/base/custom.js.map +1 -1
  58. package/_cjs/environments/definitions/base/environment.js +1 -2
  59. package/_cjs/environments/definitions/base/environment.js.map +1 -1
  60. package/_cjs/environments/definitions/ethereum/environment.js +1 -2
  61. package/_cjs/environments/definitions/ethereum/environment.js.map +1 -1
  62. package/_cjs/environments/definitions/moonbeam/environment.js +1 -2
  63. package/_cjs/environments/definitions/moonbeam/environment.js.map +1 -1
  64. package/_cjs/environments/definitions/optimism/custom.js +0 -1
  65. package/_cjs/environments/definitions/optimism/custom.js.map +1 -1
  66. package/_cjs/environments/definitions/optimism/environment.js +1 -2
  67. package/_cjs/environments/definitions/optimism/environment.js.map +1 -1
  68. package/_cjs/environments/definitions/polygon/environment.js +1 -2
  69. package/_cjs/environments/definitions/polygon/environment.js.map +1 -1
  70. package/_cjs/environments/index.js +8 -8
  71. package/_cjs/environments/index.js.map +1 -1
  72. package/_cjs/environments/types/config.js +1 -0
  73. package/_cjs/environments/types/config.js.map +1 -1
  74. package/_cjs/errors/version.js +1 -1
  75. package/_esm/actions/axiosWithRetry.js +32 -0
  76. package/_esm/actions/axiosWithRetry.js.map +1 -0
  77. package/_esm/actions/beam/getBeamTokenLimits.js +2 -2
  78. package/_esm/actions/beam/getBeamTokenLimits.js.map +1 -1
  79. package/_esm/actions/beam/getBeamTokenRoutes.js +3 -3
  80. package/_esm/actions/beam/getBeamTokenRoutes.js.map +1 -1
  81. package/_esm/actions/core/markets/common.js +26 -13
  82. package/_esm/actions/core/markets/common.js.map +1 -1
  83. package/_esm/actions/core/markets/getMarketSnapshots.js +196 -348
  84. package/_esm/actions/core/markets/getMarketSnapshots.js.map +1 -1
  85. package/_esm/actions/core/user-positions/getUserPositionSnapshots.js +34 -31
  86. package/_esm/actions/core/user-positions/getUserPositionSnapshots.js.map +1 -1
  87. package/_esm/actions/governance/getCirculatingSupplySnapshots.js +38 -33
  88. package/_esm/actions/governance/getCirculatingSupplySnapshots.js.map +1 -1
  89. package/_esm/actions/governance/getDelegates.js +2 -2
  90. package/_esm/actions/governance/getDelegates.js.map +1 -1
  91. package/_esm/actions/governance/getDiscussions.js +3 -3
  92. package/_esm/actions/governance/getDiscussions.js.map +1 -1
  93. package/_esm/actions/governance/getStakingSnapshots.js +19 -15
  94. package/_esm/actions/governance/getStakingSnapshots.js.map +1 -1
  95. package/_esm/actions/governance/getUserVotingPowers.js +13 -5
  96. package/_esm/actions/governance/getUserVotingPowers.js.map +1 -1
  97. package/_esm/actions/governance/governor-api-client.js +10 -10
  98. package/_esm/actions/governance/governor-api-client.js.map +1 -1
  99. package/_esm/actions/governance/proposals/common.js +247 -216
  100. package/_esm/actions/governance/proposals/common.js.map +1 -1
  101. package/_esm/actions/governance/snapshot/common.js +2 -2
  102. package/_esm/actions/governance/snapshot/common.js.map +1 -1
  103. package/_esm/actions/lunar-indexer-client.js +6 -0
  104. package/_esm/actions/lunar-indexer-client.js.map +1 -1
  105. package/_esm/actions/morpho/markets/common.js +29 -36
  106. package/_esm/actions/morpho/markets/common.js.map +1 -1
  107. package/_esm/actions/morpho/markets/lunarIndexerTransform.js +5 -5
  108. package/_esm/actions/morpho/markets/lunarIndexerTransform.js.map +1 -1
  109. package/_esm/actions/morpho/user-positions/getMorphoVaultUserPositionSnapshots.js +14 -68
  110. package/_esm/actions/morpho/user-positions/getMorphoVaultUserPositionSnapshots.js.map +1 -1
  111. package/_esm/actions/morpho/vaults/common.js +7 -4
  112. package/_esm/actions/morpho/vaults/common.js.map +1 -1
  113. package/_esm/actions/morpho/vaults/getMorphoVaultSnapshots.js +24 -78
  114. package/_esm/actions/morpho/vaults/getMorphoVaultSnapshots.js.map +1 -1
  115. package/_esm/actions/morpho/vaults/getMorphoVaultStakingSnapshots.js +15 -65
  116. package/_esm/actions/morpho/vaults/getMorphoVaultStakingSnapshots.js.map +1 -1
  117. package/_esm/actions/retry.js +90 -0
  118. package/_esm/actions/retry.js.map +1 -0
  119. package/_esm/client/createMoonwellClient.js +9 -3
  120. package/_esm/client/createMoonwellClient.js.map +1 -1
  121. package/_esm/common/getBlockNumberAtTimestamp.js +56 -0
  122. package/_esm/common/getBlockNumberAtTimestamp.js.map +1 -0
  123. package/_esm/common/index.js +1 -0
  124. package/_esm/common/index.js.map +1 -1
  125. package/_esm/environments/definitions/arbitrum/environment.js +1 -2
  126. package/_esm/environments/definitions/arbitrum/environment.js.map +1 -1
  127. package/_esm/environments/definitions/avalanche/environment.js +1 -2
  128. package/_esm/environments/definitions/avalanche/environment.js.map +1 -1
  129. package/_esm/environments/definitions/base/custom.js +0 -1
  130. package/_esm/environments/definitions/base/custom.js.map +1 -1
  131. package/_esm/environments/definitions/base/environment.js +1 -2
  132. package/_esm/environments/definitions/base/environment.js.map +1 -1
  133. package/_esm/environments/definitions/ethereum/environment.js +1 -2
  134. package/_esm/environments/definitions/ethereum/environment.js.map +1 -1
  135. package/_esm/environments/definitions/moonbeam/environment.js +1 -2
  136. package/_esm/environments/definitions/moonbeam/environment.js.map +1 -1
  137. package/_esm/environments/definitions/optimism/custom.js +0 -1
  138. package/_esm/environments/definitions/optimism/custom.js.map +1 -1
  139. package/_esm/environments/definitions/optimism/environment.js +1 -2
  140. package/_esm/environments/definitions/optimism/environment.js.map +1 -1
  141. package/_esm/environments/definitions/polygon/environment.js +1 -2
  142. package/_esm/environments/definitions/polygon/environment.js.map +1 -1
  143. package/_esm/environments/index.js +8 -8
  144. package/_esm/environments/index.js.map +1 -1
  145. package/_esm/environments/types/config.js +1 -0
  146. package/_esm/environments/types/config.js.map +1 -1
  147. package/_esm/errors/version.js +1 -1
  148. package/_types/actions/axiosWithRetry.d.ts +16 -0
  149. package/_types/actions/axiosWithRetry.d.ts.map +1 -0
  150. package/_types/actions/beam/getBeamTokenLimits.d.ts.map +1 -1
  151. package/_types/actions/beam/getBeamTokenRoutes.d.ts.map +1 -1
  152. package/_types/actions/core/markets/common.d.ts.map +1 -1
  153. package/_types/actions/core/markets/getMarketSnapshots.d.ts.map +1 -1
  154. package/_types/actions/core/user-positions/getUserPositionSnapshots.d.ts +0 -1
  155. package/_types/actions/core/user-positions/getUserPositionSnapshots.d.ts.map +1 -1
  156. package/_types/actions/governance/getCirculatingSupplySnapshots.d.ts.map +1 -1
  157. package/_types/actions/governance/getDelegates.d.ts.map +1 -1
  158. package/_types/actions/governance/getDiscussions.d.ts.map +1 -1
  159. package/_types/actions/governance/getStakingSnapshots.d.ts.map +1 -1
  160. package/_types/actions/governance/getUserVotingPowers.d.ts +13 -1
  161. package/_types/actions/governance/getUserVotingPowers.d.ts.map +1 -1
  162. package/_types/actions/governance/governor-api-client.d.ts.map +1 -1
  163. package/_types/actions/governance/proposals/common.d.ts +2 -8
  164. package/_types/actions/governance/proposals/common.d.ts.map +1 -1
  165. package/_types/actions/governance/snapshot/common.d.ts.map +1 -1
  166. package/_types/actions/lunar-indexer-client.d.ts.map +1 -1
  167. package/_types/actions/morpho/markets/common.d.ts.map +1 -1
  168. package/_types/actions/morpho/markets/lunarIndexerTransform.d.ts.map +1 -1
  169. package/_types/actions/morpho/user-positions/getMorphoVaultUserPositionSnapshots.d.ts.map +1 -1
  170. package/_types/actions/morpho/vaults/common.d.ts.map +1 -1
  171. package/_types/actions/morpho/vaults/getMorphoVaultSnapshots.d.ts.map +1 -1
  172. package/_types/actions/morpho/vaults/getMorphoVaultStakingSnapshots.d.ts.map +1 -1
  173. package/_types/actions/retry.d.ts +45 -0
  174. package/_types/actions/retry.d.ts.map +1 -0
  175. package/_types/client/createMoonwellClient.d.ts +6 -6
  176. package/_types/client/createMoonwellClient.d.ts.map +1 -1
  177. package/_types/common/getBlockNumberAtTimestamp.d.ts +15 -0
  178. package/_types/common/getBlockNumberAtTimestamp.d.ts.map +1 -0
  179. package/_types/common/index.d.ts +1 -0
  180. package/_types/common/index.d.ts.map +1 -1
  181. package/_types/environments/definitions/arbitrum/environment.d.ts +1 -1
  182. package/_types/environments/definitions/arbitrum/environment.d.ts.map +1 -1
  183. package/_types/environments/definitions/avalanche/environment.d.ts +1 -1
  184. package/_types/environments/definitions/avalanche/environment.d.ts.map +1 -1
  185. package/_types/environments/definitions/base/custom.d.ts +0 -1
  186. package/_types/environments/definitions/base/custom.d.ts.map +1 -1
  187. package/_types/environments/definitions/base/environment.d.ts +22 -4
  188. package/_types/environments/definitions/base/environment.d.ts.map +1 -1
  189. package/_types/environments/definitions/ethereum/environment.d.ts +1 -1
  190. package/_types/environments/definitions/ethereum/environment.d.ts.map +1 -1
  191. package/_types/environments/definitions/moonbeam/custom.d.ts +1 -1
  192. package/_types/environments/definitions/moonbeam/environment.d.ts +2 -2
  193. package/_types/environments/definitions/moonbeam/environment.d.ts.map +1 -1
  194. package/_types/environments/definitions/optimism/custom.d.ts +0 -1
  195. package/_types/environments/definitions/optimism/custom.d.ts.map +1 -1
  196. package/_types/environments/definitions/optimism/environment.d.ts +1 -2
  197. package/_types/environments/definitions/optimism/environment.d.ts.map +1 -1
  198. package/_types/environments/definitions/polygon/environment.d.ts +1 -1
  199. package/_types/environments/definitions/polygon/environment.d.ts.map +1 -1
  200. package/_types/environments/index.d.ts +119 -23
  201. package/_types/environments/index.d.ts.map +1 -1
  202. package/_types/environments/types/config.d.ts +37 -44
  203. package/_types/environments/types/config.d.ts.map +1 -1
  204. package/_types/errors/version.d.ts +1 -1
  205. package/actions/axiosWithRetry.ts +42 -0
  206. package/actions/beam/getBeamTokenLimits.ts +2 -2
  207. package/actions/beam/getBeamTokenRoutes.ts +3 -3
  208. package/actions/core/markets/common.ts +33 -18
  209. package/actions/core/markets/getMarketSnapshots.ts +263 -513
  210. package/actions/core/user-positions/getUserPositionSnapshots.ts +46 -48
  211. package/actions/governance/getCirculatingSupplySnapshots.ts +46 -38
  212. package/actions/governance/getDelegates.ts +2 -2
  213. package/actions/governance/getDiscussions.ts +6 -5
  214. package/actions/governance/getStakingSnapshots.ts +34 -31
  215. package/actions/governance/getUserVotingPowers.ts +43 -8
  216. package/actions/governance/governor-api-client.ts +12 -10
  217. package/actions/governance/proposals/common.ts +370 -330
  218. package/actions/governance/snapshot/common.ts +2 -2
  219. package/actions/lunar-indexer-client.ts +8 -0
  220. package/actions/morpho/markets/common.ts +34 -45
  221. package/actions/morpho/markets/lunarIndexerTransform.ts +6 -5
  222. package/actions/morpho/user-positions/getMorphoVaultUserPositionSnapshots.ts +20 -109
  223. package/actions/morpho/vaults/common.ts +7 -6
  224. package/actions/morpho/vaults/getMorphoVaultSnapshots.ts +36 -120
  225. package/actions/morpho/vaults/getMorphoVaultStakingSnapshots.ts +24 -111
  226. package/actions/retry.ts +121 -0
  227. package/client/createMoonwellClient.ts +17 -5
  228. package/common/getBlockNumberAtTimestamp.ts +59 -0
  229. package/common/index.ts +1 -0
  230. package/environments/definitions/arbitrum/environment.ts +0 -2
  231. package/environments/definitions/avalanche/environment.ts +0 -2
  232. package/environments/definitions/base/custom.ts +0 -1
  233. package/environments/definitions/base/environment.ts +0 -2
  234. package/environments/definitions/ethereum/environment.ts +0 -2
  235. package/environments/definitions/moonbeam/environment.ts +0 -2
  236. package/environments/definitions/optimism/custom.ts +0 -1
  237. package/environments/definitions/optimism/environment.ts +0 -2
  238. package/environments/definitions/polygon/environment.ts +0 -2
  239. package/environments/index.ts +6 -27
  240. package/environments/types/config.ts +45 -210
  241. package/errors/version.ts +1 -1
  242. package/package.json +2 -2
@@ -9,8 +9,11 @@ import {
9
9
  type Proposal,
10
10
  type ProposalState,
11
11
  } from "../../../types/proposal.js";
12
+ import { postWithRetry } from "../../axiosWithRetry.js";
12
13
  import type { ApiProposal } from "../governor-api-client.js";
13
14
 
15
+ export const WORMHOLE_CONTRACT = "0xc8e2b0cd52cf01b0ce87d389daa3d414d4ce29f3";
16
+
14
17
  type PonderExtendedProposalData = {
15
18
  id: number;
16
19
  title: string;
@@ -28,8 +31,6 @@ type PonderExtendedProposalData = {
28
31
 
29
32
  axios.defaults.timeout = 5_000;
30
33
 
31
- export const WORMHOLE_CONTRACT = "0xc8e2b0cd52cf01b0ce87d389daa3d414d4ce29f3";
32
-
33
34
  /**
34
35
  * Extract proposal subtitle from description
35
36
  */
@@ -314,35 +315,6 @@ export const getProposalsOnChainData = async (
314
315
  }));
315
316
  };
316
317
 
317
- /**
318
- * Append extended proposal data (Ponder-based, for Moonriver)
319
- */
320
- export const appendProposalExtendedData = (
321
- proposals: Proposal[],
322
- extendedDatas: PonderExtendedProposalData[],
323
- ) => {
324
- proposals.forEach((proposal) => {
325
- const extendedData = extendedDatas.find(
326
- (item) => item.id === proposal.proposalId,
327
- );
328
-
329
- if (extendedData) {
330
- proposal.title = extendedData.title;
331
- proposal.calldatas = extendedData.calldatas;
332
- proposal.description = extendedData.description;
333
- proposal.signatures = extendedData.signatures;
334
- proposal.stateChanges = extendedData.stateChanges.map((change) => ({
335
- blockNumber: change.blockNumber,
336
- transactionHash: change.transactionHash,
337
- state: change.state,
338
- chainId: proposal.chainId,
339
- }));
340
- proposal.subtitle = extendedData.subtitle;
341
- proposal.targets = extendedData.targets;
342
- }
343
- });
344
- };
345
-
346
318
  /**
347
319
  * Get proposal data from on-chain (Ponder-based, for Moonriver)
348
320
  */
@@ -350,258 +322,85 @@ export const getProposalData = async (params: {
350
322
  environment: Environment;
351
323
  id?: number;
352
324
  }) => {
353
- if (params.environment.contracts.governor) {
354
- let count = 0n;
355
- let quorum = 0n;
356
-
357
- if (params.environment.chainId === moonriver.id) {
358
- [count, quorum] = await Promise.all([
359
- params.environment.contracts.governor.read.proposalCount(),
360
- params.environment.contracts.governor.read.getQuorum(),
361
- ]);
362
- } else {
363
- [count, quorum] = await Promise.all([
364
- params.environment.contracts.governor.read.proposalCount(),
365
- params.environment.contracts.governor.read.quorumVotes(),
366
- ]);
367
- }
368
-
369
- if (params.id) {
370
- if (BigInt(params.id) > count) {
371
- return [];
325
+ try {
326
+ if (params.environment.contracts.governor) {
327
+ let count = 0n;
328
+ let quorum = 0n;
329
+
330
+ if (params.environment.chainId === moonriver.id) {
331
+ [count, quorum] = await Promise.all([
332
+ params.environment.contracts.governor.read.proposalCount(),
333
+ params.environment.contracts.governor.read.getQuorum(),
334
+ ]);
335
+ } else {
336
+ [count, quorum] = await Promise.all([
337
+ params.environment.contracts.governor.read.proposalCount(),
338
+ params.environment.contracts.governor.read.quorumVotes(),
339
+ ]);
372
340
  }
373
- }
374
-
375
- const ids = params.id
376
- ? [BigInt(params.id)]
377
- : Array.from({ length: Number(count) }, (_, i) => count - BigInt(i));
378
-
379
- const proposalDataCall = Promise.all(
380
- ids.map((id) =>
381
- params.environment.contracts.governor?.read.proposals([id]),
382
- ),
383
- );
384
-
385
- const proposalStateCall = Promise.all(
386
- ids.map((id) => params.environment.contracts.governor?.read.state([id])),
387
- );
388
-
389
- const [proposalsData, proposalsState] = await Promise.all([
390
- proposalDataCall,
391
- proposalStateCall,
392
- ]);
393
-
394
- const proposals = proposalsData?.map((item, index: number) => {
395
- const state = proposalsState?.[index]!;
396
-
397
- const [
398
- id,
399
- proposer,
400
- eta,
401
- startTimestamp,
402
- endTimestamp,
403
- startBlock,
404
- forVotes,
405
- againstVotes,
406
- abstainVotes,
407
- totalVotes,
408
- canceled,
409
- executed,
410
- ] = item!;
411
-
412
- const proposal: Proposal = {
413
- chainId: params.environment.chainId,
414
- id: Number(id),
415
- proposalId: Number(id),
416
- proposer,
417
- eta: Number(eta),
418
- startTimestamp: Number(startTimestamp),
419
- endTimestamp: Number(endTimestamp),
420
- startBlock: Number(startBlock),
421
- forVotes: new Amount(forVotes, 18),
422
- againstVotes: new Amount(againstVotes, 18),
423
- abstainVotes: new Amount(abstainVotes, 18),
424
- totalVotes: new Amount(totalVotes, 18),
425
- canceled,
426
- executed,
427
- quorum: new Amount(quorum, 18),
428
- state,
429
- };
430
-
431
- return proposal;
432
- });
433
-
434
- return proposals;
435
- } else {
436
- return [];
437
- }
438
- };
439
-
440
- /**
441
- * Get cross-chain proposal data (Ponder-based, for Moonriver)
442
- */
443
- export const getCrossChainProposalData = async (params: {
444
- environment: Environment;
445
- id?: number;
446
- }) => {
447
- if (params.environment.contracts.governor) {
448
- const xcGovernanceSettings = params.environment.custom.governance;
449
- if (
450
- params.environment.contracts.multichainGovernor &&
451
- xcGovernanceSettings &&
452
- xcGovernanceSettings.chainIds.length > 0
453
- ) {
454
- const xcEnvironments = xcGovernanceSettings.chainIds
455
- .map((chainId) =>
456
- (Object.values(publicEnvironments) as Environment[]).find(
457
- (env) => env.chainId === chainId,
458
- ),
459
- )
460
- .filter((xcEnvironment) => !!xcEnvironment)
461
- .filter(
462
- (xcEnvironment) =>
463
- xcEnvironment!.custom?.wormhole?.chainId &&
464
- xcEnvironment!.contracts.voteCollector,
465
- );
466
-
467
- const [xcCount, xcQuorum] = await Promise.all([
468
- params.environment.contracts.multichainGovernor.read.proposalCount(),
469
- params.environment.contracts.multichainGovernor.read.quorum(),
470
- ]);
471
341
 
472
342
  if (params.id) {
473
- params.id =
474
- Number(params.id) -
475
- (params.environment.custom?.governance?.proposalIdOffset || 0);
476
-
477
- if (params.id < 0) {
343
+ if (BigInt(params.id) > count) {
478
344
  return [];
479
- } else {
480
- if (BigInt(params.id) > xcCount) {
481
- return [];
482
- }
483
345
  }
484
346
  }
485
347
 
486
348
  const ids = params.id
487
349
  ? [BigInt(params.id)]
488
- : Array.from(
489
- { length: Number(xcCount) },
490
- (_, i) => xcCount - BigInt(i),
491
- );
350
+ : Array.from({ length: Number(count) }, (_, i) => count - BigInt(i));
492
351
 
493
- const xcProposalsDataCall = Promise.all(
352
+ const proposalDataCall = Promise.all(
494
353
  ids.map((id) =>
495
- params.environment.contracts.multichainGovernor?.read.proposals([id]),
354
+ params.environment.contracts.governor?.read.proposals([id]),
496
355
  ),
497
356
  );
498
357
 
499
- const xcProposalsStateCall = Promise.all(
358
+ const proposalStateCall = Promise.all(
500
359
  ids.map((id) =>
501
- params.environment.contracts.multichainGovernor?.read.state([id]),
360
+ params.environment.contracts.governor?.read.state([id]),
502
361
  ),
503
362
  );
504
363
 
505
- const xcVotesCall = Promise.all(
506
- xcEnvironments.map((xcEnvironment) =>
507
- Promise.all(
508
- ids.map((id) =>
509
- params.environment.contracts.multichainGovernor?.read.chainVoteCollectorVotes(
510
- [(xcEnvironment!.custom as any).wormhole.chainId, id],
511
- ),
512
- ),
513
- ),
514
- ),
515
- );
516
-
517
- const [xcProposalsData, xcProposalsState, xcVotes] = await Promise.all([
518
- xcProposalsDataCall,
519
- xcProposalsStateCall,
520
- xcVotesCall,
364
+ const [proposalsData, proposalsState] = await Promise.all([
365
+ proposalDataCall,
366
+ proposalStateCall,
521
367
  ]);
522
368
 
523
- const proposals = ids.map((xcId, proposalIndex: number) => {
524
- const state = xcProposalsState?.[proposalIndex]!;
525
- const id =
526
- Number(xcId) +
527
- (params.environment.custom?.governance?.proposalIdOffset || 0);
528
-
529
- const votesCollected = false;
530
-
531
- const votes = xcVotes.reduce(
532
- (prevVotes, currVotes) => {
533
- const voteData = currVotes[proposalIndex];
534
- if (!voteData) {
535
- return prevVotes;
536
- }
537
-
538
- // chainVoteCollectorVotes returns [forVotes, againstVotes, abstainVotes]
539
- const forVotes = voteData[0] || 0n;
540
- const againstVotes = voteData[1] || 0n;
541
- const abstainVotes = voteData[2] || 0n;
542
- const totalVotes = forVotes + againstVotes + abstainVotes;
543
-
544
- return {
545
- totalVotes: prevVotes.totalVotes + totalVotes,
546
- forVotes: prevVotes.forVotes + forVotes,
547
- againstVotes: prevVotes.againstVotes + againstVotes,
548
- abstainVotes: prevVotes.abstainVotes + abstainVotes,
549
- };
550
- },
551
- { totalVotes: 0n, forVotes: 0n, againstVotes: 0n, abstainVotes: 0n },
552
- );
553
-
554
- const proposalData = xcProposalsData?.[proposalIndex];
555
- if (!proposalData) {
556
- throw new Error(`Proposal data not found for index ${proposalIndex}`);
557
- }
369
+ const proposals = proposalsData?.map((item, index: number) => {
370
+ const state = proposalsState?.[index]!;
558
371
 
559
372
  const [
373
+ id,
560
374
  proposer,
561
- _voteSnapshotTimestamp,
562
- votingStartTime,
563
- votingEndTime,
564
- crossChainVoteCollectionEndTimestamp,
565
- voteSnapshotBlock,
566
- proposalForVotes,
567
- proposalAgainstVotes,
568
- proposalAbstainVotes,
569
- proposalTotalVotes,
375
+ eta,
376
+ startTimestamp,
377
+ endTimestamp,
378
+ startBlock,
379
+ forVotes,
380
+ againstVotes,
381
+ abstainVotes,
382
+ totalVotes,
570
383
  canceled,
571
384
  executed,
572
- ] = proposalData;
573
-
574
- const multichainState = (
575
- MultichainProposalStateMapping as { [key: number]: ProposalState }
576
- )[state]!;
385
+ ] = item!;
577
386
 
578
387
  const proposal: Proposal = {
579
388
  chainId: params.environment.chainId,
580
- id,
581
- proposalId: Number(xcId),
389
+ id: Number(id),
390
+ proposalId: Number(id),
582
391
  proposer,
583
- eta: Number(crossChainVoteCollectionEndTimestamp),
584
- startTimestamp: Number(votingStartTime),
585
- endTimestamp: Number(votingEndTime),
586
- startBlock: Number(voteSnapshotBlock),
587
- forVotes: new Amount(proposalForVotes + votes.forVotes, 18),
588
- againstVotes: new Amount(
589
- proposalAgainstVotes + votes.againstVotes,
590
- 18,
591
- ),
592
- abstainVotes: new Amount(
593
- proposalAbstainVotes + votes.abstainVotes,
594
- 18,
595
- ),
596
- totalVotes: new Amount(proposalTotalVotes + votes.totalVotes, 18),
392
+ eta: Number(eta),
393
+ startTimestamp: Number(startTimestamp),
394
+ endTimestamp: Number(endTimestamp),
395
+ startBlock: Number(startBlock),
396
+ forVotes: new Amount(forVotes, 18),
397
+ againstVotes: new Amount(againstVotes, 18),
398
+ abstainVotes: new Amount(abstainVotes, 18),
399
+ totalVotes: new Amount(totalVotes, 18),
597
400
  canceled,
598
401
  executed,
599
- quorum: new Amount(xcQuorum, 18),
600
- state: multichainState,
601
- multichain: {
602
- id: Number(xcId),
603
- votesCollected,
604
- },
402
+ quorum: new Amount(quorum, 18),
403
+ state,
605
404
  };
606
405
 
607
406
  return proposal;
@@ -611,106 +410,347 @@ export const getCrossChainProposalData = async (params: {
611
410
  } else {
612
411
  return [];
613
412
  }
614
- } else {
413
+ } catch (error) {
414
+ console.warn(
415
+ `[getProposalData] RPC failed for chain ${params.environment.chainId}:`,
416
+ error,
417
+ );
418
+ params.environment.onError?.(error, {
419
+ source: "governance-proposals",
420
+ chainId: params.environment.chainId,
421
+ });
615
422
  return [];
616
423
  }
617
424
  };
618
425
 
619
426
  /**
620
- * Get extended proposal data from Ponder (for Moonriver)
427
+ * Get cross-chain proposal data (Ponder-based, for Moonriver)
621
428
  */
429
+ export const getCrossChainProposalData = async (params: {
430
+ environment: Environment;
431
+ id?: number;
432
+ }) => {
433
+ try {
434
+ if (params.environment.contracts.governor) {
435
+ const xcGovernanceSettings = params.environment.custom.governance;
436
+ if (
437
+ params.environment.contracts.multichainGovernor &&
438
+ xcGovernanceSettings &&
439
+ xcGovernanceSettings.chainIds.length > 0
440
+ ) {
441
+ const xcEnvironments = xcGovernanceSettings.chainIds
442
+ .map((chainId) =>
443
+ (Object.values(publicEnvironments) as Environment[]).find(
444
+ (env) => env.chainId === chainId,
445
+ ),
446
+ )
447
+ .filter((xcEnvironment) => !!xcEnvironment)
448
+ .filter(
449
+ (xcEnvironment) =>
450
+ xcEnvironment!.custom?.wormhole?.chainId &&
451
+ xcEnvironment!.contracts.voteCollector,
452
+ );
453
+
454
+ const [xcCount, xcQuorum] = await Promise.all([
455
+ params.environment.contracts.multichainGovernor.read.proposalCount(),
456
+ params.environment.contracts.multichainGovernor.read.quorum(),
457
+ ]);
458
+
459
+ if (params.id) {
460
+ params.id =
461
+ Number(params.id) -
462
+ (params.environment.custom?.governance?.proposalIdOffset || 0);
463
+
464
+ if (params.id < 0) return [];
465
+ if (BigInt(params.id) > xcCount) return [];
466
+ }
467
+
468
+ const ids = params.id
469
+ ? [BigInt(params.id)]
470
+ : Array.from(
471
+ { length: Number(xcCount) },
472
+ (_, i) => xcCount - BigInt(i),
473
+ );
474
+
475
+ const xcProposalsDataCall = Promise.all(
476
+ ids.map((id) =>
477
+ params.environment.contracts.multichainGovernor?.read.proposals([
478
+ id,
479
+ ]),
480
+ ),
481
+ );
482
+
483
+ const xcProposalsStateCall = Promise.all(
484
+ ids.map((id) =>
485
+ params.environment.contracts.multichainGovernor?.read.state([id]),
486
+ ),
487
+ );
488
+
489
+ const xcVotesCall = Promise.all(
490
+ xcEnvironments.map((xcEnvironment) =>
491
+ Promise.all(
492
+ ids.map((id) =>
493
+ params.environment.contracts.multichainGovernor?.read.chainVoteCollectorVotes(
494
+ [(xcEnvironment!.custom as any).wormhole.chainId, id],
495
+ ),
496
+ ),
497
+ ),
498
+ ),
499
+ );
500
+
501
+ const [xcProposalsData, xcProposalsState, xcVotes] = await Promise.all([
502
+ xcProposalsDataCall,
503
+ xcProposalsStateCall,
504
+ xcVotesCall,
505
+ ]);
506
+
507
+ const proposals = ids.map((xcId, proposalIndex: number) => {
508
+ const state = xcProposalsState?.[proposalIndex]!;
509
+ const id =
510
+ Number(xcId) +
511
+ (params.environment.custom?.governance?.proposalIdOffset || 0);
512
+
513
+ const votesCollected = false;
514
+
515
+ const votes = xcVotes.reduce(
516
+ (prevVotes, currVotes) => {
517
+ const voteData = currVotes[proposalIndex];
518
+ if (!voteData) {
519
+ return prevVotes;
520
+ }
521
+
522
+ // chainVoteCollectorVotes returns [forVotes, againstVotes, abstainVotes]
523
+ const forVotes = voteData[0] || 0n;
524
+ const againstVotes = voteData[1] || 0n;
525
+ const abstainVotes = voteData[2] || 0n;
526
+ const totalVotes = forVotes + againstVotes + abstainVotes;
527
+
528
+ return {
529
+ totalVotes: prevVotes.totalVotes + totalVotes,
530
+ forVotes: prevVotes.forVotes + forVotes,
531
+ againstVotes: prevVotes.againstVotes + againstVotes,
532
+ abstainVotes: prevVotes.abstainVotes + abstainVotes,
533
+ };
534
+ },
535
+ {
536
+ totalVotes: 0n,
537
+ forVotes: 0n,
538
+ againstVotes: 0n,
539
+ abstainVotes: 0n,
540
+ },
541
+ );
542
+
543
+ const proposalData = xcProposalsData?.[proposalIndex];
544
+ if (!proposalData) {
545
+ throw new Error(
546
+ `Proposal data not found for index ${proposalIndex}`,
547
+ );
548
+ }
549
+
550
+ const [
551
+ proposer,
552
+ _voteSnapshotTimestamp,
553
+ votingStartTime,
554
+ votingEndTime,
555
+ crossChainVoteCollectionEndTimestamp,
556
+ voteSnapshotBlock,
557
+ proposalForVotes,
558
+ proposalAgainstVotes,
559
+ proposalAbstainVotes,
560
+ proposalTotalVotes,
561
+ canceled,
562
+ executed,
563
+ ] = proposalData;
564
+
565
+ const multichainState = (
566
+ MultichainProposalStateMapping as { [key: number]: ProposalState }
567
+ )[state]!;
568
+
569
+ const proposal: Proposal = {
570
+ chainId: params.environment.chainId,
571
+ id,
572
+ proposalId: Number(xcId),
573
+ proposer,
574
+ eta: Number(crossChainVoteCollectionEndTimestamp),
575
+ startTimestamp: Number(votingStartTime),
576
+ endTimestamp: Number(votingEndTime),
577
+ startBlock: Number(voteSnapshotBlock),
578
+ forVotes: new Amount(proposalForVotes + votes.forVotes, 18),
579
+ againstVotes: new Amount(
580
+ proposalAgainstVotes + votes.againstVotes,
581
+ 18,
582
+ ),
583
+ abstainVotes: new Amount(
584
+ proposalAbstainVotes + votes.abstainVotes,
585
+ 18,
586
+ ),
587
+ totalVotes: new Amount(proposalTotalVotes + votes.totalVotes, 18),
588
+ canceled,
589
+ executed,
590
+ quorum: new Amount(xcQuorum, 18),
591
+ state: multichainState,
592
+ multichain: {
593
+ id: Number(xcId),
594
+ votesCollected,
595
+ },
596
+ };
597
+
598
+ return proposal;
599
+ });
600
+
601
+ return proposals;
602
+ } else {
603
+ return [];
604
+ }
605
+ } else {
606
+ return [];
607
+ }
608
+ } catch (error) {
609
+ console.warn(
610
+ `[getCrossChainProposalData] RPC failed for chain ${params.environment.chainId}:`,
611
+ error,
612
+ );
613
+ params.environment.onError?.(error, {
614
+ source: "governance-proposals",
615
+ chainId: params.environment.chainId,
616
+ });
617
+ return [];
618
+ }
619
+ };
620
+
621
+ export const appendProposalExtendedData = (
622
+ proposals: Proposal[],
623
+ extendedDatas: PonderExtendedProposalData[],
624
+ ) => {
625
+ proposals.forEach((proposal) => {
626
+ const extendedData = extendedDatas.find(
627
+ (item) => item.id === proposal.proposalId,
628
+ );
629
+
630
+ if (extendedData) {
631
+ proposal.title = extendedData.title;
632
+ proposal.calldatas = extendedData.calldatas;
633
+ proposal.description = extendedData.description;
634
+ proposal.signatures = extendedData.signatures;
635
+ proposal.stateChanges = extendedData.stateChanges.map((change) => ({
636
+ blockNumber: change.blockNumber,
637
+ transactionHash: change.transactionHash,
638
+ state: change.state,
639
+ chainId: proposal.chainId,
640
+ }));
641
+ proposal.subtitle = extendedData.subtitle;
642
+ proposal.targets = extendedData.targets;
643
+ }
644
+ });
645
+ };
646
+
622
647
  export const getExtendedProposalData = async (params: {
623
648
  environment: Environment;
624
649
  id?: number;
625
650
  }): Promise<PonderExtendedProposalData[]> => {
626
- let result: PonderExtendedProposalData[] = [];
651
+ const result: PonderExtendedProposalData[] = [];
627
652
  let lastId = -1;
628
653
  let shouldContinue = true;
629
-
630
- while (shouldContinue) {
631
- const response = await axios.post<{
632
- data: {
633
- proposals: {
634
- items: {
635
- proposalId: number;
636
- description: string;
637
- targets: string[];
638
- calldatas: string[];
639
- signatures: string[];
640
- stateChanges: {
641
- items: {
642
- txnHash: string;
643
- blockNumber: number;
644
- newState: string;
645
- }[];
646
- };
647
- }[];
654
+ const MAX_PAGES = 100;
655
+ let page = 0;
656
+
657
+ try {
658
+ while (shouldContinue && page < MAX_PAGES) {
659
+ page++;
660
+ const response = await postWithRetry<{
661
+ data: {
662
+ proposals: {
663
+ items: {
664
+ proposalId: number;
665
+ description: string;
666
+ targets: string[];
667
+ calldatas: string[];
668
+ signatures: string[];
669
+ stateChanges: {
670
+ items: {
671
+ txnHash: string;
672
+ blockNumber: number;
673
+ newState: string;
674
+ }[];
675
+ };
676
+ }[];
677
+ };
648
678
  };
649
- };
650
- }>("https://ponder-eu2.moonwell.fi", {
651
- query: `
652
- query {
653
- proposals(
654
- limit: 1000,
655
- orderDirection: "desc",
656
- orderBy: "proposalId",
657
- where: {
658
- chainId: ${params.environment.chainId}
659
- ${params.id ? `, proposalId: ${params.id}` : lastId >= 0 ? `, proposalId_lt: ${lastId}` : ""}
660
- }
661
- ) {
662
- items {
663
- id
664
- proposalId
665
- description
666
- targets
667
- calldatas
668
- signatures
669
- stateChanges(orderBy: "blockNumber") {
670
- items {
671
- txnHash
672
- blockNumber
673
- newState
679
+ }>("https://ponder-eu2.moonwell.fi", {
680
+ query: `
681
+ query {
682
+ proposals(
683
+ limit: 1000,
684
+ orderDirection: "desc",
685
+ orderBy: "proposalId",
686
+ where: {
687
+ chainId: ${params.environment.chainId}
688
+ ${params.id ? `, proposalId: ${params.id}` : lastId >= 0 ? `, proposalId_lt: ${lastId}` : ""}
689
+ }
690
+ ) {
691
+ items {
692
+ id
693
+ proposalId
694
+ description
695
+ targets
696
+ calldatas
697
+ signatures
698
+ stateChanges(orderBy: "blockNumber") {
699
+ items {
700
+ txnHash
701
+ blockNumber
702
+ newState
703
+ }
674
704
  }
675
705
  }
676
706
  }
677
707
  }
678
- }
679
- `,
680
- });
681
-
682
- if (response.status === 200 && response.data?.data?.proposals) {
683
- const proposals = response.data.data.proposals.items.map((item) => {
684
- const extendedProposalData: PonderExtendedProposalData = {
685
- id: item.proposalId,
686
- title: `Proposal #${item.proposalId}`,
687
- subtitle: extractProposalSubtitle(item.description),
688
- description: item.description,
689
- calldatas: item.calldatas,
690
- signatures: item.signatures,
691
- stateChanges: item.stateChanges.items.map((change) => {
692
- return {
693
- blockNumber: change.blockNumber,
694
- state: change.newState,
695
- transactionHash: change.txnHash,
696
- };
697
- }),
698
- targets: item.targets,
699
- };
700
-
701
- return extendedProposalData;
708
+ `,
702
709
  });
703
710
 
704
- if (proposals.length < 1000 || proposals.length === 0) {
705
- shouldContinue = false;
711
+ if (response.status === 200 && response.data?.data?.proposals) {
712
+ const proposals = response.data.data.proposals.items.map((item) => {
713
+ const extendedProposalData: PonderExtendedProposalData = {
714
+ id: item.proposalId,
715
+ title: `Proposal #${item.proposalId}`,
716
+ subtitle: extractProposalSubtitle(item.description),
717
+ description: item.description,
718
+ calldatas: item.calldatas,
719
+ signatures: item.signatures,
720
+ stateChanges: item.stateChanges.items.map((change) => {
721
+ return {
722
+ blockNumber: change.blockNumber,
723
+ state: change.newState,
724
+ transactionHash: change.txnHash,
725
+ };
726
+ }),
727
+ targets: item.targets,
728
+ };
729
+
730
+ return extendedProposalData;
731
+ });
732
+
733
+ if (proposals.length < 1000 || proposals.length === 0) {
734
+ shouldContinue = false;
735
+ } else {
736
+ lastId = last(proposals)!.id;
737
+ }
738
+
739
+ result.push(...proposals);
706
740
  } else {
707
- lastId = last(proposals)!.id;
741
+ shouldContinue = false;
708
742
  }
709
-
710
- result = result.concat(proposals);
711
- } else {
712
- shouldContinue = false;
713
743
  }
744
+ } catch (error) {
745
+ console.warn(
746
+ `[getExtendedProposalData] Ponder failed for chain ${params.environment.chainId}:`,
747
+ error,
748
+ );
749
+ params.environment.onError?.(error, {
750
+ source: "governance-proposals",
751
+ chainId: params.environment.chainId,
752
+ });
753
+ return result;
714
754
  }
715
755
 
716
756
  return result;