You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从BscScan获取智能合约余额并在网站自动刷新展示

实现从BscScan获取智能合约余额并自动刷新的方案

1. 准备工作

  • 注册BscScan账号并生成免费API密钥(免费版每日调用上限10万次,足够新手测试使用)
  • 明确查询目标:是合约自身的BNB余额,还是合约持有的某ERC20代币余额

2. 调用BscScan API获取余额

情况1:查询合约的BNB余额

API请求参数:

  • 端点:https://api.bscscan.com/api
  • 必填参数:
    • module=account
    • action=balance
    • address=目标合约地址
    • tag=latest
    • apikey=你的API密钥

情况2:查询合约持有的ERC20代币余额

API请求参数:

  • 端点:https://api.bscscan.com/api
  • 必填参数:
    • module=account
    • action=tokenbalance
    • contractaddress=代币合约地址
    • address=目标合约地址
    • tag=latest
    • apikey=你的API密钥

注意:API返回的是最小单位余额(如BNB的wei、ERC20代币的最小刻度),需要除以10^decimals转换为可读格式。ERC20代币的decimals值可通过BscScan代币详情页查询。

3. 前端完整实现代码(原生JS)

以下代码包含两种余额查询、格式转换及自动刷新功能,直接复制即可测试:

<!DOCTYPE html>
<html>
<head>
    <title>合约余额监控</title>
    <style>
        .balance-card { margin: 20px; padding: 15px; border: 1px solid #eee; border-radius: 8px; }
        .balance-value { font-size: 24px; font-weight: bold; color: #2c3e50; }
    </style>
</head>
<body>
    <div class="balance-card">
        <h3>合约BNB余额</h3>
        <div id="bnb-balance" class="balance-value">加载中...</div>
    </div>
    <div class="balance-card">
        <h3>合约USDT余额</h3>
        <div id="usdt-balance" class="balance-value">加载中...</div>
    </div>

    <script>
        // 配置信息
        const API_KEY = '你的BscScan API密钥';
        const TARGET_CONTRACT = '要查询的合约地址';
        const USDT_CONTRACT = '0x55d398326f99059ff775485246999027b3197955'; // BSC链USDT合约地址
        const REFRESH_INTERVAL = 30000; // 自动刷新间隔(30秒)

        // 转换最小单位余额为可读格式
        function formatBalance(rawBalance, decimals) {
            return (rawBalance / Math.pow(10, decimals)).toFixed(4);
        }

        // 获取合约BNB余额
        async function fetchBNBBalance() {
            try {
                const response = await fetch(`https://api.bscscan.com/api?module=account&action=balance&address=${TARGET_CONTRACT}&tag=latest&apikey=${API_KEY}`);
                const data = await response.json();
                if (data.status === '1') {
                    const formatted = formatBalance(parseInt(data.result), 18); // BNB的decimals为18
                    document.getElementById('bnb-balance').textContent = `${formatted} BNB`;
                } else {
                    document.getElementById('bnb-balance').textContent = '查询失败';
                }
            } catch (error) {
                document.getElementById('bnb-balance').textContent = '网络错误';
            }
        }

        // 获取合约USDT余额
        async function fetchUSDTBalance() {
            try {
                const response = await fetch(`https://api.bscscan.com/api?module=account&action=tokenbalance&contractaddress=${USDT_CONTRACT}&address=${TARGET_CONTRACT}&tag=latest&apikey=${API_KEY}`);
                const data = await response.json();
                if (data.status === '1') {
                    const formatted = formatBalance(parseInt(data.result), 6); // USDT的decimals为6
                    document.getElementById('usdt-balance').textContent = `${formatted} USDT`;
                } else {
                    document.getElementById('usdt-balance').textContent = '查询失败';
                }
            } catch (error) {
                document.getElementById('usdt-balance').textContent = '网络错误';
            }
        }

        // 初始化查询
        fetchBNBBalance();
        fetchUSDTBalance();

        // 设置自动刷新
        setInterval(() => {
            fetchBNBBalance();
            fetchUSDTBalance();
        }, REFRESH_INTERVAL);
    </script>
</body>
</html>

4. 常见问题排查

  • API调用失败:检查API密钥是否正确、是否超出调用次数限制、目标地址是否为BSC链有效地址
  • 余额显示异常:确认合约确实持有对应资产,ERC20代币的decimals值是否设置正确
  • 跨域限制:本地文件(file://协议)运行会触发跨域,建议用本地服务器(如python -m http.server)测试
  • 自动刷新失效:检查浏览器控制台报错,确认刷新间隔设置合理(避免过短触发BscScan限流)

内容的提问来源于stack exchange,提问作者JosephResse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 04:17:41