Skip to content

Latest commit

 

History

History
78 lines (64 loc) · 2.23 KB

File metadata and controls

78 lines (64 loc) · 2.23 KB

接收ETH

接受ETH函数-receive

  1. receive写法
event Received(address _add, uint256 value);

receive() external payable{
    emit Received(msg.sender, msg.value);
}

  1. 注意点
    • receive 函数不能写的太复杂,如果别人用send或transfer发送eth的话,因为这两个函数会限制gas费,就会造成“out of gas”发送eth失败

回退函数-fallback

  1. 写法
event fallbackCalled(address _add, uint256 value);

fallback() external payable{
    emit fallbackCalled(msg.sender, msg.value);
}

receive和fallback的区别

receive和fallback函数可存在同一个合约,当合约接收ETH时,只会有其中一个函数被触发;

  • 当msg.data为空且存在receive函数时会触发receive;
  • 当msg.data不为空或者不存在receive函数时触发fallback;
  • 如果这两个函数都不存在,则其他合约向该合约发送ETH时会报错;

发送ETH

三种方式发送ETH,send,transfer,call

transfer

代码样例

// 用transfer发送eth
function transferETH(address payable _to, uint256 amount) external payable{
    _to.transfer(amount);
}
  • 用法:接收方.transfer(发送eth的金额) // 这个跟java用法不一样
  • 转帐限制gas费2300,所有接收的函数不能写的太复杂,通常就是打印一下日志
  • transfer如果失败,会自动revert // revert相当于java里面的throw 抛出异常

send

用法跟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();
    }
}

call

上代码

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