发送与接收代币
发送主币
三种方式
transfer
send
call
contract SendEther {
contract() payable {}
receive() external payable {}
function send(address payable _to) external payable {
// _to.transfer(123);
// bool sended = _to.send(123)
// (bool sended, ) = _to.call{value: 123}("")
}
}
接收主币
receive
- 接收主币时调用,一个合约最多只能存在一个该函数。声明方式与一般函数不一样,不需要
function
关键字 receive()
函数不能有任何的参数,不能返回任何值,必须包含external
和payable
- 需要注意的是用户往该合约发送主币时,
gas
会被限制在2300
,如果receive
执行过多的逻辑,可能会出现Out of Gas
错误
contract ReceiveEther {
event ReceivedEvent(address sender, uint value);
receive () external payable {
emit ReceivedEvent(msg.sender, msg.value);
}
}
fallback
- 调用不存在的函数
- 主币被直接发送到合约,但
receive()
不存在或msg.data
不为空
contract ReceiveEther {
event FallbackedEvent(address sender, uint value, bytes data);
fallback () external payable {
emit FallbackedEvent(msg.sender, msg.value, msg.data);
}
}
receive
和 fallback
的执行选择
- 存在
msg.data
调用fallback
- 不存在
msg.data
- 存在
receive
则调用receive
- 不存在
reveive
则调用fallback
- 存在
若 reveive
和 fallback
都不存在, 则会报错