# Solidity学习之接收发送代币

By [林夕云](https://paragraph.com/@0xa91ccaeb1206a1fe86c00801555afa1d79fbdd52) · 2022-09-09

---

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;
        }
    }

---

*Originally published on [林夕云](https://paragraph.com/@0xa91ccaeb1206a1fe86c00801555afa1d79fbdd52/solidity-3)*
