| 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"] |
Build blockchain interactions using viem for Ethereum clients, transactions, signing, and smart contract interactions. Viem is the modern replacement for ethers.js with better TypeScript support.
<mcp_first>
CRITICAL: Always fetch viem documentation before implementing.
MCPSearch({ query: "select:mcp__plugin_devtools_context7__query-docs" })
mcp__context7__query_docs({
context7CompatibleLibraryID: "/wevm/viem",
topic: "createPublicClient createWalletClient"
})
mcp__context7__query_docs({
context7CompatibleLibraryID: "/wevm/viem",
topic: "readContract writeContract simulateContract"
})
mcp__context7__query_docs({
context7CompatibleLibraryID: "/wevm/viem",
topic: "signMessage signTypedData EIP-712"
})
mcp__context7__query_docs({
context7CompatibleLibraryID: "/wevm/viem",
topic: "encodeFunctionData decodeFunctionResult encodeAbiParameters"
})
</mcp_first>
<quick_start>
Create clients:
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 });
</quick_start>
<client_types>
| Client | Purpose | Example Use |
|---|
PublicClient | Reading blockchain data | getBlockNumber(), readContract() |
WalletClient | Transaction signing/sending | sendTransaction(), signMessage() |
TestClient | Testing and simulation | mine(), setBalance() |
BundlerClient | ERC-4337 User Operations | sendUserOperation() |
| </client_types> | | |
**Unit conversions:**
import { parseEther, formatEther, parseUnits, formatUnits } from "viem";
parseEther("1.5");
formatEther(1500000000000000000n);
parseUnits("100", 6);
formatUnits(100000000n, 6);
Address utilities:
import { getAddress, isAddress } from "viem";
getAddress("0xabc...");
isAddress("0x...");
**Banned:** SSRF protection for config-sourced URLs (they're developer-controlled)
Required:
- Lazy initialization for chain resolution
- Client caching by network name
- WebSocket cleanup on destroy/refresh
- Type-safe ABI interactions
<success_criteria>