"Excepción de máquina virtual al procesar la transacción: código de operación no válido" al implementar el contrato

Recibo el siguiente error al implementar con web3js un contrato inteligente basado en Open Zeppelin :

Uncaught (in promise) Error: VM Exception while processing transaction: invalid opcode
    at Object.InvalidResponse (errors.js:35)
    at requestmanager.js:86
    at XMLHttpRequest.request.onreadystatechange (httpprovider.js:122)

donde esta el codigo del contrato

pragma solidity ^0.4.15;

import "./libs/zeppelin/crowdsale/CappedCrowdsale.sol";
import "./libs/zeppelin/crowdsale/FinalizableCrowdsale.sol";
import './TestToken.sol';

contract SampleCrowdsale is CappedCrowdsale, FinalizableCrowdsale {

    TestToken public testToken ;

  function SampleCrowdsale(uint256 _startTime, uint256 _endTime, uint256 _rate, uint256 _goal, uint256 _cap, address _wallet, address _tokenContractAddress)
    CappedCrowdsale(_cap)
    FinalizableCrowdsale()
    Crowdsale(_startTime, _endTime, _rate, _wallet)
  {

    testToken = TestToken(_tokenContractAddress);
  }

  function createTokenContract() internal returns (MintableToken) {
    return testToken;
  }

}

Sin embargo, todo funciona cuando cambio FinalizableCrowdsalea RefundableCrowdsale:

pragma solidity ^0.4.15;

import "./libs/zeppelin/crowdsale/CappedCrowdsale.sol";
import "./libs/zeppelin/crowdsale/RefundableCrowdsale.sol";
import './TestToken.sol';

contract SampleCrowdsale is CappedCrowdsale, RefundableCrowdsale {

    TestToken public testToken ;

  function SampleCrowdsale(uint256 _startTime, uint256 _endTime, uint256 _rate, uint256 _goal, uint256 _cap, address _wallet, address _tokenContractAddress)
    CappedCrowdsale(_cap)
    FinalizableCrowdsale()
    Crowdsale(_startTime, _endTime, _rate, _wallet)
  {
    require(_goal <= _cap);
    testToken = TestToken(_tokenContractAddress);
  }

  function createTokenContract() internal returns (MintableToken) {
    return testToken;
  }

}

Pregunta: ¿Puede alguien explicarme por qué el primer contrato que se usa FinalizableCrowdsalearroja ese error? RefundableCrowdsalehereda FinalizableCrowdsalepero no da ningún error...

Archivos relacionados:

  1. https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/crowdsale/Crowdsale.sol
  2. https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/crowdsale/FinalizableCrowdsale.sol
  3. https://github.com/OpenZeppelin/zeppelin-solidity/blob/master/contracts/crowdsale/RefundableCrowdsale.sol

Respuestas (1)

Pude implementar su FinalizableCrowdsale SampleCrowdsaledespués de eliminar la FinalizableCrowdsale()llamada del constructor.

Usé los siguientes parámetros en la llamada al constructor:

1511030956, 1511117356, 1, 100, 200, "0x01", "0x02"

Implementé mi contrato usando Remix, así que modifiqué el código ligeramente a esto (especialmente porque no tenía el código TestToken):


pragma solidity ^0.4.15;

import "github.com/OpenZeppelin/zeppelin-solidity/contracts/crowdsale/CappedCrowdsale.sol";
import "github.com/OpenZeppelin/zeppelin-solidity/contracts/crowdsale/FinalizableCrowdsale.sol";
import "github.com/OpenZeppelin/zeppelin-solidity/contracts/crowdsale/RefundableCrowdsale.sol";
import "github.com/OpenZeppelin/zeppelin-solidity/contracts/token/MintableToken.sol";

contract SampleCrowdsale is CappedCrowdsale, FinalizableCrowdsale {

    MintableToken public testToken ;

  function SampleCrowdsale(uint256 _startTime, uint256 _endTime, uint256 _rate, uint256 _goal, uint256 _cap, address _wallet, address _tokenContractAddress)
    CappedCrowdsale(_cap)
    Crowdsale(_startTime, _endTime, _rate, _wallet)
  {

    testToken = MintableToken(_tokenContractAddress);
  }

  function createTokenContract() internal returns (MintableToken) {
    return testToken;
  }

}

Una cosa que noté es que RefundableCrowdsalerequiere un argumento para su constructor, mientras que as FinalizableCrowdsaleno lo requiere y no es necesario llamar al constructor de un padre si no toma ningún argumento .

Sospecho que este pequeño detalle es la causa del problema.

Cuando cambié _startTimede 1510889758a 1520889758, ¡comenzó a funcionar! ¿Por qué es importante la hora de inicio?
¿Dónde puedo encontrar este contrato de Crowdsale? no se puede localizar el archivo "FinalizableCrowdsale.sol"