Solidity

Hardhat - 如何與已部署的合約互動?

  • March 3, 2022

我可以使用 ethers 和 Hardhat 部署合約,其中包含以下內容:

const myContract = await hre.ethers.getContractFactory("SomeContract");
const deployedContract = await myContract.deploy();

如果我使用該deployedContract變數,我什至可以與該已部署契約中的方法進行互動。但是,如果合約已經部署並且我想與之互動怎麼辦?根據我的閱讀,我需要創建該契約的一個實例。我試圖這樣做:

const provider = new ethers.providers.JsonRpcProvider();
const fs = require('fs');
const abi = JSON.parse(fs.readFileSync('./abi/SomeContract.json', 'utf8'));
const contractInstance = new ethers.Contract('contract address goes here', abi, provider);

我相信在該contractInstance變數上創建了一個實例,但是如果我嘗試在控制台中或從腳本中呼叫該實例上的方法,則會出現WARNING: Calling an account which is not a contract錯誤。

也許我對契約實例應該如何工作有誤解?

我遇到了同樣的問題,偶然發現了OpenZeppelin 文件中可能對您有用的部分(它對我有用):

例如:

const MyContract = await ethers.getContractFactory("MyContract");
const contract = await MyContract.attach(
 "0x..." // The deployed contract address
);

// Now you can call functions of the contract
await contract.doTheThing();

hardhat-ethers ^2.0.0``getContractAt為此目的具有特殊功能:

const contractAddress = "0x...",
const myContract = await hre.ethers.getContractAt("MyContract", contractAddress);

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