// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
// 模拟一个存钱罐合约,当用户取钱时,存钱罐销毁
contract chunqianguan {
//思考,首先,谁存入的钱?谁调用合约,谁就存钱了
//定义一个当前调用者 PS:合约部署者首次调用的人,后续其他人调用无效
address public user \= msg.sender;
//定义一个事件
event chunru (address user,uint amount);
//定义一个取出shij
event quchulog (address user,uint amount);
//然后第二个问题,存多少?用户输入多少,就是存入多少
//当然合约要能接受钱,
receive() external payable {
//定义一个变量,存入多少
uint money \= msg.value;
//存入了多少,我需要告诉客户,所以需要一个事件记录
emit chunru(user, money);
}
//存入功能有了,现在需要一个取出功能
//取出了钱合约就消耗,现在要确定是谁取出了钱
function quchu() external payable{
//自己取自己的钱
//判断一下是否为当前合约调用者
//PS:这里经过部署测试,错了,我自己都搞入误区了
/*
require(布尔值结果,false结果执行的字符串)
也就是说,这里 user 不等于 当前合约的地址,那么就抛出错误,这个是正常编程语言的结果
但是在solidity中,user 不等于 当前合约的地址,是符合不等式表达的,所以是true,会继续执行后面的代码而不报错
也就是中间是布尔表达式
举例: 1 != 2 结果是 true,因为1确实不等于2 1 == 2 结果是false 因为 1等于2是不成立的,所以false
*/
require(user \== msg.sender,"not you money");
//给出一个事件,用户取出了多少需要告知给用户
emit quchulog(user,user.balance);
//合约销毁传递给谁? msg.sender
selfdestruct(payable (msg.sender));
}
}