fallback 和 receive 回退函数

//纯转账调用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);
}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值