A veces el comportamiento de nuestro contrato depende del resultado de una llamada externa a otro contrato. Esto lo debemos verificar correctamente y no confiarnos de que las cosas en el otro contrato fueron exitosas.
Validación de llamadas a contratos externos
Si realizas una llamada a otro contrato, con excepción de que realmente no nos interese el resultado, haz la validación necesaria para saber qué sucedió en la llamada.
uint llamadasExitosas;
function incrementarLlamadas(address direccion) public {
direccion.call(abi.encodedPacked("algunaFuncion()"));
llamadasExitosas++;
}
Es una buena práctica utilizar la función revert()
para revertir las operaciones realizadas en caso de un error.
uint llamadasExitosas;
function incrementarLlamadas(address direccion) public {
(bool resultado) = direccion.call(abi.encodedPacked("algunaFuncion()"));
if (!resultado) revert();
if (resultado) llamadasExitosas++;
}
El otro contrato puede haberse quedado sin gas o haber algún tipo de problema en la llamada como para que la misma no se haya concretado correctamente. Asegura el código de tu contrato antes de continuar luego de llamados externos y evitar gastos innecesarios.
Hacer una llamada a otro contrato inteligente no deja de ser similar al consumo de una API de un tercero. Debemos actuar de una manera u otra dependiendo el resultado satisfactorio o no de la misma.
Contribución creada por: Kevin Fiorentino (Platzi Contributor).
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?