Crosschain Asset Transfers

Learn how crosschain asset transfers work.

What are crosschain asset transfers?

Crosschain asset transfers let you move supported assets directly from one ZKsync chain to another ZKsync chain through ZKsync Connect, without first withdrawing to L1 and bridging again. They are available only on chains that settle on ZKsync Gateway after the v31 upgrade.

How do they work?

With ZKsync Connect crosschain asset transfers, assets are tracked natively across ZKsync chains. The transfer is processed through the Asset Router and Native Token Vault contracts, with asset accounting enforced by asset tracker contracts.

Assets are tracked through asset tracker contracts deployed on L1, Gateway, and the participating L2 chains. The asset transfer contracts ensure that no chain is able to transfer more assets than it has.

For users, this means the transfer stays inside the ZKsync ecosystem and does not require withdrawing to L1 and then re-bridging to another chain.

Assets are transferred via transaction bundles. On the destination chain, the InteropHandler executes the bundle by calling the L2AssetRouter, which finalizes the transfer.

Different assets use different transfer mechanics. For standard ERC20 tokens, the tokens are burned on the source chain and minted on the destination chain. For other supported assets, the Asset Router calls the asset’s handler to perform the appropriate transfer logic.

How can I transfer an asset?

For a step-by-step guide, check out the asset transfers guide.

What can I transfer?

You can transfer:

  • Standard fungible ERC20-style tokens supported by the Native Token Vault and Asset Router.
  • The chain’s base token, including ETH on ETH-based chains, if sent to a contract.

Arbitrary token standards are not supported automatically. For example, ERC721 and ERC1155 assets are not supported by the Asset Router unless custom bridging logic has been added for them.

Can I transfer an asset without a special contract?

Yes.

For standard crosschain asset transfers, the interop recipient is the L2AssetRouter, not the final user recipient. This means the final recipient can be either an EOA or a contract.

A contract only needs to implement IERC7786Recipient if you want to send a general interop message or transaction bundle directly to that contract, rather than using the Asset Router transfer flow.

Is there any setup required?

Before an asset can be transferred, it must be registered with the asset tracking and handler infrastructure. This registration only needs to happen once per asset.

If you deploy an L2-native ERC20 token on a chain that already settles on ZKsync Gateway and you want to use that token for interop, you also need to migrate the token balances to Gateway first. Until that migration happens, the asset tracker flow will not recognize the token for crosschain transfers. If the token is bridged from the L1, this migration will happen automatically.


Made with ❤️ by the ZKsync Community