{"content":{"title":"模仿ERC20写的代币合约","body":"标准接口\r\n --\r\n \r\n```\r\n//总发行量\r\nfunction totalSupply() public view returns (uint256) \r\n\r\n// 指定账户的余额\r\nfunction balanceOf(address _owner) public view returns (uint256 balance)\r\n\r\n//币的持有人直接调用，进行转账\r\nfunction transfer(address _to, uint256 _value) public returns (bool success)\r\n\r\n// 1. 我这个owner对合约进行approve，此时approve内部会修改allowance变量\r\n// 2. 合约内部调用transferFrom来支配owner的token\r\nfunction transferFrom(address _from, address _to, uint256 _value) public returns (bool success)\r\n\r\n// owner: 币的持有人\r\n// spender: 是指定帮助花费的代理人（被授权的人）\r\nfunction allowance(address owner, address spender) external view returns (uint); // 授权的额度\r\n\r\n// decimals view，这是一个public 的变量，自动提供了一个读取的方法 // 返回精度\r\n// 持有人对spender进行授权，在approve内部，会调用msg.sender来知道owner是谁\r\nfunction approve(address spender, uint amount) external returns (bool);\r\n\r\n// 2  事件\r\nevent Transfer(address indexed _from, address indexed _to, uint256 _value)\r\nevent Approval(address indexed _owner, address indexed _spender, uint256 _value)\r\n\r\n// 3. \r\nfunction name() public view returns (string)\r\nfunction symbol() public view returns (string)\r\nfunction decimals() public view returns (uint8)\r\n```\r\n\r\n定义相关接口：\r\n---\r\n\r\n```\r\n// SPDX-License-Identifier: GPL-3.0\r\n\r\npragma solidity >=0.7.0 <0.9.0;\r\n\r\ninterface ERC20Interface {\r\n    function totalSupply() external view returns (uint256);\r\n\r\n    function balanceOf(address _owner) external view returns (uint256 balance);\r\n\r\n    function transfer(address _to, uint256 _value)\r\n        external\r\n        returns (bool success);\r\n\r\n    function transferFrom(\r\n        address _from,\r\n        address _to,\r\n        uint256 _value\r\n    ) external returns (bool success);\r\n\r\n    function approve(address _spender, uint256 _value)\r\n        external\r\n        returns (bool success);\r\n\r\n    function allowance(address _owner, address _spender)\r\n        external\r\n        view\r\n        returns (uint256 remaining);\r\n\r\n    event Transfer(address indexed _from, address indexed _to, uint256 _value);\r\n\r\n    event Approval(\r\n        address indexed _owner,\r\n        address indexed _spender,\r\n        uint256 _value\r\n    );\r\n}\r\n\r\n```\r\n实现接口的合约代码\r\n--\r\n```\r\n// SPDX-License-Identifier: GPL-3.0\r\n\r\npragma solidity >=0.7.0 <0.9.0;\r\n\r\nimport \"./ERC20Interface.sol\";\r\n\r\ncontract ERC20 is ERC20Interface {\r\n    string private _name;\r\n    string private _symbol;\r\n    uint8 private _decimals;\r\n\r\n    mapping(address => uint256) balances;\r\n\r\n    mapping(address => mapping(address => uint256)) private allowed;\r\n\r\n    constructor() {\r\n        _name = \"Arrom\";\r\n        _decimals = 18;\r\n        _symbol = \"AOM\";\r\n        balances[msg.sender] = totalSupply();\r\n    }\r\n\r\n    function name() public view returns (string memory) {\r\n        return _name;\r\n    }\r\n\r\n    function symbol() public view returns (string memory) {\r\n        return _symbol;\r\n    }\r\n\r\n    function decimals() public view returns (uint8) {\r\n        return _decimals;\r\n    }\r\n\r\n    function totalSupply() public pure returns (uint256) {\r\n        return 10_0000_0000;\r\n    }\r\n\r\n    function balanceOf(address _owner) external view returns (uint256 balance) {\r\n        return balances[_owner];\r\n    }\r\n\r\n    function transfer(address _to, uint256 _value)\r\n        external\r\n        returns (bool success) \r\n    {\r\n        require(_to != address(0));\r\n        require(balances[msg.sender] >= _value);\r\n        require(balances[_to] + _value >= balances[_to]);\r\n\r\n        balances[msg.sender] -= _value;\r\n        balances[_to] += _value;\r\n        emit Transfer(msg.sender, _to, _value);\r\n        return true;\r\n    }\r\n\r\n    function transferFrom(\r\n        address _from,\r\n        address _to,\r\n        uint256 _value\r\n    ) external returns (bool success) {\r\n        require(_to != address(0));\r\n        require(balances[_from] >= _value);\r\n\r\n        require(allowed[_from][msg.sender] >= _value);\r\n\r\n        require(balances[_to] + _value >= balances[_to]);\r\n\r\n        balances[_from] -= _value;\r\n        balances[_to] += _value;\r\n        emit Transfer(_from, _to, _value);\r\n        return true;\r\n    }\r\n\r\n    function approve(address _spender, uint256 _value)\r\n        external\r\n        returns (bool success)\r\n    {\r\n        require(_spender != address(0));\r\n        allowed[msg.sender][_spender] = _value;\r\n        emit Approval(msg.sender, _spender, _value);\r\n\r\n        return true;\r\n    }\r\n\r\n    function allowance(address _owner, address _spender)\r\n        external\r\n        view\r\n        returns (uint256 remaining)\r\n    {\r\n        return allowed[_owner][_spender];\r\n    }\r\n}\r\n```\r\n部署成功的\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2022/11/fpy974ud637498c06e45c.png)\r\n\r\n转账的截图\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2022/11/vMDtXAa36374998fd380d.png)"},"author":{"user":"https://learnblockchain.cn/people/5348","address":null},"history":null,"timestamp":1668586319,"version":1}