web3.js Importvertrag abi aus der .json-Datei

Ich habe also einen bereitgestellten Vertrag mit Adresse0. Ich kann einfach damit interagieren, indem ich meine index.html wie folgt verwende:

import contract_artifacts from '../../build/contracts/contract.json'
var contract0 = contract(contract_artifacts);

Dann kann ich seine Funktionen so aufrufen:

contract0.deployed().then(function(something){});

Aber ich habe auch einen anderen zuvor bereitgestellten Vertrag mit Adresse1. Der Vertrag ist derselbe wie der Vertrag mit der Adresse0. Ich sehe nur eine Möglichkeit, mit dem Vertrag1 zu arbeiten:

var abiarray = [ here goes pretty big abi ];
contract1 = web3.eth.contract(abiarray).at(address1);

Gibt es eine andere Möglichkeit, dies zu tun, ohne das gesamte abi des Vertrags aufzunehmen? Da ich es bereits in contract_artifacts habe, weiß ich nur nicht, wie ich es von dort bekomme. Danke dir.

Antworten (4)

Ich weiß, die Frage ist alt, aber ich hatte einige Probleme damit, also werde ich teilen, was mir geholfen hat.

Um die ABI aus einer JSON-Datei zu importieren, können Sie den folgenden Code verwenden (vorausgesetzt, Sie haben bereits Ihr web3-Objekt):

var fs = require('fs');
var jsonFile = "pathToYourJSONFile/project.json";
var parsed= JSON.parse(fs.readFileSync(jsonFile));
var abi = parsed.abi;

var YourContract= new web3.eth.Contract(abi, 0x12345678912345678912345678912345678912);

Sie können hier mehr darüber lesen: https://web3js.readthedocs.io/en/1.0/web3-eth-contract.html


Update 01/2020: Seit Typescript 2.9 wird das Lesen von JSON-Dateien direkt unterstützt. Wenn Sie also versuchen, den ABI oder Bytecode aus einem Typescript-Projekt (Angular, React, ...) zu erhalten, gehen Sie einfach zu Ihrer tsconfig.json und setzen Sie:

{
  "compilerOptions": {
    "resolveJsonModule": true,
    "esModuleInterop": true  
  }
}

Mit kannst du dann import ContractName from 'path/to/contract/ContractName.json'deine Verträge importieren und bekommst das Abi mit ContractName.abi.

Beifall

Ich bin überrascht, dass dies eine der wenigen Antworten auf dieses Problem online ist. In den meisten Artikeln, die ich gelesen habe, werden Sie aufgefordert, die ABI manuell in js einzugeben, was wirklich chaotisch ist.
Ich erhalte einen Fehler: Error: Cannot find module '../../node_modules/file-system'- obwohl ich absolut file systeminstalliert habe - sowohl global als auch lokal im Ordner meines Projekts ... Seltsamerweise sagt der Fehler, dass er in Zeile 210 von web3.min.jssteht - was meiner Meinung nach nicht damit zusammenhängt. Gedanken?

Ich habe die require-Funktion verwendet, um die JSON-Datei zu importieren.

import Web3 from 'web3';
const web3 = new Web3(window.web3.currentProvider);
const { abi } = require('./smart_contract_after_compilation_step.json');
var smart_contract_interface = new web3.eth.Contract(abi, '0x5E54780072f1998FB85c3203D9697ef9E3F82DF0')
Verwenden Sie die "Require" -Funktion von wo aus?
In NodeJS/ExpressJS
Dies ist die einzige hier gezeigte Lösung, die mein Problem löst. Vielen Dank!

Im Frontend mache ich das einfach:

import MyContract fom './contracts/MyContract.json'; //truffle project dir
    
web3 = new Web3(Web3.givenProvider);
const myContractWeb3 = new web3.eth.contract(MyContract.abi, "0x00");
    
// and then call the function that I want to        
const functionThatIWantToUseFromSmartContract = async () =>{        
    const account = await window.ethereum.enable();
    const accounts = account[0];
    const gas = await 
    myContractWeb3.methods.theFunction(args).estimateGas();
    await myContractWeb3.methods.theFunction(args).send();
}

Das Lesen von JSON-Dateien wird direkt unterstützt. In meinem habe Nodejs Express Appich den Vertrag geladen:

// Load Contract
var fs = require('fs');
var jsonFile = "abis/abi.json";
var abi = JSON.parse(fs.readFileSync(jsonFile));

// Contract
var contract = new web3.eth.Contract(abi, "0x068_your_address");