Back

Lesson 24:
Fallback

Introduction to fallback function and how to use it in your smart contracts.

Visit desktop version for better experiences.

Fallback

fallback function is activated when:

  • A contract is called without any function that exists
  • No data was provided and there is no receive Ether function

A contract can have at most one fallback function declared using either:

  • fallback() external payable { ... }
  • fallback (bytes calldata input) external payable returns (bytes memory output) { ... }

If fallback function was used in place of a receive function, it will only have 2300 gas stipend to limit gas intensive operations.

Notice how function keyword is not required when declaring a fallback function. All fallback functions must have external visibility.

// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; // Example 1: Receiving Ether contract EtherReceiver { uint public totalReceived; // This fallback function is used to keep track of the total Ether received by the contract. // It's triggered when Ether is sent to the contract's address in a transaction without data. fallback() external payable { totalReceived += msg.value; } } // Example 2: Proxy Pattern contract Proxy { address public implementation; constructor(address _implementation) { implementation = _implementation; } // This fallback function is used to implement the proxy pattern. // Assuming implementation variable has `delegatecall` function. // It catches any calls that don't match any of the proxy's functions and forwards them to the implementation contract. // It's triggered when a function that doesn't exist in the proxy contract is called. fallback() external payable { (bool success, ) = implementation.delegatecall(msg.data); require(success); } } // Example 3: Default Functionality contract DefaultFunctionality { // Event to emit when the fallback function is triggered event FallbackTriggered(string message); // This fallback function provides default functionality when no function is specified or the specified function doesn't exist. // It's triggered when the contract is called without specifying any function, or if the function specified doesn't exist in the contract. fallback() external { // Emit an event when the fallback function is triggered emit FallbackTriggered("Fallback function was called."); } } // Example 4: Fallback with bytes type input and output contract FallbackWithInputOutput { // Event to emit when the fallback function is triggered event FallbackTriggered(string message, bytes input, bytes output); // This fallback function takes an input, performs some operation, and returns an output. // It's triggered when the contract is called without specifying any function, or if the function specified doesn't exist in the contract. fallback(bytes calldata input) external payable returns (bytes memory) { // Perform some operation with the input bytes memory output = new bytes(input.length); for (uint i = 0; i < input.length; i++) { output[i] = input[i]; } // Emit an event when the fallback function is triggered emit FallbackTriggered("Fallback function was called.", input, output); return output; } }

© 2024 Scroll Foundation | All rights reserved

Terms of UsePrivacy Policy