From 93bc29580b7f3fafb66137442dd831837e1c69ea Mon Sep 17 00:00:00 2001 From: Alexey Date: Mon, 2 Aug 2021 21:33:24 +0300 Subject: [PATCH] upgradability init --- contracts/CrossChainUpgradeableProxy.sol | 37 ++++++++++++++++++++++++ package.json | 2 +- yarn.lock | 7 ++--- 3 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 contracts/CrossChainUpgradeableProxy.sol diff --git a/contracts/CrossChainUpgradeableProxy.sol b/contracts/CrossChainUpgradeableProxy.sol new file mode 100644 index 0000000..1b3e21b --- /dev/null +++ b/contracts/CrossChainUpgradeableProxy.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; + +import "@openzeppelin/contracts/contracts/proxy/TransparentUpgradeableProxy.sol"; + +// https://github.com/ethereum-optimism/optimism/blob/c7bc85deee999b8edfbe187b302d0ea262638ca9/packages/contracts/contracts/optimistic-ethereum/iOVM/bridge/messaging/iOVM_CrossDomainMessenger.sol +interface iOVM_CrossDomainMessenger { + function xDomainMessageSender() external view returns (address); +} + +/** + * @dev TransparentUpgradeableProxy where admin acts from a different chain. + */ +contract CrossChainUpgradeableProxy is TransparentUpgradeableProxy { + // https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/deployments/README.md + iOVM_CrossDomainMessenger public constant messenger = iOVM_CrossDomainMessenger(0x4200000000000000000000000000000000000007); + + /** + * @dev Initializes an upgradeable proxy backed by the implementation at `_logic`. + */ + constructor( + address _logic, + address _admin, + bytes memory _data + ) TransparentUpgradeableProxy(_logic, _admin, _data) {} + + /** + * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the cross chain admin. + */ + modifier ifAdmin() override { + if (msg.sender == address(messenger) && messenger.xDomainMessageSender() == _admin()) { + _; + } else { + _fallback(); + } + } +} diff --git a/package.json b/package.json index af27b2c..98fada7 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "dependencies": { "@nomiclabs/hardhat-ethers": "^2.0.2", "@nomiclabs/hardhat-waffle": "^2.0.1", - "@openzeppelin/contracts": "^3.4.0", + "@openzeppelin/contracts": "git+https://github.com/tornadocash/openzeppelin-contracts.git#6e46aa6946a7f215e7604169ddf46e1aebea850f", "bignumber.js": "^9.0.0", "chai": "^4.3.4", "circom": "^0.5.45", diff --git a/yarn.lock b/yarn.lock index e1b8076..9714918 100644 --- a/yarn.lock +++ b/yarn.lock @@ -683,10 +683,9 @@ "@types/sinon-chai" "^3.2.3" "@types/web3" "1.0.19" -"@openzeppelin/contracts@^3.4.0": - version "3.4.1" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.4.1.tgz#03c891fec7f93be0ae44ed74e57a122a38732ce7" - integrity sha512-cUriqMauq1ylzP2TxePNdPqkwI7Le3Annh4K9rrpvKfSBB/bdW+Iu1ihBaTIABTAAJ85LmKL5SSPPL9ry8d1gQ== +"@openzeppelin/contracts@git+https://github.com/tornadocash/openzeppelin-contracts.git#6e46aa6946a7f215e7604169ddf46e1aebea850f": + version "3.4.1-solc-0.7-2" + resolved "git+https://github.com/tornadocash/openzeppelin-contracts.git#6e46aa6946a7f215e7604169ddf46e1aebea850f" "@resolver-engine/core@^0.3.3": version "0.3.3"