Ich verwende web3.js und versuche, einen Wert der Variablen aus dem Smart Contract zu entnehmen.
Mein Code dafür ist:
var contract = web3.eth.contract(abi).at(address);
wobei abi - json-Array und Adresse - gültige Arbeitsadresse.
Ein Teil des abi json-Objekts ist
{
"constant": true,
"inputs": [],
"name": "weiRaised",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"type": "function"
},
Wenn ich diesen Code verwende:
console.log(contract.abi[0].abi[6].name);
Ich sehe "weiRaised" in der Konsole.
Aber wenn ich benutze
console.log(contract.abi[0].abi[6].inputs);
Ich sehe "undefiniert".
Was mache ich falsch? Wie kann ich die Variable aus dem Smart Contract erhalten, basierend auf abi und web3.js?
Nachdem ich Sachen auf der Konsole gedruckt hatte, ließ mich Gott vor Freude einschlafen =)
var contract = web3.eth.contract(abi).at(address);
async function getContractPublicVariable() {
const weiRaised = await contract.methods.weiRaised.call().call();
}
so die idee istcontract.methods.VARIABLENAME.call().call();
Web3.js bildet die ABI-Funktionen automatisch auf den Vertragsgegenstand ab, von dem Sie zurückkommen web3.eth.contract(abi).at(address)
.
Das bedeutet, dass Sie auf den Wert der Variablen zugreifen können, indem Sie Folgendes tun:
let weiRaisedValue = contract.weiRaised.call()
contract.methods.weiRaised.call().then(function (res) { console.log(res); })
. Weitere Informationen finden Sie in der web3 v1.0 -Dokumentation .Ich werde ab web3.js 1.6.0 eine aktualisierte Antwort geben (ich habe Moralis als meinen Anbieter für web3.js verwendet).
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()
sieht seltsam aus, es sieht besser aus mit contract.methods.variableName().call()
, indem man ()
nach dem Namen ein einzelnes verwendet .call()
.Wenn jemand im Jahr 2022 damit zu kämpfen hat, dann ist dies die Lösung
import Web3 from "web3";
const web3 = new Web3(provider);
const myContract = new web3.eth.Contract(
jsonInterface,
address,
);
this.age = await myContract.methods.getAge().call();
Dies ist die generische Form. Und es ist ein asynchroner Anrufawait myContract.methods.getVariableName().call();
Stin
contract.methods.VARIABLENAME().call();