@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.
- package/CHANGELOG.md +16 -0
- package/_cjs/actions/core/markets/common.js +291 -5
- package/_cjs/actions/core/markets/common.js.map +1 -1
- package/_cjs/actions/core/markets/getMarketSnapshots.js +83 -3
- package/_cjs/actions/core/markets/getMarketSnapshots.js.map +1 -1
- package/_cjs/actions/core/user-positions/common.js +61 -1
- package/_cjs/actions/core/user-positions/common.js.map +1 -1
- package/_cjs/actions/core/user-positions/getUserPositionSnapshots.js +70 -2
- package/_cjs/actions/core/user-positions/getUserPositionSnapshots.js.map +1 -1
- package/_cjs/actions/lunar-indexer-client.js +164 -0
- package/_cjs/actions/lunar-indexer-client.js.map +1 -0
- package/_cjs/actions/lunar-indexer-transformers.js +47 -0
- package/_cjs/actions/lunar-indexer-transformers.js.map +1 -0
- package/_cjs/environments/definitions/base/environment.js +2 -1
- package/_cjs/environments/definitions/base/environment.js.map +1 -1
- package/_cjs/environments/definitions/moonbeam/environment.js +2 -1
- package/_cjs/environments/definitions/moonbeam/environment.js.map +1 -1
- package/_cjs/environments/definitions/optimism/environment.js +2 -1
- package/_cjs/environments/definitions/optimism/environment.js.map +1 -1
- package/_cjs/environments/types/config.js +1 -0
- package/_cjs/environments/types/config.js.map +1 -1
- package/_cjs/errors/version.js +1 -1
- package/_cjs/utils/lunar-indexer-helpers.js +27 -0
- package/_cjs/utils/lunar-indexer-helpers.js.map +1 -0
- package/_esm/actions/core/markets/common.js +302 -5
- package/_esm/actions/core/markets/common.js.map +1 -1
- package/_esm/actions/core/markets/getMarketSnapshots.js +87 -3
- package/_esm/actions/core/markets/getMarketSnapshots.js.map +1 -1
- package/_esm/actions/core/user-positions/common.js +74 -1
- package/_esm/actions/core/user-positions/common.js.map +1 -1
- package/_esm/actions/core/user-positions/getUserPositionSnapshots.js +100 -2
- package/_esm/actions/core/user-positions/getUserPositionSnapshots.js.map +1 -1
- package/_esm/actions/lunar-indexer-client.js +201 -0
- package/_esm/actions/lunar-indexer-client.js.map +1 -0
- package/_esm/actions/lunar-indexer-transformers.js +80 -0
- package/_esm/actions/lunar-indexer-transformers.js.map +1 -0
- package/_esm/environments/definitions/base/environment.js +2 -1
- package/_esm/environments/definitions/base/environment.js.map +1 -1
- package/_esm/environments/definitions/moonbeam/environment.js +2 -1
- package/_esm/environments/definitions/moonbeam/environment.js.map +1 -1
- package/_esm/environments/definitions/optimism/environment.js +2 -1
- package/_esm/environments/definitions/optimism/environment.js.map +1 -1
- package/_esm/environments/types/config.js +1 -0
- package/_esm/environments/types/config.js.map +1 -1
- package/_esm/errors/version.js +1 -1
- package/_esm/utils/lunar-indexer-helpers.js +48 -0
- package/_esm/utils/lunar-indexer-helpers.js.map +1 -0
- package/_types/actions/core/markets/common.d.ts.map +1 -1
- package/_types/actions/core/markets/getMarketSnapshots.d.ts +4 -0
- package/_types/actions/core/markets/getMarketSnapshots.d.ts.map +1 -1
- package/_types/actions/core/user-positions/common.d.ts.map +1 -1
- package/_types/actions/core/user-positions/getUserPositionSnapshots.d.ts +28 -0
- package/_types/actions/core/user-positions/getUserPositionSnapshots.d.ts.map +1 -1
- package/_types/actions/lunar-indexer-client.d.ts +197 -0
- package/_types/actions/lunar-indexer-client.d.ts.map +1 -0
- package/_types/actions/lunar-indexer-transformers.d.ts +40 -0
- package/_types/actions/lunar-indexer-transformers.d.ts.map +1 -0
- package/_types/environments/definitions/base/environment.d.ts +1 -1
- package/_types/environments/definitions/base/environment.d.ts.map +1 -1
- package/_types/environments/definitions/moonbeam/environment.d.ts +1 -1
- package/_types/environments/definitions/moonbeam/environment.d.ts.map +1 -1
- package/_types/environments/definitions/optimism/environment.d.ts +1 -1
- package/_types/environments/definitions/optimism/environment.d.ts.map +1 -1
- package/_types/environments/types/config.d.ts +2 -0
- package/_types/environments/types/config.d.ts.map +1 -1
- package/_types/errors/version.d.ts +1 -1
- package/_types/utils/lunar-indexer-helpers.d.ts +38 -0
- package/_types/utils/lunar-indexer-helpers.d.ts.map +1 -0
- package/actions/core/markets/common.ts +500 -5
- package/actions/core/markets/getMarketSnapshots.ts +153 -2
- package/actions/core/user-positions/common.ts +139 -6
- package/actions/core/user-positions/getUserPositionSnapshots.ts +175 -1
- package/actions/lunar-indexer-client.ts +409 -0
- package/actions/lunar-indexer-transformers.ts +113 -0
- package/environments/definitions/base/environment.ts +3 -0
- package/environments/definitions/moonbeam/environment.ts +3 -0
- package/environments/definitions/optimism/environment.ts +3 -0
- package/environments/types/config.ts +3 -0
- package/errors/version.ts +1 -1
- package/package.json +1 -1
- 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 [
|
|
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":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAElD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAG3E,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EAAE,MAIzC,EAAE,EAAE;IACH,MAAM,aAAa,GAAG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC;IAEzD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,CAAC,
|
|
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
|
|
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;
|
|
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;AAIhF,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,cAAc,GACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,6BAA6B,EAAE,MAAM,qCAAqC,CAAC;AAEpF,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAsBlB;;;GAGG;AACH,SAAS,kBAAkB,CACzB,MAAmC,EACnC,SAAkB,EAClB,OAAgB;IAEhB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;IACxB,MAAM,GAAG,GAAG,OAAO,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;IAElC,sEAAsE;IACtE,IAAI,SAAS,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACrD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IACrC,CAAC;IAED,4BAA4B;IAC5B,IAAI,KAAa,CAAC;IAClB,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,IAAI;YACP,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM;QACR,KAAK,IAAI;YACP,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM;QACR,KAAK,IAAI;YACP,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YACzC,MAAM;QACR,KAAK,KAAK;YACR,uDAAuD;YACvD,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YACzC,MAAM;QACR;YACE,iDAAiD;YACjD,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YACzC,MAAM;IACV,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AAC5C,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,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,CAC/B,IAAI,CAAC,WAAW,EAChB,WAAW,EACX,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,WAAW,CACjB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,0BAA0B,CACvC,WAAoB,EACpB,WAAwB,EACxB,MAAmC,EACnC,SAAkB,EAClB,OAAgB,EAChB,WAAgC;IAEhC,IAAI,WAAW,CAAC,eAAe,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,mCAAmC,CACtD,WAAW,EACX,WAAW,EACX,MAAM,EACN,SAAS,EACT,OAAO,EACP,WAAW,CACZ,CAAC;YACF,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3B,MAAM,KAAK,CAAC;YACd,CAAC;YACD,OAAO,CAAC,KAAK,CACX,6DAA6D,EAC7D,KAAK,CACN,CAAC;QACJ,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,MAAM,MAAM,GAAG,MAAM,oCAAoC,CACvD,WAAW,EACX,WAAW,CACZ,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,mCAAmC,CAChD,WAAoB,EACpB,WAAwB,EACxB,MAAmC,EACnC,eAAwB,EACxB,aAAsB,EACtB,cAAkC,IAAI;IAEtC,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,MAAM,GAAG,wBAAwB,CAAC;QACtC,OAAO,EAAE,WAAW,CAAC,eAAe;QACpC,OAAO,EAAE,wBAAwB;KAClC,CAAC,CAAC;IAEH,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,kBAAkB,CAC/C,MAAM,EACN,eAAe,EACf,aAAa,CACd,CAAC;IAEF,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAChD,WAAW,CAAC,WAAW,EAAE,EACzB;QACE,SAAS;QACT,OAAO;QACP,WAAW;QACX,OAAO,EAAE,WAAW,CAAC,OAAO;KAC7B,CACF,CAAC;IAEF,MAAM,SAAS,GAAG,6BAA6B,CAC7C,SAAS,EACT,WAAW,CAAC,OAAO,CACpB,CAAC;IAEF,sDAAsD;IACtD,MAAM,iBAAiB,GAAG,SAAS,CAAC,SAAS,CAC3C,CAAC,QAAQ,EAAE,EAAE,CACX,QAAQ,CAAC,cAAc,GAAG,CAAC;QAC3B,QAAQ,CAAC,eAAe,GAAG,CAAC;QAC5B,QAAQ,CAAC,kBAAkB,GAAG,CAAC,CAClC,CAAC;IAEF,IAAI,iBAAiB,KAAK,CAAC,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,SAAS,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;AAC5C,CAAC;AAED,KAAK,UAAU,oCAAoC,CACjD,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"}
|
|
@@ -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":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,EAAuC,MAAM,OAAO,CAAC;AA+JnE,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,YACE,OAAe,EACC,UAAmB,EACnB,QAAiB,EACjB,aAAqB;QAErC,KAAK,CAAC,OAAO,CAAC,CAAC;QAJf;;;;mBAAgB,UAAU;WAAS;QACnC;;;;mBAAgB,QAAQ;WAAS;QACjC;;;;mBAAgB,aAAa;WAAQ;QAGrC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAG,KAAmB,CAAC;QAEvC,MAAM,cAAc,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC;QAC5C,MAAM,UAAU,GACd,CAAC,CAAC,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,IAAI,GAAG,CAAC;QAC7D,MAAM,UAAU,GACd,CAAC,CAAC,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC;QAE9D,IAAI,cAAc,IAAI,UAAU,IAAI,UAAU,EAAE,CAAC;YAC/C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,0DAA0D;QAC1D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,iCAAiC;IACjC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC;AAE/C,+EAA+E;AAC/E,6BAA6B;AAC7B,+EAA+E;AAE/E,MAAM,OAAO,kBAAkB;IAG7B,YAAY,MAA0B;QAF9B;;;;;WAAsB;QAG5B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;YACzB,OAAO,EAAE,GAAG,MAAM,CAAC,OAAO,cAAc;YACxC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,wBAAwB;YACnD,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;SACF,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,OAAe;QAClC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACpC,gBAAgB,OAAO,EAAE,CAC1B,CAAC;YACF,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,iBAAiB,CACzB,yCAAyC,OAAO,EAAE,EAClD,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,EAC9D,gBAAgB,OAAO,EAAE,EACzB,KAAc,CACf,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CACf,OAAe,EACf,OAA6C;QAE7C,IAAI,CAAC;YACH,MAAM,MAAM,GAA2B,EAAE,CAAC;YAC1C,IAAI,OAAO,EAAE,KAAK;gBAAE,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC5D,IAAI,OAAO,EAAE,MAAM;gBAAE,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAEpD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAEpC,YAAY,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YACrC,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,iBAAiB,CACzB,oCAAoC,OAAO,EAAE,EAC7C,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,EAC9D,YAAY,OAAO,EAAE,EACrB,KAAc,CACf,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAS,CAAC,QAAgB;QAC9B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACpC,WAAW,QAAQ,EAAE,CACtB,CAAC;YACF,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,iBAAiB,CACzB,0BAA0B,QAAQ,EAAE,EACpC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,EAC9D,WAAW,QAAQ,EAAE,EACrB,KAAc,CACf,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CACtB,QAAgB,EAChB,OAA8B;QAE9B,IAAI,CAAC;YACH,MAAM,MAAM,GAA2B,EAAE,CAAC;YAC1C,IAAI,OAAO,EAAE,KAAK;gBAAE,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC5D,IAAI,OAAO,EAAE,MAAM;gBAAE,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YACpD,IAAI,OAAO,EAAE,WAAW;gBAAE,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;YACnE,IAAI,OAAO,EAAE,SAAS;gBAAE,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;YACxE,IAAI,OAAO,EAAE,OAAO;gBAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YAElE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAEpC,WAAW,QAAQ,YAAY,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAC/C,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,iBAAiB,CACzB,wCAAwC,QAAQ,EAAE,EAClD,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,EAC9D,WAAW,QAAQ,YAAY,EAC/B,KAAc,CACf,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CACd,OAAe,EACf,OAA6C;QAE7C,IAAI,CAAC;YACH,MAAM,MAAM,GAA2B,EAAE,CAAC;YAC1C,IAAI,OAAO,EAAE,KAAK;gBAAE,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC5D,IAAI,OAAO,EAAE,MAAM;gBAAE,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAEpD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAEpC,WAAW,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YACpC,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,iBAAiB,CACzB,mCAAmC,OAAO,EAAE,EAC5C,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,EAC9D,WAAW,OAAO,EAAE,EACpB,KAAc,CACf,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,OAAe;QAC5B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAa,UAAU,OAAO,EAAE,CAAC,CAAC;YACxE,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,iBAAiB,CACzB,yBAAyB,OAAO,EAAE,EAClC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,EAC9D,UAAU,OAAO,EAAE,EACnB,KAAc,CACf,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,mBAAmB,CACvB,cAAsB,EACtB,OAA8B;QAE9B,IAAI,CAAC;YACH,MAAM,MAAM,GAA2B;gBACrC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE;gBACvC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE;aACpC,CAAC;YACF,IAAI,OAAO,CAAC,WAAW;gBAAE,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;YAClE,IAAI,OAAO,CAAC,OAAO;gBAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YACjE,IAAI,OAAO,CAAC,MAAM;gBAAE,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAEnD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACpC,YAAY,cAAc,CAAC,WAAW,EAAE,YAAY,EACpD,EAAE,MAAM,EAAE,CACX,CAAC;YACF,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,iBAAiB,CACzB,yCAAyC,cAAc,EAAE,EACzD,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,EAC9D,YAAY,cAAc,YAAY,EACtC,KAAc,CACf,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAED,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAA0B;IAE1B,OAAO,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -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,
|
|
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,
|