Solidité - Fonction de repli

La fonction de secours est une fonction spéciale disponible pour un contrat. Il présente les caractéristiques suivantes -

  • Il est appelé lorsqu'une fonction inexistante est appelée sur le contrat.

  • Il doit être marqué externe.

  • Il n'a pas de nom.

  • Il n'a pas d'arguments

  • Il ne peut rien renvoyer.

  • Il peut être défini un par contrat.

  • S'il n'est pas marqué comme payable, il jettera une exception si le contrat reçoit de l'éther ordinaire sans données.

L'exemple suivant montre le concept d'une fonction de secours par contrat.

Exemple

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));
   }
}