讓直播主本人成為合約擁有者
合約定義
- 建立時, 須將合約的建立者設定成owner(constructor, msg.sender)
- 須記錄每個觀眾的捐款總額(mapping)
- 每次收到捐款時, 需要觸發捐款事件(event)
- 列出捐款者, 列出捐款者, 捐款金額(indexed)
- 提供函式可以查詢觀眾的總捐款金額(returns)
- 提供函示可以查詢觀眾的VIP等級(string, if)
- 沒捐款過 -> "None"
- > 0 ETH -> "N"
- > 1 ETH -> "R"
- > 5 ETH -> "SR"
- > 10 ETH -> "UR"
- 提供函示讓實況主可以提領金額, 且觸發提領事件(payable, address, balance, transfer)
- 列出提款者, 提款金額
pragma solidity ^0.8.23;
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];
}
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) {
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);
}
}