Ethers.js v6部署智能合约等待交易确认报错求助
问题解决:Ethers v6 合约部署等待确认报错
错误根源
Ethers v6 彻底重构了合约部署的 API 逻辑,和 v5 的行为完全不同:
- v5 中
contractFactory.deploy()直接返回合约实例,实例自带deployTransaction属性 - v6 中
contractFactory.deploy()返回的是TransactionResponse对象(仅代表部署交易本身),并非合约实例,因此直接访问deployTransaction或调用deployed()会触发参数不匹配错误
正确部署流程(Ethers v6)
以下是适配 v6 的完整代码示例,包含部署、等待确认、获取合约实例的全流程:
const ethers = require("ethers"); require("dotenv").config(); const fs = require("fs-extra"); async function deployContract() { // 1. 初始化网络连接和钱包 const provider = new ethers.JsonRpcProvider(process.env.RPC_URL); const wallet = new ethers.Wallet(process.env.PRIVATE_KEY, provider); // 2. 加载编译后的合约 ABI 和字节码 const contractData = await fs.readFileSync("./YourContract.json", "utf8"); const { abi, bytecode } = JSON.parse(contractData); const contractFactory = new ethers.ContractFactory(abi, bytecode, wallet); // 3. 发起部署交易,得到交易响应对象 const txResponse = await contractFactory.deploy(/* 此处传入合约构造函数参数 */); // 4. 等待交易被挖矿确认(指定确认区块数,比如1) const txReceipt = await txResponse.wait(1); // 5. 通过部署地址挂载合约实例 const deployedContract = contractFactory.attach(txReceipt.contractAddress); console.log(`合约部署完成,地址:${txReceipt.contractAddress}`); console.log(`交易哈希:${txResponse.hash}`); } deployContract().catch(err => console.error(err));
关键注意事项
- 必须先通过
txResponse.wait()拿到交易回执,才能从回执中获取合约地址 - 只有通过
contractFactory.attach(合约地址)生成的对象,才是真正的合约实例,可用于后续调用合约方法 - 如果需要验证合约,
txReceipt.contractAddress就是部署后的目标地址
内容的提问来源于stack exchange,提问作者amit prasad
相关产品推荐
相关产品推荐

