使用Hardhat+Ethers部署合约遇TypeError问题求助
问题描述
执行yarn hardhat deploy时触发TypeError: btc_eth.deployed is not a function;移除await btc_eth.deployed()后,又出现TypeError: btc_eth.registerVault is not a function。
部署脚本01-deploy-main.js
const { network, ethers } = require("hardhat") const { developmentChains } = require("../helper-hardhat-config") const { relayNetworks } = require("../btcrelay-config") module.exports = async ({ getNamedAccounts, deployments }) => { const { deploy, log } = deployments const { deployer, vault, alice, bob, eve } = await getNamedAccounts() let args let btc_eth if (developmentChains.includes(network.name)) { const btcRelay = await deployments.get("MockBTCRelay") args = ["BTC-ETH-CROSS", "BTH", 1, btcRelay.address] btc_eth = await deploy("CrossChain", { from: deployer, log: true, args: args, }) } else if (network.name == "sepolia") { args = ["BTC-ETH-CROSS", "BTH", 1, relayNetworks.sepolia] btc_eth = await deploy("CrossChain", { from: deployer, log: true, args: args, }) } else if (network.name == "main") { args = ["BTC-ETH-CROSS", "BTH", 1, relayNetworks.main] btc_eth = await deploy("CrossChain", { from: deployer, log: true, args: args, }) } await btc_eth.deployed() log(`Got cotract CrossChain at ${btc_eth.address}`) log("CrossChain deployed!") log("--------------------------------------------------") const amount = 1 const collateral = "0.01" const collateral_user = "0.00000001" let vault_collateral = ethers.utils.parseUnits(collateral, "ether") let user_collateral = ethers.utils.parseUnits(collateral_user, "ether") const btc_address_vault = "0x02a751dc8c10e35fed2c6eddc2575c9af2c71d23" const btc_address_bob = "0x69f374b39af4aa342997e0bdff3b3b297a85883c" const btc_tx = "0x3a7bdf6d01f068841a99cce22852698df8428d07c68a32d867b112a4b24c8fe0" const gas_limit = 6000000 await btc_eth.registerVault(vault, { from: vault, value: vault_collateral, }) btc_eth.once("RegisterVault", (from, value) => { console( `vault ${vault.address} successfully registered and the vault_collteral is ${vault_collateral}!` ) }) } module.exports.tags = ["all", "btc_eth"]
Treasury.sol中的registerVault函数
function registerVault( address payable toRegister ) public payable override returns (bool) { require(msg.value >= _minimumCollateralVault, "Collateral too low"); _registerNewVault(toRegister, msg.value); _vaultTokenSupply += _convertEthToBtc(msg.value); _vaultCollateral += msg.value; return true; }
package.json配置
{ "name": "hardhat-cross-chain", "version": "1.0.0", "license": "MIT", "devDependencies": { "@chainlink/contracts": "^0.6.1", "@ethersproject/abi": "^5.4.7", "@ethersproject/providers": "^5.4.7", "@nomicfoundation/hardhat-chai-matchers": "^1.0.0", "@nomicfoundation/hardhat-network-helpers": "^1.0.0", "@nomicfoundation/hardhat-toolbox": "^2.0.0", "@nomiclabs/hardhat-ethers": "npm:hardhat-deploy-ethers", "@nomiclabs/hardhat-etherscan": "^3.0.0", "@typechain/ethers-v5": "^10.1.0", "@typechain/hardhat": "^6.1.2", "chai": "^4.2.0", "dotenv": "^16.0.3", "ethers": "5.7.0", "fs-extra": "^11.1.1", "hardhat": "^2.13.0", "hardhat-deploy": "^0.11.25", "hardhat-gas-reporter": "^1.0.8", "openzeppelin-solidity": "^3.4.2", "prettier": "^2.8.4", "prettier-plugin-solidity": "^1.1.3", "solhint": "^3.4.1", "solidity-coverage": "^0.8.0", "typechain": "^8.1.0" }, "scripts": { "test": "hardhat test", "test:staging": "hardhat test --network sepolia", "lint": "solhint 'contracts/**/*.sol'", "lint:fix": "solhint 'contracts/**/*.sol' --fix", "format": "prettier --write .", "coverage": "hardhat coverage" } }
第一次报错日志
Nothing to compile Local network detected! Deploying mocks... deploying "MockBTCRelay" (tx: 0x191f0c3fe1817cf0bac4f9e69b2f00a14fedc895d255d735c860ae7601631550)...: deployed at 0x5FbDB2315678afecb367f032d93F642f64180aa3 with 606889 gas Got contract MocjBTCRelay at 0x5FbDB2315678afecb367f032d93F642f64180aa3 Mocks deployed! -------------------------------------------------- deploying "CrossChain" (tx: 0x199057c66a9a92a7fe99999b51fb7af96e89b2f1de265d6de1373f2c07278d72)...: deployed at 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512 with 5864917 gas An unexpected error occurred: Error: ERROR processing C:\Users\86186\Desktop\Blockchain\Ethereum\Project\hardhat-cross-chain\deploy\01-deploy-main.js: TypeError: btc_eth.deployed is not a function at Object.module.exports [as func] (C:\Users\86186\Desktop\Blockchain\Ethereum\Project\hardhat-cross-chain\deploy\01-deploy-main.js:75:19) at processTicksAndRejections (internal/process/task_queues.js:93:5) at runNextTicks (internal/process/task_queues.js:62:3) at listOnTimeout (internal/timers.js:523:9) at processTimers (internal/timers.js:497:7) ....
第二次报错日志
Nothing to compile Local network detected! Deploying mocks... deploying "MockBTCRelay" (tx: 0x191f0c3fe1817cf0bac4f9e69b2f00a14fedc895d255d735c860ae7601631550)...: deployed at 0x5FbDB2315678afecb367f032d93F642f64180aa3 with 606889 gas Got contract MocjBTCRelay at 0x5FbDB2315678afecb367f032d93F642f64180aa3 Mocks deployed! -------------------------------------------------- deploying "CrossChain" (tx: 0x199057c66a9a92a7fe99999b51fb7af96e89b2f1de265d6de1373f2c07278d72)...: deployed at 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512 with 5864917 gas Got cotract CrossChain at 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512 CrossChain deployed! -------------------------------------------------- An unexpected error occurred: Error: ERROR processing C:\Users\86186\Desktop\Blockchain\Ethereum\Project\hardhat-cross-chain\deploy\01-deploy-main.js: TypeError: btc_eth.registerVault is not a function at Object.module.exports [as func] (C:\Users\86186\Desktop\Blockchain\Ethereum\Project\hardhat-cross-chain\deploy\01-deploy-main.js:93:19) at processTicksAndRejections (internal/process/task_queues.js:93:5) at runNextTicks (internal/process/task_queues.js:62:3) at listOnTimeout (internal/timers.js:523:9) at processTimers (internal/timers.js:497:7) ...
解决方案
这两个错误根源都是**hardhat-deploy的deploy函数返回的不是Ethers合约实例**,而是一个包含部署信息的对象,所以没有deployed()方法和合约函数。
步骤1:获取Ethers合约实例
部署完成后,用ethers.getContractAt把部署地址转换成Ethers合约实例,替换原来的await btc_eth.deployed()部分:
// 部署逻辑保持不变,替换后续代码 const crossChainContract = await ethers.getContractAt("CrossChain", btc_eth.address) // hardhat-deploy的deploy已经确保合约部署完成,不需要调用deployed() log(`Got contract CrossChain at ${btc_eth.address}`) log("CrossChain deployed!") log("--------------------------------------------------")
步骤2:修正合约方法调用细节
- 用
connect(ethers.getSigner(vault))切换调用者,Ethers v5不支持{from: vault}这种写法 vault是地址字符串,不是对象,直接使用即可,不需要vault.address- 日志里格式化数值,避免显示wei单位的大数
完整修正后的关键代码片段
// ...部署逻辑不变... const crossChainContract = await ethers.getContractAt("CrossChain", btc_eth.address) log(`Got contract CrossChain at ${btc_eth.address}`) log("CrossChain deployed!") log("--------------------------------------------------") // ...其他变量定义不变... const vaultSigner = await ethers.getSigner(vault) await crossChainContract.connect(vaultSigner).registerVault(vault, { value: vault_collateral, }) crossChainContract.once("RegisterVault", (from, value) => { console.log( `vault ${from} successfully registered and the vault_collateral is ${ethers.utils.formatUnits(value, "ether")} ETH!` ) })
错误原因说明
hardhat-deploy的deploy函数返回的是部署记录对象,包含address、transactionHash等属性,但不是Ethers合约实例,因此无法调用deployed()和合约方法。必须通过ethers.getContractAt根据地址获取合约实例,才能与合约交互。
内容的提问来源于stack exchange,提问作者Chenny
相关产品推荐
相关产品推荐

