Skip to content
Agent Orchestration
Skill

/viem-integration

Integrate EVM blockchains using viem. Use when user says "read blockchain data", "send transaction", "interact with smart contract", "connect to Ethereum", "use viem", "use wagmi", "wallet integration", "viem setup", or mentions blockchain/EVM development with TypeScript.

BOOST
From plugin
uniswap-ai
23418 skills2 agents1 MCP
Install
$ npx -y skills add uniswap/uniswap-ai --skill viem-integration --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/viem-integration

Context preview

The summary Claude sees to decide when to auto-load this skill.

Integrate EVM blockchains using viem. Use when user says "read blockchain data", "send transaction", "interact with smart contract", "connect to Ethereum", "use viem", "use wagmi", "wallet integration", "viem setup", or mentions blockchain/EVM development with TypeScript.

SKILL.md

viem-integration.SKILL.md
name: viem-integration
description: Integrate EVM blockchains using viem. Use when user says "read blockchain data", "send transaction", "interact with smart contract", "connect to Ethereum", "use viem", "use wagmi", "wallet integration", "viem setup", or mentions blockchain/EVM development with TypeScript.
allowed-tools: Read, Write, Edit, Glob, Grep, Bash(npm:*), Bash(npx:*), WebFetch, Task(subagent_type:viem-integration-expert)
model: opus
license: MIT
metadata:
  author: uniswap
  version: '1.0.0'

viem Integration

Integrate EVM blockchains using viem for TypeScript/JavaScript applications.

Quick Decision Guide

| Building... | Use This | | -------------------------- | ------------------------------ | | Node.js script/backend | viem with http transport | | React/Next.js frontend | wagmi hooks (built on viem) | | Real-time event monitoring | viem with webSocket transport | | Browser wallet integration | wagmi or viem custom transport |

Installation

# Core library
npm install viem

# For React apps, also install wagmi
npm install wagmi viem @tanstack/react-query

Core Concepts

Clients

viem uses two client types:

| Client | Purpose | Example Use | | ---------------- | -------------------- | ---------------------------------------- | | **PublicClient** | Read-only operations | Get balances, read contracts, fetch logs | | **WalletClient** | Write operations | Send transactions, sign messages |

Transports

| Transport | Use Case | | ------------- | --------------------------------- | | `http()` | Standard RPC calls (most common) | | `webSocket()` | Real-time event subscriptions | | `custom()` | Browser wallets (window.ethereum) |

Chains

viem includes 50+ chain definitions. Import from `viem/chains`:

import { mainnet, arbitrum, optimism, base, polygon } from 'viem/chains';

---

Input Validation Rules

Before interpolating ANY user-provided value into generated TypeScript code:

  • **Ethereum addresses**: MUST match `^0x[a-fA-F0-9]{40}$` — use viem's `isAddress()` for validation
  • **Chain IDs**: MUST be from viem's supported chain definitions
  • **Private keys**: MUST NEVER be hardcoded — always use `process.env.PRIVATE_KEY` with runtime validation
  • **RPC URLs**: MUST use `https://` or `wss://` protocols only
  • **ABI inputs**: Validate types match expected Solidity types before encoding

Quick Start Examples

Read Balance

import { createPublicClient, http, formatEther } from 'viem';
import { mainnet } from 'viem/chains';

const client = createPublicClient({
  chain: mainnet,
  transport: http(),
});

const balance = await client.getBalance({
  address: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045',
});

console.log(`Balance: ${formatEther(balance)} ETH`);

Read Contract

import { createPublicClient, http, parseAbi } from 'viem';
import { mainnet } from 'viem/chains';

const client = createPublicClient({
  chain: mainnet,
  transport: http(),
});

const abi = parseAbi([
  'function balanceOf(address) view returns (uint256)',
  'function decimals() view returns (uint8)',
]);

const balance = await client.readContract({
  address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', // USDC
  abi,
  functionName: 'balanceOf',
  args: ['0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045'],
});

Send Transaction

import { createWalletClient, http, parseEther } from 'viem';
import { privateKeyToAccount } from 'viem/accounts';
import { mainnet } from 'viem/chains';

const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`);

const client = createWalletClient({
  account,
  chain: mainnet,
  transport: http(),
});

const hash = await client.sendTransaction({
  to: '0x...',
  value: parseEther('0.1'),
});

console.log(`Transaction hash: ${hash}`);

Write to Contract

import { createWalletClient, createPublicClient, http, parseAbi, parseUnits } from 'viem';
import { privateKeyToAccount } from 'viem/accounts';
import { mainnet } from 'viem/chains';

const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`);

const walletClient = createWalletClient({
  account,
  chain: mainnet,
  transport: http(),
});

const publicClient = createPublicClient({
  chain: mainnet,
  transport: http(),
});

const abi = parseAbi(['function transfer(address to, uint256 amount) returns (bool)']);

// Simulate first to catch errors
const { request } = await publicClient.simulateContract({
  address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
  abi,
  functionName: 'transfer',
  args: ['0x...', parseUnits('100', 6)],
  account,
});

// Execute the transaction
const hash = await walletClient.writeContract(request);

// Wait for confirmation
const receipt = await publicClient.waitForTransactionReceipt({ hash });
console.log(`Confirmed in block ${receipt.blockNumber}`);

---

Reference Documentation

For deeper coverage of specific topics:

| Topic | Reference File | | -------------------------------- | -------------------------------------------------------------- | | Client setup, transports, chains | [Clients & Transports](./references/clients-and-transports.md) | | Reading blockchain data | [Reading Data](./references/reading-data.md) | | Sending transactions | [Writing Transactions](./references/writing-transactions.md) | | Private keys, HD wallets | [Accounts & Keys](./references/accounts-and-keys.md) | | ABI handling, multicall | [Contract Patterns](./references/contract-patterns.md) | | React/wagmi hooks | [Wagmi React](./references/wagmi-react.md) |

---

Related Plugins

Once you're

Read more
Ships withuniswap-ai

Uniswap-specific AI tools (skills, plugins, agents) for developers and AI agents integrating the Uniswap ecosystem.

Get the whole plugin

Other skills on uniswap-ai.