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 FinalizableCrowdsale
a 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 FinalizableCrowdsale
arroja ese error? RefundableCrowdsale
hereda FinalizableCrowdsale
pero no da ningún error...
Archivos relacionados:
Pude implementar su FinalizableCrowdsale
SampleCrowdsale
despué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 RefundableCrowdsale
requiere un argumento para su constructor, mientras que as FinalizableCrowdsale
no 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.
nyxynyx
_startTime
de1510889758
a1520889758
, ¡comenzó a funcionar! ¿Por qué es importante la hora de inicio?Ashutosh Singh