Skip to main content

viem

info

Viem is currently only available on Base Sepolia testnet.

viem a TypeScript interface for Ethereum that provides low-level stateless primitives for interacting with Ethereum.

You can use viem to interact with smart contracts deployed on Base.


Install

To install viem run the following command:

npm install --save viem

Setup

Before you can start using viem, you need to setup a Client with a desired Transport and Chain.

import { createPublicClient, http } from 'viem';
import { base } from 'viem/chains';

const client = createPublicClient({
chain: base,
transport: http(),
});
info

To use Base, you must specify base as the chain when creating a Client.

To use Base Sepolia (testnet), replace base with baseSepolia.

Reading data from the blockchain

Once you have created a client, you can use it to read and access data from Base using Public Actions

Public Actions are client methods that map one-to-one with a "public" Ethereum RPC method (eth_blockNumber, eth_getBalance, etc.)

For example, you can use the getBlockNumber client method to get the latest block:

const blockNumber = await client.getBlockNumber();

Writing data to the blockchain

In order to write data to Base, you need to create a Wallet client (createWalletClient) and specify an Account to use.

import { createWalletClient, custom } from 'viem'
import { base } from 'viem/chains'

const [account] = await window.ethereum.request({ method: 'eth_requestAccounts' })

const client = createWalletClient({
account,
chain: base,
transport: custom(window.ethereum)
})

client.sendTransaction({ ... })
info

In addition to making a JSON-RPC request (eth_requestAccounts) to get an Account, viem provides various helper methods for creating an Account, including: privateKeyToAccount, mnemonicToAccount, and hdKeyToAccount.

To use Base Sepolia (testnet), replace base with baseSepolia.

Interacting with smart contracts

You can use viem to interact with a smart contract on Base by creating a Contract instance using getContract and passing it the contract ABI, contract address, and Public and/or Wallet Client:

import { getContract } from 'viem';
import { wagmiAbi } from './abi';
import { publicClient } from './client';

// 1. Create contract instance
const contract = getContract({
address: 'CONTRACT_ADDRESS',
abi: wagmiAbi,
publicClient,
});

// 2. Call contract methods, listen to events, etc.
const result = await contract.read.totalSupply();
info

CONTRACT_ADDRESS is the address of the deployed contract.

We use cookies and similar technologies on our websites to enhance and tailor your experience, analyze our traffic, and for security and marketing. You can choose not to allow some type of cookies by clicking . For more information see our Cookie Policy.