@moonwell-fi/moonwell-sdk
Version:
TypeScript Interface for Moonwell
132 lines • 5.3 kB
JavaScript
/**
* Lunar Indexer Response Transformers
*
* Transforms Lunar Indexer API responses to match the SDK's internal types.
*/
// ============================================================================
// Market Snapshot Transformation
// ============================================================================
/**
* Transform a Lunar market snapshot to SDK MarketSnapshot format
*
* Key differences:
* - Lunar uses decimal numbers, SDK uses numbers
* - Lunar has timeInterval field (not needed in SDK)
* - Field name mapping: totalSupplies → totalSupply, totalBorrows → totalBorrows
*/
export function transformMarketSnapshot(lunar, chainId) {
return {
chainId,
marketId: lunar.marketAddress,
totalSupply: Number(lunar.totalSupplies),
totalSupplyUsd: Number(lunar.totalSuppliesUSD),
totalBorrows: Number(lunar.totalBorrows),
totalBorrowsUsd: Number(lunar.totalBorrowsUSD),
totalLiquidity: Number(lunar.totalLiquidity),
totalLiquidityUsd: Number(lunar.totalLiquidityUSD),
totalReallocatableLiquidity: 0,
totalReallocatableLiquidityUsd: 0,
baseSupplyApy: Number(lunar.baseSupplyApy),
baseBorrowApy: Number(lunar.baseBorrowApy),
timestamp: Number(lunar.timestamp) * 1000, // Convert unix timestamp to milliseconds
loanTokenPrice: 0, // Calculated in getMarketSnapshots
collateralTokenPrice: 0, // Calculated in getMarketSnapshots
};
}
/**
* Transform an array of Lunar market snapshots
*/
export function transformMarketSnapshots(snapshots, chainId) {
return snapshots.map((snapshot) => transformMarketSnapshot(snapshot, chainId));
}
// ============================================================================
// Portfolio/User Position Transformation
// ============================================================================
/**
* Transform Lunar portfolio to SDK UserPositionSnapshot array
*
* Key transformation:
* - Aggregate per-market USD balances across all markets per timestamp
* - Sum supplyBalanceUsd → totalSupplyUsd
* - Sum borrowBalanceUsd → totalBorrowsUsd
* - Assume totalCollateralUsd = totalSupplyUsd (all supplies are collateral)
*/
export function transformPortfolioToSnapshots(lunarPortfolio, chainId) {
return lunarPortfolio.positions.map((position) => {
const totalSupplyUsd = position.markets.reduce((sum, market) => sum + Number.parseFloat(market.supplyBalanceUsd || "0"), 0);
const totalBorrowsUsd = position.markets.reduce((sum, market) => sum + Number.parseFloat(market.borrowBalanceUsd || "0"), 0);
return {
chainId,
timestamp: position.timestamp * 1000, // Convert unix timestamp (seconds) to milliseconds
totalSupplyUsd,
totalBorrowsUsd,
totalCollateralUsd: totalSupplyUsd, // Assuming all supplies are collateral
};
});
}
// ============================================================================
// Staking Snapshot Transformation
// ============================================================================
/**
* Transform a Lunar staking snapshot to SDK StakingSnapshot format
*
* Key differences:
* - Lunar returns totalStaked/totalStakedUSD as decimal strings
* - Lunar timestamp is already in Unix seconds (same as SDK)
*/
export function transformStakingSnapshot(snapshot) {
return {
chainId: snapshot.chainId,
totalStaked: Number(snapshot.totalStaked),
totalStakedUSD: Number(snapshot.totalStakedUSD),
timestamp: snapshot.timestamp,
};
}
/**
* Transform an array of Lunar staking snapshots
*/
export function transformStakingSnapshots(snapshots) {
return snapshots.map(transformStakingSnapshot);
}
// ============================================================================
// Vault Staking Snapshot Transformation
// ============================================================================
/**
* Transform a Lunar vault staking snapshot to SDK MorphoVaultStakingSnapshot format
*
* Key differences:
* - Lunar returns totalStaked/totalStakedUSD as decimal strings
* - Lunar timestamp is in Unix seconds; SDK expects milliseconds
* - Lunar field is totalStakedUSD (uppercase); SDK type is totalStakedUsd (mixed case)
*/
export function transformVaultStakingSnapshot(snapshot) {
return {
chainId: snapshot.chainId,
vaultAddress: snapshot.vaultAddress,
totalStaked: Number(snapshot.totalStaked),
totalStakedUsd: Number(snapshot.totalStakedUSD),
timestamp: snapshot.timestamp * 1000,
};
}
/**
* Transform an array of Lunar vault staking snapshots
*/
export function transformVaultStakingSnapshots(snapshots) {
return snapshots.map(transformVaultStakingSnapshot);
}
// ============================================================================
// Pagination Transformation
// ============================================================================
/**
* Check if there are more pages available
*/
export function hasMorePages(nextCursor) {
return nextCursor !== null;
}
/**
* Extract cursor for next page
*/
export function getNextCursor(nextCursor) {
return nextCursor || undefined;
}
//# sourceMappingURL=lunar-indexer-transformers.js.map