UNPKG

@moonwell-fi/moonwell-sdk

Version:

TypeScript Interface for Moonwell

210 lines 10.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PRICE_ALIAS = void 0; exports.transformIsolatedMarketSnapshotFromIndexer = transformIsolatedMarketSnapshotFromIndexer; exports.fetchMarketsFromIndexer = fetchMarketsFromIndexer; exports.fetchMarketFromIndexer = fetchMarketFromIndexer; exports.fetchMarketSnapshotsFromIndexer = fetchMarketSnapshotsFromIndexer; exports.fetchAccountMarketPortfolioFromIndexer = fetchAccountMarketPortfolioFromIndexer; exports.transformMarketFromIndexer = transformMarketFromIndexer; exports.transformMarketsFromIndexer = transformMarketsFromIndexer; const viem_1 = require("viem"); const amount_js_1 = require("../../../common/amount.js"); const axiosWithRetry_js_1 = require("../../axiosWithRetry.js"); function transformIsolatedMarketSnapshotFromIndexer(snapshot, options) { const collateralTokenPrice = Number.parseFloat(snapshot.collateralTokenPrice); const loanTokenPrice = Number.parseFloat(snapshot.loanTokenPrice); const totalSupplyAssetsUsd = Number.parseFloat(snapshot.totalSupplyAssetsUsd); const totalLiquidityUsd = Number.parseFloat(snapshot.totalLiquidityUsd); const needsUsdNormalization = options?.normalizeToCollateral === true; const totalSupply = needsUsdNormalization && collateralTokenPrice > 0 ? totalSupplyAssetsUsd / collateralTokenPrice : Number.parseFloat(snapshot.totalSupplyAssets); const totalLiquidity = needsUsdNormalization && collateralTokenPrice > 0 ? totalLiquidityUsd / collateralTokenPrice : Number.parseFloat(snapshot.totalLiquidity); const totalReallocatableLiquidity = Number.parseFloat(snapshot.totalReallocatableLiquidity ?? "0"); const totalReallocatableLiquidityUsd = Number.parseFloat(snapshot.totalReallocatableLiquidityUsd ?? "0"); return { chainId: snapshot.chainId, marketId: snapshot.marketId.toLowerCase(), timestamp: snapshot.timestamp * 1000, totalSupply, totalSupplyUsd: totalSupplyAssetsUsd, totalBorrows: Number.parseFloat(snapshot.totalBorrowAssets), totalBorrowsUsd: Number.parseFloat(snapshot.totalBorrowAssetsUsd), totalLiquidity, totalLiquidityUsd, totalReallocatableLiquidity, totalReallocatableLiquidityUsd, baseSupplyApy: Number.parseFloat(snapshot.supplyApy), baseBorrowApy: Number.parseFloat(snapshot.borrowApy), loanTokenPrice, collateralTokenPrice, }; } async function fetchMarketsFromIndexer(lunarIndexerUrl, chainId, options) { const params = new URLSearchParams(); if (options?.includeRewards) { params.set("includeRewards", "true"); } const queryString = params.toString(); const url = `${lunarIndexerUrl}/api/v1/isolated/markets/${chainId}${queryString ? `?${queryString}` : ""}`; const response = await (0, axiosWithRetry_js_1.getWithRetry)(url); return response.data; } async function fetchMarketFromIndexer(lunarIndexerUrl, chainId, marketId) { const url = `${lunarIndexerUrl}/api/v1/isolated/market/${chainId}/${marketId.toLowerCase()}`; const response = await (0, axiosWithRetry_js_1.getWithRetry)(url); return response.data; } async function fetchMarketSnapshotsFromIndexer(lunarIndexerUrl, chainId, marketId, options) { const params = new URLSearchParams(); if (options?.startTime !== undefined) { params.set("startTime", options.startTime.toString()); } if (options?.endTime !== undefined) { params.set("endTime", options.endTime.toString()); } if (options?.limit !== undefined) { params.set("limit", options.limit.toString()); } if (options?.cursor !== undefined) { params.set("cursor", options.cursor); } if (options?.granularity !== undefined) { params.set("granularity", options.granularity); } const queryString = params.toString(); const url = `${lunarIndexerUrl}/api/v1/isolated/market/${chainId}/${marketId.toLowerCase()}/snapshots${queryString ? `?${queryString}` : ""}`; const response = await (0, axiosWithRetry_js_1.getWithRetry)(url); return response.data; } async function fetchAccountMarketPortfolioFromIndexer(lunarIndexerUrl, accountAddress, options) { const params = new URLSearchParams(); if (options?.chainId !== undefined) { params.set("chainId", options.chainId.toString()); } if (options?.marketId !== undefined) { params.set("marketId", options.marketId.toLowerCase()); } if (options?.startTime !== undefined) { params.set("startTime", options.startTime.toString()); } if (options?.endTime !== undefined) { params.set("endTime", options.endTime.toString()); } if (options?.granularity !== undefined) { params.set("granularity", options.granularity); } const queryString = params.toString(); const url = `${lunarIndexerUrl}/api/v1/isolated/account/${accountAddress.toLowerCase()}/portfolio${queryString ? `?${queryString}` : ""}`; const response = await (0, axiosWithRetry_js_1.getWithRetry)(url); return response.data; } function transformMarketFromIndexer(indexerMarket, environment, rewardsData, sharedLiquidityData, collateralPriceOverride) { const marketKey = Object.keys(environment.config.morphoMarkets).find((key) => environment.config.morphoMarkets[key].id.toLowerCase() === indexerMarket.marketId.toLowerCase()); if (!marketKey) { return null; } const marketConfig = environment.config.morphoMarkets[marketKey]; const loanToken = environment.config.tokens[marketConfig.loanToken]; const collateralToken = environment.config.tokens[marketConfig.collateralToken]; const loanTokenPrice = Number.parseFloat(indexerMarket.loanTokenPrice); const collateralTokenPrice = collateralPriceOverride ?? Number.parseFloat(indexerMarket.collateralTokenPrice); const lltv = Number.parseFloat(indexerMarket.lltv); const lltvBigInt = BigInt(Math.floor(lltv * 10 ** 16)); const safeParseUnits = (value, decimals) => { try { return (0, viem_1.parseUnits)(value, decimals); } catch { return 0n; } }; const totalSupplyInLoanToken = new amount_js_1.Amount(safeParseUnits(indexerMarket.totalSupplyAssets, loanToken.decimals), loanToken.decimals); const totalBorrows = new amount_js_1.Amount(safeParseUnits(indexerMarket.totalBorrowAssets, loanToken.decimals), loanToken.decimals); const availableLiquidity = new amount_js_1.Amount(safeParseUnits(indexerMarket.totalLiquidity, loanToken.decimals), loanToken.decimals); const oraclePrice = loanTokenPrice > 0 ? collateralTokenPrice / loanTokenPrice : 0; const totalSupply = new amount_js_1.Amount(oraclePrice > 0 ? BigInt(Math.floor((totalSupplyInLoanToken.value / oraclePrice) * 10 ** collateralToken.decimals)) : 0n, collateralToken.decimals); const baseSupplyApy = Number.parseFloat(indexerMarket.supplyApy); const baseBorrowApy = Number.parseFloat(indexerMarket.borrowApy); const totalSupplyUsd = Number.parseFloat(indexerMarket.totalSupplyAssetsUsd); const totalBorrowsUsd = Number.parseFloat(indexerMarket.totalBorrowAssetsUsd); const availableLiquidityUsd = Number.parseFloat(indexerMarket.totalLiquidityUsd); const marketParams = { loanToken: indexerMarket.loanToken.address, collateralToken: indexerMarket.collateralToken.address, oracle: indexerMarket.oracle, irm: indexerMarket.irm, lltv: lltvBigInt, }; const publicAllocatorSharedLiquidity = sharedLiquidityData || []; const market = { chainId: environment.chainId, marketId: indexerMarket.marketId, marketKey, deprecated: marketConfig.deprecated === true, loanToValue: lltv / 100, performanceFee: Number.parseFloat(indexerMarket.fee), loanToken, loanTokenPrice, collateralToken, collateralTokenPrice, collateralAssets: rewardsData?.collateralAssets ?? null, collateralAssetsUsd: rewardsData?.collateralAssetsUsd ?? null, totalSupply, totalSupplyUsd, totalSupplyInLoanToken, totalBorrows, totalBorrowsUsd, availableLiquidity, availableLiquidityUsd, marketParams, baseSupplyApy, baseBorrowApy, rewardsSupplyApy: rewardsData?.rewardsSupplyApy ?? 0, rewardsBorrowApy: rewardsData?.rewardsBorrowApy ?? 0, totalSupplyApr: baseSupplyApy + (rewardsData?.rewardsSupplyApy ?? 0), totalBorrowApr: baseBorrowApy + (rewardsData?.rewardsBorrowApy ?? 0), rewards: rewardsData?.rewards ?? [], publicAllocatorSharedLiquidity, }; return market; } exports.PRICE_ALIAS = { stkWELL: "WELL", }; function transformMarketsFromIndexer(indexerMarkets, environment, rewardsDataMap, sharedLiquidityMap) { const tokenPriceBySymbol = new Map(); const setPriceWithCheck = (symbol, price) => { tokenPriceBySymbol.set(symbol, price); }; for (const m of indexerMarkets) { const loanPrice = Number.parseFloat(m.loanTokenPrice); const collateralPrice = Number.parseFloat(m.collateralTokenPrice); if (loanPrice > 0) setPriceWithCheck(m.loanToken.symbol, loanPrice); if (collateralPrice > 0) setPriceWithCheck(m.collateralToken.symbol, collateralPrice); } return indexerMarkets.flatMap((indexerMarket) => { const rewardKey = `${environment.chainId}-${indexerMarket.marketId.toLowerCase()}`; const rewardsData = rewardsDataMap?.get(rewardKey); const sharedLiquidityData = sharedLiquidityMap?.get(rewardKey); const collateralSymbol = indexerMarket.collateralToken.symbol; const collateralPrice = Number.parseFloat(indexerMarket.collateralTokenPrice); const aliasSymbol = exports.PRICE_ALIAS[collateralSymbol]; const collateralPriceOverride = collateralPrice === 0 && aliasSymbol ? tokenPriceBySymbol.get(aliasSymbol) : undefined; const market = transformMarketFromIndexer(indexerMarket, environment, rewardsData, sharedLiquidityData, collateralPriceOverride); return market ? [market] : []; }); } //# sourceMappingURL=lunarIndexerTransform.js.map