Repository: ethereum-optimism/docs
Pull request #1569: fix(interop): update outdated interop manual relay and viem tutorials
Author: login: tremarkley
Created: 2025-04-12T01:43:20Z | Merged: 2025-04-14T12:00:54Z

Closes https://github.com/ethereum-optimism/ecosystem/issues/698

This PR updates the interop relay tutorials to account for the new way that interop messages must be manually relayed. I also noticed that many of the tutorial examples were based on the old version of the viem library, so I updated the tutorials to use the new actions.


Diff:
diff --git a/pages/interop/tutorials/bridge-crosschain-eth.mdx b/pages/interop/tutorials/bridge-crosschain-eth.mdx
index 50af9fde2..ede93fafb 100644
--- a/pages/interop/tutorials/bridge-crosschain-eth.mdx
+++ b/pages/interop/tutorials/bridge-crosschain-eth.mdx
@@ -203,7 +203,7 @@ The tutorial uses these primary tools:
 
   3.  Place this in `src/transfer-eth.mts`:
 
-      ```typescript file=<rootDir>/public/tutorials/transfer-eth.mts hash=f71ba1d6d6b4adf8cb3283792abac853 
+      ```typescript file=<rootDir>/public/tutorials/transfer-eth.mts hash=9f19c28046ed792e3f04aefd8fb4453e 
       ```
 
       <details>
@@ -214,25 +214,25 @@ The tutorial uses these primary tools:
 
         Import all chain definitions from `@eth-optimism/viem`.
 
-        ```typescript file=<rootDir>/public/tutorials/transfer-eth.mts#L29-L32 hash=e8c21357997ea12151305337eced7d71 
+        ```typescript file=<rootDir>/public/tutorials/transfer-eth.mts#L29-L32 hash=2c2dd55bc8c8122fe2991ab38cc9c1ac 
         ```
 
         If the address we use is `0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266`, one of the prefunded addresses on `anvil`, assume we're using Supersim.
         Otherwise, use Interop devnet.
 
-        ```typescript file=<rootDir>/public/tutorials/transfer-eth.mts#L78-L80 hash=4933c70a9078c2369ef90bfe163f5fd7 
+        ```typescript file=<rootDir>/public/tutorials/transfer-eth.mts#L78-L80 hash=c5c2f87d5f6bb564376016ac62712501 
         ```
 
         To relay a message we need the information in the receipt.
         Also, we need to wait until the transaction with the relayed message is actually part of a block.
 
-        ```typescript file=<rootDir>/public/tutorials/transfer-eth.mts#L87-L89 hash=573f22b2b21415ff51c59c713fda07d1 
+        ```typescript file=<rootDir>/public/tutorials/transfer-eth.mts#L86-L89 hash=db8b76c8ca3304dd485f4a33a1dc8580 
         ```
 
         A single transaction can send multiple messages.
         But here we know we sent just one, so we look for the first one in the list.
 
-        ```typescript file=<rootDir>/public/tutorials/transfer-eth.mts#L90-L96 hash=4b26775b46c116262af4c7299d6f1127 
+        ```typescript file=<rootDir>/public/tutorials/transfer-eth.mts#L90-L96 hash=d650e8c2b31d75d82ba4c5e4519c028d 
         ```
 
         This is how you use `@eth-optimism/viem` to create an executing message.
diff --git a/pages/interop/tutorials/relay-messages-cast.mdx b/pages/interop/tutorials/relay-messages-cast.mdx
index 09fa49d10..7f38c4fd0 100644
--- a/pages/interop/tutorials/relay-messages-cast.mdx
+++ b/pages/interop/tutorials/relay-messages-cast.mdx
@@ -47,7 +47,7 @@ Sending an interop message using the `L2ToL2CrossDomainMessenger`:
 
 ### On source chain (OPChainA 901)
 
-1.  Invoke `L2NativeSuperchainERC20.sentERC20` to bridge funds
+1.  Invoke `L2NativeSuperchainERC20.sendERC20` to bridge funds
     *   this leverages `L2ToL2CrossDomainMessenger.sendMessage` to make the cross chain call
 2.  Retrieve the log identifier and the message payload for the `SentMessage` event.
 
@@ -98,23 +98,29 @@ struct Identifier {
 
   ### Get the log emitted by the `L2ToL2CrossDomainMessenger`
 
-  The token contract calls the [L2ToL2CrossDomainMessenger](https://github.com/ethereum-optimism/optimism/blob/92ed64e171c6eb9c6a080c626640e8836f0653cc/packages/contracts-bedrock/src/L2/L2ToL2CrossDomainMessenger.sol), which emits a message (log) that can be relayed on the destination chain.
+  The token contract calls the [L2ToL2CrossDomainMessenger](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/L2ToL2CrossDomainMessenger.sol), which emits a message (log) that can be relayed on the destination chain.
 
   ```sh
-  $ cast logs --address 0x4200000000000000000000000000000000000023 --rpc-url http://127.0.0.1:9545
+  cast logs --address 0x4200000000000000000000000000000000000023 --rpc-url http://127.0.0.1:9545
+  ```
+
+  Sample output:
 
+  ```
   address: 0x4200000000000000000000000000000000000023
-  blockHash: 0x3905831f1b109ce787d180c1ed977ebf0ff1a6334424a0ae8f3731b035e3f708
-  blockNumber: 4
-  data: 0x000000000000000000000000420beef00000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000064d9f50046000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226600000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000
-  logIndex: 1
+  blockHash: 0x311f8ccea3fc121aa3af18e0a87766ae56ed3f1d08cae91ec29f34a9919abcc0
+  blockNumber: 14
+  data: 0x0000000000000000000000004200000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000847cfd6dbc000000000000000000000000420beef000000000000000000000000000000001000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226600000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000
+  logIndex: 2
+  removed: false
   topics: [
-        0x382409ac69001e11931a28435afef442cbfd20d9891907e8fa373ba7d351f320
-        0x0000000000000000000000000000000000000000000000000000000000000386
-        0x000000000000000000000000420beef000000000000000000000000000000001
-        0x0000000000000000000000000000000000000000000000000000000000000000
+    0x382409ac69001e11931a28435afef442cbfd20d9891907e8fa373ba7d351f320
+    0x0000000000000000000000000000000000000000000000000000000000000386
+    0x0000000000000000000000004200000000000000000000000000000000000028
+    0x0000000000000000000000000000000000000000000000000000000000000000
   ]
-  ...
+  transactionHash: 0x746a3e8a3a0ed0787367c3476269fa3050a2f9113637b563a4579fbc03efe5c4
+  transactionIndex: 0
   ```
 
   ### Retrieve the block timestamp the log was emitted in
@@ -122,10 +128,17 @@ struct Identifier {
   Since the message identifier requires the block timestamp, fetch the block info to get the timestamp.
 
   ```sh
-  $ cast block 0xREPLACE_WITH_CORRECT_BLOCKHASH --rpc-url http://127.0.0.1:9545
-  ...
-  timestamp            1728507703
-  ...
+  cast block 0xREPLACE_WITH_CORRECT_BLOCKHASH --rpc-url http://127.0.0.1:9545
+  ```
+
+  Sample output:
+
+  ```
+  // (truncated for brevity)
+
+  timestamp            1743801675
+
+  // ...
   ```
 
   ### Prepare the message identifier & payload
@@ -144,17 +157,82 @@ struct Identifier {
 
   ```
   0x + 382409ac69001e11931a28435afef442cbfd20d9891907e8fa373ba7d351f320
-     + 0000000000000000000000000000000000000000000000000000000000000386
-     + 000000000000000000000000420beef000000000000000000000000000000001
-     + 0000000000000000000000000000000000000000000000000000000000000000
-     + 000000000000000000000000420beef00000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000064d9f50046000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226600000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000
+    + 0000000000000000000000000000000000000000000000000000000000000386
+    + 0000000000000000000000004200000000000000000000000000000000000028
+    + 0000000000000000000000000000000000000000000000000000000000000000
+    + 0000000000000000000000004200000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000847cfd6dbc000000000000000000000000420beef000000000000000000000000000000001000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226600000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000
+  ```
+
+  Payload: `  0x382409ac69001e11931a28435afef442cbfd20d9891907e8fa373ba7d351f3200000000000000000000000000000000000000000000000000000000000000386000000000000000000000000420000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000847cfd6dbc000000000000000000000000420beef000000000000000000000000000000001000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226600000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000`
+
+  ### Construct the access list for the message
+
+  An access list must be passed along with the relay message tx. There are two admin RPC methods that can be used to construct the access list: `admin_getAccessListByMsgHash` and `admin_getAccessListForIdentifier` and.
+
+  a. To get the access list using the `admin_getAccessListByMsgHash` RPC method, call the method with the message hash.
+
+  1.  Retrieve the message hash from the supersim logs
+
+  ```sh
+  INFO [04-04|14:21:15.587] L2ToL2CrossChainMessenger#SentMessage    sourceChainID=901 destinationChainID=902 nonce=0 sender=0x4200000000000000000000000000000000000028 target=0x4200000000000000000000000000000000000028 msgHash=0xccff97c17ef11d659d319cbc5780235ea03ef34b0fa34f40b208a9519f257379 txHash=0x746a3e8a3a0ed0787367c3476269fa3050a2f9113637b563a4579fbc03efe5c4
   ```
 
-  Payload: `0x382409ac69001e11931a28435afef442cbfd20d9891907e8fa373ba7d351f3200000000000000000000000000000000000000000000000000000000000000386000000000000000000000000420beef0000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000420beef00000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000064d9f50046000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226600000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000`
+  2.  Call `admin_getAccessListByMsgHash` with the message hash.
+
+  ```sh
+  cast rpc admin_getAccessListByMsgHash 0xccff97c17ef11d659d319cbc5780235ea03ef34b0fa34f40b208a9519f257379 --rpc-url http://localhost:8420
+  ```
+
+  Sample output:
+
+  ```
+  {
+    "accessList": [
+      {
+        "address": "0x4200000000000000000000000000000000000022",
+        "storageKeys": [
+          "0x010000000000000000000385000000000000000e0000000067f04d4b00000002",
+          "0x03c6d2648cef120ce1d7ccf9f8d4042d6b25ff30a02e22d9ea2a47d2677ccb8d"
+        ]
+      }
+    ]
+  }
+  ```
+
+  b. To get the access list using the `admin_getAccessListForIdentifier` RPC method, call the method with the identifier and the message payload.
+
+  ```sh
+  cast rpc admin_getAccessListForIdentifier \
+  '{
+    "origin": "0x4200000000000000000000000000000000000023",
+    "blockNumber": "14",
+    "logIndex": "2",
+    "timestamp": "1743801675",
+    "chainId": "901",
+    "payload": "0x382409ac69001e11931a28435afef442cbfd20d9891907e8fa373ba7d351f3200000000000000000000000000000000000000000000000000000000000000386000000000000000000000000420000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000847cfd6dbc000000000000000000000000420beef000000000000000000000000000000001000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226600000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000"
+  }' \
+  --rpc-url http://localhost:8420
+  ```
+
+  Sample output:
+
+  ```
+  {
+    "accessList": [
+      {
+        "address": "0x4200000000000000000000000000000000000022",
+        "storageKeys": [
+          "0x010000000000000000000385000000000000000e0000000067f04d4b00000002",
+          "0x03c6d2648cef120ce1d7ccf9f8d4042d6b25ff30a02e22d9ea2a47d2677ccb8d"
+        ]
+      }
+    ]
+  }
+  ```
 
   ### Send the relayMessage transaction
 
-  Call `relayMessage` on the [L2ToL2CrossDomainMessenger](https://github.com/ethereum-optimism/optimism/blob/92ed64e171c6eb9c6a080c626640e8836f0653cc/packages/contracts-bedrock/src/L2/L2ToL2CrossDomainMessenger.sol#L126)
+  Call `relayMessage` on the [L2ToL2CrossDomainMessenger](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/L2ToL2CrossDomainMessenger.sol) with the access list.
 
   ```solidity
   // L2ToL2CrossDomainMessenger.sol (truncated for brevity)
@@ -180,10 +258,11 @@ struct Identifier {
   Below is an example call, but make sure to replace them with the correct values you received in previous steps.
 
   ```sh
-  $ cast send 0x4200000000000000000000000000000000000023 --gas-limit 200000 \
+  cast send 0x4200000000000000000000000000000000000023 \
       "relayMessage((address, uint256, uint256, uint256, uint256), bytes)" \
-      "(0x4200000000000000000000000000000000000023, 4, 1, 1728507703, 901)" \
-      0x382409ac69001e11931a28435afef442cbfd20d9891907e8fa373ba7d351f3200000000000000000000000000000000000000000000000000000000000000386000000000000000000000000420beef0000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000420beef00000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000064d9f50046000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226600000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000 \
+      "(0x4200000000000000000000000000000000000023, 14, 2, 1743801675, 901)" \
+      0x382409ac69001e11931a28435afef442cbfd20d9891907e8fa373ba7d351f3200000000000000000000000000000000000000000000000000000000000000386000000000000000000000000420000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000847cfd6dbc000000000000000000000000420beef000000000000000000000000000000001000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226600000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000 \
+      --access-list '[{"address":"0x4200000000000000000000000000000000000022","storageKeys":["0x010000000000000000000385000000000000000e0000000067f04d4b00000002", "0x03c6d2648cef120ce1d7ccf9f8d4042d6b25ff30a02e22d9ea2a47d2677ccb8d"]}]' \
       --rpc-url http://127.0.0.1:9546 \
       --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
   ```
diff --git a/pages/interop/tutorials/relay-messages-viem.mdx b/pages/interop/tutorials/relay-messages-viem.mdx
index 95da62a26..fd163af42 100644
--- a/pages/interop/tutorials/relay-messages-viem.mdx
+++ b/pages/interop/tutorials/relay-messages-viem.mdx
@@ -69,8 +69,6 @@ import {
 	walletActionsL2,
     supersimL2A,
     supersimL2B,
-    createInteropSentL2ToL2Messages,
-    decodeRelayedL2ToL2Messages,
 } from "@eth-optimism/viem";
 
 // SuperERC20 is in development so we manually define the address here
@@ -121,21 +119,20 @@ await opChainAClient.waitForTransactionReceipt({ hash: mintTxHash });
 // 2. Initiate sendERC20 tx to bridge funds to chain B
 
 console.log("Initiating sendERC20 on OPChainA to OPChainB...");
-const sendERC20TxHash = await opChainAClient.writeContract({
-	address: SUPERCHAIN_TOKEN_BRIDGE_ADDRESS,
-	abi: parseAbi([
-		"function sendERC20(address _token, address _to, uint256 _amount, uint256 _chainId)",
-	]),
-	functionName: "sendERC20",
-	args: [L2_NATIVE_SUPERCHAINERC20_ADDRESS, account.address, 1000n, BigInt(supersimL2B.id)],
+const sendERC20TxHash = await opChainAClient.interop.sendSuperchainERC20({
+	tokenAddress: SUPERSIM_SUPERC20_ADDRESS,
+	to: testAccount.address,
+        amount: AMOUNT_TO_SEND,
+        chainId: supersimL2B.id,
 });
 
 const sendERC20Receipt = await opChainAClient.waitForTransactionReceipt({ hash: sendERC20TxHash });
 
 // 3. Construct the interoperable log data from the sent message
 
-const { sentMessages } = await createInteropSentL2ToL2Messages(opChainAClient, { receipt: sendERC20Receipt })
+const sentMessages = await opChainAClient.interop.getCrossDomainMessages({ logs: sendERC20Receipt.logs })
 const sentMessage = sentMessages[0] // We only sent 1 message
+const relayMessageParams = await opChainAClient.interop.buildExecutingMessage({ log: sentMessage.log })
 ```
 
 ### Relay the sent message on the destination chain
@@ -148,17 +145,14 @@ const sentMessage = sentMessages[0] // We only sent 1 message
 // 4. Relay the sent message
 
 console.log("Relaying message on OPChainB...");
-const relayTxHash = await opChainBClient.relayL2ToL2Message({
-    sentMessageId: sentMessage.id,
-    sentMessagePayload: sentMessage.payload,
-});
+const relayTxHash = await opChainBClient.interop.relayCrossDomainMessage(relayMessageParams);
 
 const relayReceipt = await opChainBClient.waitForTransactionReceipt({ hash: relayTxHash });
 
 // 5. Ensure the message was relayed successfully
 
-const { successfulMessages, failedMessages } = decodeRelayedL2ToL2Messages({ receipt: relayReceipt });
-if (successfulMessages.length != 1) {
+const status = await opChainBClient.interop.getCrossDomainMessageStatus({ message: sentMessage })
+if (status != 'relayed') {
     throw new Error("failed to relay message!")
 }
 
@@ -202,8 +196,6 @@ import {
 	walletActionsL2,
     supersimL2A,
     supersimL2B,
-    createInteropSentL2ToL2Messages,
-    decodeRelayedL2ToL2Messages,
 } from "@eth-optimism/viem";
 
 // SuperERC20 is in development so we manually define the address here
@@ -250,22 +242,21 @@ await opChainAClient.waitForTransactionReceipt({ hash: mintTxHash });
 
 // 2. Initiate sendERC20 tx to bridge funds to chain B
 
-console.log("Initiating sendERC20 on OPChainA...");
-const sendERC20TxHash = await opChainAClient.writeContract({
-	address: SUPERCHAIN_TOKEN_BRIDGE_ADDRESS,
-	abi: parseAbi([
-		"function sendERC20(address _token, address _to, uint256 _amount, uint256 _chainId)",
-	]),
-	functionName: "sendERC20",
-	args: [L2_NATIVE_SUPERCHAINERC20_ADDRESS, account.address, 1000n, BigInt(supersimL2B.id)],
+console.log("Initiating sendERC20 on OPChainA to OPChainB...");
+const sendERC20TxHash = await opChainAClient.interop.sendSuperchainERC20({
+	tokenAddress: SUPERSIM_SUPERC20_ADDRESS,
+	to: testAccount.address,
+        amount: AMOUNT_TO_SEND,
+        chainId: supersimL2B.id,
 });
 
 const sendERC20Receipt = await opChainAClient.waitForTransactionReceipt({ hash: sendERC20TxHash });
 
 // 3. Construct the interoperable log data from the sent message
 
-const { sentMessages } = await createInteropSentL2ToL2Messages(opChainAClient, { receipt: sendERC20Receipt })
+const sentMessages = await opChainAClient.interop.getCrossDomainMessages({ logs: sendERC20Receipt.logs })
 const sentMessage = sentMessages[0] // We only sent 1 message
+const relayMessageParams = await opChainAClient.interop.buildExecutingMessage({ log: sentMessage.log })
 
 // ##########
 // OP Chain B
@@ -274,17 +265,14 @@ const sentMessage = sentMessages[0] // We only sent 1 message
 // 4. Relay the sent message
 
 console.log("Relaying message on OPChainB...");
-const relayTxHash = await opChainBClient.relayL2ToL2Message({
-    sentMessageId: sentMessage.id,
-    sentMessagePayload: sentMessage.payload,
-});
+const relayTxHash = await opChainBClient.interop.relayCrossDomainMessage(relayMessageParams);
 
 const relayReceipt = await opChainBClient.waitForTransactionReceipt({ hash: relayTxHash });
 
 // 5. Ensure the message was relayed successfully
 
-const { successfulMessages, failedMessages } = decodeRelayedL2ToL2Messages({ receipt: relayReceipt });
-if (successfulMessages.length != 1) {
+const status = await opChainBClient.interop.getCrossDomainMessageStatus({ message: sentMessage })
+if (status != 'relayed') {
     throw new Error("failed to relay message!")
 }
 
diff --git a/public/tutorials/app_v2.mts b/public/tutorials/app_v2.mts
index cc42adab7..e3ddbf39c 100644
--- a/public/tutorials/app_v2.mts
+++ b/public/tutorials/app_v2.mts
@@ -8,11 +8,7 @@ import {
 import { privateKeyToAccount } from 'viem/accounts'
 import { supersimL2A, supersimL2B } from '@eth-optimism/viem/chains'
 
-import {
-    walletActionsL2,
-    publicActionsL2,
-    createInteropSentL2ToL2Messages,
-} from '@eth-optimism/viem'
+import { walletActionsL2, publicActionsL2 } from '@eth-optimism/viem'
 
 import greeterData from './Greeter.json'
 import greetingSenderData from './GreetingSender.json'
@@ -58,17 +54,18 @@ const txnAHash = await greetingSender.write.setGreeting(
     ["Greeting through chain A"])
 const receiptA = await walletA.waitForTransactionReceipt({hash: txnAHash})
 
-const sentMessage =  
-    (await createInteropSentL2ToL2Messages(walletA, { receipt: receiptA }))
-        .sentMessages[0]
-const relayMsgTxnHash = await walletB.interop.relayMessage({
-    sentMessageId: sentMessage.id,
-    sentMessagePayload: sentMessage.payload,
-    })
+const sentMessages = await walletA.interop.getCrossDomainMessages({
+  logs: receiptA.logs,
+})
+const sentMessage = sentMessages[0] // We only sent 1 message
+const relayMessageParams = await walletA.interop.buildExecutingMessage({
+  log: sentMessage.log,
+})
+const relayMsgTxnHash = await walletB.interop.relayCrossDomainMessage(relayMessageParams)
 
-const receiptRelay = await walletB.waitForTransactionReceipt(
-        {hash: relayMsgTxnHash})
+const receiptRelay = await walletB.waitForTransactionReceipt({
+  hash: relayMsgTxnHash,
+})
 
 const greeting2 = await greeter.read.greet()
 console.log(`Chain A Greeting: ${greeting2}`)
-
diff --git a/public/tutorials/transfer-eth.mts b/public/tutorials/transfer-eth.mts
index da6288654..57a8726b8 100644
--- a/public/tutorials/transfer-eth.mts
+++ b/public/tutorials/transfer-eth.mts
@@ -20,7 +20,6 @@ import {
 import {
     walletActionsL2,
     publicActionsL2,
-    createInteropSentL2ToL2Messages,
     contracts as optimismContracts
 } from '@eth-optimism/viem'
  
@@ -46,8 +45,8 @@ const destinationWallet = createWalletClient({
 }).extend(publicActions)
     .extend(publicActionsL2())
     .extend(walletActionsL2())
- 
-const wethOnSource = await getContract({
+
+const ethBridgeOnSource = await getContract({
     address: optimismContracts.superchainETHBridge.address,
     abi: superchainEthBridgeAbi,
     client: sourceWallet
@@ -71,12 +70,12 @@ const reportBalance = async (address: string): Promise<void> => {
 console.log("Before transfer")
 await reportBalance(account.address)
 
-const sourceHash = await wethOnSource.write.sendETH({
+const sourceHash = await ethBridgeOnSource.write.sendETH({
     value: parseEther('0.001'),
     args: [account.address, destinationChain.id]
 })
 const sourceReceipt = await sourceWallet.waitForTransactionReceipt({
-	hash: sourceHash
+    hash: sourceHash
 })
 
 
@@ -84,16 +83,17 @@ console.log("After transfer on source chain")
 await reportBalance(account.address)
 
 
-const sentMessage =  
-    (await createInteropSentL2ToL2Messages(sourceWallet, { receipt: sourceReceipt }))
-        .sentMessages[0]
-const relayMsgTxnHash = await destinationWallet.interop.relayMessage({
-    sentMessageId: sentMessage.id,
-    sentMessagePayload: sentMessage.payload,
+const sentMessages = await sourceWallet.interop.getCrossDomainMessages({
+    logs: sourceReceipt.logs,
 })
- 
+const sentMessage = sentMessages[0]
+const relayMessageParams = await sourceWallet.interop.buildExecutingMessage({
+    log: sentMessage.log,
+})
+
+const relayMsgTxnHash = await destinationWallet.interop.relayCrossDomainMessage(relayMessageParams)
 const receiptRelay = await destinationWallet.waitForTransactionReceipt(
-        {hash: relayMsgTxnHash})
- 
+    {hash: relayMsgTxnHash})
+
 console.log("After relaying message to destination chain")
 await reportBalance(account.address)
diff --git a/public/tutorials/xfer-erc20.mts b/public/tutorials/xfer-erc20.mts
index 651a89112..b27966a9c 100644
--- a/public/tutorials/xfer-erc20.mts
+++ b/public/tutorials/xfer-erc20.mts
@@ -7,12 +7,8 @@ import {
 } from 'viem'
 import { privateKeyToAccount } from 'viem/accounts'
 import { interopAlpha0, interopAlpha1 } from '@eth-optimism/viem/chains'
- 
-import {
-    walletActionsL2,
-    publicActionsL2,
-    createInteropSentL2ToL2Messages,
-} from '@eth-optimism/viem'
+
+import { walletActionsL2, publicActionsL2 } from '@eth-optimism/viem'
 
 const tokenAddress = "0xF3Ce0794cB4Ef75A902e07e5D2b75E4D71495ee8"
 const balanceOf = {
@@ -79,7 +75,7 @@ await reportBalances()
 const sendTxnHash = await wallet0.interop.sendSuperchainERC20({
     tokenAddress,
     to: account.address,
-    amount: 1000000000,
+    amount: BigInt(1000000000),
     chainId: wallet1.chain.id
 })
 
@@ -89,15 +85,16 @@ const sendTxnReceipt = await wallet0.waitForTransactionReceipt({
     hash: sendTxnHash
 })
 
-const sentMessage =  
-    (await createInteropSentL2ToL2Messages(wallet0, { receipt: sendTxnReceipt }))
-        .sentMessages[0]
-
-const relayTxnHash = await wallet1.interop.relayMessage({
-    sentMessageId: sentMessage.id,
-    sentMessagePayload: sentMessage.payload,
+const sentMessages = await wallet0.interop.getCrossDomainMessages({
+    logs: sendTxnReceipt.logs
+})
+const sentMessage = sentMessages[0]
+const relayMessageParams = await wallet0.interop.buildExecutingMessage({
+    log: sentMessage.log
 })
 
+const relayTxnHash = await wallet1.interop.relayCrossDomainMessage(relayMessageParams)
+
 const relayTxnReceipt = await wallet1.waitForTransactionReceipt({
     hash: relayTxnHash
 })


Reviews:
user: login: coderabbitai[bot]
body: **Actionable comments posted: 0**

<details>
<summary>🧹 Nitpick comments (3)</summary><blockquote>

<details>
<summary>words.txt (3)</summary><blockquote>

`57-58`: **Review of Bootnodes Variants**  
There are two consecutive updates for bootnodes: one changed to "Bootnodes" (line 57) and the very next to "BOOTNODES" (line 58). Please verify that both variants are intentionally maintained to differentiate contexts (for example, a proper noun versus an acronym) rather than being an oversight.

---

`167-168`: **Review of Holesky Variants**  
The file now lists two versions—"Holesky" (line 167) and "HOLESKY" (line 168). Confirm that both forms are required for distinct contexts. If these differences are not intentional, consider consolidating them to avoid potential confusion downstream.

---

`392-393`: **Review of Superchain Variants**  
Both "Superchain" (line 392) and "SUPERCHAIN" (line 393) are present. As with other duplicated terms, please double-check that these represent deliberate variants (such as a branding nuance vs. a specific technical flag) rather than an inconsistency.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 LanguageTool</summary>

[duplication] ~392-~392: Možný preklep: zopakovali ste slovo
Context: ...nd SUBU Sunnyside superchain Superchain SUPERCHAIN Superchain's superchainerc Superlend Superloans Su...

(WORD_REPEAT_RULE)

</details>

</details>

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: .coderabbit.yaml**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 8dfab20c04ef5c9a48b54373ae31ac7d250ea0d3 and 81045ba265adc8d4cc730057352e448cd194f131.

</details>

<details>
<summary>📒 Files selected for processing (5)</summary>

* `pages/interop/tutorials/relay-messages-cast.mdx` (6 hunks)
* `pages/interop/tutorials/relay-messages-viem.mdx` (4 hunks)
* `public/tutorials/app_v2.mts` (2 hunks)
* `public/tutorials/xfer-erc20.mts` (3 hunks)
* `words.txt` (8 hunks)

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>📓 Path-based instructions (1)</summary>

<details>
<summary>`**/*.mdx`: "ALWAYS review Markdown content THOROUGHLY with the following criteria:
- First, check the frontmatter section at the top of the file:
  1. For regular pages, ensure AL...</summary>

> `**/*.mdx`: "ALWAYS review Markdown content THOROUGHLY with the following criteria:
> - First, check the frontmatter section at the top of the file:
>   1. For regular pages, ensure ALL these fields are present and not empty:
>     ```yaml
>     ---
>     title: [non-empty]
>     lang: [non-empty]
>     description: [non-empty]
>     topic: [non-empty]
>     personas: [non-empty array]
>     categories: [non-empty array]
>     content_type: [valid type]
>     ---
>     ```
>   2. For landing pages (index.mdx or files with <Cards>), only these fields are required:
>     ```yaml
>     ---
>     title: [non-empty]
>     lang: [non-empty]
>     description: [non-empty]
>     topic: [non-empty]
>     ---
>     ```
>   3. If any required fields are missing or empty, comment:
>     'This file appears to be missing required metadata. Please check keywords.config.yaml for valid options and add the required fields manually. You can validate your changes by running:
>     ```bash
>     pnpm validate-metadata
>     ```'
> - Use proper nouns in place of personal pronouns like 'We' and 'Our' to maintain consistency in communal documentation.
> - Avoid gender-specific language and use the imperative form.
> - Monitor capitalization for emphasis. Avoid using all caps, italics, or bold for emphasis.
> - Ensure proper nouns are capitalized in sentences.
> - Apply the Oxford comma.
> - Use proper title case for buttons, tab names, page names, and links. Sentence case should be used for body content and short phrases, even in links.
> - Use correct spelling and grammar at all times (IMPORTANT).
> - For H1, H2, and H3 headers:
>   1. Use sentence case, capitalizing only the first word.
>   2. Preserve the capitalization of proper nouns, technical terms, and acronyms as defined in the 'nouns.txt' file located in the root directory of the project.
>   3. Do not automatically lowercase words that appear in the 'nouns.txt' file, regardless of their position in the header.
> - Flag any headers that seem to inconsistently apply these rules for manual review.
> - When reviewing capitalization, always refer to the 'nouns.txt' file for the correct capitalization of proper nouns and technical terms specific to the project.
> "
> 

- `pages/interop/tutorials/relay-messages-viem.mdx`
- `pages/interop/tutorials/relay-messages-cast.mdx`

</details>

</details><details>
<summary>🪛 LanguageTool</summary>

<details>
<summary>pages/interop/tutorials/relay-messages-cast.mdx</summary>

[grammar] ~170-~170: Did you mean “admins”?
Context: ...ith the relay message tx. There are two admin RPC methods that can be used to constru...

(ARE_CD_NN)

</details>
<details>
<summary>words.txt</summary>

[duplication] ~2-~2: Možný preklep: zopakovali ste slovo
Context: accountqueue ACCOUNTQUEUE accountslots ACCOUNTSLOTS ACDC ADDI ADDIU ADDU airgap Allnodes al...

(WORD_REPEAT_RULE)

---

[duplication] ~11-~11: Možný preklep: zopakovali ste slovo
Context: ... ADDI ADDIU ADDU airgap Allnodes allocs alphanet Alphanet alphanets Alphanets altda ANDI Ankr Ape...

(WORD_REPEAT_RULE)

---

[duplication] ~13-~13: Možný preklep: zopakovali ste slovo
Context: ...irgap Allnodes allocs alphanet Alphanet alphanets Alphanets altda ANDI Ankr Apeworx Arweave authrpc...

(WORD_REPEAT_RULE)

---

[duplication] ~21-~21: Možný preklep: zopakovali ste slovo
Context: ...altda ANDI Ankr Apeworx Arweave authrpc autorelay Autorelay autorelayer basefee betanet Betanet bet...

(WORD_REPEAT_RULE)

---

[duplication] ~25-~25: Možný preklep: zopakovali ste slovo
Context: ...autorelay Autorelay autorelayer basefee betanet Betanet betanets Betanets BGEZ BGTZ Biconomy BL...

(WORD_REPEAT_RULE)

---

[duplication] ~27-~27: Možný preklep: zopakovali ste slovo
Context: ...lay autorelayer basefee betanet Betanet betanets Betanets BGEZ BGTZ Biconomy BLEZ blobpool BLOBPO...

(WORD_REPEAT_RULE)

---

[duplication] ~33-~33: Možný preklep: zopakovali ste slovo
Context: ...tanets Betanets BGEZ BGTZ Biconomy BLEZ blobpool BLOBPOOL blobspace Blockdaemon Blockdaemon's blo...

(WORD_REPEAT_RULE)

---

[duplication] ~36-~36: Možný preklep: zopakovali ste slovo
Context: ...conomy BLEZ blobpool BLOBPOOL blobspace Blockdaemon Blockdaemon's blockhash blocklists blocklogs BLOCKL...

(WORD_REPEAT_RULE)

---

[duplication] ~40-~40: Možný preklep: zopakovali ste slovo
Context: ...emon Blockdaemon's blockhash blocklists blocklogs BLOCKLOGS blockprofilerate BLOCKPROFILERATE Block...

(WORD_REPEAT_RULE)

---

[duplication] ~42-~42: Možný preklep: zopakovali ste slovo
Context: ...lockhash blocklists blocklogs BLOCKLOGS blockprofilerate BLOCKPROFILERATE Blockscout blockspace Blockspace blockt...

(WORD_REPEAT_RULE)

---

[duplication] ~45-~45: Možný preklep: zopakovali ste slovo
Context: ...profilerate BLOCKPROFILERATE Blockscout blockspace Blockspace blocktime blocktimes Blocktimes bloomfi...

(WORD_REPEAT_RULE)

---

[duplication] ~48-~48: Možný preklep: zopakovali ste slovo
Context: ...ckscout blockspace Blockspace blocktime blocktimes Blocktimes bloomfilter BLOOMFILTER BLTZ Bootcamp b...

(WORD_REPEAT_RULE)

---

[duplication] ~50-~50: Možný preklep: zopakovali ste slovo
Context: ...ckspace blocktime blocktimes Blocktimes bloomfilter BLOOMFILTER BLTZ Bootcamp bootnode bootnodes Bootno...

(WORD_REPEAT_RULE)

---

[duplication] ~55-~55: Možný preklep: zopakovali ste slovo
Context: ...lter BLOOMFILTER BLTZ Bootcamp bootnode bootnodes Bootnodes BOOTNODES bottlenecked brotli Brotli ca...

(WORD_REPEAT_RULE)

---

[duplication] ~59-~59: Možný preklep: zopakovali ste slovo
Context: ...tnodes Bootnodes BOOTNODES bottlenecked brotli Brotli callouts Callouts CCIP Celestia Celesti...

(WORD_REPEAT_RULE)

---

[duplication] ~61-~61: Možný preklep: zopakovali ste slovo
Context: ...es BOOTNODES bottlenecked brotli Brotli callouts Callouts CCIP Celestia Celestia's chainid Chainl...

(WORD_REPEAT_RULE)

---

[duplication] ~78-~78: Možný preklep: zopakovali ste slovo
Context: ...alized Collateralized compr Comprensive computependingblock COMPUTEPENDINGBLOCK confs Consen corsdomain counterfactuall...

(WORD_REPEAT_RULE)

---

[duplication] ~84-~84: Možný preklep: zopakovali ste slovo
Context: ...onfs Consen corsdomain counterfactually crosschain Crosschain Crossmint Dapphub daserver datacap DATA...

(WORD_REPEAT_RULE)

---

[duplication] ~89-~89: Možný preklep: zopakovali ste slovo
Context: ...n Crosschain Crossmint Dapphub daserver datacap DATACAP datadir DATADIR devnet Devnet devnets D...

(WORD_REPEAT_RULE)

---

[duplication] ~91-~91: Možný preklep: zopakovali ste slovo
Context: ...ssmint Dapphub daserver datacap DATACAP datadir DATADIR devnet Devnet devnets Devnets Devs dire...

(WORD_REPEAT_RULE)

---

[duplication] ~93-~93: Možný preklep: zopakovali ste slovo
Context: ...aserver datacap DATACAP datadir DATADIR devnet Devnet devnets Devnets Devs direnv disabletxpo...

(WORD_REPEAT_RULE)

---

[duplication] ~95-~95: Možný preklep: zopakovali ste slovo
Context: ...p DATACAP datadir DATADIR devnet Devnet devnets Devnets Devs direnv disabletxpoolgossip DISABLE...

(WORD_REPEAT_RULE)

---

[duplication] ~99-~99: Možný preklep: zopakovali ste slovo
Context: ...vnet Devnet devnets Devnets Devs direnv disabletxpoolgossip DISABLETXPOOLGOSSIP discv Discv DIVU Drand dripcheck Drippi...

(WORD_REPEAT_RULE)

---

[duplication] ~101-~101: Možný preklep: zopakovali ste slovo
Context: ...disabletxpoolgossip DISABLETXPOOLGOSSIP discv Discv DIVU Drand dripcheck Drippie Eigen EIPs...

(WORD_REPEAT_RULE)

---

[duplication] ~109-~109: Možný preklep: zopakovali ste slovo
Context: ...DIVU Drand dripcheck Drippie Eigen EIPs enabledeprecatedpersonal ENABLEDEPRECATEDPERSONAL enginekind erigon Erigon etherbase ETHE...

(WORD_REPEAT_RULE)

---

[duplication] ~112-~112: Možný preklep: zopakovali ste slovo
Context: ...nal ENABLEDEPRECATEDPERSONAL enginekind erigon Erigon etherbase ETHERBASE Ethernity Ethernow ...

(WORD_REPEAT_RULE)

---

[duplication] ~114-~114: Možný preklep: zopakovali ste slovo
Context: ...ECATEDPERSONAL enginekind erigon Erigon etherbase ETHERBASE Ethernity Ethernow ethstats ETHSTATS ev...

(WORD_REPEAT_RULE)

---

[duplication] ~118-~118: Možný preklep: zopakovali ste slovo
Context: ... etherbase ETHERBASE Ethernity Ethernow ethstats ETHSTATS evmtimeout EVMTIMEOUT excercise executa...

(WORD_REPEAT_RULE)

---

[duplication] ~120-~120: Možný preklep: zopakovali ste slovo
Context: ...SE Ethernity Ethernow ethstats ETHSTATS evmtimeout EVMTIMEOUT excercise executability exfiltrate exit...

(WORD_REPEAT_RULE)

---

[duplication] ~125-~125: Možný preklep: zopakovali ste slovo
Context: ...EOUT excercise executability exfiltrate exitwhensynced EXITWHENSYNCED extradata EXTRADATA Farcaster Faultproo...

(WORD_REPEAT_RULE)

---

[duplication] ~127-~127: Možný preklep: zopakovali ste slovo
Context: ...xfiltrate exitwhensynced EXITWHENSYNCED extradata EXTRADATA Farcaster Faultproof fdlimit FDLIMIT Fl...

(WORD_REPEAT_RULE)

---

[duplication] ~131-~131: Možný preklep: zopakovali ste slovo
Context: ...xtradata EXTRADATA Farcaster Faultproof fdlimit FDLIMIT Flashblocks Flashbots forkable forkchoi...

(WORD_REPEAT_RULE)

---

[duplication] ~146-~146: Možný preklep: zopakovali ste slovo
Context: ... Funct gameplay gascap GASCAP gaslessly gcmode GCMODE Gelato gifs globalqueue GLOBALQUEUE glo...

(WORD_REPEAT_RULE)

---

[duplication] ~150-~150: Možný preklep: zopakovali ste slovo
Context: ...CAP gaslessly gcmode GCMODE Gelato gifs globalqueue GLOBALQUEUE globalslots GLOBALSLOTS gokzg growthepi...

(WORD_REPEAT_RULE)

---

[duplication] ~152-~152: Možný preklep: zopakovali ste slovo
Context: ...ODE Gelato gifs globalqueue GLOBALQUEUE globalslots GLOBALSLOTS gokzg growthepie hardfork hardforks hea...

(WORD_REPEAT_RULE)

---

[duplication] ~158-~158: Možný preklep: zopakovali ste slovo
Context: ...OTS gokzg growthepie hardfork hardforks healthcheck HEALTHCHECK healthchecks historicalrpc HISTORICALRP...

(WORD_REPEAT_RULE)

---

[duplication] ~161-~161: Možný preklep: zopakovali ste slovo
Context: ...ks healthcheck HEALTHCHECK healthchecks historicalrpc HISTORICALRPC historicalrpctimeout HISTORICALRPCTIMEO...

(WORD_REPEAT_RULE)

---

[duplication] ~163-~163: Možný preklep: zopakovali ste slovo
Context: ...ealthchecks historicalrpc HISTORICALRPC historicalrpctimeout HISTORICALRPCTIMEOUT holesky Holesky HOLESKY IERC ignorepric...

(WORD_REPEAT_RULE)

---

[duplication] ~165-~165: Možný preklep: zopakovali ste slovo
Context: ...storicalrpctimeout HISTORICALRPCTIMEOUT holesky Holesky HOLESKY IERC ignoreprice IGNOREPRICE Im...

(WORD_REPEAT_RULE)

---

[duplication] ~169-~169: Možný preklep: zopakovali ste slovo
Context: ...RPCTIMEOUT holesky Holesky HOLESKY IERC ignoreprice IGNOREPRICE Immunefi inator Inator influxdbv INFLUX...

(WORD_REPEAT_RULE)

---

[duplication] ~172-~172: Možný preklep: zopakovali ste slovo
Context: ...Y IERC ignoreprice IGNOREPRICE Immunefi inator Inator influxdbv INFLUXDBV initcode ipcdisable...

(WORD_REPEAT_RULE)

---

[duplication] ~174-~174: Možný preklep: zopakovali ste slovo
Context: ...rice IGNOREPRICE Immunefi inator Inator influxdbv INFLUXDBV initcode ipcdisable IPCDISABLE ipcfile ...

(WORD_REPEAT_RULE)

---

[duplication] ~177-~177: Možný preklep: zopakovali ste slovo
Context: ...tor Inator influxdbv INFLUXDBV initcode ipcdisable IPCDISABLE ipcfile ipcpath IPCPATH IPFS Isthumus J...

(WORD_REPEAT_RULE)

---

[duplication] ~180-~180: Možný preklep: zopakovali ste slovo
Context: ... initcode ipcdisable IPCDISABLE ipcfile ipcpath IPCPATH IPFS Isthumus JALR journalremotes JOURN...

(WORD_REPEAT_RULE)

---

[duplication] ~185-~185: Možný preklep: zopakovali ste slovo
Context: ...file ipcpath IPCPATH IPFS Isthumus JALR journalremotes JOURNALREMOTES jspath JSPATH jwtsecret Keccak leveldb ...

(WORD_REPEAT_RULE)

---

[duplication] ~187-~187: Možný preklep: zopakovali ste slovo
Context: ...umus JALR journalremotes JOURNALREMOTES jspath JSPATH jwtsecret Keccak leveldb lightkdf Lisk ...

(WORD_REPEAT_RULE)

---

[duplication] ~196-~196: Možný preklep: zopakovali ste slovo
Context: ...ak leveldb lightkdf Lisk logfile logfmt maxage MAXAGE maxbackups MAXBACKUPS maxpeers MAXPEERS...

(WORD_REPEAT_RULE)

---

[duplication] ~198-~198: Možný preklep: zopakovali ste slovo
Context: ...htkdf Lisk logfile logfmt maxage MAXAGE maxbackups MAXBACKUPS maxpeers MAXPEERS maxpendpeers MAXPENDP...

(WORD_REPEAT_RULE)

---

[duplication] ~200-~200: Možný preklep: zopakovali ste slovo
Context: ...fmt maxage MAXAGE maxbackups MAXBACKUPS maxpeers MAXPEERS maxpendpeers MAXPENDPEERS maxprice MAXP...

(WORD_REPEAT_RULE)

---

[duplication] ~202-~202: Možný preklep: zopakovali ste slovo
Context: ...maxbackups MAXBACKUPS maxpeers MAXPEERS maxpendpeers MAXPENDPEERS maxprice MAXPRICE memprofilerate MEMPRO...

(WORD_REPEAT_RULE)

---

[duplication] ~204-~204: Možný preklep: zopakovali ste slovo
Context: ...eers MAXPEERS maxpendpeers MAXPENDPEERS maxprice MAXPRICE memprofilerate MEMPROFILERATE merkle Me...

(WORD_REPEAT_RULE)

---

[duplication] ~206-~206: Možný preklep: zopakovali ste slovo
Context: ...endpeers MAXPENDPEERS maxprice MAXPRICE memprofilerate MEMPROFILERATE merkle Merkle MFHI MFLO Mgas Minato min...

(WORD_REPEAT_RULE)

---

[duplication] ~208-~208: Možný preklep: zopakovali ste slovo
Context: ... MAXPRICE memprofilerate MEMPROFILERATE merkle Merkle MFHI MFLO Mgas Minato minfreedisk MINFR...

(WORD_REPEAT_RULE)

---

[duplication] ~214-~214: Možný preklep: zopakovali ste slovo
Context: ...ATE merkle Merkle MFHI MFLO Mgas Minato minfreedisk MINFREEDISK minsuggestedpriorityfee MINSUGGESTEDPRI...

(WORD_REPEAT_RULE)

---

[duplication] ~216-~216: Možný preklep: zopakovali ste slovo
Context: ...FLO Mgas Minato minfreedisk MINFREEDISK minsuggestedpriorityfee MINSUGGESTEDPRIORITYFEE Mintable Mintplex MIPSEVM Mitigations m...

(WORD_REPEAT_RULE)

---

[duplication] ~222-~222: Možný preklep: zopakovali ste slovo
Context: ...E Mintable Mintplex MIPSEVM Mitigations monitorism Monitorism Moralis Mordor mountpoint MOVN MOVZ MTH...

(WORD_REPEAT_RULE)

---

[duplication] ~239-~239: Možný preklep: zopakovali ste slovo
Context: ... multiclient multisigs MULTU nethermind netrestrict NETRESTRICT networkid NETWORKID newpayload NEWPAYLO...

(WORD_REPEAT_RULE)

---

[duplication] ~241-~241: Možný preklep: zopakovali ste slovo
Context: ...ULTU nethermind netrestrict NETRESTRICT networkid NETWORKID newpayload NEWPAYLOAD nextra nocompacti...

(WORD_REPEAT_RULE)

---

[duplication] ~243-~243: Možný preklep: zopakovali ste slovo
Context: ...estrict NETRESTRICT networkid NETWORKID newpayload NEWPAYLOAD nextra nocompaction NOCOMPACTION nodeke...

(WORD_REPEAT_RULE)

---

[duplication] ~246-~246: Možný preklep: zopakovali ste slovo
Context: ... NETWORKID newpayload NEWPAYLOAD nextra nocompaction NOCOMPACTION nodekey NODEKEY nodekeyhex NODEKEYHEX n...

(WORD_REPEAT_RULE)

---

[duplication] ~248-~248: Možný preklep: zopakovali ste slovo
Context: ...AYLOAD nextra nocompaction NOCOMPACTION nodekey NODEKEY nodekeyhex NODEKEYHEX nodename nodiscov...

(WORD_REPEAT_RULE)

---

[duplication] ~250-~250: Možný preklep: zopakovali ste slovo
Context: ...compaction NOCOMPACTION nodekey NODEKEY nodekeyhex NODEKEYHEX nodename nodiscover NODISCOVER nolocals...

(WORD_REPEAT_RULE)

---

[duplication] ~253-~253: Možný preklep: zopakovali ste slovo
Context: ... NODEKEY nodekeyhex NODEKEYHEX nodename nodiscover NODISCOVER nolocals NOLOCALS noprefetch NOPREFETCH...

(WORD_REPEAT_RULE)

---

[duplication] ~255-~255: Možný preklep: zopakovali ste slovo
Context: ...DEKEYHEX nodename nodiscover NODISCOVER nolocals NOLOCALS noprefetch NOPREFETCH nopruning NOPRUNI...

(WORD_REPEAT_RULE)

---

[duplication] ~257-~257: Možný preklep: zopakovali ste slovo
Context: ...nodiscover NODISCOVER nolocals NOLOCALS noprefetch NOPREFETCH nopruning NOPRUNING nosyncserve NOSYNCS...

(WORD_REPEAT_RULE)

---

[duplication] ~259-~259: Možný preklep: zopakovali ste slovo
Context: ...nolocals NOLOCALS noprefetch NOPREFETCH nopruning NOPRUNING nosyncserve NOSYNCSERVE Numba offchain ...

(WORD_REPEAT_RULE)

---

[duplication] ~261-~261: Možný preklep: zopakovali ste slovo
Context: ...prefetch NOPREFETCH nopruning NOPRUNING nosyncserve NOSYNCSERVE Numba offchain Offchain opchaina opchai...

(WORD_REPEAT_RULE)

---

[duplication] ~264-~264: Možný preklep: zopakovali ste slovo
Context: ...NOPRUNING nosyncserve NOSYNCSERVE Numba offchain Offchain opchaina opchainb OPCM Openfort oplabs ...

(WORD_REPEAT_RULE)

---

[duplication] ~278-~278: Možný preklep: zopakovali ste slovo
Context: ...bility pcscdpath pectra Pectra Pectra's peerstore Peerstore peerstores permissioned Permissioned pe...

(WORD_REPEAT_RULE)

---

[duplication] ~281-~281: Možný preklep: zopakovali ste slovo
Context: ...Pectra's peerstore Peerstore peerstores permissioned Permissioned permissionless Permissionless permissio...

(WORD_REPEAT_RULE)

---

[duplication] ~283-~283: Možný preklep: zopakovali ste slovo
Context: ...re peerstores permissioned Permissioned permissionless Permissionless permissionlessly Perps Peta Pimlico POA...

(WORD_REPEAT_RULE)

---

[duplication] ~291-~291: Možný preklep: zopakovali ste slovo
Context: ...ionlessly Perps Peta Pimlico POAP POAPs pprof PPROF precommitments Precommitments preconfig...

(WORD_REPEAT_RULE)

---

[duplication] ~293-~293: Možný preklep: zopakovali ste slovo
Context: ...rps Peta Pimlico POAP POAPs pprof PPROF precommitments Precommitments preconfigured predeploy predeployed Pre...

(WORD_REPEAT_RULE)

---

[duplication] ~297-~297: Možný preklep: zopakovali ste slovo
Context: ... Precommitments preconfigured predeploy predeployed Predeployed predeploys Predeploys prefunded preimag...

(WORD_REPEAT_RULE)

---

[duplication] ~299-~299: Možný preklep: zopakovali ste slovo
Context: ...gured predeploy predeployed Predeployed predeploys Predeploys prefunded preimage Preimage preimages P...

(WORD_REPEAT_RULE)

---

[duplication] ~302-~302: Možný preklep: zopakovali ste slovo
Context: ...eployed predeploys Predeploys prefunded preimage Preimage preimages PREIMAGES preinstall preinsta...

(WORD_REPEAT_RULE)

---

[duplication] ~304-~304: Možný preklep: zopakovali ste slovo
Context: ... Predeploys prefunded preimage Preimage preimages PREIMAGES preinstall preinstalls Preinstalls pres...

(WORD_REPEAT_RULE)

---

[duplication] ~307-~307: Možný preklep: zopakovali ste slovo
Context: ...Preimage preimages PREIMAGES preinstall preinstalls Preinstalls prestate Prestate prestates PREVRANDAO ...

(WORD_REPEAT_RULE)

---

[duplication] ~309-~309: Možný preklep: zopakovali ste slovo
Context: ...AGES preinstall preinstalls Preinstalls prestate Prestate prestates PREVRANDAO pricebump PRICEBUM...

(WORD_REPEAT_RULE)

---

[duplication] ~313-~313: Možný preklep: zopakovali ste slovo
Context: ... prestate Prestate prestates PREVRANDAO pricebump PRICEBUMP pricelimit PRICELIMIT productionize pro...

(WORD_REPEAT_RULE)

---

[duplication] ~315-~315: Možný preklep: zopakovali ste slovo
Context: ...restates PREVRANDAO pricebump PRICEBUMP pricelimit PRICELIMIT productionize productionized Protip Pro...

(WORD_REPEAT_RULE)

---

[duplication] ~321-~321: Možný preklep: zopakovali ste slovo
Context: ...uctionize productionized Protip Proxied proxyd Proxyd Pyth Pyth's QRNG quicknode Quicknode qu...

(WORD_REPEAT_RULE)

---

[duplication] ~323-~323: Možný preklep: zopakovali ste slovo
Context: ...uctionized Protip Proxied proxyd Proxyd Pyth Pyth's QRNG quicknode Quicknode quickstarts ...

(WORD_REPEAT_RULE)

---

[duplication] ~326-~326: Možný preklep: zopakovali ste slovo
Context: ... Proxied proxyd Proxyd Pyth Pyth's QRNG quicknode Quicknode quickstarts rebalancing regenesis Regen...

(WORD_REPEAT_RULE)

---

[duplication] ~330-~330: Možný preklep: zopakovali ste slovo
Context: ...knode Quicknode quickstarts rebalancing regenesis Regenesis Reimagine rejournal REJOURNAL remotedb ...

(WORD_REPEAT_RULE)

---

[duplication] ~333-~333: Možný preklep: zopakovali ste slovo
Context: ...balancing regenesis Regenesis Reimagine rejournal REJOURNAL remotedb REMOTEDB Reown Reown's replaya...

(WORD_REPEAT_RULE)

---

[duplication] ~335-~335: Možný preklep: zopakovali ste slovo
Context: ...Regenesis Reimagine rejournal REJOURNAL remotedb REMOTEDB Reown Reown's replayability replayor re...

(WORD_REPEAT_RULE)

---

[duplication] ~337-~337: Možný preklep: zopakovali ste slovo
Context: ...e rejournal REJOURNAL remotedb REMOTEDB Reown Reown's replayability replayor reposts reprov...

(WORD_REPEAT_RULE)

---

[duplication] ~343-~343: Možný preklep: zopakovali ste slovo
Context: ...replayability replayor reposts reproven requiredblocks REQUIREDBLOCKS rollouts rollups Rollups Routescan rpck...

(WORD_REPEAT_RULE)

---

[duplication] ~346-~346: Možný preklep: zopakovali ste slovo
Context: ... requiredblocks REQUIREDBLOCKS rollouts rollups Rollups Routescan rpckind rpcprefix RPCPREFIX r...

(WORD_REPEAT_RULE)

---

[duplication] ~350-~350: Možný preklep: zopakovali ste slovo
Context: ...louts rollups Rollups Routescan rpckind rpcprefix RPCPREFIX rpcs RPGF runbooks Runbooks RWAs safedb...

(WORD_REPEAT_RULE)

---

[duplication] ~354-~354: Možný preklep: zopakovali ste slovo
Context: ...n rpckind rpcprefix RPCPREFIX rpcs RPGF runbooks Runbooks RWAs safedb Schnorr sepolia Sepolia SEP...

(WORD_REPEAT_RULE)

---

[duplication] ~359-~359: Možný preklep: zopakovali ste slovo
Context: ...F runbooks Runbooks RWAs safedb Schnorr sepolia Sepolia SEPOLIA seqnr sequencerhttp SEQUENCERHT...

(WORD_REPEAT_RULE)

---

[duplication] ~363-~363: Možný preklep: zopakovali ste slovo
Context: ...b Schnorr sepolia Sepolia SEPOLIA seqnr sequencerhttp SEQUENCERHTTP serv signup SLLV SLTI SLTIU SLTU smartc...

(WORD_REPEAT_RULE)

---

[duplication] ~381-~381: Možný preklep: zopakovali ste slovo
Context: ...olana Soneium soyboy Spearbit SRAV SRLV stablecoins Stablecoins statefulset subcomponents subgame subhe...

(WORD_REPEAT_RULE)

---

[duplication] ~390-~390: Možný preklep: zopakovali ste slovo
Context: ...ame subheaders subsecond SUBU Sunnyside superchain Superchain SUPERCHAIN Superchain's superchainerc S...

(WORD_REPEAT_RULE)

---

[duplication] ~392-~392: Možný preklep: zopakovali ste slovo
Context: ...nd SUBU Sunnyside superchain Superchain SUPERCHAIN Superchain's superchainerc Superlend Superloans Su...

(WORD_REPEAT_RULE)

---

[duplication] ~398-~398: Možný preklep: zopakovali ste slovo
Context: ...chainerc Superlend Superloans Superscan supersim Supersim syncmode SYNCMODE synctarget SYNCTARGET...

(WORD_REPEAT_RULE)

---

[duplication] ~400-~400: Možný preklep: zopakovali ste slovo
Context: ... Superloans Superscan supersim Supersim syncmode SYNCMODE synctarget SYNCTARGET syscalls thirdweb...

(WORD_REPEAT_RULE)

---

[duplication] ~402-~402: Možný preklep: zopakovali ste slovo
Context: ...can supersim Supersim syncmode SYNCMODE synctarget SYNCTARGET syscalls thirdweb threadcreate timeseri...

(WORD_REPEAT_RULE)

---

[duplication] ~430-~430: Možný preklep: zopakovali ste slovo
Context: ...ubmitted UPNP upstreaming verkle VERKLE vhosts VHOSTS viem Viem viem's Viem's vmdebug VMDEBUG...

(WORD_REPEAT_RULE)

---

[duplication] ~432-~432: Možný preklep: zopakovali ste slovo
Context: ...upstreaming verkle VERKLE vhosts VHOSTS viem Viem viem's Viem's vmdebug VMDEBUG vmodule V...

(WORD_REPEAT_RULE)

---

[duplication] ~436-~436: Možný preklep: zopakovali ste slovo
Context: ...E vhosts VHOSTS viem Viem viem's Viem's vmdebug VMDEBUG vmodule VMODULE xlarge XORI ZKPs ZKVM z...

(WORD_REPEAT_RULE)

---

[duplication] ~438-~438: Možný preklep: zopakovali ste slovo
Context: ...viem Viem viem's Viem's vmdebug VMDEBUG vmodule VMODULE xlarge XORI ZKPs ZKVM zora Zora 

(WORD_REPEAT_RULE)

---

[duplication] ~444-~444: Možný preklep: zopakovali ste slovo
Context: ...G vmodule VMODULE xlarge XORI ZKPs ZKVM zora Zora 

(WORD_REPEAT_RULE)

</details>

</details>

</details>

<details>
<summary>⏰ Context from checks skipped due to timeout of 90000ms (3)</summary>

* GitHub Check: Redirect rules - docs-optimism
* GitHub Check: Header rules - docs-optimism
* GitHub Check: Pages changed - docs-optimism

</details>

<details>
<summary>🔇 Additional comments (22)</summary><blockquote>

<details>
<summary>public/tutorials/xfer-erc20.mts (4)</summary>

`10-11`: **Removed redundant import and updated import statement.**

The code correctly removes the unused `createInteropSentL2ToL2Messages` import while retaining the necessary imports from `@eth-optimism/viem`.

---

`78-78`: **Improved numerical handling with BigInt conversion.**

Converting the amount to BigInt is the correct approach for handling token amounts in blockchain applications, as it ensures precision for large numbers and prevents potential overflow issues.

---

`88-94`: **Updated to a more streamlined cross-domain message retrieval approach.**

The code now uses a more direct method of obtaining cross-domain messages by:
1. Retrieving messages directly from transaction logs with `getCrossDomainMessages`
2. Extracting the first message from the returned array
3. Using `buildExecutingMessage` to construct the parameters needed for relaying

This approach is more efficient and aligns with current best practices for handling interop messages.

---

`96-96`: **Updated relay method to use the new API.**

The code now correctly uses `relayCrossDomainMessage` with the properly constructed parameters, which is consistent with the updated cross-domain messaging workflow.

</details>
<details>
<summary>public/tutorials/app_v2.mts (3)</summary>

`10-11`: **Streamlined imports for cross-domain messaging.**

The code correctly removes the unused import while maintaining the necessary functionality with `walletActionsL2` and `publicActionsL2`.

---

`57-64`: **Updated cross-domain message handling workflow.**

The implementation now follows the improved pattern for interop message handling:
1. Retrieving sent messages from transaction logs with `getCrossDomainMessages`
2. Accessing the first message from the array
3. Building execution parameters with `buildExecutingMessage`
4. Relaying the message with `relayCrossDomainMessage`

This provides a more direct and maintainable approach to cross-domain message handling.

---

`66-68`: **Improved code formatting for consistency.**

The updated code maintains consistent formatting for the `waitForTransactionReceipt` call, making the code more readable.

</details>
<details>
<summary>pages/interop/tutorials/relay-messages-cast.mdx (6)</summary>

`27-28`: **Improved formatting in Callout component.**

The text is now properly indented for better readability and consistency.

---

`33-33`: **Fixed URL encoding in documentation links.**

The URL parameter is now properly encoded with an escaped ampersand (`\&`), ensuring the link functions correctly when rendered.

---

`50-50`: **Corrected function name from 'sentERC20' to 'sendERC20'.**

This correction accurately reflects the actual function name used in the contract, improving the tutorial's accuracy.

---

`104-114`: **Updated command and example output for getting logs.**

The command and example output have been updated with the correct RPC command and current log format, improving the tutorial's accuracy with up-to-date information.

---

`169-232`: **Added comprehensive section on access list construction.**

This new section provides valuable information on:
1. The purpose of access lists for relay messages
2. Two methods to construct access lists using admin RPC methods
3. Example commands and expected outputs

This addition significantly improves the tutorial by explaining a critical step in the relay process that was previously missing.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 LanguageTool</summary>

[grammar] ~170-~170: Did you mean “admins”?
Context: ...ith the relay message tx. There are two admin RPC methods that can be used to constru...

(ARE_CD_NN)

</details>

</details>

---

`261-265`: **Updated relay message command to include access list parameter.**

The command now includes the required access list parameter, which is essential for the transaction execution. This update ensures the tutorial reflects the current requirements for relaying messages.

</details>
<details>
<summary>pages/interop/tutorials/relay-messages-viem.mdx (8)</summary>

`122-127`: **Updated ERC20 sending method to use the interop API.**

The code now uses `opChainAClient.interop.sendSuperchainERC20` with a cleaner parameter structure instead of directly calling the contract. This provides a more abstracted and user-friendly approach for sending tokens across chains.


However, there's an inconsistency in the variable names:
- Line 123 uses `SUPERSIM_SUPERC20_ADDRESS` but the defined constant is `L2_NATIVE_SUPERCHAINERC20_ADDRESS` (line 75)
- Line 125 uses `AMOUNT_TO_SEND` which isn't defined in this snippet
- Line 124 uses `testAccount.address` but the defined account is `account` (line 79)


Please verify these variable names for consistency with the actual implementation.

---

`133-136`: **Updated approach for retrieving and processing cross-domain messages.**

The code now uses a more streamlined approach for handling cross-domain messages:
1. Uses `getCrossDomainMessages` to retrieve messages from transaction logs
2. Extracts the first message for processing
3. Builds execution parameters using `buildExecutingMessage`

However, there's an inconsistency in line 135 where `publicClientA` is used but the defined client is `opChainAClient`.


Please verify this variable name for consistency with the actual implementation.

---

`148-148`: **Updated relay message method.**

The code now uses `relayCrossDomainMessage` with the parameters built in the previous step, providing a more direct approach to message relaying.

---

`154-157`: **Added message status verification.**

The code now includes a crucial check to verify if the message was successfully relayed using `getCrossDomainMessageStatus`. This improves error handling and ensures the cross-chain operation completed successfully.

---

`245-251`: **Updated ERC20 sending implementation in full code snippet.**

The full code snippet has been updated to use the improved `sendSuperchainERC20` method, but contains the same variable inconsistencies as noted in the earlier comment.


Please verify the variable names `SUPERSIM_SUPERC20_ADDRESS`, `AMOUNT_TO_SEND`, and `testAccount` for consistency with the rest of the code.

---

`257-259`: **Updated message processing in full code snippet.**

The full code snippet correctly implements the improved message processing workflow, but contains the same `publicClientA` inconsistency noted earlier.


Please verify this variable name for consistency with the actual implementation.

---

`268-268`: **Updated relay method in full code snippet.**

The full code snippet correctly implements the updated relay method using `relayCrossDomainMessage`.

---

`274-276`: **Added message status verification in full code snippet.**

The full code snippet includes the important check for message relay status, enhancing the reliability of the code example.

</details>
<details>
<summary>words.txt (1)</summary>

`2-446`: **Overall Capitalization Standardization Review**  
The changes in this file apply a comprehensive update to the capitalization of nearly every term in the list. For example, entries such as "accountqueue" and "accountslots" are now updated to "ACCOUNTQUEUE" and "ACCOUNTSLOTS" respectively; similarly, singular/plural terms like "alphanet" and "alphanets" have been standardized to "Alphanet" and "Alphanets". Such updates extend throughout the file—from "betanet" → "Betanet" and "Betanets" to many entries in the later portions (e.g., "datacap" → "DATACAP", "etherbase" → "ETHERBASE", "ethstats" → "ETHSTATS", etc.).  

These modifications appear to be driven by a need for consistency with the updated manual relay and viem tutorials as well as for clarity and correctness in technical documentation. The file now includes a mix of full-uppercase, title-case, and sometimes two different variants (for instance, "Bootnodes" alongside "BOOTNODES", or "Holesky" alongside "HOLESKY") to likely serve different contexts in usage.  

Static analysis tools flagged many duplication warnings. In this list context, these are most likely false positives due to intentional repetitions (providing both title-case and all-uppercase variants, for example) rather than genuine errors.

I recommend verifying that these standardized terms match the corresponding usage in the tutorials and documentation so that the visual language remains consistent across the codebase and user guides.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 LanguageTool</summary>

[duplication] ~2-~2: Možný preklep: zopakovali ste slovo
Context: accountqueue ACCOUNTQUEUE accountslots ACCOUNTSLOTS ACDC ADDI ADDIU ADDU airgap Allnodes al...

(WORD_REPEAT_RULE)

---

[duplication] ~11-~11: Možný preklep: zopakovali ste slovo
Context: ... ADDI ADDIU ADDU airgap Allnodes allocs alphanet Alphanet alphanets Alphanets altda ANDI Ankr Ape...

(WORD_REPEAT_RULE)

---

[duplication] ~13-~13: Možný preklep: zopakovali ste slovo
Context: ...irgap Allnodes allocs alphanet Alphanet alphanets Alphanets altda ANDI Ankr Apeworx Arweave authrpc...

(WORD_REPEAT_RULE)

---

[duplication] ~21-~21: Možný preklep: zopakovali ste slovo
Context: ...altda ANDI Ankr Apeworx Arweave authrpc autorelay Autorelay autorelayer basefee betanet Betanet bet...

(WORD_REPEAT_RULE)

---

[duplication] ~25-~25: Možný preklep: zopakovali ste slovo
Context: ...autorelay Autorelay autorelayer basefee betanet Betanet betanets Betanets BGEZ BGTZ Biconomy BL...

(WORD_REPEAT_RULE)

---

[duplication] ~27-~27: Možný preklep: zopakovali ste slovo
Context: ...lay autorelayer basefee betanet Betanet betanets Betanets BGEZ BGTZ Biconomy BLEZ blobpool BLOBPO...

(WORD_REPEAT_RULE)

---

[duplication] ~33-~33: Možný preklep: zopakovali ste slovo
Context: ...tanets Betanets BGEZ BGTZ Biconomy BLEZ blobpool BLOBPOOL blobspace Blockdaemon Blockdaemon's blo...

(WORD_REPEAT_RULE)

---

[duplication] ~36-~36: Možný preklep: zopakovali ste slovo
Context: ...conomy BLEZ blobpool BLOBPOOL blobspace Blockdaemon Blockdaemon's blockhash blocklists blocklogs BLOCKL...

(WORD_REPEAT_RULE)

---

[duplication] ~40-~40: Možný preklep: zopakovali ste slovo
Context: ...emon Blockdaemon's blockhash blocklists blocklogs BLOCKLOGS blockprofilerate BLOCKPROFILERATE Block...

(WORD_REPEAT_RULE)

---

[duplication] ~42-~42: Možný preklep: zopakovali ste slovo
Context: ...lockhash blocklists blocklogs BLOCKLOGS blockprofilerate BLOCKPROFILERATE Blockscout blockspace Blockspace blockt...

(WORD_REPEAT_RULE)

---

[duplication] ~45-~45: Možný preklep: zopakovali ste slovo
Context: ...profilerate BLOCKPROFILERATE Blockscout blockspace Blockspace blocktime blocktimes Blocktimes bloomfi...

(WORD_REPEAT_RULE)

---

[duplication] ~48-~48: Možný preklep: zopakovali ste slovo
Context: ...ckscout blockspace Blockspace blocktime blocktimes Blocktimes bloomfilter BLOOMFILTER BLTZ Bootcamp b...

(WORD_REPEAT_RULE)

---

[duplication] ~50-~50: Možný preklep: zopakovali ste slovo
Context: ...ckspace blocktime blocktimes Blocktimes bloomfilter BLOOMFILTER BLTZ Bootcamp bootnode bootnodes Bootno...

(WORD_REPEAT_RULE)

---

[duplication] ~55-~55: Možný preklep: zopakovali ste slovo
Context: ...lter BLOOMFILTER BLTZ Bootcamp bootnode bootnodes Bootnodes BOOTNODES bottlenecked brotli Brotli ca...

(WORD_REPEAT_RULE)

---

[duplication] ~59-~59: Možný preklep: zopakovali ste slovo
Context: ...tnodes Bootnodes BOOTNODES bottlenecked brotli Brotli callouts Callouts CCIP Celestia Celesti...

(WORD_REPEAT_RULE)

---

[duplication] ~61-~61: Možný preklep: zopakovali ste slovo
Context: ...es BOOTNODES bottlenecked brotli Brotli callouts Callouts CCIP Celestia Celestia's chainid Chainl...

(WORD_REPEAT_RULE)

---

[duplication] ~64-~64: Možný preklep: zopakovali ste slovo
Context: ...ed brotli Brotli callouts Callouts CCIP Celestia Celestia's chainid Chainlink chainlist Chainstac...

(WORD_REPEAT_RULE)

---

[duplication] ~74-~74: Možný preklep: zopakovali ste slovo
Context: ...ck chaosnet Chugsplash Clabby codebases collateralized Collateralized compr Comprensive computependingblock C...

(WORD_REPEAT_RULE)

---

[duplication] ~78-~78: Možný preklep: zopakovali ste slovo
Context: ...alized Collateralized compr Comprensive computependingblock COMPUTEPENDINGBLOCK confs Consen corsdomain counterfactuall...

(WORD_REPEAT_RULE)

---

[duplication] ~84-~84: Možný preklep: zopakovali ste slovo
Context: ...onfs Consen corsdomain counterfactually crosschain Crosschain Crossmint Dapphub daserver datacap DATA...

(WORD_REPEAT_RULE)

---

[duplication] ~89-~89: Možný preklep: zopakovali ste slovo
Context: ...n Crosschain Crossmint Dapphub daserver datacap DATACAP datadir DATADIR devnet Devnet devnets D...

(WORD_REPEAT_RULE)

---

[duplication] ~91-~91: Možný preklep: zopakovali ste slovo
Context: ...ssmint Dapphub daserver datacap DATACAP datadir DATADIR devnet Devnet devnets Devnets Devs dire...

(WORD_REPEAT_RULE)

---

[duplication] ~93-~93: Možný preklep: zopakovali ste slovo
Context: ...aserver datacap DATACAP datadir DATADIR devnet Devnet devnets Devnets Devs direnv disabletxpo...

(WORD_REPEAT_RULE)

---

[duplication] ~95-~95: Možný preklep: zopakovali ste slovo
Context: ...p DATACAP datadir DATADIR devnet Devnet devnets Devnets Devs direnv disabletxpoolgossip DISABLE...

(WORD_REPEAT_RULE)

---

[duplication] ~99-~99: Možný preklep: zopakovali ste slovo
Context: ...vnet Devnet devnets Devnets Devs direnv disabletxpoolgossip DISABLETXPOOLGOSSIP discv Discv DIVU Drand dripcheck Drippi...

(WORD_REPEAT_RULE)

---

[duplication] ~101-~101: Možný preklep: zopakovali ste slovo
Context: ...disabletxpoolgossip DISABLETXPOOLGOSSIP discv Discv DIVU Drand dripcheck Drippie Eigen EIPs...

(WORD_REPEAT_RULE)

---

[duplication] ~109-~109: Možný preklep: zopakovali ste slovo
Context: ...DIVU Drand dripcheck Drippie Eigen EIPs enabledeprecatedpersonal ENABLEDEPRECATEDPERSONAL enginekind erigon Erigon etherbase ETHE...

(WORD_REPEAT_RULE)

---

[duplication] ~112-~112: Možný preklep: zopakovali ste slovo
Context: ...nal ENABLEDEPRECATEDPERSONAL enginekind erigon Erigon etherbase ETHERBASE Ethernity Ethernow ...

(WORD_REPEAT_RULE)

---

[duplication] ~114-~114: Možný preklep: zopakovali ste slovo
Context: ...ECATEDPERSONAL enginekind erigon Erigon etherbase ETHERBASE Ethernity Ethernow ethstats ETHSTATS ev...

(WORD_REPEAT_RULE)

---

[duplication] ~118-~118: Možný preklep: zopakovali ste slovo
Context: ... etherbase ETHERBASE Ethernity Ethernow ethstats ETHSTATS evmtimeout EVMTIMEOUT excercise executa...

(WORD_REPEAT_RULE)

---

[duplication] ~120-~120: Možný preklep: zopakovali ste slovo
Context: ...SE Ethernity Ethernow ethstats ETHSTATS evmtimeout EVMTIMEOUT excercise executability exfiltrate exit...

(WORD_REPEAT_RULE)

---

[duplication] ~125-~125: Možný preklep: zopakovali ste slovo
Context: ...EOUT excercise executability exfiltrate exitwhensynced EXITWHENSYNCED extradata EXTRADATA Farcaster Faultproo...

(WORD_REPEAT_RULE)

---

[duplication] ~127-~127: Možný preklep: zopakovali ste slovo
Context: ...xfiltrate exitwhensynced EXITWHENSYNCED extradata EXTRADATA Farcaster Faultproof fdlimit FDLIMIT Fl...

(WORD_REPEAT_RULE)

---

[duplication] ~131-~131: Možný preklep: zopakovali ste slovo
Context: ...xtradata EXTRADATA Farcaster Faultproof fdlimit FDLIMIT Flashblocks Flashbots forkable forkchoi...

(WORD_REPEAT_RULE)

---

[duplication] ~143-~143: Možný preklep: zopakovali ste slovo
Context: ...s Fraxtal funcationality Funct gameplay gascap GASCAP gaslessly gcmode GCMODE Gelato gifs glo...

(WORD_REPEAT_RULE)

---

[duplication] ~146-~146: Možný preklep: zopakovali ste slovo
Context: ... Funct gameplay gascap GASCAP gaslessly gcmode GCMODE Gelato gifs globalqueue GLOBALQUEUE glo...

(WORD_REPEAT_RULE)

---

[duplication] ~150-~150: Možný preklep: zopakovali ste slovo
Context: ...CAP gaslessly gcmode GCMODE Gelato gifs globalqueue GLOBALQUEUE globalslots GLOBALSLOTS gokzg growthepi...

(WORD_REPEAT_RULE)

---

[duplication] ~152-~152: Možný preklep: zopakovali ste slovo
Context: ...ODE Gelato gifs globalqueue GLOBALQUEUE globalslots GLOBALSLOTS gokzg growthepie hardfork hardforks hea...

(WORD_REPEAT_RULE)

---

[duplication] ~158-~158: Možný preklep: zopakovali ste slovo
Context: ...OTS gokzg growthepie hardfork hardforks healthcheck HEALTHCHECK healthchecks historicalrpc HISTORICALRP...

(WORD_REPEAT_RULE)

---

[duplication] ~161-~161: Možný preklep: zopakovali ste slovo
Context: ...ks healthcheck HEALTHCHECK healthchecks historicalrpc HISTORICALRPC historicalrpctimeout HISTORICALRPCTIMEO...

(WORD_REPEAT_RULE)

---

[duplication] ~163-~163: Možný preklep: zopakovali ste slovo
Context: ...ealthchecks historicalrpc HISTORICALRPC historicalrpctimeout HISTORICALRPCTIMEOUT holesky Holesky HOLESKY IERC ignorepric...

(WORD_REPEAT_RULE)

---

[duplication] ~165-~165: Možný preklep: zopakovali ste slovo
Context: ...storicalrpctimeout HISTORICALRPCTIMEOUT holesky Holesky HOLESKY IERC ignoreprice IGNOREPRICE Im...

(WORD_REPEAT_RULE)

---

[duplication] ~169-~169: Možný preklep: zopakovali ste slovo
Context: ...RPCTIMEOUT holesky Holesky HOLESKY IERC ignoreprice IGNOREPRICE Immunefi inator Inator influxdbv INFLUX...

(WORD_REPEAT_RULE)

---

[duplication] ~172-~172: Možný preklep: zopakovali ste slovo
Context: ...Y IERC ignoreprice IGNOREPRICE Immunefi inator Inator influxdbv INFLUXDBV initcode ipcdisable...

(WORD_REPEAT_RULE)

---

[duplication] ~174-~174: Možný preklep: zopakovali ste slovo
Context: ...rice IGNOREPRICE Immunefi inator Inator influxdbv INFLUXDBV initcode ipcdisable IPCDISABLE ipcfile ...

(WORD_REPEAT_RULE)

---

[duplication] ~177-~177: Možný preklep: zopakovali ste slovo
Context: ...tor Inator influxdbv INFLUXDBV initcode ipcdisable IPCDISABLE ipcfile ipcpath IPCPATH IPFS Isthumus J...

(WORD_REPEAT_RULE)

---

[duplication] ~180-~180: Možný preklep: zopakovali ste slovo
Context: ... initcode ipcdisable IPCDISABLE ipcfile ipcpath IPCPATH IPFS Isthumus JALR journalremotes JOURN...

(WORD_REPEAT_RULE)

---

[duplication] ~185-~185: Možný preklep: zopakovali ste slovo
Context: ...file ipcpath IPCPATH IPFS Isthumus JALR journalremotes JOURNALREMOTES jspath JSPATH jwtsecret Keccak leveldb ...

(WORD_REPEAT_RULE)

---

[duplication] ~187-~187: Možný preklep: zopakovali ste slovo
Context: ...umus JALR journalremotes JOURNALREMOTES jspath JSPATH jwtsecret Keccak leveldb lightkdf Lisk ...

(WORD_REPEAT_RULE)

---

[duplication] ~196-~196: Možný preklep: zopakovali ste slovo
Context: ...ak leveldb lightkdf Lisk logfile logfmt maxage MAXAGE maxbackups MAXBACKUPS maxpeers MAXPEERS...

(WORD_REPEAT_RULE)

---

[duplication] ~198-~198: Možný preklep: zopakovali ste slovo
Context: ...htkdf Lisk logfile logfmt maxage MAXAGE maxbackups MAXBACKUPS maxpeers MAXPEERS maxpendpeers MAXPENDP...

(WORD_REPEAT_RULE)

---

[duplication] ~200-~200: Možný preklep: zopakovali ste slovo
Context: ...fmt maxage MAXAGE maxbackups MAXBACKUPS maxpeers MAXPEERS maxpendpeers MAXPENDPEERS maxprice MAXP...

(WORD_REPEAT_RULE)

---

[duplication] ~202-~202: Možný preklep: zopakovali ste slovo
Context: ...maxbackups MAXBACKUPS maxpeers MAXPEERS maxpendpeers MAXPENDPEERS maxprice MAXPRICE memprofilerate MEMPRO...

(WORD_REPEAT_RULE)

---

[duplication] ~204-~204: Možný preklep: zopakovali ste slovo
Context: ...eers MAXPEERS maxpendpeers MAXPENDPEERS maxprice MAXPRICE memprofilerate MEMPROFILERATE merkle Me...

(WORD_REPEAT_RULE)

---

[duplication] ~206-~206: Možný preklep: zopakovali ste slovo
Context: ...endpeers MAXPENDPEERS maxprice MAXPRICE memprofilerate MEMPROFILERATE merkle Merkle MFHI MFLO Mgas Minato min...

(WORD_REPEAT_RULE)

---

[duplication] ~208-~208: Možný preklep: zopakovali ste slovo
Context: ... MAXPRICE memprofilerate MEMPROFILERATE merkle Merkle MFHI MFLO Mgas Minato minfreedisk MINFR...

(WORD_REPEAT_RULE)

---

[duplication] ~214-~214: Možný preklep: zopakovali ste slovo
Context: ...ATE merkle Merkle MFHI MFLO Mgas Minato minfreedisk MINFREEDISK minsuggestedpriorityfee MINSUGGESTEDPRI...

(WORD_REPEAT_RULE)

---

[duplication] ~216-~216: Možný preklep: zopakovali ste slovo
Context: ...FLO Mgas Minato minfreedisk MINFREEDISK minsuggestedpriorityfee MINSUGGESTEDPRIORITYFEE Mintable Mintplex MIPSEVM Mitigations m...

(WORD_REPEAT_RULE)

---

[duplication] ~222-~222: Možný preklep: zopakovali ste slovo
Context: ...E Mintable Mintplex MIPSEVM Mitigations monitorism Monitorism Moralis Mordor mountpoint MOVN MOVZ MTH...

(WORD_REPEAT_RULE)

---

[duplication] ~233-~233: Možný preklep: zopakovali ste slovo
Context: ...oint MOVN MOVZ MTHI MTLO MULT multiaddr multichain Multichain multiclient multisigs MULTU nethermind ...

(WORD_REPEAT_RULE)

---

[duplication] ~239-~239: Možný preklep: zopakovali ste slovo
Context: ... multiclient multisigs MULTU nethermind netrestrict NETRESTRICT networkid NETWORKID newpayload NEWPAYLO...

(WORD_REPEAT_RULE)

---

[duplication] ~241-~241: Možný preklep: zopakovali ste slovo
Context: ...ULTU nethermind netrestrict NETRESTRICT networkid NETWORKID newpayload NEWPAYLOAD nextra nocompacti...

(WORD_REPEAT_RULE)

---

[duplication] ~243-~243: Možný preklep: zopakovali ste slovo
Context: ...estrict NETRESTRICT networkid NETWORKID newpayload NEWPAYLOAD nextra nocompaction NOCOMPACTION nodeke...

(WORD_REPEAT_RULE)

---

[duplication] ~246-~246: Možný preklep: zopakovali ste slovo
Context: ... NETWORKID newpayload NEWPAYLOAD nextra nocompaction NOCOMPACTION nodekey NODEKEY nodekeyhex NODEKEYHEX n...

(WORD_REPEAT_RULE)

---

[duplication] ~248-~248: Možný preklep: zopakovali ste slovo
Context: ...AYLOAD nextra nocompaction NOCOMPACTION nodekey NODEKEY nodekeyhex NODEKEYHEX nodename nodiscov...

(WORD_REPEAT_RULE)

---

[duplication] ~250-~250: Možný preklep: zopakovali ste slovo
Context: ...compaction NOCOMPACTION nodekey NODEKEY nodekeyhex NODEKEYHEX nodename nodiscover NODISCOVER nolocals...

(WORD_REPEAT_RULE)

---

[duplication] ~253-~253: Možný preklep: zopakovali ste slovo
Context: ... NODEKEY nodekeyhex NODEKEYHEX nodename nodiscover NODISCOVER nolocals NOLOCALS noprefetch NOPREFETCH...

(WORD_REPEAT_RULE)

---

[duplication] ~255-~255: Možný preklep: zopakovali ste slovo
Context: ...DEKEYHEX nodename nodiscover NODISCOVER nolocals NOLOCALS noprefetch NOPREFETCH nopruning NOPRUNI...

(WORD_REPEAT_RULE)

---

[duplication] ~257-~257: Možný preklep: zopakovali ste slovo
Context: ...nodiscover NODISCOVER nolocals NOLOCALS noprefetch NOPREFETCH nopruning NOPRUNING nosyncserve NOSYNCS...

(WORD_REPEAT_RULE)

---

[duplication] ~259-~259: Možný preklep: zopakovali ste slovo
Context: ...nolocals NOLOCALS noprefetch NOPREFETCH nopruning NOPRUNING nosyncserve NOSYNCSERVE Numba offchain ...

(WORD_REPEAT_RULE)

---

[duplication] ~261-~261: Možný preklep: zopakovali ste slovo
Context: ...prefetch NOPREFETCH nopruning NOPRUNING nosyncserve NOSYNCSERVE Numba offchain Offchain opchaina opchai...

(WORD_REPEAT_RULE)

---

[duplication] ~264-~264: Možný preklep: zopakovali ste slovo
Context: ...NOPRUNING nosyncserve NOSYNCSERVE Numba offchain Offchain opchaina opchainb OPCM Openfort oplabs ...

(WORD_REPEAT_RULE)

---

[duplication] ~275-~275: Možný preklep: zopakovali ste slovo
Context: ... opnode's opstack Pausability pcscdpath pectra Pectra Pectra's peerstore Peerstore peerstores...

(WORD_REPEAT_RULE)

---

[duplication] ~278-~278: Možný preklep: zopakovali ste slovo
Context: ...bility pcscdpath pectra Pectra Pectra's peerstore Peerstore peerstores permissioned Permissioned pe...

(WORD_REPEAT_RULE)

---

[duplication] ~281-~281: Možný preklep: zopakovali ste slovo
Context: ...Pectra's peerstore Peerstore peerstores permissioned Permissioned permissionless Permissionless permissio...

(WORD_REPEAT_RULE)

---

[duplication] ~283-~283: Možný preklep: zopakovali ste slovo
Context: ...re peerstores permissioned Permissioned permissionless Permissionless permissionlessly Perps Peta Pimlico POA...

(WORD_REPEAT_RULE)

---

[duplication] ~291-~291: Možný preklep: zopakovali ste slovo
Context: ...ionlessly Perps Peta Pimlico POAP POAPs pprof PPROF precommitments Precommitments preconfig...

(WORD_REPEAT_RULE)

---

[duplication] ~293-~293: Možný preklep: zopakovali ste slovo
Context: ...rps Peta Pimlico POAP POAPs pprof PPROF precommitments Precommitments preconfigured predeploy predeployed Pre...

(WORD_REPEAT_RULE)

---

[duplication] ~297-~297: Možný preklep: zopakovali ste slovo
Context: ... Precommitments preconfigured predeploy predeployed Predeployed predeploys Predeploys prefunded preimag...

(WORD_REPEAT_RULE)

---

[duplication] ~299-~299: Možný preklep: zopakovali ste slovo
Context: ...gured predeploy predeployed Predeployed predeploys Predeploys prefunded preimage Preimage preimages P...

(WORD_REPEAT_RULE)

---

[duplication] ~302-~302: Možný preklep: zopakovali ste slovo
Context: ...eployed predeploys Predeploys prefunded preimage Preimage preimages PREIMAGES preinstall preinsta...

(WORD_REPEAT_RULE)

---

[duplication] ~304-~304: Možný preklep: zopakovali ste slovo
Context: ... Predeploys prefunded preimage Preimage preimages PREIMAGES preinstall preinstalls Preinstalls pres...

(WORD_REPEAT_RULE)

---

[duplication] ~307-~307: Možný preklep: zopakovali ste slovo
Context: ...Preimage preimages PREIMAGES preinstall preinstalls Preinstalls prestate Prestate prestates PREVRANDAO ...

(WORD_REPEAT_RULE)

---

[duplication] ~309-~309: Možný preklep: zopakovali ste slovo
Context: ...AGES preinstall preinstalls Preinstalls prestate Prestate prestates PREVRANDAO pricebump PRICEBUM...

(WORD_REPEAT_RULE)

---

[duplication] ~313-~313: Možný preklep: zopakovali ste slovo
Context: ... prestate Prestate prestates PREVRANDAO pricebump PRICEBUMP pricelimit PRICELIMIT productionize pro...

(WORD_REPEAT_RULE)

---

[duplication] ~315-~315: Možný preklep: zopakovali ste slovo
Context: ...restates PREVRANDAO pricebump PRICEBUMP pricelimit PRICELIMIT productionize productionized Protip Pro...

(WORD_REPEAT_RULE)

---

[duplication] ~321-~321: Možný preklep: zopakovali ste slovo
Context: ...uctionize productionized Protip Proxied proxyd Proxyd Pyth Pyth's QRNG quicknode Quicknode qu...

(WORD_REPEAT_RULE)

---

[duplication] ~323-~323: Možný preklep: zopakovali ste slovo
Context: ...uctionized Protip Proxied proxyd Proxyd Pyth Pyth's QRNG quicknode Quicknode quickstarts ...

(WORD_REPEAT_RULE)

---

[duplication] ~326-~326: Možný preklep: zopakovali ste slovo
Context: ... Proxied proxyd Proxyd Pyth Pyth's QRNG quicknode Quicknode quickstarts rebalancing regenesis Regen...

(WORD_REPEAT_RULE)

---

[duplication] ~330-~330: Možný preklep: zopakovali ste slovo
Context: ...knode Quicknode quickstarts rebalancing regenesis Regenesis Reimagine rejournal REJOURNAL remotedb ...

(WORD_REPEAT_RULE)

---

[duplication] ~333-~333: Možný preklep: zopakovali ste slovo
Context: ...balancing regenesis Regenesis Reimagine rejournal REJOURNAL remotedb REMOTEDB Reown Reown's replaya...

(WORD_REPEAT_RULE)

---

[duplication] ~335-~335: Možný preklep: zopakovali ste slovo
Context: ...Regenesis Reimagine rejournal REJOURNAL remotedb REMOTEDB Reown Reown's replayability replayor re...

(WORD_REPEAT_RULE)

---

[duplication] ~337-~337: Možný preklep: zopakovali ste slovo
Context: ...e rejournal REJOURNAL remotedb REMOTEDB Reown Reown's replayability replayor reposts reprov...

(WORD_REPEAT_RULE)

---

[duplication] ~343-~343: Možný preklep: zopakovali ste slovo
Context: ...replayability replayor reposts reproven requiredblocks REQUIREDBLOCKS rollouts rollups Rollups Routescan rpck...

(WORD_REPEAT_RULE)

---

[duplication] ~346-~346: Možný preklep: zopakovali ste slovo
Context: ... requiredblocks REQUIREDBLOCKS rollouts rollups Rollups Routescan rpckind rpcprefix RPCPREFIX r...

(WORD_REPEAT_RULE)

---

[duplication] ~350-~350: Možný preklep: zopakovali ste slovo
Context: ...louts rollups Rollups Routescan rpckind rpcprefix RPCPREFIX rpcs RPGF runbooks Runbooks RWAs safedb...

(WORD_REPEAT_RULE)

---

[duplication] ~354-~354: Možný preklep: zopakovali ste slovo
Context: ...n rpckind rpcprefix RPCPREFIX rpcs RPGF runbooks Runbooks RWAs safedb Schnorr sepolia Sepolia SEP...

(WORD_REPEAT_RULE)

---

[duplication] ~359-~359: Možný preklep: zopakovali ste slovo
Context: ...F runbooks Runbooks RWAs safedb Schnorr sepolia Sepolia SEPOLIA seqnr sequencerhttp SEQUENCERHT...

(WORD_REPEAT_RULE)

---

[duplication] ~363-~363: Možný preklep: zopakovali ste slovo
Context: ...b Schnorr sepolia Sepolia SEPOLIA seqnr sequencerhttp SEQUENCERHTTP serv signup SLLV SLTI SLTIU SLTU smartc...

(WORD_REPEAT_RULE)

---

[duplication] ~373-~373: Možný preklep: zopakovali ste slovo
Context: ...V SLTI SLTIU SLTU smartcard snapshotlog snapsync Snapsync Solana Soneium soyboy Spearbit SRAV SRL...

(WORD_REPEAT_RULE)

---

[duplication] ~381-~381: Možný preklep: zopakovali ste slovo
Context: ...olana Soneium soyboy Spearbit SRAV SRLV stablecoins Stablecoins statefulset subcomponents subgame subhe...

(WORD_REPEAT_RULE)

---

[duplication] ~390-~390: Možný preklep: zopakovali ste slovo
Context: ...ame subheaders subsecond SUBU Sunnyside superchain Superchain SUPERCHAIN Superchain's superchainerc S...

(WORD_REPEAT_RULE)

---

[duplication] ~392-~392: Možný preklep: zopakovali ste slovo
Context: ...nd SUBU Sunnyside superchain Superchain SUPERCHAIN Superchain's superchainerc Superlend Superloans Su...

(WORD_REPEAT_RULE)

---

[duplication] ~398-~398: Možný preklep: zopakovali ste slovo
Context: ...chainerc Superlend Superloans Superscan supersim Supersim syncmode SYNCMODE synctarget SYNCTARGET...

(WORD_REPEAT_RULE)

---

[duplication] ~400-~400: Možný preklep: zopakovali ste slovo
Context: ... Superloans Superscan supersim Supersim syncmode SYNCMODE synctarget SYNCTARGET syscalls thirdweb...

(WORD_REPEAT_RULE)

---

[duplication] ~402-~402: Možný preklep: zopakovali ste slovo
Context: ...can supersim Supersim syncmode SYNCMODE synctarget SYNCTARGET syscalls thirdweb threadcreate timeseri...

(WORD_REPEAT_RULE)

---

[duplication] ~415-~415: Možný preklep: zopakovali ste slovo
Context: ...essly trustrpc Twei txfeecap txmgr txns txpool TXPOOL txproxy txproxyd uncensorable uncounter...

(WORD_REPEAT_RULE)

---

[duplication] ~428-~428: Možný preklep: zopakovali ste slovo
Context: ... Unprotect unsubmitted UPNP upstreaming verkle VERKLE vhosts VHOSTS viem Viem viem's Viem's v...

(WORD_REPEAT_RULE)

---

[duplication] ~430-~430: Možný preklep: zopakovali ste slovo
Context: ...ubmitted UPNP upstreaming verkle VERKLE vhosts VHOSTS viem Viem viem's Viem's vmdebug VMDEBUG...

(WORD_REPEAT_RULE)

---

[duplication] ~432-~432: Možný preklep: zopakovali ste slovo
Context: ...upstreaming verkle VERKLE vhosts VHOSTS viem Viem viem's Viem's vmdebug VMDEBUG vmodule V...

(WORD_REPEAT_RULE)

---

[duplication] ~436-~436: Možný preklep: zopakovali ste slovo
Context: ...E vhosts VHOSTS viem Viem viem's Viem's vmdebug VMDEBUG vmodule VMODULE xlarge XORI ZKPs ZKVM z...

(WORD_REPEAT_RULE)

---

[duplication] ~438-~438: Možný preklep: zopakovali ste slovo
Context: ...viem Viem viem's Viem's vmdebug VMDEBUG vmodule VMODULE xlarge XORI ZKPs ZKVM zora Zora 

(WORD_REPEAT_RULE)

---

[duplication] ~444-~444: Možný preklep: zopakovali ste slovo
Context: ...G vmodule VMODULE xlarge XORI ZKPs ZKVM zora Zora 

(WORD_REPEAT_RULE)

</details>

</details>

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-12T01:46:15Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 2**

<details>
<summary>📜 Review details</summary>

**Configuration used: .coderabbit.yaml**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 81045ba265adc8d4cc730057352e448cd194f131 and 6360ce4c1653f3ccf86a612cc14b0fc8b98ba0a5.

</details>

<details>
<summary>📒 Files selected for processing (5)</summary>

* `pages/interop/tutorials/relay-messages-cast.mdx` (6 hunks)
* `pages/interop/tutorials/relay-messages-viem.mdx` (4 hunks)
* `public/tutorials/app_v2.mts` (2 hunks)
* `public/tutorials/transfer-eth.mts` (2 hunks)
* `public/tutorials/xfer-erc20.mts` (3 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (2)</summary>

* public/tutorials/app_v2.mts
* public/tutorials/xfer-erc20.mts

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>📓 Path-based instructions (1)</summary>

<details>
<summary>`**/*.mdx`: "ALWAYS review Markdown content THOROUGHLY with the following criteria:
- First, check the frontmatter section at the top of the file:
  1. For regular pages, ensure AL...</summary>

> `**/*.mdx`: "ALWAYS review Markdown content THOROUGHLY with the following criteria:
> - First, check the frontmatter section at the top of the file:
>   1. For regular pages, ensure ALL these fields are present and not empty:
>     ```yaml
>     ---
>     title: [non-empty]
>     lang: [non-empty]
>     description: [non-empty]
>     topic: [non-empty]
>     personas: [non-empty array]
>     categories: [non-empty array]
>     content_type: [valid type]
>     ---
>     ```
>   2. For landing pages (index.mdx or files with <Cards>), only these fields are required:
>     ```yaml
>     ---
>     title: [non-empty]
>     lang: [non-empty]
>     description: [non-empty]
>     topic: [non-empty]
>     ---
>     ```
>   3. If any required fields are missing or empty, comment:
>     'This file appears to be missing required metadata. Please check keywords.config.yaml for valid options and add the required fields manually. You can validate your changes by running:
>     ```bash
>     pnpm validate-metadata
>     ```'
> - Use proper nouns in place of personal pronouns like 'We' and 'Our' to maintain consistency in communal documentation.
> - Avoid gender-specific language and use the imperative form.
> - Monitor capitalization for emphasis. Avoid using all caps, italics, or bold for emphasis.
> - Ensure proper nouns are capitalized in sentences.
> - Apply the Oxford comma.
> - Use proper title case for buttons, tab names, page names, and links. Sentence case should be used for body content and short phrases, even in links.
> - Use correct spelling and grammar at all times (IMPORTANT).
> - For H1, H2, and H3 headers:
>   1. Use sentence case, capitalizing only the first word.
>   2. Preserve the capitalization of proper nouns, technical terms, and acronyms as defined in the 'nouns.txt' file located in the root directory of the project.
>   3. Do not automatically lowercase words that appear in the 'nouns.txt' file, regardless of their position in the header.
> - Flag any headers that seem to inconsistently apply these rules for manual review.
> - When reviewing capitalization, always refer to the 'nouns.txt' file for the correct capitalization of proper nouns and technical terms specific to the project.
> "
> 

- `pages/interop/tutorials/relay-messages-viem.mdx`
- `pages/interop/tutorials/relay-messages-cast.mdx`

</details>

</details><details>
<summary>🪛 LanguageTool</summary>

<details>
<summary>pages/interop/tutorials/relay-messages-cast.mdx</summary>

[grammar] ~170-~170: Did you mean “admins”?
Context: ...ith the relay message tx. There are two admin RPC methods that can be used to constru...

(ARE_CD_NN)

</details>

</details>

</details>

<details>
<summary>🔇 Additional comments (15)</summary><blockquote>

<details>
<summary>public/tutorials/transfer-eth.mts (3)</summary>

`49-53`: **Variable name improvement for clarity.**

Changing from `wethOnSource` to `ethBridgeOnSource` better reflects that this is the Superchain ETH Bridge contract, not a WETH token contract. This improves code readability.

---

`86-92`: **Improved message retrieval approach.**

The updated code uses a more streamlined approach to retrieve cross-domain messages directly from transaction logs, replacing the previous `createInteropSentL2ToL2Messages` function. This approach is more direct and aligns with the updated interop messaging paradigm.

---

`94-96`: **Standardized relay message implementation.**

The updated relay message implementation uses the unified `relayCrossDomainMessage` method which provides a more consistent API for relaying messages across the Superchain.

</details>
<details>
<summary>pages/interop/tutorials/relay-messages-viem.mdx (6)</summary>

`122-127`: **Updated API usage for sending ERC20 tokens.**

The code now uses the dedicated `interop.sendSuperchainERC20` method instead of directly calling contract functions, providing a more streamlined and type-safe API for cross-chain token transfers.

---

`148-148`: **Standardized relay message implementation.**

The updated relay message implementation uses the unified `relayCrossDomainMessage` method, providing a more consistent API across different message types.

---

`154-156`: **Improved message status verification.**

The code now uses `getCrossDomainMessageStatus` to directly check message status rather than decoding the relay receipt, providing a more straightforward way to verify successful message relaying.

---

`245-251`: **Updated API usage for sending ERC20 tokens in full code snippet.**

The full code snippet correctly implements the updated method for sending ERC20 tokens using the `interop.sendSuperchainERC20` method.

---

`268-268`: **Updated standardized relay message implementation in full code snippet.**

The full code snippet correctly uses the new relay message implementation.

---

`274-276`: **Improved message status verification in full code snippet.**

The full code snippet correctly implements the new approach for verifying message status.

</details>
<details>
<summary>pages/interop/tutorials/relay-messages-cast.mdx (6)</summary>

`27-28`: **Improved text formatting and readability.**

The added indentation in the Callout component improves the readability of the text while preserving its meaning.

---

`33-33`: **Fixed URL encoding in link.**

The ampersand in the query parameter is now properly escaped (`\&`), ensuring correct parsing of the URL.

---

`50-50`: **Corrected function name.**

Changed `sentERC20` to `sendERC20`, which is the correct function name for the bridge operation.

---

`104-124`: **Updated log output to reflect current implementation.**

The sample output now shows current values for blockHash, blockNumber, data, and logIndex, making the tutorial more accurate.

---

`168-232`: **Added detailed access list construction guidance.**

The new section on constructing access lists is a valuable addition that explains two methods for retrieving the required access list:
1. Using `admin_getAccessListByMsgHash` with the message hash
2. Using `admin_getAccessListForIdentifier` with the message identifier and payload

This addition improves the completeness of the tutorial.


There's a minor grammar issue in line 170: "There are two admin RPC methods" should be "There are two admin RPC methods".

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 LanguageTool</summary>

[grammar] ~170-~170: Did you mean “admins”?
Context: ...ith the relay message tx. There are two admin RPC methods that can be used to constru...

(ARE_CD_NN)

</details>

</details>

---

`261-265`: **Updated relay command to include access list parameter.**

The updated command for `relayMessage` now includes the necessary access list parameter, which is required for the transaction to execute correctly on the destination chain.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-12T01:53:14Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 0**

<details>
<summary>🧹 Nitpick comments (3)</summary><blockquote>

<details>
<summary>pages/interop/tutorials/relay-messages-viem.mdx (2)</summary><blockquote>

`133-136`: **Message Construction Enhancement**

Using `getCrossDomainMessages` followed by `buildExecutingMessage` is a clear update to the message construction process. As an optional improvement, consider adding a check to confirm that `sentMessages` is not empty before accessing its first element. This would prevent potential runtime errors if no messages are returned.

---

`154-157`: **Status Check Improvement**

When checking the relay status, consider using the strict equality operator (`!==` instead of `!=`) to avoid type coercion issues. Also, it might be beneficial to add error handling in case the status retrieval fails or returns an unexpected value.

</blockquote></details>
<details>
<summary>pages/interop/tutorials/relay-messages-cast.mdx (1)</summary><blockquote>

`168-172`: **Grammatical Improvement for Access List Section**

In the "Construct the access list for the message" section, the sentence ending around line 169 appears to have a trailing "and" that disrupts clarity. Consider revising it as follows:

```diff
-An access list must be passed along with the relay message tx. There are two admin RPC methods that can be used to construct the access list: `admin_getAccessListByMsgHash` and `admin_getAccessListForIdentifier` and.
+An access list must be passed along with the relay message tx. There are two admin RPC methods that can be used to construct the access list: `admin_getAccessListByMsgHash` and `admin_getAccessListForIdentifier`.
```

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 LanguageTool</summary>

[grammar] ~170-~170: Did you mean “admins”?
Context: ...ith the relay message tx. There are two admin RPC methods that can be used to constru...

(ARE_CD_NN)

</details>

</details>

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: .coderabbit.yaml**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 6360ce4c1653f3ccf86a612cc14b0fc8b98ba0a5 and 7ab26c88813eea05dc60c83bb99f3638b508389b.

</details>

<details>
<summary>📒 Files selected for processing (4)</summary>

* `pages/interop/tutorials/bridge-crosschain-eth.mdx` (1 hunks)
* `pages/interop/tutorials/relay-messages-cast.mdx` (6 hunks)
* `pages/interop/tutorials/relay-messages-viem.mdx` (4 hunks)
* `public/tutorials/transfer-eth.mts` (2 hunks)

</details>

<details>
<summary>✅ Files skipped from review due to trivial changes (1)</summary>

* pages/interop/tutorials/bridge-crosschain-eth.mdx

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (1)</summary>

* public/tutorials/transfer-eth.mts

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>📓 Path-based instructions (1)</summary>

<details>
<summary>`**/*.mdx`: "ALWAYS review Markdown content THOROUGHLY with the following criteria:
- First, check the frontmatter section at the top of the file:
  1. For regular pages, ensure AL...</summary>

> `**/*.mdx`: "ALWAYS review Markdown content THOROUGHLY with the following criteria:
> - First, check the frontmatter section at the top of the file:
>   1. For regular pages, ensure ALL these fields are present and not empty:
>     ```yaml
>     ---
>     title: [non-empty]
>     lang: [non-empty]
>     description: [non-empty]
>     topic: [non-empty]
>     personas: [non-empty array]
>     categories: [non-empty array]
>     content_type: [valid type]
>     ---
>     ```
>   2. For landing pages (index.mdx or files with <Cards>), only these fields are required:
>     ```yaml
>     ---
>     title: [non-empty]
>     lang: [non-empty]
>     description: [non-empty]
>     topic: [non-empty]
>     ---
>     ```
>   3. If any required fields are missing or empty, comment:
>     'This file appears to be missing required metadata. Please check keywords.config.yaml for valid options and add the required fields manually. You can validate your changes by running:
>     ```bash
>     pnpm validate-metadata
>     ```'
> - Use proper nouns in place of personal pronouns like 'We' and 'Our' to maintain consistency in communal documentation.
> - Avoid gender-specific language and use the imperative form.
> - Monitor capitalization for emphasis. Avoid using all caps, italics, or bold for emphasis.
> - Ensure proper nouns are capitalized in sentences.
> - Apply the Oxford comma.
> - Use proper title case for buttons, tab names, page names, and links. Sentence case should be used for body content and short phrases, even in links.
> - Use correct spelling and grammar at all times (IMPORTANT).
> - For H1, H2, and H3 headers:
>   1. Use sentence case, capitalizing only the first word.
>   2. Preserve the capitalization of proper nouns, technical terms, and acronyms as defined in the 'nouns.txt' file located in the root directory of the project.
>   3. Do not automatically lowercase words that appear in the 'nouns.txt' file, regardless of their position in the header.
> - Flag any headers that seem to inconsistently apply these rules for manual review.
> - When reviewing capitalization, always refer to the 'nouns.txt' file for the correct capitalization of proper nouns and technical terms specific to the project.
> "
> 

- `pages/interop/tutorials/relay-messages-viem.mdx`
- `pages/interop/tutorials/relay-messages-cast.mdx`

</details>

</details><details>
<summary>🪛 LanguageTool</summary>

<details>
<summary>pages/interop/tutorials/relay-messages-cast.mdx</summary>

[grammar] ~170-~170: Did you mean “admins”?
Context: ...ith the relay message tx. There are two admin RPC methods that can be used to constru...

(ARE_CD_NN)

</details>

</details>

</details>

<details>
<summary>🔇 Additional comments (7)</summary><blockquote>

<details>
<summary>pages/interop/tutorials/relay-messages-viem.mdx (3)</summary>

`1-21`: **Frontmatter and Metadata Check**

The frontmatter includes all the required fields with non‐empty values. The metadata is complete and correctly structured.

---

`121-127`: **New Send Transaction Call**

The tutorial now uses the new method `opChainAClient.interop.sendSuperchainERC20` with parameters (`tokenAddress`, `to`, `amount`, and `chainId`). Please verify that the variables `SUPERSIM_SUPERC20_ADDRESS`, `testAccount`, and `AMOUNT_TO_SEND` are defined or explained elsewhere in the tutorial to avoid confusion.

---

`148-148`: **Relay Message Call**

The call to `opChainBClient.interop.relayCrossDomainMessage` appears correct and aligns with the new relay approach. No concerns here.

</details>
<details>
<summary>pages/interop/tutorials/relay-messages-cast.mdx (4)</summary>

`1-21`: **Frontmatter and Metadata Check**

The frontmatter in this file is complete and correctly structured, including all required fields (title, description, lang, content_type, topic, personas, and categories).

---

`26-29`: **Callout Component Update**

The updated text within the `<Callout>` component is clear and informative. The message now neatly informs users about the production-readiness of the SuperchainERC20 standard and the active development status of the OP Stack interoperability upgrade.

---

`33-33`: **Introduction and URL Encoding**

The introductory sentence now includes a properly encoded URL (using `\&` for query parameters), which should help avoid parsing issues in some environments. Verify that all linked URLs resolve as expected.

---

`261-266`: **Relay Message Transaction Update**

The updated relay message transaction now includes an `--access-list` parameter, which is essential for the transaction execution. Please ensure that the JSON provided in the `--access-list` argument is valid and exactly matches the expected format of your RPC endpoint.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-12T01:58:21Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 0**

<details>
<summary>🧹 Nitpick comments (6)</summary><blockquote>

<details>
<summary>pages/interop/tutorials/relay-messages-cast.mdx (6)</summary><blockquote>

`131-133`: **Placeholder reminder: Replace the block hash**

The command now uses a placeholder (`0xREPLACE_WITH_CORRECT_BLOCKHASH`). Ensure that the instructions clearly advise users to substitute this placeholder with the actual block hash. A brief note on how to obtain the correct block hash would improve clarity.

---

`159-164`: **Updated message payload example**

The concatenated payload now reflects the new expected format, with each segment clearly delineated. Consider reformatting the long payload (e.g., breaking it into multiple lines or using inline comments) to improve readability for users.

---

`168-174`: **Clarify instructions for constructing the access list**

This section does an excellent job detailing the two RPC methods available for obtaining the access list. However, the sentence on line 169 ends with an extraneous "and" that should be removed for clarity. Also, ensure it is clear how to extract the message hash from the logs.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 LanguageTool</summary>

[grammar] ~170-~170: Did you mean “admins”?
Context: ...ith the relay message tx. There are two admin RPC methods that can be used to constru...

(ARE_CD_NN)

</details>

</details>

---

`261-268`: **Updated relayMessage command with access list parameter**

The updated `cast send` command now includes the access list parameter, which aligns with the new relay requirements. All parameters, including the new access list, are clearly provided. For enhanced readability, consider splitting long command lines into shorter segments or adding inline comments explaining each part.

---

`170-170`: **Typographical note on admin RPC methods**

A static analysis hint flagged a potential grammar issue near line 170. While "admin_getAccessListByMsgHash" and "admin_getAccessListForIdentifier" are correct RPC method names, ensure that the descriptive sentence does not include an accidental trailing "and" after listing the methods.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 LanguageTool</summary>

[grammar] ~170-~170: Did you mean “admins”?
Context: ...ith the relay message tx. There are two admin RPC methods that can be used to constru...

(ARE_CD_NN)

</details>

</details>

---

`35-35`: **Style update for instructional tone**

The phrase "We'll perform the SuperchainERC20 interop transfer…" uses a personal pronoun. For documentation consistency, consider revising it to an imperative form (e.g., "Perform the SuperchainERC20 interop transfer…") to maintain a formal and direct instructional tone.

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: .coderabbit.yaml**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 7ab26c88813eea05dc60c83bb99f3638b508389b and a21101b7e4de935cc8c945e4bfdb9f7c84027e15.

</details>

<details>
<summary>📒 Files selected for processing (4)</summary>

* `pages/interop/tutorials/bridge-crosschain-eth.mdx` (1 hunks)
* `pages/interop/tutorials/relay-messages-cast.mdx` (4 hunks)
* `pages/interop/tutorials/relay-messages-viem.mdx` (4 hunks)
* `public/tutorials/transfer-eth.mts` (2 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (3)</summary>

* pages/interop/tutorials/bridge-crosschain-eth.mdx
* public/tutorials/transfer-eth.mts
* pages/interop/tutorials/relay-messages-viem.mdx

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>📓 Path-based instructions (1)</summary>

<details>
<summary>`**/*.mdx`: "ALWAYS review Markdown content THOROUGHLY with the following criteria:
- First, check the frontmatter section at the top of the file:
  1. For regular pages, ensure AL...</summary>

> `**/*.mdx`: "ALWAYS review Markdown content THOROUGHLY with the following criteria:
> - First, check the frontmatter section at the top of the file:
>   1. For regular pages, ensure ALL these fields are present and not empty:
>     ```yaml
>     ---
>     title: [non-empty]
>     lang: [non-empty]
>     description: [non-empty]
>     topic: [non-empty]
>     personas: [non-empty array]
>     categories: [non-empty array]
>     content_type: [valid type]
>     ---
>     ```
>   2. For landing pages (index.mdx or files with <Cards>), only these fields are required:
>     ```yaml
>     ---
>     title: [non-empty]
>     lang: [non-empty]
>     description: [non-empty]
>     topic: [non-empty]
>     ---
>     ```
>   3. If any required fields are missing or empty, comment:
>     'This file appears to be missing required metadata. Please check keywords.config.yaml for valid options and add the required fields manually. You can validate your changes by running:
>     ```bash
>     pnpm validate-metadata
>     ```'
> - Use proper nouns in place of personal pronouns like 'We' and 'Our' to maintain consistency in communal documentation.
> - Avoid gender-specific language and use the imperative form.
> - Monitor capitalization for emphasis. Avoid using all caps, italics, or bold for emphasis.
> - Ensure proper nouns are capitalized in sentences.
> - Apply the Oxford comma.
> - Use proper title case for buttons, tab names, page names, and links. Sentence case should be used for body content and short phrases, even in links.
> - Use correct spelling and grammar at all times (IMPORTANT).
> - For H1, H2, and H3 headers:
>   1. Use sentence case, capitalizing only the first word.
>   2. Preserve the capitalization of proper nouns, technical terms, and acronyms as defined in the 'nouns.txt' file located in the root directory of the project.
>   3. Do not automatically lowercase words that appear in the 'nouns.txt' file, regardless of their position in the header.
> - Flag any headers that seem to inconsistently apply these rules for manual review.
> - When reviewing capitalization, always refer to the 'nouns.txt' file for the correct capitalization of proper nouns and technical terms specific to the project.
> "
> 

- `pages/interop/tutorials/relay-messages-cast.mdx`

</details>

</details><details>
<summary>🪛 LanguageTool</summary>

<details>
<summary>pages/interop/tutorials/relay-messages-cast.mdx</summary>

[grammar] ~170-~170: Did you mean “admins”?
Context: ...ith the relay message tx. There are two admin RPC methods that can be used to constru...

(ARE_CD_NN)

</details>

</details>

</details>

<details>
<summary>🔇 Additional comments (5)</summary><blockquote>

<details>
<summary>pages/interop/tutorials/relay-messages-cast.mdx (5)</summary>

`1-21`: **Frontmatter Verification**

The frontmatter contains all required fields (title, description, lang, content_type, topic, personas, categories, is_imported_content). The metadata appears complete and correct.

---

`50-50`: **Function name correction to `sendERC20`**

The update correctly revises the function name from `sentERC20` to `sendERC20`, aligning with the intended updates. Ensure that any references in related documentation or tutorials are updated accordingly.

---

`103-105`: **Command syntax standardization for retrieving logs**

The updated `cast logs` command is now presented clearly without extraneous prefixes. Confirm that the RPC URL and address parameters remain correct for the target network.

---

`176-178`: **Example command using `admin_getAccessListByMsgHash`**

The command to retrieve the access list using the message hash is clearly presented. Please verify that the RPC URL (`http://localhost:8420`) is correct and appropriate for the intended network environment.

---

`182-215`: **Detailed example for access list retrieval via identifier**

The multi-line JSON command for `admin_getAccessListForIdentifier` is comprehensive and well structured. It clearly demonstrates the expected input and output. Ensure that users retain the formatting when copying the command in different shell environments.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-12T02:03:31Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 0**

<details>
<summary>🧹 Nitpick comments (1)</summary><blockquote>

<details>
<summary>pages/interop/tutorials/relay-messages-cast.mdx (1)</summary><blockquote>

`168-172`: **Improve access list construction description**  
There is a minor grammatical issue at the end of the sentence on line 169:  
> "There are two admin RPC methods that can be used to construct the access list: `admin_getAccessListByMsgHash` and `admin_getAccessListForIdentifier` and."  
  
Please remove the trailing "and" for clarity. For example:  

```diff
- An access list must be passed along with the relay message tx. There are two admin RPC methods that can be used to construct the access list: `admin_getAccessListByMsgHash` and `admin_getAccessListForIdentifier` and.
+ An access list must be passed along with the relay message tx. There are two admin RPC methods that can be used to construct the access list: `admin_getAccessListByMsgHash` and `admin_getAccessListForIdentifier`.
```

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 LanguageTool</summary>

[grammar] ~170-~170: Did you mean “admins”?
Context: ...ith the relay message tx. There are two admin RPC methods that can be used to constru...

(ARE_CD_NN)

</details>

</details>

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: .coderabbit.yaml**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between a21101b7e4de935cc8c945e4bfdb9f7c84027e15 and d587ca4aab9d6838f33a4c668c343fdacf59a5de.

</details>

<details>
<summary>📒 Files selected for processing (4)</summary>

* `pages/interop/tutorials/bridge-crosschain-eth.mdx` (2 hunks)
* `pages/interop/tutorials/relay-messages-cast.mdx` (4 hunks)
* `pages/interop/tutorials/relay-messages-viem.mdx` (4 hunks)
* `public/tutorials/transfer-eth.mts` (2 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (3)</summary>

* pages/interop/tutorials/bridge-crosschain-eth.mdx
* pages/interop/tutorials/relay-messages-viem.mdx
* public/tutorials/transfer-eth.mts

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>📓 Path-based instructions (1)</summary>

<details>
<summary>`**/*.mdx`: "ALWAYS review Markdown content THOROUGHLY with the following criteria:
- First, check the frontmatter section at the top of the file:
  1. For regular pages, ensure AL...</summary>

> `**/*.mdx`: "ALWAYS review Markdown content THOROUGHLY with the following criteria:
> - First, check the frontmatter section at the top of the file:
>   1. For regular pages, ensure ALL these fields are present and not empty:
>     ```yaml
>     ---
>     title: [non-empty]
>     lang: [non-empty]
>     description: [non-empty]
>     topic: [non-empty]
>     personas: [non-empty array]
>     categories: [non-empty array]
>     content_type: [valid type]
>     ---
>     ```
>   2. For landing pages (index.mdx or files with <Cards>), only these fields are required:
>     ```yaml
>     ---
>     title: [non-empty]
>     lang: [non-empty]
>     description: [non-empty]
>     topic: [non-empty]
>     ---
>     ```
>   3. If any required fields are missing or empty, comment:
>     'This file appears to be missing required metadata. Please check keywords.config.yaml for valid options and add the required fields manually. You can validate your changes by running:
>     ```bash
>     pnpm validate-metadata
>     ```'
> - Use proper nouns in place of personal pronouns like 'We' and 'Our' to maintain consistency in communal documentation.
> - Avoid gender-specific language and use the imperative form.
> - Monitor capitalization for emphasis. Avoid using all caps, italics, or bold for emphasis.
> - Ensure proper nouns are capitalized in sentences.
> - Apply the Oxford comma.
> - Use proper title case for buttons, tab names, page names, and links. Sentence case should be used for body content and short phrases, even in links.
> - Use correct spelling and grammar at all times (IMPORTANT).
> - For H1, H2, and H3 headers:
>   1. Use sentence case, capitalizing only the first word.
>   2. Preserve the capitalization of proper nouns, technical terms, and acronyms as defined in the 'nouns.txt' file located in the root directory of the project.
>   3. Do not automatically lowercase words that appear in the 'nouns.txt' file, regardless of their position in the header.
> - Flag any headers that seem to inconsistently apply these rules for manual review.
> - When reviewing capitalization, always refer to the 'nouns.txt' file for the correct capitalization of proper nouns and technical terms specific to the project.
> "
> 

- `pages/interop/tutorials/relay-messages-cast.mdx`

</details>

</details><details>
<summary>🪛 LanguageTool</summary>

<details>
<summary>pages/interop/tutorials/relay-messages-cast.mdx</summary>

[grammar] ~170-~170: Did you mean “admins”?
Context: ...ith the relay message tx. There are two admin RPC methods that can be used to constru...

(ARE_CD_NN)

</details>

</details>

</details>

<details>
<summary>🔇 Additional comments (7)</summary><blockquote>

<details>
<summary>pages/interop/tutorials/relay-messages-cast.mdx (7)</summary>

`1-21`: **Frontmatter metadata is complete and well-formatted**  
The frontmatter includes all required fields (title, lang, description, topic, personas, categories, content_type) with appropriate non-empty values. No changes are needed here.

---

`50-50`: **Corrected function name usage**  
The change to use `sendERC20` instead of the outdated `sentERC20` correctly reflects the updated method signature.

---

`101-107`: **Updated log retrieval command and sample output**  
The `cast logs` command has been updated (removing any extraneous prefixes) and the sample output now shows the new log details. This improves clarity for users retrieving logs from the `L2ToL2CrossDomainMessenger` contract.

---

`131-133`: **Clear placeholder usage for block hash**  
The command using `0xREPLACE_WITH_CORRECT_BLOCKHASH` clearly indicates that users must replace the placeholder with the actual block hash. This is appropriate for tutorial guidance.

---

`159-164`: **Accurate message payload formatting**  
The sample output illustrating the concatenated payload (topics and data) reflects the updated message structure accurately. This ensures users can correctly form the message identifier payload.

---

`176-195`: **Clear instructions for retrieving the access list (admin_getAccessListByMsgHash)**  
The segment detailing how to call `admin_getAccessListByMsgHash` is well-organized. The command and the accompanying sample output clearly demonstrate the expected structure of the access list, matching the tutorial’s updated procedure.

---

`261-268`: **Updated relayMessage transaction command**  
The final command now appropriately includes the `--access-list` parameter alongside the relay message call. This update correctly reflects the new parameters required by `L2ToL2CrossDomainMessenger.relayMessage` and is clearly presented.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-12T02:08:23Z
user: login: krofax
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-14T12:00:42Z

Review comments:
diff_hunk: @@ -121,21 +119,20 @@ await opChainAClient.waitForTransactionReceipt({ hash: mintTxHash });
 // 2. Initiate sendERC20 tx to bridge funds to chain B
 
 console.log("Initiating sendERC20 on OPChainA to OPChainB...");
-const sendERC20TxHash = await opChainAClient.writeContract({
-	address: SUPERCHAIN_TOKEN_BRIDGE_ADDRESS,
-	abi: parseAbi([
-		"function sendERC20(address _token, address _to, uint256 _amount, uint256 _chainId)",
-	]),
-	functionName: "sendERC20",
-	args: [L2_NATIVE_SUPERCHAINERC20_ADDRESS, account.address, 1000n, BigInt(supersimL2B.id)],
+const sendERC20TxHash = await opChainAClient.interop.sendSuperchainERC20({
+	tokenAddress: SUPERSIM_SUPERC20_ADDRESS,
+	to: testAccount.address,
+        amount: AMOUNT_TO_SEND,
+        chainId: supersimL2B.id,
 });
 
 const sendERC20Receipt = await opChainAClient.waitForTransactionReceipt({ hash: sendERC20TxHash });
 
 // 3. Construct the interoperable log data from the sent message
 
-const { sentMessages } = await createInteropSentL2ToL2Messages(opChainAClient, { receipt: sendERC20Receipt })
+const sentMessages = await opChainAClient.interop.getCrossDomainMessages({ logs: sendERC20Receipt.logs })
 const sentMessage = sentMessages[0] // We only sent 1 message
+const relayMessageParams = await publicClientA.interop.buildExecutingMessage({ log: sentMessage.log })
path: pages/interop/tutorials/relay-messages-viem.mdx
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Improved message retrieval implementation.**

The updated approach uses `getCrossDomainMessages` to directly retrieve messages from transaction logs, followed by `buildExecutingMessage` to construct the relay parameters.


There's an inconsistency in the client variable name. The code uses `publicClientA` on line 135, but this variable is not defined earlier in the tutorial. It should be `opChainAClient` to match the client defined on lines 85-91.

```diff
const sentMessages = await opChainAClient.interop.getCrossDomainMessages({ logs: sendERC20Receipt.logs })
const sentMessage = sentMessages[0] // We only sent 1 message
-const relayMessageParams = await publicClientA.interop.buildExecutingMessage({ log: sentMessage.log })
+const relayMessageParams = await opChainAClient.interop.buildExecutingMessage({ log: sentMessage.log })
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
const sentMessages = await opChainAClient.interop.getCrossDomainMessages({ logs: sendERC20Receipt.logs })
const sentMessage = sentMessages[0] // We only sent 1 message
const relayMessageParams = await opChainAClient.interop.buildExecutingMessage({ log: sentMessage.log })
`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-04-12T01:53:13Z
author_association: CONTRIBUTOR
diff_hunk: @@ -250,22 +242,21 @@ await opChainAClient.waitForTransactionReceipt({ hash: mintTxHash });
 
 // 2. Initiate sendERC20 tx to bridge funds to chain B
 
-console.log("Initiating sendERC20 on OPChainA...");
-const sendERC20TxHash = await opChainAClient.writeContract({
-	address: SUPERCHAIN_TOKEN_BRIDGE_ADDRESS,
-	abi: parseAbi([
-		"function sendERC20(address _token, address _to, uint256 _amount, uint256 _chainId)",
-	]),
-	functionName: "sendERC20",
-	args: [L2_NATIVE_SUPERCHAINERC20_ADDRESS, account.address, 1000n, BigInt(supersimL2B.id)],
+console.log("Initiating sendERC20 on OPChainA to OPChainB...");
+const sendERC20TxHash = await opChainAClient.interop.sendSuperchainERC20({
+	tokenAddress: SUPERSIM_SUPERC20_ADDRESS,
+	to: testAccount.address,
+        amount: AMOUNT_TO_SEND,
+        chainId: supersimL2B.id,
 });
 
 const sendERC20Receipt = await opChainAClient.waitForTransactionReceipt({ hash: sendERC20TxHash });
 
 // 3. Construct the interoperable log data from the sent message
 
-const { sentMessages } = await createInteropSentL2ToL2Messages(opChainAClient, { receipt: sendERC20Receipt })
+const sentMessages = await opChainAClient.interop.getCrossDomainMessages({ logs: sendERC20Receipt.logs })
 const sentMessage = sentMessages[0] // We only sent 1 message
+const relayMessageParams = await publicClientA.interop.buildExecutingMessage({ log: sentMessage.log })
path: pages/interop/tutorials/relay-messages-viem.mdx
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Inconsistent client variable in full code snippet.**

The same inconsistency with the client variable name appears in the full code snippet.


```diff
const sentMessages = await opChainAClient.interop.getCrossDomainMessages({ logs: sendERC20Receipt.logs })
const sentMessage = sentMessages[0] // We only sent 1 message
-const relayMessageParams = await publicClientA.interop.buildExecutingMessage({ log: sentMessage.log })
+const relayMessageParams = await opChainAClient.interop.buildExecutingMessage({ log: sentMessage.log })
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
const sentMessages = await opChainAClient.interop.getCrossDomainMessages({ logs: sendERC20Receipt.logs })
const sentMessage = sentMessages[0] // We only sent 1 message
const relayMessageParams = await opChainAClient.interop.buildExecutingMessage({ log: sentMessage.log })
`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-04-12T01:53:13Z
author_association: CONTRIBUTOR

PR comments:
user: login: tremarkley
created_at: 2025-04-12T01:43:35Z
body: * **#1569** <a href="https://app.graphite.dev/github/pr/ethereum-optimism/docs/1569?utm_source=stack-comment-icon" target="_blank"><img src="https://static.graphite.dev/graphite-32x32-black.png" alt="Graphite" width="10px" height="10px"/></a> 👈 <a href="https://app.graphite.dev/github/pr/ethereum-optimism/docs/1569?utm_source=stack-comment-view-in-graphite" target="_blank">(View in Graphite)</a>
* `main`


<h2></h2>

This stack of pull requests is managed by <a href="https://graphite.dev?utm-source=stack-comment"><b>Graphite</b></a>. Learn more about <a href="https://stacking.dev/?utm_source=stack-comment">stacking</a>.
<!-- Current dependencies on/for this PR: -->
author_association: CONTRIBUTOR
user: login: netlify[bot]
created_at: 2025-04-12T01:43:38Z
body: ### <span aria-hidden="true">✅</span> Deploy Preview for *docs-optimism* ready!


|  Name | Link |
|:-:|------------------------|
|<span aria-hidden="true">🔨</span> Latest commit | bda418b891b72ed2f7dc78f75b14c68898317857 |
|<span aria-hidden="true">🔍</span> Latest deploy log | https://app.netlify.com/sites/docs-optimism/deploys/67f9cbd9f655ab0008212d0e |
|<span aria-hidden="true">😎</span> Deploy Preview | [https://deploy-preview-1569--docs-optimism.netlify.app](https://deploy-preview-1569--docs-optimism.netlify.app) |
|<span aria-hidden="true">📱</span> Preview on mobile | <details><summary> Toggle QR Code... </summary><br /><br />![QR Code](https://app.netlify.com/qr-code/eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1cmwiOiJodHRwczovL2RlcGxveS1wcmV2aWV3LTE1NjktLWRvY3Mtb3B0aW1pc20ubmV0bGlmeS5hcHAifQ.HRBLNbCRVsdv88HPZ5a2XMGqpDVrkLn-C_iSvSDomMw)<br /><br />_Use your smartphone camera to open QR code link._</details> |
---
<!-- [docs-optimism Preview](https://deploy-preview-1569--docs-optimism.netlify.app) -->
_To edit notification comments on pull requests, go to your [Netlify site configuration](https://app.netlify.com/sites/docs-optimism/configuration/notifications#deploy-webhooks)._
author_association: NONE
user: login: coderabbitai[bot]
created_at: 2025-04-12T01:46:12Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- This is an auto-generated comment: rate limited by coderabbit.ai -->

> [!WARNING]
> ## Rate limit exceeded
> 
> @tremarkley has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait **8 minutes and 42 seconds** before requesting another review.
> 
> <details>
> <summary>⌛ How to resolve this issue?</summary>
> 
> After the wait time has elapsed, a review can be triggered using the `@coderabbitai review` command as a PR comment. Alternatively, push new commits to this PR.
> 
> We recommend that you space out your commits to avoid hitting the rate limit.
> 
> </details>
> 
> 
> <details>
> <summary>🚦 How do rate limits work?</summary>
> 
> CodeRabbit enforces hourly rate limits for each developer per organization.
> 
> Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.
> 
> Please see our [FAQ](https://docs.coderabbit.ai/faq) for further information.
> 
> </details>
> 
> <details>
> <summary>📥 Commits</summary>
> 
> Reviewing files that changed from the base of the PR and between d587ca4aab9d6838f33a4c668c343fdacf59a5de and bda418b891b72ed2f7dc78f75b14c68898317857.
> 
> </details>
> 
> <details>
> <summary>📒 Files selected for processing (4)</summary>
> 
> * `pages/interop/tutorials/bridge-crosschain-eth.mdx` (2 hunks)
> * `pages/interop/tutorials/relay-messages-cast.mdx` (4 hunks)
> * `pages/interop/tutorials/relay-messages-viem.mdx` (4 hunks)
> * `public/tutorials/transfer-eth.mts` (2 hunks)
> 
> </details>

<!-- end of auto-generated comment: rate limited by coderabbit.ai -->
<!-- walkthrough_start -->

<details>
<summary>📝 Walkthrough</summary>

## Walkthrough

The pull request updates several tutorials related to interop message relaying in a blockchain context. The modifications include improvements in text formatting and consistency, correction of function names (e.g., changing `sentERC20` to `sendERC20`), and fixes in URL encoding. Functionality changes detail the removal of legacy functions used to create and decode interop messages and introduce new approaches that directly retrieve cross-domain messages via methods such as `getCrossDomainMessages` and build relay parameters using `buildExecutingMessage`. The relay operations now utilize the updated `relayCrossDomainMessage` method and include an access list parameter where necessary. Additionally, example outputs, logs, block information, and transaction parameters (including the use of BigInt for ERC20 transfers) have been updated to reflect the latest expected behavior.

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant U as User
    participant WA as Source Wallet (Chain A)
    participant CA as Chain A Interop Contract
    participant API_A as opChainAClient
    participant WB as Destination Wallet (Chain B)
    participant CB as Chain B Interop Contract
    participant API_B as opChainBClient

    U->>WA: Initiate ERC20 transfer (sendSuperchainERC20)
    WA->>CA: Submit transaction on Source Chain
    CA-->>WA: Emit transaction logs
    WA->>API_A: Call getCrossDomainMessages(logs)
    API_A-->>WA: Return cross-domain message details
    WA->>WA: Build execution parameters (buildExecutingMessage)
    WA->>WB: Forward relay message parameters
    WB->>CB: Execute relayCrossDomainMessage(parameters)
    CB-->>WB: Process relay and return confirmation
    WB->>API_B: (Optionally) Check message status (getCrossDomainMessageStatus)
    API_B-->>WB: Return message status
```

## Assessment against linked issues

| Objective                                                   | Addressed | Explanation |
|------------------------------------------------------------|-----------|-------------|
| Update the example in the optimism docs to use the new validation mechanism introduced with #214 | ✅         |             |

</details>

<!-- walkthrough_end -->
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- tips_start -->

---



<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=ethereum-optimism/docs&utm_content=1569):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Generate unit testing code for this file.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai generate unit testing code for this file.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and generate unit testing code.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai plan` to trigger planning for file edits and PR creation.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: CONTRIBUTOR