Repository: ethereum-optimism/docs
Pull request #1596: Audit of `SuperchainERC20` transfer tutorial
Author: login: qbzzt
Created: 2025-05-01T14:36:24Z | Merged: 2025-05-14T15:40:24Z

**Description**

The major difference is support for Supersim.

**Tests**

N/A

**Additional context**

N/A

**Metadata**

N/A


Diff:
diff --git a/pages/interop/tutorials/transfer-superchainERC20.mdx b/pages/interop/tutorials/transfer-superchainERC20.mdx
index 52542ac5a..81c6dd05b 100644
--- a/pages/interop/tutorials/transfer-superchainERC20.mdx
+++ b/pages/interop/tutorials/transfer-superchainERC20.mdx
@@ -21,7 +21,7 @@ categories:
 is_imported_content: 'false'
 ---
 
-import { Callout, Steps } from 'nextra/components'
+import { Callout, Steps, Tabs } from 'nextra/components'
 import { AutorelayCallout } from '@/components/AutorelayCallout'
 
 <Callout>
@@ -45,110 +45,144 @@ Note that this tutorial provides step-by-step instructions for transferring `Sup
   Cross-chain transfers cannot be reversed.
 </Callout>
 
-### What you'll build
-
-*   A TypeScript application to transfer `SuperchainERC20` tokens between chains
+<details>
+  <summary>About this tutorial</summary>
 
-### What you'll learn
+  **What you'll learn**
 
-*   How to send `SuperchainERC20` tokens on the blockchain and between blockchains
-*   How to relay messages between chains
+  *   How to send `SuperchainERC20` tokens on the blockchain and between blockchains
+  *   How to relay messages between chains
 
-## Prerequisites
+  **Technical knowledge**
 
-Before starting this tutorial, ensure your development environment meets the following requirements:
+  *   Intermediate TypeScript knowledge
+  *   Understanding of smart contract development
+  *   Familiarity with blockchain concepts
 
-### Technical knowledge
+  **Development environment**
 
-*   Intermediate TypeScript knowledge
-*   Understanding of smart contract development
-*   Familiarity with blockchain concepts
+  *   Unix-like operating system (Linux, macOS, or WSL for Windows)
+  *   Node.js version 16 or higher
+  *   Git for version control
 
-### Development environment
+  **Required tools**
 
-*   Unix-like operating system (Linux, macOS, or WSL for Windows)
-*   Node.js version 16 or higher
-*   Git for version control
+  The tutorial uses these primary tools:
 
-### Required tools
+  *   Node: For running TypeScript code from the command line
+  *   Viem: For blockchain interaction
+</details>
 
-The tutorial uses these primary tools:
+### What you'll build
 
-*   Foundry: For issuing transactions
-*   TypeScript: For implementation
-*   Node: For running TypeScript code from the command line
-*   Viem: For blockchain interaction
+*   Commands to transfer `SuperchainERC20` tokens between chains
+*   A TypeScript application to transfer `SuperchainERC20` tokens between chains
 
 ## Directions
 
 <Steps>
   ### Preparation
 
-  You need onchain `SuperchainERC20` tokens.
-  You can [deploy your own token](./deploy-superchain-erc20), but in this tutorial we will use [`CustomSuperchainToken`](https://sid.testnet.routescan.io/address/0xF3Ce0794cB4Ef75A902e07e5D2b75E4D71495ee8),  existing `SuperchainERC20` token on the [Interop devnet](/interop/tools/devnet).
+  1.  If you are using Supersim, setup the [SuperchainERC20 starter kit](/app-developers/starter-kit#setup).
+      The `pnpm dev` step also starts Supersim.
 
-  1.  Create environment variables for the RPC endpoints for the blockchains and the token address.
+  2.  Store the configuration in environment variables.
 
-      ```sh
-      RPC_DEV0=https://interop-alpha-0.optimism.io
-      RPC_DEV1=https://interop-alpha-1.optimism.io
-      TOKEN_ADDRESS=0xF3Ce0794cB4Ef75A902e07e5D2b75E4D71495ee8
-      ```
+      <Tabs items={['Supersim', 'Devnets']}>
+        <Tabs.Tab>
+          ```sh
+          PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
+          USER_ADDRESS=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
+          URL_CHAIN_A=http://127.0.0.1:9545
+          URL_CHAIN_B=http://127.0.0.1:9546
+          CHAIN_B_ID=`cast chain-id --rpc-url $URL_CHAIN_B`            
+          TOKEN_ADDRESS=`cat superchainerc20-starter/packages/contracts/broadcast/multi/SuperchainERC20Deployer.s.sol-latest/run.json | jq --raw-output .deployments[0].transactions[0].contractAddress`
+          ```
+        </Tabs.Tab>
 
-  2.  Set `PRIVATE_KEY` to the private key of an address that has [Sepolia ETH](https://cloud.google.com/application/web3/faucet/ethereum/sepolia).
+        <Tabs.Tab>
+          1.  Set `PRIVATE_KEY` to the private key for an address that has ETH on the two devnets.
 
-      ```sh
-      export PRIVATE_KEY=0x<private key here>
-      MY_ADDRESS=`cast wallet address $PRIVATE_KEY`
-      ```
+          2.  Run these commands to specify the rest of the environment variables.
 
-  3.  Send ETH to the two L2 blockchains.
+          ```sh
+          USER_ADDRESS=`cast wallet address --private-key $PRIVATE_KEY`
+          URL_CHAIN_A=https://interop-alpha-0.optimism.io
+          URL_CHAIN_B=https://interop-alpha-1.optimism.io
+          CHAIN_B_ID=`cast chain-id --rpc-url $URL_CHAIN_B`            
+          TOKEN_ADDRESS=0x0FAe7deDb9CfC2d8288d432B85998e6b263F3A72
+          ```
+        </Tabs.Tab>
+      </Tabs>
 
-      ```sh
-      cast send --rpc-url https://endpoints.omniatech.io/v1/eth/sepolia/public --private-key $PRIVATE_KEY --value 0.02ether 0x7385d89d38ab79984e7c84fab9ce5e6f4815468a
-      cast send --rpc-url https://endpoints.omniatech.io/v1/eth/sepolia/public --private-key $PRIVATE_KEY --value 0.02ether 0x55f5c4653dbcde7d1254f9c690a5d761b315500c
-      ```
+  3.  Obtain tokens on chain A.
 
-  4.  Wait a few minutes until you can see the ETH [on the block explorer](https://sid.testnet.routescan.io/) for your address.
+      <Tabs items={['Supersim', 'Devnets']}>
+        <Tabs.Tab>
+          ```sh
+          ONE=`echo 1 | cast to-wei`
+          cast send $TOKEN_ADDRESS "mintTo(address,uint256)" $USER_ADDRESS $ONE --private-key $PRIVATE_KEY --rpc-url $URL_CHAIN_A
+          ```
+        </Tabs.Tab>
+
+        <Tabs.Tab>
+          ```sh
+          cast send $TOKEN_ADDRESS "faucet()" --private-key $PRIVATE_KEY --rpc-url $URL_CHAIN_A
+          ```
+        </Tabs.Tab>
+      </Tabs>
 
       <details>
         <summary>Sanity check</summary>
 
-        Check the ETH balance of your address on both blockchains.
+        Check that you have at least one token on chain A.
 
         ```sh
-        cast balance --ether $MY_ADDRESS --rpc-url $RPC_DEV0
-        cast balance --ether $MY_ADDRESS --rpc-url $RPC_DEV1
+        cast call $TOKEN_ADDRESS "balanceOf(address)" $USER_ADDRESS --rpc-url $URL_CHAIN_A | cast from-wei
         ```
       </details>
 
-  5.  Obtain tokens on Interop devnet 0.
-      When using `CustomSuperchainToken`, there are two ways to do this:
+  ### Transfer tokens using the command line
 
-      *   Use the [block explorer](https://sid.testnet.routescan.io/address/0xF3Ce0794cB4Ef75A902e07e5D2b75E4D71495ee8/contract/420120000/writeContract?chainid=420120000) and a browser wallet to run the [faucet](https://sid.testnet.routescan.io/address/0xF3Ce0794cB4Ef75A902e07e5D2b75E4D71495ee8/contract/420120000/writeContract?chainid=420120000#F6) function.
+  1.  Specify configuration variables.
 
-      *   Use `cast` to call the `faucet` function.
+      ```sh
+      TENTH=`echo 0.1 | cast to-wei`
+      INTEROP_BRIDGE=0x4200000000000000000000000000000000000028      
+      ```
 
-          ```sh
-          cast send --rpc-url $RPC_DEV0 --private-key $PRIVATE_KEY $TOKEN_ADDRESS "faucet()"
-          ```
+  2.  See your balance on both blockchains.
 
-      <details>
-        <summary>Sanity check</summary>
+      ```sh
+      cast call $TOKEN_ADDRESS "balanceOf(address)" $USER_ADDRESS --rpc-url $URL_CHAIN_A | cast from-wei
+      cast call $TOKEN_ADDRESS "balanceOf(address)" $USER_ADDRESS --rpc-url $URL_CHAIN_B | cast from-wei      
+      ```
 
-        Run this command to check your token balance.
+  3.  Call [`SuperchainTokenBridge`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/SuperchainTokenBridge.sol) to transfer tokens.
 
-        ```sh
-        cast call --rpc-url $RPC_DEV0 $TOKEN_ADDRESS "balanceOf(address)" $MY_ADDRESS | cast --from-wei
-        ```
-      </details>
+      ```sh
+      cast send $INTEROP_BRIDGE "sendERC20(address,address,uint256,uint256)" $TOKEN_ADDRESS $USER_ADDRESS $TENTH $CHAIN_B_ID --private-key $PRIVATE_KEY --rpc-url $URL_CHAIN_A
+      ```
+
+  4.  See your balance on both blockchains.
+
+      ```sh
+      cast call $TOKEN_ADDRESS "balanceOf(address)" $USER_ADDRESS --rpc-url $URL_CHAIN_A | cast from-wei
+      cast call $TOKEN_ADDRESS "balanceOf(address)" $USER_ADDRESS --rpc-url $URL_CHAIN_B | cast from-wei      
+      ```
 
   ### Transfer tokens using TypeScript
 
   We are going to use a [Node](https://nodejs.org/en) project, to be able to use [`@eth-optimism/viem`](https://www.npmjs.com/package/@eth-optimism/viem) to send the executing message.
   We use [TypeScript](https://www.typescriptlang.org/) to have [type safety](https://en.wikipedia.org/wiki/Type_safety) combined with JavaScript functionality.
 
-  1.  Initialize a new Node project.
+  1.  Export environment variables
+
+      ```sh
+      export PRIVATE_KEY TOKEN_ADDRESS CHAIN_B_ID
+      ```
+
+  2.  Initialize a new Node project.
 
       ```sh
       mkdir xfer-erc20
@@ -158,69 +192,25 @@ The tutorial uses these primary tools:
       mkdir src
       ```
 
-  2.  Edit `package.json` to add the `start` script.
-
-      ```json
-      {
-        "name": "xfer-erc20",
-        "version": "1.0.0",
-        "main": "index.js",
-        "scripts": {
-          "test": "echo \"Error: no test specified\" && exit 1",
-          "start": "tsx src/xfer-erc20.mts"
-        },
-        "keywords": [],
-        "author": "",
-        "license": "ISC",
-        "type": "module",
-        "description": "",
-        "devDependencies": {
-          "@eth-optimism/viem": "^0.3.2",
-          "@types/node": "^22.13.4",
-          "tsx": "^4.19.3",
-          "viem": "^2.23.3"
-        }
-      }      
-      ```
-
   3.  Create `src/xfer-erc20.mts`:
 
-      ```typescript file=<rootDir>/public/tutorials/xfer-erc20.mts hash=26d412ead555cdd59c16676a4dcd91e8
+      ```typescript file=<rootDir>/public/tutorials/xfer-erc20.mts hash=2964a6dcafacb8b7dc1e115a54fb3b7c
       ```
 
       <details>
         <summary>Explanation of `xfer-erc20.mts`</summary>
 
-        ```typescript file=<rootDir>/public/tutorials/xfer-erc20.mts#L79-L84 hash=5084a0cf4064dc7cfaf1cf0f88e1f2d1
+        ```typescript file=<rootDir>/public/tutorials/xfer-erc20.mts#L76-L81 hash=b144852a4fa9ae45e79ec6f124e48e79
         ```
 
         Use `@eth-optimism/viem`'s `walletActionsL2().sendSuperchainERC20` to send the `SuperchainERC20` tokens.
         Internally, this function calls [`SuperchainTokenBridge.sendERC20`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/SuperchainTokenBridge.sol#L52-L78) to send the tokens.
-
-        <AutorelayCallout />
-
-        ```typescript file=<rootDir>/public/tutorials/xfer-erc20.mts#L88-L90 hash=b353aebabd92c4af52858461d18fe8cd 
-        ```
-
-        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/xfer-erc20.mts#L92-L94 hash=47d2387a65e4a5f5dbfa98868c2c5abc 
-        ```
-
-        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/xfer-erc20.mts#L96-L99 hash=4cf177987a894a8cb58ae5a3e9d731e8 
-        ```
-
-        This is how you use `@eth-optimism/viem` to create an executing message.
       </details>
 
-  4.  Run the TypeScript program, and see the change in your `CustomSuperchainToken` balances.
+  4.  Run the TypeScript program, and see the change in your token balances.
 
       ```sh
-      npm start
+      pnpm tsx src/xfer-erc20.mts
       ```
 </Steps>
 
diff --git a/public/tutorials/xfer-erc20.mts b/public/tutorials/xfer-erc20.mts
index b27966a9c..a9b911505 100644
--- a/public/tutorials/xfer-erc20.mts
+++ b/public/tutorials/xfer-erc20.mts
@@ -3,14 +3,14 @@ import {
     http,
     publicActions,
     getContract,
-    Address,
 } from 'viem'
 import { privateKeyToAccount } from 'viem/accounts'
-import { interopAlpha0, interopAlpha1 } from '@eth-optimism/viem/chains'
-
+import { interopAlpha0, interopAlpha1, supersimL2A, supersimL2B } from '@eth-optimism/viem/chains'
 import { walletActionsL2, publicActionsL2 } from '@eth-optimism/viem'
 
-const tokenAddress = "0xF3Ce0794cB4Ef75A902e07e5D2b75E4D71495ee8"
+const tokenAddress = process.env.TOKEN_ADDRESS
+const useSupersim = process.env.CHAIN_B_ID == "902"
+
 const balanceOf = {
     "constant": true,
     "inputs": [{
@@ -30,15 +30,15 @@ const balanceOf = {
 const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`)
 
 const wallet0 = createWalletClient({
-    chain: interopAlpha0,
+    chain: useSupersim ? supersimL2A : interopAlpha0,
     transport: http(),
     account
 }).extend(publicActions)
-    .extend(publicActionsL2())
+//    .extend(publicActionsL2())
     .extend(walletActionsL2())
  
 const wallet1 = createWalletClient({
-    chain: interopAlpha1,
+    chain: useSupersim ? supersimL2B : interopAlpha1,
     transport: http(),
     account
 }).extend(publicActions)
@@ -70,6 +70,7 @@ Address: ${account.address}
 `)
 }
 
+console.log("Initial balances")
 await reportBalances()
 
 const sendTxnHash = await wallet0.interop.sendSuperchainERC20({
@@ -79,26 +80,15 @@ const sendTxnHash = await wallet0.interop.sendSuperchainERC20({
     chainId: wallet1.chain.id
 })
 
-console.log(`Send transaction: https://sid.testnet.routescan.io/tx/${sendTxnHash}`)
-
-const sendTxnReceipt = await wallet0.waitForTransactionReceipt({
+console.log(`Send transaction: ${sendTxnHash}`)
+await wallet0.waitForTransactionReceipt({
     hash: sendTxnHash
 })
 
-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
-})
+console.log("Immediately after the transaction is processed")
+await reportBalances()
 
-console.log(`Relay transaction: https://sid.testnet.routescan.io/tx/${relayTxnHash}`)
+await new Promise(resolve => setTimeout(resolve, 5000));
 
+console.log("After waiting (hopefully, until the message is relayed)")
 await reportBalances()
diff --git a/words.txt b/words.txt
index bec3d2011..7099c8818 100644
--- a/words.txt
+++ b/words.txt
@@ -79,6 +79,7 @@ Comprensive
 COMPUTEPENDINGBLOCK
 computependingblock
 confs
+command
 Consen
 corsdomain
 counterfactually


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

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

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

`37-37`: **Commented out code**

There's a commented-out extension of `publicActionsL2()`. Consider either removing it completely or adding a comment explaining why it's commented out.

```diff
-//    .extend(publicActionsL2())
+    // publicActionsL2() is not needed for this example
```

Or remove it entirely if it's no longer needed.

</blockquote></details>
<details>
<summary>pages/interop/tutorials/transfer-superchainERC20.mdx (1)</summary><blockquote>

`94-94`: **Hardcoded private keys in documentation**

The static analysis tool flagged hardcoded private keys. While these appear to be example local development keys (the default key from Hardhat), it's a best practice to use more obvious placeholder text in documentation.

```diff
-PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
+PRIVATE_KEY=<YOUR_PRIVATE_KEY> # Replace with your actual private key
```

And similarly for the other private key usage in the documentation.


Also applies to: 113-113

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

<details>
<summary>🪛 Gitleaks (8.21.2)</summary>

94-94: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

</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 bba53f802e14f9d9705de705835029c9a82cb131 and 21efea272263a9856d9e60cd16ac7b14484f1456.

</details>

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

* `pages/interop/tutorials/transfer-superchainERC20.mdx` (3 hunks)
* `public/tutorials/xfer-erc20.mts` (4 hunks)
* `words.txt` (1 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/transfer-superchainERC20.mdx`

</details>

</details><details>
<summary>🪛 Gitleaks (8.21.2)</summary>

<details>
<summary>pages/interop/tutorials/transfer-superchainERC20.mdx</summary>

94-94: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

---

113-113: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

</details>

</details>

</details>

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

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

</details>

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

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

`8-8`: **Added support for Supersim chains**

Good addition of the supersimL2A and supersimL2B chains to support the Supersim environment mentioned in the PR objective.

---

`11-12`: **Improved configuration with environment variables**

Using environment variables for configuration is a good practice. It allows the script to be more flexible and work with different environments without code changes.

---

`33-33`: **Chain selection based on environment variable**

The conditional chain selection based on the CHAIN_B_ID environment variable is a good improvement that enables the script to work with both Supersim and interopAlpha environments.

---

`91-91`: **Simplified message relay handling**

The code now uses a simple timeout instead of explicitly handling the relay transaction. This simplification makes the code more readable, but it relies on a fixed delay which might not be reliable in all network conditions.

Consider implementing a polling mechanism to check for balance changes rather than relying on a fixed delay:

```diff
-await new Promise(resolve => setTimeout(resolve, 5000));
+// Poll for balance change up to 30 seconds
+const startTime = Date.now();
+const timeout = 30000; // 30 seconds
+while (Date.now() - startTime < timeout) {
+  await new Promise(resolve => setTimeout(resolve, 1000)); // Check every second
+  const newBalance1 = await token1.read.balanceOf([account.address]);
+  if (newBalance1 > balance1) {
+    console.log("Message relayed successfully");
+    break;
+  }
+}
```

</details>
<details>
<summary>pages/interop/tutorials/transfer-superchainERC20.mdx (6)</summary>

`24-24`: **Updated imports to include Tabs component**

The addition of the Tabs component allows for better organization of content for different environments.

---

`48-74`: **Enhanced tutorial introduction with collapsible details**

The addition of a comprehensive "About this tutorial" section with learning objectives, technical knowledge requirements, and development environment setup improves the tutorial's clarity.

---

`91-116`: **Improved environment variable setup with tabbed interface**

The tabbed interface separating Supersim and Devnets configurations is much clearer and helps users follow the appropriate instructions for their environment.

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

<details>
<summary>🪛 Gitleaks (8.21.2)</summary>

94-94: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

---

113-113: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

</details>

</details>

---

`147-172`: **Clear step-by-step instructions for command-line transfer**

The updated command-line transfer instructions with explicit configuration and balance checking steps are much clearer and more comprehensive.

---

`179-183`: **Added explicit environment variable export step**

Good addition of an explicit step to export the required environment variables before running the TypeScript program. This helps ensure that the script has access to the necessary configuration.

---

`213-213`: **Updated command to use pnpm instead of npm**

The command to run the TypeScript program has been updated to use `pnpm tsx` which is more consistent with the project's package manager choice.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-01T14:39:10Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 0**

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

<details>
<summary>pages/interop/tutorials/transfer-superchainERC20.mdx (4)</summary><blockquote>

`24-25`: **Remove unused import**  
The `AutorelayCallout` import on line 25 is not used anywhere in this document. Consider removing it to clean up the imports.

---

`94-94`: **Clarify test private key usage**  
The example Supersim private key shown here is a well-known local development key. Add a note emphasizing that this key is for local testing only and must never be used in production environments.

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

<details>
<summary>🪛 Gitleaks (8.21.2)</summary>

94-94: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

</details>

</details>

---

`176-177`: **Use imperative voice instead of personal pronouns**  
Lines 176–177 use “We are going to use” and “We use”. For a consistent tutorial tone, rephrase in the imperative (e.g., “Use a Node project…” and “TypeScript provides type safety…”).

---

`191-191`: **Correct npm install flag**  
The command on line 191 uses `npm install --save-dev -y …`, but `-y` is not a valid flag for `npm install` (it’s typically used with `npm init`). Remove `-y` to avoid unexpected errors.

</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 21efea272263a9856d9e60cd16ac7b14484f1456 and bebbc92f37c6f220a68b56f1f08844404c2b9d3d.

</details>

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

* `pages/interop/tutorials/transfer-superchainERC20.mdx` (3 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/transfer-superchainERC20.mdx`

</details>

</details><details>
<summary>🪛 Gitleaks (8.21.2)</summary>

<details>
<summary>pages/interop/tutorials/transfer-superchainERC20.mdx</summary>

94-94: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

---

113-113: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

</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 (1)</summary><blockquote>

<details>
<summary>pages/interop/tutorials/transfer-superchainERC20.mdx (1)</summary>

`1-22`: **Frontmatter validation**  
The frontmatter includes all required fields (title, lang, description, topic, personas, categories, content_type) and they are all non-empty and correctly populated.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-05T13:49:27Z
user: login: krofax
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-06T21:06:27Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 0**

<details>
<summary>🔭 Outside diff range comments (1)</summary><blockquote>

<details>
<summary>pages/interop/tutorials/transfer-superchainERC20.mdx (1)</summary><blockquote>

`3-6`: _⚠️ Potential issue_

**Description is inconsistent with content.**  
The frontmatter description references `L2ToL2CrossDomainMessenger`, but the tutorial uses `SuperchainTokenBridge.sendERC20`. Please update the description to accurately reflect the mechanism demonstrated in this guide.

</blockquote></details>

</blockquote></details>

<details>
<summary>♻️ Duplicate comments (1)</summary><blockquote>

<details>
<summary>pages/interop/tutorials/transfer-superchainERC20.mdx (1)</summary><blockquote>

`86-88`: **Duplication of previous suggestion.**  
This aligns exactly with krofax’s earlier recommendation to include the Supersim starter-kit setup instructions.

</blockquote></details>

</blockquote></details>

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

<details>
<summary>pages/interop/tutorials/transfer-superchainERC20.mdx (5)</summary><blockquote>

`24-25`: **Remove unused import.**  
`AutorelayCallout` is imported but never used in this file. Please remove the import to avoid dead code.

---

`48-55`: **Avoid second-person pronouns and contractions.**  
The section header "**What you'll learn**" uses a contraction and addresses the reader directly. Consider renaming to a more neutral title like "**Learning objectives**" to align with style guidelines.

---

`76-80`: **Use neutral headers instead of “you’ll”.**  
Similarly, change the header "What you'll build" to something like "Project deliverables" or "What this tutorial builds". This ensures consistency with the imperative, reader-agnostic tone.

---

`93-99`: **Replace hard-coded private key with placeholder.**  
The sample `PRIVATE_KEY=0xac0974…` looks like a real key. Use a placeholder (e.g. `<YOUR_PRIVATE_KEY>`) or clearly label it as test-only to prevent confusion.

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

<details>
<summary>🪛 Gitleaks (8.21.2)</summary>

94-94: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

</details>

</details>

---

`197-204`: **Normalize snippet file paths.**  
The `file=<rootDir>/…` attributes in the TS snippets should use repository-relative paths (e.g. `public/tutorials/xfer-erc20.mts`) to work correctly with the docs pipeline.

</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 d88a1d19845df16070328a8708c89e473e0596f8 and 1c7f743a67a08b514577ca1e4d9a51dea89cab7e.

</details>

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

* `pages/interop/tutorials/transfer-superchainERC20.mdx` (3 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/transfer-superchainERC20.mdx`

</details>

</details><details>
<summary>🪛 Gitleaks (8.21.2)</summary>

<details>
<summary>pages/interop/tutorials/transfer-superchainERC20.mdx</summary>

94-94: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

---

113-113: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

</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 (1)</summary><blockquote>

<details>
<summary>pages/interop/tutorials/transfer-superchainERC20.mdx (1)</summary>

`145-146`: **Typo fixed in section header—good catch!**  
The header now correctly reads "Transfer tokens using the command line".

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-06T21:32:05Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 0**

<details>
<summary>🔭 Outside diff range comments (2)</summary><blockquote>

<details>
<summary>pages/interop/tutorials/transfer-superchainERC20.mdx (2)</summary><blockquote>

`2-2`: _🛠️ Refactor suggestion_

**Align frontmatter title with heading**  
The frontmatter `title` ("Transferring a SuperchainERC20") does not match the H1 heading ("Transferring SuperchainERC20 tokens"). Please update for consistency.  


```diff
--- title: Transferring a SuperchainERC20
+++ title: Transferring SuperchainERC20 tokens
```

---

`191-191`: _⚠️ Potential issue_

**Fix invalid npm install flag**  
The `-y` flag is valid for `npm init` but not for `npm install`. Remove it to prevent installation errors.  


```diff
-npm install --save-dev -y viem tsx @types/node @eth-optimism/viem
+npm install --save-dev viem tsx @types/node @eth-optimism/viem
```

</blockquote></details>

</blockquote></details>

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

<details>
<summary>pages/interop/tutorials/transfer-superchainERC20.mdx (2)</summary><blockquote>

`176-177`: **Replace personal pronouns with neutral language**  
Avoid using "We" in documentation. Use neutral or imperative voice instead.  


```diff
-We are going to use a [Node](https://nodejs.org/en) project, to be able to use [`@eth-optimism/viem`](https://www.npmjs.com/package/@eth-optimism/viem) to send the executing message.
-We use [TypeScript](https://www.typescriptlang.org/) to have [type safety](https://en.wikipedia.org/wiki/Type_safety) combined with JavaScript functionality.
+In this tutorial, you will create a Node project to use `@eth-optimism/viem` for sending messages.
+Use TypeScript to ensure type safety combined with JavaScript functionality.
```

---

`141-142`: **Standardize `cast` subcommand usage**  
Use the `cast from-wei` subcommand consistently instead of the `--from-wei` flag for clarity.  


```diff
-cast call $TOKEN_ADDRESS "balanceOf(address)" $USER_ADDRESS --rpc-url $URL_CHAIN_A | cast --from-wei
+cast call $TOKEN_ADDRESS "balanceOf(address)" $USER_ADDRESS --rpc-url $URL_CHAIN_A | cast from-wei
```

</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 1c7f743a67a08b514577ca1e4d9a51dea89cab7e and f9e039da662a84c5e276330c1e5cf577cb9bf605.

</details>

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

* `pages/interop/tutorials/transfer-superchainERC20.mdx` (3 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/transfer-superchainERC20.mdx`

</details>

</details><details>
<summary>🪛 Gitleaks (8.21.2)</summary>

<details>
<summary>pages/interop/tutorials/transfer-superchainERC20.mdx</summary>

94-94: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

---

113-113: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

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

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-06T21:34:58Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 1**

<details>
<summary>🔭 Outside diff range comments (1)</summary><blockquote>

<details>
<summary>pages/interop/tutorials/transfer-superchainERC20.mdx (1)</summary><blockquote>

`185-193`: _⚠️ Potential issue_

**Invalid `-y` flag on `npm install`**  
The `-y` flag does not apply to `npm install`. Please remove `-y` or replace with a valid alias (e.g., `npm install -D viem tsx @types/node @eth-optimism/viem`).

</blockquote></details>

</blockquote></details>

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

<details>
<summary>pages/interop/tutorials/transfer-superchainERC20.mdx (4)</summary><blockquote>

`24-25`: **Remove unused import**  
The `AutorelayCallout` import on line 25 isn’t referenced anywhere in this file. Please remove it to clean up unused code.

---

`86-87`: **Correct verb form**  
Change “setup the SuperchainERC20 starter kit” to “set up the SuperchainERC20 starter kit” to use the verb form correctly.

---

`93-99`: **Example private key disclosure**  
The snippet exposes a hard-coded private key for local development. Consider adding a disclaimer that this key is for testing only and must not be used in production.

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

<details>
<summary>🪛 Gitleaks (8.21.2)</summary>

94-94: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

</details>

</details>

---

`197-202`: **Normalize MDX snippet file path**  
Replace `file=<rootDir>/public/tutorials/xfer-erc20.mts` with a path relative to the repository root (e.g., `file="public/tutorials/xfer-erc20.mts"`). Also consider removing the `hash` attribute if it’s not required for rendering.

</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 f9e039da662a84c5e276330c1e5cf577cb9bf605 and ecab5660def9c1e3fa1e7d25214dee1f1adad365.

</details>

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

* `pages/interop/tutorials/transfer-superchainERC20.mdx` (3 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/transfer-superchainERC20.mdx`

</details>

</details><details>
<summary>🪛 Gitleaks (8.21.2)</summary>

<details>
<summary>pages/interop/tutorials/transfer-superchainERC20.mdx</summary>

94-94: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

---

113-113: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

</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 (9)</summary><blockquote>

<details>
<summary>pages/interop/tutorials/transfer-superchainERC20.mdx (9)</summary>

`48-74`: **Collapsible “About this tutorial” section is well structured**  
This new `<details>` block consolidates prerequisites and objectives clearly, follows sentence-case headings, and correctly uses proper nouns (e.g., TypeScript, Node).

---

`76-80`: **"What you'll build" section is concise and accurate**  
The H3 header and bullet points correctly use sentence case and clearly describe the outputs of this tutorial.

---

`89-90`: **Store configuration step is clear**  
The imperative instruction “Store the configuration in environment variables.” is correctly phrased and easy to follow.

---

`91-116`: **Verify starter-kit directory path**  
The code references `superchainerc20-starter/...`, which may not match the actual repository or package directory name. Please confirm and correct the path to the SuperchainERC20 starter kit.

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

<details>
<summary>🪛 Gitleaks (8.21.2)</summary>

94-94: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

---

113-113: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

</details>

</details>

---

`118-134`: **Token acquisition steps are well structured**  
Great use of Tabs to separate Supersim vs. Devnets flows and clear mint/faucet commands in imperative style.

---

`145-152`: **Command-line transfer section adheres to style**  
The H3 header uses sentence case and the `cast send` snippet is presented clearly with correct parameter order.

---

`154-159`: **Balance check commands are clear**  
The snippet to call `balanceOf` on both chains is concise and correctly formatted.

---

`161-165`: **Cross-chain send command is accurate**  
The `cast send` invocation to `sendERC20` matches the expected argument order for token transfers.

---

`179-183`: **Environment variable export step follows imperative style**  
The instruction and corresponding shell snippet for exporting variables are clear and correctly formatted.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-06T21:55:16Z

Review comments:
diff_hunk: @@ -79,6 +79,7 @@ Comprensive
 COMPUTEPENDINGBLOCK
 computependingblock
 confs
+conmand
path: words.txt
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Typo in newly added word**

The word "conmand" appears to be a typo for "command". This also appears in the tutorial file (line 145) as "conmand line" instead of "command line".

Apply this correction:

```diff
-conmand
+command
```


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

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-01T14:39:09Z
author_association: CONTRIBUTOR
diff_hunk: @@ -45,110 +45,144 @@ Note that this tutorial provides step-by-step instructions for transferring `Sup
   Cross-chain transfers cannot be reversed.
 </Callout>
 
-### What you'll build
-
-*   A TypeScript application to transfer `SuperchainERC20` tokens between chains
+<details>
+  <summary>About this tutorial</summary>
 
-### What you'll learn
+  **What you'll learn**
 
-*   How to send `SuperchainERC20` tokens on the blockchain and between blockchains
-*   How to relay messages between chains
+  *   How to send `SuperchainERC20` tokens on the blockchain and between blockchains
+  *   How to relay messages between chains
 
-## Prerequisites
+  **Technical knowledge**
 
-Before starting this tutorial, ensure your development environment meets the following requirements:
+  *   Intermediate TypeScript knowledge
+  *   Understanding of smart contract development
+  *   Familiarity with blockchain concepts
 
-### Technical knowledge
+  **Development environment**
 
-*   Intermediate TypeScript knowledge
-*   Understanding of smart contract development
-*   Familiarity with blockchain concepts
+  *   Unix-like operating system (Linux, macOS, or WSL for Windows)
+  *   Node.js version 16 or higher
+  *   Git for version control
 
-### Development environment
+  **Required tools**
 
-*   Unix-like operating system (Linux, macOS, or WSL for Windows)
-*   Node.js version 16 or higher
-*   Git for version control
+  The tutorial uses these primary tools:
 
-### Required tools
+  *   Node: For running TypeScript code from the command line
+  *   Viem: For blockchain interaction
+</details>
 
-The tutorial uses these primary tools:
+### What you'll build
 
-*   Foundry: For issuing transactions
-*   TypeScript: For implementation
-*   Node: For running TypeScript code from the command line
-*   Viem: For blockchain interaction
+*   Commands to transfer `SuperchainERC20` tokens between chains
+*   A TypeScript application to transfer `SuperchainERC20` tokens between chains
 
 ## Directions
 
 <Steps>
   ### Preparation
 
-  You need onchain `SuperchainERC20` tokens.
-  You can [deploy your own token](./deploy-superchain-erc20), but in this tutorial we will use [`CustomSuperchainToken`](https://sid.testnet.routescan.io/address/0xF3Ce0794cB4Ef75A902e07e5D2b75E4D71495ee8),  existing `SuperchainERC20` token on the [Interop devnet](/interop/tools/devnet).
+  1.  If you are using Supersim, setup the [SuperERC20 Starter Kit](/app-developers/starter-kit#setup).
+      The `pnpm dev` step also starts Supersim.
 
-  1.  Create environment variables for the RPC endpoints for the blockchains and the token address.
+  2.  Store the configuration in environment variables.
 
-      ```sh
-      RPC_DEV0=https://interop-alpha-0.optimism.io
-      RPC_DEV1=https://interop-alpha-1.optimism.io
-      TOKEN_ADDRESS=0xF3Ce0794cB4Ef75A902e07e5D2b75E4D71495ee8
-      ```
+      <Tabs items={['Supersim', 'Devnets']}>
+        <Tabs.Tab>
+          ```sh
+          PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
+          USER_ADDRESS=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
+          URL_CHAIN_A=http://127.0.0.1:9545
+          URL_CHAIN_B=http://127.0.0.1:9546
+          CHAIN_B_ID=`cast chain-id --rpc-url $URL_CHAIN_B`            
+          TOKEN_ADDRESS=`cat superchainerc20-starter/packages/contracts/broadcast/multi/SuperchainERC20Deployer.s.sol-latest/run.json | jq --raw-output .deployments[0].transactions[0].contractAddress`
+          ```
+        </Tabs.Tab>
 
-  2.  Set `PRIVATE_KEY` to the private key of an address that has [Sepolia ETH](https://cloud.google.com/application/web3/faucet/ethereum/sepolia).
+        <Tabs.Tab>
+          1.  Set `PRIVATE_KEY` to the private key for an address that has ETH on the two devnets.
 
-      ```sh
-      export PRIVATE_KEY=0x<private key here>
-      MY_ADDRESS=`cast wallet address $PRIVATE_KEY`
-      ```
+          2.  Run these commands to specify the rest of the environment variables.
 
-  3.  Send ETH to the two L2 blockchains.
+          ```sh
+          USER_ADDRESS=`cast wallet address --private-key $PRIVATE_KEY`
+          URL_CHAIN_A=https://interop-alpha-0.optimism.io
+          URL_CHAIN_B=https://interop-alpha-1.optimism.io
+          CHAIN_B_ID=`cast chain-id --rpc-url $URL_CHAIN_B`            
+          TOKEN_ADDRESS=0x0FAe7deDb9CfC2d8288d432B85998e6b263F3A72
+          ```
+        </Tabs.Tab>
+      </Tabs>
 
-      ```sh
-      cast send --rpc-url https://endpoints.omniatech.io/v1/eth/sepolia/public --private-key $PRIVATE_KEY --value 0.02ether 0x7385d89d38ab79984e7c84fab9ce5e6f4815468a
-      cast send --rpc-url https://endpoints.omniatech.io/v1/eth/sepolia/public --private-key $PRIVATE_KEY --value 0.02ether 0x55f5c4653dbcde7d1254f9c690a5d761b315500c
-      ```
+  3.  Obtain tokens on chain A.
 
-  4.  Wait a few minutes until you can see the ETH [on the block explorer](https://sid.testnet.routescan.io/) for your address.
+      <Tabs items={['Supersim', 'Devnets']}>
+        <Tabs.Tab>
+          ```sh
+          ONE=`echo 1 | cast to-wei`
+          cast send $TOKEN_ADDRESS "mintTo(address,uint256)" $USER_ADDRESS $ONE --private-key $PRIVATE_KEY --rpc-url $URL_CHAIN_A
+          ```
+        </Tabs.Tab>
+
+        <Tabs.Tab>
+          ```sh
+          cast send $TOKEN_ADDRESS "faucet()" --private-key $PRIVATE_KEY --rpc-url $URL_CHAIN_A
+          ```
+        </Tabs.Tab>
+      </Tabs>
 
       <details>
         <summary>Sanity check</summary>
 
-        Check the ETH balance of your address on both blockchains.
+        Check that you have at least one token on chain A.
 
         ```sh
-        cast balance --ether $MY_ADDRESS --rpc-url $RPC_DEV0
-        cast balance --ether $MY_ADDRESS --rpc-url $RPC_DEV1
+        cast call $TOKEN_ADDRESS "balanceOf(address)" $USER_ADDRESS --rpc-url $URL_CHAIN_A | cast --from-wei
         ```
       </details>
 
-  5.  Obtain tokens on Interop devnet 0.
-      When using `CustomSuperchainToken`, there are two ways to do this:
+  ### Transfer tokens using the conmand line
path: pages/interop/tutorials/transfer-superchainERC20.mdx
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Typo in section header**

The section header contains a typo: "conmand line" should be "command line".

```diff
-  ### Transfer tokens using the conmand line
+  ### Transfer tokens using the command line
```


<!-- 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
  ### Transfer tokens using the command line
`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-01T14:39:09Z
author_association: CONTRIBUTOR
diff_hunk: @@ -45,110 +45,144 @@ Note that this tutorial provides step-by-step instructions for transferring `Sup
   Cross-chain transfers cannot be reversed.
 </Callout>
 
-### What you'll build
-
-*   A TypeScript application to transfer `SuperchainERC20` tokens between chains
+<details>
+  <summary>About this tutorial</summary>
 
-### What you'll learn
+  **What you'll learn**
 
-*   How to send `SuperchainERC20` tokens on the blockchain and between blockchains
-*   How to relay messages between chains
+  *   How to send `SuperchainERC20` tokens on the blockchain and between blockchains
+  *   How to relay messages between chains
 
-## Prerequisites
+  **Technical knowledge**
 
-Before starting this tutorial, ensure your development environment meets the following requirements:
+  *   Intermediate TypeScript knowledge
+  *   Understanding of smart contract development
+  *   Familiarity with blockchain concepts
 
-### Technical knowledge
+  **Development environment**
 
-*   Intermediate TypeScript knowledge
-*   Understanding of smart contract development
-*   Familiarity with blockchain concepts
+  *   Unix-like operating system (Linux, macOS, or WSL for Windows)
+  *   Node.js version 16 or higher
+  *   Git for version control
 
-### Development environment
+  **Required tools**
 
-*   Unix-like operating system (Linux, macOS, or WSL for Windows)
-*   Node.js version 16 or higher
-*   Git for version control
+  The tutorial uses these primary tools:
 
-### Required tools
+  *   Node: For running TypeScript code from the command line
+  *   Viem: For blockchain interaction
+</details>
 
-The tutorial uses these primary tools:
+### What you'll build
 
-*   Foundry: For issuing transactions
-*   TypeScript: For implementation
-*   Node: For running TypeScript code from the command line
-*   Viem: For blockchain interaction
+*   Commands to transfer `SuperchainERC20` tokens between chains
+*   A TypeScript application to transfer `SuperchainERC20` tokens between chains
 
 ## Directions
 
 <Steps>
   ### Preparation
 
-  You need onchain `SuperchainERC20` tokens.
-  You can [deploy your own token](./deploy-superchain-erc20), but in this tutorial we will use [`CustomSuperchainToken`](https://sid.testnet.routescan.io/address/0xF3Ce0794cB4Ef75A902e07e5D2b75E4D71495ee8),  existing `SuperchainERC20` token on the [Interop devnet](/interop/tools/devnet).
+  1.  If you are using Supersim, setup the [SuperERC20 Starter Kit](/app-developers/starter-kit#setup).
+      The `pnpm dev` step also starts Supersim.
path: pages/interop/tutorials/transfer-superchainERC20.mdx
user: login: krofax
body: ```suggestion
  1.  If you are using Supersim, setup the [SuperERC20 starter kit](/app-developers/starter-kit#setup).
      The `pnpm dev` step also starts Supersim.
```
created_at: 2025-05-06T21:04:44Z
author_association: CONTRIBUTOR
diff_hunk: @@ -158,69 +192,25 @@ The tutorial uses these primary tools:
       mkdir src
       ```
 
-  2.  Edit `package.json` to add the `start` script.
-
-      ```json
-      {
-        "name": "xfer-erc20",
-        "version": "1.0.0",
-        "main": "index.js",
-        "scripts": {
-          "test": "echo \"Error: no test specified\" && exit 1",
-          "start": "tsx src/xfer-erc20.mts"
-        },
-        "keywords": [],
-        "author": "",
-        "license": "ISC",
-        "type": "module",
-        "description": "",
-        "devDependencies": {
-          "@eth-optimism/viem": "^0.3.2",
-          "@types/node": "^22.13.4",
-          "tsx": "^4.19.3",
-          "viem": "^2.23.3"
-        }
-      }      
-      ```
-
   3.  Create `src/xfer-erc20.mts`:
 
-      ```typescript file=<rootDir>/public/tutorials/xfer-erc20.mts hash=26d412ead555cdd59c16676a4dcd91e8
+      ```typescript file=<rootDir>/public/tutorials/xfer-erc20.mts hash=2964a6dcafacb8b7dc1e115a54fb3b7c
       ```
 
       <details>
         <summary>Explanation of `xfer-erc20.mts`</summary>
 
-        ```typescript file=<rootDir>/public/tutorials/xfer-erc20.mts#L79-L84 hash=5084a0cf4064dc7cfaf1cf0f88e1f2d1
+        ```typescript file=<rootDir>/public/tutorials/xfer-erc20.mts#L76-L81 hash=b144852a4fa9ae45e79ec6f124e48e79
         ```
 
         Use `@eth-optimism/viem`'s `walletActionsL2().sendSuperchainERC20` to send the `SuperchainERC20` tokens.
         Internally, this function calls [`SuperchainTokenBridge.sendERC20`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/L2/SuperchainTokenBridge.sol#L52-L78) to send the tokens.
-
-        <AutorelayCallout />
-
-        ```typescript file=<rootDir>/public/tutorials/xfer-erc20.mts#L88-L90 hash=b353aebabd92c4af52858461d18fe8cd 
-        ```
-
-        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/xfer-erc20.mts#L92-L94 hash=47d2387a65e4a5f5dbfa98868c2c5abc 
-        ```
-
-        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/xfer-erc20.mts#L96-L99 hash=4cf177987a894a8cb58ae5a3e9d731e8 
-        ```
-
-        This is how you use `@eth-optimism/viem` to create an executing message.
       </details>
 
-  4.  Run the TypeScript program, and see the change in your `CustomSuperchainToken` balances.
+  4.  Run the TypeScript program, and see the change in your token balances.
 
       ```sh
-      npm start
+      pnpm tsx src/xfer-erc20.mts
       ```
path: pages/interop/tutorials/transfer-superchainERC20.mdx
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Inconsistent package manager usage**  
Steps use `npm init`/`npm install` earlier but then invoke `pnpm tsx`. Please standardize on one toolchain—either switch all commands to `pnpm` (and mention installing dependencies with `pnpm`) or use `npx tsx src/xfer-erc20.mts`.

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-05-06T21:55:16Z
author_association: CONTRIBUTOR

PR comments:
user: login: netlify[bot]
created_at: 2025-05-01T14:36:42Z
body: ### <span aria-hidden="true">✅</span> Deploy Preview for *docs-optimism* ready!
Built [without sensitive environment variables](https://docs.netlify.com/configure-builds/environment-variables/#sensitive-variable-policy)

|  Name | Link |
|:-:|------------------------|
|<span aria-hidden="true">🔨</span> Latest commit | ecab5660def9c1e3fa1e7d25214dee1f1adad365 |
|<span aria-hidden="true">🔍</span> Latest deploy log | https://app.netlify.com/sites/docs-optimism/deploys/681a8485cb9e3d0008f52bf9 |
|<span aria-hidden="true">😎</span> Deploy Preview | [https://deploy-preview-1596--docs-optimism.netlify.app](https://deploy-preview-1596--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.eyJ1cmwiOiJodHRwczovL2RlcGxveS1wcmV2aWV3LTE1OTYtLWRvY3Mtb3B0aW1pc20ubmV0bGlmeS5hcHAifQ.ftMIOJWGPjyr2Br4u0KNAYWvyX-oA39f96Iz9jiWX9I)<br /><br />_Use your smartphone camera to open QR code link._</details> |
---
<!-- [docs-optimism Preview](https://deploy-preview-1596--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-05-01T14:39:06Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- walkthrough_start -->

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

```markdown
## Walkthrough

The changes involve a comprehensive update to the tutorial for transferring SuperchainERC20 tokens. The documentation was restructured to include a new collapsible section outlining learning objectives, prerequisites, and required tools. Instructions for setting up environment variables and acquiring tokens were clarified and organized into tabbed interfaces for different network configurations (Supersim and Devnets), with explicit shell commands provided. The token transfer steps were rewritten for clarity, now including balance checks before and after transfers and direct interaction with the SuperchainTokenBridge contract. The TypeScript example was updated to require explicit environment variable exports and uses `pnpm tsx` for execution. The TypeScript script itself was simplified: it now sources chain and token addresses from environment variables, removes explicit relay transaction handling, and instead waits a fixed period before rechecking balances. Additionally, a new word "command" was added to the word list file. No changes were made to exported or public entity declarations.

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant User
    participant CLI
    participant SuperchainTokenBridge
    participant L2ChainA
    participant L2ChainB

    User->>CLI: Set up environment variables and acquire tokens
    User->>CLI: Initiate ERC20 transfer via CLI or TypeScript script
    CLI->>SuperchainTokenBridge: sendERC20 (transfer tokens)
    SuperchainTokenBridge->>L2ChainA: Burn tokens on source chain
    SuperchainTokenBridge->>L2ChainB: Mint tokens on destination chain (asynchronous)
    CLI->>CLI: Wait 5 seconds
    CLI->>L2ChainA: Query balance (after transfer)
    CLI->>L2ChainB: Query balance (after transfer)
    CLI->>User: Output updated balances
```

## Possibly related PRs

- ethereum-optimism/docs#1575: Fixes code snippet hashes and line ranges in the same tutorial file, maintaining accurate tutorial references related to the current restructuring.
- ethereum-optimism/docs#1394: Focuses on restructuring and enhancing the same SuperchainERC20 token transfer tutorial, indicating closely related content updates.
- ethereum-optimism/docs#1048: Originally created the `transfer-superchainERC20.mdx` tutorial file, which is directly modified and expanded in the current changes.

## Suggested reviewers

- krofax
```

</details>

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


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

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

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<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=1596):

- 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.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

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 generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@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
user: login: krofax
created_at: 2025-05-06T21:06:46Z
body: @qbzzt LGTM
author_association: CONTRIBUTOR