bnbchain-mcp
Version:
---
86 lines (85 loc) • 3 kB
JavaScript
import Moralis from "moralis";
import { formatEther, formatUnits } from "viem";
const ensureApiKey = () => {
if (!process.env.MORALIS_API_KEY) {
throw new Error("MORALIS_API_KEY is not set in the environment. Please set your API key in your environment variables. If you don't have one, please get an API key from https://docs.moralis.com/web3-data-api/evm/get-your-api-key.");
}
};
const formatTokenDigits = (value, tokenDecimal, decimal) => {
const newValue = formatUnits(value, tokenDecimal).toString();
const [integerPart, decimalPart] = newValue.split(".");
if (!decimalPart) {
return `${integerPart}.${"0".repeat(decimal)}`;
}
const truncatedDecimalPart = decimalPart.slice(0, decimal);
return `${integerPart}.${truncatedDecimalPart.padEnd(decimal, "0")}`;
};
const formatNativeDigits = (value, decimal) => {
if (decimal === 0) {
return value;
}
const [integerPart, decimalPart] = value.split(".");
if (!decimalPart) {
return `${integerPart}.${"0".repeat(decimal)}`;
}
const truncatedDecimalPart = decimalPart.slice(0, decimal);
return `${integerPart}.${truncatedDecimalPart.padEnd(decimal, "0")}`;
};
const getBSCBalance = async (address) => {
try {
if (!Moralis.Core.isStarted) {
await Moralis.start({
apiKey: process.env.MORALIS_API_KEY,
});
}
const chain = "0x38";
const response = await Moralis.EvmApi.token.getWalletTokenBalances({
chain,
address,
});
const tokenBalance = response.raw.filter((token) => token.possible_spam === false);
return tokenBalance
.filter((item) => item.verified_contract)
.map((item) => ({
token_address: item.token_address,
symbol: item.symbol,
name: item.name,
logo: item.logo,
decimals: item.decimals,
balance: formatTokenDigits(item.balance, item.decimals, 5),
}));
}
catch (error) {
console.error("Detailed error:", error);
throw error;
}
};
const getBNBNativeBalance = async (address) => {
ensureApiKey();
try {
if (!Moralis.Core.isStarted) {
await Moralis.start({
apiKey: process.env.MORALIS_API_KEY,
});
}
const chain = "0x38";
const response = await Moralis.EvmApi.balance.getNativeBalance({
chain,
address,
});
const balance = BigInt(response.raw.balance);
return formatNativeDigits(formatEther(balance), 4);
}
catch (error) {
console.error("Error fetching BNB balance:", error);
return "0";
}
};
export const getBalance = async (address) => {
const bscBalance = await getBSCBalance(address);
const bnbBalance = await getBNBNativeBalance(address);
return {
nativeBalance: bnbBalance,
tokenBalances: bscBalance,
};
};