Executing swaps
Router
When to use
Path 1: SwapRouter02 - exact input single
import { createWalletClient, createPublicClient, http, parseUnits, parseAbi } from 'viem'
import { privateKeyToAccount } from 'viem/accounts'
const SWAP_ROUTER_02 = '0xE5BbEF8De2DB447a7432A47EBa58924d94eE470e' // mainnet
const RPC = 'https://mainnet.megaeth.com/rpc'
const account = privateKeyToAccount('0xYOUR_PRIVATE_KEY')
const wallet = createWalletClient({ account, transport: http(RPC) })
const swapAbi = parseAbi([
'function exactInputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96) params) external payable returns (uint256 amountOut)',
])
// Step 1 - approve once per (token, router) if not already approved.
// (Skip for ETH; required for any ERC-20.)
// await tokenContract.write.approve([SWAP_ROUTER_02, MAX_UINT256])
// Step 2 - submit the swap.
const txHash = await wallet.writeContract({
address: SWAP_ROUTER_02,
abi: swapAbi,
functionName: 'exactInputSingle',
args: [{
tokenIn: '0xWETH_ADDRESS',
tokenOut: '0xTOKEN_OUT',
fee: 3000,
recipient: account.address,
amountIn: parseUnits('1', 18),
amountOutMinimum: minimumOut, // from your quote × (1 - slippageBps/10000)
sqrtPriceLimitX96: 0n,
}],
})Path 2: SwapRouter02 - multi-hop exact input
Path 3: Using the Exchange API's calldata
Path 4: UniversalRouter with Permit2
Recipient sentinels
Approvals
Slippage handling
Common reverts
Revert reason
Likely cause
Where to next
Last updated