Skip to main content
Multichain Decoding consolidates decoded contract data across all supported EVM chains into a single table per contract. Instead of maintaining separate UNION ALL queries for every chain your protocol operates on, you submit once and query one table — with a chain column to filter or aggregate by network. This eliminates the most common sources of broken cross-chain queries: missing a newly supported chain, inconsistent table naming across deployments, or schema drift between separate submissions.
Multichain contract submissions require a paid team plan. See pricing for details.
Multichain tables have the same data freshness and latency as single-chain decoded tables. See data freshness for SLA details.

Prerequisites

Before submitting a multichain contract, ensure the following:
RequirementDetails
Identical ABIContracts must share the exact same ABI across all chains.
Consistent namingContracts must use the same project namespace and contract name (e.g., uniswap_v3 / UniswapV3Pool).
Paid team planMultichain submissions are only available to teams on a paid subscription. Compare plans →
Dune uses this standardized labeling to merge data from different chains into a single cross-chain table.

Submitting Contracts

To submit a multichain contract, use the contract submission page. Select Submit on Multiple Chains, provide the ABI, and select all target chains. When contracts with the same ABI are submitted across multiple chains, Dune combines them into a single table — no additional configuration needed. For detailed submission instructions — including factory contracts, proxy patterns, and bytecode matching — see the Contract Decoding Best Practices Guide.

Querying Multichain Tables

Naming Convention

Multichain decoded tables follow the naming pattern:
{project}_multichain.{ContractName}_{evt|call}_{EventOrFunctionName}
For example:
  • gnosis_safe_multichain.Safe_v1_4_1_call_execTransaction
  • zora_multichain.ZoraTimedSaleStrategy_evt_SaleSet

Schema

Each multichain table includes a chain column identifying the source network, alongside all standard decoded columns (evt_block_time, evt_tx_hash, call_block_time, etc.).
-- All execTransaction calls on Ethereum
SELECT chain, call_block_time, call_tx_hash
FROM gnosis_safe_multichain.Safe_v1_4_1_call_execTransaction
WHERE chain = 'ethereum'

Finding Tables in the Data Explorer

Multichain decoded tables are accessible in the Data Explorer alongside regular decoded tables. They display a distinct multichain icon and list all supported chains. Multichain table in Data Explorer

Examples

The following examples compare multichain queries against the equivalent manual UNION ALL approach. In each case, multichain tables reduce query complexity and eliminate the need to track per-chain table names.
  SELECT * 
  FROM (
      SELECT 
          --this event is emitted on sale set updates too so we take distinct
          distinct
          l.blockchain
          , l.collection as nft_address
          , l.erc20zAddress as erc20_address
          , l.tokenId as token_id
          , nft.name as nft_collection_name
          , nft.defaultAdmin as creator
          , json_value(salesConfig, 'strict $.name') as nft_name
          , json_value(salesConfig, 'strict $.symbol') as nft_symbol
          , COALESCE(try(from_unixtime(cast(json_value(salesConfig, 'strict $.saleStart') as bigint))),timestamp '1970-01-01') as start_time
          , COALESCE(try(from_unixtime(cast(json_value(salesConfig, 'strict $.saleEnd') as bigint))),timestamp '2050-01-01') as end_time
          , l.poolAddress as uni_pool
          , l.evt_block_time
          , row_number() over (partition by collection, erc20zAddress, tokenId order by evt_block_time desc) as last_sale_set
      FROM ( SELECT collection, erc20zAddress, tokenId, salesConfig, evt_block_time, poolAddress, chain AS blockchain
            FROM zora_multichain.ZoraTimedSaleStrategy_evt_SaleSet ) l 
      LEFT JOIN ( SELECT name, defaultAdmin, newContract, chain AS blockchain
                  FROM zora_multichain.ZoraCreator1155FactoryImpl_evt_SetupNewContract ) nft 
            ON l.collection = nft.newContract AND l.blockchain = nft.blockchain
  ) 
  WHERE last_sale_set = 1
  select chain, date_trunc('day', call_block_time) AS block_date, count(*) as cnt
  from gnosis_safe_multichain.Safe_v1_4_1_call_execTransaction
  group by 1, 2