solidity练习2

ERC20授权转账

//SPDX-License-Identifier:GPL-3.0

pragma solidity ^0.8.17;

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 account) public view returns (uint256) {

        return _balance[account];

    }

    function transfer(address to, uint256 amount) public returns (bool) {

        uint256 myBalance = _balance[msg.sender];

        require(myBalance >= amount, "No money to transfer");

        require(to != address(0), "Transfer to address 0");

        _balance[msg.sender] = myBalance - amount;

        _balance[to] = _balance[to] + amount;

        emit Transfer(msg.sender, to, amount);

        return true;

    }

    function allowance(address owner, address spender) public view returns (uint256){

        return _allowance[owner][spender];

    }

    function approve(address spender, uint256 amount) public returns (bool) {

        _allowance[msg.sender][spender] = amount;

        emit Approval(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");

        _allowance[from][msg.sender] = myAllowance - amount;

        emit Approval(from, msg.sender, myAllowance - amount);

        uint256 fromBalance = _balance[from];

        require(fromBalance >= amount, "ERROR: fromBalance < amount");

        _balance[from] = fromBalance - amount;

        _balance[to] += amount;

        emit Transfer(from, to, amount);

        return true;

    }

}

精简之后

//SPDX-License-Identifier:GPL-3.0

pragma solidity ^0.8.17;

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 account) public view returns (uint256) {

        return _balance[account];

    }

    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];

    }

    function _approve(address owner, address spender, uint256 amount) internal {

        _allowance[owner][spender] = amount;

        emit Approval(owner, 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;

    }

}

猜你喜欢

转载自blog.csdn.net/m0_55772907/article/details/128287735