К основному содержанию
скилл CX Codex

viem-integration — скилл для Claude Code: EVM и установка

Помогает подключить EVM-блокчейны к приложениям на TypeScript и JavaScript через viem. Пригодится для чтения данных, работы со смарт-контрактами и транзакциями.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add Uniswap/uniswap-ai --skill viem-integration -a claude-code
Открыть на GitHub

Что делает viem-integration

Скилл подбирает подход к задаче: для чтения данных использует PublicClient, для записи и подписей — WalletClient. В примерах показаны запрос баланса, чтение контракта, отправка транзакции и запись в контракт с предварительной симуляцией. Для React-проектов описано применение wagmi, а для событий в реальном времени — webSocket().

Есть примеры работы с сетями из viem/chains, преобразования единиц и проверки адресов. Перед генерацией кода скилл требует проверять адреса и ABI, а приватный ключ брать из process.env.PRIVATE_KEY, не вшивать в код. RPC-адреса должны использовать https:// или wss://; это ограничение важно учесть при настройке соединения.

Какие задачи решает

  • прочитать баланс адреса в EVM-сети
  • получить данные из функции смарт-контракта
  • отправить транзакцию и дождаться подтверждения
  • подключить React-приложение через wagmi
  • проверить адрес и подготовить вызов контракта

Примеры запросов агенту

  • Прочитай баланс этого адреса через viem и покажи его в ETH.
  • Подключи приложение на React к EVM-сети с помощью wagmi.
  • Подготовь запись в контракт: сначала симулируй вызов, затем отправь транзакцию.

Как установить viem-integration

1Через Skills CLI (Vercel)

npx skills add Uniswap/uniswap-ai --skill viem-integration -a claude-code

2Вручную: положить файлы

~/.claude/skills/viem-integration/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/viem-integration/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о viem-integration

Как установить viem-integration в Claude Code?

Выполните npx skills add Uniswap/uniswap-ai --skill viem-integration -a claude-code. Скилл устанавливается в ~/.claude/skills/viem-integration/SKILL.md.

Что делает viem-integration?

Помогает интегрировать EVM-сети через viem: читать данные блокчейна, вызывать контракты и отправлять транзакции. Для React также рассматривается wagmi.

Как хранить приватный ключ при работе с этим скиллом?

В примерах ключ читается из process.env.PRIVATE_KEY. Скилл требует не вшивать приватные ключи в исходный код и проверять их во время выполнения.

Исходный текст

SKILL.md · MIT
---
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

```bash
# 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`:

```typescript
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

```typescript
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

```typescript
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

```typescript
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

```typescript
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 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

```typescript
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

```typescript
import { getAddress, isAddress } from 'viem';

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

### Hashing

```typescript
import { keccak256, toHex } from 'viem';

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

---

## Error Handling

viem throws typed errors that can be caught and handled:

```typescript
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

- [viem Documentation](https://viem.sh)
- [wagmi Documentation](https://wagmi.sh)
- [viem GitHub](https://github.com/wevm/viem)
- [wagmi GitHub](https://github.com/wevm/wagmi)

© uniswap · MIT · Uniswap/uniswap-ai

Похожие скиллы

Все скиллы по теме «Бэкенд и API» →
mcp-builder официальный anthropics Скилл проводит через создание MCP-сервера на TypeScript или Python: от изучения протокола до тестов и оценки качества. 130 949установок claude-api официальный anthropics Справочник по Anthropic SDK и API Claude для генерации кода без устаревших параметров и выдуманных методов. 74 198установок lark-im larksuite Скилл подключает Lark IM к агенту: он отправляет сообщения, ищет историю, управляет чатами и файлами. Подойдёт для задач вокруг командных коммуникаций. CX Codex +1 472 900установок lark-event larksuite Слушает события Lark/Feishu и отдаёт их потоком NDJSON. Подходит для ботов, обработчиков сообщений и долгих подписчиков. CX Codex +1 466 800установок caveman-discover JuliusBrussee Находит точки вызова LLM в репозитории и размечает их воркфлоу для Caveman Cloud, чтобы расходы на токены не сливались в одну общую кучу. CX Codex +1 104 400установок migration JuliusBrussee Скилл задаёт правила безопасных миграций схем, данных и API с обязательным откатом. Пригодится при изменениях, где нельзя терять данные или ломать совместимость. CX Codex +1 103 900установок

Из того же набора15

swap-integration Помогает настроить обмен токенов через Uniswap в веб-интерфейсах, бэкенд-скриптах и смарт-контрактах. Пригодится при работе с Trading API или Universal Router. CX Codex +1 2 200установок v4-security-foundations Разбирает угрозы хуков Uniswap v4 до того, как вы напишете код: проверка вызывающего, флаги разрешений, дельта-учёт. Пригодится при работе с beforeSwap и PoolManager. CX Codex +1 1 200установок swap-planner Собирает параметры свопа, проверяет контракты токенов и выдаёт ссылку, которая открывает Uniswap с уже заполненными полями. CX Codex +1 1 200установок liquidity-planner Помогает спланировать LP-позицию на Uniswap v2, v3 или v4 и создаёт прямую ссылку с заполненными параметрами для интерфейса биржи. CX Codex +1 1 200установок configurator Скилл проводит по анкете параметров CCA-аукциона: сеть, токен, сроки, цены. Пригодится, когда нужно собрать конфиг для деплоя без ручного перебора полей. CX Codex +1 1 100установок deployer Разворачивает смарт-контракты аукционов Continuous Clearing Auction (CCA) через фабрику CREATE2 и проверяет параметры перед отправкой транзакций. CX Codex +1 1 100установок pay-with-any-token Оплачивает ответы HTTP 402 и вызовы machine payment protocol через Tempo CLI. Пополняет кошелёк обменом токенов из других EVM-сетей через Uniswap Trading API. CX Codex +1 815установок v4-sdk-integration Скилл ведёт агента по Uniswap v4 SDK: сборка свапов через Universal Router, котировки, чтение состояния пула и работа с LP-позициями. CX Codex +1 729установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой