跳到主要内容

发送与接收代币

发送主币

三种方式

  • 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() 函数不能有任何的参数,不能返回任何值,必须包含 externalpayable
  • 需要注意的是用户往该合约发送主币时,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);
}
}

receivefallback 的执行选择

  • 存在 msg.data 调用 fallback
  • 不存在 msg.data
    • 存在 receive 则调用 receive
    • 不存在 reveive 则调用 fallback

reveivefallback 都不存在, 则会报错