# ERC20合约验证教程

By [Bitbigcat](https://paragraph.com/@bitbigcat) · 2023-03-28

---

上次我们研究了ERC20代币的合约部署教程，这次我们来继续验证合约，亲测可以过Scroll、Taiko、Linea、Base等测试网的合约验证。

首先我们还是按照上次的合约部署教程部署一个ERC20合约

[https://mirror.xyz/bitbigcat.eth/rgOa6S3Ly-KEc70sUINbAYEcDhj9OAcsyQufc6s7Jz0](https://mirror.xyz/bitbigcat.eth/rgOa6S3Ly-KEc70sUINbAYEcDhj9OAcsyQufc6s7Jz0)

**部署好了之后，还是照常把币MINT到自己的钱包里，但Remix的网站不要关闭**

然后打开相应的测试网区块链浏览器，比如我打开的是Linea测试网的区块链浏览器，输入自己的地址，然后找到自己部署的那个代币。

我这里是自己部署的Linea代币LNA，点击下方的Code。

![](https://storage.googleapis.com/papyrus_images/4277cccfc394b41cf2dc5427e4bb17ac5cc1454b43cbc5cd56b0bbabda7c6f1c.png)

打开后，点击右下方Verify那个按钮

![](https://storage.googleapis.com/papyrus_images/2a31941f9275da865d36090fa1baf8bca464ff7b7dd7cae2a9bf2e6c8d70aa40.png)

然后打开选择第一个Via flattened source code

![](https://storage.googleapis.com/papyrus_images/cf59258c5eccaa6e85250e3c72058ebc913887cab98fc84eade9efb4e32a13dd.png)

将合约部署的选项调整好，如下图：

![](https://storage.googleapis.com/papyrus_images/c69c955e18273d413209af4f1da2ced4b4e4187c7121ae7830a60795e5b542b5.png)

然后把下面的代码复制到下面的框框里，点击下面的Verify&pubulish按钮即可

    
    // File: ERC20.sol
    
    
    // WTF Solidity by 0xAA
    
    pragma solidity ^0.8.4;
    
    interface IERC20 {
        /**
         * @dev 释放条件：当 `value` 单位的货币从账户 (`from`) 转账到另一账户 (`to`)时.
         */
        event Transfer(address indexed from, address indexed to, uint256 value);
    
        /**
         * @dev 释放条件：当 `value` 单位的货币从账户 (`owner`) 授权给另一账户 (`spender`)时.
         */
        event Approval(address indexed owner, address indexed spender, uint256 value);
    
        /**
         * @dev 返回代币总供给.
         */
        function totalSupply() external view returns (uint256);
    
        /**
         * @dev 返回账户`account`所持有的代币数.
         */
        function balanceOf(address account) external view returns (uint256);
    
        /**
         * @dev 转账 `amount` 单位代币，从调用者账户到另一账户 `to`.
         *
         * 如果成功，返回 `true`.
         *
         * 释放 {Transfer} 事件.
         */
        function transfer(address to, uint256 amount) external returns (bool);
    
        /**
         * @dev 返回`owner`账户授权给`spender`账户的额度，默认为0。
         *
         * 当{approve} 或 {transferFrom} 被调用时，`allowance`会改变.
         */
        function allowance(address owner, address spender) external view returns (uint256);
    
        /**
         * @dev 调用者账户给`spender`账户授权 `amount`数量代币。
         *
         * 如果成功，返回 `true`.
         *
         * 释放 {Approval} 事件.
         */
        function approve(address spender, uint256 amount) external returns (bool);
    
        /**
         * @dev 通过授权机制，从`from`账户向`to`账户转账`amount`数量代币。转账的部分会从调用者的`allowance`中扣除。
         *
         * 如果成功，返回 `true`.
         *
         * 释放 {Transfer} 事件.
         */
        function transferFrom(
            address from,
            address to,
            uint256 amount
        ) external returns (bool);
    }
    
    contract ERC20 is IERC20 {
    
        mapping(address => uint256) public override balanceOf;
    
        mapping(address => mapping(address => uint256)) public override allowance;
    
        uint256 public override totalSupply;   // 代币总供给
    
        string public name;   // 名称
        string public symbol;  // 符号
        
        uint8 public decimals = 18; // 小数位数
        address public owner;
    
        // @dev 在合约部署的时候实现合约名称和符号
        constructor(string memory name_, string memory symbol_){
            name = name_;
            symbol = symbol_;
            owner = msg.sender;
        }
    
        // @dev 实现`transfer`函数，代币转账逻辑
        function transfer(address recipient, uint amount) external override returns (bool) {
            balanceOf[msg.sender] -= amount;
            balanceOf[recipient] += amount;
            emit Transfer(msg.sender, recipient, amount);
            return true;
        }
    
        // @dev 实现 `approve` 函数, 代币授权逻辑
        function approve(address spender, uint amount) external override returns (bool) {
            allowance[msg.sender][spender] = amount;
            emit Approval(msg.sender, spender, amount);
            return true;
        }
    
        // @dev 实现`transferFrom`函数，代币授权转账逻辑
        function transferFrom(
            address sender,
            address recipient,
            uint amount
        ) external override returns (bool) {
            allowance[sender][msg.sender] -= amount;
            balanceOf[sender] -= amount;
            balanceOf[recipient] += amount;
            emit Transfer(sender, recipient, amount);
            return true;
        }
    
        // @dev 铸造代币，从 `0` 地址转账给 调用者地址
        function mint(uint amount) external {
            require(owner == msg.sender);
            balanceOf[msg.sender] += amount;
            totalSupply += amount;
            emit Transfer(address(0), msg.sender, amount);
        }
    
        // @dev 销毁代币，从 调用者地址 转账给  `0` 地址
        function burn(uint amount) external {
            balanceOf[msg.sender] -= amount;
            totalSupply -= amount;
            emit Transfer(msg.sender, address(0), amount);
        }
    
    }
    

成功之后，它会自动跳转到代币的浏览器页面，我们可以看到，Code旁边就已经有个勾勾了，证明我们是已经验证了合约了，非常简单。

![](https://storage.googleapis.com/papyrus_images/2298761802f3584b0dd113bddcf9a76206e799a41274b0bb78d1b0d8850eeace.png)

如果出现错误提醒，肯定是合约部署的选项没有调整确认好，确认好了之后部署就没有问题。

在区块链浏览器的验证合同里面，也可以看到我们刚才验证的ERC20代币合约了，很简单。

![](https://storage.googleapis.com/papyrus_images/119318c979a3d24cf8409a476b33f4186f0eb63c66f7fd2cdbf29cbf7e02fe4a.png)

**下面是Base测试网的合约验证，只需要取消选择一个东西。**

我们打开Base测试网的区块链浏览器，找到自己部署的代币合约。

[https://base-goerli.blockscout.com/verified-contracts](https://base-goerli.blockscout.com/verified-contracts)

点这个小三角就能看到

![](https://storage.googleapis.com/papyrus_images/3967a42e5e9469bbceebbdfaa7fae8caaacec2330b6f648ce5b85bcc7ec8592d.png)

我在Base部署了一个XIAOBUDIAN的XBD代币，点击Contract后，可以看到我们之前部署的代码。

**因为我有一个号已经验证过了，第二个号就会说有同样的合同，那我们就继续去验证，点击下面红圈里的Verify。**

![](https://storage.googleapis.com/papyrus_images/67cefd63be4addc31b4c9a92e916cac597893156e91f04d9bf41172d97f1c67b.png)

还是确认一下合约的选项是否正确，下面需要取消掉那个Optimization的选项，将上面的代码复制到框框里，点击Verify。

![](https://storage.googleapis.com/papyrus_images/f4617204b74c996f8385e52fc5e8880f29ec753f843e047e08beba584d2f7291.png)

成功之后，我们就可以看到，我们部署的代币合约里，已经打勾勾了。

![](https://storage.googleapis.com/papyrus_images/55af03d766ea7a0b9f223b753b01828cc4336ea4d1bf0f442e527a030b33c736.png)

以上就是ERC20合约验证的教程。

---

*Originally published on [Bitbigcat](https://paragraph.com/@bitbigcat/erc20-2)*
