solidity练习1

实况主的捐款合约

//SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.17;

contract Donation {

    address public owner;

    mapping(address => uint256) donationList;

    event Donate(address indexed sender, uint256 value);

    event Withdraw(address indexed owner, uint256 value);

    modifier onlyOwner() {

        require(msg.sender == owner,"Only owner can access this function");

        _;

    }

    constructor() {

        //将合约的拥有者设定为建立合约的人

        owner = msg.sender;

    }

    //收受捐款的函数

    function donate() public payable {

        donationList[msg.sender] += msg.value;

        emit Donate(msg.sender, msg.value);

    }

    //查询捐款总金额

    function getHistory() public view returns (uint256) {

        return donationList[msg.sender];

    }

    //查询vip等级

    function getRank() public view returns (string memory) {

        if (donationList[msg.sender] > 10 ether) {

            return "UR";

        } else if (donationList[msg.sender] > 5 ether) {

            return "SR";

        } else if (donationList[msg.sender] > 1 ether) {

            return "R";

        } else if (donationList[msg.sender] > 0 ether) {

            return "N";

        } else {

            return "None";

        }

    }

    //提钱

    function withdraw() onlyOwner public {

        address payable receiver = payable(owner);

        uint256 value = address(this).balance;

        receiver.transfer(value);

        emit Withdraw(receiver,value);

    }

}

IERC转账篇

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

   

    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;

    }

}

IERC授权篇

//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 {

    mapping(address => mapping(address => uint256)) _allowance;

    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;

    }

}

猜你喜欢

转载自blog.csdn.net/m0_55772907/article/details/128278095
今日推荐