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

已部署ABCToken合约在BSCScan无法显示名称、符号等信息求助

问题

今日我部署了一份ABCToken智能合约,合约功能正常,我已在钱包中收到全部代币供应量,但在BSCScan测试网打开该合约页面时,无法查看Name、Symbol、TotalSupply等信息。我尝试修改字符串类型但问题仍未解决。

合约代码如下:

// This is the contract for the ABC token
contract ABCToken {
    // The name of the token
    string public name;
    // The symbol of the token
    string public symbol;
    // The number of decimals of the token
    uint8 public decimals;
    // The total supply of the token
    uint256 public totalSupply;
    // The balance of the token for each account
    mapping(address => uint256) public balanceOf;
    // The contract owner
    address public owner;
    
    // The constructor function is called when the contract is deployed
    constructor() public {
        // Set the name of the token
        name = "ABC";
        // Set the symbol of the token
        symbol = "XYZ";
        // Set the number of decimals of the token
        decimals = 2;
        // Set the total supply of the token
        totalSupply = 100000;
        // Set the contract owner to the address that deployed the contract
        owner = msg.sender;
        // Set the balance of the contract owner to the total supply
        balanceOf[owner] = totalSupply;
    }
    
    // This function allows the contract owner to issue more tokens
    function issueTokens(uint256 _amount) public {
        // Only the contract owner can issue more tokens
        require(msg.sender == owner, "Only the owner can issue more tokens");
        // Increase the total supply and the balance of the contract owner
        totalSupply += _amount;
        balanceOf[owner] += _amount;
    }
    
    // This function allows the contract owner to transfer tokens to another account
    function transfer(address _to, uint256 _amount) public {
        // Only the contract owner can transfer tokens
        require(msg.sender == owner, "Only the owner can transfer tokens");
        // Check that the contract owner has enough tokens to transfer
        require(balanceOf[owner] >= _amount, "Insufficient balance");
        // Transfer the tokens and update the balances
        balanceOf[owner] -= _amount;
        balanceOf[_to] += _amount;
    }
}
解决方案

BSCScan这类区块浏览器识别代币核心信息(Name、Symbol、TotalSupply等),依赖合约严格遵循ERC-20标准接口。你的合约虽然定义了这些变量,但缺少标准ERC-20要求的事件和规范方法,导致浏览器无法自动解析。

核心修复思路

  1. 实现ERC-20标准的必要事件(Transfer、Approval),区块浏览器依赖这些事件追踪代币初始化和流转
  2. 确保方法签名、变量命名完全匹配ERC-20规范,比如transfer方法需要支持任意持币地址转账(你当前的transfer仅允许owner操作,不符合标准)
  3. 推荐使用OpenZeppelin的ERC20合约继承,避免手动实现的遗漏

修复后的代码示例(基于OpenZeppelin)

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract ABCToken is ERC20 {
    address public owner;

    constructor() ERC20("ABC", "XYZ") {
        _mint(msg.sender, 100000 * 10 ** decimals()); // 代币总量需乘以小数位数
        owner = msg.sender;
        _setDecimals(2); // 设置小数位数为2
    }

    // 自定义发币方法,仅合约所有者可调用
    function issueTokens(uint256 _amount) public {
        require(msg.sender == owner, "Only the owner can issue more tokens");
        _mint(owner, _amount * 10 ** decimals());
    }
}

手动实现ERC-20核心规范的版本(不依赖第三方库)

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract ABCToken {
    string public name;
    string public symbol;
    uint8 public decimals;
    uint256 public totalSupply;
    mapping(address => uint256) public balanceOf;
    mapping(address => mapping(address => uint256)) public allowance;
    address public owner;

    // ERC-20必须包含的事件
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

    constructor() {
        name = "ABC";
        symbol = "XYZ";
        decimals = 2;
        totalSupply = 100000 * 10 ** decimals();
        owner = msg.sender;
        balanceOf[owner] = totalSupply;
        // 触发代币初始化的Transfer事件(从零地址转到owner)
        emit Transfer(address(0), owner, totalSupply);
    }

    // 标准ERC-20转账方法,支持任意持币地址转账
    function transfer(address _to, uint256 _amount) public returns (bool) {
        require(_to != address(0), "Transfer to zero address");
        require(balanceOf[msg.sender] >= _amount, "Insufficient balance");

        balanceOf[msg.sender] -= _amount;
        balanceOf[_to] += _amount;
        emit Transfer(msg.sender, _to, _amount);
        return true;
    }

    // ERC-20授权方法
    function approve(address _spender, uint256 _amount) public returns (bool) {
        allowance[msg.sender][_spender] = _amount;
        emit Approval(msg.sender, _spender, _amount);
        return true;
    }

    // ERC-20授权转账方法
    function transferFrom(address _from, address _to, uint256 _amount) public returns (bool) {
        require(_to != address(0), "Transfer to zero address");
        require(balanceOf[_from] >= _amount, "Insufficient balance");
        require(allowance[_from][msg.sender] >= _amount, "Allowance exceeded");

        balanceOf[_from] -= _amount;
        balanceOf[_to] += _amount;
        allowance[_from][msg.sender] -= _amount;
        emit Transfer(_from, _to, _amount);
        return true;
    }

    // 自定义发币方法,仅owner可调用
    function issueTokens(uint256 _amount) public {
        require(msg.sender == owner, "Only the owner can issue more tokens");
        uint256 mintAmount = _amount * 10 ** decimals();
        totalSupply += mintAmount;
        balanceOf[owner] += mintAmount;
        emit Transfer(address(0), owner, mintAmount);
    }
}

关键说明

  • 如果坚持原有transfer仅owner可调用的逻辑,合约将不符合ERC-20标准,BSCScan可能仍无法完全识别代币信息,建议遵循标准规范
  • 部署修复后的合约后,BSCScan会自动抓取并展示Name、Symbol等核心信息,也可手动提交合约验证加速识别

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 06:55:16