@moonwell-fi/moonwell-sdk 0.12.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 (137) hide show
  1. package/CHANGELOG.md +8 -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/getMarketSnapshots.js +2 -5
  9. package/_cjs/actions/core/markets/getMarketSnapshots.js.map +1 -1
  10. package/_cjs/actions/core/user-positions/getUserPositionSnapshots.js +2 -5
  11. package/_cjs/actions/core/user-positions/getUserPositionSnapshots.js.map +1 -1
  12. package/_cjs/actions/governance/getCirculatingSupplySnapshots.js +3 -6
  13. package/_cjs/actions/governance/getCirculatingSupplySnapshots.js.map +1 -1
  14. package/_cjs/actions/governance/getDelegates.js +2 -5
  15. package/_cjs/actions/governance/getDelegates.js.map +1 -1
  16. package/_cjs/actions/governance/getDiscussions.js +3 -3
  17. package/_cjs/actions/governance/getDiscussions.js.map +1 -1
  18. package/_cjs/actions/governance/getStakingSnapshots.js +2 -5
  19. package/_cjs/actions/governance/getStakingSnapshots.js.map +1 -1
  20. package/_cjs/actions/governance/getUserVotingPowers.js +12 -4
  21. package/_cjs/actions/governance/getUserVotingPowers.js.map +1 -1
  22. package/_cjs/actions/governance/governor-api-client.js +10 -13
  23. package/_cjs/actions/governance/governor-api-client.js.map +1 -1
  24. package/_cjs/actions/governance/proposals/common.js +2 -1
  25. package/_cjs/actions/governance/proposals/common.js.map +1 -1
  26. package/_cjs/actions/governance/snapshot/common.js +2 -5
  27. package/_cjs/actions/governance/snapshot/common.js.map +1 -1
  28. package/_cjs/actions/lunar-indexer-client.js +4 -0
  29. package/_cjs/actions/lunar-indexer-client.js.map +1 -1
  30. package/_cjs/actions/morpho/markets/common.js +2 -5
  31. package/_cjs/actions/morpho/markets/common.js.map +1 -1
  32. package/_cjs/actions/morpho/markets/lunarIndexerTransform.js +5 -8
  33. package/_cjs/actions/morpho/markets/lunarIndexerTransform.js.map +1 -1
  34. package/_cjs/actions/retry.js +63 -0
  35. package/_cjs/actions/retry.js.map +1 -0
  36. package/_cjs/common/getBlockNumberAtTimestamp.js +42 -0
  37. package/_cjs/common/getBlockNumberAtTimestamp.js.map +1 -0
  38. package/_cjs/common/index.js +3 -1
  39. package/_cjs/common/index.js.map +1 -1
  40. package/_cjs/environments/types/config.js.map +1 -1
  41. package/_cjs/errors/version.js +1 -1
  42. package/_esm/actions/axiosWithRetry.js +32 -0
  43. package/_esm/actions/axiosWithRetry.js.map +1 -0
  44. package/_esm/actions/beam/getBeamTokenLimits.js +2 -2
  45. package/_esm/actions/beam/getBeamTokenLimits.js.map +1 -1
  46. package/_esm/actions/beam/getBeamTokenRoutes.js +3 -3
  47. package/_esm/actions/beam/getBeamTokenRoutes.js.map +1 -1
  48. package/_esm/actions/core/markets/getMarketSnapshots.js +2 -2
  49. package/_esm/actions/core/markets/getMarketSnapshots.js.map +1 -1
  50. package/_esm/actions/core/user-positions/getUserPositionSnapshots.js +2 -2
  51. package/_esm/actions/core/user-positions/getUserPositionSnapshots.js.map +1 -1
  52. package/_esm/actions/governance/getCirculatingSupplySnapshots.js +3 -3
  53. package/_esm/actions/governance/getCirculatingSupplySnapshots.js.map +1 -1
  54. package/_esm/actions/governance/getDelegates.js +2 -2
  55. package/_esm/actions/governance/getDelegates.js.map +1 -1
  56. package/_esm/actions/governance/getDiscussions.js +3 -3
  57. package/_esm/actions/governance/getDiscussions.js.map +1 -1
  58. package/_esm/actions/governance/getStakingSnapshots.js +2 -2
  59. package/_esm/actions/governance/getStakingSnapshots.js.map +1 -1
  60. package/_esm/actions/governance/getUserVotingPowers.js +13 -5
  61. package/_esm/actions/governance/getUserVotingPowers.js.map +1 -1
  62. package/_esm/actions/governance/governor-api-client.js +10 -10
  63. package/_esm/actions/governance/governor-api-client.js.map +1 -1
  64. package/_esm/actions/governance/proposals/common.js +2 -1
  65. package/_esm/actions/governance/proposals/common.js.map +1 -1
  66. package/_esm/actions/governance/snapshot/common.js +2 -2
  67. package/_esm/actions/governance/snapshot/common.js.map +1 -1
  68. package/_esm/actions/lunar-indexer-client.js +6 -0
  69. package/_esm/actions/lunar-indexer-client.js.map +1 -1
  70. package/_esm/actions/morpho/markets/common.js +2 -2
  71. package/_esm/actions/morpho/markets/common.js.map +1 -1
  72. package/_esm/actions/morpho/markets/lunarIndexerTransform.js +5 -5
  73. package/_esm/actions/morpho/markets/lunarIndexerTransform.js.map +1 -1
  74. package/_esm/actions/retry.js +90 -0
  75. package/_esm/actions/retry.js.map +1 -0
  76. package/_esm/common/getBlockNumberAtTimestamp.js +56 -0
  77. package/_esm/common/getBlockNumberAtTimestamp.js.map +1 -0
  78. package/_esm/common/index.js +1 -0
  79. package/_esm/common/index.js.map +1 -1
  80. package/_esm/environments/types/config.js.map +1 -1
  81. package/_esm/errors/version.js +1 -1
  82. package/_types/actions/axiosWithRetry.d.ts +16 -0
  83. package/_types/actions/axiosWithRetry.d.ts.map +1 -0
  84. package/_types/actions/beam/getBeamTokenLimits.d.ts.map +1 -1
  85. package/_types/actions/beam/getBeamTokenRoutes.d.ts.map +1 -1
  86. package/_types/actions/core/markets/getMarketSnapshots.d.ts.map +1 -1
  87. package/_types/actions/core/user-positions/getUserPositionSnapshots.d.ts.map +1 -1
  88. package/_types/actions/governance/getCirculatingSupplySnapshots.d.ts.map +1 -1
  89. package/_types/actions/governance/getDelegates.d.ts.map +1 -1
  90. package/_types/actions/governance/getDiscussions.d.ts.map +1 -1
  91. package/_types/actions/governance/getStakingSnapshots.d.ts.map +1 -1
  92. package/_types/actions/governance/getUserVotingPowers.d.ts +13 -1
  93. package/_types/actions/governance/getUserVotingPowers.d.ts.map +1 -1
  94. package/_types/actions/governance/governor-api-client.d.ts.map +1 -1
  95. package/_types/actions/governance/proposals/common.d.ts.map +1 -1
  96. package/_types/actions/governance/snapshot/common.d.ts.map +1 -1
  97. package/_types/actions/lunar-indexer-client.d.ts.map +1 -1
  98. package/_types/actions/morpho/markets/common.d.ts.map +1 -1
  99. package/_types/actions/morpho/markets/lunarIndexerTransform.d.ts.map +1 -1
  100. package/_types/actions/retry.d.ts +45 -0
  101. package/_types/actions/retry.d.ts.map +1 -0
  102. package/_types/client/createMoonwellClient.d.ts +2 -2
  103. package/_types/common/getBlockNumberAtTimestamp.d.ts +15 -0
  104. package/_types/common/getBlockNumberAtTimestamp.d.ts.map +1 -0
  105. package/_types/common/index.d.ts +1 -0
  106. package/_types/common/index.d.ts.map +1 -1
  107. package/_types/environments/definitions/base/environment.d.ts +21 -3
  108. package/_types/environments/definitions/base/environment.d.ts.map +1 -1
  109. package/_types/environments/definitions/moonbeam/custom.d.ts +1 -1
  110. package/_types/environments/definitions/moonbeam/environment.d.ts +1 -1
  111. package/_types/environments/index.d.ts +119 -20
  112. package/_types/environments/index.d.ts.map +1 -1
  113. package/_types/environments/types/config.d.ts +27 -41
  114. package/_types/environments/types/config.d.ts.map +1 -1
  115. package/_types/errors/version.d.ts +1 -1
  116. package/actions/axiosWithRetry.ts +42 -0
  117. package/actions/beam/getBeamTokenLimits.ts +2 -2
  118. package/actions/beam/getBeamTokenRoutes.ts +3 -3
  119. package/actions/core/markets/getMarketSnapshots.ts +2 -2
  120. package/actions/core/user-positions/getUserPositionSnapshots.ts +2 -2
  121. package/actions/governance/getCirculatingSupplySnapshots.ts +3 -3
  122. package/actions/governance/getDelegates.ts +2 -2
  123. package/actions/governance/getDiscussions.ts +6 -5
  124. package/actions/governance/getStakingSnapshots.ts +2 -2
  125. package/actions/governance/getUserVotingPowers.ts +43 -8
  126. package/actions/governance/governor-api-client.ts +12 -10
  127. package/actions/governance/proposals/common.ts +2 -1
  128. package/actions/governance/snapshot/common.ts +2 -2
  129. package/actions/lunar-indexer-client.ts +8 -0
  130. package/actions/morpho/markets/common.ts +2 -2
  131. package/actions/morpho/markets/lunarIndexerTransform.ts +6 -5
  132. package/actions/retry.ts +121 -0
  133. package/common/getBlockNumberAtTimestamp.ts +59 -0
  134. package/common/index.ts +1 -0
  135. package/environments/types/config.ts +34 -207
  136. package/errors/version.ts +1 -1
  137. package/package.json +2 -2
@@ -0,0 +1,59 @@
1
+ import type { PublicClient } from "viem";
2
+
3
+ /**
4
+ * Safety cap on interpolation iterations. With near-linear `ts(block)` the search
5
+ * converges in ~3–5 reads; 8 leaves headroom for chains with variable block times
6
+ * (e.g. Moonbeam) without unbounded RPC fan-out on pathological inputs.
7
+ */
8
+ const MAX_ITERATIONS = 8;
9
+
10
+ /**
11
+ * Find the block number on a chain whose timestamp is the latest one ≤ the target unix timestamp.
12
+ *
13
+ * Uses interpolation search anchored on the latest block and block 1: each iteration
14
+ * narrows the range by reading one block and projecting the target via the slope of the
15
+ * remaining range. Converges in ~3–5 RPC calls even on chains with variable block times.
16
+ *
17
+ * Assumes block 1 exists on the chain — true for every EVM chain Moonwell supports.
18
+ *
19
+ * Returns the latest block if `targetTimestamp` is at or after the head, and block 1
20
+ * if it is before block 1's timestamp. On a chain with only block 0, returns block 0.
21
+ */
22
+ export async function getBlockNumberAtTimestamp(
23
+ publicClient: PublicClient,
24
+ targetTimestamp: bigint,
25
+ ): Promise<bigint> {
26
+ const latest = await publicClient.getBlock({ blockTag: "latest" });
27
+ if (targetTimestamp >= latest.timestamp) return latest.number;
28
+ if (latest.number === 0n) return latest.number;
29
+
30
+ const first = await publicClient.getBlock({ blockNumber: 1n });
31
+ if (targetTimestamp <= first.timestamp) return first.number;
32
+
33
+ let lo = first.number;
34
+ let loTs = first.timestamp;
35
+ let hi = latest.number;
36
+ let hiTs = latest.timestamp;
37
+
38
+ for (let i = 0; i < MAX_ITERATIONS; i += 1) {
39
+ if (hi - lo <= 1n) break;
40
+ const tsRange = hiTs - loTs;
41
+ if (tsRange <= 0n) break;
42
+
43
+ const offset = ((targetTimestamp - loTs) * (hi - lo)) / tsRange;
44
+ let mid = lo + offset;
45
+ if (mid <= lo) mid = lo + 1n;
46
+ if (mid >= hi) mid = hi - 1n;
47
+
48
+ const block = await publicClient.getBlock({ blockNumber: mid });
49
+ if (block.timestamp <= targetTimestamp) {
50
+ lo = mid;
51
+ loTs = block.timestamp;
52
+ } else {
53
+ hi = mid;
54
+ hiTs = block.timestamp;
55
+ }
56
+ }
57
+
58
+ return lo;
59
+ }
package/common/index.ts CHANGED
@@ -7,6 +7,7 @@ dayjs.extend(utc);
7
7
  export { Amount } from "./amount.js";
8
8
  export { BaseError, HttpRequestError } from "./error.js";
9
9
  export type { HttpRequestErrorType } from "./error.js";
10
+ export { getBlockNumberAtTimestamp } from "./getBlockNumberAtTimestamp.js";
10
11
  export type { MultichainReturnType } from "./types.js";
11
12
 
12
13
  export const SECONDS_PER_DAY = 86400;
@@ -136,6 +136,37 @@ export type ContractsConfigReturnType = {
136
136
  morphoPublicAllocator: MorphoPublicAllocatorContractReturnType;
137
137
  };
138
138
 
139
+ type EnvironmentContractsReturnType = {
140
+ stakingToken: StakingTokenContractReturnType;
141
+ wrappedNativeToken: WrappedNativeTokenContractReturnType;
142
+ governanceToken: GovernanceTokenContractReturnType;
143
+ comptroller: ComptrollerContractReturnType;
144
+ maximillion: MaximillionContractReturnType;
145
+ views: CoreViewsContractReturnType;
146
+ tokenSale: TokenSaleContractReturnType;
147
+ morphoViews: MorphoViewsContractReturnType;
148
+ morphoViewsV2: MorphoViewsContractReturnType;
149
+ multiRewardDistributor: MultiRewardDistributorContractReturnType;
150
+ temporalGovernor: TemporalGovernorContractReturnType;
151
+ voteCollector: VoteCollectorContractReturnType;
152
+ governor: GovernorContractReturnType;
153
+ multichainGovernor: MultichainGovernorContractReturnType;
154
+ oracle: ChainLinkOracleContractReturnType;
155
+ router: CoreRouterContractReturnType;
156
+ morphoBlue: MorphoBlueContractReturnType;
157
+ morphoBundler: MorphoBundlerContractReturnType;
158
+ morphoBaseBundler: MorphoBundlerContractReturnType;
159
+ morphoPublicAllocator: MorphoPublicAllocatorContractReturnType;
160
+ };
161
+
162
+ type EnvironmentContracts<contracts> = {
163
+ [K in keyof contracts as K extends keyof EnvironmentContractsReturnType
164
+ ? K
165
+ : never]: K extends keyof EnvironmentContractsReturnType
166
+ ? EnvironmentContractsReturnType[K]
167
+ : never;
168
+ };
169
+
139
170
  export type CustomConfigType = {
140
171
  morpho?: {
141
172
  minimalDeployment?: boolean;
@@ -242,7 +273,7 @@ export const createEnvironmentConfig = <
242
273
  contracts: ContractsConfig<contracts, tokens>;
243
274
  custom: CustomConfig<custom>;
244
275
  }) => {
245
- const publicClient = createPublicClient({
276
+ const publicClient: PublicClient = createPublicClient({
246
277
  chain: config.chain,
247
278
  batch: {
248
279
  multicall: {
@@ -387,109 +418,7 @@ export const createEnvironmentConfig = <
387
418
  ...prev,
388
419
  [curr]: createContract(contractAddress, abi),
389
420
  };
390
- }, {}) as Prettify<
391
- {
392
- [name in keyof contracts as Extract<
393
- name,
394
- "stakingToken"
395
- >]: StakingTokenContractReturnType;
396
- } & {
397
- [name in keyof contracts as Extract<
398
- name,
399
- "wrappedNativeToken"
400
- >]: WrappedNativeTokenContractReturnType;
401
- } & {
402
- [name in keyof contracts as Extract<
403
- name,
404
- "governanceToken"
405
- >]: GovernanceTokenContractReturnType;
406
- } & {
407
- [name in keyof contracts as Extract<
408
- name,
409
- "comptroller"
410
- >]: ComptrollerContractReturnType;
411
- } & {
412
- [name in keyof contracts as Extract<
413
- name,
414
- "maximillion"
415
- >]: MaximillionContractReturnType;
416
- } & {
417
- [name in keyof contracts as Extract<
418
- name,
419
- "views"
420
- >]: CoreViewsContractReturnType;
421
- } & {
422
- [name in keyof contracts as Extract<
423
- name,
424
- "tokenSale"
425
- >]: TokenSaleContractReturnType;
426
- } & {
427
- [name in keyof contracts as Extract<
428
- name,
429
- "morphoViews"
430
- >]: MorphoViewsContractReturnType;
431
- } & {
432
- [name in keyof contracts as Extract<
433
- name,
434
- "morphoViewsV2"
435
- >]: MorphoViewsContractReturnType;
436
- } & {
437
- [name in keyof contracts as Extract<
438
- name,
439
- "multiRewardDistributor"
440
- >]: MultiRewardDistributorContractReturnType;
441
- } & {
442
- [name in keyof contracts as Extract<
443
- name,
444
- "temporalGovernor"
445
- >]: TemporalGovernorContractReturnType;
446
- } & {
447
- [name in keyof contracts as Extract<
448
- name,
449
- "voteCollector"
450
- >]: VoteCollectorContractReturnType;
451
- } & {
452
- [name in keyof contracts as Extract<
453
- name,
454
- "governor"
455
- >]: GovernorContractReturnType;
456
- } & {
457
- [name in keyof contracts as Extract<
458
- name,
459
- "multichainGovernor"
460
- >]: MultichainGovernorContractReturnType;
461
- } & {
462
- [name in keyof contracts as Extract<
463
- name,
464
- "oracle"
465
- >]: ChainLinkOracleContractReturnType;
466
- } & {
467
- [name in keyof contracts as Extract<
468
- name,
469
- "router"
470
- >]: CoreRouterContractReturnType;
471
- } & {
472
- [name in keyof contracts as Extract<
473
- name,
474
- "morphoBlue"
475
- >]: MorphoBlueContractReturnType;
476
- } & {
477
- [name in keyof contracts as Extract<
478
- name,
479
- "morphoBundler"
480
- >]: MorphoBundlerContractReturnType;
481
- } & {
482
- [name in keyof contracts as Extract<
483
- name,
484
- "morphoBaseBundler"
485
- >]: MorphoBundlerContractReturnType;
486
- } & {
487
- [name in keyof contracts as Extract<
488
- name,
489
- "morphoPublicAllocator"
490
- >]: MorphoPublicAllocatorContractReturnType;
491
- }
492
- >;
421
+ }, {}) as EnvironmentContracts<contracts>;
493
422
 
494
423
  return {
495
424
  key: config.key,
@@ -551,109 +480,7 @@ export type Environment<
551
480
  vaults: {
552
481
  [name in keyof vaults]: MorphoVaultContractReturnType;
553
482
  };
554
- contracts: Prettify<
555
- {
556
- [name in keyof contracts as Extract<
557
- name,
558
- "stakingToken"
559
- >]: StakingTokenContractReturnType;
560
- } & {
561
- [name in keyof contracts as Extract<
562
- name,
563
- "wrappedNativeToken"
564
- >]: WrappedNativeTokenContractReturnType;
565
- } & {
566
- [name in keyof contracts as Extract<
567
- name,
568
- "governanceToken"
569
- >]: GovernanceTokenContractReturnType;
570
- } & {
571
- [name in keyof contracts as Extract<
572
- name,
573
- "comptroller"
574
- >]: ComptrollerContractReturnType;
575
- } & {
576
- [name in keyof contracts as Extract<
577
- name,
578
- "maximillion"
579
- >]: MaximillionContractReturnType;
580
- } & {
581
- [name in keyof contracts as Extract<
582
- name,
583
- "views"
584
- >]: CoreViewsContractReturnType;
585
- } & {
586
- [name in keyof contracts as Extract<
587
- name,
588
- "tokenSale"
589
- >]: TokenSaleContractReturnType;
590
- } & {
591
- [name in keyof contracts as Extract<
592
- name,
593
- "morphoViews"
594
- >]: MorphoViewsContractReturnType;
595
- } & {
596
- [name in keyof contracts as Extract<
597
- name,
598
- "morphoViewsV2"
599
- >]: MorphoViewsContractReturnType;
600
- } & {
601
- [name in keyof contracts as Extract<
602
- name,
603
- "multiRewardDistributor"
604
- >]: MultiRewardDistributorContractReturnType;
605
- } & {
606
- [name in keyof contracts as Extract<
607
- name,
608
- "temporalGovernor"
609
- >]: TemporalGovernorContractReturnType;
610
- } & {
611
- [name in keyof contracts as Extract<
612
- name,
613
- "voteCollector"
614
- >]: VoteCollectorContractReturnType;
615
- } & {
616
- [name in keyof contracts as Extract<
617
- name,
618
- "governor"
619
- >]: GovernorContractReturnType;
620
- } & {
621
- [name in keyof contracts as Extract<
622
- name,
623
- "multichainGovernor"
624
- >]: MultichainGovernorContractReturnType;
625
- } & {
626
- [name in keyof contracts as Extract<
627
- name,
628
- "oracle"
629
- >]: ChainLinkOracleContractReturnType;
630
- } & {
631
- [name in keyof contracts as Extract<
632
- name,
633
- "router"
634
- >]: CoreRouterContractReturnType;
635
- } & {
636
- [name in keyof contracts as Extract<
637
- name,
638
- "morphoBlue"
639
- >]: MorphoBlueContractReturnType;
640
- } & {
641
- [name in keyof contracts as Extract<
642
- name,
643
- "morphoBundler"
644
- >]: MorphoBundlerContractReturnType;
645
- } & {
646
- [name in keyof contracts as Extract<
647
- name,
648
- "morphoBaseBundler"
649
- >]: MorphoBundlerContractReturnType;
650
- } & {
651
- [name in keyof contracts as Extract<
652
- name,
653
- "morphoPublicAllocator"
654
- >]: MorphoPublicAllocatorContractReturnType;
655
- }
656
- >;
483
+ contracts: EnvironmentContracts<contracts>;
657
484
  custom: custom;
658
485
  config: {
659
486
  tokens: {
package/errors/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = '0.12.0'
1
+ export const version = '0.12.1'
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.12.0",
4
+ "version": "0.12.1",
5
5
  "main": "./_cjs/index.js",
6
6
  "module": "./_esm/index.js",
7
7
  "types": "./_types/index.d.ts",
@@ -77,7 +77,7 @@
77
77
  "@types/lodash": "^4.17.9",
78
78
  "@types/node": "^22.13.10",
79
79
  "axios": "^1.7.7",
80
- "dayjs": "^1.11.13",
80
+ "dayjs": "^1.11.20",
81
81
  "lodash": "^4.17.21",
82
82
  "viem": "^2.26.2"
83
83
  },