代理合约测试
This commit is contained in:
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
6
src/Proxy/Transparent/Admin.sol
Normal file
6
src/Proxy/Transparent/Admin.sol
Normal 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 {}
|
||||
@@ -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,
|
||||
12
src/Proxy/Transparent/README.md
Normal file
12
src/Proxy/Transparent/README.md
Normal file
@@ -0,0 +1,12 @@
|
||||
# 透明代理
|
||||
|
||||
- 合约的升级,由代理合约来进行,也就是逻辑合约根本不关心升级的事情。所以,需要代理合约来完成。
|
||||
- 透明代理,需要部署三个合约:逻辑合约(业务代码)、代理合约(TransparentUpgradeableProxy)、管理合约(ProxyAdmin)
|
||||
- 因为由透明代理来完成升级工作,那么透明代理合约里,必然有处理升级的函数,比如upgradeTo,所以,就存在代理合约和逻辑合约两者有函数名冲突的情况。比如都有upgradeTo函数,那么针对普通用户,应该需要调用到逻辑合约,对于管理员(负责升级)应该要调用代理合约。所以,在透明代理模式上,一定要有用户权限的判断。
|
||||
|
||||
|
||||
# 1. 部署一个可升级的ERC合约
|
||||
|
||||
# 2. 部署Admin合约
|
||||
|
||||
# 3. 部署代理合约,指定 logic 和 admin
|
||||
6
src/Proxy/UUPS/README.md
Normal file
6
src/Proxy/UUPS/README.md
Normal file
@@ -0,0 +1,6 @@
|
||||
# UUPS代理
|
||||
|
||||
- 合约的升级,由逻辑合约来进行,不需要代理合约参与。
|
||||
- UUPS代理,只需要部署两个合约:逻辑合约(业务代码)、代理合约。没有管理合约(因为直接在逻辑合约里升级即可)。逻辑合约从UUPSUpgradeable继承。
|
||||
- 由于所有的用户调用都是通过代理合约直接转到逻辑合约,所以代理合约本身不需要什么数据。
|
||||
- 由于升级过程是调用逻辑合约的升级方法,如果逻辑合约没有该升级方法,那么就可能导致后续无法升级。为了解决这个问题,要求逻辑合约必须继承UUPSUpgradeable合约。
|
||||
44
src/Proxy/UpgradeableToken/UpgradeableERC20.sol
Normal file
44
src/Proxy/UpgradeableToken/UpgradeableERC20.sol
Normal 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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user