Migration Guide โ
If you are coming from an earlier version of viem, you will need to make sure to update the following APIs listed below.
0.3.x Breaking changes โ
The 0.3.0 release only includes breaking changes around RPC errors. If you do not directly use the APIs listed below, you do not need to migrate.
Renamed RequestError to RpcError โ
RequestError was renamed RpcError for clarity.
import { RequestError } from 'viem'
import { RpcError } from 'viem'
throw new RequestError(new Error('An error occurred.'))
throw new RpcError(new Error('An error occurred.'))
Removed RpcRequestError โ
RpcRequestError was removed. Use RpcError instead.
import { RpcRequestError } from 'viem'
import { RpcError } from 'viem'
throw new RpcRequestError(new Error('An error occurred.'))
throw new RpcError(new Error('An error occurred.'))
Renamed RpcError to RpcRequestError โ
RpcError was renamed RpcRequestError for consistency.
import { RpcError } from 'viem'
import { RpcRequestError } from 'viem'
const err = new RpcError({
const err = new RpcRequestError({
body: { foo: 'bar' },
error: { code: 420, message: 'Error' },
url: 'https://example-rpc.com',
})
0.2.x Breaking changes โ
chain is required for sendTransaction, writeContract, deployContract โ
A chain is now required for the sendTransaction, writeContract, deployContract Actions.
You can hoist the Chain on the Client:
import { createWalletClient, custom, getAccount } from 'viem'
import { mainnet } from 'viem/chains'
export const walletClient = createWalletClient({
chain: mainnet,
transport: custom(window.ethereum)
})
const account = getAccount('0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266')
const hash = await walletClient.sendTransaction({
account,
to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
value: 1000000000000000000n
})
Alternatively, you can pass the Chain directly to the Action:
import { createWalletClient, custom, getAccount } from 'viem'
import { mainnet } from 'viem/chains'
export const walletClient = createWalletClient({
chain: mainnet,
transport: custom(window.ethereum)
})
const account = getAccount('0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266')
const hash = await walletClient.sendTransaction({
account,
chain: mainnet,
to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
value: 1000000000000000000n
})
recoverAddress, recoverMessageAddress, verifyMessage are now async โ
he following functions are now async functions instead of synchronous functions:
recoverAddressrecoverMessageAddressverifyMessage
import { recoverMessageAddress } from 'viem'
recoverMessageAddress({ message: 'hello world', signature: '0x...' })
await recoverMessageAddress({ message: 'hello world', signature: '0x...' })
assertChain removed from sendTransaction โ
Removed assertChain argument on sendTransaction, writeContract & deployContract. If you wish to bypass the chain check (not recommended unless for testing purposes), you can pass chain: null.
await walletClient.sendTransaction({
assertChain: false,
chain: null,
...
})
getAccount removed โ
Removed the getAccount function.
For JSON-RPC Accounts, use the address itself. โ
You can now pass the address directly to the account option.
import { createWalletClient, custom } from 'viem'
import { mainnet } from 'viem/chains'
const address = '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2'
const client = createWalletClient({
account: getAccount(address),
account: address,
chain: mainnet,
transport: custom(window.ethereum)
})
For Ethers Wallet Adapter, use ethersWalletToAccount. โ
If you were using the Ethers Wallet adapter, you can use the ethersWalletToAccount function.
Note: viem 0.2.0 now has a Private Key & Mnemonic Account implementation. You probably do not need this adapter anymore. This adapter may be removed in a future version.
import { createWalletClient, custom } from 'viem'
import { mainnet } from 'viem/chains'
import { getAccount } from 'viem/ethers'
import { ethersWalletToAccount } from 'viem/ethers'
import { Wallet } from 'ethers'
const account = getAccount(new Wallet('0x...'))
const account = ethersWalletToAccount(new Wallet('0x...'))
const client = createWalletClient({
account,
chain: mainnet,
transport: custom(window.ethereum)
})
For Local Accounts, use toAccount. โ
If you are using a custom signing implementation, you can use the toAccount function.
import { createWalletClient, http, getAccount } from 'viem'
import { createWalletClient, http } from 'viem'
import { toAccount } from 'viem/accounts'
import { mainnet } from 'viem/chains'
import { getAddress, signMessage, signTransaction } from './sign-utils'
const privateKey = '0x...'
const account = getAccount({
const account = toAccount({
address: getAddress(privateKey),
signMessage(message) {
return signMessage(message, privateKey)
},
signTransaction(transaction) {
return signTransaction(transaction, privateKey)
},
signTypedData(typedData) {
return signTypedData(typedData, privateKey)
}
})
const client = createWalletClient({
account,
chain: mainnet,
transport: http()
})
data renamed in signMessage โ
Renamed the data parameter in signMessage to message.
walletClient.signMessage({
data: 'hello world',
message: 'hello world',
})