304. 花別人的錢 + dry the code - ERC20 (ep.20)

閱讀時間約 7 分鐘

1. 從第三方帳戶轉帳的函式

transferFrom(address from, address to, uint256 amount)

  1. 呼叫者msg.sender 從代幣持有者from 轉帳給接收者amount數量的代幣
  2. 需檢查呼叫者是否有足夠的額度可用
  3. 轉帳時要檢查持有者是否有足夠的餘額
  4. 轉帳時需要同時減去額度

2. Dry the code

  1. 畫面更簡潔, 也更不容易犯錯
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;

interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);

function totalSupply() external view returns (uint256);

function balanceOf(address account) external view returns(uint256);
function allowance(address owner, address spender) external view returns (uint256);

function approve(address spender, uint256 amount) external returns (bool);
function transfer(address to, uint256 amount) external returns (bool);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}

contract ERC20 is IERC20 {
uint256 _totalSupply;
mapping(address => uint256) _balance;
mapping(address => mapping(address => uint256)) _allowance;

constructor(){
_balance[msg.sender] = 10000;
_totalSupply = 10000;
}

function totalSupply() public view returns (uint256){
return _totalSupply;
}

function balanceOf(address accmount) public view returns (uint256) {
return _totalSupply;
}

function _transfer(address from, address to, uint256 amount) internal {
uint256 myBalance = _balance[from];
require(myBalance >= amount, "No money to transfer");
require(to != address(0), "Transfer to address 0");

_balance[from] = myBalance - amount;
_balance[to] = _balance[to] + amount;
emit Transfer(from, to, amount);
}
function transfer(address to, uint256 amount) public returns (bool){
_transfer(msg.sender, to, amount);
return true;
}

function allowance(address owner, address spender) public view returns (uint256){
return _allowance[owner][spender];
//_allowance => (mapping(address => mapping(address => uint256)))
//_allowance[owner] => (mapping(address => uint256))
//(_allowance[owner])[spender] => uint256
}

function _approve(address owner, address spender, uint256 amount) internal {
_allowance[owner][spender] = amount;
emit Approval(msg.sender, spender, amount);
}
function approve(address spender, uint256 amount) public returns (bool){
_approve(msg.sender, spender, amount);
return true;
}

function transferFrom(address from, address to, uint256 amount) public returns (bool){
uint256 myAllowance = _allowance[from][msg.sender];
require(myAllowance >= amount, "ERROR: myAllowance < amount");
_approve(from, msg.sender, myAllowance - amount);
_transfer(from, to, amount);
return true;
}
}
尋大神腳印, 亦步亦趨。
留言0
查看全部
發表第一個留言支持創作者!
從 Google News 追蹤更多 vocus 的最新精選內容