Error al crear una instancia de contrato implementado usando la consola de truffle

Implementé el contrato Token y Crowdsale en archivos de migración separados. Durante la migración, no hubo ningún error. Los registros de migración se comparten:

Running migration: 2_deploy_token.js Deploying DappToken... ... 0xc1ed596e0249507186d75f2d42ba1c34e5b72697774baf9a283e0fb422214b70 DappToken: 0x949e24c24a79f437bbf75d3da7b9ba50235c2a8a Saving successful migration to network... ... 0x1c8bc4b87bfbfa40bb16aa3eb6cf0341efc79f444b1e293abd1f0db394881d55 Saving artifacts... Running migration: 3_deploy_crowdsale.js Saving successful migration to network... Deploying DappTokenCrowdsale... ... 0xdae8535756b9b7100af8d1a3bdf9d20b622c25dcb03aa40435b7f7019bfcdf7a Guardando artefactos...

Después de esto, cuando traté de crear una instancia de Crowdsale usando la consola truffle como

truffle(ganache)> DappTokenCrowdsale.deployed().then(ic => tokensale = ic)

Recibí el error:

Error: DappTokenCrowdsale no se ha implementado en la red detectada (discrepancia de red/artefacto)

Aunque he creado con éxito la instancia del contrato DappToken. Los archivos relacionados se comparten a continuación:

DappTokenCrowdsale.sol

pragma solidity 0.4.24;

import "openzeppelin-solidity/contracts/crowdsale/Crowdsale.sol";

contract DappTokenCrowdsale is Crowdsale {

  constructor(
    uint256 _rate,
    address _wallet,
    ERC20 _token
  )
    Crowdsale(_rate, _wallet, _token)
    public
  {
  }
}

3_deploy_crowdsale.js

const DappToken = artifacts.require("./DappToken.sol");
const DappTokenCrowdsale = artifacts.require('DappTokenCrowdsale');

module.exports = async function(deployer, network, accounts) {
    const deployedToken = await DappToken.deployed();
    const _rate = 1000;
    const _wallet = accounts[1];
    const _token = deployedToken.address;

    await deployer.deploy(DappTokenCrowdsale, _rate, _wallet, _token);
};

2_deploy_token.js

const DappToken = artifacts.require("./DappToken.sol");

module.exports = async function(deployer, network, accounts) {
  const _name = "Dapp Token";
  const _symbol = "DAPP";
  const _decimals = 18;

  await deployer.deploy(DappToken, _name, _symbol, _decimals);
};
El mensaje de migración era como:
Running migration: 2_deploy_token.js Deploying DappToken... ... 0xc1ed596e0249507186d75f2d42ba1c34e5b72697774baf9a283e0fb422214b70 DappToken: 0x949e24c24a79f437bbf75d3da7b9ba50235c2a8a Saving successful migration to network... ... 0x1c8bc4b87bfbfa40bb16aa3eb6cf0341efc79f444b1e293abd1f0db394881d55 Saving artifacts... Running migration: 3_deploy_crowdsale.js Saving successful migration to network... Deploying DappTokenCrowdsale... ... 0xdae8535756b9b7100af8d1a3bdf9d20b622c25dcb03aa40435b7f7019bfcdf7a Guardando artefactos...
Tu pregunta parece un poco confusa. Entonces, ¿en qué paso y en qué archivo obtuviste el error?
Hola @AK um, cuando ejecuto la recomendación de migración, parece que se implementaron todos los contratos (DappToken, DappTokenCrowdsale). Sin embargo, cuando accedí a la consola de truffle e intenté crear una instancia de esos contratos, no puedo crear para crowdsale. el mensaje decía, DappTokenCrowdsale no se ha implementado a pesar de que no hubo errores en el procesamiento de la migración.
Si tiene preguntas sobre el uso de OpenZeppelin, también puede preguntar en el foro de la comunidad: forum.openzeppelin.com Divulgación: soy el administrador de la comunidad en OpenZeppelin

Respuestas (1)

En caso de migración, no puede estar seguro de que el contrato se implementó, devuelve el hash de la transacción. Debe eliminar async/await(es la forma más sencilla) para ver el resultado de la implementación.

const DappToken = artifacts.require("./DappToken.sol");

module.exports = function(deployer, network, accounts) {
    const _name = "Dapp Token";
    const _symbol = "DAPP";
    const _decimals = 18;

    deployer.deploy(DappToken, _name, _symbol, _decimals)
        .then(function () {
             return deployer.deploy(Crowdsale, DappToken.address);
        });
};
Gracias por comentar. Quiero migrar Token y Crowdsale por separado, y en deployment_crowdsale.js, ¿cómo puedo obtener la dirección del token que ya se ha implementado? Intenté const deploymentToken = DappToken.deployed(), pero no está definido.
@UnhaBack echa un vistazo al código de arriba
Gracias @Aquila. Sólo curioso. Si quiero separar el archivo de migración para Token y Crowdsale individualmente, ¿hay alguna forma de obtener la dirección del token en el archivo de migración de Crowdsale?
@UnhaBack sí, es posible, hay varias formas de hacerlo. por ejemplo, puede consultar el script de migración github.com/oceanprotocol/keeper-contracts paraOceanToken
Gracias @Aqualia. Encontré el problema. En realidad, obtuve la instancia de la definición de DappToken en la parte superior, pero la definí nuevamente como "const deploymentToken = DappToken.deployed()" y cometió un error. Ahora, está funcionando bien.