Safe Wallet 进行 OpenZeppelin UUPS 合约升级
准备地址
- Safe多签地址:
0x__SafeWalletAddress
- 想要升级的UUPS合约地址:
0xAAAAA
升级合约至V2
一:打开 remixd
连接本地。
- 选择要升级的文件 (
ContractV2.sol
) - Solidity 编译版本选择:
0.8.23
(这里根据你的合约版本进行选择) - 开始使用的地址是非多签地址。
二:发布 Implementation
合约
- Remix 选择
Upgrade with Proxy
, 地址填想要升级的代理合约地址。0xAAAAA
- 点击 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
进入交易广播。
五:签名人进行签名
找到其它多签地址进行签名即可。