La función de reserva es una función especial disponible para un contrato. Tiene las siguientes características:
Se llama cuando se llama a una función inexistente en el contrato.
Se requiere que esté marcado como externo.
No tiene nombre.
No tiene argumentos
No puede devolver nada.
Se puede definir uno por contrato.
Si no se marca como pagadero, arrojará una excepción si el contrato recibe ether sin datos.
El siguiente ejemplo muestra el concepto de una función de reserva por contrato.
Ejemplo
pragma solidity ^0.5.0;
contract Test {
uint public x ;
function() external { x = 1; }
}
contract Sink {
function() external payable { }
}
contract Caller {
function callTest(Test test) public returns (bool) {
(bool success,) = address(test).call(abi.encodeWithSignature("nonExistingFunction()"));
require(success);
// test.x is now 1
address payable testPayable = address(uint160(address(test)));
// Sending ether to Test contract,
// the transfer will fail, i.e. this returns false here.
return (testPayable.send(2 ether));
}
function callSink(Sink sink) public returns (bool) {
address payable sinkPayable = address(sink);
return (sinkPayable.send(2 ether));
}
}