6.4 Uso de fallback y receive

html

6.4 Uso de fallback y receive en Solidity

En Solidity, las funciones fallback y receive son especiales y tienen roles específicos en la gestión de los contratos. Estas funciones se utilizan principalmente para recibir Ether y manejar llamadas que no coinciden con ninguna otra función en el contrato.

Receive Function

La función receive se utiliza para recibir Ether cuando no se especifican datos en la transacción. Si un contrato no tiene una función receive, pero tiene un fallback, la función fallback se ejecutará en su lugar si se recibe Ether sin datos.

Ejemplo de receive

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0

contract ReceiveExample {
    event ReceivedEther(address sender, uint amount)

    // La función receive se activa solo cuando se recibe Ether sin datos
    receive() external payable {
        emit ReceivedEther(msg.sender, msg.value)
    }
}

En este ejemplo, la función receive es de tipo external y payable, lo que significa que puede recibir Ether. Cuando se recibe Ether sin datos, la función receive se ejecuta y emite un evento ReceivedEther con la dirección del remitente y la cantidad de Ether recibido.

Fallback Function

La función fallback se utiliza cuando no coinciden con ninguna otra función del contrato o cuando se reciben datos incorrectos. La función fallback también puede ser marcada como payable para recibir Ether.

Ejemplo de fallback

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0

contract FallbackExample {
    event FallbackCalled(address sender, uint amount, bytes data)

    // La función fallback se activa cuando no se encuentran otras coincidencias
    fallback() external payable {
        emit FallbackCalled(msg.sender, msg.value, msg.data)
    }
}

En este ejemplo, la función fallback es de tipo external y payable. Se ejecuta cuando no se encuentra una coincidencia con ninguna otra función en el contrato, o cuando se llaman con datos que no coinciden con ninguna función definida. La función emite un evento FallbackCalled con la dirección del remitente, la cantidad de Ether recibida y los datos.

Uso combinado de receive y fallback

Podemos combinar ambas funciones en un contrato para manejar de manera más eficiente las transacciones entrantes, diferenciando entre aquellas que contienen datos y las que no.

Ejemplo combinado

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0

contract CombinedExample {
    event ReceivedEtherWithoutData(address sender, uint amount)
    event FallbackCalled(address sender, uint amount, bytes data)

    // La función receive se ejecuta cuando se recibe Ether sin datos
    receive() external payable {
        emit ReceivedEtherWithoutData(msg.sender, msg.value)
    }

    // La función fallback se ejecuta para llamadas que no coinciden con ninguna función definida y para llamadas con datos que no coinciden
    fallback() external payable {
        emit FallbackCalled(msg.sender, msg.value, msg.data)
    }
}

En este ejemplo, si se envía Ether al contrato sin datos, se llamará a la función receive. Si se llama al contrato con datos que no coinciden con ninguna otra función, la función fallback será llamada. Ambas funciones emiten eventos diferentes, lo que permite diferenciar cómo se llamó al contrato.

AnteriorSiguiente

[mwai_chat]

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *