bnbchain-mcp
Version:
---
78 lines (77 loc) • 2.87 kB
JavaScript
import { createPublicClient, getContract, http, isAddress, } from "viem";
import { fetchPancakeswapTokens } from "../util.js";
import { bsc } from "viem/chains";
import { bep20abi } from "../lib/bep20Abi.js";
/**
* Get token address and information from symbol or address
* @param chainId - Chain ID (e.g., 56 for BSC)
* @param token - Token symbol or address
* @param rpcUrl - RPC URL for the chain
* @returns TokenInfo object with address and decimals
*/
export async function getEVMTokenAddress(chainId, token, rpcUrl = "https://bsc-dataseed.binance.org") {
if (isAddress(token)) {
try {
const tokenList = await fetchPancakeswapTokens();
const foundToken = tokenList.find((t) => t.chainId === chainId &&
t.address.toLowerCase() === token.toLowerCase());
if (foundToken) {
return {
address: foundToken.address,
decimals: foundToken.decimals,
symbol: foundToken.symbol,
name: foundToken.name,
};
}
}
catch (error) {
console.warn("Error searching PancakeSwap token list:", error);
}
const publicClient = createPublicClient({
chain: bsc,
transport: http(rpcUrl),
});
const contract = getContract({
address: token,
abi: bep20abi,
client: {
public: publicClient,
},
});
try {
// Get token details from the contract
const decimals = await contract.read.decimals();
const symbol = await contract.read.symbol();
const name = await contract.read.name();
return {
address: token,
decimals,
symbol,
name,
};
}
catch (error) {
console.error("Error fetching token info from contract:", error);
throw new Error(`Could not fetch info for token at address ${token}`);
}
}
else {
try {
const tokenList = await fetchPancakeswapTokens();
const uppercaseSymbol = token.toUpperCase();
const foundToken = tokenList.find((t) => t.chainId === chainId && t.symbol.toUpperCase() === uppercaseSymbol);
if (foundToken) {
return {
address: foundToken.address,
decimals: foundToken.decimals,
symbol: foundToken.symbol,
name: foundToken.name,
};
}
}
catch (error) {
console.error("Error searching PancakeSwap token list:", error);
}
throw new Error(`Token with symbol ${token} not found in PancakeSwap token list.`);
}
}