Solidity学习之接收发送代币

Solidity学习之函数接收eth

如果要让合约可以接受eth,那么需要payable修饰将要调用的函数,否则函数不能接受eth

// SPDX-License-Identifier: GPL-3.0

pragma solidity 0.8.7;

contract A{
    address payable public owner;
    constructor(){
        owner =payable( msg.sender);
    }

    function deposit() external payable {

    }

    function getBalance() external view returns (uint) {
        return address(this).balance;
    }
}

合约接收eth

当合约定义了Fallback或者Recieve函数,当你调用合约不存在的函数时,会默认调用他们,data是空的时候会优先调用Fallback,所以只要把这两个函数定义为payable,则合约可以接受eth

发送eth

有三种方式,tansfer,send,call

// SPDX-License-Identifier: GPL-3.0

pragma solidity 0.8.7;

contract A{
    constructor() payable {

    }

    function transfer(address payable to) external payable  {
        //不返回任何信息,原子化操作
        to.transfer(123);
    }

    function send(address payable to) external payable{
        bool a =to.send(123);
        //返回是否成功
        require(a,"sendfailed");
    }


    function call(address payable to) external payable{
    //返回是否成功及msg
        (bool a,) = to.call{value:123}("");
        require(a,"call failed");
    }
}

contract B{
    event log(string msg);
    fallback() external  payable {
        emit log("oh money");
    }

    function balance() external view returns (uint){
        return address(this).balance;
    }
}