Llamar a la función de otro contrato falla sin razón aparente

Tengo este fragmento de código en Remix-IDE + Metamask, ambos en las versiones más recientes (pero también probé sin Remix-IDE):

pragma solidity ^0.4.10;

contract Foo {
    bool public lastVal = false;

    function fooFunc(bool x) public returns (bool) {
        lastVal = x;
        return !x;
    }
}

contract Bar {
    bool public barBool = false;
    Foo myFoo;

    function Bar(address _myFooAddr) public {
        myFoo = Foo(_myFooAddr);
    }

    function barFunc() public {
        barBool = myFoo.fooFunc(barBool);
    }
}

Cada vez que llamo a barFunc() Remix-IDE se niega a ejecutarlo porque dice que la transacción seguramente fallará. Si obligo a ejecutar la transacción, en realidad falla con un REVERT.

De todos modos, no veo ninguna razón aparente de por qué esto debería fallar.

Muchas gracias por tu ayuda.

Este código funciona bien para mí. Asegúrese de ingresar la dirección correcta para su Foocontrato implementado y asegúrese de incluir la dirección entre comillas dobles.
Sí, la razón fue que Remix-IDE quiere la dirección entre comillas.

Respuestas (1)

Copié y pegué su código para remezclar y elegí JavaScripit VM para verificar si el código está bien. Primero inicialicé el contrato de Foo y luego el contrato de Bar proporcionando la dirección de la instancia de Foo como argumento para el constructor y todo funciona para mí como debería (al menos según tengo entendido). Así que el código en sí no es un problema. ¿Puede haber algo mal con la comunicación entre el remix y MetaMask, tal vez?

Lo siento, finalmente entendí el por qué. En Remix-IDE debes usar comillas al pasar una dirección a una función. Ahora funciona. Me confundí también porque el análisis estático destacaba que barFunc() tenía un costo infinito. Espero que esto ayude a otros.