@moonwell-fi/moonwell-sdk 0.9.26 → 0.9.28

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 (81) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/_cjs/actions/core/markets/common.js +291 -5
  3. package/_cjs/actions/core/markets/common.js.map +1 -1
  4. package/_cjs/actions/core/markets/getMarketSnapshots.js +83 -3
  5. package/_cjs/actions/core/markets/getMarketSnapshots.js.map +1 -1
  6. package/_cjs/actions/core/user-positions/common.js +61 -1
  7. package/_cjs/actions/core/user-positions/common.js.map +1 -1
  8. package/_cjs/actions/core/user-positions/getUserPositionSnapshots.js +70 -2
  9. package/_cjs/actions/core/user-positions/getUserPositionSnapshots.js.map +1 -1
  10. package/_cjs/actions/lunar-indexer-client.js +164 -0
  11. package/_cjs/actions/lunar-indexer-client.js.map +1 -0
  12. package/_cjs/actions/lunar-indexer-transformers.js +47 -0
  13. package/_cjs/actions/lunar-indexer-transformers.js.map +1 -0
  14. package/_cjs/environments/definitions/base/environment.js +2 -1
  15. package/_cjs/environments/definitions/base/environment.js.map +1 -1
  16. package/_cjs/environments/definitions/moonbeam/environment.js +2 -1
  17. package/_cjs/environments/definitions/moonbeam/environment.js.map +1 -1
  18. package/_cjs/environments/definitions/optimism/environment.js +2 -1
  19. package/_cjs/environments/definitions/optimism/environment.js.map +1 -1
  20. package/_cjs/environments/types/config.js +1 -0
  21. package/_cjs/environments/types/config.js.map +1 -1
  22. package/_cjs/errors/version.js +1 -1
  23. package/_cjs/utils/lunar-indexer-helpers.js +27 -0
  24. package/_cjs/utils/lunar-indexer-helpers.js.map +1 -0
  25. package/_esm/actions/core/markets/common.js +302 -5
  26. package/_esm/actions/core/markets/common.js.map +1 -1
  27. package/_esm/actions/core/markets/getMarketSnapshots.js +87 -3
  28. package/_esm/actions/core/markets/getMarketSnapshots.js.map +1 -1
  29. package/_esm/actions/core/user-positions/common.js +74 -1
  30. package/_esm/actions/core/user-positions/common.js.map +1 -1
  31. package/_esm/actions/core/user-positions/getUserPositionSnapshots.js +100 -2
  32. package/_esm/actions/core/user-positions/getUserPositionSnapshots.js.map +1 -1
  33. package/_esm/actions/lunar-indexer-client.js +201 -0
  34. package/_esm/actions/lunar-indexer-client.js.map +1 -0
  35. package/_esm/actions/lunar-indexer-transformers.js +80 -0
  36. package/_esm/actions/lunar-indexer-transformers.js.map +1 -0
  37. package/_esm/environments/definitions/base/environment.js +2 -1
  38. package/_esm/environments/definitions/base/environment.js.map +1 -1
  39. package/_esm/environments/definitions/moonbeam/environment.js +2 -1
  40. package/_esm/environments/definitions/moonbeam/environment.js.map +1 -1
  41. package/_esm/environments/definitions/optimism/environment.js +2 -1
  42. package/_esm/environments/definitions/optimism/environment.js.map +1 -1
  43. package/_esm/environments/types/config.js +1 -0
  44. package/_esm/environments/types/config.js.map +1 -1
  45. package/_esm/errors/version.js +1 -1
  46. package/_esm/utils/lunar-indexer-helpers.js +48 -0
  47. package/_esm/utils/lunar-indexer-helpers.js.map +1 -0
  48. package/_types/actions/core/markets/common.d.ts.map +1 -1
  49. package/_types/actions/core/markets/getMarketSnapshots.d.ts +4 -0
  50. package/_types/actions/core/markets/getMarketSnapshots.d.ts.map +1 -1
  51. package/_types/actions/core/user-positions/common.d.ts.map +1 -1
  52. package/_types/actions/core/user-positions/getUserPositionSnapshots.d.ts +28 -0
  53. package/_types/actions/core/user-positions/getUserPositionSnapshots.d.ts.map +1 -1
  54. package/_types/actions/lunar-indexer-client.d.ts +197 -0
  55. package/_types/actions/lunar-indexer-client.d.ts.map +1 -0
  56. package/_types/actions/lunar-indexer-transformers.d.ts +40 -0
  57. package/_types/actions/lunar-indexer-transformers.d.ts.map +1 -0
  58. package/_types/environments/definitions/base/environment.d.ts +1 -1
  59. package/_types/environments/definitions/base/environment.d.ts.map +1 -1
  60. package/_types/environments/definitions/moonbeam/environment.d.ts +1 -1
  61. package/_types/environments/definitions/moonbeam/environment.d.ts.map +1 -1
  62. package/_types/environments/definitions/optimism/environment.d.ts +1 -1
  63. package/_types/environments/definitions/optimism/environment.d.ts.map +1 -1
  64. package/_types/environments/types/config.d.ts +2 -0
  65. package/_types/environments/types/config.d.ts.map +1 -1
  66. package/_types/errors/version.d.ts +1 -1
  67. package/_types/utils/lunar-indexer-helpers.d.ts +38 -0
  68. package/_types/utils/lunar-indexer-helpers.d.ts.map +1 -0
  69. package/actions/core/markets/common.ts +500 -5
  70. package/actions/core/markets/getMarketSnapshots.ts +153 -2
  71. package/actions/core/user-positions/common.ts +139 -6
  72. package/actions/core/user-positions/getUserPositionSnapshots.ts +175 -1
  73. package/actions/lunar-indexer-client.ts +409 -0
  74. package/actions/lunar-indexer-transformers.ts +113 -0
  75. package/environments/definitions/base/environment.ts +3 -0
  76. package/environments/definitions/moonbeam/environment.ts +3 -0
  77. package/environments/definitions/optimism/environment.ts +3 -0
  78. package/environments/types/config.ts +3 -0
  79. package/errors/version.ts +1 -1
  80. package/package.json +1 -1
  81. package/utils/lunar-indexer-helpers.ts +57 -0
@@ -6,12 +6,22 @@ export const getUserPositionData = async (params) => {
6
6
  return [];
7
7
  }
8
8
  try {
9
- const [allMarkets, balances, borrows, memberships] = await Promise.all([
9
+ const [allMarketsResult, balancesResult, borrowsResult, membershipsResult] = await Promise.allSettled([
10
10
  viewsContract.read.getAllMarketsInfo(),
11
11
  viewsContract.read.getUserBalances([params.account]),
12
12
  viewsContract.read.getUserBorrowsBalances([params.account]),
13
13
  viewsContract.read.getUserMarketsMemberships([params.account]),
14
14
  ]);
15
+ const balances = balancesResult.status === "fulfilled" ? balancesResult.value : [];
16
+ const borrows = borrowsResult.status === "fulfilled" ? borrowsResult.value : [];
17
+ const memberships = membershipsResult.status === "fulfilled" ? membershipsResult.value : [];
18
+ // If getAllMarketsInfo failed (e.g. broken on-chain oracle), fall back to
19
+ // per-mToken exchange rate calls. The user balance/borrow/membership calls
20
+ // don't touch the oracle so they can still succeed.
21
+ if (allMarketsResult.status === "rejected") {
22
+ return getUserPositionsFromMTokenFallback(params, balances, borrows, memberships);
23
+ }
24
+ const allMarkets = allMarketsResult.value;
15
25
  const markets = allMarkets
16
26
  ?.map((marketInfo) => {
17
27
  const market = findMarketByAddress(params.environment, marketInfo.market);
@@ -60,4 +70,67 @@ export const getUserPositionData = async (params) => {
60
70
  return [];
61
71
  }
62
72
  };
73
+ /**
74
+ * Fallback for chains whose on-chain price oracle is non-functional (e.g.
75
+ * deprecated Moonriver). getUserBalances/getUserBorrowsBalances/getUserMarketsMemberships
76
+ * don't require the oracle, so we use those results directly. We fetch each
77
+ * mToken's exchangeRate individually to convert mToken balances to underlying.
78
+ * All USD values are set to 0 since oracle prices are unavailable.
79
+ */
80
+ async function getUserPositionsFromMTokenFallback(params, balances, borrows, memberships) {
81
+ const positions = [];
82
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
83
+ const envAny = params.environment;
84
+ for (const marketKey of Object.keys(params.environment.config.markets)) {
85
+ const marketConfig = envAny.config.markets[marketKey];
86
+ if (!marketConfig)
87
+ continue;
88
+ const underlyingToken = envAny.config.tokens[marketConfig.underlyingToken];
89
+ const marketToken = envAny.config.tokens[marketConfig.marketToken];
90
+ if (!underlyingToken || !marketToken)
91
+ continue;
92
+ const mTokenAddress = marketToken.address.toLowerCase();
93
+ const marketSuppliedRaw = balances.find((r) => r.token.toLowerCase() === mTokenAddress)?.amount ??
94
+ 0n;
95
+ const marketBorrowedRaw = borrows.find((r) => r.token.toLowerCase() === mTokenAddress)?.amount ??
96
+ 0n;
97
+ // Skip markets where the user has no position
98
+ if (marketSuppliedRaw === 0n && marketBorrowedRaw === 0n)
99
+ continue;
100
+ const marketCollateralEnabled = memberships.find((r) => r.token.toLowerCase() === mTokenAddress)
101
+ ?.membership === true;
102
+ // Fetch exchange rate individually (not oracle-dependent)
103
+ const mTokenContract = envAny.markets[marketKey];
104
+ const defaultExchangeRate = 10n ** BigInt(10 + underlyingToken.decimals);
105
+ let exchangeRateRaw;
106
+ try {
107
+ exchangeRateRaw =
108
+ (await mTokenContract?.read.exchangeRateStored()) ??
109
+ defaultExchangeRate;
110
+ }
111
+ catch {
112
+ exchangeRateRaw = defaultExchangeRate;
113
+ }
114
+ const exchangeRate = new Amount(exchangeRateRaw, 10 + underlyingToken.decimals).value;
115
+ const borrowed = new Amount(marketBorrowedRaw, underlyingToken.decimals);
116
+ const marketSupplied = new Amount(marketSuppliedRaw, marketToken.decimals);
117
+ const supplied = new Amount(marketSupplied.value * exchangeRate, underlyingToken.decimals);
118
+ if (params.markets && !params.markets.includes(marketToken.address)) {
119
+ continue;
120
+ }
121
+ positions.push({
122
+ chainId: params.environment.chainId,
123
+ account: params.account,
124
+ market: marketToken,
125
+ collateralEnabled: marketCollateralEnabled,
126
+ borrowed,
127
+ borrowedUsd: 0,
128
+ collateral: new Amount(0n, underlyingToken.decimals),
129
+ collateralUsd: 0,
130
+ supplied,
131
+ suppliedUsd: 0,
132
+ });
133
+ }
134
+ return positions;
135
+ }
63
136
  //# sourceMappingURL=common.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../actions/core/user-positions/common.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../actions/core/user-positions/common.ts"],"names":[],"mappings":"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"}
@@ -2,15 +2,113 @@ import axios from "axios";
2
2
  import dayjs from "dayjs";
3
3
  import utc from "dayjs/plugin/utc.js";
4
4
  import { getEnvironmentFromArgs, isStartOfDay } from "../../../common/index.js";
5
+ import { DEFAULT_LUNAR_TIMEOUT_MS, createLunarIndexerClient, shouldFallback, } from "../../lunar-indexer-client.js";
6
+ import { transformPortfolioToSnapshots } from "../../lunar-indexer-transformers.js";
5
7
  dayjs.extend(utc);
8
+ /**
9
+ * Calculate start and end times based on period or custom timestamps
10
+ * Priority: custom timestamps > period > default (365 days)
11
+ */
12
+ function calculateTimeRange(period, startTime, endTime) {
13
+ const now = dayjs.utc();
14
+ const end = endTime ?? now.unix();
15
+ // If both startTime and endTime are provided, use them (custom range)
16
+ if (startTime !== undefined && endTime !== undefined) {
17
+ return { startTime, endTime: end };
18
+ }
19
+ // Calculate based on period
20
+ let start;
21
+ switch (period) {
22
+ case "1M":
23
+ start = now.subtract(31, "days").unix();
24
+ break;
25
+ case "3M":
26
+ start = now.subtract(91, "days").unix();
27
+ break;
28
+ case "1Y":
29
+ start = now.subtract(366, "days").unix();
30
+ break;
31
+ case "ALL":
32
+ // Use a date far in the past to get all available data
33
+ start = now.subtract(10, "years").unix();
34
+ break;
35
+ default:
36
+ // Default to 365 days for backward compatibility
37
+ start = now.subtract(365, "days").unix();
38
+ break;
39
+ }
40
+ return { startTime: start, endTime: end };
41
+ }
42
+ /**
43
+ * Get historical snapshots of a user's positions across all markets
44
+ *
45
+ * @param client - Moonwell client instance
46
+ * @param args - Parameters including user address and optional time range
47
+ * @param args.userAddress - The user's wallet address
48
+ * @param args.period - Predefined time period: "1M" (31 days), "3M" (91 days), "1Y" (366 days), or "ALL" (all available history)
49
+ * @param args.startTime - Custom start time (unix timestamp in seconds). Overrides period if both startTime and endTime are provided.
50
+ * @param args.endTime - Custom end time (unix timestamp in seconds). Overrides period if both startTime and endTime are provided.
51
+ * @param args.granularity - Data granularity: "1h", "6h", or "1d" (default). Determines snapshot frequency.
52
+ *
53
+ * @returns Array of user position snapshots with USD values for supply, borrow, and collateral
54
+ *
55
+ * @remarks
56
+ * - Default behavior (no time parameters): Returns 365 days of history
57
+ * - Parameter priority: Custom timestamps > period > default (365 days)
58
+ * - When using Lunar Indexer, custom time ranges are supported
59
+ * - When falling back to Ponder, all available data is returned (client-side filtering may be needed)
60
+ * - Snapshots are filtered to start-of-day for "1d" granularity
61
+ */
6
62
  export async function getUserPositionSnapshots(client, args) {
7
63
  const environment = getEnvironmentFromArgs(client, args);
8
64
  if (!environment) {
9
65
  return [];
10
66
  }
11
- return fetchUserPositionSnapshots(args.userAddress, environment);
67
+ return fetchUserPositionSnapshots(args.userAddress, environment, args.period, args.startTime, args.endTime, args.granularity);
68
+ }
69
+ async function fetchUserPositionSnapshots(userAddress, environment, period, startTime, endTime, granularity) {
70
+ if (environment.lunarIndexerUrl) {
71
+ try {
72
+ const result = await fetchUserPositionSnapshotsFromLunar(userAddress, environment, period, startTime, endTime, granularity);
73
+ return result;
74
+ }
75
+ catch (error) {
76
+ if (!shouldFallback(error)) {
77
+ throw error;
78
+ }
79
+ console.debug("[Lunar fallback] Falling back to Ponder for user snapshots:", error);
80
+ }
81
+ }
82
+ // Ponder fallback returns all available data (doesn't support time filtering)
83
+ const result = await fetchUserPositionSnapshotsFromPonder(userAddress, environment);
84
+ return result;
85
+ }
86
+ async function fetchUserPositionSnapshotsFromLunar(userAddress, environment, period, customStartTime, customEndTime, granularity = "1d") {
87
+ if (!environment.lunarIndexerUrl) {
88
+ throw new Error("Lunar Indexer URL not configured");
89
+ }
90
+ const client = createLunarIndexerClient({
91
+ baseUrl: environment.lunarIndexerUrl,
92
+ timeout: DEFAULT_LUNAR_TIMEOUT_MS,
93
+ });
94
+ const { startTime, endTime } = calculateTimeRange(period, customStartTime, customEndTime);
95
+ const portfolio = await client.getAccountPortfolio(userAddress.toLowerCase(), {
96
+ startTime,
97
+ endTime,
98
+ granularity,
99
+ chainId: environment.chainId,
100
+ });
101
+ const snapshots = transformPortfolioToSnapshots(portfolio, environment.chainId);
102
+ // Find the first snapshot where user has any position
103
+ const firstNonZeroIndex = snapshots.findIndex((snapshot) => snapshot.totalSupplyUsd > 0 ||
104
+ snapshot.totalBorrowsUsd > 0 ||
105
+ snapshot.totalCollateralUsd > 0);
106
+ if (firstNonZeroIndex === -1) {
107
+ return [];
108
+ }
109
+ return snapshots.slice(firstNonZeroIndex);
12
110
  }
13
- async function fetchUserPositionSnapshots(userAddress, environment) {
111
+ async function fetchUserPositionSnapshotsFromPonder(userAddress, environment) {
14
112
  const dailyData = [];
15
113
  let hasNextPage = true;
16
114
  let endCursor;
@@ -1 +1 @@
1
- {"version":3,"file":"getUserPositionSnapshots.js","sourceRoot":"","sources":["../../../../actions/core/user-positions/getUserPositionSnapshots.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,qBAAqB,CAAC;AAGtC,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAKhF,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAclB,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAI5C,MAAsB,EACtB,IAA+D;IAE/D,MAAM,WAAW,GAAG,sBAAsB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAEzD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,0BAA0B,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;AACnE,CAAC;AAED,KAAK,UAAU,0BAA0B,CACvC,WAAoB,EACpB,WAAwB;IAExB,MAAM,SAAS,GAAoB,EAAE,CAAC;IACtC,IAAI,WAAW,GAAG,IAAI,CAAC;IACvB,IAAI,SAA6B,CAAC;IASlC,OAAO,WAAW,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,CAU5B,WAAW,CAAC,UAAU,EAAE;YACzB,KAAK,EAAE;;;;;;0CAM6B,WAAW,CAAC,WAAW,EAAE,eAAe,WAAW,CAAC,OAAO;gBACrF,SAAS,CAAC,CAAC,CAAC,WAAW,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;SAc/C;SACJ,CAAC,CAAC;QAEH,SAAS,CAAC,IAAI,CACZ,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,MAAM,CACpD,CAAC,CAAwB,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CACxD,CACF,CAAC;QACF,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC1E,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,SAAS,CAAC;IACxE,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,KAAoB,EAAE,EAAE;YAC5C,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YAChD,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;YACnD,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;YAEvD,MAAM,MAAM,GAAyB;gBACnC,OAAO,EAAE,WAAW,CAAC,OAAO;gBAC5B,SAAS,EAAE,KAAK,CAAC,SAAS,GAAG,IAAI;gBACjC,cAAc,EAAE,WAAW;gBAC3B,eAAe,EAAE,SAAS;gBAC1B,kBAAkB,EAAE,aAAa;aAClC,CAAC;YAEF,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"getUserPositionSnapshots.js","sourceRoot":"","sources":["../../../../actions/core/user-positions/getUserPositionSnapshots.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Lunar Indexer API Client
3
+ *
4
+ * Client for interacting with the Lunar Indexer REST API endpoints.
5
+ * Provides functions for fetching comptroller, market, token, and portfolio data.
6
+ */
7
+ import axios, {} from "axios";
8
+ // ============================================================================
9
+ // Error Handling
10
+ // ============================================================================
11
+ export class LunarIndexerError extends Error {
12
+ constructor(message, statusCode, endpoint, originalError) {
13
+ super(message);
14
+ Object.defineProperty(this, "statusCode", {
15
+ enumerable: true,
16
+ configurable: true,
17
+ writable: true,
18
+ value: statusCode
19
+ });
20
+ Object.defineProperty(this, "endpoint", {
21
+ enumerable: true,
22
+ configurable: true,
23
+ writable: true,
24
+ value: endpoint
25
+ });
26
+ Object.defineProperty(this, "originalError", {
27
+ enumerable: true,
28
+ configurable: true,
29
+ writable: true,
30
+ value: originalError
31
+ });
32
+ this.name = "LunarIndexerError";
33
+ }
34
+ }
35
+ /**
36
+ * Determine if an error should trigger fallback to Ponder/on-chain
37
+ */
38
+ export function shouldFallback(error) {
39
+ if (axios.isAxiosError(error)) {
40
+ const axiosError = error;
41
+ const isNetworkError = !axiosError.response;
42
+ const is5xxError = !!axiosError.response && axiosError.response.status >= 500;
43
+ const is404Error = !!axiosError.response && axiosError.response.status === 404;
44
+ if (isNetworkError || is5xxError || is404Error) {
45
+ return true;
46
+ }
47
+ // 4xx errors (except 404) should NOT fallback - fail fast
48
+ return false;
49
+ }
50
+ // Unknown errors should fallback
51
+ return true;
52
+ }
53
+ export const DEFAULT_LUNAR_TIMEOUT_MS = 10_000;
54
+ // ============================================================================
55
+ // Lunar Indexer Client Class
56
+ // ============================================================================
57
+ export class LunarIndexerClient {
58
+ constructor(config) {
59
+ Object.defineProperty(this, "client", {
60
+ enumerable: true,
61
+ configurable: true,
62
+ writable: true,
63
+ value: void 0
64
+ });
65
+ this.client = axios.create({
66
+ baseURL: `${config.baseUrl}/api/v1/core`,
67
+ timeout: config.timeout || DEFAULT_LUNAR_TIMEOUT_MS,
68
+ headers: {
69
+ "Content-Type": "application/json",
70
+ },
71
+ });
72
+ }
73
+ /**
74
+ * Get comptroller data for a specific chain
75
+ */
76
+ async getComptroller(chainId) {
77
+ try {
78
+ const response = await this.client.get(`/comptroller/${chainId}`);
79
+ return response.data;
80
+ }
81
+ catch (error) {
82
+ throw new LunarIndexerError(`Failed to fetch comptroller for chain ${chainId}`, axios.isAxiosError(error) ? error.response?.status : undefined, `/comptroller/${chainId}`, error);
83
+ }
84
+ }
85
+ /**
86
+ * List all markets for a specific chain with pagination
87
+ * Returns full market data with real-time values, APYs, and incentives
88
+ */
89
+ async listMarkets(chainId, options) {
90
+ try {
91
+ const params = {};
92
+ if (options?.limit)
93
+ params.limit = options.limit.toString();
94
+ if (options?.cursor)
95
+ params.cursor = options.cursor;
96
+ const response = await this.client.get(`/markets/${chainId}`, { params });
97
+ return response.data;
98
+ }
99
+ catch (error) {
100
+ throw new LunarIndexerError(`Failed to list markets for chain ${chainId}`, axios.isAxiosError(error) ? error.response?.status : undefined, `/markets/${chainId}`, error);
101
+ }
102
+ }
103
+ /**
104
+ * Get a single market by marketId (format: chainId-marketAddress)
105
+ * Returns full market data with real-time values, APYs, and incentives
106
+ */
107
+ async getMarket(marketId) {
108
+ try {
109
+ const response = await this.client.get(`/market/${marketId}`);
110
+ return response.data;
111
+ }
112
+ catch (error) {
113
+ throw new LunarIndexerError(`Failed to fetch market ${marketId}`, axios.isAxiosError(error) ? error.response?.status : undefined, `/market/${marketId}`, error);
114
+ }
115
+ }
116
+ /**
117
+ * Get market snapshots with optional time range and granularity
118
+ */
119
+ async getMarketSnapshots(marketId, options) {
120
+ try {
121
+ const params = {};
122
+ if (options?.limit)
123
+ params.limit = options.limit.toString();
124
+ if (options?.cursor)
125
+ params.cursor = options.cursor;
126
+ if (options?.granularity)
127
+ params.granularity = options.granularity;
128
+ if (options?.startTime)
129
+ params.startTime = options.startTime.toString();
130
+ if (options?.endTime)
131
+ params.endTime = options.endTime.toString();
132
+ const response = await this.client.get(`/market/${marketId}/snapshots`, { params });
133
+ return response.data;
134
+ }
135
+ catch (error) {
136
+ throw new LunarIndexerError(`Failed to fetch market snapshots for ${marketId}`, axios.isAxiosError(error) ? error.response?.status : undefined, `/market/${marketId}/snapshots`, error);
137
+ }
138
+ }
139
+ /**
140
+ * List all tokens for a specific chain with pagination
141
+ */
142
+ async listTokens(chainId, options) {
143
+ try {
144
+ const params = {};
145
+ if (options?.limit)
146
+ params.limit = options.limit.toString();
147
+ if (options?.cursor)
148
+ params.cursor = options.cursor;
149
+ const response = await this.client.get(`/tokens/${chainId}`, { params });
150
+ return response.data;
151
+ }
152
+ catch (error) {
153
+ throw new LunarIndexerError(`Failed to list tokens for chain ${chainId}`, axios.isAxiosError(error) ? error.response?.status : undefined, `/tokens/${chainId}`, error);
154
+ }
155
+ }
156
+ /**
157
+ * Get a single token by tokenId (format: chainId-tokenAddress)
158
+ */
159
+ async getToken(tokenId) {
160
+ try {
161
+ const response = await this.client.get(`/token/${tokenId}`);
162
+ return response.data;
163
+ }
164
+ catch (error) {
165
+ throw new LunarIndexerError(`Failed to fetch token ${tokenId}`, axios.isAxiosError(error) ? error.response?.status : undefined, `/token/${tokenId}`, error);
166
+ }
167
+ }
168
+ /**
169
+ * Get account portfolio with historical positions
170
+ * NOTE: USD fields (supplyBalanceUsd, borrowBalanceUsd) are being added by Lunar team
171
+ */
172
+ async getAccountPortfolio(accountAddress, options) {
173
+ try {
174
+ const params = {
175
+ startTime: options.startTime.toString(),
176
+ endTime: options.endTime.toString(),
177
+ };
178
+ if (options.granularity)
179
+ params.granularity = options.granularity;
180
+ if (options.chainId)
181
+ params.chainId = options.chainId.toString();
182
+ if (options.market)
183
+ params.market = options.market;
184
+ const response = await this.client.get(`/account/${accountAddress.toLowerCase()}/portfolio`, { params });
185
+ return response.data;
186
+ }
187
+ catch (error) {
188
+ throw new LunarIndexerError(`Failed to fetch portfolio for account ${accountAddress}`, axios.isAxiosError(error) ? error.response?.status : undefined, `/account/${accountAddress}/portfolio`, error);
189
+ }
190
+ }
191
+ }
192
+ // ============================================================================
193
+ // Factory Function
194
+ // ============================================================================
195
+ /**
196
+ * Create a new Lunar Indexer client instance
197
+ */
198
+ export function createLunarIndexerClient(config) {
199
+ return new LunarIndexerClient(config);
200
+ }
201
+ //# sourceMappingURL=lunar-indexer-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lunar-indexer-client.js","sourceRoot":"","sources":["../../actions/lunar-indexer-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Lunar Indexer Response Transformers
3
+ *
4
+ * Transforms Lunar Indexer API responses to match the SDK's internal types.
5
+ */
6
+ // ============================================================================
7
+ // Market Snapshot Transformation
8
+ // ============================================================================
9
+ /**
10
+ * Transform a Lunar market snapshot to SDK MarketSnapshot format
11
+ *
12
+ * Key differences:
13
+ * - Lunar uses decimal numbers, SDK uses numbers
14
+ * - Lunar has timeInterval field (not needed in SDK)
15
+ * - Field name mapping: totalSupplies → totalSupply, totalBorrows → totalBorrows
16
+ */
17
+ export function transformMarketSnapshot(lunar, chainId) {
18
+ return {
19
+ chainId,
20
+ marketId: lunar.marketAddress,
21
+ totalSupply: Number(lunar.totalSupplies),
22
+ totalSupplyUsd: Number(lunar.totalSuppliesUSD),
23
+ totalBorrows: Number(lunar.totalBorrows),
24
+ totalBorrowsUsd: Number(lunar.totalBorrowsUSD),
25
+ totalLiquidity: Number(lunar.totalLiquidity),
26
+ totalLiquidityUsd: Number(lunar.totalLiquidityUSD),
27
+ baseSupplyApy: Number(lunar.baseSupplyApy),
28
+ baseBorrowApy: Number(lunar.baseBorrowApy),
29
+ timestamp: Number(lunar.timestamp) * 1000, // Convert unix timestamp to milliseconds
30
+ loanTokenPrice: 0, // Calculated in getMarketSnapshots
31
+ collateralTokenPrice: 0, // Calculated in getMarketSnapshots
32
+ };
33
+ }
34
+ /**
35
+ * Transform an array of Lunar market snapshots
36
+ */
37
+ export function transformMarketSnapshots(snapshots, chainId) {
38
+ return snapshots.map((snapshot) => transformMarketSnapshot(snapshot, chainId));
39
+ }
40
+ // ============================================================================
41
+ // Portfolio/User Position Transformation
42
+ // ============================================================================
43
+ /**
44
+ * Transform Lunar portfolio to SDK UserPositionSnapshot array
45
+ *
46
+ * Key transformation:
47
+ * - Aggregate per-market USD balances across all markets per timestamp
48
+ * - Sum supplyBalanceUsd → totalSupplyUsd
49
+ * - Sum borrowBalanceUsd → totalBorrowsUsd
50
+ * - Assume totalCollateralUsd = totalSupplyUsd (all supplies are collateral)
51
+ */
52
+ export function transformPortfolioToSnapshots(lunarPortfolio, chainId) {
53
+ return lunarPortfolio.positions.map((position) => {
54
+ const totalSupplyUsd = position.markets.reduce((sum, market) => sum + Number.parseFloat(market.supplyBalanceUsd || "0"), 0);
55
+ const totalBorrowsUsd = position.markets.reduce((sum, market) => sum + Number.parseFloat(market.borrowBalanceUsd || "0"), 0);
56
+ return {
57
+ chainId,
58
+ timestamp: position.timestamp * 1000, // Convert unix timestamp (seconds) to milliseconds
59
+ totalSupplyUsd,
60
+ totalBorrowsUsd,
61
+ totalCollateralUsd: totalSupplyUsd, // Assuming all supplies are collateral
62
+ };
63
+ });
64
+ }
65
+ // ============================================================================
66
+ // Pagination Transformation
67
+ // ============================================================================
68
+ /**
69
+ * Check if there are more pages available
70
+ */
71
+ export function hasMorePages(nextCursor) {
72
+ return nextCursor !== null;
73
+ }
74
+ /**
75
+ * Extract cursor for next page
76
+ */
77
+ export function getNextCursor(nextCursor) {
78
+ return nextCursor || undefined;
79
+ }
80
+ //# sourceMappingURL=lunar-indexer-transformers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lunar-indexer-transformers.js","sourceRoot":"","sources":["../../actions/lunar-indexer-transformers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,+EAA+E;AAC/E,iCAAiC;AACjC,+EAA+E;AAE/E;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB,CACrC,KAA0B,EAC1B,OAAe;IAEf,OAAO;QACL,OAAO;QACP,QAAQ,EAAE,KAAK,CAAC,aAAa;QAC7B,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;QACxC,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC;QAC9C,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC;QACxC,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC;QAC9C,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC;QAC5C,iBAAiB,EAAE,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC;QAClD,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;QAC1C,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;QAC1C,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,yCAAyC;QACpF,cAAc,EAAE,CAAC,EAAE,mCAAmC;QACtD,oBAAoB,EAAE,CAAC,EAAE,mCAAmC;KAC7D,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,SAAgC,EAChC,OAAe;IAEf,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAChC,uBAAuB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAC3C,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,yCAAyC;AACzC,+EAA+E;AAE/E;;;;;;;;GAQG;AACH,MAAM,UAAU,6BAA6B,CAC3C,cAA8B,EAC9B,OAAe;IAEf,OAAO,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC/C,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAC5C,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,gBAAgB,IAAI,GAAG,CAAC,EACxE,CAAC,CACF,CAAC;QAEF,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAC7C,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,gBAAgB,IAAI,GAAG,CAAC,EACxE,CAAC,CACF,CAAC;QAEF,OAAO;YACL,OAAO;YACP,SAAS,EAAE,QAAQ,CAAC,SAAS,GAAG,IAAI,EAAE,mDAAmD;YACzF,cAAc;YACd,eAAe;YACf,kBAAkB,EAAE,cAAc,EAAE,uCAAuC;SAC5E,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,+EAA+E;AAC/E,4BAA4B;AAC5B,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,UAAyB;IACpD,OAAO,UAAU,KAAK,IAAI,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,UAAyB;IACrD,OAAO,UAAU,IAAI,SAAS,CAAC;AACjC,CAAC"}
@@ -8,7 +8,7 @@ import { morphoMarkets } from "./morpho-markets.js";
8
8
  import { vaults } from "./morpho-vaults.js";
9
9
  import { tokens } from "./tokens.js";
10
10
  const base = defineChain({ ...baseChain, testnet: false });
11
- const createEnvironment = (rpcUrls, indexerUrl, governanceIndexerUrl) => createEnvironmentConfig({
11
+ const createEnvironment = (rpcUrls, indexerUrl, governanceIndexerUrl, lunarIndexerUrl) => createEnvironmentConfig({
12
12
  key: "base",
13
13
  name: "Base",
14
14
  chain: {
@@ -23,6 +23,7 @@ const createEnvironment = (rpcUrls, indexerUrl, governanceIndexerUrl) => createE
23
23
  indexerUrl: indexerUrl || "https://ponder.moonwell.fi",
24
24
  governanceIndexerUrl: governanceIndexerUrl ||
25
25
  "https://lunar-services-worker.moonwell.workers.dev",
26
+ lunarIndexerUrl: lunarIndexerUrl || "https://lunar-services-worker.moonwell.workers.dev",
26
27
  tokens,
27
28
  markets,
28
29
  vaults,
@@ -1 +1 @@
1
- {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../../../environments/definitions/base/environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACnD,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAEL,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,GAAG,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;AAE3D,MAAM,iBAAiB,GAAG,CACxB,OAAkB,EAClB,UAAmB,EACnB,oBAA6B,EAO7B,EAAE,CACF,uBAAuB,CAAC;IACtB,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE;QACL,GAAG,IAAI;QACP,OAAO,EAAE;YACP,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,IAAI,CAAC,uCAAuC,CAAC,EAAE;SACxE;KACF;IACD,SAAS,EAAE,OAAO;QAChB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3C,CAAC,CAAC,IAAI,CAAC,uCAAuC,CAAC;IACjD,UAAU,EAAE,UAAU,IAAI,4BAA4B;IACtD,oBAAoB,EAClB,oBAAoB;QACpB,oDAAoD;IACtD,MAAM;IACN,OAAO;IACP,MAAM;IACN,aAAa;IACb,SAAS;IACT,MAAM;CACP,CAMA,CAAC;AAEJ,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC"}
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../../../environments/definitions/base/environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACnD,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAEL,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,GAAG,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;AAE3D,MAAM,iBAAiB,GAAG,CACxB,OAAkB,EAClB,UAAmB,EACnB,oBAA6B,EAC7B,eAAwB,EAOxB,EAAE,CACF,uBAAuB,CAAC;IACtB,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE;QACL,GAAG,IAAI;QACP,OAAO,EAAE;YACP,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,IAAI,CAAC,uCAAuC,CAAC,EAAE;SACxE;KACF;IACD,SAAS,EAAE,OAAO;QAChB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3C,CAAC,CAAC,IAAI,CAAC,uCAAuC,CAAC;IACjD,UAAU,EAAE,UAAU,IAAI,4BAA4B;IACtD,oBAAoB,EAClB,oBAAoB;QACpB,oDAAoD;IACtD,eAAe,EACb,eAAe,IAAI,oDAAoD;IACzE,MAAM;IACN,OAAO;IACP,MAAM;IACN,aAAa;IACb,SAAS;IACT,MAAM;CACP,CAMA,CAAC;AAEJ,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC"}
@@ -5,7 +5,7 @@ import { contracts } from "./contracts.js";
5
5
  import { markets } from "./core-markets.js";
6
6
  import { custom } from "./custom.js";
7
7
  import { tokens } from "./tokens.js";
8
- const createEnvironment = (rpcUrls, indexerUrl, governanceIndexerUrl) => createEnvironmentConfig({
8
+ const createEnvironment = (rpcUrls, indexerUrl, governanceIndexerUrl, lunarIndexerUrl) => createEnvironmentConfig({
9
9
  key: "moonbeam",
10
10
  name: "Moonbeam",
11
11
  chain: {
@@ -18,6 +18,7 @@ const createEnvironment = (rpcUrls, indexerUrl, governanceIndexerUrl) => createE
18
18
  ? fallback(rpcUrls.map((url) => http(url)))
19
19
  : http("https://rpc.moonwell.fi/main/evm/1284"),
20
20
  indexerUrl: indexerUrl || "https://ponder.moonwell.fi",
21
+ lunarIndexerUrl: lunarIndexerUrl || "https://lunar-services-worker.moonwell.workers.dev",
21
22
  governanceIndexerUrl: governanceIndexerUrl ||
22
23
  "https://lunar-services-worker.moonwell.workers.dev",
23
24
  tokens,
@@ -1 +1 @@
1
- {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../../../environments/definitions/moonbeam/environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,iBAAiB,GAAG,CACxB,OAAkB,EAClB,UAAmB,EACnB,oBAA6B,EAC7B,EAAE,CACF,uBAAuB,CAAC;IACtB,GAAG,EAAE,UAAU;IACf,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE;QACL,GAAG,QAAQ;QACX,OAAO,EAAE;YACP,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,IAAI,CAAC,uCAAuC,CAAC,EAAE;SACxE;KACF;IACD,SAAS,EAAE,OAAO;QAChB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3C,CAAC,CAAC,IAAI,CAAC,uCAAuC,CAAC;IACjD,UAAU,EAAE,UAAU,IAAI,4BAA4B;IACtD,oBAAoB,EAClB,oBAAoB;QACpB,oDAAoD;IACtD,MAAM;IACN,OAAO;IACP,MAAM,EAAE,EAAE;IACV,aAAa,EAAE,EAAE;IACjB,SAAS;IACT,MAAM;CACP,CAAC,CAAC;AAEL,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC"}
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../../../environments/definitions/moonbeam/environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,iBAAiB,GAAG,CACxB,OAAkB,EAClB,UAAmB,EACnB,oBAA6B,EAC7B,eAAwB,EACxB,EAAE,CACF,uBAAuB,CAAC;IACtB,GAAG,EAAE,UAAU;IACf,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE;QACL,GAAG,QAAQ;QACX,OAAO,EAAE;YACP,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,IAAI,CAAC,uCAAuC,CAAC,EAAE;SACxE;KACF;IACD,SAAS,EAAE,OAAO;QAChB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3C,CAAC,CAAC,IAAI,CAAC,uCAAuC,CAAC;IACjD,UAAU,EAAE,UAAU,IAAI,4BAA4B;IACtD,eAAe,EACb,eAAe,IAAI,oDAAoD;IACzE,oBAAoB,EAClB,oBAAoB;QACpB,oDAAoD;IACtD,MAAM;IACN,OAAO;IACP,MAAM,EAAE,EAAE;IACV,aAAa,EAAE,EAAE;IACjB,SAAS;IACT,MAAM;CACP,CAAC,CAAC;AAEL,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC"}
@@ -8,7 +8,7 @@ import { morphoMarkets } from "./morpho-markets.js";
8
8
  import { vaults } from "./morpho-vaults.js";
9
9
  import { tokens } from "./tokens.js";
10
10
  const optimism = defineChain({ ...optimismChain, testnet: false });
11
- const createEnvironment = (rpcUrls, indexerUrl, governanceIndexerUrl) => createEnvironmentConfig({
11
+ const createEnvironment = (rpcUrls, indexerUrl, governanceIndexerUrl, lunarIndexerUrl) => createEnvironmentConfig({
12
12
  key: "optimism",
13
13
  name: "OP Mainnet",
14
14
  chain: {
@@ -21,6 +21,7 @@ const createEnvironment = (rpcUrls, indexerUrl, governanceIndexerUrl) => createE
21
21
  ? fallback(rpcUrls.map((url) => http(url)))
22
22
  : http("https://rpc.moonwell.fi/main/evm/10"),
23
23
  indexerUrl: indexerUrl || "https://ponder.moonwell.fi",
24
+ lunarIndexerUrl: lunarIndexerUrl || "https://lunar-services-worker.moonwell.workers.dev",
24
25
  governanceIndexerUrl: governanceIndexerUrl ||
25
26
  "https://lunar-services-worker.moonwell.workers.dev",
26
27
  tokens,
@@ -1 +1 @@
1
- {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../../../environments/definitions/optimism/environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACnD,OAAO,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,MAAM,QAAQ,GAAG,WAAW,CAAC,EAAE,GAAG,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;AAEnE,MAAM,iBAAiB,GAAG,CACxB,OAAkB,EAClB,UAAmB,EACnB,oBAA6B,EAC7B,EAAE,CACF,uBAAuB,CAAC;IACtB,GAAG,EAAE,UAAU;IACf,IAAI,EAAE,YAAY;IAClB,KAAK,EAAE;QACL,GAAG,QAAQ;QACX,OAAO,EAAE;YACP,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,IAAI,CAAC,qCAAqC,CAAC,EAAE;SACtE;KACF;IACD,SAAS,EAAE,OAAO;QAChB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3C,CAAC,CAAC,IAAI,CAAC,qCAAqC,CAAC;IAC/C,UAAU,EAAE,UAAU,IAAI,4BAA4B;IACtD,oBAAoB,EAClB,oBAAoB;QACpB,oDAAoD;IACtD,MAAM;IACN,OAAO;IACP,MAAM;IACN,aAAa;IACb,SAAS;IACT,MAAM;CACP,CAAC,CAAC;AAEL,OAAO,EACL,iBAAiB,EACjB,OAAO,EACP,MAAM,EACN,MAAM,EACN,aAAa,EACb,SAAS,EACT,MAAM,GACP,CAAC"}
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../../../environments/definitions/optimism/environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACnD,OAAO,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,MAAM,QAAQ,GAAG,WAAW,CAAC,EAAE,GAAG,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;AAEnE,MAAM,iBAAiB,GAAG,CACxB,OAAkB,EAClB,UAAmB,EACnB,oBAA6B,EAC7B,eAAwB,EACxB,EAAE,CACF,uBAAuB,CAAC;IACtB,GAAG,EAAE,UAAU;IACf,IAAI,EAAE,YAAY;IAClB,KAAK,EAAE;QACL,GAAG,QAAQ;QACX,OAAO,EAAE;YACP,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,IAAI,CAAC,qCAAqC,CAAC,EAAE;SACtE;KACF;IACD,SAAS,EAAE,OAAO;QAChB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3C,CAAC,CAAC,IAAI,CAAC,qCAAqC,CAAC;IAC/C,UAAU,EAAE,UAAU,IAAI,4BAA4B;IACtD,eAAe,EACb,eAAe,IAAI,oDAAoD;IACzE,oBAAoB,EAClB,oBAAoB;QACpB,oDAAoD;IACtD,MAAM;IACN,OAAO;IACP,MAAM;IACN,aAAa;IACb,SAAS;IACT,MAAM;CACP,CAAC,CAAC;AAEL,OAAO,EACL,iBAAiB,EACjB,OAAO,EACP,MAAM,EACN,MAAM,EACN,aAAa,EACb,SAAS,EACT,MAAM,GACP,CAAC"}
@@ -135,6 +135,7 @@ export const createEnvironmentConfig = (config) => {
135
135
  chain: config.chain,
136
136
  indexerUrl: config.indexerUrl,
137
137
  governanceIndexerUrl: config.governanceIndexerUrl,
138
+ lunarIndexerUrl: config.lunarIndexerUrl,
138
139
  tokens: tokenContracts,
139
140
  markets: marketContracts,
140
141
  vaults: vaultsContracts,