UNPKG

bnbchain-mcp

Version:

---

73 lines (72 loc) 2.73 kB
import { Native, ERC20Token } from "@pancakeswap/sdk"; /** * Cache for PancakeSwap token list data */ const pancakeswapTokensCache = { tokens: [], lastFetchTime: 0, }; /** * Fetch tokens from PancakeSwap token list * @returns Array of token data */ export async function fetchPancakeswapTokens() { const now = Math.floor(Date.now() / 1000); if (pancakeswapTokensCache.lastFetchTime > now - 300 && pancakeswapTokensCache.tokens.length > 0) { return pancakeswapTokensCache.tokens; } try { const response = await fetch("https://tokens.pancakeswap.finance/pancakeswap-extended.json"); if (!response.ok) { throw new Error(`Failed to fetch token list: ${response.status} ${response.statusText}`); } const data = await response.json(); if (!data || !data.tokens || !Array.isArray(data.tokens)) { throw new Error("Invalid token list format"); } pancakeswapTokensCache.tokens = data.tokens; pancakeswapTokensCache.lastFetchTime = now; return data.tokens; } catch (error) { console.error("Error fetching PancakeSwap tokens:", error); return []; } } /** * Resolve a token input into a currency object. * If the token string is "BNB" (native) or a valid address, it is handled directly. * Otherwise it is treated as a token symbol or name and looked up from the PancakeSwap token list. * @param token - The token input (address, symbol or name) * @param defaultChainId - The default chain id to use (e.g. 56 for BSC) */ export async function resolveCurrency(token, defaultChainId) { if (token.toUpperCase() === "BNB") { return { currency: Native.onChain(defaultChainId), chainId: defaultChainId, }; } // If token looks like an address (starts with "0x" and is 42 characters long) if (token.startsWith("0x") && token.length === 42) { return { currency: new ERC20Token(defaultChainId, token, 18, ""), chainId: defaultChainId, }; } // Otherwise, assume token is a name or symbol. const tokens = await fetchPancakeswapTokens(); const tokenData = tokens.find((t) => t.symbol.toLowerCase() === token.toLowerCase() || t.name.toLowerCase() === token.toLowerCase()); if (!tokenData) { throw new Error(`Token ${token} not found in PancakeSwap token list`); } return { currency: new ERC20Token(tokenData.chainId, tokenData.address, tokenData.decimals, tokenData.symbol), chainId: tokenData.chainId, }; } export function bigIntReplacer(key, value) { return typeof value === 'bigint' ? value.toString() : value; }