multicall
Similar to readContract
, but batches up multiple functions on a contract in a single RPC call via the multicall3
contract.
Usage
ts
import { publicClient } from './client'
import { wagmiAbi } from './abi'
const wagmiContract = {
address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
abi: wagmiAbi
} as const
const results = await publicClient.multicall({
contracts: [
{
...wagmiContract,
functionName: 'totalSupply',
},
{
...wagmiContract,
functionName: 'ownerOf',
args: [69420n]
},
{
...wagmiContract,
functionName: 'mint'
}
]
})
/**
* [
* { result: 424122n, status: 'success' },
* { result: '0xc961145a54C96E3aE9bAA048c4F4D6b04C13916b', status: 'success' },
* { error: [ContractFunctionExecutionError: ...], status: 'failure' }
* ]
*/
ts
export const wagmiAbi = [
...
{
inputs: [],
name: "totalSupply",
outputs: [{ name: "", type: "uint256" }],
stateMutability: "view",
type: "function",
},
{
inputs: [{ name: "tokenId", type: "uint256" }],
name: "ownerOf",
outputs: [{ name: "", type: "address" }],
stateMutability: "view",
type: "function",
},
{
inputs: [],
name: "mint",
outputs: [],
stateMutability: "view",
type: "function",
},
...
] as const;
ts
import { createPublicClient, http } from 'viem'
import { mainnet } from 'viem/chains'
export const publicClient = createPublicClient({
chain: mainnet,
transport: http()
})
Return Value
({ data: <inferred>, status: 'success' } | { error: string, status: 'reverted' })[]
An array of results with accompanying status.
Parameters
contracts.address
- Type:
Address
The contract address.
ts
const results = await publicClient.multicall({
contracts: [
{
address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
abi: wagmiAbi,
functionName: 'totalSupply',
},
...
]
})
contracts.abi
- Type:
Abi
The contract ABI.
ts
const results = await publicClient.multicall({
contracts: [
{
address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
abi: wagmiAbi,
functionName: 'totalSupply',
},
...
]
})
contracts.functionName
- Type:
string
The function name to call.
ts
const results = await publicClient.multicall({
contracts: [
{
address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
abi: wagmiAbi,
functionName: 'totalSupply',
},
...
]
})
contracts.args (optional)
- Type: Inferred from ABI.
Arguments to pass to function call.
ts
const results = await publicClient.multicall({
contracts: [
{
address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
abi: wagmiAbi,
functionName: 'balanceOf',
args: ['0xc961145a54C96E3aE9bAA048c4F4D6b04C13916b']
},
...
]
})
allowFailure (optional)
- Type:
boolean
- Default:
true
Whether or not the multicall
function should throw if a call reverts. If set to true
(default), and a call reverts, then multicall
will fail silently and its error will be logged in the results
array.
ts
const results = await publicClient.multicall({
contracts: [
{
address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
abi: wagmiAbi,
functionName: 'totalSupply',
},
...
],
allowFailure: false
})
account (optional)
- Type:
Account
Optional Account sender override. Read more.
ts
const results = await publicClient.multicall({
contracts: [
{
address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
abi: wagmiAbi,
functionName: 'totalSupply',
},
...
],
account: getAccount('0xc961145a54C96E3aE9bAA048c4F4D6b04C13916b')
})
multicallAddress (optional)
- Type:
Address
- Default:
client.chain.contracts.multicall3.address
Address of Multicall Contract.
ts
const results = await publicClient.multicall({
contracts: [
{
address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
abi: wagmiAbi,
functionName: 'totalSupply',
},
...
],
multicallAddress: '0xca11bde05977b3631167028862be2a173976ca11'
})
Live Example
Check out the usage of multicall
in the live Multicall Example below.