From d083eeb29cf7610b733b978e3cfdd0df2d7461f8 Mon Sep 17 00:00:00 2001
From: D <51912515+adaki2004@users.noreply.github.com>
Date: Mon, 10 Jun 2024 13:59:49 +0200
Subject: [PATCH 1/8] fix(protocol): fix seemingly quota issue (#17544)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Co-authored-by: Keszey Dániel <keszeyd@MacBook-Pro.local>
---
 packages/protocol/contracts/tokenvault/ERC20Vault.sol     | 3 +--
 packages/protocol/deployments/mainnet-contract-logs-L1.md | 2 ++
 packages/protocol/deployments/mainnet-contract-logs-L2.md | 2 ++
 3 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/packages/protocol/contracts/tokenvault/ERC20Vault.sol b/packages/protocol/contracts/tokenvault/ERC20Vault.sol
index e2e017f4ceb..fbe0d82a3b1 100644
--- a/packages/protocol/contracts/tokenvault/ERC20Vault.sol
+++ b/packages/protocol/contracts/tokenvault/ERC20Vault.sol
@@ -355,8 +355,6 @@ contract ERC20Vault is BaseVault {
         private
         returns (address token_)
     {
-        _consumeTokenQuota(token_, _amount);
-
         if (_ctoken.chainId == block.chainid) {
             token_ = _ctoken.addr;
             IERC20(token_).safeTransfer(_to, _amount);
@@ -366,6 +364,7 @@ contract ERC20Vault is BaseVault {
             // check.
             IBridgedERC20(token_).mint(_to, _amount);
         }
+        _consumeTokenQuota(token_, _amount);
     }
 
     /// @dev Handles the message on the source chain and returns the encoded
diff --git a/packages/protocol/deployments/mainnet-contract-logs-L1.md b/packages/protocol/deployments/mainnet-contract-logs-L1.md
index f9d3027af6d..57966041f64 100644
--- a/packages/protocol/deployments/mainnet-contract-logs-L1.md
+++ b/packages/protocol/deployments/mainnet-contract-logs-L1.md
@@ -111,6 +111,8 @@
   - upgraded from `0x15D9F7e12aEa18DAEF5c651fBf97567CAd4a4BEc` to `0xC722d9f3f8D60288589F7f67a9CFAd34d3B9bf8E` @commit`b90b932` @tx`0x416560cd96dc75ccffebe889e8d1ab3e08b33f814dc4a2bf7c6f9555071d1f6f`
   - upgraded from `0xC722d9f3f8D60288589F7f67a9CFAd34d3B9bf8E` to `0x4F750D13005444407D44dAA30922128db0374ca1` @commit`fa481c1` @tx`0x02ed558762eae5f0a930ba4a1047a02d4a793ea48890268c32df04e882f138ff`
   - upgraded from `0x4F750D13005444407D44dAA30922128db0374ca1` to `0xF8bdaC4E68bA2595Be8381aaa5456917e374E737` @commit`d907359` @tx`0xdb5e926c96d112ce1389da77a927fba6c7d04a711839b9e14777530ebcf83914`
+- todo:
+  - upgrade
 
 #### erc721_vault
 
diff --git a/packages/protocol/deployments/mainnet-contract-logs-L2.md b/packages/protocol/deployments/mainnet-contract-logs-L2.md
index fcfff4b3cd0..1f9d2e5975d 100644
--- a/packages/protocol/deployments/mainnet-contract-logs-L2.md
+++ b/packages/protocol/deployments/mainnet-contract-logs-L2.md
@@ -72,6 +72,8 @@
   - linked bridged TKO to `0xA9d23408b9bA935c230493c40C73824Df71A0975` @tx`0xe25d05320b95fbc3bffe0b7cbfe351dd5fa6413db307d5c28f7b70983567a43b`
   - linked bridged USDC to `0x07d83526730c7438048D55A4fc0b850e2aaB6f0b` @tx`0xf1752ac712779e9ae53d408abdc5eec70e63582433143d6d91a489a1e8fc4778`
   - changed owner to `0xCa5b76Cc7A38b86Db11E5aE5B1fc9740c3bA3DE8` @tx`0xf68861171c602e3e75ca69e950957fcb908c7949c6df9a9ea3026c238ebb1e9c`
+  - todo:
+    - upgrade
 
 #### erc721_vault
 

From 11755d164a532980214e69219d328fa66a06f6cc Mon Sep 17 00:00:00 2001
From: Korbinian <KorbinianK@users.noreply.github.com>
Date: Mon, 10 Jun 2024 16:11:38 +0200
Subject: [PATCH 2/8] fix(bridge-ui): recallMessage fix (#17547)

---
 .../Filter/StatusFilterDialog.svelte          |  1 +
 .../Filter/StatusFilterDropdown.svelte        |  1 +
 .../Transactions/Status/Status.svelte         |  3 ++
 packages/bridge-ui/src/i18n/en.json           |  4 +++
 packages/bridge-ui/src/libs/bridge/types.ts   |  2 +-
 .../src/libs/polling/messageStatusPoller.ts   | 24 +++++++++++++
 .../bridge-ui/src/libs/proof/BridgeProver.ts  | 34 +++++++++++++++++--
 7 files changed, 65 insertions(+), 4 deletions(-)

diff --git a/packages/bridge-ui/src/components/Transactions/Filter/StatusFilterDialog.svelte b/packages/bridge-ui/src/components/Transactions/Filter/StatusFilterDialog.svelte
index 1c9c0eb9c7c..b4a3827c85c 100644
--- a/packages/bridge-ui/src/components/Transactions/Filter/StatusFilterDialog.svelte
+++ b/packages/bridge-ui/src/components/Transactions/Filter/StatusFilterDialog.svelte
@@ -21,6 +21,7 @@
     { value: MessageStatus.RETRIABLE, label: $t('transactions.filter.retry') },
     { value: MessageStatus.DONE, label: $t('transactions.filter.claimed') },
     { value: MessageStatus.FAILED, label: $t('transactions.filter.failed') },
+    { value: MessageStatus.RECALLED, label: $t('transactions.filter.released') },
   ];
 
   const select = (option: (typeof options)[0]) => {
diff --git a/packages/bridge-ui/src/components/Transactions/Filter/StatusFilterDropdown.svelte b/packages/bridge-ui/src/components/Transactions/Filter/StatusFilterDropdown.svelte
index 1373828af1f..f2445651a8a 100644
--- a/packages/bridge-ui/src/components/Transactions/Filter/StatusFilterDropdown.svelte
+++ b/packages/bridge-ui/src/components/Transactions/Filter/StatusFilterDropdown.svelte
@@ -26,6 +26,7 @@
     { value: MessageStatus.RETRIABLE, label: $t('transactions.filter.retry') },
     { value: MessageStatus.DONE, label: $t('transactions.filter.claimed') },
     { value: MessageStatus.FAILED, label: $t('transactions.filter.failed') },
+    { value: MessageStatus.RECALLED, label: $t('transactions.filter.released') },
   ];
 
   const toggleMenu = () => {
diff --git a/packages/bridge-ui/src/components/Transactions/Status/Status.svelte b/packages/bridge-ui/src/components/Transactions/Status/Status.svelte
index 868218e8a6a..6862c043175 100644
--- a/packages/bridge-ui/src/components/Transactions/Status/Status.svelte
+++ b/packages/bridge-ui/src/components/Transactions/Status/Status.svelte
@@ -124,6 +124,9 @@
     <button class="status-btn" on:click={release} on:click={handleReleaseClick}>
       {$t('transactions.button.release')}
     </button>
+  {:else if bridgeTxStatus === MessageStatus.RECALLED}
+    <StatusDot type="error" />
+    <span>{$t('transactions.status.released.name')}</span>
   {:else}
     <!-- TODO: look into this possible state -->
     <StatusDot type="error" />
diff --git a/packages/bridge-ui/src/i18n/en.json b/packages/bridge-ui/src/i18n/en.json
index a4b2d86a257..7b9b503c630 100644
--- a/packages/bridge-ui/src/i18n/en.json
+++ b/packages/bridge-ui/src/i18n/en.json
@@ -532,6 +532,7 @@
       "claimed": "Claimed",
       "failed": "Failed",
       "processing": "Processing",
+      "released": "Released",
       "retry": "Retriable",
       "title": "Filters"
     },
@@ -592,6 +593,9 @@
         "description": "Your bridged asset cannot be processed and is now accessible to you on the source chain.",
         "name": "Release"
       },
+      "released": {
+        "name": "Released"
+      },
       "releasing": "Releasing",
       "retry": {
         "description": "The relayer was unable to process this message, and you will need to retry the processing yourself.",
diff --git a/packages/bridge-ui/src/libs/bridge/types.ts b/packages/bridge-ui/src/libs/bridge/types.ts
index 099035c7387..eda3f8410f7 100644
--- a/packages/bridge-ui/src/libs/bridge/types.ts
+++ b/packages/bridge-ui/src/libs/bridge/types.ts
@@ -9,7 +9,7 @@ export enum MessageStatus {
   RETRIABLE,
   DONE,
   FAILED,
-  PROVEN, // UI ONLY
+  RECALLED,
 }
 
 // struct Message {
diff --git a/packages/bridge-ui/src/libs/polling/messageStatusPoller.ts b/packages/bridge-ui/src/libs/polling/messageStatusPoller.ts
index b517e8f41dc..81a200e8fe2 100644
--- a/packages/bridge-ui/src/libs/polling/messageStatusPoller.ts
+++ b/packages/bridge-ui/src/libs/polling/messageStatusPoller.ts
@@ -71,6 +71,11 @@ export function startPolling(bridgeTx: BridgeTransaction, runImmediately = true)
     transport: http(),
   });
 
+  const srcChainClient = createPublicClient({
+    chain: chains.find((chain) => chain.id === Number(srcChainId)),
+    transport: http(),
+  });
+
   // We are gonna be polling the destination bridge contract
   const destBridgeAddress = routingContractsMap[Number(destChainId)][Number(srcChainId)].bridgeAddress;
   const destBridgeContract = getContract({
@@ -79,6 +84,14 @@ export function startPolling(bridgeTx: BridgeTransaction, runImmediately = true)
     client: destChainClient,
   });
 
+  // In case for recalled messages we need to check the source bridge contract
+  const srcBridgeAddress = routingContractsMap[Number(srcChainId)][Number(destChainId)].bridgeAddress;
+  const srcBridgeContract = getContract({
+    address: srcBridgeAddress,
+    abi: bridgeAbi,
+    client: srcChainClient,
+  });
+
   const stopPolling = () => {
     const interval = hashIntervalMap[hash];
     if (interval) {
@@ -108,6 +121,17 @@ export function startPolling(bridgeTx: BridgeTransaction, runImmediately = true)
       const messageStatus: MessageStatus = await destBridgeContract.read.messageStatus([bridgeTx.msgHash]);
       emitter.emit(PollingEvent.STATUS, messageStatus);
 
+      if (messageStatus === MessageStatus.FAILED) {
+        // check if the message is recalled
+        const recallStatus = await srcBridgeContract.read.messageStatus([bridgeTx.msgHash]);
+        if (recallStatus === MessageStatus.RECALLED) {
+          log(`Message ${bridgeTx.msgHash} has been recalled.`);
+          emitter.emit(PollingEvent.STATUS, MessageStatus.RECALLED);
+          stopPolling();
+          return;
+        }
+      }
+
       let blockNumber: Hex;
       if (!bridgeTx.blockNumber) {
         const receipt = await getTransactionReceipt(config, { hash: bridgeTx.hash });
diff --git a/packages/bridge-ui/src/libs/proof/BridgeProver.ts b/packages/bridge-ui/src/libs/proof/BridgeProver.ts
index 9ff338e88b4..b942b748523 100644
--- a/packages/bridge-ui/src/libs/proof/BridgeProver.ts
+++ b/packages/bridge-ui/src/libs/proof/BridgeProver.ts
@@ -211,7 +211,7 @@ export class BridgeProver {
   }
 
   async getEncodedSignalProofForRecall({ bridgeTx }: { bridgeTx: BridgeTransaction }) {
-    const { message, msgHash } = bridgeTx;
+    const { blockNumber, message, msgHash } = bridgeTx;
 
     log('msgHash', msgHash);
     if (!message) throw new ProofGenerationError('Message is not defined');
@@ -304,8 +304,36 @@ export class BridgeProver {
       // Get the signalServiceAddress for the source chain
       const destSignalServiceAddress =
         routingContractsMap[Number(destChainId)][Number(srcChainId)].signalServiceAddress;
+      const srcSignalServiceAddress = routingContractsMap[Number(srcChainId)][Number(destChainId)].signalServiceAddress;
+
+      const syncedChainData = await readContract(config, {
+        address: srcSignalServiceAddress,
+        abi: signalServiceAbi,
+        functionName: 'getSyncedChainData',
+        args: [destChainId, keccak256(toBytes('STATE_ROOT')), 0n],
+        chainId: Number(srcChainId),
+      });
+
+      log('syncedChainData', syncedChainData);
+
+      const latestSyncedblock = syncedChainData[0];
+
+      const synced = latestSyncedblock >= hexToBigInt(blockNumber);
+      log('synced', synced, latestSyncedblock, hexToBigInt(blockNumber));
+      if (!synced) {
+        throw new BlockNotSyncedError('block is not synced yet');
+      }
 
-      const block = await destChainClient.getBlock({ blockTag: 'latest' });
+      // Get the block based on the blocknumber from the destination chain
+      let block;
+      try {
+        block = await destChainClient.getBlock({ blockNumber: latestSyncedblock });
+        if (!block || block.hash === null || block.number === null) {
+          throw new BlockNotFoundError({ blockNumber: latestSyncedblock });
+        }
+      } catch {
+        throw new BlockNotFoundError({ blockNumber: latestSyncedblock });
+      }
 
       const signal = await this.getSignalForFailedMessage(msgHash);
 
@@ -330,7 +358,7 @@ export class BridgeProver {
 
       // Build the hopProof
       const hopProof: HopProof = {
-        chainId: BigInt(destChainId),
+        chainId: BigInt(srcChainId),
         blockId: BigInt(block.number),
         rootHash: block.stateRoot,
         cacheOption: 0n, // Todo: could be configurable

From 97aa874e7637d29862f9b78af78e0c7a02bb424a Mon Sep 17 00:00:00 2001
From: smtmfft <99081233+smtmfft@users.noreply.github.com>
Date: Mon, 10 Jun 2024 22:40:19 +0800
Subject: [PATCH 3/8] feat(protocol): add new tcb & update related tests
 (#17545)

---
 packages/protocol/script/SetDcapParams.s.sol  |   2 +-
 .../AutomataDcapV3AttestationTest.t.sol       |  16 +-
 .../assets/0424/tcb_30606a000000.json         | 221 ++++++++++++++++++
 .../common/AttestationBase.t.sol              |  24 +-
 4 files changed, 253 insertions(+), 10 deletions(-)
 create mode 100644 packages/protocol/test/automata-attestation/assets/0424/tcb_30606a000000.json

diff --git a/packages/protocol/script/SetDcapParams.s.sol b/packages/protocol/script/SetDcapParams.s.sol
index 9f65aa2eaa1..990a80f0bf0 100644
--- a/packages/protocol/script/SetDcapParams.s.sol
+++ b/packages/protocol/script/SetDcapParams.s.sol
@@ -67,7 +67,7 @@ contract SetDcapParams is Script, AttestationBase {
     }
 
     function _configureTcbInfoJson() internal {
-        tcbInfoPath = vm.envString("TCB_INFO_PATH");
+        string memory tcbInfoPath = vm.envString("TCB_INFO_PATH");
         string memory tcbInfoJson = vm.readFile(string.concat(vm.projectRoot(), tcbInfoPath));
         configureTcbInfoJson(dcapAttestationAddress, tcbInfoJson);
         console2.logString("TCB_INFO_JSON set: ");
diff --git a/packages/protocol/test/automata-attestation/AutomataDcapV3AttestationTest.t.sol b/packages/protocol/test/automata-attestation/AutomataDcapV3AttestationTest.t.sol
index 0983fbe0071..bc6c9b3c5e0 100644
--- a/packages/protocol/test/automata-attestation/AutomataDcapV3AttestationTest.t.sol
+++ b/packages/protocol/test/automata-attestation/AutomataDcapV3AttestationTest.t.sol
@@ -117,7 +117,7 @@ contract AutomataDcapV3AttestationTest is Test, AttestationBase {
         assertTrue(parsedInstanceAddr == address(0xC2D4564358139C90C17B744FE837F4DDc503EEdF));
     }
 
-    function testParsedQuoteBinAttestation() public {
+    function testParsedSampleQuoteBinAttestation() public {
         vm.prank(user);
         bytes memory v3QuoteBytes = sampleQuote;
         V3Struct.ParsedV3QuoteStruct memory v3quote =
@@ -128,6 +128,20 @@ contract AutomataDcapV3AttestationTest is Test, AttestationBase {
         assertTrue(parsedInstanceAddr == 0xC2D4564358139C90C17B744FE837F4DDc503EEdF);
     }
 
+    function testParsedCustomQuoteBinAttestation() public {
+        // fast forward to a time where the quote is valid
+        skip(1_820_000_000 - block.timestamp);
+        vm.prank(user);
+        bytes memory v3QuoteBytes =
+            hex"03000200000000000a000f00939a7233f79c4ca9940a0db3957f060724b261d141674cafc44426b74ed02fdf000000000b0d100fffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000500000000000000e7000000000000009b2784bccc0779fa34e75d74881bf5850bb4a6410f4edfa935ef77115db3a86d0000000000000000000000000000000000000000000000000000000000000000ca0583a715534a8c981b914589a7f0dc5d60959d9ae79fb5353299a4231673d500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000309734c02d2145cabb034f3c0505d28f7e5bfc2d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ca10000010eec632f3dbb9a3b1280ca5e837750e12ce5adbea2cc64d53672b0b0213404d3b27c84dc886ce361716b5d51e85136750ca05827ced6d7c2afd025bc6ee44bd874269e41c5fcd064b417d110f40b745b5c7d0eb8208be57c3c48bd7bdabbf2e47c46ddd935f4589134f89c9e0995dfdaaef29aa61807366818f2eebf915134d0b0d100fffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000001500000000000000e70000000000000096b347a64e5a045e27369c26e6dcda51fd7c850e9b3a3a79e718f43261dee1e400000000000000000000000000000000000000000000000000000000000000008c4f5775d796503e96137f77c68a829a0056ac8ded70140b081b094490c57bff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bf7138a8539a3d44afb1d9ab145134cd27aa8c6ee6c3053bdab6b19b46800d570000000000000000000000000000000000000000000000000000000000000000e04cceabc75e8485601a01fdf514b68c31f4498f3e2273930c03a1f7efbe0eaee34f08f9c3a0eba0e24f677ce5692389f4c016e5caf8451b544d312df74264752000000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f0500620e00002d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d494945386a4343424a696741774942416749556565364e4e4f502f6b526c6f734d77336b435a70644a70424f414977436759494b6f5a497a6a3045417749770a634445694d434147413155454177775a535735305a577767553064594946424453794251624746305a6d397962534244515445614d42674741315545436777520a535735305a577767513239796347397959585270623234784644415342674e564241634d43314e68626e526849454e7359584a684d51737743515944565151490a44414a445154454c4d416b474131554542684d4356564d774868634e4d6a51774e5449794d6a4d7a4f544d345768634e4d7a45774e5449794d6a4d7a4f544d340a576a42774d534977494159445651514444426c4a626e526c624342545231676755454e4c49454e6c636e52705a6d6c6a5958526c4d526f77474159445651514b0a4442464a626e526c6243424462334a7762334a6864476c76626a45554d424947413155454277774c553246756447456751327868636d4578437a414a42674e560a4241674d416b4e424d517377435159445651514745774a56557a425a4d424d4742797147534d34394167454743437147534d34394177454841304941424673770a4f5267652f704a4834514d3163456c44626f463451384549313864386a42665a63536b4c615179656b35614f6b4767454756672f476655356255453450544c2b0a37794c6b626b394471557950467836592b434b6a67674d4f4d494944436a416642674e5648534d4547444157674253566231334e765276683655424a796454300a4d383442567776655644427242674e56485238455a4442694d47436758714263686c706f64485277637a6f764c32467761533530636e567a6447566b633256790a646d6c6a5a584d75615735305a577775593239744c334e6e6543396a5a584a3061575a7059324630615739754c3359304c33426a61324e796244396a595431770a624746305a6d397962535a6c626d4e765a476c755a7a316b5a584977485159445652304f42425945464c686b766f31584a6f2b6958464c6c6c454f2b472f56580a695239534d41344741315564447745422f775145417749477744414d42674e5648524d4241663845416a41414d4949434f77594a4b6f5a496876684e415130420a424949434c444343416967774867594b4b6f5a496876684e41513042415151516668326b6a583748503937435265674c6256594f726a434341575547436971470a534962345451454e41514977676746564d42414743797147534962345451454e415149424167454c4d42414743797147534962345451454e415149434167454c0a4d42414743797147534962345451454e41514944416745444d42414743797147534962345451454e41514945416745444d42454743797147534962345451454e0a41514946416749412f7a415242677371686b69472b4530424451454342674943415038774541594c4b6f5a496876684e4151304241676343415141774541594c0a4b6f5a496876684e4151304241676743415141774541594c4b6f5a496876684e4151304241676b43415141774541594c4b6f5a496876684e4151304241676f430a415141774541594c4b6f5a496876684e4151304241677343415141774541594c4b6f5a496876684e4151304241677743415141774541594c4b6f5a496876684e0a4151304241673043415141774541594c4b6f5a496876684e4151304241673443415141774541594c4b6f5a496876684e4151304241673843415141774541594c0a4b6f5a496876684e4151304241684143415141774541594c4b6f5a496876684e4151304241684543415130774877594c4b6f5a496876684e41513042416849450a4541734c4177502f2f7741414141414141414141414141774541594b4b6f5a496876684e4151304241775143414141774641594b4b6f5a496876684e415130420a424151474d474271414141414d41384743697147534962345451454e4151554b415145774867594b4b6f5a496876684e41513042426751516c4b6254394547580a78334843365163754c712b374d7a424542676f71686b69472b453042445145484d4459774541594c4b6f5a496876684e4151304242774542416638774541594c0a4b6f5a496876684e4151304242774942416638774541594c4b6f5a496876684e4151304242774d4241663877436759494b6f5a497a6a304541774944534141770a5251496763325556534f386d4b384c314f5675534943514264315671534e50326e716d5656394c4678504e326c6f774349514362662b69785065367a335966420a664b51344f4b6c546f694d55386a66333849672f765275586976525257773d3d0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a2d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949436c6a4343416a32674177494241674956414a567658633239472b487051456e4a3150517a7a674658433935554d416f4743437147534d343942414d430a4d476778476a415942674e5642414d4d45556c756447567349464e48574342536232393049454e424d526f77474159445651514b4442464a626e526c624342440a62334a7762334a6864476c76626a45554d424947413155454277774c553246756447456751327868636d4578437a414a42674e564241674d416b4e424d5173770a435159445651514745774a56557a4165467730784f4441314d6a45784d4455774d5442614677307a4d7a41314d6a45784d4455774d5442614d484178496a41670a42674e5642414d4d47556c756447567349464e4857434251513073675547786864475a76636d306751304578476a415942674e5642416f4d45556c75644756730a49454e76636e4276636d4630615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b474131554543417743513045780a437a414a42674e5642415954416c56544d466b77457759484b6f5a497a6a3043415159494b6f5a497a6a304441516344516741454e53422f377432316c58534f0a3243757a7078773734654a423732457944476757357258437478327456544c7136684b6b367a2b5569525a436e71523770734f766771466553786c6d546c4a6c0a65546d693257597a33714f42757a43427544416642674e5648534d4547444157674251695a517a575770303069664f44744a5653763141624f536347724442530a42674e5648523845537a424a4d45656752614244686b466f64485277637a6f764c324e6c636e52705a6d6c6a5958526c63793530636e567a6447566b633256790a646d6c6a5a584d75615735305a577775593239744c306c756447567355306459556d397664454e424c6d526c636a416442674e5648513445466751556c5739640a7a62306234656c4153636e553944504f4156634c336c517744675944565230504151482f42415144416745474d42494741315564457745422f7751494d4159420a4166384341514177436759494b6f5a497a6a30454177494452774177524149675873566b6930772b6936565947573355462f32327561586530594a446a3155650a6e412b546a44316169356343494359623153416d4435786b66545670766f34556f79695359787244574c6d5552344349394e4b7966504e2b0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a2d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949436a7a4343416a53674177494241674955496d554d316c71644e496e7a6737535655723951477a6b6e42717777436759494b6f5a497a6a3045417749770a614445614d4267474131554541777752535735305a5777675530645949464a766233516751304578476a415942674e5642416f4d45556c756447567349454e760a636e4276636d4630615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b47413155454341774351304578437a414a0a42674e5642415954416c56544d423458445445344d4455794d5445774e4455784d466f58445451354d54497a4d54497a4e546b314f566f77614445614d4267470a4131554541777752535735305a5777675530645949464a766233516751304578476a415942674e5642416f4d45556c756447567349454e76636e4276636d46300a615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b47413155454341774351304578437a414a42674e56424159540a416c56544d466b77457759484b6f5a497a6a3043415159494b6f5a497a6a3044415163445167414543366e45774d4449595a4f6a2f69505773437a61454b69370a314f694f534c52466857476a626e42564a66566e6b59347533496a6b4459594c304d784f346d717379596a6c42616c54565978465032734a424b357a6c4b4f420a757a43427544416642674e5648534d4547444157674251695a517a575770303069664f44744a5653763141624f5363477244425342674e5648523845537a424a0a4d45656752614244686b466f64485277637a6f764c324e6c636e52705a6d6c6a5958526c63793530636e567a6447566b63325679646d6c6a5a584d75615735300a5a577775593239744c306c756447567355306459556d397664454e424c6d526c636a416442674e564851344546675155496d554d316c71644e496e7a673753560a55723951477a6b6e4271777744675944565230504151482f42415144416745474d42494741315564457745422f7751494d4159424166384341514577436759490a4b6f5a497a6a3045417749445351417752674968414f572f35516b522b533943695344634e6f6f774c7550524c735747662f59693747535839344267775477670a41694541344a306c72486f4d732b586f356f2f7358364f39515778485241765a55474f6452513763767152586171493d0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a00";
+        V3Struct.ParsedV3QuoteStruct memory v3quote =
+            verifyParsedQuoteAttestation(v3QuoteBytes, true);
+        address parsedInstanceAddr =
+            address(bytes20(Bytes.slice(v3quote.localEnclaveReport.reportData, 0, 20)));
+        // console.log("[log] parsed instance addr = %s", parsedInstanceAddr);
+        assertTrue(parsedInstanceAddr == 0x309734C02d2145cABB034F3c0505D28F7E5bFc2d);
+    }
+
     function testParsedQuoteBase64Attestation() public {
         string memory v3QuoteB64Str =
             "AwACAAAAAAAKAA8Ak5pyM/ecTKmUCg2zlX8GBxLOavHkqB4OzaxCe5m7ApUAAAAACwsQD///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAADnAAAAAAAAADAx1Y7sROJljY0p6/ptbdwC841C1n7aq7S/qjSGeOa6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdPSuOeKkIHE14ZQJvmEsmUZdpbf5KBZii0O8HZPcA9QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdC5oqY9mLGLKIiJy2EWABZTTIFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyhAAAEDWo4+gcMfB8oCHFOW95E3dDzSJmZxRjEPY6SLfsAxxmdL1E9tpPreSh37ItjqcFJQ6gYaaITdFjh1JUAIXGkDHJ34Tn18pgiVpiftlGYcB2Db41vFSVv8F1IkbytroE3V6fAn9HOAil3g7r2a52XZitfw4BTw0lwKAvqDrbhp+CwsQD///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAAAAAAAADnAAAAAAAAAJazR6ZOWgReJzacJubc2lH9fIUOmzo6eecY9DJh3uHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMT1d115ZQPpYTf3fGioKaAFasje1wFAsIGwlEkMV7/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1ueoS9M+Q7Gjo9LDL6xWrbHDoWPHtiwDG87hHG/EUZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXsD5UvPvZXKx36JrvQfjbUe/9s+nMccmvZd/k77abt+DaUSo3diPOAmrh0ahh1zxMInkgdjDYnXR+3H1g3xY8SAAAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8FAGIOAAAtLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRTh6Q0NCSm1nQXdJQkFnSVZBTHorallqeGNYK2ZKb21BVWJDSnFnaWZJb2w2TUFvR0NDcUdTTTQ5QkFNQwpNSEF4SWpBZ0JnTlZCQU1NR1VsdWRHVnNJRk5IV0NCUVEwc2dVR3hoZEdadmNtMGdRMEV4R2pBWUJnTlZCQW9NCkVVbHVkR1ZzSUVOdmNuQnZjbUYwYVc5dU1SUXdFZ1lEVlFRSERBdFRZVzUwWVNCRGJHRnlZVEVMTUFrR0ExVUUKQ0F3Q1EwRXhDekFKQmdOVkJBWVRBbFZUTUI0WERUSXpNRGd5T0RFeE1UTXdOVm9YRFRNd01EZ3lPREV4TVRNdwpOVm93Y0RFaU1DQUdBMVVFQXd3WlNXNTBaV3dnVTBkWUlGQkRTeUJEWlhKMGFXWnBZMkYwWlRFYU1CZ0dBMVVFCkNnd1JTVzUwWld3Z1EyOXljRzl5WVhScGIyNHhGREFTQmdOVkJBY01DMU5oYm5SaElFTnNZWEpoTVFzd0NRWUQKVlFRSURBSkRRVEVMTUFrR0ExVUVCaE1DVlZNd1dUQVRCZ2NxaGtqT1BRSUJCZ2dxaGtqT1BRTUJCd05DQUFReQpzQVNyUzZya2VqMTRIZjFKU3B1UE8xTkRVVnl6WEJDdnAxaDQyRjEwVVUwQUZVV2cxWTQ4b2VCZzd0dk41WDJJClRHRUI1ekhCanpqdjlrdVd5VWpVbzRJRERqQ0NBd293SHdZRFZSMGpCQmd3Rm9BVWxXOWR6YjBiNGVsQVNjblUKOURQT0FWY0wzbFF3YXdZRFZSMGZCR1F3WWpCZ29GNmdYSVphYUhSMGNITTZMeTloY0drdWRISjFjM1JsWkhObApjblpwWTJWekxtbHVkR1ZzTG1OdmJTOXpaM2d2WTJWeWRHbG1hV05oZEdsdmJpOTJOQzl3WTJ0amNtdy9ZMkU5CmNHeGhkR1p2Y20wbVpXNWpiMlJwYm1jOVpHVnlNQjBHQTFVZERnUVdCQlJUVjZabHoxdkprWVNma0pqOE5pZnoKcWdhd1dEQU9CZ05WSFE4QkFmOEVCQU1DQnNBd0RBWURWUjBUQVFIL0JBSXdBRENDQWpzR0NTcUdTSWI0VFFFTgpBUVNDQWl3d2dnSW9NQjRHQ2lxR1NJYjRUUUVOQVFFRUVQNUdyZ0Vjem9wTmJvTTBzSTBidEFFd2dnRmxCZ29xCmhraUcrRTBCRFFFQ01JSUJWVEFRQmdzcWhraUcrRTBCRFFFQ0FRSUJDekFRQmdzcWhraUcrRTBCRFFFQ0FnSUIKQ3pBUUJnc3Foa2lHK0UwQkRRRUNBd0lCQXpBUUJnc3Foa2lHK0UwQkRRRUNCQUlCQXpBUkJnc3Foa2lHK0UwQgpEUUVDQlFJQ0FQOHdFUVlMS29aSWh2aE5BUTBCQWdZQ0FnRC9NQkFHQ3lxR1NJYjRUUUVOQVFJSEFnRUFNQkFHCkN5cUdTSWI0VFFFTkFRSUlBZ0VBTUJBR0N5cUdTSWI0VFFFTkFRSUpBZ0VBTUJBR0N5cUdTSWI0VFFFTkFRSUsKQWdFQU1CQUdDeXFHU0liNFRRRU5BUUlMQWdFQU1CQUdDeXFHU0liNFRRRU5BUUlNQWdFQU1CQUdDeXFHU0liNApUUUVOQVFJTkFnRUFNQkFHQ3lxR1NJYjRUUUVOQVFJT0FnRUFNQkFHQ3lxR1NJYjRUUUVOQVFJUEFnRUFNQkFHCkN5cUdTSWI0VFFFTkFRSVFBZ0VBTUJBR0N5cUdTSWI0VFFFTkFRSVJBZ0VOTUI4R0N5cUdTSWI0VFFFTkFRSVMKQkJBTEN3TUQvLzhBQUFBQUFBQUFBQUFBTUJBR0NpcUdTSWI0VFFFTkFRTUVBZ0FBTUJRR0NpcUdTSWI0VFFFTgpBUVFFQmdCZ2FnQUFBREFQQmdvcWhraUcrRTBCRFFFRkNnRUJNQjRHQ2lxR1NJYjRUUUVOQVFZRUVFV0p6T3Z5ClpFOEsza2ovSGhYRWEvc3dSQVlLS29aSWh2aE5BUTBCQnpBMk1CQUdDeXFHU0liNFRRRU5BUWNCQVFIL01CQUcKQ3lxR1NJYjRUUUVOQVFjQ0FRSC9NQkFHQ3lxR1NJYjRUUUVOQVFjREFRSC9NQW9HQ0NxR1NNNDlCQU1DQTBnQQpNRVVDSUJxM3Z4MkROYW1RQkZtVWRNZSttUFlFQ3U4NFhnb0ZDZ0l3U0pWNGNKYVRBaUVBNDNwN3Ryd0I4MHMrCjJpd2FobURkQW5DTXdKVlBMaVNFdXdEUUY4VkVnU3c9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNsakNDQWoyZ0F3SUJBZ0lWQUpWdlhjMjlHK0hwUUVuSjFQUXp6Z0ZYQzk1VU1Bb0dDQ3FHU000OUJBTUMKTUdneEdqQVlCZ05WQkFNTUVVbHVkR1ZzSUZOSFdDQlNiMjkwSUVOQk1Sb3dHQVlEVlFRS0RCRkpiblJsYkNCRApiM0p3YjNKaGRHbHZiakVVTUJJR0ExVUVCd3dMVTJGdWRHRWdRMnhoY21FeEN6QUpCZ05WQkFnTUFrTkJNUXN3CkNRWURWUVFHRXdKVlV6QWVGdzB4T0RBMU1qRXhNRFV3TVRCYUZ3MHpNekExTWpFeE1EVXdNVEJhTUhBeElqQWcKQmdOVkJBTU1HVWx1ZEdWc0lGTkhXQ0JRUTBzZ1VHeGhkR1p2Y20wZ1EwRXhHakFZQmdOVkJBb01FVWx1ZEdWcwpJRU52Y25CdmNtRjBhVzl1TVJRd0VnWURWUVFIREF0VFlXNTBZU0JEYkdGeVlURUxNQWtHQTFVRUNBd0NRMEV4CkN6QUpCZ05WQkFZVEFsVlRNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVOU0IvN3QyMWxYU08KMkN1enB4dzc0ZUpCNzJFeURHZ1c1clhDdHgydFZUTHE2aEtrNnorVWlSWkNucVI3cHNPdmdxRmVTeGxtVGxKbAplVG1pMldZejNxT0J1ekNCdURBZkJnTlZIU01FR0RBV2dCUWlaUXpXV3AwMGlmT0R0SlZTdjFBYk9TY0dyREJTCkJnTlZIUjhFU3pCSk1FZWdSYUJEaGtGb2RIUndjem92TDJObGNuUnBabWxqWVhSbGN5NTBjblZ6ZEdWa2MyVnkKZG1salpYTXVhVzUwWld3dVkyOXRMMGx1ZEdWc1UwZFlVbTl2ZEVOQkxtUmxjakFkQmdOVkhRNEVGZ1FVbFc5ZAp6YjBiNGVsQVNjblU5RFBPQVZjTDNsUXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CSUdBMVVkRXdFQi93UUlNQVlCCkFmOENBUUF3Q2dZSUtvWkl6ajBFQXdJRFJ3QXdSQUlnWHNWa2kwdytpNlZZR1czVUYvMjJ1YVhlMFlKRGoxVWUKbkErVGpEMWFpNWNDSUNZYjFTQW1ENXhrZlRWcHZvNFVveWlTWXhyRFdMbVVSNENJOU5LeWZQTisKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2p6Q0NBalNnQXdJQkFnSVVJbVVNMWxxZE5JbnpnN1NWVXI5UUd6a25CcXd3Q2dZSUtvWkl6ajBFQXdJdwphREVhTUJnR0ExVUVBd3dSU1c1MFpXd2dVMGRZSUZKdmIzUWdRMEV4R2pBWUJnTlZCQW9NRVVsdWRHVnNJRU52CmNuQnZjbUYwYVc5dU1SUXdFZ1lEVlFRSERBdFRZVzUwWVNCRGJHRnlZVEVMTUFrR0ExVUVDQXdDUTBFeEN6QUoKQmdOVkJBWVRBbFZUTUI0WERURTRNRFV5TVRFd05EVXhNRm9YRFRRNU1USXpNVEl6TlRrMU9Wb3dhREVhTUJnRwpBMVVFQXd3UlNXNTBaV3dnVTBkWUlGSnZiM1FnUTBFeEdqQVlCZ05WQkFvTUVVbHVkR1ZzSUVOdmNuQnZjbUYwCmFXOXVNUlF3RWdZRFZRUUhEQXRUWVc1MFlTQkRiR0Z5WVRFTE1Ba0dBMVVFQ0F3Q1EwRXhDekFKQmdOVkJBWVQKQWxWVE1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRUM2bkV3TURJWVpPai9pUFdzQ3phRUtpNwoxT2lPU0xSRmhXR2pibkJWSmZWbmtZNHUzSWprRFlZTDBNeE80bXFzeVlqbEJhbFRWWXhGUDJzSkJLNXpsS09CCnV6Q0J1REFmQmdOVkhTTUVHREFXZ0JRaVpReldXcDAwaWZPRHRKVlN2MUFiT1NjR3JEQlNCZ05WSFI4RVN6QkoKTUVlZ1JhQkRoa0ZvZEhSd2N6b3ZMMk5sY25ScFptbGpZWFJsY3k1MGNuVnpkR1ZrYzJWeWRtbGpaWE11YVc1MApaV3d1WTI5dEwwbHVkR1ZzVTBkWVVtOXZkRU5CTG1SbGNqQWRCZ05WSFE0RUZnUVVJbVVNMWxxZE5JbnpnN1NWClVyOVFHemtuQnF3d0RnWURWUjBQQVFIL0JBUURBZ0VHTUJJR0ExVWRFd0VCL3dRSU1BWUJBZjhDQVFFd0NnWUkKS29aSXpqMEVBd0lEU1FBd1JnSWhBT1cvNVFrUitTOUNpU0RjTm9vd0x1UFJMc1dHZi9ZaTdHU1g5NEJnd1R3ZwpBaUVBNEowbHJIb01zK1hvNW8vc1g2TzlRV3hIUkF2WlVHT2RSUTdjdnFSWGFxST0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoA";
diff --git a/packages/protocol/test/automata-attestation/assets/0424/tcb_30606a000000.json b/packages/protocol/test/automata-attestation/assets/0424/tcb_30606a000000.json
new file mode 100644
index 00000000000..c97c2b2971d
--- /dev/null
+++ b/packages/protocol/test/automata-attestation/assets/0424/tcb_30606a000000.json
@@ -0,0 +1,221 @@
+{
+  "tcbInfo": {
+    "version": 2,
+    "issueDate": "2024-06-05T21:19:36Z",
+    "nextUpdate": "2024-07-05T21:19:36Z",
+    "fmspc": "30606a000000",
+    "pceId": "0000",
+    "tcbType": 0,
+    "tcbEvaluationDataNumber": 16,
+    "tcbLevels": [
+      {
+        "tcb": {
+          "sgxtcbcomp01svn": 12,
+          "sgxtcbcomp02svn": 12,
+          "sgxtcbcomp03svn": 3,
+          "sgxtcbcomp04svn": 3,
+          "sgxtcbcomp05svn": 255,
+          "sgxtcbcomp06svn": 255,
+          "sgxtcbcomp07svn": 1,
+          "sgxtcbcomp08svn": 0,
+          "sgxtcbcomp09svn": 0,
+          "sgxtcbcomp10svn": 0,
+          "sgxtcbcomp11svn": 0,
+          "sgxtcbcomp12svn": 0,
+          "sgxtcbcomp13svn": 0,
+          "sgxtcbcomp14svn": 0,
+          "sgxtcbcomp15svn": 0,
+          "sgxtcbcomp16svn": 0,
+          "pcesvn": 13
+        },
+        "tcbDate": "2023-08-09T00:00:00Z",
+        "tcbStatus": "SWHardeningNeeded"
+      },
+      {
+        "tcb": {
+          "sgxtcbcomp01svn": 12,
+          "sgxtcbcomp02svn": 12,
+          "sgxtcbcomp03svn": 3,
+          "sgxtcbcomp04svn": 3,
+          "sgxtcbcomp05svn": 255,
+          "sgxtcbcomp06svn": 255,
+          "sgxtcbcomp07svn": 0,
+          "sgxtcbcomp08svn": 0,
+          "sgxtcbcomp09svn": 0,
+          "sgxtcbcomp10svn": 0,
+          "sgxtcbcomp11svn": 0,
+          "sgxtcbcomp12svn": 0,
+          "sgxtcbcomp13svn": 0,
+          "sgxtcbcomp14svn": 0,
+          "sgxtcbcomp15svn": 0,
+          "sgxtcbcomp16svn": 0,
+          "pcesvn": 13
+        },
+        "tcbDate": "2023-08-09T00:00:00Z",
+        "tcbStatus": "ConfigurationAndSWHardeningNeeded"
+      },
+      {
+        "tcb": {
+          "sgxtcbcomp01svn": 11,
+          "sgxtcbcomp02svn": 11,
+          "sgxtcbcomp03svn": 3,
+          "sgxtcbcomp04svn": 3,
+          "sgxtcbcomp05svn": 255,
+          "sgxtcbcomp06svn": 255,
+          "sgxtcbcomp07svn": 1,
+          "sgxtcbcomp08svn": 0,
+          "sgxtcbcomp09svn": 0,
+          "sgxtcbcomp10svn": 0,
+          "sgxtcbcomp11svn": 0,
+          "sgxtcbcomp12svn": 0,
+          "sgxtcbcomp13svn": 0,
+          "sgxtcbcomp14svn": 0,
+          "sgxtcbcomp15svn": 0,
+          "sgxtcbcomp16svn": 0,
+          "pcesvn": 13
+        },
+        "tcbDate": "2023-02-15T00:00:00Z",
+        "tcbStatus": "OutOfDate"
+      },
+      {
+        "tcb": {
+          "sgxtcbcomp01svn": 11,
+          "sgxtcbcomp02svn": 11,
+          "sgxtcbcomp03svn": 3,
+          "sgxtcbcomp04svn": 3,
+          "sgxtcbcomp05svn": 255,
+          "sgxtcbcomp06svn": 255,
+          "sgxtcbcomp07svn": 0,
+          "sgxtcbcomp08svn": 0,
+          "sgxtcbcomp09svn": 0,
+          "sgxtcbcomp10svn": 0,
+          "sgxtcbcomp11svn": 0,
+          "sgxtcbcomp12svn": 0,
+          "sgxtcbcomp13svn": 0,
+          "sgxtcbcomp14svn": 0,
+          "sgxtcbcomp15svn": 0,
+          "sgxtcbcomp16svn": 0,
+          "pcesvn": 13
+        },
+        "tcbDate": "2023-02-15T00:00:00Z",
+        "tcbStatus": "OutOfDateConfigurationNeeded"
+      },
+      {
+        "tcb": {
+          "sgxtcbcomp01svn": 7,
+          "sgxtcbcomp02svn": 9,
+          "sgxtcbcomp03svn": 3,
+          "sgxtcbcomp04svn": 3,
+          "sgxtcbcomp05svn": 255,
+          "sgxtcbcomp06svn": 255,
+          "sgxtcbcomp07svn": 1,
+          "sgxtcbcomp08svn": 0,
+          "sgxtcbcomp09svn": 0,
+          "sgxtcbcomp10svn": 0,
+          "sgxtcbcomp11svn": 0,
+          "sgxtcbcomp12svn": 0,
+          "sgxtcbcomp13svn": 0,
+          "sgxtcbcomp14svn": 0,
+          "sgxtcbcomp15svn": 0,
+          "sgxtcbcomp16svn": 0,
+          "pcesvn": 13
+        },
+        "tcbDate": "2022-08-10T00:00:00Z",
+        "tcbStatus": "OutOfDate"
+      },
+      {
+        "tcb": {
+          "sgxtcbcomp01svn": 7,
+          "sgxtcbcomp02svn": 9,
+          "sgxtcbcomp03svn": 3,
+          "sgxtcbcomp04svn": 3,
+          "sgxtcbcomp05svn": 255,
+          "sgxtcbcomp06svn": 255,
+          "sgxtcbcomp07svn": 0,
+          "sgxtcbcomp08svn": 0,
+          "sgxtcbcomp09svn": 0,
+          "sgxtcbcomp10svn": 0,
+          "sgxtcbcomp11svn": 0,
+          "sgxtcbcomp12svn": 0,
+          "sgxtcbcomp13svn": 0,
+          "sgxtcbcomp14svn": 0,
+          "sgxtcbcomp15svn": 0,
+          "sgxtcbcomp16svn": 0,
+          "pcesvn": 13
+        },
+        "tcbDate": "2022-08-10T00:00:00Z",
+        "tcbStatus": "OutOfDateConfigurationNeeded"
+      },
+      {
+        "tcb": {
+          "sgxtcbcomp01svn": 4,
+          "sgxtcbcomp02svn": 4,
+          "sgxtcbcomp03svn": 3,
+          "sgxtcbcomp04svn": 3,
+          "sgxtcbcomp05svn": 255,
+          "sgxtcbcomp06svn": 255,
+          "sgxtcbcomp07svn": 0,
+          "sgxtcbcomp08svn": 0,
+          "sgxtcbcomp09svn": 0,
+          "sgxtcbcomp10svn": 0,
+          "sgxtcbcomp11svn": 0,
+          "sgxtcbcomp12svn": 0,
+          "sgxtcbcomp13svn": 0,
+          "sgxtcbcomp14svn": 0,
+          "sgxtcbcomp15svn": 0,
+          "sgxtcbcomp16svn": 0,
+          "pcesvn": 11
+        },
+        "tcbDate": "2021-11-10T00:00:00Z",
+        "tcbStatus": "OutOfDate"
+      },
+      {
+        "tcb": {
+          "sgxtcbcomp01svn": 4,
+          "sgxtcbcomp02svn": 4,
+          "sgxtcbcomp03svn": 3,
+          "sgxtcbcomp04svn": 3,
+          "sgxtcbcomp05svn": 255,
+          "sgxtcbcomp06svn": 255,
+          "sgxtcbcomp07svn": 0,
+          "sgxtcbcomp08svn": 0,
+          "sgxtcbcomp09svn": 0,
+          "sgxtcbcomp10svn": 0,
+          "sgxtcbcomp11svn": 0,
+          "sgxtcbcomp12svn": 0,
+          "sgxtcbcomp13svn": 0,
+          "sgxtcbcomp14svn": 0,
+          "sgxtcbcomp15svn": 0,
+          "sgxtcbcomp16svn": 0,
+          "pcesvn": 10
+        },
+        "tcbDate": "2020-11-11T00:00:00Z",
+        "tcbStatus": "OutOfDate"
+      },
+      {
+        "tcb": {
+          "sgxtcbcomp01svn": 4,
+          "sgxtcbcomp02svn": 4,
+          "sgxtcbcomp03svn": 3,
+          "sgxtcbcomp04svn": 3,
+          "sgxtcbcomp05svn": 255,
+          "sgxtcbcomp06svn": 255,
+          "sgxtcbcomp07svn": 0,
+          "sgxtcbcomp08svn": 0,
+          "sgxtcbcomp09svn": 0,
+          "sgxtcbcomp10svn": 0,
+          "sgxtcbcomp11svn": 0,
+          "sgxtcbcomp12svn": 0,
+          "sgxtcbcomp13svn": 0,
+          "sgxtcbcomp14svn": 0,
+          "sgxtcbcomp15svn": 0,
+          "sgxtcbcomp16svn": 0,
+          "pcesvn": 5
+        },
+        "tcbDate": "2018-01-04T00:00:00Z",
+        "tcbStatus": "OutOfDate"
+      }
+    ]
+  },
+  "signature": "cd542e85f79fdf7fadb6218bb8640df5fd988f6287b5da46c7f96c63f93c39e540fe260a2f5fe640430705339fad9372a4301f071a9838a737dff6ff6c63e042"
+}
diff --git a/packages/protocol/test/automata-attestation/common/AttestationBase.t.sol b/packages/protocol/test/automata-attestation/common/AttestationBase.t.sol
index 62016721950..33345398ca9 100644
--- a/packages/protocol/test/automata-attestation/common/AttestationBase.t.sol
+++ b/packages/protocol/test/automata-attestation/common/AttestationBase.t.sol
@@ -30,7 +30,12 @@ contract AttestationBase is Test, DcapTestUtils, V3QuoteParseUtils {
     // use a network that where the P256Verifier contract exists
     // ref: https://github.com/daimo-eth/p256-verifier
     //string internal rpcUrl = vm.envString("RPC_URL");
-    string internal tcbInfoPath = "/test/automata-attestation/assets/0923/tcb_00606A000000.json";
+    string[] internal tcbInfoPaths = [
+        "/test/automata-attestation/assets/0923/tcb_00606A000000.json",
+        "/test/automata-attestation/assets/0424/tcb_00A067110000.json",
+        "/test/automata-attestation/assets/0424/tcb_00906ED50000.json",
+        "/test/automata-attestation/assets/0424/tcb_30606a000000.json"
+    ];
     string internal idPath = "/test/automata-attestation/assets/0923/identity.json";
     address constant admin = address(1);
     address constant user = 0x0926b716f6aEF52F9F3C3474A2846e1Bf1ACedf6;
@@ -68,15 +73,18 @@ contract AttestationBase is Test, DcapTestUtils, V3QuoteParseUtils {
         setMrEnclave(address(attestation), mrEnclave, true);
         setMrSigner(address(attestation), mrSigner, true);
 
-        string memory tcbInfoJson = vm.readFile(string.concat(vm.projectRoot(), tcbInfoPath));
-        string memory enclaveIdJson = vm.readFile(string.concat(vm.projectRoot(), idPath));
+        for (uint256 i = 0; i < tcbInfoPaths.length; i++) {
+            string memory tcbInfoJson =
+                vm.readFile(string.concat(vm.projectRoot(), tcbInfoPaths[i]));
 
-        (bool tcbParsedSuccess, TCBInfoStruct.TCBInfo memory parsedTcbInfo) =
-            parseTcbInfoJson(tcbInfoJson);
-        require(tcbParsedSuccess, "tcb parsed failed");
-        string memory fmspc = LibString.lower(parsedTcbInfo.fmspc);
-        attestation.configureTcbInfoJson(fmspc, parsedTcbInfo);
+            (bool tcbParsedSuccess, TCBInfoStruct.TCBInfo memory parsedTcbInfo) =
+                parseTcbInfoJson(tcbInfoJson);
+            require(tcbParsedSuccess, "tcb parsed failed");
+            string memory fmspc = LibString.lower(parsedTcbInfo.fmspc);
+            attestation.configureTcbInfoJson(fmspc, parsedTcbInfo);
+        }
 
+        string memory enclaveIdJson = vm.readFile(string.concat(vm.projectRoot(), idPath));
         configureQeIdentityJson(address(attestation), enclaveIdJson);
         vm.stopPrank();
     }

From 98beab8a7de4f365ec76bd6fbffebfcc6fb4505d Mon Sep 17 00:00:00 2001
From: David <david@taiko.xyz>
Date: Mon, 10 Jun 2024 23:18:44 +0700
Subject: [PATCH 4/8] docs(protocol): update Hekla deployment (#17543)

---
 .../deployments/hekla-contract-logs.md        | 60 ++++++++++++-------
 1 file changed, 38 insertions(+), 22 deletions(-)

diff --git a/packages/protocol/deployments/hekla-contract-logs.md b/packages/protocol/deployments/hekla-contract-logs.md
index 4ec92a0750b..192f4392b1e 100644
--- a/packages/protocol/deployments/hekla-contract-logs.md
+++ b/packages/protocol/deployments/hekla-contract-logs.md
@@ -9,10 +9,11 @@
 ### shared_address_manager
 
 - proxy: `0x7D3338FD5e654CAC5B10028088624CA1D64e74f7`
-- impl: `0x1B71F7014DB583Dc354d97608FAFe81e1a611c03`
+- impl: `0x27ef4e7b101e822Dd107FF14Ca2540e89cea8E3e`
 - owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805`
 - logs:
   - upgraded on May 10, 2024 at commit `4903bec`
+  - upgraded on Jun 10, 2024 at commit `d5965bb`
 
 ### taiko_token
 
@@ -25,42 +26,47 @@
 ### signal_service
 
 - proxy: `0x6Fc2fe9D9dd0251ec5E0727e826Afbb0Db2CBe0D`
-- impl: `0x7c20d41c2573A1225B361A3B2F667fe1F021A83B`
+- impl: `0xE6371B30e500ff38ec809a652fdFE98174011B2D`
 - owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805`
 - logs:
   - upgraded on May 10, 2024 at commit `4903bec`
+  - upgraded on Jun 10, 2024 at commit `d5965bb`
 
 ### bridge
 
 - proxy: `0xA098b76a3Dd499D3F6D58D8AcCaFC8efBFd06807`
-- impl: `0x74baa4826B22F7746EfEeCEc178FFbb77A2567C3`
+- impl: `0x339F4C5320a5C697EA10b4f35d546C330AB43d8D`
 - owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805`
 - logs:
   - upgraded on May 10, 2024 at commit `4903bec`
+  - upgraded on Jun 10, 2024 at commit `d5965bb`
 
 ### erc20_vault
 
 - proxy: `0x2259662ed5dE0E09943Abe701bc5f5a108eABBAa`
-- impl: `0xbE1101ED567020581127Ad065461c69c2C3A6115`
+- impl: `0x1bf437b2f6e5959fe167210Ee2221ADa09a66846`
 - owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805`
 - logs:
   - upgraded on May 10, 2024 at commit `4903bec`
+  - upgraded on Jun 10, 2024 at commit `d5965bb`
 
 ### erc721_vault
 
 - proxy: `0x046b82D9010b534c716742BE98ac3FEf3f2EC99f`
-- impl: `0xBEBD9B63dED7eC68F00f98495b60FC5eEE7f154E`
+- impl: `0x06467bab46598b887240044309A6ffE261A0E2e3`
 - owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805`
 - logs:
   - upgraded on May 10, 2024 at commit `4903bec`
+  - upgraded on Jun 10, 2024 at commit `d5965bb`
 
 ### erc1155_vault
 
 - proxy: `0x9Ae5945Ab34f6182F75E16B73e037421F341fEe3`
-- impl: `0xE1A60fD257De1A304a5b5d1EfDa38aFe52c0f910`
+- impl: `0xBFCff65554d6e89A1aC280eE1E9f87764124B833`
 - owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805`
 - logs:
   - upgraded on May 10, 2024 at commit `4903bec`
+  - upgraded on Jun 10, 2024 at commit `d5965bb`
 
 ### bridged_erc20
 
@@ -83,10 +89,11 @@
 ### rollup_address_manager
 
 - proxy: `0x1F027871F286Cf4B7F898B21298E7B3e090a8403`
-- impl: `0xDd39Ad18E6B8A2696394C310D5F95700dB643D27`
+- impl: `0x68570e85Ca54bAE1B6f608d0929665146BA66B39`
 - owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805`
 - logs:
   - upgraded on May 10, 2024 at commit `13ad99d`
+  - upgraded on Jun 10, 2024 at commit `d5965bb`
 
 ### taikoL1
 
@@ -95,6 +102,7 @@
 - owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805`
 - logs:
   - upgraded on May 10, 2024 at commit `4903bec`
+  - upgraded on Jun 10, 2024 at [PR #17532](https://github.com/taikoxyz/taiko-mono/pull/17532)
 
 ### assignmentHook
 
@@ -110,95 +118,103 @@
 - logs:
   - upgraded on May 14, 2024 at commit `0ef7b8caa`
 
-### guardian_prover_minority
+### tierRouter
 
-- proxy: ``
-- impl: ``
-- owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805`
+- impl: `0x1e55bc9cA270F0F1dFFB37C7B3dBED413be4282c.`
 - logs:
-  - upgraded on May 10, 2024 at commit `4903bec`
+  - deployed on Jun 10, 2024 at commit `d5965bb`
 
 ### guardian_prover
 
 - proxy: `0x92F195a8702da2104aE8E3E10779176E7C35d6BC`
-- impl: `0x3D351Ab46F79805e579E24E5cD94362758a99eb5`
+- impl: `0x23bDb18995266c1Ac4c1BDBF69aE977A2DCE0750`
 - owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805`
 - logs:
   - upgraded on May 10, 2024 at commit `4903bec`
+  - upgraded on Jun 10, 2024 at commit `d5965bb`
 
 ### guardian_minority
 
 - proxy: `0x31d4d27da5c299d4b6CE19c869B8891C0002795d`
-- impl: `0x22DC7e70B810822EB8DdDDb341021c252f480f2D`
+- impl: `0x7eA0a9d62cF26Bd81D62AEf6D6D67a86A580aFA3`
 - owner: `0x13cfc60c900a927C48f5c2a4923Ec9771a3A2805`
 - logs:
   - deployed on May 20, 2024 at commit `6e56475`
+  - upgraded on Jun 10, 2024 at commit `d5965bb`
 
 ## L2 Contracts
 
 ### bridge
 
 - proxy: `0x1670090000000000000000000000000000000001`
-- impl: `0x8CC29961a0329D033C6A5fF5Ab915cceB53aEDce`
+- impl: `0xD981DaF607bb6D4249f943d1b13a9AE071E8E3B4`
 - owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190`
 - logs:
   - upgraded on May 10, 2024 at commit `4903bec`
+  - upgraded on Jun 10, 2024 at commit `d5965bb`
 
 ### erc20_vault
 
 - proxy: `0x1670090000000000000000000000000000000002`
-- impl: `0xFefDE79d88264E26fb1fea40f83b8C549d09075E`
+- impl: `0x18D098279287b3e72A9BC5c6CCfa05475567Ee32`
 - owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190`
 - logs:
   - upgraded on May 10, 2024 at commit `4903bec`
+  - upgraded on Jun 10, 2024 at commit `d5965bb`
 
 ### erc721_vault
 
 - proxy: `0x1670090000000000000000000000000000000003`
-- impl: `0x598Ee9B7EdbB2A838156823Ae28E2Ca98c0b5BB7`
+- impl: `0x7bbacc9FFd29442DF3173b7685560fCE96E01b62`
 - owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190`
 - logs:
   - upgraded on May 10, 2024 at commit `4903bec`
+  - upgraded on Jun 10, 2024 at commit `d5965bb`
 
 ### erc1155_vault
 
 - proxy: `0x1670090000000000000000000000000000000004`
-- impl: `0x63Ff7f4Fac6275a598DF5d86cC5e1278Db2D7346`
+- impl: `0xEEF23D0aa5d19Ba17A652d98378c670b9A3aD30A`
 - owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190`
 - logs:
   - upgraded on May 10, 2024 at commit `4903bec`
+  - upgraded on Jun 10, 2024 at commit `d5965bb`
 
 ### signal_service
 
 - proxy: `0x1670090000000000000000000000000000000005`
-- impl: `0x6EFDeff4E88a24063aAaeF6f50470E3305eCf1Ce`
+- impl: `0x4c70b7F5E153D497faFa0476575903F9299ed811`
 - owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190`
 - logs:
   - upgraded on May 10, 2024 at commit `4903bec`
+  - upgraded on Jun 10, 2024 at commit `d5965bb`
 
 ### shared_address_manager
 
 - proxy: `0x1670090000000000000000000000000000000006`
-- impl: `0x38969CEc9C1524D81264dE493b18988920C1f74b`
+- impl: `0x91Cf5766Fbc35bb1a2226DE5052C308a5EDd1d47`
 - owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190`
 - logs:
   - upgraded on May 10, 2024 at commit `4903bec`
+  - upgraded on Jun 10, 2024 at commit `d5965bb`
 
 ### taikoL2
 
 - proxy: `0x1670090000000000000000000000000000010001`
-- impl: `0x5b927DF807f84D6A993BD04f6EC0C17f7fa4cEFb`
+- impl: `0x0C74010473C066Cdd20BA32044D1f6E28527A725`
 - owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190`
 - logs:
   - upgraded on May 10, 2024 at commit `4903bec`
+  - upgraded on Jun 10, 2024 at commit `d5965bb`
 
 ### rollup_address_manager
 
 - proxy: `0x1670090000000000000000000000000000010002`
-- impl: `0xF74340b7E8816FA0351be5AF5fDF91b28495B99A`
+- impl: `0xd41f03dF5f46a0686807d9DBDd94a1223FC73AEe`
 - owner: `0x1D2D1bb9D180541E88a6a682aCf3f61c1605B190`
 - logs:
   - upgraded on May 10, 2024 at commit `4903bec`
+  - upgraded on Jun 10, 2024 at commit `d5965bb`
 
 ### bridged_erc20
 

From 5781b338221dbe1e8ab2a1556ffeeaa239b8d957 Mon Sep 17 00:00:00 2001
From: Korbinian <KorbinianK@users.noreply.github.com>
Date: Mon, 10 Jun 2024 18:48:03 +0200
Subject: [PATCH 5/8] fix(bridge-ui): lock continue button when fee is
 calculating (#17548)

Co-authored-by: Daniel Wang <99078276+dantaik@users.noreply.github.com>
---
 .../StepNavigation/StepNavigation.svelte         |  4 ++--
 .../StepNavigation/StepNavigation.svelte         |  4 ++--
 .../ProcessingFee/ProcessingFee.svelte           | 16 ++++++----------
 .../ProcessingFee/RecommendedFee.svelte          |  7 +++----
 .../bridge-ui/src/components/Bridge/state.ts     |  1 +
 packages/bridge-ui/src/i18n/en.json              |  6 +++---
 6 files changed, 17 insertions(+), 21 deletions(-)

diff --git a/packages/bridge-ui/src/components/Bridge/FungibleBridgeComponents/StepNavigation/StepNavigation.svelte b/packages/bridge-ui/src/components/Bridge/FungibleBridgeComponents/StepNavigation/StepNavigation.svelte
index b81a7285e0d..83d86fd7ce6 100644
--- a/packages/bridge-ui/src/components/Bridge/FungibleBridgeComponents/StepNavigation/StepNavigation.svelte
+++ b/packages/bridge-ui/src/components/Bridge/FungibleBridgeComponents/StepNavigation/StepNavigation.svelte
@@ -1,7 +1,7 @@
 <script lang="ts">
   import { t } from 'svelte-i18n';
 
-  import { importDone } from '$components/Bridge/state';
+  import { calculatingProcessingFee, importDone } from '$components/Bridge/state';
   import { BridgeSteps, BridgingStatus } from '$components/Bridge/types';
   import { ActionButton } from '$components/Button';
   import { Icon } from '$components/Icon';
@@ -66,7 +66,7 @@
     manuallyConfirmedRecipientStep = false;
   };
 
-  $: disabled = !$account || !$account.isConnected;
+  $: disabled = !$account || !$account.isConnected || $calculatingProcessingFee;
 
   $: nextStepButtonText = getStepText();
 
diff --git a/packages/bridge-ui/src/components/Bridge/NFTBridgeComponents/StepNavigation/StepNavigation.svelte b/packages/bridge-ui/src/components/Bridge/NFTBridgeComponents/StepNavigation/StepNavigation.svelte
index 3c64ba8af19..8d508846d7d 100644
--- a/packages/bridge-ui/src/components/Bridge/NFTBridgeComponents/StepNavigation/StepNavigation.svelte
+++ b/packages/bridge-ui/src/components/Bridge/NFTBridgeComponents/StepNavigation/StepNavigation.svelte
@@ -1,7 +1,7 @@
 <script lang="ts">
   import { t } from 'svelte-i18n';
 
-  import { importDone } from '$components/Bridge/state';
+  import { calculatingProcessingFee, importDone } from '$components/Bridge/state';
   import { BridgeSteps, BridgingStatus, ImportMethod } from '$components/Bridge/types';
   import { ActionButton } from '$components/Button';
   import { StepBack } from '$components/Stepper';
@@ -69,7 +69,7 @@
       {/if}
     {/if}
     {#if activeStep === BridgeSteps.REVIEW}
-      <ActionButton priority="primary" on:click={() => handleNextStep()}>
+      <ActionButton priority="primary" disabled={$calculatingProcessingFee} on:click={() => handleNextStep()}>
         <span class="body-bold">{nextStepButtonText}</span>
       </ActionButton>
 
diff --git a/packages/bridge-ui/src/components/Bridge/SharedBridgeComponents/ProcessingFee/ProcessingFee.svelte b/packages/bridge-ui/src/components/Bridge/SharedBridgeComponents/ProcessingFee/ProcessingFee.svelte
index f3108530292..8a1ee843239 100644
--- a/packages/bridge-ui/src/components/Bridge/SharedBridgeComponents/ProcessingFee/ProcessingFee.svelte
+++ b/packages/bridge-ui/src/components/Bridge/SharedBridgeComponents/ProcessingFee/ProcessingFee.svelte
@@ -5,7 +5,7 @@
 
   import Alert from '$components/Alert/Alert.svelte';
   import FlatAlert from '$components/Alert/FlatAlert.svelte';
-  import { gasLimitZero, processingFee, processingFeeMethod } from '$components/Bridge/state';
+  import { calculatingProcessingFee, gasLimitZero, processingFee, processingFeeMethod } from '$components/Bridge/state';
   import { ActionButton, CloseButton } from '$components/Button';
   import { InputBox } from '$components/InputBox';
   import { LoadingText } from '$components/LoadingText';
@@ -26,7 +26,6 @@
   let dialogId = `dialog-${uid()}`;
 
   let recommendedAmount = BigInt(0);
-  let calculatingRecommendedAmount = false;
   let errorCalculatingRecommendedAmount = false;
 
   let calculatingEnoughEth = false;
@@ -161,7 +160,7 @@
     <div class="f-between-center">
       <span class="text-secondary-content">{$t('processing_fee.title')}</span>
       <span class=" text-primary-content mt-[4px]">
-        {#if calculatingRecommendedAmount}
+        {#if $calculatingProcessingFee}
           <LoadingText mask="0.0017730224073" /> ETH
         {:else if errorCalculatingRecommendedAmount && $processingFeeMethod === ProcessingFeeMethod.RECOMMENDED}
           <FlatAlert type="warning" message={$t('processing_fee.recommended.error')} />
@@ -175,7 +174,7 @@
   </div>
 {:else if textOnly}
   <span class="text-primary-content mt-[4px] {$$props.class}">
-    {#if calculatingRecommendedAmount}
+    {#if $calculatingProcessingFee}
       <LoadingText mask="0.0017730224073" />
     {:else if errorCalculatingRecommendedAmount && $processingFeeMethod === ProcessingFeeMethod.RECOMMENDED}
       <span class="text-warning-sentiment">{$t('processing_fee.recommended.error')}</span>
@@ -201,7 +200,7 @@
     </div>
 
     <span class="body-small-regular text-secondary-content mt-[4px]">
-      {#if calculatingRecommendedAmount}
+      {#if $calculatingProcessingFee}
         <LoadingText mask="0.0001" /> ETH
       {:else if errorCalculatingRecommendedAmount && $processingFeeMethod === ProcessingFeeMethod.RECOMMENDED}
         <FlatAlert type="warning" message={$t('processing_fee.recommended.error')} />
@@ -234,7 +233,7 @@
                 </label>
                 <span class="body-small-regular text-secondary-content">
                   <!-- TODO: think about the UI for this part. Talk to Jane -->
-                  {#if calculatingRecommendedAmount}
+                  {#if $calculatingProcessingFee}
                     <LoadingText mask="0.0001" /> ETH
                   {:else if errorCalculatingRecommendedAmount}
                     <FlatAlert type="warning" message={$t('processing_fee.recommended.error')} />
@@ -383,10 +382,7 @@
   </div>
 {/if}
 
-<RecommendedFee
-  bind:amount={recommendedAmount}
-  bind:calculating={calculatingRecommendedAmount}
-  bind:error={errorCalculatingRecommendedAmount} />
+<RecommendedFee bind:amount={recommendedAmount} bind:error={errorCalculatingRecommendedAmount} />
 
 <NoneOption
   bind:enoughEth={hasEnoughEth}
diff --git a/packages/bridge-ui/src/components/Bridge/SharedBridgeComponents/ProcessingFee/RecommendedFee.svelte b/packages/bridge-ui/src/components/Bridge/SharedBridgeComponents/ProcessingFee/RecommendedFee.svelte
index c7c783890a9..9c6a1ee7193 100644
--- a/packages/bridge-ui/src/components/Bridge/SharedBridgeComponents/ProcessingFee/RecommendedFee.svelte
+++ b/packages/bridge-ui/src/components/Bridge/SharedBridgeComponents/ProcessingFee/RecommendedFee.svelte
@@ -1,14 +1,13 @@
 <script lang="ts">
   import { onDestroy, onMount } from 'svelte';
 
-  import { destNetwork, selectedToken } from '$components/Bridge/state';
+  import { calculatingProcessingFee, destNetwork, selectedToken } from '$components/Bridge/state';
   import { processingFeeComponent } from '$config';
   import { recommendProcessingFee } from '$libs/fee';
   import type { NFT, Token } from '$libs/token';
   import { connectedSourceChain } from '$stores/network';
 
   export let amount: bigint;
-  export let calculating = false;
   export let error = false;
 
   let interval: ReturnType<typeof setInterval>;
@@ -17,7 +16,7 @@
     // Without token nor destination chain we cannot compute this fee
     if (!token || !destChainId) return;
 
-    calculating = true;
+    $calculatingProcessingFee = true;
     error = false;
 
     try {
@@ -30,7 +29,7 @@
       console.error(err);
       error = true;
     } finally {
-      calculating = false;
+      $calculatingProcessingFee = false;
     }
   }
 
diff --git a/packages/bridge-ui/src/components/Bridge/state.ts b/packages/bridge-ui/src/components/Bridge/state.ts
index 2b33509e229..f6089db2618 100644
--- a/packages/bridge-ui/src/components/Bridge/state.ts
+++ b/packages/bridge-ui/src/components/Bridge/state.ts
@@ -35,6 +35,7 @@ export const bridging = writable<boolean>(false);
 export const approving = writable<boolean>(false);
 export const computingBalance = writable<boolean>(false);
 export const validatingAmount = writable<boolean>(false);
+export const calculatingProcessingFee = writable<boolean>(false);
 
 // Errors state
 export const errorComputingBalance = writable<boolean>(false);
diff --git a/packages/bridge-ui/src/i18n/en.json b/packages/bridge-ui/src/i18n/en.json
index 7b9b503c630..04879abbfd7 100644
--- a/packages/bridge-ui/src/i18n/en.json
+++ b/packages/bridge-ui/src/i18n/en.json
@@ -39,7 +39,7 @@
       "nft_scan_again": "Scan again"
     },
     "alerts": {
-      "not_enough_funds": "You do not have enough ETH to cover the processing fee and transaction fee",
+      "not_enough_funds": "You do not have enough ETH to cover the processing fee and transaction fee. Please add more ETH to your wallet (>= 0.0015 ETH).",
       "slow_bridging": "Please note: Bridging to L1 will take around 24hrs!",
       "smart_contract_wallet": "It seems you are using a smart contract wallet. Please double check that the recipient matches your wallet on the destination or change it accordingly.",
       "stable_coin": "You are bridging a stable coin. For USDC, we are currently partnering with <a target=\"_blank\" href=\"https://stargate.finance/transfer\" class=\"link\">Stargate Bridge</a> for liquidity. Consider using their bridge, as the ecosystem partners are likely using their bridged version",
@@ -291,7 +291,7 @@
     },
     "title": "Faucet",
     "warning": {
-      "insufficient_balance": "You don't have enough ETH to complete the transaction. Please add some ETH to your wallet.",
+      "insufficient_balance": "You don't have enough ETH to complete the transaction. Please add more ETH to your wallet (>= 0.0015 ETH)",
       "no_connected": "Please connect your wallet to mint tokens.",
       "not_mintable": "This token is not mintable on this network. Please switch to the correct network.",
       "token_minted": "You have already minted this token.",
@@ -503,7 +503,7 @@
               "title": "What is \"Connected to the correct chain\"?"
             },
             "funds": {
-              "description": "In order to claim the transaction yourself, you need enough funds on the destination chain. If you've kept the default processing fee, the relayer will likely claim for you soon.",
+              "description": "In order to claim the transaction yourself, you need enough funds on the destination chain (>= 0.0015 ETH). If you've kept the default processing fee, the relayer will likely claim for you soon.",
               "title": "What is \"Sufficient funds to claim\"?"
             },
             "quota": {

From 2ebcac5c6ad63b6130dd696c96537c12b791535b Mon Sep 17 00:00:00 2001
From: xiaodino <ruby@taiko.xyz>
Date: Mon, 10 Jun 2024 10:21:55 -0700
Subject: [PATCH 6/8] chore(relayer): prevent indexing halts and add error
 monitoring metrics (#17525)

---
 packages/relayer/cmd/flags/common.go |  4 +++-
 packages/relayer/indexer/indexer.go  | 13 +++++++++----
 packages/relayer/prometheus.go       | 16 ++++++++++++++++
 3 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/packages/relayer/cmd/flags/common.go b/packages/relayer/cmd/flags/common.go
index c56cbdd31da..30eb6d87beb 100644
--- a/packages/relayer/cmd/flags/common.go
+++ b/packages/relayer/cmd/flags/common.go
@@ -105,12 +105,14 @@ var (
 		Usage:    "Retry interval in seconds when there is an error",
 		Category: processorCategory,
 		Value:    12,
+		EnvVars:  []string{"BACKOFF_RETRY_INTERVAL"},
 	}
 	BackOffMaxRetrys = &cli.Uint64Flag{
 		Name:     "backoff.maxRetrys",
 		Usage:    "Max retry times when there is an error",
 		Category: processorCategory,
-		Value:    3,
+		Value:    5,
+		EnvVars:  []string{"BACKOFF_MAX_RETRYS"},
 	}
 )
 
diff --git a/packages/relayer/indexer/indexer.go b/packages/relayer/indexer/indexer.go
index dfc0f36e89d..dc88e75c7b5 100644
--- a/packages/relayer/indexer/indexer.go
+++ b/packages/relayer/indexer/indexer.go
@@ -384,7 +384,9 @@ func (i *Indexer) filter(ctx context.Context) error {
 		switch i.eventName {
 		case relayer.EventNameMessageSent:
 			if err := i.withRetry(func() error { return i.indexMessageSentEvents(ctx, filterOpts) }); err != nil {
-				return errors.Wrap(err, "i.indexMessageSentEvents")
+				// We will skip the error after retrying, as we want the indexer to continue.
+				slog.Error("i.indexMessageSentEvents", "error", err)
+				relayer.MessageSentEventsAfterRetryErrorCount.Inc()
 			}
 
 			// we dont want to watch for message status changed events
@@ -393,17 +395,20 @@ func (i *Indexer) filter(ctx context.Context) error {
 			// since they are related.
 			if i.watchMode != CrawlPastBlocks {
 				if err := i.withRetry(func() error { return i.indexMessageStatusChangedEvents(ctx, filterOpts) }); err != nil {
-					return errors.Wrap(err, "i.indexMessageStatusChangedEvents")
+					slog.Error("i.indexMessageStatusChangedEvents", "error", err)
+					relayer.MessageStatusChangedEventsAfterRetryErrorCount.Inc()
 				}
 
 				// we also want to index chain data synced events.
 				if err := i.withRetry(func() error { return i.indexChainDataSyncedEvents(ctx, filterOpts) }); err != nil {
-					return errors.Wrap(err, "i.indexChainDataSyncedEvents")
+					slog.Error("i.indexChainDataSyncedEvents", "error", err)
+					relayer.ChainDataSyncedEventsAfterRetryErrorCount.Inc()
 				}
 			}
 		case relayer.EventNameMessageProcessed:
 			if err := i.withRetry(func() error { return i.indexMessageProcessedEvents(ctx, filterOpts) }); err != nil {
-				return errors.Wrap(err, "i.indexMessageProcessedEvents")
+				slog.Error("i.indexMessageProcessedEvents", "error", err)
+				relayer.MessageProcessedEventsAfterRetryErrorCount.Inc()
 			}
 		}
 
diff --git a/packages/relayer/prometheus.go b/packages/relayer/prometheus.go
index 80cafab8db6..67f8b64f7cf 100644
--- a/packages/relayer/prometheus.go
+++ b/packages/relayer/prometheus.go
@@ -130,4 +130,20 @@ var (
 		Name: "unprofitable_message_after_transacting_ops_total",
 		Help: "The total number of processed events that ended up unprofitable",
 	})
+	MessageSentEventsAfterRetryErrorCount = promauto.NewCounter(prometheus.CounterOpts{
+		Name: "message_sent_events_after_retry_error_count",
+		Help: "The total number of errors logged for MessageSent events after retries",
+	})
+	MessageStatusChangedEventsAfterRetryErrorCount = promauto.NewCounter(prometheus.CounterOpts{
+		Name: "message_status_changed_events_after_retry_error_count",
+		Help: "The total number of errors logged for MessageStatusChanged events after retries",
+	})
+	ChainDataSyncedEventsAfterRetryErrorCount = promauto.NewCounter(prometheus.CounterOpts{
+		Name: "chain_data_synced_events_after_retry_error_count",
+		Help: "The total number of errors logged for ChainDataSynced events after retries",
+	})
+	MessageProcessedEventsAfterRetryErrorCount = promauto.NewCounter(prometheus.CounterOpts{
+		Name: "message_processed_events_after_retry_error_count",
+		Help: "The total number of errors logged for MessageProcessed events after retries",
+	})
 )

From d52bbee6c351c5d6f715d35cda59bc6519090b33 Mon Sep 17 00:00:00 2001
From: jeff <113397187+cyberhorsey@users.noreply.github.com>
Date: Mon, 10 Jun 2024 11:23:17 -0700
Subject: [PATCH 7/8] feat(relayer): only index messages with non zero gas
 limit (#17549)

---
 packages/relayer/indexer/handle_message_sent_event.go | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/packages/relayer/indexer/handle_message_sent_event.go b/packages/relayer/indexer/handle_message_sent_event.go
index d7d541baf88..25fd951559b 100644
--- a/packages/relayer/indexer/handle_message_sent_event.go
+++ b/packages/relayer/indexer/handle_message_sent_event.go
@@ -101,6 +101,13 @@ func (i *Indexer) handleMessageSentEvent(
 		return nil
 	}
 
+	// we shouldnt add messages to the queue that will be determined
+	// unprocessable.
+	if event.Message.GasLimit == 0 {
+		slog.Warn("Zero gaslimit message found, will be unprocessable")
+		return nil
+	}
+
 	msg := queue.QueueMessageSentBody{
 		ID:    id,
 		Event: event,

From 0ebd7269a76bc1808a2e9f5dae1a6a8997b1e514 Mon Sep 17 00:00:00 2001
From: Kenk <kenghin_lim@hotmail.com>
Date: Tue, 11 Jun 2024 11:21:34 +0700
Subject: [PATCH 8/8] resolve comments

---
 .../trailblazers-badges/TrailblazersBadges.sol    | 15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)

diff --git a/packages/nfts/contracts/trailblazers-badges/TrailblazersBadges.sol b/packages/nfts/contracts/trailblazers-badges/TrailblazersBadges.sol
index 71a70f00551..ff723b6bf1c 100644
--- a/packages/nfts/contracts/trailblazers-badges/TrailblazersBadges.sol
+++ b/packages/nfts/contracts/trailblazers-badges/TrailblazersBadges.sol
@@ -10,12 +10,12 @@ import { Strings } from "@openzeppelin/contracts/utils/Strings.sol";
 contract TrailblazersBadges is ERC721EnumerableUpgradeable, ECDSAWhitelist {
     /// @notice Base URI required to interact with IPFS
     string private _baseURIExtended;
+
     /// @notice Movement IDs
     uint256 public constant MOVEMENT_NEUTRAL = 0;
     uint256 public constant MOVEMENT_BASED = 1;
     uint256 public constant MOVEMENT_BOOSTED = 2;
-    /// @notice Wallet-to-Movement mapping
-    mapping(address _user => uint256 _movement) public movements;
+
     /// @notice Badge IDs
     uint256 public constant BADGE_RAVERS = 0;
     uint256 public constant BADGE_ROBOTS = 1;
@@ -32,6 +32,8 @@ contract TrailblazersBadges is ERC721EnumerableUpgradeable, ECDSAWhitelist {
     mapping(address _user => mapping(uint256 _badgeId => uint256 _tokenId)) public userBadges;
     /// @notice Movement to badge ID, token ID mapping
     mapping(bytes32 movementBadgeHash => uint256[2] movementBadge) public movementBadges;
+    /// @notice Wallet-to-Movement mapping
+    mapping(address _user => uint256 _movement) public movements;
     /// @notice Token count, used to generate tokenIds
     uint256 public tokenCount;
 
@@ -61,7 +63,7 @@ contract TrailblazersBadges is ERC721EnumerableUpgradeable, ECDSAWhitelist {
         external
         initializer
     {
-        __ERC721_init("TrailblazersBadges", "TBB");
+        __ERC721_init("Trailblazers Badges", "TBB");
         _baseURIExtended = _rootURI;
         __ECDSAWhitelist_init(_owner, _mintSigner, _blacklistAddress);
     }
@@ -127,7 +129,6 @@ contract TrailblazersBadges is ERC721EnumerableUpgradeable, ECDSAWhitelist {
     /// @param _badgeId The badge ID to mint
     function _mintBadgeTo(bytes memory _signature, address _minter, uint256 _badgeId) internal {
         if (_badgeId > BADGE_SHINTO) revert INVALID_BADGE_ID();
-        if (!canMint(_signature, _minter, _badgeId)) revert MINTER_NOT_WHITELISTED();
 
         _consumeMint(_signature, _minter, _badgeId);
 
@@ -136,7 +137,7 @@ contract TrailblazersBadges is ERC721EnumerableUpgradeable, ECDSAWhitelist {
         _mint(_minter, tokenCount);
 
         emit BadgeCreated(tokenCount, _minter, _badgeId);
-        tokenCount++;
+        ++tokenCount;
     }
 
     /// @notice Sets movement for the calling wallet
@@ -182,9 +183,7 @@ contract TrailblazersBadges is ERC721EnumerableUpgradeable, ECDSAWhitelist {
         returns (uint256[] memory)
     {
         uint256[] memory balances = new uint256[](_owners.length);
-        for (uint256 i; i < _owners.length; i++) {
-            balances[i] = userBadges[_owners[i]][_ids[i]] == 0 ? 0 : 1;
-        }
+        for (uint256 i; i < _owners.length; ++i) { }
         return balances;
     }
 }