wagmi Tempo 手续费代币设置指南:深入解析 `fee.setUserToken` 与 `*Sync` 变体

发布时间:2026/11/10 0:03:15

wagmi Tempo 手续费代币设置指南:深入解析 `fee.setUserToken` 与 `*Sync` 变体 wagmi Tempo 手续费代币设置指南深入解析fee.setUserToken与*Sync变体【免费下载链接】wagmiReactive primitives for Ethereum apps项目地址: https://gitcode.com/GitHub_Trending/wa/wagmi在基于 Tempo 链构建的以太坊应用中用户可以选择以何种 TIP-20 代币支付交易手续费。fee.setUserToken是 wagmi 中用于设置用户默认手续费代币偏好的核心写入操作本文将以 fee.setUserToken 官方文档 为骨架结合 wagmi 仓库中的 core/react 源码与测试用例完整讲解同步*Sync与异步两种调用方式、返回类型、全部参数含交易覆盖项并顺带说明配套的读取与事件监听动作帮助你在实际项目中正确落地这一功能。功能定位为用户设置默认手续费代币Tempo 网络的 Fee Manager 合约维护着每个用户默认用哪个代币付手续费的偏好记录。fee.setUserToken动作负责写入这条偏好传入一个 TIP-20 代币的地址或 ID交易上链后用户后续的链上交互转账、兑换、AMM 操作等将优先使用该代币支付 Gas 费。需要区分的是fee.setUserToken标准版只负责提交交易立即返回transactionHash不等待交易打包确认fee.setUserTokenSync同步版等待交易被打包进区块后才返回返回值中包含交易收据和解析出的事件参数。从 fee 动作源码 可以看到标准版内部通过getConnectorClient获取钱包客户端后直接委托给 Viem 的Actions.fee.setUserToken执行export async function setUserTokenconfig extends Config( config: config, parameters: setUserToken.Parametersconfig, ): PromiseActions.fee.setUserToken.ReturnValue { const { account, chainId, connector } parameters const client await getConnectorClient(config, { account, assertChainId: false, chainId, connector, }) return Actions.fee.setUserToken(client, parameters as never) }而同步版 setUserTokenSync 的结构完全相同区别仅在于委托给 Viem 的Actions.fee.setUserTokenSync由它在内部等待交易上链并提取事件数据。这也是 wagmi tempo 动作的通用约定写操作一律提供标准版与*Sync版两个变体参见 tempo 动作开发指南。快速开始基础调用示例配置一个连接 Tempo 链的 wagmi 实例所有 tempo 动作都依赖一个连接了 Tempo 链的config。文档推荐的配置如下config-tempo.tsimport { createConfig, http } from wagmi import { tempo } from wagmi/chains import { tempoWallet } from wagmi/tempo export const config createConfig({ connectors: [tempoWallet()], chains: [tempo], multiInjectedProviderDiscovery: false, transports: { [tempo.id]: http(), }, })关键点连接器使用tempoWallet()链使用tempo传输层走http()。这个配置会在下文的每个示例中作为config传入。同步版等待上链后返回收据推荐用于简单场景import { Actions } from wagmi/tempo import { config } from ./config const { receipt } await Actions.fee.setUserTokenSync(config, { token: 0x20c0000000000000000000000000000000000001, }) console.log(Transaction hash:, receipt.transactionHash) // log: Transaction hash: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef同步版在你需要立即拿到收据、随后马上读取事件参数或更新 UI 状态时非常直接一条await全部搞定。异步用法非同步版本 手动等待收据如果追求更高性能例如批量操作、不阻塞交互流程应使用非同步版本先拿到hash再通过waitForTransactionReceipt手动等待打包import { Actions as viem_Actions } from viem/tempo import { Actions } from wagmi/tempo import { waitForTransactionReceipt } from wagmi/actions const hash await Actions.fee.setUserToken(config, { token: 0x20c0000000000000000000000000000000000001, }) const receipt await waitForTransactionReceipt(config, { hash }) const { args } viem_Actions.fee.setUserToken.extractEvent(receipt.logs)这里有两个值得注意的细节extractEvent来自viem/tempowagmi 的Actions是薄封装事件解码工具仍由 Viem 提供viem_Actions.fee.setUserToken.extractEvent这与 fee 动作源码 中wagmi 动作只是 Viem 动作的封装的实现事实一致从receipt.logs中提取的args结构与返回类型一致包含user与token两个字段见下文。从源码可以确认这一两段式设计标准版 setUserToken 只负责提交并返回 hash同步版 setUserTokenSync 则由 Viem 层完成等待。测试用例也分别覆盖了两种行为setUserToken的测试断言hash已定义fee.test.ts而setUserTokenSync的测试断言完整result已定义fee.test.ts。返回类型详解无论使用哪个变体最终解析出的数据类型都是type ReturnType { /** Address of the user */ user: Address /** Address of the token set */ token: Address /** Transaction receipt */ receipt: TransactionReceipt }user被设置手续费偏好的用户地址token实际写入的 TIP-20 代币地址receipt完整交易收据可从receipt.transactionHash、receipt.logs等字段做进一步处理。对应的类型定义在 fee 动作源码 中透传自 Viem 的Actions.fee.setUserToken.ReturnValue也就是说该结构与 Viem 层完全一致。参数详解token必填类型Address | bigint要设置为手续费代币的 TIP-20 代币的地址或 ID。两种形式都受支持传Address如0x20c0000000000000000000000000000000000001或传bigintID。测试代码中两种用法均有出现——setUserToken测试传地址fee.test.tssetUserTokenSync测试传2nfee.test.ts。通用交易参数可选以下参数来自文档共享片段 tempo-write-parameters.md适用于所有 tempo 写入动作fee.setUserToken同样支持参数类型默认值说明accountAccount \| Address已连接的 wagmi 账户发送交易的账户feeTokenAddress \| bigint—本笔交易的费用代币TIP-20 地址或 IDfeePayerAccount \| true—费用支付方传 Viem Account或传true表示使用 Fee Payer Servicegasbigint—交易 Gas 上限maxFeePerGasbigint—每单位 Gas 的最高费用maxPriorityFeePerGasbigint—每单位 Gas 的最高优先费noncenumber—交易 noncenonceKeyexpiring \| bigint—交易 nonce keyvalidBeforenumber—交易必须被打包的时间戳上限UnixvalidAfternumber—交易可被打包的时间戳下限UnixthrowOnReceiptRevertbooleantrue收据显示 revert 时是否抛错仅对*Sync动作生效需要补充的是feePayer: true配合 Fee Payer Service 是 tempo 的一个典型玩法——用户无需持有原生代币由服务端代付手续费。类型测试 fee.test-d.ts 验证了feePayer: true与token组合可用同时验证了省略token会触发类型错误ts-expect-error required action parameters stay required说明token在类型层面是强制的。另外从setUserToken.Parameters的类型定义fee 动作源码可以看出动作还额外接收 wagmi 层的chainId与connector参数用于指定目标链与连接器。配套动作读取与监听设置偏好之后通常还需要读取和监听三者共同构成完整闭环均在 fee 动作源码 中实现fee.getUserToken读取用户当前默认手续费代币返回{ address, id } | null未设置时返回null见 getUserToken 文档。源码中对应getUserToken实现fee.ts并提供了queryKey/queryOptions便于接入 TanStack Query对应测试断言默认结果为地址0x20C0000000000000000000000000000000000001、ID1nfee.test.tsfee.watchSetUserToken监听 Fee Manager 上的用户手续费代币变更事件返回取消订阅函数。源码中的watchSetUserTokenfee.ts直接透传 Viem 的watchSetUserToken。// 读取当前偏好 const result await Actions.fee.getUserToken(config, { account: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb, }) // log: Fee token: { address: 0x20c0000000000000000000000000000000000000, id: 0n } // 监听变更 const unwatch Actions.fee.watchSetUserToken(config, { onUserTokenSet: (args, log) { console.log(User token set:, args) }, }) // 不需要时取消订阅 unwatch()React 场景useSetUserTokenHook在 React 应用中更推荐使用Hooks.fee.useSetUserToken。其返回 TanStack Query 的 mutation 结果mutate/mutateAsync/isPending/data等用mutate触发设置见 useSetUserToken 文档import { Hooks } from wagmi/tempo function App() { const setUserToken Hooks.fee.useSetUserToken() return ( button onClick{() setUserToken.mutate({ token: 0x20c0000000000000000000000000000000000001, }) } disabled{setUserToken.isPending} Set Token /button ) }Hook 的实现位于 packages/react/src/tempo/hooks/fee.ts内部mutationFn直接调用Actions.fee.setUserToken(config, variables)mutationKey固定为[setUserToken]并提供mutation选项透传 TanStack Query 的 mutation 配置。若需要等上链后再更新 UI可以改用useSetUserTokenSyncfee.tsmutationKey: [setUserTokenSync]或将异步版的data即交易 hash交给useWaitForTransactionReceiptimport { Hooks } from wagmi/tempo import { Actions } from viem/tempo import { useWaitForTransactionReceipt } from wagmi const setUserToken Hooks.fee.useSetUserToken() const { data: receipt } useWaitForTransactionReceipt({ hash: setUserToken.data }) setUserToken.mutate({ token: 0x20c0000000000000000000000000000000000001, }) if (receipt) { const { args } Actions.fee.setUserToken.extractEvent(receipt.logs) }Hook 层的data/mutate类型分别与动作层的 Return Type / Parameters 一一对应文档中通过链接方式复用无需重复维护类型。此外仓库还提供了配套的读取 HookuseUserToken查询型与监听 HookuseWatchSetUserToken事件型分别封装了getUserToken的 query 逻辑与watchSetUserToken的订阅/清理逻辑fee.ts。小结与最佳实践默认用同步版需要收据或事件参数的场景直接用fee.setUserTokenSync语义最清晰性能敏感用异步版先拿hash再waitForTransactionReceipt手动等待配合extractEvent解析事件token必填传地址或 ID 均可类型层面强制校验留意可选交易参数feePayer: true可配合 Fee Payer Service 实现代付throwOnReceiptRevert控制 revert 时是否抛错默认true读写监听三位一体setUserToken/getUserToken/watchSetUserToken组合使用React 场景对应useSetUserToken/useUserToken/useWatchSetUserToken。参考实现core 动作源码、core 测试、react Hook 源码、官方文档。【免费下载链接】wagmiReactive primitives for Ethereum apps项目地址: https://gitcode.com/GitHub_Trending/wa/wagmi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/7 8:03:10

DDR仿真实战:SIPI联合建模与信号完整性诊断

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/4 23:20:35

Spring Boot + Vue 家具网站全栈开发实战与源码解析

简介:面向毕业设计场景的家具电商网站完整源码包,基于Spring Boot、Vue.js和MySQL开发,适合Java方向学生用于毕设参考或二次开发。项目采用前后端分离结构:前端Vue负责页面交互与路由,后端Spring Boot提供RESTful接口&…

2026/11/10 13:24:49

OpenCloud 与 zapx v14:ZAP 分段索引文件格式深度解析

OpenCloud 与 zapx v14:ZAP 分段索引文件格式深度解析 【免费下载链接】opencloud 🌤️ OpenCloud is the open source platform for file management, sharing and collaboration. Simple and sovereign. 项目地址: https://gitcode.com/GitHub_Trend…

2026/11/10 19:50:51

从化有没有电工证复审 上岗必须这个证吗?网上查询全攻略

从化有没有电工证复审 上岗必须这个证吗?网上查询全攻略 不知道去哪报名怕被中介坑,特别是从化地区的电工朋友,很多人在复审时都遇到过找错渠道、被乱收费的问题。其实,电工证复审并不难,关键是找到正规渠道进行 网上查询…

2026/11/10 19:50:51

电工证初级要求千万别踩坑:过期换证流程全解析

电工证初级要求千万别踩坑:过期换证流程全解析 证书过期了不知道怎么复审延期,这事儿真让人头疼。尤其是你手上那本电工证初级要求的证书,要是不小心过了有效期,不仅影响日常工作,还可能被认定为无证上岗,一旦被查到,轻则罚款重则停工整顿。别以为这只…

2026/11/10 19:50:51

外省电工证能转过来吗?考电工证急救知识与上岗必备全流程解答

外省电工证能转过来吗?考电工证急救知识与上岗必备全流程解答 之前考的证在外省能不能转过来?这个是很多已经拿到特种作业操作证,尤其是电工证的朋友们最关心的问题。特别是像驻马店这样的三四线城市,很多应届毕业生或者刚入行的工程师,在外地打工或培训…

2026/11/10 19:45:50

邯郸审电工证实操怕挂科?郑州报考避坑指南帮你稳过

邯郸审电工证实操怕挂科?郑州报考避坑指南帮你稳过 实操考试心里没底怕挂科,这是大多数准备考邯郸审电工证的学员最真实的感受。尤其是像你这样已经在濮阳从事公路工程的从业者,想跨行业转岗,考个电工证来提升竞争力,但又担心考试流程复杂、实操难度大,…

2026/11/10 8:12:38

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/10 0:01:28

学历不高怕报不上名?考电工证报名费+网上查询全攻略来了

学历不高怕报不上名?考电工证报名费+网上查询全攻略来了 你是不是也担心自己学历不高,考电工证报名费太贵,根本报不上名?别急,今天就来给你讲讲,怎么用最少的钱,把证拿到手,还能在工地上多挣点钱。 电工证报名费多少钱?网上查询是关键…

2026/11/10 0:01:29

绍兴考电工证培训机构怎么选?2026河南最新政策别错过

绍兴考电工证培训机构怎么选?2026河南最新政策别错过 怕考不过白交培训费?你不是一个人。2026河南最新政策出台,对电工证考试、报名、培训、复审都有明确规定。选择绍兴考电工证培训机构,别再踩坑,下面一步步教你避坑。…

2026/11/9 6:30:27

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/10 10:29:37

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑