实况主的捐款合约
//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;
}
}