
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
//模拟钱包的取钱
contract slkgaaklrhf {
//思考整个业务流程,首先,需要一个管理员账号,在部署的时候初始化,然后需要一个
//取款的方法,钱包初始化是没有钱的,所以部署的时候也要给他钱,然后在要有一个查看钱包余额的方法
//那么取款的时候是需要验证是否为管理员,好了开始模拟编写
//设置一个账号,但凡是有支付行为的,都需要payable声明
address payable public admin;
//开始初始化,在部署的时候设置管理员
constructor() {
admin \= payable(msg.sender);
}
//部署的时候给予钱, 使用receive,不要使用fallback,因为我们只需要接收币即可,不用调用其他函数
receive() external payable { }
//开始取款方法,在要给钱包取钱的时候,必须要验证是否为管理员,否则就会返回错误
function withdraw(uint _amount) external {
require(msg.sender \== admin,"not is admin");
//开始取款,注意这里必须要使用payable
payable(msg.sender).transfer(_amount);
//admin.transfer(_amount);
}
//查询钱包余额
function getwithdraw() external view returns (uint) {
return address(this).balance;
}
}
//部署时注意,可能会报错误说gas超出预期,思考流程,部署的方式等调试,注意,第一步部署的时候,填写管理员地址,直接部署,部署后,再使用交互进行充值,代码的流程并没有要求在初始化的时候就设置钱包金额
//再来一个跨合约调用方法,传值等操作
//调用合约
contract A {
function setA(address add,uint _x) external {
B(add).setb(_x);
}
function setA2(B add,uint _x) external {
add.setb(_x);
}
function setb(address addr,uint I ,uint l) external payable {
B(addr).setqianbao{value:msg.value}(I,l);
}
}
contract B {
uint bb;
uint bbb \= 123;
function setb(uint num) external {
bb \= num;
}
function getb() external view returns (uint) {
return bb;
}
function setqianbao(uint qian,uint xx) external payable {
bb \= xx;
qian \= msg.value;
}
function getset() external view returns (uint,uint){
return (bb,bbb);
}
}