| name | viem |
| description | Viem blockchain client patterns for Ethereum interactions, transactions, signing, encoding, and smart contract calls. Triggers on viem, publicClient, walletClient, chain, abi. |
| triggers | viem, ox, publicClient, walletClient, transport, chain, abi, transaction, signature, encode, decode |
MCPSearch({ query: "select:mcp__plugin_devtools_context7__query-docs" })
// Client patterns
mcp__context7__query_docs({
context7CompatibleLibraryID: "/wevm/viem",
topic: "createPublicClient createWalletClient"
})
// Contract interactions
mcp__context7__query_docs({
context7CompatibleLibraryID: "/wevm/viem",
topic: "readContract writeContract simulateContract"
})
// Signing
mcp__context7__query_docs({
context7CompatibleLibraryID: "/wevm/viem",
topic: "signMessage signTypedData EIP-712"
})
// Encoding
mcp__context7__query_docs({
context7CompatibleLibraryID: "/wevm/viem",
topic: "encodeFunctionData decodeFunctionResult encodeAbiParameters"
})
import { createPublicClient, createWalletClient, http } from "viem";
import { mainnet } from "viem/chains";
import { privateKeyToAccount } from "viem/accounts";
const publicClient = createPublicClient({
chain: mainnet,
transport: http(),
});
const walletClient = createWalletClient({
chain: mainnet,
transport: http(),
account: privateKeyToAccount("0x..."),
});
Read contract:
const balance = await publicClient.readContract({
address: "0x...",
abi: erc20Abi,
functionName: "balanceOf",
args: [userAddress],
});
Write contract:
const hash = await walletClient.writeContract({
address: "0x...",
abi: erc20Abi,
functionName: "transfer",
args: [recipient, amount],
});
const receipt = await publicClient.waitForTransactionReceipt({ hash });
import { parseEther, formatEther, parseUnits, formatUnits } from "viem";
parseEther("1.5"); // 1500000000000000000n
formatEther(1500000000000000000n); // "1.5"
parseUnits("100", 6); // 100000000n (USDC)
formatUnits(100000000n, 6); // "100"
Address utilities:
import { getAddress, isAddress } from "viem";
getAddress("0xabc..."); // Checksummed address
isAddress("0x..."); // Validates format
Required:
- Lazy initialization for chain resolution
- Client caching by network name
- WebSocket cleanup on destroy/refresh
- Type-safe ABI interactions