# viem

整理：链小知（AI 辅助）
资料核对日期：2026-10-12
引用地址：https://lianxiaozhi.com/tools/viem

以 TypeScript ABI 类型推导和 Public Client 为核心的 Ethereum 开发库；适合核对单次与批量只读结果、逐项失败及模拟请求的身份和状态边界。

官方入口：https://viem.sh/
类别：开发与基础设施
网络：Ethereum
访问条件：文档公开，已有项目按自身 viem 锁定包版本/ABI使用。createPublicClient + Transport 做公开读取，不必建立钱包客户端；不传HTTP URL可回落公共RPC，生产文档推荐自有服务URL，认证/额度另查。固定官方main源码只说明该commit，不证明已安装release。
费用：readContract、multicall、simulateContract 是读取/模拟，不发送交易或产生链上执行Gas；RPC服务仍可收费/限流，批量有望减少请求/CU但没有账单节省保证。模拟里的value/fee字段不是已付款或实际交易费。

## 用途
- 检查 readContract ABI与区块范围
- 解读 multicall success/failure与字节批次
- 核对 simulateContract sender/value/覆盖状态
- 解析自定义错误并拆开结果与待执行请求

## 使用边界
- 只列已读Ethereum主网示例，非链配置全集、所有RPC兼容或实时部署保证；Multicall3历史部署和EIP1898支持需另核。
- 当前网页部分类型/返回表与示例有冲突；按项目锁定版本与对应源码确定，不把固定main commit当npm当前release。
- multicall默认允许逐项失败，失败result undefined不是0；batchSize以编码字节计，不是调用数。
- stateOverride/override批准仅模拟状态；request是待执行参数，模拟成功既不是交易已发送，也不是以后一定执行成功。
- 账户、ABI、块标签、缓存/CCIP查找和transport影响结果范围；地址型sender不证明持有私钥或已授权。

## 操作教程
- [viem 批量读合约：固定区块，保留每项 success 与 failure](https://lianxiaozhi.com/tools/guides/viem-readcontract-multicall-block-failure)：从单次 readContract 扩展为 multicall，检查 ABI、历史部署、calldata 字节和逐项失败，避免部分结果缺失被合计为零。
- [viem 模拟成功为什么仍可能失败：核 sender、value 与覆盖状态](https://lianxiaozhi.com/tools/guides/viem-simulatecontract-sender-value-revert-boundary)：读取或构造写入前模拟参数，分开自定义错误、临时授权状态、返回 result 与待执行 request，不把模拟成功当真实执行。

## 相关知识
- [私有 RPC 能防止所有抢跑和夹子交易吗？](https://lianxiaozhi.com/learn/private-rpc-trust-boundaries)
- [合约代码已验证，为什么仍不能直接判断安全？](https://lianxiaozhi.com/learn/verified-contract-boundaries)
- [原始、解码和整理后的链上数据有什么区别？](https://lianxiaozhi.com/learn/raw-decoded-curated-data)
- [Gas 怎么计算？交易失败为什么仍可能扣费](https://lianxiaozhi.com/learn/gas-and-failed-transactions)

## 官方依据
- [viem 入门：Public Client与RPC访问](https://viem.sh/docs/getting-started)
- [viem Public Client：缓存与聚合](https://viem.sh/docs/clients/public)
- [viem getChainId：返回number](https://viem.sh/docs/actions/public/getChainId)
- [viem readContract：ABI、块与Overrides](https://viem.sh/docs/contract/readContract)
- [viem multicall：逐项失败与字节批次](https://viem.sh/docs/contract/multicall)
- [viem simulateContract：sender、request和自定义错误](https://viem.sh/docs/contract/simulateContract)
- [viem formatUnits：整数与指数](https://viem.sh/docs/utilities/formatUnits)
- [viem 固定源码：multicall结果分支](https://raw.githubusercontent.com/wevm/viem/6501d059faac4f92cadc0099f67cf3fcc6aa6f4f/src/actions/public/multicall.ts)
- [viem 固定源码：block选择与call边界](https://raw.githubusercontent.com/wevm/viem/6501d059faac4f92cadc0099f67cf3fcc6aa6f4f/src/actions/public/call.ts)
- [viem 固定源码：模拟结果与请求](https://raw.githubusercontent.com/wevm/viem/6501d059faac4f92cadc0099f67cf3fcc6aa6f4f/src/actions/public/simulateContract.ts)
