From 8a07620fd7f4623d2f188428bedb27afab7c5ec3 Mon Sep 17 00:00:00 2001 From: Andrei Kozlov Date: Thu, 25 Jul 2024 13:40:58 +0300 Subject: [PATCH] Add TransparentProxyFactoryBase --- .../TransparentProxyFactoryZkSync.sol | 58 +++------------ .../TransparentProxyFactory.sol | 58 +++------------ .../TransparentProxyFactoryBase.sol | 74 +++++++++++++++++++ 3 files changed, 92 insertions(+), 98 deletions(-) create mode 100644 src/contracts/transparent-proxy/TransparentProxyFactoryBase.sol diff --git a/src-zksync/contracts/transparent-proxy/TransparentProxyFactoryZkSync.sol b/src-zksync/contracts/transparent-proxy/TransparentProxyFactoryZkSync.sol index c08d90d..5ad31cd 100644 --- a/src-zksync/contracts/transparent-proxy/TransparentProxyFactoryZkSync.sol +++ b/src-zksync/contracts/transparent-proxy/TransparentProxyFactoryZkSync.sol @@ -1,10 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity >=0.8.0; -import {IOwnable} from '../../../src/contracts/transparent-proxy/interfaces/IOwnable.sol'; -import {ITransparentProxyFactoryZkSync} from './interfaces/ITransparentProxyFactoryZkSync.sol'; -import {TransparentUpgradeableProxy} from '../../../src/contracts/transparent-proxy/TransparentUpgradeableProxy.sol'; -import {ProxyAdmin} from '../../../src/contracts/transparent-proxy/ProxyAdmin.sol'; +import {TransparentProxyFactoryBase, ITransparentProxyFactory} from '../../../src/contracts/transparent-proxy/TransparentProxyFactoryBase.sol'; /** * @title TransparentProxyFactoryZkSync @@ -15,7 +12,7 @@ import {ProxyAdmin} from '../../../src/contracts/transparent-proxy/ProxyAdmin.so * @dev Highly recommended to pass as `admin` on creation an OZ ProxyAdmin instance * @dev This contract needs solc=0.8.19 and zksolc=1.4.1 as codeHashes are specifically made for those versions **/ -contract TransparentProxyFactoryZkSync is ITransparentProxyFactoryZkSync { +contract TransparentProxyFactoryZkSync is TransparentProxyFactoryBase { /// @inheritdoc ITransparentProxyFactoryZkSync bytes32 public constant TRANSPARENT_UPGRADABLE_PROXY_INIT_CODE_HASH = 0x010001b73fa7f2c39ea2d9c597a419e15436fc9d3e00e032410072fb94ad95e1; @@ -27,55 +24,13 @@ contract TransparentProxyFactoryZkSync is ITransparentProxyFactoryZkSync { /// @inheritdoc ITransparentProxyFactoryZkSync bytes32 public constant ZKSYNC_CREATE2_PREFIX = keccak256('zksyncCreate2'); - /// @inheritdoc ITransparentProxyFactoryZkSync - function create(address logic, address admin, bytes calldata data) external returns (address) { - address proxy = address(new TransparentUpgradeableProxy(logic, admin, data)); - - emit ProxyCreated(proxy, logic, admin); - return proxy; - } - - /// @inheritdoc ITransparentProxyFactoryZkSync - function createProxyAdmin(address adminOwner) external returns (address) { - address proxyAdmin = address(new ProxyAdmin()); - IOwnable(proxyAdmin).transferOwnership(adminOwner); - - emit ProxyAdminCreated(proxyAdmin, adminOwner); - return proxyAdmin; - } - - /// @inheritdoc ITransparentProxyFactoryZkSync - function createDeterministic( - address logic, - address admin, - bytes calldata data, - bytes32 salt - ) external returns (address) { - address proxy = address(new TransparentUpgradeableProxy{salt: salt}(logic, admin, data)); - - emit ProxyDeterministicCreated(proxy, logic, admin, salt); - return proxy; - } - - /// @inheritdoc ITransparentProxyFactoryZkSync - function createDeterministicProxyAdmin( - address adminOwner, - bytes32 salt - ) external returns (address) { - address proxyAdmin = address(new ProxyAdmin{salt: salt}()); - IOwnable(proxyAdmin).transferOwnership(adminOwner); - - emit ProxyAdminDeterministicCreated(proxyAdmin, adminOwner, salt); - return proxyAdmin; - } - /// @inheritdoc ITransparentProxyFactoryZkSync function predictCreateDeterministic( address logic, address admin, bytes calldata data, bytes32 salt - ) public view returns (address) { + ) public view override returns (address) { return _predictCreate2Address( address(this), @@ -86,7 +41,12 @@ contract TransparentProxyFactoryZkSync is ITransparentProxyFactoryZkSync { } /// @inheritdoc ITransparentProxyFactoryZkSync - function predictCreateDeterministicProxyAdmin(bytes32 salt) public view returns (address) { + function predictCreateDeterministicProxyAdmin(bytes32 salt) + public + view + override + returns (address) + { return _predictCreate2Address(address(this), salt, PROXY_ADMIN_INIT_CODE_HASH, abi.encode()); } diff --git a/src/contracts/transparent-proxy/TransparentProxyFactory.sol b/src/contracts/transparent-proxy/TransparentProxyFactory.sol index 855fcdb..3524ea8 100644 --- a/src/contracts/transparent-proxy/TransparentProxyFactory.sol +++ b/src/contracts/transparent-proxy/TransparentProxyFactory.sol @@ -1,10 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity >=0.8.0; -import {IOwnable} from './interfaces/IOwnable.sol'; -import {ITransparentProxyFactory} from './interfaces/ITransparentProxyFactory.sol'; -import {TransparentUpgradeableProxy} from './TransparentUpgradeableProxy.sol'; -import {ProxyAdmin} from './ProxyAdmin.sol'; +import {TransparentProxyFactoryBase, ITransparentProxyFactory, ProxyAdmin, TransparentUpgradeableProxy} from './TransparentProxyFactoryBase.sol'; /** * @title TransparentProxyFactory @@ -14,56 +11,14 @@ import {ProxyAdmin} from './ProxyAdmin.sol'; * time allowing `createDeterministic()` with salt == 0 * @dev Highly recommended to pass as `admin` on creation an OZ ProxyAdmin instance **/ -contract TransparentProxyFactory is ITransparentProxyFactory { - /// @inheritdoc ITransparentProxyFactory - function create(address logic, address admin, bytes calldata data) external returns (address) { - address proxy = address(new TransparentUpgradeableProxy(logic, admin, data)); - - emit ProxyCreated(proxy, logic, admin); - return proxy; - } - - /// @inheritdoc ITransparentProxyFactory - function createProxyAdmin(address adminOwner) external returns (address) { - address proxyAdmin = address(new ProxyAdmin()); - IOwnable(proxyAdmin).transferOwnership(adminOwner); - - emit ProxyAdminCreated(proxyAdmin, adminOwner); - return proxyAdmin; - } - - /// @inheritdoc ITransparentProxyFactory - function createDeterministic( - address logic, - address admin, - bytes calldata data, - bytes32 salt - ) external returns (address) { - address proxy = address(new TransparentUpgradeableProxy{salt: salt}(logic, admin, data)); - - emit ProxyDeterministicCreated(proxy, logic, admin, salt); - return proxy; - } - - /// @inheritdoc ITransparentProxyFactory - function createDeterministicProxyAdmin( - address adminOwner, - bytes32 salt - ) external returns (address) { - address proxyAdmin = address(new ProxyAdmin{salt: salt}()); - IOwnable(proxyAdmin).transferOwnership(adminOwner); - - emit ProxyAdminDeterministicCreated(proxyAdmin, adminOwner, salt); - return proxyAdmin; - } - +contract TransparentProxyFactory is TransparentProxyFactoryBase { /// @inheritdoc ITransparentProxyFactory function predictCreateDeterministic( address logic, address admin, bytes calldata data, bytes32 salt - ) public view returns (address) { + ) public view override returns (address) { return _predictCreate2Address( address(this), @@ -74,7 +29,12 @@ contract TransparentProxyFactory is ITransparentProxyFactory { } /// @inheritdoc ITransparentProxyFactory - function predictCreateDeterministicProxyAdmin(bytes32 salt) public view returns (address) { + function predictCreateDeterministicProxyAdmin(bytes32 salt) + public + view + override + returns (address) + { return _predictCreate2Address(address(this), salt, type(ProxyAdmin).creationCode, abi.encode()); } diff --git a/src/contracts/transparent-proxy/TransparentProxyFactoryBase.sol b/src/contracts/transparent-proxy/TransparentProxyFactoryBase.sol new file mode 100644 index 0000000..0d25a5f --- /dev/null +++ b/src/contracts/transparent-proxy/TransparentProxyFactoryBase.sol @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.0; + +import {IOwnable} from './interfaces/IOwnable.sol'; +import {ITransparentProxyFactory} from './interfaces/ITransparentProxyFactory.sol'; +import {TransparentUpgradeableProxy} from './TransparentUpgradeableProxy.sol'; +import {ProxyAdmin} from './ProxyAdmin.sol'; + +/** + * @title TransparentProxyFactory + * @author BGD Labs + * @notice Factory contract to create transparent proxies, both with CREATE and CREATE2 + * @dev `create()` and `createDeterministic()` are not unified for clearer interface, and at the same + * time allowing `createDeterministic()` with salt == 0 + * @dev Highly recommended to pass as `admin` on creation an OZ ProxyAdmin instance + **/ +abstract contract TransparentProxyFactoryBase is ITransparentProxyFactory { + /// @inheritdoc ITransparentProxyFactory + function create( + address logic, + address admin, + bytes calldata data + ) external returns (address) { + address proxy = address(new TransparentUpgradeableProxy(logic, admin, data)); + + emit ProxyCreated(proxy, logic, admin); + return proxy; + } + + /// @inheritdoc ITransparentProxyFactory + function createProxyAdmin(address adminOwner) external returns (address) { + address proxyAdmin = address(new ProxyAdmin()); + IOwnable(proxyAdmin).transferOwnership(adminOwner); + + emit ProxyAdminCreated(proxyAdmin, adminOwner); + return proxyAdmin; + } + + /// @inheritdoc ITransparentProxyFactory + function createDeterministic( + address logic, + address admin, + bytes calldata data, + bytes32 salt + ) external returns (address) { + address proxy = address(new TransparentUpgradeableProxy{salt: salt}(logic, admin, data)); + + emit ProxyDeterministicCreated(proxy, logic, admin, salt); + return proxy; + } + + /// @inheritdoc ITransparentProxyFactory + function createDeterministicProxyAdmin(address adminOwner, bytes32 salt) + external + returns (address) + { + address proxyAdmin = address(new ProxyAdmin{salt: salt}()); + IOwnable(proxyAdmin).transferOwnership(adminOwner); + + emit ProxyAdminDeterministicCreated(proxyAdmin, adminOwner, salt); + return proxyAdmin; + } + + /// @inheritdoc ITransparentProxyFactory + function predictCreateDeterministic( + address logic, + address admin, + bytes calldata data, + bytes32 salt + ) public view virtual returns (address); + + /// @inheritdoc ITransparentProxyFactory + function predictCreateDeterministicProxyAdmin(bytes32 salt) public view virtual returns (address); +}