@moonwell-fi/moonwell-sdk
Version:
TypeScript Interface for Moonwell
264 lines • 7.92 kB
TypeScript
/**
* Lunar Indexer API Client
*
* Client for interacting with the Lunar Indexer REST API endpoints.
* Provides functions for fetching comptroller, market, token, and portfolio data.
*/
export interface LunarIndexerConfig {
baseUrl: string;
timeout?: number;
}
export interface LunarPaginatedResponse<T> {
results: T[];
nextCursor: string | null;
}
export interface LunarSnapshotOptions {
limit?: number;
cursor?: string;
granularity?: "15m" | "1h" | "6h" | "1d";
startTime?: number;
endTime?: number;
}
export interface LunarStakingSnapshotOptions {
limit?: number;
cursor?: string;
granularity?: "1h" | "6h" | "1d";
startTime?: number;
endTime?: number;
}
export interface LunarVaultStakingSnapshotOptions extends LunarStakingSnapshotOptions {
vaultAddress?: string;
}
export interface LunarStakingSnapshot {
id: string;
chainId: number;
stakingTokenAddress: string;
timestamp: number;
blockNumber: string;
totalStaked: string;
totalStakedUSD: string;
wellPrice: string;
timeInterval: number;
}
export interface LunarVaultStakingSnapshot {
id: string;
chainId: number;
vaultAddress: string;
timestamp: number;
blockNumber: string;
totalStaked: string;
totalStakedUSD: string;
underlyingPrice: string;
timeInterval: number;
}
export interface LunarPortfolioOptions {
startTime: number;
endTime: number;
granularity?: "1h" | "6h" | "1d";
chainId?: number;
market?: string;
}
export interface LunarVaultPortfolioOptions {
startTime: number;
endTime: number;
granularity?: "1h" | "6h" | "1d";
chainId?: number;
vault?: string;
}
export interface LunarVaultPosition {
chainId: number;
vaultAddress: string;
shareBalance: string;
shareBalanceUsd: number;
assetsValue: number;
}
export interface LunarVaultPortfolio {
account: string;
positions: Array<{
timestamp: number;
vaults: LunarVaultPosition[];
}>;
}
export interface LunarComptroller {
id: string;
chainId: number;
address: string;
priceOracleAddress: string;
}
export interface LunarMarket {
id: string;
chainId: number;
address: string;
underlyingTokenAddress: string;
collateralFactor: number;
interestRateModelAddress: string;
priceFeedAddress: string;
reserveFactor: string;
blockNumber: string;
timestamp: number;
}
/**
* Full market data with all real-time fields from Lunar Indexer
* Based on actual API responses from /markets/:chainId and /market/:marketId
*/
export interface LunarMarketFull {
id: string;
chainId: number;
address: string;
underlyingTokenAddress: string;
comptrollerAddress: string;
totalBorrows: number;
totalBorrowsUsd: number;
totalSupply: number;
totalSupplyUsd: number;
totalReserves: number;
totalReservesUsd: number;
cash: number;
cashUsd: number;
badDebt: number;
badDebtUsd: number;
exchangeRate: number;
priceUsd: number;
baseSupplyApy: number;
baseBorrowApy: number;
mintPaused: boolean;
borrowPaused: boolean;
seizePaused: boolean;
transferPaused: boolean;
borrowCap: number;
supplyCap: number;
collateralFactor: number;
reserveFactor: string;
incentives: Array<{
token: string;
supplyIncentivesPerSec: string | number;
borrowIncentivesPerSec: string | number;
priceUsd: number | null;
supplyApr: number | null;
borrowApr: number | null;
}>;
underlyingToken: {
id: string;
chainId: number;
address: string;
name: string;
symbol: string;
decimals: number;
};
blockNumber: string;
timestamp: number;
}
export interface LunarMarketWithToken extends LunarMarket {
underlyingToken: LunarToken;
}
export interface LunarToken {
id: string;
chainId: number;
address: string;
name: string;
symbol: string;
decimals: number;
}
export interface LunarMarketSnapshot {
id: string;
chainId: number;
marketAddress: string;
timestamp: number;
blockNumber: string;
totalBorrows: number;
totalBorrowsUSD: number;
totalSupplies: number;
totalSuppliesUSD: number;
totalLiquidity: number;
totalLiquidityUSD: number;
totalReserves: number;
totalReservesUSD: number;
baseSupplyApy: number;
baseBorrowApy: number;
timeInterval: number;
}
export interface LunarPortfolio {
account: string;
positions: Array<{
timestamp: number;
markets: Array<{
chainId: number;
marketAddress: string;
supplyBalance: string;
supplyBalanceUsd: string;
borrowBalance: string;
borrowBalanceUsd: string;
}>;
}>;
}
export declare class LunarIndexerError extends Error {
readonly statusCode?: number | undefined;
readonly endpoint?: string | undefined;
readonly originalError?: Error | undefined;
constructor(message: string, statusCode?: number | undefined, endpoint?: string | undefined, originalError?: Error | undefined);
}
/**
* Determine if an error should trigger fallback to Ponder/on-chain
*/
export declare function shouldFallback(error: unknown): boolean;
export declare const DEFAULT_LUNAR_TIMEOUT_MS = 10000;
export declare class LunarIndexerClient {
private client;
private stakingClient;
private vaultsClient;
constructor(config: LunarIndexerConfig);
/**
* Get comptroller data for a specific chain
*/
getComptroller(chainId: number): Promise<LunarComptroller>;
/**
* List all markets for a specific chain with pagination
* Returns full market data with real-time values, APYs, and incentives
*/
listMarkets(chainId: number, options?: {
limit?: number;
cursor?: string;
}): Promise<LunarPaginatedResponse<LunarMarketFull>>;
/**
* Get a single market by marketId (format: chainId-marketAddress)
* Returns full market data with real-time values, APYs, and incentives
*/
getMarket(marketId: string): Promise<LunarMarketFull>;
/**
* Get market snapshots with optional time range and granularity
*/
getMarketSnapshots(marketId: string, options?: LunarSnapshotOptions): Promise<LunarPaginatedResponse<LunarMarketSnapshot>>;
/**
* List all tokens for a specific chain with pagination
*/
listTokens(chainId: number, options?: {
limit?: number;
cursor?: string;
}): Promise<LunarPaginatedResponse<LunarToken>>;
/**
* Get a single token by tokenId (format: chainId-tokenAddress)
*/
getToken(tokenId: string): Promise<LunarToken>;
/**
* Get account portfolio with historical positions
* NOTE: USD fields (supplyBalanceUsd, borrowBalanceUsd) are being added by Lunar team
*/
getAccountPortfolio(accountAddress: string, options: LunarPortfolioOptions): Promise<LunarPortfolio>;
/**
* Get staking snapshots for a specific chain (stkWELL staking)
*/
getStakingSnapshots(chainId: number, options?: LunarStakingSnapshotOptions): Promise<LunarPaginatedResponse<LunarStakingSnapshot>>;
/**
* Get vault account portfolio with historical positions
*/
getVaultAccountPortfolio(accountAddress: string, options: LunarVaultPortfolioOptions): Promise<LunarVaultPortfolio>;
/**
* Get vault staking snapshots for a specific chain (MetaMorpho vault staking)
*/
getVaultStakingSnapshots(chainId: number, options?: LunarVaultStakingSnapshotOptions): Promise<LunarPaginatedResponse<LunarVaultStakingSnapshot>>;
}
/**
* Create a new Lunar Indexer client instance
*/
export declare function createLunarIndexerClient(config: LunarIndexerConfig): LunarIndexerClient;
//# sourceMappingURL=lunar-indexer-client.d.ts.map