Polygon主网部署OpenZeppelin代理合约失败求助(测试网成功)
解决Polygon主网代理合约部署异常问题
问题复盘
- 同一合约在Polygon Mumbai测试网部署成功,合约地址
0xe286e267c6ed4cbf3cf42bbb7fea05ec8b92da79可正常查看代理合约功能 - Polygon主网部署后,该地址无法显示「Read as proxy」「Write as proxy」标签,无法查询合约名称、符号等信息
- 部署时报错:
/Users/estalella/Documents/gitlab/crypto-nft/final/hardhat/node_modules/@openzeppelin/upgrades-core/src/deployment.ts:180 throw new InvalidDeployment(deployment); ^ Error: No contract at address 0x42c6C675eEa86798c2A6291Daa653D592787D6c1 (Removed from manifest) at waitAndValidateDeployment (/Users/estalella/Documents/gitlab/crypto-nft/final/hardhat/node_modules/@openzeppelin/upgrades-core/src/deployment.ts:180:13) at processTicksAndRejections (node:internal/process/task_queues:95:5) at fetchOrDeployGeneric (/Users/estalella/Documents/gitlab/crypto-nft/final/hardhat/node_modules/@openzeppelin/upgrades-core/src/impl-store.ts:70:5) at deployImpl (/Users/estalella/Documents/gitlab/crypto-nft/final/hardhat/node_modules/@openzeppelin/hardhat-upgrades/src/utils/deploy-impl.ts:96:22) at deployProxyImpl (/Users/estalella/Documents/gitlab/crypto-nft/final/hardhat/node_modules/@openzeppelin/hardhat-upgrades/src/utils/deploy-impl.ts:74:10) at Proxy.deployProxy (/Users/estalella/Documents/gitlab/crypto-nft/final/hardhat/node_modules/@openzeppelin/hardhat-upgrades/src/deploy-proxy.ts:35:28) at main (/Users/estalella/Documents/gitlab/crypto-nft/final/hardhat/scripts/deployProxy.cjs:16:19)
解决步骤
1. 清理OpenZeppelin升级插件本地缓存
报错提示地址从manifest中移除,说明本地部署记录与链上状态不一致。删除项目根目录下的.openzeppelin文件夹(存储升级插件的缓存和部署记录):
rm -rf .openzeppelin/
重新执行部署脚本,插件会重新生成正确的部署记录。
2. 调整主网Gas配置
Polygon主网Gas价格波动大,部署代理合约时可能因Gas不足导致交易未完全确认。在hardhat.config.js中手动设置更高的Gas参数:
module.exports = { networks: { polygon: { url: "YOUR_POLYGON_RPC_URL", accounts: ["YOUR_PRIVATE_KEY"], gasPrice: ethers.utils.parseUnits("50", "gwei"), gasLimit: 3000000 } } };
3. 验证链上合约状态
主网显示的地址可能仅为交易发起后返回的预估值,实际合约未部署成功:
- 检查该地址的链上字节码,若为空或不符合代理合约字节码,说明部署失败
- 通过Hardhat控制台调用代理合约的
implementation()方法(透明代理),验证是否能返回有效实现合约地址
4. 重新部署时指定新代理地址(可选)
若旧地址已出现异常,重新部署时可指定新地址避免复用问题:
const proxy = await upgrades.deployProxy(Contract, [INIT_ARGS], { initializer: "initialize", proxyAddress: "NEW_PROXY_ADDRESS" });
5. 确认合约符合代理部署规范
确保合约满足OpenZeppelin代理合约要求:
- 无构造函数,使用
initialize函数完成初始化 - 继承
Initializable合约 - 避免使用
selfdestruct、delegatecall等破坏代理逻辑的操作
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

