@moonwell-fi/moonwell-sdk 0.12.1 → 0.13.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 (83) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/_cjs/actions/governance/getDelegates.js.map +1 -1
  3. package/_cjs/actions/governance/getUserVotingPowers.js +21 -6
  4. package/_cjs/actions/governance/getUserVotingPowers.js.map +1 -1
  5. package/_cjs/actions/governance/proposals/common.js +30 -3
  6. package/_cjs/actions/governance/proposals/common.js.map +1 -1
  7. package/_cjs/actions/morpho/user-rewards/common.js +95 -199
  8. package/_cjs/actions/morpho/user-rewards/common.js.map +1 -1
  9. package/_cjs/actions/morpho/user-rewards/getMorphoUserRewards.js +46 -10
  10. package/_cjs/actions/morpho/user-rewards/getMorphoUserRewards.js.map +1 -1
  11. package/_cjs/environments/definitions/ethereum/contracts.js +12 -0
  12. package/_cjs/environments/definitions/ethereum/contracts.js.map +1 -0
  13. package/_cjs/environments/definitions/ethereum/custom.js +18 -0
  14. package/_cjs/environments/definitions/ethereum/custom.js.map +1 -0
  15. package/_cjs/environments/definitions/ethereum/environment.js +9 -5
  16. package/_cjs/environments/definitions/ethereum/environment.js.map +1 -1
  17. package/_cjs/environments/definitions/ethereum/tokens.js +12 -0
  18. package/_cjs/environments/definitions/ethereum/tokens.js.map +1 -1
  19. package/_cjs/environments/definitions/governance.js +1 -1
  20. package/_cjs/environments/definitions/governance.js.map +1 -1
  21. package/_cjs/errors/version.js +1 -1
  22. package/_cjs/index.js +5 -1
  23. package/_cjs/index.js.map +1 -1
  24. package/_esm/actions/governance/getDelegates.js +2 -0
  25. package/_esm/actions/governance/getDelegates.js.map +1 -1
  26. package/_esm/actions/governance/getUserVotingPowers.js +24 -6
  27. package/_esm/actions/governance/getUserVotingPowers.js.map +1 -1
  28. package/_esm/actions/governance/proposals/common.js +43 -2
  29. package/_esm/actions/governance/proposals/common.js.map +1 -1
  30. package/_esm/actions/morpho/user-rewards/common.js +110 -203
  31. package/_esm/actions/morpho/user-rewards/common.js.map +1 -1
  32. package/_esm/actions/morpho/user-rewards/getMorphoUserRewards.js +51 -11
  33. package/_esm/actions/morpho/user-rewards/getMorphoUserRewards.js.map +1 -1
  34. package/_esm/environments/definitions/ethereum/contracts.js +10 -0
  35. package/_esm/environments/definitions/ethereum/contracts.js.map +1 -0
  36. package/_esm/environments/definitions/ethereum/custom.js +15 -0
  37. package/_esm/environments/definitions/ethereum/custom.js.map +1 -0
  38. package/_esm/environments/definitions/ethereum/environment.js +11 -5
  39. package/_esm/environments/definitions/ethereum/environment.js.map +1 -1
  40. package/_esm/environments/definitions/ethereum/tokens.js +12 -0
  41. package/_esm/environments/definitions/ethereum/tokens.js.map +1 -1
  42. package/_esm/environments/definitions/governance.js +2 -2
  43. package/_esm/environments/definitions/governance.js.map +1 -1
  44. package/_esm/errors/version.js +1 -1
  45. package/_esm/index.js +2 -0
  46. package/_esm/index.js.map +1 -1
  47. package/_types/actions/governance/getDelegates.d.ts.map +1 -1
  48. package/_types/actions/governance/getUserVotingPowers.d.ts.map +1 -1
  49. package/_types/actions/governance/proposals/common.d.ts +15 -0
  50. package/_types/actions/governance/proposals/common.d.ts.map +1 -1
  51. package/_types/actions/morpho/user-rewards/common.d.ts +23 -0
  52. package/_types/actions/morpho/user-rewards/common.d.ts.map +1 -1
  53. package/_types/actions/morpho/user-rewards/getMorphoUserRewards.d.ts +22 -0
  54. package/_types/actions/morpho/user-rewards/getMorphoUserRewards.d.ts.map +1 -1
  55. package/_types/client/createMoonwellClient.d.ts +62 -2
  56. package/_types/client/createMoonwellClient.d.ts.map +1 -1
  57. package/_types/environments/definitions/ethereum/contracts.d.ts +4 -0
  58. package/_types/environments/definitions/ethereum/contracts.d.ts.map +1 -0
  59. package/_types/environments/definitions/ethereum/custom.d.ts +18 -0
  60. package/_types/environments/definitions/ethereum/custom.d.ts.map +1 -0
  61. package/_types/environments/definitions/ethereum/environment.d.ts +52 -2
  62. package/_types/environments/definitions/ethereum/environment.d.ts.map +1 -1
  63. package/_types/environments/definitions/ethereum/tokens.d.ts +12 -0
  64. package/_types/environments/definitions/ethereum/tokens.d.ts.map +1 -1
  65. package/_types/environments/definitions/governance.d.ts.map +1 -1
  66. package/_types/environments/index.d.ts +34 -4
  67. package/_types/environments/index.d.ts.map +1 -1
  68. package/_types/errors/version.d.ts +1 -1
  69. package/_types/index.d.ts +2 -0
  70. package/_types/index.d.ts.map +1 -1
  71. package/actions/governance/getDelegates.ts +2 -0
  72. package/actions/governance/getUserVotingPowers.ts +30 -15
  73. package/actions/governance/proposals/common.ts +56 -2
  74. package/actions/morpho/user-rewards/common.ts +133 -355
  75. package/actions/morpho/user-rewards/getMorphoUserRewards.ts +77 -12
  76. package/environments/definitions/ethereum/contracts.ts +10 -0
  77. package/environments/definitions/ethereum/custom.ts +15 -0
  78. package/environments/definitions/ethereum/environment.ts +15 -6
  79. package/environments/definitions/ethereum/tokens.ts +12 -0
  80. package/environments/definitions/governance.ts +2 -2
  81. package/errors/version.ts +1 -1
  82. package/index.ts +3 -0
  83. package/package.json +1 -1
@@ -4,13 +4,41 @@ import { getEnvironmentsFromArgs } from "../../../common/index.js";
4
4
  import type { OptionalNetworkParameterType } from "../../../common/types.js";
5
5
  import type { Chain } from "../../../environments/index.js";
6
6
  import type { MorphoUserReward } from "../../../types/morphoUserReward.js";
7
- import { getUserMorphoRewardsData } from "./common.js";
7
+ import { MerklApiError, getUserMorphoRewardsData } from "./common.js";
8
+
9
+ /**
10
+ * AggregateError thrown by `getMorphoUserRewards` when one or more chains
11
+ * fail and `throwOnExternalApiError` is `true`. The `rewards` property
12
+ * carries the rewards from any chains that succeeded so callers can still
13
+ * surface partial results alongside the per-chain failures in `errors`.
14
+ */
15
+ export class MorphoUserRewardsAggregateError extends AggregateError {
16
+ readonly rewards: MorphoUserReward[];
17
+
18
+ constructor(errors: Error[], message: string, rewards: MorphoUserReward[]) {
19
+ super(errors, message);
20
+ this.name = "MorphoUserRewardsAggregateError";
21
+ this.rewards = rewards;
22
+ }
23
+ }
8
24
 
9
25
  export type GetMorphoUserRewardsParameters<
10
26
  environments,
11
27
  network extends Chain | undefined,
12
28
  > = OptionalNetworkParameterType<environments, network> & {
13
29
  userAddress: Address;
30
+ /**
31
+ * When true, errors from the external Merkl API are propagated to the
32
+ * caller instead of being swallowed and returning `[]`. Default `false`
33
+ * preserves the historical behavior for existing consumers.
34
+ *
35
+ * If multiple environments are queried and at least one fails while others
36
+ * succeed, this throws a `MorphoUserRewardsAggregateError` whose `errors`
37
+ * array contains the per-chain failures and whose `rewards` property
38
+ * carries the successful chains' rewards so the caller can still display
39
+ * partial results.
40
+ */
41
+ throwOnExternalApiError?: boolean;
14
42
  };
15
43
 
16
44
  export type GetMorphoUserRewardsReturnType = Promise<MorphoUserReward[]>;
@@ -22,18 +50,55 @@ export async function getMorphoUserRewards<
22
50
  client: MoonwellClient,
23
51
  args: GetMorphoUserRewardsParameters<environments, Network>,
24
52
  ): GetMorphoUserRewardsReturnType {
25
- const environments = getEnvironmentsFromArgs(client, args);
26
-
27
- const environmentsUserRewards = await Promise.all(
28
- environments
29
- .filter((environment) => environment.contracts.morphoViews !== undefined)
30
- .map((environment) => {
31
- return getUserMorphoRewardsData({
32
- environment,
33
- account: args.userAddress,
34
- });
53
+ const targetEnvironments = getEnvironmentsFromArgs(client, args).filter(
54
+ (environment) => environment.contracts.morphoViews !== undefined,
55
+ );
56
+
57
+ const settled = await Promise.allSettled(
58
+ targetEnvironments.map((environment) =>
59
+ getUserMorphoRewardsData({
60
+ environment,
61
+ account: args.userAddress,
62
+ ...(args.throwOnExternalApiError !== undefined && {
63
+ throwOnExternalApiError: args.throwOnExternalApiError,
64
+ }),
35
65
  }),
66
+ ),
36
67
  );
37
68
 
38
- return environmentsUserRewards.flat();
69
+ const fulfilled: MorphoUserReward[] = [];
70
+ const failures: Error[] = [];
71
+ const failedChainIds: number[] = [];
72
+ for (const [i, result] of settled.entries()) {
73
+ const environment = targetEnvironments[i];
74
+ if (result.status === "fulfilled") {
75
+ fulfilled.push(...result.value);
76
+ continue;
77
+ }
78
+ const reason = result.reason;
79
+ if (reason instanceof MerklApiError) {
80
+ failures.push(reason);
81
+ failedChainIds.push(reason.chainId);
82
+ continue;
83
+ }
84
+ const baseError =
85
+ reason instanceof Error ? reason : new Error(String(reason));
86
+ failures.push(
87
+ new Error(
88
+ `getMorphoUserRewards failed for chain ${environment.chainId}: ${baseError.message}`,
89
+ { cause: baseError },
90
+ ),
91
+ );
92
+ failedChainIds.push(environment.chainId);
93
+ }
94
+
95
+ if (failures.length > 0 && args.throwOnExternalApiError === true) {
96
+ throw new MorphoUserRewardsAggregateError(
97
+ failures,
98
+ `getMorphoUserRewards failed for chains: ${failedChainIds.join(", ")}`,
99
+ fulfilled,
100
+ );
101
+ }
102
+
103
+ return fulfilled;
39
104
  }
@@ -0,0 +1,10 @@
1
+ import { createContractsConfig } from "../../types/config.js";
2
+ import { tokens } from "./tokens.js";
3
+
4
+ export const contracts = createContractsConfig({
5
+ tokens,
6
+ contracts: {
7
+ // `stakingToken` is intentionally omitted until Ethereum staking contracts ship.
8
+ governanceToken: "WELL",
9
+ },
10
+ });
@@ -0,0 +1,15 @@
1
+ import { createCustomConfig } from "../../types/config.js";
2
+
3
+ export const custom = createCustomConfig({
4
+ governance: {
5
+ token: "WELL",
6
+ chainIds: [],
7
+ },
8
+ wormhole: {
9
+ chainId: 2,
10
+ tokenBridge: { address: "0x3ee18B2214AFF97000D974cf647E654bB5f1d8A8" },
11
+ },
12
+ xWELL: {
13
+ bridgeAdapter: { address: "0x734AbBCe07679C9A6B4Fe3bC16325e028fA6DbB7" },
14
+ },
15
+ });
@@ -1,15 +1,22 @@
1
- import { http, fallback } from "viem";
2
- import { mainnet as ethereum } from "viem/chains";
1
+ import { http, defineChain, fallback } from "viem";
2
+ import { mainnet } from "viem/chains";
3
3
  import {
4
4
  type Environment,
5
5
  createEnvironmentConfig,
6
6
  } from "../../types/config.js";
7
+ import { contracts } from "./contracts.js";
8
+ import { custom } from "./custom.js";
7
9
  import { tokens } from "./tokens.js";
8
10
 
11
+ // viem's `mainnet` chain leaves `testnet` undefined; consumers
12
+ // (e.g. the bridge modal) check `env.chain.testnet === false` strictly.
13
+ const ethereum = defineChain({ ...mainnet, testnet: false });
14
+
9
15
  const createEnvironment = (
10
16
  rpcUrls?: string[],
11
17
  governanceIndexerUrl?: string,
12
- ): Environment<typeof tokens, {}, {}, {}, {}> =>
18
+ lunarIndexerUrl?: string,
19
+ ): Environment<typeof tokens, {}, {}, typeof contracts, typeof custom> =>
13
20
  createEnvironmentConfig({
14
21
  key: "ethereum",
15
22
  name: "Ethereum",
@@ -25,12 +32,14 @@ const createEnvironment = (
25
32
  governanceIndexerUrl:
26
33
  governanceIndexerUrl ||
27
34
  "https://lunar-services-worker.moonwell.workers.dev",
35
+ lunarIndexerUrl:
36
+ lunarIndexerUrl || "https://lunar-services-worker.moonwell.workers.dev",
28
37
  tokens,
29
38
  markets: {},
30
39
  vaults: {},
31
40
  morphoMarkets: {},
32
- contracts: {},
33
- custom: {},
34
- }) as Environment<typeof tokens, {}, {}, {}, {}>;
41
+ contracts,
42
+ custom,
43
+ }) as Environment<typeof tokens, {}, {}, typeof contracts, typeof custom>;
35
44
 
36
45
  export { createEnvironment, ethereum, tokens };
@@ -14,4 +14,16 @@ export const tokens = createTokenConfig({
14
14
  name: "USD Coin",
15
15
  symbol: "USDC",
16
16
  },
17
+ WELL: {
18
+ address: "0xA88594D404727625A9437C3f886C7643872296AE",
19
+ decimals: 18,
20
+ name: "Moonwell",
21
+ symbol: "WELL",
22
+ },
23
+ stkWELL: {
24
+ address: "0xb3a9E0DCf37658a48aa9f018C44f90378ddD4357",
25
+ decimals: 18,
26
+ name: "Moonwell Staked WELL",
27
+ symbol: "stkWELL",
28
+ },
17
29
  });
@@ -1,4 +1,4 @@
1
- import { base, moonbeam, moonriver, optimism } from "viem/chains";
1
+ import { base, mainnet, moonbeam, moonriver, optimism } from "viem/chains";
2
2
 
3
3
  export interface GovernanceTokenInfo {
4
4
  id: string;
@@ -30,7 +30,7 @@ export const GovernanceTokensConfig = createGovernanceTokensConfig({
30
30
  id: "WELL",
31
31
  symbol: "WELL",
32
32
  name: "WELL",
33
- chainIds: [moonbeam.id, base.id, optimism.id] as number[],
33
+ chainIds: [moonbeam.id, base.id, optimism.id, mainnet.id] as number[],
34
34
  testnet: false,
35
35
  },
36
36
  MFAM: {
package/errors/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = '0.12.1'
1
+ export const version = '0.13.0'
package/index.ts CHANGED
@@ -3,6 +3,9 @@ export {
3
3
  type MoonwellClient,
4
4
  } from "./client/createMoonwellClient.js";
5
5
 
6
+ export { MerklApiError } from "./actions/morpho/user-rewards/common.js";
7
+ export { MorphoUserRewardsAggregateError } from "./actions/morpho/user-rewards/getMorphoUserRewards.js";
8
+
6
9
  export type {
7
10
  MarketConfig,
8
11
  MorphoMarketConfig,
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.1",
4
+ "version": "0.13.0",
5
5
  "main": "./_cjs/index.js",
6
6
  "module": "./_esm/index.js",
7
7
  "types": "./_types/index.d.ts",