Error de rechazo no controlado: no se pudo decodificar uint256 de ABI

Estoy trabajando en el uso de un contrato de muestra con NodeJS, Web3 y Solc, pero encontré un error que indica que la dirección dada en el contrato que he creado no se pudo decodificar. ¿Estoy haciendo algo mal? Aquí está el código JS en el que estoy trabajando.

const Web3  = require('web3');
const fs    = require('fs');
const solc  = require('solc');

let web3 = new Web3();
web3.setProvider(new web3.providers.HttpProvider('http://localhost:8545'));

const source = fs.readFileSync(__dirname + '/solidity/Token.sol');
const output = solc.compile(source.toString(), 1);
const bytecode = output.contracts[':Token'].bytecode;
const abi = JSON.parse(output.contracts[':Token'].interface);

const contract = new web3.eth.Contract(abi, '0x5bbf74f1e804bfe671d55cd6b9f3ada66568d5dd', {
  from: web3.eth.coinbase,
  gasPrice: 90000*2
});

contract.methods.totalSupply().call().then(function (err, result) {
  console.log('error', err);
  console.log('result', result);
});

Aquí está el código de solidez que estoy usando.

pragma solidity ^0.4.4;

contract Token {
    // stores the balances of the addresses
    mapping(address => uint) balances;
    mapping(address => mapping(address => uint)) approved;

    // number of tokens in circulation
    uint supply;

    event Transfer(address indexed _from, address indexed _to, uint256 _value);

    function Token() {
        // constructor
        // balances[tx.origin] = 10000;
    }

    function totalSupply() constant returns (uint) {
        return supply;
    }

    function balanceOf(address _owner) constant returns (uint balance) {
        return balances[_owner];
    }

    function transfer(address _to, uint _value) returns (bool success) {
        if (balances[msg.sender] >= _value
            && _value > 0
        ) {
            balances[msg.sender] -= _value;
            balances[_to] += _value;

            // trigger an event
            Transfer(msg.sender, _to, _value);
            return true;
        }

        return false;
    }

    // sets how many can a spender spend from a certain address
    function approve(address _spender, uint _value) returns (bool success) {
        if (balances[msg.sender] > _value) {
            approved[msg.sender][_spender] = _value;
            return true;
        }

        return false;
    }

    // check the value of the spender can spend
    function allowance(address _owner, address _spender) constant returns (uint remaining) {
        return approved[_owner][_spender];
    }

    // transfer the approved value to spend
    function transferFrom(address _from, address _to, uint _value) constant returns (bool success) {
        if (balances[_from] >= _value
            && approved[_from][msg.sender] >= _value
            && _value > 0
        ) {
            balances[_from] -= _value;
            approved[_from][msg.sender] -= _value;


            balances[_to] += _value;
            return true;
        }

        return false;
    }
}

PD: Estoy usando testrpccomo mi proveedor de ethereum.

También estoy enfrentando el mismo problema. ¿Obtuviste alguna solución?
@comeback4you no, lo que hice fue degradar mi webjs de la versión 1.0.0 beta 20-ish a 0.20 y luego funcionó bien.
@RicoMaglayon ¿Ha encontrado la solución a este problema, sin degradar web3jslib?
hola @DmytroZarezenko, nunca miré hacia atrás una vez que bajé la web3jsbiblioteca. lo lamento.
para mí, la solución fue actualizar web3js a ^1.0.0-beta.22. actualización de npm: guarde web3 o npm instale web3@1.0.0-beta.22
¿Alguien consiguió alguna solución? Todavía estoy enfrentando el mismo problema después de la actualización.
@comeback4has probado la solución de Badr Bellaj? usando la versión 1.0.0-beta.22?
Traté de usar esta funcionalidad nuevamente usando 1.0.0-beta.24 y en lugar de compilar el código de solidez sobre la marcha, lo compilé usando remix.ethereum.org , busqué el código de bytes y el abi lo guardó en un archivo JSON y funciona bien.
@RicoMaglayon Dado que esto parece un problema bastante común, ¿le importaría publicar una respuesta a su propia pregunta? Consulte stackoverflow.com/help/self-answer

Respuestas (2)

Yo mismo estaba totalmente atascado en este problema hasta que me di cuenta de que tenía metamask configurada en la red incorrecta (mainnet en lugar de rinkeby). Vale la pena verificar esa configuración... Definitivamente me sentí tonto una vez que me di cuenta después de perder un poco de tiempo tratando de encontrar el problema.

No estoy seguro de que esta sea la solución a su problema debido a su comentario sobre la web3versión.

Está compilando una nueva versión de su contrato inteligente solcpero nunca la implementa y actualiza la dirección del contrato, ese puede ser el problema si tiene un ABI desactualizado