Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
uniswap avatar

Viem Integration

  • 936 installs
  • 222 repo stars
  • Updated August 4, 2026
  • uniswap/uniswap-ai

viem-integration is a Claude Code skill that teaches developers to create Ethereum accounts, manage keys, and sign transactions with the viem TypeScript library in agents and scripts.

About

viem-integration is a Web3 development skill from uniswap/uniswap-ai that documents private key accounts, HD wallets, message signing, and WalletClient setup with viem in TypeScript. The reference covers privateKeyToAccount, createWalletClient, http transport, and mainnet chain imports with production warnings against test keys. Developers reach for viem-integration when building DeFi bots, swap agents, or on-chain automation that must derive addresses, sign messages, and submit transactions through viem instead of ethers.js or web3.js.

  • Generates private keys and converts them to account objects
  • Creates mnemonic-based HD wallets with standard derivation paths
  • Integrates privateKeyToAccount with WalletClient for mainnet and testnet usage
  • Provides ready-to-use TypeScript patterns for signing messages and sending transactions
  • Includes explicit security warnings for test keys and public mnemonics

Viem Integration by the numbers

  • 936 all-time installs (skills.sh)
  • +36 installs in the week ending Aug 5, 2026 (Skillselion tracking)
  • Ranked #421 of 4,347 Backend & APIs skills by installs in the Skillselion catalog
  • Security screen: MEDIUM risk (skills.sh audit)
  • Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/uniswap/uniswap-ai --skill viem-integration

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs936
repo stars222
Security audit2 / 3 scanners passed
Last updatedAugust 4, 2026
Repositoryuniswap/uniswap-ai

How do you sign Ethereum transactions with viem in TypeScript?

Correctly create and manage Ethereum accounts and sign transactions using the viem library in TypeScript agents and scripts.

Who is it for?

TypeScript developers building Ethereum agents, scripts, or DeFi integrations who standardize on viem for account and transaction handling.

Skip if: Developers who need smart-contract authoring, Solidity audits, or a non-viem stack like ethers.js without migration intent.

When should I use this skill?

A developer asks to create Ethereum accounts, sign messages, or send transactions using viem in TypeScript agents or CLI scripts.

What you get

TypeScript snippets for viem accounts, WalletClient setup, chain config, and signed transaction flows

  • viem account setup snippets
  • WalletClient transaction signing examples

By the numbers

  • Documents privateKeyToAccount, createWalletClient, and mainnet chain wiring in TypeScript

Files

SKILL.mdMarkdownGitHub ↗

viem Integration

Integrate EVM blockchains using viem for TypeScript/JavaScript applications.

Quick Decision Guide

Building...Use This
Node.js script/backendviem with http transport
React/Next.js frontendwagmi hooks (built on viem)
Real-time event monitoringviem with webSocket transport
Browser wallet integrationwagmi 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:

ClientPurposeExample Use
PublicClientRead-only operationsGet balances, read contracts, fetch logs
WalletClientWrite operationsSend transactions, sign messages

Transports

TransportUse 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:

TopicReference File
Client setup, transports, chainsClients & Transports
Reading blockchain dataReading Data
Sending transactionsWriting Transactions
Private keys, HD walletsAccounts & Keys
ABI handling, multicallContract Patterns
React/wagmi hooksWagmi React

---

Related Plugins

Once you're comfortable with viem basics, the uniswap-trading plugin provides comprehensive Uniswap swap integration:

  • Uniswap Trading API integration
  • Universal Router SDK usage
  • Token swap implementations

Install it with: claude plugin add @uniswap/uniswap-trading

---

Common Utilities

Unit Conversion

import { parseEther, formatEther, parseUnits, formatUnits } from 'viem';

// ETH
parseEther('1.5'); // 1500000000000000000n (wei)
formatEther(1500000000000000000n); // "1.5"

// Tokens (e.g., USDC with 6 decimals)
parseUnits('100', 6); // 100000000n
formatUnits(100000000n, 6); // "100"

Address Utilities

import { getAddress, isAddress } from 'viem';

isAddress('0x...'); // true/false
getAddress('0x...'); // checksummed address

Hashing

import { keccak256, toHex } from 'viem';

keccak256(toHex('hello')); // 0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8

---

Error Handling

viem throws typed errors that can be caught and handled:

import { ContractFunctionExecutionError, InsufficientFundsError } from 'viem'

try {
  await client.writeContract(...)
} catch (error) {
  if (error instanceof ContractFunctionExecutionError) {
    console.error('Contract call failed:', error.shortMessage)
  }
  if (error instanceof InsufficientFundsError) {
    console.error('Not enough ETH for gas')
  }
}

---

Resources

Related skills

How it compares

Choose viem-integration when standardizing TypeScript agents on viem for accounts and signing rather than general Web3 architecture guidance.

FAQ

What does viem-integration cover for Ethereum development?

viem-integration is a Claude Code skill that documents viem account creation, private key and HD wallet usage, message signing, and WalletClient configuration in TypeScript for agents and scripts.

Which viem imports does the skill reference?

viem-integration references privateKeyToAccount from viem/accounts, createWalletClient and http from viem, and chain definitions such as mainnet from viem/chains for transaction-ready clients.

Is Viem Integration safe to install?

skills.sh reports 2 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.

Backend & APIsintegrationsbackend

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.