其他
用 viem 在 TypeScript 中读写 EVM…
当需要用 TypeScript/JavaScript 连接以太坊等 EVM 链、读取链上数据、调用智能合约或发送交易时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 47/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 50/100 ×0.15
适用场景
用 viem 在 TypeScript 通用
解决思路
- 根据场景选择方案:Node.js 脚本/后端用 viem + http transport;React/Next.js 前端用 wagmi hooks(基于 viem);实时事件监听用 viem + webSocket transport;浏览器钱包集成用 wagmi 或 viem custom transport。
- 安装依赖:核心库执行 `npm install viem`;React 应用额外执行 `npm install wagmi viem @tanstack/react-query`。
- 区分两类客户端:PublicClient 用于只读操作(查余额、读合约、拉取日志);WalletClient 用于写操作(发送交易、签名消息)。
- 选择 transport:`http()` 用于标准 RPC 调用(最常用);`webSocket()` 用于实时事件订阅;`custom()` 用于浏览器钱包(window.ethereum)。
- 从 `viem/chains` 导入链定义(viem 内置 50+ 链),如 `import { mainnet, arbitrum, optimism, base, polygon } from 'viem/chains'`。
- 在把任何用户提供的值插入生成的 TypeScript 代码前做输入校验:以太坊地址必须匹配 `^0x[a-fA-F0-9]{40}$`,用 viem 的 `isAddress()` 校验;Chain ID 必须来自 viem 支持的链定义;私钥绝不能硬编码,始终用 `process.env.PRIVATE_KEY` 并在运行时校验;RPC URL 只允许 `https://` 或 `wss://` 协议;ABI 输入在编码前校验类型与预期 Solidity 类型一致。
- 读取余额:用 `createPublicClient({ chain, transport: http() })` 创建客户端,调用 `client.getBalance({ address })`,用 `formatEther` 格式化输出。
- 读取合约:用 `parseAbi` 定义 ABI,调用 `client.readContract({ address, abi, functionName, args })`。
- 发送交易:用 `privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`)` 创建账户,用 `createWalletClient({ account, chain, transport: http() })` 创建客户端,调用 `client.sendTransaction({ to, value: parseEther('0.1') })` 获取交易哈希。
- 写合约:先创建 walletClient 和 publicClient,用 `publicClient.simulateContract({ address, abi, functionName, args, account })` 模拟以提前捕获错误,再用 `walletClient.writeContract(request)` 执行,最后用 `publicClient.waitForTransactionReceipt({ hash })` 等待确认并读取 `receipt.blockNumber`。
- 单位转换用 `parseEther`/`formatEther`(ETH)和 `parseUnits`/`formatUnits`(代币,如 USDC 6 位小数)。
- 地址工具用 `isAddress()` 校验、`getAddress()` 获取 checksum 地址。
- 哈希用 `keccak256(toHex('hello'))`。
- 错误处理:捕获 viem 的类型化错误,如 `ContractFunctionExecutionError`(用 `error.shortMessage` 输出)和 `InsufficientFundsError`(gas 不足)。
- 深入主题参考对应文档:客户端/transport/链见 clients-and-transports.md;读数据见 reading-data.md;发交易见 writing-transactions.md;私钥/HD 钱包见 accounts-and-keys.md;ABI/multicall 见 contract-patterns.md;React/wagmi hooks 见 wagmi-react.md。
- 如需 Uniswap 兑换集成,安装 uniswap-trading 插件:`claude plugin add @uniswap/uniswap-trading`。
适用边界 · 注意事项
- 不使用 EVM 链或非 TypeScript/JavaScript 技术栈时
- 仅需纯前端且不涉及链上读写时