Pasar una instancia de contrato como argumento al constructor de otro contrato

Necesito usar las funciones del contrato ERC20 en otro contrato.

El contrato ERC20 es de la biblioteca de contratos de openZeppelin. Encontré el siguiente código en un sitio web:

import "../../node_modules/zeppelin-solidity/contracts/token/ERC20/ERC20.sol"; 

contract Escrow is Ownable { 
    ERC20 public currency; 
    address public collectionAddress;

    function Escrow(ERC20 _currency, address _collectionAddress) public { 
        currency = _currency; 
        collectionAddress = _collectionAddress; 
    } 
}

En este código, la instancia ERC20 se pasa como argumento al constructor de Escrow. Eso significa que la instancia ERC20 se almacena en la variable de estado del contrato de depósito en garantía en el momento de la implementación del contrato de depósito en garantía.

Quiero saber cómo escribir el código de implementación para pasar una instancia de contrato como argumento al constructor de otro contrato en trufa.

Además, ¿debería implementarse el contrato ERC20 antes que el contrato Escrow en Truffle o ambos contratos pueden implementarse juntos?

Si es así, ¿cómo sería el script de implementación en truffle?

Creo que aprobar el contrato en sí no es posible. Sin embargo, puede pasar la dirección del contrato
incluso yo creo que sí... pero el código (que encontré en el sitio web) aparentemente está probado...

Respuestas (1)

Nunca lo probé antes, parece que es posible.

Guión de migración:

module.exports = function (deployer) {
    deployer.deploy(TestCoin).then(x => {
        deployer.deploy(Escrow, x.address, collectionAddress)
    });
};

TestCoin es un token ERC20:

pragma solidity ^0.4.24;

import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol"; 
import "openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol"; 

contract TestCoin is ERC20, ERC20Detailed {

    uint256 public constant INITIAL_SUPPLY = 10000 * (10 ** uint256(decimals()));

    constructor() public ERC20Detailed("TestCoin", "TC", 18) {
        _mint(msg.sender, INITIAL_SUPPLY);
    }
}