// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
//回滚函数
contract callbalc {
//这里解释一下,如果要接收主币 就要加上payable。
//并且,fallback是一个备用函数,当receive函数不存在的时候,就会执行fallback
fallback() external payable { }
//通常receive只接受主币的业务逻辑
receive() external payable { }
}
//发送ETH端
contract sendETH {
//首先,发送主币需要存入主币,存入主币有三种种方法
//初始化接收
constructor() payable {}
//第二种,接收主币和数据
// fallback() external payable { }
//第一种,只接受主币没有数据
receive() external payable { }
function get_balance() public view returns(uint256) {
return address(this).balance; //获取地址账户余额
}
//发送主币模块 括号里写上参数,发给谁
//第一种 transfer 发送失败返回错误信息 gas=2300
function sendETHTransfer(address payable who) external payable {
who.transfer(3 wei);
}
//第二种,send 只返回布尔值来断定是否成功 gas=2300
function sendETHsend(address payable who) external payable {
//定义一个变量接收布尔值
bool isok \= who.send(4 wei);
//使用定义的布尔值判断
require(isok,"send is no");
}
//第三种
/*
定义 receive 函数的时候要注意 Gas 不足的问题。
前面我们有提到, send 和 transfer 的 Gas 是固定为 2300 的。
所以剩余的 Gas 往往不够进行复杂的操作。
如果函数体要执行较复杂的操作,那么可能会抛出 Out of Gas 异常。
例如,进行下面的这些操作所消耗的 Gas 会超过 2300:
1修改状态变量
2创建合约
3调用其他相对复杂的函数
4发送 Ether 到其他账户
*/
// 特别注意,call方法可以使用所有gas给后续合约使用
// 特别注意,call方法可以使用所有gas给后续合约使用
// 特别注意,call方法可以使用所有gas给后续合约使用
// 特别注意,call方法可以使用所有gas给后续合约使用
function sendETHCall(address payable who) external payable {
(bool isok, ) \= who.call{value:56 wei}("");
require(isok,"send is no");
}
// 调用接收合约的函数
function callFoo(address payable who) external {
(bool success, ) \= who.call{value: 1 wei}(
abi.encodeWithSignature("get()")
);
require(success, "Failed to send Ether");
}
}
//接收主币端
contract getETH {
//开启事件记录
event sendlog(uint number, uint gas);
receive() external payable {
emit sendlog(msg.value,gasleft());
}
//执行
function get() external payable {
emit sendlog(msg.value,gasleft());
}
}
/*
*
总结,当你出现错误
revert
The transaction has been reverted to the initial state.
Reason provided by the contract: "send is no".
You may want to cautiously increase the gas limit if the transaction went out of gas.
creation of sendETH pending...
并且call函数可以发送主币,但是send transfer都无法发送,检查你的函数gas是否超过了,因为这两个函数发送主币给
接收合约,接收合约的接收函数不能有复杂功能,特别是字符串,会消耗大量gas
*/

在部署发送端的合约时,请给予一个初始币的数量,在部署的时候就给钱