如果要让合约可以接受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;
}
}
当合约定义了Fallback或者Recieve函数,当你调用合约不存在的函数时,会默认调用他们,data是空的时候会优先调用Fallback,所以只要把这两个函数定义为payable,则合约可以接受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;
}
}
