Error de contrato inteligente: los valores devueltos no son válidos, ¿se quedó sin gasolina?

Implementó un contrato usando Remix IDE para Rinkeby testnet.

La dirección y el código del contrato de Etherscan están aquí .

contrato ContadorSimple {
    contador int;

    constructor() público {
        contador = 0;
    }

    función getCounter() vista pública devuelve (int){
        contador de retorno;
    }

    incremento de la función () público {
        contador += 1;
    }

    función decremento() público {
        contador -= 1;
    }
}

Código de cliente JavaScript:

    var contrato;

    $(documento).listo(función(){
        contratoInit();
        obtenerValorContador();
    })

    función initContract(){
        web3 = new Web3(web3.currentProvider);

        var dirección = "0xc6482382047fb50e8e7b4658425c9756b28f995c";
        var abi = [
                    ...
                    ];

        console.log('Crear contrato...');
        contrato = new web3.eth.Contract(abi, dirección);
        consola.log(contrato)

    } // contrato de inicio ()


    función obtenerValorContador(){
        console.log('obtenerContador()...');
        contract.methods.getCounter().call().then((resultado) => {
            consola.log(resultado);
        }).catch(función(error){
            consola.log('err...\n'+err);
        });
    }

Error:

Crear contrato...

(índice):86 o {_requestManager: e, giveProvider: MetamaskInpageProvider, proveedores: {…}, _provider: MetamaskInpageProvider, …}

(índice):94 obtenerContador()...

(índice): 99 err...

Error: los valores devueltos no son válidos, ¿se quedó sin gasolina?

NOTA:

Esto funciona bien en Remix IDE (cromo). Puedo incrementar/decrementar/getCounter... con la versión del compilador: 0.4.25+commit.59dbf8f1.Emscripten.clang.

¿Por qué falla al acceder usando ' dist/web3.min.js ' de Web3.js (Branch 1.0)?

Respuestas (8)

Solucioné el error similar eliminando .jsonarchivos de la carpeta de compilación/contratos y luego ejecutándolos truffle migrateen la terminal.

Sin embargo, el error ocurrió en Visual Studio Code, no en Remix IDE. Apareció después de correr truffle migrate --reset.

Me gustaría agregar a este comentario, después de eliminar .jsonarchivos de la carpeta de compilación/contratos, el problema persistió hasta que eliminé archivos de la papelera 🗑 😅 Así que asegúrese de que la papelera esté vacía

@monkrus ¡El problema que había informado se debió al uso de 'dirección de cuenta', en lugar de 'dirección de contrato'! . Eliminar .jsonno arreglaría eso. Es posible que desee agregar 'problema exacto' junto con error, para diferenciar 'su escenario' y la solución relacionada, para mayor claridad.
@Ismael Gracias por señalarlo. Para agregar más claridad ... el problema funcionó en Remix IDE, pero no en el código JavaScript personalizado.

Recibí ayuda de Veniamin .

Tuve el error "Error: no se pudo decodificar desde ABI: 0x". cuando la llamada recibe una solicitud con una dirección de contrato incorrecta

Cometí un error... ¡Estaba usando 'dirección de cuenta', en lugar de 'dirección de contrato'!

El código funciona, una vez que se utilizó la 'dirección del contrato' correcta.

Vale la pena señalar que la dirección del contrato es diferente a la dirección de la cuenta que crea el contrato y se genera cuando se crea el contrato.
Creo que todos los recién llegados cometieron este error. es muy confuso saber qué dirección se requiere en qué lugar.

Tuve el mismo problema y resultó que estaba en Metamask Mainnet en lugar de Rinkeby, donde se implementó mi contrato.

Ni siquiera estaba conectado a metamask.
Cambiar la red solucionó el problema, hazlo.

Su código parece ser correcto. Creo que su problema se debe a un error de Web3js. Eche un vistazo al problema informado en Github:

https://github.com/ethereum/web3.js/issues/1916

Le recomiendo que use web3.js 1.0.0-beta.35 en su lugar.

Cambiado a la versión web3.js 1.0.0-beta.35. Pero, esta vez el error es diferente: Error: Couldn't decode from ABI: 0x.
Consulta la dirección de tu contrato
Ya está arreglado. He agregado mi respuesta a continuación. Obtuve ayuda de GitHub.

Yo también tuve este error. Se solucionó después de que cambié mi versión web3 a 2.0.0-alpha, que antes era 1.0.0-beta.55.

  1. Así que simplemente desinstale su web3 usando npm uninstall web3.
  2. Luego haga npm install web3@2.0.0-alpha.

Con suerte, esto lo arreglará para usted.

En mi caso (estoy usando el servicio de blockchain de Azure), modifiqué mi archivo de contrato pero olvidé la compilación y lo implementé nuevamente en mi servicio de blockchain de Azure. En cambio, salto al truffle execcomando directamente. Entonces, después de volver a hacer esos dos pasos faltantes, todo funciona bien.

Esto me pasó en mi aplicación de reacción.

Implementé un contrato con la red Ropsten, pero metamask estaba usando la cuenta de Rinkeby. Así que asegúrese de que cualquiera que sea la red que implementó, metamask debería estar usando una cuenta de esa red.

Otra vez tuve esto en next.js. esta ruta es una ruta dinámica, lo que significa que obtendrá el contrato por ${contractAddress}:

      Router.push(`/campaigns/${recipient}/requests`);

en lugar de {recipient}dirección, tuve que poner la dirección del contrato para buscar

+1 en esto. Todavía tenía el punto final de ropsten Alchemy configurado en mi archivo .env para mi aplicación de reacción, pero olvidé que lo había vuelto a implementar en la red de prueba de Rinkeby. Esto me atormentó durante casi 2 días. ¡Gracias por sugerir esto!

En mi caso, estaba invocando un método de "vista" de un contrato implementado en un casco local.

y mi código nodejs se ve así: contract.methods().getterName().call()y obtuve este error.

Pasé horas en esto y sin suerte. Por fin cambié a Rinkeby Test Network, implementé el contrato y llamé al método "ver" con casi el mismo código, todo salió bien.

entonces, la solución es:

Si está utilizando HardHat y se encuentra con este extraño problema, ¡cambie a Rinkeby!