ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

wagmi Tempo 实战:使用 `token.useBurn` / `useBurnSync` 销毁 TIP-20 代币

2026/9/18 0:46:53 拓冰建站 浏览量
wagmi Tempo 实战:使用 `token.useBurn` / `useBurnSync` 销毁 TIP-20 代币 wagmi Tempo 实战使用token.useBurn/useBurnSync销毁 TIP-20 代币【免费下载链接】wagmiReactive primitives for Ethereum apps项目地址: https://gitcode.com/GitHub_Trending/wa/wagmiHooks.token.useBurn与Hooks.token.useBurnSync是 wagmi Tempo 模块中面向 React 的写操作 Hook用于从调用者caller的余额中销毁 TIP-20 代币。本文以 token.useBurn 文档 为核心骨架结合 React Hook 源码 与 core 层 Action 实现 及对应测试系统讲解两种变体的使用方式、返回类型、参数体系与底层执行链路读完即可在基于 Tempo 链的应用中落地代币销毁功能。功能概述销毁 TIP-20 代币token.useBurn对应的链上语义是“从调用者余额中销毁指定数量的 TIP-20 代币”通常用于代币回购销毁、手续费结算后销毁、或实现通缩型代币经济。它属于 write 类mutationHook不直接返回链上数据而是通过mutate/mutateAsync触发交易。与普通以太坊交易不同Tempo 网络上的 Token 操作基于 TIP-20 标准Tempo 链的代币标准因此销毁的是 TIP-20 代币而非 ERC-20 代币。该 Hook 提供两个变体useBurn非同步变体mutate后返回交易哈希Hash需要自行等待交易上链useBurnSync同步变体等待交易被打包进区块后才返回返回值中直接携带交易回执receipt与事件数据。从 token.ts 源码 可以看到useBurn与useBurnSync的实现结构完全对称二者都是通过useMutation包装 core 层的Actions.token.burn/Actions.token.burnSync仅mutationKey分别为[burn]与[burnSync]。前置准备Tempo 链与钱包配置两个示例都依赖一份启用了 Tempo 链与tempoWallet连接器的 wagmi 配置。仓库中提供了标准模板 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(), }, })配置要点connectors注册tempoWallet()这是 Tempo 生态的钱包连接器详见 tempoWallet 文档chains只注册tempo链transports为tempo.id配置http()RPC 传输层multiInjectedProviderDiscovery: false关闭多注入提供方自动发现避免与tempoWallet冲突。该配置既是useBurn系列 Hook 的默认来源也是 core 层Actions.token.burnSync(config, ...)的直接入参。同步用法useBurnSync一步到位官方文档 给出的同步示例在一次调用中完成交易发送、上链等待与结果读取import { Hooks } from wagmi/tempo import { parseUnits } from viem const burnSync Hooks.token.useBurnSync() // 在用户交互按钮点击、表单提交中调用 mutate burnSync.mutate({ amount: parseUnits(10.5, 6), token: 0x20c0000000000000000000000000000000000000, }) console.log(Burned amount:, burnSync.data?.amount) // log: Burned amount: 10500000n console.log(From:, burnSync.data?.from) // log: From: 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEbb需要注意的细节amount使用parseUnits(10.5, 6)将小数金额转换为bigint其中6是 TIP-20 代币的 decimals。返回值中的amount是10500000n即 10.5 × 10⁶token参数可以是代币合约地址Address或代币 IDbigintdata在*Sync变体下包含amount、from与receipt三个字段。异步用法useBurn 手动等待回执文档明确建议如果你更看重性能应使用非同步的token.useBurn并自行等待交易上链。异步路径的优势是mutate立即返回哈希UI 可以先行给出“交易已提交”反馈避免阻塞在区块确认上import { Hooks } from wagmi/tempo import { Actions } from viem/tempo import { parseUnits } from viem import { useWaitForTransactionReceipt } from wagmi const burn Hooks.token.useBurn() const { data: receipt } useWaitForTransactionReceipt({ hash: burn.data }) // 在用户交互中调用 mutate burn.mutate({ amount: parseUnits(10.5, 6), token: 0x20c0000000000000000000000000000000000000, }) if (receipt) { const { args: { amount, from } } Actions.token.burn.extractEvent(receipt.logs) }这里的关键链路useBurn的data是交易哈希useWaitForTransactionReceipt({ hash: burn.data })会监听该哈希对应的回执回执就绪后通过 viem 的Actions.token.burn.extractEvent(receipt.logs)从日志中还原出Burn事件的argsamount与from与同步变体的data字段一一对应。这种“mutation 提交 query 等待”的组合是 wagmi 中异步写操作的推荐模式receipt状态由 TanStack Query 管理天然具备响应式更新能力。返回类型Return TypeuseBurn/useBurnSync是 mutation Hook其返回值遵循 TanStack Query v5useMutation的结构常用字段包括data、error、isPending、isError、isSuccess、mutate、mutateAsync、reset等。datadata的具体结构取决于所用变体useBurndata为交易哈希HashuseBurnSyncdata与 core 层 Actiontoken.burnSync的返回类型一致详见 token.burn 文档的 Return Typetype ReturnType { /** 被销毁的代币数量 */ amount: bigint /** 代币被销毁的地址 */ from: Address /** 交易回执 */ receipt: TransactionReceipt }mutate / mutateAsyncmutate用于触发销毁交易返回值被丢弃适合事件回调mutateAsync返回 Promise适合需要await的组合调用。二者的入参即 Actiontoken.burn的参数见下文。参数Parametersconfig类型Config | undefined指定要使用的 wagmiConfig不传时自动从最近的WagmiProvider获取详见 createConfig 与 WagmiProvider。从源码看useBurn内部通过useConfig(parameters)解析 configuseConfig优先使用显式传入的 config否则回退到 Provider 上下文。mutationmutation透传给 TanStack Query 的useMutation可配置onSuccess、onError、onSettled等回调以及gcTime、retry等行为。其泛型在源码中被精确约束为mutation?: UseMutationParameters Actions.token.burn.ReturnValue, // 返回数据 Actions.token.burn.ErrorType, // 错误类型 Actions.token.burn.Parametersconfig // mutate 入参 交易参数mutate的入参继承自 Actiontoken.burn见 token.burn 参数文档核心字段参数类型必填说明amountbigint是要销毁的代币数量最小单位tokenAddress \| bigint是TIP-20 代币地址或 IDmemoHex否交易备注会包含在转账数据中此外所有 Tempo 写操作还共享一组可选交易覆盖参数见 tempo-write-parametersaccountAccount | Address发送交易的账户默认使用已连接的 Wagmi 账户feeTokenAddress | bigint手续费代币可为 TIP-20 地址或 IDfeePayerAccount | true手续费支付方true表示使用 Fee Payer Servicegasbigintgas 上限maxFeePerGas/maxPriorityFeePerGasbigintEIP-1559 费用参数noncenumber交易 noncenonceKeyexpiring | bigintnonce keyvalidBefore/validAfternumber交易有效时间窗Unix 时间戳throwOnReceiptRevertboolean默认true仅对*Sync变体生效回执表明 revert 时是否抛错。源码级原理从 Hook 到链上交易React 层mutation 薄封装token.ts 中useBurn的核心实现仅十余行export function useBurnconfig extends Config, context unknown( parameters: useBurn.Parametersconfig, context {}, ): useBurn.ReturnTypeconfig, context { const { mutation } parameters const config useConfig(parameters) return useMutation({ ...mutation, async mutationFn(variables) { return Actions.token.burn(config, variables as never) }, mutationKey: [burn], }) as never }useBurnSync结构完全相同只是将mutationFn指向Actions.token.burnSyncmutationKey为[burnSync]。由此可以推断该 Hook 是 core Action 的 React 响应式封装所有参数校验、错误类型ErrorType、返回类型ReturnValue均与 core 层保持一致类型层面通过命名空间useBurn.Parameters/useBurn.ReturnType关联。Core 层获取连接器客户端并委托给 viemcore 实现 的burn先解析参数再通过getConnectorClient拿到已连接钱包的客户端export async function burnconfig extends Config( config: config, parameters: burn.Parametersconfig, ): PromiseActions.token.burn.ReturnValue { const { account, chainId, connector } parameters const client await getConnectorClient(config, { account, assertChainId: false, // Tempo 交易不强制断言链 ID chainId, connector, }) return Actions.token.burn(client, parameters as never) }burnSync同样先解析客户端再调用 viem 的token.burnSync等待上链并返回{ amount, from, receipt }。也就是说wagmi 层负责“配置解析 连接器客户端获取”真正的签名、发送、回执等待由 viem 的 Tempo 模块完成。测试验证仓库中 token.test.ts 对useBurnSync给出了端到端测试流程useConnect连接第一个连接器 →useCreateSync创建名为Burnable Hook Token Sync的代币 →useGrantRolesSync授予issuer角色 →useMintSync铸造parseUnits(1000, 6)代币随后才可执行销毁。这印证了实际使用前需要先完成创建代币 授权角色 铸造的前置步骤而useBurnBlocked/useBurnBlockedSync从被封锁地址销毁在测试中尚标记为describe.todo。实践建议与注意事项销毁前确保余额充足可配合 token.useGetBalance 查询当前余额避免链上 revert同步变体的取舍*Sync变体返回更丰富含receipt但会阻塞到区块确认对 UI 响应要求高的场景优先useBurnuseWaitForTransactionReceipt事件解码异步路径中通过Actions.token.burn.extractEvent(receipt.logs)还原amount/from与同步变体的data语义对齐角色与权限TIP-20 销毁通常在持有者角色下进行若涉及管理员专属销毁逻辑需结合 token.useGrantRoles 等角色管理 Hook 授权监听销毁事件如需在应用中实时响应销毁行为可配合 token.useWatchBurn 订阅 Burn 事件形成“写入 订阅”的完整闭环。延伸阅读token.burn Action 文档core 层 Action 的完整参数与返回类型Tempo Hooks 总览Token、AMM、DEX、Zone 等全部 Hook 索引React Hook 源码useBurn系列及全部 Token Hook 实现Core Action 源码burn/burnSync底层实现Tempo 写操作公共参数feeToken、feePayer、nonceKey等通用覆盖参数Tempo 链入门Tempo 网络与钱包配置起步【免费下载链接】wagmiReactive primitives for Ethereum apps项目地址: https://gitcode.com/GitHub_Trending/wa/wagmi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考