Web3js

web3.js 從 .json 文件導入合約 abi

  • January 22, 2022

所以我有一個帶有地址0的已部署契約。我可以使用我的 index.html 輕鬆地與它互動,如下所示:

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

然後我可以這樣稱呼它的功能:

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

但我還有另一個先前部署的帶有 address1 的契約。合約與地址0的合約相同。我只看到一種使用契約的方法1:

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

在不包括契約的整個 abi 的情況下,是否有另一種方法可以做到這一點?因為我已經在 contract_artifacts 中有它,所以我只是不知道如何從那裡得到它。謝謝你。

我知道這個問題很老,但是我對此有一些問題,所以我會分享對我有幫助的東西。

要從 JSON 文件導入 ABI,您可以使用以下程式碼(假設您已經擁有 web3 對象):

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);

您可以在此處閱讀更多相關資訊:https ://web3js.readthedocs.io/en/1.0/web3-eth-contract.html


更新 01/2020:從 Typescript 2.9 開始,直接支持讀取 JSON 文件。因此,如果您嘗試從 Typescript 項目(Angular、React、…)中獲取 ABI 或字節碼,只需轉到您的 tsconfig.json 並設置:

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

然後,您可以使用import ContractName from 'path/to/contract/ContractName.json' 導入您的契約並使用ContractName.abi.

乾杯

我使用 require 函式來導入 JSON 文件。

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')

引用自:https://ethereum.stackexchange.com/questions/21665