代理合约测试

This commit is contained in:
2022-11-15 15:33:28 +08:00
parent 9c49cf62a5
commit 7a750289ce
10 changed files with 69 additions and 30 deletions

View File

@@ -1,17 +0,0 @@
{
"language": "Solidity",
"settings": {
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"": ["ast"],
"*": ["abi", "metadata", "devdoc", "userdoc", "storageLayout", "evm.legacyAssembly", "evm.bytecode", "evm.deployedBytecode", "evm.methodIdentifiers", "evm.gasEstimates", "evm.assembly"]
}
},
"evmVersion": "byzantium"
}
}

View File

@@ -1,11 +0,0 @@
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";
contract UpgradeableERC20 is ERC20Upgradeable {
function initialize() public initializer {
__ERC20_init("MyToken", "MTK");
}
}

View File

@@ -0,0 +1,6 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
contract Admin is ProxyAdmin {}

View File

@@ -2,9 +2,8 @@
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
contract AdminUpgradeabilityProxy is TransparentUpgradeableProxy {
contract Proxy is TransparentUpgradeableProxy {
constructor(
address logic,
address admin,

View File

@@ -0,0 +1,12 @@
# 透明代理
- 合约的升级,由代理合约来进行,也就是逻辑合约根本不关心升级的事情。所以,需要代理合约来完成。
- 透明代理需要部署三个合约逻辑合约业务代码、代理合约TransparentUpgradeableProxy、管理合约ProxyAdmin
- 因为由透明代理来完成升级工作那么透明代理合约里必然有处理升级的函数比如upgradeTo所以就存在代理合约和逻辑合约两者有函数名冲突的情况。比如都有upgradeTo函数那么针对普通用户应该需要调用到逻辑合约对于管理员负责升级应该要调用代理合约。所以在透明代理模式上一定要有用户权限的判断。
# 1. 部署一个可升级的ERC合约
# 2. 部署Admin合约
# 3. 部署代理合约,指定 logic 和 admin

6
src/Proxy/UUPS/README.md Normal file
View File

@@ -0,0 +1,6 @@
# UUPS代理
- 合约的升级,由逻辑合约来进行,不需要代理合约参与。
- UUPS代理只需要部署两个合约逻辑合约业务代码、代理合约。没有管理合约因为直接在逻辑合约里升级即可。逻辑合约从UUPSUpgradeable继承。
- 由于所有的用户调用都是通过代理合约直接转到逻辑合约,所以代理合约本身不需要什么数据。
- 由于升级过程是调用逻辑合约的升级方法如果逻辑合约没有该升级方法那么就可能导致后续无法升级。为了解决这个问题要求逻辑合约必须继承UUPSUpgradeable合约。

View File

@@ -0,0 +1,44 @@
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PausableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
contract UpgradeableERC20 is
ERC20Upgradeable,
ERC20BurnableUpgradeable,
ERC20PausableUpgradeable,
OwnableUpgradeable
{
uint8 private _decimals;
function initialize(string memory tokenName_, string memory symbol_)
public
initializer
{
__ERC20_init(tokenName_, symbol_);
__Ownable_init();
_decimals = 6;
ERC20Upgradeable._mint(_msgSender(), (33333333 * _decimals));
}
function decimals() public view virtual override returns (uint8) {
return _decimals;
}
function mint(address account, uint256 amount) public virtual onlyOwner {
_mint(account, amount);
}
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual override(ERC20Upgradeable, ERC20PausableUpgradeable) {
ERC20PausableUpgradeable._beforeTokenTransfer(from, to, amount);
ERC20Upgradeable._beforeTokenTransfer(from, to, amount);
}
}