--- title: 'Solidity WTF 103 31 單元' lang: zh-tw --- Solidity WTF 103 31 單元 === :::info :date: 2024/10/10 ::: [TOC] # ERC20 ## 簡介 `ERC20`以太坊上的標準,是V神參與的[EIP20](https://eips.ethereum.org/EIPS/eip-20),實現了基本的代幣轉帳邏輯。 可以想像,`ERC20`就是實現`IERC20`的方法,`IERC20`則是給予一個規範,讓`ERC20`有一個標準去發行代幣。 ## 使用方法 ```javascript! // SPDX-License-Identifier: MIT pragma solidity ^0.8.21; import "./IERC20.sol"; 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 = 15; constructor(string memory name_, string memory symbol_){ name = name_; symbol = symbol_; } function transfer(address recipient, uint amount) public override returns (bool) { balanceOf[msg.sender] -= amount; balanceOf[recipient] += amount; emit Transfer(msg.sender, recipient, amount); return true; } function approve(address spender, uint amount) public override returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transferFrom( address sender, address recipient, uint amount ) public override returns (bool) { allowance[sender][msg.sender] -= amount; balanceOf[sender] -= amount; balanceOf[recipient] += amount; emit Transfer(sender, recipient, amount); return true; } function mint(uint amount) external { balanceOf[msg.sender] += amount; totalSupply += amount; emit Transfer(address(0), msg.sender, amount); } function burn(uint amount) external { balanceOf[msg.sender] -= amount; totalSupply -= amount; emit Transfer(msg.sender, address(0), amount); } } ``` :::warning 注意`import`的`IERC20.sol`,可以去`Open Zeppelin`拿取。 ::: # IERC20 ## 簡介 是`ERC20`的代幣標準接口合約,規定`ERC20`代幣需要實現的函數和事件。 所以`IERC20`不用管函數內部如何實現,只定義函數名稱、參數輸入、輸出參數。感覺像是分為內部和外部兩種,一個重點實現,另一個是接口。 ## Open Zeppelin 這邊有`IERC20`的`sol`,`Open Zeppelin`有寫好一份。 [點選這](https://github.com/openzeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol)