
使用 wagmi 的 deployContract Action 部署智能合约完整参数指南与源码解析【免费下载链接】wagmiReactive primitives for Ethereum apps项目地址: https://gitcode.com/GitHub_Trending/wa/wagmi在 wagmi 生态中deployContract 是wagmi/core提供的核心 Action用于根据合约字节码bytecode与构造函数参数constructor arguments向目标网络部署智能合约。本文将以该 Action 的官方文档为主体结合仓库内源码、类型测试与测试用例系统讲解其导入方式、基础用法、带构造函数参数的部署流程、全部参数语义、返回值与错误类型并顺带说明其 TanStack Query Mutation 封装与 React Hook 形态帮助你在实际项目中安全、正确地完成合约部署。前置条件本文示例均基于wagmi/core包名wagmi的 React Hook 用法见后文并依赖 viem2.8.18文档中标注的版本下限。开始之前请确保项目已完成 wagmi 的配置初始化即通过createConfig创建并导出了config对象典型的配置形如// config.ts import { createConfig, http } from wagmi/core import { mainnet, sepolia } from wagmi/core/chains export const config createConfig({ chains: [mainnet, sepolia], transports: { [mainnet.id]: http(), [sepolia.id]: http(), }, })上述配置文件的完整版可参考 site/snippets/core/config.ts。导入 deployContract从wagmi/core顶层入口直接导入即可import { deployContract } from wagmi/core在仓库中该 Action 与deployContractMutationOptions分别从 packages/core/src/exports/actions.ts 与 packages/core/src/exports/query.ts 统一对外导出也就是说你既可以拿到命令式 Action也能拿到面向 TanStack Query 的 Mutation 配置。基本用法部署无参构造函数合约如果目标合约的构造函数不接受参数ABI 中的constructor的inputs为空数组只需提供abi与bytecode即可触发部署// index.ts import { deployContract } from wagmi/core import { wagmiAbi } from ./abi import { config } from ./config const result await deployContract(config, { abi: wagmiAbi, bytecode: 0x608060405260405161083e38038061083e833981016040819052610..., })配套的 ABI 文件必须包含构造函数描述无输入、nonpayable// abi.ts export const wagmiAbi [ ... { inputs: [], stateMutability: nonpayable, type: constructor, }, ... ] as const注意deployContract与普通的读操作不同它是一个需要签名并消耗 gas 的写操作因此调用前必须确保当前有已连接的账户Account部署方地址默认为连接账户。带构造函数参数的部署当合约构造函数接收参数时将参数按顺序放入args数组即可。例如构造函数接收一个uint32类型的参数x// index.ts import { deployContract } from wagmi/core import { wagmiAbi } from ./abi import { config } from ./config const result await deployContract(config, { abi: wagmiAbi, args: [69420], bytecode: 0x608060405260405161083e38038061083e833981016040819052610..., })对应的 ABI 声明// abi.ts export const wagmiAbi [ ... { inputs: [{ name: x, type: uint32 }], stateMutability: nonpayable, type: constructor, }, ... ] as const;这里的关键点是args的类型会从abi自动推断见下文参数说明因此传错参数个数或类型会在编译期直接报错无需等到链上交易失败。Parameters 参数详解deployContract的参数类型为DeployContractParameters可从wagmi/core中导入import { type DeployContractParameters } from wagmi/coreabi类型Abi必填。合约的 ABIApplication Binary Interface用于描述构造函数签名与参数编码。args的取值类型正是依据abi中的constructor声明推断出来的。const result await deployContract(config, { abi: wagmiAbi, // [!code focus] args: [69420], bytecode: 0x608060405260405161083e38038061083e833981016040819052610..., })account类型Address | Account | undefined可选。部署合约时使用的账户。若指定了该参数而该账户不存在于当前connector中会抛出异常。从源码看packages/core/src/actions/deployContract.ts当传入的account是type local的对象如本地私钥账户时会直接通过config.getClient({ chainId })获取客户端否则会走getConnectorClient经由连接器解析账户与 Provider。const result await deployContract(config, { abi: wagmiAbi, account: 0xd2135CfB216b74109775236E36d4b433F1DF507B, // [!code focus] args: [69420], bytecode: 0x608060405260405161083e38038061083e833981016040819052610..., })args类型readonly unknown[] | undefined可选。部署合约时传给构造函数的参数列表。其类型由abi自动推断——具体来说仓库中通过 viem 的ContractConstructorArgsabi类型计算出构造函数入参的元组类型见 packages/core/src/actions/deployContract.ts因此在as const声明的 ABI 下args是强类型的。const result await deployContract(config, { abi: wagmiAbi, args: [69420], // [!code focus] bytecode: 0x608060405260405161083e38038061083e833981016040819052610..., })bytecode类型Hex必填。合约的字节码即0x开头的十六进制字符串。它来自 Solidity 编译产物如 Foundry、Hardhat 或 Remix 的bytecode字段必须与abi对应同一份合约源码。const result await deployContract(config, { abi: wagmiAbi, args: [69420], bytecode: 0x608060405260405161083e38038061083e833981016040819052610..., // [!code focus] })connector类型Connector | undefined可选。部署合约时使用的连接器钱包连接器默认使用当前连接器。当配置了多个连接器、需要显式指定某个连接器时可以先通过getConnection取得当前连接再传入import { getConnection, deployContract } from wagmi/core import { wagmiAbi } from ./abi import { config } from ./config const { connector } getConnection(config) const result await deployContract(config, { abi: wagmiAbi, args: [69420], bytecode: 0x608060405260405161083e38038061083e833981016040819052610..., connector, // [!code focus] })其他从源码与类型测试中可以确认的参数除了文档明确列出的四个参数外从DeployContractParameters的实现与类型测试可以确认以下可选项chainId目标链 ID。由于DeployContractParameters内部组合了ChainIdParameterconfig, chainId见 packages/core/src/actions/deployContract.ts你可以通过chainId在多链配置中指定在哪个链上部署且该参数的类型会被约束为config[chains]中实际配置的链 ID 联合类型。链特化参数DeployContractParameters是基于UnionLooseOmitviem_DeployContractParameters, chain展开的因此 viem 支持的网络专属字段会随所选链自动出现在类型中。类型测试 packages/core/src/actions/deployContract.test-d.ts 验证了当配置包含 Celo 链时参数中会出现feeCurrency而当chainId指向主网mainnet时feeCurrency会在类型上被拒绝ts-expect-error。tempo 链的 feePayer同一类型测试文件的tempo feePayer用例packages/core/src/actions/deployContract.test-d.ts表明当目标链为 tempoLocalnet 时可以传入feePayer: true或具体的Account来代付 gas该参数同样被类型系统按链隔离主网场景下传入会触发类型错误。Return Type 返回值import { type DeployContractReturnType } from wagmi/core返回类型为DeployContractReturnType其本质是 viem 的Hash——即交易的哈希值transaction hash。注意它并不返回部署后的合约地址合约地址需要根据部署交易的回执receipt中的contractAddress字段进一步解析。仓库中的行为测试确认了这一点测试 packages/core/src/actions/deployContract.test.ts 先连接模拟连接器再调用deployContract并断言其返回值匹配transactionHashRegex0x开头的 64 位十六进制交易哈希。Error 错误处理import { type DeployContractErrorType } from wagmi/coreDeployContractErrorType是一个可导出的错误类型联合从实现上看packages/core/src/actions/deployContract.ts它聚合了GetConnectorClientErrorType来自getConnectorClient的客户端获取错误如ConnectorNotConnectedError、ConnectorAccountNotFoundError、ConnectorChainMismatchError等定义见 packages/core/src/actions/getConnectorClient.tsBaseErrorType与通用ErrorTypeviem 的DeployContractErrorType即链上交易执行阶段的错误。一个典型的失败场景是账户余额不足。测试 packages/core/src/actions/deployContract.test.ts 先将连接账户余额置为 0再触发部署最终抛出TransactionExecutionError其快照明确指出错误原因执行交易的总成本gas * gas fee value超过了账户余额。TanStack Query 集成MutationdeployContract是一个写操作天然适合用 Mutation 管理其状态。wagmi/core/query提供了对应的 Mutation 配置工厂import { type DeployContractData, type DeployContractVariables, type DeployContractMutate, type DeployContractMutateAsync, deployContractMutationOptions, } from wagmi/core/query更多细节可参考 site/shared/mutation-imports.md。从实现看packages/core/src/query/deployContract.tsdeployContractMutationOptions(config, options)返回一个 TanStack QueryMutationOptions其mutationFn内部直接调用命令式deployContract(config, variables)且mutationKey固定为[deployContract]同时导出了DeployContractData即DeployContractReturnType与DeployContractVariables即DeployContractParameters等类型。React 中的 Hook 形态useDeployContract在 React 应用中更常见的做法是使用wagmi包中的useDeployContractHook其官方文档位于 site/react/api/hooks/useDeployContract.md。它基于tanstack/react-query的useMutation构建实现见 packages/react/src/hooks/useDeployContract.ts// index.tsx import { useDeployContract } from wagmi import { wagmiAbi } from ./abi function App() { const deployContract useDeployContract() return ( button onClick{() deployContract.mutate({ abi: wagmiAbi, bytecode: 0x608060405260405161083e38038061083e833981016040819052610..., }) } Deploy Contract /button ) }Hook 返回的 mutation 对象包含标准的mutate/mutateAsync以及isPending、isError、error、data等状态字段同时还暴露了deployContract与deployContractAsync两个便捷方法源码中以deprecated标注建议改用mutate/mutateAsync。在mutate的入参中同样可以传入上文介绍的全部参数abi、bytecode、args、account、connector、chainId等。底层执行流程与源码对照从实现源码packages/core/src/actions/deployContract.ts可以还原出deployContract的完整执行链路从parameters中解构出account、chainId、connector等其余参数含abi、bytecode、args透传给 viem。获取客户端若account为local类型对象如privateKeyToAccount生成的账户直接使用config.getClient({ chainId })否则通过getConnectorClient从连接器解析出Client内部会检查连接状态、账户归属与链一致性详见 getConnectorClient.ts。解析目标链如果传入了chainId且与客户端当前链不一致则构造{ id: chainId }作为部署目标链。分发底层调用通过getAction将 viem 的deployContractaction 绑定到客户端上执行并带上account、assertChainId与解析出的chain。返回 viem 的部署交易哈希Hash。因此wagmi/core的deployContract本质上是 viemdeployContract源自viem/actions在 wagmi 连接器体系下的封装你无需关心 Provider 从哪来、账户如何注入只要保证连接器已连接并授权了对应账户即可。总结本文完整梳理了 wagmideployContractAction 的使用方式从导入、无参/带参部署、四个核心参数abi、account、args、bytecode、connector的语义与类型约束到返回值交易哈希、错误类型、TanStack Query Mutation 封装和 React Hook 用法并结合仓库源码与测试用例验证了其底层实现逻辑客户端获取、链解析、viem 委托调用与链特化参数如 Celo 的feeCurrency、tempo 的feePayer。部署合约是典型的签名写操作请务必确保账户已连接、余额充足并利用args从 ABI 推断的强类型在编译期拦截参数错误从而降低链上交易失败的几率。【免费下载链接】wagmiReactive primitives for Ethereum apps项目地址: https://gitcode.com/GitHub_Trending/wa/wagmi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考