代理合约测试
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;
|
pragma solidity ^0.8.0;
|
||||||
|
|
||||||
import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
|
import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
|
||||||
import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
|
|
||||||
|
|
||||||
contract AdminUpgradeabilityProxy is TransparentUpgradeableProxy {
|
contract Proxy is TransparentUpgradeableProxy {
|
||||||
constructor(
|
constructor(
|
||||||
address logic,
|
address logic,
|
||||||
address admin,
|
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