# 会所ERC20代币合约部署

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

---

偷的一篇英文教程，基本上测试网都能用上，Scroll/Mantle test /Consensys Zkevm都成功部署了。

1.打开：

[https://remix.ethereum.org/#lang=en&optimize=false&runs=200&evmVersion=null&version=soljson-v0.8.18+commit.87f61d96.js](https://remix.ethereum.org/#lang=en&optimize=false&runs=200&evmVersion=null&version=soljson-v0.8.18+commit.87f61d96.js)

点左上角新建一个文件，取名字为 ERC20

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

2、然后打开这个ERC20.SOL文件，把下面代码复制进去

    // SPDX-License-Identifier: MIT
    // 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);
        }
    
    }
    

3、然后点击左边栏的第三个，运行看看能否运行，我是没有任何错误的。

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

4、运行没有问题就下一步部署，点击左边栏第三个，小狐狸要切换到你要部署的那个网络，比如Scroll，你就切换到Scroll网络上去。

**记得上面第一个ENVIRONMENT那里，要选Metamask。**

下面那个Deploy右边有个小三角符号，打开他，然后输入你的代币名称和简写，我直接部署的是GALAXY，简称是GAL。

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

输入完成之后，点击运行transcat，然后钱包就会弹出部署，点确认。

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

成功之后，就会在左下角显示你部署的代币合约了。

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

5、然后我们点击合约旁边那个小三角，展开这个合约来Mint我们的代币。

在Mint那里也有个小三角，把他展开，输入数量：1800000000000000000000

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

然后点击transcat，弹出钱包，就可以获得我们的币了，等链上确认了，我们就复制这个代币合约，去小狐狸钱包添加就能看到了。

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

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

你也可以去测试网的区块链浏览器，去输入合约来查询这个币。

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

可以收藏着，做测试网用用，有些测试网比如想组池子，没有币，就自己造一个币来搞。

---

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