{"content":{"title":"solidity ->fallback","body":"fallback\r\n---\r\nfallback是特殊的函数，无参数，无返回值\r\n\r\n何时会被调用：\r\n1. 当被调用的方法不存在时，fallback会被调用，属于default函数；\r\n2. 当向合约转ether但是合约不存在receive函数时；\r\n3. 当向合约转ether但是msg.data不为空时。（即使receive存在）\r\n\r\n当使用transfer或者send对合约进行转账时，fallback函数的gaslimit限定为2300 gas\r\n\r\n```\r\n// SPDX-License-Identifier: SEE LICENSE IN LICENSE\r\npragma solidity ^0.8.9;\r\n\r\ncontract Fallback {\r\n    event Log(uint gas);\r\n\r\n    fallback() external payable {\r\n        //gasleft 当前还剩的gas\r\n        emit Log(gasleft());\r\n    }\r\n    function getBalance() public view returns (uint) {\r\n        return address(this).balance;\r\n    }\r\n}\r\n\r\ncontract SendToFallback {\r\n    function transferToFallback(address payable _to) public payable {\r\n        _to.transfer(msg.value);\r\n    }\r\n\r\n    function callFallback(address payable _to) public payable {\r\n        (bool sent, ) = _to.call{value: msg.value}(\"\");\r\n        require(sent, \"Failed to send Ether\");\r\n    }\r\n\r\n    function callNoExistFunc(address payable _to) public payable {\r\n        (bool sent, ) = _to.call{value: msg.value}(\r\n            abi.encodeWithSignature(\"noExistFunc()\")\r\n        );\r\n        require(sent, \"Failed to call\");\r\n    }\r\n}\r\n\r\n```"},"author":{"user":"https://learnblockchain.cn/people/5348","address":null},"history":null,"timestamp":1668415798,"version":1}