- receive写法
event Received(address _add, uint256 value);
receive() external payable{
emit Received(msg.sender, msg.value);
}
- 注意点
- receive 函数不能写的太复杂,如果别人用send或transfer发送eth的话,因为这两个函数会限制gas费,就会造成“out of gas”发送eth失败
- 写法
event fallbackCalled(address _add, uint256 value);
fallback() external payable{
emit fallbackCalled(msg.sender, msg.value);
}
receive和fallback函数可存在同一个合约,当合约接收ETH时,只会有其中一个函数被触发;
- 当msg.data为空且存在receive函数时会触发receive;
- 当msg.data不为空或者不存在receive函数时触发fallback;
- 如果这两个函数都不存在,则其他合约向该合约发送ETH时会报错;
三种方式发送ETH,send,transfer,call
代码样例
// 用transfer发送eth
function transferETH(address payable _to, uint256 amount) external payable{
_to.transfer(amount);
}
- 用法:接收方.transfer(发送eth的金额) // 这个跟java用法不一样
- 转帐限制gas费2300,所有接收的函数不能写的太复杂,通常就是打印一下日志
- transfer如果失败,会自动revert // revert相当于java里面的throw 抛出异常
用法跟transfer一样,唯一的区别的地方在于失败不会自动revert,需要通过接收bool,手动revert 例如:
error SendFailed(); // 用send发送ETH失败error
// send()发送ETH
function sendETH(address payable _to, uint256 amount) external payable{
// 处理下send的返回值,如果失败,revert交易并发送error
bool success = _to.send(amount);
if(!success){
revert SendFailed();
}
}
上代码
error CallETHFail(address _to, uint256 amount); //自定义异常
function callETH(address payable _to, uint256 amount) external payable{
(bool success,) = _to.call{value:amount}("");
if(!success){
revert CallETHFail(_to,amount);
}
}
- call函数没有gas费限制,是官方推荐的方式
- 需要通过解构式的方式接受转账结果,手动revert