UNPKG

@iqai/mcp-fraxlend

Version:
109 lines 3.73 kB
import dedent from "dedent"; import { graphql } from "gql.tada"; import { formatEther } from "viem"; import { client } from "../lib/graphql.js"; const PAIR_ADDRESS_QUERY = graphql(` query fraxlendPairs($where: Pair_filter) { pairs(where: $where) { id symbol asset { symbol decimals } collateral { symbol decimals } dailyHistory(first: 1, orderBy: timestamp, orderDirection: desc) { interestPerSecond } maxLTV liquidationFee cleanLiquidationFee dirtyLiquidationFee protocolLiquidationFee maturity pauseStatus pauseInterestStatus pauseLiquidateStatus pauseRepayStatus pauseWithdrawStatus } } `); export class PairAddressService { walletService; constructor(walletService) { this.walletService = walletService; } async getPairAddress(params) { try { // biome-ignore lint/suspicious/noExplicitAny: <explanation> const where = {}; if (params.assetSymbol) { where.asset_ = { symbol_contains: params.assetSymbol.toUpperCase() }; } if (params.collateralSymbol) { where.collateral_ = { symbol_contains: params.collateralSymbol.toUpperCase(), }; } // biome-ignore lint/suspicious/noExplicitAny: <explanation> const data = await client.request(PAIR_ADDRESS_QUERY, { where }); // biome-ignore lint/suspicious/noExplicitAny: <explanation> const pairs = data.pairs.map((pair) => ({ address: pair.id, symbol: pair.symbol, assetSymbol: pair.asset.symbol, collateralSymbol: pair.collateral.symbol, apr: this.calculateApr(pair.dailyHistory[0].interestPerSecond), maxLTV: pair.maxLTV, liquidationFee: pair.liquidationFee, status: { paused: pair.pauseStatus, pausedInterest: pair.pauseInterestStatus, pausedLiquidate: pair.pauseLiquidateStatus, pausedRepay: pair.pauseRepayStatus, pausedWithdraw: pair.pauseWithdrawStatus, }, })); if (params.sortByApr) { // biome-ignore lint/suspicious/noExplicitAny: <explanation> pairs.sort((a, b) => params.sortByApr === "highest" ? b.apr - a.apr : a.apr - b.apr); } return pairs; } catch (error) { throw new Error(`Failed to fetch pair address: ${error.message}`); } } calculateApr(interestPerSecond) { const interestRate = Number(formatEther(BigInt(interestPerSecond))); const SECONDS_PER_YEAR = 365 * 24 * 60 * 60; const apr = interestRate * SECONDS_PER_YEAR * 100; return Number(apr.toFixed(2)); } formatPairAddresses(pairs) { if (pairs.length === 0) { return "🔍 No Pairs Found"; } const formattedPairs = pairs // biome-ignore lint/suspicious/noExplicitAny: <explanation> .map((pair) => { return dedent ` 🔸 ${pair.symbol} - Address: ${pair.address} - Asset: ${pair.assetSymbol} - Collateral: ${pair.collateralSymbol} - Current APR: ${pair.apr}% - Max LTV: ${pair.maxLTV}% - Liquidation Fee: ${pair.liquidationFee}% ${pair.status.paused ? "⚠️ Pool is currently paused" : ""} `; }) .join("\n\n"); return `📍 *Available Pairs*\n\n${formattedPairs}`; } } //# sourceMappingURL=pair-address.js.map