JavaScript 不可用。

我们检测到浏览器禁用了 JavaScript。请启用 JavaScript 或改用支持的浏览器来继续访问

Safe Wallet 进行 OpenZeppelin UUPS 合约升级

作者:Anban Chu

发表日期:2024年03月01日

所属目录:OpenZeppelin

Safe Wallet 进行 OpenZeppelin UUPS 合约升级

准备地址

  • Safe多签地址: 0x__SafeWalletAddress
  • 想要升级的UUPS合约地址: 0xAAAAA

升级合约至V2

一:打开 remixd 连接本地。

  1. 选择要升级的文件 (ContractV2.sol
  2. Solidity 编译版本选择: 0.8.23(这里根据你的合约版本进行选择)
  3. 开始使用的地址是非多签地址

二:发布 Implementation 合约

  1. Remix 选择 Upgrade with Proxy, 地址填想要升级的代理合约地址。0xAAAAA
  2. 点击 Deploy之后,提示如下,点击确定。(这一步只部署执行合约
Proxy Upgrade Warning
The previous contract implementation is NOT available for an upgrade comparison
A new storage layout will be saved for future upgrades.

---

Deploy Implementation & Update Proxy
Upgrade with Proxy will initiate two (2) transactions:
Deploying the new implementation contract
Updating the proxy contract with the address of the new implementation contract

点击后部署新的执行合约: 假设地址是0xBBBBB

三:使用Remixd 生成用于更新的十六进制代码

第一笔执行合约部署成功后,会调用第二笔交易进行升级。因为不是owner地址,所以必定会失败。但是我们的目标是拿到十六进制数据,并不是发交易。此时调用Metamask后,我们拷贝对应的十六进制代码作为备份。

如果你不小心忽略了这笔交易,或者 remixd 因为错误没有弹出,还可以使用下面方法获取对应的十六进制代码。

这种方式是手动生成: upgradeToAndCall(address newImplementation,bytes data) 的代码。

在Rexmid中填想要升级的代理合约地址 0xAAAAA 进行 At Address 操作。找到其中 upgradeToAndCall 方法,参数如下

  • newImplementation: 0xBBBBB (刚才部署的执行合约地址)
  • data: 0x

点击 Transaction ,这时候会提示出错(因为不是owner),我们强制 Send Transaction,在呼起的Metamask中点击 十六进制 这个Tab标签。复制其中的十六进制数据。

0x4f1ef286
000000000000000000000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
0000000000000000000000000000000000000000000000000000000000000040
0000000000000000000000000000000000000000000000000000000000000000

四:使用Safe进行交易发送(真正的更新)

进入 Safe 钱包,点击 Transaction Builder ,选择 Custom data

  • Ether Address: 0xAAAAA 想要升级的合约地址。
  • Ether value: 0
  • Data (Hex encoded): 填第三步生成的数据。

点击 Add transaction 添加交易,校验交易信息是否正确,新创建的 0xBBBBB 合约没有其他人恶意调用。

在 Transactions Batch 点击 Create Batch ,然后可以点击 Simulate 查看模拟结果。如果是成功转台,使用 Send Batch 进入交易广播。

五:签名人进行签名

找到其它多签地址进行签名即可。





以上就是本篇文章的全部内容了,希望对你有帮助。

>> 本站不提供评论服务,技术交流请在 Twitter 上找我 @anbang_account