You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hardhat部署脚本报错:BaseContract不存在PROPOSER_ROLE属性

解决TypeScript报错:Property 'PROPOSER_ROLE' does not exist on type 'BaseContract'

这个错误的核心原因是TypeScript无法识别TimeLock合约继承自TimelockController的角色常量——要么是生成的合约类型定义未包含这些继承属性,要么是合约实例被默认推断为BaseContract类型。以下是几种可行的解决方法:

方法1:重新生成TypeChain类型定义

Hardhat依赖TypeChain生成合约的TypeScript类型定义,若类型定义未更新就会出现属性不识别问题:

  1. 执行命令重新生成类型:
npx hardhat typechain
  1. 在脚本中导入正确的合约类型并强制转换:
import { TimeLock } from "../typechain-types";

// ...

const timeLock = await ethers.getContract("TimeLock", deployer) as TimeLock;

这样TypeScript就能正确识别合约的所有属性和方法。

方法2:直接计算角色哈希值

由于这些角色常量是固定的keccak256哈希值,你可以在脚本中直接计算,无需从合约获取:

import { ethers } from "hardhat";

// ...

const PROPOSER_ROLE = ethers.utils.keccak256(ethers.utils.toUtf8Bytes("PROPOSER_ROLE"));
const EXECUTOR_ROLE = ethers.utils.keccak256(ethers.utils.toUtf8Bytes("EXECUTOR_ROLE"));
const TIMELOCK_ADMIN_ROLE = ethers.utils.keccak256(ethers.utils.toUtf8Bytes("TIMELOCK_ADMIN_ROLE"));

// 直接使用这些常量
const proposerTx = await timeLock.grantRole(PROPOSER_ROLE, governance.address);

方法3:使用括号语法绕过类型检查

如果不想修改类型定义或计算哈希,可以用括号语法强制访问属性:

const proposerRole = await timeLock["PROPOSER_ROLE"]();
const executorRole = await timeLock["EXECUTOR_ROLE"]();
const adminRole = await timeLock["TIMELOCK_ADMIN_ROLE"]();

这种方法可临时解决类型报错,但不推荐长期使用,会失去TypeScript的类型安全保障。

内容的提问来源于stack exchange,提问作者Sagar Atalatti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 07:52:15