Viem extensions for ERC20 tokens.
Install viem and viem-erc20 as dependencies:
npm install viem viem-erc20This package provides ESM-friendly helpers for interacting with ERC20 contracts using viem.
Reads the allowance of a spender for a given owner.
allowance(client, { address, owner, spender });- client:
Client(from viem) — required - address:
Address— ERC20 contract address (required) - owner:
Address— Token holder address (required) - spender:
Address— Spender address (required)
Example:
import { allowance } from "viem-erc20/actions";
const result = await allowance(client, {
address: "0x6B175474E89094C44Da98b954EedeAC495271d0F", // DAI
owner: "0xYourWalletAddress",
spender: "0xSpenderAddress",
});Reads the balance of an account.
balanceOf(client, { account, address });- client:
Client(from viem) — required - account:
Address— Account to check balance for (required) - address:
Address— ERC20 contract address (required)
Example:
import { balanceOf } from "viem-erc20/actions";
const balance = await balanceOf(client, {
account: "0xYourWalletAddress",
address: "0x6B175474E89094C44Da98b954EedeAC495271d0F", // DAI
});Reads the decimals value of an ERC20 token contract.
decimals(client, { address });- client:
Client(from viem) — required - address:
Address— ERC20 contract address (required)
Example:
import { decimals } from "viem-erc20/actions";
const tokenDecimals = await decimals(client, {
address: "0x6B175474E89094C44Da98b954EedeAC495271d0F", // DAI
});Reads the name value of an ERC20 token contract.
name(client, { address });- client:
Client(from viem) — required - address:
Address— ERC20 contract address (required)
Example:
import { name } from "viem-erc20/actions";
const tokenName = await name(client, {
address: "0x6B175474E89094C44Da98b954EedeAC495271d0F", // DAI
});Reads the symbol value of an ERC20 token contract.
symbol(client, { address });- client:
Client(from viem) — required - address:
Address— ERC20 contract address (required)
Example:
import { symbol } from "viem-erc20/actions";
const tokenSymbol = await symbol(client, {
address: "0x6B175474E89094C44Da98b954EedeAC495271d0F", // DAI
});Gets the total supply of the ERC20 token.
totalSupply(client, { address });- client:
Client(from viem) — required - address:
Address— ERC20 contract address (required)
Example:
import { totalSupply } from "viem-erc20/actions";
const tokenSupply = await totalSupply(client, {
address: "0x6B175474E89094C44Da98b954EedeAC495271d0F", // DAI
});Sends an approval transaction to allow a spender to spend tokens on behalf of the owner.
approve(walletClient, { address, spender, amount });- walletClient:
WalletClient(from viem) — required - address:
Address— ERC20 contract address (required) - spender:
Address— Spender address (required) - amount:
bigint— Amount to approve (required, must be > 0)
Example:
import { approve } from "viem-erc20/actions";
const tx = await approve(walletClient, {
address: "0x6B175474E89094C44Da98b954EedeAC495271d0F", // DAI
spender: "0xSpenderAddress",
amount: 1000000000000000000n, // 1 DAI (in wei)
});You can extend your viem client with ERC20 actions using .extend() and the provided helpers:
import { createPublicClient, createWalletClient, http } from "viem";
import { erc20PublicActions, erc20WalletActions } from "viem-erc20";
// Example: extending a public client
const publicClient = createPublicClient({
chain, // your chain config
transport: http(),
}).extend(erc20PublicActions());
// Now you can call:
const tokenAllowance = await publicClient.allowance({
address: "0x6B175474E89094C44Da98b954EedeAC495271d0F",
owner: "0xYourWalletAddress",
spender: "0xSpenderAddress",
});
// Example: extending a wallet client
const walletClient = createWalletClient({
account, // your account config
chain, // your chain config
transport: http(),
}).extend(erc20WalletActions());
// Now you can call:
const tx = await walletClient.approve({
address: "0x6B175474E89094C44Da98b954EedeAC495271d0F",
spender: "0xSpenderAddress",
amount: 1000000000000000000n,
});To install the dependencies, run:
npm installTo run the tests, run:
npm test