Estoy tratando de incorporar el almacenamiento en un contrato inteligente donde los participantes del contrato tendrán su dirección almacenada en una address[]
tabla de búsqueda participationAddressLUT
.
El contrato se inicializa con 2 direcciones en la tabla de búsqueda a través de la función bootstrapParticipation()
. El participationSize()
getter nos da el tamaño de la tabla de búsqueda.
Sin embargo, al intentar recuperar el tamaño de la tabla de búsqueda usando web3v0.20.2
TokenSale.at(this.state.contractAddress).then((instance) => {
instance.participationSize.call().then((r) => {
console.log('participationSize: ', r)
})
})
obtenemos el error críptico
Error no capturado (en promesa): Error: Excepción de VM al ejecutar eth_call: código de operación no válido
¿Qué tiene de malo el código de contrato actual que impidió que esto funcionara?
Código de contrato:
pragma solidity ^0.4.15;
import "./libs/zeppelin/crowdsale/CappedCrowdsale.sol";
import "./libs/zeppelin/crowdsale/FinalizableCrowdsale.sol";
contract TokenSale is CappedCrowdsale, FinalizableCrowdsale {
mapping (address => uint256) public participationWeis;
address[] public participationAddressLUT;
function TokenSale(uint256 _startTime, uint256 _endTime, uint256 _rate, uint256 _goal, uint256 _cap, address _wallet, address _tokenContractAddress)
CappedCrowdsale(_cap)
FinalizableCrowdsale()
Crowdsale(_startTime, _endTime, _rate, _wallet)
{
bootstrapParticipation();
}
function bootstrapParticipation() internal {
address participant = 0xcede48d8ac162d1b08ed9419010de3c99f2cfdd6;
uint256 weiAmount = 1000000;
participationWeis[participant] = participationWeis[participant].add(weiAmount);
participationAddressLUT.push(participant);
participant = 0x854bd635fd4e8684a326664e0698c8fefae6dd97;
weiAmount = 5000000;
participationWeis[participant] = participationWeis[participant].add(weiAmount);
participationAddressLUT.push(participant);
}
function participationSize() public returns (uint256) {
return participationAddressLUT.length;
}
}
Rastreo completo
errors.js:35 Uncaught (in promise) Error: Error: VM Exception while executing eth_call: invalid opcode
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:48863:17
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:60103:5
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:12319:9
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:8879:16
at replenish (C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:9399:25)
at iterateeCallback (C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:9389:17)
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:9364:16
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:12316:13
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:60099:9
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:54779:7
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:48863:17
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:60103:5
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:12319:9
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:8879:16
at replenish (C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:9399:25)
at iterateeCallback (C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:9389:17)
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:9364:16
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:12316:13
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:60099:9
at C:\Users\y\AppData\Roaming\npm\node_modules\truffle\build\chain.bundled.js:54779:7
at Object.InvalidResponse (http://localhost:3000/static/js/bundle.js:94294:17)
at http://localhost:3000/static/js/bundle.js:90537:37
at XMLHttpRequest.request.onreadystatechange (http://localhost:3000/static/js/bundle.js:59860:8)
La función Solidez se ve bien. Obtener la instancia del contrato no es una promesa.
Intente llamar a la función desde la instancia, de la siguiente manera:
var instance = TokenSale.at(this.state.contractAddress);
instance.participationSize.call().then((r) => {
console.log('participationSize: ', r);
});