Verify a Query Response On-Chain

## Verify a Query Response On-Chain

A [`QueryResponseLib` library](https://github.com/wormhole-foundation/wormhole-solidity-sdk/blob/main/src/libraries/QueryResponse.sol){target=\_blank} is provided to assist with verifying query responses. You can begin by installing the [Wormhole Solidity SDK](https://github.com/wormhole-foundation/wormhole-solidity-sdk){target=\_blank} with the following command:

```bash
forge install wormhole-foundation/wormhole-solidity-sdk
```

Broadly, using a query response on-chain comes down to three main steps:

   1. Parse and verify the query response.
   2. The `parseAndVerifyQueryResponse` handles verifying the Guardian signatures against the current Guardian set stored in the Core bridge contract.
   3. Validate the request details. This may be different for every integrator depending on their use case, but generally checks the following:
    - Is the request against the expected chain?
    - Is the request of the expected type? The `parseEthCall` helpers perform this check when parsing.
    - Is the resulting block number and time expected? Some consumers might require that a block number be higher than the last, or the block time be within the last 5 minutes. `validateBlockNum` and `validateBlockTime` can help with the checks.
    - Is the request for the expected contract and function signature? The `validateMultipleEthCallData` can help with non-parameter-dependent cases.
    - Is the result of the expected length for the expected result type?
   4. Run `abi.decode` on the result.

See the [QueryDemo](https://github.com/wormholelabs-xyz/example-queries-demo/blob/main/src/QueryDemo.sol){target=\_blank} contract for an example and read the docstrings of the preceding methods for detailed usage instructions.

??? code "View the complete `QueryDemo`"
    ```solidity
    // contracts/query/QueryDemo.sol
    // SPDX-License-Identifier: Apache 2

    pragma solidity ^0.8.0;

    import "wormhole-solidity-sdk/libraries/BytesParsing.sol";
    import "wormhole-solidity-sdk/interfaces/IWormhole.sol";
    import "wormhole-solidity-sdk/QueryResponse.sol";

    error InvalidOwner();
    // @dev for the onlyOwner modifier
    error InvalidCaller();
    error InvalidCalldata();
    error InvalidForeignChainID();
    error ObsoleteUpdate();
    error StaleUpdate();
    error UnexpectedResultLength();
    error UnexpectedResultMismatch();

    /// @dev QueryDemo is an example of using the QueryResponse library to parse and verify Cross Chain Query (CCQ) responses.
    contract QueryDemo is QueryResponse {
        using BytesParsing for bytes;

        struct ChainEntry {
            uint16 chainID;
            address contractAddress;
            uint256 counter;
            uint256 blockNum;
            uint256 blockTime;
        }

        address private immutable owner;
        uint16 private immutable myChainID;
        mapping(uint16 => ChainEntry) private counters;
        uint16[] private foreignChainIDs;

        bytes4 public GetMyCounter = bytes4(hex"916d5743");

        constructor(address _owner, address _wormhole, uint16 _myChainID) QueryResponse(_wormhole) {
            if (_owner == address(0)) {
                revert InvalidOwner();
            }
            owner = _owner;

            myChainID = _myChainID;
            counters[_myChainID] = ChainEntry(_myChainID, address(this), 0, 0, 0);
        }

        // updateRegistration should be used to add the other chains and to set / update contract addresses.
        function updateRegistration(uint16 _chainID, address _contractAddress) public onlyOwner {
            if (counters[_chainID].chainID == 0) {
                foreignChainIDs.push(_chainID);
                counters[_chainID].chainID = _chainID;
            }

            counters[_chainID].contractAddress = _contractAddress;
        }

        // getMyCounter (call signature 916d5743) returns the counter value for this chain. It is meant to be used in a cross chain query.
        function getMyCounter() public view returns (uint256) {
            return counters[myChainID].counter;
        }

        // getState() returns this chain's view of all the counters. It is meant to be used in the front end.
        function getState() public view returns (ChainEntry[] memory) {
            ChainEntry[] memory ret = new ChainEntry[](foreignChainIDs.length + 1);
            ret[0] = counters[myChainID];
            uint256 length = foreignChainIDs.length;

            for (uint256 i = 0; i < length;) {
                ret[i + 1] = counters[foreignChainIDs[i]];
                unchecked {
                    ++i;
                }
            }

            return ret;
        }

        // @notice Takes the cross chain query response for the other counters, stores the results for the other chains, and updates the counter for this chain.
        function updateCounters(bytes memory response, IWormhole.Signature[] memory signatures) public {
            ParsedQueryResponse memory r = parseAndVerifyQueryResponse(response, signatures);
            uint256 numResponses = r.responses.length;
            if (numResponses != foreignChainIDs.length) {
                revert UnexpectedResultLength();
            }

            for (uint256 i = 0; i < numResponses;) {
                // Create a storage pointer for frequently read and updated data stored on the blockchain
                ChainEntry storage chainEntry = counters[r.responses[i].chainId];
                if (chainEntry.chainID != foreignChainIDs[i]) {
                    revert InvalidForeignChainID();
                }

                EthCallQueryResponse memory eqr = parseEthCallQueryResponse(r.responses[i]);

                // Validate that update is not obsolete
                validateBlockNum(eqr.blockNum, chainEntry.blockNum);

                // Validate that update is not stale
                validateBlockTime(eqr.blockTime, block.timestamp - 300);

                if (eqr.result.length != 1) {
                    revert UnexpectedResultMismatch();
                }

                // Validate addresses and function signatures
                address[] memory validAddresses = new address[](1);
                bytes4[] memory validFunctionSignatures = new bytes4[](1);
                validAddresses[0] = chainEntry.contractAddress;
                validFunctionSignatures[0] = GetMyCounter;

                validateMultipleEthCallData(eqr.result, validAddresses, validFunctionSignatures);

                require(eqr.result[0].result.length == 32, "result is not a uint256");

                chainEntry.blockNum = eqr.blockNum;
                chainEntry.blockTime = eqr.blockTime / 1_000_000;
                chainEntry.counter = abi.decode(eqr.result[0].result, (uint256));

                unchecked {
                    ++i;
                }
            }

            counters[myChainID].blockNum = block.number;
            counters[myChainID].blockTime = block.timestamp;
            counters[myChainID].counter += 1;
        }

        modifier onlyOwner() {
            if (owner != msg.sender) {
                revert InvalidOwner();
            }
            _;
        }
    }
    ```


Submit a Query Response On-Chain

## Submit a Query Response On-Chain

The `QueryProxyQueryResponse` result requires a slight tweak when submitting to the contract to match the format of `function parseAndVerifyQueryResponse(bytes memory response, IWormhole.Signature[] memory signatures)`. A helper function, `signaturesToEvmStruct`, is provided in the SDK for this.

This example submits the transaction to the demo contract:

```jsx
const tx = await contract.updateCounters(
  `0x${response.data.bytes}`,
  signaturesToEvmStruct(response.data.signatures)
);
```


Key Features

## Key Features

- **On-demand data access**: Fetch price feeds, interest rates, and other data in real-time.
- **Guardian attested**: All data is signed by [Guardians](/docs/protocol/infrastructure/guardians/){target=\_blank} for trustless validation.
- **Cross-chain ready**: Request data on one chain, use it on another.
- **Smart contract integration**: Results are delivered as [Verified Action Approvals (VAAs)](/docs/protocol/infrastructure/vaas/){target=\_blank}, readable by smart contracts.
- **Chain agnostic**: Works across supported EVM chains, Solana, Sui, and [other supported networks](/docs/products/queries/reference/supported-networks/){target=\_blank}.


How It Works

## How It Works

A query request follows a simple but robust lifecycle. The off-chain service responsible for handling requests is called the CCQ Server (Cross-Chain Query Server), also referred to as the Query Server throughout this documentation.

1. An off-chain app sends a query to the CCQ Server via HTTPS.
2. The CCQ Server checks the request and shares it with [Guardians](/docs/protocol/infrastructure/guardians/){target=\_blank}.
3. [Guardians](/docs/protocol/infrastructure/guardians/){target=\_blank} independently fetch the data, verify it, and sign the result.
4. Once enough Guardians (2/3 quorum) return matching results, the CCQ Server aggregates and sends the final response.
5. The off-chain app submits this result to a smart contract, which verifies the Guardian signatures and uses the data.

The CCQ Server is permissioned but trustless. Most queries resolve in under one second, and Guardians retry failed requests for up to one minute. Up to 255 queries can be batched together to optimize performance, supporting efficient multichain workflows.

![The architecture flow of a query](/docs/images/products/queries/overview/overview-1.webp)


Use Cases

## Use Cases

Queries enable a wide range of cross-chain applications. Below are common use cases and the Wormhole stack components you can use to build them.

- **Borrowing and Lending Across Chains (e.g., [Folks Finance](https://wormhole.com/case-studies/folks-finance){target=\_blank})**

    - **[Queries](/docs/products/queries/get-started/){target=\_blank}**: Fetch rates and prices in real-time.
    - **[Messaging](/docs/products/messaging/overview/){target=\_blank}**: Sync actions between chains.
    - **[Native Token Transfers](/docs/products/token-transfers/native-token-transfers/overview/){target=\_blank}**: Transfer collateral as native assets.

- **Cross-Chain Swaps and Liquidity Aggregation (e.g., [StellaSwap](https://app.stellaswap.com/exchange/swap){target=\_blank})**

    - **[Queries](/docs/products/queries/get-started/){target=\_blank}**: Fetch live prices for optimal trade execution.
    - **[Connect](/docs/products/connect/overview/){target=\_blank}**: Handle user-friendly asset transfers.
    - **[Native Token Transfers](/docs/products/token-transfers/native-token-transfers/overview/){target=\_blank}**: Moves native tokens.

- **Real-Time Price Feeds and Trading Strategies (e.g., [Infinex](https://wormhole.com/case-studies/infinex){target=\_blank})**

    - **[Queries](/docs/products/queries/get-started/){target=\_blank}**: Fetch price feeds.
    - **[Messaging](/docs/products/messaging/overview/){target=\_blank}**: Trigger trades.

- **Multichain Prediction Markets**

    - **[Queries](/docs/products/queries/get-started/){target=\_blank}**: Fetch market data and odds.
    - **[Settlement](/docs/products/settlement/overview/){target=\_blank}**: Automates token execution.

- **Oracle Networks (e.g., [Pyth](https://wormhole.com/case-studies/pyth){target=\_blank})**

    - **[Queries](/docs/products/queries/get-started/){target=\_blank}**: Source data from chains.
    - **[Messaging](/docs/products/messaging/overview/){target=\_blank}**: Ensures tamper-proof data relay across networks.


Next Steps

## Next Steps

Follow these steps to get started with Queries:

[timeline(docs/.snippets/text/products/queries/queries-timeline.json)]


Supported Query Types

## Supported Query Types

Wormhole currently supports five distinct query types, each designed for specific data retrieval tasks across various chains.

!!! note
    For a more comprehensive technical description and further specifics on each query type, please consult the [white paper](https://github.com/wormhole-foundation/wormhole/blob/main/whitepapers/0013_ccq.md).


eth_call

### eth_call

The [`eth_call`](https://ethereum.org/developers/docs/apis/json-rpc/#eth_call){target=\_blank} query type allows you to perform read-only calls to a smart contract on a specific block, identified by its number or hash. Some of eth_call's configurations include:

- **Batching**: Group multiple calls, even to different contracts, into a single query targeting the same block, which is processed as one batch RPC call to simplify on-chain verification.
- **Capacity**: Batch up to 255 individual in a single `eth_call` query.
- **Result data**: Provides the specified block's number, hash, timestamp, and the output from the contract call.


eth_call_by_timestamp

### eth_call_by_timestamp

The [`eth_call_by_timestamp`](https://github.com/wormhole-foundation/wormhole/blob/main/whitepapers/0013_ccq.md#timestamp-and-block-id-hints-in-eth_call_by_timestamp){target=\_blank} query is similar to a standard `eth_call` but targets a specific timestamp instead of a block ID. This is useful for retrieving on-chain data based on a precise point in time, especially for correlating information across different chains.

The query returns your target timestamp and the latest block details at or before your specified `target_time` immediately preceding the subsequent block.


eth_call_with_finality

### eth_call_with_finality

The [`eth_call_with_finality`](https://github.com/wormhole-foundation/wormhole/blob/main/whitepapers/0013_ccq.md#desired-finality-in-eth_call_with_finality){target=\_blank} query type functions like a standard `eth_call`, but with an added critical assurance: it will only return the query results once the specified block has reached a designated level of finality on its chain.

You can specify one of two finality levels for your query:

- **Finalized**: Indicates the highest level of assurance that a block is permanent and will not be altered or removed from the chain.
- **Safe**: Refers to a block considered highly unlikely to be reorganized, offering a substantial degree of confidence, though the network's consensus may not fully finalize it.

!!! note
    If the target blockchain does not natively support or recognize the safe finality tag, requesting safe finality will be treated as a request for finalized finality instead.


sol_account

### sol_account

The [`sol_account`](https://github.com/wormhole-foundation/wormhole/blob/main/whitepapers/0013_ccq.md#solana-queries){target=\_blank} query reads on-chain data for one or more specified accounts on the Solana blockchain. This functionality is similar to using Solana's native [`getMultipleAccounts`](https://solana.com/docs/rpc/http/getmultipleaccounts){target=\_blank} RPC method, enabling you to retrieve information for multiple accounts simultaneously


sol_pda

### sol_pda

The [`sol_pda`](https://github.com/wormhole-foundation/wormhole/blob/main/whitepapers/0013_ccq.md#solana_queries){target=\_blank} query reads data for one or more Solana [Program Derived Addresses](https://www.anchor-lang.com/docs/basics/pda){target=\_blank}. It streamlines the standard process of deriving a PDA and fetching its account data.

This is particularly useful for accessing multiple PDAs owned by a specific program or for verifying Solana PDA derivations on another blockchain, such as how associated token accounts are all derived from the [Associated Token Account Program](https://www.solana-program.com/docs/associated-token-account){target=\_blank}.


Mainnet

## Mainnet

|     Chain     | Wormhole Chain ID | eth_call | eth_call_by_timestamp | eth_call_with_finality | Expected History |
|:-------------:|:-----------------:|:--------:|:---------------------:|:----------------------:|:----------------:|
| Solana | 1 | ✅ | ❌ | - | - |
| Ethereum | 2 | ✅ | ✅ | ✅ | 128 blocks |
| BNB Smart Chain | 4 | ✅ | ✅ | ✅ | 128 blocks |
| Polygon | 5 | ✅ | ✅ | ✅ | 128 blocks |
| Avalanche | 6 | ✅ | ✅ | ✅ | 32 blocks |
| Fantom | 10 | ✅ | ✅ | ✅ | 16 blocks |
| Kaia | 13 | ✅ | ✅ | ✅ | 128 blocks |
| Celo | 14 | ✅ | ℹ | ✅ | 128 blocks |
| Moonbeam | 16 | ✅ | ℹ | ✅ | 256 blocks |
| Arbitrum | 23 | ✅ | ✅ | ✅ | ~6742 blocks |
| Optimism | 24 | ✅ | ✅ | ❌ | 128 blocks |
| Base | 30 | ✅ | ✅ | ✅ | archive |
| Scroll | 34 | ✅ | ✅ | - | - |
| Mantle | 35 | ✅ | ✅ | - | - |
| X Layer | 37 | ✅ | ✅ | - | - |
| Linea | 38 | ✅ | ✅ | - | - |
| Berachain | 39 | ✅ | ✅ | - | - |
| SeiEVM | 40 | ✅ | ✅ | - | - |
| Unichain | 44 | ✅ | ✅ | - | - |
| World Chain | 45 | ✅ | ✅ | - | - |
| Ink | 46 | ✅ | ✅ | - | - |
| HyperEVM :material-alert:{ title='⚠ The HyperEVM integration is experimental, as its node software is not open source. Use Wormhole messaging on HyperEVM with caution.' } | 47 | ✅ | ✅ | - | - |
| Monad | 48 | ✅ | ✅ | - | - |
| Mezo | 50 | ✅ | ✅ | - | - |
| Fogo | 51 | ✅ | ✅ | - | - |
| Converge | 53 | ✅ | ✅ | - | - |
| Plume | 55 | ✅ | ✅ | - | - |
| XRPL-EVM | 57 | ✅ | ✅ | - | - |
| Plasma | 58 | ✅ | ✅ | - | - |
| CreditCoin | 59 | ✅ | ✅ | - | - |
| Moca | 63 | ✅ | ✅ | - | - |
| MegaETH | 64 | ✅ | ✅ | - | - |
| 0G (Zero Gravity) | 67 | ✅ | ✅ | - | - |


Testnet

## Testnet

|     Chain     | Wormhole Chain ID | eth_call | eth_call_by_timestamp | eth_call_with_finality | Expected History |
|:-------------:|:-----------------:|:--------:|:---------------------:|:----------------------:|:----------------:|
| Ethereum Sepolia | 10002 | ✅ | ✅ | - | - |
| Arbitrum Sepolia | 10003 | ✅ | ✅ | - | - |
| Base Sepolia | 10004 | ✅ | ✅ | - | - |
| Optimism Sepolia | 10005 | ✅ | ✅ | - | - |
| Ethereum Holesky | 10006 | ✅ | ✅ | - | - |
| Polygon Amoy | 10007 | ✅ | ✅ | - | - |
| Monad Testnet | 10009 | ✅ | ✅ | - | - |

ℹ`EthCallByTimestamp` arguments for `targetBlock` and `followingBlock` are currently required for requests to be successful on these chains.


Prerequisites

## Prerequisites

Before starting, make sure you have the following set up:

 - [Node.js and npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm){target=\_blank} installed on your system
 - A [Wormhole Queries API key](/docs/products/queries/get-started/#request-an-api-key){target=\_blank}
 - Access to an EVM-compatible [testnet RPC](https://chainlist.org/?testnets=true){target=\_blank}, such as Arbitrum Sepolia
 - A [Witnet data feed identifier](https://docs.witnet.io/smart-contracts/witnet-data-feeds/addresses){target=\_blank} (this tutorial uses the ETH/USD feed as an example)

    You can use a different Witnet feed or testnet if you prefer. Make sure to update the environment variables later in this tutorial with the correct values for your setup.


Project Setup

## Project Setup

In this section, you will create a new Next.js project, install the required dependencies, and configure the environment variables needed to fetch data from Wormhole Queries.

1. **Create a new Next.js app**: Enable TypeScript, Tailwind CSS, and the `src/` directory when prompted. You can configure the remaining options as you like. Create your app using the following command:

    ```bash
    npx create-next-app@latest live-crypto-prices
    cd live-crypto-prices
    ```

2. **Install dependencies**: Add the required packages.

    ```bash
    npm install @wormhole-foundation/wormhole-query-sdk axios ethers
    ```

    - [`@wormhole-foundation/wormhole-query-sdk`](https://www.npmjs.com/package/@wormhole-foundation/wormhole-query-sdk){target=\_blank}: Build, send, and decode Wormhole Queries.
    - [`axios`](https://www.npmjs.com/package/axios){target=\_blank}: Make JSON-RPC and Query Proxy requests.
    - [`ethers`](https://www.npmjs.com/package/ethers){target=\_blank}: Handle ABI encoding and decoding for Witnet calls.

3. **Add environment variables**: Create a file named `.env.local` in the project root.

    ```env
    # Wormhole Query Proxy
    QUERY_URL=https://testnet.query.wormhole.com/v1/query
    QUERIES_API_KEY=INSERT_API_KEY

    # Chain and RPC
    WORMHOLE_CHAIN_ID=10003
    RPC_URL=https://arbitrum-sepolia.drpc.org

    # Witnet Price Router on Arbitrum Sepolia
    CALL_TO=0x1111AbA2164AcdC6D291b08DfB374280035E1111

    # ETH/USD feed on Witnet, six decimals
    FEED_ID4=0x3d15f701
    FEED_DECIMALS=6
    FEED_HEARTBEAT_SEC=86400
    ```

    !!! warning
        Make sure to add the `.env.local` file to your `.gitignore` to exclude it from version control. Never commit API keys to your repository.

    You can use a different Witnet feed or network by updating `CALL_TO`, `FEED_ID4`, `FEED_DECIMALS`, and `WORMHOLE_CHAIN_ID`. These values allow the app to fetch a live ETH/USD price with proper scaling, timestamps, and a signed response.

4. **Add a configuration file**: Create `src/lib/config.ts` to access environment variables throughout the app.

    ```ts title="src/lib/config.ts"
    export const QUERY_URL = process.env.QUERY_URL!;
    export const QUERIES_API_KEY = process.env.QUERIES_API_KEY!;
    export const RPC_URL = process.env.RPC_URL!;

    export const DEFAULTS = {
      chainId: Number(process.env.WORMHOLE_CHAIN_ID || 0),
      to: process.env.CALL_TO || '',
      feedId4: process.env.FEED_ID4 || '',
      feedDecimals: Number(process.env.FEED_DECIMALS || 0),
      feedHeartbeatSec: Number(process.env.FEED_HEARTBEAT_SEC || 0),
    };
    ```


Build the Server Logic

## Build the Server Logic

In this section, you will implement the backend that powers the widget. You will encode the Witnet call, create and send a Wormhole Query, decode the signed response, and expose an API route for the frontend.


### Encode Witnet Call and Build the Request

First, encode the function call for Witnet's Price Router using the feed ID and package it into a Wormhole Query request. This query will be anchored to the latest block, ensuring the data you receive is verifiably tied to a recent snapshot of the chain state. This helper will return a serialized request that can be sent to the Wormhole Query Proxy.

```ts title="src/lib/queries/buildRequest.ts"
import axios from 'axios';
import {
  EthCallQueryRequest,
  PerChainQueryRequest,
  QueryRequest,
} from '@wormhole-foundation/wormhole-query-sdk';
import { Interface } from 'ethers';

// ABI interface for Witnet's Price Router
const WITNET_IFACE = new Interface([
  // Function signature for reading the latest price feed
  'function latestPrice(bytes4 id) view returns (int256 value, uint256 timestamp, bytes32 drTxHash, uint8 status)',
]);

// Encode calldata for Witnet Router: latestPrice(bytes4)
export function encodeWitnetLatestPrice(id4: string): string {
  // Validate feed ID format (must be a 4-byte hex)
  if (!/^0x[0-9a-fA-F]{8}$/.test(id4)) {
    throw new Error(`Invalid FEED_ID4: ${id4}`);
  }
  // Return ABI-encoded call data for latestPrice(bytes4)
  return WITNET_IFACE.encodeFunctionData('latestPrice', [id4 as `0x${string}`]);
}

export async function buildEthCallRequest(params: {
  rpcUrl: string;
  chainId: number; // Wormhole chain id
  to: string;
  data: string; // 0x-prefixed calldata
}) {
  const { rpcUrl, chainId, to, data } = params;

  // Get the latest block number via JSON-RPC
  // Short timeout prevents long hangs in the dev environment
  const latestBlock: string = (
    await axios.post(
      rpcUrl,
      {
        method: 'eth_getBlockByNumber',
        params: ['latest', false],
        id: 1,
        jsonrpc: '2.0',
      },
      { timeout: 5_000, headers: { 'Content-Type': 'application/json' } }
    )
  ).data?.result?.number;

  if (!latestBlock) throw new Error('Failed to fetch latest block');

  // Build a Wormhole Query that wraps an EthCall to the Witnet contract
  const request = new QueryRequest(1, [
    new PerChainQueryRequest(
      chainId,
      new EthCallQueryRequest(latestBlock, [{ to, data }])
    ),
  ]);

  // Serialize to bytes for sending to the Wormhole Query Proxy
  return request.serialize(); // Uint8Array
}
```


Send Request to the Query Proxy

### Send Request to the Query Proxy

Next, you will send the serialized query to the Wormhole Query Proxy, which forwards it to the Guardians for verification. The proxy returns a signed response containing the requested data and proof that the Guardians verified it. This step ensures that all the data your app consumes comes from a trusted and authenticated source.

```ts title="src/lib/queries/client.ts"
import axios from 'axios';

export async function postQuery({
  queryUrl,
  apiKey,
  bytes,
  timeoutMs = 25_000,
}: {
  queryUrl: string;
  apiKey: string;
  bytes: Uint8Array;
  timeoutMs?: number;
}) {
  // Convert the query bytes to hex and POST to the proxy
  const res = await axios.post(
    queryUrl,
    { bytes: Buffer.from(bytes).toString('hex') },
    {
      timeout: timeoutMs,
      headers: { 'X-API-Key': apiKey, 'Content-Type': 'application/json' },
      validateStatus: (s) => s === 200,
    }
  );
  return res.data; // throws on non-200
}
```


Decode and Verify Response

### Decode and Verify Response

Once you receive the signed response, you will decode it to extract the Witnet price data.
Here, you will use ethers to parse the ABI-encoded return values and scale the raw integer to a readable decimal value based on the feed's configured number of decimals. This function will output a clean result containing the latest price, timestamp, and transaction reference from the Witnet feed.

```ts title="src/lib/queries/decode.ts"
import {
  EthCallQueryResponse,
  QueryResponse,
} from '@wormhole-foundation/wormhole-query-sdk';
import { Interface, Result } from 'ethers';

// ABI interface for decoding Witnet's latestPrice response
const WITNET_IFACE = new Interface([
  'function latestPrice(bytes4 id) view returns (int256 value, uint256 timestamp, bytes32 drTxHash, uint8 status)',
]);

// Parse the first EthCall result from the proxy's response
export function parseFirstEthCallResult(proxyResponse: { bytes: string }): {
  chainResp: EthCallQueryResponse;
  raw: string;
} {
  // Decode the top-level QueryResponse from Wormhole Guardians
  const qr = QueryResponse.from(proxyResponse.bytes);

  // Extract the first chain response and its raw call result
  const chainResp = qr.responses[0].response as EthCallQueryResponse;
  const raw = chainResp.results[0];
  return { chainResp, raw };
}

// Decode Witnet's latestPrice return tuple into readable fields
export function decodeWitnetLatestPrice(
  raw: string,
  decimals: number
): { price: string; timestampSec: number; drTxHash: string } {
  // Decode ABI-encoded result from the router call
  const r: Result = WITNET_IFACE.decodeFunctionResult('latestPrice', raw);
  const value = BigInt(r[0].toString());
  const timestampSec = Number(r[1].toString());
  const drTxHash = r[2] as string;

  return {
    price: scaleBigintToDecimalString(value, decimals),
    timestampSec,
    drTxHash,
  };
}

// Convert a bigint price into a human-readable decimal string
function scaleBigintToDecimalString(value: bigint, decimals: number): string {
  const zero = BigInt(0);
  const neg = value < zero ? '-' : '';
  const v = value < zero ? -value : value;
  const s = v.toString().padStart(decimals + 1, '0');
  const i = s.slice(0, -decimals);
  const f = s.slice(-decimals).replace(/0+$/, '');
  return neg + (f ? `${i}.${f}` : i);
}
```


Add Shared Types

### Add Shared Types

Create a `src/lib/types.ts` file to define the structure of your API responses. These types ensure consistency between the backend and the frontend, keeping the data shape predictable and type-safe.  You will import these types in both the API route and the widget to keep your responses aligned across the app.

```ts title="src/lib/types.ts"
export interface QueryApiSuccess {
  ok: true;
  blockNumber: string;
  blockTimeMicros: string;
  price: string;
  decimals: number;
  updatedAt: string;
  stale?: boolean;
}

export interface QueryApiError {
  ok: false;
  error: string;
}
export type QueryApiResponse = QueryApiSuccess | QueryApiError;
```


Add  API Route for Frontend

### Add  API Route for Frontend

Finally, expose an API endpoint at `/api/queries`. This route ties everything together: it builds the query, sends it, decodes the response, and returns a structured JSON payload containing the current price, timestamp, block number, and a stale flag indicating whether the feed data is still fresh. The frontend widget will call this endpoint every few seconds to display the live, verified price data.

```ts title="src/app/api/queries/route.ts"
import { NextResponse } from 'next/server';
import {
  buildEthCallRequest,
  encodeWitnetLatestPrice,
} from '@/lib/queries/buildRequest';
import { postQuery } from '@/lib/queries/client';
import { QUERY_URL, QUERIES_API_KEY, RPC_URL, DEFAULTS } from '@/lib/config';
import {
  parseFirstEthCallResult,
  decodeWitnetLatestPrice,
} from '@/lib/queries/decode';
import type { QueryApiSuccess, QueryApiError } from '@/lib/types';

export async function GET() {
  const t0 = Date.now();
  try {
    // Encode the call for Witnet’s latestPrice(bytes4)
    const data = encodeWitnetLatestPrice(DEFAULTS.feedId4);

    // Build a Wormhole Query request anchored to the latest block
    const bytes = await buildEthCallRequest({
      rpcUrl: RPC_URL,
      chainId: DEFAULTS.chainId,
      to: DEFAULTS.to,
      data,
    });
    const t1 = Date.now();

    // Send the query to the Wormhole Query Proxy and await the signed response
    const proxyResponse = await postQuery({
      queryUrl: QUERY_URL,
      apiKey: QUERIES_API_KEY,
      bytes,
      timeoutMs: 25_000,
    });
    const t2 = Date.now();

    // Decode the signed Guardian response and extract Witnet data
    const { chainResp, raw } = parseFirstEthCallResult(proxyResponse);
    const { price, timestampSec } = decodeWitnetLatestPrice(
      raw,
      DEFAULTS.feedDecimals
    );

    // Log the latency of each leg for debugging
    console.log(`RPC ${t1 - t0}ms → Proxy ${t2 - t1}ms`);

    // Mark data as stale if older than the feed’s heartbeat interval
    const heartbeat = Number(process.env.FEED_HEARTBEAT_SEC || 0);
    const stale = heartbeat > 0 && Date.now() / 1000 - timestampSec > heartbeat;

    // Return a normalized JSON payload for the frontend
    const body: QueryApiSuccess = {
      ok: true,
      blockNumber: chainResp.blockNumber.toString(),
      blockTimeMicros: chainResp.blockTime.toString(),
      price,
      decimals: DEFAULTS.feedDecimals,
      updatedAt: new Date(timestampSec * 1000).toISOString(),
      stale,
    };
    return NextResponse.json(body);
  } catch (e: unknown) {
    // Catch and return a structured error
    const message = e instanceof Error ? e.message : String(e);
    console.error('Error in /api/queries:', message);
    const body: QueryApiError = { ok: false, error: message };
    return NextResponse.json(body, { status: 500 });
  }
}
```


Price Widget

## Price Widget

In this section, you will build a client component that fetches the signed price from your API, renders it with a freshness badge, and refreshes on an interval without overlapping requests.


Create Widget Component

### Create Widget Component

Create a client component that calls `/api/queries`, renders the current price, shows the last update time and block number, and displays a freshness badge based on the heartbeat. The component uses a ref to avoid overlapping requests and a timed interval to refresh automatically.

```ts title="src/components/PriceWidget.tsx"
'use client';

import { useEffect, useRef, useState } from 'react';

// Expected API success shape from /api/queries
type ApiOk = {
  ok: true;
  price: string;
  updatedAt: number | string;
  blockNumber: string;
  blockTimeMicros: number;
  decimals: number;
  stale: boolean;
};

// API error shape
type ApiErr = { ok: false; error: string };

// Format timestamps for display
function formatTime(ts: number | string) {
  let n: number;
  if (typeof ts === 'string') {
    const numeric = Number(ts);
    if (Number.isFinite(numeric)) {
      n = numeric;
    } else {
      const parsed = new Date(ts);
      return Number.isNaN(parsed.getTime()) ? '—' : parsed.toLocaleString();
    }
  } else {
    n = ts;
  }
  if (!Number.isFinite(n)) return '—';
  // If it looks like seconds, convert to ms
  const ms = n < 1_000_000_000_000 ? n * 1000 : n;
  const d = new Date(ms);
  return Number.isNaN(d.getTime()) ? '—' : d.toLocaleString();
}

export default function PriceWidget() {
  // UI state: fetched data, loading state, and any errors
  const [data, setData] = useState<ApiOk | null>(null);
  const [error, setError] = useState<string | null>(null);
  const [loading, setLoading] = useState(false);

  // Keep track of polling and prevent overlapping requests
  const timer = useRef<NodeJS.Timeout | null>(null);
  const inFlight = useRef(false);

  // Fetch price data from the API route
  async function fetchPrice() {
    if (inFlight.current) return; // avoid concurrent requests
    inFlight.current = true;
    setLoading(true);
    setError(null);

    try {
      const res = await fetch('/api/queries', { cache: 'no-store' });
      const json: ApiOk | ApiErr = await res.json();
      if (!json.ok) throw new Error(json.error);
      setData(json);
    } catch (e: any) {
      setError(e?.message || 'Failed to fetch price');
    } finally {
      setLoading(false);
      inFlight.current = false;
    }
  }

  // Fetch immediately and refresh every 30 seconds
  useEffect(() => {
    fetchPrice();
    timer.current = setInterval(fetchPrice, 30_000);
    return () => {
      if (timer.current) clearInterval(timer.current);
    };
  }, []);

  return (
    <div className="mx-auto w-full max-w-md rounded-2xl border border-gray-200 p-6 shadow-sm">
      <div className="mb-4 flex items-center justify-between">
        <h2 className="text-lg font-semibold">ETH/USD Live Price</h2>
        {data?.stale ? (
          <span className="rounded-full bg-yellow-100 px-3 py-1 text-xs font-medium text-yellow-800">
            Stale
          </span>
        ) : (
          <span className="rounded-full bg-green-100 px-3 py-1 text-xs font-medium text-green-800">
            Fresh
          </span>
        )}
      </div>

      <div className="space-y-2">
        <div className="text-3xl font-bold tabular-nums">
          {loading && !data ? 'Loading…' : data ? data.price : '—'}
        </div>

        <div className="text-sm text-gray-600">
          {data ? (
            <>
              Updated at {formatTime(data.updatedAt)}, block {data.blockNumber}
            </>
          ) : error ? (
            <span className="text-red-600">{error}</span>
          ) : (
            'Fetching latest price'
          )}
        </div>
      </div>

      <div className="mt-4">
        <button
          onClick={fetchPrice}
          className="w-full rounded-xl bg-gray-900 px-4 py-2 text-white hover:opacity-90"
          disabled={loading}
        >
          {loading ? 'Refreshing…' : 'Refresh now'}
        </button>
      </div>
    </div>
  );
}
```


Add the Widget to Home Page

### Add the Widget to Home Page

Render the widget on the home page with a simple heading and container so users see the price as soon as they load the app.

```ts title="src/app/page.tsx"
import PriceWidget from '@/components/PriceWidget';

export default function Page() {
  return (
    <main className="mx-auto flex max-w-2xl flex-col items-center p-6">
      <h1 className="mb-6 text-center text-2xl font-bold">
        Live Crypto Price Widget
      </h1>
      <PriceWidget />
    </main>
  );
}
```


Run the App

## Run the App

Start the development server and confirm that the live widget displays data correctly:

```bash
npm run dev
```

Open `http://localhost:3000/` to see your app running. You should see the widget display the current ETH/USD price, the last update time, the block number, and a freshness badge indicating whether the data is still within its heartbeat window.

The price may update only intermittently. Witnet feeds refresh only when a particular time or price deviation threshold is reached to prevent unnecessary network updates.

Your app should look like this:

![Frontend of Queries Live Prices Widget](/docs/images/products/queries/tutorials/live-crypto-prices/live-crypto-prices-1.webp){.half}

???- tip "Troubleshooting"
    If you encounter a “Request failed with status code 403” error, it likely means your Queries API key is missing or incorrect. Check the `QUERIES_API_KEY` value in your `.env.local` file and restart the development server after updating it.


Resources

## Resources

If you'd like to explore the complete project or need a reference while following this tutorial, you can find the complete codebase in the Wormhole's Queries [Tutorial GitHub repository](https://github.com/wormhole-foundation/e2e-tutorial-live-crypto-prices){target=\_blank}.


Conclusion

## Conclusion

You've successfully built a live crypto price widget that fetches verified data from Wormhole Queries and Witnet. Your app encodes a feed request, sends it through the Guardian network for verification, and displays the latest signed price in a simple, responsive widget.

The Queries flow can be extended to fetch other on-chain data or integrate multiple feeds for dashboards and analytics tools.

Looking for more? Check out the [Wormhole Tutorial Demo repository](https://github.com/wormhole-foundation/demo-tutorials){target=\_blank} for additional examples.


Custom Consistency Levels (Advanced)

## Custom Consistency Levels (Advanced)

On supported EVM chains (currently Ethereum and Linea), integrators may specify a custom consistency level. See the [white paper](https://github.com/wormhole-foundation/wormhole/blob/main/whitepapers/0001_generic_message_passing.md#custom-handling){target=\_blank} to learn how this works.

!!!warning
    **Custom finality is an advanced feature and Wormhole Contributors recommend to use this with caution.** Custom consistency should only be used when standard finality options do not meet the application’s requirements. Most integrations **do not** require custom consistency levels. Using custom finality exposes users to re-org risk. Lower finality levels increase the chance that a source-chain transaction may be reverted after assets are released or minted on the destination chain. Custom finality should be used only with a clear understanding of these risks.

How to select a Custom Finality Level:

- For L1s: Wormhole Contributors recommend referring to information on forked blocks in blockchain explorers such as [Etherscan](https://etherscan.io/blocks_forked?p=1){target=\_blank}, [Polygonscan](https://polygonscan.com/blocks_forked){target=\_blank}, and others, paying specific attention to the “ReorgDepth” column. Polygon, for instance, has been known to have reorgs with a depth of up to 128 blocks!
- For L2s: Wormhole Contributors recommend reviewing L2 block explorers as well as details around whether the sequencer is centralized and how the L2 RPC node treats finality. Typically, the risks one is exposed to when not waiting for full finality from an L2 are: (1) a centralized (or compromised) sequencer censoring transactions, (2) re-orgs if sequencing is not centralized, and (3) L1 reorg risk and the L2 sequencer not re-submitting the transaction batch to the L1.


CCL Contract Addresses

### CCL Contract Addresses

Custom Consistency Level (CCL) enables advanced finality control for EVM chains. CCL is currently supported on select EVM chains. The contract addresses below are the on-chain contracts queried when 203 (Custom) is used.

=== "Mainnet"

Chain Name	Contract Address

Ethereum	0x6A4B4A882F5F0a447078b4Fd0b4B571A82371ec2

Linea	0x6A4B4A882F5F0a447078b4Fd0b4B571A82371ec2

=== "Testnet"

Chain Name	Contract Address

Ethereum	0x6A4B4A882F5F0a447078b4Fd0b4B571A82371ec2

Sepolia	0x6A4B4A882F5F0a447078b4Fd0b4B571A82371ec2

Linea	0x6A4B4A882F5F0a447078b4Fd0b4B571A82371ec2

=== "Devnet"

Chain Name	Contract Address

Ethereum	0x6A4B4A882F5F0a447078b4Fd0b4B571A82371ec2


Core Contracts

## Core Contracts

=== "Mainnet"

Chain Name	Contract Address

Ethereum	0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B

Solana	worm2ZoG2kUd4vFXhvjh93UUH596ayRfgQ2MgjNMTth

0G (Zero Gravity)	0xC699482c17d43b7D5349F2D3f58d61fEFA972B8c

Algorand	842125965

Aptos	0x5bc11445584a763c1fa7ed39081f1b920954da14e04b32440cba863d03e19625

Arbitrum	0xa5f208e072434bC67592E4C49C1B991BA79BCA46

Avalanche	0x54a8e5f9c4CbA08F9943965859F6c34eAF03E26c

Base	0xbebdb6C8ddC678FfA9f8748f85C815C556Dd8ac6

Berachain	0xCa1D5a146B03f6303baF59e5AD5615ae0b9d146D

BNB Smart Chain	0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B

Celo	0xa321448d90d4e5b0A732867c18eA198e75CAC48E

CreditCoin	0xaBf89de706B583424328B54dD05a8fC986750Da8

Fantom	0x126783A6Cb203a3E35344528B26ca3a0489a1485

Fogo	worm2mrQkG1B1KTz37erMfWN8anHkSK24nzca7UD8BB

HyperEVM :material-alert:{ title='⚠ The HyperEVM integration is experimental, as its node software is not open source. Use Wormhole messaging on HyperEVM with caution.' }	0x7C0faFc4384551f063e05aee704ab943b8B53aB3

Injective	inj17p9rzwnnfxcjp32un9ug7yhhzgtkhvl9l2q74d

Ink	0xCa1D5a146B03f6303baF59e5AD5615ae0b9d146D

Kaia	0x0C21603c4f3a6387e241c0091A7EA39E43E90bb7

Linea	0x0C56aebD76E6D9e4a1Ec5e94F4162B4CBbf77b32

Mantle	0xbebdb6C8ddC678FfA9f8748f85C815C556Dd8ac6

MegaETH	0xaBf89de706B583424328B54dD05a8fC986750Da8

Mezo	0xaBf89de706B583424328B54dD05a8fC986750Da8

Moca	0xaBf89de706B583424328B54dD05a8fC986750Da8

Monad	0x194B123c5E96B9b2E49763619985790Dc241CAC0

Moonbeam	0xC8e2b0cD52Cf01b0Ce87d389Daa3d414d4cE29f3

NEAR	contract.wormhole_crypto.near

Neutron	neutron16rerygcpahqcxx5t8vjla46ym8ccn7xz7rtc6ju5ujcd36cmc7zs9zrunh

Optimism	0xEe91C335eab126dF5fDB3797EA9d6aD93aeC9722

Plume	0xaBf89de706B583424328B54dD05a8fC986750Da8

Polygon	0x7A4B5a56256163F07b2C80A7cA55aBE66c4ec4d7

Pythnet	H3fxXJ86ADW2PNuDDmZJg6mzTtPxkYCpNuQUTgmJ7AjU

Scroll	0xbebdb6C8ddC678FfA9f8748f85C815C556Dd8ac6

Sei	sei1gjrrme22cyha4ht2xapn3f08zzw6z3d4uxx6fyy9zd5dyr3yxgzqqncdqn

SeiEVM	0xCa1D5a146B03f6303baF59e5AD5615ae0b9d146D

Sui	0xaeab97f96cf9877fee2883315d459552b2b921edc16d7ceac6eab944dd88919c

Unichain	0xCa1D5a146B03f6303baF59e5AD5615ae0b9d146D

World Chain	0xcbcEe4e081464A15d8Ad5f58BB493954421eB506

X Layer	0x194B123c5E96B9b2E49763619985790Dc241CAC0

XRPL-EVM	0xaBf89de706B583424328B54dD05a8fC986750Da8

=== "Testnet"

Chain Name	Contract Address

Ethereum Holesky	0xa10f2eF61dE1f19f586ab8B6F2EbA89bACE63F7a

Ethereum Sepolia	0x4a8bc80Ed5a4067f1CCf107057b8270E0cC11A78

Solana	3u8hJUVTA4jH1wYAyUur7FFZVQ8H635K3tSHHF4ssjQ5

0G (Zero Gravity)	0x059560c0D626bdB982454b5EBd65DC8E7cF7973c

Algorand	86525623

Aptos	0x5bc11445584a763c1fa7ed39081f1b920954da14e04b32440cba863d03e19625

Arbitrum Sepolia	0x6b9C8671cdDC8dEab9c719bB87cBd3e782bA6a35

Avalanche	0x7bbcE28e64B3F8b84d876Ab298393c38ad7aac4C

Base Sepolia	0x79A1027a6A159502049F10906D333EC57E95F083

Berachain	0xBB73cB66C26740F31d1FabDC6b7A46a038A300dd

BNB Smart Chain	0x68605AD7b15c732a30b1BbC62BE8F2A509D74b4D

Celo	0x88505117CA88e7dd2eC6EA1E13f0948db2D50D56

Converge	0x556B259cFaCd9896B2773310080c7c3bcE90Ff01

CreditCoin	0xaBf89de706B583424328B54dD05a8fC986750Da8

Fantom	0x1BB3B4119b7BA9dfad76B0545fb3F531383c3bB7

Fogo	BhnQyKoQQgpuRTRo6D8Emz93PvXCYfVgHhnrR4T3qhw4

HyperEVM :material-alert:{ title='⚠ The HyperEVM integration is experimental, as its node software is not open source. Use Wormhole messaging on HyperEVM with caution.' }	0xBB73cB66C26740F31d1FabDC6b7A46a038A300dd

Injective	inj1xx3aupmgv3ce537c0yce8zzd3sz567syuyedpg

Ink	0xBB73cB66C26740F31d1FabDC6b7A46a038A300dd

Kaia	0x1830CC6eE66c84D2F177B94D544967c774E624cA

Linea	0x79A1027a6A159502049F10906D333EC57E95F083

Mantle	0x376428e7f26D5867e69201b275553C45B09EE090

MegaETH	0x81705b969cDcc6FbFde91a0C6777bE0EF3A75855

Mezo	0x268557122Ffd64c85750d630b716471118F323c8

Moca	0xaBf89de706B583424328B54dD05a8fC986750Da8

Monad Testnet	0xaBf89de706B583424328B54dD05a8fC986750Da8

Moonbeam	0xa5B7D85a8f27dd7907dc8FdC21FA5657D5E2F901

NEAR	wormhole.wormhole.testnet

Neutron	neutron1enf63k37nnv9cugggpm06mg70emcnxgj9p64v2s8yx7a2yhhzk2q6xesk4

Optimism Sepolia	0x31377888146f3253211EFEf5c676D41ECe7D58Fe

Osmosis	osmo1hggkxr0hpw83f8vuft7ruvmmamsxmwk2hzz6nytdkzyup9krt0dq27sgyx

Plasma	0xaBf89de706B583424328B54dD05a8fC986750Da8

Plume	0x81705b969cDcc6FbFde91a0C6777bE0EF3A75855

Polygon Amoy	0x6b9C8671cdDC8dEab9c719bB87cBd3e782bA6a35

Pythnet	EUrRARh92Cdc54xrDn6qzaqjA77NRrCcfbr8kPwoTL4z

Scroll	0x055F47F1250012C6B20c436570a76e52c17Af2D5

Sei	sei1nna9mzp274djrgzhzkac2gvm3j27l402s4xzr08chq57pjsupqnqaj0d5s

SeiEVM	0xBB73cB66C26740F31d1FabDC6b7A46a038A300dd

Stacks	ST37PDDGEA78QSPSBZM1ZHPCZV9GKAPDFHA32RWY8

Sui	0x31358d198147da50db32eda2562951d53973a0c0ad5ed738e9b17d88b213d790

Unichain	0xBB73cB66C26740F31d1FabDC6b7A46a038A300dd

World Chain	0xe5E02cD12B6FcA153b0d7fF4bF55730AE7B3C93A

X Layer	0xA31aa3FDb7aF7Db93d18DDA4e19F811342EDF780

XRPL-EVM	0xaBf89de706B583424328B54dD05a8fC986750Da8

=== "Devnet"

Chain Name	Contract Address

Ethereum	0xC89Ce4735882C9F0f0FE26686c53074E09B0D550

Solana	Bridge1p5gheXUvJ6jGWGeCsgPKgnE3YgdGKRVCMY9o

Algorand	1004

Aptos	0xde0036a9600559e295d5f6802ef6f3f802f510366e0c23912b0655d972166017

BNB Smart Chain	0xC89Ce4735882C9F0f0FE26686c53074E09B0D550

NEAR	wormhole.test.near

Stacks	ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM

Sui	0x5a5160ca3c2037f4b4051344096ef7a48ebf4400b3f385e57ea90e1628a8bde0


Wrapped Token Transfers (WTT)

## Wrapped Token Transfers (WTT)

=== "Mainnet"

Chain Name	Contract Address

Ethereum	0x3ee18B2214AFF97000D974cf647E7C347E8fa585

Solana	wormDTUJ6AWPNvk59vGQbDvGJmqbDTdgWgAqcLBCgUb

0G (Zero Gravity)	0xee12EBDdF6E34A206e1798D185317C846BC21638

Algorand	842126029

Aptos	0x576410486a2da45eee6c949c995670112ddf2fbeedab20350d506328eefc9d4f

Arbitrum	0x0b2402144Bb366A632D14B83F244D2e0e21bD39c

Avalanche	0x0e082F06FF657D94310cB8cE8B0D9a04541d8052

Base	0x8d2de8d2f73F1F4cAB472AC9A881C9b123C79627

Berachain	0x3Ff72741fd67D6AD0668d93B41a09248F4700560

BNB Smart Chain	0xB6F6D86a8f9879A9c87f643768d9efc38c1Da6E7

Celo	0x796Dff6D74F3E27060B71255Fe517BFb23C93eed

Fantom	0x7C9Fc5741288cDFdD83CeB07f3ea7e22618D79D2

Fogo	wormQuCVWSSmPdjVmEzAWxAXViVyTSWnLyhff5hVYGS

Injective	inj1ghd753shjuwexxywmgs4xz7x2q732vcnxxynfn

Ink	0x3Ff72741fd67D6AD0668d93B41a09248F4700560

Kaia	0x5b08ac39EAED75c0439FC750d9FE7E1F9dD0193F

Mantle	0x24850c6f61C438823F01B7A3BF2B89B72174Fa9d

MegaETH	0xF97B81E513f53c7a6B57Bd0b103a6c295b3096C5

Monad	0x0B2719cdA2F10595369e6673ceA3Ee2EDFa13BA7

Moonbeam	0xb1731c586ca89a23809861c6103f0b96b3f57d92

NEAR	contract.portalbridge.near

Optimism	0x1D68124e65faFC907325e3EDbF8c4d84499DAa8b

Polygon	0x5a58505a96D1dbf8dF91cB21B54419FC36e93fdE

Scroll	0x24850c6f61C438823F01B7A3BF2B89B72174Fa9d

Sei	sei1smzlm9t79kur392nu9egl8p8je9j92q4gzguewj56a05kyxxra0qy0nuf3

SeiEVM	0x3Ff72741fd67D6AD0668d93B41a09248F4700560

Sui	0xc57508ee0d4595e5a8728974a4a93a787d38f339757230d441e895422c07aba9

Unichain	0x3Ff72741fd67D6AD0668d93B41a09248F4700560

World Chain	0xc309275443519adca74c9136b02A38eF96E3a1f6

X Layer	0x5537857664B0f9eFe38C9f320F75fEf23234D904

XRPL-EVM	0x47F5195163270345fb4d7B9319Eda8C64C75E278

=== "Testnet"

Chain Name	Contract Address

Ethereum Holesky	0x76d093BbaE4529a342080546cAFEec4AcbA59EC6

Ethereum Sepolia	0xDB5492265f6038831E89f495670FF909aDe94bd9

Solana	DZnkkTmCiFWfYTfT41X3Rd1kDgozqzxWaHqsw6W4x2oe

0G (Zero Gravity)	0x7d8eBc211C4221eA18E511E4f0fD50c5A539f275

Algorand	86525641

Aptos	0x576410486a2da45eee6c949c995670112ddf2fbeedab20350d506328eefc9d4f

Arbitrum Sepolia	0xC7A204bDBFe983FCD8d8E61D02b475D4073fF97e

Avalanche	0x61E44E506Ca5659E6c0bba9b678586fA2d729756

Base Sepolia	0x86F55A04690fd7815A3D802bD587e83eA888B239

Berachain	0xa10f2eF61dE1f19f586ab8B6F2EbA89bACE63F7a

BNB Smart Chain	0x9dcF9D205C9De35334D646BeE44b2D2859712A09

Celo	0x05ca6037eC51F8b712eD2E6Fa72219FEaE74E153

Fantom	0x599CEa2204B4FaECd584Ab1F2b6aCA137a0afbE8

Fogo	78HdStBqCMioGii9D8mF3zQaWDqDZBQWTUwjjpdmbJKX

HyperEVM :material-alert:{ title='⚠ The HyperEVM integration is experimental, as its node software is not open source. Use Wormhole messaging on HyperEVM with caution.' }	0x4a8bc80Ed5a4067f1CCf107057b8270E0cC11A78

Injective	inj1q0e70vhrv063eah90mu97sazhywmeegp7myvnh

Ink	0x376428e7f26D5867e69201b275553C45B09EE090

Kaia	0xC7A13BE098720840dEa132D860fDfa030884b09A

Linea	0xC7A204bDBFe983FCD8d8E61D02b475D4073fF97e

Mantle	0x75Bfa155a9D7A3714b0861c8a8aF0C4633c45b5D

MegaETH	0x3D5c2c2BEA15Af5D45F084834c535628C48c42A4

Mezo	0xA31aa3FDb7aF7Db93d18DDA4e19F811342EDF780

Moca	0xF97B81E513f53c7a6B57Bd0b103a6c295b3096C5

Monad Testnet	0xF97B81E513f53c7a6B57Bd0b103a6c295b3096C5

Moonbeam	0xbc976D4b9D57E57c3cA52e1Fd136C45FF7955A96

NEAR	token.wormhole.testnet

Optimism Sepolia	0x99737Ec4B815d816c49A385943baf0380e75c0Ac

Polygon Amoy	0xC7A204bDBFe983FCD8d8E61D02b475D4073fF97e

Scroll	0x22427d90B7dA3fA4642F7025A854c7254E4e45BF

Sei	sei1jv5xw094mclanxt5emammy875qelf3v62u4tl4lp5nhte3w3s9ts9w9az2

SeiEVM	0x23908A62110e21C04F3A4e011d24F901F911744A

Sui	0x6fb10cdb7aa299e9a4308752dadecb049ff55a892de92992a1edbd7912b3d6da

Unichain	0xa10f2eF61dE1f19f586ab8B6F2EbA89bACE63F7a

World Chain	0x430855B4D43b8AEB9D2B9869B74d58dda79C0dB2

X Layer	0xdA91a06299BBF302091B053c6B9EF86Eff0f930D

XRPL-EVM	0x7d8eBc211C4221eA18E511E4f0fD50c5A539f275

=== "Devnet"

Chain Name	Contract Address

Ethereum	0x0290FB167208Af455bB137780163b7B7a9a10C16

Solana	B6RHG3mfcckmrYN1UhmJzyS1XX3fZKbkeUcpJe9Sy3FE

Algorand	1006

Aptos	0x84a5f374d29fc77e370014dce4fd6a55b58ad608de8074b0be5571701724da31

BNB Smart Chain	0x0290FB167208Af455bB137780163b7B7a9a10C16

NEAR	token.test.near

Sui	0xa6a3da85bbe05da5bfd953708d56f1a3a023e7fb58e5a824a3d4de3791e8f690


CCTP

## CCTP

=== "Mainnet"

Chain Name	Contract Address

Ethereum	0xAaDA05BD399372f0b0463744C09113c137636f6a

Arbitrum	0x2703483B1a5a7c577e8680de9Df8Be03c6f30e3c

Avalanche	0x09Fb06A271faFf70A651047395AaEb6265265F13

Base	0x03faBB06Fa052557143dC28eFCFc63FC12843f1D

Optimism	0x2703483B1a5a7c577e8680de9Df8Be03c6f30e3c

Polygon	0x0FF28217dCc90372345954563486528aa865cDd6

=== "Testnet"

Chain Name	Contract Address

Ethereum Sepolia	0x2703483B1a5a7c577e8680de9Df8Be03c6f30e3c

Arbitrum Sepolia	0x2703483B1a5a7c577e8680de9Df8Be03c6f30e3c

Avalanche	0x58f4c17449c90665891c42e14d34aae7a26a472e

Base Sepolia	0x2703483B1a5a7c577e8680de9Df8Be03c6f30e3c

Optimism Sepolia	0x2703483B1a5a7c577e8680de9Df8Be03c6f30e3c


Settlement Token Router

## Settlement Token Router

=== "Mainnet"

Chain Name	Contract Address

Ethereum	0x70287c79ee41C5D1df8259Cd68Ba0890cd389c47

Solana	28topqjtJzMnPaGFmmZk68tzGmj9W9aMntaEK3QkgtRe

Arbitrum	0x70287c79ee41C5D1df8259Cd68Ba0890cd389c47

Avalanche	0x70287c79ee41C5D1df8259Cd68Ba0890cd389c47

Base	0x70287c79ee41C5D1df8259Cd68Ba0890cd389c47

Optimism	0x70287c79ee41C5D1df8259Cd68Ba0890cd389c47

Polygon	0x70287c79ee41C5D1df8259Cd68Ba0890cd389c47

=== "Testnet"

Chain Name	Contract Address

Solana	tD8RmtdcV7bzBeuFgyrFc8wvayj988ChccEzRQzo6md

Arbitrum Sepolia	0xe0418C44F06B0b0D7D1706E01706316DBB0B210E

Optimism Sepolia	0x6BAa7397c18abe6221b4f6C3Ac91C88a9faE00D8


Executor

## Executor

=== "Mainnet"

Chain Name	Contract Address

Ethereum	0x84EEe8dBa37C36947397E1E11251cA9A06Fc6F8a

Solana	execXUrAsMnqMmTHj5m7N1YQgsDz3cwGLYCYyuDRciV

0G (Zero Gravity)	0xcD2BffD0C0289e8C0cb89c458dB1B74f1892Fa6c

Aptos	0x11aa75c059e1a7855be66b931bf340a2e0973274ac16b5f519c02ceafaf08a18

Arbitrum	0x3980f8318fc03d79033Bbb421A622CDF8d2Eeab4

Avalanche	0x4661F0E629E4ba8D04Ee90080Aee079740B00381

Base	0x9E1936E91A4a5AE5A5F75fFc472D6cb8e93597ea

Berachain	0x0Dd7a5a32311b8D87A615Cc7f079B632D3d5e2D3

BNB Smart Chain	0xeC8cCCD058DbF28e5D002869Aa9aFa3992bf4ee0

Celo	0xe6Ea5087c6860B94Cf098a403506262D8F28cF05

CreditCoin	0xd2e420188f17607Aa6344ee19c3e76Cf86CA7BDe

Fogo	execXUrAsMnqMmTHj5m7N1YQgsDz3cwGLYCYyuDRciV

HyperEVM :material-alert:{ title='⚠ The HyperEVM integration is experimental, as its node software is not open source. Use Wormhole messaging on HyperEVM with caution.' }	0xd7717899cc4381033Bc200431286D0AC14265F78

Ink	0x3e44a5F45cbD400acBEF534F51e616043B211Ddd

Linea	0x23aF2B5296122544A9A7861da43405D5B15a9bD3

MegaETH	0xD405E0A1f3f9edc25Ea32d0B079d6118328b2EcB

Mezo	0x0f9b8E144Cc5C5e7C0073829Afd30F26A50c5606

Moca	0x7b8097af5459846c5A72fCc960D94F31C05915aD

Monad	0xC04dE634982cAdF2A677310b73630B7Ac56A3f65

Moonbeam	0x85D06449C78064c2E02d787e9DC71716786F8D19

Optimism	0x85B704501f6AE718205C0636260768C4e72ac3e7

Polygon	0x0B23efA164aB3eD08e9a39AC7aD930Ff4F5A5e81

Scroll	0xcFAdDE24640e395F5A71456A825D0D7C3741F075

SeiEVM	0x25f1c923fb7a5aefa5f0a2b419fc70f2368e66e5

Sonic	0x3Fdc36b4260Da38fBDba1125cCBD33DD0AC74812

Sui	0xdb0fe8bb1e2b5be628adbea0636063325073e1070ee11e4281457dfd7f158235

Unichain	0x764dD868eAdD27ce57BCB801E4ca4a193d231Aed

World Chain	0x8689b4E6226AdC8fa8FF80aCc3a60AcE31e8804B

XRPL-EVM	0x8345E90Dcd92f5Cf2FAb0C8E2A56A5bc2c30d896

=== "Testnet"

Chain Name	Contract Address

Ethereum Sepolia	0xD0fb39f5a3361F21457653cB70F9D0C9bD86B66B

Solana	execXUrAsMnqMmTHj5m7N1YQgsDz3cwGLYCYyuDRciV

0G (Zero Gravity)	0x7C43825EeB76DF7aAf3e1D2e8f684d4876F0CC05

Aptos	0x139717c339f08af674be77143507a905aa28cbc67a0e53e7095c07b630d73815

Arbitrum Sepolia	0xBF161de6B819c8af8f2230Bcd99a9B3592f6F87b

Avalanche	0x4661F0E629E4ba8D04Ee90080Aee079740B00381

Base Sepolia	0x51B47D493CBA7aB97e3F8F163D6Ce07592CE4482

BNB Smart Chain	0xeC8cCCD058DbF28e5D002869Aa9aFa3992bf4ee0

Converge	0xAab9935349B9c08e0e970720F6D640d5B91C293E

Fogo	execXUrAsMnqMmTHj5m7N1YQgsDz3cwGLYCYyuDRciV

Linea	0x4f6c3a93a80DdC691312974DAAbf9B6e4Bb44111

Mezo	0x0f9b8E144Cc5C5e7C0073829Afd30F26A50c5606

Moca	0xc4a03f2c47caA4b961101bAD6338DEf37376F052

Monad Testnet	0xe37D3E162B4B1F17131E4e0e6122DbA31243382f

Optimism Sepolia	0x5856651eB82aeb6979B4954317194d48e1891b3c

Plume	0x8fc2FbA8F962fbE89a9B02f03557a011c335A455

Polygon Amoy	0x7056721C33De437f0997F67BC87521cA86b721d3

SeiEVM	0x25f1c923Fb7A5aEFA5F0A2b419fC70f2368e66e5

Sui	0x4000cfe2955d8355b3d3cf186f854fea9f787a457257056926fde1ec977670eb

Unichain	0x764dD868eAdD27ce57BCB801E4ca4a193d231Aed

XRPL-EVM	0x4d9525D94D275dEB495b7C8840b154Ae04cfaC2A


Quoter Router

## Quoter Router

=== "Mainnet"

Chain Name	Contract Address

Ethereum	0xF22F1c0A3a8Cb42F695601731974784C499C4EF3

Arbitrum	0x32eec14c963c23176bd8951f192292006756bDcC

Avalanche	0xA3a2A615774d34c6a4dF443C488B084eacaBd2D0

Base	0x265fd0500a430d65d6D79Cd8707F24C048604658

BNB Smart Chain	0xc921F293c27F332D47283174b11C872295624Edb

Ink	0xdEC050E66BEb2f0d5507761A0fE4867839bd88D2

Monad	0x3d9282A8e9a3cdd9b25AE969eff4705a1Fe75F34

Optimism	0xa3B6551cCbB5Fe1dc33b71EE3590B1Df22ae75B3

Plume	0x85BA1B2A2195be51Ab715be458B32B120532d230

Polygon	0x2a856931603930B827B1A4352FB4D66fA029F123

Sei	0x1D6FeA87671F7c5E184F4c59c3BdcEc5CFC3eC1c

=== "Testnet"

Chain Name	Contract Address

Ethereum Sepolia	0xc0C35D7bfBc4175e0991Ae294f561b433eA4158f

Solana	qtrrrV7W3E1jnX1145wXR6ZpthG19ur5xHC1n6PPhDV

Arbitrum Sepolia	0x5E8c14F436c9ed2ff2E8B042B0542136bf108C6f

Avalanche	0xA3a2A615774d34c6a4dF443C488B084eacaBd2D0

Base Sepolia	0x2507d6899C3D4b93BF46b555d0cB401f44065772

Optimism Sepolia	0x6a829dF7C91f35f9aD72Cd5d05550b95BbC9fd2F

Polygon Amoy	0xE00444636DA924FBAe94471d73D56b5E03cA781c

Sei	0x1D6FeA87671F7c5E184F4c59c3BdcEc5CFC3eC1c

!!! note
    Wormhole Labs’ Quoter uses the following public keys:

    - **Mainnet**: `0xa54008017941EcE968623a0Dd8Ee907E2b133596`.
    - **Testnet**: `0x5241c9276698439fef2780dbab76fec90b633fbd`.


Wormhole Labs Quoter Implementation

## Wormhole Labs Quoter Implementation

=== "Mainnet"

Chain Name	Contract Address

Ethereum	0xA25862D222Eb8343505c12d96e097e4332468D60

Arbitrum	0xA25862D222Eb8343505c12d96e097e4332468D60

Avalanche	0xA25862D222Eb8343505c12d96e097e4332468D60

Base	0xA25862D222Eb8343505c12d96e097e4332468D60

BNB Smart Chain	0xA25862D222Eb8343505c12d96e097e4332468D60

Ink	0xA25862D222Eb8343505c12d96e097e4332468D60

Monad	0xA25862D222Eb8343505c12d96e097e4332468D60

Optimism	0xA25862D222Eb8343505c12d96e097e4332468D60

Plume	0xA25862D222Eb8343505c12d96e097e4332468D60

Polygon	0xA25862D222Eb8343505c12d96e097e4332468D60

Sei	0xA25862D222Eb8343505c12d96e097e4332468D60

=== "Testnet"

Chain Name	Contract Address

Ethereum Sepolia	0x5a6c5A46082D029FDD7c5cF8265047E0c4BB2089

Solana	qtrxiqVAfVS61utwZLUi7UKugjCgFaNxBGyskmGingz

Arbitrum Sepolia	0x5a6c5A46082D029FDD7c5cF8265047E0c4BB2089

Avalanche	0x5a6c5A46082D029FDD7c5cF8265047E0c4BB2089

Base Sepolia	0x5a6c5A46082D029FDD7c5cF8265047E0c4BB2089

Optimism Sepolia	0x5a6c5A46082D029FDD7c5cF8265047E0c4BB2089

Polygon Amoy	0x5a6c5A46082D029FDD7c5cF8265047E0c4BB2089

Sei	0x5a6c5A46082D029FDD7c5cF8265047E0c4BB2089

!!! note
    Wormhole Labs’ Quoter uses the following public keys:

    - **Mainnet**: `0xa54008017941EcE968623a0Dd8Ee907E2b133596`.
    - **Testnet**: `0x5241c9276698439fef2780dbab76fec90b633fbd`.


Guardian Governance

## Guardian Governance

=== "Mainnet"

Chain Name	Contract Address

Ethereum	0x23Fea5514DFC9821479fBE18BA1D7e1A61f6FfCf

Solana	NGoD1yTeq5KaURrZo7MnCTFzTA4g62ygakJCnzMLCfm (see note below!)

Arbitrum	0x36CF4c88FA548c6Ad9fcDc696e1c27Bb3306163F

Avalanche	0x169D91C797edF56100F1B765268145660503a423

Base	0x838a95B6a3E06B6f11C437e22f3C7561a6ec40F1

BNB Smart Chain	0x8E4dc685e990379b8D53EcA47841E09B8d30043e

Fogo	ngoLQ35zgtP3SxWrjAJ8Mz2H8BPFVeZoxyBPotPYwnB (see note below!)

HyperEVM :material-alert:{ title='⚠ The HyperEVM integration is experimental, as its node software is not open source. Use Wormhole messaging on HyperEVM with caution.' }	0x574B7864119C9223A9870Ea614dC91A8EE09E512

MegaETH	0x574B7864119C9223A9870Ea614dC91A8EE09E512

Monad	0x574B7864119C9223A9870Ea614dC91A8EE09E512

Optimism	0x0E09a3081837ff23D2e59B179E0Bc48A349Afbd8

Unichain	0x574b7864119c9223a9870ea614dc91a8ee09e512

XRPL-EVM	0x574B7864119C9223A9870Ea614dC91A8EE09E512

Sui	See note below!

=== "Testnet"

Chain Name	Contract Address

Ethereum Sepolia	0x9517F0164c1d089ad72E669E57b9088790966dBd

Solana	NGoD1yTeq5KaURrZo7MnCTFzTA4g62ygakJCnzMLCfm

Arbitrum Sepolia	0x81b65A48DCAccBA04aCa3C055C4112b0715b90c0

Base Sepolia	0x720A59128B96Eda6EC2940c7899406E4dc56d0DC

Optimism Sepolia	0xcE1DE1eA4b040D324a07719043A6234C94fd0b5d

XRPL-EVM	0x574B7864119C9223A9870Ea614dC91A8EE09E512

!!! note
    Guardian-governed ownership contracts are used where an owner is required, without adding new trust assumptions. They only accept instructions signed by a quorum of Wormhole Guardians, validated on-chain by the Wormhole Core contracts. Implementations: [EVM](https://github.com/wormhole-foundation/native-token-transfers/blob/main/evm/src/wormhole/Governance.sol){target=\_blank} and [SVM](https://github.com/wormhole-foundation/native-token-transfers/blob/main/solana/programs/wormhole-governance/src/instructions/governance.rs){target=\_blank}.

    On SVM chains (Solana, Fogo), deployments set the admin to a [governance PDA](https://solana.com/docs/core/pda){target=\_blank} derived from the Guardian governance program. The admin address may differ from the program ID when inspecting deployments on-chain.

    The following governance PDAs are used as the admin for deployments on SVM chains:

    - **Solana:** `4iUtozoQLdJ2FV7vXe9q215ETSw1Mnt8WKP4NyqNgAxz`.
    - **Fogo:** `nWfGbhWvREnvF1zCvhrXiKidzDJ8DzCdHb13YYZeVkV`.

    On Sui, separate instances of the Move governance contract need to be deployed for each individual token due to technical reasons. The NTT CLI is able to perform such deployments for your token via "ntt sui deploy-governance --transfer".


Delegated Guardians

## Delegated Guardians

=== "Mainnet"

Chain Name	Contract Address

Ethereum	0x1462800febd49232798132e8c8b721aa86c4c209


IBC

## IBC

This configuration is for the `ibc` feature for guardians.

=== "Mainnet"

Chain Name	Contract Address

Wormchain	wormhole1wkwy0xh89ksdgj9hr347dyd2dw7zesmtrue6kfzyml4vdtz6e5ws2y050r


Gateway

## Gateway

This configuration is for the `gatewayContract` guardian configuration.

=== "Mainnet"

Chain Name	Contract Address

Wormchain	wormhole1ufs3tlq4umljk0qfe8k5ya0x6hpavn897u2cnf9k0en9jr7qarqqaqfk2j


Read-Only Deployments

## Read-Only Deployments

=== "Mainnet"

Chain Name	Contract Address

Acala	0xa321448d90d4e5b0A732867c18eA198e75CAC48E

Aurora	0x51b5123a7b0F9b2bA265f9c4C8de7D78D52f510F

Blast	0xbebdb6C8ddC678FfA9f8748f85C815C556Dd8ac6

Corn	0xa683c66045ad16abb1bCE5ad46A64d95f9A25785

Gnosis	0xa321448d90d4e5b0A732867c18eA198e75CAC48E

Goat	0x352A86168e6988A1aDF9A15Cb00017AAd3B67155

Karura	0xa321448d90d4e5b0A732867c18eA198e75CAC48E

LightLink	0x352A86168e6988A1aDF9A15Cb00017AAd3B67155

Oasis	0xfE8cD454b4A1CA468B57D79c0cc77Ef5B6f64585

Rootstock	0xbebdb6C8ddC678FfA9f8748f85C815C556Dd8ac6

Sonic	0x352A86168e6988A1aDF9A15Cb00017AAd3B67155

Telos	0x352A86168e6988A1aDF9A15Cb00017AAd3B67155

Terra	terra1dq03ugtd40zu9hcgdzrsq6z2z4hwhc9tqk2uy5

Terra 2.0	terra12mrnzvhx3rpej6843uge2yyfppfyd3u9c3uq223q8sl48huz9juqffcnhp

SNAXchain	0xc1BA3CC4bFE724A08FbbFbF64F8db196738665f4

XPLA	xpla1jn8qmdda5m6f6fqu9qv46rt7ajhklg40ukpqchkejcvy8x7w26cqxamv3w

!!! note
    Read-only deployments allow Wormhole messages to be received on chains not fully integrated with Wormhole Guardians. These deployments support cross-chain data verification but cannot originate messages. For example, a governance message can be sent from a fully integrated chain and processed on a read-only chain, but the read-only chain cannot send messages back.


Executor


CCTP With Executor

## CCTP With Executor

=== "Mainnet v1"

Chain Name	Contract Address

Ethereum	0x6DDE92942DbB24F7c9B75765b74a33446980C1e3

Solana	CXGRA5SCc8jxDbaQPZrmmZNu2JV34DP7gFW4m31uC1zs

Aptos	0xc89bf3746dfc70bb3f2de7c35a98f327a40b9d55a443743a5935c5e3de90b7ac

Arbitrum	0x772373214238F09a494828A5323574E3d7e27558

Avalanche	0x58aC806cd205083E7E048E196f36Ff6C4Ae17bE5

Base	0x4D1Cc8921e297155044C01761f581fa52a24C33d

Optimism	0x6826c075973a4393CEf0e131c4B16869426563a7

Polygon	0x7e6Ae241101B355447A4B471D0C6968b132eC4Ab

Sui	N/A*

Unichain	0xa997Ef229E4D2a1fEca249eB41fBf5D4b2217d6E

=== "Testnet v1"

Chain Name	Contract Address

Ethereum Sepolia	0x2fcc7b2332d924764f17f1cf5eda1cd4b36751a2

Solana	CXGRA5SCc8jxDbaQPZrmmZNu2JV34DP7gFW4m31uC1zs

Aptos	0x14a12d1fd6ef371b70c2113155534ec152ec7f779e281b54866c796c9a4a58d3

Arbitrum Sepolia	0x8158305d331594f3e8d18c33ca4e6d3cdc109b75

Avalanche	0x62819ab61cc7fcc864af7bcfc92e6c1965eb69a6

Base Sepolia	0x96846c31e4f87c0f186a322926c61d4183439f0a

Optimism Sepolia	0xe17de8e29f1f0941b541b053829af74ac81c89a6

Polygon	0xdce63172e9ad15243c97acafd01cc4fdda98bead

Unichain Sepolia	0x2c1354296a11029056e0d7d7abbdd58743dbaf59

=== "Mainnet v2"

Chain Name	Contract Address

Ethereum	0xDD68aBa3E04CB1a05082402B9325753314803005

Solana	Supported

Arbitrum	0x760feC4425B46E3D8FEf8E2CE49786e5a6f74446

Avalanche	0xE42aE9e352157fcEf74E971F2C5c74A5963a71D7

Base	0x52892976559fB2fc8b7f850440eD9AA5Dc26f7D9

Codex	0x0684286448140F75d4C3D2F2c02BF66f98CdEA51

HyperEVM :material-alert:{ title='⚠ The HyperEVM integration is experimental, as its node software is not open source. Use Wormhole messaging on HyperEVM with caution.' }	0x001319beBA062d918d7007E4D2D76a0A9cc439Db

Ink	0xef0B43b49315A4aDF11bA2617Be81a304c5D6ecc

Linea	0x257dBB6AD7C7AC19360bEe1A107ebE631D568776

Monad	0x1FdCCf65318b34CFd3F5903fFb747C17e76330ac

Optimism	0x9b51579e67D4ab18D79609105509ad37B2a0D342

Plume	0x9be9C6B420eAfaaC1162D680fd7E61446b38Cf29

Polygon	0x5116F1358ae2445f571AA702dA1feB5e13094E59

SeiEVM	0xe067C0D378C50CDc34bCd973F202736D5A19e5D2

Sonic	0x8A850b2077F1eFccA89eAa9c35b45C4dC9227cdb

Sui	N/A*

Unichain	0xaf7f4FbB6C220baf57ABC7babF81D47Fd628bdb4

World Chain	0xAA4841e5d9652593852403E3ce9e8003f8D579D0

=== "Testnet v2"

Chain Name	Contract Address

Ethereum Sepolia	0xc58475c97ebde9cf4fefa0d4fb2774df81905d43

Solana	Supported

Arbitrum Sepolia	0xf601f9988d62943cb842baae1e46be9b17d0b2a4

Avalanche	0x10018394905f70daa1d740040d64cbed5a82301e

Base Sepolia	0x1effdcfedc6d45e44b3133257debfb522adb1cae

Ink	0x63993ee08bda32ecb0ba5cdc751b404f5c5c0458

Linea Sepolia	0xe8Ad216e23fc9425E65aB315F0EC13737e75afEF

Monad Testnet	0x358bAd031d7A217ebA2d471cad5fD611AeC2aF17

Optimism Sepolia	0x49f386393c26439b74e62f5794062925dfb7c1db

Polygon	0x05da7c69db265b37b4d3530d476ec4b33bd9dd45

SeiEVM	0xDC735908C3eCF29f40D8CA5f6407F2d94d316a9F

Unichain Sepolia	0xf082af7668f000f60bc519b378f6363708fc302b


NTT With Executor

## NTT With Executor

=== "Mainnet"

Chain Name	Contract Address

Ethereum	0xD2D9c936165a85F27a5a7e07aFb974D022B89463
Multi Ntt: 0x03dB430D830601DB368991eE55DAa9A708df7912

Solana	nex1gkSWtRBheEJuQZMqHhbMG5A45qPU76KqnCZNVHR

0G	0xe175a8b838f3cdb2e1aaf4ff74c05cf2f3aea9a8

Arbitrum	0x0Af42A597b0C201D4dcf450DcD0c06d55ddC1C77

Avalanche	0x4e9Af03fbf1aa2b79A2D4babD3e22e09f18Bb8EE

Base	0x83216747fC21b86173D800E2960c0D5395de0F30

Berachain	0x0a2AF374Cc9CCCbB0Acc4E34B20b9d02a0f08c30

BNB Smart Chain	0x39B57Dd9908F8be02CfeE283b67eA1303Bc29fe1

Celo	0x3d69869fcB9e1CD1F4020b637fb8256030BAc8fC

CreditCoin	0x5454b995719626256C96fb57454b044ffb3Da2F9

Fogo	nex1gkSWtRBheEJuQZMqHhbMG5A45qPU76KqnCZNVHR

HyperEVM :material-alert:{ title='⚠ The HyperEVM integration is experimental, as its node software is not open source. Use Wormhole messaging on HyperEVM with caution.' }	0x431017B1718b86898C7590fFcCC380DEf0456393

Ink	0x420370DC2ECC4D44b47514B7859fd11809BbeFF5

Linea	0xEAa5AddB5b8939Eb73F7faF46e193EefECaF13E9

MegaETH	0x3EFEc0c7Ee79135330DD03e995872f84b1AD49b6

Mezo	0x484b5593BbB90383f94FB299470F09427cf6cfE2

Moca	0xE612837749a0690BA2BCe490D6eFb5F8Fc347df3

Monad	0xc3F3dDa544815a440633176c7598f5B97500793e
Multi Ntt: 0xFEA937F7124E19124671f1685671d3f04a9Af4E4

Moonbeam	0x1365593C8bae71a55e48E105a2Bb76d5928c7DE3

Optimism	0x85C0129bE5226C9F0Cf4e419D2fefc1c3FCa25cF

Plume	0x6Eb53371f646788De6B4D0225a4Ed1d9267188AD

Polygon	0x6762157b73941e36cEd0AEf54614DdE545d0F990

Scroll	0x055625d48968f99409244E8c3e03FbE73B235a62

SeiEVM	0x3F2D6441C7a59Dfe80f8e14142F9E28F6D440445

Sonic	0xaCa00703bb87F31D6F9fCcc963548b48FA46DfeB

Sui	N/A*

Unichain	0x607723D6353Dae3ef62B7B277Cfabd0F4bc6CB4C

World Chain	0x66b1644400D51e104272337226De3EF1A820eC79

XRPL-EVM	0x6bBd1ff3bB303F88835A714EE3241bF45DE26d29

=== "Testnet"

Chain Name	Contract Address

Ethereum Sepolia	0x54DD7080aE169DD923fE56d0C4f814a0a17B8f41

Solana	nex1gkSWtRBheEJuQZMqHhbMG5A45qPU76KqnCZNVHR

0G Galileo	0xA8CA118f4C8d44Ab651Dad52B5E1a212e5d5c55b

Arbitrum Sepolia	0xd048170F1ECB8D47E499D3459aC379DA023E2C1B

Avalanche	0x4e9Af03fbf1aa2b79A2D4babD3e22e09f18Bb8EE

Base Sepolia	0x5845E08d890E21687F7Ebf7CbAbD360cD91c6245

BNB Smart Chain	0x39B57Dd9908F8be02CfeE283b67eA1303Bc29fe1

Celo	0x3d69869fcB9e1CD1F4020b637fb8256030BAc8fC

Converge	0x3d8c26b67BDf630FBB44F09266aFA735F1129197

Fogo	nex1gkSWtRBheEJuQZMqHhbMG5A45qPU76KqnCZNVHR

Ink	0xF420BFFf922D11c2bBF587C9dF71b83651fAf8Bc

Linea Sepolia	0xaA469cb84C91D5a63bf4B370dE35f0831F2CE4FF

Mezo	0x484b5593BbB90383f94FB299470F09427cf6cfE2

Moca	0x47f26bF9253Eb398fBAf825D7565FE975D839a71

Monad Testnet	0xc8F014FE6a8521259D9ADDc2170bA9e59305D306

Optimism Sepolia	0xaDB1C56D363FF5A75260c3bd27dd7C1fC8421EF5

Plume	0x6Eb53371f646788De6B4D0225a4Ed1d9267188AD

Polygon	0x2982B9566E912458fE711FB1Fd78158264596937

SeiEVM	0x3F2D6441C7a59Dfe80f8e14142F9E28F6D440445

Unichain Sepolia	0x607723D6353Dae3ef62B7B277Cfabd0F4bc6CB4C

XRPL EVM Testnet	0xcDD9d7C759b29680f7a516d0058de8293b2AC7b1


WTT Executor

## WTT Executor

=== "Mainnet"

Chain Name	Contract Address

Ethereum	0xa8969F3f8D97b3Ed89D4e2EC19B6B0CfD504b212

Solana	tbr7Qje6qBzPwfM52csL5KFi8ps5c5vDyiVVBLYVdRf

0G (Zero Gravity)	0x3dBb4dCf25dBA8F0C2417E1c34e527De0E465ecc

Arbitrum	0x04C98824a64d75CD1E9Bc418088b4c9A99048153

Avalanche	0x8849F05675E034b54506caB84450c8C82694a786

Base	0xD8B736EF27Fc997b1d00F22FE37A58145D3BDA07

Berachain	0xFAeFa20CB3759AEd2310E25015F05d62D8567A3F

BNB Smart Chain	0x2513515340fF71DD5AF02fC1BdB9615704d91524

Celo	0xe478DEe705BEae591395B08934FA19F54df316BE

Fantom	0xcafd2f0a35a4459fa40c0517e17e6fa2939441ca

Fogo	tbr7Qje6qBzPwfM52csL5KFi8ps5c5vDyiVVBLYVdRf

Ink	0x4bFB47F4c8A904d2C24e73601D175FE3a38aAb5B

MegaETH	0x4eEC1c908aD6e778664Efb03386C429fE5710D77

Monad	0xf7E051f93948415952a2239582823028DacA948e

Moonbeam	0xF6b9616C63Fa48D07D82c93CE02B5d9111c51a3d

Optimism	0x37aC29617AE74c750a1e4d55990296BAF9b8De73

Polygon	0x1d98CA4221516B9ac4869F5CeA7E6bb9C41609D6

Scroll	0x05129e142e7d5A518D81f19Db342fBF5f7E26A18

SeiEVM	0x7C129bc8F6188d12c0d1BBDE247F134148B97618

Sui	0x9b68b36399a3cd87680878d72253b3e8fdf82edb8ed74f7ec440b8bddd51f85d

Unichain	0x9Bca817F67f01557aeD615130825A28F4C5f3b87

World Chain	0xc0565Bd29b34603C0383598E16843d95Ae9c4f65

XRPL-EVM	0x37bCc9d175124F77Bfce68589d2a8090eF846B85

=== "Testnet"

Chain Name	Contract Address

Ethereum Sepolia	0xb0b2119067cF04fa959f654250BD49fE1BD6F53c

Solana	tbr7Qje6qBzPwfM52csL5KFi8ps5c5vDyiVVBLYVdRf

0G (Zero Gravity)	0x57188fC61ce92c8E941504562811660Ab883E895

Arbitrum Sepolia	0xaE8dc4a7438801Ec4edC0B035EcCCcF3807F4CC1

Avalanche	0x10Ce9a35883C44640e8B12fea4Cc1e77F77D8c52

Base Sepolia	0x523d25D33B975ad72283f73B1103354352dBCBb8

BNB Smart Chain	0x26e7e3869b781f360A108728EE8391Cee6051E17

Celo	0x9563a59c15842a6f322b10f69d1dd88b41f2e97b

Fantom	0x9563a59c15842a6f322b10f69d1dd88b41f2e97b

Fogo	tbr7Qje6qBzPwfM52csL5KFi8ps5c5vDyiVVBLYVdRf

Linea	0x1C5CC8522b5eE1e528159989A163167bC9264D07

Mezo	0x2002a44b1106DF83671Fb419A2079a75e2a34808

Moca	0x36b91D24BAba19Af3aD1b5D5E2493A571044f14F

Monad Testnet	0x03D9739c91a26d30f4B35f7e55B9FF995ef13dDb

Moonbeam	0x9563a59c15842a6f322b10f69d1dd88b41f2e97b

Optimism Sepolia	0xD9AA4f8Ac271B3149b8C3d1D0f999Ef7cb9af9EC

Polygon Amoy	0xC5c0bF6A8419b3d47150B2a6146b7Ed598C9d736

SeiEVM	0x595712bA7e4882af338d60ae37058082a5d0331A

Sui	0xb4b86c12d4ee0a813d976fb452b7afb325a2b381d00ccb2e54c5342f5ef2e684

Unichain	0x74D37B2bcD2f8CaB6409c5a5f81C8cF5b4156963

XRPL-EVM	0xb00224c60fe6ab134c8544dc29350286545f8dcc


WTT Executor With Referrer

## WTT Executor With Referrer

=== "Mainnet"

Chain Name	Contract Address

Ethereum	0x412f30e9f8B4a1e99eaE90209A6b00f5C3cc8739

0G (Zero Gravity)	0x412f30e9f8B4a1e99eaE90209A6b00f5C3cc8739

Arbitrum	0x412f30e9f8B4a1e99eaE90209A6b00f5C3cc8739

Avalanche	0x412f30e9f8B4a1e99eaE90209A6b00f5C3cc8739

Base	0x412f30e9f8B4a1e99eaE90209A6b00f5C3cc8739

Berachain	0x412f30e9f8B4a1e99eaE90209A6b00f5C3cc8739

BNB Smart Chain	0x412f30e9f8B4a1e99eaE90209A6b00f5C3cc8739

Celo	0x412f30e9f8B4a1e99eaE90209A6b00f5C3cc8739

Ink	0x412f30e9f8B4a1e99eaE90209A6b00f5C3cc8739

MegaETH	0x412f30e9f8B4a1e99eaE90209A6b00f5C3cc8739

Monad	0x412f30e9f8B4a1e99eaE90209A6b00f5C3cc8739

Moonbeam	0x412f30e9f8B4a1e99eaE90209A6b00f5C3cc8739

Optimism	0x412f30e9f8B4a1e99eaE90209A6b00f5C3cc8739

Polygon	0x412f30e9f8B4a1e99eaE90209A6b00f5C3cc8739

Scroll	0x412f30e9f8B4a1e99eaE90209A6b00f5C3cc8739

SeiEVM	0x412f30e9f8B4a1e99eaE90209A6b00f5C3cc8739

Unichain	0x412f30e9f8B4a1e99eaE90209A6b00f5C3cc8739

World Chain	0x412f30e9f8B4a1e99eaE90209A6b00f5C3cc8739

XRPL-EVM	0x13a35c075D6Acc1Fb9BddFE5FE38e7672789e4db

=== "Testnet"

Chain Name	Contract Address

Ethereum Sepolia	0x412f30e9f8B4a1e99eaE90209A6b00f5C3cc8739

0G (Zero Gravity)	0x412f30e9f8B4a1e99eaE90209A6b00f5C3cc8739

Avalanche	0x412f30e9f8B4a1e99eaE90209A6b00f5C3cc8739

Base Sepolia	0x412f30e9f8B4a1e99eaE90209A6b00f5C3cc8739

BNB Smart Chain	0x412f30e9f8B4a1e99eaE90209A6b00f5C3cc8739

Linea	0x412f30e9f8B4a1e99eaE90209A6b00f5C3cc8739

Mezo	0x412f30e9f8B4a1e99eaE90209A6b00f5C3cc8739

Moca	0x412f30e9f8B4a1e99eaE90209A6b00f5C3cc8739

Monad Testnet	0x412f30e9f8B4a1e99eaE90209A6b00f5C3cc8739

Optimism Sepolia	0x412f30e9f8B4a1e99eaE90209A6b00f5C3cc8739

Polygon Amoy	0x412f30e9f8B4a1e99eaE90209A6b00f5C3cc8739

SeiEVM	0x412f30e9f8B4a1e99eaE90209A6b00f5C3cc8739

Unichain	0x412f30e9f8B4a1e99eaE90209A6b00f5C3cc8739

XRPL-EVM	0x17CFAAf9e8a5ABb1eee758dB9040F945c9EAC907


On-Chain Quoter

## On-Chain Quoter

!!! note
    Wormhole Labs’ Quoter uses the following public keys:

    - **Mainnet**: `0xa54008017941EcE968623a0Dd8Ee907E2b133596`.
    - **Testnet**: `0x5241c9276698439fef2780dbab76fec90b633fbd`.


Wormhole Labs Quoter Implementation

### Wormhole Labs Quoter Implementation

=== "Mainnet"

Chain Name	Contract Address

Ethereum	0xA25862D222Eb8343505c12d96e097e4332468D60

Arbitrum	0xA25862D222Eb8343505c12d96e097e4332468D60

Avalanche	0xA25862D222Eb8343505c12d96e097e4332468D60

Base	0xA25862D222Eb8343505c12d96e097e4332468D60

BNB Smart Chain	0xA25862D222Eb8343505c12d96e097e4332468D60

Ink	0xA25862D222Eb8343505c12d96e097e4332468D60

Monad	0xA25862D222Eb8343505c12d96e097e4332468D60

Optimism	0xA25862D222Eb8343505c12d96e097e4332468D60

Plume	0xA25862D222Eb8343505c12d96e097e4332468D60

Polygon	0xA25862D222Eb8343505c12d96e097e4332468D60

Sei	0xA25862D222Eb8343505c12d96e097e4332468D60

=== "Testnet"

Chain Name	Contract Address

Ethereum Sepolia	0x5a6c5A46082D029FDD7c5cF8265047E0c4BB2089

Solana	qtrxiqVAfVS61utwZLUi7UKugjCgFaNxBGyskmGingz

Arbitrum Sepolia	0x5a6c5A46082D029FDD7c5cF8265047E0c4BB2089

Avalanche	0x5a6c5A46082D029FDD7c5cF8265047E0c4BB2089

Base Sepolia	0x5a6c5A46082D029FDD7c5cF8265047E0c4BB2089

Optimism Sepolia	0x5a6c5A46082D029FDD7c5cF8265047E0c4BB2089

Polygon Amoy	0x5a6c5A46082D029FDD7c5cF8265047E0c4BB2089

Sei	0x5a6c5A46082D029FDD7c5cF8265047E0c4BB2089


Quoter Router

### Quoter Router

=== "Mainnet"

Chain Name	Contract Address

Ethereum	0xF22F1c0A3a8Cb42F695601731974784C499C4EF3

Arbitrum	0x32eec14c963c23176bd8951f192292006756bDcC

Avalanche	0xA3a2A615774d34c6a4dF443C488B084eacaBd2D0

Base	0x265fd0500a430d65d6D79Cd8707F24C048604658

BNB Smart Chain	0xc921F293c27F332D47283174b11C872295624Edb

Ink	0xdEC050E66BEb2f0d5507761A0fE4867839bd88D2

Monad	0x3d9282A8e9a3cdd9b25AE969eff4705a1Fe75F34

Optimism	0xa3B6551cCbB5Fe1dc33b71EE3590B1Df22ae75B3

Plume	0x85BA1B2A2195be51Ab715be458B32B120532d230

Polygon	0x2a856931603930B827B1A4352FB4D66fA029F123

Sei	0x1D6FeA87671F7c5E184F4c59c3BdcEc5CFC3eC1c

=== "Testnet"

Chain Name	Contract Address

Ethereum Sepolia	0xc0C35D7bfBc4175e0991Ae294f561b433eA4158f

Solana	qtrrrV7W3E1jnX1145wXR6ZpthG19ur5xHC1n6PPhDV

Arbitrum Sepolia	0x5E8c14F436c9ed2ff2E8B042B0542136bf108C6f

Avalanche	0xA3a2A615774d34c6a4dF443C488B084eacaBd2D0

Base Sepolia	0x2507d6899C3D4b93BF46b555d0cB401f44065772

Optimism Sepolia	0x6a829dF7C91f35f9aD72Cd5d05550b95BbC9fd2F

Polygon Amoy	0xE00444636DA924FBAe94471d73D56b5E03cA781c

Sei	0x1D6FeA87671F7c5E184F4c59c3BdcEc5CFC3eC1c


Chain ID

## Chain ID

Wormhole assigns a unique `u16` integer chain ID to each supported blockchain. These chain IDs are specific to Wormhole and may differ from those used by blockchains to identify their networks.

You can find each chain ID documented on the [Wormhole Chain IDs](/docs/products/reference/chain-ids/){target=\_blank} page.


Consistency Level

## Consistency Level

The level of finality (consistency) a transaction should meet before being signed by a Guardian. See the [Wormhole Finality](/docs/products/reference/consistency-levels/){target=\_blank} reference page for details.


Delivery Provider

## Delivery Provider

A Delivery Provider monitors for Executor delivery requests and delivers those requests to the intended target chain as instructed.


Emitter

## Emitter

The emitter contract makes the call to the Wormhole Core Contract. The published message includes the emitter contract address, and a sequence number is tracked to provide a unique ID.


Finality

## Finality

The finality of a transaction depends on its blockchain properties. Once a transaction is considered final, you can assume the resulting state changes it caused will not be reverted.


Guardian

## Guardian

A [Guardian](/docs/protocol/infrastructure/guardians/){target=\_blank} is one of the 19 parties running validators in the Guardian Network contributing to the VAA multisig.


Guardian Network

## Guardian Network

Validators operating in a dedicated P2P network that serve as Wormhole's oracle layer. Guardians monitor on-chain activity and generate signed messages (VAAs) attesting to it.

For full Guardian Set chains, all 19 Guardians perform direct on-chain observation. For delegated chains, a delegated subset monitors and broadcasts signed delegate observations to the rest of the network. Canonical Guardians wait for a delegate quorum before signing. Regardless of the observation path, VAAs are always finalized as standard 13-of-19 multisignature attestations.


Guardian Set

## Guardian Set

The Guardian Set is the canonical set of 19 Guardians responsible for producing VAAs. A supermajority of 13 signatures is required to generate a valid VAA.

For certain chains, governance may configure a delegated subset of the Guardian Set to perform direct on-chain observation with a smaller per-chain quorum. Canonical Guardians wait for a delegate quorum before signing, ensuring that the effective security threshold for a chain cannot fall below its configured level.

The composition of the Guardian Set may change through governance actions.


Delegated Guardian

## Delegated Guardian

A Guardian configured to perform direct on-chain observation for a delegated chain. Delegated Guardians broadcast `SignedDelegateObservation` messages to the Guardian gossip network.

In contrast, a Canonical Guardian does not observe that chain directly, it waits for enough `DelegateObservation` messages (the delegate quorum) before contributing its signature to the VAA.

The key distinction: on a delegated chain, Delegated Guardians run full nodes and watch the chain themselves, while Canonical Guardians trust the delegate quorum before signing. The final VAA is still a standard 13-of-19 multisig regardless.


Heartbeat

## Heartbeat

Each Guardian will issue a `heartbeat` on a 15-second interval to signal that it is still running and convey details about its identity, uptime, version, and the status of the connected nodes.

You can view the heartbeats on the [Wormhole dashboard](https://wormhole-foundation.github.io/wormhole-dashboard/#/?endpoint=Mainnet){target=\_blank}.


Observation

## Observation

An Observation is a data structure describing a message emitted by the Core Contract and noticed by the Guardian node.


Relayer

## Relayer

A relayer is any process that delivers VAAs to a destination.


Sequence

## Sequence

A nonce, strictly increasing, which is tracked by the Wormhole Core Contract and unique to the emitter chain and address.


Spy

## Spy

A Spy is a daemon that eavesdrops on the messages passed between Guardians, typically to track VAAs as they get signed.


VAA

## VAA

[Verifiable Action Approvals](/docs/protocol/infrastructure/vaas/){target=\_blank} (VAAs) are the base data structure in the Wormhole ecosystem. They contain emitted messages along with information such as what contract emitted the message.


Validator

## Validator

A daemon configured to monitor a blockchain node and observe messages emitted by the Wormhole contracts.


Supported Networks by Product

## Supported Networks by Product


Connect

### Connect

Blockchain	Environment	Mainnet	Testnet	Devnet	Quick Links

Ethereum	EVM	:white_check_mark:	:white_check_mark:	:white_check_mark:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Solana	SVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Aptos	Move VM	:white_check_mark:	:x:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Arbitrum	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Avalanche	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Base	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Berachain	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

BNB Smart Chain	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Celo	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

CreditCoin	EVM	:white_check_mark:	:x:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Fantom	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Fogo	SVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:octicons-package-16: Block Explorer

HyperCore	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs

HyperEVM :material-alert:{ title='⚠ The HyperEVM integration is experimental, as its node software is not open source. Use Wormhole messaging on HyperEVM with caution.' }	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs

Ink	EVM	:white_check_mark:	:x:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Kaia	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Linea	EVM	:white_check_mark:	:x:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Mantle	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

MegaETH	EVM	:white_check_mark:	:x:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Mezo	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Moca	EVM	:white_check_mark:	:x:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Monad	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Moonbeam	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Optimism	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Plume	EVM	:white_check_mark:	:x:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Polygon	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Scroll	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

SeiEVM	EVM	:white_check_mark:	:x:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Sonic	EVM	:white_check_mark:	:x:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Sui	Sui Move VM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Unichain	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

World Chain	EVM	:white_check_mark:	:x:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

X Layer	EVM	:white_check_mark:	:x:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

XRPL-EVM	EVM	:white_check_mark:	:x:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer


NTT

### NTT

Blockchain	Environment	Mainnet	Testnet	Devnet	Quick Links

Ethereum	EVM	:white_check_mark:	:white_check_mark:	:white_check_mark:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Solana	SVM	:white_check_mark:	:white_check_mark:	:white_check_mark:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

0G (Zero Gravity)	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Arbitrum	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Avalanche	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Base	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Berachain	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

BNB Smart Chain	EVM	:white_check_mark:	:white_check_mark:	:white_check_mark:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Celo	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Converge	EVM	:x:	:white_check_mark:	:x:	:material-web: Website

CreditCoin	EVM	:white_check_mark:	:x:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Fantom	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Fogo	SVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:octicons-package-16: Block Explorer

HyperEVM :material-alert:{ title='⚠ The HyperEVM integration is experimental, as its node software is not open source. Use Wormhole messaging on HyperEVM with caution.' }	EVM	:white_check_mark:	:x:	:x:	:material-web: Website
:material-file-document: Developer Docs

Ink	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Kaia	EVM	:white_check_mark:	:x:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Linea	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Mantle	EVM	:white_check_mark:	:x:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

MegaETH	EVM	:white_check_mark:	:x:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Mezo	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Moca	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Monad	EVM	:white_check_mark:	:x:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Moonbeam	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Optimism	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Plume	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Polygon	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Scroll	EVM	:white_check_mark:	:x:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

SeiEVM	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Sui	Sui Move VM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Unichain	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

World Chain	EVM	:white_check_mark:	:x:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

X Layer	EVM	:white_check_mark:	:x:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

XRPL-EVM	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer


WTT

### WTT

Blockchain	Environment	Mainnet	Testnet	Devnet	Quick Links

Ethereum	EVM	:white_check_mark:	:white_check_mark:	:white_check_mark:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Solana	SVM	:white_check_mark:	:white_check_mark:	:white_check_mark:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

0G (Zero Gravity)	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Algorand	AVM	:white_check_mark:	:white_check_mark:	:white_check_mark:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Aptos	Move VM	:white_check_mark:	:white_check_mark:	:white_check_mark:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Arbitrum	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Avalanche	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Base	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Berachain	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

BNB Smart Chain	EVM	:white_check_mark:	:white_check_mark:	:white_check_mark:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Celo	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Fantom	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Fogo	SVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:octicons-package-16: Block Explorer

HyperEVM :material-alert:{ title='⚠ The HyperEVM integration is experimental, as its node software is not open source. Use Wormhole messaging on HyperEVM with caution.' }	EVM	:x:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs

Injective	CosmWasm	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Ink	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Kaia	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Linea	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Mantle	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

MegaETH	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Mezo	EVM	:x:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Moca	EVM	:x:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Monad	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Moonbeam	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

NEAR	NEAR VM	:white_check_mark:	:white_check_mark:	:white_check_mark:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Optimism	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Polygon	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Scroll	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Sei	CosmWasm	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

SeiEVM	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Sui	Sui Move VM	:white_check_mark:	:white_check_mark:	:white_check_mark:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Unichain	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

World Chain	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

X Layer	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

XRPL-EVM	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer


CCTP

### CCTP

=== "CCTP v1"

Blockchain	Environment	Mainnet	Testnet	Devnet	Quick Links

Ethereum	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Solana	SVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Aptos	Move VM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Arbitrum	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Avalanche	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Base	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Optimism	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Polygon	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Sui	Sui Move VM	:white_check_mark:	:x:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Unichain	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

=== "CCTP v2"

Blockchain	Environment	Mainnet	Testnet	Devnet	Quick Links

Ethereum	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Solana	SVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Arbitrum	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Avalanche	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Base	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

HyperEVM :material-alert:{ title='⚠ The HyperEVM integration is experimental, as its node software is not open source. Use Wormhole messaging on HyperEVM with caution.' }	EVM	:white_check_mark:	:x:	:x:	:material-web: Website
:material-file-document: Developer Docs

Ink	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Linea	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Monad	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Optimism	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Plume	EVM	:white_check_mark:	:x:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Polygon	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

SeiEVM	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Sonic	EVM	:white_check_mark:	:x:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Sui	Sui Move VM	:white_check_mark:	:x:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

Unichain	EVM	:white_check_mark:	:white_check_mark:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer

World Chain	EVM	:white_check_mark:	:x:	:x:	:material-web: Website
:material-file-document: Developer Docs
:octicons-package-16: Block Explorer