Skip to main content

Viem

Viem

Viem is full featured lightweight javascript library for interacting with EVM chains with first class support for Celo.

Viem is used by Wagmi and Rainbowkit.

The Viem docs have excellent examples of how to use it in your project.

With Celo

The TLDR is that passing a celo chain from viem/chains into the config of createWalletClient will enable any function that signs a transaction including sendTransaction and writeContract to accept feeCurrency in its parameters object. Don't care about feeCurrency? Leave it out to pay with CELO.

// see viem docs for more info on setup

// Create a wallet client that will sign the transaction
const client = createWalletClient({
account,
// Passing chain is how viem knows to try serializing tx as cip42.
chain: celoAlfajores,
transport: http(),
});

client.writeContract({
abi: ANY_CONTRACT_ABI,
address: ANY_CONTRACT_ABI_ADDRESS,
functionName: "contractMethod",
args: [to, parseEther(value)],
// set the fee currency on the contract write call
feeCurrency: FEE_CURRENCIES_ALFAJORES["cusd"],
});

Gas Price

When paying for transaction with an alternate feeCurrency token it is important to know the price of gas denominated in that token. As such Celo nodes accept an optional param of the address of the token for the eth_gasPrice call. Therefore rather than use viem's publicClient.getGasPrice() function you should fetch it like the example.

async function getGasPrice(client, feeCurrencyAddress?: Address) {
const priceHex = await client.request({
method: "eth_gasPrice",
params: [feeCurrencyAddress],
});
return hexToBigInt(priceHex);
}

tx.maxFeePerGas = await getGasPrice(client, tx.feeCurrency);

For an interactive example of using viem with Celo's Fee Abstraction feature see our demo