# Table of Contents - [Markdown page example | Hyperlane Docs](#markdown-page-example-hyperlane-docs) - [Search the documentation](#search-the-documentation) - [How to Productionize Your Hyperlane Core Deployment | Hyperlane Docs](#how-to-productionize-your-hyperlane-core-deployment-hyperlane-docs) - [How to Connect Your Chain with Hyperlane | Hyperlane Docs](#how-to-connect-your-chain-with-hyperlane-hyperlane-docs) - [Hyperlane AVS Operator Guide | Hyperlane Docs](#hyperlane-avs-operator-guide-hyperlane-docs) - [Hyperlane Troubleshooting Guide | Hyperlane Docs](#hyperlane-troubleshooting-guide-hyperlane-docs) - [Frequently Asked Questions | Hyperlane Docs](#frequently-asked-questions-hyperlane-docs) - [Create your own Hook & ISM | Hyperlane Docs](#create-your-own-hook-ism-hyperlane-docs) - [Deploy an EVM \<-> SVM Warp Route | Hyperlane Docs](#deploy-an-evm-svm-warp-route-hyperlane-docs) - [Deploy Hyperlane with Local Agents | Hyperlane Docs](#deploy-hyperlane-with-local-agents-hyperlane-docs) - [Deploy an SVM Warp Route | Hyperlane Docs](#deploy-an-svm-warp-route-hyperlane-docs) - [How to Bridge a Token with Hyperlane Warp Routes | Hyperlane Docs](#how-to-bridge-a-token-with-hyperlane-warp-routes-hyperlane-docs) - [Deploying a Bridge UI for Hyperlane Warp Routes | Hyperlane Docs](#deploying-a-bridge-ui-for-hyperlane-warp-routes-hyperlane-docs) - [Unit testing - EVM | Hyperlane Docs](#unit-testing-evm-hyperlane-docs) - [How to Use the Hyperlane Explorer | Hyperlane Docs](#how-to-use-the-hyperlane-explorer-hyperlane-docs) - [Configuring New Chains in the Hyperlane Explorer | Hyperlane Docs](#configuring-new-chains-in-the-hyperlane-explorer-hyperlane-docs) - [Explorer debugging | Hyperlane Docs](#explorer-debugging-hyperlane-docs) - [GraphQL API | Hyperlane Docs](#graphql-api-hyperlane-docs) - [Manage Warp Route Limits on xERC20 and FiatToken | Hyperlane Docs](#manage-warp-route-limits-on-xerc20-and-fiattoken-hyperlane-docs) - [How to extend an existing Warp Route | Hyperlane Docs](#how-to-extend-an-existing-warp-route-hyperlane-docs) - [Quickstart: Run a Relayer | Hyperlane Docs](#quickstart-run-a-relayer-hyperlane-docs) - [Message debugging | Hyperlane Docs](#message-debugging-hyperlane-docs) - [Implementation Guide | Hyperlane Docs](#implementation-guide-hyperlane-docs) - [Hyperlane Local Setup Guide: Sending Messages between Anvil Nodes | Hyperlane Docs](#hyperlane-local-setup-guide-sending-messages-between-anvil-nodes-hyperlane-docs) - [Quickstart: Run a Validator | Hyperlane Docs](#quickstart-run-a-validator-hyperlane-docs) - [How to Remove Trusted Relayer ISM from Warp Route | Hyperlane Docs](#how-to-remove-trusted-relayer-ism-from-warp-route-hyperlane-docs) - [Token Sources & Faucets | Hyperlane Docs](#token-sources-faucets-hyperlane-docs) - [How to Transfer Ownership from Hyperlane Mailbox | Hyperlane Docs](#how-to-transfer-ownership-from-hyperlane-mailbox-hyperlane-docs) - [How to Transfer Ownership of Your Hyperlane Warp Route | Hyperlane Docs](#how-to-transfer-ownership-of-your-hyperlane-warp-route-hyperlane-docs) - [How to Update Mailbox Default ISM | Hyperlane Docs](#how-to-update-mailbox-default-ism-hyperlane-docs) - [Create your xERC20 Token Bridge | Hyperlane Docs](#create-your-xerc20-token-bridge-hyperlane-docs) - [Intro to Hyperlane | Hyperlane Docs](#intro-to-hyperlane-hyperlane-docs) - [Agent configuration | Hyperlane Docs](#agent-configuration-hyperlane-docs) - [Deploy with Terraform | Hyperlane Docs](#deploy-with-terraform-hyperlane-docs) - [Message filtering | Hyperlane Docs](#message-filtering-hyperlane-docs) - [Quickstart with Docker Compose and AWS | Hyperlane Docs](#quickstart-with-docker-compose-and-aws-hyperlane-docs) - [Monitoring & Alerting | Hyperlane Docs](#monitoring-alerting-hyperlane-docs) - [Overview | Hyperlane Docs](#overview-hyperlane-docs) - [Run a Relayer | Hyperlane Docs](#run-a-relayer-hyperlane-docs) - [Configuration reference | Hyperlane Docs](#configuration-reference-hyperlane-docs) - [Running with Docker Compose | Hyperlane Docs](#running-with-docker-compose-hyperlane-docs) - [Agent keys | Hyperlane Docs](#agent-keys-hyperlane-docs) - [Monitoring & Alerting | Hyperlane Docs](#monitoring-alerting-hyperlane-docs) - [Run Validators | Hyperlane Docs](#run-validators-hyperlane-docs) - [AWS Signatures Bucket Setup | Hyperlane Docs](#aws-signatures-bucket-setup-hyperlane-docs) - [ts-sdk-placeholder | Hyperlane Docs](#ts-sdk-placeholder-hyperlane-docs) - [How to Go to Production with your Hyperlane Deployment | Hyperlane Docs](#how-to-go-to-production-with-your-hyperlane-deployment-hyperlane-docs) - [Agents | Hyperlane Docs](#agents-hyperlane-docs) - [Relayer | Hyperlane Docs](#relayer-hyperlane-docs) - [Validators | Hyperlane Docs](#validators-hyperlane-docs) - [Watchtowers | Hyperlane Docs](#watchtowers-hyperlane-docs) - [Economic Security | Hyperlane Docs](#economic-security-hyperlane-docs) - [Hyperlane AVS | Hyperlane Docs](#hyperlane-avs-hyperlane-docs) - [Interchain Gas Payments | Hyperlane Docs](#interchain-gas-payments-hyperlane-docs) - [Aggregation ISM | Hyperlane Docs](#aggregation-ism-hyperlane-docs) - [CCIP Read ISM | Hyperlane Docs](#ccip-read-ism-hyperlane-docs) - [Overriding the default ISM | Hyperlane Docs](#overriding-the-default-ism-hyperlane-docs) - [Modular Security | Hyperlane Docs](#modular-security-hyperlane-docs) - [Multisig ISM | Hyperlane Docs](#multisig-ism-hyperlane-docs) - [Routing ISM | Hyperlane Docs](#routing-ism-hyperlane-docs) - [Sequence diagram | Hyperlane Docs](#sequence-diagram-hyperlane-docs) - [Arbitrum L2 to L1 ISM | Hyperlane Docs](#arbitrum-l2-to-l1-ism-hyperlane-docs) - [OP Stack ISM | Hyperlane Docs](#op-stack-ism-hyperlane-docs) - [Optimistic ISM | Hyperlane Docs](#optimistic-ism-hyperlane-docs) - [Polygon PoS ISM | Hyperlane Docs](#polygon-pos-ism-hyperlane-docs) - [Wormhole ISM | Hyperlane Docs](#wormhole-ism-hyperlane-docs) - [Mailbox | Hyperlane Docs](#mailbox-hyperlane-docs) - [Alt-VM Implementations | Hyperlane Docs](#alt-vm-implementations-hyperlane-docs) - [Protocol Overview | Hyperlane Docs](#protocol-overview-hyperlane-docs) - [Warp Routes: Fast Native Transfers via Custom Gas Tokens | Hyperlane Docs](#warp-routes-fast-native-transfers-via-custom-gas-tokens-hyperlane-docs) - [Warp Routes: Example Usage | Hyperlane Docs](#warp-routes-example-usage-hyperlane-docs) - [Warp Routes | Hyperlane Docs](#warp-routes-hyperlane-docs) - [Deploy Yield Routes | Hyperlane Docs](#deploy-yield-routes-hyperlane-docs) - [Warp Routes: Types | Hyperlane Docs](#warp-routes-types-hyperlane-docs) - [Interchain Account Router | Hyperlane Docs](#interchain-account-router-hyperlane-docs) - [Interchain Gas Paymaster (Hook) | Hyperlane Docs](#interchain-gas-paymaster-hook-hyperlane-docs) - [Mailbox | Hyperlane Docs](#mailbox-hyperlane-docs) - [Proxy Admin | Hyperlane Docs](#proxy-admin-hyperlane-docs) - [Merkle Tree (Hook) | Hyperlane Docs](#merkle-tree-hook-hyperlane-docs) - [Test Recipient | Hyperlane Docs](#test-recipient-hyperlane-docs) - [Storage Gas Oracle | Hyperlane Docs](#storage-gas-oracle-hyperlane-docs) - [Audits | Hyperlane Docs](#audits-hyperlane-docs) - [Hyperlane CLI | Hyperlane Docs](#hyperlane-cli-hyperlane-docs) - [Validator Announce | Hyperlane Docs](#validator-announce-hyperlane-docs) - [Warp Route Interface | Hyperlane Docs](#warp-route-interface-hyperlane-docs) - [Interchain Account Interface | Hyperlane Docs](#interchain-account-interface-hyperlane-docs) - [Glossary | Hyperlane Docs](#glossary-hyperlane-docs) - [Default ISM Validators | Hyperlane Docs](#default-ism-validators-hyperlane-docs) - [Domain Identifiers | Hyperlane Docs](#domain-identifiers-hyperlane-docs) - [Arbitrum L2 to L1 Hook | Hyperlane Docs](#arbitrum-l2-to-l1-hook-hyperlane-docs) - [OP Stack Hook | Hyperlane Docs](#op-stack-hook-hyperlane-docs) - [Post-Dispatch Interchain Gas Payment | Hyperlane Docs](#post-dispatch-interchain-gas-payment-hyperlane-docs) - [Polygon PoS Hook | Hyperlane Docs](#polygon-pos-hook-hyperlane-docs) - [Post-Dispatch Hooks | Hyperlane Docs](#post-dispatch-hooks-hyperlane-docs) - [Aggregation Module | Hyperlane Docs](#aggregation-module-hyperlane-docs) - [Multisig Module | Hyperlane Docs](#multisig-module-hyperlane-docs) - [Routing Module | Hyperlane Docs](#routing-module-hyperlane-docs) - [Interchain Security Module Interface | Hyperlane Docs](#interchain-security-module-interface-hyperlane-docs) - [Latencies | Hyperlane Docs](#latencies-hyperlane-docs) - [StandardHookMetadata Library | Hyperlane Docs](#standardhookmetadata-library-hyperlane-docs) - [MailboxClient Library | Hyperlane Docs](#mailboxclient-library-hyperlane-docs) - [Router Library | Hyperlane Docs](#router-library-hyperlane-docs) - [Message Library | Hyperlane Docs](#message-library-hyperlane-docs) - [TypeCasts library | Hyperlane Docs](#typecasts-library-hyperlane-docs) - [Mailbox | Hyperlane Docs](#mailbox-hyperlane-docs) - [Send a message | Hyperlane Docs](#send-a-message-hyperlane-docs) - [Hyperlane Registries | Hyperlane Docs](#hyperlane-registries-hyperlane-docs) - [Receive a message | Hyperlane Docs](#receive-a-message-hyperlane-docs) - [Typescript SDK | Hyperlane Docs](#typescript-sdk-hyperlane-docs) - [Typescript SDK | Hyperlane Docs](#typescript-sdk-hyperlane-docs) - [Typescript SDK | Hyperlane Docs](#typescript-sdk-hyperlane-docs) - [Typescript SDK | Hyperlane Docs](#typescript-sdk-hyperlane-docs) - [Typescript SDK | Hyperlane Docs](#typescript-sdk-hyperlane-docs) - [Typescript SDK | Hyperlane Docs](#typescript-sdk-hyperlane-docs) - [How to Productionize Your Hyperlane Warp Route Deployment | Hyperlane Docs](#how-to-productionize-your-hyperlane-warp-route-deployment-hyperlane-docs) - [Send your first interchain message | Hyperlane Docs](#send-your-first-interchain-message-hyperlane-docs) - [Welcome to Hyperlane Docs | Hyperlane Docs](#welcome-to-hyperlane-docs-hyperlane-docs) - [Deployed Addresses | Hyperlane Docs](#deployed-addresses-hyperlane-docs) - [Domain Identifiers | Hyperlane Docs](#domain-identifiers-hyperlane-docs) - [Unknown](#unknown) - [Unknown](#unknown) - [Unknown](#unknown) --- # Markdown page example | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) Markdown page example ===================== You don't need React to write simple standalone pages. --- # Search the documentation [Skip to main content](#__docusaurus_skipToContent_fallback) Search the documentation ======================== --- # How to Productionize Your Hyperlane Core Deployment | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) How to Productionize Your Hyperlane Core Deployment =================================================== In order to productionize your Hyperlane core deployment, you must [update the mailbox's default ISM](/docs/guides/update-mailbox-default-ism) . In addition, you will need to [transfer ownership](/docs/guides/transfer-mailbox-ownership) of the mailbox. Please continue to the following guides to productionize your core deployment. --- # How to Connect Your Chain with Hyperlane | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page How to Connect Your Chain with Hyperlane ======================================== info * This guide will help you deploy Hyperlane to your new chain as quickly as possible for testing, not production. This includes the core mailbox and ISM contracts as well as warp route contracts for assets you’re bridging. * To see which chains are already supported, visit the [Registry](https://github.com/hyperlane-xyz/hyperlane-registry/tree/main/chains) . * If you need any help, reach out on #developers on Discord or [get in touch](https://forms.gle/KyRTaWvo4XNmNvrq6) . Prerequisites[​](#prerequisites "Direct link to Prerequisites") ---------------------------------------------------------------- Anyone can begin this quickstart guide once they have the following artifacts & assets available: * A new, custom, or pre-existing network of your choice, including the following metadata: * A chain name, e.g. `ethereum` * A chain ID, e.g. `1` * A RPC URL, e.g. `https://eth.llamarpc.com` * A deployer wallet/EOA private key or seed phrase * This EOA should be funded on your custom chain and any chain you will be passing messages to & from * [Hyperlane CLI](/docs/reference/cli) 1\. Registry[​](#1-registry "Direct link to 1. Registry") ---------------------------------------------------------- Let’s create a custom chain config, run: hyperlane registry init Follow the prompts to set up your chain metadata. Setting up block or gas properties is optional. Now, under `$HOME/.hyperlane/chains` you will find a new folder named with your custom chain’s name, and a file named `metadata.yaml` within that folder. Example content of this config at `$HOME/.hyperlane/chains/yourchain/metadata.yaml` # yaml-language-server: $schema=../schema.json# Metadata for your custom chainblockExplorers: - apiUrl: https://explorer.yourchain.com/api apiKey: XXXX # helpful to avoid rate limiting on the contract verification API family: etherscan #explorer you're using, also supporting routescan or blockscout name: Chainscan url: https://explorer.yourchain.comblocks: confirmations: 1 estimateBlockTime: 1 reorgPeriod: 0chainId: 171717displayName: Chain NamedomainId: 171717isTestnet: true # optionalname: yourchainnativeToken: name: Ether symbol: ETH decimals: 18protocol: ethereumrpcUrls: - http: https://hyper-lane-docs.rpc.caldera.xyz/http 2\. Core[​](#2-core "Direct link to 2. Core") ---------------------------------------------- Next, let’s configure, deploy and test your custom chain’s core contracts. ### Initialize configuration[​](#initialize-configuration "Direct link to Initialize configuration") 1. From your local environment, set the private key or seed phrase of your funded deployer address to `HYP_KEY`. For example: `export HYP_KEY=''` 2. From the same terminal instance, run: hyperlane core init The deployment config will be written to `./configs/core-config.yaml` # The address that owns and manages the deployed contracts. This account has admin privileges.owner: "0x16F4898F47c085C41d7Cc6b1dc72B91EA617dcBb"# The default Interchain Security Module (ISM) configuration.defaultIsm: #`type`: Specifies the type of ISM. Here, it uses a trusted relayer ism. type: trustedRelayerIsm #`relayer`: The address of the relayer responsible for processing interchain messages. relayer: "0x16F4898F47c085C41d7Cc6b1dc72B91EA617dcBb"defaultHook: # A hook configuration that specifies the use of a Merkle Tree. type: merkleTreeHookrequiredHook: # The owner address responsible for managing the hook configuration. owner: "0x16F4898F47c085C41d7Cc6b1dc72B91EA617dcBb" # The type of hook. This one applies a protocol fee mechanism. type: protocolFee # The address that receives the protocol fees. beneficiary: "0x16F4898F47c085C41d7Cc6b1dc72B91EA617dcBb" # The maximum fee allowed by the protocol, in wei. maxProtocolFee: "100000000000000000" # The current fee charged by the protocol, set to 0 for testing purposes. protocolFee: "0" ### Deploy contracts[​](#deploy-contracts "Direct link to Deploy contracts") To deploy contracts, run: hyperlane core deploy Use the arrows and enter to select your custom chain from the bottom of the mainnet list. It will take a few minutes for all contracts to deploy. Under `$HOME/.hyperlane/chains` you will find a new folder named with your custom chain’s name, and a file named `addresses.yaml` within that folder staticMerkleRootMultisigIsmFactory: "0x6906cb4741d3E2322E9f9aA645DfC8AB6F122c47"staticMessageIdMultisigIsmFactory: "0x3CE97a32d9C8294691cBd2baC09B078EDa75c429"staticAggregationIsmFactory: "0x81f969fDBF48278Ce09685Ce48e03388B6785aF4"staticAggregationHookFactory: "0x3d864A3c25F61E3c3A7d02e980453A6E1f0a92A6"domainRoutingIsmFactory: "0xC4c01f7B03f0fFa77A0265C600dEF7Ad28BCa5A2"proxyAdmin: "0xABb7175d5F123172E7B7Fa467CC9fE4C2FEdb942"mailbox: "0x5F58d75A9caDE4e2b191313223978dF049f93b81"interchainAccountRouter: "0x43c0745b0dE9Cb780816a24ddE63d79Ca99B5dE8"interchainAccountIsm: "0x9C96dC8f4257413225d6B5C47d1afbafc39B269F"validatorAnnounce: "0xE3bd39BF92DB385dE6313D6070b035bD934378CB"testRecipient: "0xa58462b1943Be1469Ed58db690C78583BA34Fd2E" warning `eth_getStorageAt()` Compatibility: Some chains may not utilize the [`eth_getStorageAt()`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getstorageat) API. If your deployment encounters related issues, refer to the [Troubleshooting Guide](/docs/deploy-hyperlane-troubleshooting#eth_getstorageat-compatibility) . ### Send test message[​](#send-test-message "Direct link to Send test message") To send a test message, run: hyperlane send message --relay The `--relay` flag is optional and will deliver the message to the destination chain. You can also run a relayer in the background with hyperlane relayer --chains yourchain,sepolia success **🎉 Congrats! You have successfully sent a message to your custom chain** 3\. Warp Route[​](#3-warp-route "Direct link to 3. Warp Route") ---------------------------------------------------------------- Now that you have a Hyperlane mailbox and core contracts on your chain, it’s time to set up token bridging between your chain and any other Hyperlane chain. Continue on to the [Deploy a Warp Route](/docs/guides/deploy-warp-route) docs for more details. 4\. Submit to Registry[​](#4-submit-to-registry "Direct link to 4. Submit to Registry") ---------------------------------------------------------------------------------------- If you want other chains to connect with you as well as to take this to production, make a registry PR. ### Ensure complete info[​](#ensure-complete-info "Direct link to Ensure complete info") Make sure your metadata is complete: * add a `logo.svg` file inside the folder * include `Deployer` information identifying the team deploying * indicate `isTestnet` `true` if the chain is testnet * add the api url `gnosisSafeTransactionServiceUrl` if you have a gnosis safe service * lint the yaml files and order alphabetically ### Commit to Github[​](#commit-to-github "Direct link to Commit to Github") First, navigate to your local instance of the registry and commit changes cd ~/.hyperlane && git init && git add . && git commit Then, sync local registry with canonical registry git remote add canonical git@github.com:hyperlane-xyz/hyperlane-registry.gitgit pull canonical main --rebase Finally, push local registry to github fork and submit a PR. Please include a [changeset](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md) in your PR. success **Congrats! You have successfully deployed Hyperlane to your chain and added your work to the Hyperlane registry** Thank you for contributing to the future of permissionless interop 🫡 ### Take to Production[​](#take-to-production "Direct link to Take to Production") #### Community-Run Infra[​](#community-run-infra "Direct link to Community-Run Infra") As a public good, a core dev team for Hyperlane - Abacus Works - can help take your mainnet chain to production free of charge. Feel free to request this in your PR, new chain batches are added every two weeks. This includes running a relayer connecting your chain to the network, adding your chain to the [Explorer](https://explorer.hyperlane.xyz/) , and running one of the validators in your chain's default validator set. There is no ongoing cost or lock-in - at any time you can choose to migrate your relayer to a self-hosted option or change your validator set. #### Self-Host Infra[​](#self-host-infra "Direct link to Self-Host Infra") Chains with devops experience, like Stride, choose to run their own relayer. While this does have some operations burden, this allows them to add new chains even faster at their pace. In addition, they can choose to set or subsidize the interchain gas costs related to relaying. See the [Operate](/docs/operate/relayer/run-relayer) docs for more information. * [Prerequisites](#prerequisites) * [1\. Registry](#1-registry) * [2\. Core](#2-core) * [Initialize configuration](#initialize-configuration) * [Deploy contracts](#deploy-contracts) * [Send test message](#send-test-message) * [3\. Warp Route](#3-warp-route) * [4\. Submit to Registry](#4-submit-to-registry) * [Ensure complete info](#ensure-complete-info) * [Commit to Github](#commit-to-github) * [Take to Production](#take-to-production) --- # Hyperlane AVS Operator Guide | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Hyperlane AVS Operator Guide ============================ Overview[​](#overview "Direct link to Overview") ------------------------------------------------- Hyperlane validators are light offchain agents responsible for security - they observe messages on an origin chain's [Mailbox](/docs/protocol/mailbox) and if needed sign a merkle root that attests the current state of the mailbox. This signature is stored and made publicly available (e.g. in an S3 bucket), which is then used by the offchain Relayer and Interchain Security Modules onchain. Validators are _not_ networked together and do not need to reach consensus. As you follow this guide, you'll run a Hyperlane validator on [**any of the chains**](https://github.com/hyperlane-xyz/hyperlane-registry/tree/main/chains) the protocol is live on, including Arbitrum, Optimism, BSC, Base, Blast, Linea, Mode, and Polygon. After that you'll link your validator with your EigenLayer Operator by interacting with the AVS contract on Ethereum Mainnet or Holesky. This process, like the entire Hyperlane framework, is open source and permissionless - no whitelisting or staking minimums needed. 1\. Install CLI[​](#1-install-cli "Direct link to 1. Install CLI") ------------------------------------------------------------------- Install the latest version of the `@hyperlane-xyz/cli` package with `npm install -g @hyperlane-xyz/cli`. Detailed CLI install instructions are available [here](https://docs.hyperlane.xyz/docs/reference/cli) . 2\. Run the validator[​](#2-run-the-validator "Direct link to 2. Run the validator") ------------------------------------------------------------------------------------- Operators that want to quickly deploy a production ready environment using Docker Compose and AWS may wish to use the [Docker Compose quickstart guide](/docs/operate/docker-quickstart) . Follow the validator guide [here](/docs/operate/validators/run-validators) with the AWS setup to run the validator on [any chain](https://github.com/hyperlane-xyz/hyperlane-registry/tree/main/chains) within the Hyperlane network. You can also easily generalize for other storage providers like [GCP](https://github.com/hyperlane-xyz/hyperlane-monorepo/pull/3156) and Azure, or other key management solutions. Ensure that your KMS key has funds on that chain to announce itself. ### Monitoring[​](#monitoring "Direct link to Monitoring") You can monitor EigenLayer specific endpoints via the `--metrics` port you specified in the validator configuration. Read more about the example endpoints and what should be expected [here](https://docs.eigenlayer.xyz/eigenlayer/avs-guides/spec/api/) . The supported endpoints are: | Endpoint | Description | | --- | --- | | **GET /eigen/node** | for node info | | **GET /eigen/node/health** | for node health | | **GET /eigen/node/services** | for a list of services the node is running | You'll need the validator address (address of the signing key) for the next step. 3\. Set up keys[​](#3-set-up-keys "Direct link to 3. Set up keys") ------------------------------------------------------------------- There is a distinction between the operator key and the AVS signing key. The operator key is meant for just interacting with the AVS contracts whereas the AVS signing key is used for active operations, which in our case will be signing checkpoints with a Hyperlane validator. 4\. Register your operator[​](#4-register-your-operator "Direct link to 4. Register your operator") ---------------------------------------------------------------------------------------------------- First, make sure you're registered with your operator key [as an EigenLayer operator](https://docs.eigenlayer.xyz/eigenlayer/operator-guides/operator-installation#operator-configuration-and-registration) on Mainnet or Holesky. You'll only need the ECDSA key. Next, to register your operator to Hyperlane AVS, you can use the Hyperlane CLI. Register your operator key (generated via the EigenLayer CLI) by creating an ECDSA signature and submitting it along with the AVS signing key, which is your Hyperlane validator address from above (not a private key). hyperlane avs register --operatorKeyPath \ --chain \ --avsSigningKeyAddress The `AVS_NETWORK` is the network you're registering on, which can be `Ethereum` or `Holesky`. Your AVS signing key can be reused across multiple validators and doesn't require additional registration for each. If you use different AVS signing keys for each validator, you'll need to register each as an operator. ### Confirming registration[​](#confirming-registration "Direct link to Confirming registration") To confirm you are registered on mainnet, run `hyperlane avs check --chain ethereum --operatorAddress ` using the Hyperlane CLI and see if your validator address is there. This query may take a few minutes to complete. Additionally, you can search your address under the `operatorRegistry` function [on Etherscan](https://etherscan.io/address/0x272CF0BB70D3B4f79414E0823B426d2EaFd48910#readProxyContract#F12) or check on EigenLayer's UI for [Ethereum](https://app.eigenlayer.xyz/avs/0xe8e59c6c8b56f2c178f63bcfc4ce5e5e2359c8fc) or [Holesky](https://holesky.eigenlayer.xyz/avs/0xc76e477437065093d353b7d56c81ff54d167b0ab) . success Congrats on registering with the Hyperlane AVS! Now any Hyperlane message receiver can leverage your validator signatures, helping secure rollup interop. Learn more[​](#learn-more "Direct link to Learn more") ------------------------------------------------------- You can read more about the AVS protocol design [here](/docs/protocol/economic-security/hyperlane-avs) . * [Overview](#overview) * [1\. Install CLI](#1-install-cli) * [2\. Run the validator](#2-run-the-validator) * [Monitoring](#monitoring) * [3\. Set up keys](#3-set-up-keys) * [4\. Register your operator](#4-register-your-operator) * [Confirming registration](#confirming-registration) * [Learn more](#learn-more) --- # Hyperlane Troubleshooting Guide | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Hyperlane Troubleshooting Guide =============================== General Troubleshooting[​](#general-troubleshooting "Direct link to General Troubleshooting") ---------------------------------------------------------------------------------------------- ### Logging[​](#logging "Direct link to Logging") Logging levels and formats can be configured for Hyperlane tooling using the following two environment variables: * `LOG_LEVEL`: The log level to filter to. Defaults to `info`. Choices: `debug | info | warn | error | off` * `LOG_FORMAT`: The format of the log output. Defaults to `pretty`. Choices: `pretty | json` The [Hyperlane CLI](/docs/reference/cli) also allows configuring logging via the `--log` and `--verbosity` flags. ### Chain Configuration[​](#chain-configuration "Direct link to Chain Configuration") Within your working directory, you may find a `chains/` yaml files organized by chain name. These `metadata.yaml` files describe the information needed to use the chain in Hyperlane deployments and apps. You can define a full configuration for any new chain in this file. The metadata that can be configured is defined in this [example configuration](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/cli/examples/chain-config.yaml) . You can also find the chain metadata schema at [chainMetadataTypes.ts](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/sdk/src/metadata/chainMetadataTypes.ts) . Here's an example configuration for two local anvil chains: Example: Two Local Anvil Chains anvil1: chainId: 31337 domainId: 31337 name: anvil1 protocol: ethereum rpcUrls: - http: http://localhost:8545 nativeToken: name: Ether symbol: ETH decimals: 18anvil2: chainId: 31338 domainId: 31338 name: anvil2 protocol: ethereum rpcUrls: - http: http://localhost:8555 You can also extend a core chain config by providing the fields to be overridden: sepolia: blocks: confirmations: 2 #### Override RPC URLs[​](#override-rpc-urls "Direct link to Override RPC URLs") You can override the RPC urls by extending the core chain config. Example: Define RPC URLs array and adjust retry settings demochain: name: demochain chainId: 123456 domainId: 123456 protocol: ethereum rpcUrls: - http: https://rpc-testnet.demochain.ggsepolia: rpcUrls: - http: https://rpc2.sepolia.org - http: https://some-other-sepolia-rpc.gg retry: maxRequests: 10 #### Override transaction settings[​](#override-transaction-settings "Direct link to Override transaction settings") Transaction overrides are any properties to include when forming transaction requests. For example: * `gasPrice`: number | string * `maxFeePerGas`: number | string * `maxPriorityFeePerGas`: number | string * `nonce`: number | string * `type`: number * `ccipReadEnabled`: boolean In the example below we're using a gas price of 7 gwei, hardcoding the nonce, and setting a maximum value for the base and priority fees. sepolia: transactionOverrides: gasPrice: 7000000000 # 7 gwei maxFeePerGas: 150000000000 # 150 gwei maxPriorityFeePerGas: 40000000000 # 40 gwei nonce: 1337 warning If you are overriding the nonce in the chain configuration, ensure you are updating the value on successful transactions. ### Message Delivery Issues[​](#message-delivery-issues "Direct link to Message Delivery Issues") #### Long Message Delivery Times or Timeouts[​](#long-message-delivery-times-or-timeouts "Direct link to Long Message Delivery Times or Timeouts") Delays or timeouts in message delivery often result from RPC issues, such as overloaded endpoints, or from chains that produce blocks only on demand. To identify the issue, check for logs indicating RPC-related problems such as: `Deprioritizing an inner provider in FallbackProvider` To address these delays: * **Check RPC Health:** Ensure RPC endpoints are responsive. * **Configure Chains with On-Demand Blocks:** For these chains, set the reorgPeriod to 0. This ensures that agents always look at the tip of the chain, avoiding delays caused by block finalization processes. Agent Troubleshooting[​](#agent-troubleshooting "Direct link to Agent Troubleshooting") ---------------------------------------------------------------------------------------- ### Validator Troubleshooting[​](#validator-troubleshooting "Direct link to Validator Troubleshooting") * **`Validator has not announced any storage locations` Warning:** * **Reason**: This occurs when the relayer cannot retrieve validator signatures required to process a message. * **Solution**: * Ensure the validators have announced their storage locations. Check validator logs for a message such as: `Validator has announced signature storage location, locations: ["file:///tmp/hyperlane-validator-signatures-local"]` * Verify that each validator has a unique signature storage path (`--checkpointSyncer.path`) to prevent overwriting. * Confirm that the relayer has read access to the storage paths. * **`No ISM Found for Origin` Error** * **Reason**: This occurs when the Interchain Security Module (ISM) does not recognize the origin chain. * **Solution**: * Ensure the ISM configuration includes the Validators for the origin chain. * If it doesn't, add validators for the origin chain to your ISM. * Restart the relayer after updating the ISM configuration. ### Relayer Troubleshooting[​](#relayer-troubleshooting "Direct link to Relayer Troubleshooting") #### Checking Pending Messages in the Queue[​](#checking-pending-messages-in-the-queue "Direct link to Checking Pending Messages in the Queue") If messages are stuck in the relayer queue or not being processed, use the `list_operations` endpoint to inspect the relayer's queue: curl http://0.0.0.0:9090/list_operations?destination_domain= This endpoint provides the status of messages in the queue and can help identify why they are not being delivered. #### Debugging with Logs[​](#debugging-with-logs "Direct link to Debugging with Logs") For detailed insights, enable debug logging and monitor the relayer's activity: `HYP_LOG_LEVEL=debug`. Once logs are captured, you can use them to locate issues with specific message IDs. #### Retrying Messages[​](#retrying-messages "Direct link to Retrying Messages") After reviewing the logs, you can trigger an immediate retry of all pending messages using the `message_retry` endpoint: curl --location 'http://127.0.0.1:9090/message_retry' \--header 'Content-Type: application/json' \--data '[{"messageid": "*", "origindomain": "*", "senderaddress": "*", "destinationdomain": "*", "recipientaddress": "*"}]' Make sure that you use the most recent version of the relayer and capture all logs for debugging. #### Relayer Selecting Incorrect ISM[​](#relayer-selecting-incorrect-ism "Direct link to Relayer Selecting Incorrect ISM") Ensure the Interchain Security Module (ISM) on your chain is configured correctly. An incorrect ISM can result in messages not being processed. Verify the ISM address in your configuration and ensure it matches your deployment setup. Advanced Troubleshooting[​](#advanced-troubleshooting "Direct link to Advanced Troubleshooting") ------------------------------------------------------------------------------------------------- ### `eth_getStorageAt()` Compatibility[​](#eth_getstorageat-compatibility "Direct link to eth_getstorageat-compatibility") Some chains do not natively support the [`eth_getStorageAt()`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getstorageat) API. If you're deploying on one of these chains and encounter issues, review the changes made to the Hyperlane codebase in this [commit](https://github.com/hyperlane-xyz/hyperlane-monorepo/commit/871df7a4dce203ff5cf23ae654d03743dc00ea61) . To deploy Hyperlane on these chains follow the steps: 1. Clone the [repo](https://github.com/hyperlane-xyz/hyperlane-monorepo) 2. Apply the changes in the [commit](https://github.com/hyperlane-xyz/hyperlane-monorepo/commit/871df7a4dce203ff5cf23ae654d03743dc00ea61) . 3. Build the project from the root directory: `yarn build` 4. Run the Hyperlane CLI from the root directory: `yarn workspace @hyperlane-xyz/cli hyperlane` * [General Troubleshooting](#general-troubleshooting) * [Logging](#logging) * [Chain Configuration](#chain-configuration) * [Message Delivery Issues](#message-delivery-issues) * [Agent Troubleshooting](#agent-troubleshooting) * [Validator Troubleshooting](#validator-troubleshooting) * [Relayer Troubleshooting](#relayer-troubleshooting) * [Advanced Troubleshooting](#advanced-troubleshooting) * [`eth_getStorageAt()` Compatibility](#eth_getstorageat-compatibility) --- # Frequently Asked Questions | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Frequently Asked Questions ========================== General Questions[​](#general-questions "Direct link to General Questions") ---------------------------------------------------------------------------- **What is Hyperlane?** Hyperlane is the first universal and permissionless interoperability framework built for the modular blockchain stack. Anyone can [deploy Hyperlane](/docs/deploy-hyperlane) to any blockchain environment, whether it is a layer 1, rollup, or app-chain, allowing that chain to communicate seamlessly with any other chain on which Hyperlane has been deployed. **What are the benefits of using Hyperlane for blockchain developers?** Hyperlane offers benefits for both blockchain and dapp developers. * For blockchain developers, a Hyperlane deployment expands accessibility to users, assets, and valuable state from other connected blockchains on which Hyperlane has been deployed. * For dapp developers, Hyperlane provides seamless connectivity across multiple blockchains, allowing developers to create interchain network effects and liquidity and users to interact with applications from their preferred chain. **What is Abacus Works?** Abacus Works is the name of a legal identity working on Hyperlane. You may encounter some references to Abacus in older posts and repositories. Hyperlane rebranded from Abacus to Hyperlane in Fall 2022. **What can I build with Hyperlane?** Hyperlane's [messaging interface](/docs/protocol/mailbox) allows dapp developers to send arbitrary bytes between smart contracts on different chains. This can be used to create interchain applications, dapps which span multiple chains. For inspiration, take a look at some of the pre-built applications built on top of Hyperlane, including: * **Warp Routes**: Lets users move tokens from one chain to another. * **Interchain Accounts**: Lets users make interchain function calls. * **Interchain Queries**: Lets users make interchain view calls. **I’m a developer. How can my team build with Hyperlane?** If you’re reading this FAQ, you’ve found the docs which is a great place to start. That said, we know that questions arise during implementation, and we’re happy to help you on your way. The Hyperlane community is regularly active in the [Discord](http://discord.gg/hyperlane) . Feedback from developers directly influences the product roadmap. Technical Questions[​](#technical-questions "Direct link to Technical Questions") ---------------------------------------------------------------------------------- ### Messaging[​](#messaging "Direct link to Messaging") **What happens when I send a message on Hyperlane?** See the [send](/docs/reference/messaging/send) and [receive](/docs/reference/messaging/receive) pages for more details. In summary: 1. An application calls the `dispatch()` function on the origin chain, inserting the message into the Mailbox's Merkle tree. 2. A Hyperlane Relayer observes the dispatched messages and assembles metadata for the recipient's Interchain Security Module (ISM). 3. A relayer delivers the message to the recipient by calling `Mailbox.process()`. 4. The Mailbox verifies the message with the recipient’s ISM and calls `recipient.handle()` to deliver the message. **How can I see the status of a message I have sent?** Paste an address or transaction hash into the search bar of the [Hyperlane Message Explorer](https://explorer.hyperlane.xyz/) to view details about a message’s status and history. If the message has failed to send for some reason, there will be error messages indicating what may have gone wrong. See [Explorer Debugging](/docs/guides/explorer/explorer-debugging) for more information. **Does sending interchain messages with Hyperlane mean live chat & text?** No, Hyperlane is a protocol designed to allow smart contracts on different chains to interact with each other. When we refer to message-passing, it’s the sending of arbitrary bytes between smart contracts rather than peer-to-peer or text messaging. For chat use cases, consider [XMTP](https://xmtp.org/) , [Push](https://push.org/) , or [Orbis](https://useorbis.com/) . **Is Hyperlane a token bridge?** Not exactly. Hyperlane is a general message passing (GMP) protocol that allows communication between blockchains. Token bridges are just one of many types of applications that can be built on top of Hyperlane! ### Deployment[​](#deployment "Direct link to Deployment") **Where is Hyperlane deployed?** A list of known deployments can be found on the [contract addresses](/docs/reference/addresses/mailbox-addresses) page. ### Advanced Topics[​](#advanced-topics "Direct link to Advanced Topics") **How is Hyperlane secured?** Hyperlane is secured by its modular security stack featuring Interchain Security Modules (ISMs). Developers can configure various pre-built ISMs, compose them with each other, or even create custom ISMs based on their application's needs. A modular approach to security ensures that Hyperlane will continue to stay up to the latest industry advances in security models. **How many validators does Hyperlane have, and who operates them?** The number of validators depend on the Interchain Security Module (ISM) configuration. The Default ISM uses a specific validator set, and you can view the details such as threshold, operator and address [here](/docs/reference/default-ism-validators) . **How can we ensure message integrity?** Hyperlane's message security is driven by the Interchain Security Module (ISM) configuration. By default, messages rely on the Default ISM's validator set, which requires a quorum of validators to sign for security. In the unlikely event of a validator compromise, the security of messages could be impacted. However, developers have the flexibility to configure their own ISM, enabling them to customize and strengthen the security model to suit their application's needs. **Does the source chain receive confirmation whether the transaction was executed on the destination chain?** Currently, the source chain does not automatically receive a confirmation of execution from the destination chain. However, this functionality can be added by customizing the `handle` function on the destination chain. For more information, refer to the [handle function](/docs/reference/messaging/receive#handle) . **Why are outbound message IDs stored in the Merkle tree?** Outbound message IDs are stored in the Merkle tree to efficiently track and verify messages. This mechanism ensures validators can accurately detect and sign new messages as they are created. **Why do validators call `MerkleTreeHook.latestCheckpoint()`?** Validators use the [`MerkleTreeHook.latestCheckpoint()`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/5e9b8ba7ab0f54e92b3cf32806fae95eb23ad0f8/solidity/contracts/hooks/MerkleTreeHook.sol#L49) function to determine when new transactions need to be indexed. This polling mechanism ensures validators can immediately start signing new messages without the need to backfill the entire tree. Community & Contributions[​](#community--contributions "Direct link to Community & Contributions") --------------------------------------------------------------------------------------------------- **How can I join the Hyperlane community?** You can join the [Discord](http://discord.gg/hyperlane) or follow Hyperlane on [Twitter](http://x.com/hyperlane) , where you can find a growing community of developers and enthusiasts to chat about the interchain future. **I'm interested in working on Hyperlane. Where can I see job openings?** Check out our open roles [here](https://jobs.lever.co/Hyperlane) . **How can I contribute to improve this documentation?** You can make a PR to edit this documentation directly via the [docs repo](https://github.com/hyperlane-xyz/v3-docs) . **Where can I get support or ask questions about Hyperlane?** You can get support and ask questions on our [Hyperlane Discord](https://discord.com/invite/hyperlane) , where the community and team are active and ready to assist. * [General Questions](#general-questions) * [Technical Questions](#technical-questions) * [Messaging](#messaging) * [Deployment](#deployment) * [Advanced Topics](#advanced-topics) * [Community & Contributions](#community--contributions) --- # Create your own Hook & ISM | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Create your own Hook & ISM ========================== Hooks and ISMs have a complementary relationship: you can customize your behavior from origin and they use a pairwise ISM contract on the destination to verify your custom hook behavior. You can implement and utilize your own hook and ISM pattern as per your requirements. You can use an external bridge provider like Wormhole or Chainlink's CCIP by implementing the `IPostDispatchHook` interface on the source chain and `IInterchainSecurityModule` on the destination chain. `IPostDispatchHook` Interface * Solidity interface IPostDispatchHook { enum Types { UNUSED, ROUTING, AGGREGATION, MERKLE_TREE, INTERCHAIN_GAS_PAYMASTER, FALLBACK_ROUTING, ID_AUTH_ISM, PAUSABLE, PROTOCOL_FEE, LAYER_ZERO_V1, RATE_LIMITED, ARB_L2_TO_L1, OP_L2_TO_L1 } /** * @notice Returns an enum that represents the type of hook */ function hookType() external view returns (uint8); /** * @notice Returns whether the hook supports metadata * @param metadata metadata * @return Whether the hook supports metadata */ function supportsMetadata( bytes calldata metadata ) external view returns (bool); /** * @notice Post action after a message is dispatched via the Mailbox * @param metadata The metadata required for the hook * @param message The message passed from the Mailbox.dispatch() call */ function postDispatch( bytes calldata metadata, bytes calldata message ) external payable; /** * @notice Compute the payment required by the postDispatch call * @param metadata The metadata required for the hook * @param message The message passed from the Mailbox.dispatch() call * @return Quoted payment for the postDispatch call */ function quoteDispatch( `IInterchainSecurityModule` Interface * Solidity interface IInterchainSecurityModule { enum Types { UNUSED, ROUTING, AGGREGATION, LEGACY_MULTISIG, MERKLE_ROOT_MULTISIG, MESSAGE_ID_MULTISIG, NULL, // used with relayer carrying no metadata CCIP_READ, ARB_L2_TO_L1, WEIGHTED_MERKLE_ROOT_MULTISIG, WEIGHTED_MESSAGE_ID_MULTISIG, OP_L2_TO_L1 } /** * @notice Returns an enum that represents the type of security model * encoded by this ISM. * @dev Relayers infer how to fetch and format metadata. */ function moduleType() external view returns (uint8); /** * @notice Defines a security model responsible for verifying interchain * messages based on the provided metadata. * @param _metadata Off-chain metadata provided by a relayer, specific to * the security model encoded by the module (e.g. validator signatures) * @param _message Hyperlane encoded interchain message * @return True if the message was verified */ function verify( info Hooks currently expect metadata to be formatted with the [`StandardHookMetadata` library](/docs/reference/libraries/hookmetadata) . You can also inherit from our `AbstractMessageIdAuthorizedIsm` which allows for access control for an intermediate `verifyMessageId` function call which sets in storage the messageId to true if received from the authorized `AbstractMessageIdAuthHook` hook. This pattern is used currently in the [`OpStackHook`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/ef2ece300e71a30e8f4f59e5b26e21eea012d43b/solidity/contracts/hooks/OPStackHook.sol#L33C8-L33C8) <> [`OpStackIsm`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/ef2ece300e71a30e8f4f59e5b26e21eea012d43b/solidity/contracts/isms/hook/OPStackIsm.sol#L31) pattern. ### Workflow[​](#workflow "Direct link to Workflow") ### Interface[​](#interface "Direct link to Interface") After implementing the above interfaces, you can override default hook along the hook metadata by using the overloaded `dispatch` call in our mailbox: * Solidity * @notice Dispatches a message to the destination domain & recipient.* @param destinationDomain Domain of destination chain* @param recipientAddress Address of recipient on destination chain as bytes32* @param messageBody Raw bytes content of message body* @param metadata Metadata used by the post dispatch hook* @param hook Custom hook to use instead of the default* @return The message ID inserted into the Mailbox's merkle tree ### Examples[​](#examples "Direct link to Examples") origin: abstracttestnet * [abstracttestnet](#origin=abstracttestnet) * [alephzeroevmtestnet](#origin=alephzeroevmtestnet) * [alfajores](#origin=alfajores) * [arbitrumsepolia](#origin=arbitrumsepolia) * [arcadiatestnet2](#origin=arcadiatestnet2) * [basesepolia](#origin=basesepolia) * [berabartio](#origin=berabartio) * [bsctestnet](#origin=bsctestnet) * [camptestnet](#origin=camptestnet) * [citreatestnet](#origin=citreatestnet) * [ecotestnet](#origin=ecotestnet) * [formtestnet](#origin=formtestnet) * [fuji](#origin=fuji) * [holesky](#origin=holesky) * [hyperliquidevmtestnet](#origin=hyperliquidevmtestnet) * [inksepolia](#origin=inksepolia) * [odysseytestnet](#origin=odysseytestnet) * [optimismsepolia](#origin=optimismsepolia) * [plumetestnet](#origin=plumetestnet) * [polygonamoy](#origin=polygonamoy) * [scrollsepolia](#origin=scrollsepolia) * [sepolia](#origin=sepolia) * [soneiumtestnet](#origin=soneiumtestnet) * [sonictestnet](#origin=sonictestnet) * [suavetoliman](#origin=suavetoliman) * [superpositiontestnet](#origin=superpositiontestnet) * [tangletestnet](#origin=tangletestnet) * [treasuretopaz](#origin=treasuretopaz) * [unichaintestnet](#origin=unichaintestnet) destination: alephzeroevmtestnet * [abstracttestnet](#destination=abstracttestnet) * [alephzeroevmtestnet](#destination=alephzeroevmtestnet) * [alfajores](#destination=alfajores) * [arbitrumsepolia](#destination=arbitrumsepolia) * [arcadiatestnet2](#destination=arcadiatestnet2) * [basesepolia](#destination=basesepolia) * [berabartio](#destination=berabartio) * [bsctestnet](#destination=bsctestnet) * [camptestnet](#destination=camptestnet) * [citreatestnet](#destination=citreatestnet) * [ecotestnet](#destination=ecotestnet) * [formtestnet](#destination=formtestnet) * [fuji](#destination=fuji) * [holesky](#destination=holesky) * [hyperliquidevmtestnet](#destination=hyperliquidevmtestnet) * [inksepolia](#destination=inksepolia) * [odysseytestnet](#destination=odysseytestnet) * [optimismsepolia](#destination=optimismsepolia) * [plumetestnet](#destination=plumetestnet) * [polygonamoy](#destination=polygonamoy) * [scrollsepolia](#destination=scrollsepolia) * [sepolia](#destination=sepolia) * [soneiumtestnet](#destination=soneiumtestnet) * [sonictestnet](#destination=sonictestnet) * [suavetoliman](#destination=suavetoliman) * [superpositiontestnet](#destination=superpositiontestnet) * [tangletestnet](#destination=tangletestnet) * [treasuretopaz](#destination=treasuretopaz) * [unichaintestnet](#destination=unichaintestnet) body: * Solidity * CosmWasm * Sealevel // send message from abstracttestnet to alephzeroevmtestnet TestRecipientIMailbox mailbox = IMailbox("0x28f448885bEaaF662f8A9A6c9aF20fAd17A5a1DC");IPostDispatchHook merkleTree = IPostDispatchHook("0x7fa6009b59F139813eA710dB5496976eE8D80E64");mailbox.dispatch( 2039, "0x0000000000000000000000009EC79CA89DeF61BFa2f38cD4fCC137b9e49d60dD", bytes("Hello, world"), "0x", // empty metadata merkleTree); 🚧 Coming soon! 🚧 🚧 Coming soon! 🚧 * On the source chain, * `mailbox.dispatch()` calls your custom hook via `AbstractMessageIdAuthHook.postDispatch()`. * `_postDispatch` checks whether `latestDispatchedId` is the id being dispatched from the hook to make the mailbox is the contract calling the hook (since calling `postDispatch` isn't access controlled) * `_sendMessageId` calls your custom external bridge logic like calling the CCIP router contract. * On the destination chain, * the external bridge will call `verifyMessageId` function (which is access-controlled) and sets the `messageId` in the `verifiedMessages` mapping to true. * on receiving the message for the relayer, the mailbox will call your ISM contract (specified in your recipient address) which checks if the messageId in the `verifiedMessages` mapping is true and returns true to the mailbox and vice versa. warning `AbstractMessageIdAuthorizedIsm` can send `msg.value` through `postDispatch` calls and we utilize the `verifiedMessages`' little endian 255 bits for storing the `msg.value` and the top bit for the actual receipt of the messageId delivery. Therefore, you can send up to 2^255 amount of value of the native token from origin and the destination ISM can only receive 2^255 amount of value of native token on the destination chain. ### Access Control[​](#access-control "Direct link to Access Control") If `postDispatch` must only be called with a `message` that was _just_ dispatched, the `latestDispatchedId` function on the Mailbox can be used to verify the message was _actually_ dispatched. info This is used instead of some `require(mailbox == msg.sender)` to support **composition** where a hook may pass a `message` along to another hook. * Solidity The following utility is provided in the [`MailboxClient` library](/docs/reference/libraries/mailboxclient) for convenience. * @notice Sets the address of the application's custom interchain security module.* @param _module The address of the interchain security module contract.*/ * [Workflow](#workflow) * [Interface](#interface) * [Examples](#examples) * [Access Control](#access-control) --- # Deploy an EVM \<-> SVM Warp Route | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Deploy an EVM <-> SVM Warp Route ================================ Prerequisites[​](#prerequisites "Direct link to Prerequisites") ---------------------------------------------------------------- Ensure you have the following installed and configured: * [Hyperlane Monorepo](https://github.com/hyperlane-xyz/hyperlane-monorepo) * Rust (latest stable version) * Yarn and Node.js (latest stable version) * Solana CLI tools Walkthrough[​](#walkthrough "Direct link to Walkthrough") ---------------------------------------------------------- ### Step 1: Create the Warp Route Directory[​](#step-1-create-the-warp-route-directory "Direct link to Step 1: Create the Warp Route Directory") 1. In `./rust/sealevel/environments/${environment}`, create a directory called `warp-routes` 2. Inside `warp-routes`, create a new directory for your Warp Route deployment, e.g., e.g. `environments/mainnet3/warp-routes/pzeth` 3. **Optional:** If you want to, open a PR to the `hyperlane-registry` with metadata to associate with the synthetic token in the Warp Route. Example [here](https://github.com/hyperlane-xyz/hyperlane-registry/pull/142) . * **Tip:** Although not critical, for the `image` field try to pick a source that is unlikely to break the URL ### Step 2: Deploy on the SVM Side[​](#step-2-deploy-on-the-svm-side "Direct link to Step 2: Deploy on the SVM Side") 4. From here on, to deploy on the SVM side you can also follow our official guide for tips: [Deploy SVM Warp Route](https://docs.hyperlane.xyz/docs/guides/deploy-svm-warp-route) 5. Create `token-config.json` for the SVM configuration, e.g. { "solana": { "type": "synthetic", "decimals": 9, "name": "Renzo Restaked LST", "symbol": "pzETH", "uri": "", "interchainGasPaymaster": "5FG1TUuhXGKdMbbH8uHEnUghazD4aVfEPAgKLNGNx3SL", "remoteDecimals": 18 }} * Often EVM tokens have 18 decimals, which are too large for the SVM. The pattern is to bridge them into SOL as 9 decimals. This can be done using `remoteDecimals: 18`. 6. Run the deployment command: cargo run -- -k ~/solana-mainnet-deployer-keypair.json warp-route deploy \--warp-route-name pzeth \--environment mainnet3 \--environments-dir ../environments \--built-so-dir ../../target/deploy \--token-config-file ../environments/mainnet3/warp-routes/pzeth/token-config.json \--chain-config-file ../environments/mainnet3/chain-config.json \--ata-payer-funding-amount 50000000 ### Step 3: Deploy on the Ethereum Side[​](#step-3-deploy-on-the-ethereum-side "Direct link to Step 3: Deploy on the Ethereum Side") 7. Deploy the Ethereum Warp Route contract, which will also enroll the SVM router based on the yaml token config. 1. Check out the monorepo branch from this [PR#4447](https://github.com/hyperlane-xyz/hyperlane-monorepo/pull/4447) 2. Build the TS code from project root: `yarn && yarn build` 3. Run the CLI from source: `yarn workspace @hyperlane-xyz/cli hyperlane` 4. Create a YAML Warp Route configuration file using this template and steps: * Set `interchainSecurityModule: "0x0000000000000000000000000000000000000000"` to use the default ISM set in the destination chain Mailbox * Set the `gas` to a ceiling of the compute units you expect the SVM message delivery transaction to take. For instance, Hyperlane Warp Routes have gas set to `300`. It's important for this to be an upper limit - the relayer will not deliver Warp Route transfer messages otherwise, because senders would pay an insufficient amount to have them delivered. ethereum: interchainSecurityModule: "0x0000000000000000000000000000000000000000" isNft: false mailbox: "0xc005dc82818d67AF737725bD4bf75435d065D239" owner: "0xa7ECcdb9Be08178f896c26b7BbD8C3D4E844d9Ba" token: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" type: collateral gas: 300000eclipsemainnet: foreignDeployment: "D6k6T3G74ij6atCtBiWBs5TbFa1hFVcrFUSGZHuV7q3Z" mailbox: "EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y" owner: "9bRSUPjfS3xS6n5EfkJzHFTRDa4AHLda8BU2pP4HoWnf" interchainSecurityModule: "0x0000000000000000000000000000000000000000" type: synthetic gas: 300000 5. Deploy using the Hyperlane CLI: * Run the deploy command, pointing to your YAML Warp Route config: `yarn workspace @hyperlane-xyz/cli hyperlane warp deploy --config /path/to/config/warp-route-deployment.yaml` * You’ll have the deployment artifact logged by the command, and also stored in your filesystem registry (currently `~/.hyperlane`). 6. Confirm the deployment using the Hyperlane CLI: $ cast call 0x1D622da2ce4C4D9D4B0611718cb3BcDcAd008DD4 'routers(uint32)(bytes32)' $DESTINATION_DOMAIN --rpc-url $(rpc ethereum) 13998111490xe9792265ec273ffc17731af890d3e9963e9d744e7b99f02491911ce1bb75b8cb ### Step 4: Update the SVM token-config.json[​](#step-4-update-the-svm-token-configjson "Direct link to Step 4: Update the SVM token-config.json") 8. Back to Solana tooling now, update the `token-config.json` with the foreign deployment: The fields for `ethereum` should be set to values from the Warp Route contract artifact. `token` should be set to `collateralAddressOrDenom` (the address of the token being bridge), and `foreignDeployment` should be set to `addressOrDenom` (the address of the Warp Route contract, like `HypERC20Collateral`). { "solana": { "type": "synthetic", "decimals": 9, "name": "Renzo Restaked LST", "symbol": "pzETH", "uri": "", "interchainGasPaymaster": "5FG1TUuhXGKdMbbH8uHEnUghazD4aVfEPAgKLNGNx3SL", "remoteDecimals": 18 }, "ethereum": { "type": "collateral", "decimals": 18, "token": "0x8c9532a60e0e7c6bbd2b2c1303f63ace1c3e9811", "foreignDeployment": "0x1D622da2ce4C4D9D4B0611718cb3BcDcAd008DD4" }} ### Step 5: Deployment[​](#step-5-deployment "Direct link to Step 5: Deployment") 9. Run the final deployment command: cargo run -- -k ~/solana-mainnet-deployer-keypair.json warp-route deploy \--warp-route-name pzeth \--environment mainnet3 \--environments-dir ../environments \--built-so-dir ../../target/deploy \--token-config-file ../environments/mainnet3/warp-routes/pzeth/token-config.json \--chain-config-file ../environments/mainnet3/chain-config.json \--ata-payer-funding-amount 50000000 * [Prerequisites](#prerequisites) * [Walkthrough](#walkthrough) * [Step 1: Create the Warp Route Directory](#step-1-create-the-warp-route-directory) * [Step 2: Deploy on the SVM Side](#step-2-deploy-on-the-svm-side) * [Step 3: Deploy on the Ethereum Side](#step-3-deploy-on-the-ethereum-side) * [Step 4: Update the SVM token-config.json](#step-4-update-the-svm-token-configjson) * [Step 5: Deployment](#step-5-deployment) --- # Deploy Hyperlane with Local Agents | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Deploy Hyperlane with Local Agents ================================== tip This guide is for advanced users who may eventually intend to run Hyperlane agents in a production-like environment. It will cover the basics of how to manually configure and run agents but **it is not a production setup guide**. Terminology[​](#terminology "Direct link to Terminology") ---------------------------------------------------------- The "**local chain**" is your new chain that you want to deploy Hyperlane onto. A "**remote chain**" is a chain with an existing Hyperlane deployment that you want your local chain to send & receive messages to & from. Overview[​](#overview "Direct link to Overview") ------------------------------------------------- There are six steps in this guide: 1. [**Set up keys**](#1-set-up-keys) that you will use to deploy contracts and run validators and relayers. 2. [**Deploy contracts**](#2-deploy-contracts) to the local chain and to every remote chain with which the local chain will be able to send and receive messages. 3. [**Run a validator**](#3-run-a-validator) to provide the signatures needed for the Interchain Security Modules you deployed. 4. [**Run a relayer**](#4-run-a-relayer) to send and receive messages between the chains you deployed contracts to. 5. [**Send a test message**](#5-send-test-messages) to confirm that your relayer is able to deliver messages to and from each pair of chains. 6. [**Deploy a Warp Route**](#6-optional-deploy-a-warp-route) to send token value, not just messages, across chains. Getting Started[​](#getting-started "Direct link to Getting Started") ---------------------------------------------------------------------- 1\. Set up keys[​](#1-set-up-keys "Direct link to 1. Set up keys") ------------------------------------------------------------------- There are three keys you must set up and fund. tip To get started, you can simplify by using the same hexadecimal key for all three roles. | Key Role | Description | Funding Needs | | --- | --- | --- | | Contract Deployer | 32 byte hexadecimal private key | Funded on all the chains on which we need to deploy contracts. | | Validator Accounts | A list of validator addresses that will sign outbound messages from your local chain. Just one validator works to get started quickly. | A small amount so validators can announce the location of their signatures onchain with a one-time transaction | | Relayer Accounts | The single relayer you will operate requires an account on each chain it will deliver messages to & from | The relayer must have a balance on all chains it's relaying between. | For instructions on how to generate keys, see the [agent keys](/docs/operate/set-up-agent-keys) section. Your deployer key **must** be a hexadecimal key, while validator and relayer keys can be hexadecimal or AWS KMS. If deploying on a local network using [Foundry's Anvil](https://github.com/foundry-rs/foundry/tree/master/crates/anvil) , use the following command to fund your newly-generated account. It uses one of the pre-funded private keys to transfer 1 ETH to the address in the `$YOUR_TARGET_ADDRESS` environment variable. cast send $YOUR_TARGET_ADDRESS \--private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \--value $(cast tw 1) 2\. Deploy contracts[​](#2-deploy-contracts "Direct link to 2. Deploy contracts") ---------------------------------------------------------------------------------- Once you have set up deployer, validator, and relayer keys it's time to use the Hyperlane CLI to deploy smart contracts to the local and remote chains. On the local chain, we will deploy: * The core contracts, including a [Mailbox](/docs/reference/messaging/messaging-interface) that can be used to send and receive messages. On all chains, we will deploy: * A Multisig ISM that can be used to verify inbound messages from the other local & remote chains. * An `InterchainGasPaymaster`, which can be used to pay our relayer for delivering interchain messages. * A `TestRecipient`, which we will send messages to, in order to test that everything is working correctly. ### Setup[​](#setup "Direct link to Setup") First, install the [Hyperlane CLI](/docs/reference/cli) . npm install -g @hyperlane-xyz/cli #### Chains[​](#chains "Direct link to Chains") The deployment will require basic information about any chains it will be interacting with. If the target chains are not already in the [Hyperlane Registry](https://github.com/hyperlane-xyz/hyperlane-registry) , you must specify chain metadata for them. See the [CLI reference](/docs/reference/cli) for details. To see what chains are in the currently known, run the following command: hyperlane registry list To create a chain metadata config for any other chains, run the following command: hyperlane registry init Or you can define the config manually. See the [ChainMetadata type](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/sdk/src/metadata/chainMetadataTypes.ts#L62) for its schema. See [chain-config.yaml](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/cli/examples/chain-config.yaml) for an example. #### Core deployment with Multisig ISM[​](#core-deployment-with-multisig-ism "Direct link to Core deployment with Multisig ISM") Now the CLI will know how to interact with all your chains, but it will also need to know how to configure your Interchain Security Module (ISM). To initialize a core config with multisig ISM config, you can define it manually using JSON or YAML (see [example config here](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/cli/examples/core-config.yaml) ), or create it with the following command: hyperlane core init --advanced When asked about the ISM type, choose `messageIdMultisigIsm`. In the context of this guide, we will be using a 1/1 multisig, so choose a threshold of `1` and enter the address of your key. When asked about the default hook type and required hook type, choose `merkleTreeHook`. ### Dry Run a Core Deployment[​](#dry-run-a-core-deployment "Direct link to Dry Run a Core Deployment") note In order to execute a dry-run, you will need an Anvil node running in a separate terminal instance. To spin up an Anvil node, run `anvil`. For more on Anvil and installation, check out [Foundry's Anvil docs](https://book.getfoundry.sh/anvil/) . Prior to executing a deployment, you can perform a dry-run via `--dry-run ` or `-d ` to ensure that the deployment will be successful as well as provide analytics on the gas costs of deployment. This will not trigger any real transactions but will simulate a deployment to display a list of required contracts and their respective gas costs. In addition to validating your upcoming deployment, you can optionally provide the address of the EOA you intend to deploy with via `--from-address` or `-f`. This will ensure you have approximately enough funds to complete the deployment. hyperlane core deploy --dry-run chain1 \ --from-address $YOUR_DEPLOYER_ADDRESS \ # (optional) your account address to be impersonated via Anvil; defaults to the HYP_KEY env variable --registry \ # (optional) path to your primary registry; defaults to the Hyperlane github registry --overrides # (optional) path to a override registry; defaults to the local ./ path ### Deploy[​](#deploy "Direct link to Deploy") We're now ready to use the `core deploy` command to deploy the Hyperlane contracts. To pay for transactions, the command will need the contract deployer key from step 1, which can be provided via the `HYP_KEY` env variable or as a command argument. hyperlane core deploy ### Verify[​](#verify "Direct link to Verify") Deployment contract artifacts will be written to the configured registries. By default, you'll find the new addresses in the local directory you ran the command from (e.g. `./chains/chain1/addresses.yaml`). ### Agent configs[​](#agent-configs "Direct link to Agent configs") We are now ready to generate an agent config using our deployed contracts that will be used by the agents (Validator and Relayer) in the steps below. hyperlane registry agent-config --chains chain1 Set the `CONFIG_FILES` environment variable to the path of the agent config generated. export CONFIG_FILES=/full/path/to/configs/agent-config.json 3\. Run a validator[​](#3-run-a-validator "Direct link to 3. Run a validator") ------------------------------------------------------------------------------- Validators provide the security for messages sent _from_ your chain to remote chains. They're only required when using a [Multisig ISM](/docs/protocol/ISM/multisig-ISM) . Learn more about what validators do [here](/docs/protocol/agents/validators) . ### Setup directories[​](#setup-directories "Direct link to Setup directories") First, set the `CONFIG_FILES` environment variable to the path of the agent config generated in the [deploy contracts](#2-deploy-contracts) step. For example: export CONFIG_FILES=/full/path/to/configs/agent-config-{timestamp}.json Next, create a local directory for your validator to write its signatures to. Remember the path, as you will need this when configuring your validator. danger The validator signatures path will be written on-chain as part of the [validator announcement transaction](/docs/guides/implementation-guide#validator-announce) . **Be careful not to reveal any security-sensitive or personal information!** # Pick an informative name specific to the chain you're validatingexport VALIDATOR_SIGNATURES_DIR=/tmp/hyperlane-validator-signatures-# Create the directorymkdir -p $VALIDATOR_SIGNATURES_DIR warning You will not be able to mount anything in `/tmp` when running the agent via Docker on Mac. To counter this, create a local `tmp` directory to mount instead. # Create a local tmp directory that can be accessed by dockermkdir tmp# Pick an informative name specific to the chain you're validatingexport VALIDATOR_SIGNATURES_DIR=tmp/hyperlane-validator-signatures-# Create the directorymkdir -p $VALIDATOR_SIGNATURES_DIR ### Configure[​](#configure "Direct link to Configure") There are numerous parameters that validators can be configured with. For this guide, we are concerned with just a handful: | Parameter | Description | | --- | --- | | `--db` | Path for writing persistent data to disk. | | `--originChainName` | Name of the chain being validated (e.g. `ethereum`). | | `--checkpointSyncer.type` | Set to `localStorage` for this guide. | | `--checkpointSyncer.path` | Path to local directory where validator signatures will be written. Same path as `$VALIDATOR_SIGNATURES_DIR`. | | `--validator.key` | Your validator's hexadecimal private key. | info Make sure the validator key corresponds to the address provided when setting up your MultisigIsmConfig. Otherwise, the Multisig ISM you deployed in the previous step will not be able to verify messages sent from your chain. To learn more about all the parameters you can change, read the [agent configuration reference](/docs/operate/config-reference) . * Using Docker * Building from source **Update agent config** Unless you are running Docker on Linux, you will also need to update the agent configuration for your network. This is because Docker does not support the [`host` network mode](https://docs.docker.com/network/drivers/host/) on Mac, Windows or Windows Server. To do this, navigate to the agent-configuration at `$CONFIG_FILES` and replace all instances of "localhost" or "127.0.0.1" in to `host.docker.internal`. For example: ..."localnet1": { ... "rpcUrls": [ { // "http": "http://localhost:8545" // "http": "http://127.0.0.1:8545" "http": "http://host.docker.internal:8545" } ], ...},... **Mounting directories** Running with Docker adds an extra layer of complexity because config files need to be accessible from within the Docker container, and validator signatures need to be accessible from outside of the container for the relayer to read. This is so the relayer can construct the metadata required for the message to be successfully validated by the Multisig ISM. To solve this issue, you can mount directories on your file system into the container. In the arguments below, we: 1. Set the `$CONFIG_FILES` environment variable to a fixed path within the container. 2. Mount the agent config file to this fixed path and making it readonly. 3. Mount the persistent data directory at a fixed path within the container. 4. Mount the validator signatures directory to a fixed path within the container. ...-e CONFIG_FILES=/config/agent-config.json \--mount type=bind,source=$CONFIG_FILES,target=/config/agent-config.json,readonly \--mount type=bind,source="$(pwd)"/hyperlane_db_validator_,target=/hyperlane_db \--mount type=bind,source="$(pwd)"/$VALIDATOR_SIGNATURES_DIR,target=/tmp/validator-signatures \... Hardcoding these paths deduplicates the configuration between docker instances running validators for different origin chains. This makes it easier to pass the right arguments when running the container. See the example below, where the only items to be configured differently for different chains are the chain name and validator key. ..../validator \--db /hyperlane_db \--originChainName \--checkpointSyncer.type localStorage \--checkpointSyncer.path /tmp/validator-signatures \--validator.key ... **Clone and setup** First, clone the Hyperlane monorepo: git clone git@github.com:hyperlane-xyz/hyperlane-monorepo.git Then follow the [setup instructions](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/README.md) in the `rust` directory. This should setup `rustup` as well as Rosetta 2 if you are on Apple Silicon. # install rustupcurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh# (apple silicon only) install rosetta 2softwareupdate --install-rosetta --agree-to-license ### Run[​](#run "Direct link to Run") * Using Docker * Building from source Now that you understand more about configuring validator arguments, pull the latest docker image: docker pull --platform linux/amd64 gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.1.0 Before running, ensure that all directories you need to mount are present. This may involve creating `hyperlane_db_validator_` if it does not exist yet. mkdir -p hyperlane_db_validator_ Finally, run the validator: docker run \ -it \ -e CONFIG_FILES=/config/agent-config.json \ --mount type=bind,source=$CONFIG_FILES,target=/config/agent-config.json,readonly \ --mount type=bind,source="$(pwd)"/hyperlane_db_validator_,target=/hyperlane_db \ --mount type=bind,source="$(pwd)"/$VALIDATOR_SIGNATURES_DIR,target=/tmp/validator-signatures \ gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.1.0 \ ./validator \ --db /hyperlane_db \ --originChainName \ --checkpointSyncer.type localStorage \ --checkpointSyncer.path /tmp/validator-signatures \ --validator.key After following the setup instructions, you should now be able to use `cargo` to run the Validator: cargo run --release --bin validator -- \ --db ./hyperlane_db_validator_ \ --originChainName \ --checkpointSyncer.type localStorage \ --checkpointSyncer.path $VALIDATOR_SIGNATURES_DIR \ --validator.key (optional) Run the binary directly You can alternatively build out the agent: cargo build --release --bin validator And run the binary directly: ./target/release/validator \ --db ./hyperlane_db_validator_ \ --originChainName \ --checkpointSyncer.type localStorage \ --checkpointSyncer.path $VALIDATOR_SIGNATURES_DIR \ --validator.key For further information, check out the [Validators guide](/docs/operate/validators/run-validators) . 4\. Run a relayer[​](#4-run-a-relayer "Direct link to 4. Run a relayer") ------------------------------------------------------------------------- Relayers deliver interchain messages sent between the local and remote chains. Learn more about what relayers do [here](/docs/protocol/agents/relayer) . You should already have set the `CONFIG_FILES` environment variable to the path of the agent config generated in the [agent configs](#agent-configs) step. If not, do so now. export CONFIG_FILES=/full/path/to/configs/agent-config.json ### Configure[​](#configure-1 "Direct link to Configure") There are numerous parameters that relayers can be configured with. For this guide, we are concerned with just a handful: | Parameter | Description | | --- | --- | | `--db` | Path for writing persistent data to disk. | | `--relayChains` | Comma separated names of the chains to relay between. E.g. `ethereum,polygon,avalanche`. | | `--allowLocalCheckpointSyncers` | Allows the relayer to look for validator signatures on the local filesystem. | | `--defaultSigner.key` | A hexadecimal private key used to sign transactions for all chains. | | `--metrics-port` | Optional. The port to expose prometheus metrics on, defaults to `9090`. | tip Your set of relay chains should include both the origin chain and the destination chain. To learn more about all the parameters you can change, read the [agent configuration reference](/docs/operate/config-reference) . * Using Docker * Building from source **Mounting directories** For the relayer, we provide almost the same arguments to Docker as the validator: 1. Set the `$CONFIG_FILES` environment variable to a fixed path within the container. 2. Mount the agent config file to this fixed path and making it **readonly**. 3. Mount the persistent data directory at a fixed path within the container. 4. Mount the validator signatures directory to a fixed path within the container and making it **readonly**. ...-e CONFIG_FILES=/config/agent-config.json \--mount type=bind,source=$CONFIG_FILES,target=/config/agent-config.json,readonly \--mount type=bind,source="$(pwd)"/hyperlane_db_relayer,target=/hyperlane_db \--mount type=bind,source="$(pwd)"/$VALIDATOR_SIGNATURES_DIR,target=/tmp/validator-signatures,readonly \... Hardcoding these paths deduplicates the configuration between docker instances running relayers for different sets of chains. This makes it easier to pass the right arguments when running the container. See the example below, where the only items to be configured differently for different chains are the list of chains to relay between and the relayer key. **Clone and setup** If you haven't already done so, clone the Hyperlane monorepo and follow the [setup instructions](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/README.md) in the `rust` directory. # clone hyperlane monorepogit clone git@github.com:hyperlane-xyz/hyperlane-monorepo.git# install rustupcurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh# (apple silicon only) install rosetta 2softwareupdate --install-rosetta --agree-to-license ### Run[​](#run-1 "Direct link to Run") * Using Docker * Building from source If you haven't already pulled the Docker image, do this now by running: docker pull --platform linux/amd64 gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.1.0 Before running, ensure that all directories you need to mount are present. This may involve creating `hyperlane_db_relayer` if it does not exist yet. mkdir -p hyperlane_db_relayer Finally, run the relayer: docker run \ -it \ -e CONFIG_FILES=/config/agent-config.json \ --mount type=bind,source=$CONFIG_FILES,target=/config/agent-config.json,readonly \ --mount type=bind,source="$(pwd)"/hyperlane_db_relayer,target=/hyperlane_db \ --mount type=bind,source="$(pwd)"/$VALIDATOR_SIGNATURES_DIR,target=/tmp/validator-signatures,readonly \ gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.1.0 \ ./relayer \ --db /hyperlane_db \ --relayChains , \ --allowLocalCheckpointSyncers true \ --defaultSigner.key \ After following the setup instructions, you should now be able to use `cargo` to run the Relayer: cargo run --release --bin relayer -- \ --db ./hyperlane_db_relayer \ --relayChains , \ --allowLocalCheckpointSyncers true \ --defaultSigner.key \ --metrics-port 9091 The metrics port is overridden to avoid clashing with the validator. (optional) Run the binary directly You can alternatively build out the agent: cargo build --release --bin relayer And run the binary directly: ./target/release/relayer \ --db ./hyperlane_db_relayer \ --relayChains , \ --allowLocalCheckpointSyncers true \ --defaultSigner.key \ --metrics-port 9091 For further information, check out the [Relayer guide](/docs/operate/relayer/run-relayer) . 5\. Send test messages[​](#5-send-test-messages "Direct link to 5. Send test messages") ---------------------------------------------------------------------------------------- You can check everything is working correctly by sending a test message between pairs of chains. Initiate the message with the CLI. hyperlane send message --key $PRIVATE_KEY The `send message` command will inform you when the message is dispatched. After a short wait, a confirmation of delivery will be displayed. If the message delivery times out, it is likely that there's an issue with the Validator or Relayer setup in the steps above. To troubleshoot start by looking at the origin chain relayer logs. If you need further help, reach out on [Discord](https://discord.gg/hyperlane) . 6\. (Optional) Deploy a Warp Route[​](#6-optional-deploy-a-warp-route "Direct link to 6. (Optional) Deploy a Warp Route") -------------------------------------------------------------------------------------------------------------------------- To connect tokens using your new Hyperlane deployment, see the [Warp Route deployment guide](/docs/guides/deploy-warp-route) . * [Overview](#overview) * [Getting Started](#getting-started) * [1\. Set up keys](#1-set-up-keys) * [2\. Deploy contracts](#2-deploy-contracts) * [3\. Run a validator](#3-run-a-validator) * [Setup directories](#setup-directories) * [Configure](#configure) * [Run](#run) * [4\. Run a relayer](#4-run-a-relayer) * [Configure](#configure-1) * [Run](#run-1) * [5\. Send test messages](#5-send-test-messages) * [6\. (Optional) Deploy a Warp Route](#6-optional-deploy-a-warp-route) --- # Deploy an SVM Warp Route | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Deploy an SVM Warp Route ======================== Outcomes[​](#outcomes "Direct link to Outcomes") ------------------------------------------------- You will be deploying a Warp Route for an asset of your choice, between two SVM chains with an existing Hyperlane core deployment. At the time of writing this document, supported SVM chains are Solana and Eclipse, but you can find an up-to-date list [here](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/rust/sealevel/environments/mainnet3) (all chain directory names with a `core` subdirectory). info **If you want your SVM rollup supported as a core Hyperlane deployment, or are looking to set up an EVM to SVM Warp Route, [get in touch](https://forms.gle/KyRTaWvo4XNmNvrq6) !** Warp Route Types[​](#warp-route-types "Direct link to Warp Route Types") ------------------------------------------------------------------------- The type of token used determines the Warp Route type, so it's important to understand the different Warp Route contracts available: * [Native](https://docs.hyperlane.xyz/docs/protocol/warp-routes/warp-routes-types#native-token-warp-routes) : Handles the transfer of native gas tokens (e.g. SOL on Solana, ETH on Eclipse). * [Collateral](https://docs.hyperlane.xyz/docs/protocol/warp-routes/warp-routes-types#collateral-backed-erc20-warp-routes) : Handles the transfer of existing [Token-2022](https://spl.solana.com/token-2022) or [Token](https://spl.solana.com/token) tokens (the ERC20 equivalent on SVM). * [Synthetic](https://docs.hyperlane.xyz/docs/protocol/warp-routes/warp-routes-types#synthetic-erc20-warp-routes) : Handles synthetic tokens that are minted and burned as transfers occur through the Warp Route, to represent tokens from their origin chain. The tooling in this guide deploys a new Token-2022 token in this case, whose authority is set to the deployer key. Here are the common Warp Route setups (you can find more details [here](https://docs.hyperlane.xyz/docs/protocol/warp-routes/warp-routes-example-usage) ): * **Native to Synthetic**: Lock Native tokens on the origin chain to mint Synthetic ones on the destination. When transferring back, the Synthetic is burned. An example of this is a SOL Warp Route between Solana and Eclipse. * **Collateral to Synthetic**: Lock Collateral tokens on the origin chain to mint Synthetic ones on the destination. When transferring back, the Synthetic is burned. An example of this is a USDC Warp Route between Solana and Eclipse. * Other: **Native to Native** (such as ETH between Optimism and Arbitrum), as well as **Collateral to Collateral**, are also possible if the token already exists on both origin and destination chains. Rebalancing liquidity is an important consideration in this case. Before You Start[​](#before-you-start "Direct link to Before You Start") ------------------------------------------------------------------------- Deploying a Warp Route requires there to be a core Hyperlane deployment that is connected (i.e. actively relayed and secured) to the rest of the Hyperlane ecosystem. The core Hyperlane deployments used in this guide are Solana ([core artifacts](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/sealevel/environments/mainnet3/solanamainnet/core/program-ids.json) ) and Eclipse ([core artifacts](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/sealevel/environments/mainnet3/eclipsemainnet/core/program-ids.json) ). You may need to refer to these core artifacts throughout the guide. Walkthrough: Deploy a Sealevel Warp Route[​](#walkthrough-deploy-a-sealevel-warp-route "Direct link to Walkthrough: Deploy a Sealevel Warp Route") --------------------------------------------------------------------------------------------------------------------------------------------------- ### Step 1: Build the Warp Route Programs[​](#step-1-build-the-warp-route-programs "Direct link to Step 1: Build the Warp Route Programs") 1. Install `solana-cli 1.14.20` to build the Warp Route programs. Note that you **must** use this version, otherwise deployment may fail. sh -c "$(curl -sSfL https://release.solana.com/v1.14.20/install)" 2. Clone the [hyperlane-monorepo](https://github.com/hyperlane-xyz/hyperlane-monorepo) git clone https://github.com/hyperlane-xyz/hyperlane-monorepocd hyperlane-monorepo/rust/sealevel/programs 3. Build the Warp Route programs on your machine 1. Build the **Token** program: cd hyperlane-sealevel-tokencargo build-sbf 2. Build the **Token Collateral** program: cd hyperlane-sealevel-token-collateralcargo build-sbf 3. Build the **Token Native** program: cd hyperlane-sealevel-token-nativecargo build-sbf These steps **compile the Solana programs**, which is needed for deployment. To verify the build output, check the target/deploy directory for `.so` files in `hyperlane-monorepo/rust/sealevel/target/deploy` ### Step 2: Prepare for Deployment[​](#step-2-prepare-for-deployment "Direct link to Step 2: Prepare for Deployment") 1. To deploy the contracts, install `solana-cli 1.18.18`. Note that you **must** use this version, otherwise deployment may fail. sh -c "$(curl -sSfL https://release.solana.com/v1.18.18/install)" After installing you can verify the version with: solana --version 2. Create a **Solana keypair**. This key pays for the deployment and will be the owner of the deployed programs. An existing funded key can be used if you'd like. solana-keygen new --outfile ./warp-route-deployer-key.json * To read the public key you just created: solana-keygen pubkey ./warp-route-deployer-key.json * Check the balance: solana balance --keypair ./warp-route-deployer-key.json ### Step 3: Configure the Warp Route[​](#step-3-configure-the-warp-route "Direct link to Step 3: Configure the Warp Route") 1. Create a directory for your Warp Route in `rust/sealevel/environments/mainnet3/warp-routes` with the name you want your Warp Route deployment to have. mkdir -p rust/sealevel/environments/mainnet3/warp-routes/ For example, the existing SOL Warp Route between Solana and Eclipse lives in `rust/sealevel/environments/mainnet3/warp-routes/eclipsesol`. 2. Inside the directory you just created, create a configuration file named `token-config.json`. Configure the parameters of your Warp Route based on the `serde_json` serialization of the [TokenConfig](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/a5afd20f3ae69ccb3289d845d44b99dbdcde2c62/rust/sealevel/client/src/warp_route.rs#L114) Rust struct. The value to set for the `interchainGasPaymaster`, can be found in the [core deployment artifacts](#before-you-start) . The example below shows a testnet **Native to Synthetic Warp Route** that transfers SOL from Solana and mints synthetic SOL on Eclipse. You can also check [this configuration](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/a5afd20f3ae69ccb3289d845d44b99dbdcde2c62/rust/sealevel/environments/mainnet3/warp-routes/eclipsesol/token-config.json) of a production SOL Warp Route. { "solanatestnet": { "type": "native", "decimals": 9, "interchainGasPaymaster": "" }, "eclipsetestnet": { "type": "synthetic", "decimals": 9, "name": "Solana (testnet)", "symbol": "SOL", "uri": "" "interchainGasPaymaster": "" }} 3. (Optional) If your warp route creates a Synthetic token, you can open a PR to the `hyperlane-registry` with metadata to associate with this token (example PR [here](https://github.com/hyperlane-xyz/hyperlane-registry/pull/142) ). The `hyperlane-registry` also gives your Warp Route visibility within the Hyperlane ecosystem. ### Step 4: Deploy the Warp Route[​](#step-4-deploy-the-warp-route "Direct link to Step 4: Deploy the Warp Route") 1. Fund the new keypair on both networks the Warp Route is being deployed to. * The public key should be the same across SVM networks, but double check with the wallets recommended by each chain, by loading the private key into them. * The funding should be enough to cover rent for all accounts related to the Warp Route, pay for transaction fees, and fund the [ATA](https://www.alchemy.com/overviews/associated-token-account) payer accounts (more on this below). For reference, the observed rent from one Hyperlane Warp Route account is `2.35 SOL` on Solana and `0.025 ETH` on Eclipse, so it's a good idea to fund the key with at least `5 SOL` / `0.05 ETH`. 2. Deploy the warp route using the `warp-route deploy` subcommand from the `rust/sealevel/client` directory: Example usage: cargo run -- -k ./warp-route-deployer-key.json \warp-route deploy \--warp-route-name \--environment mainnet3 \--environments-dir ../environments \--built-so-dir ../target/deploy \--token-config-file ../environments/mainnet3/warp-routes//token-config.json \--chain-config-file ../environments/mainnet3/chain-config.json \--ata-payer-funding-amount 10000000 * Overview of CLI flags: * `--warp-route-name`: should match the directory name picked for the Warp Route earlier * `--environment`: keep as `mainnet3` * `--environments-dir ../environments`: keep as `../environments` * `--built-so-dir`: keep as `../../target/deploy`, as it points to the compilation output directory of Warp Route programs * `--token-config-file`: point this to the `token-config.json` file created earlier * `--chain-config-file`: keep as `../environments/mainnet3/chain-config.json`, as this file has been pre-populated with chain settings for all Hyperlane-supported chains * `--ata-payer-funding-amount`: this flag specifies by how much to fund the Warp Route [ATA](https://www.alchemy.com/overviews/associated-token-account) payer accounts on both chains the deployment happens on. It's expressed in the lowest currency denomination, which means that it's interpreted as Lamports on Solana and Gwei on Eclipse (since it uses ETH as its native currency). In the command below, the value `10000000` works out to `0.001` ETH and `0.001` SOL, which is enough for an initial deployment. ATA payers can always be topped up later, so it’s fine to pick a small value. For reference, every Warp Route transfer costs the ATA payer `0.000000001 SOL` (on Solana) and `0.000021 ETH` (on Eclipse) on the destination chain. info Note that since our goal was to make this tooling accessible to developers as soon as possible, it's not as reliable as we would hope. Please get in touch through a [GitHub issue](https://github.com/hyperlane-xyz/hyperlane-monorepo/issues) or via the `developers` channel on [Discord](https://discord.gg/2BYk6kV7) if you run into issues. #### Troubleshotting tips[​](#troubleshotting-tips "Direct link to Troubleshotting tips") * The script is unlikely to work from the first try due to network congestion and program size, but the script should be idempotent and skip contracts that were already deployed/initialized. * Errors like `Error: 11 write transactions failed` or `Error: Custom: Invalid blockhash` can always be retried by re-running the command. If retriable errors persist, consider increasing the compute unit price [here](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/44e0ff0733baf0da4d2b0304915f5f6cce92ffc7/rust/sealevel/client/src/cmd_utils.rs#L76) . * For other error types, you may need to close the buffers and programs of your deployer key and redeploy everything from scratch. To display buffers and programs and close them one by one, follow the commands below. Closing programs also helps recover their rent deposit. solana program show --programs --keypair ./warp-route-deployer-key.json --url solana program show --buffers --keypair ./warp-route-deployer-key.json --url # You'll need to add the `--bypass-warning` flag when closing program accounts (as opposed to closing buffers)solana program close --url * To increase the odds of the deployment succeeding faster, you can set a private RPC url in the `--chain-config-file` passed to the script. (e.g. in `solanamainnet.rpcUrls.http`) * If deploying a synthetic token, the command below will create a new token mint and use the metadata token extension to set the token name, symbol, and metadata json using the fields in the `--token-config-file` file, run `warp-route deploy`: # run from `rust/sealevel/client`cargo run -- -k ./warp-route-deployer-key.json warp-route deploy \ --warp-route-name eclipsesol \ --environment mainnet3 \ --environments-dir ../environments \ --built-so-dir ../../target/deploy \ --token-config-file ../environments/mainnet3/warp-routes/eclipsesol/token-config.json \ --chain-config-file ../environments/mainnet3/chain-config.json \ --ata-payer-funding-amount 10000000 Interacting with the Warp Route[​](#interacting-with-the-warp-route "Direct link to Interacting with the Warp Route") ---------------------------------------------------------------------------------------------------------------------- 1. **Query the Warp Route Program** You can check the program details like Mint Account, Mint Authority, and ATA payer account using the following command: # run from `rust/sealevel/client`cargo run -- -k ./warp-route-deployer-key.json \-u token query \--program-id Replace: * ``: e.g., [https://api.devnet.solana.com](https://api.devnet.solana.com) * ``: base58 address from program-ids.json (located in your warp-route directory). * ``: native|synthetic|collateral If deploying a synthetic token, query the Mint Authority account to check out the metadata: solana account --url 2. **Transfer Tokens Through the Warp Route** To test token transfers across chains, run the following command: # run from `rust/sealevel/client`cargo run -- -u \-k ./warp-route-deployer-key.json \token transfer-remote ./warp-route-deployer-key.json \ \ --program-id * ``: You'll need the domain ID of the chain you're sending to, which you can find in the chain's `metadata.yaml` entry from the [hyperlane-registry](https://github.com/hyperlane-xyz/hyperlane-registry/tree/main/chains) . * ``: base58 address from program-ids.json (located in your warp-route directory). * ``: Type of token on the origin chain, options are: native|synthetic|collateral 3. **Verify the Balance on the Destination Chain** Look for the balance of the recipient on the destination chain, by querying the Mint Account address: spl-token balance --owner ./warp-route-deployer-key.json \-u * The final parameter here is the SPL token ID. So if this is a synthetic warp route you want to check the balance of, you need to use the Mint address from a prior query you made a few steps ago. * You can also check out the last tx made to the recipient account in the explorer 4. **Explore Additional CLI Commands** This guide has made heavy use of the `hyperlane-sealevel-client` CLI from `hyperlane-monorepo`. You may find its various commands useful for configuring the Warp Route, making state queries, sending transfers, and more. Check out the other utilities it provides, in particular those under the `token` subcommand. # run from `rust/sealevel/client`cargo run -- --help warning For production deployments, we strongly recommend avoiding the use of hotkeys like those used in this guide. Instead, transfer ownership to a **multisig setup**, such as [Squads](https://squads.so/) , for enhanced security. * [Outcomes](#outcomes) * [Warp Route Types](#warp-route-types) * [Before You Start](#before-you-start) * [Walkthrough: Deploy a Sealevel Warp Route](#walkthrough-deploy-a-sealevel-warp-route) * [Step 1: Build the Warp Route Programs](#step-1-build-the-warp-route-programs) * [Step 2: Prepare for Deployment](#step-2-prepare-for-deployment) * [Step 3: Configure the Warp Route](#step-3-configure-the-warp-route) * [Step 4: Deploy the Warp Route](#step-4-deploy-the-warp-route) * [Interacting with the Warp Route](#interacting-with-the-warp-route) --- # How to Bridge a Token with Hyperlane Warp Routes | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page How to Bridge a Token with Hyperlane Warp Routes ================================================ This section provides a step-by-step walkthrough for creating an interchain token bridge by deploying Hyperlane Warp Route contracts. Prerequisites[​](#prerequisites "Direct link to Prerequisites") ---------------------------------------------------------------- * [Hyperlane CLI](/docs/reference/cli) * A private key for contract transaction signing 1\. Configuration[​](#1-configuration "Direct link to 1. Configuration") ------------------------------------------------------------------------- ### Warp Route deployment config[​](#warp-route-deployment-config "Direct link to Warp Route deployment config") To deploy the route, you will need a Warp Route deployment config file. A valid config will specify: * Which token, on which chain, is this Warp Route being created for? * _Optional:_ Hyperlane connection details, such as contract addresses for the [Mailbox](/docs/reference/messaging/messaging-interface) , [Interchain Gas](/docs/reference/hooks/interchain-gas) , and [Interchain Security Modules](/docs/reference/ISM/specify-your-ISM) . * _Optional:_ Token standard, including ERC20 (fungible tokens), ERC721 (NFTs), and ERC4626 (yield-bearing tokens). Note ERC721 support is experimental and some Hyperlane tooling won't work for NFTs yet. The easiest way to create a Warp Route deployment config file is with the CLI's config command: hyperlane warp init This command provides a walkthrough, prompting you for configuration choices directly in the terminal. You will be asked to select specific options for each part of the configuration, such as the network type, chains to connect, token type, and whether to use trusted ISMs. tip * If your config looks correct, you can now skip to [Step 2: Deployment](#2-deployment) . Or see below for details on how to define your config manually. * If you need any help setting up a token bridge, reach out on #developers on Discord or [get in touch](https://forms.gle/KyRTaWvo4XNmNvrq6) . #### Deployment config schema[​](#deployment-config-schema "Direct link to Deployment config schema") Your config consists of a map of chain names to deployment configs. Each config sets details about the token for which you are creating a Warp Route. * **type**: * Set this to `collateral` to create a basic Warp Route for an ERC20/ERC721 token * Set this to `collateralVault` to create a yield-bearing Warp Route for an ERC20 token that deposits into an existing ERC4626 vault * Set this to `native` to create a Warp Route for a native token (e.g. ether) * **address:** * If using `collateral`, the address of the ERC20/ERC721 contract for which to create a route * If using `collateralVault`, the address of the existing ERC4626 vault to deposit collateral into * **isNft:** If using `collateral` for an ERC721 contract, set to `true`. #### Optional fields[​](#optional-fields "Direct link to Optional fields") You may specify the following optional values in your config entries. If no values are provided, the deployer will attempt to pull these values from elsewhere. In the case of metadata (symbol, name decimals), it will query the contract. For addresses (mailbox, ISM) it will check the registry, either yours (if provided) or the [default](/docs/reference/registries#default-registry) . * **symbol:** The token symbol * **name:** The token name * **decimals:** The number of decimal places for the token * **mailbox:** The address of the [mailbox](/docs/reference/messaging/messaging-interface) contract to use to send and receive messages * **interchainSecurityModule:** The address of an [interchain security modules](/docs/reference/ISM/specify-your-ISM) to verify interchain messages #### Example[​](#example "Direct link to Example") For a minimal Warp deployment config example using local anvil chains, see [`warp-route-deployment.yaml`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/cli/examples/warp-route-deployment.yaml) . tip * Learn more about Warp Route types and the different configurations in the following sections: * [Warp Route Types](/docs/protocol/warp-routes/warp-routes-types) * [Warp Route Example Usage](/docs/protocol/warp-routes/warp-routes-example-usage) ### Chain Configurations[​](#chain-configurations "Direct link to Chain Configurations") The deployment will require basic information about any chains it will be interacting with. If the target chains are not already in the [Hyperlane Registry](https://github.com/hyperlane-xyz/hyperlane-registry) , you must specify chain metadata for them. See the [CLI reference](/docs/reference/cli) for details. To see what chains are in the currently known, run the following command: hyperlane registry list To create a chain metadata config for any other chains, run the following command: hyperlane registry init Or you can define the config manually. See the [ChainMetadata type](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/sdk/src/metadata/chainMetadataTypes.ts#L62) for its schema. See [chain-config.yaml](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/cli/examples/chain-config.yaml) for an example. warning Where possible, be sure to **reuse any existing chains** from the registry/CLI in your warp route config instead of setting up a new mailbox. 2\. Deploy the Warp Route[​](#2-deploy-the-warp-route "Direct link to 2. Deploy the Warp Route") ------------------------------------------------------------------------------------------------- Once your configuration is ready, initiate the Warp Route deployment with: hyperlane warp deploy During deployment, the CLI requires access to your private key to sign transactions. You can set this up in one of two ways: 1. **Environment Variable**: Set your private key as HYP\_KEY to avoid entering it each time: export HYP_KEY= 2. **Manual Entry**: Alternatively, you can enter the private key directly when prompted during deployment. The `hyperlane warp deploy` command will create two new artifact files: 1. `otherchain-yourchain-addresses.yaml`: Contains addresses for the newly deployed Warp Route contracts. 2. `otherchain-yourchain-config.yaml`: A config file for interacting with the Warp Route via the CLI and Warp UI. These files will be located under `$HOME/.hyperlane/deployments/warp_routes/`. 3\. Testing[​](#3-testing "Direct link to 3. Testing") ------------------------------------------------------- You can initiate a test transfer of a single wei with the following command: hyperlane warp send --relay --symbol TOKEN The `--relay` flag is optional and will relay the message to the destination chain. You can also run a relayer that delivers only for your warp route in the background with: hyperlane relayer --symbol TOKEN You can test in either direction between where you have the warp route set. However, if you deployed `native` or `collateral` warp route, you must select the origin where the route corresponding to where that `native` or `collateral` type is deployed. By default, the amount sent is `1` of the smallest unit of the token. tip **Next Steps** * If you were following the [Deploy Hyperlane to a new chain](/docs/deploy-hyperlane#3-warp-route) guide and want to connect other chains or move to production with Abacus Works, continue with the [Submit to Registry](/docs/deploy-hyperlane#4-submit-to-registry) guide. * For interacting with Warp Routes via a UI, continue to the [Warp UI docs](/docs/guides/deploy-warp-route-UI) . Learn More[​](#learn-more "Direct link to Learn More") ------------------------------------------------------- * Check out the [Warp Route](/docs/reference/applications/warp-routes) reference page for more information on the interface and security implications of a Warp Route. The [interface](/docs/reference/applications/warp-routes#interface) section covers calling `transferRemote` to transfer tokens to a specified recipient on a destination chain. Note that you'll have to prompt for a token approval prior to calling `transferRemote`. * A Warp Route is a type of [router](/docs/reference/libraries/router) application, a pattern enabling you to link multiple contracts across chains together. * [Prerequisites](#prerequisites) * [1\. Configuration](#1-configuration) * [Warp Route deployment config](#warp-route-deployment-config) * [Chain Configurations](#chain-configurations) * [2\. Deploy the Warp Route](#2-deploy-the-warp-route) * [3\. Testing](#3-testing) * [Learn More](#learn-more) --- # Deploying a Bridge UI for Hyperlane Warp Routes | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Deploying a Bridge UI for Hyperlane Warp Routes =============================================== After you've successfully [deployed a Warp Route](/docs/guides/deploy-warp-route) , you have two out-of-the-box options for setting up a frontend UI to support interchain token transfers: 1. **[Fork, customize, and deploy the Hyperlane Warp UI template](#fork--customize-the-ui) ** 2. **[Use a managed Superbridge instance](#superbridge) ** 1\. Hyperlane Warp UI Template[​](#1-hyperlane-warp-ui-template "Direct link to 1. Hyperlane Warp UI Template") ---------------------------------------------------------------------------------------------------------------- The [Hyperlane Warp UI template](https://github.com/hyperlane-xyz/hyperlane-warp-ui-template) is a prebuilt Next.JS app you can easily customize and deploy. * **Configuration**: Follow the [configuration instructions](https://github.com/hyperlane-xyz/hyperlane-warp-ui-template/blob/main/README.md) for details on how to configure the Warp UI Web application and run it locally. * **Customization**: Follow the [customization instructions](https://github.com/hyperlane-xyz/hyperlane-warp-ui-template/blob/main/CUSTOMIZE.md) for details on how to configure the UI's tokens and change the default branding assets/theme. ### Registry[​](#registry "Direct link to Registry") By default, the app will use the canonical Hyperlane registry published on NPM. To use a different registry, you can set a URL using the `NEXT_PUBLIC_REGISTRY_URL` environment variable. ### Warp Route Config Example[​](#warp-route-config-example "Direct link to Warp Route Config Example") Here's an example config for a Warp Route that connects USDC on Sepolia to Alfajores. You can use Typescript or YAML for your route configs. { tokens: [ { // The ChainName of the token chainName: "sepolia", // See https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/sdk/src/token/TokenStandard.ts standard: TokenStandard.EvmHypCollateral, // The token metadata (decimals, symbol, name) decimals: 6, symbol: "USDC", name: "USD Coin", // The router address addressOrDenom: "YOUR_ROUTER_ADDRESS_1", // The address of the underlying collateral token collateralAddress: "0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238", // A path to a token logo image logoURI: "/logos/usdc.png", // The list of tokens this one is connected to connections: [{ token: "ethereum|alfajores|YOUR_ROUTER_ADDRESS_2" }], }, { chainName: "alfajores", standard: TokenStandard.EvmHypSynthetic, decimals: 6, symbol: "USDC", name: "USD Coin", addressOrDenom: "YOUR_ROUTER_ADDRESS_2", logoURI: "/logos/usdc.png", connections: [{ token: "ethereum|alfajores|YOUR_YOUR_ROUTER_ADDRESS_2" }], }, ];} #### Chain Config Example[​](#chain-config-example "Direct link to Chain Config Example") Chain metadata can also be configured as needed. These are the same configs as those used with the CLI for any of its deploy or send command (for example, those from the [deploy guide](/docs/deploy-hyperlane) ). {anvil1: { chainId: 31337, name: 'anvil1', displayName: 'Anvil 1 Local', nativeToken: { name: 'Ether', symbol: 'ETH', decimals: 18 }, publicRpcUrls: [{ http: 'http://127.0.0.1:8545' }], blocks: { confirmations: 1, reorgPeriod: 0, estimateBlockTime: 10, }, logoURI: '/logo.svg' }} ### Deploy the UI[​](#deploy-the-ui "Direct link to Deploy the UI") Since the UI is a Next.js app, you can use your favorite hosting service to host it. We recommend [Vercel](https://vercel.com) , which works well with Next. [AWS Amplify](https://aws.amazon.com/amplify) is another popular option. 1. Sign up for [Vercel](https://vercel.com/) 2. Create a new project and connect it to your GitHub repo 3. Hit Deploy! And that's it! Now you and your users can use the UI to send tokens from the collateral chain to remote chains, from one remote chain to another, and from any remote chain back to the collateral chain. tip If there is no production relayer running for these chains, you can run a lightweight CLI relayer that delivers only for your warp route in the background with: hyperlane relayer --symbol TOKEN This will allow you to test the warp UI locally or for a quick demo without needing to run a full production relayer in the cloud. ### Return gas[​](#return-gas "Direct link to Return gas") A common problem with token bridges like Warp Routes is that a user may transfer a token like USDC to a new chain, but only afterwards realize that they do not have the native gas token to move those tokens anywhere including back. To improve the user experience, you could provide some native gas tokens via a faucet, in addition to UI warnings. To create a faucet, modify the Warp Route contracts to hold a balance of the native token to share with recipients. tip For developers looking to further customize the Warp UI for their own projects or build their own interchain applications, we encourage you to explore the [Typescript SDK](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/typescript/sdk) . The SDK contains a growing set of an utilities and abstractions for interacting with Hyperlane across different protocols (EVM, Cosmos, Solana). 2\. Superbridge[​](#2-superbridge "Direct link to 2. Superbridge") ------------------------------------------------------------------- [Superbridge](https://superbridge.app) is a custom bridge provider, they manage bridge frontends for hundreds of rollups, various tokens and different ecosystems. Getting a managed Superbridge for your warp route is a hassle-free approach to operating your bridge. A few of their most popular Hyperlane powered bridges are [Renzo's ezETH bridge](https://renzo.superbridge.app) and [Elixir's deUSD bridge](https://elixir.superbridge.app) . With a managed bridge instance, Superbridge will handle hosting, theming, upgrades & user support requests for your warp route. They've also built a handy feature that allows for self-service testing of recently deployed warp routes. ### Testing your warp route[​](#testing-your-warp-route "Direct link to Testing your warp route") 1. Navigate to the [Superbridge Hyperlane Playground](https://hyperlane.superbridge.app) 2. Click the settings cog and then click Customize ![](/assets/images/superbridge-settings-c82c5f7fb53e35ce62f68baf569920aa.png) 3. Paste in the YAML file you generated when deploying your warp routes ![](/assets/images/superbridge-paste-yaml-dae566951c43379273810df768545df4.png) 4. The specified tokens and networks will now be available for bridging. tip If any tokens or networks are missing after you've pasted in the YAML file, it's possible Superbridge doesn't support Hyperlane on this network just yet. [Reach out](mailto:support@superbridge.app) to Superbridge to see what the timeline is for adding support. ### Bridging Widget[​](#bridging-widget "Direct link to Bridging Widget") In addition to the hosted UI, Superbridge offers a bridging widget, so you can embed your bridge in your own site. Checkout their [Widget Demos](https://widget-demos.superbridge.app/) site for an overview of all the configuration options available. ### Go to Production[​](#go-to-production "Direct link to Go to Production") To bring your warp route to production with Superbridge, [reach out to the Superbridge team](mailto:alex@superbridge.app) . They can typically get a frontend up and running in about a day. * [1\. Hyperlane Warp UI Template](#1-hyperlane-warp-ui-template) * [Registry](#registry) * [Warp Route Config Example](#warp-route-config-example) * [Deploy the UI](#deploy-the-ui) * [Return gas](#return-gas) * [2\. Superbridge](#2-superbridge) * [Testing your warp route](#testing-your-warp-route) * [Bridging Widget](#bridging-widget) * [Go to Production](#go-to-production) --- # Unit testing - EVM | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Unit testing - EVM ================== Unit testing can prove to be challenging for a multichain setup with Foundry. Hence, we've provided a lightweight test environment [`MockHyperlaneEnvironment`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/mock/MockHyperlaneEnvironment.sol) for you to unit test your cross-chain app while avoiding the need to fork multiple networks. Most multichain apps will be built on top of our Mailbox contract. So, we've abstracted away the details of a deployed mailbox with a `MockMailbox` and our environment contains an `originMailbox` and a `destinationMailbox` on the same chain. Internally, we store the messages arriving to the destination in the `inboundMessages` mapping on the destination mailbox. We simulate message delivery by enqueuing messages and increment the `inboundProcessedNonce` with `MockMailbox.processNextInboundMessage()`. The setup for the simple messaging forge test is as following: ### Sending a message[​](#sending-a-message "Direct link to Sending a message") contract SimpleMessagingTest is Test { // origin and destination domains (recommended to be the chainId) uint32 origin = 1; uint32 destination = 2; // both mailboxes will be on the same chain but different addresses MockMailbox originMailbox; MockMailbox destinationMailbox; // contract which can receive messages TestRecipient receiver; function setUp() public { originMailbox = new MockMailbox(origin); destinationMailbox = new MockMailbox(destination); originMailbox.addRemoteMailbox(destination, destinationMailbox); receiver = new TestRecipient(); } function testSendMessage() public { string _message = "Aloha!"; originMailbox.dispatch( destination, TypeCasts.addressToBytes32(address(receiver)), bytes(_message) ); // simulating message delivery to the destinationMailbox destinationMailbox.processNextInboundMessage(); assertEq(string(receiver.lastData()), _message); }} ### Testing Router-based apps[​](#testing-router-based-apps "Direct link to Testing Router-based apps") Assuming you're testing `TestCrosschainApp` which inherits from `Router`: contract CrosschainAppTest is Test { // origin and destination domains (recommended to be the chainId) uint32 origin = 1; uint32 destination = 2; function setUp() public { environment = new MockHyperlaneEnvironment(origin, destination); // your cross-chain app TestCrosschainApp originTelephone = new TestCrosschainApp(environment.mailboxes(origin)); TestCrosschainApp destinationTelephone = new TestCrosschainApp(environment.mailboxes(destination)); // assuming you're inheriting the Router pattern from https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/client/Router.sol originTelephone.enrollRemoteRouter(destinationTelephone); destinationTelephone.enrollRemoteRouter(originTelephone); }} Call `processNextPendingMessage()` and `processNextPendingMessageFromDestination()` to process inbound messages for destination and origin mailboxes respectively. Now, you can make your cross-chain calls from origin to destination and vice-versa: function testRemoteTelephoneCallFromOrigin() public { // check behavior on origin vm.expectEmit(true, true, true, false); emit TelephoneRinging(destination, TypeCasts.bytes32ToAddress(destinationTelephone), "Hello!"); // example event on origin originTelephone.callRemote(destination, TypeCasts.bytes32ToAddress(destinationTelephone), "Hello!"); // simulating message delivery origin -> destination environment.processNextPendingMessage(); // check behavior on destination assertEq(destinationTelephone.latestMessage(originTelephone) == "Hello!"); } function testRemoteTelephoneCallFromDestination() public { // check behavior on destination vm.expectEmit(true, true, true, false); emit TelephoneRinging(origin, TypeCasts.bytes32ToAddress(originTelephone), "Howdy!"); // example event on destination destinationTelephone.callRemote(origin, TypeCasts.bytes32ToAddress(originTelephone), "Howdy!"); // simulating message delivery destination -> origin environment.processNextPendingMessageFromDestination(); // check behavior on origin assertEq(originTelephone.latestMessage(destinationTelephone) == "Howdy!"); } If you want to use your own ISM for your app, you can override the `defaultIsm` mailbox provides by passing it to the Router's `initialize` method like following: contract CrosschainAppTest is Test { // origin and destination domains (recommended to be the chainId) uint32 origin = 1; uint32 destination = 2; function setUp() public { ... TestIgp igp = new TestIgp(); // example InterchainGasPaymaster passed as the hook // deploy your own ISM contracts to verify messages between originTelephone and destinationTelephone TelephoneISM originIsm = new TelephoneISM(); // local ISM for origin TelephoneISM destinationIsm = new TelephoneISM(); // local ISM for destination originTelephone.initialize(address(igp), address(originIsm), msg.sender); originTelephone.initialize(address(igp), address(destinationIsm), msg.sender); ... }} tip You can find examples of our unit testing setup here: [InterchainAccountRouterTest](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/dae8b26ed65383844e4fbed7585deeb52da4e454/solidity/test/InterchainAccountRouter.t.sol#L38) * [Sending a message](#sending-a-message) * [Testing Router-based apps](#testing-router-based-apps) --- # How to Use the Hyperlane Explorer | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page How to Use the Hyperlane Explorer ================================= The [Hyperlane Explorer](https://explorer.hyperlane.xyz/) can be used to find messages on any network with a Hyperlane deployment. Drill down into messages for more details about their properties and status. Messages to/from [core chains](/docs/reference/domains) will be searchable by transaction hash, message ID, or sender/recipient address. For other chains, the explorer can be configured to search for messages by providing it a chain config. ### Searching for messages[​](#searching-for-messages "Direct link to Searching for messages") The [Hyperlane Explorer](https://explorer.hyperlane.xyz/) supports searching for messages using any of the following values: * Hash of the transaction that initiated the message (origin tx) * Hash of the transaction that delivered message (destination tx) * Address of the account that sent the origin transaction * Address of the account that sent the destination transaction * Address of the message sender * Address of the message recipient * ID of the message To search, enter your query into the top search bar. You can use the Origin Chain, Destination Chain, and Time filter options to narrow down your search. ![Explorer search bar](/assets/images/explorersearchbar-217567c30eb33109bcd1e15cba4fade9.png) info Note, by default the explorer will only find message on [core Hyperlane chains](/docs/reference/domains) . To view messages sent to and/or from other chains, see [Configuring PI Chains](/docs/guides/explorer/configuring-pi-chains) . ### Permissionless Interoperability[​](#permissionless-interoperability "Direct link to Permissionless Interoperability") The explorer can be configured to search for messages on any chain with a Hyperlane deployment. See [configuring PI Chains](/docs/guides/explorer/configuring-pi-chains) for details. ### Debugging Messages[​](#debugging-messages "Direct link to Debugging Messages") If you're trying to debug a problem with message delivery, the [explorer debugging](/docs/guides/explorer/explorer-debugging) page has useful tips. * [Searching for messages](#searching-for-messages) * [Permissionless Interoperability](#permissionless-interoperability) * [Debugging Messages](#debugging-messages) --- # Configuring New Chains in the Hyperlane Explorer | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Configuring New Chains in the Hyperlane Explorer ================================================ Hyperlane can be [deployed](/docs/deploy-hyperlane) to any chain by anyone, this open access is called Permissionless Interoperability (PI). However the messages on PI chains cannot be identified by the default Hyperlane Agents. To view details about messages from PI chains, first configure the explorer with metadata about that chain. Adding Chain Metadata to Hyperlane Explorer[​](#adding-chain-metadata-to-hyperlane-explorer "Direct link to Adding Chain Metadata to Hyperlane Explorer") ---------------------------------------------------------------------------------------------------------------------------------------------------------- 1. On the Explorer’s homepage, click either the Origin or Destination button to open the chain selection. This will open the chain selection modal. From there, click the plus icon in the top-right. ![](/assets/images/explorer-add-metadata-829a0bbd5df8dfd5cbd897be5bf18471.png) 2. On the form that appears, enter the chain’s metadata using JSON or YAML conforming to the [ChainMetadata schema](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/typescript/sdk/src/metadata/chainMetadataTypes.ts) . 3. If a valid Etherscan-based block explorer config is provided, the Hyperlane Explorer will utilize it to find the desired messages. If not, it will use the RPC URL. Note, Explorers with API keys (even just free-tier keys), perform faster and more reliably. ### Chain Metadata Examples[​](#chain-metadata-examples "Direct link to Chain Metadata Examples") **A minimal example in JSON:** { "chainId": 11155111, "name": "sepolia", "protocol": "ethereum", "rpcUrls": [{ "http": "https://foobar.com" }]} **A more detailed example in YAML:** # Yaml metadata exampleblockExplorers: - apiUrl: https://api-sepolia.etherscan.io/api family: etherscan name: Etherscan url: https://sepolia.etherscan.ioblocks: confirmations: 1 estimateBlockTime: 13 reorgPeriod: 2chainId: 11155111deployer: name: Abacus Works url: https://www.hyperlane.xyzdisplayName: SepoliadomainId: 11155111isTestnet: truename: sepolianativeToken: decimals: 18 name: Ether symbol: ETHprotocol: ethereumrpcUrls: - http: https://ethereum-sepolia.publicnode.com - http: https://ethereum-sepolia.blockpi.network/v1/rpc/public info If the origin or destination `domainId` of chains in your messages doesn't match their `chainId` then you must include the `domainId` field in your chain config. * [Adding Chain Metadata to Hyperlane Explorer](#adding-chain-metadata-to-hyperlane-explorer) * [Chain Metadata Examples](#chain-metadata-examples) --- # Explorer debugging | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Explorer debugging ================== Debugging failed messages[​](#debugging-failed-messages "Direct link to Debugging failed messages") ---------------------------------------------------------------------------------------------------- You'll know that a message failed to process because the message status near the top of the page will show as "Error" and the upper right section of the page will specify a reason why the message wasn't able to be processed. ![](/assets/images/tx-failing-eae7824e660e52f218338956b911be02.png) Failed transaction from Alfajores to Base Goerli. If your message was not delivered it can be due to several factors. ### Invalid destination[​](#invalid-destination "Direct link to Invalid destination") If the destination domain identifier (`uint32`) is not known to relay clients they will have no way to deliver your message. Refer to the [domains](/docs/reference/domains) for known domains and the canonical identifiers to use when sending messages to these destinations. ### Invalid recipient[​](#invalid-recipient "Direct link to Invalid recipient") If the recipient address (`bytes32`) is not a contract address that implements the `IMessageRecipient`, the relayer will not be able to deliver your message. // SPDX-License-Identifier: MIT OR Apache-2.0pragma solidity >=0.6.11;interface IMessageRecipient { function handle( uint32 _origin, bytes32 _sender, bytes calldata _message ) external payable;} warning EVM addresses (`address`) must be left-padded with zeroes to be compliant. Refer to the [TypeCasts library](/docs/reference/libraries/typecasts) for a `pure addressToBytes32` utility function, and the message [dispatch](/docs/reference/messaging/send#dispatch) section for other details. ### Unprocessable[​](#unprocessable "Direct link to Unprocessable") If the gas estimation of the message recipient's `IMessageRecipient.handle()` function fails, [relayers](/docs/protocol/agents/relayer) will not be able to deliver the message. Relayers will continue to estimate gas for message delivery, as state changes may allow for successful delivery of a previously undeliverable message. ![](/assets/images/call-revert-exception-4e5f2ea1eaf4a9476a69f89248e85402.png) Example exception of a transaction signed by validators but unprocessable by the relayer. info If you have a use case which is not accommodated by this behavior, **please reach out** [on Discord](https://discord.com/invite/hyperlane) . ### Underfunded[​](#underfunded "Direct link to Underfunded") An underfunded message implies the [interchain gas payments](/docs/reference/hooks/interchain-gas) made to deliver this message are insufficient. Relayers use the [`eth_estimateGas`](https://ethereum.github.io/execution-apis/api-documentation/) RPC on the destination chain to determine the absolute cost of relaying a message. If this amount exceeds the total amount of gas paid for on the origin chain, relayers will typically refuse to deliver a message. You can [manually pay for interchain gas](/docs/reference/hooks/interchain-gas#retrying) to resolve this. Using Etherscan[​](#using-etherscan "Direct link to Using Etherscan") ---------------------------------------------------------------------- You can also look at the [Etherscan](https://etherscan.io/) page of the recipient on the destination chain however be aware that the processing transaction won't show up on list of transactions as you would typically imagine. The reason for that is that relayers actually call the Mailbox contracts which in turn call the `handle` function on the recipient. Thus, you will find evidence of processing under the `Internal Txns` tab instead * [Debugging failed messages](#debugging-failed-messages) * [Invalid destination](#invalid-destination) * [Invalid recipient](#invalid-recipient) * [Unprocessable](#unprocessable) * [Underfunded](#underfunded) * [Using Etherscan](#using-etherscan) --- # GraphQL API | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page GraphQL API =========== The Hyperlane agents collect useful information about activity on the system, including all messages. That data can be queried via APIs. These APIs are currently available free of charge and without any required authentication. Connect your preferred GraphQL client or library to [https://api.hyperlane.xyz/v1/graphql](https://api.hyperlane.xyz/v1/graphql) to query data! ### Example Query[​](#example-query "Direct link to Example Query") The following query will retrieve useful information about a message: query MyQuery { message_view(limit: 10, where: {msg_id: {_eq: "\xYOUR_MSG_ID"}}) { msg_id nonce sender recipient is_delivered message_body origin_mailbox origin_domain_id origin_chain_id origin_block_id origin_block_height origin_block_hash origin_tx_sender origin_tx_recipient origin_tx_nonce origin_tx_max_priority_fee_per_gas origin_tx_max_fee_per_gas origin_tx_id origin_tx_hash origin_tx_gas_used origin_tx_gas_price origin_tx_gas_limit origin_tx_effective_gas_price origin_tx_cumulative_gas_used destination_block_id destination_block_hash destination_block_height destination_chain_id destination_domain_id destination_mailbox destination_tx_cumulative_gas_used destination_tx_effective_gas_price destination_tx_gas_limit destination_tx_gas_price destination_tx_gas_used destination_tx_hash destination_tx_id destination_tx_max_fee_per_gas destination_tx_max_priority_fee_per_gas destination_tx_nonce destination_tx_recipient destination_tx_sender send_occurred_at delivery_occurred_at delivery_latency num_payments total_payment total_gas_amount }} ### GraphQL Schema Types[​](#graphql-schema-types "Direct link to GraphQL Schema Types") type message_view { msg_id: bytea nonce: Int! sender: bytea recipient: bytea is_delivered: Boolean! message_body: bytea origin_mailbox: bytea origin_domain_id: Int! origin_chain_id: Int! origin_block_id: Int! origin_block_height: Int! origin_block_hash: bytea origin_tx_sender: bytea origin_tx_recipient: bytea origin_tx_nonce: Int! origin_tx_max_priority_fee_per_gas: Int! origin_tx_max_fee_per_gas: Int! origin_tx_id: Int! origin_tx_hash: bytea origin_tx_gas_used: Int! origin_tx_gas_price: Int! origin_tx_gas_limit: Int! origin_tx_effective_gas_price: Int! origin_tx_cumulative_gas_used: Int! destination_block_id: Int! destination_block_hash: bytea destination_block_height: Int! destination_chain_id: Int! destination_domain_id: Int! destination_mailbox: bytea destination_tx_cumulative_gas_used: Int! destination_tx_effective_gas_price: Int! destination_tx_gas_limit: Int! destination_tx_gas_price: Int! destination_tx_gas_used: Int! destination_tx_hash: bytea destination_tx_id: Int! destination_tx_max_fee_per_gas: Int! destination_tx_max_priority_fee_per_gas: Int! destination_tx_nonce: Int! destination_tx_recipient: bytea destination_tx_sender: bytea send_occurred_at: timestamp! delivery_occurred_at: timestamp! delivery_latency: Int! num_payments: Int! total_payment: Int! total_gas_amount: Int!}type block { domain: Int! domainByDomain: domain! hash: String! height: bigint! id: bigint! time_created: timestamp! timestamp: timestamp!}type domain { chain_id: bigint id: Int! is_deprecated: Boolean! is_test_net: Boolean! name: String! native_token: String! time_created: timestamp! time_updated: timestamp!}type gas_payment { amount: numeric! domain: Int! domainByDomain: domain! id: bigint! msg_id: String time_created: timestamp! transaction: transaction! tx_id: bigint!}type transaction { block: block! block_id: bigint! checkpoint_updates: [checkpoint_update!]! cumulative_gas_used: float8! delivered_messages: [delivered_message!]! effective_gas_price: float8 gas_limit: float8! gas_payments: [gas_payment!]! gas_price: float8 gas_used: float8! hash: String! id: bigint! max_fee_per_gas: float8 max_priority_fee_per_gas: float8 messages: [message!]! nonce: bigint! recipient: String sender: String! time_created: timestamp!} * [Example Query](#example-query) * [GraphQL Schema Types](#graphql-schema-types) --- # Manage Warp Route Limits on xERC20 and FiatToken | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Manage Warp Route Limits on xERC20 and FiatToken ================================================ xERC20 Deployments[​](#xerc20-deployments "Direct link to xERC20 Deployments") ------------------------------------------------------------------------------- Warp Routes support [`xERC20` tokens](https://github.com/defi-wonderland/xERC20) . Follow these steps to configure `xERC20` for Warp Route usage: 1. **Ownership Transfer**: * Ensure that the ownership of the [`xERC20` contract](https://github.com/defi-wonderland/xERC20/blob/main/solidity/contracts/XERC20.sol) is transferred to a secure multisig for security purposes. This step is crucial to prevent unauthorized changes. * The `xERC20` contract uses OpenZeppelin's `Ownable` interface. Use the `transferOwnership` function to complete this step. 2. **Mint Limit Configuration**: * The minting and burning limits for the Warp Route contract are managed through the [`setLimits`](https://github.com/defi-wonderland/xERC20/blob/main/solidity/contracts/XERC20.sol#L85) function in the `xERC20` contract. This function must be called by the contract owner. * The `xERC20` contract uses a 24-hour window to manage limits. This is defined by the [`_DURATION`](https://github.com/defi-wonderland/xERC20/blob/main/solidity/contracts/XERC20.sol#L13) variable, which is set to 1 days (24 hours). The current available limits are calculated dynamically using the [`_getCurrentLimit`](https://github.com/defi-wonderland/xERC20/blob/main/solidity/contracts/XERC20.sol#L234) function. * If 24 hours (`_DURATION`) have passed since the last use, the limit will automatically restore to the full `maxLimit`. * Ensure limits are appropriate for the expected volume to prevent disruptions. Review and adjust the limits based on transaction volumes and expected usage patterns. FiatToken Deployments[​](#fiattoken-deployments "Direct link to FiatToken Deployments") ---------------------------------------------------------------------------------------- Warp Routes support [Circle's Bridged USDC in the form of a minter for `FiatToken`](https://github.com/circlefin/stablecoin-evm) (See more on the repo for documentation). There are three roles that are relevant on the `FiatToken` and `MasterMinter` contracts: 1. **`MasterMinter` owner** is the account that can set controllers and minters. 2. **`MasterMinter` controller** is the account that can set the mint limits for its assigned minters. 3. **`MasterMinter` minter** is the account that can actually call `mint` on `FiatToken`. The owner and controller should typically be set to a Safe multisig for enhanced security, the minter is the Warp Route contract address on the local chain. Mint limits for `FiatToken` are absolute, meaning they do not reset automatically and must be updated if required. There are three actions that should be set on the `MasterMinter` contract to be ready for usage: 1. **Remove the previous test controller:**: * As the owner, remove the previous test controller via the [`removeController(address _controller)` function](https://github.com/circlefin/stablecoin-evm/blob/master/contracts/minting/Controller.sol#L87C14-L87C51) 2. **Set the controller and minter:** * As the owner, you should set the controller and minter via the [`configureController(address controller, address worker)` function](https://github.com/circlefin/stablecoin-evm/blob/master/contracts/minting/Controller.sol#L70) . The controller can be the same as the owner, the minter should be the warp route address. 3. **Set the mint limit for the minter:** * As the controller, you should set the mint limit for the minter via the [`configureMinter(uint256 _newAllowance)` function](https://github.com/circlefin/stablecoin-evm/blob/master/contracts/minting/MintController.sol#L116) . This limit is not being continuously reset, so either set it to a sufficiently large value (like `cast max-uint`) or monitor the usage and adjust accordingly. * [xERC20 Deployments](#xerc20-deployments) * [FiatToken Deployments](#fiattoken-deployments) --- # How to extend an existing Warp Route | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page How to extend an existing Warp Route ==================================== Using the Hyperlane CLI ======================= After deploying your warp route, you may want to extend it to a new chain. Extending a warp route involves deploying a new token contract on the target chain and enrolling existing tokens with it. You can extend an existing warp route using the [Hyperlane CLI](https://docs.hyperlane.xyz/docs/reference/cli) . Prerequisites[​](#prerequisites "Direct link to Prerequisites") ---------------------------------------------------------------- * The warp route config. * For new deployments, this config may take the filepath of `CURRENT_DIR/configs/warp-route-deployment.yaml`. * For existing deployment, the config can be generated by using `hyperlane warp read` if it exists in the Registry. * The warp route token symbol. * The token symbol can be found onchain, or in your local Hyperlane Registry. By default, it is written to `$HOME/.hyperlane/deployments/warp_routes/`. * Access to the private key that currently owns the warp route. warning Gnosis Safe Users: The EOA that owns the warp route must either be a Safe signer or [delegate](https://docs.safe.global/core-api/transaction-service-guides/delegates) to be able to propose update transactions. If you already have the warp config, skip to [Step 1](#step-1-configuration) . To generate the warp route config using the Hyperlane CLI, locate your token symbol on the chain on which it is deployed: hyperlane warp read --symbol You should see a similar warp routes selector: Hyperlane Warp Reader---------------------Multiple warp routes found for symbol eth? Select from matching warp routes ETH/ethereum-viction ETH/basesepolia ETH/holesky-sepolia❯ ETH/basesepolia-sepolia ETH/beta-gamma You can then choose the warp route to extend. After running `hyperlane warp read`, the CLI will display a config similar to the following: basesepolia: mailbox: "0x6966b0E55883d49BFB24539356a2f8A673E02039" owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" name: "Ether" symbol: "ETH" decimals: 18 totalSupply: "1" remoteRouters: "11155111": "0x8A73F6E36735d8C4b9A00Af910746173050B754E" type: "synthetic"sepolia: mailbox: "0xfFAEF09B3cd11D9b20d1a19bECca54EEC2884766" owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" name: "Ether" symbol: "ETH" decimals: 18 totalSupply: 0 remoteRouters: "84532": "0x26243aaD2d03AAbafaCE785808Ae64fc32aFB8A1" type: "native" This particular config has 2 chains: basesepolia and sepolia. This means messages can be relayed between both chains. By default, `warp read` will save the output to `CURRENT_DIR/configs/warp-route-deployment.yaml`. Follow these steps to add a chain to the existing warp route. Step 1: Configuration[​](#step-1-configuration "Direct link to Step 1: Configuration") --------------------------------------------------------------------------------------- Update the `warp-route-deployment.yaml` by adding a config for the new chain. warp-route-deployment.yaml sepolia: mailbox: "0xfFAEF09B3cd11D9b20d1a19bECca54EEC2884766" owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" name: "Ether" symbol: "ETH" decimals: 18 totalSupply: 0 remoteRouters: "84532": "0x26243aaD2d03AAbafaCE785808Ae64fc32aFB8A1" type: "native"basesepolia: mailbox: "0x6966b0E55883d49BFB24539356a2f8A673E02039" owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" name: "Ether" symbol: "ETH" decimals: 18 totalSupply: "1" remoteRouters: "11155111": "0x8A73F6E36735d8C4b9A00Af910746173050B754E" type: "synthetic"+ holesky:+ mailbox: "0x46f7C5D896bbeC89bE1B19e4485e59b4Be49e9Cc"+ owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"+ name: "Ether"+ symbol: "ETH"+ decimals: 18+ totalSupply: "1"+ type: "synthetic" warning EOA Users: The extended config `owner` must match the EOA address from the prerequisites step to avoid deployment failure. Step 2: Apply[​](#step-2-apply "Direct link to Step 2: Apply") --------------------------------------------------------------- Using the CLI, execute the command applicable to your warp route owner setup: * EOA * Gnosis Safe hyperlane warp apply \ --symbol \ --config $(pwd)/configs/warp-route-deployment.yaml Use this template to define and save a Gnosis Safe strategy: basesepolia: submitter: type: "gnosisSafe" chain: "basesepolia" safeAddress: "0x518489F9ed41Fc35BCD23407C484F31897067ff0"sepolia: submitter: type: "gnosisSafe" chain: "sepolia" safeAddress: "0x518489F9ed41Fc35BCD23407C484F31897067ff0"holesky: submitter: type: "gnosisSafe" chain: "holesky" safeAddress: "0x1f9090aaE28b8a3dCeaDf281B0F12828e676c326" In this case, each chain is a Gnosis Safe strategy with their respective Safe addresses. The Safe proposals **must be accepted** to complete the warp route extension. hyperlane warp apply \ --symbol \ --config $(pwd)/configs/warp-route-deployment.yaml \ --strategy gnosis-chain-strategy.yaml After executing, you should see a batch of transactions executed on chain, and a final message indicating that the warp config has been updated. Step 3: Confirm[​](#step-3-confirm "Direct link to Step 3: Confirm") --------------------------------------------------------------------- To confirm that the warp route was successfully extended using the Hyperlane CLI, run the following command with your token symbol on the chain it is deployed on: hyperlane warp read --symbol After running `warp read`, confirm that the warp route has been extended: basesepolia: mailbox: "0x6966b0E55883d49BFB24539356a2f8A673E02039" owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" name: "Ether" symbol: "ETH" decimals: 18 totalSupply: 0 remoteRouters: "17000": "0x9B18AfD7aB869C6B011F44638ff71786447B785B" "11155111": "0x4e63147e72d029Eb8b37F375B3837B2644622686" type: nativesepolia: mailbox: "0xfFAEF09B3cd11D9b20d1a19bECca54EEC2884766" owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" name: "Ether" symbol: "ETH" decimals: 18 totalSupply: "0" remoteRouters: "17000": "0x9B18AfD7aB869C6B011F44638ff71786447B785B" "84532": "0xB38cc797Ccc6D8763439a07CEa052AF253281de6" type: "synthetic"holesky: mailbox: "0x46f7C5D896bbeC89bE1B19e4485e59b4Be49e9Cc" owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" name: "Ether" symbol: "ETH" decimals: 18 totalSupply: "0" remoteRouters: "84532": "0xB38cc797Ccc6D8763439a07CEa052AF253281de6" "11155111": "0x4e63147e72d029Eb8b37F375B3837B2644622686" type: "synthetic" * [Step 1: Configuration](#step-1-configuration) * [Step 2: Apply](#step-2-apply) * [Step 3: Confirm](#step-3-confirm) --- # Quickstart: Run a Relayer | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Quickstart: Run a Relayer ========================= tip * This guide is for advanced users who may eventually intend to run Hyperlane agents in a production-like environment. It will cover the basics of how to manually configure and run agents but **it is not a production setup guide**. * For more detailed guide, check out the [Relayer guide](/docs/operate/relayer/run-relayer) . Terminology[​](#terminology "Direct link to Terminology") ---------------------------------------------------------- The "**local chain**" is your new chain that you want to deploy Hyperlane onto. A "**remote chain**" is a chain with an existing Hyperlane deployment that you want your local chain to send & receive messages to & from. Run a relayer[​](#run-a-relayer "Direct link to Run a relayer") ---------------------------------------------------------------- Relayers deliver interchain messages sent between the local and remote chains. Learn more about what relayers do [here](/docs/protocol/agents/relayer) . You should already have set the `CONFIG_FILES` environment variable to the path of the agent config generated in the [agent configs](#agent-configs) step. If not, do so now. export CONFIG_FILES=/full/path/to/configs/agent-config.json ### Configure[​](#configure "Direct link to Configure") There are numerous parameters that validators can be configured with. For this guide, we are concerned with just a handful: | Parameter | Description | | --- | --- | | `--db` | Path for writing persistent data to disk. | | `--relayChains` | Comma separated names of the chains to relay between. E.g. `ethereum,polygon,avalanche`. | | `--allowLocalCheckpointSyncers` | Allows the relayer to look for validator signatures on the local filesystem. | | `--defaultSigner.key` | A hexadecimal private key used to sign transactions for all chains. | | `--metrics-port` | Optional. The port to expose prometheus metrics on, defaults to `9090`. | tip Your set of relay chains should include both the origin chain and destination chain. To learn more about all the parameters you can change, read the [agent configuration reference](/docs/operate/config-reference) . * Using Docker * Building from source **Mounting directories** For the relayer, we provide almost the same arguments to Docker as the validator: 1. Set the `$CONFIG_FILES` environment variable to a fixed path within the container. 2. Mount the agent config file to this fixed path and making it **readonly**. 3. Mount the persistent data directory at a fixed path within the container. 4. Mount the validator signatures directory to a fixed path within the container and making it **readonly**. ...-e CONFIG_FILES=/config/agent-config.json \--mount type=bind,source=$CONFIG_FILES,target=/config/agent-config.json,readonly \--mount type=bind,source="$(pwd)"/hyperlane_db_relayer,target=/hyperlane_db \--mount type=bind,source="$(pwd)"/$VALIDATOR_SIGNATURES_DIR,target=/tmp/validator-signatures,readonly \... Hardcoding these paths deduplicates the configuration between docker instances running relayers for different sets of chains. This makes it easier to pass the right arguments when running the container. See the example below, where the only items to be configured differently for different chains are the list of chains to relay between and the relayer key. **Clone and setup** If you haven't already done so, clone the Hyperlane monorepo and follow the [setup instructions](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/README.md) in the `rust` directory. # clone hyperlane monorepogit clone git@github.com:hyperlane-xyz/hyperlane-monorepo.git# install rustupcurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh# (apple silicon only) install rosetta 2softwareupdate --install-rosetta --agree-to-license ### Run[​](#run "Direct link to Run") * Using Docker * Building from source If you haven't already pulled the Docker image, do this now by running: docker pull --platform linux/amd64 gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.1.0 Before running, ensure that all directories you need to mount are present. This may involve creating `hyperlane_db_relayer` if it does not exist yet. mkdir -p hyperlane_db_validator_ Finally, run the relayer: docker run \ -it \ -e CONFIG_FILES=/config/agent-config.json \ --mount type=bind,source=$CONFIG_FILES,target=/config/agent-config.json,readonly \ --mount type=bind,source="$(pwd)"/hyperlane_db_relayer,target=/hyperlane_db \ --mount type=bind,source="$(pwd)"/$VALIDATOR_SIGNATURES_DIR,target=/tmp/validator-signatures,readonly \ gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.1.0 \ ./relayer \ --db /hyperlane_db \ --relayChains , \ --allowLocalCheckpointSyncers true \ --defaultSigner.key \ After following the setup instructions, you should now be able to use `cargo` to run the Relayer: cargo run --release --bin relayer -- \ --db ./hyperlane_db_relayer \ --relayChains , \ --allowLocalCheckpointSyncers true \ --defaultSigner.key \ --metrics-port 9091 The metrics port is overridden to avoid clashing with the validator. (optional) Run the binary directly You can alternatively build out the agent: cargo build --release --bin relayer And run the binary directly: ./target/release/relayer \ --db ./hyperlane_db_relayer \ --relayChains , \ --allowLocalCheckpointSyncers true \ --defaultSigner.key \ --metrics-port 9091 * [Run a relayer](#run-a-relayer) * [Configure](#configure) * [Run](#run) --- # Message debugging | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) Message debugging ================= **Finding a message ID from an origin transaction** * EVM Origin * Cosmos Origin The easiest way is to use the [Hyperlane Explorer](https://explorer.hyperlane.xyz) , if your chain is supported. If your chain isn't supported, the message ID can be found by looking at the originating transaction. When viewing the origin transaction on the origin chain's block explorer, navigate to the **Logs** tab. The **`DispatchId`** log contains the message ID as the topic number 1 (the second topic). Sometimes, chain block explorers won't show the human-friendly "DispatchId" name. In this case, you can find the log by it's topic 0: `0x788dbc1b7152732178210e7f4d9d010ef016f9eafbe66786bd7169f56e0c353a`. ![](/assets/images/dispatch-id-log-evm-deaeb1c9c8719a08aadcdc5e1f3ad9ff.png) Example on Arbiscan showing the DispatchId log on an origin transaction. When viewing the origin transaction on the origin chain's block explorer, navigate to the **Event Logs** tab. The **Wasm Mailbox Dispatch Id** log contains the message ID. ![](/assets/images/dispatch-id-log-cosmos-943e24d3c9cfe5d3893fded566edeb21.png) Example on Mintscan showing the log on an origin transaction. **Debugging a message to a Cosmos chain** At the moment, the [Hyperlane Explorer](https://explorer.hyperlane.xyz) doesn't support non-EVM chains. To check if your message has been delivered, select the destination chain and input your message ID below: Destination Chain: neutron * [neutron](#Destination Chain=neutron) * [injective](#Destination Chain=injective) Message ID: Check if delivered **My warp route transfer says it was delivered, but I don’t see it** We can debug this with two steps: **Verifying if the funds were received:** * EVM Destination * Cosmos Destination 1. Open the block explorer for the destination chain, and navigate to your expected recipient address. 2. If you expect to receive a token (e.g. an ERC-20), check the Token Transfers tab for the token being transferred to your address. 3. If you expect to receive the native token (e.g. ETH, on Ethereum), check the "Internal Transactions" tab for the native token being transferred to your address. 1. Open the block explorer for the destination chain, and navigate to your expected recipient address. 2. View your "Coins" or "Tokens" tab, and look for the expected balance. 3. If it's not clear if your balance is what you expect, the check the list of transactions. Look for any transactions that include "Process". **Verifying the recipient of your transfer** * EVM Origin * Cosmos Origin When viewing the origin transaction on the origin chain's block explorer, navigate to the **Logs** tab. The **`SentTransferRemote`** log contains the recipient as the topic number 1 (the second topic). Sometimes, chain block explorers won't show the human-friendly "SentTransferRemote" name. In this case, you can find the log by it's topic 0: `0xd229aacb94204188fe8042965fa6b269c62dc5818b21238779ab64bdd17efeec`. The recipient address is the account on the destination chain that will receive the warped tokens. Zeroes are padded to the left of the address if needed. If your destination chain is an EVM chain, the log will display `0x0000000000000000000000ffffffffffffffffffffffffffffffffffffffff` to mean that `0xffffffffffffffffffffffffffffffffffffffff` is the transfer recipient. If your destination chain is a Cosmos chain, you can take the hexadecimal content and convert it to a bech32 address using tools like [this one](https://www.bech32converter.com) . Some Cosmos chains have different address lengths, so be conscious of how many characters to copy in. ![](/assets/images/transfer-remote-evm-80da0b9008b8324868dfbd4648d109be.png) Example on Arbiscan showing the DispatchId log on an origin transaction. When viewing the origin transaction on the origin chain's block explorer, navigate to the **Event Logs** tab. The log including **Transfer Remote** contains the message ID, for example: `Wasm Hpl Warp Native Transfer Remote`. The recipient address is the account on the destination chain that will receive the warped tokens. Zeroes are padded to the left of the address if needed. If your destination chain is an EVM chain, the log will display `0x0000000000000000000000ffffffffffffffffffffffffffffffffffffffff` to mean that `0xffffffffffffffffffffffffffffffffffffffff` is the transfer recipient. If your destination chain is a Cosmos chain, you can take the hexadecimal content and convert it to a bech32 address using tools like [this one](https://www.bech32converter.com) . Some Cosmos chains have different address lengths, so be conscious of how many characters to copy in. ![](/assets/images/transfer-remote-cosmos-49af79af2869e412c8a1b6285e7d95de.png) Example on Mintscan showing the log on an origin transaction. **My Warp Route transfer recipient isn't the address I wanted** Sometimes browser extension wallets can contend with one another, and the address of a wallet you don't typically use takes precedence over your intended wallet. We've seen this happen a few times with **OKX Wallet**. Please check all your wallet addresses for your recipient address. **Relaying an EVM → EVM message yourself** Using the [Hyperlane CLI](/docs/reference/cli) , it's possible to relay your message yourself if it's between two EVM chains. 1. Set up the CLI locally following [these instructions](/docs/reference/cli) . 2. Find your message ID following the [above instructions](#finding-a-message-id-from-an-origin-transaction) 3. Obtain a private key for an account with funds on your destination chain. 4. Run the command to relay the message: HYP_KEY= hyperlane status --relay --origin --destination --id For example: HYP_KEY=0xffff00000000000000000000000000000000000000000000000000000000ffff hyperlane status --relay --origin base --destination blast --id 0xabcd00000000000000000000000000000000000000000000000000000000abcd **I still need help with my message not being delivered** If the above steps haven't helped, you can join our [Discord](https://discord.com/invite/hyperlane) and create a new post in the **#support-forum** channel. --- # Implementation Guide | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Implementation Guide ==================== A Hyperlane implementation for a new chain architecture is comprised of the following: 1. [Contracts](#1-contracts) : expose the interface for application developers to send and receive messages with 2. [Agents](#2-agents) : operate the protocol by adding security and relaying messages 3. [Applications](#3-applications) : applications that use the protocol and demonstrate its capabilities Before getting started here, it is recommended to review the protocol documentation. info If you would like to dive deeper, check out some of the Hyperlane implementations that are currently available: * [Solidity](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/solidity) * [CosmWasm](https://github.com/many-things/cw-hyperlane) * [Sealevel](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/rust/sealevel) * [Cairo](https://github.com/astraly-labs/hyperlane_starknet) * [Sway](https://github.com/hyperlane-xyz/fuel-contracts) * [Move](https://github.com/movementlabsxyz/hyperlane-monorepo/tree/v3-aptos) 1\. Contracts[​](#1-contracts "Direct link to 1. Contracts") ------------------------------------------------------------- Below describes the onchain contract spec for the Hyperlane protocol. It uses solidity types for familiarity but everything should be generalizable to other languages. * `address` should be interpreted as the local chain's address type. * `payable` describes a function that allows callers to pass native tokens. * Ensure events are properly emitted for all important state changes. * Clearly document any deviations from the reference implementation and their rationale. ### Some things to consider[​](#some-things-to-consider "Direct link to Some things to consider") **Byte representation:** * Be aware that different chains may have different native types for representing bytes. For example, StarkNet uses felt252 for contract addresses, which may not fully accommodate 32-byte addresses used in other chains. * Implement proper conversion and validation mechanisms when dealing with cross-chain addresses. **Serialization:** * Pay close attention to how message fields are serialized, especially for variable-length data like the message body. * Ensure that the serialization method used (e.g., abi.encodePacked equivalent) behaves consistently across different chain implementations. ### Message[​](#message "Direct link to Message") The message is the core data structure used by the Hyperlane protocol. It is a packed data structure that contains all the information needed to route a message from one domain to another. * [Solidity](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/libs/Message.sol) * [Sway](https://github.com/hyperlane-xyz/fuel-contracts/blob/main/contracts/hyperlane-message/src/main.sw) * [CosmWasm](https://github.com/many-things/cw-hyperlane/blob/main/packages/interface/src/types/message.rs) * [Sealevel](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/main/hyperlane-core/src/types/message.rs) * [Cairo](https://github.com/astraly-labs/hyperlane_starknet/blob/main/cairo/crates/contracts/src/libs/message.cairo) struct Message { // The version of the origin and destination Mailboxes uint8 version, // A nonce to uniquely identify the message on its origin Mailbox uint32 nonce, // Domain of origin chain uint32 origin, // Address of sender on origin chain bytes32 sender, // Domain of destination chain uint32 destination, // Address of recipient on destination chain bytes32 recipient, // Raw bytes of message body bytes body} ### Mailbox[​](#mailbox "Direct link to Mailbox") The mailbox is the entrypoint for developers to send and receive messages from. Make sure that `localDomain` is immutable to prevent unauthorized changes that could compromise cross-chain security. * [Solidity Interface](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/interfaces/IMailbox.sol) Implementations: * [Solidity](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/Mailbox.sol) * [Sway](https://github.com/hyperlane-xyz/fuel-contracts/blob/main/contracts/hyperlane-mailbox/src/main.sw) * [CosmWasm](https://github.com/many-things/cw-hyperlane/blob/main/contracts/core/mailbox/src/execute.rs) * [Sealevel](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/sealevel/programs/mailbox/src/processor.rs) * [Cairo](https://github.com/astraly-labs/hyperlane_starknet/blob/main/cairo/crates/contracts/src/mailbox.cairo) info In addition to default and custom hooks, Hyperlane introduces the concept of a **Required Hook** that is used for post processing of ALL dispatches. Make sure to call the required hook before the default or custom hook. #### dispatch[​](#dispatch "Direct link to dispatch") Dispatches a message to the destination domain and recipient. function dispatch( // Domain of destination chain uint32 destination, // Address of recipient on destination chain as bytes32 bytes32 recipient, // Raw bytes content of message body bytes body) returns ( // The message ID inserted into the Mailbox's merkle tree bytes32 messageId); Dispatches a message to the destination domain and recipient, and provides metadata for the default hook. function dispatch( // Domain of destination chain uint32 destination, // Address of recipient on destination chain as bytes32 bytes32 recipient, // Raw bytes content of message body bytes body, // Metadata used by the default post dispatch hook bytes defaultHookMetadata) returns ( // The message ID inserted into the Mailbox's merkle tree bytes32 messageId); Dispatches a message to the destination domain and recipient, and provides metadata for a custom hook to use instead of the default. function dispatch( // Domain of destination chain uint32 destination, // Address of recipient on destination chain as bytes32 bytes32 recipient, // Raw bytes content of message body bytes body, // Metadata used by the custom post dispatch hook bytes customHookMetadata, // Custom hook to use instead of the default IPostDispatchHook customHook) returns ( // The message ID inserted into the Mailbox's merkle tree bytes32 messageId); #### process[​](#process "Direct link to process") Attempts to deliver `message` to its recipient. Verifies `message` via the recipient's ISM using the provided `metadata`. function process( // Metadata used by the ISM to verify message. bytes metadata, // Byte packed message bytes message); #### latestDispatchedId[​](#latestdispatchedid "Direct link to latestDispatchedId") Returns the latest dispatched message ID used for auth in post-dispatch hooks. function latestDispatchedId() public view returns (bytes32); ### Message Recipient[​](#message-recipient "Direct link to Message Recipient") A contract that wants to receive a message must expose the following handler. * [Solidity](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/interfaces/IMessageRecipient.sol) * [Sway](https://github.com/hyperlane-xyz/fuel-contracts/blob/main/contracts/hyperlane-interfaces/src/lib.sw) * [CosmWasm](https://github.com/many-things/cw-hyperlane/blob/main/packages/interface/src/core/mod.rs) * [Sealevel](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/sealevel/libraries/message-recipient-interface/src/lib.rs) * [Cairo](https://github.com/astraly-labs/hyperlane_starknet/blob/c0dbded927f340715bef8f6a8c6262f520ff3f1a/cairo/crates/contracts/src/interfaces.cairo#L131) function handle( // Domain of origin chain uint32 origin, // Address of sender on origin chain bytes32 sender, // Raw bytes content of message body bytes body); They may optionally specify a security module to verify messages before they are handled. function interchainSecurityModule() returns (address); info After implementing these three contracts, you can reach your first milestone to test, mocking a message transfer, by calling a `Mailbox`'s `dispatch` function to send a message to a recipient and assert that the recipient received the message. See a [Foundry test case here.](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/59e89afc5cbdec5362da5e13327eab4cb640b6b5/solidity/test/Messaging.t.sol#L29) ### Interchain Security Module[​](#interchain-security-module "Direct link to Interchain Security Module") Interchain security modules are used to verify messages before they are processed. * [Solidity](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/interfaces/IInterchainSecurityModule.sol) * [Sway](https://github.com/hyperlane-xyz/fuel-contracts/blob/main/contracts/hyperlane-interfaces/src/lib.sw) * [CosmWasm](https://github.com/many-things/cw-hyperlane/blob/main/packages/interface/src/ism/mod.rs) * [Sealevel](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/main/hyperlane-core/src/traits/interchain_security_module.rs) * [Cairo](https://github.com/astraly-labs/hyperlane_starknet/blob/c0dbded927f340715bef8f6a8c6262f520ff3f1a/cairo/crates/contracts/src/interfaces.cairo#L93) #### moduleType[​](#moduletype "Direct link to moduleType") Returns an enum that represents the type of security model encoded by this ISM. enum ModuleType { UNUSED, ROUTING, AGGREGATION, LEGACY_MULTISIG, MERKLE_ROOT_MULTISIG, MESSAGE_ID_MULTISIG, NULL, // used with relayer carrying no metadata CCIP_READ}function moduleType() returns (ModuleType); _Relayers infer how to fetch and format metadata from this type._ #### verify[​](#verify "Direct link to verify") Defines a security model responsible for verifying interchain messages based on the provided metadata. function verify( // Off-chain metadata provided by a relayer, specific // to the security model encoded by the module // (e.g. validator signatures) bytes metadata, // Hyperlane encoded interchain message bytes message) returns ( // True if the message was verified bool success); info **Static module management** - Our Solidity implementation defines MultisigISMs as static and part of the bytecode which might not be possible in other chains. You may need to implement dynamic modules for the ISM instead. ### Validator Announce[​](#validator-announce "Direct link to Validator Announce") Validators announce their signature storage location so that the relayer can fetch and verify their signatures. * [Solidity](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/interfaces/IValidatorAnnounce.sol) * [Sway](https://github.com/hyperlane-xyz/fuel-contracts/blob/main/contracts/validator-announce/src/interface.sw) * [CosmWasm](https://github.com/many-things/cw-hyperlane/blob/main/packages/interface/src/core/va.rs) * [Sealevel](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/sealevel/programs/validator-announce/src/instruction.rs) * [Cairo](https://github.com/astraly-labs/hyperlane_starknet/blob/main/cairo/crates/contracts/src/isms/multisig/validator_announce.cairo) ### announce[​](#announce "Direct link to announce") Announces a validator signature storage location function announce( address validator, // The address of the validator string storageLocation, // Information encoding the location of signed checkpoints bytes signature // The signed validator announcement) external returns (bool); ### getAnnouncedStorageLocations[​](#getannouncedstoragelocations "Direct link to getAnnouncedStorageLocations") Returns a list of all announced storage locations function getAnnouncedStorageLocations( address[] _validators // The list of validators to get storage locations for) external view returns ( string[][] // A list of registered storage metadata); ### Multisig ISM[​](#multisig-ism "Direct link to Multisig ISM") Implements a security module that checks if the metadata provided to verify satisfies a quorum of signatures from a set of configured validators. * [Solidity](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/isms/multisig/AbstractMultisigIsm.sol) * [Sway](https://github.com/hyperlane-xyz/fuel-contracts/blob/main/contracts/multisig-ism/src/main.sw) * [CosmWasm](https://github.com/many-things/cw-hyperlane/blob/main/packages/interface/src/ism/multisig.rs) * [Sealevel](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/rust/sealevel/programs/ism/multisig-ism-message-id) * Cairo [MerkleRoot](https://github.com/astraly-labs/hyperlane_starknet/blob/main/cairo/crates/contracts/src/isms/multisig/merkleroot_multisig_ism.cairo) and [MessageId](https://github.com/astraly-labs/hyperlane_starknet/blob/main/cairo/crates/contracts/src/isms/multisig/messageid_multisig_ism.cairo) #### Metadata[​](#metadata "Direct link to Metadata") To be used with the `MESSAGE_ID_MULTISIG` module type implementation in the relayer. * [Solidity](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/isms/libs/MessageIdMultisigIsmMetadata.sol) * [Sway](https://github.com/hyperlane-xyz/fuel-contracts/blob/main/contracts/multisig-ism-metadata/src/main.sw) * [CosmWasm](https://github.com/many-things/cw-hyperlane/blob/main/packages/interface/src/types/metadata.rs) * [Sealevel](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/sealevel/programs/ism/multisig-ism-message-id/src/processor.rs) * [Cairo](https://github.com/astraly-labs/hyperlane_starknet/blob/main/cairo/crates/contracts/src/libs/multisig/message_id_ism_metadata.cairo) The metadata must be formatted as follows: struct MultisigMetadata { // The address of the origin mailbox bytes32 originMailbox; // The signed checkpoint root bytes32 signedCheckpointRoot; // The concatenated signatures of the validators bytes signatures;} #### validatorsAndThreshold[​](#validatorsandthreshold "Direct link to validatorsAndThreshold") Returns the set of validators responsible for verifying message and the number of signatures required. _Can change based on the content of \_message_ function validatorsAndThreshold( // Hyperlane formatted interchain message bytes message) returns ( // The array of validator addresses address[] validators, // The number of validator signatures needed uint8 threshold); info After implementing the MultisigISM, you reach the second milestone to test that your Mailbox only processes after a recipient's ISM returns true. You can test that with a `TestISM` that you can statically set to accept or reject any message. See a [Foundry test case here.](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/59e89afc5cbdec5362da5e13327eab4cb640b6b5/solidity/test/Mailbox.t.sol#L282) ### Interchain Gas Paymaster[​](#interchain-gas-paymaster "Direct link to Interchain Gas Paymaster") The gas paymaster is used to pay for the gas required in message processing on the destination chain. This is not strictly required if the relayer is willing to subsidize message processing. warning Implement robust checks for sufficient gas payment, considering chain-specific token handling. Our solidity implementation charges native message value but for other chains, you may need to charge a specific token and scale the gas overhead and `tokenExchangeRate` accordingly. * [Solidity](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/hooks/igp/InterchainGasPaymaster.sol) * [Sway](https://github.com/hyperlane-xyz/fuel-contracts/blob/main/contracts/igp/interchain-gas-paymaster/src/main.sw) * [CosmWasm](https://github.com/many-things/cw-hyperlane/blob/main/contracts/igps/core/src) * [Sealevel](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/sealevel/programs/hyperlane-sealevel-igp/src/processor.rs) #### payForGas[​](#payforgas "Direct link to payForGas") Deposits msg.value as a payment for the relaying of a message to its destination chain. warning Although you can specify a `refundAddress`, overpayment **may not be refunded** to the message sender if you are composing hooks together. function payForGas( // The ID of the message to pay for. bytes32 messageId, // The domain of the message's destination chain. uint32 destination, // The amount of destination gas to pay for. uint256 gasAmount, // The local address to refund any overpayment to. address refundAddress) payable; #### GasPayment[​](#gaspayment "Direct link to GasPayment") Emitted when a payment is made for a message's gas costs. event GasPayment( bytes32 messageId, uint32 destinationDomain, uint256 gasAmount, uint256 payment); #### DestinationGasConfigSet[​](#destinationgasconfigset "Direct link to DestinationGasConfigSet") Emitted when the gas oracle for a remote domain is set. event DestinationGasConfigSet( uint32 remoteDomain, // remote domain address gasOracle, // gas oracle uint96 gasOverhead // destination gas overhead); 2\. Agents[​](#2-agents "Direct link to 2. Agents") ---------------------------------------------------- Below describes the agent spec for a new chain implementation. The rust implementations hope to support all chains, but the spec is intended to be chain agnostic. #### Message Indexing[​](#message-indexing "Direct link to Message Indexing") All agents must index messages from the origin mailbox. In the solidity mailbox, we [emit an event for each message](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/59e89afc5cbdec5362da5e13327eab4cb640b6b5/solidity/contracts/Mailbox.sol#L221-L222) dispatched. Other chains may have different ways of surfacing this information, but the agent must be able to get message content reliably and with consistent ordering -- see the [message indexer](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/main/hyperlane-core/src/traits/indexer.rs) trait. * [ethereum](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/main/chains/hyperlane-ethereum/src/contracts/mailbox.rs) ### Validator[​](#validator "Direct link to Validator") In addition to indexing messages dispatched from the mailbox, validators produce attestations for the messages they observe to be used on the destination chain for security. #### Checkpoint[​](#checkpoint "Direct link to Checkpoint") Validators produce attestations called checkpoints from the Mailbox which commit via merkle root to all dispatched message IDs. pub struct Checkpoint { /// The mailbox address pub mailbox_address: H256, /// The mailbox chain pub mailbox_domain: u32, /// The checkpointed root pub root: H256, /// The index of the checkpoint pub index: u32,} Validators use the latest checkpoint method on the [mailbox trait](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/main/hyperlane-core/src/traits/mailbox.rs) to get the latest checkpoint from the mailbox and submit signatures to some highly available storage using the [checkpoint syncer trait](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/main/hyperlane-base/src/traits/checkpoint_syncer.rs) . #### Checkpoint with Message ID[​](#checkpoint-with-message-id "Direct link to Checkpoint with Message ID") Validators use indexed messages to join the checkpoint with the corresponding message ID emitted from the mailbox. pub struct CheckpointWithMessageId { /// existing Hyperlane checkpoint struct #[deref] pub checkpoint: Checkpoint, /// hash of message emitted from mailbox checkpoint.index pub message_id: H256,} They also publish these augmented checkpoints on their syncer. tip You can test your validator by configuring it with a chain with the above contracts and observe that it creates valid signatures. ### Relayer[​](#relayer "Direct link to Relayer") In addition to indexing messages dispatched from the mailbox, a relayer processes messages on the destination chain. This requires building metadata that satisfies the message recipient's ISM verification requirements, and signing transactions that process the message on the destination mailbox. #### Metadata Builders[​](#metadata-builders "Direct link to Metadata Builders") Each module type implies a different metadata format for message verification to succeed. A Relayer will need each module trait (eg [multisig](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/main/hyperlane-core/src/traits/multisig_ism.rs) ) to be implemented. #### Message Processor[​](#message-processor "Direct link to Message Processor") The relayer will attempt to process messages on the destination mailbox (see [message processor](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/fa424826c0132c135511e5316a6e559b574b3a8f/rust/main/agents/relayer/src/msg/processor.rs#L28) ). If * the message recipient ISM returns an unknown module type * module type is known but metadata fails to verify * metadata verifies but dry running (gas estimation) message processing fails then the message will be kicked to an exponential backoff retry queue. The relayer relies on implementations of the [mailbox](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/main/hyperlane-core/src/traits/mailbox.rs) and [ism](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/main/hyperlane-core/src/traits/interchain_security_module.rs) traits for these checks. #### Gas Payment Enforcement[​](#gas-payment-enforcement "Direct link to Gas Payment Enforcement") The Relayer may also require gas payment for a specific message ID on the origin chain before processing the message on the destination chain. To do this, they must have an IGP deployed with their address set as beneficiary and index gas payment events. See [gas payment enforcement trait](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/main/agents/relayer/src/msg/gas_payment/mod.rs) . We recommend to start with no gas payment enforcement policy and then gradually support more restrictive ones. ### Testing[​](#testing "Direct link to Testing") Once you have implemented an MVP of the relayer, you should create an end-to-end test that: 1. Spins up local origin and destination chains. 2. Deploys your contracts onto both chains. 3. Run validators for the origin chain. 4. Run a relayer between both chains. 5. Observe that upon dispatch of a message of the origin chain, the validator observes the message, creates a signature and the relayer appropriately processes your message via the ISM that specifies the validator on the destination chain. See this [end-to-end test on the Rust codebase](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/main/utils/run-locally/src/main.rs) for inspiration. tip After validating the agents with local end-to-end tests, it is recommended that you also run end-to-end tests with real testnets. 3\. Applications[​](#3-applications "Direct link to 3. Applications") ---------------------------------------------------------------------- ### Warp Routes[​](#warp-routes "Direct link to Warp Routes") Token router application that routes tokens between domains on demand. * [Solidity](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/solidity/contracts/token) * [CosmWasm](https://github.com/many-things/cw-hyperlane/tree/main/packages/interface/src/warp) * [Sealevel](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/sealevel/libraries/hyperlane-sealevel-token/src/instruction.rs) #### transferRemote[​](#transferremote "Direct link to transferRemote") Transfers `amountOrId` token to `recipient` on `destination` domain. function transferRemote( // The Domain of the destination chain. uint32 destination, // The address of the recipient on the destination chain. bytes32 recipient, // The amount or identifier of tokens to be sent to the remote recipient. uint256 amountOrId) returns ( // The identifier of the dispatched message. bytes32 messageId); #### Transfer Message[​](#transfer-message "Direct link to Transfer Message") To be interoperable with Warp Routes on other chains, the `body` of a transfer message must be a byte packed `TransferMessage` struct. struct TransferMessage { // The recipient of the remote transfer bytes32 recipient; // An amount of tokens or a token identifier to be transferred uint256 amountOrId; // Optional metadata e.g. NFT URI information bytes metadata;} * [1\. Contracts](#1-contracts) * [Some things to consider](#some-things-to-consider) * [Message](#message) * [Mailbox](#mailbox) * [Message Recipient](#message-recipient) * [Interchain Security Module](#interchain-security-module) * [Validator Announce](#validator-announce) * [announce](#announce) * [getAnnouncedStorageLocations](#getannouncedstoragelocations) * [Multisig ISM](#multisig-ism) * [Interchain Gas Paymaster](#interchain-gas-paymaster) * [2\. Agents](#2-agents) * [Validator](#validator) * [Relayer](#relayer) * [Testing](#testing) * [3\. Applications](#3-applications) * [Warp Routes](#warp-routes) --- # Hyperlane Local Setup Guide: Sending Messages between Anvil Nodes | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Hyperlane Local Setup Guide: Sending Messages between Anvil Nodes ================================================================= This guide walks you through sending interchain messages between two local Anvil nodes using the Hyperlane CLI. Prerequisites[​](#prerequisites "Direct link to Prerequisites") ---------------------------------------------------------------- * **[Hyperlane CLI](https://docs.hyperlane.xyz/docs/reference/cli) :** Make sure you have the latest version of the Hyperlane CLI installed. npm install -g @hyperlane-xyz/cli * **[Anvil (foundry)](https://book.getfoundry.sh/getting-started/installation) :** Installed to run local chains. Install it via curl -L https://foundry.paradigm.xyz | bash * **Node.js** (v18 or later) * **Deployer Wallet Private Key**: You need a funded wallet for deploying contracts. This will be used as the HYP\_KEY. export HYP_KEY= Step-by-Step Guide[​](#step-by-step-guide "Direct link to Step-by-Step Guide") ------------------------------------------------------------------------------- ### 1\. Environment Setup: Create a working directory for the Hyperlane configuration:[​](#1-environment-setup-create-a-working-directory-for-the-hyperlane-configuration "Direct link to 1. Environment Setup: Create a working directory for the Hyperlane configuration:") mkdir hyperlane-local-test && cd hyperlane-local-test ### 2\. Start Two Distinct Anvil Nodes[​](#2-start-two-distinct-anvil-nodes "Direct link to 2. Start Two Distinct Anvil Nodes") We will run two Anvil nodes with unique chain IDs. * On a first terminal, start the first Anvil node: anvil --port 8545 --chain-id 31337 --block-time 1 * Runs on `http://localhost:8545`. * Chain ID: `31337`. * In a new terminal, start the second Anvil node: : anvil --port 8546 --chain-id 31338 --block-time 1 * Runs on `http://localhost:8546`. * Chain ID: `31338`. ### 3\. Initialize the Hyperlane Registry[​](#3-initialize-the-hyperlane-registry "Direct link to 3. Initialize the Hyperlane Registry") On a new terminal, use the Hyperlane CLI to create configurations for both Anvil nodes: hyperlane registry init Follow the prompts to set up `anvilnode1`. The CLI will ask you for the details of your chains including chainId and RPC URLs. Repeat the process for `anvilnode2`. This process will create `metadata.yaml` files under `$HOME/.hyperlane/chains/anvilnode1` and `$HOME/.hyperlane/chains/anvilnode2`. Example metadata: * **anvilnode1** chainId: 31337displayName: Anvilnode1domainId: 31337isTestnet: truename: anvilnode1nativeToken: decimals: 18 name: ETH symbol: ETHprotocol: ethereumrpcUrls: - http: http://localhost:8545 * **anvilnode2** chainId: 31338displayName: Anvilnode2domainId: 31338isTestnet: truename: anvilnode2nativeToken: decimals: 18 name: ETH symbol: ETHprotocol: ethereumrpcUrls: - http: http://localhost:8546 ### 4\. Deploy Core Contracts[​](#4-deploy-core-contracts "Direct link to 4. Deploy Core Contracts") We'll configure and deploy Hyperlane core contracts. tip You'll need the deployer wallet private key to deploy the core contracts. You can use `export HYP_KEY=''` to set the private key as an environment variable. hyperlane core init The deployment configuration will be saved to `./configs/core-config.yaml`. Next, deploy the core contracts: hyperlane core deploy Follow the prompts to select `anvilnode1`. The CLI will deploy Mailbox, Interchain Security Modules (ISMs), and other required contracts. Repeat the process for `anvilnode2`. Once complete, you’ll find `addresses.yaml` in `$HOME/.hyperlane/chains/anvilnode1` and `$HOME/.hyperlane/chains/anvilnode2`, with the deployed contract addresses. tip You should be able to see the messages of the contract deployments on your terminals running the local nodes. ### 5\. Send a Test Message[​](#5-send-a-test-message "Direct link to 5. Send a Test Message") Use the Hyperlane CLI to send a message from `anvilnode1` to `anvilnode2`. hyperlane send message --relay The CLI will prompt you to provide the origin chain (`anvilnode1`) and the destination chain (`anvilnode2`). tip For local testing, the `--relay` flag automatically relays the message to the destination chain. After sending the message, check the following: * Validator Logs: Look for entries indicating that signatures were generated and stored. * Relayer Logs: Look for successful metadata retrieval and message processing. * Anvil Logs: Ensure blocks were mined to process the transactions. success 🎉 You've sent a message between two local Anvil nodes using Hyperlane! Troubleshooting[​](#troubleshooting "Direct link to Troubleshooting") ---------------------------------------------------------------------- 1. “Could not fetch metadata” warning: * **Reason:** This occurs when the relayer cannot retrieve validator signatures required to process a message. Common causes: * The validator key lacks testnet funds. * The validator has not announced its storage locations. * **Solution:** * Ensure the validators have announced their storage locations. Check validator logs for a message such as: `Validator has announced signature storage location, locations: ["file:///tmp/hyperlane-validator-signatures-local"].` * Verify that each validator has a unique signature storage path (`--checkpointSyncer.path`) to prevent overwriting. * Confirm that the relayer has read access to the storage paths. 2. Messages time out: * **Reason:** Anvil doesn't auto-mine blocks by default, causing validators or relayers to wait indefinitely for new blocks. * **Solution:** Make sure to use the `--block-time 1 flag` when starting Anvil to auto-mine blocks every second. 3. Validator mismatch or misconfiguration: * **Reason:** The ISM configuration on the destination chain does not match the validator key(s) used by the origin chain. * **Solution:** Check that the ISM configuration includes the correct validator addresses. Validator logs can help identify the announced addresses. * [Prerequisites](#prerequisites) * [Step-by-Step Guide](#step-by-step-guide) * [1\. Environment Setup: Create a working directory for the Hyperlane configuration:](#1-environment-setup-create-a-working-directory-for-the-hyperlane-configuration) * [2\. Start Two Distinct Anvil Nodes](#2-start-two-distinct-anvil-nodes) * [3\. Initialize the Hyperlane Registry](#3-initialize-the-hyperlane-registry) * [4\. Deploy Core Contracts](#4-deploy-core-contracts) * [5\. Send a Test Message](#5-send-a-test-message) * [Troubleshooting](#troubleshooting) --- # Quickstart: Run a Validator | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Quickstart: Run a Validator =========================== tip * This guide is for advanced users who may eventually intend to run Hyperlane agents in a production-like environment. It will cover the basics of how to manually configure and run agents but **it is not a production setup guide**. * For more detailed guide, check out the [Validators guide](/docs/operate/validators/run-validators) Terminology[​](#terminology "Direct link to Terminology") ---------------------------------------------------------- The "**local chain**" is your new chain that you want to deploy Hyperlane onto. A "**remote chain**" is a chain with an existing Hyperlane deployment that you want your local chain to send & receive messages to & from. Run a validator[​](#run-a-validator "Direct link to Run a validator") ---------------------------------------------------------------------- Validators provide the security for messages sent _from_ your chain to remote chains. They're only required when using a [Multisig ISM](/docs/protocol/ISM/multisig-ISM) . Learn more about what validators do [here](/docs/protocol/agents/validators) . ### Setup directories[​](#setup-directories "Direct link to Setup directories") First, set the `CONFIG_FILES` environment variable to the path of the agent config generated in the [deploy contracts](#2-deploy-contracts) step. For example: export CONFIG_FILES=/full/path/to/configs/agent-config-{timestamp}.json Next, create a local directory for your validator to write its signatures to. Remember the path, as you will need this when configuring your validator. danger The validator signatures path will be written on-chain as part of the [validator announcement transaction](/docs/guides/implementation-guide#validator-announce) . **Be careful not to reveal any security-sensitive or personal information!** # Pick an informative name specific to the chain you're validatingexport VALIDATOR_SIGNATURES_DIR=/tmp/hyperlane-validator-signatures-# Create the directorymkdir -p $VALIDATOR_SIGNATURES_DIR warning You will not be able to mount anything in `/tmp` when running the agent via Docker on Mac. To counter this, create a local `tmp` directory to mount instead. # Create a local tmp directory that can be accessed by dockermkdir tmp# Pick an informative name specific to the chain you're validatingexport VALIDATOR_SIGNATURES_DIR=tmp/hyperlane-validator-signatures-# Create the directorymkdir -p $VALIDATOR_SIGNATURES_DIR ### Configure[​](#configure "Direct link to Configure") There are numerous parameters that validators can be configured with. For this guide, we are concerned with just a handful: | Parameter | Description | | --- | --- | | `--db` | Path for writing persistent data to disk. | | `--originChainName` | Name of the chain being validated (e.g. `ethereum`). | | `--checkpointSyncer.type` | Set to `localStorage` for this guide. | | `--checkpointSyncer.path` | Path to local directory where validator signatures will be written. Same path as `$VALIDATOR_SIGNATURES_DIR`. | | `--validator.key` | Your validator's hexadecimal private key. | info Make sure the validator key corresponds to the address provided when setting up your MultisigIsmConfig. Otherwise, the Multisig ISM you deployed in the previous step will not be able to verify messages sent from your chain. To learn more about all the parameters you can change, read the [agent configuration reference](/docs/operate/config-reference) . * Using Docker * Building from source **Update agent config** Unless you are running Docker on Linux, you will also need to update the agent configuration for your network. This is because Docker does not support the [`host` network mode](https://docs.docker.com/network/drivers/host/) on Mac, Windows or Windows Server. To do this, navigate to the agent-configuration at `$CONFIG_FILES` and replace all instances of "localhost" or "127.0.0.1" into `host.docker.internal`. For example: ..."localnet1": { ... "rpcUrls": [ { // "http": "http://localhost:8545" // "http": "http://127.0.0.1:8545" "http": "http://host.docker.internal:8545" } ], ...},... **Mounting directories** Running with Docker adds an extra layer of complexity because config files need to be accessible from within the Docker container, and validator signatures need to be accessible from outside of the container for the relayer to read. This is so the relayer can construct the metadata required for the message to be successfully validated by the Multisig ISM. To solve this issue, you can mount directories on your file system into the container. In the arguments below, we: 1. Set the `$CONFIG_FILES` environment variable to a fixed path within the container. 2. Mount the agent config file to this fixed path and making it readonly. 3. Mount the persistent data directory at a fixed path within the container. 4. Mount the validator signatures directory to a fixed path within the container. ...-e CONFIG_FILES=/config/agent-config.json \--mount type=bind,source=$CONFIG_FILES,target=/config/agent-config.json,readonly \--mount type=bind,source="$(pwd)"/hyperlane_db_validator_,target=/hyperlane_db \--mount type=bind,source="$(pwd)"/$VALIDATOR_SIGNATURES_DIR,target=/tmp/validator-signatures \... Hardcoding these paths deduplicates the configuration between docker instances running validators for different origin chains. This makes it easier to pass the right arguments when running the container. See the example below, where the only items to be configured differently for different chains are the chain name and validator key. ..../validator \--db /hyperlane_db \--originChainName \--checkpointSyncer.type localStorage \--checkpointSyncer.path /tmp/validator-signatures \--validator.key ... **Clone and setup** First, clone the Hyperlane monorepo: git clone git@github.com:hyperlane-xyz/hyperlane-monorepo.git Then follow the [setup instructions](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/README.md) in the `rust` directory. This should setup `rustup` as well as Rosetta 2 if you are on Apple Silicon. # install rustupcurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh# (apple silicon only) install rosetta 2softwareupdate --install-rosetta --agree-to-license ### Run[​](#run "Direct link to Run") * Using Docker * Building from source Now that you understand more about configuring validator arguments, pull the latest docker image: docker pull --platform linux/amd64 gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.1.0 Before running, ensure that all directories you need to mount are present. This may involve creating `hyperlane_db_validator_` if it does not exist yet. mkdir -p hyperlane_db_validator_ Finally, run the validator: docker run \ -it \ -e CONFIG_FILES=/config/agent-config.json \ --mount type=bind,source=$CONFIG_FILES,target=/config/agent-config.json,readonly \ --mount type=bind,source="$(pwd)"/hyperlane_db_validator_,target=/hyperlane_db \ --mount type=bind,source="$(pwd)"/$VALIDATOR_SIGNATURES_DIR,target=/tmp/validator-signatures \ gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.1.0 \ ./validator \ --db /hyperlane_db \ --originChainName \ --checkpointSyncer.type localStorage \ --checkpointSyncer.path /tmp/validator-signatures \ --validator.key After following the setup instructions, you should now be able to use `cargo` to run the Validator: cargo run --release --bin validator -- \ --db ./hyperlane_db_validator_ \ --originChainName \ --checkpointSyncer.type localStorage \ --checkpointSyncer.path $VALIDATOR_SIGNATURES_DIR \ --validator.key (optional) Run the binary directly You can alternatively build out the agent: cargo build --release --bin validator And run the binary directly: ./target/release/validator \ --db ./hyperlane_db_validator_ \ --originChainName \ --checkpointSyncer.type localStorage \ --checkpointSyncer.path $VALIDATOR_SIGNATURES_DIR \ --validator.key * [Run a validator](#run-a-validator) * [Setup directories](#setup-directories) * [Configure](#configure) * [Run](#run) --- # How to Remove Trusted Relayer ISM from Warp Route | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page How to Remove Trusted Relayer ISM from Warp Route ================================================= This guide explains how to remove the default Trusted Relayer ISM from your Warp Route using the Hyperlane CLI. Removing the Trusted Relayer ISM is a crucial step when preparing your Warp Route for production. Using the Hyperlane CLI ======================= When first deploying with the CLI, new warp routes use a Trusted Relayer ISM out of the box so you don't need to run a relayer or validator. In order to go to production, you'll need to remove this ISM with the [Hyperlane CLI](https://docs.hyperlane.xyz/docs/reference/cli) . Prerequisites[​](#prerequisites "Direct link to Prerequisites") ---------------------------------------------------------------- * The warp route config. * For new deployments, this config may take the filepath of `CURRENT_DIR/configs/warp-route-deployment.yaml`. * For existing deployment, the config can be generated by using `hyperlane warp read` if it exists in the Registry. * The warp route token symbol. * The token symbol can be found onchain, or in your local Hyperlane Registry. By default, it is written to `$HOME/.hyperlane/deployments/warp_routes/`. * Access to the private key that currently owns the warp route. info If you followed the [Deploy a Warp Route](https://docs.hyperlane.xyz/docs/guides/deploy-warp-route) guide, you most likely have deployed a warp route with a trusted relayer set to a signer address. To confirm using the Hyperlane CLI, locate your token symbol and the chain on which it is deployed: hyperlane warp read --symbol You can then choose the warp route for which you're removing the trusted relayer. After running `warp read`, you should see a similar config under `interchainSecurityModule` containing a `trustedRelayerIsm`: yourchain: ... interchainSecurityModule: address: "0xd54d32cD6a62482497252D59E6cCC1445fF0b92d" type: "staticAggregationIsm" modules: - address: "0x50b6dA835D9b8b20523891410a2E042855B465C8" relayer: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" type: "trustedRelayerIsm" - owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" address: "0xcE512189fF1BD41186E9eDda02BF321Fb1FC6eAc" type: "defaultFallbackRoutingIsm" domains: {} threshold: 1 This particular config has a `trustedRelayerIsm` as part of the `staticAggregationIsm`. This means that the `relayer` address will be allowed to call the Warp Route’s `handle()` function. In other words, the `relayer` can execute arbitrary messages on the Warp Route. This may be undesirable in cases outside of the self-relaying feature. By default, `warp read` will save the output to `CURRENT_DIR/configs/warp-route-deployment.yaml`. Follow these steps using the CLI to transfer the existing ownership to another address. Step 1: Configuration[​](#step-1-configuration "Direct link to Step 1: Configuration") --------------------------------------------------------------------------------------- Update the `warp-route-deployment.yaml` by **removing** the `trustedRelayerIsm` block from `modules`. Alternatively, you can configure the entire `modules` block as desired. warp-route-deployment.yaml yourchain: mailbox: '0x979Ca5202784112f4738403dBec5D0F3B9daabB9' owner: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266' interchainSecurityModule: address: '0xd54d32cD6a62482497252D59E6cCC1445fF0b92d' type: 'staticAggregationIsm' modules:- - address: '0x50b6dA835D9b8b20523891410a2E042855B465C8'- relayer: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266'- type: trustedRelayerIsm - owner: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266' address: '0xcE512189fF1BD41186E9eDda02BF321Fb1FC6eAc' type: 'defaultFallbackRoutingIsm' domains: {} threshold: 1 name: Ether symbol: ETH decimals: 18 totalSupply: 0 type: native Step 2: Apply[​](#step-2-apply "Direct link to Step 2: Apply") --------------------------------------------------------------- Using the CLI, execute: hyperlane warp apply \ --symbol \ --config $(pwd)/configs/warp-route-deployment.yaml You should see a batch of transactions executed on chain, and a final message indicating that the warp config has been updated. Step 3: Confirm[​](#step-3-confirm "Direct link to Step 3: Confirm") --------------------------------------------------------------------- To confirm that the trusted relayer was successfully removed using the Hyperlane CLI, run the following command with your token symbol and the chain it is deployed on: hyperlane warp read --symbol After running `warp read`, confirm that the trusted relayer ISM has been removed from your warp route (In this example, it should only contain the remaining `defaultFallbackRoutingIsm`). You should see a similar config under `interchainSecurityModule`: yourchain: mailbox: "0x979Ca5202784112f4738403dBec5D0F3B9daabB9" owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" interchainSecurityModule: address: "0x8af9445d8A3FbFBd1D5dF185B8a4533Ab060Cf36" type: "staticAggregationIsm" modules: - owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" address: "0xBe0232d5d45f9aD8322C2C4F84c39e64302Cd996" type: "defaultFallbackRoutingIsm" domains: {} threshold: 1 name: "Ether" symbol: "ETH" decimals: 18 totalSupply: 0 type: "native" By completing these steps, you've successfully removed the trusted relayer ISM from your Warp Route and enhanced the security of your warp route setup. Your warp route is now ready for production use. * [Step 1: Configuration](#step-1-configuration) * [Step 2: Apply](#step-2-apply) * [Step 3: Confirm](#step-3-confirm) --- # Token Sources & Faucets | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Token Sources & Faucets ======================= Mainnet Token Sources[​](#mainnet-token-sources "Direct link to Mainnet Token Sources") ---------------------------------------------------------------------------------------- | Network | ​Did you really need to ask? | | --- | --- | | Avalanche | Most major exchanges | | BSC | Binance, FTX, Kucoin | | Polygon | Most major exchanges | | Celo | Binance, Coinbase, Kucoin | | Arbitrum | Most major exchanges or canonical bridge | | Optimism | Most major exchanges or canonical bridge | | Ethereum | Most major exchanges | | Moonbeam | Binance, Coinbase, Kucoin | Testnet Token Sources[​](#testnet-token-sources "Direct link to Testnet Token Sources") ---------------------------------------------------------------------------------------- | Testnets | ​Faucet Link | ​Amounts | | --- | --- | --- | | Alfajores | [​​Alfrajores Token Faucet](https://faucet.celo.org/) | 5 CELO | | Mumbai | [​​Polygon Faucet](https://faucet.polygon.technology/) | 2 MATIC with alchemy account | | Fuji | [Avalanche Faucet​​](https://faucet.avax.network/) | 2 AVAX | | BSC Testnet | [​​BNB Smart Chain Faucet](https://testnet.bnbchain.org/faucet-smart) | 0.5 BNB | | Moonbase Alpha | [​​Moonbase Alpha Faucet](https://apps.moonbeam.network/moonbase-alpha/faucet/) | 1 DEV | | Calibration | [Filecoin Faucet](https://faucet.calibnet.chainsafe-fil.io/) | 5 tFIL | | Sepolia | [Sepolia Faucet](https://sepoliafaucet.com/) | 0.5 ETH | * [Mainnet Token Sources](#mainnet-token-sources) * [Testnet Token Sources](#testnet-token-sources) --- # How to Transfer Ownership from Hyperlane Mailbox | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page How to Transfer Ownership from Hyperlane Mailbox ================================================ This guide explains how to change the owner of your Hyperlane Mailbox using the Hyperlane CLI. Transferring ownership is necessary when you want to give control to a different address, such as for security reasons or when making changes to who manages the Mailbox. As the new owner, you will have full control over the Mailbox settings, including managing hooks, ISM configurations, and permissions for message handling. We’ll guide you through updating the owner address, applying the change, and confirming everything is set correctly. Using the Hyperlane CLI ======================= One of the quickest way to transfer a mailbox ownership is by using the [Hyperlane CLI](https://docs.hyperlane.xyz/docs/reference/cli) . Prerequisites[​](#prerequisites "Direct link to Prerequisites") ---------------------------------------------------------------- * The core config generated by `hyperlane core init`. * This config is used to deploy core contracts, including the mailbox. By default, it takes the filepath of `CURRENT_DIR/configs/core-config.yaml`. * The chain that the mailbox was deployed to. * Access to the private key that currently owns the mailbox. info If you followed the [How to Connect Your Chain with Hyperlane](/docs/deploy-hyperlane) guide, you may have deployed a mailbox with the owner set to the single private key. In production, it is advisable to use a multisig. To confirm using the Hyperlane CLI, execute the following with `--chain` set to the name of your chain that the mailbox is deployed on: hyperlane core read --chain After running `core read`, you should see a similar config with `owner` set to private key's address: defaultHook: address: "0xC2E88eC0aB5FDB9756CD3EFEE40D24120fFa6E57" type: "merkleTreeHook"defaultIsm: address: "0xF37395A79f56268FD0040E1f5711e9Af974a545A" relayer: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" type: "trustedRelayerIsm"owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"requiredHook: address: "0x390d29a822C21F57B163F1173cD43382bd643401" beneficiary: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" maxProtocolFee: "100000000000000000" owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" protocolFee: "0" type: "protocolFee" The output is saved to `CURRENT_DIR/configs/core-config.yaml`. Follow these steps using the CLI to transfer the existing ownership to another address. Step 1: Update Config[​](#step-1-update-config "Direct link to Step 1: Update Config") --------------------------------------------------------------------------------------- Update `owner` address in the `core-config.yaml` core-config.yaml defaultHook: address: "0xE71AC7A1ccB822423576EfFdb0B74564C49BEcBA" type: merkleTreeHookdefaultIsm: address: "0x89842f40928f81FC4415b39bfBFC3205eB6161cB" relayer: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" type: trustedRelayerIsm- owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"+ owner: "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"requiredHook: address: "0x390d29a822C21F57B163F1173cD43382bd643401" beneficiary: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" maxProtocolFee: "100000000000000000" owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" protocolFee: "0" type: protocolFee Step 2: Apply[​](#step-2-apply "Direct link to Step 2: Apply") --------------------------------------------------------------- Using the CLI, execute: hyperlane core apply --chain You should see a batch of transactions executed on chain, and a final message indicating that the mailbox has been updated. Step 3: Confirm[​](#step-3-confirm "Direct link to Step 3: Confirm") --------------------------------------------------------------------- To confirm using the Hyperlane CLI, execute the following: hyperlane core read --chain After running `core read`, you should see a similar config with the now updated `owner`: defaultHook: address: "0x67F8c06Fd2915728E9D21451E33FbDFbCcd63c44" type: "merkleTreeHook"defaultIsm: address: "0xac7D6df90fa937ADEfE7aD2d4905f0AEa170c467" relayer: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" type: "trustedRelayerIsm"owner: "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"requiredHook: address: "0x1Cd94b4D9B5f0e3474a6bDB8b9503Ca84F53e548" beneficiary: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" maxProtocolFee: "100000000000000000" owner: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" protocolFee: "0" type: "protocolFee" By completing these steps, you have successfully transferred and verified ownership of your mailbox to a new address. * [Step 1: Update Config](#step-1-update-config) * [Step 2: Apply](#step-2-apply) * [Step 3: Confirm](#step-3-confirm) --- # How to Transfer Ownership of Your Hyperlane Warp Route | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page How to Transfer Ownership of Your Hyperlane Warp Route ====================================================== This guide provides a step-by-step guide to transferring ownership of your Hyperlane Warp Route. It also explains the responsibilities, security considerations, and configuration options that come with owning a Warp Route. Warp Route Ownership Overview[​](#warp-route-ownership-overview "Direct link to Warp Route Ownership Overview") ---------------------------------------------------------------------------------------------------------------- Before transferring ownership of your Warp Route, it’s important to understand what this ownership entails. Ownership grants control over configuration settings, such as the Interchain Security Module (ISM), Validator options, and other parameters critical to security. info Once a mailbox is set up on the chain, anyone can deploy a Warp Route. Warp Routes are commonly deployed by a few different groups - the Abacus Works team, the asset issuer, the chain team, or the application team. ### Overview of Ownership[​](#overview-of-ownership "Direct link to Overview of Ownership") * **Responsibilities:** As the owner, you take on responsibilities that include managing security configurations, like the ISM and Validator settings, to meet your specific security and operational goals. * **Security & Autonomy**: Ownership choices often come down to security and control preferences. We strongly recommend using a multisig like a Gnosis Safe for any production setups. Teams can choose **full ownership** for complete autonomy, or **joint ownership** on the multisig to share security management. Joint ownership enables collaborative decision-making on critical updates, which can increase trust for users and developers. ### ISM, Validator, and Relayer Options[​](#ism-validator-and-relayer-options "Direct link to ISM, Validator, and Relayer Options") When configuring or transferring a Warp Route, owners have flexibility in managing ISM, Validator, and Relayer settings: * **ISM Customization**: Each Warp Route may require a tailored ISM configuration depending on security needs. Owners can set up a custom ISM or use Hyperlane’s default setup. * **Validator Options**: Ownership allows you to choose or manage your Validator set. Hyperlane can handle Validator responsibilities by default, making it optional to run your own. * **Relayer Support**: Hyperlane provides Relayer services by default, but teams can operate their own Relayers for more control over security, reliability, and costs. This customization enables teams to tailor message handling to fit specific performance, compliance, or operational requirements. Warp Route Ownership Transfer Guide[​](#warp-route-ownership-transfer-guide "Direct link to Warp Route Ownership Transfer Guide") ---------------------------------------------------------------------------------------------------------------------------------- Using the Hyperlane CLI[​](#using-the-hyperlane-cli "Direct link to Using the Hyperlane CLI") ---------------------------------------------------------------------------------------------- One of the quickest way to transfer a warp route ownership is by using the [Hyperlane CLI](https://docs.hyperlane.xyz/docs/reference/cli) . Prerequisites[​](#prerequisites "Direct link to Prerequisites") ---------------------------------------------------------------- * The warp route config. * For new deployments, this config may take the filepath of `CURRENT_DIR/configs/warp-route-deployment.yaml`. * For existing deployment, the config can be generated by using `hyperlane warp read` if it exists in the Registry. * The warp route token symbol. * The token symbol can be found onchain, or in your local Hyperlane Registry. By default, it is written to `$HOME/.hyperlane/deployments/warp_routes/`. * Access to the private key that currently owns the warp route. info If you followed the [Deploy a Warp Route](https://docs.hyperlane.xyz/docs/guides/deploy-warp-route) guide, you may have deployed a warp route with the owner set to the single private key. In production, it is advisable to use a multisig. To confirm using the Hyperlane CLI, locate your token symbol and the chain it is deployed on: hyperlane warp read --symbol You should be able to select the warp route that you wish to update the ownership for. After running `warp read`, you should see a similar config with `owner` set to private key's address: yourchain: mailbox: "0x979Ca5202784112f4738403dBec5D0F3B9daabB9" owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" ... By default, `warp read` will save the output to `CURRENT_DIR/configs/warp-route-deployment.yaml`. Follow these steps using the CLI to transfer the existing ownership to another address. Step 1: Configuration[​](#step-1-configuration "Direct link to Step 1: Configuration") --------------------------------------------------------------------------------------- Update `owner` address in the `warp-route-deployment.yaml` warp-route-deployment.yaml yourchain: mailbox: '0x979Ca5202784112f4738403dBec5D0F3B9daabB9'- owner: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266'+ owner: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045' interchainSecurityModule: address: '0xd54d32cD6a62482497252D59E6cCC1445fF0b92d' type: staticAggregationIsm modules: - owner: '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266' address: '0xcE512189fF1BD41186E9eDda02BF321Fb1FC6eAc' type: defaultFallbackRoutingIsm domains: {} threshold: 1 name: Ether symbol: ETH decimals: 18 totalSupply: 0 type: native Step 2: Apply[​](#step-2-apply "Direct link to Step 2: Apply") --------------------------------------------------------------- Using the CLI, execute by providing the token symbol and warp route config: hyperlane warp apply \ --symbol \ --config $(pwd)/configs/warp-route-deployment.yaml You should see a batch of transactions executed on chain, and a final message indicating that the warp config has been updated. Step 3: Confirm[​](#step-3-confirm "Direct link to Step 3: Confirm") --------------------------------------------------------------------- To confirm that the owner was successfully updated using the Hyperlane CLI, run the following command with your token symbol and the chain it is deployed on: hyperlane warp read --symbol After running `warp read`, you should see a similar config with the now updated `owner`: yourchain: mailbox: "0x979Ca5202784112f4738403dBec5D0F3B9daabB9" owner: "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045" interchainSecurityModule: address: "0x8af9445d8A3FbFBd1D5dF185B8a4533Ab060Cf36" type: staticAggregationIsm modules: - owner: "0xe738d6e51aad88F6F4ce6aB8827279cffFb94876" address: "0xBe0232d5d45f9aD8322C2C4F84c39e64302Cd996" type: defaultFallbackRoutingIsm domains: {} threshold: 1 name: Ether symbol: ETH decimals: 18 totalSupply: 0 type: native By completing these steps, you have successfully transferred and verified ownership of your Warp Route to a new address. * [Warp Route Ownership Overview](#warp-route-ownership-overview) * [Overview of Ownership](#overview-of-ownership) * [ISM, Validator, and Relayer Options](#ism-validator-and-relayer-options) * [Warp Route Ownership Transfer Guide](#warp-route-ownership-transfer-guide) * [Using the Hyperlane CLI](#using-the-hyperlane-cli) * [Step 1: Configuration](#step-1-configuration) * [Step 2: Apply](#step-2-apply) * [Step 3: Confirm](#step-3-confirm) --- # How to Update Mailbox Default ISM | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page How to Update Mailbox Default ISM ================================= Using the Hyperlane CLI ======================= When first deploying with the CLI, a new mailbox uses a Trusted Relayer ISM out of the box so you don't need to run a relayer or validator. In order to go to production, you'll need to remove this ISM with the Hyperlane CLI. Prerequisites[​](#prerequisites "Direct link to Prerequisites") ---------------------------------------------------------------- * The core config generated by `hyperlane core init`. * This config is used to deploy core contracts, including the mailbox. By default, it takes the filepath of `CURRENT_DIR/configs/core-config.yaml`. * The chain that the mailbox was deployed to. * Access to the private key that currently owns the mailbox. info If you followed the [How to Connect Your Chain with Hyperlane](/docs/deploy-hyperlane) guide, you may have deployed a mailbox with the owner set to the single private key. In production, it is advisable to use a multisig. To confirm using the Hyperlane CLI, execute the following with `--chain` set to the name of your chain that the mailbox is deployed on: hyperlane core read --chain After running `core read`, you should see a similar config with `owner` set to private key's address: defaultHook: address: "0xC2E88eC0aB5FDB9756CD3EFEE40D24120fFa6E57" type: "merkleTreeHook"defaultIsm: address: "0xF37395A79f56268FD0040E1f5711e9Af974a545A" relayer: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" type: "trustedRelayerIsm"owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"requiredHook: address: "0x390d29a822C21F57B163F1173cD43382bd643401" beneficiary: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" maxProtocolFee: "100000000000000000" owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" protocolFee: "0" type: "protocolFee" The output is saved to `CURRENT_DIR/configs/core-config.yaml`. This particular config has a `trustedRelayerIsm`. This means contracts (e.g., warp routes) that fallback to the mailbox's `defaultIsm` will give permission to `relayer` address to execute arbitrary messages. This may be undesirable in cases outside of the self-relaying feature. Follow these steps using the CLI to update the existing default Ism to a different configuration. Step 1: Update Configuration[​](#step-1-update-configuration "Direct link to Step 1: Update Configuration") ------------------------------------------------------------------------------------------------------------ Alternatively, you can update the `relayer` address to something else (e.g., "burn" it by setting it to an inaccessible address). core-config.yaml defaultHook: address: "0xC2E88eC0aB5FDB9756CD3EFEE40D24120fFa6E57" type: merkleTreeHookdefaultIsm: address: "0xF37395A79f56268FD0040E1f5711e9Af974a545A"- relayer: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e"+ relayer: "0x0000000000000000000000000000000000000001" type: trustedRelayerIsmowner: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e"requiredHook: address: "0x4f54055C94DCbC2b502146D46909A2cC7461c5D8" beneficiary: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" maxProtocolFee: "100000000000000000" owner: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" protocolFee: "0" type: protocolFee Alternatively, you can update the `defaultIsm` config to a different ISM config. As shown, it is updated to a `messageIdMultisigIsm`. warning Configuring ISMs is an advanced feature that require knowledge of different ISM types and how they work together topologically. core-config.yaml defaultHook: address: "0xC2E88eC0aB5FDB9756CD3EFEE40D24120fFa6E57" type: merkleTreeHookdefaultIsm:- address: "0xF37395A79f56268FD0040E1f5711e9Af974a545A"- relayer: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e"- type: trustedRelayerIsm+ threshold: 1+ type: messageIdMultisigIsm+ validators:+ - "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e"owner: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e"requiredHook: address: "0x4f54055C94DCbC2b502146D46909A2cC7461c5D8" beneficiary: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" maxProtocolFee: "100000000000000000" owner: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" protocolFee: "0" type: protocolFee Step 2: Apply[​](#step-2-apply "Direct link to Step 2: Apply") --------------------------------------------------------------- Using the CLI, execute: hyperlane core apply --chain You should see a batch of transactions executed on chain, and a final message indicating that the mailbox has been updated. Step 3: Confirm[​](#step-3-confirm "Direct link to Step 3: Confirm") --------------------------------------------------------------------- To confirm using the Hyperlane CLI, execute the following: hyperlane core read --chain After running `core read`, you should see a similar config with the now updated default ISM: defaultHook: address: "0x67F8c06Fd2915728E9D21451E33FbDFbCcd63c44" type: "merkleTreeHook"defaultIsm: address: "0xac7D6df90fa937ADEfE7aD2d4905f0AEa170c467" relayer: "0x0000000000000000000000000000000000000001" type: "trustedRelayerIsm"owner: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e"requiredHook: address: "0x1Cd94b4D9B5f0e3474a6bDB8b9503Ca84F53e548" beneficiary: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" maxProtocolFee: "100000000000000000" owner: "0xa5558cA30cd9952Ab0e2349C274a3736698bD60e" protocolFee: "0" type: "protocolFee" By completing these steps, you've successfully updated the mailbox default ISM and enhanced the security of your mailbox. Your mailbox is now ready for production use. * [Step 1: Update Configuration](#step-1-update-configuration) * [Step 2: Apply](#step-2-apply) * [Step 3: Confirm](#step-3-confirm) --- # Create your xERC20 Token Bridge | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Create your xERC20 Token Bridge =============================== This guide walks you through deploying an xERC20 Warp Route between two networks of your choice. We'll use Ethereum as an example for the origin chain; however, you can select any supported network as the origin and destination. Prerequisites[​](#prerequisites "Direct link to Prerequisites") ---------------------------------------------------------------- To complete this walkthrough, you should have: 1. **An origin and destination network of choice**, between which you’d like to deploy the xERC20 warp route. 2. **The address of an xERC20 or xERC20Lockbox** on the origin and destination chain. 3. **Hyperlane CLI installed** and a **wallet private key set as the `HYP_KEY` environment variable**, funded on both origin and destination networks. ### Step 1: Initialize a New Warp Route[​](#step-1-initialize-a-new-warp-route "Direct link to Step 1: Initialize a New Warp Route") Run the following command to generate a warp route configuration: hyperlane warp init 1. Select **Ethereum** (origin) and **YourChain** (destination) using space, then hit enter. 2. For Ethereum (origin), choose **xERC20** or **xERC20Lockbox**, and enter the contract address. 3. For YourChain (destination), choose **xERC20** or **xERC20Lockbox**, and enter the contract address. info Choosing Between xERC20 and xERC20Lockbox: * **xERC20Lockbox**: Use this if your token is already deployed on the origin chain and requires a wrapped version for cross-chain transfers. * **xERC20**: Use this if your token natively implements xERC20 and does not require a lockbox. If you're unsure, review your token’s contract structure or deployment history to determine the correct choice. ### Step 2: Deploy the xERC20 Warp Route[​](#step-2-deploy-the-xerc20-warp-route "Direct link to Step 2: Deploy the xERC20 Warp Route") Run the following command to deploy the warp route: hyperlane warp deploy This deploys the _Hyperlane adapter contracts_\*, either: * **HypXERC20Lockbox** (if using xERC20Lockbox) * **HypXERC20** (if using xERC20) _The CLI does not deploy non-Hyperlane contracts (e.g., existing xERC20 contracts). Those should already be deployed._ ### Step 3: Configure Minting Permissions[​](#step-3-configure-minting-permissions "Direct link to Step 3: Configure Minting Permissions") Once the xERC20 warp route contracts are deployed, you must configure minting permissions for the destination token. Set the mint limit for the newly deployed warp route using the [`setLimits` function](https://github.com/defi-wonderland/xERC20/blob/main/solidity/contracts/XERC20.sol#L85) in your xERC20 contract. By default, these limits are found in the Registry, located at `~/.hyperlane` locally. ### Step 4: Test Cross-Chain Transfers[​](#step-4-test-cross-chain-transfers "Direct link to Step 4: Test Cross-Chain Transfers") Test transferring tokens across chains using: hyperlane warp send --symbol --amount * Replace `` with your token. * Replace `` with the number of tokens to transfer. 🎉 Congrats! You have successfully created an **xERC20 Warp Route**. Your xERC20 tokens can now move across chains! warning Please note that cross-chain operations rely on **Interchain Security Modules (ISMs)**, and there are inherent risks, such as ISM trust assumptions. Resources[​](#resources "Direct link to Resources") ---------------------------------------------------- For more resources on deploying xERC20 warp routes, check out: * [xERC20 Token Standard](https://github.com/defi-wonderland/xERC20/blob/main/solidity/contracts/XERC20.sol) * [xERC20 Token transfer limits](/docs/guides/manage-warp-route-limits) * [Prerequisites](#prerequisites) * [Step 1: Initialize a New Warp Route](#step-1-initialize-a-new-warp-route) * [Step 2: Deploy the xERC20 Warp Route](#step-2-deploy-the-xerc20-warp-route) * [Step 3: Configure Minting Permissions](#step-3-configure-minting-permissions) * [Step 4: Test Cross-Chain Transfers](#step-4-test-cross-chain-transfers) * [Resources](#resources) --- # Intro to Hyperlane | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Intro to Hyperlane ================== What is Hyperlane?[​](#what-is-hyperlane "Direct link to What is Hyperlane?") ------------------------------------------------------------------------------ Hyperlane is a permissionless interoperability protocol for cross-chain communication. It enables message passing and asset transfers across different chains without relying on centralized intermediaries or requiring any permissions. Why Hyperlane?[​](#why-hyperlane "Direct link to Why Hyperlane?") ------------------------------------------------------------------ Hyperlane's permissionless design means that anyone can [deploy hyperlane](https://docs.hyperlane.xyz/docs/deploy-hyperlane) to any blockchain environment, whether it is a layer 1, rollup, or app-chain, and start building cross-chain applications right away—no approvals, no intermediaries. This gives developers full control over how their dApp operates in a multi-chain environment, removing bottlenecks and enabling scalability. Designed with modularity in mind, Hyperlane's [Interchain Security Modules (ISM)](https://docs.hyperlane.xyz/docs/protocol/ISM/modular-security) allow developers to configure, compose, and customize their security model according to their application's needs. Start Building with Hyperlane[​](#start-building-with-hyperlane "Direct link to Start Building with Hyperlane") ---------------------------------------------------------------------------------------------------------------- Some pre-built examples that can be deployed out of the box include: 1. [Warp Routes](https://docs.hyperlane.xyz/docs/protocol/warp-routes/warp-routes-overview) , which allow native and `ERC20` tokens to move seamlessly across chains 2. [Interchain accounts](https://docs.hyperlane.xyz/docs/reference/applications/interchain-account) , which allow an account on one chain (e.g. a DAO) to make smart contract calls on remote chains 3. Interchain queries, which allow an account on one chain to make view calls on remote chains Next Steps[​](#next-steps "Direct link to Next Steps") ------------------------------------------------------- Get started with Hyperlane: * [Deploy to your chain](/docs/deploy-hyperlane) * [Bridge a token](/docs/guides/deploy-warp-route) * [Learn about General Message Passing](/docs/reference/messaging/send) * Join our Ecosystem: [Discord](https://discord.com/invite/hyperlane) , [Twitter](https://x.com/hyperlane) * [What is Hyperlane?](#what-is-hyperlane) * [Why Hyperlane?](#why-hyperlane) * [Start Building with Hyperlane](#start-building-with-hyperlane) * [Next Steps](#next-steps) --- # Agent configuration | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Agent configuration =================== All agents use the same method of configuration which is a multi-layered config approach which allows for easy overriding of default configs. Each layer overrides overlapping values in the previous. Config layers[​](#config-layers "Direct link to Config layers") ---------------------------------------------------------------- 1. Base configuration from "default deployments" are in the [monorepo](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/rust/main/config) and all of these are loaded automatically. 2. Config files passed in via the `CONFIG_FILES` env var are loaded next; this env var should be a comma separated list of paths to json files that should be loaded in order from first to last. 3. `HYP_` prefixed env vars will be read next. 4. `HYP__` prefixed env vars are then read and apply ONLY for the current agent. I.e. `RELAYER`, `VALIDATOR`, and `SCRAPER` will only read their respective prefixes. 5. Command line arguments will be read last Command line arguments[​](#command-line-arguments "Direct link to Command line arguments") ------------------------------------------------------------------------------------------- Command line arguments are added after the application name, such as`./relayer --originChainNames="test1,test2,test3"` The following formats are supported: * `--argName argValue` * `--argName "argValue"` * `--argName 'argValue'` * `--argName=argValue` * `--argName="argValue"` * `--argName='argValue'` Argument names are case-insensitive, so in this guide we may show them in camel-case for easier reading, but `--argName` is equivalent to `--ARGNAME` and `--argname.` Examples: * `{ "db": "/path/to/dir" }` can be set with `--db "/path/to/dir"` * `{ "chains": { "ethereum": { "name": "ethereum" } } }` (abbreviated as `chains.ethereum.name` or `chains..name`) can be set with `--chains.ethereum.name ethereum` * `{ "chains": { "avalanche": { "customRpcUrls": "https://some-url.com" } } }` (abbreviated as `chains..customrpcurls`) can be set with `--chains.avalanche.customrpcurls "https://some-url.com"` Environment variables[​](#environment-variables "Direct link to Environment variables") ---------------------------------------------------------------------------------------- The config file format is the preferred way to set things which are not secret and do not need to change for each run as it is the easiest format to inspect and edit. Every config value in the file can be set as an env var if you use the correct name, however, there are a few env vars that cannot be set in the config such as `CONFIG_FILES`. `HYP_` and `HYP__` are equivalent prefixes with the only difference being which order they are loaded in and can refer to all of the config values in the config files. The env name will be one of those two prefixes, and then the underscore-separated path of the uppercased path components to the config value. For example: * `{ "db": "/path/to/dir" }` can be set with `HYP_DB="/path/to/dir"` or `HYP_RELAYER_DB="/path/to/dir"` * `{ "chains": { "ethereum": { "name": "ethereum" } } }` (abbreviated as `chains.ethereum.name` or `chains..name`) can be set with `HYP_CHAINS_ETHEREUM_NAME="ethereum"` or `HYP_VALIDATOR_CHAINS_ETHEREUM_NAME="ethereum"` or `HYP_RELAYER_CHAINS_ETHEREUM_NAME="ethereum"` ... * `{ "chains": { "avalanche": { "customRpcUrls": "https://some-url.com" } } }` (abbreviated as `chains..customrpcurls`) can be set with `HYP_CHAINS_AVALANCHE_CUSTOMRPCURLS="https://some-url.com"` or `HYP_VALIDATOR_AVALANCHE_CUSTOMRPCURLS="https://some-url.com"` and so on... Config files with Docker[​](#config-files-with-docker "Direct link to Config files with Docker") ------------------------------------------------------------------------------------------------- Running with the agent in Docker adds an extra layer of complexity because the config files need to be accessible from within the Docker container. The base configs that can be found in [the repo](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/rust/main/config) are already part of the provided Docker image and will all be loaded by default. Mounting a single config file can be done with the flag `--mount type=bind,source=$LOCAL_CONFIG_PATH,target=/config/$CONFIG_NAME,readonly` and then adding the config file to `CONFIG_FILES` so it is loaded. Mounting an entire directory can be done with the flag `--mount source=$LOCAL_CONFIG_DIR_PATH,target=/config,readonly` then adding the individual config files to `CONFIG_FILES` that you want so they are loaded. For example, suppose you have a config file at your local machine's path `/home/workspace/ethereum.json` and want to run the validator with it. docker run -it --mount type=bind,source=/home/workspace/ethereum.json,target=/config/ethereum.json,readonly -e CONFIG_FILES=/config/ethereum.json $DOCKER_IMAGE ./validator The `source` path is the path on your local machine, the `target` path is where the source path contents will be made available within the Docker container, and the `CONFIG_FILES` should specify config(s) from the target path. * [Config layers](#config-layers) * [Command line arguments](#command-line-arguments) * [Environment variables](#environment-variables) * [Config files with Docker](#config-files-with-docker) --- # Deploy with Terraform | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Deploy with Terraform ===================== For those more familiar with deploying to AWS through infrastructure-as-code tools such as Terraform, we provide an [**example configuration in Github**](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/rust/main/terraform) designed to set up the necessary infrastructure for a Hyperlane Validator on AWS. It automates the creation of resources such as ECS clusters, VPCs, subnets, and security groups required for running a Validator agent. caution The configuration provided is intended to only be an _example_ of running a Validator for a core supported network. You may have to modify the Validator module to support more advanced configurations. It is recommended to test thoroughly before using this setup in a production environment. Overview[​](#overview "Direct link to Overview") ------------------------------------------------- The provided terraform has a few key parts: * IAM/KMS module: automatically completes [Agent Keys](/docs/operate/set-up-agent-keys) configuration for you. * S3 module: automatically completes [AWS Signatures Bucket](/docs/operate/validators/validator-signatures-aws) configuration for you. * EFS module: sets up a persistent volume that can be mounted to the Validator. * Validator module: uses the above modules to run an instance of a Validator. * `global.tf`: top-level networking configuration for a cluster that Validators can run in. * `main.tf`: configures Validators for deployment. The diagram below shows how it fits together. Usage[​](#usage "Direct link to Usage") ---------------------------------------- As a prerequisite, you need to have Terraform installed and the AWS CLI configured with your credentials. To initialize the terraform state: terraform init To generate the plan of infrastructure changes: terraform plan To preview and apply the infrastructure changes: terraform apply To list the outputs such as KMS, IAM or S3 information, you will have to parse the JSON output: terraform output -json Modules[​](#modules "Direct link to Modules") ---------------------------------------------- Several modules exist so you can choose which parts of the Validator setup you would like managed by terraform. ### IAM / KMS[​](#iam--kms "Direct link to IAM / KMS") The `iam_kms` module creates an IAM user and a KMS key for secure signing operations. It also sets up IAM policies and attachments to grant the necessary permissions for using the KMS key and other AWS services, such as S3, EFS and ECS later on. ### S3[​](#s3 "Direct link to S3") The `s3` module creates an S3 bucket for storing Validator-related data, such as signatures. It also sets bucket policies to manage access and permissions, including public access restrictions and versioning. ### EFS[​](#efs "Direct link to EFS") The `efs` module defines an EFS file system and access point, allowing the Validator application to store and access data on EFS. It also sets up a mount target for connecting the EFS file system to the network. note This module is only required when using the `validator` module. ### Validator[​](#validator "Direct link to Validator") The `validator` module uses all of the above to integrate the EFS, IAM/KMS, and S3 configurations. In addition to: * Creating a new IAM user and relevant roles to run a Validator. * Creating an S3 bucket that a Validator can write signatures to. * Creating an EFS volume to persist data in the service. This module also: * Defines an ECS task definition for running the Validator application, including container definitions, volume configurations, and logging. * Creates an ECS service to manage the deployment and scaling of the Validator tasks. Main Configuration[​](#main-configuration "Direct link to Main Configuration") ------------------------------------------------------------------------------- The root level configuration sets up a VPC, subnets, internet gateway, NAT gateway, route tables, and security groups for network infrastructure. It also provides example usage of the `validator` module. module "your_validator_name" { source = "./modules/validator" validator_name = "your-validator-name" origin_chain_name = "originChainName" aws_region = var.aws_region validator_cluster_id = aws_ecs_cluster.validator_cluster.id validator_subnet_id = aws_subnet.validator_subnet.id validator_sg_id = aws_security_group.validator_sg.id validator_nat_gateway_id = aws_nat_gateway.validator_nat_gateway.id # Disabling the Validator task allows you to set up all the required infrastructure # without running the actual Validator yet. This is useful when setting up a Validator for # the first time, so that you can find out the Validator's address and fund it before it # performs the announcement transaction. # validator_task_disabled = true} ### Outputs[​](#outputs "Direct link to Outputs") The root-level `outputs.tf` passes forward all outputs from the Validators configured in `main.tf`. **You will have to update this as you add, modify or remove Validators.** ### Example architecture[​](#example-architecture "Direct link to Example architecture") The diagram below shows how the Validator ECS cluster fits into the top-level network infrastructure. Known issues[​](#known-issues "Direct link to Known issues") ------------------------------------------------------------- ### PI configuration[​](#pi-configuration "Direct link to PI configuration") It is non-trivial to set custom configuration values for PI chains, such as ones you've deployed Hyperlane to yourself. Currently you may have to just pass a long list of environment variables or command line arguments. ### Individual agent logs[​](#individual-agent-logs "Direct link to Individual agent logs") Currently all agents log to the same log group - `DefaultLogGroup`. To separate them per agent, you may have to adjust the log group name and update the agent's log policy with the new group name. ### Relayer module[​](#relayer-module "Direct link to Relayer module") The docker image supports running both types of agents. Therefore, if you choose to do so, you can use the Validator module as a starting point for a new Relayer module. * [Overview](#overview) * [Usage](#usage) * [Modules](#modules) * [IAM / KMS](#iam--kms) * [S3](#s3) * [EFS](#efs) * [Validator](#validator) * [Main Configuration](#main-configuration) * [Outputs](#outputs) * [Example architecture](#example-architecture) * [Known issues](#known-issues) * [PI configuration](#pi-configuration) * [Individual agent logs](#individual-agent-logs) * [Relayer module](#relayer-module) --- # Message filtering | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) Message filtering ================= _Configure which messages to relay, and which to ignore_ By default, the Relayer will attempt to deliver messages sent from its origin chain to any of the configured destination chains. Relayers may want to further filter the messages they attempt to deliver. For example, someone building an interchain app may want to run a Relayer that only delivers messages sent to that application. Similarly, some Relayers may wish to only relay messages to a subset of available chains. Relayers may **optionally** filter the messages they deliver by setting the `--whitelist` or `--blacklist` environment variables. See also the [configuration reference's](/docs/operate/config-reference) whitelist section. These configs are stringified JSON objects with the following format: // A list of matching rules. A message matches if any of the list// elements matches the message.type MatchingList = Array;// Matches a message if any of the provided values matches.interface ListElement { originDomain?: NumericFilter senderAddress?: HashFilter destinationDomain?: NumericFilter recipientAddress?: HashFilter}type NumericFilter = Wildcard | U32 | Array;type HashFilter = Wildcard | H256 | Array;// 32-bit unsigned integertype U32 = number | string;// 256-bit hash (can also be less) encoded as hextype H256 = string;// Matches anythingtype Wildcard = "*"; Both the whitelist and blacklists have "any" semantics. In other words, the Relayer will deliver messages that match _any_ of the whitelist filters, and ignore messages that match _any_ of the blacklist filters. For example, the following config used as a whitelist will ensure the Relayer will relay any messages sent to Ethereum, any messages sent from address `0xca7f632e91B592178D83A70B404f398c0a51581F` to either Celo or Avalanche, and any messages sent to address `0xca7f632e91B592178D83A70B404f398c0a51581F` on Arbitrum or Optimism. [ { senderAddress: "*", destinationDomain: ["1"], recipientAddress: "*" }, { senderAddress: "0xca7f632e91B592178D83A70B404f398c0a51581F", destinationDomain: ["42220", "43114"], recipientAddress: "*" }, { senderAddress: "*", destinationDomain: ["42161", "420"], recipientAddress: "0xca7f632e91B592178D83A70B404f398c0a51581F" }] A valid config may look like --whitelist='[{"senderAddress":"*","destinationDomain":["1"],"recipientAddress":"*"},{"senderAddress":"0xca7f632e91B592178D83A70B404f398c0a51581F","destinationDomain":["42220","43114"],"recipientAddress":"*"},{"senderAddress":"*","destinationDomain":["42161","420"],"recipientAddress":"0xca7f632e91B592178D83A70B404f398c0a51581F"}]' The blacklist supersedes the whitelist, i.e. if a message matches both the whitelist _and_ the blacklist, it will not be delivered. --- # Quickstart with Docker Compose and AWS | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Quickstart with Docker Compose and AWS ====================================== Sometimes it is nice to not rely on long docker commands. Running with Docker compose is very similar to using raw Docker and you can find a full specification of the format in the [Docker docs](https://docs.Docker.com/compose/compose-file/) . 1\. Setup validator key[​](#1-setup-validator-key "Direct link to 1. Setup validator key") ------------------------------------------------------------------------------------------- Follow the guide [here](/docs/operate/set-up-agent-keys#2-aws-kms) for creating agent keys with AWS KMS. 2\. Create S3 bucket for signatures[​](#2-create-s3-bucket-for-signatures "Direct link to 2. Create S3 bucket for signatures") ------------------------------------------------------------------------------------------------------------------------------- Follow the guide [here](/docs/operate/validators/validator-signatures-aws) for creating and configuring an S3 bucket for your validator to write signatures to. 3\. (AVS Operators Only) Register with Hyperlane AVS[​](#3-avs-operators-only-register-with-hyperlane-avs "Direct link to 3. (AVS Operators Only) Register with Hyperlane AVS") -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- If you are an AVS operator, follow the guide [here](/docs/guides/avs-operator-guide#4-register-your-operator) to register with the Hyperlane AVS. 4\. Setup validator environment[​](#4-setup-validator-environment "Direct link to 4. Setup validator environment") ------------------------------------------------------------------------------------------------------------------- ### Create config files[​](#create-config-files "Direct link to Create config files") In this example, we will run three chains. mkdir -p ethereum/hyperlane_db optimism/hyperlane_db base/hyperlane_db && \touch ethereum/config.json optimism/config.json base/config.json docker-compose.yml .env.ethereum .env.optimism .env.base ### Edit each config.json[​](#edit-each-configjson "Direct link to Edit each config.json") You can read more about Agent Configs [here](/docs/operate/agent-config) . | Parameter | Description | | --- | --- | | `customRpcUrls` | A comma-separated list of performant RPC endpoints for the chain you wish to support. We recommend using paid providers to avoid rate limiting. | | `chains.ethereum` | Should be changed to `chains.base` in the base/config.json, and `chains.optimism` in optimism/config.json. | | `signer.region` | Should be adjusted to your AWS region. | | `validator.region` | Should be adjusted to your AWS region. | | `signer.id` | Should be adjusted to your AWS KMS id you configured in step 3, prefixed with `alias/`. | | `validator.id` | Should be adjusted to your AWS KMS id you configured in step 3, prefixed with `alias/`. | | `originChainName` | Should be the chain you are validating. | | `checkpointSyncer.bucket` | Should reflect the name of the S3 bucket. | | `checkpointSyncer.folder` | The name of the folder the validator will use within the bucket. You may use the same bucket for multiple validators, but ensure each folder name is unique per validator. | | `reorgPeriod` | May be different for each chain. [Find the reorgPeriods](https://github.com/hyperlane-xyz/hyperlane-registry/tree/main/chains)
. | Here is an example agent config. { "chains": { "ethereum": { "customRpcUrls": "https://eth.llamarpc.com,https://rpc.mevblocker.io", "signer": { "region": "us-east-1", "type": "aws", "id": "alias/hyperlane-validator-signer" } } }, "originChainName": "ethereum", "db": "/mnt/hyperlane_db", "validator": { "id": "alias/hyperlane-validator", "type": "aws", "region": "us-east-1" }, "checkpointSyncer": { "bucket": "hyperlane-validator-signatures", "region": "us-east-1", "type": "s3", "folder": "ethereum" }, "reorgPeriod": 14, "metricsPort": "9090"} ### Edit each .env file[​](#edit-each-env-file "Direct link to Edit each .env file") You should change the service name, aws credentials for each chain AWS_ACCESS_KEY_ID=AWS_SECRET_ACCESS_KEY=SERVICE_NAME=ethereum 5\. Configure Docker Compose (docker-compose.yml)[​](#5-configure-docker-compose-docker-composeyml "Direct link to 5. Configure Docker Compose (docker-compose.yml)") ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- x-common-attributes: &common-validator image: gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.1.0 command: ./validator container_name: ${SERVICE_NAME}-validator environment: CONFIG_FILES: /config.json AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} volumes: - ./${SERVICE_NAME}/hyperlane_db:/mnt/hyperlane_db - ./${SERVICE_NAME}/config.json:/config.json restart: unless-stoppedservices: ethereum-validator: <<: *common-validator ports: - "9091:9090/tcp" optimism-validator: <<: *common-validator ports: - "9092:9090/tcp" base-validator: <<: *common-validator ports: - "9093:9090/tcp" Your directory structure should look similar to this: .├── base│ ├── config.json│ └── hyperlane_db├── docker-compose.yml├── ethereum│ ├── config.json│ └── hyperlane_db├── .env.base├── .env.ethereum├── .env.optimism└── optimism ├── config.json └── hyperlane_db 6\. Run the Hyperlane validators[​](#6-run-the-hyperlane-validators "Direct link to 6. Run the Hyperlane validators") ---------------------------------------------------------------------------------------------------------------------- Bring the containers up: Remember to fund your validator address so the validator can announce. docker compose --env-file .env.ethereum up ethereum-validator -ddocker compose --env-file .env.optimism up optimism-validator -ddocker compose --env-file .env.base up base-validator -d Ensure there are no errors: docker logs -f ethereum-validatordocker logs -f optimism-validatordocker logs -f base-validator * [1\. Setup validator key](#1-setup-validator-key) * [2\. Create S3 bucket for signatures](#2-create-s3-bucket-for-signatures) * [3\. (AVS Operators Only) Register with Hyperlane AVS](#3-avs-operators-only-register-with-hyperlane-avs) * [4\. Setup validator environment](#4-setup-validator-environment) * [Create config files](#create-config-files) * [Edit each config.json](#edit-each-configjson) * [Edit each .env file](#edit-each-env-file) * [5\. Configure Docker Compose (docker-compose.yml)](#5-configure-docker-compose-docker-composeyml) * [6\. Run the Hyperlane validators](#6-run-the-hyperlane-validators) --- # Monitoring & Alerting | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Monitoring & Alerting ===================== The relayer exposes metrics on the port number specified by the argument `--metrics`. Port `9090` is the default, though any valid port can be chosen. We recommend using Prometheus to scrape these metrics and Grafana to visualize them, using [this dashboard JSON template](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/2f7f714c5b698fedcead9825f52da6ef95f96be1/tools/grafana/easy-relayer-dashboard-template.json) , as seen below. The benefit of this dashboard is that it displays multiple validators at the same time. The screenshot shows metrics grouped by chain or by kubernetes pod. ![Relayer Grafana Dashboard Template](/assets/images/dashboard-template-relayer-0a274069167ac38785e382982396c1e7.png) info If running as a Docker image, make sure to port-forward the metrics endpoint port. For, instance, to forward port 9090 on the local port 80, add the following flag to your `docker run` command: `-p 9090:80` Metrics[​](#metrics "Direct link to Metrics") ---------------------------------------------- The dashboard template includes the following metrics. | Metric | Description | | --- | --- | | `hyperlane_messages_processed_count` | The messages processed by the relayer, by origin and destination chain ("Messages Processed"). | | `hyperlane_submitter_queue_length{queue_name="prepare_queue"}` | Length of the submitter's prepare queue ("Prepare Queues"). Each destination chain has a submitter running, and all pending / retriable messages end up in the prepare queue, awaiting to be (re)submitted. An increase in this queue may either mean that the volume of messages exceeds the relayer's processing throughput or that submitting is failing for various reasons (bad RPCs, low balance). | | `hyperlane_submitter_queue_length{queue_name="submit_queue"}` | Length of the submitter's submit queue ("Submit Queues"). These are messages that have been prepared but not submitted yet. | | `hyperlane_submitter_queue_length{queue_name="confirm_queue"}` | Length of the submitter's confirm queue ("Confirm Queues"). These are messages that have been submitted but not confirmed (finalized) yet. | Other relevant metrics include: | Metric | Description | | --- | --- | | `hyperlane_request_count` | Records the number of successful or failed RPCs using the following labels: `chain`, `status` (failure or success), `provider_node` (the responsible base RPC URL), and RPC `method`. Present for all agents, but only supported on EVM chains at the moment. | | `hyperlane_wallet_balance{agent="relayer"}` | The relayer's balance on every chain, expressed in the lowest denomination unit | | `hyperlane_critical_error` | Boolean marker for critical errors on a chain, signalling loss of liveness. | | `hyperlane_block_height` | The block height of the RPC node the agent is connected to. If this metric is not increasing, the RPC may be unhealthy and need changing. | | `hyperlane_span_events_total{agent="relayer", event_level="error"}` | The total number of errors logged. If the derivative of this metric exceeds 1 over the last hour, at least a low-severity alert is warranted. Note that the dashboard query groups metrics by kubernetes pod name, so you may need to adjust this query if you are not running in a kubernetes environment. | | `hyperlane_span_events_total{agent="relayer", event_level="warn"}` | The total number of warnings logged. If the derivative of this metric exceeds 1 over the last hour, at least a low-severity alert is warranted. Note that the dashboard query groups metrics by kubernetes pod name, so you may need to adjust this query if you are not running in a kubernetes environment. | Alerts[​](#alerts "Direct link to Alerts") ------------------------------------------- The metrics above can be combined to create alerts that minimize false positives. Some example critical alerts: ### For all agents:[​](#for-all-agents "Direct link to For all agents:") * `hyperlane_block_height` for any chain has not increased in the last 15 minutes * The rate of `hyperlane_request_count{status="failure"}` in the last 10 minutes is > 60% of the rate of `hyperlane_request_count{status=~"success|failure"}`. Most agent issues are due to bad RPCs, and this is likely to catch these issues. ### For relayers:[​](#for-relayers "Direct link to For relayers:") * `hyperlane_critical_error` is `1` for a chain, meaning the relayer has lost liveness there. While operations on other chains are not affected by this, this is a high severity alert - usually to do with unreliable RPCs for the affected chain. * Using `hyperlane_submitter_queue_length{queue_name="prepare_queue"}`, the prepare queue length has been increasing, and the confirm queue length was zero, and error/warning count diffs have been increasing, over the last 30 minutes. This could mean that the relayer has run out of balance and cannot pay for gas, or that the destination chain RPC url is not working correctly, or just that all new messages are unprocessable * `hyperlane_wallet_balance` has dropped below a certain threshold. For example, the current balance divided by the difference in the last 24h is less than 2, meaning balance must be topped up within two days If you get alerted, always check the logs for what the problem could be. * [Metrics](#metrics) * [Alerts](#alerts) * [For all agents:](#for-all-agents) * [For relayers:](#for-relayers) --- # Overview | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Overview ======== The Hyperlane protocol decouples the transport layer from the security layer of cross-chain message passing. To run a deployment, it relies on offchain agents that observe onchain activity and carry out either the transport or security aspects of the protocol. 1. Hyperlane [Validators](#validator) are light offchain agents responsible for security - they observe messages on an origin chain's [Mailbox](/docs/protocol/mailbox) and if needed sign a merkle root that attests the current state of the mailbox. 2. [Relayers](#relayer) fulfil the message transport requirement of the protocol. They aggregate off-chain security metadata for the [`IInterchainSecurityModule` interface](/docs/protocol/ISM/modular-security) and deliver messages to their recipients. Validators[​](#validators "Direct link to Validators") ------------------------------------------------------- [Validators](/docs/protocol/agents/validators) fulfil the security requirement of the protocol, as part of the [Multisig ISM](/docs/protocol/ISM/multisig-ISM) or the [Hyperlane AVS](/docs/protocol/economic-security/hyperlane-avs) , by attesting to the validity of [Mailbox](/docs/protocol/mailbox) messages and making their signatures available to a Relayer. This signature is stored and made publicly available (e.g. in an S3 bucket), which is then used by the offchain Relayer and Interchain Security Modules onchain. Validators are _not_ networked together and do not need to reach consensus; they also do not regularly submit onchain transactions. This is the agent community operators run if looking to help secure an origin chain, and it's the most important duty one can perform to help decentralize message passing on Hyperlane. **Note that just running a Validator doesn't mean it's actively contributing to securing messages:** a Multisig ISM on the destination chain must have enrolled the Validator's checkpoint-signing key, and that ISM must be used by message recipients. These agents are implemented in Rust and distributed as Docker images and binaries. 👉 Learn more about Validators [here](/docs/protocol/agents/validators) . Relayer[​](#relayer "Direct link to Relayer") ---------------------------------------------- A Hyperlane [Relayer](/docs/protocol/agents/relayer) delivers interchain messages to their recipients. Relaying is permissionless, and one honest Relayer running between a chain pair is sufficient for ensuring liveness. Running a Relayer is: 1) much more operationally complex than a Validator; 2) not required for securing the network; and 3) only recommended for permissionless deployments of Hyperlane. Hyperlane Relayers are configured to relay messages between one or more origin chains and destination chains. Every Hyperlane message involves two transactions: 1. To [`dispatch`](/docs/reference/messaging/send) and send a message on the origin chain. 2. To [`process`](/docs/reference/messaging/receive) and deliver the message on destination chain. A Relayer's job is to deliver the message on the destination chain. To fulfil this responsibility: * The Relayer keeps track of new messages as they come in on the origin chain. * It checks the [Interchain Security Module (ISM)](/docs/protocol/ISM/modular-security) specified by the recipient to gather the necessary metadata to secure the message. For example, it may retrieve Multisig ISM signatures from Validator checkpoint storage. * After assembling the security metadata, the Relayer then sends the message to the recipient on the destination chain. If the message delivery fails (e.g. due to a lack of liquidity to transfer out of a Warp Route contract), the Relayer retries the delivery with an exponential backoff mechanism until successful. A Relayer has no special permissions in Hyperlane. If Relayer keys are compromised, only the tokens held by those keys are at risk. 👉 Learn more about Relayers [here](/docs/protocol/agents/relayer) . * [Validators](#validators) * [Relayer](#relayer) --- # Run a Relayer | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Run a Relayer ============= tip * For an introduction on Relayers in Hyperlane, you can check out the [Overview section](/docs/operate/overview-agents) . * We recommend you read through the [**Deploy Hyperlane Local Agents**](/docs/guides/deploy-hyperlane-local-agents) guide to understand how to configure and run the Relayer locally, as well as the [**Run Validators**](/docs/operate/validators/run-validators) documentation before trying to run a production Relayer. Requirements[​](#requirements "Direct link to Requirements") ------------------------------------------------------------- * RPC nodes * A Relayer uses RPC nodes to read the origin chain(s), and deliver messages to the destination chain(s). The Relayer must be configured with an RPC node for all origin and destination chains. * One or more signing keys * In order to deliver messages, the Relayer must be configured with a signing key to submit transactions on each destination chain (thus need funds on those chains). * The Relayer uses this key to sign `Mailbox.process()` transactions. The Hyperlane Relayer agent currently supports configuration with AWS KMS keys that are accessed via API keys/secrets or raw hexadecimal private keys. * A machine to run on * Relayer operators can compile the Rust binary themselves, or run a Docker image provided by Abacus Works. The binary can be run using your favorite cloud service. Guide[​](#guide "Direct link to Guide") ---------------------------------------- info * The local agent setup shows how you can run a Relayer on your _local machine_, which is **only for testing and development purposes**. * We strongly encourage you to follow the [local agents guide](/docs/guides/deploy-hyperlane-local-agents) to understand how to configure and run the Relayer locally. ### Keys[​](#keys "Direct link to Keys") The Relayer needs to be able to submit transactions to many destination chains, and therefore requires access to a key for signing transactions. There are two supported key types: hexadecimal private keys (for in-memory signing), and AWS KMS based keys (best practice for production environments). #### Hexadecimal keys[​](#hexadecimal-keys "Direct link to Hexadecimal keys") A hexadecimal private key used for in-memory signing can be used by your Relayer to sign transactions. This is the recommended setup for testing or development purposes, but may also be used in production. #### AWS KMS keys[​](#aws-kms-keys "Direct link to AWS KMS keys") An AWS KMS key can be used by your Relayer to sign transactions. This is the recommended setup for a production Relayer. tip See the [Agent Keys](/docs/operate/set-up-agent-keys) page to set up your Hexadecimal or AWS KMS keys. ### Configuration[​](#configuration "Direct link to Configuration") Like the local setup, there are a few base arguments you should provide when configuring your Relayer. | Argument | Description | | --- | --- | | `--relayChains` | Comma separated names of the origin and destination chains to relay messages between. For example: `ethereum,polygon,avalanche`. | | `--db` | The path to where the Relayer should write persistent data to disk. Ensure this path to be persistent when using cloud setups. When using Docker, make sure to mount the persistent path/volume into the container. See [config-reference](/docs/operate/config-reference#db)
for more info. | | `--allowLocalCheckpointSyncers` | If `true`, this will allow the Relayer to look for Validator signatures on the Relayer's local filesystem. In a production environment, this should be `false`. If you're running a Validator on the same machine by following the Validator local setup instructions, set this to `true` so that your Relayer can access the local Validator signatures. | info Your Relayer takes both command line arguments and environment variables as configuration. Take a look at the [agent configuration](/docs/operate/agent-config) page and the [configuration reference](/docs/operate/config-reference) for a full list of configuration possibilities. Of course, you can also provide the path to additional configuration files as a comma separated list with the [`CONFIG_FILES` environment variable](/docs/operate/config-reference#config_files) . If you choose to run in Docker, see the docker section of [agent configuration](/docs/operate/agent-config) for tips on mounting your config files into your Docker container. ### Setup-specific configuration[​](#setup-specific-configuration "Direct link to Setup-specific configuration") These configurations requirements differ depending on which key setup instructions you followed. * Hexadecimal Key * AWS KMS Key If you created a [hexadecimal key](/docs/operate/set-up-agent-keys) , configure the default signer like so: | Argument | Description | | --- | --- | | `--defaultSigner.key` | A hexadecimal private key used to sign transactions for all chains. For example: `1b3dead...beef`. | If you created an [AWS KMS key](/docs/operate/set-up-agent-keys) , configure the default signer like so: | Argument | Description | | --- | --- | | `--defaultSigner.type` | Set to `aws`. | | `--defaultSigner.id` | The alias of your Relayer's AWS KMS key, prefixed with `alias/`. For example: `alias/hyperlane-relayer-1`. | | `--defaultSigner.region` | The region of your AWS KMS key. For example: `us-east-1`. | For chain-specific signers (i.e. to customize the key to use for each chain) take a look at the [configuration reference](/docs/operate/config-reference) Start Relaying[​](#start-relaying "Direct link to Start Relaying") ------------------------------------------------------------------- ### Setup[​](#setup "Direct link to Setup") The recommended installation method for a production environment is using a Docker image. * Docker image * Building from source First download the docker image: docker pull --platform linux/amd64 gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.1.0 **Clone and setup** First, clone the Hyperlane monorepo: git clone git@github.com:hyperlane-xyz/hyperlane-monorepo.git Then follow the [setup instructions](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/README.md) in the `rust` directory. This should setup `rustup` as well as Rosetta 2 if you are on Apple Silicon. # install rustupcurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh# (apple silicon only) install rosetta 2softwareupdate --install-rosetta --agree-to-license Build the Relayer: cargo build --release bin relayer ### Running the agent[​](#running-the-agent "Direct link to Running the agent") If the Relayer's keys have been configured with AWS KMS, you will have to provide the AWS access key and secret as environment variables. | Environment variable | Description | | --- | --- | | `AWS_ACCESS_KEY_ID` | The access key ID of your Relayer's AWS IAM user. | | `AWS_SECRET_ACCESS_KEY` | The secret access key of your Relayer's AWS IAM user. | For a refresher, check out the [Agent Keys](/docs/operate/set-up-agent-keys) guide. * Using Docker * Building from source Then start the container with the relevant arguments. For example, your configuration for AWS: docker run \ -it \ -e AWS_ACCESS_KEY_ID=ABCDEFGHIJKLMNOP \ -e AWS_SECRET_ACCESS_KEY=xX-haha-nice-try-Xx \ --mount ... \ gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.1.0 \ ./relayer \ --db /hyperlane_db \ --relayChains , \ --defaultSigner.type aws \ --defaultSigner.id alias/hyperlane-relayer-1 \ --defaultSigner.region us-east-1 \ info If you're running Validators with a local setup on the same machine and running a local Relayer to access these Validator signatures, be sure to [mount](https://docs.docker.com/storage/bind-mounts/) your local Validator's signature directory into your Relayer at the same path that you used when [announcing your Validator](/docs/operate/validators/run-validators#Announcing-your-validator) For example, if your local Validator is writing signatures to `/tmp/hyperlane-validator-signatures-ethereum`, you should mount a directory for the Docker container: docker run \ -it \ -e CONFIG_FILES=/config/agent-config.json \ --mount type=bind,source=$CONFIG_FILES,target=/config/agent-config.json,readonly \ --mount type=bind,source="$(pwd)"/hyperlane-validator-signatures-ethereum,target=/tmp/hyperlane-validator-signatures-ethereum,readonly \ --mount type=bind,source="$(pwd)"/hyperlane_db,target=/hyperlane_db \ gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.1.0 \ ./relayer \ --db /hyperlane_db \ --relayChains ethereum,polygon,avalanche \ --allowLocalCheckpointSyncers true \ --defaultSigner.key \ See these instructions for building from source without Docker. We can run the built binary from within the `hyperlane-monorepo/rust` directory: # set AWS environment variablesexport AWS_ACCESS_KEY_ID=ABCDEFGHIJKLMNOPexport AWS_SECRET_ACCESS_KEY=xX-haha-nice-try-Xx# run the Relayer./target/release/relayer \ --db /hyperlane_db \ --relayChains , \ --defaultSigner.type aws \ --defaultSigner.id alias/hyperlane-relayer-1 \ --defaultSigner.region us-east-1 \ Indexing[​](#indexing "Direct link to Indexing") ------------------------------------------------- The Relayer needs to index all historic messages for the origin chain(s). This information is stored in a local database on disk (set with `db` in the config). This means running a Relayer for the first time may take some extra time to catch up with the current state. * [Requirements](#requirements) * [Guide](#guide) * [Keys](#keys) * [Configuration](#configuration) * [Setup-specific configuration](#setup-specific-configuration) * [Start Relaying](#start-relaying) * [Setup](#setup) * [Running the agent](#running-the-agent) * [Indexing](#indexing) --- # Configuration reference | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Configuration reference ======================= CONFIG\_FILES[​](#config_files "Direct link to CONFIG_FILES") -------------------------------------------------------------- **Description:** (Env only) List of additional configuration file paths to load in order (such as those in `hyperlane-monorepo/rust/main/config`). They will be merged first to last, so if both the first one and the last one specify a specific config path, the value set in the last file listed will be used. These files must be accessible within the filesystem your agent has access to. If you're running in Docker, see [the agent configuration guide](/docs/operate/agent-config#config-files-with-docker) for tips on mounting your config files into your Docker container. **Optional:** Yes **Agents:** All **Type:** `string` (Comma separated list of file paths) * As Arg * As Env * As Config Not supported as an argument export CONFIG_FILES='./config/ethereum/my-config.json,./config/ethereum/my-validator-config.json' Not supported in configuration files chains[​](#chains "Direct link to chains") ------------------------------------------- **Description:** Configuration for each of the chains that must be used by an agent. **Optional:** No **Agents:** All **Type:** `Map` (See `chains.*` for `ChainSetup` values) * As Arg * As Env * As Config --chains.${CHAIN_NAME}.* export HYP_CHAINS_${CHAIN_NAME}_*="...."export HYP_CHAINS_ETHEREUM_*="...." { "chains": { "``": {}, "ethereum": {} }} chains.``.name[​](#chainschain_namename "Direct link to chainschain_namename") ------------------------------------------------------------------------------------------- **Description:** Name of the domain. Allows specifying a different name for the domain than the chain's true name. This should _almost always_ be the same as `chain_name`. **Requires:** Alignment with domain id if it is a known domain name. **Optional:** No **Agents:** All **Type:** `string` * As Arg * As Env * As Config --chains.${CHAIN_NAME}.name $DOMAIN_NAME--chains.ethereum.name ethereum export HYP_CHAINS_${CHAIN_NAME}_NAME="$DOMAIN_NAME"export HYP_CHAINS_ETHEREUM_NAME="ethereum" { "chains": { "``": { "name": "" }, "ethereum": { "name": "ethereum" } }} chains.``.domain[​](#chainschain_namedomain "Direct link to chainschain_namedomain") ------------------------------------------------------------------------------------------------- **Description:** Hyperplane domain id to uniquely identify the domain. See also: [Domain Identifiers](/docs/reference/domains) . **Requires:** Alignment with domain name if it is a known domain. **Optional:** No **Agents:** All **Type:** `Numeric (string | number)` * As Arg * As Env * As Config --chains.${CHAIN_NAME}.domain $DOMAIN_ID--chains.ethereum.domain 1 export HYP_CHAINS_${CHAIN_NAME}_DOMAIN="$DOMAIN_NAME"export HYP_CHAINS_ETHEREUM_DOMAIN=1 { "chains": { "``": { "domain": "" }, "ethereum": { "domain": 1 } }} chains.``.mailbox[​](#chainschain_namemailbox "Direct link to chainschain_namemailbox") ---------------------------------------------------------------------------------------------------- **Description:** Address of the mailbox contract on the chain. See also [contract addresses](/docs/reference/contract-addresses) . **Optional:** No **Agents:** All **Type:** `Hash (string)` * As Arg * As Env * As Config --chains.${CHAIN_NAME}.mailbox "$MAILBOX_ADDRESS"--chains.ethereum.mailbox "0x35231d4c2D8B8ADcB5617A638A0c4548684c7C70" export HYP_CHAINS_${CHAIN_NAME}_MAILBOX="$MAILBOX_ADDRESS"export HYP_CHAINS_ETHEREUM_MAILBOX="0x35231d4c2D8B8ADcB5617A638A0c4548684c7C70" { "chains": { "``": { "addresses": { "mailbox": "" } }, "ethereum": { "addresses": { "mailbox": "0x35231d4c2D8B8ADcB5617A638A0c4548684c7C70" } } }} chains.``.interchainGasPaymaster[​](#chainschain_nameinterchaingaspaymaster "Direct link to chainschain_nameinterchaingaspaymaster") ------------------------------------------------------------------------------------------------------------------------------------------------- **Description:** Address of the interchain gas paymaster contract on the chain. See also [contract addresses](/docs/reference/contract-addresses) . **Optional:** No **Agents:** All **Type:** `Hash (string)` * As Arg * As Env * As Config --chains.${CHAIN_NAME}.interchainGasPaymaster "$IGP_ADDRESS"--chains.ethereum.interchainGasPaymaster "0x6cA0B6D22da47f091B7613223cD4BB03a2d77918" export HYP_CHAINS_${CHAIN_NAME}_INTERCHAINGASPAYMASTER="$IGP_ADDRESS"export HYP_CHAINS_ETHEREUM_INTERCHAINGASPAYMASTER="0x6cA0B6D22da47f091B7613223cD4BB03a2d77918" { "chains": { "``": { "addresses": { "interchainGasPaymaster": "" } }, "ethereum": { "addresses": { "interchainGasPaymaster": "0x6cA0B6D22da47f091B7613223cD4BB03a2d77918" } } }} chains.``.validatorAnnounce[​](#chainschain_namevalidatorannounce "Direct link to chainschain_namevalidatorannounce") ---------------------------------------------------------------------------------------------------------------------------------- **Description:** Address of the validator announce contract on the chain. See also [contract addresses](/docs/reference/contract-addresses) . **Optional:** No **Agents:** All **Type:** `Hash (string)` * As Arg * As Env * As Config --chains.${CHAIN_NAME}.validatorAnnounce "$VALIDATOR_ANNOUNCE_ADDRESS"--chains.ethereum.validatorAnnounce "0x9bBdef63594D5FFc2f370Fe52115DdFFe97Bc524" export HYP_CHAINS_${CHAIN_NAME}_VALIDATORANNOUNCE="$VALIDATOR_ANNOUNCE_ADDRESS"export HYP_CHAINS_ETHEREUM_VALIDATORANNOUNCE="0x9bBdef63594D5FFc2f370Fe52115DdFFe97Bc524" { "chains": { "``": { "addresses": { "validatorAnnounce": "" } }, "ethereum": { "addresses": { "validatorAnnounce": "0x9bBdef63594D5FFc2f370Fe52115DdFFe97Bc524" } } }} chains.``.merkleTreeHook[​](#chainschain_namemerkletreehook "Direct link to chainschain_namemerkletreehook") ------------------------------------------------------------------------------------------------------------------------- **Description:** Address of the merkle tree hook contract on the chain. See also [contract addresses](/docs/reference/contract-addresses) . **Optional:** No **Agents:** All **Type:** `Hash (string)` * As Arg * As Env * As Config --chains.${CHAIN_NAME}.merkleTreeHook "$MERKLE_TREE_HOOK_ADDRESS"--chains.ethereum.merkleTreeHook "0x48e6c30B97748d1e2e03bf3e9FbE3890ca5f8CCA" export HYP_CHAINS_${CHAIN_NAME}_MERKLETREEHOOK="$MERKLE_TREE_HOOK_ADDRESS"export HYP_CHAINS_ETHEREUM_MERKLETREEHOOK="0x48e6c30B97748d1e2e03bf3e9FbE3890ca5f8CCA" { "chains": { "``": { "addresses": { "merkleTreeHook": "" } }, "ethereum": { "addresses": { "merkleTreeHook": "0x48e6c30B97748d1e2e03bf3e9FbE3890ca5f8CCA" } } }} chains.``.signer[​](#chainschain_namesigner "Direct link to chainschain_namesigner") ------------------------------------------------------------------------------------------------- **Description:** The signer that should be used this chain **Optional:** Yes (Will use `defaultsigner` if not specified) **Agents:** All **Type:** `SignerConf (Object)` * As Arg * As Env * As Config --chains.${CHAIN_NAME}.signer.* export HYP_CHAINS_${CHAIN_NAME}_SIGNER_*="...." { "chains": { "``": { "signer": {} }, "ethereum": { "signer": {} } }} chains.``.signer.type[​](#chainschain_namesignertype "Direct link to chainschain_namesignertype") -------------------------------------------------------------------------------------------------------------- **Description:** The type of signer that is defined. A `HexKey` signer uses a private key, an `Aws` signer uses an AWS based KMS, and `Node` assumes the local node will sign RPC calls. **Optional:** Yes; Defaults to `node` unless a `key` is specified in which case it defaults to `hexKey` **Agents:** All **Type:** `Enum ("hexKey" | "aws" | "cosmosKey" | "node")` Accepted values for the different VMs are: * EVM: `hexKey` (ECDSA) or `aws` (ECDSA) * sealevel: `hexKey` (ED25519) * cosmos: `cosmosKey` * As Arg * As Env * As Config --chains.${CHAIN_NAME}.signer.type hexKey--chains.ethereum.signer.type node export HYP_CHAINS_${CHAIN_NAME}_SIGNER_TYPE="hexKey" { "chains": { "``": { "signer": { "type": "hexKey" } }, "ethereum": { "signer": { "type": "node" } } }} chains.``.signer.key[​](#chainschain_namesignerkey "Direct link to chainschain_namesignerkey") ----------------------------------------------------------------------------------------------------------- **Description:** A hex key. The hex string of a private key. **Requires:** `chains..signer.type = "hexKey" | undefined` **Optional:** No (iff requirements are met) **Agents:** All **Type:** `string` * As Arg * As Env * As Config --chains.${CHAIN_NAME}.signer.key "8166f546bab6da521a8369cab06c5d2b9e46670292d85c875ee9ec20e84ffb61" export HYP_CHAINS_${CHAIN_NAME}_SIGNER_KEY="8166f546bab6da521a8369cab06c5d2b9e46670292d85c875ee9ec20e84ffb61" { "chains": { "``": { "signer": { "key": "" } }, "ethereum": { "signer": { "key": "8166f546bab6da521a8369cab06c5d2b9e46670292d85c875ee9ec20e84ffb61" } } }} chains.``.signer.id[​](#chainschain_namesignerid "Direct link to chainschain_namesignerid") -------------------------------------------------------------------------------------------------------- **Description:** The UUID identifying the AWS KMS key **Requires:** `chains..signer.type = "aws"` **Optional:** No (iff requirements are met) **Agents:** All **Type:** `string` * As Arg * As Env * As Config --chains.ethereum.signer.type "alias/validator-signer-ethereum" export HYP_CHAINS_${CHAIN_NAME}_SIGNER_ID="alias/validator-signer-ethereum" { "chains": { "ethereum": { "signer": { "type": "aws", "id": "alias/validator-signer-ethereum" } } }} chains.``.signer.region[​](#chainschain_namesignerregion "Direct link to chainschain_namesignerregion") -------------------------------------------------------------------------------------------------------------------- **Description:** The AWS region **Requires:** `chains..signer.type = "aws"` **Optional:** No (iff requirements are met) **Agents:** All **Type:** `string` * As Arg * As Env * As Config --chains.${CHAIN_NAME}.signer.region us-east-1 export HYP_CHAINS_${CHAIN_NAME}_SIGNER_REGION="us-east-1" { "chains": { "``": { "signer": { "type": "aws", "region": "us-east-1" } } }} chains.``.protocol[​](#chainschain_nameprotocol "Direct link to chainschain_nameprotocol") ------------------------------------------------------------------------------------------------------- **Description:** Connection protocol to use. **Optional:** Defaults to `"ethereum"` **Agents:** All **Type:** `Enum ("ethereum" | "fuel")` * As Arg * As Env * As Config --chains.${CHAIN_NAME}.protocol ethereum--chains.ethereum.protocol ethereum export HYP_CHAINS_${CHAIN_NAME}_PROTOCOL="ethereum"export HYP_CHAINS_ARBITRUM_PROTOCOL="ethereum" { "chains": { "``": { "protocol": "" }, "arbitrum": { "protocol": "ethereum" } }} chains.``.rpcConsensusType[​](#chainschain_namerpcconsensustype "Direct link to chainschain_namerpcconsensustype") ------------------------------------------------------------------------------------------------------------------------------- info **The consensus type currently only applies to EVM chains.** Connections to non-EVM chains only support a single RPC url. If more than one RPC url is specified in [rpcUrls](#chainschain_namerpcurls) , only the first one will be used. **Description:** How to communicate with the provider * `"single"` uses a basic http connection * `"fallback"` will try the first URL and then automatically "fall back" on a connection or other provider failure to the next provider; this should only retry calls which fail due to the provider and not the call itself such; an insufficient gas error for instance would not fall back. * `"quorum"` requires a majority of the URLs to agree with the exception of submitting transactions; it will automatically coordinate the "latest" block if not specified to reduce sync errors. **Requires:** `chains..protocol = "ethereum" | undefined` **Optional:** Defaults to `"fallback"` **Agents:** All **Type:** `Enum ("fallback", "single", "quorum")` * As Arg * As Env * As Config --chains.${CHAIN_NAME}.rpcConsensusType single export HYP_CHAINS_${CHAIN_NAME}_RPCCONSENSUSTYPE="single"export HYP_CHAINS_ETHEREUM_RPCCONSENSUSTYPE="single" { "chains": { "``": { "rpcConsensusType": "single" }, "ethereum": { "rpcConsensusType": "single" } }} chains.``.customRpcUrls[​](#chainschain_namecustomrpcurls "Direct link to chainschain_namecustomrpcurls") ---------------------------------------------------------------------------------------------------------------------- info Connections to non-EVM chains only support a single RPC url. If more than one RPC url is specified, only the first one will be used. **Description:** Comma-separated URLs to connect the provider to. The difference between `customRpcUrls` and [rpcUrls](#chainschain_namerpcurls) is that `customRpcUrls` allows for more user friendly inputs from the CLI or environment variables (comma-separated vs array). **Type:** `string` (comma separated list of urls without spaces) * As Arg * As Env * As Config --chains.${CHAIN_NAME}.customrpcurls "$CONNECTION_URLS"--chains.ethereum.customrpcurls "http://127.0.0.1:8545,http://127.0.0.1:8546,http://127.0.0.1:8547" export HYP_CHAINS_${CHAIN_NAME}_CUSTOMRPCURLS="$CONNECTION_URLS"export HYP_CHAINS_ETHEREUM_RPCURLS_2_HTTPS="http://127.0.0.1:8545,http://127.0.0.1:8546,http://127.0.0.1:8547" { "chains": { "``": { "rpcUrls": "" }, "ethereum": { "rpcUrls": "http://127.0.0.1:8545,http://127.0.0.1:8546,http://127.0.0.1:8547" } }} chains.``.rpcUrls[​](#chainschain_namerpcurls "Direct link to chainschain_namerpcurls") ---------------------------------------------------------------------------------------------------- info Connections to non-EVM chains only support a single RPC url. If more than one RPC url is specified, only the first one will be used. **Description:** URLs to connect the provider to. The first one is initially used, and on failure the other ones are tried. See [rpcConsensusType](#chainschain_namerpcconsensustype) for more information. **Requires:** (chains.``.protocol = "ethereum" | undefined) AND (chains.``.connection.type = "fallback" | "quorum") OR chains.``.protocol = "cosmos" | "sealevel" | "fuel" **Optional:** No (iff requirements are met) **Agents:** **Type:** `string` * As Arg * As Env * As Config --chains.${CHAIN_NAME}.rpcurls.0.https "$CONNECTION_URL_0"--chains.${CHAIN_NAME}.rpcurls.1.https "$CONNECTION_URL_1"--chains.${CHAIN_NAME}.rpcurls.2.https "$CONNECTION_URL_2"--chains.ethereum.rpcurls.0.https "http://127.0.0.1:8545"--chains.ethereum.rpcurls.1.https "http://127.0.0.1:8546"--chains.ethereum.rpcurls.2.https "http://127.0.0.1:8547" export HYP_CHAINS_${CHAIN_NAME}_RPCURLS_0_HTTPS="$CONNECTION_URL_0"export HYP_CHAINS_${CHAIN_NAME}_RPCURLS_1_HTTPS="$CONNECTION_URL_1"export HYP_CHAINS_${CHAIN_NAME}_RPCURLS_2_HTTPS="$CONNECTION_URL_2"export HYP_CHAINS_ETHEREUM_RPCURLS_0_HTTPS="http://127.0.0.1:8545"export HYP_CHAINS_ETHEREUM_RPCURLS_1_HTTPS="http://127.0.0.1:8546"export HYP_CHAINS_ETHEREUM_RPCURLS_2_HTTPS="http://127.0.0.1:8547" { "chains": { "``": { "rpcUrls": [ { "http": "" }, { "http": "" } ], }, "ethereum": { "rpcUrls": [ { "http": "http://127.0.0.1:8545" }, { "http": "http://127.0.0.1:8546" } ], } }} chains.``.index.from[​](#chainschain_nameindexfrom "Direct link to chainschain_nameindexfrom") ----------------------------------------------------------------------------------------------------------- **Description:** Height at which to start indexing contracts. **Optional:** Defaults to `0` **Agents:** Relayer & Scraper **Type:** `Numeric (string | number)` * As Arg * As Env * As Config --chains.${CHAIN_NAME}.index.from 0--chains.ethereum.index.from 16271503 export HYP_CHAINS_${CHAIN_NAME}_INDEX_FROM=0export HYP_CHAINS_ETHEREUM_INDEX_FROM=16271503 { "chains": { "``": { "index": { "from": 0 } }, "ethereum": { "index": { "from": 16271503 } } }} chains.``.index.chunk[​](#chainschain_nameindexchunk "Direct link to chainschain_nameindexchunk") -------------------------------------------------------------------------------------------------------------- **Description:** Number of blocks to query at once when indexing contracts. Note that the configured providers must support whatever value is set. The default should work with nearly all providers. **Optional:** Defaults to `1999` **Agents:** Relayer & Scraper **Type:** `Numeric (string | number)` * As Arg * As Env * As Config --chains.${CHAIN_NAME}.index.chunk 1999--chains.ethereum.index.chunk 1999 export HYP_CHAINS_${CHAIN_NAME}_INDEX_CHUNK=1999export HYP_CHAINS_ETHEREUM_INDEX_CHUNK=1999 { "chains": { "``": { "index": { "chunk": 1999 } }, "ethereum": { "index": { "chunk": 1999 } } }} defaultsigner[​](#defaultsigner "Direct link to defaultsigner") ---------------------------------------------------------------- info Because each VM supports a different signer type, the default signer can only support a single VM type. For instance, if the default signer is a ECDSA one, it will only be able to sign on EVM chains. **Description:** The default signer that should be used for all chains which did not specify their own. **Optional:** Yes **Agents:** All **Type:** `SignerConf (Object)` * As Arg * As Env * As Config --defaultSigner.* export HYP_DEFAULTSIGNER_*="...." { "defaultsigner": {}} defaultsigner.type[​](#defaultsignertype "Direct link to defaultsigner.type") ------------------------------------------------------------------------------ **Description:** The type of signer that is defined. A `HexKey` signer uses a private key, an `Aws` signer uses an AWS-based KMS, and `Node` assumes the local node will sign RPC calls. **Optional:** Yes; Defaults to `node` unless a `key` is specified in which case it defaults to `hexKey` **Agents:** All **Type:** `Enum ("hexKey" | "aws" | "cosmosKey" | "node")` * As Arg * As Env * As Config --defaultSigner.type hexKey export HYP_DEFAULTSIGNER_TYPE="hexKey" { "defaultsigner": { "type": "hexKey" }} defaultsigner.key[​](#defaultsignerkey "Direct link to defaultsigner.key") --------------------------------------------------------------------------- **Description:** A hex key. The hex string of a private key. **Requires:** `defaultsigner.type = "hexKey" | undefined` **Optional:** No (iff requirements are met) **Agents:** All **Type:** `string` * As Arg * As Env * As Config --defaultSigner.key "8166f546bab6da521a8369cab06c5d2b9e46670292d85c875ee9ec20e84ffb61" export HYP_DEFAULTSIGNER_KEY="8166f546bab6da521a8369cab06c5d2b9e46670292d85c875ee9ec20e84ffb61" { "defaultsigner": { "type": "hexKey", "key": "8166f546bab6da521a8369cab06c5d2b9e46670292d85c875ee9ec20e84ffb61" }} defaultsigner.id[​](#defaultsignerid "Direct link to defaultsigner.id") ------------------------------------------------------------------------ **Description:** The UUID identifying the AWS KMS key **Requires:** `defaultsigner.type = "aws"` **Optional:** No (iff requirements are met) **Agents:** All **Type:** `string` * As Arg * As Env * As Config --defaultSigner.id "alias/validator-signer-ethereum" export HYP_DEFAULTSIGNER_ID="alias/validator-signer-ethereum" { "defaultsigner": { "type": "aws", "id": "alias/validator-signer-ethereum" }} defaultsigner.region[​](#defaultsignerregion "Direct link to defaultsigner.region") ------------------------------------------------------------------------------------ **Description:** The AWS region **Requires:** `defaultsigner.type = "aws"` **Optional:** No (iff requirements are met) **Agents:** All **Type:** `string` * As Arg * As Env * As Config --defaultSigner.region us-east-1 export HYP_DEFAULTSIGNER_REGION="us-east-1" { "defaultsigner": { "type": "aws", "region": "us-east-1" }} metricsport[​](#metricsport "Direct link to metricsport") ---------------------------------------------------------- **Description:** Port to expose prometheus metrics on **Optional:** Defaults to `9090` **Agents:** All **Type:** `Numeric (string | number)` * As Arg * As Env * As Config --metrics-port 9090 export HYP_METRICSPORT=9090 { "metrics": 9090} log.format[​](#logformat "Direct link to log.format") ------------------------------------------------------ **Description:** Configuration for the log module. This controls logging. **Optional:** Defaults to `pretty` **Agents:** All **Type:** `Enum ("pretty" | "json" | "full" | "compact")` * As Arg * As Env * As Config --log.format pretty export HYP_LOG_FORMAT="pretty" { "log": { "format": "pretty" }} log.level[​](#loglevel "Direct link to log.level") --------------------------------------------------- **Description:** Configuration for the log module. This controls logging. For full verbosity (including that of dependencies), use `dependencyTrace`. **Optional:** Defaults to `info` **Agents:** All **Type:** `Enum ("dependencyTrace" | "trace" | "debug" | "info" | "warn" | "error" | "off")` * As Arg * As Env * As Config --log.level info export HYP_LOG_LEVEL="info" { "log": { "level": "info" }} originchainname[​](#originchainname "Direct link to originchainname") ---------------------------------------------------------------------- **Description:** Name of the chain a validator should validate for and name of the chain a relayer should relayer messages from. **Deprecated for Relayer, use** [#relaychains](#relaychains) **instead.** **Optional:** No - Validators; Yes - Relayer **Agents:** Validator & Relayer **Type:** `string` * As Arg * As Env * As Config --originChainName ethereum export HYP_ORIGINCHAINNAME="ethereum" { "originchainname": "ethereum"} validator[​](#validator "Direct link to validator") ---------------------------------------------------- **Description:** The signer that should be used by the validator. **Optional:** Yes **Agents:** All **Type:** `SignerConf (Object)` * As Arg * As Env * As Config --validator.* export HYP_VALIDATOR_*="...." { "validator": {}} validator.type[​](#validatortype "Direct link to validator.type") ------------------------------------------------------------------ **Description:** The type of EVM signer that is defined. Note that regardless of the VM the validator is operating on, checkpoints are always signed using the EVM ECDSA curve. A `HexKey` signer uses a private key, an `Aws` signer uses an AWS based KMS, and `Node` assumes the local node will sign RPC calls. **Optional:** Yes; Defaults to `node` unless a `key` is specified in which case it defaults to `hexKey` **Agents:** All **Type:** `Enum ("hexKey" | "aws" | "node")` * As Arg * As Env * As Config --validator.type hexKey export HYP_VALIDATOR_TYPE="hexKey" { "validator": { "type": "hexKey" }} validator.key[​](#validatorkey "Direct link to validator.key") --------------------------------------------------------------- **Description:** A hex key. The hex string of a private key. **Requires:** `validator.type = "hexKey" | undefined` **Optional:** No (iff requirements are met) **Agents:** All **Type:** `string` * As Arg * As Env * As Config --validator.key 8166f546bab6da521a8369cab06c5d2b9e46670292d85c875ee9ec20e84ffb61 export HYP_VALIDATOR_KEY="8166f546bab6da521a8369cab06c5d2b9e46670292d85c875ee9ec20e84ffb61" { "validator": { "type": "hexKey", "key": "8166f546bab6da521a8369cab06c5d2b9e46670292d85c875ee9ec20e84ffb61" }} validator.id[​](#validatorid "Direct link to validator.id") ------------------------------------------------------------ **Description:** The UUID identifying the AWS KMS key **Requires:** `validator.type = "aws"` **Optional:** No (iff requirements are met) **Agents:** All **Type:** `string` * As Arg * As Env * As Config --validator.id "alias/validator-signer-ethereum" export HYP_VALIDATOR_ID="alias/validator-signer-ethereum" { "validator": { "type": "aws", "id": "alias/validator-signer-ethereum" }} validator.region[​](#validatorregion "Direct link to validator.region") ------------------------------------------------------------------------ **Description:** The AWS region **Requires:** `validator.type = "aws"` **Optional:** No (iff requirements are met) **Agents:** All **Type:** `string` * As Arg * As Env * As Config --validator.region us-east-1 export HYP_VALIDATOR_REGION="us-east-1" { "validator": { "type": "aws", "region": "us-east-1" }} checkpointsyncer.type[​](#checkpointsyncertype "Direct link to checkpointsyncer.type") --------------------------------------------------------------------------------------- **Description:** Defines the method of syncing checkpoints **Optional:** No **Agents:** Validator **Type:** `Enum ("localStorage" | "s3")` * As Arg * As Env * As Config --checkpointSyncer.type localStorage export HYP_CHECKPOINTSYNCER_TYPE="localStorage" { "checkpointsyncer": { "type": "localStorage" }} checkpointsyncer.path[​](#checkpointsyncerpath "Direct link to checkpointsyncer.path") --------------------------------------------------------------------------------------- **Description:** Path on the local disk of a local storage type checkpoint syncer configuration. **Requires:** `checkpointsyncer.type = "localStorage"` **Optional:** No (iff conditions are met) **Agents:** Validator **Type:** `string` * As Arg * As Env * As Config --checkpointSyncer.path "/tmp/syncer" export HYP_CHECKPOINTSYNCER_PATH="/tmp/syncer" { "checkpointsyncer": { "type": "localStorage", "path": "/tmp/syncer" }} checkpointsyncer.bucket[​](#checkpointsyncerbucket "Direct link to checkpointsyncer.bucket") --------------------------------------------------------------------------------------------- **Description:** S3 bucket name **Requires:** `checkpointsyncer.type = "s3"` **Optional:** No (iff conditions are met) **Agents:** Validator **Type:** `string` * As Arg * As Env * As Config --checkpointSyncer.bucket signatures-ethereum export HYP_CHECKPOINTSYNCER_BUCKET="signatures-ethereum" { "checkpointsyncer": { "type": "s3", "bucket": "signatures-ethereum" }} checkpointsyncer.folder[​](#checkpointsyncerfolder "Direct link to checkpointsyncer.folder") --------------------------------------------------------------------------------------------- **Description:** Folder in the S3 bucket **Requires:** `checkpointsyncer.type = "s3"` **Optional:** No (iff conditions are met) **Agents:** Validator **Type:** `string` * As Arg * As Env * As Config --checkpointSyncer.folder signatures-ethereum export HYP_CHECKPOINTSYNCER_FOLDER="signatures-ethereum" { "checkpointsyncer": { "type": "s3", "folder": "signatures-ethereum" }} checkpointsyncer.region[​](#checkpointsyncerregion "Direct link to checkpointsyncer.region") --------------------------------------------------------------------------------------------- **Description:** S3 bucket region **Requires:** `checkpointsyncer.type = "s3"` **Optional:** No (iff conditions are met) **Agents:** Validator **Type:** `string` * As Arg * As Env * As Config --checkpointSyncer.region us-east-1 export HYP_CHECKPOINTSYNCER_REGION="us-east-1" { "checkpointsyncer": { "type": "s3", "region": "us-east-1" }} interval[​](#interval "Direct link to interval") ------------------------------------------------- **Description:** How frequently the validator should check for new checkpoints in seconds? See also [latencies](/docs/reference/latencies) . **Optional:** No **Agents:** Validator **Type:** `Numeric (string | number)` * As Arg * As Env * As Config --interval 30 export HYP_INTERVAL=30 { "interval": 30} db[​](#db "Direct link to db") ------------------------------- **Description:** This is a local filesystem path to where the agents store relevant data on disk. **This must be unique per agent!** Multiple agents must have different paths. The path is relative to the current working directory if it does not start with a system defined root path such as `/` on unix. When using docker images, ensure that this folder gets persisted across runs. For the scraper, this is the connection string to a postgresql database. **Optional:** For validators and relayer it is optional and defaults to a path in the current working directory which includes the `originchainname`. For the scraper it is required. **Agents:** All **Type:** `string` * As Arg * As Env * As Config # Validator--db "/tmp/hyp/validator/ethereum-cache"# Relayer--db "/tmp/hyp/relayer/ethereum-cache"# Scraper--db "postgresql://postgres:password@localhost:5432/dbname" # Validatorexport HYP_DB="/tmp/hyp/validator/ethereum-cache"# Relayerexport HYP_DB="/tmp/hyp/relayer/ethereum-cache"# Scraperexport HYP_DB="postgresql://postgres:password@localhost:5432/dbname" For the validator: { "db": "/tmp/hyp/validator/ethereum-cache"} For the relayer: { "db": "/tmp/hyp/relayer/ethereum-cache"} For the scraper: { "db": "postgresql://postgres:password@localhost:5432/dbname"} relaychains[​](#relaychains "Direct link to relaychains") ---------------------------------------------------------- **Description:** List of chains to deliver messages between. **Optional:** No **Agents:** Relayer **Type:** `string` (comma separated list) * As Arg * As Env * As Config --relayChains "arbitrum,ethereum,bsc" export HYP_RELAYCHAINS="arbitrum,ethereum,bsc" { "relaychains": "arbitrum,ethereum,bsc"} gaspaymentenforcement[​](#gaspaymentenforcement "Direct link to gaspaymentenforcement") ---------------------------------------------------------------------------------------- **Description:** JSON stringified array of gas payment enforcement configurations sorted by highest priority first. The last policy should be a catch-all and handle any messages that did not match a previous policy. **Optional:** Defaults to no enforcement (`[{"type": "none"}]`) **Agents:** Relayer **Type:** `JSON (string)` type gaspaymentenforcement = Array;type GasPaymentEnforcementPolicy =( // fields specific to each type... // No requirements - all messages are processed regardless of gas payment { type: "none" } // Messages that have paid a minimum amount will be processed & { type: "minimum", payment: U256 } // Required amount of gas on the foreign chain has been paid according // to on-chain fee quoting. `gasfraction` defaults to "1 / 2". & { type: "onChainFeeQuoting", gasfraction?: GasFraction }) | { // all types have the following fields... // If a message matches, this policy will be used. // If no matching list is specified, all messages will match. matchingList?: MatchingList};// A list of matching rules. A message matches if any of the list// elements matches the message.type MatchingList = Array;// Matches a message if any of the provided values matches.interface MatchingListElement { originDomain?: NumericFilter senderAddress?: HashFilter destinationDomain?: NumericFilter recipientAddress?: HashFilter}type NumericFilter = Wildcard | U32 | Array;type HashFilter = Wildcard | H256 | Array;// 32-bit unsigned integertype U32 = number | string;// 256-bit unsigned integer; Note: `number` type has limited precision.type U256 = string | number;// 256-bit hash (can also be less) encoded as hextype H256 = string;// Matches anythingtype Wildcard = "*";// A numeric string in the form `{numerator} / {denominator}`, e.g. "1 / 2"type GasFraction = string; * As Arg * As Env * As Config --gasPaymentEnforcement '[{"type": "none", "matchingList": [{"senderAddress": "0xa441b15fe9a3cf56661190a0b93b9dec7d041272"}]}, {"type": "minimum", "payment": 100000}]' export HYP_GASPAYMENTENFORCEMENT='[{"type": "none", "matchingList": [{"senderAddress": "0xa441b15fe9a3cf56661190a0b93b9dec7d041272"}]}, {"type": "minimum", "payment": 100000}]' { "gaspaymentenforcement": "[{"type": "none", "matchingList": [{"senderAddress": "0xa441b15fe9a3cf56661190a0b93b9dec7d041272"}]}, {"type": "minimum", "payment": 100000}]"} whitelist[​](#whitelist "Direct link to whitelist") ---------------------------------------------------- **Description:** A matching list to define what messages should be allowed. Any messages which do not match this list will not be relayed. If no whitelist is supplied all messages will be allowed. See also [message filtering](/docs/operate/relayer/message-filtering) **Optional:** Yes **Agents:** Relayer **Type:** `JSON (string)` // A list of matching rules. A message matches if any of the list// elements matches the message.type MatchingList = Array<MatchingListElement>;// Matches a message if any of the provided values matches.interface MatchingListElement { originDomain?: NumericFilter senderAddress?: HashFilter destinationDomain?: NumericFilter recipientAddress?: HashFilter}type NumericFilter = Wildcard | U32 | Array<U32>;type HashFilter = Wildcard | H256 | Array<H256>;// 32-bit unsigned integertype U32 = number | string;// 256-bit hash (can also be less) encoded as hextype H256 = string;// Matches anythingtype Wildcard = "*"; * As Arg * As Env * As Config --whitelist '[{"senderAddress": "0xa441b15fe9a3cf56661190a0b93b9dec7d041272", "originDomain": [1, 42]}, {"destinationDomain": 1}]' export HYP_WHITELIST='[{"senderAddress": "0xa441b15fe9a3cf56661190a0b93b9dec7d041272", "originDomain": [1, 42]}, {"destinationDomain": 1}]' { "whitelist": "[{"senderAddress": "0xa441b15fe9a3cf56661190a0b93b9dec7d041272", "originDomain": [1, 42]}, {"destinationDomain": 1}]"} blacklist[​](#blacklist "Direct link to blacklist") ---------------------------------------------------- **Description:** A matching list to define what messages should be ignored. Any messages which match this list will not be relayed. If no blacklist is supplied all messages will be allowed. See also [message filtering](/docs/operate/relayer/message-filtering) **Optional:** Yes **Agents:** Relayer **Type:** `JSON (string)` type blacklist = MatchingList | undefined;// A list of matching rules. A message matches if any of the list// elements matches the message.type MatchingList = Array;// Matches a message if any of the provided values matches.interface MatchingListElement { originDomain?: NumericFilter senderAddress?: HashFilter destinationDomain?: NumericFilter recipientAddress?: HashFilter}type NumericFilter = Wildcard | U32 | Array;type HashFilter = Wildcard | H256 | Array;// 32-bit unsigned integertype U32 = number | string;// 256-bit hash (can also be less) encoded as hextype H256 = string;// Matches anythingtype Wildcard = "*"; * As Arg * As Env * As Config --blacklist '[{"senderAddress": "0xa441b15fe9a3cf56661190a0b93b9dec7d041272", "originDomain": [1, 42]}, {"destinationDomain": 1}]' export HYP_BLACKLIST='[{"senderAddress": "0xa441b15fe9a3cf56661190a0b93b9dec7d041272", "originDomain": [1, 42]}, {"destinationDomain": 1}]' { "blacklist": "[{"senderAddress": "0xa441b15fe9a3cf56661190a0b93b9dec7d041272", "originDomain": [1, 42]}, {"destinationDomain": 1}]"} transactiongaslimit[​](#transactiongaslimit "Direct link to transactiongaslimit") ---------------------------------------------------------------------------------- **Description:** The max allowable gas to relay a transaction. **Optional:** Defaults to no limit **Agents:** Relayer **Type:** `Numeric (string | number)` * As Arg * As Env * As Config --transactionGasLimit 250000000 export HYP_TRANSACTIONGASLIMIT="250000000" { "transactiongaslimit": "250000000"} skiptransactiongaslimitfor[​](#skiptransactiongaslimitfor "Direct link to skiptransactiongaslimitfor") ------------------------------------------------------------------------------------------------------- **Description:** List of domain ids to skip applying the `transactiongaslimit` for. **Optional:** Defaults to using the `transactiongaslimit` for all domains **Agents:** Relayer **Type:** `string` (comma separated list of domain ids) * As Arg * As Env * As Config --skipTransactionGasLimitFor "43114,10,42220" export HYP_SKIPTRANSACTIONGASLIMITFOR="43114,10,42220" { "skiptransactiongaslimitfor": "43114,10,42220"} allowlocalcheckpointsyncers[​](#allowlocalcheckpointsyncers "Direct link to allowlocalcheckpointsyncers") ---------------------------------------------------------------------------------------------------------- **Description:** Whether to allow local `checkpointsyncer` types, if `false` it will ignore them. **Optional:** Defaults to `false` **Agents:** Relayer **Type:** `boolean` * As Arg * As Env * As Config --allowLocalCheckpointSyncers false export HYP_ALLOWLOCALCHECKPOINTSYNCERS=false { "allowlocalcheckpointsyncers": false} AWS\_ACCESS\_KEY\_ID[​](#aws_access_key_id "Direct link to AWS_ACCESS_KEY_ID") ------------------------------------------------------------------------------- **Description:** (Env only) The access key ID of your validator's AWS IAM user. **Optional**: Required if any signer configuration uses `aws` **Agents:** Relayer & Validator **Type:** `string` * As Arg * As Env * As Config Not supported as an argument export AWS_ACCESS_KEY_ID="AKIAIOSFODNN7EXAMPLE" Not supported in configuration files AWS\_SECRET\_ACCESS\_KEY[​](#aws_secret_access_key "Direct link to AWS_SECRET_ACCESS_KEY") ------------------------------------------------------------------------------------------- **Description:** (Env only) The secret access key of your validator's AWS IAM user. **Optional:** Required if any signer configuration uses `aws` **Agents:** Relayer & Validator **Type:** `string` * As Arg * As Env * As Config Not supported as an argument export AWS_SECRET_ACCESS_KEY="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" Not supported in configuration files * [CONFIG\_FILES](#config_files) * [chains](#chains) * [chains.``.name](#chainschain_namename) * [chains.``.domain](#chainschain_namedomain) * [chains.``.mailbox](#chainschain_namemailbox) * [chains.``.interchainGasPaymaster](#chainschain_nameinterchaingaspaymaster) * [chains.``.validatorAnnounce](#chainschain_namevalidatorannounce) * [chains.``.merkleTreeHook](#chainschain_namemerkletreehook) * [chains.``.signer](#chainschain_namesigner) * [chains.``.signer.type](#chainschain_namesignertype) * [chains.``.signer.key](#chainschain_namesignerkey) * [chains.``.signer.id](#chainschain_namesignerid) * [chains.``.signer.region](#chainschain_namesignerregion) * [chains.``.protocol](#chainschain_nameprotocol) * [chains.``.rpcConsensusType](#chainschain_namerpcconsensustype) * [chains.``.customRpcUrls](#chainschain_namecustomrpcurls) * [chains.``.rpcUrls](#chainschain_namerpcurls) * [chains.``.index.from](#chainschain_nameindexfrom) * [chains.``.index.chunk](#chainschain_nameindexchunk) * [defaultsigner](#defaultsigner) * [defaultsigner.type](#defaultsignertype) * [defaultsigner.key](#defaultsignerkey) * [defaultsigner.id](#defaultsignerid) * [defaultsigner.region](#defaultsignerregion) * [metricsport](#metricsport) * [log.format](#logformat) * [log.level](#loglevel) * [originchainname](#originchainname) * [validator](#validator) * [validator.type](#validatortype) * [validator.key](#validatorkey) * [validator.id](#validatorid) * [validator.region](#validatorregion) * [checkpointsyncer.type](#checkpointsyncertype) * [checkpointsyncer.path](#checkpointsyncerpath) * [checkpointsyncer.bucket](#checkpointsyncerbucket) * [checkpointsyncer.folder](#checkpointsyncerfolder) * [checkpointsyncer.region](#checkpointsyncerregion) * [interval](#interval) * [db](#db) * [relaychains](#relaychains) * [gaspaymentenforcement](#gaspaymentenforcement) * [whitelist](#whitelist) * [blacklist](#blacklist) * [transactiongaslimit](#transactiongaslimit) * [skiptransactiongaslimitfor](#skiptransactiongaslimitfor) * [allowlocalcheckpointsyncers](#allowlocalcheckpointsyncers) * [AWS\_ACCESS\_KEY\_ID](#aws_access_key_id) * [AWS\_SECRET\_ACCESS\_KEY](#aws_secret_access_key) --- # Running with Docker Compose | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) Running with Docker Compose =========================== Sometimes it is nice to not rely on long docker commands. Running with Docker compose is very similar to using raw Docker and you can find a full specification of the format in the [Docker docs](https://docs.Docker.com/compose/compose-file/) . This is an example `docker-compose` file for running a validator that should get you most of the way. { "chains": { "ethereum": { "customRpcUrls": "https://node1.com,https://node2.com,https://node3.com" } }, "originChainName": "ethereum", "validator": { "id": "alias/validator-signer-ethereum", "type": "aws", "region": "us-east-1" }, "checkpointSyncer": { "bucket": "signatures-ethereum", "region": "us-east-1", "type": "s3" }, "reorgPeriod": 1, "interval": 30, "metricsPort": "9090"} services: ethereum-validator: image: gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.1.0 command: ./validator ports: - "9090:9090/tcp" environment: CONFIG_FILES: /ethereum_validator.json AWS_ACCESS_KEY_ID: somesecretkey AWS_SECRET_ACCESS_KEY: somesecretkey configs: - ethereum_validator.jsonconfigs: ethereum_validator.json: file: ./ethereum_validator.json The above has a lot of filler values, you will of course need to update those with real ones. You can also specify multiple services, so if you are running several validators, you can specify each one under `services`. To run the compose configuration use `docker compose up` and `docker compose down` to clean up after. Full documentation on the command line can be found on the [docker website](https://docs.docker.com/engine/reference/commandline/compose/) . --- # Agent keys | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Agent keys ========== Hyperlane agents - Validators and the Relayer - must be configured with private keys in order to operate. Validators use private keys to sign [message checkpoints](/docs/reference/glossary#checkpoint) , and the Relayer uses private keys to sign transactions that deliver messages. Hyperlane agents currently support being configured with private keys in one of two ways. 1\. Hexadecimal keys[​](#1-hexadecimal-keys "Direct link to 1. Hexadecimal keys") ---------------------------------------------------------------------------------- A raw hexadecimal private key used for in-memory signing. This is the easiest and fastest setup. warning Hexadecimal keys are less secure than AWS KMS keys. ### Generate a hexadecimal key[​](#generate-a-hexadecimal-key "Direct link to Generate a hexadecimal key") Keep track of your address and private key for use with your agent. Do not lose or leak it. * Cast CLI * Using privatekeys.pw Using [Foundry's cast](https://book.getfoundry.sh/cast/) , you can create a new key pair: cast wallet new The output will look something like this: Successfully created new keypair.Address: 0x32e6d32E7b1C8691Ef4ad3841003371214a0eebCPrivate Key: 0x2958f0eb2ab71bbfb5ea1422835e20e488778b61e3c107f369572e2b53b578f9 You can visit [https://privatekeys.pw/keys/ethereum/random](https://privatekeys.pw/keys/ethereum/random) , which will automatically display a list of hexadecimal private keys and their addresses. warning Please note that because these are generated by a website, these private keys should be considered insecure and should not be used for anything other than testing purposes! 2\. AWS KMS[​](#2-aws-kms "Direct link to 2. AWS KMS") ------------------------------------------------------- A key generated by AWS and stored in a CloudHSM. This is the recommended setup for production agents. ### Create an IAM user[​](#create-an-iam-user "Direct link to Create an IAM user") This IAM user will be given permission to sign with the KMS key that you will later configure. Your Hyperlane agent will use this identity when signing transactions. 1. Go to AWS's Identity and Access Management (IAM) in the [AWS console](https://us-east-1.console.aws.amazon.com/iamv2/home) . 2. On the left, under "Access management", click "Users". 3. Click the orange button "Add users". 4. Pick a friendly and informative username, like `hyperlane-validator-${chain_name}` or `hyperlane-relayer-${chain_name}`. This username will be referenced in future steps, so if you choose a different username be sure to use your correct username in the future. 5. Click "Next", you do not need to assign the user any permissions. 6. Click "Create user". 7. Click into the user that you just created 8. Click the "Security Credentials" tab 9. Scroll down to "Access Keys" and click "Create Access Key" 10. Select "Application running outside AWS" and click "Next" 11. Click "Next", no need to add a description tag 12. Click "Create access key" 13. Copy the "Access key ID" and "Secret access key" to a safe place. These will be passed to your Hyperlane Relayer as environment variables. ### Create a KMS key[​](#create-a-kms-key "Direct link to Create a KMS key") This key will be used by your agent for signing. 1. Go to AWS's Key Management Service (KMS) in the AWS console. 2. Ensure you are in the region you want to create the key in. This can be confirmed by viewing the region at the top right of the console, or by finding the name in the URL's subdomain (e.g. `us-west-2.console.aws.amazon.com` means you're operating in the region `us-west-2`). 3. On the left, click "Customer managed keys". 4. Click "Create key". 5. Select the "Asymmetric" key type. 6. Select the "Sign and verify" key usage. 7. Select the `ECC_SECG_P256K1` key spec. 8. Click "Next". 9. Set the Alias to something friendly and informative, like `hyperlane-validator-signer-${chain_name}` or `hyperlane-relayer-signer-${chain_name}` 10. While not necessary, feel free to write a description and add any tags that you think will be useful. 11. Click "Next". 12. A key administrator is not required, but if you want, you can select one. 13. Click "Next". 14. Give usage permissions to the IAM user you created in section #1. 15. Click "Next". 16. In the Review page, scroll to the "Key policy". The generated key policy is acceptable, but you can make the access even less permissive if you wish by: 1. Removing the `kms:DescribeKey` and `kms:Verify` actions from the statement whose "Sid" is "Allow use of the key" 2. Removing the entire statement whose "Sid" is "Allow attachment of persistent resources". 17. Click "Finish" tip Advanced users may consider using the [IAM/KMS Terraform module](/docs/operate/deploy-with-terraform#iam--kms) instead to create the IAM user and KMS key. ### Query address[​](#query-address "Direct link to Query address") In some cases you may need to know the address associated with the KMS key you generated. * With \`cast\` * Using a script AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_KMS_KEY_ID=alias/your-key-alias cast wallet address --aws The script at the following repo will allow you to query this address: [https://github.com/tkporter/get-aws-kms-address](https://github.com/tkporter/get-aws-kms-address) * [1\. Hexadecimal keys](#1-hexadecimal-keys) * [Generate a hexadecimal key](#generate-a-hexadecimal-key) * [2\. AWS KMS](#2-aws-kms) * [Create an IAM user](#create-an-iam-user) * [Create a KMS key](#create-a-kms-key) * [Query address](#query-address) --- # Monitoring & Alerting | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Monitoring & Alerting ===================== Validators expose metrics on the port number specified by the argument `--metrics`. Port `9090` is the default, though any valid port can be chosen. We recommend using Prometheus to scrape these metrics and Grafana to visualize them, using [this dashboard JSON template](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/84e8c5c218ac5d211c766cf4d5a135aee10e508c/tools/grafana/validator-dashboard-template.json) , as seen below. The benefit of this dashboard is that it displays multiple validators at the same time. The screenshot shows metrics grouped by chain or by kubernetes pod. ![Validator Grafana Dashboard Template](/assets/images/dashboard-template-validator-e32a2eb79095c9c4758c03dcf85061a2.png) info If running as a Docker image, make sure to port-forward the metrics endpoint port. For instance, to forward port 9090 on the local port 80, add the following flag to your `docker run` command: `-p 9090:80` Metrics[​](#metrics "Direct link to Metrics") ---------------------------------------------- The dashboard template includes the following metrics. | Metric | Description | | --- | --- | | `hyperlane_latest_checkpoint` | The latest checkpoint observed by the validator | | `hyperlane_block_height` | The block height of the RPC node the agent is connected to. This metric is updated periodically independently from the checkpoint indexing functionality of validator. | | `hyperlane_contract_sync_liveness` | The timestamp which is reported on every iteration of the indexing loop of validator. | | `hyperlane_contract_sync_block_height` | The block height observed by validator as part of indexing loop. | | `hyperlane_cursor_current_block` | The block height observed by internal cursor of the validator. | | `hyperlane_span_events_total{agent="validator", event_level="error"}` | The total number of errors logged, visualized as 30 min increases ("Error log count diffs"). If the derivative of this metric exceeds 1 over the last hour, at least a low-severity alert is warranted. Note that the dashboard query groups metrics by kubernetes pod name, so you may need to adjust this query if you are not running in a kubernetes environment. | | `hyperlane_span_events_total{agent="validator", event_level="warn"}` | The total number of warnings logged, visualized as 30 min increases ("Warning log count diffs"). If the derivative of this metric exceeds 1 over the last hour, at least a low-severity alert is warranted. Note that the dashboard query groups metrics by kubernetes pod name, so you may need to adjust this query if you are not running in a kubernetes environment. | Charts[​](#charts "Direct link to Charts") ------------------------------------------- The dashboard template includes the following charts. | Chart | Description | | --- | --- | | `Signed Checkpoint Diffs (30m)` | The latest checkpoint observed by the validator, visualized as 30 min increases. If values not positive in spite of `Latest Block Diffs (30m)` stable, it could mean that either there are no new messages, or that the validator stopped signing checkpoints. | | `Diff observed - processed checkpoints` | The difference between checkpoints which validator observed on blockchain and the checkpoints which validator signed and published. This chart should be zero most of the time with occasional and short lived positive values. If it is positive for extended period of time, it means that validator has issues with signing and publishing checkpoints. | | `Latest Block Diffs (30m)` | The block height of the RPC node the agent is connected to, visualized as 30 min increases ("Latest block diffs"). If this metric is not increasing, the RPC may be unhealthy and need changing. | | `Contract Sync Liveness` | Renders metric `hyperlane_contract_sync_liveness` as it is. The graph should always go up. If it is constant, it indicates an issue. If chart contains metrics for several chains, they will be rendered on top of each other. It is normal when nothing is broken. Deviations will be visible if there is an issue which should be investigated. | | `Contract Sync Block Diffs (30m)` | Renders metric `hyperlane_contract_sync_block_height` as 30 min increases. It should approximately match the number of blocks produced by the chain during last 30 minutes. If the metric deviate significantly in any direction, becomes zero, it should be investigated. | | `Cursor Block Diffs (30m)` | Renders metric `hyperlane_cursor_current_block` as 30 min increases. It should approximately match the number of blocks produced by the chain during last 30 minutes. If the metric deviate significantly in any direction, becomes zero, it should be investigated. | | `Error log count diffs (30m)` | The total number of errors logged, visualized as 30 min increases ("Error log count diffs"). If the derivative of this metric exceeds 1 over the last hour, at least a low-severity alert is warranted. Note that the dashboard query groups metrics by kubernetes pod name, so you may need to adjust this query if you are not running in a kubernetes environment. | | `Warning log count diffs (30m)` | The total number of warnings logged, visualized as 30 min increases ("Warning log count diffs"). If the derivative of this metric exceeds 1 over the last hour, at least a low-severity alert is warranted. Note that the dashboard query groups metrics by kubernetes pod name, so you may need to adjust this query if you are not running in a kubernetes environment. | Alerts[​](#alerts "Direct link to Alerts") ------------------------------------------- All the metrics above can be combined to create alerts that minimize false positives. Some example critical alerts: * the `hyperlane_latest_checkpoint` stopped increasing, but the `hyperlane_block_height` is still increasing, and `error` and `warn` log counts have also been increasing, over the last 6 hours * `hyperlane_block_height` has not increased in the last 30 minutes If you get alerted, always check the logs for what the problem could be. * [Metrics](#metrics) * [Charts](#charts) * [Alerts](#alerts) --- # Run Validators | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Run Validators ============== tip * For an introduction on Validators in Hyperlane, you can check out the [Overview section](/docs/operate/overview-agents) . As you follow this guide, you can run a Hyperlane validator on any of the existing [chains](https://github.com/hyperlane-xyz/hyperlane-registry/tree/main/chains) the protocol is live on. Hyperlane Validators are run on a per-origin-chain basis, and these instructions are written for a single chain. Requirements[​](#requirements "Direct link to Requirements") ------------------------------------------------------------- * Secure Signing Key * Validators use this key to sign the `Mailbox`'s latest merkle root. Securing this key is important. If it is compromised, attackers can attempt to falsify messages, causing the Validator to be slashed. * The Hyperlane Validator agent currently supports signing with AWS KMS keys that are accessed via API keys/secrets as well as hexadecimal plaintext keys. See more under [agent keys](/docs/operate/set-up-agent-keys) . * Publicly Readable Storage * Validators write their signatures off-chain to publicly accessible, highly available, storage, so that they can be aggregated by the [Relayer](/docs/protocol/agents/relayer) . * The Hyperlane Validator agent currently supports storing signatures on AWS S3 using the same AWS API key above, as well as storing signatures in the local filesystem for testing. * The design is [open source](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/56be527d691a11a1ff2de4a390fd0dae8bb77347/typescript/infra/src/agents) and generalizable to other storage and key solutions. There is a community-submitted work-in-progress [PR for GCS](https://github.com/hyperlane-xyz/hyperlane-monorepo/pull/3156) . * Machine to Run On * Validators can compile the Rust binary themselves or run a Docker image provided by Abacus Works. The binary can be run using your favorite cloud service. You can even run multiple instances of them in different regions for high availability, as Hyperlane has no notion of "double signing" * Hardware requirements & costs are minimal - validators often start with a 2-Core / 2GB RAM / 4GB Storage setup with typical costs around $75/mo * RPC Node * Validators make simple view calls to read merkle roots from the [Mailbox](/docs/protocol/mailbox) contract on the chain they are validating for. You must use your own RPC urls not any public ones. caution Operating a Validator for Polygon mainnet requires access to an archive node. This is because Validators should only sign roots once they've been finalized, and Polygon requires 256 block confirmations to achieve finality. Guide[​](#guide "Direct link to Guide") ---------------------------------------- As a recap - before running a production Validator you need to have: 1. Created a key for your Validator to sign with, see the [Agent Keys](/docs/operate/set-up-agent-keys) documentation. 2. Set up the destination for your Validator signatures to be posted, see the [AWS Signatures Bucket Setup](/docs/operate/validators/validator-signatures-aws) guide. Configuration[​](#configuration "Direct link to Configuration") ---------------------------------------------------------------- tip Experienced operators may prefer to [deploy agents with Terraform](/docs/operate/deploy-with-terraform) or a community-submitted [Ansible playbook](https://github.com/polkachu/hyperlane) instead. This process will automatically create agent keys, Validator buckets, permissions and any other auxiliary setup required to run a Validator cluster on AWS. Like the local setup, there are a few base arguments you should provide when configuring your Validator. | Parameter | Description | | --- | --- | | `--db` | Path for writing persistent data to disk. | | `--originChainName` | Name of the chain being validated. For example: `ethereum`. | | `--chains.[originChainName].customRpcUrls` | Override the default RPC URLs used by the Validator for your origin chain. | | `--chains.[originChainName].blocks.reorgPeriod` | Number of block confirmations the Validator needs to wait for before signing the `Mailbox` merkle root. | info Your Validator takes both command line arguments and environment variables as configuration. Take a look at the [agent configuration](/docs/operate/agent-config) page and the [configuration reference](/docs/operate/config-reference) for a full list of configuration possibilities. Of course, you can also provide the path to additional configuration files as a comma separated list with the [`CONFIG_FILES` environment variable](/docs/operate/config-reference#config_files) . If you choose to run in Docker, see the docker section of [agent configuration](/docs/operate/agent-config) for tips on mounting your config files into your Docker container. ### Setup-specific configuration[​](#setup-specific-configuration "Direct link to Setup-specific configuration") These configurations requirements differ depending on which environment you are setting up. **Checkpoint signer configuration** * Hex Key * AWS KMS | Argument | Description | | --- | --- | | `--validator.key` | Your Validator's private key, which is used to sign merkle roots. | | `--chains.${localChainName}.signer.key` | Your Validator's private key, which will be used to submit a transaction onchain that publicly announces your Validator's checkpoint syncer. | | Argument | Description | | --- | --- | | `--validator.region` | The region of your AWS KMS key. For example: `us-east-1`. | | `--validator.type` | Set to the `aws` literal. | | `--validator.id` | The alias of your Validator's AWS KMS key, prefixed with `alias/`. For example: `alias/hyperlane-validator-signer-${originChainName}`. | **Transaction signer configuration** The key configured in this step needs a small amount of funds to send the initial announcement transaction. * Hex Key (EVM) * AWS KMS (EVM) * Hex Key (Cosmos) This is the same as the local configuration for the checkpoint signer. | Argument | Description | | --- | --- | | `--chains.${localChainName}.signer.key` | Your Validator's private key, which will be used to submit a transaction onchain that publicly announces your Validator's checkpoint syncer. | | Argument | Description | | --- | --- | | `--chains.${originChainName}.signer.type` | Set to the `aws` literal. | | `--chains.${originChainName}.signer.region` | The region of your AWS KMS key. For example: `us-east-1`. | | `--chains.${originChainName}.signer.id` | The alias of your Validator's AWS KMS key, prefixed with `alias/`. For example: `alias/hyperlane-validator-signer-${originChainName}`. | | Argument | Description | | --- | --- | | `--chains.${originChainName}.signer.type` | Set to the `cosmosKey` literal. | | `--chains.${originChainName}.signer.prefix` | Set to the prefix literal associated with the chain's address format. Example: `osmo`. | | `--chains.${originChainName}.key` | Your Validator's hex private key, which will be used to submit a transaction onchain that publicly announces your Validator's checkpoint syncer. | **Checkpoint syncer configuration** * Local Setup * Production Setup (AWS) | Argument | Description | | --- | --- | | `--checkpointSyncer.type` | Set to `localStorage`. | | `--checkpointSyncer.path` | The path to your local directory where Validator signatures will be written. This should be the value of `$MY_VALIDATOR_SIGNATURES_DIRECTORY` from the local setup. For example: `--checkpointSyncer.path='/tmp/hyperlane-validator-signatures-ethereum'`. | warning Note that the Relayer **must** be configured with `--allowLocalCheckpointSyncers` to be able to read signatures from this Validator. | Argument | Description | | --- | --- | | `--checkpointSyncer.type` | Set to `s3`. | | `--checkpointSyncer.bucket` | The AWS S3 bucket name. | | `--checkpointSyncer.region` | The region of your AWS S3 bucket. For example: `us-east-1`. | | `--checkpointSyncer.folder` | A folder name to use for this validator, can be the name of the chain | Start Validating[​](#start-validating "Direct link to Start Validating") ------------------------------------------------------------------------- ### Setup[​](#setup "Direct link to Setup") The recommended installation method for a production environment is using a Docker image. * Docker image * Building from source First download the docker image: docker pull --platform linux/amd64 gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.1.0 **Clone and setup** First, clone the Hyperlane monorepo: git clone git@github.com:hyperlane-xyz/hyperlane-monorepo.git Then follow the [setup instructions](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/README.md) in the `rust` directory. This should setup `rustup` as well as Rosetta 2 if you are on Apple Silicon. # install rustupcurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh# (apple silicon only) install rosetta 2softwareupdate --install-rosetta --agree-to-license Build the Validator: cargo build --release bin validator ### Running the binary[​](#running-the-binary "Direct link to Running the binary") For production Validators that write their signatures to an S3 bucket and have their keys configured with AWS KMS, you will have to provide the AWS access key and secret as environment variables. | Environment variable | Description | | --- | --- | | `AWS_ACCESS_KEY_ID` | The access key ID of your Validator's AWS IAM user. | | `AWS_SECRET_ACCESS_KEY` | The secret access key of your Validator's AWS IAM user. | For a refresher, check out the [Agent Keys](/docs/operate/set-up-agent-keys) guide. * Using Docker * Building from source Then start the container with the relevant arguments. For example, your configuration for AWS: docker run \ -it \ -e AWS_ACCESS_KEY_ID=ABCDEFGHIJKLMNOP \ -e AWS_SECRET_ACCESS_KEY=xX-haha-nice-try-Xx \ --mount ... \ gcr.io/abacus-labs-dev/hyperlane-agent:agents-v1.1.0 \ ./validator \ --db /hyperlane_db \ --originChainName \ --reorgPeriod 1 \ --validator.region us-east-1 \ --checkpointSyncer.region us-east-1 \ --validator.type aws \ --chains..signer.type aws \ --validator.id alias/hyperlane-validator-signer- \ --chains..signer.id alias/hyperlane-validator-signer- \ --checkpointSyncer.type s3 \ --checkpointSyncer.bucket hyperlane-validator-signatures- \ --checkpointSyncer.folder \ See these instructions for building from source without Docker. We can run the built binary from within the `hyperlane-monorepo/rust` directory: # set AWS environment variablesexport AWS_ACCESS_KEY_ID=ABCDEFGHIJKLMNOPexport AWS_SECRET_ACCESS_KEY=xX-haha-nice-try-Xx# run the Validator./target/release/validator \ --db /hyperlane_db \ --originChainName \ --reorgPeriod 1 \ --validator.region us-east-1 \ --checkpointSyncer.region us-east-1 \ --validator.type aws \ --chains..signer.type aws \ --chains..signer.region \ --validator.id alias/hyperlane-validator-signer- \ --chains..signer.id alias/hyperlane-validator-signer- \ --checkpointSyncer.type s3 \ --checkpointSyncer.bucket hyperlane-validator-signatures- ### Announcing your Validator[​](#announcing-your-validator "Direct link to Announcing your Validator") The [Relayer](/docs/operate/relayer/run-relayer) needs to know where to find your Validator's signatures. Your Validator will automatically attempt to announce itself by writing to the `ValidatorAnnounce` contract on the chain that you're validating. To do this, your Validator must have a small amount of tokens to pay for the gas for this transaction. If your Validator has not yet announced itself, and does not have enough tokens to pay for gas, it will log a message specifying how many tokens are needed. ### Success![​](#success "Direct link to Success!") The Validator will index the origin Mailbox contract for messages. If a message has been sent, you should see log messages that the Validator has signed them. If everything is configured correctly, you should see json files being written to your S3 bucket (if you followed the AWS setup) or to your local signatures directory if you followed the local setup. New json files get written every time a new outbound message is inserted into the mailbox. ### Next: Running multiple Validators[​](#next-running-multiple-validators "Direct link to Next: Running multiple Validators") We encourage folks to validate on as many chains as they are interested in supporting. Some tips for easily running multiple validators: 1. The same key can be used by multiple validators. 2. The same AWS account can be used by multiple validators. 3. The same checkpoint syncer S3 bucket can by used by multiple validators, however they **must** use different folders, e.g. using the `--checkpointSyncer.folder` flag. Design reference[​](#design-reference "Direct link to Design reference") ------------------------------------------------------------------------- * [Requirements](#requirements) * [Guide](#guide) * [Configuration](#configuration) * [Setup-specific configuration](#setup-specific-configuration) * [Start Validating](#start-validating) * [Setup](#setup) * [Running the binary](#running-the-binary) * [Announcing your Validator](#announcing-your-validator) * [Success!](#success) * [Next: Running multiple Validators](#next-running-multiple-validators) * [Design reference](#design-reference) --- # AWS Signatures Bucket Setup | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page AWS Signatures Bucket Setup =========================== Configure your signing key and S3 bucket info These instructions are for a production environment where Validator keys exist in AWS's Key Management Service and Validator signatures are posted publicly in an S3 bucket. If you're only intending to run a Validator for testing or development purposes, consider following the [local setup guide](/docs/guides/deploy-hyperlane-local-agents) instead. ### 1\. Create an AWS IAM user, and a signing key[​](#1-create-an-aws-iam-user-and-a-signing-key "Direct link to 1. Create an AWS IAM user, and a signing key") Follow the instructions in [Agent Keys](/docs/operate/set-up-agent-keys) to generate an AWS IAM user and either a KMS or a hexadecimal key. You will use this key's credentials in the following steps. ### 2\. Create an S3 bucket[​](#2-create-an-s3-bucket "Direct link to 2. Create an S3 bucket") info Note that Step 1 (creating the IAM user) is required for setting up the S3 bucket, so is required regardless of the type of key used. Your Validator will post their signatures to this bucket. 1. Go to AWS's S3 in the AWS console. 2. On the right, click the orange "Create Bucket" button 3. Pick an informative bucket name, such as `hyperlane-validator-signatures-${validator_name}-${chain_name}` 4. Consider choosing the same region as the KMS key you created in the previous step. 5. Keep the recommended "ACLs disabled" setting for object ownership. 6. Configure public access settings so that the relayer can read your signatures 1. Uncheck "Block all public access" 2. Check the first two options that block access via access control lists 3. Leave the last two options unchecked, we will be granting public read access via a bucket policy 4. Acknowledge that these settings may result in public access to your bucket 7. The remaining default settings are fine, click the orange "Create bucket" button on the bottom ### 3\. Configure S3 bucket permissions[​](#3-configure-s3-bucket-permissions "Direct link to 3. Configure S3 bucket permissions") Your Validator IAM user will need write permissions, and it should be publicly readable by the Relayer. 1. Navigate back to "Identity and Access Management (IAM)" in the AWS console 2. Under "IAM resources" you should see at least one "User", click into that 3. Click on the name of the user that you provisioned earlier (e.g. `hyperlane-validator-${chain_name}`) 4. Copy the "User ARN" to your clipboard, it should look something like `arn:aws:iam::791444913613:user/hyperlane-validator-${chain_name}` 5. Navigate back to "S3" in the AWS console 6. Click on the name of the bucket you just created 7. Just under the name of the bucket, click "Permissions" 8. Scroll down to "Bucket policy" and click "Edit" 9. Enter the following contents. The Bucket ARN is shown just above where you enter the policy { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": ["s3:GetObject", "s3:ListBucket"], "Resource": ["${BUCKET_ARN}", "${BUCKET_ARN}/*"] }, { "Effect": "Allow", "Principal": { "AWS": "${USER_ARN}" }, "Action": ["s3:DeleteObject", "s3:PutObject"], "Resource": "${BUCKET_ARN}/*" } ]} tip Advanced users may consider using the [S3 Terraform module](/docs/operate/deploy-with-terraform#iam--kms) instead to create the S3 bucket with the correct permissions. * [1\. Create an AWS IAM user, and a signing key](#1-create-an-aws-iam-user-and-a-signing-key) * [2\. Create an S3 bucket](#2-create-an-s3-bucket) * [3\. Configure S3 bucket permissions](#3-configure-s3-bucket-permissions) --- # ts-sdk-placeholder | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) For developers looking to further customize the Warp UI for their own projects or build their own interchain applications, we encourage you to explore the [Typescript SDK](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/typescript/sdk) . The SDK contains a growing set of an utilities and abstractions for interacting with Hyperlane across different protocols (EVM, Cosmos, Solana). --- # How to Go to Production with your Hyperlane Deployment | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page How to Go to Production with your Hyperlane Deployment ====================================================== To launch your Hyperlane deployment into a production environment, follow these steps to set up your chain’s core deployment and configure warp route deployments. ### 1\. Core Deployment[​](#1-core-deployment "Direct link to 1. Core Deployment") To being you'll need to set up and productionize the core components of your Hyperlane deployment. * [Update Mailbox Default ISM](/docs/guides/update-mailbox-default-ism) : Update the Interchain Security Module (ISM) associated with the Mailbox contract. The ISM acts as a critical security layer, verifying messages between chains. Ensure that the default ISM settings align with your security requirements. * [Transfer Mailbox Ownership](/docs/guides/transfer-mailbox-ownership) : Transfer ownership of the Mailbox contract to a production-ready owner account. This step secures the Mailbox by ensuring only trusted parties have control over its configuration. ### 2\. Warp Route Deployment[​](#2-warp-route-deployment "Direct link to 2. Warp Route Deployment") * [Remove Trusted Relayer](/docs/guides/remove-trusted-relayer) : Remove any test or development relayers that may have been configured initially. In production, ensure that only trusted, secure relayers are used to prevent unauthorized message relaying. * [Transfer Warp Route Ownership](/docs/guides/transfer-warp-route-ownership) : Transfer ownership of the Warp Route to the designated production owner. This step ensures that only trusted parties have control over critical Warp Route settings, such as ISM configurations, Validator options, and relayer settings. * [1\. Core Deployment](#1-core-deployment) * [2\. Warp Route Deployment](#2-warp-route-deployment) --- # Agents | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) Agents ====== The Hyperlane protocol decouples the transport layer from the security layer of cross-chain message passing. To run a deployment, it relies on offchain agents that observe onchain activity and carry out either the transport or security aspects of the protocol. These agents are implemented in Rust and distributed as Docker images and binaries. 1. [Relayers](/docs/protocol/agents/relayer) fulfill the message transport requirement of the protocol. They aggregate off-chain security metadata for the [`IInterchainSecurityModule` interface](/docs/reference/ISM/specify-your-ISM) and deliver messages to their recipients. 2. [Validators](/docs/protocol/agents/validators) fulfill the security requirement of the protocol, as part of the [Multisig ISM](/docs/protocol/ISM/multisig-ISM) or the [Hyperlane AVS](/docs/protocol/economic-security/hyperlane-avs) , by attesting to the validity of [Mailbox](/docs/protocol/mailbox) messages and making their signatures available to a relayer. --- # Relayer | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Relayer ======= Overview[​](#overview "Direct link to Overview") ------------------------------------------------- ### Core Function[​](#core-function "Direct link to Core Function") The relayer runs the transport layer of the Hyperlane protocol by delivering messages from origin to destination chains. Depending on the [Interchain Security Module (ISM)](/docs/reference/ISM/specify-your-ISM) specified by the recipient, metadata may be required to prove the security of the message, such as Validator signatures for the [Multisig ISM](/docs/protocol/ISM/multisig-ISM) , merkle proofs, zero-knowledge proofs, and more. So before attempting to deliver, the relayer gathers any ISM-specific metadata. tip The relayer will periodically retry metadata gathering and message submission. This is important to improve resilience against disruptions, such as: no gas payment made to pay for delivery, insufficient relayer balance, temporary spikes in transaction fees on the destination, Validator downtime. ### Relayer Incentives[​](#relayer-incentives "Direct link to Relayer Incentives") Message senders are charged for delivery on the origin chain, and it is the relayer operator's responsibility to rebalance revenue to destination chain accounts so delivery transaction fees can always be paid for. The relayer does not receive direct token incentives from the protocol, but operators can configure their fee structure for providing their critical service. For more information, check out [Interchain Gas Payments (IGPs)](/docs/protocol/interchain-gas-payment) . ### Operating a Relayer[​](#operating-a-relayer "Direct link to Operating a Relayer") Relayers can easily configure the messages that they wish to process. Currently, the relayer will support: 1. A sender / recipient whitelist. 2. A sender / recipient blacklist. 3. The ability to accept [payments on the origin chain](/docs/reference/messaging/send#quote-dispatch) for processing a message on the destination chain. While permissionless to run, it's up to the message sender to pick which relayer to pay for delivery. [Mailbox](/docs/protocol/mailbox) integrations usually default to always paying the same relayer, but message senders can opt out of this. For convenience, Hyperlane will run an open source and configurable relayer agent, implemented as a Rust binary. If you'd like to run your own relayer, we've open sourced the [binary here](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/rust/main/agents/relayer) . Running your own relayer involves deploying an [IGP contract](/docs/protocol/interchain-gas-payment) and maintaining token exchange rates and gas prices inside of it to accurately charge message delivery fees. info Want to run a relayer? Follow the [Relayer](/docs/operate/relayer/run-relayer) guide. In more detail[​](#in-more-detail "Direct link to In more detail") ------------------------------------------------------------------- The relayer is comprised of two main tasks: an Indexer for each origin, and a Submitter for each destination. ![High-level Relayer Architecture](/assets/images/relayer-architecture-high-level-593774113bc38fb186389fbbc55758bc.png) ### The Indexer[​](#the-indexer "Direct link to The Indexer") Both new and historic messages are indexed by querying [Mailbox](/docs/protocol/mailbox) contract events using RPCs. [Gas payments](/docs/protocol/interchain-gas-payment) are also indexed to confirm senders paid for delivery, and certain ISMs use additional origin chain data. This is the case with the Multisig ISM, which relies on the Merkle Tree Hook contract to inform the Relayer about which Validator signature corresponds to which message. There is a standalone indexing task spawned for every event type (Messages, IGP, Merkle Tree insertion). The indexer writes to a local database (RocksDB) as a means of caching, as well as communicating with the Submitter task - the latter periodically polls the database to check if new messages were dispatched. The relayer prioritizes new messages over old ones, under the assumption that old ones are more likely to have been delivered. This means that when (re)started, two pointers are created: a forward one and a backward one, both initialized to the blockchain tip and using the monotonically increasing `nonce` field of messages to iterate. A similar approach is used to index the other events, but some lack a sequence number and can be missed if incorrect RPC responses are received - which happens very often. As such, the message indexing task sends transaction IDs where it found events to the other indexing tasks, guaranteeing no Hyperlane event is missed as long as it occurred within the same transaction as the `Mailbox.dispatch()` call. ### The Submitter[​](#the-submitter "Direct link to The Submitter") Messages go through four stages as part of the Submitter, which are spawned as independent tasks described below. | Submitter Task | Description | | --- | --- | | Message Processor | Polls the local database to check if there are any undelivered messages and pushes them to the Prepare step's queue. | | Prepare Task | Pops messages from its queue, ensures gas was paid, fetches any metadata and simulates the message delivery transaction. If the simulation succeeds, the message is pushed to the Submit step's queue. Otherwise, the message is pushed back to the Prepare queue. | | Submit Task | Pops messages from its queue, and sends the delivery transaction onchain. Deliveries are batched whenever possible. If there is no error broadcasting the transaction, the message is pushed to the Confirm step's queue. Otherwise, the message is pushed back to the Prepare queue. | | Confirm Task | Awaits finality; if a chain reorg occurs, or the delivery transaction reverts, the message is pushed back to the Prepare queue. | Messages are delivered to their recipient by calling `Mailbox.process()` on the destination chain with the aforementioned metadata. The retry count of a message determines its next delivery attempt according to an exponential backoff strategy. Currently, there is no fixed maximum number of retries after which the relayer will cease to attempt processing a message. However, this is not a guarantee of indefinite retries, and operators should not rely on this as a service level agreement (SLA). * [Overview](#overview) * [Core Function](#core-function) * [Relayer Incentives](#relayer-incentives) * [Operating a Relayer](#operating-a-relayer) * [In more detail](#in-more-detail) * [The Indexer](#the-indexer) * [The Submitter](#the-submitter) --- # Validators | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Validators ========== Overview[​](#overview "Direct link to Overview") ------------------------------------------------- Validators run as part of the [Multisig ISM](/docs/protocol/ISM/multisig-ISM) or the [Economic Security Module](/docs/protocol/economic-security/) , fulfilling the security layer of the Hyperlane protocol. If using a different ISM, validators are not required. They are responsible for attesting to messages by signing a merkle root (also referred to as a checkpoint) when new dispatches happen in the [Mailbox](/docs/protocol/mailbox) . Signatures must be made available for anyone (typically the Relayer) to fetch and submit alongside the message to the destination chain. Unlike many other protocols, Hyperlane does **not** have an enshrined validator set. Anyone is free to run their own validator, as long as the receiver contract specifies a [Multisig ISM](/docs/protocol/ISM/multisig-ISM) that includes their validator. Validator checkpoints are public. This ensures the transport layer is permissionless, since anyone can fetch the signatures and call `Mailbox.process()` to deliver the message. The Relayer merely provides a convenience service for message senders. It's important that the Validator only signs finalized checkpoints to avoid compromising the safety of the protocol. Signing messages that get reorged out leads to slashing in the economic security module. The Validator agent connects to a single chain to check for new messages. If validating multiple chains, multiple instances of this agent must be run. Hyperlane is developing the validator as a binary implemented in Rust that can be easily run by anyone. Operationally, validators need to run this binary and have access to an RPC provider or node for the chain that they are validating for. We hope that the majority of Hyperlane validators will come from each chain's existing node operator community. info Want to run a validator? Follow the [validators guide](/docs/operate/validators/run-validators) . In more detail[​](#in-more-detail "Direct link to In more detail") ------------------------------------------------------------------- The Validator agent uses two key types: one for signing transactions on the blockchain it is validating, and another for signing checkpoints on the Ethereum-compatible ECDSA curve. Since checkpoints are public, when a Validator first starts operating it must announce its checkpoint location via an onchain `announce` transaction. This is the only transaction ever submitted by the Validator agent; the blockchain-specific key is otherwise not used at all. There is also the option of manually announcing a new Validator to avoid configuring the blockchain-specific key. Validators can be announced by anyone. For messages using a [Multisig ISM](/docs/reference/ISM/multisig-ISM-interface) , validators read the current merkle root by calling `MerkleTreeHook.latestCheckpoint()`. Validators use the \`MerkleTreeHook.latestCheckpoint() function to determine when new transactions need to be indexed. This polling mechanism ensures validators can start signing new messages without the need to backfill the entire tree. ### Multisig ISM Prerequisites[​](#multisig-ism-prerequisites "Direct link to Multisig ISM Prerequisites") To validate messages from an origin chain, the Validator's checkpoint signing key must be registered in the [Multisig ISM](/docs/reference/ISM/multisig-ISM-interface) specified by the destination chain recipient. This can only be done when the ISM contract is deployed, but this is easily done by sending a `deploy(validatorAddresses, threshold)` transaction on any implementation of [StaticThresholdAddressSetFactory](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/be4617b18ba638e0ef5a5326614bc4f8c58d25f9/solidity/contracts/libs/StaticAddressSetFactory.sol#L10) . ### AVS Operator Prerequisites[​](#avs-operator-prerequisites "Direct link to AVS Operator Prerequisites") To run a Validator for the EigenLayer AVS and provide [economic security](/docs/protocol/economic-security/) , the Validator must register as an AVS operator. See more details in the [AVS Operator Guide](/docs/guides/avs-operator-guide) . Architecture[​](#architecture "Direct link to Architecture") ------------------------------------------------------------- The validator is comprised of two main tasks: an Indexer for the origin chain, and a Checkpoint Submitter to publish signed merkle roots. ### The Indexer[​](#the-indexer "Direct link to The Indexer") The only event type indexed by the Validator is `InsertedIntoTree` from the Merkle Tree Hook [contract](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/be4617b18ba638e0ef5a5326614bc4f8c58d25f9/solidity/contracts/hooks/MerkleTreeHook.sol#L32) that the [Mailbox](/docs/protocol/mailbox) calls whenever a new message is dispatched. This happens over RPC, and the agent builds an in-memory merkle tree based on the merkle insertion events, which are also cached to a local RocksDB database for fast startup. Whenever a new message is dispatched, the Checkpoint Submitter generates a checkpoint from the in-memory tree and adds it to a queue for processing. ### The Checkpoint Submitter[​](#the-checkpoint-submitter "Direct link to The Checkpoint Submitter") The checkpoint submitter uses the ECDSA key to sign checkpoints and publish them to highly-available storage. The schema of a checkpoint is pub struct Checkpoint { /// The merkle tree hook address pub merkle_tree_hook_address: H256, /// The mailbox / merkle tree hook domain pub mailbox_domain: u32, /// The checkpointed root pub root: H256, /// The index of the checkpoint pub index: u32,} The only checkpoint storage that is currently supported by the agent implementation is AWS S3. Google Cloud Storage is integrated with but has an [open issue](https://github.com/hyperlane-xyz/hyperlane-monorepo/issues/4069) . The Azure Blob Storage contribution is still [in progress](https://github.com/eigerco/hyperlane-monorepo/pull/2) . ### Liveness implications[​](#liveness-implications "Direct link to Liveness implications") Depending on the threshold configured in the Multisig ISM, Validator downtime can halt liveness of the protocol. The submitter prioritizes new checkpoints over old ones, so that the Relayer can fetch metadata for newer messages first, which are more likely to not have been delivered yet. ### Default ISM Validators[​](#default-ism-validators "Direct link to Default ISM Validators") The number of validators depend on the Interchain Security Module (ISM) configuration. The Default ISM uses a specific validator set, you can view the Validator details such as threshold, operator and addresses [here](/docs/reference/default-ism-validators) . * [Overview](#overview) * [In more detail](#in-more-detail) * [Multisig ISM Prerequisites](#multisig-ism-prerequisites) * [AVS Operator Prerequisites](#avs-operator-prerequisites) * [Architecture](#architecture) * [The Indexer](#the-indexer) * [The Checkpoint Submitter](#the-checkpoint-submitter) * [Liveness implications](#liveness-implications) * [Default ISM Validators](#default-ism-validators) --- # Watchtowers | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) Watchtowers =========== warning `Watchtowers` are coming soon and are not yet implemented. This page is shown for informational purposes only. Details may change as the design matures. [Validators](/docs/protocol/agents/validators) are responsible for signing attestations of [Mailbox](/docs/protocol/mailbox) state on the origin chain. These attestations can be consumed by [Interchain Security Modules](/docs/reference/ISM/specify-your-ISM) to prove the validity of interchain messages on the destination chain. But who watches them? Who makes sure they perform their role dutifully, without fault? The Watchtowers! Watchtowers are responsible for observing a [Mailbox](/docs/protocol/mailbox) and validator signatures to detect if validators are attempting to censor or falsify messages. They are a permissionless agent by which the network protects against fraud. If fraud is detected, the watchtower submits evidence to the origin chain, slashing the validator. Watchtowers earn a reward for successfully submitting evidence of fraud. The presence of one or more watchtowers acts to deter misbehavior by validators. For convenience, Hyperlane will run an open source and configurable watchtower agent, implemented as a rust binary. Watchtowers will remain an open source and permissionless role. Applications could run watchtowers, but so could validators, relayers, and any other stakeholder in the Hyperlane ecosystem. --- # Economic Security | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Economic Security ================= info Hyperlane is committed to making fraud costly. Staking and slashing are coming soon and are not yet implemented. This page is shown for informational purposes only. Details may change as the design matures. Staking and slashing allow economic security to be added to ISMs that rely on validator signatures, including [Multisig ISM](/docs/protocol/ISM/multisig-ISM) and Optimistic ISM. Hyperlane validators can optionally participate in Hyperlane's staking protocol. Later, if these validators attempt to falsify or censor interchain messages, their stake, and any stake delegated to them, can be slashed. [Interchain Security Modules](/docs/protocol/ISM/modular-security) that depend on signatures from these validators benefit from the additional economic security provided by staking and slashing. ### Verifiable fraud proofs[​](#verifiable-fraud-proofs "Direct link to Verifiable fraud proofs") Unlike many other interchain communication protocols, Hyperlane's slashing protocol uses **verifiable fraud proofs**. This means that the Hyperlane protocol is able to verify whether or not a validator signed a fraudulent checkpoint without any participation from trusted parties. This is possible because the stake put up by validators lives on the **same chain** as the state (i.e. the Mailbox merkle root) that they're attesting to. The slashing smart contract can compare the validator signature with the latest root, and do some complicated merkle tree manipulation to confirm whether or not the checkpoint signed by the validator was fraudulent. In many other interchain communication protocols, it is common for a validator's stake to live on a **different chain** than the chain from which an interchain message originated. What this means is that in order for a fraudulent validator to have their stake slashed, the same message passing protocol must relay a message to the chain where the stake lives. You can see the problem with this right? The same validator set where fraud occurred is the mechanism by which evidence of that fraud is delivered, what could go wrong? Hyperlane doesn't want to allow for that possibility, thus in Hyperlane validators must keep their bonded stake on the origin chain for which they are validating. This means fraud proofs are trustlessly verifiable. The record of fraud that is examined for slashing exists in the same environment as the stake to be slashed, leaving no room for error with the process of fraud proofs. * [Verifiable fraud proofs](#verifiable-fraud-proofs) --- # Hyperlane AVS | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Hyperlane AVS ============= ### Overview[​](#overview "Direct link to Overview") Welcome to the Hyperlane AVS documentation. This guide will help you understand the Hyperlane's AVS (Actively Validated Service) module built atop EigenLayer, the Ethereum restaking protocol. Hyperlane currently employs a Proof of Authority model for security, in which a trusted group of validators is chosen to maintain [security](/docs/protocol/ISM/multisig-ISM) . However, if any validator signs erroneously or with malicious intent, there are no repercussions, as these validators have no economic stake. This is the gap that the AVS module is designed to address. The AVS module uniquely enables [economic security](/docs/protocol/economic-security/) within the Hyperlane protocol with minimum cost to bootstrap a new validator network for each chain it supports. This is achieved by leveraging the shared pool of stake that can secure outbound messages from and between rollups. The main stakeholders in this process are: * **Operators** - EigenLayer operators who opt into the Hyperlane AVS service and start validating outbound messages from the chain(s) specified * **Stakers** - EigenLayer stakers who delegate their stake to the operators to secure the network * **Applications** - Applications leveraging Hyperlane seeking to economically secure their messages across chains caution Slashing and reward payments are not enabled yet for EigenLayer. In addition to the AVS, signatures & validation must be set up in an [Interchain Security Module (ISM)](/docs/protocol/ISM/modular-security) . ### Architecture[​](#architecture "Direct link to Architecture") The above class diagram describes the architecture of the current AVS module contracts. Crucially, it describes the _"metaAVS"_ design pattern which we support with the `IRemoteChallenger` interface. ### `IRemoteChallenger`[​](#iremotechallenger "Direct link to iremotechallenger") Operators on Hyperlane have the flexibility to operate on their chosen chain(s), making the AVS module adaptable to any chain or challenger. However, this flexibility may result in the absence of a universally accepted 'canonical' source of truth for slashing on the Mainnet. This is due to the fact that fraud can only be proven on the origin chain, and so there needs to be a way to transmit that information to the chain on which the stake lives. Embracing the ethos of permissionless interoperability, we believe that application developers should have the ability to define their own source of truth and establish guarantees for their application's economic security. This includes the ability to program challenge conditions and slashing windows. To enable this level of customization, we have introduced the `IRemoteChallenger` interface. The `handleChallenge` function will only be invoked if `ism.verify()` successfully executes on the L1 originating from the chain where the fraudulent signature was detected. As mentioned above, it's critical to set up robust security measures for this underlying ISM. interface IRemoteChallenger { /// @notice Returns the number of blocks that must be mined before a challenge can be handled /// @return The number of blocks that must be mined before a challenge can be handled function challengeDelayBlocks() external view returns (uint256); /// @notice Handles a challenge for an operator /// @param operator The address of the operator function handleChallenge(address operator) external;} This configuration should be immutable and accessible for any AVS operator to view and opt into. The `handleChallenge` function explicitly encodes how you expect the challenge from the source chain (say Arbitrum) is delivered to Ethereum Mainnet where the AVS contracts and the `IRemoteChallenger` live. For Arbitrum, it can be the rollup's native bridge and for another L1, it can be a committee-based solution. Our interface is challenger implementation agnostic to allow for flexibility in this design area. This allows for us to reuse the existing hook-ISMs setup by calling `handleChallenge()` once `ism.verify()` is successful on the L1. A reasonable `challengeDelayBlocks` would be slightly longer than a week in the case of using a rollup's native bridge. As an operator, you are expected to review the different `IRemoteChallenger` contracts and assess their risk and rewards. If interested, you can enroll into one or multiple challengers directly from the `HyperlaneServiceManager` contract. note The IRemoteChallenger implementations are not yet live in production. ### Workflow for registering[​](#workflow-for-registering "Direct link to Workflow for registering") Prerequisite: operator has to be registered as an EigenLayer Operator (through their CLI) Operators need to enroll into specific challengers to allow for economic security with permissionless slashing. As an operator, you can inspect every remote challenger and choose for yourself which ones you want to opt into depending on risk. This also means there is no centralized permissioning or whitelisting that would be the bottleneck for adding challengers for different rollup stacks. The operators will be able to unenroll after the unenrollment delay blocks has passed. ### Workflow for deregistering[​](#workflow-for-deregistering "Direct link to Workflow for deregistering") Operators can only deregister themselves after unenrolling from all challengers they are enrolled in, each of which can have its own delay period. This is to ensure that the operator is not able to withdraw their stake before the challenge period has passed for any of the challengers. ### Workflow for staking[​](#workflow-for-staking "Direct link to Workflow for staking") In EigenLayer's design, staker funds are safeguarded as they are not made accessible to the AVS until slashing is activated. This ensures that no funds are at risk prematurely. Additionally, this design does not allow users to selectively opt into the Hyperlane AVS alone, as staking is managed through the StrategyManager and directed towards a specific operator. ### Workflow for slashing[​](#workflow-for-slashing "Direct link to Workflow for slashing") The slashing mechanism is designed to be permissionless and flexible. The `IRemoteChallenger` interface allows for different implementations of the slashing mechanism. As an example, the `postChallenge` function is called by the native challenger on the origin chain, which then calls the `handleChallenge` function on the `HyperlaneServiceManager` contract. The `HyperlaneServiceManager` contract then checks if the operator is enrolled in the challenger and calls the `freezeOperator` function on the `Slasher` contract to freeze the operator's stake. note Both the challenger and slasher contracts are not yet live in production. This sequence diagram may change based on the final implementation. ### Contract deployment[​](#contract-deployment "Direct link to Contract deployment") * Ethereum * Holesky | Name | Proxy | Implementation | | --- | --- | --- | | [`ECDSAStakeRegistry`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/f0df1a4cd1a9a6ec2e01b106941a2d4e42e5ba18/solidity/contracts/avs/ECDSAStakeRegistry.sol) | [`0x272CF0BB70D3B4f79414E0823B426d2EaFd48910`](https://etherscan.io/address/0x272CF0BB70D3B4f79414E0823B426d2EaFd48910) | [`0xa11b1a385287b5167ecca6a38f63abeab981d589`](https://etherscan.io/address/0xa11b1a385287b5167ecca6a38f63abeab981d589) | | [`HyperlaneServiceManager`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/f0df1a4cd1a9a6ec2e01b106941a2d4e42e5ba18/solidity/contracts/avs/HyperlaneServiceManager.sol) | [`0xe8E59c6C8B56F2c178f63BCFC4ce5e5e2359c8fc`](https://etherscan.io/address/0xe8E59c6C8B56F2c178f63BCFC4ce5e5e2359c8fc) | [`0x3127e69517ec2268dd5745c97194d387a4fc0c45`](https://etherscan.io/address/0x3127e69517ec2268dd5745c97194d387a4fc0c45) | | Name | Proxy | Implementation | | --- | --- | --- | | [`ECDSAStakeRegistry`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/f0df1a4cd1a9a6ec2e01b106941a2d4e42e5ba18/solidity/contracts/avs/ECDSAStakeRegistry.sol) | [`0xFfa913705484C9BAea32Ffe9945BeA099A1DFF72`](https://holesky.etherscan.io/address/0xFfa913705484C9BAea32Ffe9945BeA099A1DFF72) | [`0x628bc518ed1e0e8c6cbcd574eba0ee29e7f6943e`](https://holesky.etherscan.io/address/0x628bc518ed1e0e8c6cbcd574eba0ee29e7f6943e) | | [`HyperlaneServiceManager`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/f0df1a4cd1a9a6ec2e01b106941a2d4e42e5ba18/solidity/contracts/avs/HyperlaneServiceManager.sol) | [`0xc76E477437065093D353b7d56c81ff54D167B0Ab`](https://holesky.etherscan.io/address/0xc76E477437065093D353b7d56c81ff54D167B0Ab) | [`0xa3ab7e6ce24e6293bd5320a53329ef2f4de73fca`](https://holesky.etherscan.io/address/0xa3ab7e6ce24e6293bd5320a53329ef2f4de73fca) | * [Overview](#overview) * [Architecture](#architecture) * [`IRemoteChallenger`](#iremotechallenger) * [Workflow for registering](#workflow-for-registering) * [Workflow for deregistering](#workflow-for-deregistering) * [Workflow for staking](#workflow-for-staking) * [Workflow for slashing](#workflow-for-slashing) * [Contract deployment](#contract-deployment) --- # Interchain Gas Payments | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Interchain Gas Payments ======================= Successful interchain messages require two transactions; one on the origin chain to send the message, and one on the destination chain to deliver the message. For convenience, Hyperlane provides an onchain interface on the origin chain that allows message senders to pay [fees](#interchain-gas-payment-calculation) to the [relayer](/docs/protocol/agents/relayer) to deliver a message on the destination chain. This payment is called an **interchain gas payment**. Interchain Gas Payment Process[​](#interchain-gas-payment-process "Direct link to Interchain Gas Payment Process") ------------------------------------------------------------------------------------------------------------------- To [deliver a message](/docs/reference/messaging/receive) , a transaction must be included on the destination chain that calls the Mailbox `process` function with the encoded message and ISM metadata. For convenience, a [relayer](/docs/operate/relayer/run-relayer) watches for dispatched messages and will submit process transactions on behalf of the message sender if they receive sufficient payment on the origin chain. This is the _interchain gas payment_. Because messages can trigger arbitrary code execution, the relayer must meter the [`handle` call](/docs/reference/messaging/receive#handle) with a `gasLimit` to charge appropriately at message dispatch time. InterchainGasPaymasters[​](#interchaingaspaymasters "Direct link to InterchainGasPaymasters") ---------------------------------------------------------------------------------------------- Interchain gas payments are facilitated by `InterchainGasPaymaster` (IGP) smart contracts. These contracts expose the [InterchainGasPaymaster interface](/docs/reference/hooks/interchain-gas) , which allow message senders to pay the [relayer](/docs/protocol/agents/relayer) with native tokens on the origin chain to cover the costs of delivering a message on the destination chain. Each `InterchainGasPaymaster` contract corresponds to exactly one relayer. You can find addresses of the Abacus Works' relayer under [addresses](/docs/reference/contract-addresses) . ### Interchain Gas Payment Calculation[​](#interchain-gas-payment-calculation "Direct link to Interchain Gas Payment Calculation") The interchain gas payment is calculated as follows: destinationTxCost\=destinationGasPrice∗gasLimitexchangeRate\=originGasTokenPricedestinationGasTokenPriceoriginFee\=exchangeRate∗destinationTxCostdestinationTxCost = destinationGasPrice \* gasLimit \\\\\[5pt\] exchangeRate = \\frac{originGasTokenPrice}{destinationGasTokenPrice} \\\\\[5pt\] originFee = exchangeRate \* destinationTxCostdestinationTxCost\=destinationGasPrice∗gasLimitexchangeRate\=destinationGasTokenPriceoriginGasTokenPrice​originFee\=exchangeRate∗destinationTxCost The `gasLimit` and the `exchangeRate` are configured by the message sender and the relayer, respectively. Trust Assumptions[​](#trust-assumptions "Direct link to Trust Assumptions") ---------------------------------------------------------------------------- Interchain gas payments are based on a social contract between the message sender and relayer. In other words, a relayer may receive interchain gas payments without delivering the corresponding messages. Therefore, when making interchain gas payments, it is recommended to use an IGP contract that is associated with a known and reputable relayer. An honest relayer implementation will honor any successful gas payments made to its IGP, no matter how many tokens were actually paid. By keeping [gas oracles](/docs/reference/hooks/interchain-gas) up to date, the relayer can ensure that gas payments succeed if and only if a "fair" price was paid. There are no trust assumptions with respect to relayers in the Hyperlane protocol, and under no circumstances will a malicious relayer be able to censor or falsify messages. The worst thing that a relayer can do is accept payments without delivering a message. Learn More[​](#learn-more "Direct link to Learn More") ------------------------------------------------------- * For details on gas limit calculations, benchmarking recommendations, gas oracles, and destination gas configuration, refer to [Interchain Gas Payment Details](/docs/reference/hooks/interchain-gas) . * For relayer setups and implementation guidance, see the [relayer](/docs/protocol/agents/relayer) section. * [Interchain Gas Payment Process](#interchain-gas-payment-process) * [InterchainGasPaymasters](#interchaingaspaymasters) * [Interchain Gas Payment Calculation](#interchain-gas-payment-calculation) * [Trust Assumptions](#trust-assumptions) * [Learn More](#learn-more) --- # Aggregation ISM | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Aggregation ISM =============== Developers can use an `AggregationISM` to combine security from multiple ISMs. Simply put, an `AggregationISM` requires that `m` of `n` ISMs verify a particular interchain message. Developers can configure, for each origin chain, a set of `n` ISMs, and the number of ISMs needed to verify a message. `AggregationISMs` can aggregate the security of any ISMs. For example, users can deploy a [Multisig ISM](/docs/protocol/ISM/multisig-ISM) with their own validator set, and deploy an `AggregationISM` that aggregates that ISM with the Hyperlane default ISM. Interface[​](#interface "Direct link to Interface") ---------------------------------------------------- `AggregationISMs` must implement the `IAggregationIsm` interface. // SPDX-License-Identifier: MIT OR Apache-2.0pragma solidity >=0.6.11;import {IInterchainSecurityModule} from "../IInterchainSecurityModule.sol";interface IAggregationIsm is IInterchainSecurityModule { /** * @notice Returns the set of modules responsible for verifying _message * and the number of modules that must verify * @dev Can change based on the content of _message * @param _message Hyperlane formatted interchain message * @return modules The array of ISM addresses * @return threshold The number of modules needed to verify */ function modulesAndThreshold( bytes calldata _message ) external view returns (address[] memory modules, uint8 threshold);} Configure[​](#configure "Direct link to Configure") ---------------------------------------------------- The [Hyperlane monorepo](https://github.com/hyperlane-xyz/hyperlane-monorepo) contains an `AggregationISM` implementation that application developers can deploy off-the-shelf, specifying their desired configuration. Developers can configure, for each origin chain, a set of `n` ISMs, and the number of ISMs needed to verify a message. `AggregationISMs` can aggregate the security of any ISMs. For example, users can deploy a [Multisig ISM](/docs/protocol/ISM/multisig-ISM) with their own validator set, and deploy an `AggregationISM` that aggregates that ISM with the Hyperlane default ISM. Customize[​](#customize "Direct link to Customize") ---------------------------------------------------- The hyperlane-monorepo contains an abstract `AggregationISM` implementation that application developers can fork. Developers simply need to implement the `modulesAndThreshold()` function. By creating a custom implementation, application developers can tailor the security provided by a `AggregationISM` to the needs of their application. For example, a custom implementation could require that low value messages be verified by a [Multisig ISM](/docs/protocol/ISM/multisig-ISM) , and require that high value messages _also_ be verified by a Wormhole ISM. * [Interface](#interface) * [Configure](#configure) * [Customize](#customize) --- # CCIP Read ISM | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page CCIP Read ISM ============= Using a `CcipReadIsm` provides developers with a lot of flexibility for verifying interchain messages. Ultimately, every other kind of ISM can be implemented as a CCIP Read ISM, so when building new types of ISM's moving forward it's encouraged to build CCIP Read ISM's as all the relayer integration work has already been done. One caveat to keep in mind for CCIP Read ISM's is that they do introduce a dependency on an external (to the blockchain), but self hostable, API. If this is a hard blocker for your use case, you may want to consider other message verification techniques. Before building a CCIP Read ISM it's worth familiarizing yourself with the [CCIP Read specification](https://eips.ethereum.org/EIPS/eip-3668) . The specification describes a generalized protocol that allows smart contracts on EVM compatible chains to query and consume offchain data. How it works[​](#how-it-works "Direct link to How it works") ------------------------------------------------------------- A relayer will constantly listening to `Dispatch` events emitted from Hyperlane [Mailboxes](/docs/protocol/mailbox) . When a message is sent and picked up by a relayer, the relayer will query the destination ISM for information on how to process the message and if delivery will be successful. info The correct `moduleType` variable will need to be set on your ISM so that the relayer knows it's a CCIP Read ISM. To make sure this is configured correctly, you can inherit from the `AbstractCcipReadIsm` in `@hyperlane-xyz/core`. The relayer will then call the `getOffchainVerifyInfo(bytes)` function on the ISM with the contents of the message being delivered. This function should revert with the `OffchainLookup` error described in the [interface](#interface) section below. The relayer will query the endpoint specified in this revert message and pass the provided response and original message to the `process(bytes,bytes)` function of the destination `Mailbox`. Interface[​](#interface "Direct link to Interface") ---------------------------------------------------- `CcipReadIsm`'s must implement the `ICcipReadIsm` interface and should extend the `AbstractCcipReadIsm`, a convenience contract that sets the `moduleType` correctly. // SPDX-License-Identifier: MIT OR Apache-2.0pragma solidity >=0.8.0;import {IInterchainSecurityModule} from "../IInterchainSecurityModule.sol";interface ICcipReadIsm is IInterchainSecurityModule { /// @dev https://eips.ethereum.org/EIPS/eip-3668 /// @param sender the address of the contract making the call, usually address(this) /// @param urls the URLs to query for offchain data /// @param callData context needed for offchain service to service request /// @param callbackFunction function selector to call with offchain information /// @param extraData additional passthrough information to call callbackFunction with error OffchainLookup( address sender, string[] urls, bytes callData, bytes4 callbackFunction, bytes extraData ); /** * @notice Reverts with the data needed to query information offchain * and be submitted via the origin mailbox * @dev See https://eips.ethereum.org/EIPS/eip-3668 for more information * @param _message data that will help construct the offchain query */ function getOffchainVerifyInfo(bytes calldata _message) external view;} Configure[​](#configure "Direct link to Configure") ---------------------------------------------------- A great example for reference while developing CCIP Read ISM's exists as the [ChainlinkISM](https://github.com/AlexBHarley/permissionless-chainlink-feeds) . The `ChainlinkISM` is initialized with a set of Chainlink oracles and verifies the price feed data provided has been signed over by some subset of the signers. ### API[​](#api "Direct link to API") As per CCIP Read, the offchain API will need to return JSON data with the form, { "data": "..."} The relayer will pass this `data` property as the `metadata` parameter to `Mailbox.process(bytes metadata, bytes message)`. Note that in the case of the Chainlink ISM, where the receiver of the data also acts as the verifying ISM, `data` is just the raw transaction sent to submit price feed data with associated signatures. The `message` property is somewhat redundant. ### Contract[​](#contract "Direct link to Contract") When setting up the ISM, the `getOffchainVerifyInfo` and `verify` functions are the important ones to specify. * `getOffchainVerifyInfo` function should revert with an `OffchainLookup` error that instructs the relayer to query the given API endpoint. The `OffchainLookup` error allows for an array of API endpoints to be provided, so you can enforce any level of redundancy you'd like * `verify` must take the provided `metadata` and assert its legitimacy. Again the [ChainlinkISM implementation](https://github.com/AlexBHarley/permissionless-chainlink-feeds/blob/main/apps/contracts/contracts/ChainlinkAggregator.sol#L114) can be a useful reference point when developing this logic for your own ISM. Below is the scaffold of what a CCIP Read ISM could look like, where the ISM is also the receiver of the message, as per the Chainlink ISM. pragma solidity ^0.8.13;import {AbstractCcipReadIsm} from "@hyperlane-xyz/core/contracts/isms/ccip-read/AbstractCcipReadIsm.sol";import {IInterchainSecurityModule, ISpecifiesInterchainSecurityModule} from "@hyperlane-xyz/core/contracts/interfaces/IInterchainSecurityModule.sol";import {IMailbox} from "@hyperlane-xyz/core/contracts/interfaces/IMailbox.sol";import {Message} from "@hyperlane-xyz/core/contracts/libs/Message.sol";contract MyCcipReadIsm is AbstractCcipReadIsm, ISpecifiesInterchainSecurityModule { using Message for bytes; IMailbox mailbox; ... /** * No-op, everything happens in the verify function */ function handle(uint32, bytes32, bytes calldata _report) public {} /** * @param _metadata ABI encoded module metadata * @param _message Formatted Hyperlane message (see Message.sol). */ function verify( bytes calldata _metadata, bytes calldata _message ) external returns (bool) { ... } function interchainSecurityModule() external view returns (IInterchainSecurityModule) { return IInterchainSecurityModule(address(this)); } function getOffchainVerifyInfo( bytes calldata _message ) external view override { revert OffchainLookup( address(this), offchainUrls, _message, MyCcipReadIsm.process.selector, _message ); } /** * Provided for full CCIP Read specification compatibility. Relayers * will call the Mailbox directly regardless of the selector specified * in the `OffchainLookup` error */ function process( bytes calldata _metadata, bytes calldata _message ) external { mailbox.process(_metadata, _message); }} * [How it works](#how-it-works) * [Interface](#interface) * [Configure](#configure) * [API](#api) * [Contract](#contract) --- # Overriding the default ISM | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Overriding the default ISM ========================== Developers can specify or override the default ISM by implementing the `ISpecifiesInterchainSecurityModule` interface in their application. info If no ISM is specified, or if the specified ISM is the null address, the default ISM configured on the destination chain's Mailbox will be used. ISM Interface[​](#ism-interface "Direct link to ISM Interface") ---------------------------------------------------------------- ISMs must implement the `IInterchainSecurityModule` interface. This implementation can be configured, composed, and customized according to the needs of their application. Specifically, this interface must be implemented in the same smart contract that implements `handle()`. The interface consists of two functions: `verify` and `moduleType`. `IInterchainSecurityModule` Interface * Solidity // SPDX-License-Identifier: MIT OR Apache-2.0pragma solidity >=0.6.11;interface IInterchainSecurityModule { enum Types { UNUSED, ROUTING, AGGREGATION, LEGACY_MULTISIG, MERKLE_ROOT_MULTISIG, MESSAGE_ID_MULTISIG, NULL, // used with relayer carrying no metadata CCIP_READ, ARB_L2_TO_L1, WEIGHTED_MERKLE_ROOT_MULTISIG, WEIGHTED_MESSAGE_ID_MULTISIG, OP_L2_TO_L1 } /** * @notice Returns an enum that represents the type of security model * encoded by this ISM. * @dev Relayers infer how to fetch and format metadata. */ function moduleType() external view returns (uint8); /** * @notice Defines a security model responsible for verifying interchain * messages based on the provided metadata. * @param _metadata Off-chain metadata provided by a relayer, specific to * the security model encoded by the module (e.g. validator signatures) * @param _message Hyperlane encoded interchain message * @return True if the message was verified */ function verify( bytes calldata _metadata, bytes calldata _message ) external returns (bool);}interface ISpecifiesInterchainSecurityModule { function interchainSecurityModule() external view returns (IInterchainSecurityModule);} ### Verify[​](#verify "Direct link to Verify") /** * @notice Defines a security model responsible for verifying interchain * messages based on the provided metadata. * @param _metadata Off-chain metadata provided by a relayer, specific to * the security model encoded by the module (e.g. validator signatures) * @param _message Hyperlane encoded interchain message * @return True if the message was verified */function verify( bytes calldata _metadata, bytes calldata _message) external returns (bool); The primary function that ISMs must implement is `verify()`. The [Mailbox](/docs/protocol/mailbox) will call `IInterchainSecurityModule.verify()` before delivering a message to its recipient. If `verify()` reverts or returns `false`, the message will not be delivered. #### Parameters:[​](#parameters "Direct link to Parameters:") * `_metadata`: consists of arbitrary bytes provided by the [Relayer](/docs/protocol/agents/relayer) . Typically, these bytes are specific to the ISM. For example, the `_metadata` for a [Multisig ISM](/docs/protocol/ISM/multisig-ISM) must include validator signatures. * `_message`: consists of the Hyperlane message being verified. ISMs can use this to inspect details about the message being verified. For example, a [Multisig ISM](/docs/protocol/ISM/multisig-ISM) could change validator sets based on the origin chain of the message. warning See the [`Message.sol`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/libs/Message.sol) library for more information on the format of the Hyperlane message passed to `verify()`. ### Module type[​](#module-type "Direct link to Module type") The secondary function that ISMs must implement is `moduleType()`. /** * @notice Returns an enum that represents the type of security model * encoded by this ISM. * @dev Relayers infer how to fetch and format metadata. */function moduleType() external view returns (uint8); This is used to signal to the [Relayer](/docs/protocol/agents/relayer) what to include in `_metadata`. ISMs **must** return one of the supported module types. enum Types { UNUSED, ROUTING, AGGREGATION, LEGACY_MULTISIG, MERKLE_ROOT_MULTISIG, MESSAGE_ID_MULTISIG, NULL, // used with relayer carrying no metadata CCIP_READ, ARB_L2_TO_L1, WEIGHTED_MERKLE_ROOT_MULTISIG, WEIGHTED_MESSAGE_ID_MULTISIG, OP_L2_TO_L1} info * All ISM contracts must implement the ISM interface, which requires `moduleType` to be defined. This type is branched on by the Relayer in order to determine the required metadata for that ISM. For more information on module types and their metadata formats, see [Protocol](/docs/protocol/ISM/modular-security#module-type) . * For more information on the available module types and their respective metadata, please visit the ISM docs outlined in this section, e.g. [Multisig ISM](/docs/protocol/ISM/multisig-ISM) . * [ISM Interface](#ism-interface) * [Verify](#verify) * [Module type](#module-type) --- # Modular Security | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Modular Security ================ Hyperlane is secured by **Interchain Security Modules** (ISMs). ISMs are smart contracts that are responsible for verifying that interchain messages being delivered on the destination chain were _actually sent_ on the origin chain. Core Concepts[​](#core-concepts "Direct link to Core Concepts") ---------------------------------------------------------------- ### Default vs Custom ISM[​](#default-vs-custom-ism "Direct link to Default vs Custom ISM") Developers can either use the [Mailbox's](/docs/protocol/mailbox) default ISM or specify their own application-specific ISM. Application-specific ISM can be: * **Configured**: Use pre-built ISMs with custom parameters * **Composed**: Combine multiple ISMs together like security "legos" * **Customized**: Create entirely new ISMs tailored to specific needs #### Configure[​](#configure "Direct link to Configure") Hyperlane defines a set of pre-built ISMs. Developers can deploy any of these contracts "off-the-shelf" and configure them with their own parameters. For example, application developers that want increased sovereignty over interchain security could deploy a [Multisig ISM](/docs/protocol/ISM/multisig-ISM) configured with validators sourced from their own community. #### Compose[​](#compose "Direct link to Compose") ISMs act as "security [legos](https://en.wikipedia.org/wiki/Lego) ". Developers can mix and match different ISMs together to encode a security model that best fits their needs. For example, application developers that want additional security could deploy an [Aggregation ISM](/docs/protocol/ISM/aggregation-ISM) that requires verification by both a [Multisig ISM](/docs/protocol/ISM/multisig-ISM) configured with validators from the Hyperlane community, **and** a Wormhole ISM that verifies that a quorum of the [Wormhole](https://wormhole.com/) validator set verified the message. #### Customize[​](#customize "Direct link to Customize") ISMs are fully customizable. Developers can write their own ISMs, tailoring them to the needs of their application. For example, application developers can build ISMs that adjust security models based on message content. High value and infrequent messages (e.g. governance) could be verified by a security model that prioritizes safety over latency and gas costs. Lower value and more frequent messages could be verified by a security model that prioritizes latency and gas costs over safety. tip * Learn how to [Override the Default ISM](/docs/protocol/ISM/custom-ISM) * [Core Concepts](#core-concepts) * [Default vs Custom ISM](#default-vs-custom-ism) --- # Multisig ISM | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Multisig ISM ============ _Verify messages through validator consensus_ The `MultisigISM` is one of the most commonly used ISM types. These ISMs verify that `m` of `n` [Validators](/docs/protocol/agents/validators) have attested to the validity of a particular interchain message. Multisig Module Types[​](#multisig-module-types "Direct link to Multisig Module Types") ---------------------------------------------------------------------------------------- There are two types of `MultisigISM` modules: enum Types { ... MERKLE_ROOT_MULTISIG, MESSAGE_ID_MULTISIG, ... } ### MerkleRootMultisigIsmMetadata[​](#merklerootmultisigismmetadata "Direct link to MerkleRootMultisigIsmMetadata") **Type: `Types.MERKLE_ROOT_MULTISIG`** **Format of metadata:** | **Component** | **Length (bytes)** | **Description** | | --- | --- | --- | | 1st component | 32 | Origin merkle tree address | | 2nd component | 4 | Index of message ID in merkle tree | | 3rd component | 32 | Signed checkpoint message ID | | 4th component | 1024 | Merkle proof | | 5th component | 4 | Signed checkpoint index (computed from proof and index) | | 6th component (len == threshold \* 65 bytes) | threshold \* 65 | Validator signatures | ### MessageIdMultisigIsmMetadata[​](#messageidmultisigismmetadata "Direct link to MessageIdMultisigIsmMetadata") **Type: `Types.MESSAGE_ID_MULTISIG`** **Format of metadata:** | **Component** | **Length (bytes)** | **Description** | | --- | --- | --- | | 1st component | 32 | Origin merkle tree address | | 2nd component | 32 | Signed checkpoint root | | 3rd component | 4 | Signed checkpoint index | | 4th component (len == threshold \* 65 bytes) | threshold \* 65 | Validator signatures | Interface[​](#interface "Direct link to Interface") ---------------------------------------------------- `MultisigISMs` must implement the `IMultisigIsm` interface. // SPDX-License-Identifier: MIT OR Apache-2.0pragma solidity >=0.6.11;import {IInterchainSecurityModule} from "../IInterchainSecurityModule.sol";interface IMultisigIsm is IInterchainSecurityModule { /** * @notice Returns the set of validators responsible for verifying _message * and the number of signatures required * @dev Can change based on the content of _message * @dev Signatures provided to `verify` must be consistent with validator ordering * @param _message Hyperlane formatted interchain message * @return validators The array of validator addresses * @return threshold The number of validator signatures needed */ function validatorsAndThreshold( bytes calldata _message ) external view returns (address[] memory validators, uint8 threshold);} Configure[​](#configure "Direct link to Configure") ---------------------------------------------------- The hyperlane-monorepo contains [`MultisigISM` implementations](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/solidity/contracts/isms/multisig) (including a [legacy](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/isms/multisig/LegacyMultisigIsm.sol) version and more gas-efficient [versions](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/isms/multisig/StaticMultisigIsm.sol) deployable via factories) that application developers can deploy off-the-shelf, specifying their desired configuration. To configure a `MultisigISM` instance: 1. Developers define the set of `n` Validators on each origin chain. 2. A threshold is set, specifying the number (`m`) of Validator signatures required to confirm a message. Validator signatures are **not** specific to an ISM. In other words, developers can configure their `MultisigISM` to use **any** validator that's running on Hyperlane. Customize[​](#customize "Direct link to Customize") ---------------------------------------------------- For more specific use cases, developers can fork the abstract `MultisigISM` implementation provided in the Hyperlane monorepo. The primary customization involves implementing the `validatorsAndThreshold()` function. Custom implementations allow developers to adjust the security model to meet the needs of their application. For example, a custom implementation could vary the number of signatures required, based on the content of the message being verified. * [Multisig Module Types](#multisig-module-types) * [MerkleRootMultisigIsmMetadata](#merklerootmultisigismmetadata) * [MessageIdMultisigIsmMetadata](#messageidmultisigismmetadata) * [Interface](#interface) * [Configure](#configure) * [Customize](#customize) --- # Routing ISM | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Routing ISM =========== Developers can use a `RoutingISM` to delegate message verification to a different ISM. This allows developers to change security models based on message content or application context. This ISM simply switches security models depending on the origin chain of the message. A simple use case for this is to use different [Multisig ISM](/docs/protocol/ISM/multisig-ISM) validator sets for each chain. Eventually, you could imagine a `DomainRoutingIsm` routing to different light-client-based ISMs, depending on the type of consensus protocol used on the origin chain. Interface[​](#interface "Direct link to Interface") ---------------------------------------------------- `RoutingISMs` must implement the `IRoutingIsm` interface. // SPDX-License-Identifier: MIT OR Apache-2.0pragma solidity >=0.8.0;import {IInterchainSecurityModule} from "../IInterchainSecurityModule.sol";interface IRoutingIsm is IInterchainSecurityModule { /** * @notice Returns the ISM responsible for verifying _message * @dev Can change based on the content of _message * @param _message Formatted Hyperlane message (see Message.sol). * @return module The ISM to use to verify _message */ function route( bytes calldata _message ) external view returns (IInterchainSecurityModule);} Configure[​](#configure "Direct link to Configure") ---------------------------------------------------- The hyperlane-monorepo contains a `RoutingISM` implementation, `DomainRoutingIsm` and `DefaultFallbackRoutingIsm`, that application developers can deploy off-the-shelf, specifying their desired configuration. Customize[​](#customize "Direct link to Customize") ---------------------------------------------------- The hyperlane-monorepo contains an abstract `RoutingISM` implementation that application developers can fork. Developers simply need to implement the `route()` function. By creating a custom implementation, application developers can tailor the security provided by a `RoutingISM` to the needs of their application. For example, a custom implementation could change security models based on the contents of the message or the state of the application receiving the message. * [Interface](#interface) * [Configure](#configure) * [Customize](#customize) --- # Sequence diagram | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) Sequence diagram ================ The following shows a simplified sequence diagram of an interchain message being verified and delivered on the destination chain. info * If the recipient does not implement `ISpecifiesInterchainSecurityModule` or `recipient.interchainSecurityModule()` returns `address(0)`, the default ISM configured on the [Mailbox](/docs/protocol/mailbox) will be used to verify the message. * This is omitted from the sequence diagram for clarity. --- # Arbitrum L2 to L1 ISM | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) Arbitrum L2 to L1 ISM ===================== The Arbitrum L2 to L1 ISM is used along with the Arbitrum L2 to L1 hook to leverage the security of the Arbitrum rollup for messages passed from the Arbitrum L2 to Ethereum. See the [Arbitrum L2 to L1 Hook](/docs/reference/hooks/arbitrum-L2-to-L1) for more information. --- # OP Stack ISM | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) OP Stack ISM ============ The OP Stack ISM is used along with the OP Stack hook to leverage the security of an OP Stack rollup's [settlement layer](https://stack.optimism.io/docs/understand/landscape/#execution) for messages passed between Ethereum and the rollup. See the [OP Stack Hook](/docs/reference/hooks/op-stack) for more information. --- # Optimistic ISM | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) Optimistic ISM ============== Prioritizing safety over liveness warning `OptimisticISM` is coming soon and is not yet implemented. This page is shown for informational purposes only. Details may change as the design matures. The `OptimisticISM` encodes the optimistic verification security model pioneered by [Optics](https://docs.celo.org/protocol/bridge/optics) and adopted by [Synapse](https://docs.synapseprotocol.com/docs/RFQ/Security/#proofs) , [Nomad](https://docs.nomad.xyz/the-nomad-protocol/verification-mechanisms/optimistic-verification) , and [Connext](https://blog.connext.network/optimistic-bridges-fb800dc7b0e0) . `OptimisticISMs` rely on a fraud window after message verification, during which `m` of `n` **watchers** configured on the `OptimisticISM` have an opportunity to flag messages as fraudulent, preventing them from being delivered to their recipient. **This security model prioritizes safety over liveness;** the increased message latency allows for the addition of a second layer of security, the watchers, without significant increases in gas costs. --- # Polygon PoS ISM | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) Polygon PoS ISM =============== The Polygon PoS ISM is used along with the Polygon PoS hook to leverage the security of the Polygon [state sync mechanism](https://docs.polygon.technology/pos/architecture/bor/state-sync/) for messages passed between Ethereum and Polygon PoS chain. See the [Polygon PoS Hook](/docs/reference/hooks/polygon-pos) for more information. --- # Wormhole ISM | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Wormhole ISM ============ warning `WormholeISM` is coming soon and is not yet implemented. This page is shown for informational purposes only. Details may change as the design matures. The `WormholeISM` encodes the security model used by [Wormhole's](https://wormhole.com/) interchain communication protocol. This ISM requires that 13 of the 19 [Wormhole guardians](https://wormhole.com/network/#guardians) attest to the validity of a Hyperlane message. Compose[​](#compose "Direct link to Compose") ---------------------------------------------- Developers can compose a Wormhole ISM with a [Multisig ISM](/docs/protocol/ISM/multisig-ISM) using an [Aggregation ISM](/docs/protocol/ISM/aggregation-ISM) to require that m of n Hyperlane validators **and** 13-of-19 Wormhole guardians verify a message. * [Compose](#compose) --- # Mailbox | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Mailbox ======= The Hyperlane `Mailbox` smart contracts expose an on-chain API for sending and receiving interchain messages. There is a `Mailbox` contract deployed on every chain Hyperlane supports. The network of `Mailboxes` facilitates the connective tissue between blockchains that developers leverage to create interchain applications, and add interchain functionality to their existing applications. * To [**send**](/docs/reference/messaging/send) interchain messages, call the `dispatch` function. * To [**receive**](/docs/reference/messaging/receive) interchain messages, implement the `handle` function. Interface[​](#interface "Direct link to Interface") ---------------------------------------------------- The [`IMailbox`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/interfaces/IMailbox.sol) interface exposes two state-mutating functions; `dispatch()` and `process()`, which are used to send and receive messages, respectively. `IMailbox` Interface * Solidity // SPDX-License-Identifier: MIT OR Apache-2.0pragma solidity >=0.8.0;import {IInterchainSecurityModule} from "./IInterchainSecurityModule.sol";import {IPostDispatchHook} from "./hooks/IPostDispatchHook.sol";interface IMailbox { // ============ Events ============ /** * @notice Emitted when a new message is dispatched via Hyperlane * @param sender The address that dispatched the message * @param destination The destination domain of the message * @param recipient The message recipient address on `destination` * @param message Raw bytes of message */ event Dispatch( address indexed sender, uint32 indexed destination, bytes32 indexed recipient, bytes message ); /** * @notice Emitted when a new message is dispatched via Hyperlane * @param messageId The unique message identifier */ event DispatchId(bytes32 indexed messageId); /** * @notice Emitted when a Hyperlane message is processed * @param messageId The unique message identifier */ event ProcessId(bytes32 indexed messageId); /** * @notice Emitted when a Hyperlane message is delivered * @param origin The origin domain of the message * @param sender The message sender address on `origin` * @param recipient The address that handled the message */ event Process( uint32 indexed origin, bytes32 indexed sender, address indexed recipient ); function localDomain() external view returns (uint32); function delivered(bytes32 messageId) external view returns (bool); function defaultIsm() external view returns (IInterchainSecurityModule); function defaultHook() external view returns (IPostDispatchHook); function requiredHook() external view returns (IPostDispatchHook); function latestDispatchedId() external view returns (bytes32); function dispatch( uint32 destinationDomain, bytes32 recipientAddress, bytes calldata messageBody ) external payable returns (bytes32 messageId); function quoteDispatch( uint32 destinationDomain, bytes32 recipientAddress, bytes calldata messageBody ) external view returns (uint256 fee); function dispatch( uint32 destinationDomain, bytes32 recipientAddress, bytes calldata body, bytes calldata defaultHookMetadata ) external payable returns (bytes32 messageId); function quoteDispatch( uint32 destinationDomain, bytes32 recipientAddress, bytes calldata messageBody, bytes calldata defaultHookMetadata ) external view returns (uint256 fee); function dispatch( uint32 destinationDomain, bytes32 recipientAddress, bytes calldata body, bytes calldata customHookMetadata, IPostDispatchHook customHook ) external payable returns (bytes32 messageId); function quoteDispatch( uint32 destinationDomain, bytes32 recipientAddress, bytes calldata messageBody, bytes calldata customHookMetadata, IPostDispatchHook customHook ) external view returns (uint256 fee); function process( bytes calldata metadata, bytes calldata message ) external payable; function recipientIsm( address recipient ) external view returns (IInterchainSecurityModule module);} ### Message Headers[​](#message-headers "Direct link to Message Headers") The Mailbox prepends message bodies with a header containing the following fields: | **Field** | **Description** | | --- | --- | | `version` | The version of the Mailbox contract | | `nonce` | A unique identifier for each message sent from a given Mailbox | | `origin` | The domain of the origin chain | | `sender` | The address of the sender on the origin chain | | `destination` | The domain of the destination chain | | `recipient` | The address of the recipient on the destination chain | See the [`Message` library](/docs/reference/libraries/message) for more information on the message encoding. ### Uniqueness[​](#uniqueness "Direct link to Uniqueness") The `nonce` is a monotonically increasing integer for each message sent from a given Mailbox. It is incremented each time a message is dispatched to serve as a separator for otherwise identical messages. * Solidity function delivered(bytes32 messageId) external view returns (bool); The `messageId` is a globally unique message identifier, returned from the `dispatch` call, computed as the `keccak256` hash of the message (with headers). ### Replay Protection[​](#replay-protection "Direct link to Replay Protection") The Mailbox maintains a mapping of already delivered `messageId` values to prevent replay attacks. If a message is received with a `messageId` that has already been delivered, the message is rejected. * Solidity function defaultIsm() external view returns (IInterchainSecurityModule); Dispatch[​](#dispatch "Direct link to Dispatch") ------------------------------------------------- To send interchain messages, developers call `Mailbox.dispatch()`. This function takes as parameters the message contents, the destination chain ID, and the recipient address. Each message get inserted as a leaf into an [incremental merkle tree](https://medium.com/@josephdelong/ethereum-2-0-deposit-merkle-tree-13ec8404ca4f) stored by the `Mailbox`. Hyperlane's proof of stake protocol uses this merkle tree to verify fraud proofs. Process[​](#process "Direct link to Process") ---------------------------------------------- To deliver interchain messages, the [relayer](/docs/protocol/agents/relayer) calls `Mailbox.process()`. This function takes as parameters the message to deliver as well as arbitrary metadata that can be specified by the relayer. The `Mailbox` will pass the message and metadata to the recipient's interchain security module for verification. If the ISM successfully verifies the message, the `Mailbox` delivers the message to the recipient by calling `recipient.handle()`. info See [`Message.sol`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/libs/Message.sol) for more details on Hyperlane message encoding * [Interface](#interface) * [Message Headers](#message-headers) * [Uniqueness](#uniqueness) * [Replay Protection](#replay-protection) * [Dispatch](#dispatch) * [Process](#process) --- # Alt-VM Implementations | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Alt-VM Implementations ====================== While our public documentation currently focuses on EVM compatibility, we offer varying levels of support for additional ecosystems. These ecosystems may not have full feature parity or complete tooling integration (such as TypeScript CLI support) at this time. We're actively working to expand our documentation and tooling across these platforms. info If you're excited about building on top of these or bringing Hyperlane to other new ecosystems, reach out on [our Discord](https://discord.gg/hyperlane) ! CosmWasm[​](#cosmwasm "Direct link to CosmWasm") ------------------------------------------------- See the CosmWasm implementation of Hyperlane [here,](https://github.com/many-things/cw-hyperlane) implemented and maintained by the [Mitosis team](https://mitosis.org/) . Follow [this guide](https://github.com/many-things/cw-hyperlane/blob/main/DEPLOYMENT.md) on how to deploy to a Cosmos appchain here. We're live on Celestia, Stride and Neutron as of July 2024. Sealevel[​](#sealevel "Direct link to Sealevel") ------------------------------------------------- Hyperlane v3 for Solana Virtual Machine is live now on Solana and Eclipse, with more Solana rollups coming soon. You can find the Sealevel contract [implementation here](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/sealevel/programs) . Cairo[​](#cairo "Direct link to Cairo") ---------------------------------------- The Hyperlane protocol has been implemented in Cairo for Starkware by the [Pragma team](https://www.pragma.build/) . You can find the in progress [implementation here](https://github.com/astraly-labs/hyperlane_starknet) . Move[​](#move "Direct link to Move") ------------------------------------- Hyperlane has been implemented in MoveVM by [Movement Labs](https://movementlabs.xyz/) . You can find the in progress [implementation here](https://github.com/movementlabsxyz/hyperlane-monorepo) . These Move contracts are live on Movement's M1 testnet. Sway[​](#sway "Direct link to Sway") ------------------------------------- Find our in progress [Sway implementation here](https://github.com/hyperlane-xyz/fuel-contracts) . * [CosmWasm](#cosmwasm) * [Sealevel](#sealevel) * [Cairo](#cairo) * [Move](#move) * [Sway](#sway) --- # Protocol Overview | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) Protocol Overview ================= Hyperlane is the first [permissionless interoperability](/docs/deploy-hyperlane) layer that allows smart contract developers to send arbitrary data between blockchains. Developers can use Hyperlane to move tokens, execute function calls, and many other things that allow for the creation of interchain applications, apps that can be accessed by users on any blockchain. Users interface with the Hyperlane protocol via [mailbox](/docs/protocol/mailbox) smart contracts, which provide an on-chain messaging interface to send and receive interchain messages. Hyperlane takes a modular approach to security, allowing applications to configure and choose from a selection of [Interchain Security Modules](/docs/protocol/ISM/modular-security) (ISMs). Applications may specify an ISM to customize the security model that secures their integration with the Hyperlane messaging interface. --- # Warp Routes: Fast Native Transfers via Custom Gas Tokens | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Warp Routes: Fast Native Transfers via Custom Gas Tokens ======================================================== This document will walk you through how to use Hyperlane to enable fast native transfers to and from your L2 via a custom gas token. Primary Motives[​](#primary-motives "Direct link to Primary Motives") ---------------------------------------------------------------------- 1. Create a custom gas token to use on your L2 of choice. 2. Use this gas token to enable fast native transfers, instead of long wait times for settlement via canonical bridges. Pre-Requisites[​](#pre-requisites "Direct link to Pre-Requisites") ------------------------------------------------------------------- To complete the following walkthrough, you should have the following available: 1. A L2 network (”yourchain”) on which you are able to specify a [custom gas token](https://docs.arbitrum.io/launch-orbit-chain/how-tos/use-a-custom-gas-token) and would like to enable fast native transfers to and from. 2. A sole deployer or authorized owner to receive mint of the receipt token (more information on this token below). 3. An installed instance of the [Hyperlane CLI](https://docs.hyperlane.xyz/docs/reference/cli) and a wallet private key sourced as `HYP_KEY`, funded on all relevant networks. Walkthrough: Fast Native Transfers[​](#walkthrough-fast-native-transfers "Direct link to Walkthrough: Fast Native Transfers") ------------------------------------------------------------------------------------------------------------------------------ info * Note that a “receipt token” below is a (one-time) mintable “dummy” token used to collateralize a warp-route on yourchain's corresponding L1. You will burn the minting rights to the token after creating it. * Also, depending on your L2, the token symbol of your custom gas token may be assigned the same symbol as your receipt token. If deploying on ethereum, you may want to set your symbol to `ETH`. ### 1) Deploy a Receipt Token[​](#1-deploy-a-receipt-token "Direct link to 1) Deploy a Receipt Token") Deploy an `ETH` receipt token to ethereum to become your L2's custom gas token. 1. For example, you may deploy your receipt token via [Remix](https://remix.ethereum.org/) with a funded wallet and a contract similar to below: // SPDX-License-Identifier: MITpragma solidity ^0.8.20;import "@openzeppelin/contracts/token/ERC20/ERC20.sol";contract YourchainETH is ERC20 { constructor() ERC20("YourchainETH", "ETH") { _mint(msg.sender, 10000000 * (10 ** 18)); }} 2. Ensure 100% of the total supply of your `ETH` receipt token is minted to the deployer or authorized address of choice. This must be a one-time mint event in order to avoid value dilution of the ethereum ↔ yourchain native warp route, below. 3. Once deployed, save the address of the contract for use below. ### 2) Set the Custom Gas Token[​](#2-set-the-custom-gas-token "Direct link to 2) Set the Custom Gas Token") Set the custom gas token on yourchain to the newly deployed `ETH` ERC20 receipt token. 1. To set a custom gas token using OP stack: [https://docs.optimism.io/builders/chain-operators/features/custom-gas-token](https://docs.optimism.io/builders/chain-operators/features/custom-gas-token) 2. To set a custom gas token using arbitrum orbit: [https://docs.arbitrum.io/launch-orbit-chain/how-tos/use-a-custom-gas-token](https://docs.arbitrum.io/launch-orbit-chain/how-tos/use-a-custom-gas-token) ### 3) Transfer All Receipt Tokens[​](#3-transfer-all-receipt-tokens "Direct link to 3) Transfer All Receipt Tokens") Use your L2's canonical bridge to transfer 100% of the `ETH` receipt token from ethereum to yourchain. 1. To transfer using the OP stack standard bridge: [https://docs.optimism.io/builders/app-developers/bridging/standard-bridge](https://docs.optimism.io/builders/app-developers/bridging/standard-bridge) 2. To transfer using the arbitrum orbit bridge: [https://docs.arbitrum.io/launch-orbit-chain/how-tos/add-orbit-chain-to-bridge-ui](https://docs.arbitrum.io/launch-orbit-chain/how-tos/add-orbit-chain-to-bridge-ui) ### 4) Deploy a Native Warp Route[​](#4-deploy-a-native-warp-route "Direct link to 4) Deploy a Native Warp Route") Using the Hyperlane CLI, deploy an ethereum `ETH` EvmHypNative ↔ yourchain `ETH` EvmHypNative warp route: 1. Run `hyperlane warp init` and complete the following flow: 1. Select `ethereum` and `yourchain` using space, and hit enter. 2. For ethereum, select `native` and accept the mailbox. 3. For yourchain, select `native` and accept the mailbox. 2. Before executing the deployment, ensure yourchain’s `metadata.yaml` has a `blockExplorers` field defined. This will be needed for contract verification in order to easily collateralize yourchain's warp route. 3. Run `hyperlane warp deploy` and confirm the warp deploy config is as expected. 4. After execution, your `yourchain-ethereum-config.yaml` deployment file will look similar to the following: # yaml-language-server: $schema=../schema.jsontokens: - addressOrDenom: "0x3e5bB1a03fef5DB15A320885E6A0C8Bff8b656bd" chainName: yourchain connections: - token: ethereum|ethereum|0x6d64832bDB4F04721D4F23CCbF17326cb636101e decimals: 18 name: Ether standard: EvmHypNative symbol: ETH - addressOrDenom: "0x6d64832bDB4F04721D4F23CCbF17326cb636101e" chainName: ethereum connections: - token: ethereum|yourchain|0x3e5bB1a03fef5DB15A320885E6A0C8Bff8b656bd decimals: 18 name: Ether standard: EvmHypNative symbol: ETH ### 5) Collateralize Your Warp Route[​](#5-collateralize-your-warp-route "Direct link to 5) Collateralize Your Warp Route") Deposit yourchain `ETH` as collateral into yourchain's native warp route via the `receive()` function. If needed, you may use the verified contract to do this via your scanner's UI, or a wallet such as Metamask This collateralizes the native warp route, enabling users to bridge their native assets quickly to and from yourchain. ### 6) Testing[​](#6-testing "Direct link to 6) Testing") You can initiate a test transfer of a single wei with the following command: hyperlane warp send --relay --symbol ETH The `--relay` flag is optional and will relay the message to the destination chain. You can also run a relayer that delivers only for your warp route in the background with: hyperlane relayer --symbol TOKEN You can test in either direction between where you have the warp route set. info By Default, your warp core config is found in the local Registry at `$HOME/.hyperlane/deployments/warp_routes` to be used with the `--warp` flag. success 🎉 Congrats! You have now enabled fast native transfer to and from yourchain via a custom gas token on your L2. warning Please note that this collateralization strategy takes on certain ISM trust assumptions. Resources[​](#resources "Direct link to Resources") ---------------------------------------------------- Take a look at the [inEVM bridge](https://bridge.inevm.com/) to see an example of these warp routes in action. Check out some additional information, published by the Hyperlane supporting team & Injective: * [inEVM Spotlight: Hyperlane](https://blog.injective.com/en/inevm-spotlight-hyperlane-2/) * [Connecting Injective: Hyperlane Opens the inEVM Bridge](https://medium.com/hyperlane/connecting-injective-hyperlane-opens-the-inevm-bridge-6f1d3edf0ff8) * [Hyperlane and Injective | Expanding opportunities](https://medium.com/@kobriyyu/hyperlane-and-injective-expanding-opportunities-8ce170b72da7) * [Primary Motives](#primary-motives) * [Pre-Requisites](#pre-requisites) * [Walkthrough: Fast Native Transfers](#walkthrough-fast-native-transfers) * [1) Deploy a Receipt Token](#1-deploy-a-receipt-token) * [2) Set the Custom Gas Token](#2-set-the-custom-gas-token) * [3) Transfer All Receipt Tokens](#3-transfer-all-receipt-tokens) * [4) Deploy a Native Warp Route](#4-deploy-a-native-warp-route) * [5) Collateralize Your Warp Route](#5-collateralize-your-warp-route) * [6) Testing](#6-testing) * [Resources](#resources) --- # Warp Routes: Example Usage | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Warp Routes: Example Usage ========================== Warp Routes define how assets move between chains, whether as native tokens, synthetic representations, or collateral-backed assets. The choice of route depends on the asset type and the desired behavior on the destination chain. Warp Route Combinations[​](#warp-route-combinations "Direct link to Warp Route Combinations") ---------------------------------------------------------------------------------------------- ### 1\. Native to Native[​](#1-native-to-native "Direct link to 1. Native to Native") This route allows for the transfer of native tokens between chains that both use their own native tokens. info This type of route should only be used when both networks have native tokens of equivalent value, e.g. inEVM & Ethereum. #### Setup[​](#setup "Direct link to Setup") * **HypNative** contract deployed on both chains. #### Example Flow[​](#example-flow "Direct link to Example Flow") Transaction Type: Native to Native TransferFrom: Ethereum (ETH)To: inEVM (ETH)Amount: 1 ETH #### Diagram[​](#diagram "Direct link to Diagram") #### Use Case[​](#use-case "Direct link to Use Case") * Alice wants to quickly move value from Ethereum to inEVM. ### 2\. Native to Synthetic[​](#2-native-to-synthetic "Direct link to 2. Native to Synthetic") This route creates a synthetic representation of a native token on another chain. #### Setup[​](#setup-1 "Direct link to Setup") * **HypNative** contract deployed on the origin chain where the native asset exists. * **HypERC20** contract deployed on the destination chain where the synthetic token is minted. #### Example Flow[​](#example-flow-1 "Direct link to Example Flow") Transaction Type: Minting Synthetic Token from Native TokenFrom: Celo (CELO)To: Optimism (wCELO)Amount: 100 CELO #### Diagram[​](#diagram-1 "Direct link to Diagram") #### Use Case[​](#use-case-1 "Direct link to Use Case") * A Celo-based project wants to make their native CELO token available for use on Optimism. ### 3\. Collateral to Synthetic[​](#3-collateral-to-synthetic "Direct link to 3. Collateral to Synthetic") This route allows for the creation of synthetic tokens based on collateralized ERC20 tokens. #### Setup[​](#setup-2 "Direct link to Setup") * **Collateral contract (HypERC20Collateral)** is deployed on the source chain where the original asset exists. * **Synthetic contract (HypERC20)** is deployed on the destination chain, where the asset is minted. #### Example Flow[​](#example-flow-2 "Direct link to Example Flow") Transaction Type: Minting Synthetic Token from Collateral TokenFrom: Ethereum (USDC - Original Asset) - Collateral SourceTo: Arbitrum (wUSDC - Minted Synthetic Asset) - Synthetic DestinationAmount: 1000 USDC #### Diagram[​](#diagram-2 "Direct link to Diagram") #### Use Case[​](#use-case-2 "Direct link to Use Case") * Alice wants to use her USDC on Arbitrum without moving actual USDC to Arbitrum or relying on Arbitrum's bridged USDC. * [Warp Route Combinations](#warp-route-combinations) * [1\. Native to Native](#1-native-to-native) * [2\. Native to Synthetic](#2-native-to-synthetic) * [3\. Collateral to Synthetic](#3-collateral-to-synthetic) --- # Warp Routes | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Warp Routes =========== Overview[​](#overview "Direct link to Overview") ------------------------------------------------- Developers can use Hyperlane to permissionlessly deploy Warp Routes - contracts that allow any ERC20, ERC721, or native tokens to move effortlessly between chains. You can combine Warp Routes with a Hyperlane deployment to create economic trade routes between any chain and others already connected through Hyperlane. ### Modular Security[​](#modular-security "Direct link to Modular Security") Like all applications built on top of Hyperlane, Warp Routes have customizable security via [Interchain Security Modules](/docs/protocol/ISM/modular-security) . This allows Warp Route deployers to configure and enforce custom rules and constraints that the interchain token must follow. ### Deploy a Warp Route[​](#deploy-a-warp-route "Direct link to Deploy a Warp Route") Warp Routes can be deployed between any set of chains that have Hyperlane deployments. If you would like to create a Warp Route that includes a chain that Hyperlane is not currently deployed on, feel free to [deploy hyperlane](/docs/deploy-hyperlane) yourself! ### Warp Route Architecture[​](#warp-route-architecture "Direct link to Warp Route Architecture") Warp Route contracts transfer value between chains by locking collateral tokens on the origin chain (aka the collateral chain) and then minting wrapped tokens on the destination chain (the synthetic chain). The diagram below provides a simplified outline of the process for creating your Warp Route, and the resulting asset. ![Warp Route diagram/doodle](/assets/images/warpcontractdiagram-86cc7cd05a7ec53dac12d72e4fb99883.png) Each Warp Route consists of one contract deployed on every chain that the token can move between. These contracts use the [Mailbox](/docs/protocol/mailbox) to send interchain messages to one another. When a user transfers from the _canonical_ origin chain to a _non-canonical_ destination chain, their tokens are locked in a `HypERC20Collateral` contract, which sends a message to the destination chain to mint wrapped tokens. When a user transfers between non-canonical chains, their wrapped tokens are burned on the origin chain, which sends a message to the destination chain to mint wrapped tokens. Finally, if a user transfers from a non-canonical origin chain back to the canonical destination chain, their wrapped tokens are burned on the origin chain, which sends a message to the destination chain to release the tokens locked in the`HypERC20Collateral` contract. * [Overview](#overview) * [Modular Security](#modular-security) * [Deploy a Warp Route](#deploy-a-warp-route) * [Warp Route Architecture](#warp-route-architecture) --- # Deploy Yield Routes | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Deploy Yield Routes =================== The goal of this guide is to illustrate how you can use Hyperlane warp routes to create yield-generating bridges, ensuring idle bridged assets are productive by compounding yield over time. Depending on the variant (more details below), yields are distributed to the yield route owner or users. Pre-Requisites[​](#pre-requisites "Direct link to Pre-Requisites") ------------------------------------------------------------------- To complete the following walkthrough, you should have the following available: 1. An origin and destination network of choice, between which you’d like to deploy the yield route. 2. The address of an [ERC-4626 vault](https://ethereum.org/en/developers/docs/standards/tokens/erc-4626/) on the origin network from which you want yield to be generated. This vault’s underlying asset will be set as the collateral for the warp route (e.g. if vault is USDC funded, the warp route will also support USDC transfer). 3. An installed instance of the [Hyperlane CLI](https://docs.hyperlane.xyz/docs/reference/cli) and a wallet private key set as the `HYP_KEY` env var funded on your origin and destination networks. Walkthrough[​](#walkthrough "Direct link to Walkthrough") ---------------------------------------------------------- ### Concepts[​](#concepts "Direct link to Concepts") * **ERC-4626 Vault**: The Ethereum standard for tokenized yield-bearing vaults. Upon deposit, share tokens are minted representing ownership of the underlying asset. * **Yield Route (EvmHypOwnerCollateral & EvmHypSynthetic)**: The Hyperlane representation of a yield-bearing EVM collateral token. Note that the yield route’s vault’s deposited asset address is used as the warp routes collateral token. * This specific yield route variant distributes vault yields to the **owner**. There is an alternative setup where yields are distributed to the users (EvmHypCollateral & EvmHypSyntheticRebase). For most of this guide, we will refer to the former variants. The concepts remain the same. info For the sake of this walkthrough, the “origin” network will refer to the network on which the yield is generated (e.g. Ethereum has a USDC lending vault that has claimable yield. A synthetic USDC is minted on the destination chain called yourchain). Below is the bridging flow between Ethereum and yourchain **Bridge USDC: Ethereum → yourchain** In this example, Alice wants to bridge USDC between Ethereum and yourchain. The yield route will transfer her USDC to a yield-bearing ERC-4626 vault, and then mint her synthetic USDC on yourchain. Notice that the yield route owner can claim yields generated from that vault. **Bridge USDC: yourchain → Ethereum** When Alice wants to bridge back to Ethereum, the reverse happens. The yield route will burn her synthetic USDC, withdraw the USDC from the vault on Ethereum, and return her USDC. ### Yield Route Deployment Steps[​](#yield-route-deployment-steps "Direct link to Yield Route Deployment Steps") Using the Hyperlane CLI, deploy a USDC EvmHypOwnerCollateral and EvmHypSynthetic tokens on Ethereum and yourchain, respectively: #### 1\. Run `hyperlane warp init` to generate a warp route config:[​](#1-run-hyperlane-warp-init-to-generate-a-warp-route-config "Direct link to 1-run-hyperlane-warp-init-to-generate-a-warp-route-config") 1. Select `yourchain` and `Ethereum` using space, and hit enter. 2. For Ethereum, select `collateralVault`, accept the mailbox, and enter the USDC vault address on yourchain. * Alternatively, you can select `collateralVaultRebase` which is a yield route variant that distribute yields to users by increasing their holding amount. 3. For yourchain, select `synthetic` and accept the mailbox. * If you selected `collateralVaultRebase`, you must pair it with a `syntheticRebase` #### 2\. Run `hyperlane warp deploy` to deploy the warp route.[​](#2-run-hyperlane-warp-deploy-to-deploy-the-warp-route "Direct link to 2-run-hyperlane-warp-deploy-to-deploy-the-warp-route") ### Claiming Yield[​](#claiming-yield "Direct link to Claiming Yield") Depending on the yield route variant, yield can be claimed by either calling `HypERC4626OwnerCollateral.sweep()` or `HypERC4626Collateral.rebase()` on their respective contracts. success 🎉 Congrats! You have now created a new yield route with your vault. Bridged user assets can now earn passive yield while present in the origin warp route. warning Please note that this collateralization strategy takes on certain ISM trust assumptions, and there is inherent risk that the underlying [ERC-4626 vault](https://ethereum.org/en/developers/docs/standards/tokens/erc-4626/) becomes under-collateralized. Resources[​](#resources "Direct link to Resources") ---------------------------------------------------- For more in-depth details on these steps, follow the [Bridge a Token](/docs/guides/deploy-warp-route) guide. Check out some additional information, published by the Hyperlane supporting team, Cheese Chain, and the Ethereum Foundation: * [Hyperlane: Introducing Yield Routes](https://medium.com/hyperlane/introducing-yield-routes-f7e8fd091443) * [ERC-4626 Tokenized Vault Standard](https://ethereum.org/en/developers/docs/standards/tokens/erc-4626/) * [Pre-Requisites](#pre-requisites) * [Walkthrough](#walkthrough) * [Concepts](#concepts) * [Yield Route Deployment Steps](#yield-route-deployment-steps) * [Claiming Yield](#claiming-yield) * [Resources](#resources) --- # Warp Routes: Types | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Warp Routes: Types ================== Warp routes are Hyperlane's implementation of token bridging, allowing for permissionless transfer of native, ERC20, and synthetic (newly deployed ERC20) assets across any chain via Hyperlane. This document provides details on all warp route types. | **Warp Route Type** | **Description** | | --- | --- | | Native Token Warp Routes | Enables direct transfers of native gas tokens (e.g., ETH) across chains without wrapping. | | Collateral-Backed ERC20 | Locks ERC20 tokens as collateral on the source chain for cross-chain transfers. | | Synthetic ERC20 | Mints new ERC20 tokens on the destination chain to represent the original tokens. | | Specialized Warp Routes | Adds advanced features or integrates with specific use cases (e.g., vaults, fiat-backed tokens.) | _Please note that this document does not include ERC721 warp routes._ Core Warp Route Types[​](#core-warp-route-types "Direct link to Core Warp Route Types") ---------------------------------------------------------------------------------------- ### Native Token Warp Routes[​](#native-token-warp-routes "Direct link to Native Token Warp Routes") Implemented in `HypNative.sol`, native warp routes handle the transfer of native gas tokens (e.g. ETH on Ethereum or Arbitrum, MNT on Mantle) across different chains. #### Features[​](#features "Direct link to Features") * Directly transfers native tokens without wrapping. * Uses `msg.value` for transfer amount. * Handles excess `msg.value` as hook payment. * Supports donations through a `receive()` function. See [the implementation](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/HypNative.sol) for more details. ### Collateral-Backed ERC20 Warp Routes[​](#collateral-backed-erc20-warp-routes "Direct link to Collateral-Backed ERC20 Warp Routes") Implemented in `HypERC20Collateral.sol`, collateral warp routes enable ERC20 tokens to be locked as collateral on the source chain and then used to mint a synthetic representation on the destination chain. #### Features[​](#features-1 "Direct link to Features") * Wraps existing ERC20 tokens as collateral for transfers. * Locks tokens in the contract on the source chain. * Releases equivalent tokens on the destination chain. * Uses SafeERC20 for secure token transfers. See [the implementation](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/HypERC20Collateral.sol) for more details. ### Synthetic ERC20 Warp Routes[​](#synthetic-erc20-warp-routes "Direct link to Synthetic ERC20 Warp Routes") Implemented in `HypERC20.sol`, synthetic warp routes mint new tokens on the destination chain that represent the original tokens from the source chain. The original tokens are not transferred but remain locked. #### Features[​](#features-2 "Direct link to Features") * Maintains consistent total supply across all chains. * Supports custom token attributes (name, symbol, decimals). * Mints new tokens on the destination chain. * Burns tokens on the source chain when transferred back. See [the implementation](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/HypERC20.sol) for more details. Advanced Features[​](#advanced-features "Direct link to Advanced Features") ---------------------------------------------------------------------------- ### TokenRouter Functionality[​](#tokenrouter-functionality "Direct link to TokenRouter Functionality") All warp routes extend the `TokenRouter` contract, which provides the core functionality for warp route token transfers. #### Features[​](#features-3 "Direct link to Features") 1. **Message Structure**: Uses [TokenMessage](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/libs/TokenMessage.sol) library for encoding and decoding token transfer messages. 2. **Transfer Initiation**: `transferRemote` function initiates cross-chain transfers. 3. **Message Handling**: `_handle` function processes incoming transfer messages. 4. **Abstract Methods**: * `_transferFromSender`: Implemented by all warp routes to handle token collection. * `_transferTo`: Implemented by all warp routes to handle token distribution. #### TokenMessage Format[​](#tokenmessage-format "Direct link to TokenMessage Format") [32 bytes for recipient][32 bytes for amount][remaining bytes for metadata] This standardized format ensures consistent handling across different warp route implementations while allowing for extensibility through metadata. See [the implementation](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/libs/TokenRouter.sol) for more details. ### FastTokenRouter Transfers[​](#fasttokenrouter-transfers "Direct link to FastTokenRouter Transfers") Implemented in `FastTokenRouter.sol`, this router extends TokenRouter and provides faster token transfers through a liquidity provider mechanism. #### Features[​](#features-4 "Direct link to Features") * Allows liquidity providers to fulfill transfer requests before message processing. * Includes a `fastFee` to incentivize liquidity providers. * Introduces `fastTransferId` for unique transfer identification. See [the implementation](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/libs/FastTokenRouter.sol) for more details. Specialized Warp Route Extensions[​](#specialized-warp-route-extensions "Direct link to Specialized Warp Route Extensions") ---------------------------------------------------------------------------------------------------------------------------- ### 1\. Fast Collateral Transfers (FastHypERC20Collateral)[​](#1-fast-collateral-transfers-fasthyperc20collateral "Direct link to 1. Fast Collateral Transfers (FastHypERC20Collateral)") * Combines fast transfer capabilities with collateral-backed ERC20 functionality. * See [the implementation](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/extensions/FastHypERC20Collateral.sol) for more details. ### 2\. Vault Integration (HypERC4626OwnerCollateral, HypERC4626Collateral)[​](#2-vault-integration-hyperc4626ownercollateral-hyperc4626collateral "Direct link to 2. Vault Integration (HypERC4626OwnerCollateral, HypERC4626Collateral)") * Allows for yield generation on collateral by integrating with ERC-4626 vaults. * See [the implementation](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/extensions/HypERC4626OwnerCollateral.sol) & [rebasing variant](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/extensions/HypERC4626Collateral.sol) and for more details. ### 3\. Fiat-Backed Tokens (HypFiatToken)[​](#3-fiat-backed-tokens-hypfiattoken "Direct link to 3. Fiat-Backed Tokens (HypFiatToken)") * Designed for stablecoins and other fiat-backed tokens, implementing specific mint and burn operations. * See [the implementation](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/extensions/HypFiatToken.sol) for more details. ### 4\. Scaled Native Tokens (HypNativeScaled)[​](#4-scaled-native-tokens-hypnativescaled "Direct link to 4. Scaled Native Tokens (HypNativeScaled)") * Scales native token values for consistency across chains with different decimals. * See [the implementation](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/extensions/HypNativeScaled.sol) for more details. ### 5\. xERC20 Integration (HypXERC20 & HypXERC20Lockbox)[​](#5-xerc20-integration-hypxerc20--hypxerc20lockbox "Direct link to 5. xERC20 Integration (HypXERC20 & HypXERC20Lockbox)") * Enables cross-chain transfers of xERC20 tokens, integrating with lockbox mechanisms for conversions. * See the [HypXERC20 implementation](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/extensions/HypXERC20.sol) and the [HypXERC20Lockbox implementation](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/token/extensions/HypXERC20Lockbox.sol) for more details. References[​](#references "Direct link to References") ------------------------------------------------------- For setup examples & use cases, check out [Warp Routes: Example Usage](/docs/protocol/warp-routes/warp-routes-example-usage) . * [Core Warp Route Types](#core-warp-route-types) * [Native Token Warp Routes](#native-token-warp-routes) * [Collateral-Backed ERC20 Warp Routes](#collateral-backed-erc20-warp-routes) * [Synthetic ERC20 Warp Routes](#synthetic-erc20-warp-routes) * [Advanced Features](#advanced-features) * [TokenRouter Functionality](#tokenrouter-functionality) * [FastTokenRouter Transfers](#fasttokenrouter-transfers) * [Specialized Warp Route Extensions](#specialized-warp-route-extensions) * [1\. Fast Collateral Transfers (FastHypERC20Collateral)](#1-fast-collateral-transfers-fasthyperc20collateral) * [2\. Vault Integration (HypERC4626OwnerCollateral, HypERC4626Collateral)](#2-vault-integration-hyperc4626ownercollateral-hyperc4626collateral) * [3\. Fiat-Backed Tokens (HypFiatToken)](#3-fiat-backed-tokens-hypfiattoken) * [4\. Scaled Native Tokens (HypNativeScaled)](#4-scaled-native-tokens-hypnativescaled) * [5\. xERC20 Integration (HypXERC20 & HypXERC20Lockbox)](#5-xerc20-integration-hypxerc20--hypxerc20lockbox) * [References](#references) --- # Interchain Account Router | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) Interchain Account Router ========================= * Mainnet * Testnet | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Aleph Zero EVM | 1000041455 | `0x26A29486480BD74f9B830a9B8dB33cb43C40f496` | [evm-explorer.alephzero.org](https://evm-explorer.alephzero.org/address/0x26A29486480BD74f9B830a9B8dB33cb43C40f496) | | Ancient8 | 888888888 | `0x25C87e735021F72d8728438C2130b02E3141f2cb` | [scan.ancient8.gg](https://scan.ancient8.gg/address/0x25C87e735021F72d8728438C2130b02E3141f2cb) | | ApeChain | 33139 | `0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47` | [apechain.calderaexplorer.xyz](https://apechain.calderaexplorer.xyz/address/0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47) | | AppChain | 466 | `0x65F1343AC23D4fF48bf6c7E0c55872d245397567` | [explorer.appchain.xyz](https://explorer.appchain.xyz/address/0x65F1343AC23D4fF48bf6c7E0c55872d245397567) | | Arbitrum | 42161 | `0x91874Dbed74925dFe6059B90385EEb90DdE0B2E6` | [arbiscan.io](https://arbiscan.io/address/0x91874Dbed74925dFe6059B90385EEb90DdE0B2E6) | | Arbitrum Nova | 42170 | `0xeE8C0E1EeBfFCC451a013336386eA53E42a44451` | [nova.arbiscan.io](https://nova.arbiscan.io//address/0xeE8C0E1EeBfFCC451a013336386eA53E42a44451) | | Artela | 11820 | `0xC5f2c60073DCAA9D157C45d5B017D639dF9C5CeB` | [artscan.artela.network](https://artscan.artela.network/address/0xC5f2c60073DCAA9D157C45d5B017D639dF9C5CeB) | | Arthera | 10242 | `0x2b6d3F7d28B5EC8C3C028fBCAdcf774D9709Dd29` | [explorer.arthera.net](https://explorer.arthera.net/address/0x2b6d3F7d28B5EC8C3C028fBCAdcf774D9709Dd29) | | Astar | 592 | `0x5090dF2FBDa7127c7aDa41f60B79F5c55D380Dd8` | [astar.blockscout.com](https://astar.blockscout.com/address/0x5090dF2FBDa7127c7aDa41f60B79F5c55D380Dd8) | | Astar zkEVM | 3776 | `0x7621e04860F0bDe63311db9D5D8b589AD3458A1f` | [astar-zkevm.explorer.startale.com](https://astar-zkevm.explorer.startale.com/address/0x7621e04860F0bDe63311db9D5D8b589AD3458A1f) | | Aurora | 1313161554 | `0x021D2810a758c833080DEc2F1Fa8F571Aae97D45` | [explorer.mainnet.aurora.dev](https://explorer.mainnet.aurora.dev/address/0x021D2810a758c833080DEc2F1Fa8F571Aae97D45) | | Avalanche | 43114 | `0xa82a0227e6d6db53AF4B264A852bfF91C6504a51` | [snowtrace.io](https://snowtrace.io/address/0xa82a0227e6d6db53AF4B264A852bfF91C6504a51) | | B3 | 8333 | `0xeE8C0E1EeBfFCC451a013336386eA53E42a44451` | [explorer.b3.fun](https://explorer.b3.fun/address/0xeE8C0E1EeBfFCC451a013336386eA53E42a44451) | | Base | 8453 | `0x4767D22117bBeeb295413000B620B93FD8522d53` | [basescan.org](https://basescan.org/address/0x4767D22117bBeeb295413000B620B93FD8522d53) | | Bitlayer | 200901 | `0xA0a44cB8Bc0f7EDe788b0Cd29524A5b14fED7b45` | [www.btrscan.com](https://www.btrscan.com/address/0xA0a44cB8Bc0f7EDe788b0Cd29524A5b14fED7b45) | | Blast | 81457 | `0x2f4Eb04189e11Af642237Da62d163Ab714614498` | [blastexplorer.io](https://blastexplorer.io/address/0x2f4Eb04189e11Af642237Da62d163Ab714614498) | | BOB | 60808 | `0x5C02157068a52cEcfc98EDb6115DE6134EcB4764` | [explorer.gobob.xyz](https://explorer.gobob.xyz/address/0x5C02157068a52cEcfc98EDb6115DE6134EcB4764) | | Boba Mainnet | 288 | `0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64` | [bobascan.com](https://bobascan.com/address/0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64) | | Binance Smart Chain | 56 | `0x32A07c1B7a7fe8D4A0e44B0181873aB9d64C16c1` | [bscscan.com](https://bscscan.com/address/0x32A07c1B7a7fe8D4A0e44B0181873aB9d64C16c1) | | B² Network | 223 | `0x4D50044335dc1d4D26c343AdeDf6E47808475Deb` | [explorer.bsquared.network](https://explorer.bsquared.network/address/0x4D50044335dc1d4D26c343AdeDf6E47808475Deb) | | Celo | 42220 | `0x27a6cAe33378bB6A6663b382070427A01fc9cB37` | [celoscan.io](https://celoscan.io/address/0x27a6cAe33378bB6A6663b382070427A01fc9cB37) | | CheeseChain | 383353 | `0xEF9A332Ec1fD233Bf9344A58be56ff9E104B4f60` | [fetascan.xyz](https://fetascan.xyz/address/0xEF9A332Ec1fD233Bf9344A58be56ff9E104B4f60) | | Chiliz | 1000088888 | `0x4ef363Da5bb09CC6aeA16973786963d0C8820778` | [chiliscan.com](https://chiliscan.com/address/0x4ef363Da5bb09CC6aeA16973786963d0C8820778) | | Conflux eSpace | 1030 | `0xc2466492C451E1AE49d8C874bB9f89293Aaad59b` | [evm.confluxscan.net](https://evm.confluxscan.net/address/0xc2466492C451E1AE49d8C874bB9f89293Aaad59b) | | Conwai | 668668 | `0x93D41E41cA545a35A81d11b08D2eE8b852C768df` | [conwai.calderaexplorer.xyz](https://conwai.calderaexplorer.xyz/address/0x93D41E41cA545a35A81d11b08D2eE8b852C768df) | | Core | 1116 | `0xd01A3E167d59FF98c983E83BAa5da0C3e0ADe726` | [scan.coredao.org](https://scan.coredao.org/address/0xd01A3E167d59FF98c983E83BAa5da0C3e0ADe726) | | Corn | 21000000 | `0x93D41E41cA545a35A81d11b08D2eE8b852C768df` | [cornscan.io](https://cornscan.io/address/0x93D41E41cA545a35A81d11b08D2eE8b852C768df) | | Cyber | 7560 | `0x7B032cBB00AD7438E802A66D8b64761A06E5df22` | [cyberscan.co](https://cyberscan.co/address/0x7B032cBB00AD7438E802A66D8b64761A06E5df22) | | Degen | 666666666 | `0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94` | [explorer.degen.tips](https://explorer.degen.tips/address/0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94) | | Dogechain | 2000 | `0xd01A3E167d59FF98c983E83BAa5da0C3e0ADe726` | [explorer.dogechain.dog](https://explorer.dogechain.dog/address/0xd01A3E167d59FF98c983E83BAa5da0C3e0ADe726) | | DuckChain | 5545 | `0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64` | [scan.duckchain.io](https://scan.duckchain.io/address/0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64) | | Endurance | 648 | `0xed9a722c543883FB7e07E78F3879762DE09eA7D5` | [explorer-endurance.fusionist.io](https://explorer-endurance.fusionist.io/address/0xed9a722c543883FB7e07E78F3879762DE09eA7D5) | | Ethereum | 1 | `0x5E532F7B610618eE73C2B462978e94CB1F7995Ce` | [etherscan.io](https://etherscan.io/address/0x5E532F7B610618eE73C2B462978e94CB1F7995Ce) | | Everclear | 25327 | `0x92cdbF0Ccdf8E93467FA858fb986fa650A02f2A8` | [scan.everclear.org](https://scan.everclear.org/address/0x92cdbF0Ccdf8E93467FA858fb986fa650A02f2A8) | | Evmos EVM | 9001 | `0x93D41E41cA545a35A81d11b08D2eE8b852C768df` | [www.mintscan.io](https://www.mintscan.io/evmos/address/0x93D41E41cA545a35A81d11b08D2eE8b852C768df) | | Fantom Opera | 250 | `0xeE8C0E1EeBfFCC451a013336386eA53E42a44451` | [ftmscan.com](https://ftmscan.com/address/0xeE8C0E1EeBfFCC451a013336386eA53E42a44451) | | Flame | 253368190 | `0x9534122Aae7978dB8f5f10dF4432233c53e820A1` | [explorer.flame.astria.org](https://explorer.flame.astria.org/address/0x9534122Aae7978dB8f5f10dF4432233c53e820A1) | | Flare | 14 | `0x87bDFaBbCC36D8B1aEdA871Cd54b2e86C7a4d597` | [flare-explorer.flare.network](https://flare-explorer.flare.network/address/0x87bDFaBbCC36D8B1aEdA871Cd54b2e86C7a4d597) | | EVM on Flow | 1000000747 | `0x349831a180eE4265008C5FFB9465Ff97c1CF0028` | [evm.flowscan.io](https://evm.flowscan.io/address/0x349831a180eE4265008C5FFB9465Ff97c1CF0028) | | Form | 478 | `0x93D41E41cA545a35A81d11b08D2eE8b852C768df` | [explorer.form.network](https://explorer.form.network/address/0x93D41E41cA545a35A81d11b08D2eE8b852C768df) | | Fraxtal | 252 | `0xbed53B5C5BCE9433f25A2A702e6df13E22d84Ae9` | [fraxscan.com](https://fraxscan.com/address/0xbed53B5C5BCE9433f25A2A702e6df13E22d84Ae9) | | Fuse | 122 | `0x2351FBe24C1212F253b7a300ff0cBCFd97952a19` | [explorer.fuse.io](https://explorer.fuse.io/address/0x2351FBe24C1212F253b7a300ff0cBCFd97952a19) | | Gnosis | 100 | `0xBE70Ab882D1F7E37e04a70CDd9Ec23b37a234064` | [gnosisscan.io](https://gnosisscan.io/address/0xBE70Ab882D1F7E37e04a70CDd9Ec23b37a234064) | | Gravity Alpha Mainnet | 1625 | `0xc5D6aCaafBCcEC6D7fD7d92F4509befce641c563` | [explorer.gravity.xyz](https://explorer.gravity.xyz/address/0xc5D6aCaafBCcEC6D7fD7d92F4509befce641c563) | | Guru Network | 260 | `0xb201817dFdd822B75Fa9b595457E6Ee466a7C187` | [blockscout.gurunetwork.ai](https://blockscout.gurunetwork.ai/address/0xb201817dFdd822B75Fa9b595457E6Ee466a7C187) | | Harmony One | 1666600000 | `0xeE8C0E1EeBfFCC451a013336386eA53E42a44451` | [explorer.harmony.one](https://explorer.harmony.one/address/0xeE8C0E1EeBfFCC451a013336386eA53E42a44451) | | Hemi Network | 43111 | `0xc31B1E6c8E706cF40842C3d728985Cd2f85413eD` | [explorer.hemi.xyz](https://explorer.hemi.xyz/address/0xc31B1E6c8E706cF40842C3d728985Cd2f85413eD) | | Immutable zkEVM | 1000013371 | `0x4ef363Da5bb09CC6aeA16973786963d0C8820778` | [explorer.immutable.com](https://explorer.immutable.com/address/0x4ef363Da5bb09CC6aeA16973786963d0C8820778) | | Injective EVM | 2525 | `0xfB8cea1c7F45608Da30655b50bbF355D123A4358` | [inevm.calderaexplorer.xyz](https://inevm.calderaexplorer.xyz/address/0xfB8cea1c7F45608Da30655b50bbF355D123A4358) | | Ink | 57073 | `0xF457D831d9F55e87B2F0b35AD6D033fd6b4181Ed` | [explorer.inkonchain.com](https://explorer.inkonchain.com/address/0xF457D831d9F55e87B2F0b35AD6D033fd6b4181Ed) | | Kaia | 8217 | `0xeE8C0E1EeBfFCC451a013336386eA53E42a44451` | [kaiascope.com](https://kaiascope.com/address/0xeE8C0E1EeBfFCC451a013336386eA53E42a44451) | | Kroma | 255 | `0x1A4F09A615aA4a35E5a146DC2fa19975bebF21A5` | [blockscout.kroma.network](https://blockscout.kroma.network/address/0x1A4F09A615aA4a35E5a146DC2fa19975bebF21A5) | | Linea | 59144 | `0xD59dA396F162Ed93a41252Cebb8d5DD4F093238C` | [lineascan.build](https://lineascan.build/address/0xD59dA396F162Ed93a41252Cebb8d5DD4F093238C) | | Lisk | 1135 | `0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94` | [blockscout.lisk.com](https://blockscout.lisk.com/address/0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94) | | LUKSO | 42 | `0x1A4F09A615aA4a35E5a146DC2fa19975bebF21A5` | [explorer.execution.mainnet.lukso.network](https://explorer.execution.mainnet.lukso.network/address/0x1A4F09A615aA4a35E5a146DC2fa19975bebF21A5) | | Lumia Prism | 1000073017 | `0xEeb5a99a75585fe137c83E7b62b74f87264A5481` | [explorer.lumia.org](https://explorer.lumia.org/address/0xEeb5a99a75585fe137c83E7b62b74f87264A5481) | | Manta Pacific | 169 | `0x693A4cE39d99e46B04cb562329e3F0141cA17331` | [pacific-explorer.manta.network](https://pacific-explorer.manta.network/address/0x693A4cE39d99e46B04cb562329e3F0141cA17331) | | Mantle | 5000 | `0x45285463352c53a481e882cD5E2AF2E25BBdAd0D` | [explorer.mantle.xyz](https://explorer.mantle.xyz/address/0x45285463352c53a481e882cD5E2AF2E25BBdAd0D) | | Merlin | 4200 | `0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7` | [scan.merlinchain.io](https://scan.merlinchain.io/address/0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7) | | Metal L2 | 1000001750 | `0x16625230dD6cFe1B2bec3eCaEc7d43bA3A902CD6` | [explorer.metall2.com](https://explorer.metall2.com/address/0x16625230dD6cFe1B2bec3eCaEc7d43bA3A902CD6) | | Metis Andromeda | 1088 | `0xb2674E213019972f937CCFc5e23BF963D915809e` | [andromeda-explorer.metis.io](https://andromeda-explorer.metis.io/address/0xb2674E213019972f937CCFc5e23BF963D915809e) | | Mint | 185 | `0xb2674E213019972f937CCFc5e23BF963D915809e` | [explorer.mintchain.io](https://explorer.mintchain.io/address/0xb2674E213019972f937CCFc5e23BF963D915809e) | | Mode | 34443 | `0x6e1B9f776bd415d7cC3C7458A5f0d801016918f8` | [explorer.mode.network](https://explorer.mode.network/address/0x6e1B9f776bd415d7cC3C7458A5f0d801016918f8) | | Molten | 360 | `0xd01A3E167d59FF98c983E83BAa5da0C3e0ADe726` | [molten.calderaexplorer.xyz](https://molten.calderaexplorer.xyz/address/0xd01A3E167d59FF98c983E83BAa5da0C3e0ADe726) | | Moonbeam | 1284 | `0xc4482f66191754a8629D35289043C4EB0285F10E` | [moonscan.io](https://moonscan.io/address/0xc4482f66191754a8629D35289043C4EB0285F10E) | | Morph | 2818 | `0xeE8C0E1EeBfFCC451a013336386eA53E42a44451` | [explorer.morphl2.io](https://explorer.morphl2.io/address/0xeE8C0E1EeBfFCC451a013336386eA53E42a44451) | | Nero | 1689 | `0x2351FBe24C1212F253b7a300ff0cBCFd97952a19` | [www.neroscan.io](https://www.neroscan.io/address/0x2351FBe24C1212F253b7a300ff0cBCFd97952a19) | | Oort | 970 | `0x7c58Cadcc2b60ACF794eE1843488d6f5703f76BE` | [mainnet-scan.oortech.com](https://mainnet-scan.oortech.com/address/0x7c58Cadcc2b60ACF794eE1843488d6f5703f76BE) | | Optimism | 10 | `0x03D6cC17d45E9EA27ED757A8214d1F07F7D901aD` | [optimistic.etherscan.io](https://optimistic.etherscan.io/address/0x03D6cC17d45E9EA27ED757A8214d1F07F7D901aD) | | Orderly L2 | 291 | `0xeE8C0E1EeBfFCC451a013336386eA53E42a44451` | [explorer.orderly.network](https://explorer.orderly.network/address/0xeE8C0E1EeBfFCC451a013336386eA53E42a44451) | | Polygon | 137 | `0xF163949AD9F88977ebF649D0461398Ca752E64B9` | [polygonscan.com](https://polygonscan.com/address/0xF163949AD9F88977ebF649D0461398Ca752E64B9) | | Polygon zkEVM | 1101 | `0x20a0A32a110362920597F72974E1E0d7e25cA20a` | [zkevm.polygonscan.com](https://zkevm.polygonscan.com/address/0x20a0A32a110362920597F72974E1E0d7e25cA20a) | | Polynomial | 1000008008 | `0xDDE46032Baf4da13fDD79BF9dfbaA2749615C409` | [polynomialscan.io](https://polynomialscan.io/address/0xDDE46032Baf4da13fDD79BF9dfbaA2749615C409) | | Prom | 227 | `0x5b3EeADcc0E2d4284eA6816e2E503c24d30a9E54` | [prom-blockscout.eu-north-2.gateway.fm](https://prom-blockscout.eu-north-2.gateway.fm/address/0x5b3EeADcc0E2d4284eA6816e2E503c24d30a9E54) | | Proof of Play Apex | 70700 | `0xb2674E213019972f937CCFc5e23BF963D915809e` | [explorer.apex.proofofplay.com](https://explorer.apex.proofofplay.com/address/0xb2674E213019972f937CCFc5e23BF963D915809e) | | RARI Chain | 1000012617 | `0xf6fB78dc009C1A4286c0E7d90C10c9E8906a62Ea` | [mainnet.explorer.rarichain.org](https://mainnet.explorer.rarichain.org/address/0xf6fB78dc009C1A4286c0E7d90C10c9E8906a62Ea) | | re.al | 111188 | `0xc0C2dB448fC2c84213394Fcb93a3C467e50ECa9E` | [explorer.re.al](https://explorer.re.al/address/0xc0C2dB448fC2c84213394Fcb93a3C467e50ECa9E) | | Redstone | 690 | `0x7a4d31a686A36285d68e14EDD53631417eB19603` | [explorer.redstone.xyz](https://explorer.redstone.xyz/address/0x7a4d31a686A36285d68e14EDD53631417eB19603) | | Rivalz | 753 | `0x1A4F09A615aA4a35E5a146DC2fa19975bebF21A5` | [rivalz.calderaexplorer.xyz](https://rivalz.calderaexplorer.xyz/address/0x1A4F09A615aA4a35E5a146DC2fa19975bebF21A5) | | Rootstock | 1000000030 | `0x7279B1e11142078b8dC9e69620200f4C84FB8aaa` | [rootstock.blockscout.com](https://rootstock.blockscout.com/address/0x7279B1e11142078b8dC9e69620200f4C84FB8aaa) | | Sanko | 1996 | `0x7a4d31a686A36285d68e14EDD53631417eB19603` | [explorer.sanko.xyz](https://explorer.sanko.xyz/address/0x7a4d31a686A36285d68e14EDD53631417eB19603) | | Scroll | 534352 | `0x0B48a744698ba8dFa514742dFEB6728f52fD66f7` | [scrollscan.com](https://scrollscan.com//address/0x0B48a744698ba8dFa514742dFEB6728f52fD66f7) | | Sei | 1329 | `0xBcaedE97a98573A88242B3b0CB0A255F3f90d4d5` | [seitrace.com](https://seitrace.com/address/0xBcaedE97a98573A88242B3b0CB0A255F3f90d4d5) | | Shibarium | 109 | `0xf3dFf6747E7FC74B431C943961054B7BF6309d8a` | [shibariumscan.io](https://shibariumscan.io/address/0xf3dFf6747E7FC74B431C943961054B7BF6309d8a) | | SnaxChain | 2192 | `0xeE8C0E1EeBfFCC451a013336386eA53E42a44451` | [explorer.snaxchain.io](https://explorer.snaxchain.io/address/0xeE8C0E1EeBfFCC451a013336386eA53E42a44451) | | Soneium | 1868 | `0x93D41E41cA545a35A81d11b08D2eE8b852C768df` | [soneium.blockscout.com](https://soneium.blockscout.com/address/0x93D41E41cA545a35A81d11b08D2eE8b852C768df) | | Sonic | 146 | `0x93D41E41cA545a35A81d11b08D2eE8b852C768df` | [sonicscan.org](https://sonicscan.org/address/0x93D41E41cA545a35A81d11b08D2eE8b852C768df) | | Superposition | 1000055244 | `0xCE8260c1b5cF2fAD15bb4B6542716b050Fdf35c9` | [explorer.superposition.so](https://explorer.superposition.so//address/0xCE8260c1b5cF2fAD15bb4B6542716b050Fdf35c9) | | Superseed | 5330 | `0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64` | [explorer.superseed.xyz](https://explorer.superseed.xyz/address/0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64) | | Swell | 1923 | `0xe9E3444DDD80c50276c0Fcf316026f6d7fEc2c47` | [explorer.swellnetwork.io](https://explorer.swellnetwork.io/address/0xe9E3444DDD80c50276c0Fcf316026f6d7fEc2c47) | | Taiko | 167000 | `0x1F8CF09F060A2AE962c0Bb1F92e209a1E7b0E10B` | [taikoscan.io](https://taikoscan.io/address/0x1F8CF09F060A2AE962c0Bb1F92e209a1E7b0E10B) | | Tangle | 5845 | `0x67F36550b73B731e5b2FC44E4F8f250d89c87bD6` | [explorer.tangle.tools](https://explorer.tangle.tools/address/0x67F36550b73B731e5b2FC44E4F8f250d89c87bD6) | | Telos EVM | 40 | `0xF457D831d9F55e87B2F0b35AD6D033fd6b4181Ed` | [www.teloscan.io](https://www.teloscan.io/address/0xF457D831d9F55e87B2F0b35AD6D033fd6b4181Ed) | | Torus | 21000 | `0x1A4F09A615aA4a35E5a146DC2fa19975bebF21A5` | [blockscout.torus.network](https://blockscout.torus.network/address/0x1A4F09A615aA4a35E5a146DC2fa19975bebF21A5) | | Unichain | 130 | `0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64` | [unichain.blockscout.com](https://unichain.blockscout.com/address/0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64) | | Vana | 1480 | `0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64` | [vanascan.io](https://vanascan.io/address/0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64) | | Viction | 88 | `0xc11f8Cf2343d3788405582F65B8af6A4F7a6FfC8` | [www.vicscan.xyz](https://www.vicscan.xyz/address/0xc11f8Cf2343d3788405582F65B8af6A4F7a6FfC8) | | World Chain | 480 | `0x473884010F0C1742DA8Ad01E7E295624B931076b` | [worldchain-mainnet-explorer.alchemy.com](https://worldchain-mainnet-explorer.alchemy.com/address/0x473884010F0C1742DA8Ad01E7E295624B931076b) | | Xai | 660279 | `0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94` | [explorer.xai-chain.net](https://explorer.xai-chain.net/address/0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94) | | XLayer | 196 | `0x03cF708E42C89623bd83B281A56935cB562b9258` | [www.oklink.com](https://www.oklink.com/xlayer/address/0x03cF708E42C89623bd83B281A56935cB562b9258) | | XPLA | 37 | `0x5B24EE24049582fF74c1d311d72c70bA5B76a554` | [explorer.xpla.io](https://explorer.xpla.io/mainnet/address/0x5B24EE24049582fF74c1d311d72c70bA5B76a554) | | ZetaChain | 7000 | `0x3AdCBc94ab8C48EC52D06dc65Bb787fD1981E3d5` | [explorer.zetachain.com](https://explorer.zetachain.com/address/0x3AdCBc94ab8C48EC52D06dc65Bb787fD1981E3d5) | | Zircuit | 48900 | `0x51545389E04c2Ac07d98A40b85d29B480a2AF6ce` | [explorer.zircuit.com](https://explorer.zircuit.com/address/0x51545389E04c2Ac07d98A40b85d29B480a2AF6ce) | | Zora | 7777777 | `0x11b76D93a9D39Eb51F54eBf5566308640cDe882b` | [explorer.zora.energy](https://explorer.zora.energy/address/0x11b76D93a9D39Eb51F54eBf5566308640cDe882b) | | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Aleph Zero EVM Testnet | 2039 | `0xe036768e48Cb0D42811d2bF0748806FCcBfCd670` | [evm-explorer-testnet.alephzero.org](https://evm-explorer-testnet.alephzero.org/address/0xe036768e48Cb0D42811d2bF0748806FCcBfCd670) | | Alfajores | 44787 | `0xEbA64c8a9b4a61a9210d5fe7E4375380999C821b` | [explorer.celo.org](https://explorer.celo.org/alfajores/address/0xEbA64c8a9b4a61a9210d5fe7E4375380999C821b) | | Arbitrum Sepolia | 421614 | `0x20cC3a33C49fa13627303669edf2DcA7F1E76a50` | [sepolia.arbiscan.io](https://sepolia.arbiscan.io/address/0x20cC3a33C49fa13627303669edf2DcA7F1E76a50) | | Arcadia Testnet v2 | 1098411886 | `0x80fE4Cb8c70fc60B745d4ffD4403c27a8cBC9e02` | [explorer.khalani.network](https://explorer.khalani.network/address/0x80fE4Cb8c70fc60B745d4ffD4403c27a8cBC9e02) | | Base Sepolia | 84532 | `0xd876C01aB40e8cE42Db417fBC79c726d45504dE4` | [sepolia.basescan.org](https://sepolia.basescan.org/address/0xd876C01aB40e8cE42Db417fBC79c726d45504dE4) | | Berachain bArtio | 80084 | `0xa3AB7E6cE24E6293bD5320A53329Ef2f4DE73fCA` | [bartio.beratrail.io](https://bartio.beratrail.io//address/0xa3AB7E6cE24E6293bD5320A53329Ef2f4DE73fCA) | | BSC Testnet | 97 | `0x6d2B3e304E58c2a19f1492E7cf15CaF63Ce6e0d2` | [testnet.bscscan.com](https://testnet.bscscan.com/address/0x6d2B3e304E58c2a19f1492E7cf15CaF63Ce6e0d2) | | Camp Network Testnet V2 | 325000 | `0x867f2089D09903f208AeCac84E599B90E5a4A821` | [camp-network-testnet.blockscout.com](https://camp-network-testnet.blockscout.com/address/0x867f2089D09903f208AeCac84E599B90E5a4A821) | | Citrea Testnet | 5115 | `0xB5fB1F5410a2c2b7deD462d018541383968cB01c` | [explorer.testnet.citrea.xyz](https://explorer.testnet.citrea.xyz/address/0xB5fB1F5410a2c2b7deD462d018541383968cB01c) | | Eco Testnet | 471923 | `0x2C6dD6768E669EDB7b53f26067C1C4534862c3de` | [eco-testnet.explorer.caldera.xyz](https://eco-testnet.explorer.caldera.xyz//address/0x2C6dD6768E669EDB7b53f26067C1C4534862c3de) | | Form Testnet | 132902 | `0x867f2089D09903f208AeCac84E599B90E5a4A821` | [sepolia-explorer.form.network](https://sepolia-explorer.form.network/address/0x867f2089D09903f208AeCac84E599B90E5a4A821) | | Fuji | 43113 | `0xeEF6933122894fF217a7dd07510b3D64b747e29b` | [testnet.snowtrace.io](https://testnet.snowtrace.io/address/0xeEF6933122894fF217a7dd07510b3D64b747e29b) | | Holesky | 17000 | `0xD31eD5a3D26c9787Ab607B0c364B21218D0f8F7b` | [holesky.etherscan.io](https://holesky.etherscan.io/address/0xD31eD5a3D26c9787Ab607B0c364B21218D0f8F7b) | | Hyperliquid EVM Testnet | 998 | `0xFfa913705484C9BAea32Ffe9945BeA099A1DFF72` | [explorer.hyperlend.finance](https://explorer.hyperlend.finance/address/0xFfa913705484C9BAea32Ffe9945BeA099A1DFF72) | | Odyssey Testnet | 911867 | `0xBdf49bE2201A1c4B13023F0a407196C6Adb32680` | [odyssey-explorer.ithaca.xyz](https://odyssey-explorer.ithaca.xyz/address/0xBdf49bE2201A1c4B13023F0a407196C6Adb32680) | | Optimism Sepolia | 11155420 | `0x3F100cBBE5FD5466BdB4B3a15Ac226957e7965Ad` | [sepolia-optimistic.etherscan.io](https://sepolia-optimistic.etherscan.io/address/0x3F100cBBE5FD5466BdB4B3a15Ac226957e7965Ad) | | Plume Testnet | 161221135 | `0xB6F8aA9B1b314A6E6DFB465DD3e0E95936347517` | [plume-testnet.explorer.caldera.xyz](https://plume-testnet.explorer.caldera.xyz/address/0xB6F8aA9B1b314A6E6DFB465DD3e0E95936347517) | | Polygon Amoy | 80002 | `0xC60C145f1e1904f9d6483A611BF1416697CCc1FE` | [amoy.polygonscan.com](https://amoy.polygonscan.com/address/0xC60C145f1e1904f9d6483A611BF1416697CCc1FE) | | Scroll Sepolia | 534351 | `0xe17c37212d785760E8331D4A4395B17b34Ba8cDF` | [sepolia.scrollscan.dev](https://sepolia.scrollscan.dev//address/0xe17c37212d785760E8331D4A4395B17b34Ba8cDF) | | Sepolia | 11155111 | `0x8e131c8aE5BF1Ed38D05a00892b6001a7d37739d` | [sepolia.etherscan.io](https://sepolia.etherscan.io/address/0x8e131c8aE5BF1Ed38D05a00892b6001a7d37739d) | | Soneium Minato Testnet | 1946 | `0x867f2089D09903f208AeCac84E599B90E5a4A821` | [explorer-testnet.soneium.org](https://explorer-testnet.soneium.org/address/0x867f2089D09903f208AeCac84E599B90E5a4A821) | | Sonic Testnet | 64165 | `0x39c85C84876479694A2470c0E8075e9d68049aFc` | [testnet.soniclabs.com](https://testnet.soniclabs.com/address/0x39c85C84876479694A2470c0E8075e9d68049aFc) | | SUAVE Toliman Testnet | 33626250 | `0x867f2089D09903f208AeCac84E599B90E5a4A821` | [explorer.toliman.suave.flashbots.net](https://explorer.toliman.suave.flashbots.net/address/0x867f2089D09903f208AeCac84E599B90E5a4A821) | | Superposition Testnet | 98985 | `0x3572a9d808738922194921b275B2A55414BcDA57` | [testnet-explorer.superposition.so](https://testnet-explorer.superposition.so/address/0x3572a9d808738922194921b275B2A55414BcDA57) | | Tangle Testnet | 3799 | `0x31196df48eb78756C4036aA6b81e8F42b0301fAe` | [testnet-explorer.tangle.tools](https://testnet-explorer.tangle.tools//address/0x31196df48eb78756C4036aA6b81e8F42b0301fAe) | | Unichain Testnet | 1301 | `0x4eC139a771eBdD3b0a0b67bb7E08960210882d44` | [unichain-sepolia.blockscout.com](https://unichain-sepolia.blockscout.com/address/0x4eC139a771eBdD3b0a0b67bb7E08960210882d44) | --- # Interchain Gas Paymaster (Hook) | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) Interchain Gas Paymaster (Hook) =============================== * Mainnet * Testnet | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Aleph Zero EVM | 1000041455 | `0x9c2214467Daf9e2e1F45b36d08ce0b9C65BFeA88` | [evm-explorer.alephzero.org](https://evm-explorer.alephzero.org/address/0x9c2214467Daf9e2e1F45b36d08ce0b9C65BFeA88) | | Ancient8 | 888888888 | `0x8F1E22d309baa69D398a03cc88E9b46037e988AA` | [scan.ancient8.gg](https://scan.ancient8.gg/address/0x8F1E22d309baa69D398a03cc88E9b46037e988AA) | | ApeChain | 33139 | `0x18B0688990720103dB63559a3563f7E8d0f63EDb` | [apechain.calderaexplorer.xyz](https://apechain.calderaexplorer.xyz/address/0x18B0688990720103dB63559a3563f7E8d0f63EDb) | | AppChain | 466 | `0x28291a7062afA569104bEd52F7AcCA3dD2FafD11` | [explorer.appchain.xyz](https://explorer.appchain.xyz/address/0x28291a7062afA569104bEd52F7AcCA3dD2FafD11) | | Arbitrum | 42161 | `0x3b6044acd6767f017e99318AA6Ef93b7B06A5a22` | [arbiscan.io](https://arbiscan.io/address/0x3b6044acd6767f017e99318AA6Ef93b7B06A5a22) | | Arbitrum Nova | 42170 | `0x145566181A18E23bB6a8A3eC6D87765542A7F754` | [nova.arbiscan.io](https://nova.arbiscan.io//address/0x145566181A18E23bB6a8A3eC6D87765542A7F754) | | Artela | 11820 | `0xc2466492C451E1AE49d8C874bB9f89293Aaad59b` | [artscan.artela.network](https://artscan.artela.network/address/0xc2466492C451E1AE49d8C874bB9f89293Aaad59b) | | Arthera | 10242 | `0xFb7D175d6F53800D68D32C3Fe1416807A394cC24` | [explorer.arthera.net](https://explorer.arthera.net/address/0xFb7D175d6F53800D68D32C3Fe1416807A394cC24) | | Astar | 592 | `0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd` | [astar.blockscout.com](https://astar.blockscout.com/address/0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd) | | Astar zkEVM | 3776 | `0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd` | [astar-zkevm.explorer.startale.com](https://astar-zkevm.explorer.startale.com/address/0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd) | | Aurora | 1313161554 | `0xc0C2dB448fC2c84213394Fcb93a3C467e50ECa9E` | [explorer.mainnet.aurora.dev](https://explorer.mainnet.aurora.dev/address/0xc0C2dB448fC2c84213394Fcb93a3C467e50ECa9E) | | Avalanche | 43114 | `0x95519ba800BBd0d34eeAE026fEc620AD978176C0` | [snowtrace.io](https://snowtrace.io/address/0x95519ba800BBd0d34eeAE026fEc620AD978176C0) | | B3 | 8333 | `0x145566181A18E23bB6a8A3eC6D87765542A7F754` | [explorer.b3.fun](https://explorer.b3.fun/address/0x145566181A18E23bB6a8A3eC6D87765542A7F754) | | Base | 8453 | `0xc3F23848Ed2e04C0c6d41bd7804fa8f89F940B94` | [basescan.org](https://basescan.org/address/0xc3F23848Ed2e04C0c6d41bd7804fa8f89F940B94) | | Bitlayer | 200901 | `0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd` | [www.btrscan.com](https://www.btrscan.com/address/0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd) | | Blast | 81457 | `0xB3fCcD379ad66CED0c91028520C64226611A48c9` | [blastexplorer.io](https://blastexplorer.io/address/0xB3fCcD379ad66CED0c91028520C64226611A48c9) | | BOB | 60808 | `0x62B7592C1B6D1E43f4630B8e37f4377097840C05` | [explorer.gobob.xyz](https://explorer.gobob.xyz/address/0x62B7592C1B6D1E43f4630B8e37f4377097840C05) | | Boba Mainnet | 288 | `0x9534122Aae7978dB8f5f10dF4432233c53e820A1` | [bobascan.com](https://bobascan.com/address/0x9534122Aae7978dB8f5f10dF4432233c53e820A1) | | Binance Smart Chain | 56 | `0x78E25e7f84416e69b9339B0A6336EB6EFfF6b451` | [bscscan.com](https://bscscan.com/address/0x78E25e7f84416e69b9339B0A6336EB6EFfF6b451) | | B² Network | 223 | `0x70EbA87Cd15616f32C736B3f3BdCfaeD0713a82B` | [explorer.bsquared.network](https://explorer.bsquared.network/address/0x70EbA87Cd15616f32C736B3f3BdCfaeD0713a82B) | | Celo | 42220 | `0x571f1435613381208477ac5d6974310d88AC7cB7` | [celoscan.io](https://celoscan.io/address/0x571f1435613381208477ac5d6974310d88AC7cB7) | | CheeseChain | 383353 | `0x7E27456a839BFF31CA642c060a2b68414Cb6e503` | [fetascan.xyz](https://fetascan.xyz/address/0x7E27456a839BFF31CA642c060a2b68414Cb6e503) | | Chiliz | 1000088888 | `0x561BcA8D862536CD9C88f332C1A1Da0fC8F96e40` | [chiliscan.com](https://chiliscan.com/address/0x561BcA8D862536CD9C88f332C1A1Da0fC8F96e40) | | Conflux eSpace | 1030 | `0xDf178647caB5e0222F4B53C57274FD2A03BEaed6` | [evm.confluxscan.net](https://evm.confluxscan.net/address/0xDf178647caB5e0222F4B53C57274FD2A03BEaed6) | | Conwai | 668668 | `0xDf178647caB5e0222F4B53C57274FD2A03BEaed6` | [conwai.calderaexplorer.xyz](https://conwai.calderaexplorer.xyz/address/0xDf178647caB5e0222F4B53C57274FD2A03BEaed6) | | Core | 1116 | `0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd` | [scan.coredao.org](https://scan.coredao.org/address/0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd) | | Corn | 21000000 | `0xDf178647caB5e0222F4B53C57274FD2A03BEaed6` | [cornscan.io](https://cornscan.io/address/0xDf178647caB5e0222F4B53C57274FD2A03BEaed6) | | Cyber | 7560 | `0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF` | [cyberscan.co](https://cyberscan.co/address/0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF) | | Degen | 666666666 | `0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF` | [explorer.degen.tips](https://explorer.degen.tips/address/0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF) | | Dogechain | 2000 | `0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd` | [explorer.dogechain.dog](https://explorer.dogechain.dog/address/0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd) | | DuckChain | 5545 | `0x9534122Aae7978dB8f5f10dF4432233c53e820A1` | [scan.duckchain.io](https://scan.duckchain.io/address/0x9534122Aae7978dB8f5f10dF4432233c53e820A1) | | Eclipse | 1408864445 | `ABb3i11z7wKoGCfeRQNQbVYWjAm7jG7HzZnDLV4RKRbK` | [explorer.eclipse.xyz](https://explorer.eclipse.xyz//address/ABb3i11z7wKoGCfeRQNQbVYWjAm7jG7HzZnDLV4RKRbK) | | Endurance | 648 | `0xB30EAB08aa87138D57168D0e236850A530f49921` | [explorer-endurance.fusionist.io](https://explorer-endurance.fusionist.io/address/0xB30EAB08aa87138D57168D0e236850A530f49921) | | Ethereum | 1 | `0x9e6B1022bE9BBF5aFd152483DAD9b88911bC8611` | [etherscan.io](https://etherscan.io/address/0x9e6B1022bE9BBF5aFd152483DAD9b88911bC8611) | | Everclear | 25327 | `0xb58257cc81E47EC72fD38aE16297048de23163b4` | [scan.everclear.org](https://scan.everclear.org/address/0xb58257cc81E47EC72fD38aE16297048de23163b4) | | Evmos EVM | 9001 | `0xDf178647caB5e0222F4B53C57274FD2A03BEaed6` | [www.mintscan.io](https://www.mintscan.io/evmos/address/0xDf178647caB5e0222F4B53C57274FD2A03BEaed6) | | Fantom Opera | 250 | `0x145566181A18E23bB6a8A3eC6D87765542A7F754` | [ftmscan.com](https://ftmscan.com/address/0x145566181A18E23bB6a8A3eC6D87765542A7F754) | | Flame | 253368190 | `0x61374178e45F65fF9D6252d017Cd580FC60B7654` | [explorer.flame.astria.org](https://explorer.flame.astria.org/address/0x61374178e45F65fF9D6252d017Cd580FC60B7654) | | Flare | 14 | `0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd` | [flare-explorer.flare.network](https://flare-explorer.flare.network/address/0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd) | | EVM on Flow | 1000000747 | `0x6AA10748a036a49Cb290C0e12B77319b76792D5E` | [evm.flowscan.io](https://evm.flowscan.io/address/0x6AA10748a036a49Cb290C0e12B77319b76792D5E) | | Form | 478 | `0xDf178647caB5e0222F4B53C57274FD2A03BEaed6` | [explorer.form.network](https://explorer.form.network/address/0xDf178647caB5e0222F4B53C57274FD2A03BEaed6) | | Fraxtal | 252 | `0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E` | [fraxscan.com](https://fraxscan.com/address/0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E) | | Fuse | 122 | `0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed` | [explorer.fuse.io](https://explorer.fuse.io/address/0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed) | | Gnosis | 100 | `0xDd260B99d302f0A3fF885728c086f729c06f227f` | [gnosisscan.io](https://gnosisscan.io/address/0xDd260B99d302f0A3fF885728c086f729c06f227f) | | Gravity Alpha Mainnet | 1625 | `0xf3dFf6747E7FC74B431C943961054B7BF6309d8a` | [explorer.gravity.xyz](https://explorer.gravity.xyz/address/0xf3dFf6747E7FC74B431C943961054B7BF6309d8a) | | Guru Network | 260 | `0xA9D06082F4AA449D95b49D85F27fdC0cFb491d4b` | [blockscout.gurunetwork.ai](https://blockscout.gurunetwork.ai/address/0xA9D06082F4AA449D95b49D85F27fdC0cFb491d4b) | | Harmony One | 1666600000 | `0x145566181A18E23bB6a8A3eC6D87765542A7F754` | [explorer.harmony.one](https://explorer.harmony.one/address/0x145566181A18E23bB6a8A3eC6D87765542A7F754) | | Hemi Network | 43111 | `0xc2466492C451E1AE49d8C874bB9f89293Aaad59b` | [explorer.hemi.xyz](https://explorer.hemi.xyz/address/0xc2466492C451E1AE49d8C874bB9f89293Aaad59b) | | Immutable zkEVM | 1000013371 | `0xc6835e52C1b976F1ebC71Bc8919738E02849FdA9` | [explorer.immutable.com](https://explorer.immutable.com/address/0xc6835e52C1b976F1ebC71Bc8919738E02849FdA9) | | Injective EVM | 2525 | `0x19dc38aeae620380430C200a6E990D5Af5480117` | [inevm.calderaexplorer.xyz](https://inevm.calderaexplorer.xyz/address/0x19dc38aeae620380430C200a6E990D5Af5480117) | | Injective | 6909546 | `0x27ae52298e5b53b34b7ae0ca63e05845c31e1f59` | [www.mintscan.io](https://www.mintscan.io/injective/address/0x27ae52298e5b53b34b7ae0ca63e05845c31e1f59) | | Ink | 57073 | `0xc0C2dB448fC2c84213394Fcb93a3C467e50ECa9E` | [explorer.inkonchain.com](https://explorer.inkonchain.com/address/0xc0C2dB448fC2c84213394Fcb93a3C467e50ECa9E) | | Kaia | 8217 | `0x145566181A18E23bB6a8A3eC6D87765542A7F754` | [kaiascope.com](https://kaiascope.com/address/0x145566181A18E23bB6a8A3eC6D87765542A7F754) | | Kroma | 255 | `0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF` | [blockscout.kroma.network](https://blockscout.kroma.network/address/0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF) | | Linea | 59144 | `0x8105a095368f1a184CceA86cCe21318B5Ee5BE28` | [lineascan.build](https://lineascan.build/address/0x8105a095368f1a184CceA86cCe21318B5Ee5BE28) | | Lisk | 1135 | `0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF` | [blockscout.lisk.com](https://blockscout.lisk.com/address/0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF) | | LUKSO | 42 | `0x441a01Fca2eD731C0Fc4633998332f9FEDB17575` | [explorer.execution.mainnet.lukso.network](https://explorer.execution.mainnet.lukso.network/address/0x441a01Fca2eD731C0Fc4633998332f9FEDB17575) | | Lumia Prism | 1000073017 | `0xb7C9307fE90B9AB093c6D3EdeE3259f5378D5f03` | [explorer.lumia.org](https://explorer.lumia.org/address/0xb7C9307fE90B9AB093c6D3EdeE3259f5378D5f03) | | Manta Pacific | 169 | `0x0D63128D887159d63De29497dfa45AFc7C699AE4` | [pacific-explorer.manta.network](https://pacific-explorer.manta.network/address/0x0D63128D887159d63De29497dfa45AFc7C699AE4) | | Mantle | 5000 | `0x8105a095368f1a184CceA86cCe21318B5Ee5BE28` | [explorer.mantle.xyz](https://explorer.mantle.xyz/address/0x8105a095368f1a184CceA86cCe21318B5Ee5BE28) | | Merlin | 4200 | `0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF` | [scan.merlinchain.io](https://scan.merlinchain.io/address/0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF) | | Metal L2 | 1000001750 | `0x2b79328DA089E89A9E9c08732b56dd31F01011Db` | [explorer.metall2.com](https://explorer.metall2.com/address/0x2b79328DA089E89A9E9c08732b56dd31F01011Db) | | Metis Andromeda | 1088 | `0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF` | [andromeda-explorer.metis.io](https://andromeda-explorer.metis.io/address/0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF) | | Mint | 185 | `0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF` | [explorer.mintchain.io](https://explorer.mintchain.io/address/0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF) | | Mode | 34443 | `0x931dFCc8c1141D6F532FD023bd87DAe0080c835d` | [explorer.mode.network](https://explorer.mode.network/address/0x931dFCc8c1141D6F532FD023bd87DAe0080c835d) | | Molten | 360 | `0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd` | [molten.calderaexplorer.xyz](https://molten.calderaexplorer.xyz/address/0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd) | | Moonbeam | 1284 | `0x14760E32C0746094cF14D97124865BC7F0F7368F` | [moonscan.io](https://moonscan.io/address/0x14760E32C0746094cF14D97124865BC7F0F7368F) | | Morph | 2818 | `0x145566181A18E23bB6a8A3eC6D87765542A7F754` | [explorer.morphl2.io](https://explorer.morphl2.io/address/0x145566181A18E23bB6a8A3eC6D87765542A7F754) | | Nero | 1689 | `0xc2466492C451E1AE49d8C874bB9f89293Aaad59b` | [www.neroscan.io](https://www.neroscan.io/address/0xc2466492C451E1AE49d8C874bB9f89293Aaad59b) | | Neutron | 1853125230 | `0x738a4454e066c3bcb48cb0f03dca1c69b3c3d5ffa4f4470096083f0680a169ac` | [www.mintscan.io](https://www.mintscan.io/neutron/address/0x738a4454e066c3bcb48cb0f03dca1c69b3c3d5ffa4f4470096083f0680a169ac) | | Oort | 970 | `0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86` | [mainnet-scan.oortech.com](https://mainnet-scan.oortech.com/address/0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86) | | Optimism | 10 | `0xD8A76C4D91fCbB7Cc8eA795DFDF870E48368995C` | [optimistic.etherscan.io](https://optimistic.etherscan.io/address/0xD8A76C4D91fCbB7Cc8eA795DFDF870E48368995C) | | Orderly L2 | 291 | `0x145566181A18E23bB6a8A3eC6D87765542A7F754` | [explorer.orderly.network](https://explorer.orderly.network/address/0x145566181A18E23bB6a8A3eC6D87765542A7F754) | | Polygon | 137 | `0x0071740Bf129b05C4684abfbBeD248D80971cce2` | [polygonscan.com](https://polygonscan.com/address/0x0071740Bf129b05C4684abfbBeD248D80971cce2) | | Polygon zkEVM | 1101 | `0x0D63128D887159d63De29497dfa45AFc7C699AE4` | [zkevm.polygonscan.com](https://zkevm.polygonscan.com/address/0x0D63128D887159d63De29497dfa45AFc7C699AE4) | | Polynomial | 1000008008 | `0x2f536FB7a37bd817Af644072a904Ddc02Dae429f` | [polynomialscan.io](https://polynomialscan.io/address/0x2f536FB7a37bd817Af644072a904Ddc02Dae429f) | | Prom | 227 | `0x282629Af1A2f9b8e2c5Cbc54C35C7989f21950c6` | [prom-blockscout.eu-north-2.gateway.fm](https://prom-blockscout.eu-north-2.gateway.fm/address/0x282629Af1A2f9b8e2c5Cbc54C35C7989f21950c6) | | Proof of Play Apex | 70700 | `0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF` | [explorer.apex.proofofplay.com](https://explorer.apex.proofofplay.com/address/0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF) | | RARI Chain | 1000012617 | `0xDDE46032Baf4da13fDD79BF9dfbaA2749615C409` | [mainnet.explorer.rarichain.org](https://mainnet.explorer.rarichain.org/address/0xDDE46032Baf4da13fDD79BF9dfbaA2749615C409) | | re.al | 111188 | `0x3071D4DA6020C956Fe15Bfd0a9Ca8D4574f16696` | [explorer.re.al](https://explorer.re.al/address/0x3071D4DA6020C956Fe15Bfd0a9Ca8D4574f16696) | | Redstone | 690 | `0x2Fa570E83009eaEef3a1cbd496a9a30F05266634` | [explorer.redstone.xyz](https://explorer.redstone.xyz/address/0x2Fa570E83009eaEef3a1cbd496a9a30F05266634) | | Rivalz | 753 | `0x3cECBa60A580dE20CC57D87528953a00f4ED99EA` | [rivalz.calderaexplorer.xyz](https://rivalz.calderaexplorer.xyz/address/0x3cECBa60A580dE20CC57D87528953a00f4ED99EA) | | Rootstock | 1000000030 | `0x5ae1ECA065aC8ee92Ce98E584fc3CE43070020e7` | [rootstock.blockscout.com](https://rootstock.blockscout.com/address/0x5ae1ECA065aC8ee92Ce98E584fc3CE43070020e7) | | Sanko | 1996 | `0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF` | [explorer.sanko.xyz](https://explorer.sanko.xyz/address/0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF) | | Scroll | 534352 | `0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2` | [scrollscan.com](https://scrollscan.com//address/0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2) | | Sei | 1329 | `0xFC62DeF1f08793aBf0E67f69257c6be258194F72` | [seitrace.com](https://seitrace.com/address/0xFC62DeF1f08793aBf0E67f69257c6be258194F72) | | Shibarium | 109 | `0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd` | [shibariumscan.io](https://shibariumscan.io/address/0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd) | | SnaxChain | 2192 | `0x145566181A18E23bB6a8A3eC6D87765542A7F754` | [explorer.snaxchain.io](https://explorer.snaxchain.io/address/0x145566181A18E23bB6a8A3eC6D87765542A7F754) | | Solana | 1399811149 | `JAvHW21tYXE9dtdG83DReqU2b4LUexFuCbtJT5tF8X6M` | [solscan.io](https://solscan.io/address/JAvHW21tYXE9dtdG83DReqU2b4LUexFuCbtJT5tF8X6M) | | Soneium | 1868 | `0xDf178647caB5e0222F4B53C57274FD2A03BEaed6` | [soneium.blockscout.com](https://soneium.blockscout.com/address/0xDf178647caB5e0222F4B53C57274FD2A03BEaed6) | | Sonic | 146 | `0xDf178647caB5e0222F4B53C57274FD2A03BEaed6` | [sonicscan.org](https://sonicscan.org/address/0xDf178647caB5e0222F4B53C57274FD2A03BEaed6) | | SOON | 50075007 | `Dsem8R6mkrpNoNb6CRUEjEZRP2hKRC24thyCkVr8cNYZ` | [explorer.soo.network](https://explorer.soo.network//address/Dsem8R6mkrpNoNb6CRUEjEZRP2hKRC24thyCkVr8cNYZ) | | Superposition | 1000055244 | `0xa1c3884EbE24Cccb120B2E98a55f85140563aa4C` | [explorer.superposition.so](https://explorer.superposition.so//address/0xa1c3884EbE24Cccb120B2E98a55f85140563aa4C) | | Superseed | 5330 | `0x9534122Aae7978dB8f5f10dF4432233c53e820A1` | [explorer.superseed.xyz](https://explorer.superseed.xyz/address/0x9534122Aae7978dB8f5f10dF4432233c53e820A1) | | Swell | 1923 | `0x25EAC2007b0D40E3f0AF112FD346412321038719` | [explorer.swellnetwork.io](https://explorer.swellnetwork.io/address/0x25EAC2007b0D40E3f0AF112FD346412321038719) | | Taiko | 167000 | `0x273Bc6b01D9E88c064b6E5e409BdF998246AEF42` | [taikoscan.io](https://taikoscan.io/address/0x273Bc6b01D9E88c064b6E5e409BdF998246AEF42) | | Tangle | 5845 | `0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF` | [explorer.tangle.tools](https://explorer.tangle.tools/address/0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF) | | Telos EVM | 40 | `0xDf178647caB5e0222F4B53C57274FD2A03BEaed6` | [www.teloscan.io](https://www.teloscan.io/address/0xDf178647caB5e0222F4B53C57274FD2A03BEaed6) | | Torus | 21000 | `0x3cECBa60A580dE20CC57D87528953a00f4ED99EA` | [blockscout.torus.network](https://blockscout.torus.network/address/0x3cECBa60A580dE20CC57D87528953a00f4ED99EA) | | Treasure | 61166 | `0x388289cd5862e17AAfD6ffF7F46A9Ec48a969bCd` | [treasurescan.io](https://treasurescan.io/address/0x388289cd5862e17AAfD6ffF7F46A9Ec48a969bCd) | | Unichain | 130 | `0x9534122Aae7978dB8f5f10dF4432233c53e820A1` | [unichain.blockscout.com](https://unichain.blockscout.com/address/0x9534122Aae7978dB8f5f10dF4432233c53e820A1) | | Vana | 1480 | `0x9534122Aae7978dB8f5f10dF4432233c53e820A1` | [vanascan.io](https://vanascan.io/address/0x9534122Aae7978dB8f5f10dF4432233c53e820A1) | | Viction | 88 | `0x0D63128D887159d63De29497dfa45AFc7C699AE4` | [www.vicscan.xyz](https://www.vicscan.xyz/address/0x0D63128D887159d63De29497dfa45AFc7C699AE4) | | World Chain | 480 | `0x7E27456a839BFF31CA642c060a2b68414Cb6e503` | [worldchain-mainnet-explorer.alchemy.com](https://worldchain-mainnet-explorer.alchemy.com/address/0x7E27456a839BFF31CA642c060a2b68414Cb6e503) | | Xai | 660279 | `0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF` | [explorer.xai-chain.net](https://explorer.xai-chain.net/address/0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF) | | XLayer | 196 | `0x7E27456a839BFF31CA642c060a2b68414Cb6e503` | [www.oklink.com](https://www.oklink.com/xlayer/address/0x7E27456a839BFF31CA642c060a2b68414Cb6e503) | | XPLA | 37 | `0x8F23872dAb3B166cef411EeB6C391Ff6Ce419532` | [explorer.xpla.io](https://explorer.xpla.io/mainnet/address/0x8F23872dAb3B166cef411EeB6C391Ff6Ce419532) | | Zero Network | 543210 | `0x318FbdB17d4e743aBF3183658a4730777101B75C` | [zerion-explorer.vercel.app](https://zerion-explorer.vercel.app/address/0x318FbdB17d4e743aBF3183658a4730777101B75C) | | ZetaChain | 7000 | `0x931dFCc8c1141D6F532FD023bd87DAe0080c835d` | [explorer.zetachain.com](https://explorer.zetachain.com/address/0x931dFCc8c1141D6F532FD023bd87DAe0080c835d) | | Zircuit | 48900 | `0x03cF708E42C89623bd83B281A56935cB562b9258` | [explorer.zircuit.com](https://explorer.zircuit.com/address/0x03cF708E42C89623bd83B281A56935cB562b9258) | | zkLink Nova | 810180 | `0xB35eCb9714e8f48332Af22B48C18ca21E2607438` | [explorer.zklink.io](https://explorer.zklink.io/address/0xB35eCb9714e8f48332Af22B48C18ca21E2607438) | | zkSync | 324 | `0xf44AdA86a1f765A938d404699B8070Dd47bD2431` | [explorer.zksync.io](https://explorer.zksync.io/address/0xf44AdA86a1f765A938d404699B8070Dd47bD2431) | | Zora | 7777777 | `0x18B0688990720103dB63559a3563f7E8d0f63EDb` | [explorer.zora.energy](https://explorer.zora.energy/address/0x18B0688990720103dB63559a3563f7E8d0f63EDb) | | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Abstract Testnet | 11124 | `0xbAaE1B4e953190b05C757F69B2F6C46b9548fa4f` | [explorer.testnet.abs.xyz](https://explorer.testnet.abs.xyz/address/0xbAaE1B4e953190b05C757F69B2F6C46b9548fa4f) | | Aleph Zero EVM Testnet | 2039 | `0x867f2089D09903f208AeCac84E599B90E5a4A821` | [evm-explorer-testnet.alephzero.org](https://evm-explorer-testnet.alephzero.org/address/0x867f2089D09903f208AeCac84E599B90E5a4A821) | | Alfajores | 44787 | `0x44769b0f4a6f01339e131a691cc2eebbb519d297` | [explorer.celo.org](https://explorer.celo.org/alfajores/address/0x44769b0f4a6f01339e131a691cc2eebbb519d297) | | Arbitrum Sepolia | 421614 | `0xc756cFc1b7d0d4646589EDf10eD54b201237F5e8` | [sepolia.arbiscan.io](https://sepolia.arbiscan.io/address/0xc756cFc1b7d0d4646589EDf10eD54b201237F5e8) | | Arcadia Testnet v2 | 1098411886 | `0xfBeaF07855181f8476B235Cf746A7DF3F9e386Fb` | [explorer.khalani.network](https://explorer.khalani.network/address/0xfBeaF07855181f8476B235Cf746A7DF3F9e386Fb) | | Base Sepolia | 84532 | `0x28B02B97a850872C4D33C3E024fab6499ad96564` | [sepolia.basescan.org](https://sepolia.basescan.org/address/0x28B02B97a850872C4D33C3E024fab6499ad96564) | | Berachain bArtio | 80084 | `0x04438ef7622f5412f82915F59caD4f704C61eA48` | [bartio.beratrail.io](https://bartio.beratrail.io//address/0x04438ef7622f5412f82915F59caD4f704C61eA48) | | BSC Testnet | 97 | `0x0dD20e410bdB95404f71c5a4e7Fa67B892A5f949` | [testnet.bscscan.com](https://testnet.bscscan.com/address/0x0dD20e410bdB95404f71c5a4e7Fa67B892A5f949) | | Camp Network Testnet V2 | 325000 | `0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8` | [camp-network-testnet.blockscout.com](https://camp-network-testnet.blockscout.com/address/0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8) | | Citrea Testnet | 5115 | `0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A` | [explorer.testnet.citrea.xyz](https://explorer.testnet.citrea.xyz/address/0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A) | | Eco Testnet | 471923 | `0x28B02B97a850872C4D33C3E024fab6499ad96564` | [eco-testnet.explorer.caldera.xyz](https://eco-testnet.explorer.caldera.xyz//address/0x28B02B97a850872C4D33C3E024fab6499ad96564) | | Form Testnet | 132902 | `0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8` | [sepolia-explorer.form.network](https://sepolia-explorer.form.network/address/0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8) | | Fuji | 43113 | `0x6895d3916B94b386fAA6ec9276756e16dAe7480E` | [testnet.snowtrace.io](https://testnet.snowtrace.io/address/0x6895d3916B94b386fAA6ec9276756e16dAe7480E) | | Holesky | 17000 | `0x5CBf4e70448Ed46c2616b04e9ebc72D29FF0cfA9` | [holesky.etherscan.io](https://holesky.etherscan.io/address/0x5CBf4e70448Ed46c2616b04e9ebc72D29FF0cfA9) | | Hyperliquid EVM Testnet | 998 | `0x11918DC33E067C5DA83EEF58E50F856398b8Df4C` | [explorer.hyperlend.finance](https://explorer.hyperlend.finance/address/0x11918DC33E067C5DA83EEF58E50F856398b8Df4C) | | Ink Sepolia | 763373 | `0x54Bd02f0f20677e9846F8E9FdB1Abc7315C49C38` | [explorer-sepolia.inkonchain.com](https://explorer-sepolia.inkonchain.com/address/0x54Bd02f0f20677e9846F8E9FdB1Abc7315C49C38) | | Odyssey Testnet | 911867 | `0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f` | [odyssey-explorer.ithaca.xyz](https://odyssey-explorer.ithaca.xyz/address/0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f) | | Optimism Sepolia | 11155420 | `0x28B02B97a850872C4D33C3E024fab6499ad96564` | [sepolia-optimistic.etherscan.io](https://sepolia-optimistic.etherscan.io/address/0x28B02B97a850872C4D33C3E024fab6499ad96564) | | Plume Testnet | 161221135 | `0x28B02B97a850872C4D33C3E024fab6499ad96564` | [plume-testnet.explorer.caldera.xyz](https://plume-testnet.explorer.caldera.xyz/address/0x28B02B97a850872C4D33C3E024fab6499ad96564) | | Polygon Amoy | 80002 | `0x6c13643B3927C57DB92c790E4E3E7Ee81e13f78C` | [amoy.polygonscan.com](https://amoy.polygonscan.com/address/0x6c13643B3927C57DB92c790E4E3E7Ee81e13f78C) | | Scroll Sepolia | 534351 | `0x86fb9F1c124fB20ff130C41a79a432F770f67AFD` | [sepolia.scrollscan.dev](https://sepolia.scrollscan.dev//address/0x86fb9F1c124fB20ff130C41a79a432F770f67AFD) | | Sepolia | 11155111 | `0x6f2756380FD49228ae25Aa7F2817993cB74Ecc56` | [sepolia.etherscan.io](https://sepolia.etherscan.io/address/0x6f2756380FD49228ae25Aa7F2817993cB74Ecc56) | | Soneium Minato Testnet | 1946 | `0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8` | [explorer-testnet.soneium.org](https://explorer-testnet.soneium.org/address/0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8) | | Sonic Testnet | 64165 | `0xa3AB7E6cE24E6293bD5320A53329Ef2f4DE73fCA` | [testnet.soniclabs.com](https://testnet.soniclabs.com/address/0xa3AB7E6cE24E6293bD5320A53329Ef2f4DE73fCA) | | SUAVE Toliman Testnet | 33626250 | `0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8` | [explorer.toliman.suave.flashbots.net](https://explorer.toliman.suave.flashbots.net/address/0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8) | | Superposition Testnet | 98985 | `0xeC7eb4196Bd601DEa7585A744FbFB4CF11278450` | [testnet-explorer.superposition.so](https://testnet-explorer.superposition.so/address/0xeC7eb4196Bd601DEa7585A744FbFB4CF11278450) | | Treasure Topaz Testnet | 978658 | `0xbAaE1B4e953190b05C757F69B2F6C46b9548fa4f` | [topaz.treasurescan.io](https://topaz.treasurescan.io/address/0xbAaE1B4e953190b05C757F69B2F6C46b9548fa4f) | | Unichain Testnet | 1301 | `0xa3AB7E6cE24E6293bD5320A53329Ef2f4DE73fCA` | [unichain-sepolia.blockscout.com](https://unichain-sepolia.blockscout.com/address/0xa3AB7E6cE24E6293bD5320A53329Ef2f4DE73fCA) | --- # Mailbox | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) Mailbox ======= warning Hyperlane domain IDs are not guaranteed to match chain IDs. Please refer to the [Domains](/docs/reference/domains) page for the full list of Hyperlane domain IDs. * Mainnet * Testnet | Chain | Domain | Chain ID | Address | Explorer | | --- | --- | --- | --- | --- | | Aleph Zero EVM | 1000041455 | 41455 | `0x5bdADEAD721Eb4C4038fF7c989E3C7BbBA302435` | [evm-explorer.alephzero.org](https://evm-explorer.alephzero.org/address/0x5bdADEAD721Eb4C4038fF7c989E3C7BbBA302435) | | Ancient8 | 888888888 | 888888888 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [scan.ancient8.gg](https://scan.ancient8.gg/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | ApeChain | 33139 | 33139 | `0x7f50C5776722630a0024fAE05fDe8b47571D7B39` | [apechain.calderaexplorer.xyz](https://apechain.calderaexplorer.xyz/address/0x7f50C5776722630a0024fAE05fDe8b47571D7B39) | | AppChain | 466 | 466 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.appchain.xyz](https://explorer.appchain.xyz/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Arbitrum | 42161 | 42161 | `0x979Ca5202784112f4738403dBec5D0F3B9daabB9` | [arbiscan.io](https://arbiscan.io/address/0x979Ca5202784112f4738403dBec5D0F3B9daabB9) | | Arbitrum Nova | 42170 | 42170 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [nova.arbiscan.io](https://nova.arbiscan.io//address/0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7) | | Artela | 11820 | 11820 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [artscan.artela.network](https://artscan.artela.network/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Arthera | 10242 | 10242 | `0x473884010F0C1742DA8Ad01E7E295624B931076b` | [explorer.arthera.net](https://explorer.arthera.net/address/0x473884010F0C1742DA8Ad01E7E295624B931076b) | | Astar | 592 | 592 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [astar.blockscout.com](https://astar.blockscout.com/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Astar zkEVM | 3776 | 3776 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [astar-zkevm.explorer.startale.com](https://astar-zkevm.explorer.startale.com/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Aurora | 1313161554 | 1313161554 | `0x7f50C5776722630a0024fAE05fDe8b47571D7B39` | [explorer.mainnet.aurora.dev](https://explorer.mainnet.aurora.dev/address/0x7f50C5776722630a0024fAE05fDe8b47571D7B39) | | Avalanche | 43114 | 43114 | `0xFf06aFcaABaDDd1fb08371f9ccA15D73D51FeBD6` | [snowtrace.io](https://snowtrace.io/address/0xFf06aFcaABaDDd1fb08371f9ccA15D73D51FeBD6) | | B3 | 8333 | 8333 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [explorer.b3.fun](https://explorer.b3.fun/address/0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7) | | Base | 8453 | 8453 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [basescan.org](https://basescan.org/address/0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D) | | Bitlayer | 200901 | 200901 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [www.btrscan.com](https://www.btrscan.com/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Blast | 81457 | 81457 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [blastexplorer.io](https://blastexplorer.io/address/0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7) | | BOB | 60808 | 60808 | `0x8358D8291e3bEDb04804975eEa0fe9fe0fAfB147` | [explorer.gobob.xyz](https://explorer.gobob.xyz/address/0x8358D8291e3bEDb04804975eEa0fe9fe0fAfB147) | | Boba Mainnet | 288 | 288 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [bobascan.com](https://bobascan.com/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Binance Smart Chain | 56 | 56 | `0x2971b9Aec44bE4eb673DF1B88cDB57b96eefe8a4` | [bscscan.com](https://bscscan.com/address/0x2971b9Aec44bE4eb673DF1B88cDB57b96eefe8a4) | | B² Network | 223 | 223 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.bsquared.network](https://explorer.bsquared.network/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Celo | 42220 | 42220 | `0x50da3B3907A08a24fe4999F4Dcf337E8dC7954bb` | [celoscan.io](https://celoscan.io/address/0x50da3B3907A08a24fe4999F4Dcf337E8dC7954bb) | | CheeseChain | 383353 | 383353 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [fetascan.xyz](https://fetascan.xyz/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Chiliz | 1000088888 | 88888 | `0x248aDe14C0489E20C9a7Fea5F86DBfC3702208eF` | [chiliscan.com](https://chiliscan.com/address/0x248aDe14C0489E20C9a7Fea5F86DBfC3702208eF) | | Conflux eSpace | 1030 | 1030 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [evm.confluxscan.net](https://evm.confluxscan.net/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Conwai | 668668 | 668668 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [conwai.calderaexplorer.xyz](https://conwai.calderaexplorer.xyz/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Core | 1116 | 1116 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [scan.coredao.org](https://scan.coredao.org/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Corn | 21000000 | 21000000 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [cornscan.io](https://cornscan.io/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Cyber | 7560 | 7560 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [cyberscan.co](https://cyberscan.co/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Degen | 666666666 | 666666666 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.degen.tips](https://explorer.degen.tips/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Dogechain | 2000 | 2000 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.dogechain.dog](https://explorer.dogechain.dog/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | DuckChain | 5545 | 5545 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [scan.duckchain.io](https://scan.duckchain.io/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Eclipse | 1408864445 | 1408864445 | `EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y` | [explorer.eclipse.xyz](https://explorer.eclipse.xyz//address/EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y) | | Endurance | 648 | 648 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer-endurance.fusionist.io](https://explorer-endurance.fusionist.io/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Ethereum | 1 | 1 | `0xc005dc82818d67AF737725bD4bf75435d065D239` | [etherscan.io](https://etherscan.io/address/0xc005dc82818d67AF737725bD4bf75435d065D239) | | Everclear | 25327 | 25327 | `0x7f50C5776722630a0024fAE05fDe8b47571D7B39` | [scan.everclear.org](https://scan.everclear.org/address/0x7f50C5776722630a0024fAE05fDe8b47571D7B39) | | Evmos EVM | 9001 | 9001 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [www.mintscan.io](https://www.mintscan.io/evmos/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Fantom Opera | 250 | 250 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [ftmscan.com](https://ftmscan.com/address/0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7) | | Flame | 253368190 | 253368190 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.flame.astria.org](https://explorer.flame.astria.org/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Flare | 14 | 14 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [flare-explorer.flare.network](https://flare-explorer.flare.network/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | EVM on Flow | 1000000747 | 747 | `0xd9Cc2e652A162bb93173d1c44d46cd2c0bbDA59D` | [evm.flowscan.io](https://evm.flowscan.io/address/0xd9Cc2e652A162bb93173d1c44d46cd2c0bbDA59D) | | Form | 478 | 478 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.form.network](https://explorer.form.network/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Fraxtal | 252 | 252 | `0x2f9DB5616fa3fAd1aB06cB2C906830BA63d135e3` | [fraxscan.com](https://fraxscan.com/address/0x2f9DB5616fa3fAd1aB06cB2C906830BA63d135e3) | | Fuse | 122 | 122 | `0x3071D4DA6020C956Fe15Bfd0a9Ca8D4574f16696` | [explorer.fuse.io](https://explorer.fuse.io/address/0x3071D4DA6020C956Fe15Bfd0a9Ca8D4574f16696) | | Gnosis | 100 | 100 | `0xaD09d78f4c6b9dA2Ae82b1D34107802d380Bb74f` | [gnosisscan.io](https://gnosisscan.io/address/0xaD09d78f4c6b9dA2Ae82b1D34107802d380Bb74f) | | Gravity Alpha Mainnet | 1625 | 1625 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.gravity.xyz](https://explorer.gravity.xyz/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Guru Network | 260 | 260 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [blockscout.gurunetwork.ai](https://blockscout.gurunetwork.ai/address/0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7) | | Harmony One | 1666600000 | 1666600000 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [explorer.harmony.one](https://explorer.harmony.one/address/0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7) | | Hemi Network | 43111 | 43111 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.hemi.xyz](https://explorer.hemi.xyz/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Immutable zkEVM | 1000013371 | 13371 | `0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2` | [explorer.immutable.com](https://explorer.immutable.com/address/0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2) | | Injective EVM | 2525 | 2525 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [inevm.calderaexplorer.xyz](https://inevm.calderaexplorer.xyz/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Injective | 6909546 | injective-1 | `0x0f7fb53961d70687e352aa55cb329ca76edc0c19` | [www.mintscan.io](https://www.mintscan.io/injective/address/0x0f7fb53961d70687e352aa55cb329ca76edc0c19) | | Ink | 57073 | 57073 | `0x7f50C5776722630a0024fAE05fDe8b47571D7B39` | [explorer.inkonchain.com](https://explorer.inkonchain.com/address/0x7f50C5776722630a0024fAE05fDe8b47571D7B39) | | Kaia | 8217 | 8217 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [kaiascope.com](https://kaiascope.com/address/0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7) | | Kroma | 255 | 255 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [blockscout.kroma.network](https://blockscout.kroma.network/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Linea | 59144 | 59144 | `0x02d16BC51af6BfD153d67CA61754cF912E82C4d9` | [lineascan.build](https://lineascan.build/address/0x02d16BC51af6BfD153d67CA61754cF912E82C4d9) | | Lisk | 1135 | 1135 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [blockscout.lisk.com](https://blockscout.lisk.com/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | LUKSO | 42 | 42 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.execution.mainnet.lukso.network](https://explorer.execution.mainnet.lukso.network/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Lumia Prism | 1000073017 | 994873017 | `0x0dF25A2d59F03F039b56E90EdC5B89679Ace28Bc` | [explorer.lumia.org](https://explorer.lumia.org/address/0x0dF25A2d59F03F039b56E90EdC5B89679Ace28Bc) | | Manta Pacific | 169 | 169 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [pacific-explorer.manta.network](https://pacific-explorer.manta.network/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Mantle | 5000 | 5000 | `0x398633D19f4371e1DB5a8EFE90468eB70B1176AA` | [explorer.mantle.xyz](https://explorer.mantle.xyz/address/0x398633D19f4371e1DB5a8EFE90468eB70B1176AA) | | Merlin | 4200 | 4200 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [scan.merlinchain.io](https://scan.merlinchain.io/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Metal L2 | 1000001750 | 1750 | `0x730f8a4128Fa8c53C777B62Baa1abeF94cAd34a9` | [explorer.metall2.com](https://explorer.metall2.com/address/0x730f8a4128Fa8c53C777B62Baa1abeF94cAd34a9) | | Metis Andromeda | 1088 | 1088 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [andromeda-explorer.metis.io](https://andromeda-explorer.metis.io/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Mint | 185 | 185 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.mintchain.io](https://explorer.mintchain.io/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Mode | 34443 | 34443 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.mode.network](https://explorer.mode.network/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Molten | 360 | 360 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [molten.calderaexplorer.xyz](https://molten.calderaexplorer.xyz/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Moonbeam | 1284 | 1284 | `0x094d03E751f49908080EFf000Dd6FD177fd44CC3` | [moonscan.io](https://moonscan.io/address/0x094d03E751f49908080EFf000Dd6FD177fd44CC3) | | Morph | 2818 | 2818 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [explorer.morphl2.io](https://explorer.morphl2.io/address/0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7) | | Nero | 1689 | 1689 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [www.neroscan.io](https://www.neroscan.io/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Neutron | 1853125230 | neutron-1 | `0x848426d50eb2104d5c6381ec63757930b1c14659c40db8b8081e516e7c5238fc` | [www.mintscan.io](https://www.mintscan.io/neutron/address/0x848426d50eb2104d5c6381ec63757930b1c14659c40db8b8081e516e7c5238fc) | | Oort | 970 | 970 | `0xb129828B9EDa48192D0B2db35D0E40dCF51B3594` | [mainnet-scan.oortech.com](https://mainnet-scan.oortech.com/address/0xb129828B9EDa48192D0B2db35D0E40dCF51B3594) | | Optimism | 10 | 10 | `0xd4C1905BB1D26BC93DAC913e13CaCC278CdCC80D` | [optimistic.etherscan.io](https://optimistic.etherscan.io/address/0xd4C1905BB1D26BC93DAC913e13CaCC278CdCC80D) | | Orderly L2 | 291 | 291 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [explorer.orderly.network](https://explorer.orderly.network/address/0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7) | | Polygon | 137 | 137 | `0x5d934f4e2f797775e53561bB72aca21ba36B96BB` | [polygonscan.com](https://polygonscan.com/address/0x5d934f4e2f797775e53561bB72aca21ba36B96BB) | | Polygon zkEVM | 1101 | 1101 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [zkevm.polygonscan.com](https://zkevm.polygonscan.com/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Polynomial | 1000008008 | 8008 | `0x2f0E57527Bb37E5E064EF243fad56CCE6241906c` | [polynomialscan.io](https://polynomialscan.io/address/0x2f0E57527Bb37E5E064EF243fad56CCE6241906c) | | Prom | 227 | 227 | `0x5C02157068a52cEcfc98EDb6115DE6134EcB4764` | [prom-blockscout.eu-north-2.gateway.fm](https://prom-blockscout.eu-north-2.gateway.fm/address/0x5C02157068a52cEcfc98EDb6115DE6134EcB4764) | | Proof of Play Apex | 70700 | 70700 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.apex.proofofplay.com](https://explorer.apex.proofofplay.com/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | RARI Chain | 1000012617 | 1380012617 | `0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615` | [mainnet.explorer.rarichain.org](https://mainnet.explorer.rarichain.org/address/0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615) | | re.al | 111188 | 111188 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [explorer.re.al](https://explorer.re.al/address/0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D) | | Redstone | 690 | 690 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [explorer.redstone.xyz](https://explorer.redstone.xyz/address/0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D) | | Rivalz | 753 | 753 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [rivalz.calderaexplorer.xyz](https://rivalz.calderaexplorer.xyz/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Rootstock | 1000000030 | 30 | `0x96D51cc3f7500d501bAeB1A2a62BB96fa03532F8` | [rootstock.blockscout.com](https://rootstock.blockscout.com/address/0x96D51cc3f7500d501bAeB1A2a62BB96fa03532F8) | | Sanko | 1996 | 1996 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.sanko.xyz](https://explorer.sanko.xyz/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Scroll | 534352 | 534352 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [scrollscan.com](https://scrollscan.com//address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Sei | 1329 | 1329 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [seitrace.com](https://seitrace.com/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Shibarium | 109 | 109 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [shibariumscan.io](https://shibariumscan.io/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | SnaxChain | 2192 | 2192 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [explorer.snaxchain.io](https://explorer.snaxchain.io/address/0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7) | | Solana | 1399811149 | 1399811149 | `E588QtVUvresuXq2KoNEwAmoifCzYGpRBdHByN9KQMbi` | [solscan.io](https://solscan.io/address/E588QtVUvresuXq2KoNEwAmoifCzYGpRBdHByN9KQMbi) | | Soneium | 1868 | 1868 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [soneium.blockscout.com](https://soneium.blockscout.com/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Sonic | 146 | 146 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [sonicscan.org](https://sonicscan.org/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | SOON | 50075007 | 50075007 | `Mj7GE6LZiJUZFTgabmNkFoY2o6JCEwCMKopSUUC3kqj` | [explorer.soo.network](https://explorer.soo.network//address/Mj7GE6LZiJUZFTgabmNkFoY2o6JCEwCMKopSUUC3kqj) | | Superposition | 1000055244 | 55244 | `0x5e8a0fCc0D1DF583322943e01F02cB243e5300f6` | [explorer.superposition.so](https://explorer.superposition.so//address/0x5e8a0fCc0D1DF583322943e01F02cB243e5300f6) | | Superseed | 5330 | 5330 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.superseed.xyz](https://explorer.superseed.xyz/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Swell | 1923 | 1923 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.swellnetwork.io](https://explorer.swellnetwork.io/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Taiko | 167000 | 167000 | `0x28EFBCadA00A7ed6772b3666F3898d276e88CAe3` | [taikoscan.io](https://taikoscan.io/address/0x28EFBCadA00A7ed6772b3666F3898d276e88CAe3) | | Tangle | 5845 | 5845 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.tangle.tools](https://explorer.tangle.tools/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Telos EVM | 40 | 40 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [www.teloscan.io](https://www.teloscan.io/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Torus | 21000 | 21000 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [blockscout.torus.network](https://blockscout.torus.network/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Treasure | 61166 | 61166 | `0x9BbDf86b272d224323136E15594fdCe487F40ce7` | [treasurescan.io](https://treasurescan.io/address/0x9BbDf86b272d224323136E15594fdCe487F40ce7) | | Unichain | 130 | 130 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [unichain.blockscout.com](https://unichain.blockscout.com/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Vana | 1480 | 1480 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [vanascan.io](https://vanascan.io/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Viction | 88 | 88 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [www.vicscan.xyz](https://www.vicscan.xyz/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | World Chain | 480 | 480 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [worldchain-mainnet-explorer.alchemy.com](https://worldchain-mainnet-explorer.alchemy.com/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Xai | 660279 | 660279 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.xai-chain.net](https://explorer.xai-chain.net/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | XLayer | 196 | 196 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [www.oklink.com](https://www.oklink.com/xlayer/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | XPLA | 37 | 37 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.xpla.io](https://explorer.xpla.io/mainnet/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Zero Network | 543210 | 543210 | `0xd7b351D2dE3495eA259DD10ab4b9300A378Afbf3` | [zerion-explorer.vercel.app](https://zerion-explorer.vercel.app/address/0xd7b351D2dE3495eA259DD10ab4b9300A378Afbf3) | | ZetaChain | 7000 | 7000 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.zetachain.com](https://explorer.zetachain.com/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Zircuit | 48900 | 48900 | `0xc2FbB9411186AB3b1a6AFCCA702D1a80B48b197c` | [explorer.zircuit.com](https://explorer.zircuit.com/address/0xc2FbB9411186AB3b1a6AFCCA702D1a80B48b197c) | | zkLink Nova | 810180 | 810180 | `0x9BbDf86b272d224323136E15594fdCe487F40ce7` | [explorer.zklink.io](https://explorer.zklink.io/address/0x9BbDf86b272d224323136E15594fdCe487F40ce7) | | zkSync | 324 | 324 | `0x6bD0A2214797Bc81e0b006F7B74d6221BcD8cb6E` | [explorer.zksync.io](https://explorer.zksync.io/address/0x6bD0A2214797Bc81e0b006F7B74d6221BcD8cb6E) | | Zora | 7777777 | 7777777 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [explorer.zora.energy](https://explorer.zora.energy/address/0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a) | | Chain | Domain | Chain ID | Address | Explorer | | --- | --- | --- | --- | --- | | Abstract Testnet | 11124 | 11124 | `0x28f448885bEaaF662f8A9A6c9aF20fAd17A5a1DC` | [explorer.testnet.abs.xyz](https://explorer.testnet.abs.xyz/address/0x28f448885bEaaF662f8A9A6c9aF20fAd17A5a1DC) | | Aleph Zero EVM Testnet | 2039 | 2039 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [evm-explorer-testnet.alephzero.org](https://evm-explorer-testnet.alephzero.org/address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | | Alfajores | 44787 | 44787 | `0xEf9F292fcEBC3848bF4bB92a96a04F9ECBb78E59` | [explorer.celo.org](https://explorer.celo.org/alfajores/address/0xEf9F292fcEBC3848bF4bB92a96a04F9ECBb78E59) | | Arbitrum Sepolia | 421614 | 421614 | `0x598facE78a4302f11E3de0bee1894Da0b2Cb71F8` | [sepolia.arbiscan.io](https://sepolia.arbiscan.io/address/0x598facE78a4302f11E3de0bee1894Da0b2Cb71F8) | | Arcadia Testnet v2 | 1098411886 | 1098411886 | `0x33dB966328Ea213b0f76eF96CA368AB37779F065` | [explorer.khalani.network](https://explorer.khalani.network/address/0x33dB966328Ea213b0f76eF96CA368AB37779F065) | | Base Sepolia | 84532 | 84532 | `0x6966b0E55883d49BFB24539356a2f8A673E02039` | [sepolia.basescan.org](https://sepolia.basescan.org/address/0x6966b0E55883d49BFB24539356a2f8A673E02039) | | Berachain bArtio | 80084 | 80084 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [bartio.beratrail.io](https://bartio.beratrail.io//address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | | BSC Testnet | 97 | 97 | `0xF9F6F5646F478d5ab4e20B0F910C92F1CCC9Cc6D` | [testnet.bscscan.com](https://testnet.bscscan.com/address/0xF9F6F5646F478d5ab4e20B0F910C92F1CCC9Cc6D) | | Camp Network Testnet V2 | 325000 | 325000 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [camp-network-testnet.blockscout.com](https://camp-network-testnet.blockscout.com/address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | | Citrea Testnet | 5115 | 5115 | `0xB08d78F439e55D02C398519eef61606A5926245F` | [explorer.testnet.citrea.xyz](https://explorer.testnet.citrea.xyz/address/0xB08d78F439e55D02C398519eef61606A5926245F) | | Eco Testnet | 471923 | 471923 | `0x6966b0E55883d49BFB24539356a2f8A673E02039` | [eco-testnet.explorer.caldera.xyz](https://eco-testnet.explorer.caldera.xyz//address/0x6966b0E55883d49BFB24539356a2f8A673E02039) | | Form Testnet | 132902 | 132902 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [sepolia-explorer.form.network](https://sepolia-explorer.form.network/address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | | Fuji | 43113 | 43113 | `0x5b6CFf85442B851A8e6eaBd2A4E4507B5135B3B0` | [testnet.snowtrace.io](https://testnet.snowtrace.io/address/0x5b6CFf85442B851A8e6eaBd2A4E4507B5135B3B0) | | Holesky | 17000 | 17000 | `0x46f7C5D896bbeC89bE1B19e4485e59b4Be49e9Cc` | [holesky.etherscan.io](https://holesky.etherscan.io/address/0x46f7C5D896bbeC89bE1B19e4485e59b4Be49e9Cc) | | Hyperliquid EVM Testnet | 998 | 998 | `0x589C201a07c26b4725A4A829d772f24423da480B` | [explorer.hyperlend.finance](https://explorer.hyperlend.finance/address/0x589C201a07c26b4725A4A829d772f24423da480B) | | Ink Sepolia | 763373 | 763373 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [explorer-sepolia.inkonchain.com](https://explorer-sepolia.inkonchain.com/address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | | Odyssey Testnet | 911867 | 911867 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [odyssey-explorer.ithaca.xyz](https://odyssey-explorer.ithaca.xyz/address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | | Optimism Sepolia | 11155420 | 11155420 | `0x6966b0E55883d49BFB24539356a2f8A673E02039` | [sepolia-optimistic.etherscan.io](https://sepolia-optimistic.etherscan.io/address/0x6966b0E55883d49BFB24539356a2f8A673E02039) | | Plume Testnet | 161221135 | 161221135 | `0x33dB966328Ea213b0f76eF96CA368AB37779F065` | [plume-testnet.explorer.caldera.xyz](https://plume-testnet.explorer.caldera.xyz/address/0x33dB966328Ea213b0f76eF96CA368AB37779F065) | | Polygon Amoy | 80002 | 80002 | `0x54148470292C24345fb828B003461a9444414517` | [amoy.polygonscan.com](https://amoy.polygonscan.com/address/0x54148470292C24345fb828B003461a9444414517) | | Scroll Sepolia | 534351 | 534351 | `0x3C5154a193D6e2955650f9305c8d80c18C814A68` | [sepolia.scrollscan.dev](https://sepolia.scrollscan.dev//address/0x3C5154a193D6e2955650f9305c8d80c18C814A68) | | Sepolia | 11155111 | 11155111 | `0xfFAEF09B3cd11D9b20d1a19bECca54EEC2884766` | [sepolia.etherscan.io](https://sepolia.etherscan.io/address/0xfFAEF09B3cd11D9b20d1a19bECca54EEC2884766) | | Soneium Minato Testnet | 1946 | 1946 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [explorer-testnet.soneium.org](https://explorer-testnet.soneium.org/address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | | Sonic Testnet | 64165 | 64165 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [testnet.soniclabs.com](https://testnet.soniclabs.com/address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | | SUAVE Toliman Testnet | 33626250 | 33626250 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [explorer.toliman.suave.flashbots.net](https://explorer.toliman.suave.flashbots.net/address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | | Superposition Testnet | 98985 | 98985 | `0x6966b0E55883d49BFB24539356a2f8A673E02039` | [testnet-explorer.superposition.so](https://testnet-explorer.superposition.so/address/0x6966b0E55883d49BFB24539356a2f8A673E02039) | | Tangle Testnet | 3799 | 3799 | `0x87100b0E64B3baBD43F3FCB26A6edc4395e2D9df` | [testnet-explorer.tangle.tools](https://testnet-explorer.tangle.tools//address/0x87100b0E64B3baBD43F3FCB26A6edc4395e2D9df) | | Treasure Topaz Testnet | 978658 | 978658 | `0x28f448885bEaaF662f8A9A6c9aF20fAd17A5a1DC` | [topaz.treasurescan.io](https://topaz.treasurescan.io/address/0x28f448885bEaaF662f8A9A6c9aF20fAd17A5a1DC) | | Unichain Testnet | 1301 | 1301 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [unichain-sepolia.blockscout.com](https://unichain-sepolia.blockscout.com/address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | --- # Proxy Admin | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) Proxy Admin =========== * Mainnet * Testnet | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Aleph Zero EVM | 1000041455 | `0x730f8a4128Fa8c53C777B62Baa1abeF94cAd34a9` | [evm-explorer.alephzero.org](https://evm-explorer.alephzero.org/address/0x730f8a4128Fa8c53C777B62Baa1abeF94cAd34a9) | | Ancient8 | 888888888 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [scan.ancient8.gg](https://scan.ancient8.gg/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | ApeChain | 33139 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [apechain.calderaexplorer.xyz](https://apechain.calderaexplorer.xyz/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | AppChain | 466 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.appchain.xyz](https://explorer.appchain.xyz/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Arbitrum | 42161 | `0x80Cebd56A65e46c474a1A101e89E76C4c51D179c` | [arbiscan.io](https://arbiscan.io/address/0x80Cebd56A65e46c474a1A101e89E76C4c51D179c) | | Arbitrum Nova | 42170 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [nova.arbiscan.io](https://nova.arbiscan.io//address/0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D) | | Artela | 11820 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [artscan.artela.network](https://artscan.artela.network/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Arthera | 10242 | `0x03cF708E42C89623bd83B281A56935cB562b9258` | [explorer.arthera.net](https://explorer.arthera.net/address/0x03cF708E42C89623bd83B281A56935cB562b9258) | | Astar | 592 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [astar.blockscout.com](https://astar.blockscout.com/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Astar zkEVM | 3776 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [astar-zkevm.explorer.startale.com](https://astar-zkevm.explorer.startale.com/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Aurora | 1313161554 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.mainnet.aurora.dev](https://explorer.mainnet.aurora.dev/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Avalanche | 43114 | `0xd7CF8c05fd81b8cA7CfF8E6C49B08a9D63265c9B` | [snowtrace.io](https://snowtrace.io/address/0xd7CF8c05fd81b8cA7CfF8E6C49B08a9D63265c9B) | | B3 | 8333 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [explorer.b3.fun](https://explorer.b3.fun/address/0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D) | | Base | 8453 | `0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1` | [basescan.org](https://basescan.org/address/0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1) | | Bitlayer | 200901 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [www.btrscan.com](https://www.btrscan.com/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Blast | 81457 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [blastexplorer.io](https://blastexplorer.io/address/0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D) | | BOB | 60808 | `0x95878Fd41bC26f7045C0b98e381c22f010745A75` | [explorer.gobob.xyz](https://explorer.gobob.xyz/address/0x95878Fd41bC26f7045C0b98e381c22f010745A75) | | Boba Mainnet | 288 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [bobascan.com](https://bobascan.com/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Binance Smart Chain | 56 | `0x65993Af9D0D3a64ec77590db7ba362D6eB78eF70` | [bscscan.com](https://bscscan.com/address/0x65993Af9D0D3a64ec77590db7ba362D6eB78eF70) | | B² Network | 223 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.bsquared.network](https://explorer.bsquared.network/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Celo | 42220 | `0x90f9a2E9eCe93516d65FdaB726a3c62F5960a1b9` | [celoscan.io](https://celoscan.io/address/0x90f9a2E9eCe93516d65FdaB726a3c62F5960a1b9) | | CheeseChain | 383353 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [fetascan.xyz](https://fetascan.xyz/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Chiliz | 1000088888 | `0x48C427782Bc1e9ecE406b3e277481b28ABcBdf03` | [chiliscan.com](https://chiliscan.com/address/0x48C427782Bc1e9ecE406b3e277481b28ABcBdf03) | | Conflux eSpace | 1030 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [evm.confluxscan.net](https://evm.confluxscan.net/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Conwai | 668668 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [conwai.calderaexplorer.xyz](https://conwai.calderaexplorer.xyz/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Core | 1116 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [scan.coredao.org](https://scan.coredao.org/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Corn | 21000000 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [cornscan.io](https://cornscan.io/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Cyber | 7560 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [cyberscan.co](https://cyberscan.co/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Degen | 666666666 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [explorer.degen.tips](https://explorer.degen.tips/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Dogechain | 2000 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.dogechain.dog](https://explorer.dogechain.dog/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | DuckChain | 5545 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [scan.duckchain.io](https://scan.duckchain.io/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Endurance | 648 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [explorer-endurance.fusionist.io](https://explorer-endurance.fusionist.io/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Ethereum | 1 | `0x75EE15Ee1B4A75Fa3e2fDF5DF3253c25599cc659` | [etherscan.io](https://etherscan.io/address/0x75EE15Ee1B4A75Fa3e2fDF5DF3253c25599cc659) | | Everclear | 25327 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [scan.everclear.org](https://scan.everclear.org/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Evmos EVM | 9001 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [www.mintscan.io](https://www.mintscan.io/evmos/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Fantom Opera | 250 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [ftmscan.com](https://ftmscan.com/address/0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D) | | Flame | 253368190 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.flame.astria.org](https://explorer.flame.astria.org/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Flare | 14 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [flare-explorer.flare.network](https://flare-explorer.flare.network/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | EVM on Flow | 1000000747 | `0x5dfcCe8da81B542426211C99fCCfeD647e9AA496` | [evm.flowscan.io](https://evm.flowscan.io/address/0x5dfcCe8da81B542426211C99fCCfeD647e9AA496) | | Form | 478 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.form.network](https://explorer.form.network/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Fraxtal | 252 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [fraxscan.com](https://fraxscan.com/address/0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7) | | Fuse | 122 | `0x6A7398A6a0fB842725afa0A5F1641FC6C9FF89cf` | [explorer.fuse.io](https://explorer.fuse.io/address/0x6A7398A6a0fB842725afa0A5F1641FC6C9FF89cf) | | Gnosis | 100 | `0x81a92A1a272cb09d7b4970b07548463dC7aE0cB7` | [gnosisscan.io](https://gnosisscan.io/address/0x81a92A1a272cb09d7b4970b07548463dC7aE0cB7) | | Gravity Alpha Mainnet | 1625 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.gravity.xyz](https://explorer.gravity.xyz/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Guru Network | 260 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [blockscout.gurunetwork.ai](https://blockscout.gurunetwork.ai/address/0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D) | | Harmony One | 1666600000 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [explorer.harmony.one](https://explorer.harmony.one/address/0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D) | | Hemi Network | 43111 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.hemi.xyz](https://explorer.hemi.xyz/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Immutable zkEVM | 1000013371 | `0x2f0E57527Bb37E5E064EF243fad56CCE6241906c` | [explorer.immutable.com](https://explorer.immutable.com/address/0x2f0E57527Bb37E5E064EF243fad56CCE6241906c) | | Injective EVM | 2525 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [inevm.calderaexplorer.xyz](https://inevm.calderaexplorer.xyz/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Ink | 57073 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.inkonchain.com](https://explorer.inkonchain.com/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Kaia | 8217 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [kaiascope.com](https://kaiascope.com/address/0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D) | | Kroma | 255 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [blockscout.kroma.network](https://blockscout.kroma.network/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Linea | 59144 | `0x7f50C5776722630a0024fAE05fDe8b47571D7B39` | [lineascan.build](https://lineascan.build/address/0x7f50C5776722630a0024fAE05fDe8b47571D7B39) | | Lisk | 1135 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [blockscout.lisk.com](https://blockscout.lisk.com/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | LUKSO | 42 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [explorer.execution.mainnet.lukso.network](https://explorer.execution.mainnet.lukso.network/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Lumia Prism | 1000073017 | `0x200183De44bf765ECB73cD62A74010EaaBC43146` | [explorer.lumia.org](https://explorer.lumia.org/address/0x200183De44bf765ECB73cD62A74010EaaBC43146) | | Manta Pacific | 169 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [pacific-explorer.manta.network](https://pacific-explorer.manta.network/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Mantle | 5000 | `0x14c3CEee8F431aE947364f43429a98EA89800238` | [explorer.mantle.xyz](https://explorer.mantle.xyz/address/0x14c3CEee8F431aE947364f43429a98EA89800238) | | Merlin | 4200 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [scan.merlinchain.io](https://scan.merlinchain.io/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Metal L2 | 1000001750 | `0x7C012DCA02C42cfA3Fd7Da3B0ED7234B52AE68eF` | [explorer.metall2.com](https://explorer.metall2.com/address/0x7C012DCA02C42cfA3Fd7Da3B0ED7234B52AE68eF) | | Metis Andromeda | 1088 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [andromeda-explorer.metis.io](https://andromeda-explorer.metis.io/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Mint | 185 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [explorer.mintchain.io](https://explorer.mintchain.io/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Mode | 34443 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [explorer.mode.network](https://explorer.mode.network/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Molten | 360 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [molten.calderaexplorer.xyz](https://molten.calderaexplorer.xyz/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Moonbeam | 1284 | `0x6A9cdA3dd1F593983BFd142Eb35e6ce4137bd5ce` | [moonscan.io](https://moonscan.io/address/0x6A9cdA3dd1F593983BFd142Eb35e6ce4137bd5ce) | | Morph | 2818 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [explorer.morphl2.io](https://explorer.morphl2.io/address/0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D) | | Nero | 1689 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [www.neroscan.io](https://www.neroscan.io/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Oort | 970 | `0x148CF67B8A242c1360bb2C93fCe203EC4d4f9B56` | [mainnet-scan.oortech.com](https://mainnet-scan.oortech.com/address/0x148CF67B8A242c1360bb2C93fCe203EC4d4f9B56) | | Optimism | 10 | `0xE047cb95FB3b7117989e911c6afb34771183fC35` | [optimistic.etherscan.io](https://optimistic.etherscan.io/address/0xE047cb95FB3b7117989e911c6afb34771183fC35) | | Orderly L2 | 291 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [explorer.orderly.network](https://explorer.orderly.network/address/0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D) | | Polygon | 137 | `0xC4F7590C5d30BE959225dC75640657954A86b980` | [polygonscan.com](https://polygonscan.com/address/0xC4F7590C5d30BE959225dC75640657954A86b980) | | Polygon zkEVM | 1101 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [zkevm.polygonscan.com](https://zkevm.polygonscan.com/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Polynomial | 1000008008 | `0x5bdADEAD721Eb4C4038fF7c989E3C7BbBA302435` | [polynomialscan.io](https://polynomialscan.io/address/0x5bdADEAD721Eb4C4038fF7c989E3C7BbBA302435) | | Prom | 227 | `0x9534122Aae7978dB8f5f10dF4432233c53e820A1` | [prom-blockscout.eu-north-2.gateway.fm](https://prom-blockscout.eu-north-2.gateway.fm/address/0x9534122Aae7978dB8f5f10dF4432233c53e820A1) | | Proof of Play Apex | 70700 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [explorer.apex.proofofplay.com](https://explorer.apex.proofofplay.com/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | RARI Chain | 1000012617 | `0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7` | [mainnet.explorer.rarichain.org](https://mainnet.explorer.rarichain.org/address/0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7) | | re.al | 111188 | `0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1` | [explorer.re.al](https://explorer.re.al/address/0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1) | | Redstone | 690 | `0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1` | [explorer.redstone.xyz](https://explorer.redstone.xyz/address/0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1) | | Rivalz | 753 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [rivalz.calderaexplorer.xyz](https://rivalz.calderaexplorer.xyz/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Rootstock | 1000000030 | `0xe93f2f409ad8B5000431D234472973fe848dcBEC` | [rootstock.blockscout.com](https://rootstock.blockscout.com/address/0xe93f2f409ad8B5000431D234472973fe848dcBEC) | | Sanko | 1996 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [explorer.sanko.xyz](https://explorer.sanko.xyz/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Scroll | 534352 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [scrollscan.com](https://scrollscan.com//address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Sei | 1329 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [seitrace.com](https://seitrace.com/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Shibarium | 109 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [shibariumscan.io](https://shibariumscan.io/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | SnaxChain | 2192 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [explorer.snaxchain.io](https://explorer.snaxchain.io/address/0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D) | | Soneium | 1868 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [soneium.blockscout.com](https://soneium.blockscout.com/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Sonic | 146 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [sonicscan.org](https://sonicscan.org/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Superposition | 1000055244 | `0x248aDe14C0489E20C9a7Fea5F86DBfC3702208eF` | [explorer.superposition.so](https://explorer.superposition.so//address/0x248aDe14C0489E20C9a7Fea5F86DBfC3702208eF) | | Superseed | 5330 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.superseed.xyz](https://explorer.superseed.xyz/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Swell | 1923 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.swellnetwork.io](https://explorer.swellnetwork.io/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Taiko | 167000 | `0x398633D19f4371e1DB5a8EFE90468eB70B1176AA` | [taikoscan.io](https://taikoscan.io/address/0x398633D19f4371e1DB5a8EFE90468eB70B1176AA) | | Tangle | 5845 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [explorer.tangle.tools](https://explorer.tangle.tools/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Telos EVM | 40 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [www.teloscan.io](https://www.teloscan.io/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Torus | 21000 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [blockscout.torus.network](https://blockscout.torus.network/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Treasure | 61166 | `0x038F9F4e93e88Af2C688da265222FdE80e455aA4` | [treasurescan.io](https://treasurescan.io/address/0x038F9F4e93e88Af2C688da265222FdE80e455aA4) | | Unichain | 130 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [unichain.blockscout.com](https://unichain.blockscout.com/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Vana | 1480 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [vanascan.io](https://vanascan.io/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Viction | 88 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [www.vicscan.xyz](https://www.vicscan.xyz/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | World Chain | 480 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [worldchain-mainnet-explorer.alchemy.com](https://worldchain-mainnet-explorer.alchemy.com/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Xai | 660279 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [explorer.xai-chain.net](https://explorer.xai-chain.net/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | XLayer | 196 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [www.oklink.com](https://www.oklink.com/xlayer/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | XPLA | 37 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.xpla.io](https://explorer.xpla.io/mainnet/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Zero Network | 543210 | `0x72e2A678442Edc65f14476A0E4c94312C0469f4A` | [zerion-explorer.vercel.app](https://zerion-explorer.vercel.app/address/0x72e2A678442Edc65f14476A0E4c94312C0469f4A) | | ZetaChain | 7000 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [explorer.zetachain.com](https://explorer.zetachain.com/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Zircuit | 48900 | `0xA5580D7Af50F3FD869EbEA51e352e2656F8DD5C2` | [explorer.zircuit.com](https://explorer.zircuit.com/address/0xA5580D7Af50F3FD869EbEA51e352e2656F8DD5C2) | | zkLink Nova | 810180 | `0x038F9F4e93e88Af2C688da265222FdE80e455aA4` | [explorer.zklink.io](https://explorer.zklink.io/address/0x038F9F4e93e88Af2C688da265222FdE80e455aA4) | | zkSync | 324 | `0xD01274DC164D32F8595bE707F221375E68cE300C` | [explorer.zksync.io](https://explorer.zksync.io/address/0xD01274DC164D32F8595bE707F221375E68cE300C) | | Zora | 7777777 | `0x632b4F32d65F7b25B37a27C57dD510f8e4a58Bf9` | [explorer.zora.energy](https://explorer.zora.energy/address/0x632b4F32d65F7b25B37a27C57dD510f8e4a58Bf9) | | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Abstract Testnet | 11124 | `0xfbA0c57A6BA24B5440D3e2089222099b4663B98B` | [explorer.testnet.abs.xyz](https://explorer.testnet.abs.xyz/address/0xfbA0c57A6BA24B5440D3e2089222099b4663B98B) | | Aleph Zero EVM Testnet | 2039 | `0x54148470292C24345fb828B003461a9444414517` | [evm-explorer-testnet.alephzero.org](https://evm-explorer-testnet.alephzero.org/address/0x54148470292C24345fb828B003461a9444414517) | | Alfajores | 44787 | `0x4eDBf5846D973c53AF478cf62aB5bC92807521e3` | [explorer.celo.org](https://explorer.celo.org/alfajores/address/0x4eDBf5846D973c53AF478cf62aB5bC92807521e3) | | Arbitrum Sepolia | 421614 | `0x666a24F62f7A97BA33c151776Eb3D9441a059eB8` | [sepolia.arbiscan.io](https://sepolia.arbiscan.io/address/0x666a24F62f7A97BA33c151776Eb3D9441a059eB8) | | Arcadia Testnet v2 | 1098411886 | `0x589C201a07c26b4725A4A829d772f24423da480B` | [explorer.khalani.network](https://explorer.khalani.network/address/0x589C201a07c26b4725A4A829d772f24423da480B) | | Base Sepolia | 84532 | `0x44b764045BfDC68517e10e783E69B376cef196B2` | [sepolia.basescan.org](https://sepolia.basescan.org/address/0x44b764045BfDC68517e10e783E69B376cef196B2) | | Berachain bArtio | 80084 | `0x54148470292C24345fb828B003461a9444414517` | [bartio.beratrail.io](https://bartio.beratrail.io//address/0x54148470292C24345fb828B003461a9444414517) | | BSC Testnet | 97 | `0xb12282d2E838Aa5f2A4F9Ee5f624a77b7199A078` | [testnet.bscscan.com](https://testnet.bscscan.com/address/0xb12282d2E838Aa5f2A4F9Ee5f624a77b7199A078) | | Camp Network Testnet V2 | 325000 | `0x54148470292C24345fb828B003461a9444414517` | [camp-network-testnet.blockscout.com](https://camp-network-testnet.blockscout.com/address/0x54148470292C24345fb828B003461a9444414517) | | Citrea Testnet | 5115 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [explorer.testnet.citrea.xyz](https://explorer.testnet.citrea.xyz/address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | | Eco Testnet | 471923 | `0x44b764045BfDC68517e10e783E69B376cef196B2` | [eco-testnet.explorer.caldera.xyz](https://eco-testnet.explorer.caldera.xyz//address/0x44b764045BfDC68517e10e783E69B376cef196B2) | | Form Testnet | 132902 | `0x54148470292C24345fb828B003461a9444414517` | [sepolia-explorer.form.network](https://sepolia-explorer.form.network/address/0x54148470292C24345fb828B003461a9444414517) | | Fuji | 43113 | `0x378dA02f7dC3c23A8B5ecE32b8056CdF01e8d477` | [testnet.snowtrace.io](https://testnet.snowtrace.io/address/0x378dA02f7dC3c23A8B5ecE32b8056CdF01e8d477) | | Holesky | 17000 | `0x33dB966328Ea213b0f76eF96CA368AB37779F065` | [holesky.etherscan.io](https://holesky.etherscan.io/address/0x33dB966328Ea213b0f76eF96CA368AB37779F065) | | Hyperliquid EVM Testnet | 998 | `0x6966b0E55883d49BFB24539356a2f8A673E02039` | [explorer.hyperlend.finance](https://explorer.hyperlend.finance/address/0x6966b0E55883d49BFB24539356a2f8A673E02039) | | Ink Sepolia | 763373 | `0x54148470292C24345fb828B003461a9444414517` | [explorer-sepolia.inkonchain.com](https://explorer-sepolia.inkonchain.com/address/0x54148470292C24345fb828B003461a9444414517) | | Odyssey Testnet | 911867 | `0x54148470292C24345fb828B003461a9444414517` | [odyssey-explorer.ithaca.xyz](https://odyssey-explorer.ithaca.xyz/address/0x54148470292C24345fb828B003461a9444414517) | | Optimism Sepolia | 11155420 | `0x44b764045BfDC68517e10e783E69B376cef196B2` | [sepolia-optimistic.etherscan.io](https://sepolia-optimistic.etherscan.io/address/0x44b764045BfDC68517e10e783E69B376cef196B2) | | Plume Testnet | 161221135 | `0x589C201a07c26b4725A4A829d772f24423da480B` | [plume-testnet.explorer.caldera.xyz](https://plume-testnet.explorer.caldera.xyz/address/0x589C201a07c26b4725A4A829d772f24423da480B) | | Polygon Amoy | 80002 | `0xC2E36cd6e32e194EE11f15D9273B64461A4D49A2` | [amoy.polygonscan.com](https://amoy.polygonscan.com/address/0xC2E36cd6e32e194EE11f15D9273B64461A4D49A2) | | Scroll Sepolia | 534351 | `0x598facE78a4302f11E3de0bee1894Da0b2Cb71F8` | [sepolia.scrollscan.dev](https://sepolia.scrollscan.dev//address/0x598facE78a4302f11E3de0bee1894Da0b2Cb71F8) | | Sepolia | 11155111 | `0x97Bbc6bBaFa5Ce3b2FA966c121Af63bD09e940f8` | [sepolia.etherscan.io](https://sepolia.etherscan.io/address/0x97Bbc6bBaFa5Ce3b2FA966c121Af63bD09e940f8) | | Soneium Minato Testnet | 1946 | `0x54148470292C24345fb828B003461a9444414517` | [explorer-testnet.soneium.org](https://explorer-testnet.soneium.org/address/0x54148470292C24345fb828B003461a9444414517) | | Sonic Testnet | 64165 | `0x54148470292C24345fb828B003461a9444414517` | [testnet.soniclabs.com](https://testnet.soniclabs.com/address/0x54148470292C24345fb828B003461a9444414517) | | SUAVE Toliman Testnet | 33626250 | `0x54148470292C24345fb828B003461a9444414517` | [explorer.toliman.suave.flashbots.net](https://explorer.toliman.suave.flashbots.net/address/0x54148470292C24345fb828B003461a9444414517) | | Superposition Testnet | 98985 | `0x44b764045BfDC68517e10e783E69B376cef196B2` | [testnet-explorer.superposition.so](https://testnet-explorer.superposition.so/address/0x44b764045BfDC68517e10e783E69B376cef196B2) | | Tangle Testnet | 3799 | `0xF19B75ea28F0f97d3bd267d35F2a8D30A667967C` | [testnet-explorer.tangle.tools](https://testnet-explorer.tangle.tools//address/0xF19B75ea28F0f97d3bd267d35F2a8D30A667967C) | | Treasure Topaz Testnet | 978658 | `0xfbA0c57A6BA24B5440D3e2089222099b4663B98B` | [topaz.treasurescan.io](https://topaz.treasurescan.io/address/0xfbA0c57A6BA24B5440D3e2089222099b4663B98B) | | Unichain Testnet | 1301 | `0x54148470292C24345fb828B003461a9444414517` | [unichain-sepolia.blockscout.com](https://unichain-sepolia.blockscout.com/address/0x54148470292C24345fb828B003461a9444414517) | --- # Merkle Tree (Hook) | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) Merkle Tree (Hook) ================== * Mainnet * Testnet | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Aleph Zero EVM | 1000041455 | `0x2684C6F89E901987E1FdB7649dC5Be0c57C61645` | [evm-explorer.alephzero.org](https://evm-explorer.alephzero.org/address/0x2684C6F89E901987E1FdB7649dC5Be0c57C61645) | | Ancient8 | 888888888 | `0x811808Dd29ba8B0FC6C0ec0b5537035E59745162` | [scan.ancient8.gg](https://scan.ancient8.gg/address/0x811808Dd29ba8B0FC6C0ec0b5537035E59745162) | | ApeChain | 33139 | `0x886BB0f329781b98f98FDeb1ce7a8957F2d43B9F` | [apechain.calderaexplorer.xyz](https://apechain.calderaexplorer.xyz/address/0x886BB0f329781b98f98FDeb1ce7a8957F2d43B9F) | | AppChain | 466 | `0xcd90D49b046772F710250b9119117169CB2e4D8b` | [explorer.appchain.xyz](https://explorer.appchain.xyz/address/0xcd90D49b046772F710250b9119117169CB2e4D8b) | | Arbitrum | 42161 | `0x748040afB89B8FdBb992799808215419d36A0930` | [arbiscan.io](https://arbiscan.io/address/0x748040afB89B8FdBb992799808215419d36A0930) | | Arbitrum Nova | 42170 | `0x6963480b05EB58f4d624B014ab92e9aD4d21df6D` | [nova.arbiscan.io](https://nova.arbiscan.io//address/0x6963480b05EB58f4d624B014ab92e9aD4d21df6D) | | Artela | 11820 | `0x7B032cBB00AD7438E802A66D8b64761A06E5df22` | [artscan.artela.network](https://artscan.artela.network/address/0x7B032cBB00AD7438E802A66D8b64761A06E5df22) | | Arthera | 10242 | `0xdA629E1B79e3420ECd1e80571aDd6a4a3b13AE79` | [explorer.arthera.net](https://explorer.arthera.net/address/0xdA629E1B79e3420ECd1e80571aDd6a4a3b13AE79) | | Astar | 592 | `0x441a01Fca2eD731C0Fc4633998332f9FEDB17575` | [astar.blockscout.com](https://astar.blockscout.com/address/0x441a01Fca2eD731C0Fc4633998332f9FEDB17575) | | Astar zkEVM | 3776 | `0x441a01Fca2eD731C0Fc4633998332f9FEDB17575` | [astar-zkevm.explorer.startale.com](https://astar-zkevm.explorer.startale.com/address/0x441a01Fca2eD731C0Fc4633998332f9FEDB17575) | | Aurora | 1313161554 | `0xA8A311B69f688c1D9928259D872C31ca0d473642` | [explorer.mainnet.aurora.dev](https://explorer.mainnet.aurora.dev/address/0xA8A311B69f688c1D9928259D872C31ca0d473642) | | Avalanche | 43114 | `0x84eea61D679F42D92145fA052C89900CBAccE95A` | [snowtrace.io](https://snowtrace.io/address/0x84eea61D679F42D92145fA052C89900CBAccE95A) | | B3 | 8333 | `0x6963480b05EB58f4d624B014ab92e9aD4d21df6D` | [explorer.b3.fun](https://explorer.b3.fun/address/0x6963480b05EB58f4d624B014ab92e9aD4d21df6D) | | Base | 8453 | `0x19dc38aeae620380430C200a6E990D5Af5480117` | [basescan.org](https://basescan.org/address/0x19dc38aeae620380430C200a6E990D5Af5480117) | | Bitlayer | 200901 | `0x441a01Fca2eD731C0Fc4633998332f9FEDB17575` | [www.btrscan.com](https://www.btrscan.com/address/0x441a01Fca2eD731C0Fc4633998332f9FEDB17575) | | Blast | 81457 | `0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465` | [blastexplorer.io](https://blastexplorer.io/address/0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465) | | BOB | 60808 | `0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB` | [explorer.gobob.xyz](https://explorer.gobob.xyz/address/0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB) | | Boba Mainnet | 288 | `0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47` | [bobascan.com](https://bobascan.com/address/0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47) | | Binance Smart Chain | 56 | `0xFDb9Cd5f9daAA2E4474019405A328a88E7484f26` | [bscscan.com](https://bscscan.com/address/0xFDb9Cd5f9daAA2E4474019405A328a88E7484f26) | | B² Network | 223 | `0xbb0AE51BCa526cF313b6a95BfaB020794af6C394` | [explorer.bsquared.network](https://explorer.bsquared.network/address/0xbb0AE51BCa526cF313b6a95BfaB020794af6C394) | | Celo | 42220 | `0x04dB778f05854f26E67e0a66b740BBbE9070D366` | [celoscan.io](https://celoscan.io/address/0x04dB778f05854f26E67e0a66b740BBbE9070D366) | | CheeseChain | 383353 | `0x0054D19613f20dD72721A146ED408971a2CCA9BD` | [fetascan.xyz](https://fetascan.xyz/address/0x0054D19613f20dD72721A146ED408971a2CCA9BD) | | Chiliz | 1000088888 | `0x9c2214467Daf9e2e1F45b36d08ce0b9C65BFeA88` | [chiliscan.com](https://chiliscan.com/address/0x9c2214467Daf9e2e1F45b36d08ce0b9C65BFeA88) | | Conflux eSpace | 1030 | `0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6` | [evm.confluxscan.net](https://evm.confluxscan.net/address/0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6) | | Conwai | 668668 | `0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6` | [conwai.calderaexplorer.xyz](https://conwai.calderaexplorer.xyz/address/0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6) | | Core | 1116 | `0x441a01Fca2eD731C0Fc4633998332f9FEDB17575` | [scan.coredao.org](https://scan.coredao.org/address/0x441a01Fca2eD731C0Fc4633998332f9FEDB17575) | | Corn | 21000000 | `0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6` | [cornscan.io](https://cornscan.io/address/0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6) | | Cyber | 7560 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [cyberscan.co](https://cyberscan.co/address/0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a) | | Degen | 666666666 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [explorer.degen.tips](https://explorer.degen.tips/address/0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a) | | Dogechain | 2000 | `0x441a01Fca2eD731C0Fc4633998332f9FEDB17575` | [explorer.dogechain.dog](https://explorer.dogechain.dog/address/0x441a01Fca2eD731C0Fc4633998332f9FEDB17575) | | DuckChain | 5545 | `0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47` | [scan.duckchain.io](https://scan.duckchain.io/address/0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47) | | Eclipse | 1408864445 | `EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y` | [explorer.eclipse.xyz](https://explorer.eclipse.xyz//address/EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y) | | Endurance | 648 | `0xC831271c1fB212012811a91Dd43e5926C1020563` | [explorer-endurance.fusionist.io](https://explorer-endurance.fusionist.io/address/0xC831271c1fB212012811a91Dd43e5926C1020563) | | Ethereum | 1 | `0x48e6c30B97748d1e2e03bf3e9FbE3890ca5f8CCA` | [etherscan.io](https://etherscan.io/address/0x48e6c30B97748d1e2e03bf3e9FbE3890ca5f8CCA) | | Everclear | 25327 | `0xCC3D1659D50461d27a2F025dDb2c9B06B584B7e1` | [scan.everclear.org](https://scan.everclear.org/address/0xCC3D1659D50461d27a2F025dDb2c9B06B584B7e1) | | Evmos EVM | 9001 | `0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6` | [www.mintscan.io](https://www.mintscan.io/evmos/address/0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6) | | Fantom Opera | 250 | `0x6963480b05EB58f4d624B014ab92e9aD4d21df6D` | [ftmscan.com](https://ftmscan.com/address/0x6963480b05EB58f4d624B014ab92e9aD4d21df6D) | | Flame | 253368190 | `0xEe08043cf22c80b27BF24d19999231dF4a3fC256` | [explorer.flame.astria.org](https://explorer.flame.astria.org/address/0xEe08043cf22c80b27BF24d19999231dF4a3fC256) | | Flare | 14 | `0x441a01Fca2eD731C0Fc4633998332f9FEDB17575` | [flare-explorer.flare.network](https://flare-explorer.flare.network/address/0x441a01Fca2eD731C0Fc4633998332f9FEDB17575) | | EVM on Flow | 1000000747 | `0x2783D98CC073dbcDa90241C804d16982D3d75821` | [evm.flowscan.io](https://evm.flowscan.io/address/0x2783D98CC073dbcDa90241C804d16982D3d75821) | | Form | 478 | `0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6` | [explorer.form.network](https://explorer.form.network/address/0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6) | | Fraxtal | 252 | `0x8358D8291e3bEDb04804975eEa0fe9fe0fAfB147` | [fraxscan.com](https://fraxscan.com/address/0x8358D8291e3bEDb04804975eEa0fe9fe0fAfB147) | | Fuse | 122 | `0xfBc08389224d23b79cb21cDc16c5d42F0ad0F57f` | [explorer.fuse.io](https://explorer.fuse.io/address/0xfBc08389224d23b79cb21cDc16c5d42F0ad0F57f) | | Gnosis | 100 | `0x2684C6F89E901987E1FdB7649dC5Be0c57C61645` | [gnosisscan.io](https://gnosisscan.io/address/0x2684C6F89E901987E1FdB7649dC5Be0c57C61645) | | Gravity Alpha Mainnet | 1625 | `0x5090dF2FBDa7127c7aDa41f60B79F5c55D380Dd8` | [explorer.gravity.xyz](https://explorer.gravity.xyz/address/0x5090dF2FBDa7127c7aDa41f60B79F5c55D380Dd8) | | Guru Network | 260 | `0x11b76D93a9D39Eb51F54eBf5566308640cDe882b` | [blockscout.gurunetwork.ai](https://blockscout.gurunetwork.ai/address/0x11b76D93a9D39Eb51F54eBf5566308640cDe882b) | | Harmony One | 1666600000 | `0x6963480b05EB58f4d624B014ab92e9aD4d21df6D` | [explorer.harmony.one](https://explorer.harmony.one/address/0x6963480b05EB58f4d624B014ab92e9aD4d21df6D) | | Hemi Network | 43111 | `0x7B032cBB00AD7438E802A66D8b64761A06E5df22` | [explorer.hemi.xyz](https://explorer.hemi.xyz/address/0x7B032cBB00AD7438E802A66D8b64761A06E5df22) | | Immutable zkEVM | 1000013371 | `0xdAa1B65547fB969c9ff5678956AB2FF9771B883D` | [explorer.immutable.com](https://explorer.immutable.com/address/0xdAa1B65547fB969c9ff5678956AB2FF9771B883D) | | Injective EVM | 2525 | `0x0972954923a1e2b2aAb04Fa0c4a0797e5989Cd65` | [inevm.calderaexplorer.xyz](https://inevm.calderaexplorer.xyz/address/0x0972954923a1e2b2aAb04Fa0c4a0797e5989Cd65) | | Injective | 6909546 | `0x568ad3638447f07def384969f4ea39fae3802962` | [www.mintscan.io](https://www.mintscan.io/injective/address/0x568ad3638447f07def384969f4ea39fae3802962) | | Ink | 57073 | `0xA8A311B69f688c1D9928259D872C31ca0d473642` | [explorer.inkonchain.com](https://explorer.inkonchain.com/address/0xA8A311B69f688c1D9928259D872C31ca0d473642) | | Kaia | 8217 | `0x6963480b05EB58f4d624B014ab92e9aD4d21df6D` | [kaiascope.com](https://kaiascope.com/address/0x6963480b05EB58f4d624B014ab92e9aD4d21df6D) | | Kroma | 255 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [blockscout.kroma.network](https://blockscout.kroma.network/address/0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a) | | Linea | 59144 | `0xC077A0Cc408173349b1c9870C667B40FE3C01dd7` | [lineascan.build](https://lineascan.build/address/0xC077A0Cc408173349b1c9870C667B40FE3C01dd7) | | Lisk | 1135 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [blockscout.lisk.com](https://blockscout.lisk.com/address/0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a) | | LUKSO | 42 | `0x062200d92dF6bB7bA89Ce4D6800110450f94784e` | [explorer.execution.mainnet.lukso.network](https://explorer.execution.mainnet.lukso.network/address/0x062200d92dF6bB7bA89Ce4D6800110450f94784e) | | Lumia Prism | 1000073017 | `0xC88636fFdFAc7cb87b7A76310B7a62AF0A000595` | [explorer.lumia.org](https://explorer.lumia.org/address/0xC88636fFdFAc7cb87b7A76310B7a62AF0A000595) | | Manta Pacific | 169 | `0x149db7afD694722747035d5AEC7007ccb6F8f112` | [pacific-explorer.manta.network](https://pacific-explorer.manta.network/address/0x149db7afD694722747035d5AEC7007ccb6F8f112) | | Mantle | 5000 | `0x5332D1AC0A626D265298c14ff681c0A8D28dB86d` | [explorer.mantle.xyz](https://explorer.mantle.xyz/address/0x5332D1AC0A626D265298c14ff681c0A8D28dB86d) | | Merlin | 4200 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [scan.merlinchain.io](https://scan.merlinchain.io/address/0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a) | | Metal L2 | 1000001750 | `0x9c64f327F0140DeBd430aab3E2F1d6cbcA921227` | [explorer.metall2.com](https://explorer.metall2.com/address/0x9c64f327F0140DeBd430aab3E2F1d6cbcA921227) | | Metis Andromeda | 1088 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [andromeda-explorer.metis.io](https://andromeda-explorer.metis.io/address/0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a) | | Mint | 185 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [explorer.mintchain.io](https://explorer.mintchain.io/address/0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a) | | Mode | 34443 | `0xE2ee936bEa8e42671c400aC96dE198E06F2bA2A6` | [explorer.mode.network](https://explorer.mode.network/address/0xE2ee936bEa8e42671c400aC96dE198E06F2bA2A6) | | Molten | 360 | `0x441a01Fca2eD731C0Fc4633998332f9FEDB17575` | [molten.calderaexplorer.xyz](https://molten.calderaexplorer.xyz/address/0x441a01Fca2eD731C0Fc4633998332f9FEDB17575) | | Moonbeam | 1284 | `0x87403b85f6f316e7ba91ba1fa6C3Fb7dD4095547` | [moonscan.io](https://moonscan.io/address/0x87403b85f6f316e7ba91ba1fa6C3Fb7dD4095547) | | Morph | 2818 | `0x6963480b05EB58f4d624B014ab92e9aD4d21df6D` | [explorer.morphl2.io](https://explorer.morphl2.io/address/0x6963480b05EB58f4d624B014ab92e9aD4d21df6D) | | Nero | 1689 | `0x7B032cBB00AD7438E802A66D8b64761A06E5df22` | [www.neroscan.io](https://www.neroscan.io/address/0x7B032cBB00AD7438E802A66D8b64761A06E5df22) | | Neutron | 1853125230 | `0xcd30a0001cc1f436c41ef764a712ebabc5a144140e3fd03eafe64a9a24e4e27c` | [www.mintscan.io](https://www.mintscan.io/neutron/address/0xcd30a0001cc1f436c41ef764a712ebabc5a144140e3fd03eafe64a9a24e4e27c) | | Oort | 970 | `0x3E969bA938E6A993eeCD6F65b0dd8712B07dFe59` | [mainnet-scan.oortech.com](https://mainnet-scan.oortech.com/address/0x3E969bA938E6A993eeCD6F65b0dd8712B07dFe59) | | Optimism | 10 | `0x68eE9bec9B4dbB61f69D9D293Ae26a5AACb2e28f` | [optimistic.etherscan.io](https://optimistic.etherscan.io/address/0x68eE9bec9B4dbB61f69D9D293Ae26a5AACb2e28f) | | Orderly L2 | 291 | `0x6963480b05EB58f4d624B014ab92e9aD4d21df6D` | [explorer.orderly.network](https://explorer.orderly.network/address/0x6963480b05EB58f4d624B014ab92e9aD4d21df6D) | | Polygon | 137 | `0x73FbD25c3e817DC4B4Cd9d00eff6D83dcde2DfF6` | [polygonscan.com](https://polygonscan.com/address/0x73FbD25c3e817DC4B4Cd9d00eff6D83dcde2DfF6) | | Polygon zkEVM | 1101 | `0x149db7afD694722747035d5AEC7007ccb6F8f112` | [zkevm.polygonscan.com](https://zkevm.polygonscan.com/address/0x149db7afD694722747035d5AEC7007ccb6F8f112) | | Polynomial | 1000008008 | `0xC8E323036AAFB4B4201e7B640E79C4Db285A3FC8` | [polynomialscan.io](https://polynomialscan.io/address/0xC8E323036AAFB4B4201e7B640E79C4Db285A3FC8) | | Prom | 227 | `0xf147bBD944C610F86DaE6C7668497D22932C1E4A` | [prom-blockscout.eu-north-2.gateway.fm](https://prom-blockscout.eu-north-2.gateway.fm/address/0xf147bBD944C610F86DaE6C7668497D22932C1E4A) | | Proof of Play Apex | 70700 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [explorer.apex.proofofplay.com](https://explorer.apex.proofofplay.com/address/0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a) | | RARI Chain | 1000012617 | `0x8c794a781327b819416E7b67908f1D22397f1E67` | [mainnet.explorer.rarichain.org](https://mainnet.explorer.rarichain.org/address/0x8c794a781327b819416E7b67908f1D22397f1E67) | | re.al | 111188 | `0x55E4F0bc6b7Bb493D50839A8592e7ad8d5e93cf7` | [explorer.re.al](https://explorer.re.al/address/0x55E4F0bc6b7Bb493D50839A8592e7ad8d5e93cf7) | | Redstone | 690 | `0x8F1E22d309baa69D398a03cc88E9b46037e988AA` | [explorer.redstone.xyz](https://explorer.redstone.xyz/address/0x8F1E22d309baa69D398a03cc88E9b46037e988AA) | | Rivalz | 753 | `0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2` | [rivalz.calderaexplorer.xyz](https://rivalz.calderaexplorer.xyz/address/0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2) | | Rootstock | 1000000030 | `0x086c3947F71BE98A0bDf4AB7239955e7542b0CbA` | [rootstock.blockscout.com](https://rootstock.blockscout.com/address/0x086c3947F71BE98A0bDf4AB7239955e7542b0CbA) | | Sanko | 1996 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [explorer.sanko.xyz](https://explorer.sanko.xyz/address/0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a) | | Scroll | 534352 | `0x6119E37Bd66406A1Db74920aC79C15fB8411Ba76` | [scrollscan.com](https://scrollscan.com//address/0x6119E37Bd66406A1Db74920aC79C15fB8411Ba76) | | Sei | 1329 | `0xca1b69fA4c4a7c7fD839bC50867c589592bcfe49` | [seitrace.com](https://seitrace.com/address/0xca1b69fA4c4a7c7fD839bC50867c589592bcfe49) | | Shibarium | 109 | `0x441a01Fca2eD731C0Fc4633998332f9FEDB17575` | [shibariumscan.io](https://shibariumscan.io/address/0x441a01Fca2eD731C0Fc4633998332f9FEDB17575) | | SnaxChain | 2192 | `0x6963480b05EB58f4d624B014ab92e9aD4d21df6D` | [explorer.snaxchain.io](https://explorer.snaxchain.io/address/0x6963480b05EB58f4d624B014ab92e9aD4d21df6D) | | Solana | 1399811149 | `E588QtVUvresuXq2KoNEwAmoifCzYGpRBdHByN9KQMbi` | [solscan.io](https://solscan.io/address/E588QtVUvresuXq2KoNEwAmoifCzYGpRBdHByN9KQMbi) | | Soneium | 1868 | `0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6` | [soneium.blockscout.com](https://soneium.blockscout.com/address/0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6) | | Sonic | 146 | `0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6` | [sonicscan.org](https://sonicscan.org/address/0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6) | | SOON | 50075007 | `Mj7GE6LZiJUZFTgabmNkFoY2o6JCEwCMKopSUUC3kqj` | [explorer.soo.network](https://explorer.soo.network//address/Mj7GE6LZiJUZFTgabmNkFoY2o6JCEwCMKopSUUC3kqj) | | Superposition | 1000055244 | `0x2f536FB7a37bd817Af644072a904Ddc02Dae429f` | [explorer.superposition.so](https://explorer.superposition.so//address/0x2f536FB7a37bd817Af644072a904Ddc02Dae429f) | | Superseed | 5330 | `0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47` | [explorer.superseed.xyz](https://explorer.superseed.xyz/address/0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47) | | Swell | 1923 | `0x5C02157068a52cEcfc98EDb6115DE6134EcB4764` | [explorer.swellnetwork.io](https://explorer.swellnetwork.io/address/0x5C02157068a52cEcfc98EDb6115DE6134EcB4764) | | Taiko | 167000 | `0x6A55822cf11f9fcBc4c75BC2638AfE8Eb942cAdd` | [taikoscan.io](https://taikoscan.io/address/0x6A55822cf11f9fcBc4c75BC2638AfE8Eb942cAdd) | | Tangle | 5845 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [explorer.tangle.tools](https://explorer.tangle.tools/address/0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a) | | Telos EVM | 40 | `0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6` | [www.teloscan.io](https://www.teloscan.io/address/0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6) | | Torus | 21000 | `0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2` | [blockscout.torus.network](https://blockscout.torus.network/address/0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2) | | Treasure | 61166 | `0xc1FC99Ea4D8B2b06b674A2e91b5A4617c1dcFd22` | [treasurescan.io](https://treasurescan.io/address/0xc1FC99Ea4D8B2b06b674A2e91b5A4617c1dcFd22) | | Unichain | 130 | `0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47` | [unichain.blockscout.com](https://unichain.blockscout.com/address/0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47) | | Vana | 1480 | `0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47` | [vanascan.io](https://vanascan.io/address/0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47) | | Viction | 88 | `0x149db7afD694722747035d5AEC7007ccb6F8f112` | [www.vicscan.xyz](https://www.vicscan.xyz/address/0x149db7afD694722747035d5AEC7007ccb6F8f112) | | World Chain | 480 | `0x0054D19613f20dD72721A146ED408971a2CCA9BD` | [worldchain-mainnet-explorer.alchemy.com](https://worldchain-mainnet-explorer.alchemy.com/address/0x0054D19613f20dD72721A146ED408971a2CCA9BD) | | Xai | 660279 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [explorer.xai-chain.net](https://explorer.xai-chain.net/address/0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a) | | XLayer | 196 | `0x0054D19613f20dD72721A146ED408971a2CCA9BD` | [www.oklink.com](https://www.oklink.com/xlayer/address/0x0054D19613f20dD72721A146ED408971a2CCA9BD) | | XPLA | 37 | `0x7B032cBB00AD7438E802A66D8b64761A06E5df22` | [explorer.xpla.io](https://explorer.xpla.io/mainnet/address/0x7B032cBB00AD7438E802A66D8b64761A06E5df22) | | Zero Network | 543210 | `0x55379421409961Ef129738c24261379ef8A547Df` | [zerion-explorer.vercel.app](https://zerion-explorer.vercel.app/address/0x55379421409961Ef129738c24261379ef8A547Df) | | ZetaChain | 7000 | `0xE2ee936bEa8e42671c400aC96dE198E06F2bA2A6` | [explorer.zetachain.com](https://explorer.zetachain.com/address/0xE2ee936bEa8e42671c400aC96dE198E06F2bA2A6) | | Zircuit | 48900 | `0x4C97D35c668EE5194a13c8DE8Afc18cce40C9F28` | [explorer.zircuit.com](https://explorer.zircuit.com/address/0x4C97D35c668EE5194a13c8DE8Afc18cce40C9F28) | | zkLink Nova | 810180 | `0xA1ADFCa9666Bcd68b7b5C8b55e3ecC465DcDfE65` | [explorer.zklink.io](https://explorer.zklink.io/address/0xA1ADFCa9666Bcd68b7b5C8b55e3ecC465DcDfE65) | | zkSync | 324 | `0x823500D69D77A52212DC93f8836E9c08581487eE` | [explorer.zksync.io](https://explorer.zksync.io/address/0x823500D69D77A52212DC93f8836E9c08581487eE) | | Zora | 7777777 | `0x886BB0f329781b98f98FDeb1ce7a8957F2d43B9F` | [explorer.zora.energy](https://explorer.zora.energy/address/0x886BB0f329781b98f98FDeb1ce7a8957F2d43B9F) | | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Abstract Testnet | 11124 | `0x7fa6009b59F139813eA710dB5496976eE8D80E64` | [explorer.testnet.abs.xyz](https://explorer.testnet.abs.xyz/address/0x7fa6009b59F139813eA710dB5496976eE8D80E64) | | Aleph Zero EVM Testnet | 2039 | `0xB5fB1F5410a2c2b7deD462d018541383968cB01c` | [evm-explorer-testnet.alephzero.org](https://evm-explorer-testnet.alephzero.org/address/0xB5fB1F5410a2c2b7deD462d018541383968cB01c) | | Alfajores | 44787 | `0x221FA9CBaFcd6c1C3d206571Cf4427703e023FFa` | [explorer.celo.org](https://explorer.celo.org/alfajores/address/0x221FA9CBaFcd6c1C3d206571Cf4427703e023FFa) | | Arbitrum Sepolia | 421614 | `0xAD34A66Bf6dB18E858F6B686557075568c6E031C` | [sepolia.arbiscan.io](https://sepolia.arbiscan.io/address/0xAD34A66Bf6dB18E858F6B686557075568c6E031C) | | Arcadia Testnet v2 | 1098411886 | `0xEa7e618Bee8927fBb2fA20Bc41eE8DEA51838aAD` | [explorer.khalani.network](https://explorer.khalani.network/address/0xEa7e618Bee8927fBb2fA20Bc41eE8DEA51838aAD) | | Base Sepolia | 84532 | `0x86fb9F1c124fB20ff130C41a79a432F770f67AFD` | [sepolia.basescan.org](https://sepolia.basescan.org/address/0x86fb9F1c124fB20ff130C41a79a432F770f67AFD) | | Berachain bArtio | 80084 | `0x6c13643B3927C57DB92c790E4E3E7Ee81e13f78C` | [bartio.beratrail.io](https://bartio.beratrail.io//address/0x6c13643B3927C57DB92c790E4E3E7Ee81e13f78C) | | BSC Testnet | 97 | `0xc6cbF39A747f5E28d1bDc8D9dfDAb2960Abd5A8f` | [testnet.bscscan.com](https://testnet.bscscan.com/address/0xc6cbF39A747f5E28d1bDc8D9dfDAb2960Abd5A8f) | | Camp Network Testnet V2 | 325000 | `0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A` | [camp-network-testnet.blockscout.com](https://camp-network-testnet.blockscout.com/address/0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A) | | Citrea Testnet | 5115 | `0x783c4a0bB6663359281aD4a637D5af68F83ae213` | [explorer.testnet.citrea.xyz](https://explorer.testnet.citrea.xyz/address/0x783c4a0bB6663359281aD4a637D5af68F83ae213) | | Eco Testnet | 471923 | `0x86fb9F1c124fB20ff130C41a79a432F770f67AFD` | [eco-testnet.explorer.caldera.xyz](https://eco-testnet.explorer.caldera.xyz//address/0x86fb9F1c124fB20ff130C41a79a432F770f67AFD) | | Form Testnet | 132902 | `0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A` | [sepolia-explorer.form.network](https://sepolia-explorer.form.network/address/0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A) | | Fuji | 43113 | `0x9ff6ac3dAf63103620BBf76136eA1AFf43c2F612` | [testnet.snowtrace.io](https://testnet.snowtrace.io/address/0x9ff6ac3dAf63103620BBf76136eA1AFf43c2F612) | | Holesky | 17000 | `0x98AAE089CaD930C64a76dD2247a2aC5773a4B8cE` | [holesky.etherscan.io](https://holesky.etherscan.io/address/0x98AAE089CaD930C64a76dD2247a2aC5773a4B8cE) | | Hyperliquid EVM Testnet | 998 | `0x1b33611fCc073aB0737011d5512EF673Bff74962` | [explorer.hyperlend.finance](https://explorer.hyperlend.finance/address/0x1b33611fCc073aB0737011d5512EF673Bff74962) | | Ink Sepolia | 763373 | `0x4fE19d49F45854Da50b6009258929613EC92C147` | [explorer-sepolia.inkonchain.com](https://explorer-sepolia.inkonchain.com/address/0x4fE19d49F45854Da50b6009258929613EC92C147) | | Odyssey Testnet | 911867 | `0xFfa913705484C9BAea32Ffe9945BeA099A1DFF72` | [odyssey-explorer.ithaca.xyz](https://odyssey-explorer.ithaca.xyz/address/0xFfa913705484C9BAea32Ffe9945BeA099A1DFF72) | | Optimism Sepolia | 11155420 | `0x86fb9F1c124fB20ff130C41a79a432F770f67AFD` | [sepolia-optimistic.etherscan.io](https://sepolia-optimistic.etherscan.io/address/0x86fb9F1c124fB20ff130C41a79a432F770f67AFD) | | Plume Testnet | 161221135 | `0xddf4C3e791caCaFd26D7fb275549739B38ae6e75` | [plume-testnet.explorer.caldera.xyz](https://plume-testnet.explorer.caldera.xyz/address/0xddf4C3e791caCaFd26D7fb275549739B38ae6e75) | | Polygon Amoy | 80002 | `0xddf4C3e791caCaFd26D7fb275549739B38ae6e75` | [amoy.polygonscan.com](https://amoy.polygonscan.com/address/0xddf4C3e791caCaFd26D7fb275549739B38ae6e75) | | Scroll Sepolia | 534351 | `0x863E8c26621c52ACa1849C53500606e73BA272F0` | [sepolia.scrollscan.dev](https://sepolia.scrollscan.dev//address/0x863E8c26621c52ACa1849C53500606e73BA272F0) | | Sepolia | 11155111 | `0x4917a9746A7B6E0A57159cCb7F5a6744247f2d0d` | [sepolia.etherscan.io](https://sepolia.etherscan.io/address/0x4917a9746A7B6E0A57159cCb7F5a6744247f2d0d) | | Soneium Minato Testnet | 1946 | `0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A` | [explorer-testnet.soneium.org](https://explorer-testnet.soneium.org/address/0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A) | | Sonic Testnet | 64165 | `0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE` | [testnet.soniclabs.com](https://testnet.soniclabs.com/address/0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE) | | SUAVE Toliman Testnet | 33626250 | `0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A` | [explorer.toliman.suave.flashbots.net](https://explorer.toliman.suave.flashbots.net/address/0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A) | | Superposition Testnet | 98985 | `0x4926a10788306D84202A2aDbd290b7743146Cc17` | [testnet-explorer.superposition.so](https://testnet-explorer.superposition.so/address/0x4926a10788306D84202A2aDbd290b7743146Cc17) | | Treasure Topaz Testnet | 978658 | `0x7fa6009b59F139813eA710dB5496976eE8D80E64` | [topaz.treasurescan.io](https://topaz.treasurescan.io/address/0x7fa6009b59F139813eA710dB5496976eE8D80E64) | | Unichain Testnet | 1301 | `0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE` | [unichain-sepolia.blockscout.com](https://unichain-sepolia.blockscout.com/address/0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE) | --- # Test Recipient | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) Test Recipient ============== * Mainnet * Testnet | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Aleph Zero EVM | 1000041455 | `0x561BcA8D862536CD9C88f332C1A1Da0fC8F96e40` | [evm-explorer.alephzero.org](https://evm-explorer.alephzero.org/address/0x561BcA8D862536CD9C88f332C1A1Da0fC8F96e40) | | Ancient8 | 888888888 | `0x2Fa570E83009eaEef3a1cbd496a9a30F05266634` | [scan.ancient8.gg](https://scan.ancient8.gg/address/0x2Fa570E83009eaEef3a1cbd496a9a30F05266634) | | ApeChain | 33139 | `0x783EC5e105234a570eB90f314284E5dBe53bdd90` | [apechain.calderaexplorer.xyz](https://apechain.calderaexplorer.xyz/address/0x783EC5e105234a570eB90f314284E5dBe53bdd90) | | AppChain | 466 | `0xeF7F4367703cdf4863AD6Be34C1627d8b1C2D67a` | [explorer.appchain.xyz](https://explorer.appchain.xyz/address/0xeF7F4367703cdf4863AD6Be34C1627d8b1C2D67a) | | Arbitrum | 42161 | `0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35` | [arbiscan.io](https://arbiscan.io/address/0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35) | | Arbitrum Nova | 42170 | `0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96` | [nova.arbiscan.io](https://nova.arbiscan.io//address/0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96) | | Artela | 11820 | `0xa2401b57A8CCBF6AbD9b7e62e28811b2b523AB2B` | [artscan.artela.network](https://artscan.artela.network/address/0xa2401b57A8CCBF6AbD9b7e62e28811b2b523AB2B) | | Arthera | 10242 | `0x49998DFdeF3F0b05Fe103C435bF73f5D735a0b97` | [explorer.arthera.net](https://explorer.arthera.net/address/0x49998DFdeF3F0b05Fe103C435bF73f5D735a0b97) | | Astar | 592 | `0xbB22547D1dc681fe925f568f637Ff67aC06c20fc` | [astar.blockscout.com](https://astar.blockscout.com/address/0xbB22547D1dc681fe925f568f637Ff67aC06c20fc) | | Astar zkEVM | 3776 | `0xC49aF4965264FA7BB6424CE37aA06773ad177224` | [astar-zkevm.explorer.startale.com](https://astar-zkevm.explorer.startale.com/address/0xC49aF4965264FA7BB6424CE37aA06773ad177224) | | Aurora | 1313161554 | `0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615` | [explorer.mainnet.aurora.dev](https://explorer.mainnet.aurora.dev/address/0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615) | | Avalanche | 43114 | `0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35` | [snowtrace.io](https://snowtrace.io/address/0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35) | | B3 | 8333 | `0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96` | [explorer.b3.fun](https://explorer.b3.fun/address/0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96) | | Base | 8453 | `0xb7C9307fE90B9AB093c6D3EdeE3259f5378D5f03` | [basescan.org](https://basescan.org/address/0xb7C9307fE90B9AB093c6D3EdeE3259f5378D5f03) | | Bitlayer | 200901 | `0xbB22547D1dc681fe925f568f637Ff67aC06c20fc` | [www.btrscan.com](https://www.btrscan.com/address/0xbB22547D1dc681fe925f568f637Ff67aC06c20fc) | | Blast | 81457 | `0x17E216fBb22dF4ef8A6640ae9Cb147C92710ac84` | [blastexplorer.io](https://blastexplorer.io/address/0x17E216fBb22dF4ef8A6640ae9Cb147C92710ac84) | | BOB | 60808 | `0xe03dad16074BC5EEA9A9311257BF02Eb0B6AAA2b` | [explorer.gobob.xyz](https://explorer.gobob.xyz/address/0xe03dad16074BC5EEA9A9311257BF02Eb0B6AAA2b) | | Boba Mainnet | 288 | `0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE` | [bobascan.com](https://bobascan.com/address/0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE) | | Binance Smart Chain | 56 | `0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35` | [bscscan.com](https://bscscan.com/address/0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35) | | B² Network | 223 | `0x0F9d4704E1Fb25e416042524e594F1cEac6fF597` | [explorer.bsquared.network](https://explorer.bsquared.network/address/0x0F9d4704E1Fb25e416042524e594F1cEac6fF597) | | Celo | 42220 | `0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35` | [celoscan.io](https://celoscan.io/address/0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35) | | CheeseChain | 383353 | `0x4848d54987ffc732aD313827cdC25DF2eedD79d8` | [fetascan.xyz](https://fetascan.xyz/address/0x4848d54987ffc732aD313827cdC25DF2eedD79d8) | | Chiliz | 1000088888 | `0xE67Dc24970B482579923551Ede52BD35a2858989` | [chiliscan.com](https://chiliscan.com/address/0xE67Dc24970B482579923551Ede52BD35a2858989) | | Conflux eSpace | 1030 | `0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7` | [evm.confluxscan.net](https://evm.confluxscan.net/address/0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7) | | Conwai | 668668 | `0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7` | [conwai.calderaexplorer.xyz](https://conwai.calderaexplorer.xyz/address/0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7) | | Core | 1116 | `0xbB22547D1dc681fe925f568f637Ff67aC06c20fc` | [scan.coredao.org](https://scan.coredao.org/address/0xbB22547D1dc681fe925f568f637Ff67aC06c20fc) | | Corn | 21000000 | `0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7` | [cornscan.io](https://cornscan.io/address/0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7) | | Cyber | 7560 | `0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67` | [cyberscan.co](https://cyberscan.co/address/0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67) | | Degen | 666666666 | `0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67` | [explorer.degen.tips](https://explorer.degen.tips/address/0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67) | | Dogechain | 2000 | `0xbB22547D1dc681fe925f568f637Ff67aC06c20fc` | [explorer.dogechain.dog](https://explorer.dogechain.dog/address/0xbB22547D1dc681fe925f568f637Ff67aC06c20fc) | | DuckChain | 5545 | `0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE` | [scan.duckchain.io](https://scan.duckchain.io/address/0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE) | | Endurance | 648 | `0xD670c00C0Cad3D32436d7cF270e739772314A8CE` | [explorer-endurance.fusionist.io](https://explorer-endurance.fusionist.io/address/0xD670c00C0Cad3D32436d7cF270e739772314A8CE) | | Ethereum | 1 | `0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35` | [etherscan.io](https://etherscan.io/address/0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35) | | Everclear | 25327 | `0xF15D70941dE2Bf95A23d6488eBCbedE0a444137f` | [scan.everclear.org](https://scan.everclear.org/address/0xF15D70941dE2Bf95A23d6488eBCbedE0a444137f) | | Evmos EVM | 9001 | `0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7` | [www.mintscan.io](https://www.mintscan.io/evmos/address/0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7) | | Fantom Opera | 250 | `0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96` | [ftmscan.com](https://ftmscan.com/address/0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96) | | Flame | 253368190 | `0xeE8C0E1EeBfFCC451a013336386eA53E42a44451` | [explorer.flame.astria.org](https://explorer.flame.astria.org/address/0xeE8C0E1EeBfFCC451a013336386eA53E42a44451) | | Flare | 14 | `0xbB22547D1dc681fe925f568f637Ff67aC06c20fc` | [flare-explorer.flare.network](https://flare-explorer.flare.network/address/0xbB22547D1dc681fe925f568f637Ff67aC06c20fc) | | EVM on Flow | 1000000747 | `0xa7028308Ff277DB5851a95d82ED5C5256bB721F2` | [evm.flowscan.io](https://evm.flowscan.io/address/0xa7028308Ff277DB5851a95d82ED5C5256bB721F2) | | Form | 478 | `0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7` | [explorer.form.network](https://explorer.form.network/address/0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7) | | Fraxtal | 252 | `0x62B7592C1B6D1E43f4630B8e37f4377097840C05` | [fraxscan.com](https://fraxscan.com/address/0x62B7592C1B6D1E43f4630B8e37f4377097840C05) | | Fuse | 122 | `0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de` | [explorer.fuse.io](https://explorer.fuse.io/address/0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de) | | Gnosis | 100 | `0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35` | [gnosisscan.io](https://gnosisscan.io/address/0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35) | | Gravity Alpha Mainnet | 1625 | `0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53` | [explorer.gravity.xyz](https://explorer.gravity.xyz/address/0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53) | | Guru Network | 260 | `0xE885941aF52eab9E7f4c67392eACd96ea2A65d9B` | [blockscout.gurunetwork.ai](https://blockscout.gurunetwork.ai/address/0xE885941aF52eab9E7f4c67392eACd96ea2A65d9B) | | Harmony One | 1666600000 | `0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96` | [explorer.harmony.one](https://explorer.harmony.one/address/0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96) | | Hemi Network | 43111 | `0xa2401b57A8CCBF6AbD9b7e62e28811b2b523AB2B` | [explorer.hemi.xyz](https://explorer.hemi.xyz/address/0xa2401b57A8CCBF6AbD9b7e62e28811b2b523AB2B) | | Immutable zkEVM | 1000013371 | `0x01EBa6D613DC09Cb899aF1e8E8a747416d7250ad` | [explorer.immutable.com](https://explorer.immutable.com/address/0x01EBa6D613DC09Cb899aF1e8E8a747416d7250ad) | | Injective EVM | 2525 | `0x28291a7062afA569104bEd52F7AcCA3dD2FafD11` | [inevm.calderaexplorer.xyz](https://inevm.calderaexplorer.xyz/address/0x28291a7062afA569104bEd52F7AcCA3dD2FafD11) | | Ink | 57073 | `0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615` | [explorer.inkonchain.com](https://explorer.inkonchain.com/address/0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615) | | Kaia | 8217 | `0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96` | [kaiascope.com](https://kaiascope.com/address/0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96) | | Kroma | 255 | `0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67` | [blockscout.kroma.network](https://blockscout.kroma.network/address/0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67) | | Linea | 59144 | `0x273Bc6b01D9E88c064b6E5e409BdF998246AEF42` | [lineascan.build](https://lineascan.build/address/0x273Bc6b01D9E88c064b6E5e409BdF998246AEF42) | | Lisk | 1135 | `0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67` | [blockscout.lisk.com](https://blockscout.lisk.com/address/0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67) | | LUKSO | 42 | `0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd` | [explorer.execution.mainnet.lukso.network](https://explorer.execution.mainnet.lukso.network/address/0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd) | | Lumia Prism | 1000073017 | `0x128Ff1d24665d55f4b77B1FDbb6d8D0Ec4a0c0a1` | [explorer.lumia.org](https://explorer.lumia.org/address/0x128Ff1d24665d55f4b77B1FDbb6d8D0Ec4a0c0a1) | | Manta Pacific | 169 | `0x4E1c88DD261BEe2941e6c1814597e30F53330428` | [pacific-explorer.manta.network](https://pacific-explorer.manta.network/address/0x4E1c88DD261BEe2941e6c1814597e30F53330428) | | Mantle | 5000 | `0x62B7592C1B6D1E43f4630B8e37f4377097840C05` | [explorer.mantle.xyz](https://explorer.mantle.xyz/address/0x62B7592C1B6D1E43f4630B8e37f4377097840C05) | | Merlin | 4200 | `0xc401e251CCa7A364114504A994D6fC7cb1c243AB` | [scan.merlinchain.io](https://scan.merlinchain.io/address/0xc401e251CCa7A364114504A994D6fC7cb1c243AB) | | Metal L2 | 1000001750 | `0xc4D0b4ef01eD7091792fe3D4c039457719e2DC68` | [explorer.metall2.com](https://explorer.metall2.com/address/0xc4D0b4ef01eD7091792fe3D4c039457719e2DC68) | | Metis Andromeda | 1088 | `0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67` | [andromeda-explorer.metis.io](https://andromeda-explorer.metis.io/address/0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67) | | Mint | 185 | `0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67` | [explorer.mintchain.io](https://explorer.mintchain.io/address/0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67) | | Mode | 34443 | `0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0` | [explorer.mode.network](https://explorer.mode.network/address/0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0) | | Molten | 360 | `0xbB22547D1dc681fe925f568f637Ff67aC06c20fc` | [molten.calderaexplorer.xyz](https://molten.calderaexplorer.xyz/address/0xbB22547D1dc681fe925f568f637Ff67aC06c20fc) | | Moonbeam | 1284 | `0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35` | [moonscan.io](https://moonscan.io/address/0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35) | | Morph | 2818 | `0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96` | [explorer.morphl2.io](https://explorer.morphl2.io/address/0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96) | | Nero | 1689 | `0xa2401b57A8CCBF6AbD9b7e62e28811b2b523AB2B` | [www.neroscan.io](https://www.neroscan.io/address/0xa2401b57A8CCBF6AbD9b7e62e28811b2b523AB2B) | | Oort | 970 | `0x58556AaeB2e3829d52EE5E711D44735412efA43B` | [mainnet-scan.oortech.com](https://mainnet-scan.oortech.com/address/0x58556AaeB2e3829d52EE5E711D44735412efA43B) | | Optimism | 10 | `0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35` | [optimistic.etherscan.io](https://optimistic.etherscan.io/address/0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35) | | Orderly L2 | 291 | `0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96` | [explorer.orderly.network](https://explorer.orderly.network/address/0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96) | | Polygon | 137 | `0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35` | [polygonscan.com](https://polygonscan.com/address/0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35) | | Polygon zkEVM | 1101 | `0xD127D4549cb4A5B2781303a4fE99a10EAd13263A` | [zkevm.polygonscan.com](https://zkevm.polygonscan.com/address/0xD127D4549cb4A5B2781303a4fE99a10EAd13263A) | | Polynomial | 1000008008 | `0xa1c3884EbE24Cccb120B2E98a55f85140563aa4C` | [polynomialscan.io](https://polynomialscan.io/address/0xa1c3884EbE24Cccb120B2E98a55f85140563aa4C) | | Prom | 227 | `0x83f647970B213675412b76e1cCDB55D0e35365fD` | [prom-blockscout.eu-north-2.gateway.fm](https://prom-blockscout.eu-north-2.gateway.fm/address/0x83f647970B213675412b76e1cCDB55D0e35365fD) | | Proof of Play Apex | 70700 | `0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67` | [explorer.apex.proofofplay.com](https://explorer.apex.proofofplay.com/address/0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67) | | RARI Chain | 1000012617 | `0xCE8260c1b5cF2fAD15bb4B6542716b050Fdf35c9` | [mainnet.explorer.rarichain.org](https://mainnet.explorer.rarichain.org/address/0xCE8260c1b5cF2fAD15bb4B6542716b050Fdf35c9) | | re.al | 111188 | `0xc401e251CCa7A364114504A994D6fC7cb1c243AB` | [explorer.re.al](https://explorer.re.al/address/0xc401e251CCa7A364114504A994D6fC7cb1c243AB) | | Redstone | 690 | `0x1Ab68dC4f7b6cfcd00218D4b761b7F3b5a724555` | [explorer.redstone.xyz](https://explorer.redstone.xyz/address/0x1Ab68dC4f7b6cfcd00218D4b761b7F3b5a724555) | | Rivalz | 753 | `0x92249B8ed35C2980e58666a3EBF4a075DDD2895f` | [rivalz.calderaexplorer.xyz](https://rivalz.calderaexplorer.xyz/address/0x92249B8ed35C2980e58666a3EBF4a075DDD2895f) | | Rootstock | 1000000030 | `0x693A4cE39d99e46B04cb562329e3F0141cA17331` | [rootstock.blockscout.com](https://rootstock.blockscout.com/address/0x693A4cE39d99e46B04cb562329e3F0141cA17331) | | Sanko | 1996 | `0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67` | [explorer.sanko.xyz](https://explorer.sanko.xyz/address/0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67) | | Scroll | 534352 | `0x674f4698d063cE4C0d604c88dD7D542De72f327f` | [scrollscan.com](https://scrollscan.com//address/0x674f4698d063cE4C0d604c88dD7D542De72f327f) | | Sei | 1329 | `0xdB670e1a1e312BF17425b08cE55Bdf2cD8F8eD54` | [seitrace.com](https://seitrace.com/address/0xdB670e1a1e312BF17425b08cE55Bdf2cD8F8eD54) | | Shibarium | 109 | `0xbB22547D1dc681fe925f568f637Ff67aC06c20fc` | [shibariumscan.io](https://shibariumscan.io/address/0xbB22547D1dc681fe925f568f637Ff67aC06c20fc) | | SnaxChain | 2192 | `0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96` | [explorer.snaxchain.io](https://explorer.snaxchain.io/address/0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96) | | Soneium | 1868 | `0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7` | [soneium.blockscout.com](https://soneium.blockscout.com/address/0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7) | | Sonic | 146 | `0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7` | [sonicscan.org](https://sonicscan.org/address/0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7) | | Superposition | 1000055244 | `0x545E289B88c6d97b74eC0B96e308cae46Bf5f832` | [explorer.superposition.so](https://explorer.superposition.so//address/0x545E289B88c6d97b74eC0B96e308cae46Bf5f832) | | Superseed | 5330 | `0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE` | [explorer.superseed.xyz](https://explorer.superseed.xyz/address/0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE) | | Swell | 1923 | `0xBC53dACd8c0ac0d2bAC461479EAaf5519eCC8853` | [explorer.swellnetwork.io](https://explorer.swellnetwork.io/address/0xBC53dACd8c0ac0d2bAC461479EAaf5519eCC8853) | | Taiko | 167000 | `0x5fC427653b175F6De5A494DE17d1c7636d7E7965` | [taikoscan.io](https://taikoscan.io/address/0x5fC427653b175F6De5A494DE17d1c7636d7E7965) | | Tangle | 5845 | `0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67` | [explorer.tangle.tools](https://explorer.tangle.tools/address/0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67) | | Telos EVM | 40 | `0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7` | [www.teloscan.io](https://www.teloscan.io/address/0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7) | | Torus | 21000 | `0x92249B8ed35C2980e58666a3EBF4a075DDD2895f` | [blockscout.torus.network](https://blockscout.torus.network/address/0x92249B8ed35C2980e58666a3EBF4a075DDD2895f) | | Treasure | 61166 | `0x54E88f2ab58E0Ab4B7Ce081FB20D85b16af041d2` | [treasurescan.io](https://treasurescan.io/address/0x54E88f2ab58E0Ab4B7Ce081FB20D85b16af041d2) | | Unichain | 130 | `0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE` | [unichain.blockscout.com](https://unichain.blockscout.com/address/0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE) | | Vana | 1480 | `0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE` | [vanascan.io](https://vanascan.io/address/0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE) | | Viction | 88 | `0x17E216fBb22dF4ef8A6640ae9Cb147C92710ac84` | [www.vicscan.xyz](https://www.vicscan.xyz/address/0x17E216fBb22dF4ef8A6640ae9Cb147C92710ac84) | | World Chain | 480 | `0x4848d54987ffc732aD313827cdC25DF2eedD79d8` | [worldchain-mainnet-explorer.alchemy.com](https://worldchain-mainnet-explorer.alchemy.com/address/0x4848d54987ffc732aD313827cdC25DF2eedD79d8) | | Xai | 660279 | `0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67` | [explorer.xai-chain.net](https://explorer.xai-chain.net/address/0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67) | | XLayer | 196 | `0x4848d54987ffc732aD313827cdC25DF2eedD79d8` | [www.oklink.com](https://www.oklink.com/xlayer/address/0x4848d54987ffc732aD313827cdC25DF2eedD79d8) | | XPLA | 37 | `0x7Ce3a48cd9FD80004d95b088760bD05bA86C1f7b` | [explorer.xpla.io](https://explorer.xpla.io/mainnet/address/0x7Ce3a48cd9FD80004d95b088760bD05bA86C1f7b) | | Zero Network | 543210 | `0xC18bE7ac43334F501fd9622877160b085215dECC` | [zerion-explorer.vercel.app](https://zerion-explorer.vercel.app/address/0xC18bE7ac43334F501fd9622877160b085215dECC) | | ZetaChain | 7000 | `0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0` | [explorer.zetachain.com](https://explorer.zetachain.com/address/0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0) | | Zircuit | 48900 | `0xA34ceDf9068C5deE726C67A4e1DCfCc2D6E2A7fD` | [explorer.zircuit.com](https://explorer.zircuit.com/address/0xA34ceDf9068C5deE726C67A4e1DCfCc2D6E2A7fD) | | zkLink Nova | 810180 | `0x58e8699b8e0a2A3ba40b380038f64F0B3ef4f2e5` | [explorer.zklink.io](https://explorer.zklink.io/address/0x58e8699b8e0a2A3ba40b380038f64F0B3ef4f2e5) | | zkSync | 324 | `0xD55078c54b0cEAa87Ba5c3fAeAC89861c69F636d` | [explorer.zksync.io](https://explorer.zksync.io/address/0xD55078c54b0cEAa87Ba5c3fAeAC89861c69F636d) | | Zora | 7777777 | `0x6119B76720CcfeB3D256EC1b91218EEfFD6756E1` | [explorer.zora.energy](https://explorer.zora.energy/address/0x6119B76720CcfeB3D256EC1b91218EEfFD6756E1) | | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Abstract Testnet | 11124 | `0x9EC79CA89DeF61BFa2f38cD4fCC137b9e49d60dD` | [explorer.testnet.abs.xyz](https://explorer.testnet.abs.xyz/address/0x9EC79CA89DeF61BFa2f38cD4fCC137b9e49d60dD) | | Aleph Zero EVM Testnet | 2039 | `0x843908541D24d9F6Fa30C8Bb1c39038C947D08fC` | [evm-explorer-testnet.alephzero.org](https://evm-explorer-testnet.alephzero.org/address/0x843908541D24d9F6Fa30C8Bb1c39038C947D08fC) | | Alfajores | 44787 | `0x6489d13AcAd3B8dce4c5B31f375DE4f9451E7b38` | [explorer.celo.org](https://explorer.celo.org/alfajores/address/0x6489d13AcAd3B8dce4c5B31f375DE4f9451E7b38) | | Arbitrum Sepolia | 421614 | `0x6c13643B3927C57DB92c790E4E3E7Ee81e13f78C` | [sepolia.arbiscan.io](https://sepolia.arbiscan.io/address/0x6c13643B3927C57DB92c790E4E3E7Ee81e13f78C) | | Arcadia Testnet v2 | 1098411886 | `0xCB3c489a2FB67a7Cd555D47B3a9A0E654784eD16` | [explorer.khalani.network](https://explorer.khalani.network/address/0xCB3c489a2FB67a7Cd555D47B3a9A0E654784eD16) | | Base Sepolia | 84532 | `0x783c4a0bB6663359281aD4a637D5af68F83ae213` | [sepolia.basescan.org](https://sepolia.basescan.org/address/0x783c4a0bB6663359281aD4a637D5af68F83ae213) | | Berachain bArtio | 80084 | `0xe0B988062A0C6492177d64823Ab95a9c256c2a5F` | [bartio.beratrail.io](https://bartio.beratrail.io//address/0xe0B988062A0C6492177d64823Ab95a9c256c2a5F) | | BSC Testnet | 97 | `0xfbcD1c00a3d809f36cC1A15918694B17B32c0b6c` | [testnet.bscscan.com](https://testnet.bscscan.com/address/0xfbcD1c00a3d809f36cC1A15918694B17B32c0b6c) | | Camp Network Testnet V2 | 325000 | `0x7483faD0Bc297667664A43A064bA7c9911659f57` | [camp-network-testnet.blockscout.com](https://camp-network-testnet.blockscout.com/address/0x7483faD0Bc297667664A43A064bA7c9911659f57) | | Citrea Testnet | 5115 | `0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8` | [explorer.testnet.citrea.xyz](https://explorer.testnet.citrea.xyz/address/0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8) | | Eco Testnet | 471923 | `0x783c4a0bB6663359281aD4a637D5af68F83ae213` | [eco-testnet.explorer.caldera.xyz](https://eco-testnet.explorer.caldera.xyz//address/0x783c4a0bB6663359281aD4a637D5af68F83ae213) | | Form Testnet | 132902 | `0x7483faD0Bc297667664A43A064bA7c9911659f57` | [sepolia-explorer.form.network](https://sepolia-explorer.form.network/address/0x7483faD0Bc297667664A43A064bA7c9911659f57) | | Fuji | 43113 | `0x44a7e1d76fD8AfA244AdE7278336E3D5C658D398` | [testnet.snowtrace.io](https://testnet.snowtrace.io/address/0x44a7e1d76fD8AfA244AdE7278336E3D5C658D398) | | Holesky | 17000 | `0x86fb9F1c124fB20ff130C41a79a432F770f67AFD` | [holesky.etherscan.io](https://holesky.etherscan.io/address/0x86fb9F1c124fB20ff130C41a79a432F770f67AFD) | | Hyperliquid EVM Testnet | 998 | `0xB057Fb841027a8554521DcCdeC3c3474CaC99AB5` | [explorer.hyperlend.finance](https://explorer.hyperlend.finance/address/0xB057Fb841027a8554521DcCdeC3c3474CaC99AB5) | | Ink Sepolia | 763373 | `0x0e91088824Fa6E2675b2a53DA3491a9B098bD868` | [explorer-sepolia.inkonchain.com](https://explorer-sepolia.inkonchain.com/address/0x0e91088824Fa6E2675b2a53DA3491a9B098bD868) | | Odyssey Testnet | 911867 | `0x5e65279Fb7293a058776e37587398fcc3E9184b1` | [odyssey-explorer.ithaca.xyz](https://odyssey-explorer.ithaca.xyz/address/0x5e65279Fb7293a058776e37587398fcc3E9184b1) | | Optimism Sepolia | 11155420 | `0x783c4a0bB6663359281aD4a637D5af68F83ae213` | [sepolia-optimistic.etherscan.io](https://sepolia-optimistic.etherscan.io/address/0x783c4a0bB6663359281aD4a637D5af68F83ae213) | | Plume Testnet | 161221135 | `0xe0B988062A0C6492177d64823Ab95a9c256c2a5F` | [plume-testnet.explorer.caldera.xyz](https://plume-testnet.explorer.caldera.xyz/address/0xe0B988062A0C6492177d64823Ab95a9c256c2a5F) | | Polygon Amoy | 80002 | `0x04438ef7622f5412f82915F59caD4f704C61eA48` | [amoy.polygonscan.com](https://amoy.polygonscan.com/address/0x04438ef7622f5412f82915F59caD4f704C61eA48) | | Scroll Sepolia | 534351 | `0xa3AB7E6cE24E6293bD5320A53329Ef2f4DE73fCA` | [sepolia.scrollscan.dev](https://sepolia.scrollscan.dev//address/0xa3AB7E6cE24E6293bD5320A53329Ef2f4DE73fCA) | | Sepolia | 11155111 | `0xeDc1A3EDf87187085A3ABb7A9a65E1e7aE370C07` | [sepolia.etherscan.io](https://sepolia.etherscan.io/address/0xeDc1A3EDf87187085A3ABb7A9a65E1e7aE370C07) | | Soneium Minato Testnet | 1946 | `0x7483faD0Bc297667664A43A064bA7c9911659f57` | [explorer-testnet.soneium.org](https://explorer-testnet.soneium.org/address/0x7483faD0Bc297667664A43A064bA7c9911659f57) | | Sonic Testnet | 64165 | `0x01812D60958798695391dacF092BAc4a715B1718` | [testnet.soniclabs.com](https://testnet.soniclabs.com/address/0x01812D60958798695391dacF092BAc4a715B1718) | | SUAVE Toliman Testnet | 33626250 | `0x7483faD0Bc297667664A43A064bA7c9911659f57` | [explorer.toliman.suave.flashbots.net](https://explorer.toliman.suave.flashbots.net/address/0x7483faD0Bc297667664A43A064bA7c9911659f57) | | Superposition Testnet | 98985 | `0xAb9B273366D794B7F80B4378bc8Aaca75C6178E2` | [testnet-explorer.superposition.so](https://testnet-explorer.superposition.so/address/0xAb9B273366D794B7F80B4378bc8Aaca75C6178E2) | | Tangle Testnet | 3799 | `0xE73cdFFcE97AD56723dbA6145a3cC0Dd3aeF112f` | [testnet-explorer.tangle.tools](https://testnet-explorer.tangle.tools//address/0xE73cdFFcE97AD56723dbA6145a3cC0Dd3aeF112f) | | Treasure Topaz Testnet | 978658 | `0x9EC79CA89DeF61BFa2f38cD4fCC137b9e49d60dD` | [topaz.treasurescan.io](https://topaz.treasurescan.io/address/0x9EC79CA89DeF61BFa2f38cD4fCC137b9e49d60dD) | | Unichain Testnet | 1301 | `0x01812D60958798695391dacF092BAc4a715B1718` | [unichain-sepolia.blockscout.com](https://unichain-sepolia.blockscout.com/address/0x01812D60958798695391dacF092BAc4a715B1718) | --- # Storage Gas Oracle | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) Storage Gas Oracle ================== * Mainnet * Testnet | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Aleph Zero EVM | 1000041455 | `0xDd260B99d302f0A3fF885728c086f729c06f227f` | [evm-explorer.alephzero.org](https://evm-explorer.alephzero.org/address/0xDd260B99d302f0A3fF885728c086f729c06f227f) | | Ancient8 | 888888888 | `0x59Bf7c7b458375b1A7c453aE70EaCb376E65CDAF` | [scan.ancient8.gg](https://scan.ancient8.gg/address/0x59Bf7c7b458375b1A7c453aE70EaCb376E65CDAF) | | ApeChain | 33139 | `0xF1854214392864c628A16930E73B699f7a51b3EE` | [apechain.calderaexplorer.xyz](https://apechain.calderaexplorer.xyz/address/0xF1854214392864c628A16930E73B699f7a51b3EE) | | AppChain | 466 | `0xA376b27212D608324808923Add679A2c9FAFe9Da` | [explorer.appchain.xyz](https://explorer.appchain.xyz/address/0xA376b27212D608324808923Add679A2c9FAFe9Da) | | Arbitrum | 42161 | `0xD3805207b65d99C075ceA938Fa7c0587026a5DF5` | [arbiscan.io](https://arbiscan.io/address/0xD3805207b65d99C075ceA938Fa7c0587026a5DF5) | | Arbitrum Nova | 42170 | `0x2F619Ac5122689180AeBB930ADccdae215d538a9` | [nova.arbiscan.io](https://nova.arbiscan.io//address/0x2F619Ac5122689180AeBB930ADccdae215d538a9) | | Artela | 11820 | `0x60515f328B2c55Df63f456D9D839a0082892dEf8` | [artscan.artela.network](https://artscan.artela.network/address/0x60515f328B2c55Df63f456D9D839a0082892dEf8) | | Arthera | 10242 | `0x8d9Bd7E9ec3cd799a659EE650DfF6C799309fA91` | [explorer.arthera.net](https://explorer.arthera.net/address/0x8d9Bd7E9ec3cd799a659EE650DfF6C799309fA91) | | Astar | 592 | `0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0` | [astar.blockscout.com](https://astar.blockscout.com/address/0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0) | | Astar zkEVM | 3776 | `0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0` | [astar-zkevm.explorer.startale.com](https://astar-zkevm.explorer.startale.com/address/0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0) | | Aurora | 1313161554 | `0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7` | [explorer.mainnet.aurora.dev](https://explorer.mainnet.aurora.dev/address/0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7) | | Avalanche | 43114 | `0x175821F30AdCAA4bbB72Ce98eF76C2E0De2C3f21` | [snowtrace.io](https://snowtrace.io/address/0x175821F30AdCAA4bbB72Ce98eF76C2E0De2C3f21) | | B3 | 8333 | `0x2F619Ac5122689180AeBB930ADccdae215d538a9` | [explorer.b3.fun](https://explorer.b3.fun/address/0x2F619Ac5122689180AeBB930ADccdae215d538a9) | | Base | 8453 | `0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2` | [basescan.org](https://basescan.org/address/0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2) | | Bitlayer | 200901 | `0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0` | [www.btrscan.com](https://www.btrscan.com/address/0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0) | | Blast | 81457 | `0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0` | [blastexplorer.io](https://blastexplorer.io/address/0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0) | | BOB | 60808 | `0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E` | [explorer.gobob.xyz](https://explorer.gobob.xyz/address/0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E) | | Boba Mainnet | 288 | `0xbb0AE51BCa526cF313b6a95BfaB020794af6C394` | [bobascan.com](https://bobascan.com/address/0xbb0AE51BCa526cF313b6a95BfaB020794af6C394) | | Binance Smart Chain | 56 | `0x91d23D603d60445411C06e6443d81395593B7940` | [bscscan.com](https://bscscan.com/address/0x91d23D603d60445411C06e6443d81395593B7940) | | B² Network | 223 | `0x451dF8AB0936D85526D816f0b4dCaDD934A034A4` | [explorer.bsquared.network](https://explorer.bsquared.network/address/0x451dF8AB0936D85526D816f0b4dCaDD934A034A4) | | Celo | 42220 | `0xD9A9966E7dA9a7f0032bF449FB12696a638E673C` | [celoscan.io](https://celoscan.io/address/0xD9A9966E7dA9a7f0032bF449FB12696a638E673C) | | CheeseChain | 383353 | `0xe4057c5B0c43Dc18E36b08C39B419F190D29Ac2d` | [fetascan.xyz](https://fetascan.xyz/address/0xe4057c5B0c43Dc18E36b08C39B419F190D29Ac2d) | | Chiliz | 1000088888 | `0x87ED6926abc9E38b9C7C19f835B41943b622663c` | [chiliscan.com](https://chiliscan.com/address/0x87ED6926abc9E38b9C7C19f835B41943b622663c) | | Conflux eSpace | 1030 | `0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2` | [evm.confluxscan.net](https://evm.confluxscan.net/address/0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2) | | Conwai | 668668 | `0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2` | [conwai.calderaexplorer.xyz](https://conwai.calderaexplorer.xyz/address/0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2) | | Core | 1116 | `0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0` | [scan.coredao.org](https://scan.coredao.org/address/0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0) | | Corn | 21000000 | `0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2` | [cornscan.io](https://cornscan.io/address/0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2) | | Cyber | 7560 | `0x7b2e996742fA42d223652A344252B725D1bC428C` | [cyberscan.co](https://cyberscan.co/address/0x7b2e996742fA42d223652A344252B725D1bC428C) | | Degen | 666666666 | `0x7b2e996742fA42d223652A344252B725D1bC428C` | [explorer.degen.tips](https://explorer.degen.tips/address/0x7b2e996742fA42d223652A344252B725D1bC428C) | | Dogechain | 2000 | `0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0` | [explorer.dogechain.dog](https://explorer.dogechain.dog/address/0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0) | | DuckChain | 5545 | `0xbb0AE51BCa526cF313b6a95BfaB020794af6C394` | [scan.duckchain.io](https://scan.duckchain.io/address/0xbb0AE51BCa526cF313b6a95BfaB020794af6C394) | | Endurance | 648 | `0xe243Fb51d91c5DE62afAbE44F7Ed2D4DC51668C6` | [explorer-endurance.fusionist.io](https://explorer-endurance.fusionist.io/address/0xe243Fb51d91c5DE62afAbE44F7Ed2D4DC51668C6) | | Ethereum | 1 | `0xc9a103990A8dB11b4f627bc5CD1D0c2685484Ec5` | [etherscan.io](https://etherscan.io/address/0xc9a103990A8dB11b4f627bc5CD1D0c2685484Ec5) | | Everclear | 25327 | `0xf8344D85a1429708e0BE6724218E938087e596DF` | [scan.everclear.org](https://scan.everclear.org/address/0xf8344D85a1429708e0BE6724218E938087e596DF) | | Evmos EVM | 9001 | `0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2` | [www.mintscan.io](https://www.mintscan.io/evmos/address/0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2) | | Fantom Opera | 250 | `0x2F619Ac5122689180AeBB930ADccdae215d538a9` | [ftmscan.com](https://ftmscan.com/address/0x2F619Ac5122689180AeBB930ADccdae215d538a9) | | Flame | 253368190 | `0x18B0688990720103dB63559a3563f7E8d0f63EDb` | [explorer.flame.astria.org](https://explorer.flame.astria.org/address/0x18B0688990720103dB63559a3563f7E8d0f63EDb) | | Flare | 14 | `0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0` | [flare-explorer.flare.network](https://flare-explorer.flare.network/address/0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0) | | EVM on Flow | 1000000747 | `0xa2554A53890c0E769e3fa8b9A0b7e72F6A617367` | [evm.flowscan.io](https://evm.flowscan.io/address/0xa2554A53890c0E769e3fa8b9A0b7e72F6A617367) | | Form | 478 | `0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2` | [explorer.form.network](https://explorer.form.network/address/0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2) | | Fraxtal | 252 | `0x5060eCD5dFAD300A90592C04e504600A7cdcF70b` | [fraxscan.com](https://fraxscan.com/address/0x5060eCD5dFAD300A90592C04e504600A7cdcF70b) | | Fuse | 122 | `0x61374178e45F65fF9D6252d017Cd580FC60B7654` | [explorer.fuse.io](https://explorer.fuse.io/address/0x61374178e45F65fF9D6252d017Cd580FC60B7654) | | Gnosis | 100 | `0x5E01d8F34b629E3f92d69546bbc4142A7Adee7e9` | [gnosisscan.io](https://gnosisscan.io/address/0x5E01d8F34b629E3f92d69546bbc4142A7Adee7e9) | | Gravity Alpha Mainnet | 1625 | `0xD0dca420feFda68537695A8D887080eeF4030AF7` | [explorer.gravity.xyz](https://explorer.gravity.xyz/address/0xD0dca420feFda68537695A8D887080eeF4030AF7) | | Guru Network | 260 | `0x93D41E41cA545a35A81d11b08D2eE8b852C768df` | [blockscout.gurunetwork.ai](https://blockscout.gurunetwork.ai/address/0x93D41E41cA545a35A81d11b08D2eE8b852C768df) | | Harmony One | 1666600000 | `0x2F619Ac5122689180AeBB930ADccdae215d538a9` | [explorer.harmony.one](https://explorer.harmony.one/address/0x2F619Ac5122689180AeBB930ADccdae215d538a9) | | Hemi Network | 43111 | `0x60515f328B2c55Df63f456D9D839a0082892dEf8` | [explorer.hemi.xyz](https://explorer.hemi.xyz/address/0x60515f328B2c55Df63f456D9D839a0082892dEf8) | | Immutable zkEVM | 1000013371 | `0x9c2214467Daf9e2e1F45b36d08ce0b9C65BFeA88` | [explorer.immutable.com](https://explorer.immutable.com/address/0x9c2214467Daf9e2e1F45b36d08ce0b9C65BFeA88) | | Injective EVM | 2525 | `0x6119E37Bd66406A1Db74920aC79C15fB8411Ba76` | [inevm.calderaexplorer.xyz](https://inevm.calderaexplorer.xyz/address/0x6119E37Bd66406A1Db74920aC79C15fB8411Ba76) | | Ink | 57073 | `0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7` | [explorer.inkonchain.com](https://explorer.inkonchain.com/address/0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7) | | Kaia | 8217 | `0x2F619Ac5122689180AeBB930ADccdae215d538a9` | [kaiascope.com](https://kaiascope.com/address/0x2F619Ac5122689180AeBB930ADccdae215d538a9) | | Kroma | 255 | `0x7b2e996742fA42d223652A344252B725D1bC428C` | [blockscout.kroma.network](https://blockscout.kroma.network/address/0x7b2e996742fA42d223652A344252B725D1bC428C) | | Linea | 59144 | `0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB` | [lineascan.build](https://lineascan.build/address/0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB) | | Lisk | 1135 | `0x7b2e996742fA42d223652A344252B725D1bC428C` | [blockscout.lisk.com](https://blockscout.lisk.com/address/0x7b2e996742fA42d223652A344252B725D1bC428C) | | LUKSO | 42 | `0x5F954cA945671e48466680eA815727948Ca340ef` | [explorer.execution.mainnet.lukso.network](https://explorer.execution.mainnet.lukso.network/address/0x5F954cA945671e48466680eA815727948Ca340ef) | | Lumia Prism | 1000073017 | `0x3c38fC01159E7BE0685653A0C896eA49F2BAa7c1` | [explorer.lumia.org](https://explorer.lumia.org/address/0x3c38fC01159E7BE0685653A0C896eA49F2BAa7c1) | | Manta Pacific | 169 | `0x19dc38aeae620380430C200a6E990D5Af5480117` | [pacific-explorer.manta.network](https://pacific-explorer.manta.network/address/0x19dc38aeae620380430C200a6E990D5Af5480117) | | Mantle | 5000 | `0xf9DbC8776Bc2812c4DBEc45383A1783Ac758Fb55` | [explorer.mantle.xyz](https://explorer.mantle.xyz/address/0xf9DbC8776Bc2812c4DBEc45383A1783Ac758Fb55) | | Merlin | 4200 | `0xc965292958794f59ec3e9538738dD252873F07CC` | [scan.merlinchain.io](https://scan.merlinchain.io/address/0xc965292958794f59ec3e9538738dD252873F07CC) | | Metal L2 | 1000001750 | `0xE7487b4DF583c63D6841997ab56324D0a825e7F4` | [explorer.metall2.com](https://explorer.metall2.com/address/0xE7487b4DF583c63D6841997ab56324D0a825e7F4) | | Metis Andromeda | 1088 | `0x7b2e996742fA42d223652A344252B725D1bC428C` | [andromeda-explorer.metis.io](https://andromeda-explorer.metis.io/address/0x7b2e996742fA42d223652A344252B725D1bC428C) | | Mint | 185 | `0x7b2e996742fA42d223652A344252B725D1bC428C` | [explorer.mintchain.io](https://explorer.mintchain.io/address/0x7b2e996742fA42d223652A344252B725D1bC428C) | | Mode | 34443 | `0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465` | [explorer.mode.network](https://explorer.mode.network/address/0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465) | | Molten | 360 | `0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0` | [molten.calderaexplorer.xyz](https://molten.calderaexplorer.xyz/address/0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0) | | Moonbeam | 1284 | `0x448b7ADB0dA36d41AA2AfDc9d63b97541A7b3819` | [moonscan.io](https://moonscan.io/address/0x448b7ADB0dA36d41AA2AfDc9d63b97541A7b3819) | | Morph | 2818 | `0x2F619Ac5122689180AeBB930ADccdae215d538a9` | [explorer.morphl2.io](https://explorer.morphl2.io/address/0x2F619Ac5122689180AeBB930ADccdae215d538a9) | | Nero | 1689 | `0x60515f328B2c55Df63f456D9D839a0082892dEf8` | [www.neroscan.io](https://www.neroscan.io/address/0x60515f328B2c55Df63f456D9D839a0082892dEf8) | | Oort | 970 | `0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67` | [mainnet-scan.oortech.com](https://mainnet-scan.oortech.com/address/0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67) | | Optimism | 10 | `0x27e88AeB8EA4B159d81df06355Ea3d20bEB1de38` | [optimistic.etherscan.io](https://optimistic.etherscan.io/address/0x27e88AeB8EA4B159d81df06355Ea3d20bEB1de38) | | Orderly L2 | 291 | `0x2F619Ac5122689180AeBB930ADccdae215d538a9` | [explorer.orderly.network](https://explorer.orderly.network/address/0x2F619Ac5122689180AeBB930ADccdae215d538a9) | | Polygon | 137 | `0xA3a24EC5670F1F416AB9fD554FcE2f226AE9D7eB` | [polygonscan.com](https://polygonscan.com/address/0xA3a24EC5670F1F416AB9fD554FcE2f226AE9D7eB) | | Polygon zkEVM | 1101 | `0x19dc38aeae620380430C200a6E990D5Af5480117` | [zkevm.polygonscan.com](https://zkevm.polygonscan.com/address/0x19dc38aeae620380430C200a6E990D5Af5480117) | | Polynomial | 1000008008 | `0x2b79328DA089E89A9E9c08732b56dd31F01011Db` | [polynomialscan.io](https://polynomialscan.io/address/0x2b79328DA089E89A9E9c08732b56dd31F01011Db) | | Prom | 227 | `0x33E0c225A54a0A86E9B267e90A90DE8CBb0fDB8f` | [prom-blockscout.eu-north-2.gateway.fm](https://prom-blockscout.eu-north-2.gateway.fm/address/0x33E0c225A54a0A86E9B267e90A90DE8CBb0fDB8f) | | Proof of Play Apex | 70700 | `0x7b2e996742fA42d223652A344252B725D1bC428C` | [explorer.apex.proofofplay.com](https://explorer.apex.proofofplay.com/address/0x7b2e996742fA42d223652A344252B725D1bC428C) | | RARI Chain | 1000012617 | `0x16625230dD6cFe1B2bec3eCaEc7d43bA3A902CD6` | [mainnet.explorer.rarichain.org](https://mainnet.explorer.rarichain.org/address/0x16625230dD6cFe1B2bec3eCaEc7d43bA3A902CD6) | | re.al | 111188 | `0x40Ca055683d9aA603f73EDcb62874a1BaAa1d6dA` | [explorer.re.al](https://explorer.re.al/address/0x40Ca055683d9aA603f73EDcb62874a1BaAa1d6dA) | | Redstone | 690 | `0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa` | [explorer.redstone.xyz](https://explorer.redstone.xyz/address/0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa) | | Rivalz | 753 | `0x248aDe14C0489E20C9a7Fea5F86DBfC3702208eF` | [rivalz.calderaexplorer.xyz](https://rivalz.calderaexplorer.xyz/address/0x248aDe14C0489E20C9a7Fea5F86DBfC3702208eF) | | Rootstock | 1000000030 | `0xa36172F79a248C24693a208b0CEF0e7D6FB995F0` | [rootstock.blockscout.com](https://rootstock.blockscout.com/address/0xa36172F79a248C24693a208b0CEF0e7D6FB995F0) | | Sanko | 1996 | `0x7b2e996742fA42d223652A344252B725D1bC428C` | [explorer.sanko.xyz](https://explorer.sanko.xyz/address/0x7b2e996742fA42d223652A344252B725D1bC428C) | | Scroll | 534352 | `0x481171eb1aad17eDE6a56005B7F1aB00C581ef13` | [scrollscan.com](https://scrollscan.com//address/0x481171eb1aad17eDE6a56005B7F1aB00C581ef13) | | Sei | 1329 | `0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4` | [seitrace.com](https://seitrace.com/address/0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4) | | Shibarium | 109 | `0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0` | [shibariumscan.io](https://shibariumscan.io/address/0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0) | | SnaxChain | 2192 | `0x2F619Ac5122689180AeBB930ADccdae215d538a9` | [explorer.snaxchain.io](https://explorer.snaxchain.io/address/0x2F619Ac5122689180AeBB930ADccdae215d538a9) | | Soneium | 1868 | `0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2` | [soneium.blockscout.com](https://soneium.blockscout.com/address/0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2) | | Sonic | 146 | `0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2` | [sonicscan.org](https://sonicscan.org/address/0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2) | | Superposition | 1000055244 | `0xc4D0b4ef01eD7091792fe3D4c039457719e2DC68` | [explorer.superposition.so](https://explorer.superposition.so//address/0xc4D0b4ef01eD7091792fe3D4c039457719e2DC68) | | Superseed | 5330 | `0xbb0AE51BCa526cF313b6a95BfaB020794af6C394` | [explorer.superseed.xyz](https://explorer.superseed.xyz/address/0xbb0AE51BCa526cF313b6a95BfaB020794af6C394) | | Swell | 1923 | `0xCDeb368Db32ecCefaf7018e152DA9120565cb572` | [explorer.swellnetwork.io](https://explorer.swellnetwork.io/address/0xCDeb368Db32ecCefaf7018e152DA9120565cb572) | | Taiko | 167000 | `0x7556a0E61d577D921Cba8Fca0d7D6299d36E607E` | [taikoscan.io](https://taikoscan.io/address/0x7556a0E61d577D921Cba8Fca0d7D6299d36E607E) | | Tangle | 5845 | `0x7b2e996742fA42d223652A344252B725D1bC428C` | [explorer.tangle.tools](https://explorer.tangle.tools/address/0x7b2e996742fA42d223652A344252B725D1bC428C) | | Telos EVM | 40 | `0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2` | [www.teloscan.io](https://www.teloscan.io/address/0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2) | | Torus | 21000 | `0x248aDe14C0489E20C9a7Fea5F86DBfC3702208eF` | [blockscout.torus.network](https://blockscout.torus.network/address/0x248aDe14C0489E20C9a7Fea5F86DBfC3702208eF) | | Treasure | 61166 | `0xc364cfedefE854c1275B0f4088EaFA9695e1FC56` | [treasurescan.io](https://treasurescan.io/address/0xc364cfedefE854c1275B0f4088EaFA9695e1FC56) | | Unichain | 130 | `0xbb0AE51BCa526cF313b6a95BfaB020794af6C394` | [unichain.blockscout.com](https://unichain.blockscout.com/address/0xbb0AE51BCa526cF313b6a95BfaB020794af6C394) | | Vana | 1480 | `0xbb0AE51BCa526cF313b6a95BfaB020794af6C394` | [vanascan.io](https://vanascan.io/address/0xbb0AE51BCa526cF313b6a95BfaB020794af6C394) | | Viction | 88 | `0x19dc38aeae620380430C200a6E990D5Af5480117` | [www.vicscan.xyz](https://www.vicscan.xyz/address/0x19dc38aeae620380430C200a6E990D5Af5480117) | | World Chain | 480 | `0xe4057c5B0c43Dc18E36b08C39B419F190D29Ac2d` | [worldchain-mainnet-explorer.alchemy.com](https://worldchain-mainnet-explorer.alchemy.com/address/0xe4057c5B0c43Dc18E36b08C39B419F190D29Ac2d) | | Xai | 660279 | `0x7b2e996742fA42d223652A344252B725D1bC428C` | [explorer.xai-chain.net](https://explorer.xai-chain.net/address/0x7b2e996742fA42d223652A344252B725D1bC428C) | | XLayer | 196 | `0xe4057c5B0c43Dc18E36b08C39B419F190D29Ac2d` | [www.oklink.com](https://www.oklink.com/xlayer/address/0xe4057c5B0c43Dc18E36b08C39B419F190D29Ac2d) | | XPLA | 37 | `0xc2466492C451E1AE49d8C874bB9f89293Aaad59b` | [explorer.xpla.io](https://explorer.xpla.io/mainnet/address/0xc2466492C451E1AE49d8C874bB9f89293Aaad59b) | | Zero Network | 543210 | `0xe85d65f04D1562f8571d57326d6798e4584aa254` | [zerion-explorer.vercel.app](https://zerion-explorer.vercel.app/address/0xe85d65f04D1562f8571d57326d6798e4584aa254) | | ZetaChain | 7000 | `0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465` | [explorer.zetachain.com](https://explorer.zetachain.com/address/0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465) | | Zircuit | 48900 | `0x46fa3A5780e5B90Eaf34BDED554d5353B5ABE9E7` | [explorer.zircuit.com](https://explorer.zircuit.com/address/0x46fa3A5780e5B90Eaf34BDED554d5353B5ABE9E7) | | zkLink Nova | 810180 | `0x73a82061Cd258d02BEa145fe183120456e718c2A` | [explorer.zklink.io](https://explorer.zklink.io/address/0x73a82061Cd258d02BEa145fe183120456e718c2A) | | zkSync | 324 | `0x37f4afe769087738f0577A77ffA24abef6fCBF99` | [explorer.zksync.io](https://explorer.zksync.io/address/0x37f4afe769087738f0577A77ffA24abef6fCBF99) | | Zora | 7777777 | `0xF1854214392864c628A16930E73B699f7a51b3EE` | [explorer.zora.energy](https://explorer.zora.energy/address/0xF1854214392864c628A16930E73B699f7a51b3EE) | | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Abstract Testnet | 11124 | `0x5F1bADC7e28B9b4C98f58dB4e5841e5bf63A7A52` | [explorer.testnet.abs.xyz](https://explorer.testnet.abs.xyz/address/0x5F1bADC7e28B9b4C98f58dB4e5841e5bf63A7A52) | | Aleph Zero EVM Testnet | 2039 | `0x4fE19d49F45854Da50b6009258929613EC92C147` | [evm-explorer-testnet.alephzero.org](https://evm-explorer-testnet.alephzero.org/address/0x4fE19d49F45854Da50b6009258929613EC92C147) | | Alfajores | 44787 | `0x8356113754C7aCa297Db3089b89F87CC125499fb` | [explorer.celo.org](https://explorer.celo.org/alfajores/address/0x8356113754C7aCa297Db3089b89F87CC125499fb) | | Arbitrum Sepolia | 421614 | `0xddf4C3e791caCaFd26D7fb275549739B38ae6e75` | [sepolia.arbiscan.io](https://sepolia.arbiscan.io/address/0xddf4C3e791caCaFd26D7fb275549739B38ae6e75) | | Arcadia Testnet v2 | 1098411886 | `0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f` | [explorer.khalani.network](https://explorer.khalani.network/address/0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f) | | Base Sepolia | 84532 | `0x5821f3B6eE05F3dC62b43B74AB1C8F8E6904b1C8` | [sepolia.basescan.org](https://sepolia.basescan.org/address/0x5821f3B6eE05F3dC62b43B74AB1C8F8E6904b1C8) | | Berachain bArtio | 80084 | `0xeAEfB1458b032e75de3e9A3a480d005c426FB1c5` | [bartio.beratrail.io](https://bartio.beratrail.io//address/0xeAEfB1458b032e75de3e9A3a480d005c426FB1c5) | | BSC Testnet | 97 | `0x124EBCBC018A5D4Efe639f02ED86f95cdC3f6498` | [testnet.bscscan.com](https://testnet.bscscan.com/address/0x124EBCBC018A5D4Efe639f02ED86f95cdC3f6498) | | Camp Network Testnet V2 | 325000 | `0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE` | [camp-network-testnet.blockscout.com](https://camp-network-testnet.blockscout.com/address/0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE) | | Citrea Testnet | 5115 | `0xae7a78916Ba4c507aCB2F0e474ace545Ff4bF841` | [explorer.testnet.citrea.xyz](https://explorer.testnet.citrea.xyz/address/0xae7a78916Ba4c507aCB2F0e474ace545Ff4bF841) | | Eco Testnet | 471923 | `0x5821f3B6eE05F3dC62b43B74AB1C8F8E6904b1C8` | [eco-testnet.explorer.caldera.xyz](https://eco-testnet.explorer.caldera.xyz//address/0x5821f3B6eE05F3dC62b43B74AB1C8F8E6904b1C8) | | Form Testnet | 132902 | `0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE` | [sepolia-explorer.form.network](https://sepolia-explorer.form.network/address/0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE) | | Fuji | 43113 | `0x9305dE34306886d615B096Bdf23b94a978f6a6c0` | [testnet.snowtrace.io](https://testnet.snowtrace.io/address/0x9305dE34306886d615B096Bdf23b94a978f6a6c0) | | Holesky | 17000 | `0x2b2a158B4059C840c7aC67399B153bb567D06303` | [holesky.etherscan.io](https://holesky.etherscan.io/address/0x2b2a158B4059C840c7aC67399B153bb567D06303) | | Hyperliquid EVM Testnet | 998 | `0x783c4a0bB6663359281aD4a637D5af68F83ae213` | [explorer.hyperlend.finance](https://explorer.hyperlend.finance/address/0x783c4a0bB6663359281aD4a637D5af68F83ae213) | | Ink Sepolia | 763373 | `0xE67CfA164cDa449Ae38a0a09391eF6bCDf8e4e2c` | [explorer-sepolia.inkonchain.com](https://explorer-sepolia.inkonchain.com/address/0xE67CfA164cDa449Ae38a0a09391eF6bCDf8e4e2c) | | Odyssey Testnet | 911867 | `0xB5fB1F5410a2c2b7deD462d018541383968cB01c` | [odyssey-explorer.ithaca.xyz](https://odyssey-explorer.ithaca.xyz/address/0xB5fB1F5410a2c2b7deD462d018541383968cB01c) | | Optimism Sepolia | 11155420 | `0x5821f3B6eE05F3dC62b43B74AB1C8F8E6904b1C8` | [sepolia-optimistic.etherscan.io](https://sepolia-optimistic.etherscan.io/address/0x5821f3B6eE05F3dC62b43B74AB1C8F8E6904b1C8) | | Plume Testnet | 161221135 | `0x267B6B6eAf6790faE5D5E9070F28a9cE64CbF279` | [plume-testnet.explorer.caldera.xyz](https://plume-testnet.explorer.caldera.xyz/address/0x267B6B6eAf6790faE5D5E9070F28a9cE64CbF279) | | Polygon Amoy | 80002 | `0xD0680F80F4f947968206806C2598Cbc5b6FE5b03` | [amoy.polygonscan.com](https://amoy.polygonscan.com/address/0xD0680F80F4f947968206806C2598Cbc5b6FE5b03) | | Scroll Sepolia | 534351 | `0x6b1bb4ce664Bb4164AEB4d3D2E7DE7450DD8084C` | [sepolia.scrollscan.dev](https://sepolia.scrollscan.dev//address/0x6b1bb4ce664Bb4164AEB4d3D2E7DE7450DD8084C) | | Sepolia | 11155111 | `0x71775B071F77F1ce52Ece810ce084451a3045FFe` | [sepolia.etherscan.io](https://sepolia.etherscan.io/address/0x71775B071F77F1ce52Ece810ce084451a3045FFe) | | Soneium Minato Testnet | 1946 | `0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE` | [explorer-testnet.soneium.org](https://explorer-testnet.soneium.org/address/0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE) | | Sonic Testnet | 64165 | `0x7c5B5bdA7F1d1F70A6678ABb4d894612Fc76498F` | [testnet.soniclabs.com](https://testnet.soniclabs.com/address/0x7c5B5bdA7F1d1F70A6678ABb4d894612Fc76498F) | | SUAVE Toliman Testnet | 33626250 | `0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE` | [explorer.toliman.suave.flashbots.net](https://explorer.toliman.suave.flashbots.net/address/0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE) | | Superposition Testnet | 98985 | `0xF7561c34f17A32D5620583A3397C304e7038a7F6` | [testnet-explorer.superposition.so](https://testnet-explorer.superposition.so/address/0xF7561c34f17A32D5620583A3397C304e7038a7F6) | | Treasure Topaz Testnet | 978658 | `0x5F1bADC7e28B9b4C98f58dB4e5841e5bf63A7A52` | [topaz.treasurescan.io](https://topaz.treasurescan.io/address/0x5F1bADC7e28B9b4C98f58dB4e5841e5bf63A7A52) | | Unichain Testnet | 1301 | `0x7c5B5bdA7F1d1F70A6678ABb4d894612Fc76498F` | [unichain-sepolia.blockscout.com](https://unichain-sepolia.blockscout.com/address/0x7c5B5bdA7F1d1F70A6678ABb4d894612Fc76498F) | --- # Audits | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Audits ====== Hook and ISM Audit[​](#hook-and-ism-audit "Direct link to Hook and ISM Audit") ------------------------------------------------------------------------------- [Mirror](/assets/files/chainlight-v3.1-protocol-audit-64bfe64a431b86d1f6a5e5704b0c25ce.pdf) Protocol v3 Audit[​](#protocol-v3-audit "Direct link to Protocol v3 Audit") ---------------------------------------------------------------------------- [Original](https://github.com/trailofbits/publications/blob/master/reviews/2023-09-hyperlane-securityreview.pdf) [Mirror](/assets/files/hyperlane-v3-protocol-audit-1c13a91b784828f7bd130532f0c3be67.pdf) Protocol v2 Audit[​](#protocol-v2-audit "Direct link to Protocol v2 Audit") ---------------------------------------------------------------------------- [Original](https://audits.hacken.io/hyperlane/sca-hyperlane-interchain-message-service-apr2023/) [Mirror](/assets/files/hyperlane-v2-protocol-audit-dddb5455bb38c2586a22604cfb8c70b9.pdf) Protocol v1 Audit[​](#protocol-v1-audit "Direct link to Protocol v1 Audit") ---------------------------------------------------------------------------- [Original](https://www.fyeo.io/post/fyeo-security-assessment-of-the-hyperlane-formerly-abacus-smart-contracts-in-august-2022) [Mirror](/assets/files/hyperlane-v1-protocol-audit-1e218ddc2fb487abe95080d72323f988.pdf) Sealevel Protocol Audit[​](#sealevel-protocol-audit "Direct link to Sealevel Protocol Audit") ---------------------------------------------------------------------------------------------- [Original](https://github.com/sec3-service/reports/blob/master/reports/sec3_hyperlane-sealevel.pdf) [Mirror](/assets/files/sealevel-hyperlane-audit-b5b33fea8f48bb9d4da904f98526e0f2.pdf) CosmWasm Protocol Audit[​](#cosmwasm-protocol-audit "Direct link to CosmWasm Protocol Audit") ---------------------------------------------------------------------------------------------- [Original](https://github.com/oak-security/audit-reports/blob/main/Hyperlane/2024-02-13%20Audit%20Report%20-%20cw-hyperlane%20v1.0.pdf) [Mirror](/assets/files/cw-hyperlane-audit-cc6fb089c3f3c2016f8fa5b3218cd96d.pdf) Starknet Protocol Audit[​](#starknet-protocol-audit "Direct link to Starknet Protocol Audit") ---------------------------------------------------------------------------------------------- [Draft](/assets/files/starknet-hyperlane-audit-draft-5e358b375fd0d0c0f31703e827635237.pdf) * [Hook and ISM Audit](#hook-and-ism-audit) * [Protocol v3 Audit](#protocol-v3-audit) * [Protocol v2 Audit](#protocol-v2-audit) * [Protocol v1 Audit](#protocol-v1-audit) * [Sealevel Protocol Audit](#sealevel-protocol-audit) * [CosmWasm Protocol Audit](#cosmwasm-protocol-audit) * [Starknet Protocol Audit](#starknet-protocol-audit) --- # Hyperlane CLI | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Hyperlane CLI ============= Overview[​](#overview "Direct link to Overview") ------------------------------------------------- The Hyperlane CLI is the official command-line tool for deploying Hyperlane contracts to new chains. It also includes utilities for interacting with deployed contracts and registries. The published version is available [on NPM](https://www.npmjs.com/package/@hyperlane-xyz/cli) . The source is available [on Github in the monorepo](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/typescript/cli) . Setup[​](#setup "Direct link to Setup") ---------------------------------------- tip [Node 18](https://nodejs.org/en/download) or newer is required To install the CLI globally, use the `npm install -g` command. This will the `hyperlane` command available anywhere in your terminal. # Install with NPMnpm install -g @hyperlane-xyz/cli# Or uninstall old versionsnpm uninstall -g @hyperlane-xyz/cli Alternatively, for running individual commands, you can use `npx` or `dlx`: # Run via NPM's npx commandnpx @hyperlane-xyz/cli# Or via Yarn's dlx commandyarn dlx @hyperlane-xyz/cli Usage[​](#usage "Direct link to Usage") ---------------------------------------- To view a list of the available commands and their arguments, run `hyperlane --help`. A few common command options include: * `--version`: Display your current installed version of the CLI * `--registry`: Set the registry URI to use for chain metadata and contract addresses * `--overrides`: Set an additional path for overrides to the canonical registry data * `log`: Set the log format for the CLI (defaults to pretty) * `verbosity`: Set the log level for the CLI (defaults to info) * `key`: Set the key to use for signing transactions (defaults to the HYP\_KEY env var) Registries[​](#registries "Direct link to Registries") ------------------------------------------------------- By default, the CLI will pull chain metadata and contract addresses from the [canonical Hyperlane Registry](https://github.com/hyperlane-xyz/hyperlane-registry) but will write new configs and deployments to your local filesystem. For more information see the [Registries page](/docs/reference/registries) . * [Overview](#overview) * [Setup](#setup) * [Usage](#usage) * [Registries](#registries) --- # Validator Announce | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) Validator Announce ================== * Mainnet * Testnet | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Aleph Zero EVM | 1000041455 | `0x2e542a3DF4fde491faa77da05eD48377aca9E44e` | [evm-explorer.alephzero.org](https://evm-explorer.alephzero.org/address/0x2e542a3DF4fde491faa77da05eD48377aca9E44e) | | Ancient8 | 888888888 | `0x931dFCc8c1141D6F532FD023bd87DAe0080c835d` | [scan.ancient8.gg](https://scan.ancient8.gg/address/0x931dFCc8c1141D6F532FD023bd87DAe0080c835d) | | ApeChain | 33139 | `0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96` | [apechain.calderaexplorer.xyz](https://apechain.calderaexplorer.xyz/address/0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96) | | AppChain | 466 | `0x1196055C61af3e3DA6f8458B07b255a72b64Bcf7` | [explorer.appchain.xyz](https://explorer.appchain.xyz/address/0x1196055C61af3e3DA6f8458B07b255a72b64Bcf7) | | Arbitrum | 42161 | `0x1df063280C4166AF9a725e3828b4dAC6c7113B08` | [arbiscan.io](https://arbiscan.io/address/0x1df063280C4166AF9a725e3828b4dAC6c7113B08) | | Arbitrum Nova | 42170 | `0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53` | [nova.arbiscan.io](https://nova.arbiscan.io//address/0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53) | | Artela | 11820 | `0xb89c6ED617f5F46175E41551350725A09110bbCE` | [artscan.artela.network](https://artscan.artela.network/address/0xb89c6ED617f5F46175E41551350725A09110bbCE) | | Arthera | 10242 | `0xEe9E0FB6f43913aDBbe5bf89073F4BA590AB8184` | [explorer.arthera.net](https://explorer.arthera.net/address/0xEe9E0FB6f43913aDBbe5bf89073F4BA590AB8184) | | Astar | 592 | `0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86` | [astar.blockscout.com](https://astar.blockscout.com/address/0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86) | | Astar zkEVM | 3776 | `0x59C2dB903937EbE55B59c3415FD55e970FF5f2DC` | [astar-zkevm.explorer.startale.com](https://astar-zkevm.explorer.startale.com/address/0x59C2dB903937EbE55B59c3415FD55e970FF5f2DC) | | Aurora | 1313161554 | `0x426a3CE72C1586b1867F9339550371E86DB3e396` | [explorer.mainnet.aurora.dev](https://explorer.mainnet.aurora.dev/address/0x426a3CE72C1586b1867F9339550371E86DB3e396) | | Avalanche | 43114 | `0x9Cad0eC82328CEE2386Ec14a12E81d070a27712f` | [snowtrace.io](https://snowtrace.io/address/0x9Cad0eC82328CEE2386Ec14a12E81d070a27712f) | | B3 | 8333 | `0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53` | [explorer.b3.fun](https://explorer.b3.fun/address/0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53) | | Base | 8453 | `0x182E8d7c5F1B06201b102123FC7dF0EaeB445a7B` | [basescan.org](https://basescan.org/address/0x182E8d7c5F1B06201b102123FC7dF0EaeB445a7B) | | Bitlayer | 200901 | `0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86` | [www.btrscan.com](https://www.btrscan.com/address/0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86) | | Blast | 81457 | `0xFC62DeF1f08793aBf0E67f69257c6be258194F72` | [blastexplorer.io](https://blastexplorer.io/address/0xFC62DeF1f08793aBf0E67f69257c6be258194F72) | | BOB | 60808 | `0x7E27456a839BFF31CA642c060a2b68414Cb6e503` | [explorer.gobob.xyz](https://explorer.gobob.xyz/address/0x7E27456a839BFF31CA642c060a2b68414Cb6e503) | | Boba Mainnet | 288 | `0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e` | [bobascan.com](https://bobascan.com/address/0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e) | | Binance Smart Chain | 56 | `0x7024078130D9c2100fEA474DAD009C2d1703aCcd` | [bscscan.com](https://bscscan.com/address/0x7024078130D9c2100fEA474DAD009C2d1703aCcd) | | B² Network | 223 | `0x25EAC2007b0D40E3f0AF112FD346412321038719` | [explorer.bsquared.network](https://explorer.bsquared.network/address/0x25EAC2007b0D40E3f0AF112FD346412321038719) | | Celo | 42220 | `0xCeF677b65FDaA6804d4403083bb12B8dB3991FE1` | [celoscan.io](https://celoscan.io/address/0xCeF677b65FDaA6804d4403083bb12B8dB3991FE1) | | CheeseChain | 383353 | `0x047ba6c9949baB22d13C347B40819b7A20C4C53a` | [fetascan.xyz](https://fetascan.xyz/address/0x047ba6c9949baB22d13C347B40819b7A20C4C53a) | | Chiliz | 1000088888 | `0x16625230dD6cFe1B2bec3eCaEc7d43bA3A902CD6` | [chiliscan.com](https://chiliscan.com/address/0x16625230dD6cFe1B2bec3eCaEc7d43bA3A902CD6) | | Conflux eSpace | 1030 | `0x84444cE490233CFa76E3F1029bc166aa8c266907` | [evm.confluxscan.net](https://evm.confluxscan.net/address/0x84444cE490233CFa76E3F1029bc166aa8c266907) | | Conwai | 668668 | `0x84444cE490233CFa76E3F1029bc166aa8c266907` | [conwai.calderaexplorer.xyz](https://conwai.calderaexplorer.xyz/address/0x84444cE490233CFa76E3F1029bc166aa8c266907) | | Core | 1116 | `0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86` | [scan.coredao.org](https://scan.coredao.org/address/0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86) | | Corn | 21000000 | `0x84444cE490233CFa76E3F1029bc166aa8c266907` | [cornscan.io](https://cornscan.io/address/0x84444cE490233CFa76E3F1029bc166aa8c266907) | | Cyber | 7560 | `0x062200d92df6bb7ba89ce4d6800110450f94784e` | [cyberscan.co](https://cyberscan.co/address/0x062200d92df6bb7ba89ce4d6800110450f94784e) | | Degen | 666666666 | `0x062200d92dF6bB7bA89Ce4D6800110450f94784e` | [explorer.degen.tips](https://explorer.degen.tips/address/0x062200d92dF6bB7bA89Ce4D6800110450f94784e) | | Dogechain | 2000 | `0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86` | [explorer.dogechain.dog](https://explorer.dogechain.dog/address/0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86) | | DuckChain | 5545 | `0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e` | [scan.duckchain.io](https://scan.duckchain.io/address/0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e) | | Eclipse | 1408864445 | `Hqnn593pqDZWLy6bKZ4NbY767wFhUNBShDrLktuQa3Q2` | [explorer.eclipse.xyz](https://explorer.eclipse.xyz//address/Hqnn593pqDZWLy6bKZ4NbY767wFhUNBShDrLktuQa3Q2) | | Endurance | 648 | `0x3c7653dD0Ec21A833f99293CDC17495CE249532c` | [explorer-endurance.fusionist.io](https://explorer-endurance.fusionist.io/address/0x3c7653dD0Ec21A833f99293CDC17495CE249532c) | | Ethereum | 1 | `0xCe74905e51497b4adD3639366708b821dcBcff96` | [etherscan.io](https://etherscan.io/address/0xCe74905e51497b4adD3639366708b821dcBcff96) | | Everclear | 25327 | `0xC88bAD76EC7acD9fd3b9Bb264f7f5C18097c5710` | [scan.everclear.org](https://scan.everclear.org/address/0xC88bAD76EC7acD9fd3b9Bb264f7f5C18097c5710) | | Evmos EVM | 9001 | `0x84444cE490233CFa76E3F1029bc166aa8c266907` | [www.mintscan.io](https://www.mintscan.io/evmos/address/0x84444cE490233CFa76E3F1029bc166aa8c266907) | | Fantom Opera | 250 | `0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53` | [ftmscan.com](https://ftmscan.com/address/0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53) | | Flame | 253368190 | `0xc5D6aCaafBCcEC6D7fD7d92F4509befce641c563` | [explorer.flame.astria.org](https://explorer.flame.astria.org/address/0xc5D6aCaafBCcEC6D7fD7d92F4509befce641c563) | | Flare | 14 | `0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86` | [flare-explorer.flare.network](https://flare-explorer.flare.network/address/0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86) | | EVM on Flow | 1000000747 | `0x5C6699c133A583d389Ba7e0bDD4993e2e63fA804` | [evm.flowscan.io](https://evm.flowscan.io/address/0x5C6699c133A583d389Ba7e0bDD4993e2e63fA804) | | Form | 478 | `0x84444cE490233CFa76E3F1029bc166aa8c266907` | [explorer.form.network](https://explorer.form.network/address/0x84444cE490233CFa76E3F1029bc166aa8c266907) | | Fraxtal | 252 | `0x1956848601549de5aa0c887892061fA5aB4f6fC4` | [fraxscan.com](https://fraxscan.com/address/0x1956848601549de5aa0c887892061fA5aB4f6fC4) | | Fuse | 122 | `0x60bB6D060393D3C206719A7bD61844cC82891cfB` | [explorer.fuse.io](https://explorer.fuse.io/address/0x60bB6D060393D3C206719A7bD61844cC82891cfB) | | Gnosis | 100 | `0x87ED6926abc9E38b9C7C19f835B41943b622663c` | [gnosisscan.io](https://gnosisscan.io/address/0x87ED6926abc9E38b9C7C19f835B41943b622663c) | | Gravity Alpha Mainnet | 1625 | `0x61374178e45F65fF9D6252d017Cd580FC60B7654` | [explorer.gravity.xyz](https://explorer.gravity.xyz/address/0x61374178e45F65fF9D6252d017Cd580FC60B7654) | | Guru Network | 260 | `0xa2401b57A8CCBF6AbD9b7e62e28811b2b523AB2B` | [blockscout.gurunetwork.ai](https://blockscout.gurunetwork.ai/address/0xa2401b57A8CCBF6AbD9b7e62e28811b2b523AB2B) | | Harmony One | 1666600000 | `0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53` | [explorer.harmony.one](https://explorer.harmony.one/address/0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53) | | Hemi Network | 43111 | `0xb89c6ED617f5F46175E41551350725A09110bbCE` | [explorer.hemi.xyz](https://explorer.hemi.xyz/address/0xb89c6ED617f5F46175E41551350725A09110bbCE) | | Immutable zkEVM | 1000013371 | `0x8c794a781327b819416E7b67908f1D22397f1E67` | [explorer.immutable.com](https://explorer.immutable.com/address/0x8c794a781327b819416E7b67908f1D22397f1E67) | | Injective EVM | 2525 | `0x15ab173bDB6832f9b64276bA128659b0eD77730B` | [inevm.calderaexplorer.xyz](https://inevm.calderaexplorer.xyz/address/0x15ab173bDB6832f9b64276bA128659b0eD77730B) | | Injective | 6909546 | `0x1fb225b2fcfbe75e614a1d627de97ff372242eed` | [www.mintscan.io](https://www.mintscan.io/injective/address/0x1fb225b2fcfbe75e614a1d627de97ff372242eed) | | Ink | 57073 | `0x426a3CE72C1586b1867F9339550371E86DB3e396` | [explorer.inkonchain.com](https://explorer.inkonchain.com/address/0x426a3CE72C1586b1867F9339550371E86DB3e396) | | Kaia | 8217 | `0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53` | [kaiascope.com](https://kaiascope.com/address/0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53) | | Kroma | 255 | `0x062200d92dF6bB7bA89Ce4D6800110450f94784e` | [blockscout.kroma.network](https://blockscout.kroma.network/address/0x062200d92dF6bB7bA89Ce4D6800110450f94784e) | | Linea | 59144 | `0x62B7592C1B6D1E43f4630B8e37f4377097840C05` | [lineascan.build](https://lineascan.build/address/0x62B7592C1B6D1E43f4630B8e37f4377097840C05) | | Lisk | 1135 | `0x062200d92dF6bB7bA89Ce4D6800110450f94784e` | [blockscout.lisk.com](https://blockscout.lisk.com/address/0x062200d92dF6bB7bA89Ce4D6800110450f94784e) | | LUKSO | 42 | `0x3C2b535a49c6827DF0b8e94467e6922c99E3c092` | [explorer.execution.mainnet.lukso.network](https://explorer.execution.mainnet.lukso.network/address/0x3C2b535a49c6827DF0b8e94467e6922c99E3c092) | | Lumia Prism | 1000073017 | `0x803d2A87429E20d4B52266bF97Ca1c7e4f4F5Dfa` | [explorer.lumia.org](https://explorer.lumia.org/address/0x803d2A87429E20d4B52266bF97Ca1c7e4f4F5Dfa) | | Manta Pacific | 169 | `0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9` | [pacific-explorer.manta.network](https://pacific-explorer.manta.network/address/0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9) | | Mantle | 5000 | `0x1956848601549de5aa0c887892061fA5aB4f6fC4` | [explorer.mantle.xyz](https://explorer.mantle.xyz/address/0x1956848601549de5aa0c887892061fA5aB4f6fC4) | | Merlin | 4200 | `0xd21192429df453021e896f2897Dc8B1167DD61E5` | [scan.merlinchain.io](https://scan.merlinchain.io/address/0xd21192429df453021e896f2897Dc8B1167DD61E5) | | Metal L2 | 1000001750 | `0xc6835e52C1b976F1ebC71Bc8919738E02849FdA9` | [explorer.metall2.com](https://explorer.metall2.com/address/0xc6835e52C1b976F1ebC71Bc8919738E02849FdA9) | | Metis Andromeda | 1088 | `0x062200d92dF6bB7bA89Ce4D6800110450f94784e` | [andromeda-explorer.metis.io](https://andromeda-explorer.metis.io/address/0x062200d92dF6bB7bA89Ce4D6800110450f94784e) | | Mint | 185 | `0x062200d92dF6bB7bA89Ce4D6800110450f94784e` | [explorer.mintchain.io](https://explorer.mintchain.io/address/0x062200d92dF6bB7bA89Ce4D6800110450f94784e) | | Mode | 34443 | `0x48083C69f5a42c6B69ABbAd48AE195BD36770ee2` | [explorer.mode.network](https://explorer.mode.network/address/0x48083C69f5a42c6B69ABbAd48AE195BD36770ee2) | | Molten | 360 | `0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86` | [molten.calderaexplorer.xyz](https://molten.calderaexplorer.xyz/address/0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86) | | Moonbeam | 1284 | `0x8c1001eBee6F25b31863A55EadfF149aF88B356F` | [moonscan.io](https://moonscan.io/address/0x8c1001eBee6F25b31863A55EadfF149aF88B356F) | | Morph | 2818 | `0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53` | [explorer.morphl2.io](https://explorer.morphl2.io/address/0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53) | | Nero | 1689 | `0xb89c6ED617f5F46175E41551350725A09110bbCE` | [www.neroscan.io](https://www.neroscan.io/address/0xb89c6ED617f5F46175E41551350725A09110bbCE) | | Neutron | 1853125230 | `0xf3aa0d652226e21ae35cd9035c492ae41725edc9036edf0d6a48701b153b90a0` | [www.mintscan.io](https://www.mintscan.io/neutron/address/0xf3aa0d652226e21ae35cd9035c492ae41725edc9036edf0d6a48701b153b90a0) | | Oort | 970 | `0x6f77d5Ef273C38CC19d1d02352785F52565A1A6c` | [mainnet-scan.oortech.com](https://mainnet-scan.oortech.com/address/0x6f77d5Ef273C38CC19d1d02352785F52565A1A6c) | | Optimism | 10 | `0x30f5b08e01808643221528BB2f7953bf2830Ef38` | [optimistic.etherscan.io](https://optimistic.etherscan.io/address/0x30f5b08e01808643221528BB2f7953bf2830Ef38) | | Orderly L2 | 291 | `0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53` | [explorer.orderly.network](https://explorer.orderly.network/address/0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53) | | Polygon | 137 | `0x454E1a1E1CA8B51506090f1b5399083658eA4Fc5` | [polygonscan.com](https://polygonscan.com/address/0x454E1a1E1CA8B51506090f1b5399083658eA4Fc5) | | Polygon zkEVM | 1101 | `0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9` | [zkevm.polygonscan.com](https://zkevm.polygonscan.com/address/0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9) | | Polynomial | 1000008008 | `0xA166219dF110BDA97b91e65D4BB4Aae4159978b9` | [polynomialscan.io](https://polynomialscan.io/address/0xA166219dF110BDA97b91e65D4BB4Aae4159978b9) | | Prom | 227 | `0x5ae1ECA065aC8ee92Ce98E584fc3CE43070020e7` | [prom-blockscout.eu-north-2.gateway.fm](https://prom-blockscout.eu-north-2.gateway.fm/address/0x5ae1ECA065aC8ee92Ce98E584fc3CE43070020e7) | | Proof of Play Apex | 70700 | `0x062200d92dF6bB7bA89Ce4D6800110450f94784e` | [explorer.apex.proofofplay.com](https://explorer.apex.proofofplay.com/address/0x062200d92dF6bB7bA89Ce4D6800110450f94784e) | | RARI Chain | 1000012617 | `0x38D361861d321B8B05de200c61B8F18740Daf4D8` | [mainnet.explorer.rarichain.org](https://mainnet.explorer.rarichain.org/address/0x38D361861d321B8B05de200c61B8F18740Daf4D8) | | re.al | 111188 | `0x5F954cA945671e48466680eA815727948Ca340ef` | [explorer.re.al](https://explorer.re.al/address/0x5F954cA945671e48466680eA815727948Ca340ef) | | Redstone | 690 | `0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0` | [explorer.redstone.xyz](https://explorer.redstone.xyz/address/0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0) | | Rivalz | 753 | `0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615` | [rivalz.calderaexplorer.xyz](https://rivalz.calderaexplorer.xyz/address/0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615) | | Rootstock | 1000000030 | `0x20a0A32a110362920597F72974E1E0d7e25cA20a` | [rootstock.blockscout.com](https://rootstock.blockscout.com/address/0x20a0A32a110362920597F72974E1E0d7e25cA20a) | | Sanko | 1996 | `0x062200d92dF6bB7bA89Ce4D6800110450f94784e` | [explorer.sanko.xyz](https://explorer.sanko.xyz/address/0x062200d92dF6bB7bA89Ce4D6800110450f94784e) | | Scroll | 534352 | `0xd83A4F747fE80Ed98839e05079B1B7Fe037b1638` | [scrollscan.com](https://scrollscan.com//address/0xd83A4F747fE80Ed98839e05079B1B7Fe037b1638) | | Sei | 1329 | `0x5332D1AC0A626D265298c14ff681c0A8D28dB86d` | [seitrace.com](https://seitrace.com/address/0x5332D1AC0A626D265298c14ff681c0A8D28dB86d) | | Shibarium | 109 | `0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86` | [shibariumscan.io](https://shibariumscan.io/address/0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86) | | SnaxChain | 2192 | `0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53` | [explorer.snaxchain.io](https://explorer.snaxchain.io/address/0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53) | | Solana | 1399811149 | `pRgs5vN4Pj7WvFbxf6QDHizo2njq2uksqEUbaSghVA8` | [solscan.io](https://solscan.io/address/pRgs5vN4Pj7WvFbxf6QDHizo2njq2uksqEUbaSghVA8) | | Soneium | 1868 | `0x84444cE490233CFa76E3F1029bc166aa8c266907` | [soneium.blockscout.com](https://soneium.blockscout.com/address/0x84444cE490233CFa76E3F1029bc166aa8c266907) | | Sonic | 146 | `0x84444cE490233CFa76E3F1029bc166aa8c266907` | [sonicscan.org](https://sonicscan.org/address/0x84444cE490233CFa76E3F1029bc166aa8c266907) | | SOON | 50075007 | `GFqF38mSacfvbJRKkhmjJvSkzTEKemSNVoWi4Q94ZPvz` | [explorer.soo.network](https://explorer.soo.network//address/GFqF38mSacfvbJRKkhmjJvSkzTEKemSNVoWi4Q94ZPvz) | | Superposition | 1000055244 | `0x26A29486480BD74f9B830a9B8dB33cb43C40f496` | [explorer.superposition.so](https://explorer.superposition.so//address/0x26A29486480BD74f9B830a9B8dB33cb43C40f496) | | Superseed | 5330 | `0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e` | [explorer.superseed.xyz](https://explorer.superseed.xyz/address/0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e) | | Swell | 1923 | `0x4D50044335dc1d4D26c343AdeDf6E47808475Deb` | [explorer.swellnetwork.io](https://explorer.swellnetwork.io/address/0x4D50044335dc1d4D26c343AdeDf6E47808475Deb) | | Taiko | 167000 | `0x01aE937A7B05d187bBCBE80F44F41879D3D335a4` | [taikoscan.io](https://taikoscan.io/address/0x01aE937A7B05d187bBCBE80F44F41879D3D335a4) | | Tangle | 5845 | `0x062200d92dF6bB7bA89Ce4D6800110450f94784e` | [explorer.tangle.tools](https://explorer.tangle.tools/address/0x062200d92dF6bB7bA89Ce4D6800110450f94784e) | | Telos EVM | 40 | `0x84444cE490233CFa76E3F1029bc166aa8c266907` | [www.teloscan.io](https://www.teloscan.io/address/0x84444cE490233CFa76E3F1029bc166aa8c266907) | | Torus | 21000 | `0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615` | [blockscout.torus.network](https://blockscout.torus.network/address/0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615) | | Treasure | 61166 | `0x73a82061Cd258d02BEa145fe183120456e718c2A` | [treasurescan.io](https://treasurescan.io/address/0x73a82061Cd258d02BEa145fe183120456e718c2A) | | Unichain | 130 | `0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e` | [unichain.blockscout.com](https://unichain.blockscout.com/address/0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e) | | Vana | 1480 | `0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e` | [vanascan.io](https://vanascan.io/address/0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e) | | Viction | 88 | `0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9` | [www.vicscan.xyz](https://www.vicscan.xyz/address/0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9) | | World Chain | 480 | `0x047ba6c9949baB22d13C347B40819b7A20C4C53a` | [worldchain-mainnet-explorer.alchemy.com](https://worldchain-mainnet-explorer.alchemy.com/address/0x047ba6c9949baB22d13C347B40819b7A20C4C53a) | | Xai | 660279 | `0x062200d92dF6bB7bA89Ce4D6800110450f94784e` | [explorer.xai-chain.net](https://explorer.xai-chain.net/address/0x062200d92dF6bB7bA89Ce4D6800110450f94784e) | | XLayer | 196 | `0x047ba6c9949baB22d13C347B40819b7A20C4C53a` | [www.oklink.com](https://www.oklink.com/xlayer/address/0x047ba6c9949baB22d13C347B40819b7A20C4C53a) | | XPLA | 37 | `0xFa6fDABA1d0688675f05cE1B9DE17461247Bce9e` | [explorer.xpla.io](https://explorer.xpla.io/mainnet/address/0xFa6fDABA1d0688675f05cE1B9DE17461247Bce9e) | | Zero Network | 543210 | `0xB2F0e411B46AbE3248dAFB5e89aDB5b8404F45DF` | [zerion-explorer.vercel.app](https://zerion-explorer.vercel.app/address/0xB2F0e411B46AbE3248dAFB5e89aDB5b8404F45DF) | | ZetaChain | 7000 | `0x48083C69f5a42c6B69ABbAd48AE195BD36770ee2` | [explorer.zetachain.com](https://explorer.zetachain.com/address/0x48083C69f5a42c6B69ABbAd48AE195BD36770ee2) | | Zircuit | 48900 | `0x5366362c41e34869BDa231061603E4356D66079D` | [explorer.zircuit.com](https://explorer.zircuit.com/address/0x5366362c41e34869BDa231061603E4356D66079D) | | zkLink Nova | 810180 | `0xf5626c0f33Ca102eb3ca1633A410cd8aa92909e4` | [explorer.zklink.io](https://explorer.zklink.io/address/0xf5626c0f33Ca102eb3ca1633A410cd8aa92909e4) | | zkSync | 324 | `0x576aF402c97bFE452Dcc203B6c3f6F4EBC92A0f5` | [explorer.zksync.io](https://explorer.zksync.io/address/0x576aF402c97bFE452Dcc203B6c3f6F4EBC92A0f5) | | Zora | 7777777 | `0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed` | [explorer.zora.energy](https://explorer.zora.energy/address/0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed) | | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Abstract Testnet | 11124 | `0xfE9a467831a28Ec3D54deCCf0A2A41fa77dDD1D7` | [explorer.testnet.abs.xyz](https://explorer.testnet.abs.xyz/address/0xfE9a467831a28Ec3D54deCCf0A2A41fa77dDD1D7) | | Aleph Zero EVM Testnet | 2039 | `0xBF2C366530C1269d531707154948494D3fF4AcA7` | [evm-explorer-testnet.alephzero.org](https://evm-explorer-testnet.alephzero.org/address/0xBF2C366530C1269d531707154948494D3fF4AcA7) | | Alfajores | 44787 | `0x3726EE36a2A9e11a40d1ffD7D9A1A16e0154cDA0` | [explorer.celo.org](https://explorer.celo.org/alfajores/address/0x3726EE36a2A9e11a40d1ffD7D9A1A16e0154cDA0) | | Arbitrum Sepolia | 421614 | `0x1b33611fCc073aB0737011d5512EF673Bff74962` | [sepolia.arbiscan.io](https://sepolia.arbiscan.io/address/0x1b33611fCc073aB0737011d5512EF673Bff74962) | | Arcadia Testnet v2 | 1098411886 | `0x843908541D24d9F6Fa30C8Bb1c39038C947D08fC` | [explorer.khalani.network](https://explorer.khalani.network/address/0x843908541D24d9F6Fa30C8Bb1c39038C947D08fC) | | Base Sepolia | 84532 | `0x20c44b1E3BeaDA1e9826CFd48BeEDABeE9871cE9` | [sepolia.basescan.org](https://sepolia.basescan.org/address/0x20c44b1E3BeaDA1e9826CFd48BeEDABeE9871cE9) | | Berachain bArtio | 80084 | `0xB057Fb841027a8554521DcCdeC3c3474CaC99AB5` | [bartio.beratrail.io](https://bartio.beratrail.io//address/0xB057Fb841027a8554521DcCdeC3c3474CaC99AB5) | | BSC Testnet | 97 | `0xf09701B0a93210113D175461b6135a96773B5465` | [testnet.bscscan.com](https://testnet.bscscan.com/address/0xf09701B0a93210113D175461b6135a96773B5465) | | Camp Network Testnet V2 | 325000 | `0xEa7e618Bee8927fBb2fA20Bc41eE8DEA51838aAD` | [camp-network-testnet.blockscout.com](https://camp-network-testnet.blockscout.com/address/0xEa7e618Bee8927fBb2fA20Bc41eE8DEA51838aAD) | | Citrea Testnet | 5115 | `0x7c5B5bdA7F1d1F70A6678ABb4d894612Fc76498F` | [explorer.testnet.citrea.xyz](https://explorer.testnet.citrea.xyz/address/0x7c5B5bdA7F1d1F70A6678ABb4d894612Fc76498F) | | Eco Testnet | 471923 | `0x20c44b1E3BeaDA1e9826CFd48BeEDABeE9871cE9` | [eco-testnet.explorer.caldera.xyz](https://eco-testnet.explorer.caldera.xyz//address/0x20c44b1E3BeaDA1e9826CFd48BeEDABeE9871cE9) | | Form Testnet | 132902 | `0xEa7e618Bee8927fBb2fA20Bc41eE8DEA51838aAD` | [sepolia-explorer.form.network](https://sepolia-explorer.form.network/address/0xEa7e618Bee8927fBb2fA20Bc41eE8DEA51838aAD) | | Fuji | 43113 | `0x4f7179A691F8a684f56cF7Fed65171877d30739a` | [testnet.snowtrace.io](https://testnet.snowtrace.io/address/0x4f7179A691F8a684f56cF7Fed65171877d30739a) | | Holesky | 17000 | `0xAb9B273366D794B7F80B4378bc8Aaca75C6178E2` | [holesky.etherscan.io](https://holesky.etherscan.io/address/0xAb9B273366D794B7F80B4378bc8Aaca75C6178E2) | | Hyperliquid EVM Testnet | 998 | `0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE` | [explorer.hyperlend.finance](https://explorer.hyperlend.finance/address/0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE) | | Ink Sepolia | 763373 | `0xBdf49bE2201A1c4B13023F0a407196C6Adb32680` | [explorer-sepolia.inkonchain.com](https://explorer-sepolia.inkonchain.com/address/0xBdf49bE2201A1c4B13023F0a407196C6Adb32680) | | Odyssey Testnet | 911867 | `0x54Bd02f0f20677e9846F8E9FdB1Abc7315C49C38` | [odyssey-explorer.ithaca.xyz](https://odyssey-explorer.ithaca.xyz/address/0x54Bd02f0f20677e9846F8E9FdB1Abc7315C49C38) | | Optimism Sepolia | 11155420 | `0x20c44b1E3BeaDA1e9826CFd48BeEDABeE9871cE9` | [sepolia-optimistic.etherscan.io](https://sepolia-optimistic.etherscan.io/address/0x20c44b1E3BeaDA1e9826CFd48BeEDABeE9871cE9) | | Plume Testnet | 161221135 | `0x20c44b1E3BeaDA1e9826CFd48BeEDABeE9871cE9` | [plume-testnet.explorer.caldera.xyz](https://plume-testnet.explorer.caldera.xyz/address/0x20c44b1E3BeaDA1e9826CFd48BeEDABeE9871cE9) | | Polygon Amoy | 80002 | `0x11918DC33E067C5DA83EEF58E50F856398b8Df4C` | [amoy.polygonscan.com](https://amoy.polygonscan.com/address/0x11918DC33E067C5DA83EEF58E50F856398b8Df4C) | | Scroll Sepolia | 534351 | `0x527768930D889662Fe7ACF64294871e86e4C2381` | [sepolia.scrollscan.dev](https://sepolia.scrollscan.dev//address/0x527768930D889662Fe7ACF64294871e86e4C2381) | | Sepolia | 11155111 | `0xE6105C59480a1B7DD3E4f28153aFdbE12F4CfCD9` | [sepolia.etherscan.io](https://sepolia.etherscan.io/address/0xE6105C59480a1B7DD3E4f28153aFdbE12F4CfCD9) | | Soneium Minato Testnet | 1946 | `0xEa7e618Bee8927fBb2fA20Bc41eE8DEA51838aAD` | [explorer-testnet.soneium.org](https://explorer-testnet.soneium.org/address/0xEa7e618Bee8927fBb2fA20Bc41eE8DEA51838aAD) | | Sonic Testnet | 64165 | `0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f` | [testnet.soniclabs.com](https://testnet.soniclabs.com/address/0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f) | | SUAVE Toliman Testnet | 33626250 | `0xEa7e618Bee8927fBb2fA20Bc41eE8DEA51838aAD` | [explorer.toliman.suave.flashbots.net](https://explorer.toliman.suave.flashbots.net/address/0xEa7e618Bee8927fBb2fA20Bc41eE8DEA51838aAD) | | Superposition Testnet | 98985 | `0xAD34A66Bf6dB18E858F6B686557075568c6E031C` | [testnet-explorer.superposition.so](https://testnet-explorer.superposition.so/address/0xAD34A66Bf6dB18E858F6B686557075568c6E031C) | | Tangle Testnet | 3799 | `0x6D35A0f235aa0fBf0163C8b5171eF6E55843849b` | [testnet-explorer.tangle.tools](https://testnet-explorer.tangle.tools//address/0x6D35A0f235aa0fBf0163C8b5171eF6E55843849b) | | Treasure Topaz Testnet | 978658 | `0xfE9a467831a28Ec3D54deCCf0A2A41fa77dDD1D7` | [topaz.treasurescan.io](https://topaz.treasurescan.io/address/0xfE9a467831a28Ec3D54deCCf0A2A41fa77dDD1D7) | | Unichain Testnet | 1301 | `0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f` | [unichain-sepolia.blockscout.com](https://unichain-sepolia.blockscout.com/address/0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f) | --- # Warp Route Interface | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Warp Route Interface ==================== Interface[​](#interface "Direct link to Interface") ---------------------------------------------------- Hyperlane Warp Routes leverage the `IHypERC20` token interface. Warp Route tokens implement this interface, which extends the standard `ERC20` interface. /// @notice An interchain extension of the ERC20 interfaceinterface IHypERC20 is IERC20 { /** * @notice Transfers tokens to the specified recipient on a remote chain * @param _destination The domain ID of the destination chain * @param _recipient The address of the recipient, encoded as bytes32 * @param _amount The amount of tokens to transfer */ function transferRemote( uint32 _destination, bytes32 _recipient, uint256 _amount ) external payable;} Security considerations[​](#security-considerations "Direct link to Security considerations") ---------------------------------------------------------------------------------------------- The deployer of a Warp Route can optionally specify the interchain security modules (ISMs) that are used to verify interchain transfer messages. This means that each Warp Route may have a unique security configuration. Users transferring interchain tokens should understand the trust assumptions of a Route before using it. Similarly, Warp frontends should manually curate their warp routes to avoid supporting insecure ones. See the [Warp UI deployment docs](/docs/guides/deploy-warp-route-UI) details. Deploy your Warp Route[​](#deploy-your-warp-route "Direct link to Deploy your Warp Route") ------------------------------------------------------------------------------------------- Ready to deploy your Warp Route? It's easy - follow the [step-by-step guide](/docs/guides/deploy-warp-route) . * [Interface](#interface) * [Security considerations](#security-considerations) * [Deploy your Warp Route](#deploy-your-warp-route) --- # Interchain Account Interface | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Interchain Account Interface ============================ Developers can use the **Interchain Account** interface to create and control an account on a remote chain from their local chain. Unlike general message passing, which requires recipients to implement a specific interface, Interchain Accounts (ICAs) allow developers to interact with _any_ remote contract. Overview[​](#overview "Direct link to Overview") ------------------------------------------------- Interchain Accounts allow you to make a remote call from **Chain A** to **Chain B** using the router (`InterchainAccountRouter`). Here's how it works: * We use [CREATE2](https://docs.openzeppelin.com/cli/2.8/deploying-with-create2) to compute the deterministic [OwnableMulticall](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/middleware/libs/OwnableMulticall.sol) contract address for you, which serves as a proxy for your cross-chain calls. You can explore this [here](#example-usage) . * You can encode your call which includes the to address, call data, and the `msg.value` for each call, batched together in an array. * You send the encoded call to the **Chain A** router which gets relayed to the **Chain B** router. * After decoding the calls, the **Chain B** router checks if the computed address is already deployed or not. If not, we deploy the _OwnableMulticall_ contract. * The router then performs a multicall on the ICA address, which in turn makes the desired arbitrary call on **Chain B**. The Interchain Account interface assigns every `(uint32 origin, address owner, address remoteRouter, address remoteISM)` tuple a unique ICA address. The sender owns that ICA on the destination chain, and can direct it to make arbitrary function calls via the `InterchainAccountRouter.callRemote()` endpoint. For core chains supported by Hyperlane, you are able to use the defaults that are set by the owner of the router contract. See the [#overrides](#overrides) section to see how to make calls to _any_ chain. ### Interface[​](#interface "Direct link to Interface") // SPDX-License-Identifier: MIT OR Apache-2.0pragma solidity >=0.6.11;import {CallLib} from "../contracts/libs/Call.sol";interface IInterchainAccountRouter { function callRemote( uint32 _destinationDomain, CallLib.Call[] calldata calls ) external returns (bytes32); function getRemoteInterchainAccount(uint32 _destination, address _owner) external view returns (address);} tip * Use `InterchainAccountRouter` out of the box - ICA routers have already been deployed to core chains. Please refer to [addresses](/docs/reference/contract-addresses#interchainaccountrouter) . Try using the `callRemote` method to do a call via your wallet's interchain account. Example Usage[​](#example-usage "Direct link to Example Usage") ---------------------------------------------------------------- ### Encoding[​](#encoding "Direct link to Encoding") To use the `callRemote` function, first prepare an array of `Call` structs. `Call.data` can be easily encoded with the `abi.encodeCall` function. struct Call { bytes32 to; // supporting non EVM targets uint256 value; bytes data;}interface IUniswapV3Pool { function swap( address recipient, bool zeroForOne, int256 amountSpecified, uint160 sqrtPriceLimitX96, bytes calldata data ) external returns (int256 amount0, int256 amount1);}IUniswapV3Pool pool = IUniswapV3Pool(...);Call swapCall = Call({ to: TypeCasts.addressToBytes32(address(pool)), data: abi.encodeCall(pool.swap, (...)); value: 0,});uint32 ethereumDomain = 1;IInterchainAccountRouter(0xabc...).callRemote(ethereumDomain, [swapCall]); ### Typescript Usage[​](#typescript-usage "Direct link to Typescript Usage") We also have Typescript tooling to easily deploy ICA accounts and call `callRemote` on the origin chain: const localChain = 'ethereum';const signer = ;const localRouter: InterchainAccountRouter = InterchainAccountRouter__factory.connect(, signer);const recipientAddress = ; // use your own address hereconst recipientF = new TestRecipient__factory.connect(recipientAddress, signer); // use your own contract hereconst fooMessage = "Test";const data = recipient.interface.encodeFunctionData("fooBar", [1, fooMessage]);const call = { to: recipientAddress, data, value: BigNumber.from("0"),};const quote = await local["quoteGasPayment(uint32)"]( multiProvider.getDomainId(remoteChain));const config: AccountConfig = { origin: localChain, owner: signer.address, localRouter: localRouter.address,};await localRouter.callRemote(localChain, remoteChain, [call], config); ### Determine addresses[​](#determine-addresses "Direct link to Determine addresses") It may be useful to know the remote address of your ICA before sending a message. For example, you may want to first fund the address with tokens. The `getRemoteInterchainAccount` function can be used to get the address of an ICA given the destination chain and owner address. An example is included below of a contract precomputing its own Interchain Account address. address myInterchainAccount = IInterchainAccountRouter(...).getRemoteInterchainAccount( destination, address(this)); If you are using [#overrides](#overrides) to specify remote chains, pass those overrides when computing the remote ICA address. address myRemoteIca = IInterchainAccountRouter(...).getRemoteInterchainAccount( address(this), remoteRouterOverride, remoteIsmOverride); Overrides[​](#overrides "Direct link to Overrides") ---------------------------------------------------- Interchain Accounts allow developers to override the default chains and security models configured in the `InterchainAccountRouter`. These are useful for: * Calling an ICA on chains not configured in `InterchainAccountRouter`. * Using different ISM than the defaults configured in the `InterchainAccountRouter` * Adjusting the gas limit for IGP payments or setting other parameters. ### Interface[​](#interface-1 "Direct link to Interface") The `callRemoteWithOverrides` function looks similar to the `callRemote` function, but takes three additional arguments. First, developers can override `_router`, the address of the `InterchainAccountRouter` on the remote chain. This allows developers to control an ICA on remote chains that have not been configured on the local `InterchainAccountRouter`. Second, developers can override `_ism`, the address of the remote interchain security module (ISM) used to secure their ICA. This ISM will be used to verify the interchain messages passed between the local and remote `InterchainAccountRouters`. This allows developers to use a custom security model that best suits their needs. Third, developers can override `_hookMetadata`, the [StandardHookMetadata](/docs/reference/libraries/hookmetadata) metadata passed to the message hooks for each ICA call (for example, overriding the gas limit for the IGP payment). /** * @notice Dispatches a sequence of remote calls to be made by an owner's * interchain account on the destination domain * @dev Recommend using CallLib.build to format the interchain calls * @param _destination The remote domain of the chain to make calls on * @param _router The remote router address * @param _ism The remote ISM address * @param _calls The sequence of calls to make * @param _hookMetadata The hook metadata to override with for the hook set by the owner * @return The Hyperlane message ID */ function callRemoteWithOverrides( uint32 _destination, bytes32 _router, bytes32 _ism, CallLib.Call[] calldata _calls, bytes memory _hookMetadata ) public payable returns (bytes32) function getRemoteInterchainAccount( address _owner, address _router, address _ism ) public view returns (address) * [Overview](#overview) * [Interface](#interface) * [Example Usage](#example-usage) * [Encoding](#encoding) * [Typescript Usage](#typescript-usage) * [Determine addresses](#determine-addresses) * [Overrides](#overrides) * [Interface](#interface-1) --- # Glossary | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Glossary ======== Agent[​](#agent "Direct link to Agent") ---------------------------------------- Hyperlane [agents](/docs/protocol/agents) are off-chain actors that read and write Hyperlane smart contract state. Example agents include [Validators](/docs/protocol/agents/validators) and the [Relayer](/docs/protocol/agents/relayer) . Aggregation ISM[​](#aggregation-ism "Direct link to Aggregation ISM") ---------------------------------------------------------------------- The [Aggregation ISM](/docs/protocol/ISM/aggregation-ISM) is a type of interchain security module that aggregates security from many [ISMs](/docs/reference/glossary#interchain-security-module) by requiring that `m` of `n` ISMs verify a particular interchain message. Checkpoint[​](#checkpoint "Direct link to Checkpoint") ------------------------------------------------------- A checkpoint is a (merkle root, index) tuple, corresponding to the state of the [Mailbox](/docs/reference/glossary#mailbox) incremental merkle tree at a particular point in time. Checkpoints signatures by [Validators](/docs/reference/glossary#validator) are used in [Multisig ISMs](/docs/reference/glossary#multisig-ism) . Collateral chain[​](#collateral-chain "Direct link to Collateral chain") ------------------------------------------------------------------------- For a [Warp Route](/docs/reference/glossary#warp-route) , the chain on which the [collateral token](/docs/reference/glossary#collateral-token) is deposited into the Warp Route. Collateral token[​](#collateral-token "Direct link to Collateral token") ------------------------------------------------------------------------- For a [Warp Route](/docs/reference/glossary#warp-route) , the token which is deposited on the [collateral chain](/docs/reference/glossary#collateral-chain) to create a wrapped token on a remote [synthetic chain](/docs/reference/glossary#synthetic-chain) . Default ISM[​](#default-ism "Direct link to Default ISM") ---------------------------------------------------------- The [Interchain Security Module](/docs/reference/glossary#interchain-security-module) that will be used to verify inbound messages if the message recipient has not specified their own ISM. Domain[​](#domain "Direct link to Domain") ------------------------------------------- A unique identifier for a particular chain, used by the Hyperlane protocol to determine message origin and destination. Maybe the same as the EVM chain ID, but isn't always. See [domains](/docs/reference/domains/) for a list of known Hyperlane domain IDs. Interchain accounts (ICA)[​](#interchain-accounts-ica "Direct link to Interchain accounts (ICA)") -------------------------------------------------------------------------------------------------- A [middleware](/docs/reference/glossary#middleware) smart contract that allows users to make interchain smart contract calls. For example, DAOs can use interchain accounts to own contracts on remote chains. See [Interchain Accounts](/docs/reference/applications/interchain-account) for more information. Interchain gas paymaster[​](#interchain-gas-paymaster "Direct link to Interchain gas paymaster") ------------------------------------------------------------------------------------------------- A smart contract deployed by a [Relayer](/docs/reference/glossary#relayer) that accepts payments on an origin chain for message delivery on destination chains. See [interchain gas payments](/docs/protocol/interchain-gas-payment) for more information Interchain queries (IQS)[​](#interchain-queries-iqs "Direct link to Interchain queries (IQS)") ----------------------------------------------------------------------------------------------- A [middleware](/docs/reference/glossary#middleware) smart contract that allows users to make interchain view calls. For example, smart contracts can use interchain queries to look up oracle exchange rates or token balances from a remote chain. Interchain Security Module (ISM)[​](#interchain-security-module-ism "Direct link to Interchain Security Module (ISM)") ----------------------------------------------------------------------------------------------------------------------- [Interchain Security Module](/docs/protocol/ISM/modular-security) (ISMs) are smart contracts that provide security to Hyperlane's interchain [Mailbox](/docs/protocol/mailbox) . ISMs are responsible for verifying that interchain messages being delivered on the destination chain were _actually sent_ on the origin chain. Mailbox[​](#mailbox "Direct link to Mailbox") ---------------------------------------------- Arguably the most important Hyperlane smart contract, the [mailbox](/docs/protocol/interchain-gas-payment) exposes an interface that developers can use to [send](/docs/reference/messaging/send) and [receive](/docs/reference/messaging/receive) interchain messages. Middleware[​](#middleware "Direct link to Middleware") ------------------------------------------------------- A smart contract that sends and receives messages, and exposes a developer facing API. Developers are expected to use this API instead of interacting directly with the [mailbox](/docs/reference/glossary#mailbox) . Example middlewares include [interchain-accounts-ica](/docs/reference/glossary#interchain-accounts-ica) and [interchain-queries-iqs](/docs/reference/glossary#interchain-queries-iqs) . Multisig ISM[​](#multisig-ism "Direct link to Multisig ISM") ------------------------------------------------------------- The [Multisig ISM](/docs/protocol/ISM/multisig-ISM) is a type of [Interchain Security Module](/docs/reference/glossary#interchain-security-module) that uses `m` of `n` [Validator](/docs/reference/glossary#validator) signatures in order to verify a particular interchain message. Permissionless Interoperability[​](#permissionless-interoperability "Direct link to Permissionless Interoperability") ---------------------------------------------------------------------------------------------------------------------- Hyperlane can be deployed by anyone to any chain, whether it is a layer 1, rollup, or app-chain, allowing that chain to communicate seamlessly. The open design of the Hyperlane protocol is known as Permissionless Interoperability (PI). Chains deployed by institutions other than the Hyperlane core team are referred to as 'PI chains'. Relayer[​](#relayer "Direct link to Relayer") ---------------------------------------------- The [Relayer](/docs/protocol/agents/relayer) is a Hyperlane [agent](/docs/reference/glossary#agent) responsible for delivering messages from their origin chain(s) to their destination chain(s). Relayers are untrusted, and anyone can operate a relayer. Routing ISM[​](#routing-ism "Direct link to Routing ISM") ---------------------------------------------------------- The [Routing ISM](/docs/protocol/ISM/routing-ISM) is a type of [Interchain Security Module](/docs/reference/glossary#interchain-security-module) that defers to a different ISM depending on the message being delivered. For example, a Routing ISM could use a different ISM depending on the origin chain from which the message was sent. Synthetic chain[​](#synthetic-chain "Direct link to Synthetic chain") ---------------------------------------------------------------------- For a [Warp Route](/docs/reference/glossary#warp-route) , a chain on which wrapped tokens are minted. These wrapped tokens are backed by [collateral tokens](/docs/reference/glossary#collateral-token) that have been locked on the [collateral chain](/docs/reference/glossary#collateral-chain) . Validator[​](#validator "Direct link to Validator") ---------------------------------------------------- [Validators](/docs/protocol/agents/validators) are a Hyperlane [agents](/docs/reference/glossary#agent) responsible for attesting to messages sent from an origin chain. [Multisig ISMs](/docs/reference/glossary#multisig-ism) use validator signatures to provide security for inbound messages. Warp Route[​](#warp-route "Direct link to Warp Route") ------------------------------------------------------- [Warp Routes](/docs/reference/applications/warp-routes#overview) are Hyperlane's take on the concept of token bridging, allowing you to permissionlessly transfer any ERC20-like asset to any chain via Hyperlane. Read more about how to [deploy a Warp Route](/docs/guides/deploy-warp-route) . * [Agent](#agent) * [Aggregation ISM](#aggregation-ism) * [Checkpoint](#checkpoint) * [Collateral chain](#collateral-chain) * [Collateral token](#collateral-token) * [Default ISM](#default-ism) * [Domain](#domain) * [Interchain accounts (ICA)](#interchain-accounts-ica) * [Interchain gas paymaster](#interchain-gas-paymaster) * [Interchain queries (IQS)](#interchain-queries-iqs) * [Interchain Security Module (ISM)](#interchain-security-module-ism) * [Mailbox](#mailbox) * [Middleware](#middleware) * [Multisig ISM](#multisig-ism) * [Permissionless Interoperability](#permissionless-interoperability) * [Relayer](#relayer) * [Routing ISM](#routing-ism) * [Synthetic chain](#synthetic-chain) * [Validator](#validator) * [Warp Route](#warp-route) --- # Default ISM Validators | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Default ISM Validators ====================== Mainnet[​](#mainnet "Direct link to Mainnet") ---------------------------------------------- [Aleph Zero EVM (1000041455)](#alephzeroevmmainnet) ---------------------------------------------------- #### Threshold: 3 of 4 | Operator | Address | | --- | --- | | Abacus Works | `0x33f20e6e775747d60301c6ea1c50e51f0389740c` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | | Aleph Zero | `0xCbf382214825F8c2f347dd4f23F0aDFaFad55dAa` | [Ancient8 (888888888)](#ancient8) ---------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xbb5842ae0e05215b53df4787a29144efb7e67551` | | Coin98 | `0xa5a56e97fb46f0ac3a3d261e404acb998d9a6969` | | Ancient8 | `0x95c7bf235837cb5a609fe6c95870410b9f68bcff` | [ApeChain (33139)](#apechain) ------------------------------ #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x773d7fe6ffb1ba4de814c28044ff9a2d83a48221` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [AppChain (466)](#appchain) ---------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x0531251bbadc1f9f19ccce3ca6b3f79f08eae1be` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Arbitrum (42161)](#arbitrum) ------------------------------ #### Threshold: 3 of 5 | Operator | Address | | --- | --- | | Abacus Works | `0x4d966438fe9e2b1e7124c87bbb90cb4f0f6c59a1` | | DSRV | `0xec68258a7c882ac2fc46b81ce80380054ffb4ef2` | | Zee Prime | `0x5450447aee7b544c462c9352bef7cad049b0c2dc` | | Everstake | `0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8` | | Staked | `0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b` | [Arbitrum Nova (42170)](#arbitrumnova) --------------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xd2a5e9123308d187383c87053811a2c21bd8af1f` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Artela (11820)](#artela) -------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x8fcc1ebd4c0b463618db13f83e4565af3e166b00` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Arthera (10242)](#arthera) ---------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x13710ac11c36c169f62fba95767ae59a1e57098d` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Astar (592)](#astar) ---------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x4d1b2cade01ee3493f44304653d8e352c66ec3e7` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Astar zkEVM (3776)](#astarzkevm) ---------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x89ecdd6caf138934bf3a2fb7b323984d72fd66de` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Aurora (1313161554)](#aurora) ------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x37105aec3ff37c7bb0abdb0b1d75112e1e69fa86` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Avalanche (43114)](#avalanche) -------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x3fb8263859843bffb02950c492d492cae169f4cf` | | DSRV | `0x402e0f8c6e4210d408b6ac00d197d4a099fcd25a` | | Everstake | `0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8` | [B3 (8333)](#b3) ----------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xd77b516730a836fc41934e7d5864e72c165b934e` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Base (8453)](#base) --------------------- #### Threshold: 3 of 5 | Operator | Address | | --- | --- | | Abacus Works | `0xb9453d675e0fa3c178a17b4ce1ad5b1a279b3af9` | | Staked | `0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b` | | Everstake | `0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8` | | DSRV | `0xcff391b4e516452d424db66beb9052b041a9ed79` | | Zee Prime | `0x5450447aee7b544c462c9352bef7cad049b0c2dc` | [Bitlayer (200901)](#bitlayer) ------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x1d9b0f4ea80dbfc71cb7d64d8005eccf7c41e75f` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Blast (81457)](#blast) ------------------------ #### Threshold: 3 of 4 | Operator | Address | | --- | --- | | Abacus Works | `0xf20c0b09f597597c8d2430d3d72dfddaf09177d1` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | | Everclear | `0x1652d8ba766821cf01aeea34306dfc1cab964a32` | | Renzo | `0x54bb0036f777202371429e062fe6aee0d59442f9` | [BOB (60808)](#bob) -------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x20f283be1eb0e81e22f51705dcb79883cfdd34aa` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Boba Mainnet (288)](#boba) ---------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xebeb92c94ca8408e73aa16fd554cb3a7df075c59` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Binance Smart Chain (56)](#bsc) --------------------------------- #### Threshold: 3 of 4 | Operator | Address | | --- | --- | | Abacus Works | `0x570af9b7b36568c8877eebba6c6727aa9dab7268` | | DSRV | `0x8292b1a53907ece0f76af8a50724e9492bcdc8a3` | | Everstake | `0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8` | | Zee Prime | `0x5450447aee7b544c462c9352bef7cad049b0c2dc` | [B² Network (223)](#bsquared) ------------------------------ #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xcadc90933c9fbe843358a4e70e46ad2db78e28aa` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Celo (42220)](#celo) ---------------------- #### Threshold: 3 of 5 | Operator | Address | | --- | --- | | Abacus Works | `0x63478422679303c3e4fc611b771fa4a707ef7f4a` | | DSRV | `0x622e43baf06ad808ca8399360d9a2d9a1a12688b` | | Everstake | `0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8` | | Staked | `0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b` | | Zee Prime | `0x5450447aee7b544c462c9352bef7cad049b0c2dc` | [CheeseChain (383353)](#cheesechain) ------------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x478fb53c6860ae8fc35235ba0d38d49b13128226` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Blockhunters | `0x101cE77261245140A0871f9407d6233C8230Ec47` | [Chiliz (1000088888)](#chilizmainnet) -------------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x7403e5d58b48b0f5f715d9c78fbc581f01a625cb` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Conflux eSpace (1030)](#conflux) ---------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x113dfa1dc9b0a2efb6ad01981e2aad86d3658490` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Conwai (668668)](#conwai) --------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x949e2cdd7e79f99ee9bbe549540370cdc62e73c3` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Core (1116)](#coredao) ------------------------ #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xbd6e158a3f5830d99d7d2bce192695bc4a148de2` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Corn (21000000)](#corn) ------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xc80b2e3e38220e02d194a0effa9d5bfe89894c07` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Cyber (7560)](#cyber) ----------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x94d7119ceeb802173b6924e6cc8c4cd731089a27` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Degen (666666666)](#degenchain) --------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x433e311f19524cd64fb2123ad0aa1579a4e1fc83` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Dogechain (2000)](#dogechain) ------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xe43f742c37858746e6d7e458bc591180d0cba440` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [DuckChain (5545)](#duckchain) ------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x91d55fe6dac596a6735d96365e21ce4bca21d83c` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Eclipse (1408864445)](#eclipsemainnet) ---------------------------------------- #### Threshold: 3 of 4 | Operator | Address | | --- | --- | | Abacus Works | `0xebb52d7eaa3ff7a5a6260bfe5111ce52d57401d0` | | Luganodes | `0x3571223e745dc0fcbdefa164c9b826b90c0d2dac` | | Imperator | `0xea83086a62617a7228ce4206fae2ea8b0ab23513` | | Eclipse | `0x4d4629f5bfeabe66edc7a78da26ef5273c266f97` | [Endurance (648)](#endurance) ------------------------------ #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x28c5b322da06f184ebf68693c5d19df4d4af13e5` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Fusionist | `0x7419021c0de2772b763e554480158a82a291c1f2` | [Ethereum (1)](#ethereum) -------------------------- #### Threshold: 4 of 7 | Operator | Address | | --- | --- | | Abacus Works | `0x03c842db86a6a3e524d4a6615390c1ea8e2b9541` | | DSRV | `0x94438a7de38d4548ae54df5c6010c4ebc5239eae` | | Zee Prime | `0x5450447aee7b544c462c9352bef7cad049b0c2dc` | | Everstake | `0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8` | | Staked | `0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b` | | AVS: Luganodes | `0xb683b742b378632a5f73a2a5a45801b3489bba44` | | AVS: Pier Two | `0xbf1023eff3dba21263bf2db2add67a0d6bcda2de` | [Everclear (25327)](#everclear) -------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xeff20ae3d5ab90abb11e882cfce4b92ea6c74837` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Everclear | `0xD79DFbF56ee2268f061cc613027a44A880f61Ba2` | [Evmos EVM (9001)](#evmos) --------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x8f82387ad8b7b13aa9e06ed3f77f78a77713afe0` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Fantom Opera (250)](#fantom) ------------------------------ #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xa779572028e634e16f26af5dfd4fa685f619457d` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Flame (253368190)](#flame) ---------------------------- #### Threshold: 3 of 5 | Operator | Address | | --- | --- | | Abacus Works | `0x1fa928ce884fa16357d4b8866e096392d4d81f43` | | P-OPS | `0xa6c998f0db2b56d7a63faf30a9b677c8b9b6faab` | | Luganodes | `0x09f9de08f7570c4146caa708dc9f75b56958957f` | | DSRV | `0xf1f4ae9959490380ad7863e79c3faf118c1fbf77` | | Tessellated | `0x0d4c1394a255568ec0ecd11795b28d1bda183ca4` | [Flare (14)](#flare) --------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xb65e52be342dba3ab2c088ceeb4290c744809134` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [EVM on Flow (1000000747)](#flowmainnet) ----------------------------------------- #### Threshold: 3 of 4 | Operator | Address | | --- | --- | | Abacus Works | `0xe132235c958ca1f3f24d772e5970dd58da4c0f6e` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | | Flow Foundation | `0x14ADB9e3598c395Fe3290f3ba706C3816Aa78F59` | [Form (478)](#form) -------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x58554b2e76167993b5fc000d0070a2f883cd333a` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Fraxtal (252)](#fraxtal) -------------------------- #### Threshold: 4 of 6 | Operator | Address | | --- | --- | | Abacus Works | `0x4bce180dac6da60d0f3a2bdf036ffe9004f944c1` | | Tessellated | `0x0d4c1394a255568ec0ecd11795b28d1bda183ca4` | | Enigma | `0x1c3C3013B863Cf666499Da1A61949AE396E3Ab82` | | Imperator | `0x573e960e07ad74ea2c5f1e3c31b2055994b12797` | | Bware Labs | `0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3` | | Luganodes | `0x25b3a88f7cfd3c9f7d7e32b295673a16a6ddbd91` | [Fuse (122)](#fusemainnet) --------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x770c8ec9aac8cec4b2ead583b49acfbc5a1cf8a9` | | Fuse | `0x6760226b34213d262D41D5291Ed57E81a68b4E0b` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | [Gnosis (100)](#gnosis) ------------------------ #### Threshold: 3 of 4 | Operator | Address | | --- | --- | | Abacus Works | `0xd4df66a859585678f2ea8357161d896be19cc1ca` | | DSRV | `0x19fb7e04a1be6b39b6966a0b0c60b929a93ed672` | | Everstake | `0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8` | | Zee Prime | `0x5450447aee7b544c462c9352bef7cad049b0c2dc` | [Gravity Alpha Mainnet (1625)](#gravity) ----------------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x23d549bf757a02a6f6068e9363196ecd958c974e` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Guru Network (260)](#guru) ---------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x0d756d9051f12c4de6aee2ee972193a2adfe00ef` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Harmony One (1666600000)](#harmony) ------------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xd677803a67651974b1c264171b5d7ca8838db8d5` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Hemi Network (43111)](#hemi) ------------------------------ #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x312dc72c17d01f3fd0abd31dd9b569bc473266dd` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Immutable zkEVM (1000013371)](#immutablezkevmmainnet) ------------------------------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xbdda85b19a5efbe09e52a32db1a072f043dd66da` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Injective EVM (2525)](#inevm) ------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xf9e35ee88e4448a3673b4676a4e153e3584a08eb` | | Decentrio | `0x0d4e7e64f3a032db30b75fe7acae4d2c877883bc` | | Imperator | `0x9ab11f38a609940153850df611c9a2175dcffe0f` | [Injective (6909546)](#injective) ---------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xbfb8911b72cfb138c7ce517c57d9c691535dc517` | | Caldera | `0x6B1d09A97b813D53e9D4b7523DA36604C0B52242` | | Imperator | `0x9e551b6694bbd295d7d6e6a2540c7d41ce70a3b9` | [Ink (57073)](#ink) -------------------- #### Threshold: 4 of 6 | Operator | Address | | --- | --- | | Abacus Works | `0xb533b8b104522958b984fb258e0684dec0f1a6a5` | | Imperator | `0xd207a6dfd887d91648b672727ff1aef6223cb15a` | | Enigma | `0xa40203b5301659f1e201848d92f5e81f64f206f5` | | Luganodes | `0xff9c1e7b266a36eda0d9177d4236994d94819dc0` | | Bware Labs | `0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3` | | Tessellated | `0x0d4c1394a255568ec0ecd11795b28d1bda183ca4` | [Kaia (8217)](#kaia) --------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x9de0b3abb221d19719882fa4d61f769fdc2be9a4` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Kroma (255)](#kroma) ---------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x71b83c21342787d758199e4b8634d3a15f02dc6e` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Linea (59144)](#linea) ------------------------ #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xf2d5409a59e0f5ae7635aff73685624904a77d94` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Lisk (1135)](#lisk) --------------------- #### Threshold: 4 of 7 | Operator | Address | | --- | --- | | Abacus Works | `0xc0b282aa5bac43fee83cf71dc3dd1797c1090ea5` | | Tessellated | `0x0d4c1394a255568ec0ecd11795b28d1bda183ca4` | | Enigma | `0x3DA4ee2801Ec6CC5faD73DBb94B10A203ADb3d9e` | | Imperator | `0x4df6e8878992c300e7bfe98cac6bf7d3408b9cbf` | | Bware Labs | `0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3` | | Luganodes | `0xf0da628f3fb71652d48260bad4691054045832ce` | | Lisk | `0xead4141b6ea149901ce4f4b556953f66d04b1d0c` | [LUKSO (42)](#lukso) --------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xa5e953701dcddc5b958b5defb677a829d908df6d` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Blockhunters | `0x101cE77261245140A0871f9407d6233C8230Ec47` | [Lumia Prism (1000073017)](#lumiaprism) ---------------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xb69731640ffd4338a2c9358a935b0274c6463f85` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Manta Pacific (169)](#mantapacific) ------------------------------------- #### Threshold: 5 of 7 | Operator | Address | | --- | --- | | Abacus Works | `0x8e668c97ad76d0e28375275c41ece4972ab8a5bc` | | Cosmostation | `0x521a3e6bf8d24809fde1c1fd3494a859a16f132c` | | P2P | `0x14025fe092f5f8a401dd9819704d9072196d2125` | | Neutron | `0x25b9a0961c51e74fd83295293bc029131bf1e05a` | | Cosmos Spaces | `0xa0eE95e280D46C14921e524B075d0C341e7ad1C8` | | DSRV | `0xcc9a0b6de7fe314bd99223687d784730a75bb957` | | SG-1 | `0x42b6de2edbaa62c2ea2309ad85d20b3e37d38acf` | [Mantle (5000)](#mantle) ------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xf930636c5a1a8bf9302405f72e3af3c96ebe4a52` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Merlin (4200)](#merlin) ------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xc1d6600cb9326ed2198cc8c4ba8d6668e8671247` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Metal L2 (1000001750)](#metal) -------------------------------- #### Threshold: 4 of 6 | Operator | Address | | --- | --- | | Abacus Works | `0xd9f7f1a05826197a93df51e86cefb41dfbfb896a` | | Imperator | `0x01e3909133d20c05bbc94247769235d30101f748` | | Enigma | `0xaba06266f47e3ef554d218b879bd86114a8dabd4` | | Luganodes | `0x05d91f80377ff5e9c6174025ffaf094c57a4766a` | | Bware Labs | `0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3` | | Tessellated | `0x0d4c1394a255568ec0ecd11795b28d1bda183ca4` | [Metis Andromeda (1088)](#metis) --------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xc4a3d25107060e800a43842964546db508092260` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Mint (185)](#mint) -------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xfed01ccdd7a65e8a6ad867b7fb03b9eb47777ac9` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mint | `0x0230505530b80186f8cdccfaf9993eb97aebe98a` | [Mode (34443)](#mode) ---------------------- #### Threshold: 4 of 6 | Operator | Address | | --- | --- | | Abacus Works | `0x7eb2e1920a4166c19d6884c1cec3d2cf356fc9b7` | | Tessellated | `0x0d4c1394a255568ec0ecd11795b28d1bda183ca4` | | Enigma | `0x65C140e3a05F33192384AffEF985696Fe3cDDE42` | | Imperator | `0x20eade18ea2af6dfd54d72b3b5366b40fcb47f4b` | | Bware Labs | `0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3` | | Luganodes | `0x485a4f0009d9afbbf44521016f9b8cdd718e36ea` | [Molten (360)](#molten) ------------------------ #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xad5aa33f0d67f6fa258abbe75458ea4908f1dc9f` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Moonbeam (1284)](#moonbeam) ----------------------------- #### Threshold: 3 of 4 | Operator | Address | | --- | --- | | Abacus Works | `0x2225e2f4e9221049456da93b71d2de41f3b6b2a8` | | DSRV | `0x645428d198d2e76cbd9c1647f5c80740bb750b97` | | Everstake | `0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8` | | Staked | `0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b` | [Morph (2818)](#morph) ----------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x4884535f393151ec419add872100d352f71af380` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Nero (1689)](#nero) --------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xb86f872df37f11f33acbe75b6ed208b872b57183` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Neutron (1853125230)](#neutron) --------------------------------- #### Threshold: 4 of 7 | Operator | Address | | --- | --- | | Abacus Works | `0xa9b8c1f4998f781f958c63cfcd1708d02f004ff0` | | Cosmostation | `0xb65438a014fb05fbadcfe35bc6e25d372b6ba460` | | P2P | `0x42fa752defe92459370a052b6387a87f7de9b80c` | | Neutron | `0xc79503a3e3011535a9c60f6d21f76f59823a38bd` | | DSRV | `0x47aa126e05933b95c5eb90b26e6b668d84f4b25a` | | Cosmos Spaces | `0x54b2cca5091b098a1a993dec03c4d1ee9af65999` | | SG-1 | `0x42b6de2edbaa62c2ea2309ad85d20b3e37d38acf` | [Oort (970)](#oortmainnet) --------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x9b7ff56cd9aa69006f73f1c5b8c63390c706a5d7` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | | Oort | `0xfa94a494f01d1034b8cea025ca4c2a7e31ca39a1` | [Optimism (10)](#optimism) --------------------------- #### Threshold: 4 of 6 | Operator | Address | | --- | --- | | Abacus Works | `0x20349eadc6c72e94ce38268b96692b1a5c20de4f` | | Tessellated | `0x0d4c1394a255568ec0ecd11795b28d1bda183ca4` | | Enigma | `0xd8c1cCbfF28413CE6c6ebe11A3e29B0D8384eDbB` | | Imperator | `0x1b9e5f36c4bfdb0e3f0df525ef5c888a4459ef99` | | Bware Labs | `0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3` | | Luganodes | `0xf9dfaa5c20ae1d84da4b2696b8dc80c919e48b12` | [Orderly L2 (291)](#orderly) ----------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xec3dc91f9fa2ad35edf5842aa764d5573b778bb6` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Polygon (137)](#polygon) -------------------------- #### Threshold: 3 of 4 | Operator | Address | | --- | --- | | Abacus Works | `0x12ecb319c7f4e8ac5eb5226662aeb8528c5cefac` | | DSRV | `0x008f24cbb1cc30ad0f19f2516ca75730e37efb5f` | | Everstake | `0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8` | | Zee Prime | `0x5450447aee7b544c462c9352bef7cad049b0c2dc` | [Polygon zkEVM (1101)](#polygonzkevm) -------------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x86f2a44592bb98da766e880cfd70d3bbb295e61a` | | DSRV | `0x865818fe1db986036d5fd0466dcd462562436d1a` | | Everstake | `0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8` | [Polynomial (1000008008)](#polynomialfi) ----------------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x23d348c2d365040e56f3fee07e6897122915f513` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Prom (227)](#prom) -------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xb0c4042b7c9a95345be8913f4cdbf4043b923d98` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Proof of Play Apex (70700)](#proofofplay) ------------------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xcda40baa71970a06e5f55e306474de5ca4e21c3b` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [RARI Chain (1000012617)](#rarichain) -------------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xeac012df7530720dd7d6f9b727e4fe39807d1516` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [re.al (111188)](#real) ------------------------ #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xaebadd4998c70b05ce8715cf0c3cb8862fe0beec` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Redstone (690)](#redstone) ---------------------------- #### Threshold: 3 of 4 | Operator | Address | | --- | --- | | Abacus Works | `0x1400b9737007f7978d8b4bbafb4a69c83f0641a7` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | | Blockhunters | `0x101cE77261245140A0871f9407d6233C8230Ec47` | [Rivalz (753)](#rivalz) ------------------------ #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xf87c3eb3dde972257b0d6d110bdadcda951c0dc1` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Rootstock (1000000030)](#rootstockmainnet) -------------------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x8675eb603d62ab64e3efe90df914e555966e04ac` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Sanko (1996)](#sanko) ----------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x795c37d5babbc44094b084b0c89ed9db9b5fae39` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Scroll (534352)](#scroll) --------------------------- #### Threshold: 3 of 4 | Operator | Address | | --- | --- | | Abacus Works | `0xad557170a9f2f21c35e03de07cb30dcbcc3dff63` | | Staked | `0xb3ac35d3988bca8c2ffd195b1c6bee18536b317b` | | Everstake | `0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8` | | DSRV | `0xbac4ac39f1d8b5ef15f26fdb1294a7c9aba3f948` | [Sei (1329)](#sei) ------------------- #### Threshold: 3 of 4 | Operator | Address | | --- | --- | | Abacus Works | `0x9920d2dbf6c85ffc228fdc2e810bf895732c6aa5` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Blockhunters | `0x101cE77261245140A0871f9407d6233C8230Ec47` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Shibarium (109)](#shibarium) ------------------------------ #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xfa33391ee38597cbeef72ccde8c9e13e01e78521` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [SnaxChain (2192)](#snaxchain) ------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x2c25829ae32a772d2a49f6c4b34f8b01fd03ef9e` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Solana (1399811149)](#solanamainnet) -------------------------------------- #### Threshold: 3 of 5 | Operator | Address | | --- | --- | | Abacus Works | `0x28464752829b3ea59a497fca0bdff575c534c3ff` | | Luganodes | `0x2b7514a2f77bd86bbf093fe6bb67d8611f51c659` | | DSRV | `0xd90ea26ff731d967c5ea660851f7d63cb04ab820` | | Everstake | `0x38c7a4ca1273ead2e867d096adbcdd0e2acb21d8` | | Eclipse | `0xcb6bcbd0de155072a7ff486d9d7286b0f71dcc2d` | [Soneium (1868)](#soneium) --------------------------- #### Threshold: 4 of 6 | Operator | Address | | --- | --- | | Abacus Works | `0xd4b7af853ed6a2bfc329ecef545df90c959cbee8` | | Imperator | `0x9f4fa50ce49815b0932428a0eb1988382cef4a97` | | Enigma | `0x8d2f8ebd61d055d58768cf3b07cb2fb565d87716` | | Luganodes | `0x6c5f6ab7a369222e6691218ad981fe08a5def094` | | Bware Labs | `0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3` | | Tessellated | `0x0d4c1394a255568ec0ecd11795b28d1bda183ca4` | [Sonic (146)](#sonic) ---------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xa313d72dbbd3fa51a2ed1611ea50c37946fa42f7` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [SOON (50075007)](#soon) ------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x0E6723b3C1eD3Db0C24347AA2cf16D28BC2a1F76` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Superposition (1000055244)](#superpositionmainnet) ---------------------------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x3f489acdd341c6b4dd86293fa2cc5ecc8ccf4f84` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Superseed (5330)](#superseed) ------------------------------- #### Threshold: 4 of 6 | Operator | Address | | --- | --- | | Abacus Works | `0xdc2b87cb555411bb138d3a4e5f7832c87fae2b88` | | Imperator | `0x68f3a3b244f6ddc135130200a6b8729e290b4240` | | Enigma | `0x6ff4554cffbc2e4e4230b78e526eab255101d05a` | | Luganodes | `0x55880ac03fdf15fccff54ed6f8a83455033edd22` | | Bware Labs | `0x14d0B24d3a8F3aAD17DB4b62cBcEC12821c98Cb3` | | Tessellated | `0x0d4c1394a255568ec0ecd11795b28d1bda183ca4` | [Swell (1923)](#swell) ----------------------- #### Threshold: 3 of 5 | Operator | Address | | --- | --- | | Abacus Works | `0x4f51e4f4c7fb45d82f91568480a1a2cfb69216ed` | | Luganodes | `0x9eadf9217be22d9878e0e464727a2176d5c69ff8` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | | Hashkey Cloud | `0x5aed2fd5cc5f9749c455646c86b0db6126cafcbb` | [Taiko (167000)](#taiko) ------------------------- #### Threshold: 3 of 4 | Operator | Address | | --- | --- | | Abacus Works | `0xa930073c8f2d0b2f7423ea32293e0d1362e65d79` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | | Luganodes | `0x2F007c82672F2Bb97227D4e3F80Ac481bfB40A2a` | [Tangle (5845)](#tangle) ------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x1ee52cbbfacd7dcb0ba4e91efaa6fbc61602b15b` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Tangle | `0xe271ef9a6e312540f099a378865432fa73f26689` | [Telos EVM (40)](#telos) ------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xcb08410b14d3adf0d0646f0c61cd07e0daba8e54` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Torus (21000)](#torus) ------------------------ #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x96982a325c28a842bc8cf61b63000737bb9f1f7d` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Treasure (61166)](#treasure) ------------------------------ #### Threshold: 3 of 5 | Operator | Address | | --- | --- | | Abacus Works | `0x6ad994819185553e8baa01533f0cd2c7cadfe6cc` | | P2P | `0x278460fa51ff448eb53ffa62951b4b8e3e8f74e3` | | Treasure | `0xe92ff70bb463e2aa93426fd2ba51afc39567d426` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | | Hashkey Cloud | `0x5aed2fd5cc5f9749c455646c86b0db6126cafcbb` | [Unichain (130)](#unichain) ---------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x9773a382342ebf604a2e5de0a1f462fb499e28b1` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Vana (1480)](#vana) --------------------- #### Threshold: 3 of 4 | Operator | Address | | --- | --- | | Abacus Works | `0xfdf3b0dfd4b822d10cacb15c8ae945ea269e7534` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | | P2P | `0xba2f4f89cae6863d8b49e4ca0208ed48ad9ac354` | [Viction (88)](#viction) ------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | BlockPi | `0x6D113Ae51bfeA7b63a8828f97e9dcE393B25c189` | | RockX | `0xa3f93fe365bf99f431d8fde740b140615e24f99b` | | Abacus Works | `0x1f87c368f8e05a85ef9126d984a980a20930cb9c` | [World Chain (480)](#worldchain) --------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x31048785845325b22817448b68d08f8a8fe36854` | | Imperator | `0x11e2a683e83617f186614071e422b857256a9aae` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | [Xai (660279)](#xai) --------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xe993f01fea86eb64cda45ae5af1d5be40ac0c7e9` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [XLayer (196)](#xlayer) ------------------------ #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xa2ae7c594703e988f23d97220717c513db638ea3` | | Imperator | `0xfed056cC0967F5BC9C6350F6C42eE97d3983394d` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | [XPLA (37)](#xpla) ------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xc11cba01d67f2b9f0288c4c8e8b23c0eca03f26e` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Zero Network (543210)](#zeronetwork) -------------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x1bd9e3f8a90ea1a13b0f2838a1858046368aad87` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [ZetaChain (7000)](#zetachain) ------------------------------- #### Threshold: 3 of 4 | Operator | Address | | --- | --- | | Abacus Works | `0xa3bca0b80317dbf9c7dce16a16ac89f4ff2b23ef` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Blockhunters | `0x101cE77261245140A0871f9407d6233C8230Ec47` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [Zircuit (48900)](#zircuit) ---------------------------- #### Threshold: 3 of 4 | Operator | Address | | --- | --- | | Abacus Works | `0x169ec400cc758fef3df6a0d6c51fbc6cdd1015bb` | | Luganodes | `0x7aC6584c068eb2A72d4Db82A7B7cd5AB34044061` | | Hashkey Cloud | `0x0180444c9342BD672867Df1432eb3dA354413a6E` | | Renzo | `0x1da9176C2CE5cC7115340496fa7D1800a98911CE` | [zkLink Nova (810180)](#zklink) -------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x217a8cb4789fc45abf56cb6e2ca96f251a5ac181` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | [zkSync (324)](#zksync) ------------------------ #### Threshold: 3 of 4 | Operator | Address | | --- | --- | | Abacus Works | `0xadd1d39ce7a687e32255ac457cf99a6d8c5b5d1a` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | | Imperator | `0x75237d42ce8ea27349a0254ada265db94157e0c1` | [Zora (7777777)](#zoramainnet) ------------------------------- #### Threshold: 3 of 4 | Operator | Address | | --- | --- | | Abacus Works | `0x35130945b625bb69b28aee902a3b9a76fa67125f` | | Imperator | `0x7089b6352d37d23fb05a7fee4229c78e038fba09` | | Merkly | `0xcf0211fafbb91fd9d06d7e306b30032dc3a1934f` | | Mitosis | `0x4f977a59fdc2d9e39f6d780a84d5b4add1495a36` | Testnet[​](#testnet "Direct link to Testnet") ---------------------------------------------- [Abstract Testnet (11124)](#abstracttestnet) --------------------------------------------- #### Threshold: 1 of 1 | Operator | Address | | --- | --- | | Abacus Works | `0x7655bc4c9802bfcb3132b8822155b60a4fbbce3e` | [Aleph Zero EVM Testnet (2039)](#alephzeroevmtestnet) ------------------------------------------------------ #### Threshold: 1 of 1 | Operator | Address | | --- | --- | | Abacus Works | `0x556cd94bcb6e5773e8df75e7eb3f91909d266a26` | [Alfajores (44787)](#alfajores) -------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x2233a5ce12f814bd64c9cdd73410bb8693124d40` | | Abacus Works | `0xba279f965489d90f90490e3c49e860e0b43c2ae6` | | Abacus Works | `0x86485dcec5f7bb8478dd251676372d054dea6653` | [Arbitrum Sepolia (421614)](#arbitrumsepolia) ---------------------------------------------- #### Threshold: 1 of 1 | Operator | Address | | --- | --- | | Abacus Works | `0x09fabfbca0b8bf042e2a1161ee5010d147b0f603` | [Arcadia Testnet v2 (1098411886)](#arcadiatestnet2) ---------------------------------------------------- #### Threshold: 1 of 1 | Operator | Address | | --- | --- | | Abacus Works | `0xd39cd388ce3f616bc81be6dd3ec9348d7cdf4dff` | [Base Sepolia (84532)](#basesepolia) ------------------------------------- #### Threshold: 1 of 1 | Operator | Address | | --- | --- | | Abacus Works | `0x82e3b437a2944e3ff00258c93e72cd1ba5e0e921` | [Berachain bArtio (80084)](#berabartio) ---------------------------------------- #### Threshold: 1 of 1 | Operator | Address | | --- | --- | | Abacus Works | `0x541dd3cb282cf869d72883557badae245b63e1fd` | [BSC Testnet (97)](#bsctestnet) -------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0x242d8a855a8c932dec51f7999ae7d1e48b10c95e` | | Abacus Works | `0xf620f5e3d25a3ae848fec74bccae5de3edcd8796` | | Abacus Works | `0x1f030345963c54ff8229720dd3a711c15c554aeb` | [Camp Network Testnet V2 (325000)](#camptestnet) ------------------------------------------------- #### Threshold: 1 of 1 | Operator | Address | | --- | --- | | Abacus Works | `0x238f40f055a7ff697ea6dbff3ae943c9eae7a38e` | [Citrea Testnet (5115)](#citreatestnet) ---------------------------------------- #### Threshold: 1 of 1 | Operator | Address | | --- | --- | | Abacus Works | `0x60d7380a41eb95c49be18f141efd2fde5e3dba20` | [Eco Testnet (471923)](#ecotestnet) ------------------------------------ #### Threshold: 1 of 1 | Operator | Address | | --- | --- | | Abacus Works | `0xb3191420d463c2af8bd9b4a395e100ec5c05915a` | [Form Testnet (132902)](#formtestnet) -------------------------------------- #### Threshold: 1 of 1 | Operator | Address | | --- | --- | | Abacus Works | `0x72ad7fddf16d17ff902d788441151982fa31a7bc` | [Fuji (43113)](#fuji) ---------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xd8154f73d04cc7f7f0c332793692e6e6f6b2402e` | | Abacus Works | `0x895ae30bc83ff1493b9cf7781b0b813d23659857` | | Abacus Works | `0x43e915573d9f1383cbf482049e4a012290759e7f` | [Holesky (17000)](#holesky) ---------------------------- #### Threshold: 1 of 1 | Operator | Address | | --- | --- | | Abacus Works | `0x7ab28ad88bb45867137ea823af88e2cb02359c03` | [Hyperliquid EVM Testnet (998)](#hyperliquidevmtestnet) -------------------------------------------------------- #### Threshold: 1 of 1 | Operator | Address | | --- | --- | | Abacus Works | `0xea673a92a23ca319b9d85cc16b248645cd5158da` | [Ink Sepolia (763373)](#inksepolia) ------------------------------------ #### Threshold: 1 of 1 | Operator | Address | | --- | --- | | Abacus Works | `0xe61c846aee275070207fcbf43674eb254f06097a` | [Odyssey Testnet (911867)](#odysseytestnet) -------------------------------------------- #### Threshold: 1 of 1 | Operator | Address | | --- | --- | | Abacus Works | `0xcc0a6e2d6aa8560b45b384ced7aa049870b66ea3` | [Optimism Sepolia (11155420)](#optimismsepolia) ------------------------------------------------ #### Threshold: 1 of 1 | Operator | Address | | --- | --- | | Abacus Works | `0x03efe4d0632ee15685d7e8f46dea0a874304aa29` | [Plume Testnet (161221135)](#plumetestnet) ------------------------------------------- #### Threshold: 1 of 1 | Operator | Address | | --- | --- | | Abacus Works | `0xe765a214849f3ecdf00793b97d00422f2d408ea6` | [Polygon Amoy (80002)](#polygonamoy) ------------------------------------- #### Threshold: 1 of 1 | Operator | Address | | --- | --- | | Abacus Works | `0xf0290b06e446b320bd4e9c4a519420354d7ddccd` | [Scroll Sepolia (534351)](#scrollsepolia) ------------------------------------------ #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xbe18dbd758afb367180260b524e6d4bcd1cb6d05` | | Abacus Works | `0x9a11ed23ae962974018ab45bc133caabff7b3271` | | Abacus Works | `0x7867bea3c9761fe64e6d124b171f91fd5dd79644` | [Sepolia (11155111)](#sepolia) ------------------------------- #### Threshold: 2 of 3 | Operator | Address | | --- | --- | | Abacus Works | `0xb22b65f202558adf86a8bb2847b76ae1036686a5` | | Abacus Works | `0x469f0940684d147defc44f3647146cb90dd0bc8e` | | Abacus Works | `0xd3c75dcf15056012a4d74c483a0c6ea11d8c2b83` | [Soneium Minato Testnet (1946)](#soneiumtestnet) ------------------------------------------------- #### Threshold: 1 of 1 | Operator | Address | | --- | --- | | Abacus Works | `0x2e2101020ccdbe76aeda1c27823b0150f43d0c63` | [Sonic Testnet (64165)](#sonictestnet) --------------------------------------- #### Threshold: 1 of 1 | Operator | Address | | --- | --- | | Abacus Works | `0x62e6591d00daec3fb658c3d19403828b4e9ddbb3` | [SUAVE Toliman Testnet (33626250)](#suavetoliman) -------------------------------------------------- #### Threshold: 1 of 1 | Operator | Address | | --- | --- | | Abacus Works | `0xf58f6e30aabba34e8dd7f79b3168507192e2cc9b` | [Superposition Testnet (98985)](#superpositiontestnet) ------------------------------------------------------- #### Threshold: 1 of 1 | Operator | Address | | --- | --- | | Abacus Works | `0x1d3168504b23b73cdf9c27f13bb0a595d7f1a96a` | [Treasure Topaz Testnet (978658)](#treasuretopaz) -------------------------------------------------- #### Threshold: 1 of 1 | Operator | Address | | --- | --- | | Abacus Works | `0x9750849beda0a7870462d4685f953fe39033a5ae` | [Unichain Testnet (1301)](#unichaintestnet) -------------------------------------------- #### Threshold: 1 of 1 | Operator | Address | | --- | --- | | Abacus Works | `0x5e99961cf71918308c3b17ef21b5f515a4f86fe5` | * [Mainnet](#mainnet) * [Testnet](#testnet) --- # Domain Identifiers | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Domain Identifiers ================== Core Domains[​](#core-domains "Direct link to Core Domains") ------------------------------------------------------------- This list includes only the deployments on chains that are managed by Abacus Works (our legal entity). Anybody can deploy Hyperlane on any chain [permissionlessly](/docs/deploy-hyperlane) - we are building a registry to reflect the community's permissionless deployments. Hyperlane uses unique IDs for each Hyperlane-supported chain. When possible Hyperlane domain IDs match EVM chain IDs, but this is **not guaranteed** as we support non-EVM chains as well. warning Some Hyperlane domain IDs do not match their corresponding EVM chain IDs, such as: * `immutablezkevmmainnet` * `rarichain` * `rootstockmainnet` * `alephzeroevmmainnet` * `chilizmainnet` * `lumiaprism` * `superpositionmainnet` * `flowmainnet` * `metal` * `polynomialfi` Please refer to the table below for the full list of Hyperlane domain IDs. When [sending a message](/docs/your-first-message) , users must provide the domain ID of the destination chain. When [receiving a message](/docs/reference/messaging/receive) , the recipient will be passed the domain ID of the origin chain. * Mainnet * Testnet | Network | Domain Identifier (uint32) | | --- | --- | | Aleph Zero EVM | 1000041455 | | Ancient8 | 888888888 | | ApeChain | 33139 | | AppChain | 466 | | Arbitrum | 42161 | | Arbitrum Nova | 42170 | | Artela | 11820 | | Arthera | 10242 | | Astar | 592 | | Astar zkEVM | 3776 | | Aurora | 1313161554 | | Avalanche | 43114 | | B3 | 8333 | | Base | 8453 | | Bitlayer | 200901 | | Blast | 81457 | | BOB | 60808 | | Boba Mainnet | 288 | | Binance Smart Chain | 56 | | B² Network | 223 | | Celo | 42220 | | CheeseChain | 383353 | | Chiliz | 1000088888 | | Conflux eSpace | 1030 | | Conwai | 668668 | | Core | 1116 | | Corn | 21000000 | | Cyber | 7560 | | Degen | 666666666 | | Dogechain | 2000 | | DuckChain | 5545 | | Eclipse | 1408864445 | | Endurance | 648 | | Ethereum | 1 | | Everclear | 25327 | | Evmos EVM | 9001 | | Fantom Opera | 250 | | Flame | 253368190 | | Flare | 14 | | EVM on Flow | 1000000747 | | Form | 478 | | Fraxtal | 252 | | Fuse | 122 | | Gnosis | 100 | | Gravity Alpha Mainnet | 1625 | | Guru Network | 260 | | Harmony One | 1666600000 | | Hemi Network | 43111 | | Immutable zkEVM | 1000013371 | | Injective EVM | 2525 | | Injective | 6909546 | | Ink | 57073 | | Kaia | 8217 | | Kroma | 255 | | Linea | 59144 | | Lisk | 1135 | | LUKSO | 42 | | Lumia Prism | 1000073017 | | Manta Pacific | 169 | | Mantle | 5000 | | Merlin | 4200 | | Metal L2 | 1000001750 | | Metis Andromeda | 1088 | | Mint | 185 | | Mode | 34443 | | Molten | 360 | | Moonbeam | 1284 | | Morph | 2818 | | Nero | 1689 | | Neutron | 1853125230 | | Oort | 970 | | Optimism | 10 | | Orderly L2 | 291 | | Polygon | 137 | | Polygon zkEVM | 1101 | | Polynomial | 1000008008 | | Prom | 227 | | Proof of Play Apex | 70700 | | RARI Chain | 1000012617 | | re.al | 111188 | | Redstone | 690 | | Rivalz | 753 | | Rootstock | 1000000030 | | Sanko | 1996 | | Scroll | 534352 | | Sei | 1329 | | Shibarium | 109 | | SnaxChain | 2192 | | Solana | 1399811149 | | Soneium | 1868 | | Sonic | 146 | | SOON | 50075007 | | Superposition | 1000055244 | | Superseed | 5330 | | Swell | 1923 | | Taiko | 167000 | | Tangle | 5845 | | Telos EVM | 40 | | Torus | 21000 | | Treasure | 61166 | | Unichain | 130 | | Vana | 1480 | | Viction | 88 | | World Chain | 480 | | Xai | 660279 | | XLayer | 196 | | XPLA | 37 | | Zero Network | 543210 | | ZetaChain | 7000 | | Zircuit | 48900 | | zkLink Nova | 810180 | | zkSync | 324 | | Zora | 7777777 | | Network | Domain Identifier (uint32) | | --- | --- | | Abstract Testnet | 11124 | | Aleph Zero EVM Testnet | 2039 | | Alfajores | 44787 | | Arbitrum Sepolia | 421614 | | Arcadia Testnet v2 | 1098411886 | | Base Sepolia | 84532 | | Berachain bArtio | 80084 | | BSC Testnet | 97 | | Camp Network Testnet V2 | 325000 | | Citrea Testnet | 5115 | | Eco Testnet | 471923 | | Form Testnet | 132902 | | Fuji | 43113 | | Holesky | 17000 | | Hyperliquid EVM Testnet | 998 | | Ink Sepolia | 763373 | | Odyssey Testnet | 911867 | | Optimism Sepolia | 11155420 | | Plume Testnet | 161221135 | | Polygon Amoy | 80002 | | Scroll Sepolia | 534351 | | Sepolia | 11155111 | | Soneium Minato Testnet | 1946 | | Sonic Testnet | 64165 | | SUAVE Toliman Testnet | 33626250 | | Superposition Testnet | 98985 | | Tangle Testnet | 3799 | | Treasure Topaz Testnet | 978658 | | Unichain Testnet | 1301 | * [Core Domains](#core-domains) --- # Arbitrum L2 to L1 Hook | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Arbitrum L2 to L1 Hook ====================== Arbitrum's Outbox system allows for arbitrary L2 to L1 contract calls after the optimistic challenge period, i.e., messages initiated on the L2 chain which eventually resolve in execution on L1. See more details about [here](https://docs.arbitrum.io/how-arbitrum-works/arbos/l2-l1-messaging) . Hyperlane can wrap around the Outbox system to leverage the optimistic security of Arbitrum L2 (with a 7-day withdrawal period and operational fraud proofs) to secure L2 to L1 messages from any Arbitrum Nitro rollups. We've implemented the [ArbL2ToL1Hook](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/hooks/ArbL2ToL1Hook.sol) and [ArbL2ToL1Ism](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/isms/hook/ArbL2ToL1Ism.sol) . How it works[​](#how-it-works "Direct link to How it works") ------------------------------------------------------------- note Outgoing messages from L2 cannot provide in-protocol automatic L1 execution because Ethereum doesn't offer scheduled execution affordances through the L1 node. The `ArbL2ToL1Hook` sends the encoded function call with the `messageId` to the `ArbSys` precompile on the L2. After waiting for the withdrawal period, you can the `getOutboxProof()` on the L2 to get a merkle proof of the message. From here, you have two options: * **Option A.** You can call the `ArbL2ToL1Ism`'s verify function via the `mailbox.process()` call with the proof and the other encoded data which in turn calls the `outbox.executeTransaction()` checking for the message sender and message data validity. * **Option B.** You can directly call the `outbox.executeTransaction()` with the proof and the other encoded data. However, you'll need to make a second call to the `ArbL2ToL1Ism`'s verify function to deliver the message. This option also you delivery of message values to the recipient contract. ### Option A[​](#option-a "Direct link to Option A") ### Option B[​](#option-b "Direct link to Option B") Note: here, the relayer is responsible for encoding the message proof from `arbSys.getOutboxProof()` and calling the `outbox.executeTransaction()` function. * [How it works](#how-it-works) * [Option A](#option-a) * [Option B](#option-b) --- # OP Stack Hook | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page OP Stack Hook ============= Optimism and other [OP Stack](https://stack.optimism.io/) rollups have their own interface for message passing between L1 and L2 called the `CrossDomainMessenger`. Messages passed via this interface benefit from the security of the rollup [settlement layer](https://stack.optimism.io/docs/understand/landscape/#execution) . function sendMessage( address _target, bytes calldata _message, uint32 _gasLimit) external payable; To provide this security as an option in Hyperlane, we created a Hook and ISM combo that can be transparently configured to reuse the native OP Stack interface. See the [addresses](/docs/reference/contract-addresses) page for Hook and ISM addresses. How It Works[​](#how-it-works "Direct link to How It Works") ------------------------------------------------------------- The OPStackHook sends the messageId to the L1CrossDomainMessenger which registers it as an Optimism `TransactionDeposited` event with ETH deposit and message data which gets picked up by the rollup node. The rollup node calls the precompiled contract `L2CrossDomainMessenger`'s relayMessage function which in turn makes calls configured OptimismISM contract, setting the messageId in the verifiedMessageId's mapping to the original L1 sender (ie. the user). The relayer carries just the message with no metadata, waiting for the Optimism node to pick and make a storage write to Optimism and the message delivery is then verified. * [How It Works](#how-it-works) --- # Post-Dispatch Interchain Gas Payment | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Post-Dispatch Interchain Gas Payment ==================================== During the post-dispatch hook, the `InterchainGasPaymaster` contract will revert if payment is insufficient to cover the relayer's _anticipated_ costs. The gas quote calculated at `dispatch` time must align with the relayer’s anticipated costs. Gas Limit[​](#gas-limit "Direct link to Gas Limit") ---------------------------------------------------- The `gasLimit` is set based on the cost of calling `handle` on the destination chain for a given message. This can vary depending on message content and the logic of the handler. The default `gasLimit` for metering the handle call is a static default of `50_000` gas. This is sufficient for simple operations but may not be enough for more complex `handle` functions. If your `handle` function performs complex operations or requires more gas, you must override the [default `gasLimit` in metadata](#metadata) to avoid transaction reverts. Benchmark your [`handle` implementations](/docs/reference/messaging/receive#handle) in unit tests to determine a reasonable `gasLimit` to use. ### Metadata[​](#metadata "Direct link to Metadata") This hook expects metadata in a **packed encoding** of `StandardHookMetadata`. See the Mailbox [dispatch overloads](/docs/reference/messaging/send#overriding-default-hook-metadata) for how to pass metadata overrides. * Solidity struct StandardHookMetadata { uint16 variant; uint256 msgValue; uint256 gasLimit; address refundAddress;} The `StandardHookMetadata` struct defines the fields required for metadata encoding: * `variant`: Specifies the metadata format version. * `msgValue`: Amount of native token sent with the message. * `gasLimit`: Gas limit for the `handle` function on the destination chain. Ensure this matches your simulation results. * `refundAddress`: Address to refund unused gas payments. To encode this metadata, use the `StandardHookMetadata.formatMetadata` library function. Direct encoding of the struct with `abi.encodePacked` is not supported in Solidity. #### Example Usage[​](#example-usage "Direct link to Example Usage") * Solidity // Example: Encoding metadata using StandardHookMetadatabytes memory metadata = StandardHookMetadata.formatMetadata( 0, // ETH message value 200000, // Custom gas limit address(this), // Refund address bytes("") // Optional custom metadata); ### Determine and Override the Gas Limit[​](#determine-and-override-the-gas-limit "Direct link to Determine and Override the Gas Limit") 1. **Simulate and Benchmark Gas Usage**: * Use tools like Tenderly or Foundry to simulate the `handle` function on your message recipient. Ensure the `from` address is set to the Mailbox contract on your chain. * If gas usage exceeds `50,000` gas, calculate an appropriate `gasLimit` and update your metadata. * Use the [call-to-action in the Hyperlane Explorer](https://github.com/hyperlane-xyz/hyperlane-explorer/blob/03634076049bfce1611b4e41d1aa81910eab2962/src/features/messages/cards/TransactionCard.tsx#L326-L333) to simulate transactions from the message details. 2. **Update Your Metadata**: * Calculate the required `gasLimit` based on the simulation. * Pass the updated `gasLimit` in your metadata to ensure the relayer will deliver your message. Destination Gas Config[​](#destination-gas-config "Direct link to Destination Gas Config") ------------------------------------------------------------------------------------------- For each remote domain, the InterchainGasPaymaster sets the domain gas config. struct DomainGasConfig { IGasOracle gasOracle; uint96 gasOverhead;} ### Gas overhead[​](#gas-overhead "Direct link to Gas overhead") The gas overhead is set as part of the destination gas configuration. This corresponds to the operational cost of processing a message on the destination chain. info * You should ensure the `gasOverhead` sufficiently covers the range of ISMs on your destination chain. * As you can configure different ISMs for different message types, you may have different gas overheads for each ISM's `verify` function. Gas Oracles[​](#gas-oracles "Direct link to Gas Oracles") ---------------------------------------------------------- Interchain Gas Payment requirements are calculated using oraclized gas prices and exchange rates between the origin and destination chains. IGP contracts may be configured with gas oracles, which are responsible for tracking remote token gas prices and exchange rates. Developers should use the [`quoteDispatch`](/docs/reference/hooks/overview#quote-dispatch-fees) function on the Mailbox contract to calculate gas fees. The `quoteDispatch` accounts for system-level overhead and ensures accurate fee calculation for the entire `dispatch` process. info * Exchange rates and gas prices are up to the relayer to decide. A spread may be charged to account for drift and operating costs. Eventually, a relayer will be able to automatically update their gas oracles in order to ensure that their IGP always quotes a fair price for remote gas. ### `getExchangeRateAndGasPrice`[​](#getexchangerateandgasprice "Direct link to getexchangerateandgasprice") * Solidity function getExchangeRateAndGasPrice( uint32 _destinationDomain) public view override returns (uint128 tokenExchangeRate, uint128 gasPrice){ IGasOracle _gasOracle = destinationGasConfigs[_destinationDomain] .gasOracle; if (address(_gasOracle) == address(0)) { revert( string.concat( "Configured IGP doesn't support domain ", Strings.toString(_destinationDomain) ) ); } return _gasOracle.getExchangeRateAndGasPrice(_destinationDomain);} **Parameters** * `destinationDomain`: The message's destination domain **Returns** * `tokenExchangeRate`: The exchange rate between the origin and destination chain's gas tokens * `gasPrice`: The gas price for the destination chain ### `quoteGasPayment`[​](#quotegaspayment "Direct link to quotegaspayment") The `quoteGasPayment` function calculates fees for the relayer's anticipated costs. * Solidity function quoteGasPayment( uint32 _destinationDomain, uint256 _gasLimit) public view virtual override returns (uint256) { // Get the gas data for the destination domain. ( uint128 _tokenExchangeRate, uint128 _gasPrice ) = getExchangeRateAndGasPrice(_destinationDomain); // The total cost quoted in destination chain's native token. uint256 _destinationGasCost = _gasLimit * uint256(_gasPrice); // Convert to the local native token. return (_destinationGasCost * _tokenExchangeRate) / TOKEN_EXCHANGE_RATE_SCALE;} **Parameters** * `destinationDomain`: The message's destination domain * `gasLimit`: The gas limit to meter the `handle` call with **Returns** * `fee`: The payment required for the `postDispatch` to succeed Retrying[​](#retrying "Direct link to Retrying") ------------------------------------------------- If the `handle` call consumes more gas than quoted, the relayer will not submit a process transaction. This issue often occurs due to insufficient gas payment during the initial `dispatch`. In this case, additional gas can be paid for with the `payForGas` function. * Solidity function payForGas( bytes32 _messageId, uint32 _destinationDomain, uint256 _gasAmount, address _refundAddress) external payable; **Parameters** * `messageId`: The message identifier returned from `dispatch` call * `destinationDomain`: The message's destination domain * `gasAmount`: The additional gas amount to pay for * `refundAddress`: The address to refund excess payment to Using the Hyperlane Explorer for Debugging[​](#using-the-hyperlane-explorer-for-debugging "Direct link to Using the Hyperlane Explorer for Debugging") ------------------------------------------------------------------------------------------------------------------------------------------------------- The Hyperlane Explorer is a powerful tool to debug cross-chain message issues, including gas payments and relayer behavior. ### Key Features[​](#key-features "Direct link to Key Features") * **Message Status**: View the current status of your message (e.g., "Retry: GasPaymentRequirementNotMet"). * **Gas Payment Details**: Check the gas amount paid (Origin IGP gas amount) and the amount required by the relayer. * **Simulate Calldata**: Use the "View calldata details" option to simulate transactions on tools like Tenderly. Troubleshooting[​](#troubleshooting "Direct link to Troubleshooting") ---------------------------------------------------------------------- This section covers common issues developers encounter with Interchain Gas Payments, along with potential solutions. ### `GasPaymentRequirementNotMet` Warning[​](#gaspaymentrequirementnotmet-warning "Direct link to gaspaymentrequirementnotmet-warning") * **Reason:** This occurs when the gas payment provided during `dispatch` does not meet the relayer's calculated requirement. * **Solution:** * Use `quoteDispatch` to calculate the aggregate fee required for a `dispatch` call to be successful. * Verify that `msg.value` in your metadata covers the relayer’s quoted fee. * Check the message status in the Hyperlane Explorer. Look for: `Retry(GasPaymentRequirementNotMet)`. ### Fallback Routing and Overpayment Warning[​](#fallback-routing-and-overpayment-warning "Direct link to Fallback Routing and Overpayment Warning") * **Reason:** `msg.value` exceeds the required gas payment, triggering the fallback routing hook. * **Solution:** * Verify that your quoting logic (`quoteDispatch`) matches the relayer's anticipated fees. * Avoid overestimating `gasLimit` values without first benchmarking the `handle` function. * Simulate the transaction to confirm appropriate payment. ### Unexpectedly Large Gas Quotes[​](#unexpectedly-large-gas-quotes "Direct link to Unexpectedly Large Gas Quotes") * **Reason:** A very high `gasLimit` was set, leading to excessively large gas quotes. * **Solution:** * Double-check the `gasLimit` specified in your metadata. * Verify that your quoting logic (`quoteDispatch`) matches the relayer's anticipated fees. * Adjust the `gasLimit` to match the estimated gas consumption of your `handle` function. * [Gas Limit](#gas-limit) * [Metadata](#metadata) * [Determine and Override the Gas Limit](#determine-and-override-the-gas-limit) * [Destination Gas Config](#destination-gas-config) * [Gas overhead](#gas-overhead) * [Gas Oracles](#gas-oracles) * [`getExchangeRateAndGasPrice`](#getexchangerateandgasprice) * [`quoteGasPayment`](#quotegaspayment) * [Retrying](#retrying) * [Using the Hyperlane Explorer for Debugging](#using-the-hyperlane-explorer-for-debugging) * [Key Features](#key-features) * [Troubleshooting](#troubleshooting) * [`GasPaymentRequirementNotMet` Warning](#gaspaymentrequirementnotmet-warning) * [Fallback Routing and Overpayment Warning](#fallback-routing-and-overpayment-warning) * [Unexpectedly Large Gas Quotes](#unexpectedly-large-gas-quotes) --- # Polygon PoS Hook | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Polygon PoS Hook ================ Polygon PoS has their own interface for message passing between Ethereum and Polygon called the [`fx portal`](https://github.com/0xPolygon/fx-portal) . Messages passed via this interface benefit from the security of the Polygon [state sync mechanism](https://docs.polygon.technology/pos/architecture/bor/state-sync/) . To provide this security as an option in Hyperlane, we created a Hook and ISM combo that can be transparently configured to reuse the fx-portal interface. See the [addresses](/docs/reference/contract-addresses) page for Hook and ISM addresses. How It Works[​](#how-it-works "Direct link to How It Works") ------------------------------------------------------------- Polygon FX-Portal provide FxChild (FxChild.sol) and FxRoot (FxRoot.sol) as the main contracts on which the bridge works. It calls and passes data to user-defined methods on another chain without needing a mapping. The FxChild/FxRoot contract are provided and maintained by the polygon team. You can find the address of this contract in Polygon’s [Fx-Portal repo](https://github.com/0xPolygon/fx-portal) . The PolygonPosHook sends payloads with FxRoot. Validators will pick up the message and pass it to the other chain. You can find detailed state sync mechanism in [documentation](https://docs.polygon.technology/pos/how-to/bridging/l1-l2-communication/state-transfer/) `StateReceiver` at `0x0000000000000000000000000000000000001001` is allowed to call `onStateReceive` in FxChild contract. FxChild calls `processMessageFromRoot` in abstract `CrossChainEnabledPolygonChild` on which PolygonPosISM implements. `CrossChainEnabledPolygonChild` is maintained by [OpenZeppelin](https://docs.openzeppelin.com/contracts/4.x/api/crosschain#) * [How It Works](#how-it-works) --- # Post-Dispatch Hooks | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Post-Dispatch Hooks =================== Post-dispatch hooks allow developers to configure additional origin chain behavior with message content dispatched via the Mailbox. This allows developers to integrate third party/native bridges, make additional chain commitments, or require custom fees all while maintaining a consistent single-call Mailbox interface. `IPostDispatchHook` Interface * Solidity // SPDX-License-Identifier: MIT OR Apache-2.0pragma solidity >=0.8.0;/*@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@ HYPERLANE @@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@@@@@@@@@@ @@@@@@@@*/interface IPostDispatchHook { enum Types { UNUSED, ROUTING, AGGREGATION, MERKLE_TREE, INTERCHAIN_GAS_PAYMASTER, FALLBACK_ROUTING, ID_AUTH_ISM, PAUSABLE, PROTOCOL_FEE, LAYER_ZERO_V1, RATE_LIMITED, ARB_L2_TO_L1, OP_L2_TO_L1 } /** * @notice Returns an enum that represents the type of hook */ function hookType() external view returns (uint8); /** * @notice Returns whether the hook supports metadata * @param metadata metadata * @return Whether the hook supports metadata */ function supportsMetadata( bytes calldata metadata ) external view returns (bool); /** * @notice Post action after a message is dispatched via the Mailbox * @param metadata The metadata required for the hook * @param message The message passed from the Mailbox.dispatch() call */ function postDispatch( bytes calldata metadata, bytes calldata message ) external payable; /** * @notice Compute the payment required by the postDispatch call * @param metadata The metadata required for the hook * @param message The message passed from the Mailbox.dispatch() call * @return Quoted payment for the postDispatch call */ function quoteDispatch( bytes calldata metadata, bytes calldata message ) external view returns (uint256);} Post Dispatch[​](#post-dispatch "Direct link to Post Dispatch") ---------------------------------------------------------------- In addition to the `message` dispatched via the Mailbox, the `postDispatch` function receives a `metadata` parameter. The `metadata` parameter is passed from the `dispatch` call through the Mailbox unmodified. This allows developers to pass any context they wish through to the hook. * Solidity function postDispatch( bytes calldata metadata, bytes calldata message) external payable; If the `postDispatch` function receives insufficient payment, it may revert. info Post-Dispatch Hooks may be replayable. Developers creating custom hooks should implement safe checks to prevent this behavior. [Here](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/b69bc23239ecfc8f8a6277bb0f9bc248cffea234/solidity/contracts/hooks/warp-route/RateLimitedHook.sol#L16)  is an example implementation. ### Quote Dispatch (Fees)[​](#quote-dispatch-fees "Direct link to Quote Dispatch (Fees)") Fees are often charged in `postDispatch` to cover costs such as destination chain transaction submission and security provisioning. To receive a quote for a corresponding `postDispatch` call, you can query the `quoteDispatch` function. * Solidity function quoteDispatch( bytes calldata metadata, bytes calldata message) external view returns (uint256); The Mailbox has a `quoteDispatch` function that returns the aggregate fee required for a `dispatch` call to be successful. Move to implementing a hook guide [here](/docs/guides/create-custom-hook-and-ism) ### Overriding default Hook Metadata[​](#overriding-default-hook-metadata "Direct link to Overriding default Hook Metadata") To override the default metadata, there is a `dispatch` overload that takes an optional `metadata` parameter. info Hooks currently expect metadata to be formatted with the [`StandardHookMetadata` library](/docs/reference/libraries/hookmetadata) . * Solidity function dispatch( uint32 destinationDomain, bytes32 recipientAddress, bytes calldata body, bytes calldata defaultHookMetadata) external payable returns (bytes32 messageId); The custom `metadata` will be passed to the required hook's `quoteDispatch` and `postDispatch` functions, before being passed to the default hook's `postDispatch` function. #### Examples[​](#examples "Direct link to Examples") `StandardHookMetadata` Library * Solidity // SPDX-License-Identifier: MIT OR Apache-2.0pragma solidity >=0.8.0;/*@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@ HYPERLANE @@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@@@@@@@@@@ @@@@@@@@*//** * Format of metadata: * * [0:2] variant * [2:34] msg.value * [34:66] Gas limit for message (IGP) * [66:86] Refund address for message (IGP) * [86:] Custom metadata */library StandardHookMetadata { struct Metadata { uint16 variant; uint256 msgValue; uint256 gasLimit; address refundAddress; } uint8 private constant VARIANT_OFFSET = 0; uint8 private constant MSG_VALUE_OFFSET = 2; uint8 private constant GAS_LIMIT_OFFSET = 34; uint8 private constant REFUND_ADDRESS_OFFSET = 66; uint256 private constant MIN_METADATA_LENGTH = 86; uint16 public constant VARIANT = 1; /** * @notice Returns the variant of the metadata. * @param _metadata ABI encoded standard hook metadata. * @return variant of the metadata as uint8. */ function variant(bytes calldata _metadata) internal pure returns (uint16) { if (_metadata.length < VARIANT_OFFSET + 2) return 0; return uint16(bytes2(_metadata[VARIANT_OFFSET:VARIANT_OFFSET + 2])); } /** * @notice Returns the specified value for the message. * @param _metadata ABI encoded standard hook metadata. * @param _default Default fallback value. * @return Value for the message as uint256. */ function msgValue( bytes calldata _metadata, uint256 _default ) internal pure returns (uint256) { if (_metadata.length < MSG_VALUE_OFFSET + 32) return _default; return uint256(bytes32(_metadata[MSG_VALUE_OFFSET:MSG_VALUE_OFFSET + 32])); } /** * @notice Returns the specified gas limit for the message. * @param _metadata ABI encoded standard hook metadata. * @param _default Default fallback gas limit. * @return Gas limit for the message as uint256. */ function gasLimit( bytes calldata _metadata, uint256 _default ) internal pure returns (uint256) { if (_metadata.length < GAS_LIMIT_OFFSET + 32) return _default; return uint256(bytes32(_metadata[GAS_LIMIT_OFFSET:GAS_LIMIT_OFFSET + 32])); } /** * @notice Returns the specified refund address for the message. * @param _metadata ABI encoded standard hook metadata. * @param _default Default fallback refund address. * @return Refund address for the message as address. */ function refundAddress( bytes calldata _metadata, address _default ) internal pure returns (address) { if (_metadata.length < REFUND_ADDRESS_OFFSET + 20) return _default; return address( bytes20( _metadata[REFUND_ADDRESS_OFFSET:REFUND_ADDRESS_OFFSET + 20] ) ); } /** * @notice Returns any custom metadata. * @param _metadata ABI encoded standard hook metadata. * @return Custom metadata. */ function getCustomMetadata( bytes calldata _metadata ) internal pure returns (bytes calldata) { if (_metadata.length < MIN_METADATA_LENGTH) return _metadata[0:0]; return _metadata[MIN_METADATA_LENGTH:]; } /** * @notice Formats the specified gas limit and refund address into standard hook metadata. * @param _msgValue msg.value for the message. * @param _gasLimit Gas limit for the message. * @param _refundAddress Refund address for the message. * @param _customMetadata Additional metadata to include in the standard hook metadata. * @return ABI encoded standard hook metadata. */ function formatMetadata( uint256 _msgValue, uint256 _gasLimit, address _refundAddress, bytes memory _customMetadata ) internal pure returns (bytes memory) { return abi.encodePacked( VARIANT, _msgValue, _gasLimit, _refundAddress, _customMetadata ); } /** * @notice Formats the specified gas limit and refund address into standard hook metadata. * @param _msgValue msg.value for the message. * @return ABI encoded standard hook metadata. */ function overrideMsgValue( uint256 _msgValue ) internal view returns (bytes memory) { return formatMetadata(_msgValue, uint256(0), msg.sender, ""); } /** * @notice Formats the specified gas limit and refund address into standard hook metadata. * @param _gasLimit Gas limit for the message. * @return ABI encoded standard hook metadata. */ function overrideGasLimit( uint256 _gasLimit ) internal view returns (bytes memory) { return formatMetadata(uint256(0), _gasLimit, msg.sender, ""); } /** * @notice Formats the specified refund address into standard hook metadata. * @param _refundAddress Refund address for the message. * @return ABI encoded standard hook metadata. */ function overrideRefundAddress( address _refundAddress ) internal pure returns (bytes memory) { return formatMetadata(uint256(0), uint256(0), _refundAddress, ""); }} origin: abstracttestnet * [abstracttestnet](#origin=abstracttestnet) * [alephzeroevmtestnet](#origin=alephzeroevmtestnet) * [alfajores](#origin=alfajores) * [arbitrumsepolia](#origin=arbitrumsepolia) * [arcadiatestnet2](#origin=arcadiatestnet2) * [basesepolia](#origin=basesepolia) * [berabartio](#origin=berabartio) * [bsctestnet](#origin=bsctestnet) * [camptestnet](#origin=camptestnet) * [citreatestnet](#origin=citreatestnet) * [ecotestnet](#origin=ecotestnet) * [formtestnet](#origin=formtestnet) * [fuji](#origin=fuji) * [holesky](#origin=holesky) * [hyperliquidevmtestnet](#origin=hyperliquidevmtestnet) * [inksepolia](#origin=inksepolia) * [odysseytestnet](#origin=odysseytestnet) * [optimismsepolia](#origin=optimismsepolia) * [plumetestnet](#origin=plumetestnet) * [polygonamoy](#origin=polygonamoy) * [scrollsepolia](#origin=scrollsepolia) * [sepolia](#origin=sepolia) * [soneiumtestnet](#origin=soneiumtestnet) * [sonictestnet](#origin=sonictestnet) * [suavetoliman](#origin=suavetoliman) * [superpositiontestnet](#origin=superpositiontestnet) * [tangletestnet](#origin=tangletestnet) * [treasuretopaz](#origin=treasuretopaz) * [unichaintestnet](#origin=unichaintestnet) destination: alephzeroevmtestnet * [abstracttestnet](#destination=abstracttestnet) * [alephzeroevmtestnet](#destination=alephzeroevmtestnet) * [alfajores](#destination=alfajores) * [arbitrumsepolia](#destination=arbitrumsepolia) * [arcadiatestnet2](#destination=arcadiatestnet2) * [basesepolia](#destination=basesepolia) * [berabartio](#destination=berabartio) * [bsctestnet](#destination=bsctestnet) * [camptestnet](#destination=camptestnet) * [citreatestnet](#destination=citreatestnet) * [ecotestnet](#destination=ecotestnet) * [formtestnet](#destination=formtestnet) * [fuji](#destination=fuji) * [holesky](#destination=holesky) * [hyperliquidevmtestnet](#destination=hyperliquidevmtestnet) * [inksepolia](#destination=inksepolia) * [odysseytestnet](#destination=odysseytestnet) * [optimismsepolia](#destination=optimismsepolia) * [plumetestnet](#destination=plumetestnet) * [polygonamoy](#destination=polygonamoy) * [scrollsepolia](#destination=scrollsepolia) * [sepolia](#destination=sepolia) * [soneiumtestnet](#destination=soneiumtestnet) * [sonictestnet](#destination=sonictestnet) * [suavetoliman](#destination=suavetoliman) * [superpositiontestnet](#destination=superpositiontestnet) * [tangletestnet](#destination=tangletestnet) * [treasuretopaz](#destination=treasuretopaz) * [unichaintestnet](#destination=unichaintestnet) body: * Solidity * CosmWasm * Sealevel // send message from abstracttestnet to alephzeroevmtestnet TestRecipientIMailbox mailbox = IMailbox("0x28f448885bEaaF662f8A9A6c9aF20fAd17A5a1DC");mailbox.dispatch{value: msg.value}( 2039, "0x0000000000000000000000009EC79CA89DeF61BFa2f38cD4fCC137b9e49d60dD", bytes("Hello, world"), StandardHookMetadata.overrideGasLimit(200000)); 🚧 Coming soon! 🚧 🚧 Coming soon! 🚧 ### Custom hook and metadata[​](#custom-hook-and-metadata "Direct link to Custom hook and metadata") After implementing the above interfaces, you can override default hook along the hook metadata by using the overloaded `dispatch` call in our mailbox: * Solidity function dispatch( uint32 destinationDomain, bytes32 recipientAddress, bytes calldata body, bytes calldata customHookMetadata, IPostDispatchHook customHook) external payable returns (bytes32 messageId); ### Examples[​](#examples-1 "Direct link to Examples") origin: abstracttestnet * [abstracttestnet](#origin=abstracttestnet) * [alephzeroevmtestnet](#origin=alephzeroevmtestnet) * [alfajores](#origin=alfajores) * [arbitrumsepolia](#origin=arbitrumsepolia) * [arcadiatestnet2](#origin=arcadiatestnet2) * [basesepolia](#origin=basesepolia) * [berabartio](#origin=berabartio) * [bsctestnet](#origin=bsctestnet) * [camptestnet](#origin=camptestnet) * [citreatestnet](#origin=citreatestnet) * [ecotestnet](#origin=ecotestnet) * [formtestnet](#origin=formtestnet) * [fuji](#origin=fuji) * [holesky](#origin=holesky) * [hyperliquidevmtestnet](#origin=hyperliquidevmtestnet) * [inksepolia](#origin=inksepolia) * [odysseytestnet](#origin=odysseytestnet) * [optimismsepolia](#origin=optimismsepolia) * [plumetestnet](#origin=plumetestnet) * [polygonamoy](#origin=polygonamoy) * [scrollsepolia](#origin=scrollsepolia) * [sepolia](#origin=sepolia) * [soneiumtestnet](#origin=soneiumtestnet) * [sonictestnet](#origin=sonictestnet) * [suavetoliman](#origin=suavetoliman) * [superpositiontestnet](#origin=superpositiontestnet) * [tangletestnet](#origin=tangletestnet) * [treasuretopaz](#origin=treasuretopaz) * [unichaintestnet](#origin=unichaintestnet) destination: alephzeroevmtestnet * [abstracttestnet](#destination=abstracttestnet) * [alephzeroevmtestnet](#destination=alephzeroevmtestnet) * [alfajores](#destination=alfajores) * [arbitrumsepolia](#destination=arbitrumsepolia) * [arcadiatestnet2](#destination=arcadiatestnet2) * [basesepolia](#destination=basesepolia) * [berabartio](#destination=berabartio) * [bsctestnet](#destination=bsctestnet) * [camptestnet](#destination=camptestnet) * [citreatestnet](#destination=citreatestnet) * [ecotestnet](#destination=ecotestnet) * [formtestnet](#destination=formtestnet) * [fuji](#destination=fuji) * [holesky](#destination=holesky) * [hyperliquidevmtestnet](#destination=hyperliquidevmtestnet) * [inksepolia](#destination=inksepolia) * [odysseytestnet](#destination=odysseytestnet) * [optimismsepolia](#destination=optimismsepolia) * [plumetestnet](#destination=plumetestnet) * [polygonamoy](#destination=polygonamoy) * [scrollsepolia](#destination=scrollsepolia) * [sepolia](#destination=sepolia) * [soneiumtestnet](#destination=soneiumtestnet) * [sonictestnet](#destination=sonictestnet) * [suavetoliman](#destination=suavetoliman) * [superpositiontestnet](#destination=superpositiontestnet) * [tangletestnet](#destination=tangletestnet) * [treasuretopaz](#destination=treasuretopaz) * [unichaintestnet](#destination=unichaintestnet) body: * Solidity * CosmWasm * Sealevel // send message from abstracttestnet to alephzeroevmtestnet TestRecipientIMailbox mailbox = IMailbox("0x28f448885bEaaF662f8A9A6c9aF20fAd17A5a1DC");IPostDispatchHook merkleTree = IPostDispatchHook("0x7fa6009b59F139813eA710dB5496976eE8D80E64");mailbox.dispatch( 2039, "0x0000000000000000000000009EC79CA89DeF61BFa2f38cD4fCC137b9e49d60dD", bytes("Hello, world"), "0x", // empty metadata merkleTree); 🚧 Coming soon! 🚧 🚧 Coming soon! 🚧 * [Post Dispatch](#post-dispatch) * [Quote Dispatch (Fees)](#quote-dispatch-fees) * [Overriding default Hook Metadata](#overriding-default-hook-metadata) * [Custom hook and metadata](#custom-hook-and-metadata) * [Examples](#examples-1) --- # Aggregation Module | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Aggregation Module ================== Developers can use an `AggregationISM` to combine security from multiple ISMs. Simply put, an `AggregationISM` requires that `m` of `n` ISMs verify a particular interchain message. Interface[​](#interface "Direct link to Interface") ---------------------------------------------------- `AggregationISMs` must implement the `IAggregationIsm` interface. // SPDX-License-Identifier: MIT OR Apache-2.0pragma solidity >=0.6.11;import {IInterchainSecurityModule} from "../IInterchainSecurityModule.sol";interface IAggregationIsm is IInterchainSecurityModule { /** * @notice Returns the set of modules responsible for verifying _message * and the number of modules that must verify * @dev Can change based on the content of _message * @param _message Hyperlane formatted interchain message * @return modules The array of ISM addresses * @return threshold The number of modules needed to verify */ function modulesAndThreshold( bytes calldata _message ) external view returns (address[] memory modules, uint8 threshold);} Configure[​](#configure "Direct link to Configure") ---------------------------------------------------- The hyperlane-monorepo contains an `AggregationISM` implementation that application developers can deploy off-the-shelf, specifying their desired configuration. Developers can configure, for each origin chain, a set of `n` ISMs, and the number of ISMs needed to verify a message. `AggregationISMs` can aggregate the security of any ISMs. For example, users can deploy a [Multisig ISM](/docs/reference/ISM/multisig-ISM-interface) with their own validator set, and deploy an `AggregationISM` that aggregates that ISM with the Hyperlane default ISM. Customize[​](#customize "Direct link to Customize") ---------------------------------------------------- The hyperlane-monorepo contains an abstract `AggregationISM` implementation that application developers can fork. Developers simply need to implement the `modulesAndThreshold()` function. By creating a custom implementation, application developers can tailor the security provided by a `AggregationISM` to the needs of their application. For example, a custom implementation could require that low value messages be verified by a [Multisig ISM](/docs/reference/ISM/multisig-ISM-interface) , and require that high value messages _also_ be verified by a Wormhole ISM. * [Interface](#interface) * [Configure](#configure) * [Customize](#customize) --- # Multisig Module | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Multisig Module =============== _Verify messages using validator signatures_ The `MultisigISM` is one of the most commonly used ISM types. These ISMs verify that `m` of `n` Validators have attested to the validity of a particular interchain message. Interface[​](#interface "Direct link to Interface") ---------------------------------------------------- `MultisigISMs` must implement the `IMultisigIsm` interface. // SPDX-License-Identifier: MIT OR Apache-2.0pragma solidity >=0.6.11;import {IInterchainSecurityModule} from "../IInterchainSecurityModule.sol";interface IMultisigIsm is IInterchainSecurityModule { /** * @notice Returns the set of validators responsible for verifying _message * and the number of signatures required * @dev Can change based on the content of _message * @dev Signatures provided to `verify` must be consistent with validator ordering * @param _message Hyperlane formatted interchain message * @return validators The array of validator addresses * @return threshold The number of validator signatures needed */ function validatorsAndThreshold( bytes calldata _message ) external view returns (address[] memory validators, uint8 threshold);} Configure[​](#configure "Direct link to Configure") ---------------------------------------------------- The hyperlane-monorepo contains [`MultisigISM` implementations](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/solidity/contracts/isms/multisig) (including a [legacy](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/isms/multisig/LegacyMultisigIsm.sol) version and more gas-efficient [versions](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/isms/multisig/StaticMultisigIsm.sol) deployable via factories) that application developers can deploy off-the-shelf, specifying their desired configuration. Developers can configure, for each origin chain, a set of `n` Validators, and the number of validator signatures (`m`) needed to verify a message. Validator signatures are **not** specific to an ISM. In other words, developers can configure their `MultisigISM` to use **any** validator that's running on Hyperlane and it will "just work". Customize[​](#customize "Direct link to Customize") ---------------------------------------------------- The hyperlane-monorepo contains an abstract `MultisigISM` implementation that application developers can fork. Developers simply need to implement the `validatorsAndThreshold()` function. By creating a custom implementation, application developers can tailor the security provided by a `MultisigISM` to the needs of their application. For example, a custom implementation could vary the number of signatures required, based on the content of the message being verified. * [Interface](#interface) * [Configure](#configure) * [Customize](#customize) --- # Routing Module | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Routing Module ============== Developers can use a `RoutingISM` to delegate message verification to a different ISM. This allows developers to change security models based on message content or application context. Interface[​](#interface "Direct link to Interface") ---------------------------------------------------- `RoutingISMs` must implement the `IRoutingIsm` interface. // SPDX-License-Identifier: MIT OR Apache-2.0pragma solidity >=0.8.0;import {IInterchainSecurityModule} from "../IInterchainSecurityModule.sol";interface IRoutingIsm is IInterchainSecurityModule { /** * @notice Returns the ISM responsible for verifying _message * @dev Can change based on the content of _message * @param _message Formatted Hyperlane message (see Message.sol). * @return module The ISM to use to verify _message */ function route( bytes calldata _message ) external view returns (IInterchainSecurityModule);} Configure[​](#configure "Direct link to Configure") ---------------------------------------------------- The hyperlane-monorepo contains a `RoutingISM` implementation, `DomainRoutingIsm`, that application developers can deploy off-the-shelf, specifying their desired configuration. This ISM simply switches security models depending on the origin chain of the message. A simple use case for this is to use different [Multisig ISM](/docs/reference/ISM/multisig-ISM-interface) validator sets for each chain. Eventually, you could imagine a `DomainRoutingIsm` routing to different light-client-based ISMs, depending on the type of consensus protocol used on the origin chain. Customize[​](#customize "Direct link to Customize") ---------------------------------------------------- The hyperlane-monorepo contains an abstract `RoutingISM` implementation that application developers can fork. Developers simply need to implement the `route()` function. By creating a custom implementation, application developers can tailor the security provided by a `RoutingISM` to the needs of their application. For example, a custom implementation could change security models based on the contents of the message or the state of the application receiving the message. * [Interface](#interface) * [Configure](#configure) * [Customize](#customize) --- # Interchain Security Module Interface | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Interchain Security Module Interface ==================================== Hyperlane modularizes interchain message security through a generic smart contract interface. Implementations are responsible for verifying that messages being delivered on the destination chain were actually sent on the origin chain using some proof metadata. Message recipients can specify custom security constraints by specifying an `InterchainSecurityModule` address. This implementation can be configured, composed, and customized according to the needs of their application. `IInterchainSecurityModule` Interface * Solidity // SPDX-License-Identifier: MIT OR Apache-2.0pragma solidity >=0.6.11;interface IInterchainSecurityModule { enum Types { UNUSED, ROUTING, AGGREGATION, LEGACY_MULTISIG, MERKLE_ROOT_MULTISIG, MESSAGE_ID_MULTISIG, NULL, // used with relayer carrying no metadata CCIP_READ, ARB_L2_TO_L1, WEIGHTED_MERKLE_ROOT_MULTISIG, WEIGHTED_MESSAGE_ID_MULTISIG, OP_L2_TO_L1 } /** * @notice Returns an enum that represents the type of security model * encoded by this ISM. * @dev Relayers infer how to fetch and format metadata. */ function moduleType() external view returns (uint8); /** * @notice Defines a security model responsible for verifying interchain * messages based on the provided metadata. * @param _metadata Off-chain metadata provided by a relayer, specific to * the security model encoded by the module (e.g. validator signatures) * @param _message Hyperlane encoded interchain message * @return True if the message was verified */ function verify( bytes calldata _metadata, bytes calldata _message ) external returns (bool);}interface ISpecifiesInterchainSecurityModule { function interchainSecurityModule() external view returns (IInterchainSecurityModule);} Verify[​](#verify "Direct link to Verify") ------------------------------------------- * the security model encoded by the module (e.g. validator signatures)* @param _message Hyperlane encoded interchain message* @return True if the message was verified*/ The Mailbox will call `verify` before delivering a message to its recipient. If `verify` reverts or returns `false`, the message will not be delivered. * `_metadata` consists of arbitrary bytes provided by the Relayer. Typically, these bytes are specific to the ISM. For example, for a [Multisig ISM](/docs/reference/ISM/multisig-ISM-interface) , `_metadata` must include validator signatures. * `_message` consists of the Hyperlane message being verified. ISMs can use this to inspect details about the message being verified. For example, a [Multisig ISM](/docs/reference/ISM/multisig-ISM-interface) could change validator sets based on the origin chain of the message. ### Module Type[​](#module-type "Direct link to Module Type") * @notice Returns an enum that represents the type of security model This is used to signal to the Relayer how to encode `_metadata`. ISMs **must** return one of the supported module types: enum Types { UNUSED, ROUTING, AGGREGATION, LEGACY_MULTISIG, MERKLE_ROOT_MULTISIG, MESSAGE_ID_MULTISIG, NULL, // used with relayer carrying no metadata CCIP_READ, ARB_L2_TO_L1, note To accomplish this, all ISM contracts implement the ISM interface, which requires `moduleType` to be defined. This type is branched on by the Relayer in order to determine the required metadata for that ISM. For more information on module types and their metadata formats, see [Protocol](/docs/protocol/ISM/modular-security#module-type) . Specifying an ISM[​](#specifying-an-ism "Direct link to Specifying an ISM") ---------------------------------------------------------------------------- To specify the ISM they would like to use, developers implement the `ISpecifiesInterchainSecurityModule` interface in any contract that receives interchain messages via `handle()`. interface ISpecifiesInterchainSecurityModule { function interchainSecurityModule() external view returns (IInterchainSecurityModule);} If no ISM is specified, or if the specified ISM is the null address, whatever ISM is configured as the default on the destination chain Mailbox will be used. Sequence Diagram[​](#sequence-diagram "Direct link to Sequence Diagram") ------------------------------------------------------------------------- Here is a detailed sequence diagram of an interchain message being verified and delivered on the destination chain. info If the recipient does not implement `ISpecifiesInterchainSecurityModule` or `recipient.interchainSecurityModule()` returns `address(0)`, the default ISM configured on the Mailbox will be used to verify the message. * [Verify](#verify) * [Module Type](#module-type) * [Specifying an ISM](#specifying-an-ism) * [Sequence Diagram](#sequence-diagram) --- # Latencies | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) Latencies ========= Validators must wait a certain number of blocks to be mined before they are considered valid and [reorg-safe](https://www.alchemy.com/overviews/what-is-a-reorg) . Without this, validators could be slashed since they may have signed a checkpoint that is no longer valid. Refer to the following sections for block finality configuration used by the Hyperlane validators. * Mainnet * Testnet | Chain | Domain | Reorg Period (blocks) | Estimated Block Time (seconds) | | --- | --- | --- | --- | | Aleph Zero EVM | 1000041455 | 5 | 3 | | Ancient8 | 888888888 | 5 | 2 | | ApeChain | 33139 | 5 | 0.2 | | AppChain | 466 | 0 | 2 | | Arbitrum | 42161 | 5 | 3 | | Arbitrum Nova | 42170 | 5 | 2 | | Artela | 11820 | 5 | 2 | | Arthera | 10242 | 5 | 1 | | Astar | 592 | finalized | 13 | | Astar zkEVM | 3776 | 5 | 3 | | Aurora | 1313161554 | 5 | 1 | | Avalanche | 43114 | 3 | 2 | | B3 | 8333 | 5 | 1 | | Base | 8453 | 10 | 2 | | Bitlayer | 200901 | 20 | 3 | | Blast | 81457 | 5 | 2 | | BOB | 60808 | 5 | 2 | | Boba Mainnet | 288 | 5 | 2 | | Binance Smart Chain | 56 | finalized | 3 | | B² Network | 223 | 5 | 3 | | Celo | 42220 | 0 | 5 | | CheeseChain | 383353 | 1 | 30 | | Chiliz | 1000088888 | 9 | 3 | | Conflux eSpace | 1030 | 10 | 2 | | Conwai | 668668 | 0 | 2 | | Core | 1116 | 21 | 3 | | Corn | 21000000 | 5 | 20 | | Cyber | 7560 | 5 | 2 | | Degen | 666666666 | 5 | 10 | | Dogechain | 2000 | 5 | 2 | | DuckChain | 5545 | 5 | 1 | | Eclipse | 1408864445 | 0 | 0.4 | | Endurance | 648 | 15 | 12 | | Ethereum | 1 | 15 | 13 | | Everclear | 25327 | 2 | 2 | | Evmos EVM | 9001 | 5 | 2 | | Fantom Opera | 250 | 5 | 2 | | Flame | 253368190 | 5 | 2 | | Flare | 14 | 3 | 2 | | EVM on Flow | 1000000747 | 25 | 1 | | Form | 478 | 5 | 2 | | Fraxtal | 252 | 5 | 2 | | Fuse | 122 | 19 | 5 | | Gnosis | 100 | 5 | 5 | | Gravity Alpha Mainnet | 1625 | 5 | 1 | | Guru Network | 260 | 5 | 1 | | Harmony One | 1666600000 | 5 | 2 | | Hemi Network | 43111 | 5 | 12 | | Immutable zkEVM | 1000013371 | 20 | 2 | | Injective EVM | 2525 | 3 | 3 | | Injective | 6909546 | 10 | 1 | | Ink | 57073 | 5 | 1 | | Kaia | 8217 | 5 | 1 | | Kroma | 255 | 5 | 2 | | Linea | 59144 | 5 | 3 | | Lisk | 1135 | 5 | 2 | | LUKSO | 42 | 15 | 12 | | Lumia Prism | 1000073017 | 5 | 4 | | Manta Pacific | 169 | 5 | 3 | | Mantle | 5000 | 2 | 2 | | Merlin | 4200 | 5 | 3 | | Metal L2 | 1000001750 | 5 | 2 | | Metis Andromeda | 1088 | 5 | 5 | | Mint | 185 | 5 | 2 | | Mode | 34443 | 5 | 2 | | Molten | 360 | 0 | 30 | | Moonbeam | 1284 | finalized | 12 | | Morph | 2818 | 5 | 4 | | Nero | 1689 | 5 | 3 | | Neutron | 1853125230 | 1 | 3 | | Oort | 970 | 0 | 2 | | Optimism | 10 | 10 | 3 | | Orderly L2 | 291 | 5 | 2 | | Polygon | 137 | finalized | 2 | | Polygon zkEVM | 1101 | 5 | 10 | | Polynomial | 1000008008 | 5 | 2 | | Prom | 227 | 5 | 6 | | Proof of Play Apex | 70700 | 5 | 1 | | RARI Chain | 1000012617 | 0 | 30 | | re.al | 111188 | 0 | 30 | | Redstone | 690 | 5 | 2 | | Rivalz | 753 | 0 | 2 | | Rootstock | 1000000030 | 4 | 30 | | Sanko | 1996 | 1 | 15 | | Scroll | 534352 | 17 | 3 | | Sei | 1329 | 1 | 1 | | Shibarium | 109 | finalized | 5 | | SnaxChain | 2192 | 5 | 2 | | Solana | 1399811149 | 0 | 0.4 | | Soneium | 1868 | 5 | 2 | | Sonic | 146 | 5 | 2 | | SOON | 50075007 | 0 | 0.05 | | Superposition | 1000055244 | 0 | 60 | | Superseed | 5330 | 5 | 2 | | Swell | 1923 | 5 | 2 | | Taiko | 167000 | 5 | 12 | | Tangle | 5845 | finalized | 6 | | Telos EVM | 40 | finalized | 1 | | Torus | 21000 | finalized | 8 | | Treasure | 61166 | 0 | 1 | | Unichain | 130 | 5 | 1 | | Vana | 1480 | 5 | 6 | | Viction | 88 | 3 | 2 | | World Chain | 480 | 5 | 2 | | Xai | 660279 | 5 | 1 | | XLayer | 196 | 5 | 10 | | XPLA | 37 | 5 | 6 | | Zero Network | 543210 | 0 | 1 | | ZetaChain | 7000 | 0 | 6 | | Zircuit | 48900 | 5 | 2 | | zkLink Nova | 810180 | 0 | 1 | | zkSync | 324 | 0 | 1 | | Zora | 7777777 | 5 | 2 | | Chain | Domain | Reorg Period (blocks) | Estimated Block Time (seconds) | | --- | --- | --- | --- | | Abstract Testnet | 11124 | 0 | 1 | | Aleph Zero EVM Testnet | 2039 | 5 | 3 | | Alfajores | 44787 | 0 | 5 | | Arbitrum Sepolia | 421614 | 0 | 3 | | Arcadia Testnet v2 | 1098411886 | 1 | 1 | | Base Sepolia | 84532 | 1 | 2 | | Berachain bArtio | 80084 | 1 | 3 | | BSC Testnet | 97 | 9 | 3 | | Camp Network Testnet V2 | 325000 | 1 | 2 | | Citrea Testnet | 5115 | 1 | 2 | | Eco Testnet | 471923 | 0 | 1 | | Form Testnet | 132902 | 1 | 2 | | Fuji | 43113 | 3 | 2 | | Holesky | 17000 | 2 | 13 | | Hyperliquid EVM Testnet | 998 | 1 | 2 | | Ink Sepolia | 763373 | 1 | 1 | | Odyssey Testnet | 911867 | 1 | 1 | | Optimism Sepolia | 11155420 | 0 | 2 | | Plume Testnet | 161221135 | 0 | 5 | | Polygon Amoy | 80002 | 10 | 2 | | Scroll Sepolia | 534351 | 1 | 3 | | Sepolia | 11155111 | 2 | 13 | | Soneium Minato Testnet | 1946 | 1 | 2 | | Sonic Testnet | 64165 | 1 | 1 | | SUAVE Toliman Testnet | 33626250 | 1 | 4 | | Superposition Testnet | 98985 | 1 | 1 | | Tangle Testnet | 3799 | 0 | 6 | | Treasure Topaz Testnet | 978658 | 0 | 1 | | Unichain Testnet | 1301 | 1 | 1 | --- # StandardHookMetadata Library | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page `StandardHookMetadata` Library ============================== The `StandardHookMetadata` library provides utilities for handling and formatting metadata used in Hyperlane hooks. This library enables you to pack and extract information such as gas limits, refund addresses, and custom metadata for messages. * **Parse Metadata**: Functions like `variant`, `msgValue`, `gasLimit`, and `refundAddress` help you extract specific metadata fields from ABI-encoded data. * **Custom Metadata**: `getCustomMetadata` retrieves any additional metadata beyond the standard fields. * **Format Metadata**: `formatMetadata` lets you construct ABI-encoded metadata with fields like gas limit, refund address, and custom data. StandardHookMetadata Library[​](#standardhookmetadata-library-1 "Direct link to StandardHookMetadata Library") --------------------------------------------------------------------------------------------------------------- // SPDX-License-Identifier: MIT OR Apache-2.0pragma solidity >=0.8.0;/*@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@ HYPERLANE @@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@@@@@@@@@@ @@@@@@@@*//** * Format of metadata: * * [0:2] variant * [2:34] msg.value * [34:66] Gas limit for message (IGP) * [66:86] Refund address for message (IGP) * [86:] Custom metadata */library StandardHookMetadata { struct Metadata { uint16 variant; uint256 msgValue; uint256 gasLimit; address refundAddress; } uint8 private constant VARIANT_OFFSET = 0; uint8 private constant MSG_VALUE_OFFSET = 2; uint8 private constant GAS_LIMIT_OFFSET = 34; uint8 private constant REFUND_ADDRESS_OFFSET = 66; uint256 private constant MIN_METADATA_LENGTH = 86; uint16 public constant VARIANT = 1; /** * @notice Returns the variant of the metadata. * @param _metadata ABI encoded standard hook metadata. * @return variant of the metadata as uint8. */ function variant(bytes calldata _metadata) internal pure returns (uint16) { if (_metadata.length < VARIANT_OFFSET + 2) return 0; return uint16(bytes2(_metadata[VARIANT_OFFSET:VARIANT_OFFSET + 2])); } /** * @notice Returns the specified value for the message. * @param _metadata ABI encoded standard hook metadata. * @param _default Default fallback value. * @return Value for the message as uint256. */ function msgValue( bytes calldata _metadata, uint256 _default ) internal pure returns (uint256) { if (_metadata.length < MSG_VALUE_OFFSET + 32) return _default; return uint256(bytes32(_metadata[MSG_VALUE_OFFSET:MSG_VALUE_OFFSET + 32])); } /** * @notice Returns the specified gas limit for the message. * @param _metadata ABI encoded standard hook metadata. * @param _default Default fallback gas limit. * @return Gas limit for the message as uint256. */ function gasLimit( bytes calldata _metadata, uint256 _default ) internal pure returns (uint256) { if (_metadata.length < GAS_LIMIT_OFFSET + 32) return _default; return uint256(bytes32(_metadata[GAS_LIMIT_OFFSET:GAS_LIMIT_OFFSET + 32])); } /** * @notice Returns the specified refund address for the message. * @param _metadata ABI encoded standard hook metadata. * @param _default Default fallback refund address. * @return Refund address for the message as address. */ function refundAddress( bytes calldata _metadata, address _default ) internal pure returns (address) { if (_metadata.length < REFUND_ADDRESS_OFFSET + 20) return _default; return address( bytes20( _metadata[REFUND_ADDRESS_OFFSET:REFUND_ADDRESS_OFFSET + 20] ) ); } /** * @notice Returns any custom metadata. * @param _metadata ABI encoded standard hook metadata. * @return Custom metadata. */ function getCustomMetadata( bytes calldata _metadata ) internal pure returns (bytes calldata) { if (_metadata.length < MIN_METADATA_LENGTH) return _metadata[0:0]; return _metadata[MIN_METADATA_LENGTH:]; } /** * @notice Formats the specified gas limit and refund address into standard hook metadata. * @param _msgValue msg.value for the message. * @param _gasLimit Gas limit for the message. * @param _refundAddress Refund address for the message. * @param _customMetadata Additional metadata to include in the standard hook metadata. * @return ABI encoded standard hook metadata. */ function formatMetadata( uint256 _msgValue, uint256 _gasLimit, address _refundAddress, bytes memory _customMetadata ) internal pure returns (bytes memory) { return abi.encodePacked( VARIANT, _msgValue, _gasLimit, _refundAddress, _customMetadata ); } /** * @notice Formats the specified gas limit and refund address into standard hook metadata. * @param _msgValue msg.value for the message. * @return ABI encoded standard hook metadata. */ function overrideMsgValue( uint256 _msgValue ) internal view returns (bytes memory) { return formatMetadata(_msgValue, uint256(0), msg.sender, ""); } /** * @notice Formats the specified gas limit and refund address into standard hook metadata. * @param _gasLimit Gas limit for the message. * @return ABI encoded standard hook metadata. */ function overrideGasLimit( uint256 _gasLimit ) internal view returns (bytes memory) { return formatMetadata(uint256(0), _gasLimit, msg.sender, ""); } /** * @notice Formats the specified refund address into standard hook metadata. * @param _refundAddress Refund address for the message. * @return ABI encoded standard hook metadata. */ function overrideRefundAddress( address _refundAddress ) internal pure returns (bytes memory) { return formatMetadata(uint256(0), uint256(0), _refundAddress, ""); }} * [StandardHookMetadata Library](#standardhookmetadata-library-1) --- # MailboxClient Library | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page `MailboxClient` Library ======================= Inheriting from [`MailboxClient`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/v3/solidity/contracts/client/MailboxClient.sol) is a simple way to ensure your contract knows where to send or receive interchain messages to or from. This mix-in contract maintains a pointers to the three contracts Hyperlane developers may need to interact with: 1. [`Mailbox`](/docs/reference/messaging/messaging-interface) (required) 2. [`IPostDispatchHook`](/docs/reference/hooks/interchain-gas) (optional) 3. [`IInterchainSecurityModule`](/docs/reference/ISM/specify-your-ISM) (optional) `MailboxClient` exposes functions that allow subclasses to easily send messages to the `Mailbox` via the `mailbox` storage variable, and permission message delivery via the `onlyMailbox` modifier. MailboxClient Library[​](#mailboxclient-library-1 "Direct link to MailboxClient Library") ------------------------------------------------------------------------------------------ // SPDX-License-Identifier: MIT OR Apache-2.0pragma solidity >=0.6.11;/*@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@ HYPERLANE @@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@@@@@@@@@@@ @@@@@@@@*/// ============ Internal Imports ============import {IMailbox} from "../interfaces/IMailbox.sol";import {IPostDispatchHook} from "../interfaces/hooks/IPostDispatchHook.sol";import {IInterchainSecurityModule} from "../interfaces/IInterchainSecurityModule.sol";import {Message} from "../libs/Message.sol";import {PackageVersioned} from "../PackageVersioned.sol";// ============ External Imports ============import {Address} from "@openzeppelin/contracts/utils/Address.sol";import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";abstract contract MailboxClient is OwnableUpgradeable, PackageVersioned { using Message for bytes; event HookSet(address _hook); event IsmSet(address _ism); IMailbox public immutable mailbox; uint32 public immutable localDomain; IPostDispatchHook public hook; IInterchainSecurityModule public interchainSecurityModule; uint256[48] private __GAP; // gap for upgrade safety // ============ Modifiers ============ modifier onlyContract(address _contract) { require( Address.isContract(_contract), "MailboxClient: invalid mailbox" ); _; } modifier onlyContractOrNull(address _contract) { require( Address.isContract(_contract) || _contract == address(0), "MailboxClient: invalid contract setting" ); _; } /** * @notice Only accept messages from an Hyperlane Mailbox contract */ modifier onlyMailbox() { require( msg.sender == address(mailbox), "MailboxClient: sender not mailbox" ); _; } constructor(address _mailbox) onlyContract(_mailbox) { mailbox = IMailbox(_mailbox); localDomain = mailbox.localDomain(); _transferOwnership(msg.sender); } /** * @notice Sets the address of the application's custom hook. * @param _hook The address of the hook contract. */ function setHook( address _hook ) public virtual onlyContractOrNull(_hook) onlyOwner { hook = IPostDispatchHook(_hook); emit HookSet(_hook); } /** * @notice Sets the address of the application's custom interchain security module. * @param _module The address of the interchain security module contract. */ function setInterchainSecurityModule( address _module ) public onlyContractOrNull(_module) onlyOwner { interchainSecurityModule = IInterchainSecurityModule(_module); emit IsmSet(_module); } // ======== Initializer ========= function _MailboxClient_initialize( address _hook, address _interchainSecurityModule, address _owner ) internal onlyInitializing { __Ownable_init(); setHook(_hook); setInterchainSecurityModule(_interchainSecurityModule); _transferOwnership(_owner); } function _isLatestDispatched(bytes32 id) internal view returns (bool) { return mailbox.latestDispatchedId() == id; } function _isDelivered(bytes32 id) internal view returns (bool) { return mailbox.delivered(id); }} * [MailboxClient Library](#mailboxclient-library-1) --- # Router Library | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page `Router` Library ================ Application developers looking to write their contracts once and deploy them on multiple chains should consider building with the [`Router`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/v3/solidity/contracts/client/Router.sol) pattern. In this pattern, an instance of the application's contracts is deployed on each application-supported chain. Each instance is made aware of the addresses of instances on other chains. These instances use Hyperlane to communicate information and state to and from instances on remote chains. Developers using this pattern can inherit from the `Router` mix-in contract. `Router` is a [`MailboxClient`](/docs/reference/libraries/mailboxclient) that tracks the addresses of other `Router` contract addresses on remote chains. This allows `Routers` to send messages directly to others without having to specify addresses. It also allows `Routers` to reject messages sent from other untrusted senders. Router Library[​](#router-library-1 "Direct link to Router Library") --------------------------------------------------------------------- // SPDX-License-Identifier: MIT OR Apache-2.0pragma solidity >=0.6.11;// ============ Internal Imports ============import {IMessageRecipient} from "../interfaces/IMessageRecipient.sol";import {IPostDispatchHook} from "../interfaces/hooks/IPostDispatchHook.sol";import {IInterchainSecurityModule} from "../interfaces/IInterchainSecurityModule.sol";import {MailboxClient} from "./MailboxClient.sol";import {EnumerableMapExtended} from "../libs/EnumerableMapExtended.sol";// ============ External Imports ============import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";abstract contract Router is MailboxClient, IMessageRecipient { using EnumerableMapExtended for EnumerableMapExtended.UintToBytes32Map; using Strings for uint32; // ============ Mutable Storage ============ EnumerableMapExtended.UintToBytes32Map internal _routers; uint256[48] private __GAP; // gap for upgrade safety constructor(address _mailbox) MailboxClient(_mailbox) {} // ============ External functions ============ function domains() external view returns (uint32[] memory) { return _routers.uint32Keys(); } /** * @notice Returns the address of the Router contract for the given domain * @param _domain The remote domain ID. * @dev Returns 0 address if no router is enrolled for the given domain * @return router The address of the Router contract for the given domain */ function routers(uint32 _domain) public view virtual returns (bytes32) { (, bytes32 _router) = _routers.tryGet(_domain); return _router; } /** * @notice Unregister the domain * @param _domain The domain of the remote Application Router */ function unenrollRemoteRouter(uint32 _domain) external virtual onlyOwner { _unenrollRemoteRouter(_domain); } /** * @notice Register the address of a Router contract for the same Application on a remote chain * @param _domain The domain of the remote Application Router * @param _router The address of the remote Application Router */ function enrollRemoteRouter( uint32 _domain, bytes32 _router ) external virtual onlyOwner { _enrollRemoteRouter(_domain, _router); } /** * @notice Batch version of `enrollRemoteRouter` * @param _domains The domains of the remote Application Routers * @param _addresses The addresses of the remote Application Routers */ function enrollRemoteRouters( uint32[] calldata _domains, bytes32[] calldata _addresses ) external virtual onlyOwner { require(_domains.length == _addresses.length, "!length"); uint256 length = _domains.length; for (uint256 i = 0; i < length; i += 1) { _enrollRemoteRouter(_domains[i], _addresses[i]); } } /** * @notice Batch version of `unenrollRemoteRouter` * @param _domains The domains of the remote Application Routers */ function unenrollRemoteRouters( uint32[] calldata _domains ) external virtual onlyOwner { uint256 length = _domains.length; for (uint256 i = 0; i < length; i += 1) { _unenrollRemoteRouter(_domains[i]); } } /** * @notice Handles an incoming message * @param _origin The origin domain * @param _sender The sender address * @param _message The message */ function handle( uint32 _origin, bytes32 _sender, bytes calldata _message ) external payable virtual override onlyMailbox { bytes32 _router = _mustHaveRemoteRouter(_origin); require(_router == _sender, "Enrolled router does not match sender"); _handle(_origin, _sender, _message); } // ============ Virtual functions ============ function _handle( uint32 _origin, bytes32 _sender, bytes calldata _message ) internal virtual; // ============ Internal functions ============ /** * @notice Set the router for a given domain * @param _domain The domain * @param _address The new router */ function _enrollRemoteRouter( uint32 _domain, bytes32 _address ) internal virtual { _routers.set(_domain, _address); } /** * @notice Remove the router for a given domain * @param _domain The domain */ function _unenrollRemoteRouter(uint32 _domain) internal virtual { require(_routers.remove(_domain), _domainNotFoundError(_domain)); } /** * @notice Return true if the given domain / router is the address of a remote Application Router * @param _domain The domain of the potential remote Application Router * @param _address The address of the potential remote Application Router */ function _isRemoteRouter( uint32 _domain, bytes32 _address ) internal view returns (bool) { return routers(_domain) == _address; } /** * @notice Assert that the given domain has a Application Router registered and return its address * @param _domain The domain of the chain for which to get the Application Router * @return _router The address of the remote Application Router on _domain */ function _mustHaveRemoteRouter( uint32 _domain ) internal view returns (bytes32) { (bool contained, bytes32 _router) = _routers.tryGet(_domain); if (contained) { return _router; } revert(_domainNotFoundError(_domain)); } function _domainNotFoundError( uint32 _domain ) internal pure returns (string memory) { return string.concat( "No router enrolled for domain: ", _domain.toString() ); } function _Router_dispatch( uint32 _destinationDomain, uint256 _value, bytes memory _messageBody, bytes memory _hookMetadata, address _hook ) internal returns (bytes32) { bytes32 _router = _mustHaveRemoteRouter(_destinationDomain); return mailbox.dispatch{value: _value}( _destinationDomain, _router, _messageBody, _hookMetadata, IPostDispatchHook(_hook) ); } /** * DEPRECATED: Use `_Router_dispatch` instead * @dev For backward compatibility with v2 client contracts */ function _dispatch( uint32 _destinationDomain, bytes memory _messageBody ) internal returns (bytes32) { return _Router_dispatch( _destinationDomain, msg.value, _messageBody, "", address(hook) ); } function _Router_quoteDispatch( uint32 _destinationDomain, bytes memory _messageBody, bytes memory _hookMetadata, address _hook ) internal view returns (uint256) { bytes32 _router = _mustHaveRemoteRouter(_destinationDomain); return mailbox.quoteDispatch( _destinationDomain, _router, _messageBody, _hookMetadata, IPostDispatchHook(_hook) ); } /** * DEPRECATED: Use `_Router_quoteDispatch` instead * @dev For backward compatibility with v2 client contracts */ function _quoteDispatch( uint32 _destinationDomain, bytes memory _messageBody ) internal view returns (uint256) { return _Router_quoteDispatch( _destinationDomain, _messageBody, "", address(hook) ); }} * [Router Library](#router-library-1) --- # Message Library | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page `Message` Library ================= The `Message` library helps you format and parse interchain messages for use with the Hyperlane `Mailbox` contract. * **Construct Messages**: `formatMessage` lets you pack all the key fields into a single, ready-to-send message. * **Extract Fields**: Functions like `version`, `nonce`, `origin`, `senderAddress`, `recipientAddress`, and `body` help you pull out specific parts of a message for processing. * **Get Message ID**: `id` generates a unique identifier for each message using `keccak256`. Message Library[​](#message-library-1 "Direct link to Message Library") ------------------------------------------------------------------------ // SPDX-License-Identifier: MIT OR Apache-2.0pragma solidity >=0.8.0;import {TypeCasts} from "./TypeCasts.sol";/** * @title Hyperlane Message Library * @notice Library for formatted messages used by Mailbox **/library Message { using TypeCasts for bytes32; uint256 private constant VERSION_OFFSET = 0; uint256 private constant NONCE_OFFSET = 1; uint256 private constant ORIGIN_OFFSET = 5; uint256 private constant SENDER_OFFSET = 9; uint256 private constant DESTINATION_OFFSET = 41; uint256 private constant RECIPIENT_OFFSET = 45; uint256 private constant BODY_OFFSET = 77; /** * @notice Returns formatted (packed) Hyperlane message with provided fields * @dev This function should only be used in memory message construction. * @param _version The version of the origin and destination Mailboxes * @param _nonce A nonce to uniquely identify the message on its origin chain * @param _originDomain Domain of origin chain * @param _sender Address of sender as bytes32 * @param _destinationDomain Domain of destination chain * @param _recipient Address of recipient on destination chain as bytes32 * @param _messageBody Raw bytes of message body * @return Formatted message */ function formatMessage( uint8 _version, uint32 _nonce, uint32 _originDomain, bytes32 _sender, uint32 _destinationDomain, bytes32 _recipient, bytes calldata _messageBody ) internal pure returns (bytes memory) { return abi.encodePacked( _version, _nonce, _originDomain, _sender, _destinationDomain, _recipient, _messageBody ); } /** * @notice Returns the message ID. * @param _message ABI encoded Hyperlane message. * @return ID of `_message` */ function id(bytes memory _message) internal pure returns (bytes32) { return keccak256(_message); } /** * @notice Returns the message version. * @param _message ABI encoded Hyperlane message. * @return Version of `_message` */ function version(bytes calldata _message) internal pure returns (uint8) { return uint8(bytes1(_message[VERSION_OFFSET:NONCE_OFFSET])); } /** * @notice Returns the message nonce. * @param _message ABI encoded Hyperlane message. * @return Nonce of `_message` */ function nonce(bytes calldata _message) internal pure returns (uint32) { return uint32(bytes4(_message[NONCE_OFFSET:ORIGIN_OFFSET])); } /** * @notice Returns the message origin domain. * @param _message ABI encoded Hyperlane message. * @return Origin domain of `_message` */ function origin(bytes calldata _message) internal pure returns (uint32) { return uint32(bytes4(_message[ORIGIN_OFFSET:SENDER_OFFSET])); } /** * @notice Returns the message sender as bytes32. * @param _message ABI encoded Hyperlane message. * @return Sender of `_message` as bytes32 */ function sender(bytes calldata _message) internal pure returns (bytes32) { return bytes32(_message[SENDER_OFFSET:DESTINATION_OFFSET]); } /** * @notice Returns the message sender as address. * @param _message ABI encoded Hyperlane message. * @return Sender of `_message` as address */ function senderAddress( bytes calldata _message ) internal pure returns (address) { return sender(_message).bytes32ToAddress(); } /** * @notice Returns the message destination domain. * @param _message ABI encoded Hyperlane message. * @return Destination domain of `_message` */ function destination( bytes calldata _message ) internal pure returns (uint32) { return uint32(bytes4(_message[DESTINATION_OFFSET:RECIPIENT_OFFSET])); } /** * @notice Returns the message recipient as bytes32. * @param _message ABI encoded Hyperlane message. * @return Recipient of `_message` as bytes32 */ function recipient( bytes calldata _message ) internal pure returns (bytes32) { return bytes32(_message[RECIPIENT_OFFSET:BODY_OFFSET]); } /** * @notice Returns the message recipient as address. * @param _message ABI encoded Hyperlane message. * @return Recipient of `_message` as address */ function recipientAddress( bytes calldata _message ) internal pure returns (address) { return recipient(_message).bytes32ToAddress(); } /** * @notice Returns the message body. * @param _message ABI encoded Hyperlane message. * @return Body of `_message` */ function body( bytes calldata _message ) internal pure returns (bytes calldata) { return bytes(_message[BODY_OFFSET:]); }} * [Message Library](#message-library-1) --- # TypeCasts library | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page `TypeCasts` library =================== The `TypeCasts` library provides simple and efficient functions for converting between `address` and `bytes32` types. This library is useful for cases where you need to work with `bytes32` types in your smart contracts but still need to convert them back to `address` types or vice versa. `TypeCasts` library[​](#typecasts-library-1 "Direct link to typecasts-library-1") ---------------------------------------------------------------------------------- // SPDX-License-Identifier: MIT OR Apache-2.0pragma solidity >=0.6.11;library TypeCasts { // alignment preserving cast function addressToBytes32(address _addr) internal pure returns (bytes32) { return bytes32(uint256(uint160(_addr))); } // alignment preserving cast function bytes32ToAddress(bytes32 _buf) internal pure returns (address) { require( uint256(_buf) <= uint256(type(uint160).max), "TypeCasts: bytes32ToAddress overflow" ); return address(uint160(uint256(_buf))); }} * [`TypeCasts` library](#typecasts-library-1) --- # Mailbox | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Mailbox ======= Hyperlane's generalized message passing (GMP) interface is implemented as a smart contract called the Mailbox. This contract encodes and decodes [message headers](#message-headers) , ensures global message [uniqueness](#uniqueness) , and prevents [replay attacks](#replay-protection) . Message Headers[​](#message-headers "Direct link to Message Headers") ---------------------------------------------------------------------- The Mailbox prepends message bodies with a header containing the following fields: * `version`: The version of the Mailbox contract * `nonce`: A unique identifier for each message sent from a given Mailbox * `origin`: The domain of the origin chain * `sender`: The address of the sender on the origin chain * `destination`: The domain of the destination chain * `recipient`: The address of the recipient on the destination chain See the [`Message` library](/docs/reference/libraries/message) for more information on the message encoding. Uniqueness[​](#uniqueness "Direct link to Uniqueness") ------------------------------------------------------- The `nonce` is a monotonically increasing integer for each message sent from a given Mailbox. It is incremented each time a message is dispatched to serve as a separator for otherwise identical messages. * Solidity function delivered(bytes32 messageId) external view returns (bool); The `messageId` is a globally unique message identifier, returned from the `dispatch` call, computed as the `keccak256` hash of the message (with headers). Replay Protection[​](#replay-protection "Direct link to Replay Protection") ---------------------------------------------------------------------------- The Mailbox maintains a mapping of already delivered `messageId` values to prevent replay attacks. If a message is received with a `messageId` that has already been delivered, the message is rejected. * Solidity function defaultIsm() external view returns (IInterchainSecurityModule); * [Message Headers](#message-headers) * [Uniqueness](#uniqueness) * [Replay Protection](#replay-protection) --- # Send a message | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Send a message ============== To send interchain messages, developers call `Mailbox.dispatch()`. This function takes as parameters the message contents, the destination chain ID, and the recipient address. Each message gets inserted as a leaf into an [incremental merkle tree](https://medium.com/@josephdelong/ethereum-2-0-deposit-merkle-tree-13ec8404ca4f) stored by the `Mailbox`. Hyperlane's proof of stake protocol uses this merkle tree to verify fraud proofs. Dispatch[​](#dispatch "Direct link to Dispatch") ------------------------------------------------- Calling this function dispatches a message to the destination domain and recipient. warning Hyperlane can only deliver messages to smart contracts that implement the `handle` function. See the [receive a message](/docs/reference/messaging/receive) documentation for more information. Depending on the [post-`dispatch` hook configuration](##post-dispatch-hook-config) , some payment may be required. See the [`quoteDispatch`](#quote-dispatch) section for more information. * Solidity function dispatch( uint32 destinationDomain, bytes32 recipientAddress, bytes calldata messageBody) external payable returns (bytes32 messageId); info Recipient addresses are left-padded to `bytes32` for compatibility with virtual machines that are addressed differently. The following utility is provided in the [`TypeCasts` library](/docs/reference/libraries/typecasts) for convenience. // alignment preserving castfunction addressToBytes32(address _addr) internal pure returns (bytes32) { return bytes32(uint256(uint160(_addr)));} ### Examples[​](#examples "Direct link to Examples") origin: abstracttestnet * [abstracttestnet](#origin=abstracttestnet) * [alephzeroevmtestnet](#origin=alephzeroevmtestnet) * [alfajores](#origin=alfajores) * [arbitrumsepolia](#origin=arbitrumsepolia) * [arcadiatestnet2](#origin=arcadiatestnet2) * [basesepolia](#origin=basesepolia) * [berabartio](#origin=berabartio) * [bsctestnet](#origin=bsctestnet) * [camptestnet](#origin=camptestnet) * [citreatestnet](#origin=citreatestnet) * [ecotestnet](#origin=ecotestnet) * [formtestnet](#origin=formtestnet) * [fuji](#origin=fuji) * [holesky](#origin=holesky) * [hyperliquidevmtestnet](#origin=hyperliquidevmtestnet) * [inksepolia](#origin=inksepolia) * [odysseytestnet](#origin=odysseytestnet) * [optimismsepolia](#origin=optimismsepolia) * [plumetestnet](#origin=plumetestnet) * [polygonamoy](#origin=polygonamoy) * [scrollsepolia](#origin=scrollsepolia) * [sepolia](#origin=sepolia) * [soneiumtestnet](#origin=soneiumtestnet) * [sonictestnet](#origin=sonictestnet) * [suavetoliman](#origin=suavetoliman) * [superpositiontestnet](#origin=superpositiontestnet) * [tangletestnet](#origin=tangletestnet) * [treasuretopaz](#origin=treasuretopaz) * [unichaintestnet](#origin=unichaintestnet) destination: alephzeroevmtestnet * [abstracttestnet](#destination=abstracttestnet) * [alephzeroevmtestnet](#destination=alephzeroevmtestnet) * [alfajores](#destination=alfajores) * [arbitrumsepolia](#destination=arbitrumsepolia) * [arcadiatestnet2](#destination=arcadiatestnet2) * [basesepolia](#destination=basesepolia) * [berabartio](#destination=berabartio) * [bsctestnet](#destination=bsctestnet) * [camptestnet](#destination=camptestnet) * [citreatestnet](#destination=citreatestnet) * [ecotestnet](#destination=ecotestnet) * [formtestnet](#destination=formtestnet) * [fuji](#destination=fuji) * [holesky](#destination=holesky) * [hyperliquidevmtestnet](#destination=hyperliquidevmtestnet) * [inksepolia](#destination=inksepolia) * [odysseytestnet](#destination=odysseytestnet) * [optimismsepolia](#destination=optimismsepolia) * [plumetestnet](#destination=plumetestnet) * [polygonamoy](#destination=polygonamoy) * [scrollsepolia](#destination=scrollsepolia) * [sepolia](#destination=sepolia) * [soneiumtestnet](#destination=soneiumtestnet) * [sonictestnet](#destination=sonictestnet) * [suavetoliman](#destination=suavetoliman) * [superpositiontestnet](#destination=superpositiontestnet) * [tangletestnet](#destination=tangletestnet) * [treasuretopaz](#destination=treasuretopaz) * [unichaintestnet](#destination=unichaintestnet) body: * Solidity * CosmWasm * Sealevel // send message from abstracttestnet to alephzeroevmtestnet TestRecipientIMailbox mailbox = IMailbox("0x28f448885bEaaF662f8A9A6c9aF20fAd17A5a1DC");bytes32 messageId = mailbox.dispatch{value: msg.value}( 2039, "0x0000000000000000000000009EC79CA89DeF61BFa2f38cD4fCC137b9e49d60dD", bytes("Hello, world")); 🚧 Coming soon! 🚧 🚧 Coming soon! 🚧 Quote Dispatch[​](#quote-dispatch "Direct link to Quote Dispatch") ------------------------------------------------------------------- Fees are often configured to cover IGP payments as well as protocol costs. These include transaction submission on the destination chain, security provisioning, and maintenance. To receive a quote for a corresponding `dispatch` call, you can query the `quoteDispatch` function. * Solidity function quoteDispatch( uint32 destinationDomain, bytes32 recipientAddress, bytes calldata messageBody) external view returns (uint256 fee); The quoted `fee` must be passed as value to the `dispatch` call to ensure it does not revert. ### Examples[​](#examples-1 "Direct link to Examples") origin: abstracttestnet * [abstracttestnet](#origin=abstracttestnet) * [alephzeroevmtestnet](#origin=alephzeroevmtestnet) * [alfajores](#origin=alfajores) * [arbitrumsepolia](#origin=arbitrumsepolia) * [arcadiatestnet2](#origin=arcadiatestnet2) * [basesepolia](#origin=basesepolia) * [berabartio](#origin=berabartio) * [bsctestnet](#origin=bsctestnet) * [camptestnet](#origin=camptestnet) * [citreatestnet](#origin=citreatestnet) * [ecotestnet](#origin=ecotestnet) * [formtestnet](#origin=formtestnet) * [fuji](#origin=fuji) * [holesky](#origin=holesky) * [hyperliquidevmtestnet](#origin=hyperliquidevmtestnet) * [inksepolia](#origin=inksepolia) * [odysseytestnet](#origin=odysseytestnet) * [optimismsepolia](#origin=optimismsepolia) * [plumetestnet](#origin=plumetestnet) * [polygonamoy](#origin=polygonamoy) * [scrollsepolia](#origin=scrollsepolia) * [sepolia](#origin=sepolia) * [soneiumtestnet](#origin=soneiumtestnet) * [sonictestnet](#origin=sonictestnet) * [suavetoliman](#origin=suavetoliman) * [superpositiontestnet](#origin=superpositiontestnet) * [tangletestnet](#origin=tangletestnet) * [treasuretopaz](#origin=treasuretopaz) * [unichaintestnet](#origin=unichaintestnet) destination: alephzeroevmtestnet * [abstracttestnet](#destination=abstracttestnet) * [alephzeroevmtestnet](#destination=alephzeroevmtestnet) * [alfajores](#destination=alfajores) * [arbitrumsepolia](#destination=arbitrumsepolia) * [arcadiatestnet2](#destination=arcadiatestnet2) * [basesepolia](#destination=basesepolia) * [berabartio](#destination=berabartio) * [bsctestnet](#destination=bsctestnet) * [camptestnet](#destination=camptestnet) * [citreatestnet](#destination=citreatestnet) * [ecotestnet](#destination=ecotestnet) * [formtestnet](#destination=formtestnet) * [fuji](#destination=fuji) * [holesky](#destination=holesky) * [hyperliquidevmtestnet](#destination=hyperliquidevmtestnet) * [inksepolia](#destination=inksepolia) * [odysseytestnet](#destination=odysseytestnet) * [optimismsepolia](#destination=optimismsepolia) * [plumetestnet](#destination=plumetestnet) * [polygonamoy](#destination=polygonamoy) * [scrollsepolia](#destination=scrollsepolia) * [sepolia](#destination=sepolia) * [soneiumtestnet](#destination=soneiumtestnet) * [sonictestnet](#destination=sonictestnet) * [suavetoliman](#destination=suavetoliman) * [superpositiontestnet](#destination=superpositiontestnet) * [tangletestnet](#destination=tangletestnet) * [treasuretopaz](#destination=treasuretopaz) * [unichaintestnet](#destination=unichaintestnet) body: * Solidity * CosmWasm * Sealevel // quote sending message from abstracttestnet to alephzeroevmtestnet TestRecipientIMailbox mailbox = IMailbox("0x28f448885bEaaF662f8A9A6c9aF20fAd17A5a1DC");uint32 destination = 2039;bytes32 recipient = "0x0000000000000000000000009EC79CA89DeF61BFa2f38cD4fCC137b9e49d60dD";bytes memory body = bytes("Hello, world");uint256 fee = mailbox.quoteDispatch(destination, recipient, body);mailbox.dispatch{value: fee}(destination, recipient, body); 🚧 Coming soon! 🚧 🚧 Coming soon! 🚧 danger Underpayment to `dispatch` will revert. If you are composing hooks together, overpayment **may not be refunded** to the message sender. Post-Dispatch Hook Config[​](#post-dispatch-hook-config "Direct link to Post-Dispatch Hook Config") ---------------------------------------------------------------------------------------------------- There are two hooks configured on a Mailbox * `required`: invoked for all `dispatch` calls with value that covers the required fee * `default`: invoked (unless overridden) with remaining value after `required` hook ### Required Hook[​](#required-hook "Direct link to Required Hook") To query the required hook configuration, you can call the `requiredHook` function. * Solidity function requiredHook() external view returns (IPostDispatchHook); ### Default Hook[​](#default-hook "Direct link to Default Hook") To query the default hook configuration, you can call the `defaultHook` function. * Solidity function defaultHook() external view returns (IPostDispatchHook); To override the default hook with a custom hook in the `dispatch` call, see the [Hooks Reference](/docs/reference/hooks/overview) . * [Dispatch](#dispatch) * [Examples](#examples) * [Quote Dispatch](#quote-dispatch) * [Examples](#examples-1) * [Post-Dispatch Hook Config](#post-dispatch-hook-config) * [Required Hook](#required-hook) * [Default Hook](#default-hook) --- # Hyperlane Registries | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Hyperlane Registries ==================== Overview[​](#overview "Direct link to Overview") ------------------------------------------------- Hyperlane can be deployed anywhere by anyone. But for those deployments to be useful, their details must be well known. Registries are collections of chain metadata, contract addresses, and other useful information for interacting with Hyperlane contracts and tools. There is a [canonical registry](https://github.com/hyperlane-xyz/hyperlane-registry) maintained by the Hyperlane core team. The [CLI](/docs/reference/cli) , the [Explorer](https://explorer.hyperlane.xyz) , and other tools can use registry data. Canonical registry[​](#canonical-registry "Direct link to Canonical registry") ------------------------------------------------------------------------------- Metadata and artifacts for deployments done by the Hyperlane core team will be available here: [https://github.com/hyperlane-xyz/hyperlane-registry](https://github.com/hyperlane-xyz/hyperlane-registry) However, community members are encouraged to add their own deployments to this canonical registry. The steps to contribute are as follows: 1. Fork and clone the registry repository 2. Use the CLI and set the `--registry` flag to the local path of the cloned repository 3. Execute your commands as needed 4. Push your changes to your fork and create a pull request Custom registries[​](#custom-registries "Direct link to Custom registries") ---------------------------------------------------------------------------- As long as the registry conforms to the same layout and file schemas as the canonical registry, any Github repository URL or local file path can be used instead. The CLI has two command line arguments for configuring the registry it uses: * The `--registry` flag sets the primary registry and uses the default Github registry if not set * The `--overrides` flag sets an optional additional path which can be useful for forcing specific overrides of the default data, for example to use a different RPC URL in a chain's metadata. Once your custom registry additions/updates are complete and tested, consider opening a pull request to the canonical registry so that others can benefit from your deployments. For more information see the [CLI reference page](/docs/reference/cli) . Usage (Javascript & Typescript)[​](#usage-javascript--typescript "Direct link to Usage (Javascript & Typescript)") ------------------------------------------------------------------------------------------------------------------- ### Install[​](#install "Direct link to Install") # With npmnpm install @hyperlane-xyz/registry# Or with yarnyarn add @hyperlane-xyz/registry ### Get Content[​](#get-content "Direct link to Get Content") #### Via the package (static)[​](#via-the-package-static "Direct link to Via the package (static)") The simplest way to access the registry data would be to import the desired parts directly from the package: // Via the base packageimport { ethereum, ethereumAddresses } from "@hyperlane-xyz/registry";// Or via sub-exports for more optimal bundles if your bundler allows itimport { metadata, addresses } from "@hyperlane-xyz/registry/chains/ethereum"; #### Via the utilities (dynamic)[​](#via-the-utilities-dynamic "Direct link to Via the utilities (dynamic)") If you need to ensure you have the latest data, registry content can be fetched on-the-fly with the `GithubRegistry` class. import { GithubRegistry } from "@hyperlane-xyz/registry";const registry = new GithubRegistry();const chainMetadata = await registry.getMetadata(); * [Overview](#overview) * [Canonical registry](#canonical-registry) * [Custom registries](#custom-registries) * [Usage (Javascript & Typescript)](#usage-javascript--typescript) * [Install](#install) * [Get Content](#get-content) --- # Receive a message | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Receive a message ================= To deliver interchain messages, the [relayer](/docs/operate/relayer/run-relayer) calls `Mailbox.process()`. This function takes as parameters the message to deliver, as well as arbitrary metadata that can be specified by the relayer. The `Mailbox` will pass the message and metadata to the recipient's Interchain Security Module (ISM) for verification. If the ISM successfully verifies the message, the `Mailbox` delivers the message to the recipient by calling `recipient.handle()`. info See [`Message.sol`](https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/solidity/contracts/libs/Message.sol) for more details on Hyperlane message encoding Handle[​](#handle "Direct link to Handle") ------------------------------------------- This function is called by the `Mailbox` contract when a message is received. danger To ensure only valid interchain messages are accepted, it is important to restrict [access control](#access-control) to the Mailbox address. * Solidity function handle( uint32 _origin, bytes32 _sender, bytes calldata _message) external payable; **Parameters** * `origin`: Domain of origin chain * `sender`: Address of sender on origin chain as bytes32 * `messageBody`: Raw bytes content of message body info Sender addresses are left-padded to `bytes32` for compatibility with virtual machines that are addressed differently. The following utility is provided in the [`TypeCasts` library](/docs/reference/libraries/typecasts) for convenience. // alignment preserving castfunction bytes32ToAddress(bytes32 _buf) internal pure returns (address) { require( uint256(_buf) <= uint256(type(uint160).max), ### Access Control[​](#access-control "Direct link to Access Control") The `handle` function should be restricted to the Mailbox address if the contract should only accept calls from interchain messages. The following utility is provided in the [`MailboxClient` library](/docs/reference/libraries/mailboxclient) for convenience. * Solidity require( Address.isContract(_contract), "MailboxClient: invalid mailbox" ); _;} ### Examples[​](#examples "Direct link to Examples") * Solidity function handle( uint32 _origin, bytes32 _sender, bytes calldata _data) external payable virtual override { emit ReceivedMessage(_origin, _sender, msg.value, string(_data)); lastSender = _sender; lastData = _data;} Verify[​](#verify "Direct link to Verify") ------------------------------------------- When a message is received, the Mailbox will verify security with an [Interchain Security Module](/docs/reference/ISM/specify-your-ISM) before calling the message recipient's `handle`. ### Default Security[​](#default-security "Direct link to Default Security") To query the default ISM address, you can call the `defaultIsm` function. * Solidity function defaultHook() external view returns (IPostDispatchHook); ### Modular Security[​](#modular-security "Direct link to Modular Security") To leverage Hyperlane's modular security, message recipients can specify a custom Interchain Security Module to **verify anything** about incoming messages. The Mailbox will defer to this ISM when specified. * [Handle](#handle) * [Access Control](#access-control) * [Examples](#examples) * [Verify](#verify) * [Default Security](#default-security) * [Modular Security](#modular-security) --- # Typescript SDK | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) Typescript SDK ============== For developers looking to further customize the Warp UI for their own projects or build their own interchain applications, we encourage you to explore the [Typescript SDK](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/typescript/sdk) . The SDK contains a growing set of an utilities and abstractions for interacting with Hyperlane across different protocols (EVM, Cosmos, Solana). --- # Typescript SDK | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) Typescript SDK ============== For developers looking to further customize the Warp UI for their own projects or build their own interchain applications, we encourage you to explore the [Typescript SDK](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/typescript/sdk) . The SDK contains a growing set of an utilities and abstractions for interacting with Hyperlane across different protocols (EVM, Cosmos, Solana). --- # Typescript SDK | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) Typescript SDK ============== For developers looking to further customize the Warp UI for their own projects or build their own interchain applications, we encourage you to explore the [Typescript SDK](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/typescript/sdk) . The SDK contains a growing set of an utilities and abstractions for interacting with Hyperlane across different protocols (EVM, Cosmos, Solana). --- # Typescript SDK | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) Typescript SDK ============== For developers looking to further customize the Warp UI for their own projects or build their own interchain applications, we encourage you to explore the [Typescript SDK](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/typescript/sdk) . The SDK contains a growing set of an utilities and abstractions for interacting with Hyperlane across different protocols (EVM, Cosmos, Solana). --- # Typescript SDK | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) Typescript SDK ============== For developers looking to further customize the Warp UI for their own projects or build their own interchain applications, we encourage you to explore the [Typescript SDK](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/typescript/sdk) . The SDK contains a growing set of an utilities and abstractions for interacting with Hyperlane across different protocols (EVM, Cosmos, Solana). --- # Typescript SDK | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) Typescript SDK ============== For developers looking to further customize the Warp UI for their own projects or build their own interchain applications, we encourage you to explore the [Typescript SDK](https://github.com/hyperlane-xyz/hyperlane-monorepo/tree/main/typescript/sdk) . The SDK contains a growing set of an utilities and abstractions for interacting with Hyperlane across different protocols (EVM, Cosmos, Solana). --- # How to Productionize Your Hyperlane Warp Route Deployment | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) How to Productionize Your Hyperlane Warp Route Deployment ========================================================= In order to productionize your Hyperlane warp route deployment, you must [remove the trusted relayer ISM](/docs/guides/remove-trusted-relayer) from your warp route. In addition, you will need to [transfer ownership](/docs/guides/transfer-warp-route-ownership) of your warp route. After doing so, add your warp route to [the Registry](https://github.com/hyperlane-xyz/hyperlane-registry/tree/main/deployments/warp_routes) for review and inclusion in the network and its integrations. Please continue to the following guides to bring your warp route to production. --- # Send your first interchain message | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Send your first interchain message ================================== This tutorial demonstrates how to [send](/docs/reference/messaging/send) an interchain message to a pre-deployed `TestRecipient` contract. Sending a message is a simple matter of calling `Mailbox.dispatch`. Make sure you have an account with funds on the origin chain. origin: abstracttestnet * [abstracttestnet](#origin=abstracttestnet) * [alephzeroevmtestnet](#origin=alephzeroevmtestnet) * [alfajores](#origin=alfajores) * [arbitrumsepolia](#origin=arbitrumsepolia) * [arcadiatestnet2](#origin=arcadiatestnet2) * [basesepolia](#origin=basesepolia) * [berabartio](#origin=berabartio) * [bsctestnet](#origin=bsctestnet) * [camptestnet](#origin=camptestnet) * [citreatestnet](#origin=citreatestnet) * [ecotestnet](#origin=ecotestnet) * [formtestnet](#origin=formtestnet) * [fuji](#origin=fuji) * [holesky](#origin=holesky) * [hyperliquidevmtestnet](#origin=hyperliquidevmtestnet) * [inksepolia](#origin=inksepolia) * [odysseytestnet](#origin=odysseytestnet) * [optimismsepolia](#origin=optimismsepolia) * [plumetestnet](#origin=plumetestnet) * [polygonamoy](#origin=polygonamoy) * [scrollsepolia](#origin=scrollsepolia) * [sepolia](#origin=sepolia) * [soneiumtestnet](#origin=soneiumtestnet) * [sonictestnet](#origin=sonictestnet) * [suavetoliman](#origin=suavetoliman) * [superpositiontestnet](#origin=superpositiontestnet) * [tangletestnet](#origin=tangletestnet) * [treasuretopaz](#origin=treasuretopaz) * [unichaintestnet](#origin=unichaintestnet) destination: alephzeroevmtestnet * [abstracttestnet](#destination=abstracttestnet) * [alephzeroevmtestnet](#destination=alephzeroevmtestnet) * [alfajores](#destination=alfajores) * [arbitrumsepolia](#destination=arbitrumsepolia) * [arcadiatestnet2](#destination=arcadiatestnet2) * [basesepolia](#destination=basesepolia) * [berabartio](#destination=berabartio) * [bsctestnet](#destination=bsctestnet) * [camptestnet](#destination=camptestnet) * [citreatestnet](#destination=citreatestnet) * [ecotestnet](#destination=ecotestnet) * [formtestnet](#destination=formtestnet) * [fuji](#destination=fuji) * [holesky](#destination=holesky) * [hyperliquidevmtestnet](#destination=hyperliquidevmtestnet) * [inksepolia](#destination=inksepolia) * [odysseytestnet](#destination=odysseytestnet) * [optimismsepolia](#destination=optimismsepolia) * [plumetestnet](#destination=plumetestnet) * [polygonamoy](#destination=polygonamoy) * [scrollsepolia](#destination=scrollsepolia) * [sepolia](#destination=sepolia) * [soneiumtestnet](#destination=soneiumtestnet) * [sonictestnet](#destination=sonictestnet) * [suavetoliman](#destination=suavetoliman) * [superpositiontestnet](#destination=superpositiontestnet) * [tangletestnet](#destination=tangletestnet) * [treasuretopaz](#destination=treasuretopaz) * [unichaintestnet](#destination=unichaintestnet) body: * Hyperlane CLI * Cast * Explorer Install the CLI: npm install -g @hyperlane-xyz/cli Send the message: hyperlane send message --origin abstracttestnet --destination alephzeroevmtestnet --body "Hello, world" Install `cast`: curl -L https://foundry.paradigm.xyz | bash Send the message: cast send 0x28f448885bEaaF662f8A9A6c9aF20fAd17A5a1DC "dispatch(uint32,bytes32,bytes)" 2039 0x0000000000000000000000009EC79CA89DeF61BFa2f38cD4fCC137b9e49d60dD $(cast --from-utf8 "Hello, world") --rpc-url https://api.testnet.abs.xyz --value 0.01ether 1. Navigate to the [explorer.testnet.abs.xyz `dispatch` interface](https://explorer.testnet.abs.xyz/address/0x28f448885bEaaF662f8A9A6c9aF20fAd17A5a1DC#writeProxyContract#F3) 2. Click on the `Connect to Web3` button to connect your Wallet. Make sure you are on `abstracttestnet`. 3. Fill in value: `0.01`, destination: `2039`, recipient: `0x0000000000000000000000009EC79CA89DeF61BFa2f38cD4fCC137b9e49d60dD`, and message the hex representation of "Hello, world". For example if you have `cast` installed, `cast --from-utf8 "Hello, world"` returns `0x48656c6c6f2c20776f726c64`. 4. Click the `Write` button to submit the transaction! tip You can watch the progress of your message on [explorer.hyperlane.xyz](https://explorer.hyperlane.xyz/) by searching for the **transaction hash** of your `Mailbox.dispatch` call. Check the result[​](#check-the-result "Direct link to Check the result") ------------------------------------------------------------------------- The `TestRecipient` has the following [handle](/docs/reference/messaging/receive) implementation: * Solidity function handle( uint32 _origin, bytes32 _sender, bytes calldata _data) external payable virtual override { emit ReceivedMessage(_origin, _sender, msg.value, string(_data)); lastSender = _sender; lastData = _data;} Check the logs to see your message delivery! Testnet `TestRecipient` Addresses | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Abstract Testnet | 11124 | `0x9EC79CA89DeF61BFa2f38cD4fCC137b9e49d60dD` | [explorer.testnet.abs.xyz](https://explorer.testnet.abs.xyz/address/0x9EC79CA89DeF61BFa2f38cD4fCC137b9e49d60dD) | | Aleph Zero EVM Testnet | 2039 | `0x843908541D24d9F6Fa30C8Bb1c39038C947D08fC` | [evm-explorer-testnet.alephzero.org](https://evm-explorer-testnet.alephzero.org/address/0x843908541D24d9F6Fa30C8Bb1c39038C947D08fC) | | Alfajores | 44787 | `0x6489d13AcAd3B8dce4c5B31f375DE4f9451E7b38` | [explorer.celo.org](https://explorer.celo.org/alfajores/address/0x6489d13AcAd3B8dce4c5B31f375DE4f9451E7b38) | | Arbitrum Sepolia | 421614 | `0x6c13643B3927C57DB92c790E4E3E7Ee81e13f78C` | [sepolia.arbiscan.io](https://sepolia.arbiscan.io/address/0x6c13643B3927C57DB92c790E4E3E7Ee81e13f78C) | | Arcadia Testnet v2 | 1098411886 | `0xCB3c489a2FB67a7Cd555D47B3a9A0E654784eD16` | [explorer.khalani.network](https://explorer.khalani.network/address/0xCB3c489a2FB67a7Cd555D47B3a9A0E654784eD16) | | Base Sepolia | 84532 | `0x783c4a0bB6663359281aD4a637D5af68F83ae213` | [sepolia.basescan.org](https://sepolia.basescan.org/address/0x783c4a0bB6663359281aD4a637D5af68F83ae213) | | Berachain bArtio | 80084 | `0xe0B988062A0C6492177d64823Ab95a9c256c2a5F` | [bartio.beratrail.io](https://bartio.beratrail.io//address/0xe0B988062A0C6492177d64823Ab95a9c256c2a5F) | | BSC Testnet | 97 | `0xfbcD1c00a3d809f36cC1A15918694B17B32c0b6c` | [testnet.bscscan.com](https://testnet.bscscan.com/address/0xfbcD1c00a3d809f36cC1A15918694B17B32c0b6c) | | Camp Network Testnet V2 | 325000 | `0x7483faD0Bc297667664A43A064bA7c9911659f57` | [camp-network-testnet.blockscout.com](https://camp-network-testnet.blockscout.com/address/0x7483faD0Bc297667664A43A064bA7c9911659f57) | | Citrea Testnet | 5115 | `0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8` | [explorer.testnet.citrea.xyz](https://explorer.testnet.citrea.xyz/address/0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8) | | Eco Testnet | 471923 | `0x783c4a0bB6663359281aD4a637D5af68F83ae213` | [eco-testnet.explorer.caldera.xyz](https://eco-testnet.explorer.caldera.xyz//address/0x783c4a0bB6663359281aD4a637D5af68F83ae213) | | Form Testnet | 132902 | `0x7483faD0Bc297667664A43A064bA7c9911659f57` | [sepolia-explorer.form.network](https://sepolia-explorer.form.network/address/0x7483faD0Bc297667664A43A064bA7c9911659f57) | | Fuji | 43113 | `0x44a7e1d76fD8AfA244AdE7278336E3D5C658D398` | [testnet.snowtrace.io](https://testnet.snowtrace.io/address/0x44a7e1d76fD8AfA244AdE7278336E3D5C658D398) | | Holesky | 17000 | `0x86fb9F1c124fB20ff130C41a79a432F770f67AFD` | [holesky.etherscan.io](https://holesky.etherscan.io/address/0x86fb9F1c124fB20ff130C41a79a432F770f67AFD) | | Hyperliquid EVM Testnet | 998 | `0xB057Fb841027a8554521DcCdeC3c3474CaC99AB5` | [explorer.hyperlend.finance](https://explorer.hyperlend.finance/address/0xB057Fb841027a8554521DcCdeC3c3474CaC99AB5) | | Ink Sepolia | 763373 | `0x0e91088824Fa6E2675b2a53DA3491a9B098bD868` | [explorer-sepolia.inkonchain.com](https://explorer-sepolia.inkonchain.com/address/0x0e91088824Fa6E2675b2a53DA3491a9B098bD868) | | Odyssey Testnet | 911867 | `0x5e65279Fb7293a058776e37587398fcc3E9184b1` | [odyssey-explorer.ithaca.xyz](https://odyssey-explorer.ithaca.xyz/address/0x5e65279Fb7293a058776e37587398fcc3E9184b1) | | Optimism Sepolia | 11155420 | `0x783c4a0bB6663359281aD4a637D5af68F83ae213` | [sepolia-optimistic.etherscan.io](https://sepolia-optimistic.etherscan.io/address/0x783c4a0bB6663359281aD4a637D5af68F83ae213) | | Plume Testnet | 161221135 | `0xe0B988062A0C6492177d64823Ab95a9c256c2a5F` | [plume-testnet.explorer.caldera.xyz](https://plume-testnet.explorer.caldera.xyz/address/0xe0B988062A0C6492177d64823Ab95a9c256c2a5F) | | Polygon Amoy | 80002 | `0x04438ef7622f5412f82915F59caD4f704C61eA48` | [amoy.polygonscan.com](https://amoy.polygonscan.com/address/0x04438ef7622f5412f82915F59caD4f704C61eA48) | | Scroll Sepolia | 534351 | `0xa3AB7E6cE24E6293bD5320A53329Ef2f4DE73fCA` | [sepolia.scrollscan.dev](https://sepolia.scrollscan.dev//address/0xa3AB7E6cE24E6293bD5320A53329Ef2f4DE73fCA) | | Sepolia | 11155111 | `0xeDc1A3EDf87187085A3ABb7A9a65E1e7aE370C07` | [sepolia.etherscan.io](https://sepolia.etherscan.io/address/0xeDc1A3EDf87187085A3ABb7A9a65E1e7aE370C07) | | Soneium Minato Testnet | 1946 | `0x7483faD0Bc297667664A43A064bA7c9911659f57` | [explorer-testnet.soneium.org](https://explorer-testnet.soneium.org/address/0x7483faD0Bc297667664A43A064bA7c9911659f57) | | Sonic Testnet | 64165 | `0x01812D60958798695391dacF092BAc4a715B1718` | [testnet.soniclabs.com](https://testnet.soniclabs.com/address/0x01812D60958798695391dacF092BAc4a715B1718) | | SUAVE Toliman Testnet | 33626250 | `0x7483faD0Bc297667664A43A064bA7c9911659f57` | [explorer.toliman.suave.flashbots.net](https://explorer.toliman.suave.flashbots.net/address/0x7483faD0Bc297667664A43A064bA7c9911659f57) | | Superposition Testnet | 98985 | `0xAb9B273366D794B7F80B4378bc8Aaca75C6178E2` | [testnet-explorer.superposition.so](https://testnet-explorer.superposition.so/address/0xAb9B273366D794B7F80B4378bc8Aaca75C6178E2) | | Tangle Testnet | 3799 | `0xE73cdFFcE97AD56723dbA6145a3cC0Dd3aeF112f` | [testnet-explorer.tangle.tools](https://testnet-explorer.tangle.tools//address/0xE73cdFFcE97AD56723dbA6145a3cC0Dd3aeF112f) | | Treasure Topaz Testnet | 978658 | `0x9EC79CA89DeF61BFa2f38cD4fCC137b9e49d60dD` | [topaz.treasurescan.io](https://topaz.treasurescan.io/address/0x9EC79CA89DeF61BFa2f38cD4fCC137b9e49d60dD) | | Unichain Testnet | 1301 | `0x01812D60958798695391dacF092BAc4a715B1718` | [unichain-sepolia.blockscout.com](https://unichain-sepolia.blockscout.com/address/0x01812D60958798695391dacF092BAc4a715B1718) | Testnet `Mailbox` Addresses | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Abstract Testnet | 11124 | `0x28f448885bEaaF662f8A9A6c9aF20fAd17A5a1DC` | [explorer.testnet.abs.xyz](https://explorer.testnet.abs.xyz/address/0x28f448885bEaaF662f8A9A6c9aF20fAd17A5a1DC) | | Aleph Zero EVM Testnet | 2039 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [evm-explorer-testnet.alephzero.org](https://evm-explorer-testnet.alephzero.org/address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | | Alfajores | 44787 | `0xEf9F292fcEBC3848bF4bB92a96a04F9ECBb78E59` | [explorer.celo.org](https://explorer.celo.org/alfajores/address/0xEf9F292fcEBC3848bF4bB92a96a04F9ECBb78E59) | | Arbitrum Sepolia | 421614 | `0x598facE78a4302f11E3de0bee1894Da0b2Cb71F8` | [sepolia.arbiscan.io](https://sepolia.arbiscan.io/address/0x598facE78a4302f11E3de0bee1894Da0b2Cb71F8) | | Arcadia Testnet v2 | 1098411886 | `0x33dB966328Ea213b0f76eF96CA368AB37779F065` | [explorer.khalani.network](https://explorer.khalani.network/address/0x33dB966328Ea213b0f76eF96CA368AB37779F065) | | Base Sepolia | 84532 | `0x6966b0E55883d49BFB24539356a2f8A673E02039` | [sepolia.basescan.org](https://sepolia.basescan.org/address/0x6966b0E55883d49BFB24539356a2f8A673E02039) | | Berachain bArtio | 80084 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [bartio.beratrail.io](https://bartio.beratrail.io//address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | | BSC Testnet | 97 | `0xF9F6F5646F478d5ab4e20B0F910C92F1CCC9Cc6D` | [testnet.bscscan.com](https://testnet.bscscan.com/address/0xF9F6F5646F478d5ab4e20B0F910C92F1CCC9Cc6D) | | Camp Network Testnet V2 | 325000 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [camp-network-testnet.blockscout.com](https://camp-network-testnet.blockscout.com/address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | | Citrea Testnet | 5115 | `0xB08d78F439e55D02C398519eef61606A5926245F` | [explorer.testnet.citrea.xyz](https://explorer.testnet.citrea.xyz/address/0xB08d78F439e55D02C398519eef61606A5926245F) | | Eco Testnet | 471923 | `0x6966b0E55883d49BFB24539356a2f8A673E02039` | [eco-testnet.explorer.caldera.xyz](https://eco-testnet.explorer.caldera.xyz//address/0x6966b0E55883d49BFB24539356a2f8A673E02039) | | Form Testnet | 132902 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [sepolia-explorer.form.network](https://sepolia-explorer.form.network/address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | | Fuji | 43113 | `0x5b6CFf85442B851A8e6eaBd2A4E4507B5135B3B0` | [testnet.snowtrace.io](https://testnet.snowtrace.io/address/0x5b6CFf85442B851A8e6eaBd2A4E4507B5135B3B0) | | Holesky | 17000 | `0x46f7C5D896bbeC89bE1B19e4485e59b4Be49e9Cc` | [holesky.etherscan.io](https://holesky.etherscan.io/address/0x46f7C5D896bbeC89bE1B19e4485e59b4Be49e9Cc) | | Hyperliquid EVM Testnet | 998 | `0x589C201a07c26b4725A4A829d772f24423da480B` | [explorer.hyperlend.finance](https://explorer.hyperlend.finance/address/0x589C201a07c26b4725A4A829d772f24423da480B) | | Ink Sepolia | 763373 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [explorer-sepolia.inkonchain.com](https://explorer-sepolia.inkonchain.com/address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | | Odyssey Testnet | 911867 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [odyssey-explorer.ithaca.xyz](https://odyssey-explorer.ithaca.xyz/address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | | Optimism Sepolia | 11155420 | `0x6966b0E55883d49BFB24539356a2f8A673E02039` | [sepolia-optimistic.etherscan.io](https://sepolia-optimistic.etherscan.io/address/0x6966b0E55883d49BFB24539356a2f8A673E02039) | | Plume Testnet | 161221135 | `0x33dB966328Ea213b0f76eF96CA368AB37779F065` | [plume-testnet.explorer.caldera.xyz](https://plume-testnet.explorer.caldera.xyz/address/0x33dB966328Ea213b0f76eF96CA368AB37779F065) | | Polygon Amoy | 80002 | `0x54148470292C24345fb828B003461a9444414517` | [amoy.polygonscan.com](https://amoy.polygonscan.com/address/0x54148470292C24345fb828B003461a9444414517) | | Scroll Sepolia | 534351 | `0x3C5154a193D6e2955650f9305c8d80c18C814A68` | [sepolia.scrollscan.dev](https://sepolia.scrollscan.dev//address/0x3C5154a193D6e2955650f9305c8d80c18C814A68) | | Sepolia | 11155111 | `0xfFAEF09B3cd11D9b20d1a19bECca54EEC2884766` | [sepolia.etherscan.io](https://sepolia.etherscan.io/address/0xfFAEF09B3cd11D9b20d1a19bECca54EEC2884766) | | Soneium Minato Testnet | 1946 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [explorer-testnet.soneium.org](https://explorer-testnet.soneium.org/address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | | Sonic Testnet | 64165 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [testnet.soniclabs.com](https://testnet.soniclabs.com/address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | | SUAVE Toliman Testnet | 33626250 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [explorer.toliman.suave.flashbots.net](https://explorer.toliman.suave.flashbots.net/address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | | Superposition Testnet | 98985 | `0x6966b0E55883d49BFB24539356a2f8A673E02039` | [testnet-explorer.superposition.so](https://testnet-explorer.superposition.so/address/0x6966b0E55883d49BFB24539356a2f8A673E02039) | | Tangle Testnet | 3799 | `0x87100b0E64B3baBD43F3FCB26A6edc4395e2D9df` | [testnet-explorer.tangle.tools](https://testnet-explorer.tangle.tools//address/0x87100b0E64B3baBD43F3FCB26A6edc4395e2D9df) | | Treasure Topaz Testnet | 978658 | `0x28f448885bEaaF662f8A9A6c9aF20fAd17A5a1DC` | [topaz.treasurescan.io](https://topaz.treasurescan.io/address/0x28f448885bEaaF662f8A9A6c9aF20fAd17A5a1DC) | | Unichain Testnet | 1301 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [unichain-sepolia.blockscout.com](https://unichain-sepolia.blockscout.com/address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | * [Check the result](#check-the-result) --- # Welcome to Hyperlane Docs | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) Hyperlane Docs ============== Explore our tools, guides and references for building cross-chain applications apps. [### \ \ Intro to Hyperlane\ \ Overview of the Hyperlane protocol, Permissionless Interoperability and use-cases](/docs/intro) [### \ \ Deploy to a New Chain\ \ Quickly deploy Hyperlane on a new chain](/docs/deploy-hyperlane) [### \ \ Bridge Tokens with Warp Routes\ \ Learn how to bridge assets using Warp Routes](/docs/guides/deploy-warp-route) [### \ \ Run a Validator\ \ Step-by-step instructions to run a Hyperlane Validator](/docs/operate/validators/run-validators) [### \ \ Core Concepts\ \ Learn about the Hyperlane protocol and core components](/docs/protocol/protocol-overview) [### \ \ Where is Hyperlane?\ \ Learn about the current deployments](/docs/reference/contract-addresses) --- # Deployed Addresses | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Deployed Addresses ================== Mailbox[​](#mailbox "Direct link to Mailbox") ---------------------------------------------- * Mainnet * Testnet | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Aleph Zero EVM | 1000041455 | `0x5bdADEAD721Eb4C4038fF7c989E3C7BbBA302435` | [evm-explorer.alephzero.org](https://evm-explorer.alephzero.org/address/0x5bdADEAD721Eb4C4038fF7c989E3C7BbBA302435) | | Ancient8 | 888888888 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [scan.ancient8.gg](https://scan.ancient8.gg/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | ApeChain | 33139 | `0x7f50C5776722630a0024fAE05fDe8b47571D7B39` | [apechain.calderaexplorer.xyz](https://apechain.calderaexplorer.xyz/address/0x7f50C5776722630a0024fAE05fDe8b47571D7B39) | | AppChain | 466 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.appchain.xyz](https://explorer.appchain.xyz/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Arbitrum | 42161 | `0x979Ca5202784112f4738403dBec5D0F3B9daabB9` | [arbiscan.io](https://arbiscan.io/address/0x979Ca5202784112f4738403dBec5D0F3B9daabB9) | | Arbitrum Nova | 42170 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [nova.arbiscan.io](https://nova.arbiscan.io//address/0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7) | | Artela | 11820 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [artscan.artela.network](https://artscan.artela.network/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Arthera | 10242 | `0x473884010F0C1742DA8Ad01E7E295624B931076b` | [explorer.arthera.net](https://explorer.arthera.net/address/0x473884010F0C1742DA8Ad01E7E295624B931076b) | | Astar | 592 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [astar.blockscout.com](https://astar.blockscout.com/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Astar zkEVM | 3776 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [astar-zkevm.explorer.startale.com](https://astar-zkevm.explorer.startale.com/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Aurora | 1313161554 | `0x7f50C5776722630a0024fAE05fDe8b47571D7B39` | [explorer.mainnet.aurora.dev](https://explorer.mainnet.aurora.dev/address/0x7f50C5776722630a0024fAE05fDe8b47571D7B39) | | Avalanche | 43114 | `0xFf06aFcaABaDDd1fb08371f9ccA15D73D51FeBD6` | [snowtrace.io](https://snowtrace.io/address/0xFf06aFcaABaDDd1fb08371f9ccA15D73D51FeBD6) | | B3 | 8333 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [explorer.b3.fun](https://explorer.b3.fun/address/0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7) | | Base | 8453 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [basescan.org](https://basescan.org/address/0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D) | | Bitlayer | 200901 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [www.btrscan.com](https://www.btrscan.com/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Blast | 81457 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [blastexplorer.io](https://blastexplorer.io/address/0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7) | | BOB | 60808 | `0x8358D8291e3bEDb04804975eEa0fe9fe0fAfB147` | [explorer.gobob.xyz](https://explorer.gobob.xyz/address/0x8358D8291e3bEDb04804975eEa0fe9fe0fAfB147) | | Boba Mainnet | 288 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [bobascan.com](https://bobascan.com/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Binance Smart Chain | 56 | `0x2971b9Aec44bE4eb673DF1B88cDB57b96eefe8a4` | [bscscan.com](https://bscscan.com/address/0x2971b9Aec44bE4eb673DF1B88cDB57b96eefe8a4) | | B² Network | 223 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.bsquared.network](https://explorer.bsquared.network/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Celo | 42220 | `0x50da3B3907A08a24fe4999F4Dcf337E8dC7954bb` | [celoscan.io](https://celoscan.io/address/0x50da3B3907A08a24fe4999F4Dcf337E8dC7954bb) | | CheeseChain | 383353 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [fetascan.xyz](https://fetascan.xyz/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Chiliz | 1000088888 | `0x248aDe14C0489E20C9a7Fea5F86DBfC3702208eF` | [chiliscan.com](https://chiliscan.com/address/0x248aDe14C0489E20C9a7Fea5F86DBfC3702208eF) | | Conflux eSpace | 1030 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [evm.confluxscan.net](https://evm.confluxscan.net/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Conwai | 668668 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [conwai.calderaexplorer.xyz](https://conwai.calderaexplorer.xyz/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Core | 1116 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [scan.coredao.org](https://scan.coredao.org/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Corn | 21000000 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [cornscan.io](https://cornscan.io/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Cyber | 7560 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [cyberscan.co](https://cyberscan.co/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Degen | 666666666 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.degen.tips](https://explorer.degen.tips/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Dogechain | 2000 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.dogechain.dog](https://explorer.dogechain.dog/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | DuckChain | 5545 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [scan.duckchain.io](https://scan.duckchain.io/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Eclipse | 1408864445 | `EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y` | [explorer.eclipse.xyz](https://explorer.eclipse.xyz//address/EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y) | | Endurance | 648 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer-endurance.fusionist.io](https://explorer-endurance.fusionist.io/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Ethereum | 1 | `0xc005dc82818d67AF737725bD4bf75435d065D239` | [etherscan.io](https://etherscan.io/address/0xc005dc82818d67AF737725bD4bf75435d065D239) | | Everclear | 25327 | `0x7f50C5776722630a0024fAE05fDe8b47571D7B39` | [scan.everclear.org](https://scan.everclear.org/address/0x7f50C5776722630a0024fAE05fDe8b47571D7B39) | | Evmos EVM | 9001 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [www.mintscan.io](https://www.mintscan.io/evmos/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Fantom Opera | 250 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [ftmscan.com](https://ftmscan.com/address/0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7) | | Flame | 253368190 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.flame.astria.org](https://explorer.flame.astria.org/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Flare | 14 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [flare-explorer.flare.network](https://flare-explorer.flare.network/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | EVM on Flow | 1000000747 | `0xd9Cc2e652A162bb93173d1c44d46cd2c0bbDA59D` | [evm.flowscan.io](https://evm.flowscan.io/address/0xd9Cc2e652A162bb93173d1c44d46cd2c0bbDA59D) | | Form | 478 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.form.network](https://explorer.form.network/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Fraxtal | 252 | `0x2f9DB5616fa3fAd1aB06cB2C906830BA63d135e3` | [fraxscan.com](https://fraxscan.com/address/0x2f9DB5616fa3fAd1aB06cB2C906830BA63d135e3) | | Fuse | 122 | `0x3071D4DA6020C956Fe15Bfd0a9Ca8D4574f16696` | [explorer.fuse.io](https://explorer.fuse.io/address/0x3071D4DA6020C956Fe15Bfd0a9Ca8D4574f16696) | | Gnosis | 100 | `0xaD09d78f4c6b9dA2Ae82b1D34107802d380Bb74f` | [gnosisscan.io](https://gnosisscan.io/address/0xaD09d78f4c6b9dA2Ae82b1D34107802d380Bb74f) | | Gravity Alpha Mainnet | 1625 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.gravity.xyz](https://explorer.gravity.xyz/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Guru Network | 260 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [blockscout.gurunetwork.ai](https://blockscout.gurunetwork.ai/address/0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7) | | Harmony One | 1666600000 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [explorer.harmony.one](https://explorer.harmony.one/address/0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7) | | Hemi Network | 43111 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.hemi.xyz](https://explorer.hemi.xyz/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Immutable zkEVM | 1000013371 | `0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2` | [explorer.immutable.com](https://explorer.immutable.com/address/0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2) | | Injective EVM | 2525 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [inevm.calderaexplorer.xyz](https://inevm.calderaexplorer.xyz/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Injective | 6909546 | `0x0f7fb53961d70687e352aa55cb329ca76edc0c19` | [www.mintscan.io](https://www.mintscan.io/injective/address/0x0f7fb53961d70687e352aa55cb329ca76edc0c19) | | Ink | 57073 | `0x7f50C5776722630a0024fAE05fDe8b47571D7B39` | [explorer.inkonchain.com](https://explorer.inkonchain.com/address/0x7f50C5776722630a0024fAE05fDe8b47571D7B39) | | Kaia | 8217 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [kaiascope.com](https://kaiascope.com/address/0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7) | | Kroma | 255 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [blockscout.kroma.network](https://blockscout.kroma.network/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Linea | 59144 | `0x02d16BC51af6BfD153d67CA61754cF912E82C4d9` | [lineascan.build](https://lineascan.build/address/0x02d16BC51af6BfD153d67CA61754cF912E82C4d9) | | Lisk | 1135 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [blockscout.lisk.com](https://blockscout.lisk.com/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | LUKSO | 42 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.execution.mainnet.lukso.network](https://explorer.execution.mainnet.lukso.network/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Lumia Prism | 1000073017 | `0x0dF25A2d59F03F039b56E90EdC5B89679Ace28Bc` | [explorer.lumia.org](https://explorer.lumia.org/address/0x0dF25A2d59F03F039b56E90EdC5B89679Ace28Bc) | | Manta Pacific | 169 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [pacific-explorer.manta.network](https://pacific-explorer.manta.network/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Mantle | 5000 | `0x398633D19f4371e1DB5a8EFE90468eB70B1176AA` | [explorer.mantle.xyz](https://explorer.mantle.xyz/address/0x398633D19f4371e1DB5a8EFE90468eB70B1176AA) | | Merlin | 4200 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [scan.merlinchain.io](https://scan.merlinchain.io/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Metal L2 | 1000001750 | `0x730f8a4128Fa8c53C777B62Baa1abeF94cAd34a9` | [explorer.metall2.com](https://explorer.metall2.com/address/0x730f8a4128Fa8c53C777B62Baa1abeF94cAd34a9) | | Metis Andromeda | 1088 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [andromeda-explorer.metis.io](https://andromeda-explorer.metis.io/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Mint | 185 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.mintchain.io](https://explorer.mintchain.io/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Mode | 34443 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.mode.network](https://explorer.mode.network/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Molten | 360 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [molten.calderaexplorer.xyz](https://molten.calderaexplorer.xyz/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Moonbeam | 1284 | `0x094d03E751f49908080EFf000Dd6FD177fd44CC3` | [moonscan.io](https://moonscan.io/address/0x094d03E751f49908080EFf000Dd6FD177fd44CC3) | | Morph | 2818 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [explorer.morphl2.io](https://explorer.morphl2.io/address/0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7) | | Nero | 1689 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [www.neroscan.io](https://www.neroscan.io/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Neutron | 1853125230 | `0x848426d50eb2104d5c6381ec63757930b1c14659c40db8b8081e516e7c5238fc` | [www.mintscan.io](https://www.mintscan.io/neutron/address/0x848426d50eb2104d5c6381ec63757930b1c14659c40db8b8081e516e7c5238fc) | | Oort | 970 | `0xb129828B9EDa48192D0B2db35D0E40dCF51B3594` | [mainnet-scan.oortech.com](https://mainnet-scan.oortech.com/address/0xb129828B9EDa48192D0B2db35D0E40dCF51B3594) | | Optimism | 10 | `0xd4C1905BB1D26BC93DAC913e13CaCC278CdCC80D` | [optimistic.etherscan.io](https://optimistic.etherscan.io/address/0xd4C1905BB1D26BC93DAC913e13CaCC278CdCC80D) | | Orderly L2 | 291 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [explorer.orderly.network](https://explorer.orderly.network/address/0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7) | | Polygon | 137 | `0x5d934f4e2f797775e53561bB72aca21ba36B96BB` | [polygonscan.com](https://polygonscan.com/address/0x5d934f4e2f797775e53561bB72aca21ba36B96BB) | | Polygon zkEVM | 1101 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [zkevm.polygonscan.com](https://zkevm.polygonscan.com/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Polynomial | 1000008008 | `0x2f0E57527Bb37E5E064EF243fad56CCE6241906c` | [polynomialscan.io](https://polynomialscan.io/address/0x2f0E57527Bb37E5E064EF243fad56CCE6241906c) | | Prom | 227 | `0x5C02157068a52cEcfc98EDb6115DE6134EcB4764` | [prom-blockscout.eu-north-2.gateway.fm](https://prom-blockscout.eu-north-2.gateway.fm/address/0x5C02157068a52cEcfc98EDb6115DE6134EcB4764) | | Proof of Play Apex | 70700 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.apex.proofofplay.com](https://explorer.apex.proofofplay.com/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | RARI Chain | 1000012617 | `0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615` | [mainnet.explorer.rarichain.org](https://mainnet.explorer.rarichain.org/address/0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615) | | re.al | 111188 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [explorer.re.al](https://explorer.re.al/address/0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D) | | Redstone | 690 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [explorer.redstone.xyz](https://explorer.redstone.xyz/address/0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D) | | Rivalz | 753 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [rivalz.calderaexplorer.xyz](https://rivalz.calderaexplorer.xyz/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Rootstock | 1000000030 | `0x96D51cc3f7500d501bAeB1A2a62BB96fa03532F8` | [rootstock.blockscout.com](https://rootstock.blockscout.com/address/0x96D51cc3f7500d501bAeB1A2a62BB96fa03532F8) | | Sanko | 1996 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.sanko.xyz](https://explorer.sanko.xyz/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Scroll | 534352 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [scrollscan.com](https://scrollscan.com//address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Sei | 1329 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [seitrace.com](https://seitrace.com/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Shibarium | 109 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [shibariumscan.io](https://shibariumscan.io/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | SnaxChain | 2192 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [explorer.snaxchain.io](https://explorer.snaxchain.io/address/0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7) | | Solana | 1399811149 | `E588QtVUvresuXq2KoNEwAmoifCzYGpRBdHByN9KQMbi` | [solscan.io](https://solscan.io/address/E588QtVUvresuXq2KoNEwAmoifCzYGpRBdHByN9KQMbi) | | Soneium | 1868 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [soneium.blockscout.com](https://soneium.blockscout.com/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Sonic | 146 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [sonicscan.org](https://sonicscan.org/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | SOON | 50075007 | `Mj7GE6LZiJUZFTgabmNkFoY2o6JCEwCMKopSUUC3kqj` | [explorer.soo.network](https://explorer.soo.network//address/Mj7GE6LZiJUZFTgabmNkFoY2o6JCEwCMKopSUUC3kqj) | | Superposition | 1000055244 | `0x5e8a0fCc0D1DF583322943e01F02cB243e5300f6` | [explorer.superposition.so](https://explorer.superposition.so//address/0x5e8a0fCc0D1DF583322943e01F02cB243e5300f6) | | Superseed | 5330 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.superseed.xyz](https://explorer.superseed.xyz/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Swell | 1923 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.swellnetwork.io](https://explorer.swellnetwork.io/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Taiko | 167000 | `0x28EFBCadA00A7ed6772b3666F3898d276e88CAe3` | [taikoscan.io](https://taikoscan.io/address/0x28EFBCadA00A7ed6772b3666F3898d276e88CAe3) | | Tangle | 5845 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.tangle.tools](https://explorer.tangle.tools/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Telos EVM | 40 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [www.teloscan.io](https://www.teloscan.io/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Torus | 21000 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [blockscout.torus.network](https://blockscout.torus.network/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Treasure | 61166 | `0x9BbDf86b272d224323136E15594fdCe487F40ce7` | [treasurescan.io](https://treasurescan.io/address/0x9BbDf86b272d224323136E15594fdCe487F40ce7) | | Unichain | 130 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [unichain.blockscout.com](https://unichain.blockscout.com/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Vana | 1480 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [vanascan.io](https://vanascan.io/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Viction | 88 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [www.vicscan.xyz](https://www.vicscan.xyz/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | World Chain | 480 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [worldchain-mainnet-explorer.alchemy.com](https://worldchain-mainnet-explorer.alchemy.com/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Xai | 660279 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.xai-chain.net](https://explorer.xai-chain.net/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | XLayer | 196 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [www.oklink.com](https://www.oklink.com/xlayer/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | XPLA | 37 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.xpla.io](https://explorer.xpla.io/mainnet/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Zero Network | 543210 | `0xd7b351D2dE3495eA259DD10ab4b9300A378Afbf3` | [zerion-explorer.vercel.app](https://zerion-explorer.vercel.app/address/0xd7b351D2dE3495eA259DD10ab4b9300A378Afbf3) | | ZetaChain | 7000 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.zetachain.com](https://explorer.zetachain.com/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Zircuit | 48900 | `0xc2FbB9411186AB3b1a6AFCCA702D1a80B48b197c` | [explorer.zircuit.com](https://explorer.zircuit.com/address/0xc2FbB9411186AB3b1a6AFCCA702D1a80B48b197c) | | zkLink Nova | 810180 | `0x9BbDf86b272d224323136E15594fdCe487F40ce7` | [explorer.zklink.io](https://explorer.zklink.io/address/0x9BbDf86b272d224323136E15594fdCe487F40ce7) | | zkSync | 324 | `0x6bD0A2214797Bc81e0b006F7B74d6221BcD8cb6E` | [explorer.zksync.io](https://explorer.zksync.io/address/0x6bD0A2214797Bc81e0b006F7B74d6221BcD8cb6E) | | Zora | 7777777 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [explorer.zora.energy](https://explorer.zora.energy/address/0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a) | | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Abstract Testnet | 11124 | `0x28f448885bEaaF662f8A9A6c9aF20fAd17A5a1DC` | [explorer.testnet.abs.xyz](https://explorer.testnet.abs.xyz/address/0x28f448885bEaaF662f8A9A6c9aF20fAd17A5a1DC) | | Aleph Zero EVM Testnet | 2039 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [evm-explorer-testnet.alephzero.org](https://evm-explorer-testnet.alephzero.org/address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | | Alfajores | 44787 | `0xEf9F292fcEBC3848bF4bB92a96a04F9ECBb78E59` | [explorer.celo.org](https://explorer.celo.org/alfajores/address/0xEf9F292fcEBC3848bF4bB92a96a04F9ECBb78E59) | | Arbitrum Sepolia | 421614 | `0x598facE78a4302f11E3de0bee1894Da0b2Cb71F8` | [sepolia.arbiscan.io](https://sepolia.arbiscan.io/address/0x598facE78a4302f11E3de0bee1894Da0b2Cb71F8) | | Arcadia Testnet v2 | 1098411886 | `0x33dB966328Ea213b0f76eF96CA368AB37779F065` | [explorer.khalani.network](https://explorer.khalani.network/address/0x33dB966328Ea213b0f76eF96CA368AB37779F065) | | Base Sepolia | 84532 | `0x6966b0E55883d49BFB24539356a2f8A673E02039` | [sepolia.basescan.org](https://sepolia.basescan.org/address/0x6966b0E55883d49BFB24539356a2f8A673E02039) | | Berachain bArtio | 80084 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [bartio.beratrail.io](https://bartio.beratrail.io//address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | | BSC Testnet | 97 | `0xF9F6F5646F478d5ab4e20B0F910C92F1CCC9Cc6D` | [testnet.bscscan.com](https://testnet.bscscan.com/address/0xF9F6F5646F478d5ab4e20B0F910C92F1CCC9Cc6D) | | Camp Network Testnet V2 | 325000 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [camp-network-testnet.blockscout.com](https://camp-network-testnet.blockscout.com/address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | | Citrea Testnet | 5115 | `0xB08d78F439e55D02C398519eef61606A5926245F` | [explorer.testnet.citrea.xyz](https://explorer.testnet.citrea.xyz/address/0xB08d78F439e55D02C398519eef61606A5926245F) | | Eco Testnet | 471923 | `0x6966b0E55883d49BFB24539356a2f8A673E02039` | [eco-testnet.explorer.caldera.xyz](https://eco-testnet.explorer.caldera.xyz//address/0x6966b0E55883d49BFB24539356a2f8A673E02039) | | Form Testnet | 132902 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [sepolia-explorer.form.network](https://sepolia-explorer.form.network/address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | | Fuji | 43113 | `0x5b6CFf85442B851A8e6eaBd2A4E4507B5135B3B0` | [testnet.snowtrace.io](https://testnet.snowtrace.io/address/0x5b6CFf85442B851A8e6eaBd2A4E4507B5135B3B0) | | Holesky | 17000 | `0x46f7C5D896bbeC89bE1B19e4485e59b4Be49e9Cc` | [holesky.etherscan.io](https://holesky.etherscan.io/address/0x46f7C5D896bbeC89bE1B19e4485e59b4Be49e9Cc) | | Hyperliquid EVM Testnet | 998 | `0x589C201a07c26b4725A4A829d772f24423da480B` | [explorer.hyperlend.finance](https://explorer.hyperlend.finance/address/0x589C201a07c26b4725A4A829d772f24423da480B) | | Ink Sepolia | 763373 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [explorer-sepolia.inkonchain.com](https://explorer-sepolia.inkonchain.com/address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | | Odyssey Testnet | 911867 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [odyssey-explorer.ithaca.xyz](https://odyssey-explorer.ithaca.xyz/address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | | Optimism Sepolia | 11155420 | `0x6966b0E55883d49BFB24539356a2f8A673E02039` | [sepolia-optimistic.etherscan.io](https://sepolia-optimistic.etherscan.io/address/0x6966b0E55883d49BFB24539356a2f8A673E02039) | | Plume Testnet | 161221135 | `0x33dB966328Ea213b0f76eF96CA368AB37779F065` | [plume-testnet.explorer.caldera.xyz](https://plume-testnet.explorer.caldera.xyz/address/0x33dB966328Ea213b0f76eF96CA368AB37779F065) | | Polygon Amoy | 80002 | `0x54148470292C24345fb828B003461a9444414517` | [amoy.polygonscan.com](https://amoy.polygonscan.com/address/0x54148470292C24345fb828B003461a9444414517) | | Scroll Sepolia | 534351 | `0x3C5154a193D6e2955650f9305c8d80c18C814A68` | [sepolia.scrollscan.dev](https://sepolia.scrollscan.dev//address/0x3C5154a193D6e2955650f9305c8d80c18C814A68) | | Sepolia | 11155111 | `0xfFAEF09B3cd11D9b20d1a19bECca54EEC2884766` | [sepolia.etherscan.io](https://sepolia.etherscan.io/address/0xfFAEF09B3cd11D9b20d1a19bECca54EEC2884766) | | Soneium Minato Testnet | 1946 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [explorer-testnet.soneium.org](https://explorer-testnet.soneium.org/address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | | Sonic Testnet | 64165 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [testnet.soniclabs.com](https://testnet.soniclabs.com/address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | | SUAVE Toliman Testnet | 33626250 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [explorer.toliman.suave.flashbots.net](https://explorer.toliman.suave.flashbots.net/address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | | Superposition Testnet | 98985 | `0x6966b0E55883d49BFB24539356a2f8A673E02039` | [testnet-explorer.superposition.so](https://testnet-explorer.superposition.so/address/0x6966b0E55883d49BFB24539356a2f8A673E02039) | | Tangle Testnet | 3799 | `0x87100b0E64B3baBD43F3FCB26A6edc4395e2D9df` | [testnet-explorer.tangle.tools](https://testnet-explorer.tangle.tools//address/0x87100b0E64B3baBD43F3FCB26A6edc4395e2D9df) | | Treasure Topaz Testnet | 978658 | `0x28f448885bEaaF662f8A9A6c9aF20fAd17A5a1DC` | [topaz.treasurescan.io](https://topaz.treasurescan.io/address/0x28f448885bEaaF662f8A9A6c9aF20fAd17A5a1DC) | | Unichain Testnet | 1301 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [unichain-sepolia.blockscout.com](https://unichain-sepolia.blockscout.com/address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | Interchain Gas Paymaster (Hook)[​](#interchain-gas-paymaster-hook "Direct link to Interchain Gas Paymaster (Hook)") -------------------------------------------------------------------------------------------------------------------- * Mainnet * Testnet | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Aleph Zero EVM | 1000041455 | `0x9c2214467Daf9e2e1F45b36d08ce0b9C65BFeA88` | [evm-explorer.alephzero.org](https://evm-explorer.alephzero.org/address/0x9c2214467Daf9e2e1F45b36d08ce0b9C65BFeA88) | | Ancient8 | 888888888 | `0x8F1E22d309baa69D398a03cc88E9b46037e988AA` | [scan.ancient8.gg](https://scan.ancient8.gg/address/0x8F1E22d309baa69D398a03cc88E9b46037e988AA) | | ApeChain | 33139 | `0x18B0688990720103dB63559a3563f7E8d0f63EDb` | [apechain.calderaexplorer.xyz](https://apechain.calderaexplorer.xyz/address/0x18B0688990720103dB63559a3563f7E8d0f63EDb) | | AppChain | 466 | `0x28291a7062afA569104bEd52F7AcCA3dD2FafD11` | [explorer.appchain.xyz](https://explorer.appchain.xyz/address/0x28291a7062afA569104bEd52F7AcCA3dD2FafD11) | | Arbitrum | 42161 | `0x3b6044acd6767f017e99318AA6Ef93b7B06A5a22` | [arbiscan.io](https://arbiscan.io/address/0x3b6044acd6767f017e99318AA6Ef93b7B06A5a22) | | Arbitrum Nova | 42170 | `0x145566181A18E23bB6a8A3eC6D87765542A7F754` | [nova.arbiscan.io](https://nova.arbiscan.io//address/0x145566181A18E23bB6a8A3eC6D87765542A7F754) | | Artela | 11820 | `0xc2466492C451E1AE49d8C874bB9f89293Aaad59b` | [artscan.artela.network](https://artscan.artela.network/address/0xc2466492C451E1AE49d8C874bB9f89293Aaad59b) | | Arthera | 10242 | `0xFb7D175d6F53800D68D32C3Fe1416807A394cC24` | [explorer.arthera.net](https://explorer.arthera.net/address/0xFb7D175d6F53800D68D32C3Fe1416807A394cC24) | | Astar | 592 | `0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd` | [astar.blockscout.com](https://astar.blockscout.com/address/0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd) | | Astar zkEVM | 3776 | `0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd` | [astar-zkevm.explorer.startale.com](https://astar-zkevm.explorer.startale.com/address/0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd) | | Aurora | 1313161554 | `0xc0C2dB448fC2c84213394Fcb93a3C467e50ECa9E` | [explorer.mainnet.aurora.dev](https://explorer.mainnet.aurora.dev/address/0xc0C2dB448fC2c84213394Fcb93a3C467e50ECa9E) | | Avalanche | 43114 | `0x95519ba800BBd0d34eeAE026fEc620AD978176C0` | [snowtrace.io](https://snowtrace.io/address/0x95519ba800BBd0d34eeAE026fEc620AD978176C0) | | B3 | 8333 | `0x145566181A18E23bB6a8A3eC6D87765542A7F754` | [explorer.b3.fun](https://explorer.b3.fun/address/0x145566181A18E23bB6a8A3eC6D87765542A7F754) | | Base | 8453 | `0xc3F23848Ed2e04C0c6d41bd7804fa8f89F940B94` | [basescan.org](https://basescan.org/address/0xc3F23848Ed2e04C0c6d41bd7804fa8f89F940B94) | | Bitlayer | 200901 | `0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd` | [www.btrscan.com](https://www.btrscan.com/address/0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd) | | Blast | 81457 | `0xB3fCcD379ad66CED0c91028520C64226611A48c9` | [blastexplorer.io](https://blastexplorer.io/address/0xB3fCcD379ad66CED0c91028520C64226611A48c9) | | BOB | 60808 | `0x62B7592C1B6D1E43f4630B8e37f4377097840C05` | [explorer.gobob.xyz](https://explorer.gobob.xyz/address/0x62B7592C1B6D1E43f4630B8e37f4377097840C05) | | Boba Mainnet | 288 | `0x9534122Aae7978dB8f5f10dF4432233c53e820A1` | [bobascan.com](https://bobascan.com/address/0x9534122Aae7978dB8f5f10dF4432233c53e820A1) | | Binance Smart Chain | 56 | `0x78E25e7f84416e69b9339B0A6336EB6EFfF6b451` | [bscscan.com](https://bscscan.com/address/0x78E25e7f84416e69b9339B0A6336EB6EFfF6b451) | | B² Network | 223 | `0x70EbA87Cd15616f32C736B3f3BdCfaeD0713a82B` | [explorer.bsquared.network](https://explorer.bsquared.network/address/0x70EbA87Cd15616f32C736B3f3BdCfaeD0713a82B) | | Celo | 42220 | `0x571f1435613381208477ac5d6974310d88AC7cB7` | [celoscan.io](https://celoscan.io/address/0x571f1435613381208477ac5d6974310d88AC7cB7) | | CheeseChain | 383353 | `0x7E27456a839BFF31CA642c060a2b68414Cb6e503` | [fetascan.xyz](https://fetascan.xyz/address/0x7E27456a839BFF31CA642c060a2b68414Cb6e503) | | Chiliz | 1000088888 | `0x561BcA8D862536CD9C88f332C1A1Da0fC8F96e40` | [chiliscan.com](https://chiliscan.com/address/0x561BcA8D862536CD9C88f332C1A1Da0fC8F96e40) | | Conflux eSpace | 1030 | `0xDf178647caB5e0222F4B53C57274FD2A03BEaed6` | [evm.confluxscan.net](https://evm.confluxscan.net/address/0xDf178647caB5e0222F4B53C57274FD2A03BEaed6) | | Conwai | 668668 | `0xDf178647caB5e0222F4B53C57274FD2A03BEaed6` | [conwai.calderaexplorer.xyz](https://conwai.calderaexplorer.xyz/address/0xDf178647caB5e0222F4B53C57274FD2A03BEaed6) | | Core | 1116 | `0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd` | [scan.coredao.org](https://scan.coredao.org/address/0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd) | | Corn | 21000000 | `0xDf178647caB5e0222F4B53C57274FD2A03BEaed6` | [cornscan.io](https://cornscan.io/address/0xDf178647caB5e0222F4B53C57274FD2A03BEaed6) | | Cyber | 7560 | `0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF` | [cyberscan.co](https://cyberscan.co/address/0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF) | | Degen | 666666666 | `0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF` | [explorer.degen.tips](https://explorer.degen.tips/address/0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF) | | Dogechain | 2000 | `0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd` | [explorer.dogechain.dog](https://explorer.dogechain.dog/address/0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd) | | DuckChain | 5545 | `0x9534122Aae7978dB8f5f10dF4432233c53e820A1` | [scan.duckchain.io](https://scan.duckchain.io/address/0x9534122Aae7978dB8f5f10dF4432233c53e820A1) | | Eclipse | 1408864445 | `ABb3i11z7wKoGCfeRQNQbVYWjAm7jG7HzZnDLV4RKRbK` | [explorer.eclipse.xyz](https://explorer.eclipse.xyz//address/ABb3i11z7wKoGCfeRQNQbVYWjAm7jG7HzZnDLV4RKRbK) | | Endurance | 648 | `0xB30EAB08aa87138D57168D0e236850A530f49921` | [explorer-endurance.fusionist.io](https://explorer-endurance.fusionist.io/address/0xB30EAB08aa87138D57168D0e236850A530f49921) | | Ethereum | 1 | `0x9e6B1022bE9BBF5aFd152483DAD9b88911bC8611` | [etherscan.io](https://etherscan.io/address/0x9e6B1022bE9BBF5aFd152483DAD9b88911bC8611) | | Everclear | 25327 | `0xb58257cc81E47EC72fD38aE16297048de23163b4` | [scan.everclear.org](https://scan.everclear.org/address/0xb58257cc81E47EC72fD38aE16297048de23163b4) | | Evmos EVM | 9001 | `0xDf178647caB5e0222F4B53C57274FD2A03BEaed6` | [www.mintscan.io](https://www.mintscan.io/evmos/address/0xDf178647caB5e0222F4B53C57274FD2A03BEaed6) | | Fantom Opera | 250 | `0x145566181A18E23bB6a8A3eC6D87765542A7F754` | [ftmscan.com](https://ftmscan.com/address/0x145566181A18E23bB6a8A3eC6D87765542A7F754) | | Flame | 253368190 | `0x61374178e45F65fF9D6252d017Cd580FC60B7654` | [explorer.flame.astria.org](https://explorer.flame.astria.org/address/0x61374178e45F65fF9D6252d017Cd580FC60B7654) | | Flare | 14 | `0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd` | [flare-explorer.flare.network](https://flare-explorer.flare.network/address/0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd) | | EVM on Flow | 1000000747 | `0x6AA10748a036a49Cb290C0e12B77319b76792D5E` | [evm.flowscan.io](https://evm.flowscan.io/address/0x6AA10748a036a49Cb290C0e12B77319b76792D5E) | | Form | 478 | `0xDf178647caB5e0222F4B53C57274FD2A03BEaed6` | [explorer.form.network](https://explorer.form.network/address/0xDf178647caB5e0222F4B53C57274FD2A03BEaed6) | | Fraxtal | 252 | `0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E` | [fraxscan.com](https://fraxscan.com/address/0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E) | | Fuse | 122 | `0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed` | [explorer.fuse.io](https://explorer.fuse.io/address/0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed) | | Gnosis | 100 | `0xDd260B99d302f0A3fF885728c086f729c06f227f` | [gnosisscan.io](https://gnosisscan.io/address/0xDd260B99d302f0A3fF885728c086f729c06f227f) | | Gravity Alpha Mainnet | 1625 | `0xf3dFf6747E7FC74B431C943961054B7BF6309d8a` | [explorer.gravity.xyz](https://explorer.gravity.xyz/address/0xf3dFf6747E7FC74B431C943961054B7BF6309d8a) | | Guru Network | 260 | `0xA9D06082F4AA449D95b49D85F27fdC0cFb491d4b` | [blockscout.gurunetwork.ai](https://blockscout.gurunetwork.ai/address/0xA9D06082F4AA449D95b49D85F27fdC0cFb491d4b) | | Harmony One | 1666600000 | `0x145566181A18E23bB6a8A3eC6D87765542A7F754` | [explorer.harmony.one](https://explorer.harmony.one/address/0x145566181A18E23bB6a8A3eC6D87765542A7F754) | | Hemi Network | 43111 | `0xc2466492C451E1AE49d8C874bB9f89293Aaad59b` | [explorer.hemi.xyz](https://explorer.hemi.xyz/address/0xc2466492C451E1AE49d8C874bB9f89293Aaad59b) | | Immutable zkEVM | 1000013371 | `0xc6835e52C1b976F1ebC71Bc8919738E02849FdA9` | [explorer.immutable.com](https://explorer.immutable.com/address/0xc6835e52C1b976F1ebC71Bc8919738E02849FdA9) | | Injective EVM | 2525 | `0x19dc38aeae620380430C200a6E990D5Af5480117` | [inevm.calderaexplorer.xyz](https://inevm.calderaexplorer.xyz/address/0x19dc38aeae620380430C200a6E990D5Af5480117) | | Injective | 6909546 | `0x27ae52298e5b53b34b7ae0ca63e05845c31e1f59` | [www.mintscan.io](https://www.mintscan.io/injective/address/0x27ae52298e5b53b34b7ae0ca63e05845c31e1f59) | | Ink | 57073 | `0xc0C2dB448fC2c84213394Fcb93a3C467e50ECa9E` | [explorer.inkonchain.com](https://explorer.inkonchain.com/address/0xc0C2dB448fC2c84213394Fcb93a3C467e50ECa9E) | | Kaia | 8217 | `0x145566181A18E23bB6a8A3eC6D87765542A7F754` | [kaiascope.com](https://kaiascope.com/address/0x145566181A18E23bB6a8A3eC6D87765542A7F754) | | Kroma | 255 | `0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF` | [blockscout.kroma.network](https://blockscout.kroma.network/address/0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF) | | Linea | 59144 | `0x8105a095368f1a184CceA86cCe21318B5Ee5BE28` | [lineascan.build](https://lineascan.build/address/0x8105a095368f1a184CceA86cCe21318B5Ee5BE28) | | Lisk | 1135 | `0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF` | [blockscout.lisk.com](https://blockscout.lisk.com/address/0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF) | | LUKSO | 42 | `0x441a01Fca2eD731C0Fc4633998332f9FEDB17575` | [explorer.execution.mainnet.lukso.network](https://explorer.execution.mainnet.lukso.network/address/0x441a01Fca2eD731C0Fc4633998332f9FEDB17575) | | Lumia Prism | 1000073017 | `0xb7C9307fE90B9AB093c6D3EdeE3259f5378D5f03` | [explorer.lumia.org](https://explorer.lumia.org/address/0xb7C9307fE90B9AB093c6D3EdeE3259f5378D5f03) | | Manta Pacific | 169 | `0x0D63128D887159d63De29497dfa45AFc7C699AE4` | [pacific-explorer.manta.network](https://pacific-explorer.manta.network/address/0x0D63128D887159d63De29497dfa45AFc7C699AE4) | | Mantle | 5000 | `0x8105a095368f1a184CceA86cCe21318B5Ee5BE28` | [explorer.mantle.xyz](https://explorer.mantle.xyz/address/0x8105a095368f1a184CceA86cCe21318B5Ee5BE28) | | Merlin | 4200 | `0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF` | [scan.merlinchain.io](https://scan.merlinchain.io/address/0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF) | | Metal L2 | 1000001750 | `0x2b79328DA089E89A9E9c08732b56dd31F01011Db` | [explorer.metall2.com](https://explorer.metall2.com/address/0x2b79328DA089E89A9E9c08732b56dd31F01011Db) | | Metis Andromeda | 1088 | `0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF` | [andromeda-explorer.metis.io](https://andromeda-explorer.metis.io/address/0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF) | | Mint | 185 | `0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF` | [explorer.mintchain.io](https://explorer.mintchain.io/address/0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF) | | Mode | 34443 | `0x931dFCc8c1141D6F532FD023bd87DAe0080c835d` | [explorer.mode.network](https://explorer.mode.network/address/0x931dFCc8c1141D6F532FD023bd87DAe0080c835d) | | Molten | 360 | `0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd` | [molten.calderaexplorer.xyz](https://molten.calderaexplorer.xyz/address/0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd) | | Moonbeam | 1284 | `0x14760E32C0746094cF14D97124865BC7F0F7368F` | [moonscan.io](https://moonscan.io/address/0x14760E32C0746094cF14D97124865BC7F0F7368F) | | Morph | 2818 | `0x145566181A18E23bB6a8A3eC6D87765542A7F754` | [explorer.morphl2.io](https://explorer.morphl2.io/address/0x145566181A18E23bB6a8A3eC6D87765542A7F754) | | Nero | 1689 | `0xc2466492C451E1AE49d8C874bB9f89293Aaad59b` | [www.neroscan.io](https://www.neroscan.io/address/0xc2466492C451E1AE49d8C874bB9f89293Aaad59b) | | Neutron | 1853125230 | `0x738a4454e066c3bcb48cb0f03dca1c69b3c3d5ffa4f4470096083f0680a169ac` | [www.mintscan.io](https://www.mintscan.io/neutron/address/0x738a4454e066c3bcb48cb0f03dca1c69b3c3d5ffa4f4470096083f0680a169ac) | | Oort | 970 | `0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86` | [mainnet-scan.oortech.com](https://mainnet-scan.oortech.com/address/0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86) | | Optimism | 10 | `0xD8A76C4D91fCbB7Cc8eA795DFDF870E48368995C` | [optimistic.etherscan.io](https://optimistic.etherscan.io/address/0xD8A76C4D91fCbB7Cc8eA795DFDF870E48368995C) | | Orderly L2 | 291 | `0x145566181A18E23bB6a8A3eC6D87765542A7F754` | [explorer.orderly.network](https://explorer.orderly.network/address/0x145566181A18E23bB6a8A3eC6D87765542A7F754) | | Polygon | 137 | `0x0071740Bf129b05C4684abfbBeD248D80971cce2` | [polygonscan.com](https://polygonscan.com/address/0x0071740Bf129b05C4684abfbBeD248D80971cce2) | | Polygon zkEVM | 1101 | `0x0D63128D887159d63De29497dfa45AFc7C699AE4` | [zkevm.polygonscan.com](https://zkevm.polygonscan.com/address/0x0D63128D887159d63De29497dfa45AFc7C699AE4) | | Polynomial | 1000008008 | `0x2f536FB7a37bd817Af644072a904Ddc02Dae429f` | [polynomialscan.io](https://polynomialscan.io/address/0x2f536FB7a37bd817Af644072a904Ddc02Dae429f) | | Prom | 227 | `0x282629Af1A2f9b8e2c5Cbc54C35C7989f21950c6` | [prom-blockscout.eu-north-2.gateway.fm](https://prom-blockscout.eu-north-2.gateway.fm/address/0x282629Af1A2f9b8e2c5Cbc54C35C7989f21950c6) | | Proof of Play Apex | 70700 | `0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF` | [explorer.apex.proofofplay.com](https://explorer.apex.proofofplay.com/address/0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF) | | RARI Chain | 1000012617 | `0xDDE46032Baf4da13fDD79BF9dfbaA2749615C409` | [mainnet.explorer.rarichain.org](https://mainnet.explorer.rarichain.org/address/0xDDE46032Baf4da13fDD79BF9dfbaA2749615C409) | | re.al | 111188 | `0x3071D4DA6020C956Fe15Bfd0a9Ca8D4574f16696` | [explorer.re.al](https://explorer.re.al/address/0x3071D4DA6020C956Fe15Bfd0a9Ca8D4574f16696) | | Redstone | 690 | `0x2Fa570E83009eaEef3a1cbd496a9a30F05266634` | [explorer.redstone.xyz](https://explorer.redstone.xyz/address/0x2Fa570E83009eaEef3a1cbd496a9a30F05266634) | | Rivalz | 753 | `0x3cECBa60A580dE20CC57D87528953a00f4ED99EA` | [rivalz.calderaexplorer.xyz](https://rivalz.calderaexplorer.xyz/address/0x3cECBa60A580dE20CC57D87528953a00f4ED99EA) | | Rootstock | 1000000030 | `0x5ae1ECA065aC8ee92Ce98E584fc3CE43070020e7` | [rootstock.blockscout.com](https://rootstock.blockscout.com/address/0x5ae1ECA065aC8ee92Ce98E584fc3CE43070020e7) | | Sanko | 1996 | `0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF` | [explorer.sanko.xyz](https://explorer.sanko.xyz/address/0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF) | | Scroll | 534352 | `0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2` | [scrollscan.com](https://scrollscan.com//address/0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2) | | Sei | 1329 | `0xFC62DeF1f08793aBf0E67f69257c6be258194F72` | [seitrace.com](https://seitrace.com/address/0xFC62DeF1f08793aBf0E67f69257c6be258194F72) | | Shibarium | 109 | `0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd` | [shibariumscan.io](https://shibariumscan.io/address/0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd) | | SnaxChain | 2192 | `0x145566181A18E23bB6a8A3eC6D87765542A7F754` | [explorer.snaxchain.io](https://explorer.snaxchain.io/address/0x145566181A18E23bB6a8A3eC6D87765542A7F754) | | Solana | 1399811149 | `JAvHW21tYXE9dtdG83DReqU2b4LUexFuCbtJT5tF8X6M` | [solscan.io](https://solscan.io/address/JAvHW21tYXE9dtdG83DReqU2b4LUexFuCbtJT5tF8X6M) | | Soneium | 1868 | `0xDf178647caB5e0222F4B53C57274FD2A03BEaed6` | [soneium.blockscout.com](https://soneium.blockscout.com/address/0xDf178647caB5e0222F4B53C57274FD2A03BEaed6) | | Sonic | 146 | `0xDf178647caB5e0222F4B53C57274FD2A03BEaed6` | [sonicscan.org](https://sonicscan.org/address/0xDf178647caB5e0222F4B53C57274FD2A03BEaed6) | | SOON | 50075007 | `Dsem8R6mkrpNoNb6CRUEjEZRP2hKRC24thyCkVr8cNYZ` | [explorer.soo.network](https://explorer.soo.network//address/Dsem8R6mkrpNoNb6CRUEjEZRP2hKRC24thyCkVr8cNYZ) | | Superposition | 1000055244 | `0xa1c3884EbE24Cccb120B2E98a55f85140563aa4C` | [explorer.superposition.so](https://explorer.superposition.so//address/0xa1c3884EbE24Cccb120B2E98a55f85140563aa4C) | | Superseed | 5330 | `0x9534122Aae7978dB8f5f10dF4432233c53e820A1` | [explorer.superseed.xyz](https://explorer.superseed.xyz/address/0x9534122Aae7978dB8f5f10dF4432233c53e820A1) | | Swell | 1923 | `0x25EAC2007b0D40E3f0AF112FD346412321038719` | [explorer.swellnetwork.io](https://explorer.swellnetwork.io/address/0x25EAC2007b0D40E3f0AF112FD346412321038719) | | Taiko | 167000 | `0x273Bc6b01D9E88c064b6E5e409BdF998246AEF42` | [taikoscan.io](https://taikoscan.io/address/0x273Bc6b01D9E88c064b6E5e409BdF998246AEF42) | | Tangle | 5845 | `0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF` | [explorer.tangle.tools](https://explorer.tangle.tools/address/0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF) | | Telos EVM | 40 | `0xDf178647caB5e0222F4B53C57274FD2A03BEaed6` | [www.teloscan.io](https://www.teloscan.io/address/0xDf178647caB5e0222F4B53C57274FD2A03BEaed6) | | Torus | 21000 | `0x3cECBa60A580dE20CC57D87528953a00f4ED99EA` | [blockscout.torus.network](https://blockscout.torus.network/address/0x3cECBa60A580dE20CC57D87528953a00f4ED99EA) | | Treasure | 61166 | `0x388289cd5862e17AAfD6ffF7F46A9Ec48a969bCd` | [treasurescan.io](https://treasurescan.io/address/0x388289cd5862e17AAfD6ffF7F46A9Ec48a969bCd) | | Unichain | 130 | `0x9534122Aae7978dB8f5f10dF4432233c53e820A1` | [unichain.blockscout.com](https://unichain.blockscout.com/address/0x9534122Aae7978dB8f5f10dF4432233c53e820A1) | | Vana | 1480 | `0x9534122Aae7978dB8f5f10dF4432233c53e820A1` | [vanascan.io](https://vanascan.io/address/0x9534122Aae7978dB8f5f10dF4432233c53e820A1) | | Viction | 88 | `0x0D63128D887159d63De29497dfa45AFc7C699AE4` | [www.vicscan.xyz](https://www.vicscan.xyz/address/0x0D63128D887159d63De29497dfa45AFc7C699AE4) | | World Chain | 480 | `0x7E27456a839BFF31CA642c060a2b68414Cb6e503` | [worldchain-mainnet-explorer.alchemy.com](https://worldchain-mainnet-explorer.alchemy.com/address/0x7E27456a839BFF31CA642c060a2b68414Cb6e503) | | Xai | 660279 | `0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF` | [explorer.xai-chain.net](https://explorer.xai-chain.net/address/0x9844aFFaBE17c37F791ff99ABa58B0FbB75e22AF) | | XLayer | 196 | `0x7E27456a839BFF31CA642c060a2b68414Cb6e503` | [www.oklink.com](https://www.oklink.com/xlayer/address/0x7E27456a839BFF31CA642c060a2b68414Cb6e503) | | XPLA | 37 | `0x8F23872dAb3B166cef411EeB6C391Ff6Ce419532` | [explorer.xpla.io](https://explorer.xpla.io/mainnet/address/0x8F23872dAb3B166cef411EeB6C391Ff6Ce419532) | | Zero Network | 543210 | `0x318FbdB17d4e743aBF3183658a4730777101B75C` | [zerion-explorer.vercel.app](https://zerion-explorer.vercel.app/address/0x318FbdB17d4e743aBF3183658a4730777101B75C) | | ZetaChain | 7000 | `0x931dFCc8c1141D6F532FD023bd87DAe0080c835d` | [explorer.zetachain.com](https://explorer.zetachain.com/address/0x931dFCc8c1141D6F532FD023bd87DAe0080c835d) | | Zircuit | 48900 | `0x03cF708E42C89623bd83B281A56935cB562b9258` | [explorer.zircuit.com](https://explorer.zircuit.com/address/0x03cF708E42C89623bd83B281A56935cB562b9258) | | zkLink Nova | 810180 | `0xB35eCb9714e8f48332Af22B48C18ca21E2607438` | [explorer.zklink.io](https://explorer.zklink.io/address/0xB35eCb9714e8f48332Af22B48C18ca21E2607438) | | zkSync | 324 | `0xf44AdA86a1f765A938d404699B8070Dd47bD2431` | [explorer.zksync.io](https://explorer.zksync.io/address/0xf44AdA86a1f765A938d404699B8070Dd47bD2431) | | Zora | 7777777 | `0x18B0688990720103dB63559a3563f7E8d0f63EDb` | [explorer.zora.energy](https://explorer.zora.energy/address/0x18B0688990720103dB63559a3563f7E8d0f63EDb) | | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Abstract Testnet | 11124 | `0xbAaE1B4e953190b05C757F69B2F6C46b9548fa4f` | [explorer.testnet.abs.xyz](https://explorer.testnet.abs.xyz/address/0xbAaE1B4e953190b05C757F69B2F6C46b9548fa4f) | | Aleph Zero EVM Testnet | 2039 | `0x867f2089D09903f208AeCac84E599B90E5a4A821` | [evm-explorer-testnet.alephzero.org](https://evm-explorer-testnet.alephzero.org/address/0x867f2089D09903f208AeCac84E599B90E5a4A821) | | Alfajores | 44787 | `0x44769b0f4a6f01339e131a691cc2eebbb519d297` | [explorer.celo.org](https://explorer.celo.org/alfajores/address/0x44769b0f4a6f01339e131a691cc2eebbb519d297) | | Arbitrum Sepolia | 421614 | `0xc756cFc1b7d0d4646589EDf10eD54b201237F5e8` | [sepolia.arbiscan.io](https://sepolia.arbiscan.io/address/0xc756cFc1b7d0d4646589EDf10eD54b201237F5e8) | | Arcadia Testnet v2 | 1098411886 | `0xfBeaF07855181f8476B235Cf746A7DF3F9e386Fb` | [explorer.khalani.network](https://explorer.khalani.network/address/0xfBeaF07855181f8476B235Cf746A7DF3F9e386Fb) | | Base Sepolia | 84532 | `0x28B02B97a850872C4D33C3E024fab6499ad96564` | [sepolia.basescan.org](https://sepolia.basescan.org/address/0x28B02B97a850872C4D33C3E024fab6499ad96564) | | Berachain bArtio | 80084 | `0x04438ef7622f5412f82915F59caD4f704C61eA48` | [bartio.beratrail.io](https://bartio.beratrail.io//address/0x04438ef7622f5412f82915F59caD4f704C61eA48) | | BSC Testnet | 97 | `0x0dD20e410bdB95404f71c5a4e7Fa67B892A5f949` | [testnet.bscscan.com](https://testnet.bscscan.com/address/0x0dD20e410bdB95404f71c5a4e7Fa67B892A5f949) | | Camp Network Testnet V2 | 325000 | `0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8` | [camp-network-testnet.blockscout.com](https://camp-network-testnet.blockscout.com/address/0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8) | | Citrea Testnet | 5115 | `0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A` | [explorer.testnet.citrea.xyz](https://explorer.testnet.citrea.xyz/address/0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A) | | Eco Testnet | 471923 | `0x28B02B97a850872C4D33C3E024fab6499ad96564` | [eco-testnet.explorer.caldera.xyz](https://eco-testnet.explorer.caldera.xyz//address/0x28B02B97a850872C4D33C3E024fab6499ad96564) | | Form Testnet | 132902 | `0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8` | [sepolia-explorer.form.network](https://sepolia-explorer.form.network/address/0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8) | | Fuji | 43113 | `0x6895d3916B94b386fAA6ec9276756e16dAe7480E` | [testnet.snowtrace.io](https://testnet.snowtrace.io/address/0x6895d3916B94b386fAA6ec9276756e16dAe7480E) | | Holesky | 17000 | `0x5CBf4e70448Ed46c2616b04e9ebc72D29FF0cfA9` | [holesky.etherscan.io](https://holesky.etherscan.io/address/0x5CBf4e70448Ed46c2616b04e9ebc72D29FF0cfA9) | | Hyperliquid EVM Testnet | 998 | `0x11918DC33E067C5DA83EEF58E50F856398b8Df4C` | [explorer.hyperlend.finance](https://explorer.hyperlend.finance/address/0x11918DC33E067C5DA83EEF58E50F856398b8Df4C) | | Ink Sepolia | 763373 | `0x54Bd02f0f20677e9846F8E9FdB1Abc7315C49C38` | [explorer-sepolia.inkonchain.com](https://explorer-sepolia.inkonchain.com/address/0x54Bd02f0f20677e9846F8E9FdB1Abc7315C49C38) | | Odyssey Testnet | 911867 | `0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f` | [odyssey-explorer.ithaca.xyz](https://odyssey-explorer.ithaca.xyz/address/0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f) | | Optimism Sepolia | 11155420 | `0x28B02B97a850872C4D33C3E024fab6499ad96564` | [sepolia-optimistic.etherscan.io](https://sepolia-optimistic.etherscan.io/address/0x28B02B97a850872C4D33C3E024fab6499ad96564) | | Plume Testnet | 161221135 | `0x28B02B97a850872C4D33C3E024fab6499ad96564` | [plume-testnet.explorer.caldera.xyz](https://plume-testnet.explorer.caldera.xyz/address/0x28B02B97a850872C4D33C3E024fab6499ad96564) | | Polygon Amoy | 80002 | `0x6c13643B3927C57DB92c790E4E3E7Ee81e13f78C` | [amoy.polygonscan.com](https://amoy.polygonscan.com/address/0x6c13643B3927C57DB92c790E4E3E7Ee81e13f78C) | | Scroll Sepolia | 534351 | `0x86fb9F1c124fB20ff130C41a79a432F770f67AFD` | [sepolia.scrollscan.dev](https://sepolia.scrollscan.dev//address/0x86fb9F1c124fB20ff130C41a79a432F770f67AFD) | | Sepolia | 11155111 | `0x6f2756380FD49228ae25Aa7F2817993cB74Ecc56` | [sepolia.etherscan.io](https://sepolia.etherscan.io/address/0x6f2756380FD49228ae25Aa7F2817993cB74Ecc56) | | Soneium Minato Testnet | 1946 | `0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8` | [explorer-testnet.soneium.org](https://explorer-testnet.soneium.org/address/0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8) | | Sonic Testnet | 64165 | `0xa3AB7E6cE24E6293bD5320A53329Ef2f4DE73fCA` | [testnet.soniclabs.com](https://testnet.soniclabs.com/address/0xa3AB7E6cE24E6293bD5320A53329Ef2f4DE73fCA) | | SUAVE Toliman Testnet | 33626250 | `0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8` | [explorer.toliman.suave.flashbots.net](https://explorer.toliman.suave.flashbots.net/address/0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8) | | Superposition Testnet | 98985 | `0xeC7eb4196Bd601DEa7585A744FbFB4CF11278450` | [testnet-explorer.superposition.so](https://testnet-explorer.superposition.so/address/0xeC7eb4196Bd601DEa7585A744FbFB4CF11278450) | | Treasure Topaz Testnet | 978658 | `0xbAaE1B4e953190b05C757F69B2F6C46b9548fa4f` | [topaz.treasurescan.io](https://topaz.treasurescan.io/address/0xbAaE1B4e953190b05C757F69B2F6C46b9548fa4f) | | Unichain Testnet | 1301 | `0xa3AB7E6cE24E6293bD5320A53329Ef2f4DE73fCA` | [unichain-sepolia.blockscout.com](https://unichain-sepolia.blockscout.com/address/0xa3AB7E6cE24E6293bD5320A53329Ef2f4DE73fCA) | Storage Gas Oracle[​](#storage-gas-oracle "Direct link to Storage Gas Oracle") ------------------------------------------------------------------------------- * Mainnet * Testnet | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Aleph Zero EVM | 1000041455 | `0xDd260B99d302f0A3fF885728c086f729c06f227f` | [evm-explorer.alephzero.org](https://evm-explorer.alephzero.org/address/0xDd260B99d302f0A3fF885728c086f729c06f227f) | | Ancient8 | 888888888 | `0x59Bf7c7b458375b1A7c453aE70EaCb376E65CDAF` | [scan.ancient8.gg](https://scan.ancient8.gg/address/0x59Bf7c7b458375b1A7c453aE70EaCb376E65CDAF) | | ApeChain | 33139 | `0xF1854214392864c628A16930E73B699f7a51b3EE` | [apechain.calderaexplorer.xyz](https://apechain.calderaexplorer.xyz/address/0xF1854214392864c628A16930E73B699f7a51b3EE) | | AppChain | 466 | `0xA376b27212D608324808923Add679A2c9FAFe9Da` | [explorer.appchain.xyz](https://explorer.appchain.xyz/address/0xA376b27212D608324808923Add679A2c9FAFe9Da) | | Arbitrum | 42161 | `0xD3805207b65d99C075ceA938Fa7c0587026a5DF5` | [arbiscan.io](https://arbiscan.io/address/0xD3805207b65d99C075ceA938Fa7c0587026a5DF5) | | Arbitrum Nova | 42170 | `0x2F619Ac5122689180AeBB930ADccdae215d538a9` | [nova.arbiscan.io](https://nova.arbiscan.io//address/0x2F619Ac5122689180AeBB930ADccdae215d538a9) | | Artela | 11820 | `0x60515f328B2c55Df63f456D9D839a0082892dEf8` | [artscan.artela.network](https://artscan.artela.network/address/0x60515f328B2c55Df63f456D9D839a0082892dEf8) | | Arthera | 10242 | `0x8d9Bd7E9ec3cd799a659EE650DfF6C799309fA91` | [explorer.arthera.net](https://explorer.arthera.net/address/0x8d9Bd7E9ec3cd799a659EE650DfF6C799309fA91) | | Astar | 592 | `0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0` | [astar.blockscout.com](https://astar.blockscout.com/address/0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0) | | Astar zkEVM | 3776 | `0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0` | [astar-zkevm.explorer.startale.com](https://astar-zkevm.explorer.startale.com/address/0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0) | | Aurora | 1313161554 | `0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7` | [explorer.mainnet.aurora.dev](https://explorer.mainnet.aurora.dev/address/0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7) | | Avalanche | 43114 | `0x175821F30AdCAA4bbB72Ce98eF76C2E0De2C3f21` | [snowtrace.io](https://snowtrace.io/address/0x175821F30AdCAA4bbB72Ce98eF76C2E0De2C3f21) | | B3 | 8333 | `0x2F619Ac5122689180AeBB930ADccdae215d538a9` | [explorer.b3.fun](https://explorer.b3.fun/address/0x2F619Ac5122689180AeBB930ADccdae215d538a9) | | Base | 8453 | `0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2` | [basescan.org](https://basescan.org/address/0xBF12ef4B9f307463D3FB59c3604F294dDCe287E2) | | Bitlayer | 200901 | `0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0` | [www.btrscan.com](https://www.btrscan.com/address/0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0) | | Blast | 81457 | `0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0` | [blastexplorer.io](https://blastexplorer.io/address/0xBDa330Ea8F3005C421C8088e638fBB64fA71b9e0) | | BOB | 60808 | `0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E` | [explorer.gobob.xyz](https://explorer.gobob.xyz/address/0x2Fca7f6eC3d4A0408900f2BB30004d4616eE985E) | | Boba Mainnet | 288 | `0xbb0AE51BCa526cF313b6a95BfaB020794af6C394` | [bobascan.com](https://bobascan.com/address/0xbb0AE51BCa526cF313b6a95BfaB020794af6C394) | | Binance Smart Chain | 56 | `0x91d23D603d60445411C06e6443d81395593B7940` | [bscscan.com](https://bscscan.com/address/0x91d23D603d60445411C06e6443d81395593B7940) | | B² Network | 223 | `0x451dF8AB0936D85526D816f0b4dCaDD934A034A4` | [explorer.bsquared.network](https://explorer.bsquared.network/address/0x451dF8AB0936D85526D816f0b4dCaDD934A034A4) | | Celo | 42220 | `0xD9A9966E7dA9a7f0032bF449FB12696a638E673C` | [celoscan.io](https://celoscan.io/address/0xD9A9966E7dA9a7f0032bF449FB12696a638E673C) | | CheeseChain | 383353 | `0xe4057c5B0c43Dc18E36b08C39B419F190D29Ac2d` | [fetascan.xyz](https://fetascan.xyz/address/0xe4057c5B0c43Dc18E36b08C39B419F190D29Ac2d) | | Chiliz | 1000088888 | `0x87ED6926abc9E38b9C7C19f835B41943b622663c` | [chiliscan.com](https://chiliscan.com/address/0x87ED6926abc9E38b9C7C19f835B41943b622663c) | | Conflux eSpace | 1030 | `0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2` | [evm.confluxscan.net](https://evm.confluxscan.net/address/0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2) | | Conwai | 668668 | `0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2` | [conwai.calderaexplorer.xyz](https://conwai.calderaexplorer.xyz/address/0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2) | | Core | 1116 | `0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0` | [scan.coredao.org](https://scan.coredao.org/address/0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0) | | Corn | 21000000 | `0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2` | [cornscan.io](https://cornscan.io/address/0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2) | | Cyber | 7560 | `0x7b2e996742fA42d223652A344252B725D1bC428C` | [cyberscan.co](https://cyberscan.co/address/0x7b2e996742fA42d223652A344252B725D1bC428C) | | Degen | 666666666 | `0x7b2e996742fA42d223652A344252B725D1bC428C` | [explorer.degen.tips](https://explorer.degen.tips/address/0x7b2e996742fA42d223652A344252B725D1bC428C) | | Dogechain | 2000 | `0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0` | [explorer.dogechain.dog](https://explorer.dogechain.dog/address/0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0) | | DuckChain | 5545 | `0xbb0AE51BCa526cF313b6a95BfaB020794af6C394` | [scan.duckchain.io](https://scan.duckchain.io/address/0xbb0AE51BCa526cF313b6a95BfaB020794af6C394) | | Endurance | 648 | `0xe243Fb51d91c5DE62afAbE44F7Ed2D4DC51668C6` | [explorer-endurance.fusionist.io](https://explorer-endurance.fusionist.io/address/0xe243Fb51d91c5DE62afAbE44F7Ed2D4DC51668C6) | | Ethereum | 1 | `0xc9a103990A8dB11b4f627bc5CD1D0c2685484Ec5` | [etherscan.io](https://etherscan.io/address/0xc9a103990A8dB11b4f627bc5CD1D0c2685484Ec5) | | Everclear | 25327 | `0xf8344D85a1429708e0BE6724218E938087e596DF` | [scan.everclear.org](https://scan.everclear.org/address/0xf8344D85a1429708e0BE6724218E938087e596DF) | | Evmos EVM | 9001 | `0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2` | [www.mintscan.io](https://www.mintscan.io/evmos/address/0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2) | | Fantom Opera | 250 | `0x2F619Ac5122689180AeBB930ADccdae215d538a9` | [ftmscan.com](https://ftmscan.com/address/0x2F619Ac5122689180AeBB930ADccdae215d538a9) | | Flame | 253368190 | `0x18B0688990720103dB63559a3563f7E8d0f63EDb` | [explorer.flame.astria.org](https://explorer.flame.astria.org/address/0x18B0688990720103dB63559a3563f7E8d0f63EDb) | | Flare | 14 | `0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0` | [flare-explorer.flare.network](https://flare-explorer.flare.network/address/0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0) | | EVM on Flow | 1000000747 | `0xa2554A53890c0E769e3fa8b9A0b7e72F6A617367` | [evm.flowscan.io](https://evm.flowscan.io/address/0xa2554A53890c0E769e3fa8b9A0b7e72F6A617367) | | Form | 478 | `0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2` | [explorer.form.network](https://explorer.form.network/address/0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2) | | Fraxtal | 252 | `0x5060eCD5dFAD300A90592C04e504600A7cdcF70b` | [fraxscan.com](https://fraxscan.com/address/0x5060eCD5dFAD300A90592C04e504600A7cdcF70b) | | Fuse | 122 | `0x61374178e45F65fF9D6252d017Cd580FC60B7654` | [explorer.fuse.io](https://explorer.fuse.io/address/0x61374178e45F65fF9D6252d017Cd580FC60B7654) | | Gnosis | 100 | `0x5E01d8F34b629E3f92d69546bbc4142A7Adee7e9` | [gnosisscan.io](https://gnosisscan.io/address/0x5E01d8F34b629E3f92d69546bbc4142A7Adee7e9) | | Gravity Alpha Mainnet | 1625 | `0xD0dca420feFda68537695A8D887080eeF4030AF7` | [explorer.gravity.xyz](https://explorer.gravity.xyz/address/0xD0dca420feFda68537695A8D887080eeF4030AF7) | | Guru Network | 260 | `0x93D41E41cA545a35A81d11b08D2eE8b852C768df` | [blockscout.gurunetwork.ai](https://blockscout.gurunetwork.ai/address/0x93D41E41cA545a35A81d11b08D2eE8b852C768df) | | Harmony One | 1666600000 | `0x2F619Ac5122689180AeBB930ADccdae215d538a9` | [explorer.harmony.one](https://explorer.harmony.one/address/0x2F619Ac5122689180AeBB930ADccdae215d538a9) | | Hemi Network | 43111 | `0x60515f328B2c55Df63f456D9D839a0082892dEf8` | [explorer.hemi.xyz](https://explorer.hemi.xyz/address/0x60515f328B2c55Df63f456D9D839a0082892dEf8) | | Immutable zkEVM | 1000013371 | `0x9c2214467Daf9e2e1F45b36d08ce0b9C65BFeA88` | [explorer.immutable.com](https://explorer.immutable.com/address/0x9c2214467Daf9e2e1F45b36d08ce0b9C65BFeA88) | | Injective EVM | 2525 | `0x6119E37Bd66406A1Db74920aC79C15fB8411Ba76` | [inevm.calderaexplorer.xyz](https://inevm.calderaexplorer.xyz/address/0x6119E37Bd66406A1Db74920aC79C15fB8411Ba76) | | Ink | 57073 | `0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7` | [explorer.inkonchain.com](https://explorer.inkonchain.com/address/0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7) | | Kaia | 8217 | `0x2F619Ac5122689180AeBB930ADccdae215d538a9` | [kaiascope.com](https://kaiascope.com/address/0x2F619Ac5122689180AeBB930ADccdae215d538a9) | | Kroma | 255 | `0x7b2e996742fA42d223652A344252B725D1bC428C` | [blockscout.kroma.network](https://blockscout.kroma.network/address/0x7b2e996742fA42d223652A344252B725D1bC428C) | | Linea | 59144 | `0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB` | [lineascan.build](https://lineascan.build/address/0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB) | | Lisk | 1135 | `0x7b2e996742fA42d223652A344252B725D1bC428C` | [blockscout.lisk.com](https://blockscout.lisk.com/address/0x7b2e996742fA42d223652A344252B725D1bC428C) | | LUKSO | 42 | `0x5F954cA945671e48466680eA815727948Ca340ef` | [explorer.execution.mainnet.lukso.network](https://explorer.execution.mainnet.lukso.network/address/0x5F954cA945671e48466680eA815727948Ca340ef) | | Lumia Prism | 1000073017 | `0x3c38fC01159E7BE0685653A0C896eA49F2BAa7c1` | [explorer.lumia.org](https://explorer.lumia.org/address/0x3c38fC01159E7BE0685653A0C896eA49F2BAa7c1) | | Manta Pacific | 169 | `0x19dc38aeae620380430C200a6E990D5Af5480117` | [pacific-explorer.manta.network](https://pacific-explorer.manta.network/address/0x19dc38aeae620380430C200a6E990D5Af5480117) | | Mantle | 5000 | `0xf9DbC8776Bc2812c4DBEc45383A1783Ac758Fb55` | [explorer.mantle.xyz](https://explorer.mantle.xyz/address/0xf9DbC8776Bc2812c4DBEc45383A1783Ac758Fb55) | | Merlin | 4200 | `0xc965292958794f59ec3e9538738dD252873F07CC` | [scan.merlinchain.io](https://scan.merlinchain.io/address/0xc965292958794f59ec3e9538738dD252873F07CC) | | Metal L2 | 1000001750 | `0xE7487b4DF583c63D6841997ab56324D0a825e7F4` | [explorer.metall2.com](https://explorer.metall2.com/address/0xE7487b4DF583c63D6841997ab56324D0a825e7F4) | | Metis Andromeda | 1088 | `0x7b2e996742fA42d223652A344252B725D1bC428C` | [andromeda-explorer.metis.io](https://andromeda-explorer.metis.io/address/0x7b2e996742fA42d223652A344252B725D1bC428C) | | Mint | 185 | `0x7b2e996742fA42d223652A344252B725D1bC428C` | [explorer.mintchain.io](https://explorer.mintchain.io/address/0x7b2e996742fA42d223652A344252B725D1bC428C) | | Mode | 34443 | `0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465` | [explorer.mode.network](https://explorer.mode.network/address/0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465) | | Molten | 360 | `0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0` | [molten.calderaexplorer.xyz](https://molten.calderaexplorer.xyz/address/0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0) | | Moonbeam | 1284 | `0x448b7ADB0dA36d41AA2AfDc9d63b97541A7b3819` | [moonscan.io](https://moonscan.io/address/0x448b7ADB0dA36d41AA2AfDc9d63b97541A7b3819) | | Morph | 2818 | `0x2F619Ac5122689180AeBB930ADccdae215d538a9` | [explorer.morphl2.io](https://explorer.morphl2.io/address/0x2F619Ac5122689180AeBB930ADccdae215d538a9) | | Nero | 1689 | `0x60515f328B2c55Df63f456D9D839a0082892dEf8` | [www.neroscan.io](https://www.neroscan.io/address/0x60515f328B2c55Df63f456D9D839a0082892dEf8) | | Oort | 970 | `0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67` | [mainnet-scan.oortech.com](https://mainnet-scan.oortech.com/address/0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67) | | Optimism | 10 | `0x27e88AeB8EA4B159d81df06355Ea3d20bEB1de38` | [optimistic.etherscan.io](https://optimistic.etherscan.io/address/0x27e88AeB8EA4B159d81df06355Ea3d20bEB1de38) | | Orderly L2 | 291 | `0x2F619Ac5122689180AeBB930ADccdae215d538a9` | [explorer.orderly.network](https://explorer.orderly.network/address/0x2F619Ac5122689180AeBB930ADccdae215d538a9) | | Polygon | 137 | `0xA3a24EC5670F1F416AB9fD554FcE2f226AE9D7eB` | [polygonscan.com](https://polygonscan.com/address/0xA3a24EC5670F1F416AB9fD554FcE2f226AE9D7eB) | | Polygon zkEVM | 1101 | `0x19dc38aeae620380430C200a6E990D5Af5480117` | [zkevm.polygonscan.com](https://zkevm.polygonscan.com/address/0x19dc38aeae620380430C200a6E990D5Af5480117) | | Polynomial | 1000008008 | `0x2b79328DA089E89A9E9c08732b56dd31F01011Db` | [polynomialscan.io](https://polynomialscan.io/address/0x2b79328DA089E89A9E9c08732b56dd31F01011Db) | | Prom | 227 | `0x33E0c225A54a0A86E9B267e90A90DE8CBb0fDB8f` | [prom-blockscout.eu-north-2.gateway.fm](https://prom-blockscout.eu-north-2.gateway.fm/address/0x33E0c225A54a0A86E9B267e90A90DE8CBb0fDB8f) | | Proof of Play Apex | 70700 | `0x7b2e996742fA42d223652A344252B725D1bC428C` | [explorer.apex.proofofplay.com](https://explorer.apex.proofofplay.com/address/0x7b2e996742fA42d223652A344252B725D1bC428C) | | RARI Chain | 1000012617 | `0x16625230dD6cFe1B2bec3eCaEc7d43bA3A902CD6` | [mainnet.explorer.rarichain.org](https://mainnet.explorer.rarichain.org/address/0x16625230dD6cFe1B2bec3eCaEc7d43bA3A902CD6) | | re.al | 111188 | `0x40Ca055683d9aA603f73EDcb62874a1BaAa1d6dA` | [explorer.re.al](https://explorer.re.al/address/0x40Ca055683d9aA603f73EDcb62874a1BaAa1d6dA) | | Redstone | 690 | `0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa` | [explorer.redstone.xyz](https://explorer.redstone.xyz/address/0x6Fae4D9935E2fcb11fC79a64e917fb2BF14DaFaa) | | Rivalz | 753 | `0x248aDe14C0489E20C9a7Fea5F86DBfC3702208eF` | [rivalz.calderaexplorer.xyz](https://rivalz.calderaexplorer.xyz/address/0x248aDe14C0489E20C9a7Fea5F86DBfC3702208eF) | | Rootstock | 1000000030 | `0xa36172F79a248C24693a208b0CEF0e7D6FB995F0` | [rootstock.blockscout.com](https://rootstock.blockscout.com/address/0xa36172F79a248C24693a208b0CEF0e7D6FB995F0) | | Sanko | 1996 | `0x7b2e996742fA42d223652A344252B725D1bC428C` | [explorer.sanko.xyz](https://explorer.sanko.xyz/address/0x7b2e996742fA42d223652A344252B725D1bC428C) | | Scroll | 534352 | `0x481171eb1aad17eDE6a56005B7F1aB00C581ef13` | [scrollscan.com](https://scrollscan.com//address/0x481171eb1aad17eDE6a56005B7F1aB00C581ef13) | | Sei | 1329 | `0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4` | [seitrace.com](https://seitrace.com/address/0x26f32245fCF5Ad53159E875d5Cae62aEcf19c2d4) | | Shibarium | 109 | `0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0` | [shibariumscan.io](https://shibariumscan.io/address/0xA38D1D7F217A52A27b0e6BF50E0a9ddAD05798C0) | | SnaxChain | 2192 | `0x2F619Ac5122689180AeBB930ADccdae215d538a9` | [explorer.snaxchain.io](https://explorer.snaxchain.io/address/0x2F619Ac5122689180AeBB930ADccdae215d538a9) | | Soneium | 1868 | `0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2` | [soneium.blockscout.com](https://soneium.blockscout.com/address/0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2) | | Sonic | 146 | `0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2` | [sonicscan.org](https://sonicscan.org/address/0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2) | | Superposition | 1000055244 | `0xc4D0b4ef01eD7091792fe3D4c039457719e2DC68` | [explorer.superposition.so](https://explorer.superposition.so//address/0xc4D0b4ef01eD7091792fe3D4c039457719e2DC68) | | Superseed | 5330 | `0xbb0AE51BCa526cF313b6a95BfaB020794af6C394` | [explorer.superseed.xyz](https://explorer.superseed.xyz/address/0xbb0AE51BCa526cF313b6a95BfaB020794af6C394) | | Swell | 1923 | `0xCDeb368Db32ecCefaf7018e152DA9120565cb572` | [explorer.swellnetwork.io](https://explorer.swellnetwork.io/address/0xCDeb368Db32ecCefaf7018e152DA9120565cb572) | | Taiko | 167000 | `0x7556a0E61d577D921Cba8Fca0d7D6299d36E607E` | [taikoscan.io](https://taikoscan.io/address/0x7556a0E61d577D921Cba8Fca0d7D6299d36E607E) | | Tangle | 5845 | `0x7b2e996742fA42d223652A344252B725D1bC428C` | [explorer.tangle.tools](https://explorer.tangle.tools/address/0x7b2e996742fA42d223652A344252B725D1bC428C) | | Telos EVM | 40 | `0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2` | [www.teloscan.io](https://www.teloscan.io/address/0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2) | | Torus | 21000 | `0x248aDe14C0489E20C9a7Fea5F86DBfC3702208eF` | [blockscout.torus.network](https://blockscout.torus.network/address/0x248aDe14C0489E20C9a7Fea5F86DBfC3702208eF) | | Treasure | 61166 | `0xc364cfedefE854c1275B0f4088EaFA9695e1FC56` | [treasurescan.io](https://treasurescan.io/address/0xc364cfedefE854c1275B0f4088EaFA9695e1FC56) | | Unichain | 130 | `0xbb0AE51BCa526cF313b6a95BfaB020794af6C394` | [unichain.blockscout.com](https://unichain.blockscout.com/address/0xbb0AE51BCa526cF313b6a95BfaB020794af6C394) | | Vana | 1480 | `0xbb0AE51BCa526cF313b6a95BfaB020794af6C394` | [vanascan.io](https://vanascan.io/address/0xbb0AE51BCa526cF313b6a95BfaB020794af6C394) | | Viction | 88 | `0x19dc38aeae620380430C200a6E990D5Af5480117` | [www.vicscan.xyz](https://www.vicscan.xyz/address/0x19dc38aeae620380430C200a6E990D5Af5480117) | | World Chain | 480 | `0xe4057c5B0c43Dc18E36b08C39B419F190D29Ac2d` | [worldchain-mainnet-explorer.alchemy.com](https://worldchain-mainnet-explorer.alchemy.com/address/0xe4057c5B0c43Dc18E36b08C39B419F190D29Ac2d) | | Xai | 660279 | `0x7b2e996742fA42d223652A344252B725D1bC428C` | [explorer.xai-chain.net](https://explorer.xai-chain.net/address/0x7b2e996742fA42d223652A344252B725D1bC428C) | | XLayer | 196 | `0xe4057c5B0c43Dc18E36b08C39B419F190D29Ac2d` | [www.oklink.com](https://www.oklink.com/xlayer/address/0xe4057c5B0c43Dc18E36b08C39B419F190D29Ac2d) | | XPLA | 37 | `0xc2466492C451E1AE49d8C874bB9f89293Aaad59b` | [explorer.xpla.io](https://explorer.xpla.io/mainnet/address/0xc2466492C451E1AE49d8C874bB9f89293Aaad59b) | | Zero Network | 543210 | `0xe85d65f04D1562f8571d57326d6798e4584aa254` | [zerion-explorer.vercel.app](https://zerion-explorer.vercel.app/address/0xe85d65f04D1562f8571d57326d6798e4584aa254) | | ZetaChain | 7000 | `0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465` | [explorer.zetachain.com](https://explorer.zetachain.com/address/0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465) | | Zircuit | 48900 | `0x46fa3A5780e5B90Eaf34BDED554d5353B5ABE9E7` | [explorer.zircuit.com](https://explorer.zircuit.com/address/0x46fa3A5780e5B90Eaf34BDED554d5353B5ABE9E7) | | zkLink Nova | 810180 | `0x73a82061Cd258d02BEa145fe183120456e718c2A` | [explorer.zklink.io](https://explorer.zklink.io/address/0x73a82061Cd258d02BEa145fe183120456e718c2A) | | zkSync | 324 | `0x37f4afe769087738f0577A77ffA24abef6fCBF99` | [explorer.zksync.io](https://explorer.zksync.io/address/0x37f4afe769087738f0577A77ffA24abef6fCBF99) | | Zora | 7777777 | `0xF1854214392864c628A16930E73B699f7a51b3EE` | [explorer.zora.energy](https://explorer.zora.energy/address/0xF1854214392864c628A16930E73B699f7a51b3EE) | | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Abstract Testnet | 11124 | `0x5F1bADC7e28B9b4C98f58dB4e5841e5bf63A7A52` | [explorer.testnet.abs.xyz](https://explorer.testnet.abs.xyz/address/0x5F1bADC7e28B9b4C98f58dB4e5841e5bf63A7A52) | | Aleph Zero EVM Testnet | 2039 | `0x4fE19d49F45854Da50b6009258929613EC92C147` | [evm-explorer-testnet.alephzero.org](https://evm-explorer-testnet.alephzero.org/address/0x4fE19d49F45854Da50b6009258929613EC92C147) | | Alfajores | 44787 | `0x8356113754C7aCa297Db3089b89F87CC125499fb` | [explorer.celo.org](https://explorer.celo.org/alfajores/address/0x8356113754C7aCa297Db3089b89F87CC125499fb) | | Arbitrum Sepolia | 421614 | `0xddf4C3e791caCaFd26D7fb275549739B38ae6e75` | [sepolia.arbiscan.io](https://sepolia.arbiscan.io/address/0xddf4C3e791caCaFd26D7fb275549739B38ae6e75) | | Arcadia Testnet v2 | 1098411886 | `0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f` | [explorer.khalani.network](https://explorer.khalani.network/address/0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f) | | Base Sepolia | 84532 | `0x5821f3B6eE05F3dC62b43B74AB1C8F8E6904b1C8` | [sepolia.basescan.org](https://sepolia.basescan.org/address/0x5821f3B6eE05F3dC62b43B74AB1C8F8E6904b1C8) | | Berachain bArtio | 80084 | `0xeAEfB1458b032e75de3e9A3a480d005c426FB1c5` | [bartio.beratrail.io](https://bartio.beratrail.io//address/0xeAEfB1458b032e75de3e9A3a480d005c426FB1c5) | | BSC Testnet | 97 | `0x124EBCBC018A5D4Efe639f02ED86f95cdC3f6498` | [testnet.bscscan.com](https://testnet.bscscan.com/address/0x124EBCBC018A5D4Efe639f02ED86f95cdC3f6498) | | Camp Network Testnet V2 | 325000 | `0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE` | [camp-network-testnet.blockscout.com](https://camp-network-testnet.blockscout.com/address/0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE) | | Citrea Testnet | 5115 | `0xae7a78916Ba4c507aCB2F0e474ace545Ff4bF841` | [explorer.testnet.citrea.xyz](https://explorer.testnet.citrea.xyz/address/0xae7a78916Ba4c507aCB2F0e474ace545Ff4bF841) | | Eco Testnet | 471923 | `0x5821f3B6eE05F3dC62b43B74AB1C8F8E6904b1C8` | [eco-testnet.explorer.caldera.xyz](https://eco-testnet.explorer.caldera.xyz//address/0x5821f3B6eE05F3dC62b43B74AB1C8F8E6904b1C8) | | Form Testnet | 132902 | `0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE` | [sepolia-explorer.form.network](https://sepolia-explorer.form.network/address/0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE) | | Fuji | 43113 | `0x9305dE34306886d615B096Bdf23b94a978f6a6c0` | [testnet.snowtrace.io](https://testnet.snowtrace.io/address/0x9305dE34306886d615B096Bdf23b94a978f6a6c0) | | Holesky | 17000 | `0x2b2a158B4059C840c7aC67399B153bb567D06303` | [holesky.etherscan.io](https://holesky.etherscan.io/address/0x2b2a158B4059C840c7aC67399B153bb567D06303) | | Hyperliquid EVM Testnet | 998 | `0x783c4a0bB6663359281aD4a637D5af68F83ae213` | [explorer.hyperlend.finance](https://explorer.hyperlend.finance/address/0x783c4a0bB6663359281aD4a637D5af68F83ae213) | | Ink Sepolia | 763373 | `0xE67CfA164cDa449Ae38a0a09391eF6bCDf8e4e2c` | [explorer-sepolia.inkonchain.com](https://explorer-sepolia.inkonchain.com/address/0xE67CfA164cDa449Ae38a0a09391eF6bCDf8e4e2c) | | Odyssey Testnet | 911867 | `0xB5fB1F5410a2c2b7deD462d018541383968cB01c` | [odyssey-explorer.ithaca.xyz](https://odyssey-explorer.ithaca.xyz/address/0xB5fB1F5410a2c2b7deD462d018541383968cB01c) | | Optimism Sepolia | 11155420 | `0x5821f3B6eE05F3dC62b43B74AB1C8F8E6904b1C8` | [sepolia-optimistic.etherscan.io](https://sepolia-optimistic.etherscan.io/address/0x5821f3B6eE05F3dC62b43B74AB1C8F8E6904b1C8) | | Plume Testnet | 161221135 | `0x267B6B6eAf6790faE5D5E9070F28a9cE64CbF279` | [plume-testnet.explorer.caldera.xyz](https://plume-testnet.explorer.caldera.xyz/address/0x267B6B6eAf6790faE5D5E9070F28a9cE64CbF279) | | Polygon Amoy | 80002 | `0xD0680F80F4f947968206806C2598Cbc5b6FE5b03` | [amoy.polygonscan.com](https://amoy.polygonscan.com/address/0xD0680F80F4f947968206806C2598Cbc5b6FE5b03) | | Scroll Sepolia | 534351 | `0x6b1bb4ce664Bb4164AEB4d3D2E7DE7450DD8084C` | [sepolia.scrollscan.dev](https://sepolia.scrollscan.dev//address/0x6b1bb4ce664Bb4164AEB4d3D2E7DE7450DD8084C) | | Sepolia | 11155111 | `0x71775B071F77F1ce52Ece810ce084451a3045FFe` | [sepolia.etherscan.io](https://sepolia.etherscan.io/address/0x71775B071F77F1ce52Ece810ce084451a3045FFe) | | Soneium Minato Testnet | 1946 | `0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE` | [explorer-testnet.soneium.org](https://explorer-testnet.soneium.org/address/0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE) | | Sonic Testnet | 64165 | `0x7c5B5bdA7F1d1F70A6678ABb4d894612Fc76498F` | [testnet.soniclabs.com](https://testnet.soniclabs.com/address/0x7c5B5bdA7F1d1F70A6678ABb4d894612Fc76498F) | | SUAVE Toliman Testnet | 33626250 | `0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE` | [explorer.toliman.suave.flashbots.net](https://explorer.toliman.suave.flashbots.net/address/0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE) | | Superposition Testnet | 98985 | `0xF7561c34f17A32D5620583A3397C304e7038a7F6` | [testnet-explorer.superposition.so](https://testnet-explorer.superposition.so/address/0xF7561c34f17A32D5620583A3397C304e7038a7F6) | | Treasure Topaz Testnet | 978658 | `0x5F1bADC7e28B9b4C98f58dB4e5841e5bf63A7A52` | [topaz.treasurescan.io](https://topaz.treasurescan.io/address/0x5F1bADC7e28B9b4C98f58dB4e5841e5bf63A7A52) | | Unichain Testnet | 1301 | `0x7c5B5bdA7F1d1F70A6678ABb4d894612Fc76498F` | [unichain-sepolia.blockscout.com](https://unichain-sepolia.blockscout.com/address/0x7c5B5bdA7F1d1F70A6678ABb4d894612Fc76498F) | Merkle Tree (Hook)[​](#merkle-tree-hook "Direct link to Merkle Tree (Hook)") ----------------------------------------------------------------------------- * Mainnet * Testnet | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Aleph Zero EVM | 1000041455 | `0x2684C6F89E901987E1FdB7649dC5Be0c57C61645` | [evm-explorer.alephzero.org](https://evm-explorer.alephzero.org/address/0x2684C6F89E901987E1FdB7649dC5Be0c57C61645) | | Ancient8 | 888888888 | `0x811808Dd29ba8B0FC6C0ec0b5537035E59745162` | [scan.ancient8.gg](https://scan.ancient8.gg/address/0x811808Dd29ba8B0FC6C0ec0b5537035E59745162) | | ApeChain | 33139 | `0x886BB0f329781b98f98FDeb1ce7a8957F2d43B9F` | [apechain.calderaexplorer.xyz](https://apechain.calderaexplorer.xyz/address/0x886BB0f329781b98f98FDeb1ce7a8957F2d43B9F) | | AppChain | 466 | `0xcd90D49b046772F710250b9119117169CB2e4D8b` | [explorer.appchain.xyz](https://explorer.appchain.xyz/address/0xcd90D49b046772F710250b9119117169CB2e4D8b) | | Arbitrum | 42161 | `0x748040afB89B8FdBb992799808215419d36A0930` | [arbiscan.io](https://arbiscan.io/address/0x748040afB89B8FdBb992799808215419d36A0930) | | Arbitrum Nova | 42170 | `0x6963480b05EB58f4d624B014ab92e9aD4d21df6D` | [nova.arbiscan.io](https://nova.arbiscan.io//address/0x6963480b05EB58f4d624B014ab92e9aD4d21df6D) | | Artela | 11820 | `0x7B032cBB00AD7438E802A66D8b64761A06E5df22` | [artscan.artela.network](https://artscan.artela.network/address/0x7B032cBB00AD7438E802A66D8b64761A06E5df22) | | Arthera | 10242 | `0xdA629E1B79e3420ECd1e80571aDd6a4a3b13AE79` | [explorer.arthera.net](https://explorer.arthera.net/address/0xdA629E1B79e3420ECd1e80571aDd6a4a3b13AE79) | | Astar | 592 | `0x441a01Fca2eD731C0Fc4633998332f9FEDB17575` | [astar.blockscout.com](https://astar.blockscout.com/address/0x441a01Fca2eD731C0Fc4633998332f9FEDB17575) | | Astar zkEVM | 3776 | `0x441a01Fca2eD731C0Fc4633998332f9FEDB17575` | [astar-zkevm.explorer.startale.com](https://astar-zkevm.explorer.startale.com/address/0x441a01Fca2eD731C0Fc4633998332f9FEDB17575) | | Aurora | 1313161554 | `0xA8A311B69f688c1D9928259D872C31ca0d473642` | [explorer.mainnet.aurora.dev](https://explorer.mainnet.aurora.dev/address/0xA8A311B69f688c1D9928259D872C31ca0d473642) | | Avalanche | 43114 | `0x84eea61D679F42D92145fA052C89900CBAccE95A` | [snowtrace.io](https://snowtrace.io/address/0x84eea61D679F42D92145fA052C89900CBAccE95A) | | B3 | 8333 | `0x6963480b05EB58f4d624B014ab92e9aD4d21df6D` | [explorer.b3.fun](https://explorer.b3.fun/address/0x6963480b05EB58f4d624B014ab92e9aD4d21df6D) | | Base | 8453 | `0x19dc38aeae620380430C200a6E990D5Af5480117` | [basescan.org](https://basescan.org/address/0x19dc38aeae620380430C200a6E990D5Af5480117) | | Bitlayer | 200901 | `0x441a01Fca2eD731C0Fc4633998332f9FEDB17575` | [www.btrscan.com](https://www.btrscan.com/address/0x441a01Fca2eD731C0Fc4633998332f9FEDB17575) | | Blast | 81457 | `0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465` | [blastexplorer.io](https://blastexplorer.io/address/0xC9B8ea6230d6687a4b13fD3C0b8f0Ec607B26465) | | BOB | 60808 | `0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB` | [explorer.gobob.xyz](https://explorer.gobob.xyz/address/0x781bE492F1232E66990d83a9D3AC3Ec26f56DAfB) | | Boba Mainnet | 288 | `0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47` | [bobascan.com](https://bobascan.com/address/0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47) | | Binance Smart Chain | 56 | `0xFDb9Cd5f9daAA2E4474019405A328a88E7484f26` | [bscscan.com](https://bscscan.com/address/0xFDb9Cd5f9daAA2E4474019405A328a88E7484f26) | | B² Network | 223 | `0xbb0AE51BCa526cF313b6a95BfaB020794af6C394` | [explorer.bsquared.network](https://explorer.bsquared.network/address/0xbb0AE51BCa526cF313b6a95BfaB020794af6C394) | | Celo | 42220 | `0x04dB778f05854f26E67e0a66b740BBbE9070D366` | [celoscan.io](https://celoscan.io/address/0x04dB778f05854f26E67e0a66b740BBbE9070D366) | | CheeseChain | 383353 | `0x0054D19613f20dD72721A146ED408971a2CCA9BD` | [fetascan.xyz](https://fetascan.xyz/address/0x0054D19613f20dD72721A146ED408971a2CCA9BD) | | Chiliz | 1000088888 | `0x9c2214467Daf9e2e1F45b36d08ce0b9C65BFeA88` | [chiliscan.com](https://chiliscan.com/address/0x9c2214467Daf9e2e1F45b36d08ce0b9C65BFeA88) | | Conflux eSpace | 1030 | `0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6` | [evm.confluxscan.net](https://evm.confluxscan.net/address/0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6) | | Conwai | 668668 | `0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6` | [conwai.calderaexplorer.xyz](https://conwai.calderaexplorer.xyz/address/0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6) | | Core | 1116 | `0x441a01Fca2eD731C0Fc4633998332f9FEDB17575` | [scan.coredao.org](https://scan.coredao.org/address/0x441a01Fca2eD731C0Fc4633998332f9FEDB17575) | | Corn | 21000000 | `0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6` | [cornscan.io](https://cornscan.io/address/0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6) | | Cyber | 7560 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [cyberscan.co](https://cyberscan.co/address/0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a) | | Degen | 666666666 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [explorer.degen.tips](https://explorer.degen.tips/address/0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a) | | Dogechain | 2000 | `0x441a01Fca2eD731C0Fc4633998332f9FEDB17575` | [explorer.dogechain.dog](https://explorer.dogechain.dog/address/0x441a01Fca2eD731C0Fc4633998332f9FEDB17575) | | DuckChain | 5545 | `0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47` | [scan.duckchain.io](https://scan.duckchain.io/address/0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47) | | Eclipse | 1408864445 | `EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y` | [explorer.eclipse.xyz](https://explorer.eclipse.xyz//address/EitxJuv2iBjsg2d7jVy2LDC1e2zBrx4GB5Y9h2Ko3A9Y) | | Endurance | 648 | `0xC831271c1fB212012811a91Dd43e5926C1020563` | [explorer-endurance.fusionist.io](https://explorer-endurance.fusionist.io/address/0xC831271c1fB212012811a91Dd43e5926C1020563) | | Ethereum | 1 | `0x48e6c30B97748d1e2e03bf3e9FbE3890ca5f8CCA` | [etherscan.io](https://etherscan.io/address/0x48e6c30B97748d1e2e03bf3e9FbE3890ca5f8CCA) | | Everclear | 25327 | `0xCC3D1659D50461d27a2F025dDb2c9B06B584B7e1` | [scan.everclear.org](https://scan.everclear.org/address/0xCC3D1659D50461d27a2F025dDb2c9B06B584B7e1) | | Evmos EVM | 9001 | `0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6` | [www.mintscan.io](https://www.mintscan.io/evmos/address/0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6) | | Fantom Opera | 250 | `0x6963480b05EB58f4d624B014ab92e9aD4d21df6D` | [ftmscan.com](https://ftmscan.com/address/0x6963480b05EB58f4d624B014ab92e9aD4d21df6D) | | Flame | 253368190 | `0xEe08043cf22c80b27BF24d19999231dF4a3fC256` | [explorer.flame.astria.org](https://explorer.flame.astria.org/address/0xEe08043cf22c80b27BF24d19999231dF4a3fC256) | | Flare | 14 | `0x441a01Fca2eD731C0Fc4633998332f9FEDB17575` | [flare-explorer.flare.network](https://flare-explorer.flare.network/address/0x441a01Fca2eD731C0Fc4633998332f9FEDB17575) | | EVM on Flow | 1000000747 | `0x2783D98CC073dbcDa90241C804d16982D3d75821` | [evm.flowscan.io](https://evm.flowscan.io/address/0x2783D98CC073dbcDa90241C804d16982D3d75821) | | Form | 478 | `0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6` | [explorer.form.network](https://explorer.form.network/address/0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6) | | Fraxtal | 252 | `0x8358D8291e3bEDb04804975eEa0fe9fe0fAfB147` | [fraxscan.com](https://fraxscan.com/address/0x8358D8291e3bEDb04804975eEa0fe9fe0fAfB147) | | Fuse | 122 | `0xfBc08389224d23b79cb21cDc16c5d42F0ad0F57f` | [explorer.fuse.io](https://explorer.fuse.io/address/0xfBc08389224d23b79cb21cDc16c5d42F0ad0F57f) | | Gnosis | 100 | `0x2684C6F89E901987E1FdB7649dC5Be0c57C61645` | [gnosisscan.io](https://gnosisscan.io/address/0x2684C6F89E901987E1FdB7649dC5Be0c57C61645) | | Gravity Alpha Mainnet | 1625 | `0x5090dF2FBDa7127c7aDa41f60B79F5c55D380Dd8` | [explorer.gravity.xyz](https://explorer.gravity.xyz/address/0x5090dF2FBDa7127c7aDa41f60B79F5c55D380Dd8) | | Guru Network | 260 | `0x11b76D93a9D39Eb51F54eBf5566308640cDe882b` | [blockscout.gurunetwork.ai](https://blockscout.gurunetwork.ai/address/0x11b76D93a9D39Eb51F54eBf5566308640cDe882b) | | Harmony One | 1666600000 | `0x6963480b05EB58f4d624B014ab92e9aD4d21df6D` | [explorer.harmony.one](https://explorer.harmony.one/address/0x6963480b05EB58f4d624B014ab92e9aD4d21df6D) | | Hemi Network | 43111 | `0x7B032cBB00AD7438E802A66D8b64761A06E5df22` | [explorer.hemi.xyz](https://explorer.hemi.xyz/address/0x7B032cBB00AD7438E802A66D8b64761A06E5df22) | | Immutable zkEVM | 1000013371 | `0xdAa1B65547fB969c9ff5678956AB2FF9771B883D` | [explorer.immutable.com](https://explorer.immutable.com/address/0xdAa1B65547fB969c9ff5678956AB2FF9771B883D) | | Injective EVM | 2525 | `0x0972954923a1e2b2aAb04Fa0c4a0797e5989Cd65` | [inevm.calderaexplorer.xyz](https://inevm.calderaexplorer.xyz/address/0x0972954923a1e2b2aAb04Fa0c4a0797e5989Cd65) | | Injective | 6909546 | `0x568ad3638447f07def384969f4ea39fae3802962` | [www.mintscan.io](https://www.mintscan.io/injective/address/0x568ad3638447f07def384969f4ea39fae3802962) | | Ink | 57073 | `0xA8A311B69f688c1D9928259D872C31ca0d473642` | [explorer.inkonchain.com](https://explorer.inkonchain.com/address/0xA8A311B69f688c1D9928259D872C31ca0d473642) | | Kaia | 8217 | `0x6963480b05EB58f4d624B014ab92e9aD4d21df6D` | [kaiascope.com](https://kaiascope.com/address/0x6963480b05EB58f4d624B014ab92e9aD4d21df6D) | | Kroma | 255 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [blockscout.kroma.network](https://blockscout.kroma.network/address/0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a) | | Linea | 59144 | `0xC077A0Cc408173349b1c9870C667B40FE3C01dd7` | [lineascan.build](https://lineascan.build/address/0xC077A0Cc408173349b1c9870C667B40FE3C01dd7) | | Lisk | 1135 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [blockscout.lisk.com](https://blockscout.lisk.com/address/0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a) | | LUKSO | 42 | `0x062200d92dF6bB7bA89Ce4D6800110450f94784e` | [explorer.execution.mainnet.lukso.network](https://explorer.execution.mainnet.lukso.network/address/0x062200d92dF6bB7bA89Ce4D6800110450f94784e) | | Lumia Prism | 1000073017 | `0xC88636fFdFAc7cb87b7A76310B7a62AF0A000595` | [explorer.lumia.org](https://explorer.lumia.org/address/0xC88636fFdFAc7cb87b7A76310B7a62AF0A000595) | | Manta Pacific | 169 | `0x149db7afD694722747035d5AEC7007ccb6F8f112` | [pacific-explorer.manta.network](https://pacific-explorer.manta.network/address/0x149db7afD694722747035d5AEC7007ccb6F8f112) | | Mantle | 5000 | `0x5332D1AC0A626D265298c14ff681c0A8D28dB86d` | [explorer.mantle.xyz](https://explorer.mantle.xyz/address/0x5332D1AC0A626D265298c14ff681c0A8D28dB86d) | | Merlin | 4200 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [scan.merlinchain.io](https://scan.merlinchain.io/address/0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a) | | Metal L2 | 1000001750 | `0x9c64f327F0140DeBd430aab3E2F1d6cbcA921227` | [explorer.metall2.com](https://explorer.metall2.com/address/0x9c64f327F0140DeBd430aab3E2F1d6cbcA921227) | | Metis Andromeda | 1088 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [andromeda-explorer.metis.io](https://andromeda-explorer.metis.io/address/0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a) | | Mint | 185 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [explorer.mintchain.io](https://explorer.mintchain.io/address/0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a) | | Mode | 34443 | `0xE2ee936bEa8e42671c400aC96dE198E06F2bA2A6` | [explorer.mode.network](https://explorer.mode.network/address/0xE2ee936bEa8e42671c400aC96dE198E06F2bA2A6) | | Molten | 360 | `0x441a01Fca2eD731C0Fc4633998332f9FEDB17575` | [molten.calderaexplorer.xyz](https://molten.calderaexplorer.xyz/address/0x441a01Fca2eD731C0Fc4633998332f9FEDB17575) | | Moonbeam | 1284 | `0x87403b85f6f316e7ba91ba1fa6C3Fb7dD4095547` | [moonscan.io](https://moonscan.io/address/0x87403b85f6f316e7ba91ba1fa6C3Fb7dD4095547) | | Morph | 2818 | `0x6963480b05EB58f4d624B014ab92e9aD4d21df6D` | [explorer.morphl2.io](https://explorer.morphl2.io/address/0x6963480b05EB58f4d624B014ab92e9aD4d21df6D) | | Nero | 1689 | `0x7B032cBB00AD7438E802A66D8b64761A06E5df22` | [www.neroscan.io](https://www.neroscan.io/address/0x7B032cBB00AD7438E802A66D8b64761A06E5df22) | | Neutron | 1853125230 | `0xcd30a0001cc1f436c41ef764a712ebabc5a144140e3fd03eafe64a9a24e4e27c` | [www.mintscan.io](https://www.mintscan.io/neutron/address/0xcd30a0001cc1f436c41ef764a712ebabc5a144140e3fd03eafe64a9a24e4e27c) | | Oort | 970 | `0x3E969bA938E6A993eeCD6F65b0dd8712B07dFe59` | [mainnet-scan.oortech.com](https://mainnet-scan.oortech.com/address/0x3E969bA938E6A993eeCD6F65b0dd8712B07dFe59) | | Optimism | 10 | `0x68eE9bec9B4dbB61f69D9D293Ae26a5AACb2e28f` | [optimistic.etherscan.io](https://optimistic.etherscan.io/address/0x68eE9bec9B4dbB61f69D9D293Ae26a5AACb2e28f) | | Orderly L2 | 291 | `0x6963480b05EB58f4d624B014ab92e9aD4d21df6D` | [explorer.orderly.network](https://explorer.orderly.network/address/0x6963480b05EB58f4d624B014ab92e9aD4d21df6D) | | Polygon | 137 | `0x73FbD25c3e817DC4B4Cd9d00eff6D83dcde2DfF6` | [polygonscan.com](https://polygonscan.com/address/0x73FbD25c3e817DC4B4Cd9d00eff6D83dcde2DfF6) | | Polygon zkEVM | 1101 | `0x149db7afD694722747035d5AEC7007ccb6F8f112` | [zkevm.polygonscan.com](https://zkevm.polygonscan.com/address/0x149db7afD694722747035d5AEC7007ccb6F8f112) | | Polynomial | 1000008008 | `0xC8E323036AAFB4B4201e7B640E79C4Db285A3FC8` | [polynomialscan.io](https://polynomialscan.io/address/0xC8E323036AAFB4B4201e7B640E79C4Db285A3FC8) | | Prom | 227 | `0xf147bBD944C610F86DaE6C7668497D22932C1E4A` | [prom-blockscout.eu-north-2.gateway.fm](https://prom-blockscout.eu-north-2.gateway.fm/address/0xf147bBD944C610F86DaE6C7668497D22932C1E4A) | | Proof of Play Apex | 70700 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [explorer.apex.proofofplay.com](https://explorer.apex.proofofplay.com/address/0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a) | | RARI Chain | 1000012617 | `0x8c794a781327b819416E7b67908f1D22397f1E67` | [mainnet.explorer.rarichain.org](https://mainnet.explorer.rarichain.org/address/0x8c794a781327b819416E7b67908f1D22397f1E67) | | re.al | 111188 | `0x55E4F0bc6b7Bb493D50839A8592e7ad8d5e93cf7` | [explorer.re.al](https://explorer.re.al/address/0x55E4F0bc6b7Bb493D50839A8592e7ad8d5e93cf7) | | Redstone | 690 | `0x8F1E22d309baa69D398a03cc88E9b46037e988AA` | [explorer.redstone.xyz](https://explorer.redstone.xyz/address/0x8F1E22d309baa69D398a03cc88E9b46037e988AA) | | Rivalz | 753 | `0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2` | [rivalz.calderaexplorer.xyz](https://rivalz.calderaexplorer.xyz/address/0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2) | | Rootstock | 1000000030 | `0x086c3947F71BE98A0bDf4AB7239955e7542b0CbA` | [rootstock.blockscout.com](https://rootstock.blockscout.com/address/0x086c3947F71BE98A0bDf4AB7239955e7542b0CbA) | | Sanko | 1996 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [explorer.sanko.xyz](https://explorer.sanko.xyz/address/0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a) | | Scroll | 534352 | `0x6119E37Bd66406A1Db74920aC79C15fB8411Ba76` | [scrollscan.com](https://scrollscan.com//address/0x6119E37Bd66406A1Db74920aC79C15fB8411Ba76) | | Sei | 1329 | `0xca1b69fA4c4a7c7fD839bC50867c589592bcfe49` | [seitrace.com](https://seitrace.com/address/0xca1b69fA4c4a7c7fD839bC50867c589592bcfe49) | | Shibarium | 109 | `0x441a01Fca2eD731C0Fc4633998332f9FEDB17575` | [shibariumscan.io](https://shibariumscan.io/address/0x441a01Fca2eD731C0Fc4633998332f9FEDB17575) | | SnaxChain | 2192 | `0x6963480b05EB58f4d624B014ab92e9aD4d21df6D` | [explorer.snaxchain.io](https://explorer.snaxchain.io/address/0x6963480b05EB58f4d624B014ab92e9aD4d21df6D) | | Solana | 1399811149 | `E588QtVUvresuXq2KoNEwAmoifCzYGpRBdHByN9KQMbi` | [solscan.io](https://solscan.io/address/E588QtVUvresuXq2KoNEwAmoifCzYGpRBdHByN9KQMbi) | | Soneium | 1868 | `0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6` | [soneium.blockscout.com](https://soneium.blockscout.com/address/0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6) | | Sonic | 146 | `0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6` | [sonicscan.org](https://sonicscan.org/address/0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6) | | SOON | 50075007 | `Mj7GE6LZiJUZFTgabmNkFoY2o6JCEwCMKopSUUC3kqj` | [explorer.soo.network](https://explorer.soo.network//address/Mj7GE6LZiJUZFTgabmNkFoY2o6JCEwCMKopSUUC3kqj) | | Superposition | 1000055244 | `0x2f536FB7a37bd817Af644072a904Ddc02Dae429f` | [explorer.superposition.so](https://explorer.superposition.so//address/0x2f536FB7a37bd817Af644072a904Ddc02Dae429f) | | Superseed | 5330 | `0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47` | [explorer.superseed.xyz](https://explorer.superseed.xyz/address/0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47) | | Swell | 1923 | `0x5C02157068a52cEcfc98EDb6115DE6134EcB4764` | [explorer.swellnetwork.io](https://explorer.swellnetwork.io/address/0x5C02157068a52cEcfc98EDb6115DE6134EcB4764) | | Taiko | 167000 | `0x6A55822cf11f9fcBc4c75BC2638AfE8Eb942cAdd` | [taikoscan.io](https://taikoscan.io/address/0x6A55822cf11f9fcBc4c75BC2638AfE8Eb942cAdd) | | Tangle | 5845 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [explorer.tangle.tools](https://explorer.tangle.tools/address/0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a) | | Telos EVM | 40 | `0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6` | [www.teloscan.io](https://www.teloscan.io/address/0xDc1508844B99C606E16C2Ae87f33c373edD4B0F6) | | Torus | 21000 | `0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2` | [blockscout.torus.network](https://blockscout.torus.network/address/0x1c6f404800bA49Ed581af734eA0d25c0c7d017B2) | | Treasure | 61166 | `0xc1FC99Ea4D8B2b06b674A2e91b5A4617c1dcFd22` | [treasurescan.io](https://treasurescan.io/address/0xc1FC99Ea4D8B2b06b674A2e91b5A4617c1dcFd22) | | Unichain | 130 | `0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47` | [unichain.blockscout.com](https://unichain.blockscout.com/address/0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47) | | Vana | 1480 | `0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47` | [vanascan.io](https://vanascan.io/address/0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47) | | Viction | 88 | `0x149db7afD694722747035d5AEC7007ccb6F8f112` | [www.vicscan.xyz](https://www.vicscan.xyz/address/0x149db7afD694722747035d5AEC7007ccb6F8f112) | | World Chain | 480 | `0x0054D19613f20dD72721A146ED408971a2CCA9BD` | [worldchain-mainnet-explorer.alchemy.com](https://worldchain-mainnet-explorer.alchemy.com/address/0x0054D19613f20dD72721A146ED408971a2CCA9BD) | | Xai | 660279 | `0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a` | [explorer.xai-chain.net](https://explorer.xai-chain.net/address/0xF5da68b2577EF5C0A0D98aA2a58483a68C2f232a) | | XLayer | 196 | `0x0054D19613f20dD72721A146ED408971a2CCA9BD` | [www.oklink.com](https://www.oklink.com/xlayer/address/0x0054D19613f20dD72721A146ED408971a2CCA9BD) | | XPLA | 37 | `0x7B032cBB00AD7438E802A66D8b64761A06E5df22` | [explorer.xpla.io](https://explorer.xpla.io/mainnet/address/0x7B032cBB00AD7438E802A66D8b64761A06E5df22) | | Zero Network | 543210 | `0x55379421409961Ef129738c24261379ef8A547Df` | [zerion-explorer.vercel.app](https://zerion-explorer.vercel.app/address/0x55379421409961Ef129738c24261379ef8A547Df) | | ZetaChain | 7000 | `0xE2ee936bEa8e42671c400aC96dE198E06F2bA2A6` | [explorer.zetachain.com](https://explorer.zetachain.com/address/0xE2ee936bEa8e42671c400aC96dE198E06F2bA2A6) | | Zircuit | 48900 | `0x4C97D35c668EE5194a13c8DE8Afc18cce40C9F28` | [explorer.zircuit.com](https://explorer.zircuit.com/address/0x4C97D35c668EE5194a13c8DE8Afc18cce40C9F28) | | zkLink Nova | 810180 | `0xA1ADFCa9666Bcd68b7b5C8b55e3ecC465DcDfE65` | [explorer.zklink.io](https://explorer.zklink.io/address/0xA1ADFCa9666Bcd68b7b5C8b55e3ecC465DcDfE65) | | zkSync | 324 | `0x823500D69D77A52212DC93f8836E9c08581487eE` | [explorer.zksync.io](https://explorer.zksync.io/address/0x823500D69D77A52212DC93f8836E9c08581487eE) | | Zora | 7777777 | `0x886BB0f329781b98f98FDeb1ce7a8957F2d43B9F` | [explorer.zora.energy](https://explorer.zora.energy/address/0x886BB0f329781b98f98FDeb1ce7a8957F2d43B9F) | | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Abstract Testnet | 11124 | `0x7fa6009b59F139813eA710dB5496976eE8D80E64` | [explorer.testnet.abs.xyz](https://explorer.testnet.abs.xyz/address/0x7fa6009b59F139813eA710dB5496976eE8D80E64) | | Aleph Zero EVM Testnet | 2039 | `0xB5fB1F5410a2c2b7deD462d018541383968cB01c` | [evm-explorer-testnet.alephzero.org](https://evm-explorer-testnet.alephzero.org/address/0xB5fB1F5410a2c2b7deD462d018541383968cB01c) | | Alfajores | 44787 | `0x221FA9CBaFcd6c1C3d206571Cf4427703e023FFa` | [explorer.celo.org](https://explorer.celo.org/alfajores/address/0x221FA9CBaFcd6c1C3d206571Cf4427703e023FFa) | | Arbitrum Sepolia | 421614 | `0xAD34A66Bf6dB18E858F6B686557075568c6E031C` | [sepolia.arbiscan.io](https://sepolia.arbiscan.io/address/0xAD34A66Bf6dB18E858F6B686557075568c6E031C) | | Arcadia Testnet v2 | 1098411886 | `0xEa7e618Bee8927fBb2fA20Bc41eE8DEA51838aAD` | [explorer.khalani.network](https://explorer.khalani.network/address/0xEa7e618Bee8927fBb2fA20Bc41eE8DEA51838aAD) | | Base Sepolia | 84532 | `0x86fb9F1c124fB20ff130C41a79a432F770f67AFD` | [sepolia.basescan.org](https://sepolia.basescan.org/address/0x86fb9F1c124fB20ff130C41a79a432F770f67AFD) | | Berachain bArtio | 80084 | `0x6c13643B3927C57DB92c790E4E3E7Ee81e13f78C` | [bartio.beratrail.io](https://bartio.beratrail.io//address/0x6c13643B3927C57DB92c790E4E3E7Ee81e13f78C) | | BSC Testnet | 97 | `0xc6cbF39A747f5E28d1bDc8D9dfDAb2960Abd5A8f` | [testnet.bscscan.com](https://testnet.bscscan.com/address/0xc6cbF39A747f5E28d1bDc8D9dfDAb2960Abd5A8f) | | Camp Network Testnet V2 | 325000 | `0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A` | [camp-network-testnet.blockscout.com](https://camp-network-testnet.blockscout.com/address/0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A) | | Citrea Testnet | 5115 | `0x783c4a0bB6663359281aD4a637D5af68F83ae213` | [explorer.testnet.citrea.xyz](https://explorer.testnet.citrea.xyz/address/0x783c4a0bB6663359281aD4a637D5af68F83ae213) | | Eco Testnet | 471923 | `0x86fb9F1c124fB20ff130C41a79a432F770f67AFD` | [eco-testnet.explorer.caldera.xyz](https://eco-testnet.explorer.caldera.xyz//address/0x86fb9F1c124fB20ff130C41a79a432F770f67AFD) | | Form Testnet | 132902 | `0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A` | [sepolia-explorer.form.network](https://sepolia-explorer.form.network/address/0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A) | | Fuji | 43113 | `0x9ff6ac3dAf63103620BBf76136eA1AFf43c2F612` | [testnet.snowtrace.io](https://testnet.snowtrace.io/address/0x9ff6ac3dAf63103620BBf76136eA1AFf43c2F612) | | Holesky | 17000 | `0x98AAE089CaD930C64a76dD2247a2aC5773a4B8cE` | [holesky.etherscan.io](https://holesky.etherscan.io/address/0x98AAE089CaD930C64a76dD2247a2aC5773a4B8cE) | | Hyperliquid EVM Testnet | 998 | `0x1b33611fCc073aB0737011d5512EF673Bff74962` | [explorer.hyperlend.finance](https://explorer.hyperlend.finance/address/0x1b33611fCc073aB0737011d5512EF673Bff74962) | | Ink Sepolia | 763373 | `0x4fE19d49F45854Da50b6009258929613EC92C147` | [explorer-sepolia.inkonchain.com](https://explorer-sepolia.inkonchain.com/address/0x4fE19d49F45854Da50b6009258929613EC92C147) | | Odyssey Testnet | 911867 | `0xFfa913705484C9BAea32Ffe9945BeA099A1DFF72` | [odyssey-explorer.ithaca.xyz](https://odyssey-explorer.ithaca.xyz/address/0xFfa913705484C9BAea32Ffe9945BeA099A1DFF72) | | Optimism Sepolia | 11155420 | `0x86fb9F1c124fB20ff130C41a79a432F770f67AFD` | [sepolia-optimistic.etherscan.io](https://sepolia-optimistic.etherscan.io/address/0x86fb9F1c124fB20ff130C41a79a432F770f67AFD) | | Plume Testnet | 161221135 | `0xddf4C3e791caCaFd26D7fb275549739B38ae6e75` | [plume-testnet.explorer.caldera.xyz](https://plume-testnet.explorer.caldera.xyz/address/0xddf4C3e791caCaFd26D7fb275549739B38ae6e75) | | Polygon Amoy | 80002 | `0xddf4C3e791caCaFd26D7fb275549739B38ae6e75` | [amoy.polygonscan.com](https://amoy.polygonscan.com/address/0xddf4C3e791caCaFd26D7fb275549739B38ae6e75) | | Scroll Sepolia | 534351 | `0x863E8c26621c52ACa1849C53500606e73BA272F0` | [sepolia.scrollscan.dev](https://sepolia.scrollscan.dev//address/0x863E8c26621c52ACa1849C53500606e73BA272F0) | | Sepolia | 11155111 | `0x4917a9746A7B6E0A57159cCb7F5a6744247f2d0d` | [sepolia.etherscan.io](https://sepolia.etherscan.io/address/0x4917a9746A7B6E0A57159cCb7F5a6744247f2d0d) | | Soneium Minato Testnet | 1946 | `0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A` | [explorer-testnet.soneium.org](https://explorer-testnet.soneium.org/address/0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A) | | Sonic Testnet | 64165 | `0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE` | [testnet.soniclabs.com](https://testnet.soniclabs.com/address/0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE) | | SUAVE Toliman Testnet | 33626250 | `0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A` | [explorer.toliman.suave.flashbots.net](https://explorer.toliman.suave.flashbots.net/address/0xD5eB5fa3f470eBBB93a4A58C644c87031268a04A) | | Superposition Testnet | 98985 | `0x4926a10788306D84202A2aDbd290b7743146Cc17` | [testnet-explorer.superposition.so](https://testnet-explorer.superposition.so/address/0x4926a10788306D84202A2aDbd290b7743146Cc17) | | Treasure Topaz Testnet | 978658 | `0x7fa6009b59F139813eA710dB5496976eE8D80E64` | [topaz.treasurescan.io](https://topaz.treasurescan.io/address/0x7fa6009b59F139813eA710dB5496976eE8D80E64) | | Unichain Testnet | 1301 | `0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE` | [unichain-sepolia.blockscout.com](https://unichain-sepolia.blockscout.com/address/0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE) | Validator Announce[​](#validator-announce "Direct link to Validator Announce") ------------------------------------------------------------------------------- * Mainnet * Testnet | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Aleph Zero EVM | 1000041455 | `0x2e542a3DF4fde491faa77da05eD48377aca9E44e` | [evm-explorer.alephzero.org](https://evm-explorer.alephzero.org/address/0x2e542a3DF4fde491faa77da05eD48377aca9E44e) | | Ancient8 | 888888888 | `0x931dFCc8c1141D6F532FD023bd87DAe0080c835d` | [scan.ancient8.gg](https://scan.ancient8.gg/address/0x931dFCc8c1141D6F532FD023bd87DAe0080c835d) | | ApeChain | 33139 | `0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96` | [apechain.calderaexplorer.xyz](https://apechain.calderaexplorer.xyz/address/0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96) | | AppChain | 466 | `0x1196055C61af3e3DA6f8458B07b255a72b64Bcf7` | [explorer.appchain.xyz](https://explorer.appchain.xyz/address/0x1196055C61af3e3DA6f8458B07b255a72b64Bcf7) | | Arbitrum | 42161 | `0x1df063280C4166AF9a725e3828b4dAC6c7113B08` | [arbiscan.io](https://arbiscan.io/address/0x1df063280C4166AF9a725e3828b4dAC6c7113B08) | | Arbitrum Nova | 42170 | `0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53` | [nova.arbiscan.io](https://nova.arbiscan.io//address/0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53) | | Artela | 11820 | `0xb89c6ED617f5F46175E41551350725A09110bbCE` | [artscan.artela.network](https://artscan.artela.network/address/0xb89c6ED617f5F46175E41551350725A09110bbCE) | | Arthera | 10242 | `0xEe9E0FB6f43913aDBbe5bf89073F4BA590AB8184` | [explorer.arthera.net](https://explorer.arthera.net/address/0xEe9E0FB6f43913aDBbe5bf89073F4BA590AB8184) | | Astar | 592 | `0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86` | [astar.blockscout.com](https://astar.blockscout.com/address/0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86) | | Astar zkEVM | 3776 | `0x59C2dB903937EbE55B59c3415FD55e970FF5f2DC` | [astar-zkevm.explorer.startale.com](https://astar-zkevm.explorer.startale.com/address/0x59C2dB903937EbE55B59c3415FD55e970FF5f2DC) | | Aurora | 1313161554 | `0x426a3CE72C1586b1867F9339550371E86DB3e396` | [explorer.mainnet.aurora.dev](https://explorer.mainnet.aurora.dev/address/0x426a3CE72C1586b1867F9339550371E86DB3e396) | | Avalanche | 43114 | `0x9Cad0eC82328CEE2386Ec14a12E81d070a27712f` | [snowtrace.io](https://snowtrace.io/address/0x9Cad0eC82328CEE2386Ec14a12E81d070a27712f) | | B3 | 8333 | `0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53` | [explorer.b3.fun](https://explorer.b3.fun/address/0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53) | | Base | 8453 | `0x182E8d7c5F1B06201b102123FC7dF0EaeB445a7B` | [basescan.org](https://basescan.org/address/0x182E8d7c5F1B06201b102123FC7dF0EaeB445a7B) | | Bitlayer | 200901 | `0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86` | [www.btrscan.com](https://www.btrscan.com/address/0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86) | | Blast | 81457 | `0xFC62DeF1f08793aBf0E67f69257c6be258194F72` | [blastexplorer.io](https://blastexplorer.io/address/0xFC62DeF1f08793aBf0E67f69257c6be258194F72) | | BOB | 60808 | `0x7E27456a839BFF31CA642c060a2b68414Cb6e503` | [explorer.gobob.xyz](https://explorer.gobob.xyz/address/0x7E27456a839BFF31CA642c060a2b68414Cb6e503) | | Boba Mainnet | 288 | `0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e` | [bobascan.com](https://bobascan.com/address/0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e) | | Binance Smart Chain | 56 | `0x7024078130D9c2100fEA474DAD009C2d1703aCcd` | [bscscan.com](https://bscscan.com/address/0x7024078130D9c2100fEA474DAD009C2d1703aCcd) | | B² Network | 223 | `0x25EAC2007b0D40E3f0AF112FD346412321038719` | [explorer.bsquared.network](https://explorer.bsquared.network/address/0x25EAC2007b0D40E3f0AF112FD346412321038719) | | Celo | 42220 | `0xCeF677b65FDaA6804d4403083bb12B8dB3991FE1` | [celoscan.io](https://celoscan.io/address/0xCeF677b65FDaA6804d4403083bb12B8dB3991FE1) | | CheeseChain | 383353 | `0x047ba6c9949baB22d13C347B40819b7A20C4C53a` | [fetascan.xyz](https://fetascan.xyz/address/0x047ba6c9949baB22d13C347B40819b7A20C4C53a) | | Chiliz | 1000088888 | `0x16625230dD6cFe1B2bec3eCaEc7d43bA3A902CD6` | [chiliscan.com](https://chiliscan.com/address/0x16625230dD6cFe1B2bec3eCaEc7d43bA3A902CD6) | | Conflux eSpace | 1030 | `0x84444cE490233CFa76E3F1029bc166aa8c266907` | [evm.confluxscan.net](https://evm.confluxscan.net/address/0x84444cE490233CFa76E3F1029bc166aa8c266907) | | Conwai | 668668 | `0x84444cE490233CFa76E3F1029bc166aa8c266907` | [conwai.calderaexplorer.xyz](https://conwai.calderaexplorer.xyz/address/0x84444cE490233CFa76E3F1029bc166aa8c266907) | | Core | 1116 | `0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86` | [scan.coredao.org](https://scan.coredao.org/address/0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86) | | Corn | 21000000 | `0x84444cE490233CFa76E3F1029bc166aa8c266907` | [cornscan.io](https://cornscan.io/address/0x84444cE490233CFa76E3F1029bc166aa8c266907) | | Cyber | 7560 | `0x062200d92df6bb7ba89ce4d6800110450f94784e` | [cyberscan.co](https://cyberscan.co/address/0x062200d92df6bb7ba89ce4d6800110450f94784e) | | Degen | 666666666 | `0x062200d92dF6bB7bA89Ce4D6800110450f94784e` | [explorer.degen.tips](https://explorer.degen.tips/address/0x062200d92dF6bB7bA89Ce4D6800110450f94784e) | | Dogechain | 2000 | `0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86` | [explorer.dogechain.dog](https://explorer.dogechain.dog/address/0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86) | | DuckChain | 5545 | `0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e` | [scan.duckchain.io](https://scan.duckchain.io/address/0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e) | | Eclipse | 1408864445 | `Hqnn593pqDZWLy6bKZ4NbY767wFhUNBShDrLktuQa3Q2` | [explorer.eclipse.xyz](https://explorer.eclipse.xyz//address/Hqnn593pqDZWLy6bKZ4NbY767wFhUNBShDrLktuQa3Q2) | | Endurance | 648 | `0x3c7653dD0Ec21A833f99293CDC17495CE249532c` | [explorer-endurance.fusionist.io](https://explorer-endurance.fusionist.io/address/0x3c7653dD0Ec21A833f99293CDC17495CE249532c) | | Ethereum | 1 | `0xCe74905e51497b4adD3639366708b821dcBcff96` | [etherscan.io](https://etherscan.io/address/0xCe74905e51497b4adD3639366708b821dcBcff96) | | Everclear | 25327 | `0xC88bAD76EC7acD9fd3b9Bb264f7f5C18097c5710` | [scan.everclear.org](https://scan.everclear.org/address/0xC88bAD76EC7acD9fd3b9Bb264f7f5C18097c5710) | | Evmos EVM | 9001 | `0x84444cE490233CFa76E3F1029bc166aa8c266907` | [www.mintscan.io](https://www.mintscan.io/evmos/address/0x84444cE490233CFa76E3F1029bc166aa8c266907) | | Fantom Opera | 250 | `0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53` | [ftmscan.com](https://ftmscan.com/address/0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53) | | Flame | 253368190 | `0xc5D6aCaafBCcEC6D7fD7d92F4509befce641c563` | [explorer.flame.astria.org](https://explorer.flame.astria.org/address/0xc5D6aCaafBCcEC6D7fD7d92F4509befce641c563) | | Flare | 14 | `0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86` | [flare-explorer.flare.network](https://flare-explorer.flare.network/address/0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86) | | EVM on Flow | 1000000747 | `0x5C6699c133A583d389Ba7e0bDD4993e2e63fA804` | [evm.flowscan.io](https://evm.flowscan.io/address/0x5C6699c133A583d389Ba7e0bDD4993e2e63fA804) | | Form | 478 | `0x84444cE490233CFa76E3F1029bc166aa8c266907` | [explorer.form.network](https://explorer.form.network/address/0x84444cE490233CFa76E3F1029bc166aa8c266907) | | Fraxtal | 252 | `0x1956848601549de5aa0c887892061fA5aB4f6fC4` | [fraxscan.com](https://fraxscan.com/address/0x1956848601549de5aa0c887892061fA5aB4f6fC4) | | Fuse | 122 | `0x60bB6D060393D3C206719A7bD61844cC82891cfB` | [explorer.fuse.io](https://explorer.fuse.io/address/0x60bB6D060393D3C206719A7bD61844cC82891cfB) | | Gnosis | 100 | `0x87ED6926abc9E38b9C7C19f835B41943b622663c` | [gnosisscan.io](https://gnosisscan.io/address/0x87ED6926abc9E38b9C7C19f835B41943b622663c) | | Gravity Alpha Mainnet | 1625 | `0x61374178e45F65fF9D6252d017Cd580FC60B7654` | [explorer.gravity.xyz](https://explorer.gravity.xyz/address/0x61374178e45F65fF9D6252d017Cd580FC60B7654) | | Guru Network | 260 | `0xa2401b57A8CCBF6AbD9b7e62e28811b2b523AB2B` | [blockscout.gurunetwork.ai](https://blockscout.gurunetwork.ai/address/0xa2401b57A8CCBF6AbD9b7e62e28811b2b523AB2B) | | Harmony One | 1666600000 | `0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53` | [explorer.harmony.one](https://explorer.harmony.one/address/0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53) | | Hemi Network | 43111 | `0xb89c6ED617f5F46175E41551350725A09110bbCE` | [explorer.hemi.xyz](https://explorer.hemi.xyz/address/0xb89c6ED617f5F46175E41551350725A09110bbCE) | | Immutable zkEVM | 1000013371 | `0x8c794a781327b819416E7b67908f1D22397f1E67` | [explorer.immutable.com](https://explorer.immutable.com/address/0x8c794a781327b819416E7b67908f1D22397f1E67) | | Injective EVM | 2525 | `0x15ab173bDB6832f9b64276bA128659b0eD77730B` | [inevm.calderaexplorer.xyz](https://inevm.calderaexplorer.xyz/address/0x15ab173bDB6832f9b64276bA128659b0eD77730B) | | Injective | 6909546 | `0x1fb225b2fcfbe75e614a1d627de97ff372242eed` | [www.mintscan.io](https://www.mintscan.io/injective/address/0x1fb225b2fcfbe75e614a1d627de97ff372242eed) | | Ink | 57073 | `0x426a3CE72C1586b1867F9339550371E86DB3e396` | [explorer.inkonchain.com](https://explorer.inkonchain.com/address/0x426a3CE72C1586b1867F9339550371E86DB3e396) | | Kaia | 8217 | `0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53` | [kaiascope.com](https://kaiascope.com/address/0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53) | | Kroma | 255 | `0x062200d92dF6bB7bA89Ce4D6800110450f94784e` | [blockscout.kroma.network](https://blockscout.kroma.network/address/0x062200d92dF6bB7bA89Ce4D6800110450f94784e) | | Linea | 59144 | `0x62B7592C1B6D1E43f4630B8e37f4377097840C05` | [lineascan.build](https://lineascan.build/address/0x62B7592C1B6D1E43f4630B8e37f4377097840C05) | | Lisk | 1135 | `0x062200d92dF6bB7bA89Ce4D6800110450f94784e` | [blockscout.lisk.com](https://blockscout.lisk.com/address/0x062200d92dF6bB7bA89Ce4D6800110450f94784e) | | LUKSO | 42 | `0x3C2b535a49c6827DF0b8e94467e6922c99E3c092` | [explorer.execution.mainnet.lukso.network](https://explorer.execution.mainnet.lukso.network/address/0x3C2b535a49c6827DF0b8e94467e6922c99E3c092) | | Lumia Prism | 1000073017 | `0x803d2A87429E20d4B52266bF97Ca1c7e4f4F5Dfa` | [explorer.lumia.org](https://explorer.lumia.org/address/0x803d2A87429E20d4B52266bF97Ca1c7e4f4F5Dfa) | | Manta Pacific | 169 | `0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9` | [pacific-explorer.manta.network](https://pacific-explorer.manta.network/address/0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9) | | Mantle | 5000 | `0x1956848601549de5aa0c887892061fA5aB4f6fC4` | [explorer.mantle.xyz](https://explorer.mantle.xyz/address/0x1956848601549de5aa0c887892061fA5aB4f6fC4) | | Merlin | 4200 | `0xd21192429df453021e896f2897Dc8B1167DD61E5` | [scan.merlinchain.io](https://scan.merlinchain.io/address/0xd21192429df453021e896f2897Dc8B1167DD61E5) | | Metal L2 | 1000001750 | `0xc6835e52C1b976F1ebC71Bc8919738E02849FdA9` | [explorer.metall2.com](https://explorer.metall2.com/address/0xc6835e52C1b976F1ebC71Bc8919738E02849FdA9) | | Metis Andromeda | 1088 | `0x062200d92dF6bB7bA89Ce4D6800110450f94784e` | [andromeda-explorer.metis.io](https://andromeda-explorer.metis.io/address/0x062200d92dF6bB7bA89Ce4D6800110450f94784e) | | Mint | 185 | `0x062200d92dF6bB7bA89Ce4D6800110450f94784e` | [explorer.mintchain.io](https://explorer.mintchain.io/address/0x062200d92dF6bB7bA89Ce4D6800110450f94784e) | | Mode | 34443 | `0x48083C69f5a42c6B69ABbAd48AE195BD36770ee2` | [explorer.mode.network](https://explorer.mode.network/address/0x48083C69f5a42c6B69ABbAd48AE195BD36770ee2) | | Molten | 360 | `0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86` | [molten.calderaexplorer.xyz](https://molten.calderaexplorer.xyz/address/0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86) | | Moonbeam | 1284 | `0x8c1001eBee6F25b31863A55EadfF149aF88B356F` | [moonscan.io](https://moonscan.io/address/0x8c1001eBee6F25b31863A55EadfF149aF88B356F) | | Morph | 2818 | `0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53` | [explorer.morphl2.io](https://explorer.morphl2.io/address/0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53) | | Nero | 1689 | `0xb89c6ED617f5F46175E41551350725A09110bbCE` | [www.neroscan.io](https://www.neroscan.io/address/0xb89c6ED617f5F46175E41551350725A09110bbCE) | | Neutron | 1853125230 | `0xf3aa0d652226e21ae35cd9035c492ae41725edc9036edf0d6a48701b153b90a0` | [www.mintscan.io](https://www.mintscan.io/neutron/address/0xf3aa0d652226e21ae35cd9035c492ae41725edc9036edf0d6a48701b153b90a0) | | Oort | 970 | `0x6f77d5Ef273C38CC19d1d02352785F52565A1A6c` | [mainnet-scan.oortech.com](https://mainnet-scan.oortech.com/address/0x6f77d5Ef273C38CC19d1d02352785F52565A1A6c) | | Optimism | 10 | `0x30f5b08e01808643221528BB2f7953bf2830Ef38` | [optimistic.etherscan.io](https://optimistic.etherscan.io/address/0x30f5b08e01808643221528BB2f7953bf2830Ef38) | | Orderly L2 | 291 | `0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53` | [explorer.orderly.network](https://explorer.orderly.network/address/0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53) | | Polygon | 137 | `0x454E1a1E1CA8B51506090f1b5399083658eA4Fc5` | [polygonscan.com](https://polygonscan.com/address/0x454E1a1E1CA8B51506090f1b5399083658eA4Fc5) | | Polygon zkEVM | 1101 | `0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9` | [zkevm.polygonscan.com](https://zkevm.polygonscan.com/address/0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9) | | Polynomial | 1000008008 | `0xA166219dF110BDA97b91e65D4BB4Aae4159978b9` | [polynomialscan.io](https://polynomialscan.io/address/0xA166219dF110BDA97b91e65D4BB4Aae4159978b9) | | Prom | 227 | `0x5ae1ECA065aC8ee92Ce98E584fc3CE43070020e7` | [prom-blockscout.eu-north-2.gateway.fm](https://prom-blockscout.eu-north-2.gateway.fm/address/0x5ae1ECA065aC8ee92Ce98E584fc3CE43070020e7) | | Proof of Play Apex | 70700 | `0x062200d92dF6bB7bA89Ce4D6800110450f94784e` | [explorer.apex.proofofplay.com](https://explorer.apex.proofofplay.com/address/0x062200d92dF6bB7bA89Ce4D6800110450f94784e) | | RARI Chain | 1000012617 | `0x38D361861d321B8B05de200c61B8F18740Daf4D8` | [mainnet.explorer.rarichain.org](https://mainnet.explorer.rarichain.org/address/0x38D361861d321B8B05de200c61B8F18740Daf4D8) | | re.al | 111188 | `0x5F954cA945671e48466680eA815727948Ca340ef` | [explorer.re.al](https://explorer.re.al/address/0x5F954cA945671e48466680eA815727948Ca340ef) | | Redstone | 690 | `0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0` | [explorer.redstone.xyz](https://explorer.redstone.xyz/address/0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0) | | Rivalz | 753 | `0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615` | [rivalz.calderaexplorer.xyz](https://rivalz.calderaexplorer.xyz/address/0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615) | | Rootstock | 1000000030 | `0x20a0A32a110362920597F72974E1E0d7e25cA20a` | [rootstock.blockscout.com](https://rootstock.blockscout.com/address/0x20a0A32a110362920597F72974E1E0d7e25cA20a) | | Sanko | 1996 | `0x062200d92dF6bB7bA89Ce4D6800110450f94784e` | [explorer.sanko.xyz](https://explorer.sanko.xyz/address/0x062200d92dF6bB7bA89Ce4D6800110450f94784e) | | Scroll | 534352 | `0xd83A4F747fE80Ed98839e05079B1B7Fe037b1638` | [scrollscan.com](https://scrollscan.com//address/0xd83A4F747fE80Ed98839e05079B1B7Fe037b1638) | | Sei | 1329 | `0x5332D1AC0A626D265298c14ff681c0A8D28dB86d` | [seitrace.com](https://seitrace.com/address/0x5332D1AC0A626D265298c14ff681c0A8D28dB86d) | | Shibarium | 109 | `0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86` | [shibariumscan.io](https://shibariumscan.io/address/0xb4fc9B5fD57499Ef6FfF3995728a55F7A618ef86) | | SnaxChain | 2192 | `0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53` | [explorer.snaxchain.io](https://explorer.snaxchain.io/address/0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53) | | Solana | 1399811149 | `pRgs5vN4Pj7WvFbxf6QDHizo2njq2uksqEUbaSghVA8` | [solscan.io](https://solscan.io/address/pRgs5vN4Pj7WvFbxf6QDHizo2njq2uksqEUbaSghVA8) | | Soneium | 1868 | `0x84444cE490233CFa76E3F1029bc166aa8c266907` | [soneium.blockscout.com](https://soneium.blockscout.com/address/0x84444cE490233CFa76E3F1029bc166aa8c266907) | | Sonic | 146 | `0x84444cE490233CFa76E3F1029bc166aa8c266907` | [sonicscan.org](https://sonicscan.org/address/0x84444cE490233CFa76E3F1029bc166aa8c266907) | | SOON | 50075007 | `GFqF38mSacfvbJRKkhmjJvSkzTEKemSNVoWi4Q94ZPvz` | [explorer.soo.network](https://explorer.soo.network//address/GFqF38mSacfvbJRKkhmjJvSkzTEKemSNVoWi4Q94ZPvz) | | Superposition | 1000055244 | `0x26A29486480BD74f9B830a9B8dB33cb43C40f496` | [explorer.superposition.so](https://explorer.superposition.so//address/0x26A29486480BD74f9B830a9B8dB33cb43C40f496) | | Superseed | 5330 | `0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e` | [explorer.superseed.xyz](https://explorer.superseed.xyz/address/0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e) | | Swell | 1923 | `0x4D50044335dc1d4D26c343AdeDf6E47808475Deb` | [explorer.swellnetwork.io](https://explorer.swellnetwork.io/address/0x4D50044335dc1d4D26c343AdeDf6E47808475Deb) | | Taiko | 167000 | `0x01aE937A7B05d187bBCBE80F44F41879D3D335a4` | [taikoscan.io](https://taikoscan.io/address/0x01aE937A7B05d187bBCBE80F44F41879D3D335a4) | | Tangle | 5845 | `0x062200d92dF6bB7bA89Ce4D6800110450f94784e` | [explorer.tangle.tools](https://explorer.tangle.tools/address/0x062200d92dF6bB7bA89Ce4D6800110450f94784e) | | Telos EVM | 40 | `0x84444cE490233CFa76E3F1029bc166aa8c266907` | [www.teloscan.io](https://www.teloscan.io/address/0x84444cE490233CFa76E3F1029bc166aa8c266907) | | Torus | 21000 | `0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615` | [blockscout.torus.network](https://blockscout.torus.network/address/0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615) | | Treasure | 61166 | `0x73a82061Cd258d02BEa145fe183120456e718c2A` | [treasurescan.io](https://treasurescan.io/address/0x73a82061Cd258d02BEa145fe183120456e718c2A) | | Unichain | 130 | `0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e` | [unichain.blockscout.com](https://unichain.blockscout.com/address/0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e) | | Vana | 1480 | `0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e` | [vanascan.io](https://vanascan.io/address/0xD743801ABB6c7664B623D8534C0f5AF8cD2F1C5e) | | Viction | 88 | `0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9` | [www.vicscan.xyz](https://www.vicscan.xyz/address/0x2fa5F5C96419C222cDbCeC797D696e6cE428A7A9) | | World Chain | 480 | `0x047ba6c9949baB22d13C347B40819b7A20C4C53a` | [worldchain-mainnet-explorer.alchemy.com](https://worldchain-mainnet-explorer.alchemy.com/address/0x047ba6c9949baB22d13C347B40819b7A20C4C53a) | | Xai | 660279 | `0x062200d92dF6bB7bA89Ce4D6800110450f94784e` | [explorer.xai-chain.net](https://explorer.xai-chain.net/address/0x062200d92dF6bB7bA89Ce4D6800110450f94784e) | | XLayer | 196 | `0x047ba6c9949baB22d13C347B40819b7A20C4C53a` | [www.oklink.com](https://www.oklink.com/xlayer/address/0x047ba6c9949baB22d13C347B40819b7A20C4C53a) | | XPLA | 37 | `0xFa6fDABA1d0688675f05cE1B9DE17461247Bce9e` | [explorer.xpla.io](https://explorer.xpla.io/mainnet/address/0xFa6fDABA1d0688675f05cE1B9DE17461247Bce9e) | | Zero Network | 543210 | `0xB2F0e411B46AbE3248dAFB5e89aDB5b8404F45DF` | [zerion-explorer.vercel.app](https://zerion-explorer.vercel.app/address/0xB2F0e411B46AbE3248dAFB5e89aDB5b8404F45DF) | | ZetaChain | 7000 | `0x48083C69f5a42c6B69ABbAd48AE195BD36770ee2` | [explorer.zetachain.com](https://explorer.zetachain.com/address/0x48083C69f5a42c6B69ABbAd48AE195BD36770ee2) | | Zircuit | 48900 | `0x5366362c41e34869BDa231061603E4356D66079D` | [explorer.zircuit.com](https://explorer.zircuit.com/address/0x5366362c41e34869BDa231061603E4356D66079D) | | zkLink Nova | 810180 | `0xf5626c0f33Ca102eb3ca1633A410cd8aa92909e4` | [explorer.zklink.io](https://explorer.zklink.io/address/0xf5626c0f33Ca102eb3ca1633A410cd8aa92909e4) | | zkSync | 324 | `0x576aF402c97bFE452Dcc203B6c3f6F4EBC92A0f5` | [explorer.zksync.io](https://explorer.zksync.io/address/0x576aF402c97bFE452Dcc203B6c3f6F4EBC92A0f5) | | Zora | 7777777 | `0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed` | [explorer.zora.energy](https://explorer.zora.energy/address/0xFB9e40D811Cea562cc8a322b029eF2BDcC3ef6ed) | | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Abstract Testnet | 11124 | `0xfE9a467831a28Ec3D54deCCf0A2A41fa77dDD1D7` | [explorer.testnet.abs.xyz](https://explorer.testnet.abs.xyz/address/0xfE9a467831a28Ec3D54deCCf0A2A41fa77dDD1D7) | | Aleph Zero EVM Testnet | 2039 | `0xBF2C366530C1269d531707154948494D3fF4AcA7` | [evm-explorer-testnet.alephzero.org](https://evm-explorer-testnet.alephzero.org/address/0xBF2C366530C1269d531707154948494D3fF4AcA7) | | Alfajores | 44787 | `0x3726EE36a2A9e11a40d1ffD7D9A1A16e0154cDA0` | [explorer.celo.org](https://explorer.celo.org/alfajores/address/0x3726EE36a2A9e11a40d1ffD7D9A1A16e0154cDA0) | | Arbitrum Sepolia | 421614 | `0x1b33611fCc073aB0737011d5512EF673Bff74962` | [sepolia.arbiscan.io](https://sepolia.arbiscan.io/address/0x1b33611fCc073aB0737011d5512EF673Bff74962) | | Arcadia Testnet v2 | 1098411886 | `0x843908541D24d9F6Fa30C8Bb1c39038C947D08fC` | [explorer.khalani.network](https://explorer.khalani.network/address/0x843908541D24d9F6Fa30C8Bb1c39038C947D08fC) | | Base Sepolia | 84532 | `0x20c44b1E3BeaDA1e9826CFd48BeEDABeE9871cE9` | [sepolia.basescan.org](https://sepolia.basescan.org/address/0x20c44b1E3BeaDA1e9826CFd48BeEDABeE9871cE9) | | Berachain bArtio | 80084 | `0xB057Fb841027a8554521DcCdeC3c3474CaC99AB5` | [bartio.beratrail.io](https://bartio.beratrail.io//address/0xB057Fb841027a8554521DcCdeC3c3474CaC99AB5) | | BSC Testnet | 97 | `0xf09701B0a93210113D175461b6135a96773B5465` | [testnet.bscscan.com](https://testnet.bscscan.com/address/0xf09701B0a93210113D175461b6135a96773B5465) | | Camp Network Testnet V2 | 325000 | `0xEa7e618Bee8927fBb2fA20Bc41eE8DEA51838aAD` | [camp-network-testnet.blockscout.com](https://camp-network-testnet.blockscout.com/address/0xEa7e618Bee8927fBb2fA20Bc41eE8DEA51838aAD) | | Citrea Testnet | 5115 | `0x7c5B5bdA7F1d1F70A6678ABb4d894612Fc76498F` | [explorer.testnet.citrea.xyz](https://explorer.testnet.citrea.xyz/address/0x7c5B5bdA7F1d1F70A6678ABb4d894612Fc76498F) | | Eco Testnet | 471923 | `0x20c44b1E3BeaDA1e9826CFd48BeEDABeE9871cE9` | [eco-testnet.explorer.caldera.xyz](https://eco-testnet.explorer.caldera.xyz//address/0x20c44b1E3BeaDA1e9826CFd48BeEDABeE9871cE9) | | Form Testnet | 132902 | `0xEa7e618Bee8927fBb2fA20Bc41eE8DEA51838aAD` | [sepolia-explorer.form.network](https://sepolia-explorer.form.network/address/0xEa7e618Bee8927fBb2fA20Bc41eE8DEA51838aAD) | | Fuji | 43113 | `0x4f7179A691F8a684f56cF7Fed65171877d30739a` | [testnet.snowtrace.io](https://testnet.snowtrace.io/address/0x4f7179A691F8a684f56cF7Fed65171877d30739a) | | Holesky | 17000 | `0xAb9B273366D794B7F80B4378bc8Aaca75C6178E2` | [holesky.etherscan.io](https://holesky.etherscan.io/address/0xAb9B273366D794B7F80B4378bc8Aaca75C6178E2) | | Hyperliquid EVM Testnet | 998 | `0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE` | [explorer.hyperlend.finance](https://explorer.hyperlend.finance/address/0x086E902d2f99BcCEAa28B31747eC6Dc5fd43B1bE) | | Ink Sepolia | 763373 | `0xBdf49bE2201A1c4B13023F0a407196C6Adb32680` | [explorer-sepolia.inkonchain.com](https://explorer-sepolia.inkonchain.com/address/0xBdf49bE2201A1c4B13023F0a407196C6Adb32680) | | Odyssey Testnet | 911867 | `0x54Bd02f0f20677e9846F8E9FdB1Abc7315C49C38` | [odyssey-explorer.ithaca.xyz](https://odyssey-explorer.ithaca.xyz/address/0x54Bd02f0f20677e9846F8E9FdB1Abc7315C49C38) | | Optimism Sepolia | 11155420 | `0x20c44b1E3BeaDA1e9826CFd48BeEDABeE9871cE9` | [sepolia-optimistic.etherscan.io](https://sepolia-optimistic.etherscan.io/address/0x20c44b1E3BeaDA1e9826CFd48BeEDABeE9871cE9) | | Plume Testnet | 161221135 | `0x20c44b1E3BeaDA1e9826CFd48BeEDABeE9871cE9` | [plume-testnet.explorer.caldera.xyz](https://plume-testnet.explorer.caldera.xyz/address/0x20c44b1E3BeaDA1e9826CFd48BeEDABeE9871cE9) | | Polygon Amoy | 80002 | `0x11918DC33E067C5DA83EEF58E50F856398b8Df4C` | [amoy.polygonscan.com](https://amoy.polygonscan.com/address/0x11918DC33E067C5DA83EEF58E50F856398b8Df4C) | | Scroll Sepolia | 534351 | `0x527768930D889662Fe7ACF64294871e86e4C2381` | [sepolia.scrollscan.dev](https://sepolia.scrollscan.dev//address/0x527768930D889662Fe7ACF64294871e86e4C2381) | | Sepolia | 11155111 | `0xE6105C59480a1B7DD3E4f28153aFdbE12F4CfCD9` | [sepolia.etherscan.io](https://sepolia.etherscan.io/address/0xE6105C59480a1B7DD3E4f28153aFdbE12F4CfCD9) | | Soneium Minato Testnet | 1946 | `0xEa7e618Bee8927fBb2fA20Bc41eE8DEA51838aAD` | [explorer-testnet.soneium.org](https://explorer-testnet.soneium.org/address/0xEa7e618Bee8927fBb2fA20Bc41eE8DEA51838aAD) | | Sonic Testnet | 64165 | `0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f` | [testnet.soniclabs.com](https://testnet.soniclabs.com/address/0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f) | | SUAVE Toliman Testnet | 33626250 | `0xEa7e618Bee8927fBb2fA20Bc41eE8DEA51838aAD` | [explorer.toliman.suave.flashbots.net](https://explorer.toliman.suave.flashbots.net/address/0xEa7e618Bee8927fBb2fA20Bc41eE8DEA51838aAD) | | Superposition Testnet | 98985 | `0xAD34A66Bf6dB18E858F6B686557075568c6E031C` | [testnet-explorer.superposition.so](https://testnet-explorer.superposition.so/address/0xAD34A66Bf6dB18E858F6B686557075568c6E031C) | | Tangle Testnet | 3799 | `0x6D35A0f235aa0fBf0163C8b5171eF6E55843849b` | [testnet-explorer.tangle.tools](https://testnet-explorer.tangle.tools//address/0x6D35A0f235aa0fBf0163C8b5171eF6E55843849b) | | Treasure Topaz Testnet | 978658 | `0xfE9a467831a28Ec3D54deCCf0A2A41fa77dDD1D7` | [topaz.treasurescan.io](https://topaz.treasurescan.io/address/0xfE9a467831a28Ec3D54deCCf0A2A41fa77dDD1D7) | | Unichain Testnet | 1301 | `0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f` | [unichain-sepolia.blockscout.com](https://unichain-sepolia.blockscout.com/address/0xD356C996277eFb7f75Ee8bd61b31cC781A12F54f) | Proxy Admin[​](#proxy-admin "Direct link to Proxy Admin") ---------------------------------------------------------- * Mainnet * Testnet | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Aleph Zero EVM | 1000041455 | `0x730f8a4128Fa8c53C777B62Baa1abeF94cAd34a9` | [evm-explorer.alephzero.org](https://evm-explorer.alephzero.org/address/0x730f8a4128Fa8c53C777B62Baa1abeF94cAd34a9) | | Ancient8 | 888888888 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [scan.ancient8.gg](https://scan.ancient8.gg/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | ApeChain | 33139 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [apechain.calderaexplorer.xyz](https://apechain.calderaexplorer.xyz/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | AppChain | 466 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.appchain.xyz](https://explorer.appchain.xyz/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Arbitrum | 42161 | `0x80Cebd56A65e46c474a1A101e89E76C4c51D179c` | [arbiscan.io](https://arbiscan.io/address/0x80Cebd56A65e46c474a1A101e89E76C4c51D179c) | | Arbitrum Nova | 42170 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [nova.arbiscan.io](https://nova.arbiscan.io//address/0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D) | | Artela | 11820 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [artscan.artela.network](https://artscan.artela.network/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Arthera | 10242 | `0x03cF708E42C89623bd83B281A56935cB562b9258` | [explorer.arthera.net](https://explorer.arthera.net/address/0x03cF708E42C89623bd83B281A56935cB562b9258) | | Astar | 592 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [astar.blockscout.com](https://astar.blockscout.com/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Astar zkEVM | 3776 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [astar-zkevm.explorer.startale.com](https://astar-zkevm.explorer.startale.com/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Aurora | 1313161554 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.mainnet.aurora.dev](https://explorer.mainnet.aurora.dev/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Avalanche | 43114 | `0xd7CF8c05fd81b8cA7CfF8E6C49B08a9D63265c9B` | [snowtrace.io](https://snowtrace.io/address/0xd7CF8c05fd81b8cA7CfF8E6C49B08a9D63265c9B) | | B3 | 8333 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [explorer.b3.fun](https://explorer.b3.fun/address/0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D) | | Base | 8453 | `0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1` | [basescan.org](https://basescan.org/address/0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1) | | Bitlayer | 200901 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [www.btrscan.com](https://www.btrscan.com/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Blast | 81457 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [blastexplorer.io](https://blastexplorer.io/address/0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D) | | BOB | 60808 | `0x95878Fd41bC26f7045C0b98e381c22f010745A75` | [explorer.gobob.xyz](https://explorer.gobob.xyz/address/0x95878Fd41bC26f7045C0b98e381c22f010745A75) | | Boba Mainnet | 288 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [bobascan.com](https://bobascan.com/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Binance Smart Chain | 56 | `0x65993Af9D0D3a64ec77590db7ba362D6eB78eF70` | [bscscan.com](https://bscscan.com/address/0x65993Af9D0D3a64ec77590db7ba362D6eB78eF70) | | B² Network | 223 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.bsquared.network](https://explorer.bsquared.network/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Celo | 42220 | `0x90f9a2E9eCe93516d65FdaB726a3c62F5960a1b9` | [celoscan.io](https://celoscan.io/address/0x90f9a2E9eCe93516d65FdaB726a3c62F5960a1b9) | | CheeseChain | 383353 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [fetascan.xyz](https://fetascan.xyz/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Chiliz | 1000088888 | `0x48C427782Bc1e9ecE406b3e277481b28ABcBdf03` | [chiliscan.com](https://chiliscan.com/address/0x48C427782Bc1e9ecE406b3e277481b28ABcBdf03) | | Conflux eSpace | 1030 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [evm.confluxscan.net](https://evm.confluxscan.net/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Conwai | 668668 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [conwai.calderaexplorer.xyz](https://conwai.calderaexplorer.xyz/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Core | 1116 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [scan.coredao.org](https://scan.coredao.org/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Corn | 21000000 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [cornscan.io](https://cornscan.io/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Cyber | 7560 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [cyberscan.co](https://cyberscan.co/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Degen | 666666666 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [explorer.degen.tips](https://explorer.degen.tips/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Dogechain | 2000 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.dogechain.dog](https://explorer.dogechain.dog/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | DuckChain | 5545 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [scan.duckchain.io](https://scan.duckchain.io/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Endurance | 648 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [explorer-endurance.fusionist.io](https://explorer-endurance.fusionist.io/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Ethereum | 1 | `0x75EE15Ee1B4A75Fa3e2fDF5DF3253c25599cc659` | [etherscan.io](https://etherscan.io/address/0x75EE15Ee1B4A75Fa3e2fDF5DF3253c25599cc659) | | Everclear | 25327 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [scan.everclear.org](https://scan.everclear.org/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Evmos EVM | 9001 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [www.mintscan.io](https://www.mintscan.io/evmos/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Fantom Opera | 250 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [ftmscan.com](https://ftmscan.com/address/0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D) | | Flame | 253368190 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.flame.astria.org](https://explorer.flame.astria.org/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Flare | 14 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [flare-explorer.flare.network](https://flare-explorer.flare.network/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | EVM on Flow | 1000000747 | `0x5dfcCe8da81B542426211C99fCCfeD647e9AA496` | [evm.flowscan.io](https://evm.flowscan.io/address/0x5dfcCe8da81B542426211C99fCCfeD647e9AA496) | | Form | 478 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.form.network](https://explorer.form.network/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Fraxtal | 252 | `0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7` | [fraxscan.com](https://fraxscan.com/address/0x3a867fCfFeC2B790970eeBDC9023E75B0a172aa7) | | Fuse | 122 | `0x6A7398A6a0fB842725afa0A5F1641FC6C9FF89cf` | [explorer.fuse.io](https://explorer.fuse.io/address/0x6A7398A6a0fB842725afa0A5F1641FC6C9FF89cf) | | Gnosis | 100 | `0x81a92A1a272cb09d7b4970b07548463dC7aE0cB7` | [gnosisscan.io](https://gnosisscan.io/address/0x81a92A1a272cb09d7b4970b07548463dC7aE0cB7) | | Gravity Alpha Mainnet | 1625 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.gravity.xyz](https://explorer.gravity.xyz/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Guru Network | 260 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [blockscout.gurunetwork.ai](https://blockscout.gurunetwork.ai/address/0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D) | | Harmony One | 1666600000 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [explorer.harmony.one](https://explorer.harmony.one/address/0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D) | | Hemi Network | 43111 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.hemi.xyz](https://explorer.hemi.xyz/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Immutable zkEVM | 1000013371 | `0x2f0E57527Bb37E5E064EF243fad56CCE6241906c` | [explorer.immutable.com](https://explorer.immutable.com/address/0x2f0E57527Bb37E5E064EF243fad56CCE6241906c) | | Injective EVM | 2525 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [inevm.calderaexplorer.xyz](https://inevm.calderaexplorer.xyz/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Ink | 57073 | `0x3a464f746D23Ab22155710f44dB16dcA53e0775E` | [explorer.inkonchain.com](https://explorer.inkonchain.com/address/0x3a464f746D23Ab22155710f44dB16dcA53e0775E) | | Kaia | 8217 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [kaiascope.com](https://kaiascope.com/address/0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D) | | Kroma | 255 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [blockscout.kroma.network](https://blockscout.kroma.network/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Linea | 59144 | `0x7f50C5776722630a0024fAE05fDe8b47571D7B39` | [lineascan.build](https://lineascan.build/address/0x7f50C5776722630a0024fAE05fDe8b47571D7B39) | | Lisk | 1135 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [blockscout.lisk.com](https://blockscout.lisk.com/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | LUKSO | 42 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [explorer.execution.mainnet.lukso.network](https://explorer.execution.mainnet.lukso.network/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Lumia Prism | 1000073017 | `0x200183De44bf765ECB73cD62A74010EaaBC43146` | [explorer.lumia.org](https://explorer.lumia.org/address/0x200183De44bf765ECB73cD62A74010EaaBC43146) | | Manta Pacific | 169 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [pacific-explorer.manta.network](https://pacific-explorer.manta.network/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Mantle | 5000 | `0x14c3CEee8F431aE947364f43429a98EA89800238` | [explorer.mantle.xyz](https://explorer.mantle.xyz/address/0x14c3CEee8F431aE947364f43429a98EA89800238) | | Merlin | 4200 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [scan.merlinchain.io](https://scan.merlinchain.io/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Metal L2 | 1000001750 | `0x7C012DCA02C42cfA3Fd7Da3B0ED7234B52AE68eF` | [explorer.metall2.com](https://explorer.metall2.com/address/0x7C012DCA02C42cfA3Fd7Da3B0ED7234B52AE68eF) | | Metis Andromeda | 1088 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [andromeda-explorer.metis.io](https://andromeda-explorer.metis.io/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Mint | 185 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [explorer.mintchain.io](https://explorer.mintchain.io/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Mode | 34443 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [explorer.mode.network](https://explorer.mode.network/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Molten | 360 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [molten.calderaexplorer.xyz](https://molten.calderaexplorer.xyz/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Moonbeam | 1284 | `0x6A9cdA3dd1F593983BFd142Eb35e6ce4137bd5ce` | [moonscan.io](https://moonscan.io/address/0x6A9cdA3dd1F593983BFd142Eb35e6ce4137bd5ce) | | Morph | 2818 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [explorer.morphl2.io](https://explorer.morphl2.io/address/0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D) | | Nero | 1689 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [www.neroscan.io](https://www.neroscan.io/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Oort | 970 | `0x148CF67B8A242c1360bb2C93fCe203EC4d4f9B56` | [mainnet-scan.oortech.com](https://mainnet-scan.oortech.com/address/0x148CF67B8A242c1360bb2C93fCe203EC4d4f9B56) | | Optimism | 10 | `0xE047cb95FB3b7117989e911c6afb34771183fC35` | [optimistic.etherscan.io](https://optimistic.etherscan.io/address/0xE047cb95FB3b7117989e911c6afb34771183fC35) | | Orderly L2 | 291 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [explorer.orderly.network](https://explorer.orderly.network/address/0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D) | | Polygon | 137 | `0xC4F7590C5d30BE959225dC75640657954A86b980` | [polygonscan.com](https://polygonscan.com/address/0xC4F7590C5d30BE959225dC75640657954A86b980) | | Polygon zkEVM | 1101 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [zkevm.polygonscan.com](https://zkevm.polygonscan.com/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Polynomial | 1000008008 | `0x5bdADEAD721Eb4C4038fF7c989E3C7BbBA302435` | [polynomialscan.io](https://polynomialscan.io/address/0x5bdADEAD721Eb4C4038fF7c989E3C7BbBA302435) | | Prom | 227 | `0x9534122Aae7978dB8f5f10dF4432233c53e820A1` | [prom-blockscout.eu-north-2.gateway.fm](https://prom-blockscout.eu-north-2.gateway.fm/address/0x9534122Aae7978dB8f5f10dF4432233c53e820A1) | | Proof of Play Apex | 70700 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [explorer.apex.proofofplay.com](https://explorer.apex.proofofplay.com/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | RARI Chain | 1000012617 | `0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7` | [mainnet.explorer.rarichain.org](https://mainnet.explorer.rarichain.org/address/0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7) | | re.al | 111188 | `0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1` | [explorer.re.al](https://explorer.re.al/address/0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1) | | Redstone | 690 | `0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1` | [explorer.redstone.xyz](https://explorer.redstone.xyz/address/0x4Ed7d626f1E96cD1C0401607Bf70D95243E3dEd1) | | Rivalz | 753 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [rivalz.calderaexplorer.xyz](https://rivalz.calderaexplorer.xyz/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Rootstock | 1000000030 | `0xe93f2f409ad8B5000431D234472973fe848dcBEC` | [rootstock.blockscout.com](https://rootstock.blockscout.com/address/0xe93f2f409ad8B5000431D234472973fe848dcBEC) | | Sanko | 1996 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [explorer.sanko.xyz](https://explorer.sanko.xyz/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Scroll | 534352 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [scrollscan.com](https://scrollscan.com//address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Sei | 1329 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [seitrace.com](https://seitrace.com/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Shibarium | 109 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [shibariumscan.io](https://shibariumscan.io/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | SnaxChain | 2192 | `0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D` | [explorer.snaxchain.io](https://explorer.snaxchain.io/address/0xeA87ae93Fa0019a82A727bfd3eBd1cFCa8f64f1D) | | Soneium | 1868 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [soneium.blockscout.com](https://soneium.blockscout.com/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Sonic | 146 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [sonicscan.org](https://sonicscan.org/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Superposition | 1000055244 | `0x248aDe14C0489E20C9a7Fea5F86DBfC3702208eF` | [explorer.superposition.so](https://explorer.superposition.so//address/0x248aDe14C0489E20C9a7Fea5F86DBfC3702208eF) | | Superseed | 5330 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.superseed.xyz](https://explorer.superseed.xyz/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Swell | 1923 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.swellnetwork.io](https://explorer.swellnetwork.io/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Taiko | 167000 | `0x398633D19f4371e1DB5a8EFE90468eB70B1176AA` | [taikoscan.io](https://taikoscan.io/address/0x398633D19f4371e1DB5a8EFE90468eB70B1176AA) | | Tangle | 5845 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [explorer.tangle.tools](https://explorer.tangle.tools/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Telos EVM | 40 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [www.teloscan.io](https://www.teloscan.io/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Torus | 21000 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [blockscout.torus.network](https://blockscout.torus.network/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Treasure | 61166 | `0x038F9F4e93e88Af2C688da265222FdE80e455aA4` | [treasurescan.io](https://treasurescan.io/address/0x038F9F4e93e88Af2C688da265222FdE80e455aA4) | | Unichain | 130 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [unichain.blockscout.com](https://unichain.blockscout.com/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Vana | 1480 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [vanascan.io](https://vanascan.io/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Viction | 88 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [www.vicscan.xyz](https://www.vicscan.xyz/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | World Chain | 480 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [worldchain-mainnet-explorer.alchemy.com](https://worldchain-mainnet-explorer.alchemy.com/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Xai | 660279 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [explorer.xai-chain.net](https://explorer.xai-chain.net/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | XLayer | 196 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [www.oklink.com](https://www.oklink.com/xlayer/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | XPLA | 37 | `0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7` | [explorer.xpla.io](https://explorer.xpla.io/mainnet/address/0x2f2aFaE1139Ce54feFC03593FeE8AB2aDF4a85A7) | | Zero Network | 543210 | `0x72e2A678442Edc65f14476A0E4c94312C0469f4A` | [zerion-explorer.vercel.app](https://zerion-explorer.vercel.app/address/0x72e2A678442Edc65f14476A0E4c94312C0469f4A) | | ZetaChain | 7000 | `0x0761b0827849abbf7b0cC09CE14e1C93D87f5004` | [explorer.zetachain.com](https://explorer.zetachain.com/address/0x0761b0827849abbf7b0cC09CE14e1C93D87f5004) | | Zircuit | 48900 | `0xA5580D7Af50F3FD869EbEA51e352e2656F8DD5C2` | [explorer.zircuit.com](https://explorer.zircuit.com/address/0xA5580D7Af50F3FD869EbEA51e352e2656F8DD5C2) | | zkLink Nova | 810180 | `0x038F9F4e93e88Af2C688da265222FdE80e455aA4` | [explorer.zklink.io](https://explorer.zklink.io/address/0x038F9F4e93e88Af2C688da265222FdE80e455aA4) | | zkSync | 324 | `0xD01274DC164D32F8595bE707F221375E68cE300C` | [explorer.zksync.io](https://explorer.zksync.io/address/0xD01274DC164D32F8595bE707F221375E68cE300C) | | Zora | 7777777 | `0x632b4F32d65F7b25B37a27C57dD510f8e4a58Bf9` | [explorer.zora.energy](https://explorer.zora.energy/address/0x632b4F32d65F7b25B37a27C57dD510f8e4a58Bf9) | | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Abstract Testnet | 11124 | `0xfbA0c57A6BA24B5440D3e2089222099b4663B98B` | [explorer.testnet.abs.xyz](https://explorer.testnet.abs.xyz/address/0xfbA0c57A6BA24B5440D3e2089222099b4663B98B) | | Aleph Zero EVM Testnet | 2039 | `0x54148470292C24345fb828B003461a9444414517` | [evm-explorer-testnet.alephzero.org](https://evm-explorer-testnet.alephzero.org/address/0x54148470292C24345fb828B003461a9444414517) | | Alfajores | 44787 | `0x4eDBf5846D973c53AF478cf62aB5bC92807521e3` | [explorer.celo.org](https://explorer.celo.org/alfajores/address/0x4eDBf5846D973c53AF478cf62aB5bC92807521e3) | | Arbitrum Sepolia | 421614 | `0x666a24F62f7A97BA33c151776Eb3D9441a059eB8` | [sepolia.arbiscan.io](https://sepolia.arbiscan.io/address/0x666a24F62f7A97BA33c151776Eb3D9441a059eB8) | | Arcadia Testnet v2 | 1098411886 | `0x589C201a07c26b4725A4A829d772f24423da480B` | [explorer.khalani.network](https://explorer.khalani.network/address/0x589C201a07c26b4725A4A829d772f24423da480B) | | Base Sepolia | 84532 | `0x44b764045BfDC68517e10e783E69B376cef196B2` | [sepolia.basescan.org](https://sepolia.basescan.org/address/0x44b764045BfDC68517e10e783E69B376cef196B2) | | Berachain bArtio | 80084 | `0x54148470292C24345fb828B003461a9444414517` | [bartio.beratrail.io](https://bartio.beratrail.io//address/0x54148470292C24345fb828B003461a9444414517) | | BSC Testnet | 97 | `0xb12282d2E838Aa5f2A4F9Ee5f624a77b7199A078` | [testnet.bscscan.com](https://testnet.bscscan.com/address/0xb12282d2E838Aa5f2A4F9Ee5f624a77b7199A078) | | Camp Network Testnet V2 | 325000 | `0x54148470292C24345fb828B003461a9444414517` | [camp-network-testnet.blockscout.com](https://camp-network-testnet.blockscout.com/address/0x54148470292C24345fb828B003461a9444414517) | | Citrea Testnet | 5115 | `0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD` | [explorer.testnet.citrea.xyz](https://explorer.testnet.citrea.xyz/address/0xDDcFEcF17586D08A5740B7D91735fcCE3dfe3eeD) | | Eco Testnet | 471923 | `0x44b764045BfDC68517e10e783E69B376cef196B2` | [eco-testnet.explorer.caldera.xyz](https://eco-testnet.explorer.caldera.xyz//address/0x44b764045BfDC68517e10e783E69B376cef196B2) | | Form Testnet | 132902 | `0x54148470292C24345fb828B003461a9444414517` | [sepolia-explorer.form.network](https://sepolia-explorer.form.network/address/0x54148470292C24345fb828B003461a9444414517) | | Fuji | 43113 | `0x378dA02f7dC3c23A8B5ecE32b8056CdF01e8d477` | [testnet.snowtrace.io](https://testnet.snowtrace.io/address/0x378dA02f7dC3c23A8B5ecE32b8056CdF01e8d477) | | Holesky | 17000 | `0x33dB966328Ea213b0f76eF96CA368AB37779F065` | [holesky.etherscan.io](https://holesky.etherscan.io/address/0x33dB966328Ea213b0f76eF96CA368AB37779F065) | | Hyperliquid EVM Testnet | 998 | `0x6966b0E55883d49BFB24539356a2f8A673E02039` | [explorer.hyperlend.finance](https://explorer.hyperlend.finance/address/0x6966b0E55883d49BFB24539356a2f8A673E02039) | | Ink Sepolia | 763373 | `0x54148470292C24345fb828B003461a9444414517` | [explorer-sepolia.inkonchain.com](https://explorer-sepolia.inkonchain.com/address/0x54148470292C24345fb828B003461a9444414517) | | Odyssey Testnet | 911867 | `0x54148470292C24345fb828B003461a9444414517` | [odyssey-explorer.ithaca.xyz](https://odyssey-explorer.ithaca.xyz/address/0x54148470292C24345fb828B003461a9444414517) | | Optimism Sepolia | 11155420 | `0x44b764045BfDC68517e10e783E69B376cef196B2` | [sepolia-optimistic.etherscan.io](https://sepolia-optimistic.etherscan.io/address/0x44b764045BfDC68517e10e783E69B376cef196B2) | | Plume Testnet | 161221135 | `0x589C201a07c26b4725A4A829d772f24423da480B` | [plume-testnet.explorer.caldera.xyz](https://plume-testnet.explorer.caldera.xyz/address/0x589C201a07c26b4725A4A829d772f24423da480B) | | Polygon Amoy | 80002 | `0xC2E36cd6e32e194EE11f15D9273B64461A4D49A2` | [amoy.polygonscan.com](https://amoy.polygonscan.com/address/0xC2E36cd6e32e194EE11f15D9273B64461A4D49A2) | | Scroll Sepolia | 534351 | `0x598facE78a4302f11E3de0bee1894Da0b2Cb71F8` | [sepolia.scrollscan.dev](https://sepolia.scrollscan.dev//address/0x598facE78a4302f11E3de0bee1894Da0b2Cb71F8) | | Sepolia | 11155111 | `0x97Bbc6bBaFa5Ce3b2FA966c121Af63bD09e940f8` | [sepolia.etherscan.io](https://sepolia.etherscan.io/address/0x97Bbc6bBaFa5Ce3b2FA966c121Af63bD09e940f8) | | Soneium Minato Testnet | 1946 | `0x54148470292C24345fb828B003461a9444414517` | [explorer-testnet.soneium.org](https://explorer-testnet.soneium.org/address/0x54148470292C24345fb828B003461a9444414517) | | Sonic Testnet | 64165 | `0x54148470292C24345fb828B003461a9444414517` | [testnet.soniclabs.com](https://testnet.soniclabs.com/address/0x54148470292C24345fb828B003461a9444414517) | | SUAVE Toliman Testnet | 33626250 | `0x54148470292C24345fb828B003461a9444414517` | [explorer.toliman.suave.flashbots.net](https://explorer.toliman.suave.flashbots.net/address/0x54148470292C24345fb828B003461a9444414517) | | Superposition Testnet | 98985 | `0x44b764045BfDC68517e10e783E69B376cef196B2` | [testnet-explorer.superposition.so](https://testnet-explorer.superposition.so/address/0x44b764045BfDC68517e10e783E69B376cef196B2) | | Tangle Testnet | 3799 | `0xF19B75ea28F0f97d3bd267d35F2a8D30A667967C` | [testnet-explorer.tangle.tools](https://testnet-explorer.tangle.tools//address/0xF19B75ea28F0f97d3bd267d35F2a8D30A667967C) | | Treasure Topaz Testnet | 978658 | `0xfbA0c57A6BA24B5440D3e2089222099b4663B98B` | [topaz.treasurescan.io](https://topaz.treasurescan.io/address/0xfbA0c57A6BA24B5440D3e2089222099b4663B98B) | | Unichain Testnet | 1301 | `0x54148470292C24345fb828B003461a9444414517` | [unichain-sepolia.blockscout.com](https://unichain-sepolia.blockscout.com/address/0x54148470292C24345fb828B003461a9444414517) | Test Recipient[​](#test-recipient "Direct link to Test Recipient") ------------------------------------------------------------------- * Mainnet * Testnet | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Aleph Zero EVM | 1000041455 | `0x561BcA8D862536CD9C88f332C1A1Da0fC8F96e40` | [evm-explorer.alephzero.org](https://evm-explorer.alephzero.org/address/0x561BcA8D862536CD9C88f332C1A1Da0fC8F96e40) | | Ancient8 | 888888888 | `0x2Fa570E83009eaEef3a1cbd496a9a30F05266634` | [scan.ancient8.gg](https://scan.ancient8.gg/address/0x2Fa570E83009eaEef3a1cbd496a9a30F05266634) | | ApeChain | 33139 | `0x783EC5e105234a570eB90f314284E5dBe53bdd90` | [apechain.calderaexplorer.xyz](https://apechain.calderaexplorer.xyz/address/0x783EC5e105234a570eB90f314284E5dBe53bdd90) | | AppChain | 466 | `0xeF7F4367703cdf4863AD6Be34C1627d8b1C2D67a` | [explorer.appchain.xyz](https://explorer.appchain.xyz/address/0xeF7F4367703cdf4863AD6Be34C1627d8b1C2D67a) | | Arbitrum | 42161 | `0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35` | [arbiscan.io](https://arbiscan.io/address/0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35) | | Arbitrum Nova | 42170 | `0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96` | [nova.arbiscan.io](https://nova.arbiscan.io//address/0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96) | | Artela | 11820 | `0xa2401b57A8CCBF6AbD9b7e62e28811b2b523AB2B` | [artscan.artela.network](https://artscan.artela.network/address/0xa2401b57A8CCBF6AbD9b7e62e28811b2b523AB2B) | | Arthera | 10242 | `0x49998DFdeF3F0b05Fe103C435bF73f5D735a0b97` | [explorer.arthera.net](https://explorer.arthera.net/address/0x49998DFdeF3F0b05Fe103C435bF73f5D735a0b97) | | Astar | 592 | `0xbB22547D1dc681fe925f568f637Ff67aC06c20fc` | [astar.blockscout.com](https://astar.blockscout.com/address/0xbB22547D1dc681fe925f568f637Ff67aC06c20fc) | | Astar zkEVM | 3776 | `0xC49aF4965264FA7BB6424CE37aA06773ad177224` | [astar-zkevm.explorer.startale.com](https://astar-zkevm.explorer.startale.com/address/0xC49aF4965264FA7BB6424CE37aA06773ad177224) | | Aurora | 1313161554 | `0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615` | [explorer.mainnet.aurora.dev](https://explorer.mainnet.aurora.dev/address/0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615) | | Avalanche | 43114 | `0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35` | [snowtrace.io](https://snowtrace.io/address/0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35) | | B3 | 8333 | `0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96` | [explorer.b3.fun](https://explorer.b3.fun/address/0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96) | | Base | 8453 | `0xb7C9307fE90B9AB093c6D3EdeE3259f5378D5f03` | [basescan.org](https://basescan.org/address/0xb7C9307fE90B9AB093c6D3EdeE3259f5378D5f03) | | Bitlayer | 200901 | `0xbB22547D1dc681fe925f568f637Ff67aC06c20fc` | [www.btrscan.com](https://www.btrscan.com/address/0xbB22547D1dc681fe925f568f637Ff67aC06c20fc) | | Blast | 81457 | `0x17E216fBb22dF4ef8A6640ae9Cb147C92710ac84` | [blastexplorer.io](https://blastexplorer.io/address/0x17E216fBb22dF4ef8A6640ae9Cb147C92710ac84) | | BOB | 60808 | `0xe03dad16074BC5EEA9A9311257BF02Eb0B6AAA2b` | [explorer.gobob.xyz](https://explorer.gobob.xyz/address/0xe03dad16074BC5EEA9A9311257BF02Eb0B6AAA2b) | | Boba Mainnet | 288 | `0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE` | [bobascan.com](https://bobascan.com/address/0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE) | | Binance Smart Chain | 56 | `0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35` | [bscscan.com](https://bscscan.com/address/0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35) | | B² Network | 223 | `0x0F9d4704E1Fb25e416042524e594F1cEac6fF597` | [explorer.bsquared.network](https://explorer.bsquared.network/address/0x0F9d4704E1Fb25e416042524e594F1cEac6fF597) | | Celo | 42220 | `0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35` | [celoscan.io](https://celoscan.io/address/0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35) | | CheeseChain | 383353 | `0x4848d54987ffc732aD313827cdC25DF2eedD79d8` | [fetascan.xyz](https://fetascan.xyz/address/0x4848d54987ffc732aD313827cdC25DF2eedD79d8) | | Chiliz | 1000088888 | `0xE67Dc24970B482579923551Ede52BD35a2858989` | [chiliscan.com](https://chiliscan.com/address/0xE67Dc24970B482579923551Ede52BD35a2858989) | | Conflux eSpace | 1030 | `0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7` | [evm.confluxscan.net](https://evm.confluxscan.net/address/0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7) | | Conwai | 668668 | `0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7` | [conwai.calderaexplorer.xyz](https://conwai.calderaexplorer.xyz/address/0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7) | | Core | 1116 | `0xbB22547D1dc681fe925f568f637Ff67aC06c20fc` | [scan.coredao.org](https://scan.coredao.org/address/0xbB22547D1dc681fe925f568f637Ff67aC06c20fc) | | Corn | 21000000 | `0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7` | [cornscan.io](https://cornscan.io/address/0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7) | | Cyber | 7560 | `0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67` | [cyberscan.co](https://cyberscan.co/address/0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67) | | Degen | 666666666 | `0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67` | [explorer.degen.tips](https://explorer.degen.tips/address/0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67) | | Dogechain | 2000 | `0xbB22547D1dc681fe925f568f637Ff67aC06c20fc` | [explorer.dogechain.dog](https://explorer.dogechain.dog/address/0xbB22547D1dc681fe925f568f637Ff67aC06c20fc) | | DuckChain | 5545 | `0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE` | [scan.duckchain.io](https://scan.duckchain.io/address/0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE) | | Endurance | 648 | `0xD670c00C0Cad3D32436d7cF270e739772314A8CE` | [explorer-endurance.fusionist.io](https://explorer-endurance.fusionist.io/address/0xD670c00C0Cad3D32436d7cF270e739772314A8CE) | | Ethereum | 1 | `0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35` | [etherscan.io](https://etherscan.io/address/0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35) | | Everclear | 25327 | `0xF15D70941dE2Bf95A23d6488eBCbedE0a444137f` | [scan.everclear.org](https://scan.everclear.org/address/0xF15D70941dE2Bf95A23d6488eBCbedE0a444137f) | | Evmos EVM | 9001 | `0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7` | [www.mintscan.io](https://www.mintscan.io/evmos/address/0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7) | | Fantom Opera | 250 | `0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96` | [ftmscan.com](https://ftmscan.com/address/0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96) | | Flame | 253368190 | `0xeE8C0E1EeBfFCC451a013336386eA53E42a44451` | [explorer.flame.astria.org](https://explorer.flame.astria.org/address/0xeE8C0E1EeBfFCC451a013336386eA53E42a44451) | | Flare | 14 | `0xbB22547D1dc681fe925f568f637Ff67aC06c20fc` | [flare-explorer.flare.network](https://flare-explorer.flare.network/address/0xbB22547D1dc681fe925f568f637Ff67aC06c20fc) | | EVM on Flow | 1000000747 | `0xa7028308Ff277DB5851a95d82ED5C5256bB721F2` | [evm.flowscan.io](https://evm.flowscan.io/address/0xa7028308Ff277DB5851a95d82ED5C5256bB721F2) | | Form | 478 | `0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7` | [explorer.form.network](https://explorer.form.network/address/0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7) | | Fraxtal | 252 | `0x62B7592C1B6D1E43f4630B8e37f4377097840C05` | [fraxscan.com](https://fraxscan.com/address/0x62B7592C1B6D1E43f4630B8e37f4377097840C05) | | Fuse | 122 | `0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de` | [explorer.fuse.io](https://explorer.fuse.io/address/0x83475ca5bEB2Eaa59A2FF48a0544ebaa4a32c2de) | | Gnosis | 100 | `0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35` | [gnosisscan.io](https://gnosisscan.io/address/0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35) | | Gravity Alpha Mainnet | 1625 | `0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53` | [explorer.gravity.xyz](https://explorer.gravity.xyz/address/0x60B8d195f1b2EcaC26d54b95C69E6399cFD64b53) | | Guru Network | 260 | `0xE885941aF52eab9E7f4c67392eACd96ea2A65d9B` | [blockscout.gurunetwork.ai](https://blockscout.gurunetwork.ai/address/0xE885941aF52eab9E7f4c67392eACd96ea2A65d9B) | | Harmony One | 1666600000 | `0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96` | [explorer.harmony.one](https://explorer.harmony.one/address/0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96) | | Hemi Network | 43111 | `0xa2401b57A8CCBF6AbD9b7e62e28811b2b523AB2B` | [explorer.hemi.xyz](https://explorer.hemi.xyz/address/0xa2401b57A8CCBF6AbD9b7e62e28811b2b523AB2B) | | Immutable zkEVM | 1000013371 | `0x01EBa6D613DC09Cb899aF1e8E8a747416d7250ad` | [explorer.immutable.com](https://explorer.immutable.com/address/0x01EBa6D613DC09Cb899aF1e8E8a747416d7250ad) | | Injective EVM | 2525 | `0x28291a7062afA569104bEd52F7AcCA3dD2FafD11` | [inevm.calderaexplorer.xyz](https://inevm.calderaexplorer.xyz/address/0x28291a7062afA569104bEd52F7AcCA3dD2FafD11) | | Ink | 57073 | `0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615` | [explorer.inkonchain.com](https://explorer.inkonchain.com/address/0x65dCf8F6b3f6a0ECEdf3d0bdCB036AEa47A1d615) | | Kaia | 8217 | `0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96` | [kaiascope.com](https://kaiascope.com/address/0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96) | | Kroma | 255 | `0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67` | [blockscout.kroma.network](https://blockscout.kroma.network/address/0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67) | | Linea | 59144 | `0x273Bc6b01D9E88c064b6E5e409BdF998246AEF42` | [lineascan.build](https://lineascan.build/address/0x273Bc6b01D9E88c064b6E5e409BdF998246AEF42) | | Lisk | 1135 | `0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67` | [blockscout.lisk.com](https://blockscout.lisk.com/address/0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67) | | LUKSO | 42 | `0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd` | [explorer.execution.mainnet.lukso.network](https://explorer.execution.mainnet.lukso.network/address/0x4E55aDA3ef1942049EA43E904EB01F4A0a9c39bd) | | Lumia Prism | 1000073017 | `0x128Ff1d24665d55f4b77B1FDbb6d8D0Ec4a0c0a1` | [explorer.lumia.org](https://explorer.lumia.org/address/0x128Ff1d24665d55f4b77B1FDbb6d8D0Ec4a0c0a1) | | Manta Pacific | 169 | `0x4E1c88DD261BEe2941e6c1814597e30F53330428` | [pacific-explorer.manta.network](https://pacific-explorer.manta.network/address/0x4E1c88DD261BEe2941e6c1814597e30F53330428) | | Mantle | 5000 | `0x62B7592C1B6D1E43f4630B8e37f4377097840C05` | [explorer.mantle.xyz](https://explorer.mantle.xyz/address/0x62B7592C1B6D1E43f4630B8e37f4377097840C05) | | Merlin | 4200 | `0xc401e251CCa7A364114504A994D6fC7cb1c243AB` | [scan.merlinchain.io](https://scan.merlinchain.io/address/0xc401e251CCa7A364114504A994D6fC7cb1c243AB) | | Metal L2 | 1000001750 | `0xc4D0b4ef01eD7091792fe3D4c039457719e2DC68` | [explorer.metall2.com](https://explorer.metall2.com/address/0xc4D0b4ef01eD7091792fe3D4c039457719e2DC68) | | Metis Andromeda | 1088 | `0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67` | [andromeda-explorer.metis.io](https://andromeda-explorer.metis.io/address/0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67) | | Mint | 185 | `0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67` | [explorer.mintchain.io](https://explorer.mintchain.io/address/0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67) | | Mode | 34443 | `0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0` | [explorer.mode.network](https://explorer.mode.network/address/0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0) | | Molten | 360 | `0xbB22547D1dc681fe925f568f637Ff67aC06c20fc` | [molten.calderaexplorer.xyz](https://molten.calderaexplorer.xyz/address/0xbB22547D1dc681fe925f568f637Ff67aC06c20fc) | | Moonbeam | 1284 | `0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35` | [moonscan.io](https://moonscan.io/address/0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35) | | Morph | 2818 | `0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96` | [explorer.morphl2.io](https://explorer.morphl2.io/address/0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96) | | Nero | 1689 | `0xa2401b57A8CCBF6AbD9b7e62e28811b2b523AB2B` | [www.neroscan.io](https://www.neroscan.io/address/0xa2401b57A8CCBF6AbD9b7e62e28811b2b523AB2B) | | Oort | 970 | `0x58556AaeB2e3829d52EE5E711D44735412efA43B` | [mainnet-scan.oortech.com](https://mainnet-scan.oortech.com/address/0x58556AaeB2e3829d52EE5E711D44735412efA43B) | | Optimism | 10 | `0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35` | [optimistic.etherscan.io](https://optimistic.etherscan.io/address/0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35) | | Orderly L2 | 291 | `0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96` | [explorer.orderly.network](https://explorer.orderly.network/address/0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96) | | Polygon | 137 | `0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35` | [polygonscan.com](https://polygonscan.com/address/0x36FdA966CfffF8a9Cdc814f546db0e6378bFef35) | | Polygon zkEVM | 1101 | `0xD127D4549cb4A5B2781303a4fE99a10EAd13263A` | [zkevm.polygonscan.com](https://zkevm.polygonscan.com/address/0xD127D4549cb4A5B2781303a4fE99a10EAd13263A) | | Polynomial | 1000008008 | `0xa1c3884EbE24Cccb120B2E98a55f85140563aa4C` | [polynomialscan.io](https://polynomialscan.io/address/0xa1c3884EbE24Cccb120B2E98a55f85140563aa4C) | | Prom | 227 | `0x83f647970B213675412b76e1cCDB55D0e35365fD` | [prom-blockscout.eu-north-2.gateway.fm](https://prom-blockscout.eu-north-2.gateway.fm/address/0x83f647970B213675412b76e1cCDB55D0e35365fD) | | Proof of Play Apex | 70700 | `0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67` | [explorer.apex.proofofplay.com](https://explorer.apex.proofofplay.com/address/0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67) | | RARI Chain | 1000012617 | `0xCE8260c1b5cF2fAD15bb4B6542716b050Fdf35c9` | [mainnet.explorer.rarichain.org](https://mainnet.explorer.rarichain.org/address/0xCE8260c1b5cF2fAD15bb4B6542716b050Fdf35c9) | | re.al | 111188 | `0xc401e251CCa7A364114504A994D6fC7cb1c243AB` | [explorer.re.al](https://explorer.re.al/address/0xc401e251CCa7A364114504A994D6fC7cb1c243AB) | | Redstone | 690 | `0x1Ab68dC4f7b6cfcd00218D4b761b7F3b5a724555` | [explorer.redstone.xyz](https://explorer.redstone.xyz/address/0x1Ab68dC4f7b6cfcd00218D4b761b7F3b5a724555) | | Rivalz | 753 | `0x92249B8ed35C2980e58666a3EBF4a075DDD2895f` | [rivalz.calderaexplorer.xyz](https://rivalz.calderaexplorer.xyz/address/0x92249B8ed35C2980e58666a3EBF4a075DDD2895f) | | Rootstock | 1000000030 | `0x693A4cE39d99e46B04cb562329e3F0141cA17331` | [rootstock.blockscout.com](https://rootstock.blockscout.com/address/0x693A4cE39d99e46B04cb562329e3F0141cA17331) | | Sanko | 1996 | `0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67` | [explorer.sanko.xyz](https://explorer.sanko.xyz/address/0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67) | | Scroll | 534352 | `0x674f4698d063cE4C0d604c88dD7D542De72f327f` | [scrollscan.com](https://scrollscan.com//address/0x674f4698d063cE4C0d604c88dD7D542De72f327f) | | Sei | 1329 | `0xdB670e1a1e312BF17425b08cE55Bdf2cD8F8eD54` | [seitrace.com](https://seitrace.com/address/0xdB670e1a1e312BF17425b08cE55Bdf2cD8F8eD54) | | Shibarium | 109 | `0xbB22547D1dc681fe925f568f637Ff67aC06c20fc` | [shibariumscan.io](https://shibariumscan.io/address/0xbB22547D1dc681fe925f568f637Ff67aC06c20fc) | | SnaxChain | 2192 | `0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96` | [explorer.snaxchain.io](https://explorer.snaxchain.io/address/0xcDA455DfD9C938451BfaFC6FF0D497c8C0469C96) | | Soneium | 1868 | `0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7` | [soneium.blockscout.com](https://soneium.blockscout.com/address/0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7) | | Sonic | 146 | `0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7` | [sonicscan.org](https://sonicscan.org/address/0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7) | | Superposition | 1000055244 | `0x545E289B88c6d97b74eC0B96e308cae46Bf5f832` | [explorer.superposition.so](https://explorer.superposition.so//address/0x545E289B88c6d97b74eC0B96e308cae46Bf5f832) | | Superseed | 5330 | `0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE` | [explorer.superseed.xyz](https://explorer.superseed.xyz/address/0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE) | | Swell | 1923 | `0xBC53dACd8c0ac0d2bAC461479EAaf5519eCC8853` | [explorer.swellnetwork.io](https://explorer.swellnetwork.io/address/0xBC53dACd8c0ac0d2bAC461479EAaf5519eCC8853) | | Taiko | 167000 | `0x5fC427653b175F6De5A494DE17d1c7636d7E7965` | [taikoscan.io](https://taikoscan.io/address/0x5fC427653b175F6De5A494DE17d1c7636d7E7965) | | Tangle | 5845 | `0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67` | [explorer.tangle.tools](https://explorer.tangle.tools/address/0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67) | | Telos EVM | 40 | `0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7` | [www.teloscan.io](https://www.teloscan.io/address/0x4Ee9dEBB3046139661b51E17bdfD54Fd63211de7) | | Torus | 21000 | `0x92249B8ed35C2980e58666a3EBF4a075DDD2895f` | [blockscout.torus.network](https://blockscout.torus.network/address/0x92249B8ed35C2980e58666a3EBF4a075DDD2895f) | | Treasure | 61166 | `0x54E88f2ab58E0Ab4B7Ce081FB20D85b16af041d2` | [treasurescan.io](https://treasurescan.io/address/0x54E88f2ab58E0Ab4B7Ce081FB20D85b16af041d2) | | Unichain | 130 | `0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE` | [unichain.blockscout.com](https://unichain.blockscout.com/address/0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE) | | Vana | 1480 | `0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE` | [vanascan.io](https://vanascan.io/address/0xbB88a31E4b709b645c06825c0E0b5CAC906d97DE) | | Viction | 88 | `0x17E216fBb22dF4ef8A6640ae9Cb147C92710ac84` | [www.vicscan.xyz](https://www.vicscan.xyz/address/0x17E216fBb22dF4ef8A6640ae9Cb147C92710ac84) | | World Chain | 480 | `0x4848d54987ffc732aD313827cdC25DF2eedD79d8` | [worldchain-mainnet-explorer.alchemy.com](https://worldchain-mainnet-explorer.alchemy.com/address/0x4848d54987ffc732aD313827cdC25DF2eedD79d8) | | Xai | 660279 | `0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67` | [explorer.xai-chain.net](https://explorer.xai-chain.net/address/0x2c61Cda929e4e2174cb10cd8e2724A9ceaD62E67) | | XLayer | 196 | `0x4848d54987ffc732aD313827cdC25DF2eedD79d8` | [www.oklink.com](https://www.oklink.com/xlayer/address/0x4848d54987ffc732aD313827cdC25DF2eedD79d8) | | XPLA | 37 | `0x7Ce3a48cd9FD80004d95b088760bD05bA86C1f7b` | [explorer.xpla.io](https://explorer.xpla.io/mainnet/address/0x7Ce3a48cd9FD80004d95b088760bD05bA86C1f7b) | | Zero Network | 543210 | `0xC18bE7ac43334F501fd9622877160b085215dECC` | [zerion-explorer.vercel.app](https://zerion-explorer.vercel.app/address/0xC18bE7ac43334F501fd9622877160b085215dECC) | | ZetaChain | 7000 | `0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0` | [explorer.zetachain.com](https://explorer.zetachain.com/address/0x12582c7B0f43c6A667CBaA7fA8b112F7fb1E69F0) | | Zircuit | 48900 | `0xA34ceDf9068C5deE726C67A4e1DCfCc2D6E2A7fD` | [explorer.zircuit.com](https://explorer.zircuit.com/address/0xA34ceDf9068C5deE726C67A4e1DCfCc2D6E2A7fD) | | zkLink Nova | 810180 | `0x58e8699b8e0a2A3ba40b380038f64F0B3ef4f2e5` | [explorer.zklink.io](https://explorer.zklink.io/address/0x58e8699b8e0a2A3ba40b380038f64F0B3ef4f2e5) | | zkSync | 324 | `0xD55078c54b0cEAa87Ba5c3fAeAC89861c69F636d` | [explorer.zksync.io](https://explorer.zksync.io/address/0xD55078c54b0cEAa87Ba5c3fAeAC89861c69F636d) | | Zora | 7777777 | `0x6119B76720CcfeB3D256EC1b91218EEfFD6756E1` | [explorer.zora.energy](https://explorer.zora.energy/address/0x6119B76720CcfeB3D256EC1b91218EEfFD6756E1) | | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Abstract Testnet | 11124 | `0x9EC79CA89DeF61BFa2f38cD4fCC137b9e49d60dD` | [explorer.testnet.abs.xyz](https://explorer.testnet.abs.xyz/address/0x9EC79CA89DeF61BFa2f38cD4fCC137b9e49d60dD) | | Aleph Zero EVM Testnet | 2039 | `0x843908541D24d9F6Fa30C8Bb1c39038C947D08fC` | [evm-explorer-testnet.alephzero.org](https://evm-explorer-testnet.alephzero.org/address/0x843908541D24d9F6Fa30C8Bb1c39038C947D08fC) | | Alfajores | 44787 | `0x6489d13AcAd3B8dce4c5B31f375DE4f9451E7b38` | [explorer.celo.org](https://explorer.celo.org/alfajores/address/0x6489d13AcAd3B8dce4c5B31f375DE4f9451E7b38) | | Arbitrum Sepolia | 421614 | `0x6c13643B3927C57DB92c790E4E3E7Ee81e13f78C` | [sepolia.arbiscan.io](https://sepolia.arbiscan.io/address/0x6c13643B3927C57DB92c790E4E3E7Ee81e13f78C) | | Arcadia Testnet v2 | 1098411886 | `0xCB3c489a2FB67a7Cd555D47B3a9A0E654784eD16` | [explorer.khalani.network](https://explorer.khalani.network/address/0xCB3c489a2FB67a7Cd555D47B3a9A0E654784eD16) | | Base Sepolia | 84532 | `0x783c4a0bB6663359281aD4a637D5af68F83ae213` | [sepolia.basescan.org](https://sepolia.basescan.org/address/0x783c4a0bB6663359281aD4a637D5af68F83ae213) | | Berachain bArtio | 80084 | `0xe0B988062A0C6492177d64823Ab95a9c256c2a5F` | [bartio.beratrail.io](https://bartio.beratrail.io//address/0xe0B988062A0C6492177d64823Ab95a9c256c2a5F) | | BSC Testnet | 97 | `0xfbcD1c00a3d809f36cC1A15918694B17B32c0b6c` | [testnet.bscscan.com](https://testnet.bscscan.com/address/0xfbcD1c00a3d809f36cC1A15918694B17B32c0b6c) | | Camp Network Testnet V2 | 325000 | `0x7483faD0Bc297667664A43A064bA7c9911659f57` | [camp-network-testnet.blockscout.com](https://camp-network-testnet.blockscout.com/address/0x7483faD0Bc297667664A43A064bA7c9911659f57) | | Citrea Testnet | 5115 | `0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8` | [explorer.testnet.citrea.xyz](https://explorer.testnet.citrea.xyz/address/0xA2cf52064c921C11adCd83588CbEa08cc3bfF5d8) | | Eco Testnet | 471923 | `0x783c4a0bB6663359281aD4a637D5af68F83ae213` | [eco-testnet.explorer.caldera.xyz](https://eco-testnet.explorer.caldera.xyz//address/0x783c4a0bB6663359281aD4a637D5af68F83ae213) | | Form Testnet | 132902 | `0x7483faD0Bc297667664A43A064bA7c9911659f57` | [sepolia-explorer.form.network](https://sepolia-explorer.form.network/address/0x7483faD0Bc297667664A43A064bA7c9911659f57) | | Fuji | 43113 | `0x44a7e1d76fD8AfA244AdE7278336E3D5C658D398` | [testnet.snowtrace.io](https://testnet.snowtrace.io/address/0x44a7e1d76fD8AfA244AdE7278336E3D5C658D398) | | Holesky | 17000 | `0x86fb9F1c124fB20ff130C41a79a432F770f67AFD` | [holesky.etherscan.io](https://holesky.etherscan.io/address/0x86fb9F1c124fB20ff130C41a79a432F770f67AFD) | | Hyperliquid EVM Testnet | 998 | `0xB057Fb841027a8554521DcCdeC3c3474CaC99AB5` | [explorer.hyperlend.finance](https://explorer.hyperlend.finance/address/0xB057Fb841027a8554521DcCdeC3c3474CaC99AB5) | | Ink Sepolia | 763373 | `0x0e91088824Fa6E2675b2a53DA3491a9B098bD868` | [explorer-sepolia.inkonchain.com](https://explorer-sepolia.inkonchain.com/address/0x0e91088824Fa6E2675b2a53DA3491a9B098bD868) | | Odyssey Testnet | 911867 | `0x5e65279Fb7293a058776e37587398fcc3E9184b1` | [odyssey-explorer.ithaca.xyz](https://odyssey-explorer.ithaca.xyz/address/0x5e65279Fb7293a058776e37587398fcc3E9184b1) | | Optimism Sepolia | 11155420 | `0x783c4a0bB6663359281aD4a637D5af68F83ae213` | [sepolia-optimistic.etherscan.io](https://sepolia-optimistic.etherscan.io/address/0x783c4a0bB6663359281aD4a637D5af68F83ae213) | | Plume Testnet | 161221135 | `0xe0B988062A0C6492177d64823Ab95a9c256c2a5F` | [plume-testnet.explorer.caldera.xyz](https://plume-testnet.explorer.caldera.xyz/address/0xe0B988062A0C6492177d64823Ab95a9c256c2a5F) | | Polygon Amoy | 80002 | `0x04438ef7622f5412f82915F59caD4f704C61eA48` | [amoy.polygonscan.com](https://amoy.polygonscan.com/address/0x04438ef7622f5412f82915F59caD4f704C61eA48) | | Scroll Sepolia | 534351 | `0xa3AB7E6cE24E6293bD5320A53329Ef2f4DE73fCA` | [sepolia.scrollscan.dev](https://sepolia.scrollscan.dev//address/0xa3AB7E6cE24E6293bD5320A53329Ef2f4DE73fCA) | | Sepolia | 11155111 | `0xeDc1A3EDf87187085A3ABb7A9a65E1e7aE370C07` | [sepolia.etherscan.io](https://sepolia.etherscan.io/address/0xeDc1A3EDf87187085A3ABb7A9a65E1e7aE370C07) | | Soneium Minato Testnet | 1946 | `0x7483faD0Bc297667664A43A064bA7c9911659f57` | [explorer-testnet.soneium.org](https://explorer-testnet.soneium.org/address/0x7483faD0Bc297667664A43A064bA7c9911659f57) | | Sonic Testnet | 64165 | `0x01812D60958798695391dacF092BAc4a715B1718` | [testnet.soniclabs.com](https://testnet.soniclabs.com/address/0x01812D60958798695391dacF092BAc4a715B1718) | | SUAVE Toliman Testnet | 33626250 | `0x7483faD0Bc297667664A43A064bA7c9911659f57` | [explorer.toliman.suave.flashbots.net](https://explorer.toliman.suave.flashbots.net/address/0x7483faD0Bc297667664A43A064bA7c9911659f57) | | Superposition Testnet | 98985 | `0xAb9B273366D794B7F80B4378bc8Aaca75C6178E2` | [testnet-explorer.superposition.so](https://testnet-explorer.superposition.so/address/0xAb9B273366D794B7F80B4378bc8Aaca75C6178E2) | | Tangle Testnet | 3799 | `0xE73cdFFcE97AD56723dbA6145a3cC0Dd3aeF112f` | [testnet-explorer.tangle.tools](https://testnet-explorer.tangle.tools//address/0xE73cdFFcE97AD56723dbA6145a3cC0Dd3aeF112f) | | Treasure Topaz Testnet | 978658 | `0x9EC79CA89DeF61BFa2f38cD4fCC137b9e49d60dD` | [topaz.treasurescan.io](https://topaz.treasurescan.io/address/0x9EC79CA89DeF61BFa2f38cD4fCC137b9e49d60dD) | | Unichain Testnet | 1301 | `0x01812D60958798695391dacF092BAc4a715B1718` | [unichain-sepolia.blockscout.com](https://unichain-sepolia.blockscout.com/address/0x01812D60958798695391dacF092BAc4a715B1718) | InterchainAccountRouter[​](#interchainaccountrouter "Direct link to InterchainAccountRouter") ---------------------------------------------------------------------------------------------- * Mainnet * Testnet | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Aleph Zero EVM | 1000041455 | `0x26A29486480BD74f9B830a9B8dB33cb43C40f496` | [evm-explorer.alephzero.org](https://evm-explorer.alephzero.org/address/0x26A29486480BD74f9B830a9B8dB33cb43C40f496) | | Ancient8 | 888888888 | `0x25C87e735021F72d8728438C2130b02E3141f2cb` | [scan.ancient8.gg](https://scan.ancient8.gg/address/0x25C87e735021F72d8728438C2130b02E3141f2cb) | | ApeChain | 33139 | `0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47` | [apechain.calderaexplorer.xyz](https://apechain.calderaexplorer.xyz/address/0x9eaaC366BFD70430cFee6E70265fefFf1CfC9E47) | | AppChain | 466 | `0x65F1343AC23D4fF48bf6c7E0c55872d245397567` | [explorer.appchain.xyz](https://explorer.appchain.xyz/address/0x65F1343AC23D4fF48bf6c7E0c55872d245397567) | | Arbitrum | 42161 | `0x91874Dbed74925dFe6059B90385EEb90DdE0B2E6` | [arbiscan.io](https://arbiscan.io/address/0x91874Dbed74925dFe6059B90385EEb90DdE0B2E6) | | Arbitrum Nova | 42170 | `0xeE8C0E1EeBfFCC451a013336386eA53E42a44451` | [nova.arbiscan.io](https://nova.arbiscan.io//address/0xeE8C0E1EeBfFCC451a013336386eA53E42a44451) | | Artela | 11820 | `0xC5f2c60073DCAA9D157C45d5B017D639dF9C5CeB` | [artscan.artela.network](https://artscan.artela.network/address/0xC5f2c60073DCAA9D157C45d5B017D639dF9C5CeB) | | Arthera | 10242 | `0x2b6d3F7d28B5EC8C3C028fBCAdcf774D9709Dd29` | [explorer.arthera.net](https://explorer.arthera.net/address/0x2b6d3F7d28B5EC8C3C028fBCAdcf774D9709Dd29) | | Astar | 592 | `0x5090dF2FBDa7127c7aDa41f60B79F5c55D380Dd8` | [astar.blockscout.com](https://astar.blockscout.com/address/0x5090dF2FBDa7127c7aDa41f60B79F5c55D380Dd8) | | Astar zkEVM | 3776 | `0x7621e04860F0bDe63311db9D5D8b589AD3458A1f` | [astar-zkevm.explorer.startale.com](https://astar-zkevm.explorer.startale.com/address/0x7621e04860F0bDe63311db9D5D8b589AD3458A1f) | | Aurora | 1313161554 | `0x021D2810a758c833080DEc2F1Fa8F571Aae97D45` | [explorer.mainnet.aurora.dev](https://explorer.mainnet.aurora.dev/address/0x021D2810a758c833080DEc2F1Fa8F571Aae97D45) | | Avalanche | 43114 | `0xa82a0227e6d6db53AF4B264A852bfF91C6504a51` | [snowtrace.io](https://snowtrace.io/address/0xa82a0227e6d6db53AF4B264A852bfF91C6504a51) | | B3 | 8333 | `0xeE8C0E1EeBfFCC451a013336386eA53E42a44451` | [explorer.b3.fun](https://explorer.b3.fun/address/0xeE8C0E1EeBfFCC451a013336386eA53E42a44451) | | Base | 8453 | `0x4767D22117bBeeb295413000B620B93FD8522d53` | [basescan.org](https://basescan.org/address/0x4767D22117bBeeb295413000B620B93FD8522d53) | | Bitlayer | 200901 | `0xA0a44cB8Bc0f7EDe788b0Cd29524A5b14fED7b45` | [www.btrscan.com](https://www.btrscan.com/address/0xA0a44cB8Bc0f7EDe788b0Cd29524A5b14fED7b45) | | Blast | 81457 | `0x2f4Eb04189e11Af642237Da62d163Ab714614498` | [blastexplorer.io](https://blastexplorer.io/address/0x2f4Eb04189e11Af642237Da62d163Ab714614498) | | BOB | 60808 | `0x5C02157068a52cEcfc98EDb6115DE6134EcB4764` | [explorer.gobob.xyz](https://explorer.gobob.xyz/address/0x5C02157068a52cEcfc98EDb6115DE6134EcB4764) | | Boba Mainnet | 288 | `0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64` | [bobascan.com](https://bobascan.com/address/0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64) | | Binance Smart Chain | 56 | `0x32A07c1B7a7fe8D4A0e44B0181873aB9d64C16c1` | [bscscan.com](https://bscscan.com/address/0x32A07c1B7a7fe8D4A0e44B0181873aB9d64C16c1) | | B² Network | 223 | `0x4D50044335dc1d4D26c343AdeDf6E47808475Deb` | [explorer.bsquared.network](https://explorer.bsquared.network/address/0x4D50044335dc1d4D26c343AdeDf6E47808475Deb) | | Celo | 42220 | `0x27a6cAe33378bB6A6663b382070427A01fc9cB37` | [celoscan.io](https://celoscan.io/address/0x27a6cAe33378bB6A6663b382070427A01fc9cB37) | | CheeseChain | 383353 | `0xEF9A332Ec1fD233Bf9344A58be56ff9E104B4f60` | [fetascan.xyz](https://fetascan.xyz/address/0xEF9A332Ec1fD233Bf9344A58be56ff9E104B4f60) | | Chiliz | 1000088888 | `0x4ef363Da5bb09CC6aeA16973786963d0C8820778` | [chiliscan.com](https://chiliscan.com/address/0x4ef363Da5bb09CC6aeA16973786963d0C8820778) | | Conflux eSpace | 1030 | `0xc2466492C451E1AE49d8C874bB9f89293Aaad59b` | [evm.confluxscan.net](https://evm.confluxscan.net/address/0xc2466492C451E1AE49d8C874bB9f89293Aaad59b) | | Conwai | 668668 | `0x93D41E41cA545a35A81d11b08D2eE8b852C768df` | [conwai.calderaexplorer.xyz](https://conwai.calderaexplorer.xyz/address/0x93D41E41cA545a35A81d11b08D2eE8b852C768df) | | Core | 1116 | `0xd01A3E167d59FF98c983E83BAa5da0C3e0ADe726` | [scan.coredao.org](https://scan.coredao.org/address/0xd01A3E167d59FF98c983E83BAa5da0C3e0ADe726) | | Corn | 21000000 | `0x93D41E41cA545a35A81d11b08D2eE8b852C768df` | [cornscan.io](https://cornscan.io/address/0x93D41E41cA545a35A81d11b08D2eE8b852C768df) | | Cyber | 7560 | `0x7B032cBB00AD7438E802A66D8b64761A06E5df22` | [cyberscan.co](https://cyberscan.co/address/0x7B032cBB00AD7438E802A66D8b64761A06E5df22) | | Degen | 666666666 | `0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94` | [explorer.degen.tips](https://explorer.degen.tips/address/0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94) | | Dogechain | 2000 | `0xd01A3E167d59FF98c983E83BAa5da0C3e0ADe726` | [explorer.dogechain.dog](https://explorer.dogechain.dog/address/0xd01A3E167d59FF98c983E83BAa5da0C3e0ADe726) | | DuckChain | 5545 | `0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64` | [scan.duckchain.io](https://scan.duckchain.io/address/0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64) | | Endurance | 648 | `0xed9a722c543883FB7e07E78F3879762DE09eA7D5` | [explorer-endurance.fusionist.io](https://explorer-endurance.fusionist.io/address/0xed9a722c543883FB7e07E78F3879762DE09eA7D5) | | Ethereum | 1 | `0x5E532F7B610618eE73C2B462978e94CB1F7995Ce` | [etherscan.io](https://etherscan.io/address/0x5E532F7B610618eE73C2B462978e94CB1F7995Ce) | | Everclear | 25327 | `0x92cdbF0Ccdf8E93467FA858fb986fa650A02f2A8` | [scan.everclear.org](https://scan.everclear.org/address/0x92cdbF0Ccdf8E93467FA858fb986fa650A02f2A8) | | Evmos EVM | 9001 | `0x93D41E41cA545a35A81d11b08D2eE8b852C768df` | [www.mintscan.io](https://www.mintscan.io/evmos/address/0x93D41E41cA545a35A81d11b08D2eE8b852C768df) | | Fantom Opera | 250 | `0xeE8C0E1EeBfFCC451a013336386eA53E42a44451` | [ftmscan.com](https://ftmscan.com/address/0xeE8C0E1EeBfFCC451a013336386eA53E42a44451) | | Flame | 253368190 | `0x9534122Aae7978dB8f5f10dF4432233c53e820A1` | [explorer.flame.astria.org](https://explorer.flame.astria.org/address/0x9534122Aae7978dB8f5f10dF4432233c53e820A1) | | Flare | 14 | `0x87bDFaBbCC36D8B1aEdA871Cd54b2e86C7a4d597` | [flare-explorer.flare.network](https://flare-explorer.flare.network/address/0x87bDFaBbCC36D8B1aEdA871Cd54b2e86C7a4d597) | | EVM on Flow | 1000000747 | `0x349831a180eE4265008C5FFB9465Ff97c1CF0028` | [evm.flowscan.io](https://evm.flowscan.io/address/0x349831a180eE4265008C5FFB9465Ff97c1CF0028) | | Form | 478 | `0x93D41E41cA545a35A81d11b08D2eE8b852C768df` | [explorer.form.network](https://explorer.form.network/address/0x93D41E41cA545a35A81d11b08D2eE8b852C768df) | | Fraxtal | 252 | `0xbed53B5C5BCE9433f25A2A702e6df13E22d84Ae9` | [fraxscan.com](https://fraxscan.com/address/0xbed53B5C5BCE9433f25A2A702e6df13E22d84Ae9) | | Fuse | 122 | `0x2351FBe24C1212F253b7a300ff0cBCFd97952a19` | [explorer.fuse.io](https://explorer.fuse.io/address/0x2351FBe24C1212F253b7a300ff0cBCFd97952a19) | | Gnosis | 100 | `0xBE70Ab882D1F7E37e04a70CDd9Ec23b37a234064` | [gnosisscan.io](https://gnosisscan.io/address/0xBE70Ab882D1F7E37e04a70CDd9Ec23b37a234064) | | Gravity Alpha Mainnet | 1625 | `0xc5D6aCaafBCcEC6D7fD7d92F4509befce641c563` | [explorer.gravity.xyz](https://explorer.gravity.xyz/address/0xc5D6aCaafBCcEC6D7fD7d92F4509befce641c563) | | Guru Network | 260 | `0xb201817dFdd822B75Fa9b595457E6Ee466a7C187` | [blockscout.gurunetwork.ai](https://blockscout.gurunetwork.ai/address/0xb201817dFdd822B75Fa9b595457E6Ee466a7C187) | | Harmony One | 1666600000 | `0xeE8C0E1EeBfFCC451a013336386eA53E42a44451` | [explorer.harmony.one](https://explorer.harmony.one/address/0xeE8C0E1EeBfFCC451a013336386eA53E42a44451) | | Hemi Network | 43111 | `0xc31B1E6c8E706cF40842C3d728985Cd2f85413eD` | [explorer.hemi.xyz](https://explorer.hemi.xyz/address/0xc31B1E6c8E706cF40842C3d728985Cd2f85413eD) | | Immutable zkEVM | 1000013371 | `0x4ef363Da5bb09CC6aeA16973786963d0C8820778` | [explorer.immutable.com](https://explorer.immutable.com/address/0x4ef363Da5bb09CC6aeA16973786963d0C8820778) | | Injective EVM | 2525 | `0xfB8cea1c7F45608Da30655b50bbF355D123A4358` | [inevm.calderaexplorer.xyz](https://inevm.calderaexplorer.xyz/address/0xfB8cea1c7F45608Da30655b50bbF355D123A4358) | | Ink | 57073 | `0xF457D831d9F55e87B2F0b35AD6D033fd6b4181Ed` | [explorer.inkonchain.com](https://explorer.inkonchain.com/address/0xF457D831d9F55e87B2F0b35AD6D033fd6b4181Ed) | | Kaia | 8217 | `0xeE8C0E1EeBfFCC451a013336386eA53E42a44451` | [kaiascope.com](https://kaiascope.com/address/0xeE8C0E1EeBfFCC451a013336386eA53E42a44451) | | Kroma | 255 | `0x1A4F09A615aA4a35E5a146DC2fa19975bebF21A5` | [blockscout.kroma.network](https://blockscout.kroma.network/address/0x1A4F09A615aA4a35E5a146DC2fa19975bebF21A5) | | Linea | 59144 | `0xD59dA396F162Ed93a41252Cebb8d5DD4F093238C` | [lineascan.build](https://lineascan.build/address/0xD59dA396F162Ed93a41252Cebb8d5DD4F093238C) | | Lisk | 1135 | `0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94` | [blockscout.lisk.com](https://blockscout.lisk.com/address/0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94) | | LUKSO | 42 | `0x1A4F09A615aA4a35E5a146DC2fa19975bebF21A5` | [explorer.execution.mainnet.lukso.network](https://explorer.execution.mainnet.lukso.network/address/0x1A4F09A615aA4a35E5a146DC2fa19975bebF21A5) | | Lumia Prism | 1000073017 | `0xEeb5a99a75585fe137c83E7b62b74f87264A5481` | [explorer.lumia.org](https://explorer.lumia.org/address/0xEeb5a99a75585fe137c83E7b62b74f87264A5481) | | Manta Pacific | 169 | `0x693A4cE39d99e46B04cb562329e3F0141cA17331` | [pacific-explorer.manta.network](https://pacific-explorer.manta.network/address/0x693A4cE39d99e46B04cb562329e3F0141cA17331) | | Mantle | 5000 | `0x45285463352c53a481e882cD5E2AF2E25BBdAd0D` | [explorer.mantle.xyz](https://explorer.mantle.xyz/address/0x45285463352c53a481e882cD5E2AF2E25BBdAd0D) | | Merlin | 4200 | `0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7` | [scan.merlinchain.io](https://scan.merlinchain.io/address/0x9e8b689e83d929cb8c2d9166E55319a4e6aA83B7) | | Metal L2 | 1000001750 | `0x16625230dD6cFe1B2bec3eCaEc7d43bA3A902CD6` | [explorer.metall2.com](https://explorer.metall2.com/address/0x16625230dD6cFe1B2bec3eCaEc7d43bA3A902CD6) | | Metis Andromeda | 1088 | `0xb2674E213019972f937CCFc5e23BF963D915809e` | [andromeda-explorer.metis.io](https://andromeda-explorer.metis.io/address/0xb2674E213019972f937CCFc5e23BF963D915809e) | | Mint | 185 | `0xb2674E213019972f937CCFc5e23BF963D915809e` | [explorer.mintchain.io](https://explorer.mintchain.io/address/0xb2674E213019972f937CCFc5e23BF963D915809e) | | Mode | 34443 | `0x6e1B9f776bd415d7cC3C7458A5f0d801016918f8` | [explorer.mode.network](https://explorer.mode.network/address/0x6e1B9f776bd415d7cC3C7458A5f0d801016918f8) | | Molten | 360 | `0xd01A3E167d59FF98c983E83BAa5da0C3e0ADe726` | [molten.calderaexplorer.xyz](https://molten.calderaexplorer.xyz/address/0xd01A3E167d59FF98c983E83BAa5da0C3e0ADe726) | | Moonbeam | 1284 | `0xc4482f66191754a8629D35289043C4EB0285F10E` | [moonscan.io](https://moonscan.io/address/0xc4482f66191754a8629D35289043C4EB0285F10E) | | Morph | 2818 | `0xeE8C0E1EeBfFCC451a013336386eA53E42a44451` | [explorer.morphl2.io](https://explorer.morphl2.io/address/0xeE8C0E1EeBfFCC451a013336386eA53E42a44451) | | Nero | 1689 | `0x2351FBe24C1212F253b7a300ff0cBCFd97952a19` | [www.neroscan.io](https://www.neroscan.io/address/0x2351FBe24C1212F253b7a300ff0cBCFd97952a19) | | Oort | 970 | `0x7c58Cadcc2b60ACF794eE1843488d6f5703f76BE` | [mainnet-scan.oortech.com](https://mainnet-scan.oortech.com/address/0x7c58Cadcc2b60ACF794eE1843488d6f5703f76BE) | | Optimism | 10 | `0x03D6cC17d45E9EA27ED757A8214d1F07F7D901aD` | [optimistic.etherscan.io](https://optimistic.etherscan.io/address/0x03D6cC17d45E9EA27ED757A8214d1F07F7D901aD) | | Orderly L2 | 291 | `0xeE8C0E1EeBfFCC451a013336386eA53E42a44451` | [explorer.orderly.network](https://explorer.orderly.network/address/0xeE8C0E1EeBfFCC451a013336386eA53E42a44451) | | Polygon | 137 | `0xF163949AD9F88977ebF649D0461398Ca752E64B9` | [polygonscan.com](https://polygonscan.com/address/0xF163949AD9F88977ebF649D0461398Ca752E64B9) | | Polygon zkEVM | 1101 | `0x20a0A32a110362920597F72974E1E0d7e25cA20a` | [zkevm.polygonscan.com](https://zkevm.polygonscan.com/address/0x20a0A32a110362920597F72974E1E0d7e25cA20a) | | Polynomial | 1000008008 | `0xDDE46032Baf4da13fDD79BF9dfbaA2749615C409` | [polynomialscan.io](https://polynomialscan.io/address/0xDDE46032Baf4da13fDD79BF9dfbaA2749615C409) | | Prom | 227 | `0x5b3EeADcc0E2d4284eA6816e2E503c24d30a9E54` | [prom-blockscout.eu-north-2.gateway.fm](https://prom-blockscout.eu-north-2.gateway.fm/address/0x5b3EeADcc0E2d4284eA6816e2E503c24d30a9E54) | | Proof of Play Apex | 70700 | `0xb2674E213019972f937CCFc5e23BF963D915809e` | [explorer.apex.proofofplay.com](https://explorer.apex.proofofplay.com/address/0xb2674E213019972f937CCFc5e23BF963D915809e) | | RARI Chain | 1000012617 | `0xf6fB78dc009C1A4286c0E7d90C10c9E8906a62Ea` | [mainnet.explorer.rarichain.org](https://mainnet.explorer.rarichain.org/address/0xf6fB78dc009C1A4286c0E7d90C10c9E8906a62Ea) | | re.al | 111188 | `0xc0C2dB448fC2c84213394Fcb93a3C467e50ECa9E` | [explorer.re.al](https://explorer.re.al/address/0xc0C2dB448fC2c84213394Fcb93a3C467e50ECa9E) | | Redstone | 690 | `0x7a4d31a686A36285d68e14EDD53631417eB19603` | [explorer.redstone.xyz](https://explorer.redstone.xyz/address/0x7a4d31a686A36285d68e14EDD53631417eB19603) | | Rivalz | 753 | `0x1A4F09A615aA4a35E5a146DC2fa19975bebF21A5` | [rivalz.calderaexplorer.xyz](https://rivalz.calderaexplorer.xyz/address/0x1A4F09A615aA4a35E5a146DC2fa19975bebF21A5) | | Rootstock | 1000000030 | `0x7279B1e11142078b8dC9e69620200f4C84FB8aaa` | [rootstock.blockscout.com](https://rootstock.blockscout.com/address/0x7279B1e11142078b8dC9e69620200f4C84FB8aaa) | | Sanko | 1996 | `0x7a4d31a686A36285d68e14EDD53631417eB19603` | [explorer.sanko.xyz](https://explorer.sanko.xyz/address/0x7a4d31a686A36285d68e14EDD53631417eB19603) | | Scroll | 534352 | `0x0B48a744698ba8dFa514742dFEB6728f52fD66f7` | [scrollscan.com](https://scrollscan.com//address/0x0B48a744698ba8dFa514742dFEB6728f52fD66f7) | | Sei | 1329 | `0xBcaedE97a98573A88242B3b0CB0A255F3f90d4d5` | [seitrace.com](https://seitrace.com/address/0xBcaedE97a98573A88242B3b0CB0A255F3f90d4d5) | | Shibarium | 109 | `0xf3dFf6747E7FC74B431C943961054B7BF6309d8a` | [shibariumscan.io](https://shibariumscan.io/address/0xf3dFf6747E7FC74B431C943961054B7BF6309d8a) | | SnaxChain | 2192 | `0xeE8C0E1EeBfFCC451a013336386eA53E42a44451` | [explorer.snaxchain.io](https://explorer.snaxchain.io/address/0xeE8C0E1EeBfFCC451a013336386eA53E42a44451) | | Soneium | 1868 | `0x93D41E41cA545a35A81d11b08D2eE8b852C768df` | [soneium.blockscout.com](https://soneium.blockscout.com/address/0x93D41E41cA545a35A81d11b08D2eE8b852C768df) | | Sonic | 146 | `0x93D41E41cA545a35A81d11b08D2eE8b852C768df` | [sonicscan.org](https://sonicscan.org/address/0x93D41E41cA545a35A81d11b08D2eE8b852C768df) | | Superposition | 1000055244 | `0xCE8260c1b5cF2fAD15bb4B6542716b050Fdf35c9` | [explorer.superposition.so](https://explorer.superposition.so//address/0xCE8260c1b5cF2fAD15bb4B6542716b050Fdf35c9) | | Superseed | 5330 | `0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64` | [explorer.superseed.xyz](https://explorer.superseed.xyz/address/0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64) | | Swell | 1923 | `0xe9E3444DDD80c50276c0Fcf316026f6d7fEc2c47` | [explorer.swellnetwork.io](https://explorer.swellnetwork.io/address/0xe9E3444DDD80c50276c0Fcf316026f6d7fEc2c47) | | Taiko | 167000 | `0x1F8CF09F060A2AE962c0Bb1F92e209a1E7b0E10B` | [taikoscan.io](https://taikoscan.io/address/0x1F8CF09F060A2AE962c0Bb1F92e209a1E7b0E10B) | | Tangle | 5845 | `0x67F36550b73B731e5b2FC44E4F8f250d89c87bD6` | [explorer.tangle.tools](https://explorer.tangle.tools/address/0x67F36550b73B731e5b2FC44E4F8f250d89c87bD6) | | Telos EVM | 40 | `0xF457D831d9F55e87B2F0b35AD6D033fd6b4181Ed` | [www.teloscan.io](https://www.teloscan.io/address/0xF457D831d9F55e87B2F0b35AD6D033fd6b4181Ed) | | Torus | 21000 | `0x1A4F09A615aA4a35E5a146DC2fa19975bebF21A5` | [blockscout.torus.network](https://blockscout.torus.network/address/0x1A4F09A615aA4a35E5a146DC2fa19975bebF21A5) | | Unichain | 130 | `0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64` | [unichain.blockscout.com](https://unichain.blockscout.com/address/0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64) | | Vana | 1480 | `0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64` | [vanascan.io](https://vanascan.io/address/0xfF26696DcDb6BbFD27e959b847D4f1399D5BcF64) | | Viction | 88 | `0xc11f8Cf2343d3788405582F65B8af6A4F7a6FfC8` | [www.vicscan.xyz](https://www.vicscan.xyz/address/0xc11f8Cf2343d3788405582F65B8af6A4F7a6FfC8) | | World Chain | 480 | `0x473884010F0C1742DA8Ad01E7E295624B931076b` | [worldchain-mainnet-explorer.alchemy.com](https://worldchain-mainnet-explorer.alchemy.com/address/0x473884010F0C1742DA8Ad01E7E295624B931076b) | | Xai | 660279 | `0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94` | [explorer.xai-chain.net](https://explorer.xai-chain.net/address/0x3881c3e945CBB89ae67c43E82f570baDF1c6EA94) | | XLayer | 196 | `0x03cF708E42C89623bd83B281A56935cB562b9258` | [www.oklink.com](https://www.oklink.com/xlayer/address/0x03cF708E42C89623bd83B281A56935cB562b9258) | | XPLA | 37 | `0x5B24EE24049582fF74c1d311d72c70bA5B76a554` | [explorer.xpla.io](https://explorer.xpla.io/mainnet/address/0x5B24EE24049582fF74c1d311d72c70bA5B76a554) | | ZetaChain | 7000 | `0x3AdCBc94ab8C48EC52D06dc65Bb787fD1981E3d5` | [explorer.zetachain.com](https://explorer.zetachain.com/address/0x3AdCBc94ab8C48EC52D06dc65Bb787fD1981E3d5) | | Zircuit | 48900 | `0x51545389E04c2Ac07d98A40b85d29B480a2AF6ce` | [explorer.zircuit.com](https://explorer.zircuit.com/address/0x51545389E04c2Ac07d98A40b85d29B480a2AF6ce) | | Zora | 7777777 | `0x11b76D93a9D39Eb51F54eBf5566308640cDe882b` | [explorer.zora.energy](https://explorer.zora.energy/address/0x11b76D93a9D39Eb51F54eBf5566308640cDe882b) | | Chain | Domain | Address | Explorer | | --- | --- | --- | --- | | Aleph Zero EVM Testnet | 2039 | `0xe036768e48Cb0D42811d2bF0748806FCcBfCd670` | [evm-explorer-testnet.alephzero.org](https://evm-explorer-testnet.alephzero.org/address/0xe036768e48Cb0D42811d2bF0748806FCcBfCd670) | | Alfajores | 44787 | `0xEbA64c8a9b4a61a9210d5fe7E4375380999C821b` | [explorer.celo.org](https://explorer.celo.org/alfajores/address/0xEbA64c8a9b4a61a9210d5fe7E4375380999C821b) | | Arbitrum Sepolia | 421614 | `0x20cC3a33C49fa13627303669edf2DcA7F1E76a50` | [sepolia.arbiscan.io](https://sepolia.arbiscan.io/address/0x20cC3a33C49fa13627303669edf2DcA7F1E76a50) | | Arcadia Testnet v2 | 1098411886 | `0x80fE4Cb8c70fc60B745d4ffD4403c27a8cBC9e02` | [explorer.khalani.network](https://explorer.khalani.network/address/0x80fE4Cb8c70fc60B745d4ffD4403c27a8cBC9e02) | | Base Sepolia | 84532 | `0xd876C01aB40e8cE42Db417fBC79c726d45504dE4` | [sepolia.basescan.org](https://sepolia.basescan.org/address/0xd876C01aB40e8cE42Db417fBC79c726d45504dE4) | | Berachain bArtio | 80084 | `0xa3AB7E6cE24E6293bD5320A53329Ef2f4DE73fCA` | [bartio.beratrail.io](https://bartio.beratrail.io//address/0xa3AB7E6cE24E6293bD5320A53329Ef2f4DE73fCA) | | BSC Testnet | 97 | `0x6d2B3e304E58c2a19f1492E7cf15CaF63Ce6e0d2` | [testnet.bscscan.com](https://testnet.bscscan.com/address/0x6d2B3e304E58c2a19f1492E7cf15CaF63Ce6e0d2) | | Camp Network Testnet V2 | 325000 | `0x867f2089D09903f208AeCac84E599B90E5a4A821` | [camp-network-testnet.blockscout.com](https://camp-network-testnet.blockscout.com/address/0x867f2089D09903f208AeCac84E599B90E5a4A821) | | Citrea Testnet | 5115 | `0xB5fB1F5410a2c2b7deD462d018541383968cB01c` | [explorer.testnet.citrea.xyz](https://explorer.testnet.citrea.xyz/address/0xB5fB1F5410a2c2b7deD462d018541383968cB01c) | | Eco Testnet | 471923 | `0x2C6dD6768E669EDB7b53f26067C1C4534862c3de` | [eco-testnet.explorer.caldera.xyz](https://eco-testnet.explorer.caldera.xyz//address/0x2C6dD6768E669EDB7b53f26067C1C4534862c3de) | | Form Testnet | 132902 | `0x867f2089D09903f208AeCac84E599B90E5a4A821` | [sepolia-explorer.form.network](https://sepolia-explorer.form.network/address/0x867f2089D09903f208AeCac84E599B90E5a4A821) | | Fuji | 43113 | `0xeEF6933122894fF217a7dd07510b3D64b747e29b` | [testnet.snowtrace.io](https://testnet.snowtrace.io/address/0xeEF6933122894fF217a7dd07510b3D64b747e29b) | | Holesky | 17000 | `0xD31eD5a3D26c9787Ab607B0c364B21218D0f8F7b` | [holesky.etherscan.io](https://holesky.etherscan.io/address/0xD31eD5a3D26c9787Ab607B0c364B21218D0f8F7b) | | Hyperliquid EVM Testnet | 998 | `0xFfa913705484C9BAea32Ffe9945BeA099A1DFF72` | [explorer.hyperlend.finance](https://explorer.hyperlend.finance/address/0xFfa913705484C9BAea32Ffe9945BeA099A1DFF72) | | Odyssey Testnet | 911867 | `0xBdf49bE2201A1c4B13023F0a407196C6Adb32680` | [odyssey-explorer.ithaca.xyz](https://odyssey-explorer.ithaca.xyz/address/0xBdf49bE2201A1c4B13023F0a407196C6Adb32680) | | Optimism Sepolia | 11155420 | `0x3F100cBBE5FD5466BdB4B3a15Ac226957e7965Ad` | [sepolia-optimistic.etherscan.io](https://sepolia-optimistic.etherscan.io/address/0x3F100cBBE5FD5466BdB4B3a15Ac226957e7965Ad) | | Plume Testnet | 161221135 | `0xB6F8aA9B1b314A6E6DFB465DD3e0E95936347517` | [plume-testnet.explorer.caldera.xyz](https://plume-testnet.explorer.caldera.xyz/address/0xB6F8aA9B1b314A6E6DFB465DD3e0E95936347517) | | Polygon Amoy | 80002 | `0xC60C145f1e1904f9d6483A611BF1416697CCc1FE` | [amoy.polygonscan.com](https://amoy.polygonscan.com/address/0xC60C145f1e1904f9d6483A611BF1416697CCc1FE) | | Scroll Sepolia | 534351 | `0xe17c37212d785760E8331D4A4395B17b34Ba8cDF` | [sepolia.scrollscan.dev](https://sepolia.scrollscan.dev//address/0xe17c37212d785760E8331D4A4395B17b34Ba8cDF) | | Sepolia | 11155111 | `0x8e131c8aE5BF1Ed38D05a00892b6001a7d37739d` | [sepolia.etherscan.io](https://sepolia.etherscan.io/address/0x8e131c8aE5BF1Ed38D05a00892b6001a7d37739d) | | Soneium Minato Testnet | 1946 | `0x867f2089D09903f208AeCac84E599B90E5a4A821` | [explorer-testnet.soneium.org](https://explorer-testnet.soneium.org/address/0x867f2089D09903f208AeCac84E599B90E5a4A821) | | Sonic Testnet | 64165 | `0x39c85C84876479694A2470c0E8075e9d68049aFc` | [testnet.soniclabs.com](https://testnet.soniclabs.com/address/0x39c85C84876479694A2470c0E8075e9d68049aFc) | | SUAVE Toliman Testnet | 33626250 | `0x867f2089D09903f208AeCac84E599B90E5a4A821` | [explorer.toliman.suave.flashbots.net](https://explorer.toliman.suave.flashbots.net/address/0x867f2089D09903f208AeCac84E599B90E5a4A821) | | Superposition Testnet | 98985 | `0x3572a9d808738922194921b275B2A55414BcDA57` | [testnet-explorer.superposition.so](https://testnet-explorer.superposition.so/address/0x3572a9d808738922194921b275B2A55414BcDA57) | | Tangle Testnet | 3799 | `0x31196df48eb78756C4036aA6b81e8F42b0301fAe` | [testnet-explorer.tangle.tools](https://testnet-explorer.tangle.tools//address/0x31196df48eb78756C4036aA6b81e8F42b0301fAe) | | Unichain Testnet | 1301 | `0x4eC139a771eBdD3b0a0b67bb7E08960210882d44` | [unichain-sepolia.blockscout.com](https://unichain-sepolia.blockscout.com/address/0x4eC139a771eBdD3b0a0b67bb7E08960210882d44) | * [Mailbox](#mailbox) * [Interchain Gas Paymaster (Hook)](#interchain-gas-paymaster-hook) * [Storage Gas Oracle](#storage-gas-oracle) * [Merkle Tree (Hook)](#merkle-tree-hook) * [Validator Announce](#validator-announce) * [Proxy Admin](#proxy-admin) * [Test Recipient](#test-recipient) * [InterchainAccountRouter](#interchainaccountrouter) --- # Domain Identifiers | Hyperlane Docs [Skip to main content](#__docusaurus_skipToContent_fallback) On this page Domain Identifiers ================== Core Domains[​](#core-domains "Direct link to Core Domains") ------------------------------------------------------------- This list includes only the deployments on chains that are managed by Abacus Works (our legal entity). Anybody can deploy Hyperlane on any chain [permissionlessly](/docs/deploy-hyperlane) - we are building a registry to reflect the community's permissionless deployments. Hyperlane uses unique IDs for each Hyperlane-supported chain. When possible Hyperlane domain IDs match EVM chain IDs, but this is **not guaranteed** as we support non-EVM chains as well. warning Some Hyperlane domain IDs do not match their corresponding EVM chain IDs, such as: * `immutablezkevmmainnet` * `rarichain` * `rootstockmainnet` * `alephzeroevmmainnet` * `chilizmainnet` * `lumiaprism` * `superpositionmainnet` * `flowmainnet` * `metal` * `polynomialfi` Please refer to the table below for the full list of Hyperlane domain IDs. When [sending a message](/docs/your-first-message) , users must provide the domain ID of the destination chain. When [receiving a message](/docs/reference/messaging/receive) , the recipient will be passed the domain ID of the origin chain. * Mainnet * Testnet | Network | Domain Identifier (uint32) | | --- | --- | | Aleph Zero EVM | 1000041455 | | Ancient8 | 888888888 | | ApeChain | 33139 | | AppChain | 466 | | Arbitrum | 42161 | | Arbitrum Nova | 42170 | | Artela | 11820 | | Arthera | 10242 | | Astar | 592 | | Astar zkEVM | 3776 | | Aurora | 1313161554 | | Avalanche | 43114 | | B3 | 8333 | | Base | 8453 | | Bitlayer | 200901 | | Blast | 81457 | | BOB | 60808 | | Boba Mainnet | 288 | | Binance Smart Chain | 56 | | B² Network | 223 | | Celo | 42220 | | CheeseChain | 383353 | | Chiliz | 1000088888 | | Conflux eSpace | 1030 | | Conwai | 668668 | | Core | 1116 | | Corn | 21000000 | | Cyber | 7560 | | Degen | 666666666 | | Dogechain | 2000 | | DuckChain | 5545 | | Eclipse | 1408864445 | | Endurance | 648 | | Ethereum | 1 | | Everclear | 25327 | | Evmos EVM | 9001 | | Fantom Opera | 250 | | Flame | 253368190 | | Flare | 14 | | EVM on Flow | 1000000747 | | Form | 478 | | Fraxtal | 252 | | Fuse | 122 | | Gnosis | 100 | | Gravity Alpha Mainnet | 1625 | | Guru Network | 260 | | Harmony One | 1666600000 | | Hemi Network | 43111 | | Immutable zkEVM | 1000013371 | | Injective EVM | 2525 | | Injective | 6909546 | | Ink | 57073 | | Kaia | 8217 | | Kroma | 255 | | Linea | 59144 | | Lisk | 1135 | | LUKSO | 42 | | Lumia Prism | 1000073017 | | Manta Pacific | 169 | | Mantle | 5000 | | Merlin | 4200 | | Metal L2 | 1000001750 | | Metis Andromeda | 1088 | | Mint | 185 | | Mode | 34443 | | Molten | 360 | | Moonbeam | 1284 | | Morph | 2818 | | Nero | 1689 | | Neutron | 1853125230 | | Oort | 970 | | Optimism | 10 | | Orderly L2 | 291 | | Polygon | 137 | | Polygon zkEVM | 1101 | | Polynomial | 1000008008 | | Prom | 227 | | Proof of Play Apex | 70700 | | RARI Chain | 1000012617 | | re.al | 111188 | | Redstone | 690 | | Rivalz | 753 | | Rootstock | 1000000030 | | Sanko | 1996 | | Scroll | 534352 | | Sei | 1329 | | Shibarium | 109 | | SnaxChain | 2192 | | Solana | 1399811149 | | Soneium | 1868 | | Sonic | 146 | | SOON | 50075007 | | Superposition | 1000055244 | | Superseed | 5330 | | Swell | 1923 | | Taiko | 167000 | | Tangle | 5845 | | Telos EVM | 40 | | Torus | 21000 | | Treasure | 61166 | | Unichain | 130 | | Vana | 1480 | | Viction | 88 | | World Chain | 480 | | Xai | 660279 | | XLayer | 196 | | XPLA | 37 | | Zero Network | 543210 | | ZetaChain | 7000 | | Zircuit | 48900 | | zkLink Nova | 810180 | | zkSync | 324 | | Zora | 7777777 | | Network | Domain Identifier (uint32) | | --- | --- | | Abstract Testnet | 11124 | | Aleph Zero EVM Testnet | 2039 | | Alfajores | 44787 | | Arbitrum Sepolia | 421614 | | Arcadia Testnet v2 | 1098411886 | | Base Sepolia | 84532 | | Berachain bArtio | 80084 | | BSC Testnet | 97 | | Camp Network Testnet V2 | 325000 | | Citrea Testnet | 5115 | | Eco Testnet | 471923 | | Form Testnet | 132902 | | Fuji | 43113 | | Holesky | 17000 | | Hyperliquid EVM Testnet | 998 | | Ink Sepolia | 763373 | | Odyssey Testnet | 911867 | | Optimism Sepolia | 11155420 | | Plume Testnet | 161221135 | | Polygon Amoy | 80002 | | Scroll Sepolia | 534351 | | Sepolia | 11155111 | | Soneium Minato Testnet | 1946 | | Sonic Testnet | 64165 | | SUAVE Toliman Testnet | 33626250 | | Superposition Testnet | 98985 | | Tangle Testnet | 3799 | | Treasure Topaz Testnet | 978658 | | Unichain Testnet | 1301 | * [Core Domains](#core-domains) --- # Unknown Hyperlane Security Audit   Hyperlane Dec 3, 2024 Revision 1.0 ChainLight@Theori Theori, Inc. (“We”) is acting solely for the client and is not responsible to any other party. Deliverables are valid for and should be used solely in connection with the purpose for which they were prepared as set out in our engagement agreement. You should not refer to or use our name or advice for any other purpose. The information (where appropriate) has not been verified. No representation or warranty is given as to accuracy, completeness or correctness of information in the Deliverables, any document, or any other information made available. Deliverables are for the internal use of the client and may not be used or relied upon by any person or entity other than the client. Deliverables are confidential and are not to be provided, without our authorization (preferably written), to entities or representatives of entities (including employees) that are not the client, including affiliates or representatives of affiliates of the client. © 2024 ChainLight, Theori. All rights reserved 1 2 3 4 4 5 5 6 7 8 8 10 13 15 17 19 21 22 23 25 26 28 30 33 Table of Contents Hyperlane Security Audit Table of Contents Executive Summary Audit Overview Scope Code Revision Severity Categories Status Categories Finding Breakdown by Severity Findings Summary #1 HL2408001 ISM possible fund lock/theft issue #2 HL2408002 OPL2ToL1Ism can be bypassed Any message can be delivered) #3 HL2408003 ACL or replay protection must be added to AbstractMessageIdAuthHook.postDispatch() #4 HL2408004 Users assets could be locked in the interchain account #5 HL2408005 \_sendMessageId() of OPStackHook and ArbL2ToL1Hook should consider the case where msg.value and metadata.msgValue(0) are different #6 HL2408006 HypERC4626 does not work as a rebasing token #7 HL2408007 Wrapped HypERC4626 should be implemented for interoperability #8 HL2408008 Custom Hook Quote is not considered in the message dispatch process #9 HL2408009 HypERC4626OwnerCollateral.\_transferFromSender() must return HypERC4626.PRECISION on the remote chain #10 HL2408010 AbstractAggregationIsm.verify() fails when M is not equal to N #11 HL2408011 HypERC4626.\_handle() should restrict out-of-order updates of the exchangeRate #12 HL2408012 Minor Issues Revision History Hyperlane Security Audit | 2© 2024 ChainLight, Theori. All rights reserved Executive Summary Starting on Aug 19th, 2024, ChainLight of Theori audited the smart contract of Hyperlane for three weeks. In the audit, we primarily considered the issues/impacts listed below. Bypass message validation Temporary Fund Freeze Incorrect rebasing token implementation As a result, we identified issues as listed below. Total: 12 Critical: 1 Bypass message validation) High: 3 Temporary Fund Freeze) Medium: 4 Incorrect rebasing token implementation, ...) Low: 1 Informational: 3 Hyperlane Security Audit | 3© 2024 ChainLight, Theori. All rights reserved Audit Overview Scope NameHyperlane Security Audit Target / Version Git Repository (hyperlane-xyz/hyperlane-monorepo): commit 469f2f34030d9539f2038df302195b6a2dbc94c6 Apply patch commit) git diff v3-solidity main --numstat ./solidity/contracts Application Type Smart contracts Lang. / Platforms Smart contracts Solidity\] Code Revision N/A Hyperlane Security Audit | 4© 2024 ChainLight, Theori. All rights reserved Severity Categories SeverityDescription Critical The attack cost is low (not requiring much time or effort to succeed in the actual attack), and the vulnerability causes a high-impact issue. (e.g., Effect on service availability, Attacker taking financial gain) High An attacker can succeed in an attack which clearly causes problems in the service’s operation. Even when the attack cost is high, the severity of the issue is considered “high” if the impact of the attack is remarkably high. Medium An attacker may perform an unintended action in the service, and the action may impact service operation. However, there are some restrictions for the actual attack to succeed. Low An attacker can perform an unintended action in the service, but the action does not cause significant impact or the success rate of the attack is remarkably low. InformationalAny informational findings that do not directly impact the user or the protocol. Note Neutral information about the target that is not directly related to the project’s safety and security. Hyperlane Security Audit | 5© 2024 ChainLight, Theori. All rights reserved Status Categories StatusDescription Reported ChainLight reported the issue to the client. WIP The client is working on the patch. Patched The client fully resolved the issue by patching the root cause. Mitigated The client resolved the issue by reducing the risk to an acceptable level by introducing mitigations. Acknowledged The client acknowledged the potential risk, but they will resolve it later. Won't Fix The client acknowledged the potential risk, but they decided to accept the risk. Hyperlane Security Audit | 6© 2024 ChainLight, Theori. All rights reserved Finding Breakdown by Severity CategoryCountFindings Critical1 HL2408-002 High3 HL2408-001 HL2408-003 HL2408-009 Medium4 HL2408-004 HL2408-006 HL2408-010 HL2408-011 Low1 HL2408-005 Informational3 HL2408-007 HL2408-008 HL2408-012 Note0N/A Hyperlane Security Audit | 7© 2024 ChainLight, Theori. All rights reserved Findings Summary #IDTitleSeverityStatus 1 HL2408-001 ISM possible fund lock/theft issueHigh Won't Fix 2 HL2408-002 OPL2ToL1Ism can be bypassed Any me ssage can be delivered) Critical Patched 3 HL2408-003 ACL or replay protection must be added to AbstractMessageIdAuthHook.po stDispatch() High Patched 4 HL2408-004 Users assets could be locked in the inte rchain account Medium Patched 5 HL2408-005 \_sendMessageId() of OPStackHoo k and ArbL2ToL1Hook should consid er the case where msg.value and me tadata.msgValue(0) are different Low Patched 6 HL2408-006 HypERC4626 does not work as a rebas ing token Medium Patched 7 HL2408-007 Wrapped HypERC4626 should be imple mented for interoperability Informational Patched 8 HL2408-008 Custom Hook Quote is not considered i n the message dispatch process Informational Won't Fix 9 HL2408-009 HypERC4626OwnerCollateral.\_tran sferFromSender() must return HypE RC4626.PRECISION on the remote cha in High Patched Hyperlane Security Audit | 8© 2024 ChainLight, Theori. All rights reserved #IDTitleSeverityStatus 10 HL2408-010 AbstractAggregationIsm.verify () fails when M is not equal to N Medium Won't Fix 11 HL2408-011 HypERC4626.\_handle() should restri ct out-of-order updates of the exchan geRate Medium Patched 12 HL2408-012 Minor IssuesInformational Patched Hyperlane Security Audit | 9© 2024 ChainLight, Theori. All rights reserved #1 HL2408-001 ISM possible fund lock/theft issue IDSummarySeverity HL2408-001 Publicly accessible functions (i.e., verify, releaseValueToRecipient) on the ISM contracts allow any user to prematurely trigger the transfer of funds intended to a recipient, which disrupts the atomicity of the message processing. This premature release can lead to a scenario where funds transferred from various chain-specific portal contracts are locked and become irretrievable. High Description When the recipient uses one of the chain's portal contract (e.g., Portal for Optimism, Outbox for Arbitrum, ULN/Endpoint for LayerZero), the verifyMessageId function, which handles the message verification, is called by the portal contract and stores the msg.value. This msg.value is intended to be transferred to the recipient when the Mailbox calls verify function. Under normal operation, the Mailbox calls ISM.verify messages through the process function. If the message is successfully verified, the specified recipient receives the msg.value via the releaseValueToRecipient function on the ISM // solidity/contracts/isms/hook/AbstractMessageIdAuthorizedIsm.sol // solidity/contracts/isms/hook/AbstractMessageIdAuthorizedIsm.sol function function verifyMessageId verifyMessageId ( ( bytes32 bytes32 messageId messageId ) ) public public payable payable virtual virtual { { require require ( ( \_isAuthorized \_isAuthorized ( ( ) ) , , "AbstractMessageIdAuthorizedIsm: sender is not the hook" "AbstractMessageIdAuthorizedIsm: sender is not the hook" ) ) ; ; require require ( ( msg msg . . value value < < 2 2 \*\* \*\* VERIFIED\_MASK\_INDEX VERIFIED\_MASK\_INDEX , , "AbstractMessageIdAuthorizedIsm: msg.value must be less than 2 "AbstractMessageIdAuthorizedIsm: msg.value must be less than 2 ^255" ^255" ) ) ; ; verifiedMessages verifiedMessages \[ \[ messageId messageId \] \] = = msg msg . . value value . . setBit setBit ( ( VERIFIED\_MASK\_INDEX VERIFIED\_MASK\_INDEX Hyperlane Security Audit | 10© 2024 ChainLight, Theori. All rights reserved ) ) ; ; emit emit ReceivedMessage ReceivedMessage ( ( messageId messageId ) ) ; ; } } However releaseValueToRecipient is publicly accessible function that allows any user to prematurely trigger the release of funds to the recipient of the message. This premature release can lead to a scenario where funds transferred from various chain-specific portal contracts are locked and become irretrievable. // solidity/contracts/isms/hook/AbstractMessageIdAuthorizedIsm.sol // solidity/contracts/isms/hook/AbstractMessageIdAuthorizedIsm.sol function function releaseValueToRecipient releaseValueToRecipient ( ( bytes bytes calldata calldata message message ) ) public public { { bytes32 bytes32 messageId messageId = = message message . . id id ( ( ) ) ; ; uint256 uint256 \_msgValue \_msgValue = = verifiedMessages verifiedMessages \[ \[ messageId messageId \] \] . . clearBit clearBit ( ( VERIFIED\_MASK\_INDEX VERIFIED\_MASK\_INDEX ) ) ; ; if if ( ( \_msgValue \_msgValue > > 0 0 ) ) { { verifiedMessages verifiedMessages \[ \[ messageId messageId \] \] -= -= \_msgValue \_msgValue ; ; payable payable ( ( message message . . recipientAddress recipientAddress ( ( ) ) ) ) . . sendValue sendValue ( ( \_msgValue \_msgValue ) ) ; ; } } } } Impact High It can lead to the user funds losses as the funds sent from various chain-specific portal contracts could be locked or exploited. ideal scenario relayer (or someone) finalize the L2 transaction relayer/user calls process process calls ism.verify ism.verify releases the funds to the message's recipient if the bridged transaction has value call handle function of the recipient recipient uses address(this).balance, since ism transfers the fund to the recipient. attack scenario relayer (or someone) finalize the L2 transaction Hyperlane Security Audit | 11© 2024 ChainLight, Theori. All rights reserved attacker calls ism.verify or ism.releaseValueToRecipient it release the funds to the message's recipient if the bridged transaction has value. and subtract the value to 0. attacker calls process recipient uses victim's value (balance) relayer/user calls process process calls ism.verify ism.verify returns success, but it does not transfer any funds since there isn't remained fund. call handle function of the recipient recipient uses address(this).balance, but it's 0 at this moment. Recommendation The monkey patch could be add ACL on the both functions. (only callable by Mailbox). Remediation Won't Fix The team responded that they cannot add ACL to the verify function due to the ISM composability requirement. Hyperlane Security Audit | 12© 2024 ChainLight, Theori. All rights reserved #2 HL2408-002 OPL2ToL1Ism can be bypassed Any message can be delivered) IDSummarySeverity HL2408-002 OPL2ToL1Ism.\_verifyWithPortalCall() does not check metadata, which allows any messages to be delivered. Critical Description The OPL2ToL1Ism.\_verifyWithPortalCall() does not check metadata. While OPL2ToL1Ism.verify() is intended to check messages delivered by the OPL2ToL1Hook, the lack of metadata check enables this process to be bypassed. Consequently, an attacker can bypass the OPL2ToL1Ism verification process by sending a transaction directly to the OP portal. Impact Critical An attacker can craft messages that bypass OPL2ToL1Ism verification. Recommendation  it mitigates these kind of issues. function verify( function verify( bytes calldata metadata, bytes calldata metadata, bytes calldata message bytes calldata message ) external override returns (bool) { ) external override returns (bool) { bool verified = isVerified(message); bool verified = isVerified(message); if (!verified) { if (!verified) { \_verifyWithPortalCall(metadata, message); \_verifyWithPortalCall(metadata, message); } } + + require(isVerified(message)); require(isVerified(message)); releaseValueToRecipient(message); releaseValueToRecipient(message); return true; return true; } } Hyperlane Security Audit | 13© 2024 ChainLight, Theori. All rights reserved  properly check the L2's sender like ArbL2ToL1Ism does. // check if the sender of the l2 message is the authorized hook // check if the sender of the l2 message is the authorized hook require require ( ( l2Sender l2Sender == == TypeCasts TypeCasts . . bytes32ToAddress bytes32ToAddress ( ( authorizedHook authorizedHook ) ) , , "ArbL2ToL1Ism: l2Sender != authorizedHook" "ArbL2ToL1Ism: l2Sender != authorizedHook" ) ) ; ; Remediation Patched The issue has been resolved as recommended. Hyperlane Security Audit | 14© 2024 ChainLight, Theori. All rights reserved #3 HL2408-003 ACL or replay protection must be added to AbstractMessageIdAuthHook.postDispatch() IDSummarySeverity HL2408-003 When a user sends a message using an ISM that inherits AbstractMessageIdAuthorizedIsm with funds, an attacker can replay the message, causing the user's funds to be permanently locked within the ISM. High Description The AbstractMessageIdAuthHook.postDispatch() does not verify whether the msg.sender is a Mailbox or wether the message is being replayed. Consequently, an attacker can resend the same interchain message immediately after Mailbox.dispatch() is called. For example, suppose Alice sends an interchain message with 1 ether using the OP Stack ISM from L1. The Mailbox.dispatch() calls OPStackHook.postDispatch(), followed by the OPStackISM.verifyMessageId(messageId) being triggered in L2 by the deposit transaction. Under normal circumstances, when releaseValueToRecipient() is invoked, the verifiedMessages\[messageId\] 1 ether) will be transferred to the recipient. // solidity/contracts/isms/hook/AbstractMessageIdAuthorizedIsm.sol // solidity/contracts/isms/hook/AbstractMessageIdAuthorizedIsm.sol function function verifyMessageId verifyMessageId ( ( bytes32 bytes32 messageId messageId ) ) public public payable payable virtual virtual { { require require ( ( \_isAuthorized \_isAuthorized ( ( ) ) , , "AbstractMessageIdAuthorizedIsm: sender is not the hook" "AbstractMessageIdAuthorizedIsm: sender is not the hook" ) ) ; ; require require ( ( msg msg . . value value < < 2 2 \*\* \*\* VERIFIED\_MASK\_INDEX VERIFIED\_MASK\_INDEX , , "AbstractMessageIdAuthorizedIsm: msg.value must be less than 2 "AbstractMessageIdAuthorizedIsm: msg.value must be less than 2 ^255" ^255" ) ) ; ; verifiedMessages verifiedMessages \[ \[ messageId messageId \] \] = = msg msg . . value value . . setBit setBit ( ( VERIFIED\_MASK\_INDEX VERIFIED\_MASK\_INDEX ) ) ; ; Hyperlane Security Audit | 15© 2024 ChainLight, Theori. All rights reserved emit emit ReceivedMessage ReceivedMessage ( ( messageId messageId ) ) ; ; } } However, an attacker can replay the message with 0 msg.value by calling OPStackHook.postDispatch() immediately after the user calls Mailbox.dispatch(). This causes OPStackISM.verifyMEssageId(messageId) to be called again, leading to verifiedMessages\[messageId\] being set 0 + VERIFIED\_MASK. Since the verifiedMessages value is overwritten with 0, the user's funds become permanently locked within the ISM. Impact High User funds sent via interchain messages can become temporarily locked in the ISM (e.g., OPL2ToL1Ism, ArbL2ToL1Ism, LayerZeroV2Ism). Recommendation It is recommended to add the onlyMailbox() modifier to AbstractMessageIdAuthHook.\_postDispatch() and to implement replay protection in AbstractMessageIdAuthorizedIsm.verifyMessageId(). Remediation Patched Replay protection has been implemented by adding the check require(verifiedMessages\[messageId\] == 0). Hyperlane Security Audit | 16© 2024 ChainLight, Theori. All rights reserved #4 HL2408-004 Users assets could be locked in the interchain account IDSummarySeverity HL2408-004 The InterchainAccountRouter must transfer msg.value during multicall execution. Medium Description // File: https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/b1d8bb87 // File: https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/b1d8bb87 77684cfc863020d9f2eb170f166c112c/solidity/contracts/middleware/InterchainA 77684cfc863020d9f2eb170f166c112c/solidity/contracts/middleware/InterchainA ccountRouter.sol#L293-L310 ccountRouter.sol#L293-L310 function function handle handle ( ( uint32 uint32 \_origin \_origin , , bytes32 bytes32 \_sender \_sender , , bytes bytes calldata calldata \_message \_message ) ) external external payable payable override onlyMailbox override onlyMailbox { { // (A) // (A) ( ( bytes32 bytes32 \_owner \_owner , , bytes32 bytes32 \_ism \_ism , , CallLib CallLib . . Call Call \[ \[ \] \] memory memory \_calls \_calls ) ) = = InterchainAccountMessage InterchainAccountMessage . . decode decode ( ( \_message \_message ) ) ; ; OwnableMulticall \_interchainAccount OwnableMulticall \_interchainAccount = = getDeployedInterchainAccount getDeployedInterchainAccount ( ( \_origin \_origin , , \_owner \_owner , , \_sender \_sender , , \_ism \_ism . . bytes32ToAddress bytes32ToAddress ( ( ) ) ) ) ; ; \_interchainAccount \_interchainAccount . . multicall multicall ( ( \_calls \_calls ) ) ; ; // (B) // (B) } } Hyperlane Security Audit | 17© 2024 ChainLight, Theori. All rights reserved An interchain account supports to receive a native value from other chains (A) , however the interchain account contract does not transfer the received value to the multicall contract. Impact Medium Recommendation handle() should send the value when it calls to the OwnableMulticall.multicall on (B). (i.e. add {value: msg.value}) Remediation Patched The issue has been resolved as recommended. Hyperlane Security Audit | 18© 2024 ChainLight, Theori. All rights reserved #5 HL2408-005 \_sendMessageId() of OPStackHook and ArbL2ToL1Hook should consider the case where msg.value and metadata.msgValue(0) are different IDSummarySeverity HL2408-005 The \_sendMessageId() in OPStackHook and ArbL2ToL1Hook should consider scenarios where msg.value and metadata.msgValue(0) do not match. Low Description The \_sendMessageId() in OPStackHook and ArbL2ToL1Hook does not return the excess amount to the user when msg.value exceeds metadata.msgValue(0). In such cases, the excess remains in the Hook contract. Moreover, it does not validate the case where msg.value is less than metadata.msgValue(0), allowing an attacker to set msg.value to 0 and metadata.msgValue(0) to the ETH balance held by the Hook contract, thereby enabling the theft of ETH left in the contract. Impact Low If msg.value is greater than metadata.msgValue(0), the excess ETH will be retained in the contract, which an attacker could later extract by setting a higher metadata.msgValue(0). Recommendation  Add a check require(msg.value >= metadata.msgValue(0)); in the \_sendMessageId() of OPStackHook and ArbL2ToL1Hook.  Implement logic to return any excess amount to the user (message.sender()) if msg.value exceeds metadata.msgValue(0). Remediation Patched Hyperlane Security Audit | 19© 2024 ChainLight, Theori. All rights reserved The issue has been resolved as recommended. Hyperlane Security Audit | 20© 2024 ChainLight, Theori. All rights reserved #6 HL2408-006 HypERC4626 does not work as a rebasing token IDSummarySeverity HL2408-006 HypERC4626 was intended to be a rebasing token; however, some function overrides are missing. Medium Description A rebasing token is designed to have its total supply fluctuate dynamically. The HypERC4626 contract is a rebasing token that reflects the yields generated on the origin chain to the token balance. However, the contract does not fully support rebasing functionality because the transferFrom() and totalSupply() functions were not overridden to support the rebasing token function. Impact Medium Due to inconsistent handling between underlying amounts and share amounts, users may experience confusion. Some functions operate based on the underlying amount (transfer()), while others rely on the share amount (transferFrom()). Recommendation  Override transferFrom() to function similarly to the redefined transfer().  Override totalSupply() to return sharesToAssets(super.totalSupply()). Remediation Patched The issue has been resolved as recommended. Hyperlane Security Audit | 21© 2024 ChainLight, Theori. All rights reserved #7 HL2408-007 Wrapped HypERC4626 should be implemented for interoperability IDSummarySeverity HL2408-007 Given that HypERC4626 is a rebasing token, it's clear that integrating it into DeFi protocols presents significant challenges. To address this, we recommend the creation of a wrapper contract to facilitate its use. Informational Description Rebasing tokens dynamically adjusts token balances, which can present difficulties when used in DeFi protocols. For example, if a pair on UniswapV2 includes a rebasing token, the yield generated can be claimed by anyone via skim(). This scenario forces liquidity providers who supply rebasing tokens to forgo their yield while maintaining their liquidity positions, which is unfavorable. As a result, many rebasing tokens utilize wrapped rebasing token contracts. These contracts transfer rebasing tokens based on share units and return balances in share units, preventing automatic balance adjustments. Impact Informational Recommendation Developing wrapped rebasing token contracts like wstETH to support HypERC4626 in DeFi protocols is recommended. Remediation Patched The issue has been resolved as recommended. Hyperlane Security Audit | 22© 2024 ChainLight, Theori. All rights reserved #8 HL2408-008 Custom Hook Quote is not considered in the message dispatch process IDSummarySeverity HL2408-008 The Message Dispatch Process doesn't factor in Custom Hook Quotes when calculating the Relay Fee Quote. The relay process will always fail if the system includes an expensive Custom Hook. Informational Description The Mailbox.dispatch() function contains the following logic to handle underpayments: // solidity/contracts/Mailbox.sol#L298-L305 // solidity/contracts/Mailbox.sol#L298-L305 // ... // ... uint256 uint256 requiredValue requiredValue = = requiredHook requiredHook . . quoteDispatch quoteDispatch ( ( metadata metadata , , message message ) ) ; ; if if ( ( msg msg . . value value < < requiredValue requiredValue ) ) { { msg msg . . value value = = requiredValue requiredValue ; ; } } requiredHook requiredHook . . postDispatch postDispatch { { value value : : requiredValue requiredValue } } ( ( metadata metadata , , message message ) ) ; ; hook hook . . postDispatch postDispatch { { value value : : msg msg . . value value - - requiredValue requiredValue } } ( ( metadata metadata , , message message ) ) ; ; // ... // ... This causes a revert in the requiredHook when the msg.value is less than the required amount. However, the calculation of requiredValue only considers the result from requiredHook.quoteDispatch() and does not consider the value from hook.quoteDispatch() when determining the total amount needed for dispatch. Impact Informational The relay process will fail under these conditions:  The requiredHook.quoteDispatch() function returns 0. Hyperlane Security Audit | 23© 2024 ChainLight, Theori. All rights reserved  msg.value is 0 during dispatch.  A computationally expensive Custom Hook is used. Recommendation Modify the requiredValue calculation in the Mailbox.dispatch() function to include both requiredHook.quoteDispatch(metadata, message) and hook.quoteDispatch(metadata, message). This adjustment ensures that the costs from both requiredHook and hook are considered, aligning the logic with the intended design of the Mailbox.quoteDispatch() function. (requiredValue = requiredHook.quoteDispatch(metadata, message) + hook.quoteDispatch(metadata, message)) Remediation Won't Fix The client said that this is a known gas optimization issue and stated that callers must handle quoting outside of the mailbox, ideally off-chain. Hyperlane Security Audit | 24© 2024 ChainLight, Theori. All rights reserved #9 HL2408-009 HypERC4626OwnerCollateral.\_transferFromSender() must return HypERC4626.PRECISION on the remote chain IDSummarySeverity HL2408-009 HypERC4626OwnerCollaeteral sends a message with incorrect token metadata, which causes the sender's funds to be temporarily frozen in the contract. High Description The HypERC4626OwnerCollateral contract sends a message with \_tokenMetadata as bytes("") to HypERC4626 on the remote chain. HypERC4626.\_handle(), which is called during message processing in the remote chain, tries to abi.decode() the passed empty token metadata into uint256. This always results in a revert. As a result, the message sender cannot receive the message on the remote chain, and funds become temporarily locked in the HypERC4626OwnerCollateral contract. Impact High The sender's deposited assets at the origin chain to be temporarily frozen because of inability to receive messages on the remote chain. Since the HypERC4626OwnerCollateral contract is a proxy implementation, the owner can recover the locked assets through a contract upgrade.) Recommendation It is recommended that HypERC4626OwnerCollateral.\_transferFromSender() be modified to return the HypERC4626.PRECISION value from the remote chain. Remediation Patched The issue has been resolved as recommended. Hyperlane Security Audit | 25© 2024 ChainLight, Theori. All rights reserved #10 HL2408-010 AbstractAggregationIsm.verify() fails when M is not equal to N IDSummarySeverity HL2408-010 AbstractAggregationIsm.verify() will only succeed when exactly the required number of ISM verifications pass, due to multiple issues. Medium Description AbstractAggregationIsm.verify() reverts the entire transaction if any ISM verification fails or throws an error, preventing partial success in the intended m-of-n verification model. Additionally, the function decrements a threshold for each successful verification, which can lead to integer underflow if more ISMs pass than required, causing the transaction to fail unexpectedly. In the case of RateLimitedIsm.verify(), the verification may fail even if a transaction simulation by a relayer was successful, due to state changes by other transactions included earlier in the same block. Impact Medium These issues make AbstractAggregationIsm.verify() prone to failure in most cases unless M equals N. Suppose a relayer simulates ISM verification and only submits the required data. In that case, failures will be rare but still possible when there is a discrepancy between the simulation and actual execution. Recommendation Use try-catch to handle ISM verification errors, and do not revert when false is returned. If less trusted ISMs are included, consider using an assembly call with limited gas and return data size. Successful verifications should be counted and compared with the threshold rather than decrementing the threshold. Hyperlane Security Audit | 26© 2024 ChainLight, Theori. All rights reserved Remediation Won't Fix The client said that relayers aim to minimize costs and prefer not to verify more ISMs than necessary. Hyperlane Security Audit | 27© 2024 ChainLight, Theori. All rights reserved #11 HL2408-011 HypERC4626.\_handle() should restrict out-of- order updates of the exchangeRate IDSummarySeverity HL2408-011 The HypERC4626.\_handle() can decrease the exchange rate if messages are processed out of order, potentially leading to user fund losses in certain situations. Medium Description The HypERC4626.\_handle() parses the exchange rate from the token metadata in process messages and saves it in the exchangeRate variable. However, an outdated exchange rate may be saved since the message process order from the remote chain is not guaranteed. In a typical ERC4626, the exchange rate monotonically increases unless there has been a loss. However, if messages are processed out of order, the exchange rate could decrease, potentially reducing user token balances and causing losses. Impact Medium When HypERC4626 is used with DeFi protocols, users' assets could be lost due to the unordered message execution affecting the exchange rate. However, when assets are transferred back to the origin chain, they are sent based on shares, preventing direct loss in such cases. Recommendation The following measures are recommended:  Include the nonce when sending messages from the HypERC4626Collateral contract to the remote chain.  Record the last nonce each time the exchange rate is updated in HypERC4626.\_handle().  Only update the exchange rate if the previous nonce is less than the nonce in the token metadata. Hyperlane Security Audit | 28© 2024 ChainLight, Theori. All rights reserved Remediation Patched The issue has been resolved as recommended. Hyperlane Security Audit | 29© 2024 ChainLight, Theori. All rights reserved #12 HL2408-012 Minor Issues IDSummarySeverity HL2408-012 The description includes multiple suggestions for preventing incorrect settings caused by operational mistakes, mitigating potential issues, improving code maturity and readability, and other minor issues. Informational Description Operational Risk Mitigation / Sanity Check RateLimited.setRefillRate() allows unrestricted setting of the \_capacity value. If \_capacity is set to a value smaller than DURATION, the refillRate may be set to zero, causing a revert in calculateCurrentLevel(). It is recommended to enforce the condition \_capacity >= DURATION to ensure a minimum refillRate. In the TrustedRelayerIsm constructor, verify that the mailbox and trustedRelayer addresses are not zero to prevent configuration errors. AttributeCheckpointFraud, Mailbox, MailboxClient, and ProtocolFee are recommended to use Ownable2Step to avoid the risk of losing ownership. In TypeCasts.bytes32ToAddress(), add check require(uint256(\_buf) <= uint256(type(uint160).max)); to ensure valid address conversion. For ArbL2ToL1Ism, OPL2ToL1Ism.\_verifyWithPortalCall(), and LayerZeroV2Ism.lzReceive(), it is recommended to verify the function signature using require(AbstractMessageIdAuthorizedIsm.verifyMessageId == data\[0:4\]);. In HypERC4626Collateral and HypERC4626.\_transferRemote(), add require(address(hook) == \_hook); to prevent potential user fund losses by ensuring that the correct hook is specified. It is advised to adjust the PRECISION value in HypERC4626 and HypERC4626Collateral from 1e10 to IERC20(vault.asset()).decimals() to avoid precision loss. In ArbL2ToL1Ism.verify(), after executing \_verifyWithOutboxCall(), add require(isVerified(message)); for added security, similar to recommendations from Hyperlane Security Audit | 30© 2024 ChainLight, Theori. All rights reserved issue HL240801. In HypERC20Collateral.constructor(), verify that the erc20 address is not zero to prevent issues. EigenLayer) The ECDSAStakeRegistry.\_updateMinimumWeight() function should validate that the \_newMinimumWeight value is greater than the minimum threshold. EigenLayer) In the constructor of ECDSAStakeRegistry, the \_disableInitializers() function is commented out. This should be re-enabled in the production environment to ensure initialization safety. Code Maturity The condition metadata.msgValue(0) < 2 \*\* 255 in OPStackHook.\_sendMessageId() is redundant since it is already validated in \_postDispatch(). Removing this condition is recommended to improve code readability. Other Recommendations In OPL2ToL1Hook.\_sendMessageId(), replace require(msg.value >= metadata.msgValue(0) + GAS\_QUOTE) with require(msg.value >= metadata.msgValue(0)), as GAS\_QUOTE is already accounted for in L2 execution. The exchangeRate calculation in HypERC4626Collateral may differ from the ERC4626 standard. Modify the calculation to vault.convertToAssets(PRECISION) for consistency. HypERC4626Collateral.rebase() should allow specifying hook metadata and hook addresses to prevent failures during message processing on the remote chain. Modify the function to accept these parameters. In InterchainAccountRouter.handle(), it is crucial to verify that \_sender is an authorized InterchainAccountRouter from the origin chain to prevent manipulation of \_owner and \_ism. This validation should be added. InterchainAccountRouter lacks a dispatch function to specify the \_hook address. Add this functionality to ensure proper message handling, especially if isms are set to non-default ISM addresses. HypERC4626Collateral could be vulnerable to inflation attacks when using ERC4626 contracts prior to version 4.9. Developers should use ERC4626 version 4.9 or higher or account for inflation risks. Hyperlane Security Audit | 31© 2024 ChainLight, Theori. All rights reserved EigenLayer) The ECDSAStakeRegistry.isValidSignature() function does not fully comply with the ERC1271 standard. It should handle failure cases in \_checkSignatures() using a try-catch block and return the function selector 0xffffffff when an exception occurs. Missing / Confusing Events In RateLimited.validateAndConsumeFilledLevel(), it is recommended to emit events for changes in filledLevel and lastUpdated values for operational transparency. For MailboxClient.setHook() and MailboxClient.setInterchainSecurityModule(), emit events when state values are modified to ensure transparency. Emit events in GasRouter.setDestinationGas() whenever destination gas settings change to provide visibility. In HyperlaneServiceManager, emit events for changes in freezeoperator and setSlasher to improve operational clarity. ProtocolFee.setProtocolFee and ProtocolFee.setBeneficiary should emit events when state values are changed to ensure transparency. EigenLayer) For transparency in operations, it's recommended that setPaymentCoordinator and updateAVSMetadataURI in ECDSAServiceManagerBase emit events reflecting their changed state values. Impact Informational Recommendation Consider applying the suggestions in the description above. Remediation Patched Most of the issues have been resolved. Hyperlane Security Audit | 32© 2024 ChainLight, Theori. All rights reserved Revision History VersionDateDescription 1.0Dec 3, 2024Initial version Hyperlane Security Audit | 33© 2024 ChainLight, Theori. All rights reserved Theori, Inc. (“We”) is acting solely for the client and is not responsible to any other party. Deliverables are valid for and should be used solely in connection with the purpose for which they were prepared as set out in our engagement agreement. You should not refer to or use our name or advice for any other purpose. The information (where appropriate) has not been verified. No representation or warranty is given as to accuracy, completeness or correctness of information in the Deliverables, any document, or any other information made available. Deliverables are for the internal use of the client and may not be used or relied upon by any person or entity other than the client. Deliverables are confidential and are not to be provided, without our authorization (preferably written), to entities or representatives of entities (including employees) that are not the client, including affiliates or representatives of affiliates of the client. Hyperlane Security Audit | 34© 2024 ChainLight, Theori. All rights reserved --- # Unknown HyperlaneV3 SecurityAssessment(SummaryReport) November6,2023 Preparedfor: AbacusWorks,coredeveloperforHyperlane Hyperlane Preparedby:MichaelColburn,DamilolaEdwards,andSamuelMoelius AboutTrailofBits Foundedin2012andheadquarteredinNewYork,TrailofBitsprovidestechnicalsecurity assessmentandadvisoryservicestosomeoftheworld’smosttargetedorganizations.We combinehigh- endsecurityresearchwithareal -worldattackermentalitytoreduceriskand fortifycode.With100+employeesaroundtheglobe,we’vehelpedsecurecriticalsoftware elementsthatsupportbillionsofendusers,includingKubernetesandtheLinuxkernel. Wemaintainanexhaustivelistofpublicationsathttps://github.com/trailofbits/publications, withlinkstopapers,presentations,publicauditreports,andpodcastappearances. Inrecentyears,TrailofBitsconsultantshaveshowcasedcutting-edgeresearchthrough presentationsatCanSecWest,HCSS,Devcon,EmpireHacking,GrrCon,LangSec,NorthSec, theO’ReillySecurityConference,PyCon,REcon,SecurityBSides,andSummerCon. Wespecializeinsoftwaretestingandcodereviewprojects,supportingclientorganizations inthetechnology,defense,andfinanceindustries,aswellasgovernmententities.Notable clientsincludeHashiCorp,Google,Microsoft,WesternDigital,andZoom. TrailofBitsalsooperatesacenterofexcellencewithregardtoblockchainsecurity.Notable projectsincludeauditsofAlgorand,BitcoinSV,Chainlink,Compound,Ethereum2.0, MakerDAO,Matic,Uniswap,Web3,andZcash. Tokeepuptodatewithourlatestnewsandannouncements,pleasefollow@trailofbitson Twitterandexploreourpublicrepositoriesathttps://github.com/trailofbits.Toengageus directly,visitour“Contact”pageathttps://www.trailofbits.com/contact,oremailusat info@trailofbits.com. TrailofBits,Inc. 228ParkAveS#80688 NewYork,NY10003 https://www.trailofbits.com info@trailofbits.com TrailofBits 1HyperlaneV3SecurityAssessment PUBLIC NoticesandRemarks CopyrightandDistribution ©2023byTrailofBits,Inc. Allrightsreserved.TrailofBitsherebyassertsitsrighttobeidentifiedasthecreatorofthis reportintheUnitedKingdom. ThisreportisconsideredbyTrailofBitstobepublicinformation;itislicensedtoAbacus Worksunderthetermsoftheprojectstatementofworkandhasbeenmadepublicat AbacusWorks’request.Materialwithinthisreportmaynotbereproducedordistributedin partorinwholewithouttheexpresswrittenpermissionofTrailofBits. ThesolecanonicalsourceforTrailofBitspublicationsistheTrailofBitsPublicationspage. Reportsaccessedthroughanysourceotherthanthatpagemayhavebeenmodifiedand shouldnotbeconsideredauthentic. TestCoverageDisclaimer AllactivitiesundertakenbyTrailofBitsinassociationwiththisprojectwereperformedin accordancewithastatementofworkandagreeduponprojectplan. Securityassessmentprojectsaretime-boxedandoftenreliantoninformationthatmaybe providedbyaclient,itsaffiliates,oritspartners.Asaresult,thefindingsdocumentedin thisreportshouldnotbeconsideredacomprehensivelistofsecurityissues,flaws,or defectsinthetargetsystemorcodebase. TrailofBitsusesautomatedtestingtechniquestorapidlytestthecontrolsandsecurity propertiesofsoftware.Thesetechniquesaugmentourmanualsecurityreviewwork,but eachhasitslimitations:forexample,atoolmaynotgeneratearandomedgecasethat violatesapropertyormaynotfullycompleteitsanalysisduringtheallottedtime.Theiruse isalsolimitedbythetimeandresourceconstraintsofaproject. TrailofBits 2HyperlaneV3SecurityAssessment PUBLIC TableofContents AboutTrailofBits1 NoticesandRemarks2 TableofContents3 ProjectSummary4 ExecutiveSummary5 CodebaseMaturityEvaluation7 A.CodeMaturityCategories9 B.CodeQualityRecommendations11 C.FixReviewResults12 D.SupplementaryReviewSummary13 E.SupplementaryReviewCoverage15 F.SupplementaryReviewFindings16 1.ERC165(standardinterfacedetection)notused16 2.Useofoutdateddependenciesanddependencymanagementtools18 TrailofBits 3HyperlaneV3SecurityAssessment PUBLIC ProjectSummary ContactInformation Thefollowingprojectmanagerwasassociatedwiththisproject: BrookeLanghorne,ProjectManager brooke.langhorne@trailofbits.com Thefollowingengineeringdirectorwasassociatedwiththisproject: JosselinFeist,EngineeringDirector,Blockchain josselin.feist@trailofbits.com Thefollowingconsultantswereassociatedwiththisproject: MichaelColburn,ConsultantDamilolaEdwards,Consultant michael.colburn@trailofbits.comdamilola.edwards@trailofbits.com SamuelMoelius,Consultant samuel.moelius@trailofbits.com ProjectTimeline Thesignificanteventsandmilestonesoftheprojectarelistedbelow. DateEvent September20,2023Pre-projectkickoffcall October3,2023Deliveryofreportdraft October3,2023Reportreadoutmeeting October27,2023Deliveryoffixreviewdraft October30,2023Deliveryofsupplementaryreviewdraft October30,2023Supplementaryreviewreadoutmeeting November7,2023Deliveryofsummaryreport TrailofBits 4HyperlaneV3SecurityAssessment PUBLIC ExecutiveSummary EngagementOverview AbacusWorksengagedTrailofBitstoreviewthesecurityofthechangestotheHyperlane cross-chainmessagingprotocolsmartcontracts,aspartoftheV3upgradeincommit fcfecdf ofPR#2733. AteamoftwoconsultantsconductedthereviewfromSeptember25toSeptember29, 2023,foratotaloftwoengineer-weeksofeffort.Withfullaccesstosourcecodeand documentation,weperformedstaticanddynamictestingofthecodebase,using automatedandmanualprocesses. ObservationsandImpact ThisreviewwasfocusedonthechangesintroducedinthenewversionoftheHyperlane smartcontracts.Thecore Mailbox contractsawheavymodification,withsome functionalityhavingbeengeneralizedintoanewmodularhookpattern.Otherchanges weresmallerinscopeandspreadacrossanumberofcontracts.Ourreviewfocusedon identifyinganyunhandlededgecasesthatmayhavebeenintroducedbythese architecturalchanges,reviewingtheprotocolfeelogictocheckthatfundsarebeing handledproperlyandcannotbeaccessedwithoutpermission,andexploringhowmalicious customhookscouldaffecttheprotocol. ThisreviewwasscopedtoreviewonlythechangestotheSoliditycontracts,andasaresult, wedidnotperformanin-depthreviewofunmodifiedcontractsorfunctionalitybutdid refertothemwhennecessarytoimproveourunderstandingoftheoverallsystem.Any Rustcomponents,suchastherelayerandvalidatorcodebases,werenotinscopeforthis review. Ourreviewdidnotidentifyanysecurityissues.InappendixB,weprovidealistofcode qualityrecommendationsthatcouldhelpimprovethereadabilityormaintainabilityofthe codebutthatarenotdirectlyrelatedtoanysecurityconcerns. Theinclusionofend-to-endtestsinthetestingsuitehelpsimproveconfidenceinthe functionalityofthecodeandiscrucialforacross-chainprotocollikethis.Thenewfeatures inthisversiondosimplifyusers’interactionswiththesystembutalsoincreasetheoverall complexityofthecodebase,soensuringdocumentationisuptodatebothinsidethe contractsandinhigher-leveldocumentationwillbeimportantgoingforward. Recommendations Thecodebasecouldbenefitfromacomprehensivereviewofallon-chainandoff-chain componentstohelpensurecorrectness.Duetotheshorttimeframeandspecificfocusof thisengagement,somecontractfunctionalitywasnotreviewedasthoroughly,andnoneof TrailofBits 5HyperlaneV3SecurityAssessment PUBLIC theoff-chaincomponentswerereviewed.AbacusWorksshouldalsocontinuetoupdate thedocumentationandinvestigatehowthecurrentconfigurationforfuzztestsaffects coverageandwhethertheuseofthedefaultnumberofrunsisadequate. TrailofBits 6HyperlaneV3SecurityAssessment PUBLIC CodebaseMaturityEvaluation TrailofBitsusesatraffic-lightprotocoltoprovideeachclientwithaclearunderstandingof theareasinwhichitscodebaseismature,immature,orunderdeveloped.Deficiencies identifiedhereoftenstemfromrootcauseswithinthesoftwaredevelopmentlifecyclethat shouldbeaddressedthroughstandardizationmeasures(e.g.,theuseofcommonlibraries, functions,orframeworks)ortrainingandawarenessprograms. CategorySummaryResult ArithmeticThecodebaseusesversion0.8oftheSoliditycompiler, whichincludesbuilt-inoverflowdetection.Thearithmetic inthesystemisgenerallysimple,asitprimarilyrelatesto gasandfeecalculationsandloopcounters. Satisfactory AuditingThecontractshaveadequateeventstofacilitate monitoring,whichiscriticalforacross-chainmessaging protocol.Theuserdocumentationincludesinstructions forsettingupmonitoringforavalidator,whichconsumes themessagesbeingsentthroughtheprotocol. Satisfactory Authentication/ AccessControls Theaccesscontrolschemausedbythesystemis straightforward.Functionsarerestrictedtospecific contracts,orthecontractownerwherenecessary.The hookandinterchainsecuritymodulemechanisms(ISMs) alsoperformanimportantrolewithrespectto authorizationinthesystem.Wedidnotidentifyany issuesinthesemechanisms,buttheirmodularnatures willmakeproperconfigurationcritical. Satisfactory Complexity Management Whilethenewversionofthecontractsprovidesasimpler interfacetousers,underthehoodtherearelongcall sequencesandcomplexcontractinheritances,whichcan maketracingtheflowofexecutiondifficultattimes.The modularityofthehookandISMarchitectureallowsalot offlexibilityinconfiguringthesystem,butthisalso inherentlyincreasesthecomplexity.Wedidnotidentify anysignificantcodeduplication,anddespitethelongcall sequences,individualfunctionsareeasytounderstand. Moderate TrailofBits 7HyperlaneV3SecurityAssessment PUBLIC DecentralizationTheredoesnotappeartobesupportforslashingatthis time,sovalidatorshaveahighdegreeoftrustinthe system.However,anybodycansetupanindependent deploymentofthesystemwithadifferentvalidatorset. Thiscouldprovideaviablealternativetountrusting users,especiallyforcasesoutsideoftokenbridging (whichmayrelymoreheavilyonnetworkeffects). Moderate DocumentationThesystemhasgooddocumentationofthecurrent versionforusersandexternalintegrators.Ensurethat thisdocumentationispromptlyupdatedtomatchthe newversion.MuchofthecodebasehasgoodNatSpec commentcoverage;however,thenewercodeis commentedlessconsistently.Inparticular,thereisa documentationgaparoundthefunctionalityand intendeduseofthevarioushooks. Moderate Low-Level Manipulation Assemblyuseisminimalandmostinstancesaretrivial. Theassemblyblockinthe MetaProxy librarycouldbe betterdocumented.Thecontractsleveragelibrariesfor handlinglow-levelcalls,andreturnvaluesarechecked whereappropriate. Satisfactory Testingand Verification TestsforthecodebaseareruninCI,includingend-to-end tests.Anygapsincoveragearehighlightedinnewpull requests.Thetestsuitealsoincludessomefuzztests,but theyarerunonlyfortheFoundrydefaultof256runs,so itisunclearifthefuzztestsmeaningfullyimprovetest coverage. Satisfactory Transaction Ordering Wedidnotidentifyanyconcernsrelatedtotransaction orderinginthecodebase. Satisfactory TrailofBits 8HyperlaneV3SecurityAssessment PUBLIC A.CodeMaturityCategories Thefollowingtablesdescribethecodematuritycategoriesandratingcriteriausedinthis document. CodeMaturityCategories CategoryDescription ArithmeticTheproperuseofmathematicaloperationsandsemantics AuditingTheuseofeventauditingandloggingtosupportmonitoring Authentication/ AccessControls Theuseofrobustaccesscontrolstohandleidentificationand authorizationandtoensuresafeinteractionswiththesystem Complexity Management Thepresenceofclearstructuresdesignedtomanagesystemcomplexity, includingtheseparationofsystemlogicintoclearlydefinedfunctions Cryptographyand KeyManagement Thesafeuseofcryptographicprimitivesandfunctions,alongwiththe presenceofrobustmechanismsforkeygenerationanddistribution DecentralizationThepresenceofadecentralizedgovernancestructureformitigating insiderthreatsandmanagingrisksposedbycontractupgrades DocumentationThepresenceofcomprehensiveandreadablecodebasedocumentation Front-Running Resistance Thesystem’sresistancetofront-runningattacks Low-Level Manipulation Thejustifieduseofinlineassemblyandlow-levelcalls Testingand Verification Thepresenceofrobusttestingprocedures(e.g.,unittests,integration tests,andverificationmethods)andsufficienttestcoverage TrailofBits 9HyperlaneV3SecurityAssessment PUBLIC RatingCriteria RatingDescription StrongNoissueswerefound,andthesystemexceedsindustrystandards. SatisfactoryMinorissueswerefound,butthesystemiscompliantwithbestpractices. ModerateSomeissuesthatmayaffectsystemsafetywerefound. WeakManyissuesthataffectsystemsafetywerefound. MissingArequiredcomponentismissing,significantlyaffectingsystemsafety. NotApplicableThecategoryisnotapplicabletothisreview. NotConsideredThecategorywasnotconsideredinthisreview. Further Investigation Required Furtherinvestigationisrequiredtoreachameaningfulconclusion. TrailofBits 10HyperlaneV3SecurityAssessment PUBLIC B.CodeQualityRecommendations Thefollowingrecommendationsarenotassociatedwithspecificvulnerabilities.However, theyenhancecodereadabilityandmaypreventtheintroductionofvulnerabilitiesinthe future. ● The Indexed contractisinheritedbyseveralcontracts,butitsfunctionalityisnot currentlybeingused.Considerremovingitifitisnotrequired. ● Considerrenamingthe DestinationRecipientRoutingHook contracttobemore inlinewiththe DomainRoutingHook contractitinheritsfrom.Similarly,the configCustomHook functioncouldberenamedto setHook toalignwithasimilar functioninthe DomainRoutingHook contract. ● The ERC5164Hook contract’s \_quoteDispatch functionrevertswhilethe \_quoteDispatch functioninotherhookcontractsreturns 0 .Updatethisfunction tobeconsistentwiththeothers,ordocumentwhyitisexpectedtobehave differently. TrailofBits 11HyperlaneV3SecurityAssessment PUBLIC C.FixReviewResults OnOctober26,2023,TrailofBitsreviewedfixesforfourissuesidentifiedbyAbacusWorks concurrenttoourreview,aswellasminoradditionalchangestothesmartcontracts.We reviewedeachfixtodetermineitseffectivenessinresolvingtheassociatedissue.No additionalissueswereidentifiedduringthisfixreview. Thefirstissuewastheinabilitytounenrollaremoterouterfromthesystem.Thisissuewas addressedinPR#2760byaddingthe unenrollRemoteRouter functioninthe Router contractanda remove functioninboththe DefaultFallbackRoutingIsm and DomainRoutingIsm contracts. Thesecondissueidentifiedanedgecasewherecallsto Mailbox.process unexpectedly revertiftheyspecifyarecipientcontractthathasafallbackfunctionbutdoesnothavean interchainSecurityModule functiontospecifyanon-defaultISM.Thisissuewas addressedinPR#2767,whichupdatedthelogictocheckforanonzeroreturndatalength beforeattemptingtodecodethereturnvalueasanaddress. Thethirdissueidentifiedanedgecasewhereusersreceiveanunclearerrormessageif theyincludeinsufficientpaymentwiththeircallto Mailbox.dispatch ,asthistriggersan arithmeticunderflow.ThisissuewasaddressedinPR#2769bycappingthequoted paymentamounttotheamountprovidedbythecalleranddeferringtheerrorhandlingto theunderlyinghookthatisbeingunderpaid. Thefourthissuewasapotentialraceconditionwiththe AbstractMessageIdAuthorizedIsm contract’s verify function.Thisissuecouldallow anattackertodirectlycall verify aftertheauthorizedentitycallsthe verifyMessageId functiontomarkamessageasverified,butbeforetherelayertriggersthecallto verify as partoftheexpectedflow.Thiswouldpotentiallyallowtheattackertotransferfundsmore timesthanintended.ThisissuewasaddressedinPR#2835byaddinglogictoreducethe outstandingvaluetobetransferredduringeachcallto verify .However,thisfixisnotyet includedinthetaggedpre-releaseasofthecommitlistedbelow. Theremainingcodechangesmainlyconsistofreorganizingthedirectorystructureofthe contracts,changingvisibilityofsomefunctions,andmakingminorsimplificationstosome contracts.Fulldetailsoftheadditionalchangescanbefoundonthe audit-remediations taggedreleaseatcommit d69d76a . TrailofBits 12HyperlaneV3SecurityAssessment PUBLIC D.SupplementaryReviewSummary EngagementOverview AbacusWorksengagedTrailofBitstoreviewthesecurityofthechangestotheHyperlane cross-chainmessagingprotocolsmartcontracts,aspartoftheV3upgradeincommit fcfecdf ofPR#2733. Toensurethechangesreceivedsufficientcoverage,oneconsultantperformeda subsequentreviewfromOctober25toOctober27,2023,foratotalofthreeadditional engineer-daysofeffort.Withfullaccesstosourcecode,documentation,andtheresultsof theSeptember25–29review,weperformedstaticanddynamictestingofthecodebase, usingautomatedandmanualprocesses. ObservationsandImpact Thesystemisextremelycomplexbyvirtueofbeinganinterchainmessagingsystem.Thus, itwouldbenefitfromacomprehensivereviewinitsentirety. Theneedforacomprehensivereviewisfurtherevidencedbythefollowingevents.While reviewingthechangesintroducedby fcfecdf ,wefoundadoublespendbugnotrelatedto thosechanges. 1 Fortunately,thebugwasalsonoticedbyAbacusWorks,andfixedbyPR #2835.However,basedonourunderstandingofthecode,thebugcouldhavebeen catastrophicfortheprotocol. TheV3auditremediationsdocumentsuggeststhatproducinghelpfulrevertmessagesis preferabletorelyingonSoliditypanics,andweagree.WeencourageAbacusWorksto continuethispractice,eventhoughtheviewisnotheldindustrywide. Recommendations Basedonthefindingsidentifiedduringthesecurityreview,TrailofBitsrecommendsthat AbacusWorkstakethefollowingsteps: ● Remediatethefindingsdisclosedinthisreport.Thesefindingsshouldbe addressedaspartofadirectremediationoraspartofanyrefactorthatmayoccur whenaddressingotherrecommendations. ● Seekacomprehensivereviewofthecodeinitsentirety.Interchainmessaging systemsarecomplexbytheirnature.Moreover,wehappeneduponapotentially 1 Toelaborate,weranSlitheraswenormallydoforSolidityaudits.Slitherproducedafalsepositive regardingpotentiallylockedetherinthe ERC5164Ism contractviathe AbstractMessageIdAuthorizedIsm.verifyMessageId function.WhileinvestigatingtheSlither report,wenoticedthepotentialdoublespendbug. TrailofBits 13HyperlaneV3SecurityAssessment PUBLIC catastrophicbugbyaccident.Thesefactssuggestacomprehensivereviewis needed. ● ContinuetopreferinformativerevertmessagesoverSoliditypanics.Doingso allowsonetodistinguishanticipatedfailures(theformercase)fromunanticipated failures(thelattercase). TrailofBits 14HyperlaneV3SecurityAssessment PUBLIC E.SupplementaryReviewCoverage Thissectionprovidesanoverviewoftheanalysiscoverageofthereview,asdeterminedby ourhigh-levelengagementgoals.Ourapproachesincludedthefollowing: ● Documentationreview.WereviewedtheHyperlanedocumentationtogetan overviewofwhatthesystemdoesandwhatitsmaincomponentsare.Wealso reviewedtheV3auditremediationsdocument,tounderstandtheissuesdiscovered followingtheSeptember25–29TrailofBitsaudit. ● Staticanalysis.WeranSlitheroverthecodebaseandreviewedtheresults. ● Testcoverageanalysis.Weverifiedthattheproject’sHardhatandFoundrytests pass.Wealsocomputedtheirtestcoverageandlookedforobviousgaps. ● Pullrequestreview.WereviewedthepullrequestsmentionedintheV3audit remediationsdocumentinattempttounderstandhowtheyaddresstheissues namedinthatdocument. ● Manualreview.Wecursorilyreviewedthechangesintroducedbycommit fcfecdf . CoverageLimitations Becauseofthetime-boxednatureoftestingwork,itiscommontoencountercoverage limitations.Thefollowinglistoutlinesthecoveragelimitationsoftheengagementand indicatessystemelementsthatmaywarrantfurtherreview: ● Interchainmessaging/bridgingsystemsareinherentlycomplex.Thesemantics ofsuchsystemsdependuponthesemanticsofthechainswithwhichtheyoperate. Sincesuchsystemsnecessarilyinvolvemultiplechains,theyaremorecomplexthan typical,single-chainblockchainprojects. ● Reviewingadiffisinherentlylimited.Determiningwhetherchangeintroducesa bugrequiresanunderstandingofhowthecodeoperatespriortothechange. Withoutsuchanunderstanding,onemustmakeassumptionsabouthowthecode operates. TrailofBits 15HyperlaneV3SecurityAssessment PUBLIC F.SupplementaryReviewFindings 1.ERC165(standardinterfacedetection)notused Severity:LowDifficulty:Low Type:DataValidationFindingID:TOB-HYPERLANE-1 Target: solidity/contracts/client/MailboxClient.sol , solidity/contracts/hooks/DomainRoutingHook.sol Description Inseveralplaces,anaddressiscasttoaninterfacewithoutfirstusingERC165:Standard InterfaceDetectiontocheckthattheinterfaceisimplemented.Assuminganinterfaceis implemented,whenitisnot,couldleadtoundesiredbehaviororconfusingerror messages. Exampleswhereinterfacedetectioncouldbeusedappearinfigures1.1through1.3.Note alsothatthe setHook functioninfigure1.3appearstolackan onlyContractOrNull modifier.However,theproblemwouldbecomemootifinterfacedetectionwereused. 63functionsetHook(address\_hook)publiconlyContractOrNull(\_hook)onlyOwner{ 64hook=IPostDispatchHook(\_hook); 65} Figure1.1:ExamplewhereERC165:StandardInterfaceDetectioncouldbeused(1of3) ( hyperlane-monorepo/solidity/contracts/client/MailboxClient.sol#63–65 ) 71functionsetInterchainSecurityModule(address\_module) 72public 73onlyContractOrNull(\_module) 74onlyOwner 75{ 76interchainSecurityModule=IInterchainSecurityModule(\_module); 77} Figure1.2:ExamplewhereERC165:StandardInterfaceDetectioncouldbeused(2of3) ( hyperlane-monorepo/solidity/contracts/client/MailboxClient.sol#71–77 ) 45functionsetHook(uint32destination,addresshook)publiconlyOwner{ 46hooks\[destination\]=IPostDispatchHook(hook); 47} TrailofBits 16HyperlaneV3SecurityAssessment PUBLIC Figure1.3:ExamplewhereERC165:StandardInterfaceDetectioncouldbeused(3of3) ( hyperlane-monorepo/solidity/contracts/hooks/DomainRoutingHook.sol#45–47 ) Note:AbacusWorksnoticedacasewherethe Mailbox.recipientIsm functionwould revertiftherecipientdidnotcorrectlyimplementthe ISpecifiesInterchainSecurityModule interface.TheproblemwasfixedbyPR#2767. SimilarcasescouldbeavertedbyusingERC165. ExploitScenario Aliceaccidentallycalls MailboxClient.setInterchainSecurityModule withan addressthatisnotforISM.Hermailboxclientdoesnotfunctioncorrectlyandproduces confusingerrormessages.Timeandeffortarewastedtryingtodiagnosetheproblem. Recommendations Shortterm,adjustthecodeinfigures1.1through1.3touseERC165:StandardInterface Detection.Doingsowillhelptocatchcaseswherethefunctionsarecalledwithcontracts thatdonotimplementtherequiredinterfaces. Longterm,regularlytestyourcodewithinvalidinputs,includingcontractsthatdonot implementtherequiredinterfaces.Doingsowillhelptoensurethatsuchcasesare handledcorrectly,andthatusefulerrormessagesareproduced. TrailofBits 17HyperlaneV3SecurityAssessment PUBLIC 2.Useofoutdateddependenciesanddependencymanagementtools Severity:UndeterminedDifficulty:Undetermined Type:PatchingFindingID:TOB-HYPERLANE-2 Target: .yarnrc.yml , yarn.lock Description TheprojectusesanoldversionofYarn,andanoldversionoftheOpenZeppelincontracts. Useofoutdatedsoftwarecouldmeanbugfixesaremissed. TheprojectusesYarnversion3.2.0,asshowninfigure2.1.ThemostrecentversionofYarn inthe3.2.\*seriesis3.2.4,andinthe3.\*.\*seriesis3.4.1. 11yarnPath:.yarn/releases/yarn-3.2.0.cjs Figure2.1:Yarnversiontheprojectispinnedto(version3.2.0) ( hyperlane-monorepo/.yarnrc.yml#11 ) Similarly,theprojectusesOpenZeppelincontractsversion4.8.0,asshowninfigure2.2.The mostrecentversionofthecontractsinthe4.8.\*seriesis4.8.3,andinthe4.\*.\*seriesis 4.9.3. 4892"@openzeppelin/contracts@npm:^4.8.0": 4893version:4.8.0 4894resolution:"@openzeppelin/contracts@npm:4.8.0" 4895checksum: dfab51a7f91735cfb1e94dd5074736b0dac0207e4ebf26eb46b32defd3b67adce5a36b248daa7b841c21 be74863c1e37cf92ed194a9c36d3f8c5326d1a24242a 4896languageName:node 4897linkType:hard Figure2.2:OpenZeppelincontractsversiontheprojectispinnedto(version4.8.0) ( hyperlane-monorepo/yarn.lock#4892–4897 ) Notethatthelatterproblemseemstoberelatedtotheformer.Ifonedeletesthe .yarnrc.yml fileandrunsthelateststableversionofYarn(version1.22.19),the yarn.lock fileisupdatedtorefertoversion4.9.3oftheOpenZeppelincontracts. ExploitScenario Abugisfoundinversion4.8.0oftheOpenZeppelincontracts.ThebugaffectsHyperlane. MalloryexploitsHyperlane,knowingitusestheoutdated,vulnerablecontracts. TrailofBits 18HyperlaneV3SecurityAssessment PUBLIC Recommendations Shortterm,unlessthereisagoodreasonnotto,usethelateststableversionofYarn (version1.22.19).ForeachofHyperlane’simmediatedependencies,verifythatthemost recentversionofthedependencyappearsinthe yarn.lock file.Takingthesestepswill helpensurethatHyperlanedoesnotuseoutdated,vulnerabledependencies. Longterm,regularlyrun yarnupgrade .DoingsowillhelpensurethatHyperlaneuses up-to-datedependencies. TrailofBits 19HyperlaneV3SecurityAssessment PUBLIC --- # Unknown Customer:Hyperlane Date:Apr03,2023 ThisreportmaycontainconfidentialinformationaboutITsystemsandthe intellectualpropertyoftheCustomer,aswellasinformationabout potentialvulnerabilitiesandmethodsoftheirexploitation. ThereportcanbedisclosedpubliclyafterpriorconsentbyanotherParty. Anysubsequentpublicationofthisreportshallbewithoutmandatory consent. Document Name SmartContractCodeReviewandSecurityAnalysisReportfor Hyperlane ApprovedBy EvgeniyBezuglyi|SCAuditsDepartmentHeadatHackenOU Type Interchainmessaging Platform EVM Language Solidity Methodology Link Website hyperlane Changelog 28.01.2023–InitialReview 03.04.2023–SecondReview www.hacken.io 2 Tableofcontents Introduction4 Scope4 SeverityDefinitions10 ExecutiveSummary10 CheckedItems12 SystemOverview15 Findings18 Critical18 High18 H02.UpgradeabilityErrors18 H03.UpgradeabilityErrors18 H05.DataInconsistency18 H07.CompilationError19 Medium19 M02.MissingSafeERC2019 M03.BestPracticeViolation20 M04.Unfinalizedcode20 M05.Copyofwell-knowncontract20 M08.DataConsistency21 M09.BestPractices21 M10.UpgradeabilityErrors22 Low22 L01.InefficientGasModel22 L02.UnemittedEvents23 L03.FunctionVisibility23 L04.BooleanEquality23 L06.FloatingPragma24 L07.OutdatedSolidityVersion24 L08.MisleadingRequireMessage24 L09.EmptyConstructor24 L10.Missingzeroaddressvalidation25 L11.StyleGuideViolation25 Disclaimers26 www.hacken.io 3 Introduction HackenOÜ(Consultant)wascontractedbyHyperlane(Customer)toconducta SmartContractCodeReviewandSecurityAnalysis.Thisreportpresentsthe findingsofthesecurityassessmentoftheCustomer'ssmartcontracts. Scope Thescopeoftheprojectisreviewandsecurityanalysisofsmartcontracts intherepository: Initialreviewscope Repositoryhttps://github.com/hyperlane-xyz/hyperlane-monorepo/tree/audit- v2/solidity/contracts https://github.com/hyperlane-xyz/hyperlane-token/tree/main/cont racts Commitb450181c7fc255149ce86551f21dacd7ab47d5f5 ca7bb745a6fb9f21ec727a1a41a55c800d2f453a WhitepaperLink Functional Requirements Link Contracts File:./solidity/contracts/Call.sol SHA3:93dbcebdbbf479563e3c43ba33e392a17df3513073fd6df69edb1461f5d7780d File:./solidity/contracts/HyperlaneConnectionClient.sol SHA3:146bc2a168ff2752e01a317d7c09ea581ca91567edc48eb4b80d9d0f099ec771 File:./solidity/contracts/InterchainGasPaymaster.sol SHA3:694e10520d18dbb217d52b62d0461b4c16c8a528490ff8ff610fe0f8d6aad91c File:./solidity/contracts/isms/MultisigIsm.sol SHA3:cf9b43321dfc90f3914fc81ebb1ba78916ed828573146935a7f5e79e26bc30a7 File:./solidity/contracts/libs/EnumerableMapExtended.sol SHA3:c4115c2ce6f2a0efc48c63e5869464eda34f8b5cfee9fc42eba149d74d23ef7c File:./solidity/contracts/libs/Merkle.sol SHA3:26bda8009ee094c60b3c0c10ec454bc3bfffbc74d45c49fd1ed50d696aed7751 File:./solidity/contracts/libs/Message.sol SHA3:f9ff058e169c9d5ff5a869293fdba1a8531a1e0db5c61a7b8885a26deda95b64 File:./solidity/contracts/libs/MinimalProxy.sol SHA3:510914afe4a147b567a630146199b8fe3c17d1f5834698c47f1ad097f39797f9 File:./solidity/contracts/libs/MultisigIsmMetadata.sol SHA3:3fcd0f0657d0e9568ad90367a63cd6f39e90849c4396e2fe6e7d9ddd570f0689 File:./solidity/contracts/libs/TypeCasts.sol SHA3:a6aba3f1569a897fef473a4a05d632db8b111eb41fe48f8c36c27a7d382a028a www.hacken.io 4 File:./solidity/contracts/Mailbox.sol SHA3:fb168497e3a11a0915c11b7a870db5d9b58ed64575d5c37adae097129d23c8ca File:./solidity/contracts/middleware/InterchainAccountRouter.sol SHA3:2ace30bb884683fa36e49efa2509b7921ad14bb1c34df25708faf65a644768de File:./solidity/contracts/middleware/InterchainQueryRouter.sol SHA3:dc5f3899c2dee5eec6fb58a6167036f2277b58de81e3e3f4cae0eefd6481a298 File: ./solidity/contracts/middleware/liquidity-layer/adapters/CircleBridgeA dapter.sol SHA3:641fbcbfc6fa305e58fac7862e705b23ea92c43e66c2a662abe4257dfe207cd8 File: ./solidity/contracts/middleware/liquidity-layer/interfaces/circle/ICir cleBridge.sol SHA3:21d6baf6b1c2573cdc496920e4a6e69cbebc53dbbd26b7ebbb60fb883efb50f0 File: ./solidity/contracts/middleware/liquidity-layer/interfaces/circle/ICir cleMessageTransmitter.sol SHA3:16239fdf7eb2cdba4972b61bd3200626d8116d52152fdb618788df78a6698f13 File: ./solidity/contracts/middleware/liquidity-layer/interfaces/ILiquidityL ayerAdapter.sol SHA3:8fb04b2bdb660334756796dc3168ea0518ac537257b3bf59db0b8b9321099d8d File: ./solidity/contracts/middleware/liquidity-layer/LiquidityLayerRouter.s ol SHA3:45c016018f1bb69881744038a496febebbe590943197d8f4aba3e45d620f32a5 File:./solidity/contracts/OwnableMulticall.sol SHA3:7366a1ce357c857421b952c35c9d5a253af8a178c883a42f891b9b0b6154c1cb File:./solidity/contracts/PausableReentrancyGuard.sol SHA3:f21a36f320243422aaf896d1127d7a2ad44c9e04610ba79bc23ac68ddaacf849 File:./solidity/contracts/Router.sol SHA3:6b8d3ffaeff8d2935b893a74e4705341c5b317771b8496246094781078adafc0 File:./solidity/contracts/upgrade/Versioned.sol SHA3:7b1e8357094ec9676a04cf8b6b6e022155c12f9949688dd9a6479e5640716a60 File:./solidity/interfaces/IInterchainAccountRouter.sol SHA3:bd6fa3bc80ec1faec01f41f744cae3323ee14d469ecd537995f457da4aa07ddf File:./solidity/interfaces/IInterchainGasPaymaster.sol SHA3:2684fb8703fc8b29c3e7ad6c8e617322c8912eaadb400aad88255781a2621024 File:./solidity/interfaces/IInterchainQueryRouter.sol SHA3:42283382b3e8a82969972b25334d486d91edbed4e5bfa44c0adfbadf8d634984 File:./solidity/interfaces/IInterchainSecurityModule.sol SHA3:abd2e0879ec812a8ae5f1975977128ca1dd19f7a2af239682096b05e82ea7f4f File:./solidity/interfaces/ILiquidityLayerMessageRecipient.sol SHA3:2c4b4723e71a016152f7ddd66ab55cea8ab6beca88d9f39c885f4c2e97bb177c www.hacken.io 5 File:./solidity/interfaces/ILiquidityLayerRouter.sol SHA3:5dc89eab3cf04fe17e3d56c24d860935e8e62294d329e296e423ea46e46d25bd File:./solidity/interfaces/IMailbox.sol SHA3:c75094d68ec0a1ad5d92d62629c77e37c555995a35b16311309099c3f59e1329 File:./solidity/interfaces/IMessageRecipient.sol SHA3:df770d6ff439c2300c4ba039ecdc5eb5757db06d8df98d64a47659204c4bfd1b File:./solidity/interfaces/IMultisigIsm.sol SHA3:2e3e81056b2987fd8a206897d21a91868d2e3ec48960ce457f0b14e56d54fda2 File:./contracts/extensions/HypERC721URICollateral.sol SHA3:6949190f1a83296434106aae00399bf5dad21048a5469bdac99ca09165706dd0 File:./contracts/extensions/HypERC721URIStorage.sol SHA3:53c59911b31de8aad9331f029d0a321f1332fcdc9b462d1cd5e9c113484b5a82 File:./contracts/HypERC20.sol SHA3:cd2d9a01a07e65c74def51566ce8ff0810168af9c31fc593312ffb65fd4b247e File:./contracts/HypERC20Collateral.sol SHA3:fc5b7355f253543dbbc37eec0400bb451f058d676ff3f8905085b3eb5f2b3a75 File:./contracts/HypERC721.sol SHA3:11a4e5d5b394b16174fff30fb13e6b98bcce0a9f699ed6e31a1b5b5da3640913 File:./contracts/HypERC721Collateral.sol SHA3:bbe96712d420bab07480b970682e5f7e7d1b02c9cd8b442f09a759db2b2dd5f9 File:./contracts/libs/Message.sol SHA3:b9647698d1d28efae16d0194226fbcbb77b3a9dd1bfa1e0886ae6d0506aaed8b File:./contracts/libs/TokenRouter.sol SHA3:6bf57431c6a35160fe02deec424664a92094cbb14a3c903cb7b29fa8087958eb File:./solidity/contracts/upgrade/ProxyAdmin.sol SHA3:e986bb64e43d1929a57096e06456ab29c007ca3df4d95cebc02a809bdaef9eb5 File:./solidity/contracts/upgrade/TransparentUpgradeableProxy.sol SHA3:d7f2f0942f57e0c6dafe7ba9be364e50f2381082f6de7d70ce2b04c4c627fb8e File:./solidity/contracts/Create2Factory.sol SHA3:6f46791901284cb413b66462a391a2ef5d13ca29cfa19173878fdaf1ec407a36 www.hacken.io 6 Secondreviewscope Repositoryhttps://github.com/hyperlane-xyz/hyperlane-monorepo/tree/audit- v2-remediation Commitdef40316e9e0fee6857ece40d60a6ddcf2247e90 WhitepaperLink Functional Requirements Link Contracts File:./solidity/contracts/Call.sol SHA3:c526527679d5e752d2e900e13792ec455a356c3635288249ce908d6f2759f4d6 File:./solidity/contracts/Create2Factory.sol SHA3:a377db630f17238ec9f32c30c30dff5e181e9e27738fab6ba148bb648e12e3a2 File:./solidity/contracts/HyperlaneConnectionClient.sol SHA3:146bc2a168ff2752e01a317d7c09ea581ca91567edc48eb4b80d9d0f099ec771 File:./solidity/contracts/InterchainGasPaymaster.sol SHA3:8634708493afd063c1fd81c530e4b5e4db454b5dc7bf2c6c4cd78057b234c610 File:./solidity/contracts/isms/MultisigIsm.sol SHA3:b16c6b2f95824e33f712444082c4295034803759b9648219a1911cc14ec2eb8e File:./solidity/contracts/libs/EnumerableMapExtended.sol SHA3:c4115c2ce6f2a0efc48c63e5869464eda34f8b5cfee9fc42eba149d74d23ef7c File:./solidity/contracts/libs/Merkle.sol SHA3:26bda8009ee094c60b3c0c10ec454bc3bfffbc74d45c49fd1ed50d696aed7751 File:./solidity/contracts/libs/Message.sol SHA3:f9ff058e169c9d5ff5a869293fdba1a8531a1e0db5c61a7b8885a26deda95b64 File:./solidity/contracts/libs/MinimalProxy.sol SHA3:462abf74fb52f3dae320840027749198c9c067323e562fa1be68d965a299bfaa File:./solidity/contracts/libs/MultisigIsmMetadata.sol SHA3:3fcd0f0657d0e9568ad90367a63cd6f39e90849c4396e2fe6e7d9ddd570f0689 File:./solidity/contracts/libs/TypeCasts.sol SHA3:a6aba3f1569a897fef473a4a05d632db8b111eb41fe48f8c36c27a7d382a028a File:./solidity/contracts/Mailbox.sol SHA3:cd6b6f1a43658fb060a6416c661ae3c7460882e1be0291edc47b158eca6e158c File:./solidity/contracts/middleware/InterchainAccountRouter.sol SHA3:833a3264c484ece80269b385caa1b3842f028e5ffc71094fdf06e90707a5dc7e File:./solidity/contracts/middleware/InterchainQueryRouter.sol SHA3:73fc1bb053ca8f86488234108b930b684b4816d99fe0215d670fee27a919249b File: ./solidity/contracts/middleware/liquidity-layer/adapters/CircleBridgeA dapter.sol SHA3:6e5cdac68c278c07b49a74fbc76066ba93d9ebf7b33bf48c0f8b7434b6cbd7f7 www.hacken.io 7 File: ./solidity/contracts/middleware/liquidity-layer/interfaces/circle/ICir cleBridge.sol SHA3:21d6baf6b1c2573cdc496920e4a6e69cbebc53dbbd26b7ebbb60fb883efb50f0 File: ./solidity/contracts/middleware/liquidity-layer/interfaces/circle/ICir cleMessageTransmitter.sol SHA3:16239fdf7eb2cdba4972b61bd3200626d8116d52152fdb618788df78a6698f13 File: ./solidity/contracts/middleware/liquidity-layer/interfaces/ILiquidityL ayerAdapter.sol SHA3:8fb04b2bdb660334756796dc3168ea0518ac537257b3bf59db0b8b9321099d8d File: ./solidity/contracts/middleware/liquidity-layer/LiquidityLayerRouter.s ol SHA3:95b8bf70fb0635988258cdd5d27c1c91ba8d6bdce784b8f1bb456e2cbd377fa5 File:./solidity/contracts/OwnableMulticall.sol SHA3:586923b834484a399fff21e7078149df06cf2b303b49ebc02a13307e2e4303d6 File:./solidity/contracts/PausableReentrancyGuard.sol SHA3:f21a36f320243422aaf896d1127d7a2ad44c9e04610ba79bc23ac68ddaacf849 File:./solidity/contracts/Router.sol SHA3:91742a671942082210cb0f805abcb1e6ac7bc5b2c99166861494ce8c6c7bca12 File:./solidity/contracts/upgrade/ProxyAdmin.sol SHA3:e986bb64e43d1929a57096e06456ab29c007ca3df4d95cebc02a809bdaef9eb5 File:./solidity/contracts/upgrade/TransparentUpgradeableProxy.sol SHA3:d7f2f0942f57e0c6dafe7ba9be364e50f2381082f6de7d70ce2b04c4c627fb8e File:./solidity/contracts/upgrade/Versioned.sol SHA3:7b1e8357094ec9676a04cf8b6b6e022155c12f9949688dd9a6479e5640716a60 File:./solidity/interfaces/IInterchainAccountRouter.sol SHA3:bd6fa3bc80ec1faec01f41f744cae3323ee14d469ecd537995f457da4aa07ddf File:./solidity/interfaces/IInterchainGasPaymaster.sol SHA3:2684fb8703fc8b29c3e7ad6c8e617322c8912eaadb400aad88255781a2621024 File:./solidity/interfaces/IInterchainQueryRouter.sol SHA3:42283382b3e8a82969972b25334d486d91edbed4e5bfa44c0adfbadf8d634984 File:./solidity/interfaces/IInterchainSecurityModule.sol SHA3:abd2e0879ec812a8ae5f1975977128ca1dd19f7a2af239682096b05e82ea7f4f File:./solidity/interfaces/ILiquidityLayerMessageRecipient.sol SHA3:2c4b4723e71a016152f7ddd66ab55cea8ab6beca88d9f39c885f4c2e97bb177c File:./solidity/interfaces/ILiquidityLayerRouter.sol SHA3:5dc89eab3cf04fe17e3d56c24d860935e8e62294d329e296e423ea46e46d25bd File:./solidity/interfaces/IMailbox.sol SHA3:c75094d68ec0a1ad5d92d62629c77e37c555995a35b16311309099c3f59e1329 File:./solidity/interfaces/IMessageRecipient.sol www.hacken.io 8 SHA3:df770d6ff439c2300c4ba039ecdc5eb5757db06d8df98d64a47659204c4bfd1b File:./solidity/interfaces/IMultisigIsm.sol SHA3:b24df09465064fbe3daf54b77fcaa2e86dd1f6b7152e35c95a240d28c7703070 www.hacken.io 9 SeverityDefinitions RiskLevelDescription Critical Criticalvulnerabilitiesareusuallystraightforwardto exploitandcanleadtothelossofuserfundsor contractstatemanipulationbyexternalorinternal actors. High Highvulnerabilitiesareusuallyhardertoexploit, requiringspecificconditions,orhaveamorelimited scope,butcanstillleadtothelossofuserfundsor contractstatemanipulationbyexternalorinternal actors. Medium Mediumvulnerabilitiesareusuallylimitedtostate manipulationsbutcannotleadtoassetloss.Major deviationsfrombestpracticesarealsointhiscategory. Low Lowvulnerabilitiesarerelatedtooutdatedandunused codeorminorgasoptimization.Theseissueswon'thavea significantimpactoncodeexecutionbutaffectcode quality www.hacken.io 10 ExecutiveSummary Thescoremeasurementdetailscanbefoundinthecorrespondingsectionof thescoringmethodology. Documentationquality ThetotalDocumentationQualityscoreis10outof10. ● Thedocumentationisoverallclearandcomplete Codequality ThetotalCodeQualityscoreis10outof10. ● Thedevelopmentenvironmentisconfigured. Testcoverage Codecoverageoftheprojectis100%(branchcoverage). ● Deploymentandbasicuserinteractionsarecoveredwithtests. Securityscore Asaresultoftheaudit,thecodecontains2mediumand2lowseverity issues.Thesecurityscoreis8outof10. Allfoundissuesaredisplayedinthe“Findings”section. Summary Accordingtotheassessment,theCustomer'ssmartcontracthasthe followingscore:8.6. Table.Thedistributionofissuesduringtheaudit ReviewdateLowMediumHighCritical 28January202310650 03April20232200 www.hacken.io 11 CheckedItems WehaveauditedtheCustomers'smartcontractsforcommonlyknownand specificvulnerabilities.Herearesomeitemsconsidered: ItemTypeDescriptionStatus Default Visibility SWC-100 SWC-108 Functionsandstatevariablesvisibility shouldbesetexplicitly.Visibility levelsshouldbespecifiedconsciously. Passed Integer Overflowand Underflow SWC-101 Ifuncheckedmathisused,allmath operationsshouldbesafefromoverflows andunderflows. NotRelevant Outdated Compiler Version SWC-102 Itisrecommendedtousearecent versionoftheSoliditycompiler.Failed Floating Pragma SWC-103 Contractsshouldbedeployedwiththe samecompilerversionandflagsthat theyhavebeentestedthoroughly. Passed UncheckedCall ReturnValue SWC-104 Thereturnvalueofamessagecall shouldbechecked. Passed AccessControl & Authorization CWE-284 Ownershiptakeovershouldnotbe possible.Allcrucialfunctionsshould beprotected.Userscouldnotaffect datathatbelongstootherusers. Passed SELFDESTRUCT Instruction SWC-106 Thecontractshouldnotbe self-destructiblewhileithasfunds belongingtousers. NotRelevant Check-Effect- Interaction SWC-107 Check-Effect-Interactionpatternshould befollowedifthecodeperformsANY externalcall. Passed Assert Violation SWC-110 Properlyfunctioningcodeshouldnever reachafailingassertstatement. Passed Deprecated Solidity Functions SWC-111 Deprecatedbuilt-infunctionsshould neverbeused.Passed Delegatecall toUntrusted Callee SWC-112 Delegatecallsshouldonlybeallowedto trustedaddresses.Passed DoS(Denialof Service) SWC-113 SWC-128 Executionofthecodeshouldneverbe blockedbyaspecificcontractstate unlessrequired. Passed www.hacken.io 12 Race Conditions SWC-114 RaceConditionsandTransactionsOrder Dependencyshouldnotbepossible. Passed Authorization through tx.origin SWC-115 tx.originshouldnotbeusedfor authorization.NotRelevant Blockvalues asaproxyfor time SWC-116 Blocknumbersshouldnotbeusedfor timecalculations.Passed Signature UniqueId SWC-117 SWC-121 SWC-122 EIP-155 EIP-712 Signedmessagesshouldalwayshavea uniqueid.Atransactionhashshouldnot beusedasauniqueid.Chain identifiersshouldalwaysbeused.All parametersfromthesignatureshouldbe usedinsignerrecovery.EIP-712should befollowedduringasigner verification. NotRelevant Shadowing StateVariable SWC-119 Statevariablesshouldnotbeshadowed. Passed WeakSources ofRandomness SWC-120 Randomvaluesshouldneverbegenerated fromChainAttributesorbepredictable. NotRelevant Incorrect Inheritance Order SWC-125 Wheninheritingmultiplecontracts, especiallyiftheyhaveidentical functions,adevelopershouldcarefully specifyinheritanceinthecorrect order. Passed CallsOnlyto Trusted Addresses EEA-Lev el-2 SWC-126 Allexternalcallsshouldbeperformed onlytotrustedaddresses.Passed Presenceof Unused Variables SWC-131 Thecodeshouldnotcontainunused variablesifthisisnotjustifiedby design. Passed EIPStandards Violation EIP EIPstandardsshouldnotbeviolated. Passed Assets Integrity Custom Fundsareprotectedandcannotbe withdrawnwithoutproperpermissionsor belockedonthecontract. Passed UserBalances Manipulation Custom Contractownersoranyotherthirdparty shouldnotbeabletoaccessfunds belongingtousers. NotRelevant Data Consistency Custom Smartcontractdatashouldbeconsistent alloverthedataflow. Passed www.hacken.io 13 Flashloan Attack Custom Whenworkingwithexchangerates,they shouldbereceivedfromatrustedsource andnotbevulnerabletoshort-termrate changesthatcanbeachievedbyusing flashloans.Oraclesshouldbeused. NotRelevant TokenSupply Manipulation Custom Tokenscanbemintedonlyaccordingto rulesspecifiedinawhitepaperorany otherdocumentationprovidedbythe customer. Passed GasLimitand Loops Custom Transactionexecutioncostsshouldnot dependdramaticallyontheamountof datastoredonthecontract.There shouldnotbeanycaseswhenexecution failsduetotheblockGaslimit. Passed StyleGuide Violation Custom Styleguidesandbestpracticesshould befollowed. Passed Requirements Compliance Custom Thecodeshouldbecompliantwiththe requirementsprovidedbytheCustomer. Passed Environment Consistency Custom Theprojectshouldcontainaconfigured developmentenvironmentwitha comprehensivedescriptionofhowto compile,buildanddeploythecode. Passed SecureOracles Usage Custom Thecodeshouldhavetheabilityto pausespecificdatafeedsthatitrelies on.Thisshouldbedonetoprotecta contractfromcompromisedoracles. Passed TestsCoverageCustom Thecodeshouldbecoveredwithunit tests.Testcoverageshouldbe sufficient,withbothnegativeand positivecasescovered.Usageof contractsbymultipleusersshouldbe tested. Passed StableImportsCustom Thecodeshouldnotreferencedraft contracts,whichmaybechangedinthe future. Passed www.hacken.io 14 SystemOverview Therearetwodifferentrepositoriesintheproject,therepositoryforthe mainprotocolandtherepositoryforthetokenstandard. 1.Tokenrepository-WarpAPI DeveloperscanuseHyperlane'sWarpAPItopermissionlesslydeploy "WarpRoutes",contractsthatallowERC20andERC721tokenstomove effortlesslybetweenchains. Unlikeothertokenwrappingprotocols,WarpRoutesaresecuredbya sovereignconsensus. 2.HyperlaneMonorepo Hyperlaneisamodularinterchainprotocol,withvariousparts: ● Mailbox:Mailboxisthelow-levelpartofthemessaging protocol.Itistheplacewherethemessagearrivesanddeparts from.Relayersarewatchingthemailboxatalltimestolook fornewmessagestoroutetoanotherchain.Relayerswill invoketheMailboxcontractonthetargetchaintodeliveran interchainmessage. ● Router:Therouteristhehigh-levelpartofthemessaging protocol.ItisusedtointeractwiththeMailboxcontract,and canbeextendedtooffermanycapabilitieslikemessaging, bridgingtokensandmakingcallstoanotherchain.Theprotocol offersRouterimplementationsprovidingthesefunctionalities: InterchainQueryRouter,InterchainAccountRouter, LiquidityLayerRouter.Routersarebuiltaccordingtoa structurethatallowsthemtobedeployedtomultiplechains withoutcodechanges. ○ InterchainQueryRouter:usedtoquerythestateonremote chainsviainterchainviewcalls. ○ IterchainAccountRouter:usedtocreateanaccountona remotechain,andusethataccounttocallsmart contracts.Remoteaccountsareownedbytheprotocol. ○ LiquidityLayerRouter:usedtowraparoundseveraltoken bridgestoallowdeveloperstosendtokensalongside theirmessage. ● HyperlaneConnectionClient:mix-incontractthatmaintains pointerstothethreecontractsHyperlanedevelopersmayneed tointeractwith:Mailbox(required),InterchainGasPaymaster (optional),InterchainSecurityModule(optional). ● Validators:ValidatorscreatethesignMailboxmerklerootsand maketheirsignaturesavailabletorelayers. ● ISM:Interchainsecuritymodules(ISMs)aresmartcontracts thatdefinethesecuritymodelforanapplication.Theycanbe www.hacken.io 15 userdefinedortheprotocoldefaultonescanbeused.Atthe momenttheonlyISMprovidedbytheprotocolisMultisigIsm,a t-of-nsecuritymodule.ISMsmustimplementtheverify() interface,whichgetscalledbytheMailboxbeforedeliveringa message.Ifverify()doesnotreturntrue,thetransactionwill revert. ● Relayer:aggregatestheoff-chainmetadataneededtodeliver messages(e.g.validatorsignaturesandmerkleproofs)and submitsthemtoMailboxesbycallingMailbox.process(),which inturnwillinvokeIMessageRecipient.handle()onthe destinationchainRouter. ● Watchtowers:observethenetworkforvalidatorfraud.If detected,watchtowerssubmitevidencetothesourcechain, slashingthefraudulentvalidator(s).Theslashingprocessis frictionlessbecauseeachvalidatoronlyvalidatesonthechain theyarestakingon. Thisistheexecutionflowofageneralmessagebetweenchains: Privilegedroles ● Protocoldeployer-onlyOwner:theowneroftheprotocolcansetthe mailbox,interchaingaspaymentandinterchainsecuritymoduleinthe hyperlaneconnectclient,setthedefaultinterchainsecuritymodule inthemailbox,andalsopauseandunpausethemailbox,enrollanew routerintheroutercontract,enroll,unenrollandsetthresholds forvalidatorsintheinterchainsecuritymodule,setaliquidity layeradapterintheliquiditylayerroutercontract,andadda domainandadd/removeatokenintheadaptercontract. www.hacken.io 16 ● Mailbox-onlyMailbox:cancallthehandlefunctionintherouter. ● Router-onlyRemoteRouter:canbetheoriginalsenderofamessage dispatchedtothehandlefunctionintherouter. ● LiquidityLayerRouter-onlyLiquidityLayerRouterin CircleBridgeAdapter.sol:cansendandreceivetokens. Risks ● TheTokenrepositorymakesuseoftheunauditedpackage @hyperlane-xyz. ● Contractsareupgradable. ● Partoftheprotocolisoff-chainandoutofthescopeofthisaudit. ● InterchainAccountRouterdoesnotimplementacallbackfunctionality toinformtheoriginchainaboutstatechangingoperationsperformed ontheremotechain. ● LiquidityLayerRoutercanonlysendtokenstocontractsimplementing thereceiveTokens()function. www.hacken.io 17 Findings Critical Nocriticalseverityissueswerefound. High H02.UpgradeabilityErrors CircleBridgeAdapter.solisinheritingRouter,butisnotinitializing it.IssueM09isrelatedtothissituation. OwnableMulticall.solisinheritingOwnableUpgradable,butisnot initializingit. Path:monorepo/solidity/contracts/middleware/CircleBridgeAdapter.sol: initialize() Recommendation:Initializetheinheritedupgradablecontracts. Status:Fixed(Revisedcommit:def4031) H03.UpgradeabilityErrors InInterchainGasPaymaster.soltheinitialize()functionisinsidethe constructor,theconstructorintheupgradablecontractshouldonly containimmutablevariabledeclarationsorthe\_disableInizializer() function. Path:monorepo/solidity/contracts/InterchainGasPaymaster.sol Recommendation:Removetheconstructortofollowbestpracticesfor upgradablecontracts. Status:Fixed(Revisedcommit:def4031) H05.DataInconsistency InterchainQueryRouteristheRoutercontractusedtopollview functionsonaremotechain.Bydesign,InterchainQueryRouteronthe remotechainwillperformacallbackontheoriginchainto communicatetheresultsofthecalls.Thecallsontheremotechain areperformedthroughthefunctionOwnableMulticall.\_call(),called byInterchainQueryRouter.\_handle(). Incaseofafailedcall,OwnableMulticall.\_call()willrevert,so theflowofInterchainQueryRouter.\_handle()willstopbeforecalling \_dispatch()whichwouldtakecareofsendingthecallbacktothe originchain. Inthiscase,theoriginchainwillreceivenocallbacks,andwill notbeinformedofthefailedcallontheremotechain.Evenifthe www.hacken.io 18 callfailedandthereisnovaluetocommunicatetotheoriginchain, aflaginformingofthefailureshouldbesentback. Path:monorepo/solidity/contracts/middleware/InterchaiQueryRouter.sol :query(),\_handle() monorepo/solidity/contracts/Mailbox.sol:dispatch(),process() monorepo/solidity/contracts/OwnableMulticall.sol:\_call() Recommendation:Insteadofreverting,afailureflagshouldbesent totheoriginchain. Status:Mitigated(Documentationupdatedtoreflectthisbehavior) H07.CompilationError TheCreate2Factorycontractimplementscustomerrors,asolidity functionalityintroducedonversion0.8.4. Thepragmaversiondefinedinthecontractis^0.8.0,makingit possibletoraisecompilationerrors. Path:monorepo/solidity/contracts/Create2Factory.sol Recommendation:Adjustpragmaversion Status:Fixed(Revisedcommit:def4031) Medium M02.MissingSafeERC20 TheprojectdoesnotimplementSafeERC20forERC20transfers.This mayexposetheprotocoltodenialofservicevulnerabilitiesordata inconsistenciesduringinteractionswithnon-standardtokens. ThisissuehasbeenacknowledgedbydevelopersthroughTODOcomments incontractsLiquidityLayerRouter.solandCircleBridgeAdapter.sol Path: monorepo/solidity/contracts/middleware/liquidity-layer/LiquidityLayer Router.sol:dispatchWithTokens() monorepo/solidity/contracts/middleware/liquidity-layer/adapters/Circl eBridgeAdapter.sol:receiveTokens() Recommendation:ImplementtheSafeERC20librarytosafelyinteract withtokens. Status:Fixed(Revisedcommit:def4031) www.hacken.io 19 M03.BestPracticeViolation ThefunctionsdonotusetheSafeTransferFrom()functionorthe SafeMint()functionforcheckingiftherecipientaddresscanreceive ERC721tokentransfers.Therecipientmightnotbeabletohandle ERC721tokensandtotransferthemback. IssueM06isrelatedtothissituation. Path:token/contracts/HypERC721Collateral.sol:\_transferTo(), \_transferFromSender(); token/contracts/HypERC721.sol:\_transferTo(); Recommendation:useSafeTransferFrom()andSafeMint()functionsto interactwithtokenssafely. Status:Fixed(Revisedcommit:def4031) M04.Unfinalizedcode ThecodecontainsmultipleTODOcommentsaboutfunctionalitiesyetto beimplementedorcodesectionstoberewritten. Someofthesesituationshavealreadybeenaddressedinthe identifiedissuesinthisaudit. Path:monorepo/solidity/contracts/Router.sol:handle() monorepo/solidity/contracts/OwnableMulticall.sol: proxyCallBatch() monorepo/solidity/contracts/middleware/InterchaiQueryRouter.sol :query(),\_handle() monorepo/solidity/contracts/middleware/liquidity-layer/Liquidit yLayerRouter.sol:dispatchWithTokens() Recommendation:Finalizefunctionalitiesimplementations. Status:Fixed(Revisedcommit:def4031) M05.Copyofwell-knowncontract TheprojectusesPausableReentrancyGuard.sol,amergedversionof OpenZeppelin’sReentrancyGuardUpgradeableandPausableUpgradeable contracts. Whilethisdoesnotposeadirectsecuritythreat,well-known contractsfromprojectslikeOpenZeppelinshouldbeimporteddirectly fromthesourceastheprojectsareindevelopmentandmayupdatethe contractsinthefuture. www.hacken.io 20 Path:monorepo/solidity/contracts/PausableReentrancyGuard.sol Recommendation:ImportReentrancyGuardUpgradeableand PausableUpgradeablefromthesourceandusethemseparately. Status:Mitigated(Themergedcontractimplementsgasoptimization thatsavesusersofHyperlane>2kgasoneveryMailbox.process invocation) M08.DataConsistency hyperlaneDomainToCircleDomainmappingcanbeambiguous,asinCircle domaintheEthereumchainisencodedas‘0’. Thisissuehasbeenalreadyidentifiedbythedevelopersand highlightedinaTODOcommentonline25. Path: monorepo/solidity/contracts/middleware/liquidity-layer/adapters/Circl eBridgeAdapter.sol Recommendation:Aneasysolutionwouldbetoadda+1offsettothe mappingtomakeitbase1insteadofbase0. Status:Reported M09.BestPractices CircleBridgeAdapter.sendTokens()performsacheckon \_destinationDomain,toverifythatthereisavalidrouteronthe destinationdomain. Asstatedinacommentonlines162-163,CircleBridgeAdapterinherits Routeronlytoperformthischeck. Thisisinefficientasallremoterouteraddressesshallbeaddedand keptupdatedinthe\_routerMapvariableonthiscontract,onlyto performthischeck. Itwouldsufficetomovethischecktotheinvokercontract LiquidityLayerRouter,whichisaRouterandalreadyhasthe\_router variablefilledandupdated. Thispieceofcodecontainsanotherissue:thecheckisperformed withoutusingthededicatedfunctionRouter.\_mustHaveRemoteRouter(), thecodeisduplicatedinstead. Path: monorepo/solidity/contracts/middleware/liquidity-layer/adapters/Circl eBridgeAdapter.sol:sendTokens() www.hacken.io 21 Recommendation:Movethecheckto LiquidityLayerRouter.dispatchWithTokens()andmakeuseofthe functionRouter.\_mustHaveRemoteRouter() Status:Reported M10.UpgradeabilityErrors InInterchainAccountRouter.soltheconstructoriscombinedwiththe initializefunction,whichisnotfollowingbestpracticesfor upgradabilitycontracts. Path: monorepo/solidity/contracts/middleware/InterchainAccountRouter.sol Recommendation:Useonlytheinitializefunctioninsteadofthe constructor. Status:Mitigated(Theconstructorallowsforconsistentgassavings ontransactions) Low L01.InefficientGasModel Lengthcomputationforarraysisoftenincludedintheforloops conditioninsteadofbeingcatchedinalocalvariable. Inthesecases,theSoliditycompilerwillalwaysreadthelengthof thearrayduringeachiteration. Instead,creatinganewvariableuint256\_lengthanditeratingfor (uint256i=0;i<\_length;++i)willbemuchcheaperintermsof Gas. Thisismostimpactfulforstoragevariablereadoperations,butit isadvisedasabestpracticeinanycase. Path:monorepo/solidity/contracts/Router.sol:enrollRemoteRouters() monorepo/solidity/contracts/OwnableMulticall.sol: proxyCalls(),\_call(),proxyCallBatch() monorepo/solidity/contracts/MultisigIsm.sol: enrollValidators(),setThresholds() Recommendation:Loadthelengthofthearraysinanewlocalvariable anduseitintheloopiteration. Status:Fixed(Revisedcommit:def4031) www.hacken.io 22 L02.UnemittedEvents InterchainAccountRouterandLiquidityLayerRoutercontractsdonot emiteventsonsendandreceivesituationswhile InterchainQueryRouterdoes. Path:monorepo/contracts/middleware/InterchainAccountRouter.sol; monorepo/contracts/middleware/liquidity-layer/InterchainAccountRouter .sol; token/contracts/HypERC20Collateral.sol:\_transferFromSender(), \_transferTo(); token/contracts/HypeERC721Collateral.sol:\_transferFromSender(), \_transferTo(); Recommendation:Add,sendandreceiveeventsto InterchainAccountRouterandLiquidityLayerRoutertokeeptheflow consistentamongrouters. Status:Mitigated(TheInterchainQueryRouteremitseventsondispatch sothattheycanbematchedwithQueryResolvedevents) L03.FunctionVisibility publicfunctionsthatarenevercalledbythecontractshouldbe declaredexternaltosavegas. Path:monorepo/solidity/contracts/Mailbox.sol:latestCheckpoint() monorepo/solidity/contracts/isms/MultisigIsm.sol:verify() monorepo/solidity/contracts/middleware/InterchainAccountRouter.sol: initialize(),getInterchainAccount() monorepo/solidity/contracts/middleware/InterchainQueryRouter.sol: initialize() monorepo/solidity/contracts/middleware/liquidity-layer/LiquidityLayer Router.sol:initialize() monorepo/solidity/contracts/middleware/liquidity-layer/adapters/Circl eBridgeAdapter.sol:initialize() Recommendation:Changefunctionvisibilitytoexternalforfunctions nevercalledinternallybythecontract. Status:Fixed(Revisedcommit:def4031) L04.BooleanEquality Booleanconstantscanbeuseddirectlyanddonotneedtobecompared totrueorfalse. www.hacken.io 23 Path:monorepo/contracts/mailbox:process() Recommendation:Removebooleanequality. Status:Mitigated(Thecomparisontofalseisdoneforreadability purposes) L06.FloatingPragma Theprojectusesfloatingpragmas. Path:monorepo/contracts;token/contracts; Recommendation:Considerlockingthepragmaversionwheneverpossible andavoidusingafloatingpragmainthefinaldeployment. Status:Mitigated(Tobepermissivewithdevsimplementingthe protocol) L07.OutdatedSolidityVersion Usinganoutdatedcompilerversioncanbeproblematic,especiallyif publiclydisclosedbugsandissuesaffectthecurrentcompiler version. Path:monorepo/contracts;token/contracts; Recommendation:Usearecentcompilerversion. Status:Reported L08.MisleadingRequireMessage Somemessagesintherequireconditionsarenotdescriptive. Thismakesthecodehardertotestanddebug,aswellasmakingthe UserExperienceworse. Path:monorepo/contracts;token/contracts; Recommendation:Refactormessagesintherequireconditionstofit codebehavior. Status:Reported L09.EmptyConstructor IncontractMultisigIsmtheconstructorisempty,whichmakesit redundantduetodefaultSoliditybehaviortocreateanempty constructorifit'snotincludedinthecode. Thismakespartsofthecoderedundant. Path:monorepo/solidity/contracts/isms/MultisigIsm.sol www.hacken.io 24 Recommendation:Removetheconstructor. Status:Mitigated(Thisconstructorisincludedforreadability purposesinvokingthesuperOwnablecontract’sconstructor.Itis veryeasytomissthisinvocationwhenitisappendedtothecontract header.) L10.Missingzeroaddressvalidation Addressparametersareusedwithoutcheckingagainstthepossibility of0x0. Path:monorepo/solidity/contracts/HyperlaneConnectionClient.sol: \_setMailbox(),setInterchainSecurityModule() monorepo/solidity/contracts/OwnableMulticall.sol:proxyCallBatch() Recommendation:Addzeroaddresschecks. Status:Fixed(Revisedcommit:def4031) L11.StyleGuideViolation Theprovidedprojectsshouldfollowofficialguidelines. Path:monorepo/contracts; Recommendation:FolrwtheofficialSolidityguidelines. Status:Fixed(Revisedcommit:def4031) www.hacken.io 25 Disclaimers HackenDisclaimer Thesmartcontractsgivenforaudithavebeenanalyzedbasedonbest industrypracticesatthetimeofthewritingofthisreport,with cybersecurityvulnerabilitiesandissuesinsmartcontractsourcecode,the detailsofwhicharedisclosedinthisreport(SourceCode);theSource Codecompilation,deployment,andfunctionality(performingtheintended functions). Thereportcontainsnostatementsorwarrantiesontheidentificationof allvulnerabilitiesandsecurityofthecode.Thereportcoversthecode submittedandreviewed,soitmaynotberelevantafteranymodifications. Donotconsiderthisreportasafinalandsufficientassessmentregarding theutilityandsafetyofthecode,bug-freestatus,oranyothercontract statements. Whilewehavedoneourbestinconductingtheanalysisandproducingthis report,itisimportanttonotethatyoushouldnotrelyonthisreport only—werecommendproceedingwithseveralindependentauditsandapublic bugbountyprogramtoensurethesecurityofsmartcontracts. Englishistheoriginallanguageofthereport.TheConsultantisnot responsibleforthecorrectnessofthetranslatedversions. TechnicalDisclaimer Smartcontractsaredeployedandexecutedonablockchainplatform.The platform,itsprogramminglanguage,andothersoftwarerelatedtothesmart contractcanhavevulnerabilitiesthatcanleadtohacks.Thus,the Consultantcannotguaranteetheexplicitsecurityoftheauditedsmart contracts. www.hacken.io 26 ---