@moonwell-fi/moonwell-sdk
Version:
TypeScript Interface for Moonwell
210 lines • 10.4 kB
JavaScript
;
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