writeContract
Calls a write function on a contract.
A "write" function on a Solidity contract modifies the state of the blockchain. These types of functions require gas to be executed, and hence a Transaction is needed to be broadcast in order to change the state.
Internally, writeContract
uses a Wallet Client to call the sendTransaction
action with ABI-encoded data
.
Import
ts
import { writeContract } from 'viem'
Usage
Below is a very basic example of how to call a write function on a contract (with no arguments).
ts
import { writeContract } from 'viem'
import { walletClient } from './client'
import { wagmiAbi } from './abi'
await writeContract(walletClient, {
address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
abi: wagmiAbi,
functionName: 'mint',
})
ts
export const wagmiAbi = [
...
{
inputs: [],
name: "mint",
outputs: [],
stateMutability: "nonpayable",
type: "function",
},
...
] as const;
ts
import { createWalletClient, custom } from 'viem'
import { mainnet } from 'viem/chains'
export const walletClient = createWalletClient({
chain: mainnet,
transport: custom(window.ethereum)
})
Passing Arguments
If your function requires argument(s), you can pass them through with the args
attribute.
TypeScript types for args
will be inferred from the function name & ABI, to guard you from inserting the wrong values.
For example, the mint
function name below requires a tokenId argument, and it is typed as [number]
.
ts
import { writeContract } from 'viem'
import { walletClient } from './client'
import { wagmiAbi } from './abi'
await writeContract(walletClient, {
address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
abi: wagmiAbi,
functionName: 'mint',
args: [69420]
})
ts
export const wagmiAbi = [
...
{
inputs: [{ internalType: "uint32", name: "tokenId", type: "uint32" }],
name: "mint",
outputs: [],
stateMutability: "nonpayable",
type: "function",
},
...
] as const;
ts
import { createWalletClient, custom } from 'viem'
import { mainnet } from 'viem/chains'
export const walletClient = createWalletClient({
chain: mainnet,
transport: custom(window.ethereum)
})
Return Value
Hash
Unlike readContract
, writeContract
only returns a Transaction Hash. If you would like to retrieve the return data of a write function, you can use the callContract
action – this action does not execute a transaction, and does not require gas (it is very similar to readContract
).
Parameters
address
- Type:
Address
The contract address.
ts
await writeContract(walletClient, {
address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
abi: wagmiAbi,
functionName: 'mint',
args: [69420]
})
abi
- Type:
Abi
The contract's ABI.
ts
await writeContract(walletClient, {
address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
abi: wagmiAbi,
functionName: 'mint',
args: [69420]
})
functionName
- Type:
string
A function to extract from the ABI.
ts
await writeContract(walletClient, {
address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
abi: wagmiAbi,
functionName: 'mint',
args: [69420]
})
accessList (optional)
- Type:
AccessList
The access list.
ts
await writeContract(walletClient, {
address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
abi: wagmiAbi,
functionName: 'mint',
args: [69420],
accessList: [{
address: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',
storageKeys: ['0x1'],
}],
})
args (optional)
- Type: Inferred from ABI.
Arguments to pass to function call.
ts
await writeContract(walletClient, {
address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
abi: wagmiAbi,
functionName: 'mint',
args: [69420]
})
from (optional)
- Type:
Address
Optional sender override.
ts
await writeContract(walletClient, {
address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
abi: wagmiAbi,
functionName: 'mint',
args: [69420],
from: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266'
})
gasPrice (optional)
- Type:
bigint
The price (in wei) to pay per gas. Only applies to Legacy Transactions.
ts
await writeContract(walletClient, {
address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
abi: wagmiAbi,
functionName: 'mint',
args: [69420],
gasPrice: parseGwei('20'),
})
maxFeePerGas (optional)
- Type:
bigint
Total fee per gas (in wei), inclusive of maxPriorityFeePerGas
. Only applies to EIP-1559 Transactions
ts
await writeContract(walletClient, {
address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
abi: wagmiAbi,
functionName: 'mint',
args: [69420],
maxFeePerGas: parseGwei('20'),
})
maxPriorityFeePerGas (optional)
- Type:
bigint
Max priority fee per gas (in wei). Only applies to EIP-1559 Transactions
ts
await writeContract(walletClient, {
address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
abi: wagmiAbi,
functionName: 'mint',
args: [69420],
maxFeePerGas: parseGwei('20'),
maxPriorityFeePerGas: parseGwei('2'),
})
nonce (optional)
- Type:
number
Unique number identifying this transaction.
ts
await writeContract(walletClient, {
address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
abi: wagmiAbi,
functionName: 'mint',
args: [69420],
nonce: 69
})
value (optional)
- Type:
number
Value in wei sent with this transaction.
ts
await writeContract(walletClient, {
address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
abi: wagmiAbi,
functionName: 'mint',
args: [69420],
value: parseEther('1')
})