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?
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();
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()
contract.methods.weiRaised.call().then(function (res) { console.log(res); })
. Más información en la documentación de web3 v1.0 .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();
call()
se ve raro, se ve mejor con contract.methods.variableName().call()
, usando ()
después del nombre y un solo .call()
.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();
Stin
contract.methods.VARIABLENAME().call();