---
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)