From 7a750289ce6c5a147ffbd96af6963abb8815af7c Mon Sep 17 00:00:00 2001 From: Jason Date: Tue, 15 Nov 2022 15:33:28 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=90=86=E5=90=88=E7=BA=A6=E6=B5=8B?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- compiler_config.json | 17 ------- .../JZBG-GOODS.json | 0 src/ERC20/UpgradeableERC20.sol | 11 ----- .../MyERC20.json | 0 .../MyERC721.json | 0 src/Proxy/Transparent/Admin.sol | 6 +++ .../Transparent/Proxy.sol} | 3 +- src/Proxy/Transparent/README.md | 12 +++++ src/Proxy/UUPS/README.md | 6 +++ .../UpgradeableToken/UpgradeableERC20.sol | 44 +++++++++++++++++++ 10 files changed, 69 insertions(+), 30 deletions(-) delete mode 100644 compiler_config.json rename src/ERC1155/{StandardJsonInput => json-input}/JZBG-GOODS.json (100%) delete mode 100644 src/ERC20/UpgradeableERC20.sol rename src/ERC20/{StandardJsonInput => json-input}/MyERC20.json (100%) rename src/ERC721/{StandardJsonInput => json-input}/MyERC721.json (100%) create mode 100644 src/Proxy/Transparent/Admin.sol rename src/{proxy/AdminUpgradeabilityProxy.sol => Proxy/Transparent/Proxy.sol} (68%) create mode 100644 src/Proxy/Transparent/README.md create mode 100644 src/Proxy/UUPS/README.md create mode 100644 src/Proxy/UpgradeableToken/UpgradeableERC20.sol diff --git a/compiler_config.json b/compiler_config.json deleted file mode 100644 index c670060..0000000 --- a/compiler_config.json +++ /dev/null @@ -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" - } -} diff --git a/src/ERC1155/StandardJsonInput/JZBG-GOODS.json b/src/ERC1155/json-input/JZBG-GOODS.json similarity index 100% rename from src/ERC1155/StandardJsonInput/JZBG-GOODS.json rename to src/ERC1155/json-input/JZBG-GOODS.json diff --git a/src/ERC20/UpgradeableERC20.sol b/src/ERC20/UpgradeableERC20.sol deleted file mode 100644 index dc69b03..0000000 --- a/src/ERC20/UpgradeableERC20.sol +++ /dev/null @@ -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"); - } -} diff --git a/src/ERC20/StandardJsonInput/MyERC20.json b/src/ERC20/json-input/MyERC20.json similarity index 100% rename from src/ERC20/StandardJsonInput/MyERC20.json rename to src/ERC20/json-input/MyERC20.json diff --git a/src/ERC721/StandardJsonInput/MyERC721.json b/src/ERC721/json-input/MyERC721.json similarity index 100% rename from src/ERC721/StandardJsonInput/MyERC721.json rename to src/ERC721/json-input/MyERC721.json diff --git a/src/Proxy/Transparent/Admin.sol b/src/Proxy/Transparent/Admin.sol new file mode 100644 index 0000000..0a68e46 --- /dev/null +++ b/src/Proxy/Transparent/Admin.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; + +contract Admin is ProxyAdmin {} diff --git a/src/proxy/AdminUpgradeabilityProxy.sol b/src/Proxy/Transparent/Proxy.sol similarity index 68% rename from src/proxy/AdminUpgradeabilityProxy.sol rename to src/Proxy/Transparent/Proxy.sol index 613e44a..141b176 100644 --- a/src/proxy/AdminUpgradeabilityProxy.sol +++ b/src/Proxy/Transparent/Proxy.sol @@ -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, diff --git a/src/Proxy/Transparent/README.md b/src/Proxy/Transparent/README.md new file mode 100644 index 0000000..92eaa94 --- /dev/null +++ b/src/Proxy/Transparent/README.md @@ -0,0 +1,12 @@ +# 透明代理 + +- 合约的升级,由代理合约来进行,也就是逻辑合约根本不关心升级的事情。所以,需要代理合约来完成。 +- 透明代理,需要部署三个合约:逻辑合约(业务代码)、代理合约(TransparentUpgradeableProxy)、管理合约(ProxyAdmin) +- 因为由透明代理来完成升级工作,那么透明代理合约里,必然有处理升级的函数,比如upgradeTo,所以,就存在代理合约和逻辑合约两者有函数名冲突的情况。比如都有upgradeTo函数,那么针对普通用户,应该需要调用到逻辑合约,对于管理员(负责升级)应该要调用代理合约。所以,在透明代理模式上,一定要有用户权限的判断。 + + +# 1. 部署一个可升级的ERC合约 + +# 2. 部署Admin合约 + +# 3. 部署代理合约,指定 logic 和 admin \ No newline at end of file diff --git a/src/Proxy/UUPS/README.md b/src/Proxy/UUPS/README.md new file mode 100644 index 0000000..cfb06f0 --- /dev/null +++ b/src/Proxy/UUPS/README.md @@ -0,0 +1,6 @@ +# UUPS代理 + +- 合约的升级,由逻辑合约来进行,不需要代理合约参与。 +- UUPS代理,只需要部署两个合约:逻辑合约(业务代码)、代理合约。没有管理合约(因为直接在逻辑合约里升级即可)。逻辑合约从UUPSUpgradeable继承。 +- 由于所有的用户调用都是通过代理合约直接转到逻辑合约,所以代理合约本身不需要什么数据。 +- 由于升级过程是调用逻辑合约的升级方法,如果逻辑合约没有该升级方法,那么就可能导致后续无法升级。为了解决这个问题,要求逻辑合约必须继承UUPSUpgradeable合约。 \ No newline at end of file diff --git a/src/Proxy/UpgradeableToken/UpgradeableERC20.sol b/src/Proxy/UpgradeableToken/UpgradeableERC20.sol new file mode 100644 index 0000000..bb927eb --- /dev/null +++ b/src/Proxy/UpgradeableToken/UpgradeableERC20.sol @@ -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); + } +}