//纯转账调用receiver回退函数,例如对每个空empty calldata的调用

// 除了纯转账外,所有的调用都会调用fallback function.

receive()

一个合约只能有一个receive函数,该函数不能有参数和返回值,需设置为external,payable;

当本合约收到ether但并未被调用任何函数,未接受任何数据,receive函数被触发;

fallback()

一个合约只能有一个receive函数,该函数不能有参数和返回值,需设置为external;

可设置为payable;

当本合约的其他函数不匹配调用,或调用者未提供任何信息,且没有receive函数,fallback函数被触发;

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.0;

// 向合约账户转账
contract terans{
// 向合约账户转账 ev
event TransEvent(address,uint);

//trigger recevier function
//纯转账调用receiver回退函数,例如对每个空empty calldata的调用
function transderToContract() payable public {
payable(address(this)).transfer(msg.value);
}
// 获取合约账户余额
function getBalanceOfContract() public view returns (uint256) {
return address(this).balance;
}
//trigger recevier function
//纯转账调用receiver回退函数,例如对每个空empty calldata的调用
//对函数方法的调用 触发receiver回退函数
function CallTransTest()payable public{
(bool success,) = address(this).call(abi.encodeWithSignature("transderToContract()"));
//emit TransEvent(address(this),2);
}
//trigger fallback function
// 除了纯转账外,所有的调用都会调用这个函数.
// (因为除了 receive 函数外,没有其他的函数).
// 任何对合约非空calldata 调用会执行回退函数(即使是调用函数附加以太).
function CallNoexistTest()payable public{
(bool success,) = address(this).call(abi.encodeWithSignature("noFunction()"));
//emit TransEvent(address(this),1);
}
fallback() external {
emit TransEvent(address(this),1);
}
receive() external payable {
emit TransEvent(address(this),2);
}
}