1. Part1 收款 (ep.9)
- 建立一個合約PiggyBank
- 部署時就能收Ether
- 部署後也能收Ether
pragma solidity ^0.8.23;
contract PiggyBank{
constructor()payable {}
receive() payable external {}
}
2. Part2 Send Ether (ep.10)
- 將撲滿中的餘額全部領出
pragma solidity ^0.8.23;
contract PiggyBank{
constructor()payable {}
receive() payable external {}
function withdraw() external {
address payable Receiver = payable(msg.sender);
Receiver.transfer(address(this).balance);
}
}
3. Part3 (ep.11)
- 用constructor設定合約的擁有者
- 使用require檢查領錢的發送者是否為合約的擁有者
- 使用modifier將檢查套用在昨天的提領功能上
- 宣告一個修飾子, 跟宣告函式很像
- 允許有輸入參數, 寫在()內
- {}裡就是跟函式本體一樣, 寫各種東西
- _; 是特殊表示法, 代表原本涵式本體
require
- 錯誤處理函式 Error Handle Function
- 當條件為true時, 不會發生事情
- 反之, 會觸發revert("錯誤原因"), 將交易駁回並回報錯誤原因
pragma solidity ^0.8.23;
contract PiggyBank{
address public owner;
modifier onlyOwner(){
require(owner == msg.sender, "Only owner can call this function");
_;
}
constructor()payable {
owner = msg.sender;
}
receive() payable external {}
function withdraw() onlyOwner external {
address payable Receiver = payable(msg.sender);
Receiver.transfer(address(this).balance);
}
}
4. Part4 幫撲滿加上事件 (ep.14)
- 建立合約時觸發create(address, value) 的事件
- 透過receive 收到錢時, 觸發Receive(address, value)的事件
- 提領時, 觸發withdraw(address, value)的事件
pragma solidity ^0.8.23;
contract PiggyBank{
address public owner;
event Create(address owner, uint256 value);
event Receive(address indexed sender, uint256 value);
event Withdraw(address owner, uint256 value);
modifier onlyOwner() {
require(owner == msg.sender, "Only owner can call this function");
_;
}
constructor() payable {
owner = msg.sender;
emit Create(owner, msg.value);
}
receive() payable external{
emit Receive(msg.sender, msg.value);
}
function withdraw() onlyOwner external {
address payable Receiver = payable(msg.sender);
uint256 value = address(this).balance;
Receiver.transfer(value);
emit Withdraw(Receiver, value);
}
}