¿Cómo obtener una variable del contrato inteligente con web3 y abi?

Uso web3.js y trato de tomar un valor de la variable del contrato inteligente.

Mi código para ello es:

var contract = web3.eth.contract(abi).at(address);

donde abi - matriz json y dirección - dirección de trabajo válida.

Parte del objeto abi json es

{
      "constant": true,
      "inputs": [],
      "name": "weiRaised",
      "outputs": [
        {
          "name": "",
          "type": "uint256"
        }
      ],
      "payable": false,
      "type": "function"
},

Cuando uso este código:

console.log(contract.abi[0].abi[6].name);

Veo "weiRaised" en la consola.

pero si uso

console.log(contract.abi[0].abi[6].inputs);

Veo 'indefinido'.

¿Que estoy haciendo mal? ¿Cómo puedo obtener la variable del contrato inteligente, basada en abi y web3.js?

Respuestas (4)

Después de imprimir cosas en la consola, Dios me dejó ir a dormir con alegría =)

var contract = web3.eth.contract(abi).at(address);
async function getContractPublicVariable() {
    const weiRaised = await contract.methods.weiRaised.call().call();
}

entonces la idea escontract.methods.VARIABLENAME.call().call();

otra idea escontract.methods.VARIABLENAME().call();

Web3.js mapeará automáticamente las funciones ABI en el objeto del contrato del que obtiene web3.eth.contract(abi).at(address).

Esto significa que puede acceder al valor de las variables haciendo algo como:

let weiRaisedValue = contract.weiRaised.call()

consola.log(contrato.weiRaised.call()); - TypeError: contract.weiRaised no está definido
@Sergei ¿Está utilizando web3 v1.0? En ese caso debería ser contract.methods.weiRaised.call().then(function (res) { console.log(res); }). Más información en la documentación de web3 v1.0 .
consola.log(web3.versión); da esto: Objeto { api: "0.20.2", nodo: Getter, getNode: e(), red: Getter, getNetwork: e(), ethereum: Getter, getEthereum: e(), susurro: Getter, getWhisper: e () }
su código me da este error: TypeError: contract.methods no está definido

Daré una respuesta actualizada a partir de web3.js 1.6.0 (utilicé moralis como mi proveedor para web3.js)

import Web3 from 'web3';       
const web3Js = new Web3(Moralis.provider);
            var contract = new web3Js.eth.Contract(ContractJSON.abi, ContractAddress);
            const variable = await contract.methods.variableName.call().call();
El doble call()se ve raro, se ve mejor con contract.methods.variableName().call(), usando ()después del nombre y un solo .call().

2022 WebJs 1.7.3

Si alguien lucha con eso en 2022, entonces esta es la solución.


import Web3 from "web3";

const web3 = new Web3(provider);
const myContract = new web3.eth.Contract(
      jsonInterface,
      address,
    );
this.age = await myContract.methods.getAge().call();

Esta es la forma genérica. Y es una llamada asíncronaawait myContract.methods.getVariableName().call();