USDC is an ERC-20 token, so a transfer is a transfer(to, value) call on the USDC contract. The JS SDK exposes a viem WalletClient for any wallet account via createWalletClientForWalletAccount — you read the account from getWalletAccounts (or useGetWalletAccounts in React), encode the call with viem’s erc20Abi, and you’re done.
Setup
Follow the JavaScript Quickstart for a vanilla setup, or the React Quickstart (JS SDK) for a Vite + React app with <DynamicProvider> and the EVM extension. The rest of this guide picks up from there.
Install viem alongside the SDK packages:
Step 1: Get the USDC contract address
USDC is deployed at a different address on every chain. Look up the right one on Circle’s references:
USDC has 6 decimals on every EVM chain — always convert with parseUnits(amount, 6).
Step 2: Build the send function
Read the user’s EVM wallet account with getWalletAccounts (or useGetWalletAccounts in React), narrow it with isEvmWalletAccount, then call writeContract against the USDC contract using viem’s built-in erc20Abi.
Use useGetWalletAccounts to reactively get the wallet, then call createWalletClientForWalletAccount inside the click handler:src/components/SendUsdcButton.tsx
createWalletClientForWalletAccount signs on whatever network the wallet is currently on. To target a specific chain, switch the wallet first with switchActiveNetwork — useSwitchActiveNetwork in React.
The sender needs native token (ETH, and so on) to pay gas for the transfer. To pay it for them instead, use EVM gas sponsorship: sendSponsoredTransaction takes the same transfer call as encoded calldata.
Handling errors
Wrap the send call (sendUsdc in the JavaScript tab, handleSend in the React tab) in a try/catch and match on the message to tell the common failures apart:
To catch a failing transfer before the user signs, preview it with simulateEvmTransaction, which returns the expected asset changes plus a security verdict.
Last modified on August 18, 2026