From a4be247e181861300d79af6454b3fd3776100b48 Mon Sep 17 00:00:00 2001
From: Daniel Wang <99078276+dantaik@users.noreply.github.com>
Date: Wed, 17 Jul 2024 00:22:33 +0800
Subject: [PATCH] refactor(protocol): add MainnetSgxVerifier (#17803)

---
 .../contracts/mainnet/MainnetSgxVerifier.sol    | 17 +++++++++++++++++
 .../MainnetTierRouter.sol}                      |  8 ++++----
 packages/protocol/script/DeployOnL1.s.sol       |  8 +++++++-
 3 files changed, 28 insertions(+), 5 deletions(-)
 create mode 100644 packages/protocol/contracts/mainnet/MainnetSgxVerifier.sol
 rename packages/protocol/contracts/{L1/tiers/TierRouter.sol => mainnet/MainnetTierRouter.sol} (59%)

diff --git a/packages/protocol/contracts/mainnet/MainnetSgxVerifier.sol b/packages/protocol/contracts/mainnet/MainnetSgxVerifier.sol
new file mode 100644
index 00000000000..cf69666c0bf
--- /dev/null
+++ b/packages/protocol/contracts/mainnet/MainnetSgxVerifier.sol
@@ -0,0 +1,17 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.24;
+
+import "../verifiers/SgxVerifier.sol";
+import "./LibRollupAddressCache.sol";
+
+/// @title MainnetSgxVerifier
+/// @dev This contract shall be deployed to replace its parent contract on Ethereum for Taiko
+/// mainnet to reduce gas cost.
+/// @notice See the documentation in {SgxVerifier}.
+/// @custom:security-contact security@taiko.xyz
+contract MainnetSgxVerifier is SgxVerifier {
+    function _getAddress(uint64 _chainId, bytes32 _name) internal view override returns (address) {
+        (bool found, address addr) = LibRollupAddressCache.getAddress(_chainId, _name);
+        return found ? addr : super._getAddress(_chainId, _name);
+    }
+}
diff --git a/packages/protocol/contracts/L1/tiers/TierRouter.sol b/packages/protocol/contracts/mainnet/MainnetTierRouter.sol
similarity index 59%
rename from packages/protocol/contracts/L1/tiers/TierRouter.sol
rename to packages/protocol/contracts/mainnet/MainnetTierRouter.sol
index aa4c68033c1..795bd7bd35d 100644
--- a/packages/protocol/contracts/L1/tiers/TierRouter.sol
+++ b/packages/protocol/contracts/mainnet/MainnetTierRouter.sol
@@ -1,14 +1,14 @@
 // SPDX-License-Identifier: MIT
 pragma solidity 0.8.24;
 
-import "./ITierRouter.sol";
+import "../L1/tiers/ITierRouter.sol";
 
-/// @title TierRouter
+/// @title MainnetTierRouter
 /// @dev Labeled in AddressResolver as "tier_router"
 /// @custom:security-contact security@taiko.xyz
-contract TierRouter is ITierRouter {
+contract MainnetTierRouter is ITierRouter {
     /// @inheritdoc ITierRouter
     function getProvider(uint256 /*_blockId*/ ) external pure returns (address) {
-        return 0x4cffe56C947E26D07C14020499776DB3e9AE3a23;
+        return 0x4cffe56C947E26D07C14020499776DB3e9AE3a23; // TierProviderV2
     }
 }
diff --git a/packages/protocol/script/DeployOnL1.s.sol b/packages/protocol/script/DeployOnL1.s.sol
index 12f0a9b3ff0..e586d203465 100644
--- a/packages/protocol/script/DeployOnL1.s.sol
+++ b/packages/protocol/script/DeployOnL1.s.sol
@@ -20,7 +20,7 @@ import "../contracts/mainnet/MainnetSignalService.sol";
 import "../contracts/automata-attestation/AutomataDcapV3Attestation.sol";
 import "../contracts/automata-attestation/utils/SigVerifyLib.sol";
 import "../contracts/automata-attestation/lib/PEMCertChainLib.sol";
-import "../contracts/verifiers/SgxVerifier.sol";
+import "../contracts/mainnet/MainnetSgxVerifier.sol";
 import "../contracts/team/proving/ProverSet.sol";
 import "../test/common/erc20/FreeMintERC20.sol";
 import "../test/common/erc20/MayFailFreeMintERC20.sol";
@@ -299,6 +299,12 @@ contract DeployOnL1 is DeployCapability {
             registerTo: rollupAddressManager
         });
 
+        deployProxy({
+            name: "mainnet_tier_sgx",
+            impl: address(new MainnetSgxVerifier()),
+            data: abi.encodeCall(SgxVerifier.init, (owner, rollupAddressManager))
+        });
+
         deployProxy({
             name: "tier_sgx",
             impl: address(new SgxVerifier()),