@moonwell-fi/moonwell-sdk 0.20.5 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +55 -0
- package/README.md +9 -3
- package/_cjs/actions/beam/common.js +1 -2
- package/_cjs/actions/beam/common.js.map +1 -1
- package/_cjs/actions/core/markets/common.js +146 -96
- package/_cjs/actions/core/markets/common.js.map +1 -1
- package/_cjs/actions/core/markets/getMarketSnapshots.js +1 -83
- package/_cjs/actions/core/markets/getMarketSnapshots.js.map +1 -1
- package/_cjs/actions/core/user-positions/getUserPositionSnapshots.js +1 -59
- package/_cjs/actions/core/user-positions/getUserPositionSnapshots.js.map +1 -1
- package/_cjs/actions/governance/getCirculatingSupplySnapshots.js +1 -49
- package/_cjs/actions/governance/getCirculatingSupplySnapshots.js.map +1 -1
- package/_cjs/actions/governance/getDelegates.js +2 -7
- package/_cjs/actions/governance/getDelegates.js.map +1 -1
- package/_cjs/actions/governance/getGovernanceTokenInfo.js +7 -12
- package/_cjs/actions/governance/getGovernanceTokenInfo.js.map +1 -1
- package/_cjs/actions/governance/getStakingSnapshots.js +1 -41
- package/_cjs/actions/governance/getStakingSnapshots.js.map +1 -1
- package/_cjs/actions/governance/getUserVoteReceipt.js +5 -4
- package/_cjs/actions/governance/getUserVoteReceipt.js.map +1 -1
- package/_cjs/actions/governance/governor-api-client.js.map +1 -1
- package/_cjs/actions/governance/proposals/common.js +74 -7
- package/_cjs/actions/governance/proposals/common.js.map +1 -1
- package/_cjs/actions/governance/proposals/getProposal.js +6 -73
- package/_cjs/actions/governance/proposals/getProposal.js.map +1 -1
- package/_cjs/actions/governance/proposals/getProposals.js +12 -92
- package/_cjs/actions/governance/proposals/getProposals.js.map +1 -1
- package/_cjs/client/createMoonwellClient.js +17 -15
- package/_cjs/client/createMoonwellClient.js.map +1 -1
- package/_cjs/common/index.js +4 -4
- package/_cjs/common/index.js.map +1 -1
- package/_cjs/environments/definitions/governance.js +1 -15
- package/_cjs/environments/definitions/governance.js.map +1 -1
- package/_cjs/environments/index.js +28 -42
- package/_cjs/environments/index.js.map +1 -1
- package/_cjs/environments/types/config.js.map +1 -1
- package/_cjs/errors/version.js +1 -1
- package/_esm/actions/beam/common.js +3 -2
- package/_esm/actions/beam/common.js.map +1 -1
- package/_esm/actions/core/markets/common.js +192 -104
- package/_esm/actions/core/markets/common.js.map +1 -1
- package/_esm/actions/core/markets/getMarketSnapshots.js +1 -83
- package/_esm/actions/core/markets/getMarketSnapshots.js.map +1 -1
- package/_esm/actions/core/user-positions/getUserPositionSnapshots.js +3 -62
- package/_esm/actions/core/user-positions/getUserPositionSnapshots.js.map +1 -1
- package/_esm/actions/governance/getCirculatingSupplySnapshots.js +2 -50
- package/_esm/actions/governance/getCirculatingSupplySnapshots.js.map +1 -1
- package/_esm/actions/governance/getDelegates.js +8 -8
- package/_esm/actions/governance/getDelegates.js.map +1 -1
- package/_esm/actions/governance/getGovernanceTokenInfo.js +20 -13
- package/_esm/actions/governance/getGovernanceTokenInfo.js.map +1 -1
- package/_esm/actions/governance/getStakingSnapshots.js +1 -41
- package/_esm/actions/governance/getStakingSnapshots.js.map +1 -1
- package/_esm/actions/governance/getUserVoteReceipt.js +16 -5
- package/_esm/actions/governance/getUserVoteReceipt.js.map +1 -1
- package/_esm/actions/governance/governor-api-client.js +14 -5
- package/_esm/actions/governance/governor-api-client.js.map +1 -1
- package/_esm/actions/governance/proposals/common.js +134 -11
- package/_esm/actions/governance/proposals/common.js.map +1 -1
- package/_esm/actions/governance/proposals/getProposal.js +16 -93
- package/_esm/actions/governance/proposals/getProposal.js.map +1 -1
- package/_esm/actions/governance/proposals/getProposals.js +37 -132
- package/_esm/actions/governance/proposals/getProposals.js.map +1 -1
- package/_esm/actions/lunar-indexer-client.js +1 -1
- package/_esm/client/createMoonwellClient.js +24 -16
- package/_esm/client/createMoonwellClient.js.map +1 -1
- package/_esm/common/index.js +15 -4
- package/_esm/common/index.js.map +1 -1
- package/_esm/environments/definitions/governance.js +5 -16
- package/_esm/environments/definitions/governance.js.map +1 -1
- package/_esm/environments/index.js +2 -14
- package/_esm/environments/index.js.map +1 -1
- package/_esm/environments/types/config.js.map +1 -1
- package/_esm/errors/version.js +1 -1
- package/_types/actions/beam/common.d.ts +1 -1
- package/_types/actions/beam/common.d.ts.map +1 -1
- package/_types/actions/core/markets/common.d.ts.map +1 -1
- package/_types/actions/core/markets/getMarketSnapshots.d.ts.map +1 -1
- package/_types/actions/core/user-positions/getUserPositionSnapshots.d.ts +1 -2
- package/_types/actions/core/user-positions/getUserPositionSnapshots.d.ts.map +1 -1
- package/_types/actions/governance/getCirculatingSupplySnapshots.d.ts.map +1 -1
- package/_types/actions/governance/getGovernanceTokenInfo.d.ts.map +1 -1
- package/_types/actions/governance/getStakingSnapshots.d.ts.map +1 -1
- package/_types/actions/governance/getUserVoteReceipt.d.ts.map +1 -1
- package/_types/actions/governance/governor-api-client.d.ts +14 -5
- package/_types/actions/governance/governor-api-client.d.ts.map +1 -1
- package/_types/actions/governance/proposals/common.d.ts +41 -6
- package/_types/actions/governance/proposals/common.d.ts.map +1 -1
- package/_types/actions/governance/proposals/getProposal.d.ts +1 -1
- package/_types/actions/governance/proposals/getProposal.d.ts.map +1 -1
- package/_types/actions/governance/proposals/getProposals.d.ts +1 -1
- package/_types/actions/governance/proposals/getProposals.d.ts.map +1 -1
- package/_types/actions/lunar-indexer-client.d.ts +1 -1
- package/_types/client/createMoonwellClient.d.ts +9 -839
- package/_types/client/createMoonwellClient.d.ts.map +1 -1
- package/_types/common/index.d.ts +11 -0
- package/_types/common/index.d.ts.map +1 -1
- package/_types/environments/definitions/governance.d.ts +0 -14
- package/_types/environments/definitions/governance.d.ts.map +1 -1
- package/_types/environments/index.d.ts +5 -516
- package/_types/environments/index.d.ts.map +1 -1
- package/_types/environments/types/config.d.ts +14 -0
- package/_types/environments/types/config.d.ts.map +1 -1
- package/_types/errors/version.d.ts +1 -1
- package/actions/beam/common.ts +4 -9
- package/actions/core/markets/common.ts +307 -166
- package/actions/core/markets/getMarketSnapshots.ts +1 -118
- package/actions/core/user-positions/getUserPositionSnapshots.ts +2 -91
- package/actions/governance/getCirculatingSupplySnapshots.ts +3 -72
- package/actions/governance/getDelegates.ts +8 -8
- package/actions/governance/getGovernanceTokenInfo.ts +23 -15
- package/actions/governance/getStakingSnapshots.ts +1 -59
- package/actions/governance/getUserVoteReceipt.ts +19 -5
- package/actions/governance/governor-api-client.ts +14 -5
- package/actions/governance/proposals/common.ts +155 -11
- package/actions/governance/proposals/getProposal.ts +29 -112
- package/actions/governance/proposals/getProposals.ts +52 -153
- package/actions/lunar-indexer-client.ts +1 -1
- package/client/createMoonwellClient.ts +32 -40
- package/common/index.ts +17 -6
- package/environments/definitions/governance.ts +5 -16
- package/environments/index.ts +28 -70
- package/environments/types/config.ts +14 -0
- package/errors/version.ts +1 -1
- package/package.json +2 -2
- package/_cjs/environments/definitions/moonbeam/contracts.js +0 -22
- package/_cjs/environments/definitions/moonbeam/contracts.js.map +0 -1
- package/_cjs/environments/definitions/moonbeam/core-markets.js +0 -65
- package/_cjs/environments/definitions/moonbeam/core-markets.js.map +0 -1
- package/_cjs/environments/definitions/moonbeam/custom.js +0 -24
- package/_cjs/environments/definitions/moonbeam/custom.js.map +0 -1
- package/_cjs/environments/definitions/moonbeam/environment.js +0 -38
- package/_cjs/environments/definitions/moonbeam/environment.js.map +0 -1
- package/_cjs/environments/definitions/moonbeam/tokens.js +0 -176
- package/_cjs/environments/definitions/moonbeam/tokens.js.map +0 -1
- package/_cjs/environments/definitions/moonriver/contracts.js +0 -19
- package/_cjs/environments/definitions/moonriver/contracts.js.map +0 -1
- package/_cjs/environments/definitions/moonriver/core-markets.js +0 -46
- package/_cjs/environments/definitions/moonriver/core-markets.js.map +0 -1
- package/_cjs/environments/definitions/moonriver/custom.js +0 -12
- package/_cjs/environments/definitions/moonriver/custom.js.map +0 -1
- package/_cjs/environments/definitions/moonriver/environment.js +0 -36
- package/_cjs/environments/definitions/moonriver/environment.js.map +0 -1
- package/_cjs/environments/definitions/moonriver/tokens.js +0 -110
- package/_cjs/environments/definitions/moonriver/tokens.js.map +0 -1
- package/_esm/environments/definitions/moonbeam/contracts.js +0 -19
- package/_esm/environments/definitions/moonbeam/contracts.js.map +0 -1
- package/_esm/environments/definitions/moonbeam/core-markets.js +0 -62
- package/_esm/environments/definitions/moonbeam/core-markets.js.map +0 -1
- package/_esm/environments/definitions/moonbeam/custom.js +0 -21
- package/_esm/environments/definitions/moonbeam/custom.js.map +0 -1
- package/_esm/environments/definitions/moonbeam/environment.js +0 -32
- package/_esm/environments/definitions/moonbeam/environment.js.map +0 -1
- package/_esm/environments/definitions/moonbeam/tokens.js +0 -173
- package/_esm/environments/definitions/moonbeam/tokens.js.map +0 -1
- package/_esm/environments/definitions/moonriver/contracts.js +0 -16
- package/_esm/environments/definitions/moonriver/contracts.js.map +0 -1
- package/_esm/environments/definitions/moonriver/core-markets.js +0 -43
- package/_esm/environments/definitions/moonriver/core-markets.js.map +0 -1
- package/_esm/environments/definitions/moonriver/custom.js +0 -9
- package/_esm/environments/definitions/moonriver/custom.js.map +0 -1
- package/_esm/environments/definitions/moonriver/environment.js +0 -31
- package/_esm/environments/definitions/moonriver/environment.js.map +0 -1
- package/_esm/environments/definitions/moonriver/tokens.js +0 -107
- package/_esm/environments/definitions/moonriver/tokens.js.map +0 -1
- package/_types/environments/definitions/moonbeam/contracts.d.ts +0 -14
- package/_types/environments/definitions/moonbeam/contracts.d.ts.map +0 -1
- package/_types/environments/definitions/moonbeam/core-markets.d.ts +0 -57
- package/_types/environments/definitions/moonbeam/core-markets.d.ts.map +0 -1
- package/_types/environments/definitions/moonbeam/custom.d.ts +0 -25
- package/_types/environments/definitions/moonbeam/custom.d.ts.map +0 -1
- package/_types/environments/definitions/moonbeam/environment.d.ts +0 -265
- package/_types/environments/definitions/moonbeam/environment.d.ts.map +0 -1
- package/_types/environments/definitions/moonbeam/tokens.d.ts +0 -171
- package/_types/environments/definitions/moonbeam/tokens.d.ts.map +0 -1
- package/_types/environments/definitions/moonriver/contracts.d.ts +0 -11
- package/_types/environments/definitions/moonriver/contracts.d.ts.map +0 -1
- package/_types/environments/definitions/moonriver/core-markets.d.ts +0 -38
- package/_types/environments/definitions/moonriver/core-markets.d.ts.map +0 -1
- package/_types/environments/definitions/moonriver/custom.d.ts +0 -8
- package/_types/environments/definitions/moonriver/custom.d.ts.map +0 -1
- package/_types/environments/definitions/moonriver/environment.d.ts +0 -159
- package/_types/environments/definitions/moonriver/environment.d.ts.map +0 -1
- package/_types/environments/definitions/moonriver/tokens.d.ts +0 -105
- package/_types/environments/definitions/moonriver/tokens.d.ts.map +0 -1
- package/environments/definitions/moonbeam/contracts.ts +0 -19
- package/environments/definitions/moonbeam/core-markets.ts +0 -62
- package/environments/definitions/moonbeam/custom.ts +0 -21
- package/environments/definitions/moonbeam/environment.ts +0 -39
- package/environments/definitions/moonbeam/tokens.ts +0 -173
- package/environments/definitions/moonriver/contracts.ts +0 -16
- package/environments/definitions/moonriver/core-markets.ts +0 -43
- package/environments/definitions/moonriver/custom.ts +0 -9
- package/environments/definitions/moonriver/environment.ts +0 -38
- package/environments/definitions/moonriver/tokens.ts +0 -107
|
@@ -11,7 +11,6 @@ import { buildMarketId } from "../../../common/lunar-indexer-helpers.js";
|
|
|
11
11
|
import type { NetworkParameterType } from "../../../common/types.js";
|
|
12
12
|
import type { Chain, Environment } from "../../../environments/index.js";
|
|
13
13
|
import type { MarketSnapshot } from "../../../types/market.js";
|
|
14
|
-
import { postWithRetry } from "../../axiosWithRetry.js";
|
|
15
14
|
import {
|
|
16
15
|
DEFAULT_LUNAR_TIMEOUT_MS,
|
|
17
16
|
createLunarIndexerClient,
|
|
@@ -141,23 +140,7 @@ async function fetchCoreMarketSnapshots(
|
|
|
141
140
|
endTime?: number,
|
|
142
141
|
): Promise<MarketSnapshot[]> {
|
|
143
142
|
if (!environment.lunarIndexerUrl) {
|
|
144
|
-
|
|
145
|
-
try {
|
|
146
|
-
return await fetchCoreMarketSnapshotsFromPonder(
|
|
147
|
-
marketAddress,
|
|
148
|
-
environment,
|
|
149
|
-
);
|
|
150
|
-
} catch (error) {
|
|
151
|
-
console.warn(
|
|
152
|
-
`[getMarketSnapshots] Ponder failed for chain ${environment.chainId}:`,
|
|
153
|
-
error,
|
|
154
|
-
);
|
|
155
|
-
environment.onError?.(error, {
|
|
156
|
-
source: "market-snapshots-ponder",
|
|
157
|
-
chainId: environment.chainId,
|
|
158
|
-
});
|
|
159
|
-
return [];
|
|
160
|
-
}
|
|
143
|
+
return [];
|
|
161
144
|
}
|
|
162
145
|
try {
|
|
163
146
|
return await fetchCoreMarketSnapshotsFromLunar(
|
|
@@ -180,106 +163,6 @@ async function fetchCoreMarketSnapshots(
|
|
|
180
163
|
}
|
|
181
164
|
}
|
|
182
165
|
|
|
183
|
-
async function fetchCoreMarketSnapshotsFromPonder(
|
|
184
|
-
marketAddress: string,
|
|
185
|
-
environment: Environment,
|
|
186
|
-
): Promise<MarketSnapshot[]> {
|
|
187
|
-
if (!environment.indexerUrl) return [];
|
|
188
|
-
|
|
189
|
-
interface MarketDailyData {
|
|
190
|
-
totalBorrows: number;
|
|
191
|
-
totalBorrowsUSD: number;
|
|
192
|
-
totalSupplies: number;
|
|
193
|
-
totalSuppliesUSD: number;
|
|
194
|
-
totalLiquidity: number;
|
|
195
|
-
totalLiquidityUSD: number;
|
|
196
|
-
baseSupplyApy: number;
|
|
197
|
-
baseBorrowApy: number;
|
|
198
|
-
timestamp: number;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
const dailyData: MarketDailyData[] = [];
|
|
202
|
-
let hasNextPage = true;
|
|
203
|
-
let endCursor: string | undefined;
|
|
204
|
-
|
|
205
|
-
while (hasNextPage) {
|
|
206
|
-
const result = await postWithRetry<{
|
|
207
|
-
data: {
|
|
208
|
-
marketDailySnapshots: {
|
|
209
|
-
items: MarketDailyData[];
|
|
210
|
-
pageInfo: { hasNextPage: boolean; endCursor: string };
|
|
211
|
-
};
|
|
212
|
-
};
|
|
213
|
-
}>(environment.indexerUrl, {
|
|
214
|
-
query: `
|
|
215
|
-
query {
|
|
216
|
-
marketDailySnapshots (
|
|
217
|
-
limit: 1000,
|
|
218
|
-
orderBy: "timestamp"
|
|
219
|
-
orderDirection: "desc"
|
|
220
|
-
where: {marketAddress: "${marketAddress.toLowerCase()}", chainId: ${environment.chainId}}
|
|
221
|
-
${endCursor ? `after: "${endCursor}"` : ""}
|
|
222
|
-
) {
|
|
223
|
-
items {
|
|
224
|
-
totalBorrows
|
|
225
|
-
totalBorrowsUSD
|
|
226
|
-
totalSupplies
|
|
227
|
-
totalSuppliesUSD
|
|
228
|
-
totalLiquidity
|
|
229
|
-
totalLiquidityUSD
|
|
230
|
-
baseSupplyApy
|
|
231
|
-
baseBorrowApy
|
|
232
|
-
timestamp
|
|
233
|
-
}
|
|
234
|
-
pageInfo {
|
|
235
|
-
hasNextPage
|
|
236
|
-
endCursor
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
`,
|
|
241
|
-
});
|
|
242
|
-
|
|
243
|
-
dailyData.push(
|
|
244
|
-
...result.data.data.marketDailySnapshots.items.filter(
|
|
245
|
-
(f: { timestamp: number }) => isStartOfDay(f.timestamp),
|
|
246
|
-
),
|
|
247
|
-
);
|
|
248
|
-
hasNextPage = result.data.data.marketDailySnapshots.pageInfo.hasNextPage;
|
|
249
|
-
endCursor = result.data.data.marketDailySnapshots.pageInfo.endCursor;
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
if (dailyData.length === 0) return [];
|
|
253
|
-
|
|
254
|
-
return dailyData.map((point) => {
|
|
255
|
-
const supplied = Number(point.totalSupplies);
|
|
256
|
-
const borrow = Number(point.totalBorrows);
|
|
257
|
-
const borrowUsd = Number(point.totalBorrowsUSD);
|
|
258
|
-
const suppliedUsd = Number(point.totalSuppliesUSD);
|
|
259
|
-
const liquidity = Math.max(point.totalLiquidity, 0);
|
|
260
|
-
const liquidityUsd = Math.max(point.totalLiquidityUSD, 0);
|
|
261
|
-
const price = suppliedUsd / supplied;
|
|
262
|
-
|
|
263
|
-
return {
|
|
264
|
-
marketId: marketAddress.toLowerCase(),
|
|
265
|
-
chainId: environment.chainId,
|
|
266
|
-
timestamp: point.timestamp * 1000,
|
|
267
|
-
totalSupply: supplied,
|
|
268
|
-
totalSupplyUsd: suppliedUsd,
|
|
269
|
-
totalBorrows: borrow,
|
|
270
|
-
totalBorrowsUsd: borrowUsd,
|
|
271
|
-
totalLiquidity: liquidity,
|
|
272
|
-
totalLiquidityUsd: liquidityUsd,
|
|
273
|
-
totalReallocatableLiquidity: 0,
|
|
274
|
-
totalReallocatableLiquidityUsd: 0,
|
|
275
|
-
baseSupplyApy: point.baseSupplyApy,
|
|
276
|
-
baseBorrowApy: point.baseBorrowApy,
|
|
277
|
-
collateralTokenPrice: price,
|
|
278
|
-
loanTokenPrice: price,
|
|
279
|
-
};
|
|
280
|
-
});
|
|
281
|
-
}
|
|
282
|
-
|
|
283
166
|
async function fetchCoreMarketSnapshotsFromLunar(
|
|
284
167
|
marketAddress: string,
|
|
285
168
|
environment: Environment,
|
|
@@ -5,13 +5,11 @@ import {
|
|
|
5
5
|
applyGranularity,
|
|
6
6
|
calculateTimeRange,
|
|
7
7
|
getEnvironmentFromArgs,
|
|
8
|
-
isStartOfDay,
|
|
9
8
|
toApiGranularity,
|
|
10
9
|
} from "../../../common/index.js";
|
|
11
10
|
import type { NetworkParameterType } from "../../../common/types.js";
|
|
12
11
|
import type { Chain, Environment } from "../../../environments/index.js";
|
|
13
12
|
import type { UserPositionSnapshot } from "../../../types/userPosition.js";
|
|
14
|
-
import { postWithRetry } from "../../axiosWithRetry.js";
|
|
15
13
|
import {
|
|
16
14
|
DEFAULT_LUNAR_TIMEOUT_MS,
|
|
17
15
|
createLunarIndexerClient,
|
|
@@ -54,8 +52,7 @@ export type GetUserPositionSnapshotsReturnType = Promise<
|
|
|
54
52
|
* @remarks
|
|
55
53
|
* - Default behavior (no time parameters): Returns 365 days of history
|
|
56
54
|
* - Parameter priority: Custom timestamps > period > default (365 days)
|
|
57
|
-
* -
|
|
58
|
-
* - Snapshots are filtered to start-of-day for "1d" granularity
|
|
55
|
+
* - Environments without a Lunar Indexer configured return an empty array
|
|
59
56
|
*/
|
|
60
57
|
export async function getUserPositionSnapshots<
|
|
61
58
|
environments,
|
|
@@ -89,23 +86,7 @@ async function fetchUserPositionSnapshots(
|
|
|
89
86
|
granularity?: "6h" | "1d",
|
|
90
87
|
): Promise<UserPositionSnapshot[]> {
|
|
91
88
|
if (!environment.lunarIndexerUrl) {
|
|
92
|
-
|
|
93
|
-
try {
|
|
94
|
-
return await fetchUserPositionSnapshotsFromPonder(
|
|
95
|
-
userAddress,
|
|
96
|
-
environment,
|
|
97
|
-
);
|
|
98
|
-
} catch (error) {
|
|
99
|
-
console.warn(
|
|
100
|
-
`[getUserPositionSnapshots] Ponder failed for chain ${environment.chainId}:`,
|
|
101
|
-
error,
|
|
102
|
-
);
|
|
103
|
-
environment.onError?.(error, {
|
|
104
|
-
source: "user-position-snapshots-ponder",
|
|
105
|
-
chainId: environment.chainId,
|
|
106
|
-
});
|
|
107
|
-
return [];
|
|
108
|
-
}
|
|
89
|
+
return [];
|
|
109
90
|
}
|
|
110
91
|
try {
|
|
111
92
|
return await fetchUserPositionSnapshotsFromLunar(
|
|
@@ -186,73 +167,3 @@ async function fetchUserPositionSnapshotsFromLunar(
|
|
|
186
167
|
resolvedGranularity,
|
|
187
168
|
);
|
|
188
169
|
}
|
|
189
|
-
|
|
190
|
-
async function fetchUserPositionSnapshotsFromPonder(
|
|
191
|
-
userAddress: Address,
|
|
192
|
-
environment: Environment,
|
|
193
|
-
): Promise<UserPositionSnapshot[]> {
|
|
194
|
-
if (!environment.indexerUrl) return [];
|
|
195
|
-
|
|
196
|
-
interface UserDailyData {
|
|
197
|
-
totalBorrowsUSD: string;
|
|
198
|
-
totalSuppliesUSD: string;
|
|
199
|
-
totalCollateralUSD: string;
|
|
200
|
-
timestamp: number;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
const dailyData: UserDailyData[] = [];
|
|
204
|
-
let hasNextPage = true;
|
|
205
|
-
let endCursor: string | undefined;
|
|
206
|
-
|
|
207
|
-
while (hasNextPage) {
|
|
208
|
-
const result = await postWithRetry<{
|
|
209
|
-
data: {
|
|
210
|
-
accountDailySnapshots: {
|
|
211
|
-
items: UserDailyData[];
|
|
212
|
-
pageInfo: { hasNextPage: boolean; endCursor: string };
|
|
213
|
-
};
|
|
214
|
-
};
|
|
215
|
-
}>(environment.indexerUrl, {
|
|
216
|
-
query: `
|
|
217
|
-
query {
|
|
218
|
-
accountDailySnapshots(
|
|
219
|
-
limit: 365,
|
|
220
|
-
orderDirection: "desc",
|
|
221
|
-
orderBy: "timestamp",
|
|
222
|
-
where: { accountAddress: "${userAddress.toLowerCase()}", chainId: ${environment.chainId} }
|
|
223
|
-
${endCursor ? `after: "${endCursor}"` : ""}
|
|
224
|
-
) {
|
|
225
|
-
items {
|
|
226
|
-
timestamp,
|
|
227
|
-
totalBorrowsUSD,
|
|
228
|
-
totalSuppliesUSD,
|
|
229
|
-
totalCollateralUSD,
|
|
230
|
-
}
|
|
231
|
-
pageInfo {
|
|
232
|
-
hasNextPage
|
|
233
|
-
endCursor
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
`,
|
|
238
|
-
});
|
|
239
|
-
|
|
240
|
-
dailyData.push(
|
|
241
|
-
...result.data.data.accountDailySnapshots.items.filter(
|
|
242
|
-
(f: { timestamp: number }) => isStartOfDay(f.timestamp),
|
|
243
|
-
),
|
|
244
|
-
);
|
|
245
|
-
hasNextPage = result.data.data.accountDailySnapshots.pageInfo.hasNextPage;
|
|
246
|
-
endCursor = result.data.data.accountDailySnapshots.pageInfo.endCursor;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
if (dailyData.length === 0) return [];
|
|
250
|
-
|
|
251
|
-
return dailyData.map((point) => ({
|
|
252
|
-
chainId: environment.chainId,
|
|
253
|
-
timestamp: point.timestamp * 1000,
|
|
254
|
-
totalSupplyUsd: Number(point.totalSuppliesUSD),
|
|
255
|
-
totalBorrowsUsd: Number(point.totalBorrowsUSD),
|
|
256
|
-
totalCollateralUsd: Number(point.totalCollateralUSD),
|
|
257
|
-
}));
|
|
258
|
-
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { MoonwellClient } from "../../client/createMoonwellClient.js";
|
|
2
2
|
import { getEnvironmentFromArgs } from "../../common/index.js";
|
|
3
3
|
import type { OptionalNetworkParameterType } from "../../common/types.js";
|
|
4
|
-
import type { Chain
|
|
4
|
+
import type { Chain } from "../../environments/index.js";
|
|
5
5
|
import type { CirculatingSupplySnapshot } from "../../types/circulatingSupply.js";
|
|
6
|
-
import { getWithRetry
|
|
6
|
+
import { getWithRetry } from "../axiosWithRetry.js";
|
|
7
7
|
|
|
8
8
|
export type GetCirculatingSupplySnapshotsParameters<
|
|
9
9
|
environments,
|
|
@@ -74,9 +74,7 @@ export async function getCirculatingSupplySnapshots<
|
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
if (!environment.lunarIndexerUrl) {
|
|
77
|
-
return
|
|
78
|
-
? fetchCirculatingSupplyFromPonder(environment)
|
|
79
|
-
: [];
|
|
77
|
+
return [];
|
|
80
78
|
}
|
|
81
79
|
|
|
82
80
|
try {
|
|
@@ -112,70 +110,3 @@ export async function getCirculatingSupplySnapshots<
|
|
|
112
110
|
return [];
|
|
113
111
|
}
|
|
114
112
|
}
|
|
115
|
-
|
|
116
|
-
async function fetchCirculatingSupplyFromPonder(
|
|
117
|
-
environment: Environment,
|
|
118
|
-
): Promise<CirculatingSupplySnapshot[]> {
|
|
119
|
-
if (!environment.indexerUrl) return [];
|
|
120
|
-
try {
|
|
121
|
-
const response = await postWithRetry<{
|
|
122
|
-
data: {
|
|
123
|
-
circulatingSupplyDailySnapshots: {
|
|
124
|
-
items: {
|
|
125
|
-
chainId: number;
|
|
126
|
-
tokenAddress: string;
|
|
127
|
-
circulatingSupply: number;
|
|
128
|
-
timestamp: number;
|
|
129
|
-
}[];
|
|
130
|
-
};
|
|
131
|
-
};
|
|
132
|
-
}>(environment.indexerUrl, {
|
|
133
|
-
query: `
|
|
134
|
-
{
|
|
135
|
-
circulatingSupplyDailySnapshots(
|
|
136
|
-
where: { chainId: ${environment.chainId} }
|
|
137
|
-
orderBy: "timestamp"
|
|
138
|
-
orderDirection: "desc"
|
|
139
|
-
limit: 1000
|
|
140
|
-
) {
|
|
141
|
-
items {
|
|
142
|
-
chainId
|
|
143
|
-
tokenAddress
|
|
144
|
-
circulatingSupply
|
|
145
|
-
timestamp
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
`,
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
if (
|
|
153
|
-
response.status === 200 &&
|
|
154
|
-
response.data?.data?.circulatingSupplyDailySnapshots
|
|
155
|
-
) {
|
|
156
|
-
return response.data.data.circulatingSupplyDailySnapshots.items.flatMap(
|
|
157
|
-
(item) => {
|
|
158
|
-
const token = Object.values(environment.config.tokens).find(
|
|
159
|
-
(t) => t.address.toLowerCase() === item.tokenAddress.toLowerCase(),
|
|
160
|
-
);
|
|
161
|
-
if (!token) return [];
|
|
162
|
-
return [
|
|
163
|
-
{
|
|
164
|
-
chainId: item.chainId,
|
|
165
|
-
token,
|
|
166
|
-
circulatingSupply: item.circulatingSupply,
|
|
167
|
-
timestamp: item.timestamp,
|
|
168
|
-
},
|
|
169
|
-
];
|
|
170
|
-
},
|
|
171
|
-
);
|
|
172
|
-
}
|
|
173
|
-
return [];
|
|
174
|
-
} catch (ex) {
|
|
175
|
-
console.error(
|
|
176
|
-
"An error occurred while fetching getCirculatingSupplySnapshots...",
|
|
177
|
-
ex,
|
|
178
|
-
);
|
|
179
|
-
return [];
|
|
180
|
-
}
|
|
181
|
-
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { isAddress } from "viem";
|
|
2
|
-
import { base, mainnet,
|
|
2
|
+
import { base, mainnet, optimism } from "viem/chains";
|
|
3
3
|
import type { MoonwellClient } from "../../client/createMoonwellClient.js";
|
|
4
4
|
import {
|
|
5
5
|
type Environment,
|
|
@@ -23,17 +23,17 @@ export async function getDelegates(
|
|
|
23
23
|
): GetDelegatesReturnType {
|
|
24
24
|
const logId = logger.start("getDelegates", "Starting to get delegates...");
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
// Any environment resolves the same `governanceIndexerUrl`; the Ethereum hub
|
|
27
|
+
// replaces Moonbeam here now that the sunset chain is gone (MOO-551).
|
|
28
|
+
const governanceEnvironment = publicEnvironments.ethereum;
|
|
27
29
|
|
|
28
30
|
const apiVoters = await fetchAllVoters(governanceEnvironment);
|
|
29
31
|
const forumProfiles = await getForumProfiles();
|
|
30
32
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
mainnet.id,
|
|
36
|
-
] as const;
|
|
33
|
+
// Moonbeam dropped with the sunset: the chain is halted, so it can no longer
|
|
34
|
+
// serve `getUserVotingPower`. Delegate totals therefore no longer include any
|
|
35
|
+
// WELL that remained on Moonbeam.
|
|
36
|
+
const targetChainIds = [base.id, optimism.id, mainnet.id] as const;
|
|
37
37
|
const envs = Object.values(client.environments as Environment[]).filter(
|
|
38
38
|
(env) =>
|
|
39
39
|
env.contracts.views !== undefined &&
|
|
@@ -19,6 +19,8 @@ export type GetGovernanceTokenInfoReturnType = Promise<
|
|
|
19
19
|
|
|
20
20
|
export async function getGovernanceTokenInfo(
|
|
21
21
|
_client: MoonwellClient,
|
|
22
|
+
// Retained for API compatibility, but WELL is the only governance token left
|
|
23
|
+
// now that MFAM went with Moonriver (MOO-551), so there is nothing to branch on.
|
|
22
24
|
args: GetGovernanceTokenInfoParameters,
|
|
23
25
|
): GetGovernanceTokenInfoReturnType {
|
|
24
26
|
const logId = logger.start(
|
|
@@ -26,22 +28,28 @@ export async function getGovernanceTokenInfo(
|
|
|
26
28
|
"Starting to get governance token info...",
|
|
27
29
|
);
|
|
28
30
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
// TypeScript already narrows `GovernanceToken` to "WELL", but a JS consumer
|
|
32
|
+
// still passing "MFAM" would otherwise receive WELL's supply as a normal
|
|
33
|
+
// success — silently wrong data where TS consumers get a compile error.
|
|
34
|
+
// Reject it rather than let the removed token look like it still resolves.
|
|
35
|
+
if (args.governanceToken !== undefined && args.governanceToken !== "WELL") {
|
|
33
36
|
logger.end(logId);
|
|
37
|
+
throw new Error(
|
|
38
|
+
`Unsupported governance token "${args.governanceToken}". MFAM was removed with the Moonriver sunset (MOO-551); WELL is the only governance token.`,
|
|
39
|
+
);
|
|
40
|
+
}
|
|
34
41
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
42
|
+
// WELL supply used to be read from Moonbeam, the original mint. That chain is
|
|
43
|
+
// halted (MOO-551), so the read now targets the Ethereum multigov hub — the
|
|
44
|
+
// home of live governance. Note this reports the hub's xWELL supply rather
|
|
45
|
+
// than Moonbeam's historical total, so the number can differ from pre-sunset
|
|
46
|
+
// releases. MFAM is gone entirely: Apollo governance ended with Moonriver.
|
|
47
|
+
const totalSupply =
|
|
48
|
+
await publicEnvironments.ethereum.contracts.governanceToken.read.totalSupply();
|
|
41
49
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
}
|
|
50
|
+
logger.end(logId);
|
|
51
|
+
|
|
52
|
+
return {
|
|
53
|
+
totalSupply: new Amount(totalSupply || 0n, 18),
|
|
54
|
+
};
|
|
47
55
|
}
|
|
@@ -9,7 +9,6 @@ import {
|
|
|
9
9
|
import type { NetworkParameterType } from "../../common/types.js";
|
|
10
10
|
import type { Chain } from "../../environments/index.js";
|
|
11
11
|
import type { StakingSnapshot } from "../../types/staking.js";
|
|
12
|
-
import { postWithRetry } from "../axiosWithRetry.js";
|
|
13
12
|
import {
|
|
14
13
|
DEFAULT_LUNAR_TIMEOUT_MS,
|
|
15
14
|
createLunarIndexerClient,
|
|
@@ -47,18 +46,7 @@ export async function getStakingSnapshots<
|
|
|
47
46
|
} = (args ?? {}) as GetStakingSnapshotsParameters<environments, undefined>;
|
|
48
47
|
|
|
49
48
|
if (!environment.lunarIndexerUrl) {
|
|
50
|
-
|
|
51
|
-
period,
|
|
52
|
-
customStartTime,
|
|
53
|
-
customEndTime,
|
|
54
|
-
);
|
|
55
|
-
return environment.indexerUrl
|
|
56
|
-
? fetchStakingSnapshotsFromPonder(
|
|
57
|
-
environment.chainId,
|
|
58
|
-
environment.indexerUrl,
|
|
59
|
-
startTime,
|
|
60
|
-
)
|
|
61
|
-
: [];
|
|
49
|
+
return [];
|
|
62
50
|
}
|
|
63
51
|
|
|
64
52
|
try {
|
|
@@ -122,49 +110,3 @@ async function fetchStakingSnapshotsFromLunar(
|
|
|
122
110
|
allSnapshots.sort((a, b) => a.timestamp - b.timestamp);
|
|
123
111
|
return applyGranularity(allSnapshots, granularity);
|
|
124
112
|
}
|
|
125
|
-
|
|
126
|
-
async function fetchStakingSnapshotsFromPonder(
|
|
127
|
-
chainId: number,
|
|
128
|
-
indexerUrl: string,
|
|
129
|
-
startTime?: number,
|
|
130
|
-
): Promise<StakingSnapshot[]> {
|
|
131
|
-
try {
|
|
132
|
-
const response = await postWithRetry<{
|
|
133
|
-
data: {
|
|
134
|
-
stakingDailySnapshots: {
|
|
135
|
-
items: StakingSnapshot[];
|
|
136
|
-
};
|
|
137
|
-
};
|
|
138
|
-
}>(indexerUrl, {
|
|
139
|
-
query: `
|
|
140
|
-
query {
|
|
141
|
-
stakingDailySnapshots(
|
|
142
|
-
limit: 365,
|
|
143
|
-
orderBy: "timestamp"
|
|
144
|
-
orderDirection: "desc"
|
|
145
|
-
where: {chainId: ${chainId}}
|
|
146
|
-
) {
|
|
147
|
-
items {
|
|
148
|
-
chainId
|
|
149
|
-
totalStaked
|
|
150
|
-
totalStakedUSD
|
|
151
|
-
timestamp
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
`,
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
if (response.status === 200 && response.data?.data?.stakingDailySnapshots) {
|
|
159
|
-
const items = response.data.data.stakingDailySnapshots.items;
|
|
160
|
-
return startTime
|
|
161
|
-
? items.filter((item) => item.timestamp >= startTime)
|
|
162
|
-
: items;
|
|
163
|
-
} else {
|
|
164
|
-
return [];
|
|
165
|
-
}
|
|
166
|
-
} catch (ex) {
|
|
167
|
-
console.error("An error occured while fetching getStakingSnapshots...", ex);
|
|
168
|
-
return [];
|
|
169
|
-
}
|
|
170
|
-
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { Address, Chain } from "viem";
|
|
2
2
|
import type { MoonwellClient } from "../../client/createMoonwellClient.js";
|
|
3
|
-
import { Amount
|
|
3
|
+
import { Amount } from "../../common/index.js";
|
|
4
4
|
import type { NetworkParameterType } from "../../common/types.js";
|
|
5
|
+
import type { Environment } from "../../environments/index.js";
|
|
5
6
|
import type { VoteReceipt } from "../../types/voteReceipt.js";
|
|
6
7
|
import {
|
|
7
8
|
type ApiVoteReceipt,
|
|
@@ -10,6 +11,7 @@ import {
|
|
|
10
11
|
fetchUserVoteReceipt,
|
|
11
12
|
isNotFoundError,
|
|
12
13
|
} from "./governor-api-client.js";
|
|
14
|
+
import { resolveGovernanceEnvironment } from "./proposals/common.js";
|
|
13
15
|
|
|
14
16
|
export type GetUserVoteReceiptParameters<
|
|
15
17
|
environments,
|
|
@@ -50,8 +52,17 @@ export async function getUserVoteReceipt<
|
|
|
50
52
|
): GetUserVoteReceiptReturnType {
|
|
51
53
|
const { proposalId, userAddress, chainId } = args;
|
|
52
54
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
+
// `args.chainId` identifies the chain the PROPOSAL lives on, not the
|
|
56
|
+
// environment we read through — the same distinction `getProposal` draws
|
|
57
|
+
// (MOO-551). Resolving the environment from it meant an archive lookup
|
|
58
|
+
// (1284/1285) matched no registered environment post-sunset and returned `[]`,
|
|
59
|
+
// a third shape callers don't handle: every historical vote read as "didn't
|
|
60
|
+
// vote". Resolve the indexer source independently and pass `chainId` through
|
|
61
|
+
// untouched.
|
|
62
|
+
const governanceEnvironment = resolveGovernanceEnvironment(
|
|
63
|
+
Object.values(client.environments as Record<string, Environment>),
|
|
64
|
+
);
|
|
65
|
+
if (!governanceEnvironment) {
|
|
55
66
|
return [];
|
|
56
67
|
}
|
|
57
68
|
|
|
@@ -64,7 +75,7 @@ export async function getUserVoteReceipt<
|
|
|
64
75
|
for (const cid of tryChains) {
|
|
65
76
|
try {
|
|
66
77
|
const apiVoteReceipts = await fetchUserVoteReceipt(
|
|
67
|
-
|
|
78
|
+
governanceEnvironment,
|
|
68
79
|
cid,
|
|
69
80
|
proposalId,
|
|
70
81
|
userAddress,
|
|
@@ -87,7 +98,10 @@ export async function getUserVoteReceipt<
|
|
|
87
98
|
if (collected.length === 0) {
|
|
88
99
|
return [
|
|
89
100
|
{
|
|
90
|
-
|
|
101
|
+
// An explicit request names the chain the stub is about; a bare lookup
|
|
102
|
+
// queried every supported chain, so the source we read through is the
|
|
103
|
+
// only chain it can honestly claim.
|
|
104
|
+
chainId: chainId ?? governanceEnvironment.chainId,
|
|
91
105
|
proposalId,
|
|
92
106
|
account: userAddress,
|
|
93
107
|
voted: false,
|
|
@@ -15,11 +15,20 @@ const getGovernorApiUrl = (environment: Environment): string => {
|
|
|
15
15
|
* active multigov contract lives; Moonbeam follows for the historical archive,
|
|
16
16
|
* then Moonriver (legacy standalone governor).
|
|
17
17
|
*
|
|
18
|
-
*
|
|
19
|
-
* queried on every chain and non-empty receipts are concatenated
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
18
|
+
* The fan-out set for two consumers: `getUserVoteReceipt` (a bare proposalId is
|
|
19
|
+
* queried on every chain and non-empty receipts are concatenated) and
|
|
20
|
+
* `getProposals` (every chain's list is fetched and merged, so the archive stays
|
|
21
|
+
* listable after the sunset).
|
|
22
|
+
*
|
|
23
|
+
* Since MOO-551 no Moonbeam/Moonriver environment exists, so 1284 and 1285 are
|
|
24
|
+
* served through whichever governance environment resolved — reporting
|
|
25
|
+
* `quorum: 0` and no `eta` because nothing on-chain can be read for a halted
|
|
26
|
+
* chain. That degradation is the accepted post-sunset design here, not a bug.
|
|
27
|
+
*
|
|
28
|
+
* Still do NOT use this set as the *single-proposal* fallback in `getProposal`:
|
|
29
|
+
* a bare lookup must not silently resolve to a 1285 proposal it wasn't asked
|
|
30
|
+
* for — that stays an explicit `chainId` route (see
|
|
31
|
+
* `MULTIGOV_PROPOSAL_FALLBACK_CHAIN_IDS`).
|
|
23
32
|
*/
|
|
24
33
|
export const SUPPORTED_GOVERNOR_CHAIN_IDS = [1, 1284, 1285] as const;
|
|
25
34
|
|