Contracts

Resolved addresses and connected core contracts for the Viem adapter.


At a Glance

  • Resource: sdk.contracts
  • Capabilities: resolve core contract addresses, return typed getContract instances, per-contract getters.
  • Caching: addresses and instances are memoized by the client; call client.refresh() to re-resolve.
  • Token mapping: use sdk.tokens for L1⇄L2 mapping and assetId helpers.
  • Error style: Throwing methods (no try* variants).

Import

import { createViemClient, createViemSdk } from '@matterlabs/zksync-js/viem';
import { privateKeyToAccount } from 'viem/accounts';
import { createPublicClient, createWalletClient, http } from 'viem';

const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`);

const l1 = createPublicClient({ transport: http(process.env.L1_RPC!) });
const l2 = createPublicClient({ transport: http(process.env.L2_RPC!) });
const l1Wallet = createWalletClient({ chain: l1Chain, account, transport: http(process.env.L1_RPC!) });
const l2Wallet = createWalletClient({ chain: l2Chain, account, transport: http(process.env.L2_RPC!) });

const client = createViemClient({ l1, l2, l1Wallet, l2Wallet });
const sdk = createViemSdk(client);
// sdk.contracts → ContractsResource

Quick Start

Resolve addresses and contract handles:

const addresses = await sdk.contracts.addresses();
const { l1NativeTokenVault, l2AssetRouter } = await sdk.contracts.instances();

const ntv = await sdk.contracts.l1NativeTokenVault();

Method Reference

addresses() → Promise<ResolvedAddresses>

Resolve core addresses (Bridgehub, routers, vaults, base-token system).

const a = await sdk.contracts.addresses();
/*
{
  bridgehub,
  l1AssetRouter,
  l1Nullifier,
  l1NativeTokenVault,
  l2AssetRouter,
  l2NativeTokenVault,
  l2BaseTokenSystem
}
*/

instances() → Promise<{ ...contracts }>

Return typed Viem contracts for all core components (each exposes .read / .write / .simulate).

const c = await sdk.contracts.instances();
/*
{
  bridgehub,
  l1AssetRouter,
  l1Nullifier,
  l1NativeTokenVault,
  l2AssetRouter,
  l2NativeTokenVault,
  l2BaseTokenSystem
}
*/

One-off Contract Getters

MethodReturnsDescription
bridgehub()Promise<Contract>Connected Bridgehub contract.
l1AssetRouter()Promise<Contract>Connected L1 Asset Router contract.
l1NativeTokenVault()Promise<Contract>Connected L1 Native Token Vault.
l1Nullifier()Promise<Contract>Connected L1 Nullifier contract.
l2AssetRouter()Promise<Contract>Connected L2 Asset Router contract.
l2NativeTokenVault()Promise<Contract>Connected L2 Native Token Vault.
l2BaseTokenSystem()Promise<Contract>Connected L2 Base Token System.
const router = await sdk.contracts.l2AssetRouter();

Notes & Pitfalls

  • Caching: addresses() and instances() are cached by the client; call client.refresh() to force re-resolution.
  • Token mapping: For L1⇄L2 address mapping, asset IDs, and WETH helpers, use sdk.tokens.