37-Solidity8.0-发送ETH(transfer、send和call)

481 阅读1分钟

transfer(2300 gas,抛出错误)

send(2300 gas,返回布尔值)

call(转发所有gas或设置gas,返回布尔值)

三个方法的共同点:addr.transfer(1 ether)、addr.send(1 ether)、addr.call.value(1 ether)的接收方都是addr

如果使用addr.transfer(1 ether)、addr.send(1 ether),addr合约中必须增加fallback回退函数!

如果使用addr.call.value(1 ether),那么被调用的方法必须添加payable修饰符,否则转账失败!

源码:

pragma solidity ^0.8.7;

// 3 ways to send ETH
// transfer - 2300 gas, reverts
// send - 2300 gas, returns bool
// call -all gas, return bool and data

contract SendEther{
    constructor() payable{}

    receive() external payable {}

    function sendViaTransfer(address payable _to) external payable {
        _to.transfer(123);
    }

    function sendViaSend(address payable _to) external payable {
        bool sent = _to.send(123);
        require(sent, "send failed");
    }

    function sendViaCall(address payable _to) external payable {
        (bool success,) = _to.call{value: 123}("");
        require(success, "call failed");
    }
}

contract EthReceiver {
    event Log(uint amount, uint gas);

    receive() external payable {
        emit Log(msg.value,gasleft());
    }
}