¿Solidity está creando un getter implícito para un contrato anidado que se crea?

¿Solidity está creando un captador implícito o no para un contrato anidado que se crea?

Ejemplo:

contract Foo {
   ....
}

contract Bar {
    Foo public foo;

   Bar() {
        foo = new Foo();
   }
}

Al probar esto usando Truffle, me dice que Bar.foo()no es parte del ABI.

¿Estoy haciendo algo mal o foo()simplemente no está siendo creado por el compilador de Solidity? (Espero que devuelva la dirección del Foo()contrato creado)

Respuestas (2)

Si tiene 2 definiciones de contratos en un archivo sol, ContractA y ContractB, y desea implementar ContracB, utilícelo así:

var ContractB = artifacts.require("ContractB")

module.exports = function(deployer) {
  deployer.deploy(ContractB, '750000000000000000000000000', 'MyCoinName', 18,{gas: 4700000})
};

Nota: no se debe usar .sol y se usa el nombre del contrato que se implementará.

En Solidity 0.5.x ha emitido explícitamente un contrato como una dirección. Hay más de una forma de escribir la función para devolver la dirección del contrato. Para observar "implícitamente" en la pregunta ...

contract Foo {
   ....
}

contract Bar {
   Foo foo;
   address public fooAddress;

   Bar() {
        foo = new Foo();
        fooAddress = address(foo);
   }
}

Entonces, thisContract.fooAddress()devuelve el addressde foo.

Espero eso ayude.