news 2026/9/18 2:32:49

Tempo 与 Wagmi 集成实战:在 React/Core 中接入 Tempo L1 支付链

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Tempo 与 Wagmi 集成实战:在 React/Core 中接入 Tempo L1 支付链

Tempo 与 Wagmi 集成实战:在 React/Core 中接入 Tempo L1 支付链

【免费下载链接】wagmiReactive primitives for Ethereum apps项目地址: https://gitcode.com/GitHub_Trending/wa/wagmi

Tempo 是一条为支付场景量身定制的 Layer 1 区块链,将代币管理(TIP20)、Fee AMM、稳定币 DEX 与全新的 Tempo 交易类型直接内置到协议层。本文以仓库文档 site/tempo/getting-started.md 为主线,讲解如何通过 Wagmi(React 与 Core 两套 API)完成 Tempo 的安装、链配置、钱包连接,并使用批量交易、费用赞助、并发交易等 Tempo 专属能力;读完本文,你将掌握从零接入 Tempo 并读写 TIP20 代币的完整方案。

Overview:Tempo 是什么

Tempo 是一条专注于支付场景的 Layer 1 区块链(官方介绍),其核心特性并非通过智能合约堆叠实现,而是直接“内置于协议”(enshrined):

  • 代币管理:Tempo 原生支持 TIP20 代币标准,代币的创建、铸造、转账、角色权限等均在协议层完成;
  • Fee AMM:费用代币的定价与交换由协议内置的 AMM 机制驱动,而非第三方合约;
  • 稳定币 DEX:协议内置的去中心化交易所,用于稳定币的发行与兑换;
  • Tempo 交易类型:一种特殊的交易格式,支持批量调用(batch calls)费用赞助(fee sponsorship)可配置费用代币(configurable fee tokens)并发交易(concurrent transactions)访问密钥(access keys)定时执行(scheduled execution)

在 Wagmi 生态中,React 与 Core 对 Tempo 均提供了一等公民(first-class)支持:通过 Tempo Hooks 与 Tempo Actions 两组入口,开发者可以像使用普通 Wagmi API 一样调用 Tempo 协议能力。仓库源码中,Tempo 相关实现集中于 packages/core/src/tempo/(Core Actions 与连接器)和 packages/react/src/tempo/(React Hooks)。

Setup:环境要求与安装

接入 Tempo 之前,请先按 React 快速上手 或 Core 快速上手 完成 Wagmi 基础初始化,并确保项目中 Viem 版本满足要求。

版本要求

根据 packages/connectors/package.json 中的peerDependencies声明(第 37–47 行),需要额外安装两个依赖:

依赖版本要求作用
viem>=2.55.2Tempo 链底层 RPC 客户端,Tempo Actions 均是对 Viem Tempo Actions 的封装
accounts~0.14Tempo 钱包账户 SDK,驱动tempoWalletwebAuthndangerous_secp256k1三个连接器

安装命令

在项目根目录执行以下任一命令:

pnpm add viem@>=2.55.2 accounts@~0.14
npm install viem@>=2.55.2 accounts@~0.14
yarn add viem@>=2.55.2 accounts@~0.14
bun add viem@>=2.55.2 accounts@~0.14

安装完成后,可通过 Viem 的 Tempo 文档深入了解协议层实现细节。

配置 Config:接入 Tempo 链与钱包

无论使用 React 还是 Core,都需要先通过createConfig构建 Wagmi 配置。核心配置包含三个要点:

  1. :从wagmi/chains导入tempo链;
  2. 连接器:使用tempoWallet()作为钱包连接器;
  3. 关闭多注入发现:由于tempoWallet属于 injected 类型连接器,需要通过multiInjectedProviderDiscovery: false禁用 EIP-6963 多注入提供者发现,避免与浏览器中其他钱包扩展冲突。
import { 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(), }, })

若使用 Core(无 React 环境),请将导入路径替换为@wagmi/core@wagmi/core/chains@wagmi/core/tempo

import { createConfig, http } from '@wagmi/core' import { tempo } from '@wagmi/core/chains' import { tempoWallet } from '@wagmi/core/tempo' export const config = createConfig({ connectors: [tempoWallet()], chains: [tempo], multiInjectedProviderDiscovery: false, transports: { [tempo.id]: http(), }, })

tempoWallet 连接器参数

查看 packages/core/src/tempo/Connectors.ts 第 62–91 行,tempoWallet()底层调用accountsSDK 的dialog适配器,可配置以下参数:

参数类型说明
dialog对象透传给accounts.dialog的对话框配置
host字符串钱包服务 host 地址
icon字符串连接器图标(data URL 或远程 URL),默认内置 Tempo 图标,用于 EIP-6963 公告
name字符串连接器显示名称,默认Tempo Wallet
rdns字符串EIP-6963 reverse-DNS 标识,默认xyz.tempo,同时作为连接器id
theme对象对话框主题

tempoWallet的连接器type'injected'id默认为xyz.tempo。在连接流程中(第 221–287 行),它会通过wallet_connectRPC 方法请求账户,并在重连(isReconnecting)时复用eth_accounts中已授权的账户。

使用 Wagmi Hooks:批量交易、费用赞助与并发交易

Tempo 的最大价值在于:普通 Wagmi Hooks 即可直接使用 Tempo 交易类型。以useSendTransactionSync为例,该 Hook 基于@tanstack/react-queryuseMutation封装(见 packages/react/src/hooks/useSendTransactionSync.ts),在常规sendTransaction基础上增加了 Tempo 专属属性:

  • calls:批量交易数组,一次签名提交多笔调用;
  • feePayer:费用赞助地址,交易 gas 由第三方代付;
  • nonceKey:并发交易标识,允许同一账户并发发起多笔互不阻塞的交易。

除此之外还有可配置费用代币、访问密钥、定时执行等属性。下面的组件一次性向三个地址批量发送调用,同时由赞助地址代付费用、并用nonceKey: 1337n标记并发交易:

import { useSendTransactionSync } from 'wagmi' export function TokenMetadata() { const sendTransactionSync = useSendTransactionSync() return ( <button onClick={() => sendTransactionSync.mutate({ calls: [ { data: '0xcafebabe00000000000000000000000000000001', to: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef' }, { data: '0xdeadbeef00000000000000000000000000000002', to: '0xfeedfacefeedfacefeedfacefeedfacefeedface' }, { data: '0xfeedface00000000000000000000000000000003', to: '0xfeedfacefeedfacefeedfacefeedfacefeedface' }, ], feePayer: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', nonceKey: 1337n, }) } > Send transaction </button> ) }

注意*Sync后缀的语义:同步变体(Sync)会等待交易被打包上链后才返回响应,并返回交易回执及解析出的事件数据。对应的非 Sync 变体(如sendTransaction)则只提交交易、返回交易哈希,不等待确认。这一约定在 packages/core/src/tempo/AGENTS.md 中有明确说明:所有写类 Action 均同时实现标准变体与*Sync变体。

useSendTransactionSync需要挂在WagmiProviderQueryClientProvider之下才能正常工作:

import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import { WagmiProvider } from 'wagmi' import { config } from './config' import { TokenMetadata } from './tokenMetadata' const queryClient = new QueryClient() function App() { return ( <WagmiProvider config={config}> <QueryClientProvider client={queryClient}> <TokenMetadata /> </QueryClientProvider> </WagmiProvider> ) }

使用 Tempo Hooks:读取 TIP20 代币元数据

除了用普通 Wagmi Hooks 操作 Tempo 交易,还可以通过wagmi/tempo入口使用Tempo 专属 Hooks。入口文件 packages/react/src/exports/tempo.ts 将 Hooks 统一挂载在Hooks命名空间下;而 packages/react/src/tempo/hooks/index.ts 则把 Hooks 按协议模块组织为 10 个命名空间:ammdexfaucetfeenoncepolicyrewardtokenwalletzone

下面的组件通过Hooks.token.useGetMetadata读取 TIP20 代币(以 AlphaUSD 为例)的元数据:

import { Hooks } from 'wagmi/tempo' const alphaUsd = '0x20c0000000000000000000000000000000000001' export function TokenMetadata() { const { data: metadata, ...metadataQuery } = Hooks.token.useGetMetadata({ token: alphaUsd }) if (metadataQuery.isError) return <div>Error fetching metadata: {metadataQuery.error.message}</div> if (metadataQuery.isLoading) return <div>Loading metadata...</div> return <div>{metadata.name} ({metadata.symbol})</div> }

从源码看,useGetMetadata的实现(packages/react/src/tempo/hooks/token.ts 第 967–980 行)本质是调用 Core 层Actions.token.getMetadataqueryOptions并交给useQuery托管,因此天然具备 TanStack Query 的缓存、重试、失效与select能力。其配套的app.tsxconfig.ts与上一节完全一致(WagmiProvider+QueryClientProvider+ Tempo 配置)。

使用 Tempo Actions:在 React 与 Core 中直接调用

如果不需要 Hooks 的响应式状态管理,也可以直接调用 Tempo Actions。Tempo Actions 暴露在两个入口:

  • Reactwagmi/tempo(即Actions命名空间);
  • Core@wagmi/core/tempo(与 React 入口共享同一份 Actions 实现)。

入口 packages/core/src/exports/tempo.ts 将 packages/core/src/tempo/actions/index.ts 中的 10 个命名空间整体导出为Actions,同时导出tempoWalletwebAuthndangerous_secp256k1三个连接器。

React 用法:

import { Actions } from 'wagmi/tempo' import { config } from './config' const alphaUsd = '0x20c0000000000000000000000000000000000001' const metadata = await Actions.token.getMetadata(config, { token: alphaUsd, }) console.log('Token:', metadata.name, `(${metadata.symbol})`)

React 的config.ts与前面一致(从wagmiwagmi/chainswagmi/tempo导入)。

Core 用法:

import { Actions } from '@wagmi/core/tempo' import { config } from './config' const alphaUsd = '0x20c0000000000000000000000000000000000001' const metadata = await Actions.token.getMetadata(config, { token: alphaUsd, }) console.log('Token:', metadata.name, `(${metadata.symbol})`)

Core 的config.ts@wagmi/core@wagmi/core/chains@wagmi/core/tempo导入。

Actions 的底层实现

查看 packages/core/src/tempo/actions/token.ts 第 923–930 行,getMetadata是典型的只读(query-based)Action:

export function getMetadata<config extends Config>( config: config, parameters: getMetadata.Parameters<config>, ): Promise<getMetadata.ReturnValue> { const { chainId, ...rest } = parameters const client = config.getClient({ chainId }) return Actions.token.getMetadata(client, rest) }

它从 Wagmiconfig中取出对应chainId的 Viem 客户端,再调用viem/tempo的同名 Action 完成 RPC 请求,本质是 Wagmi 对 Viem Tempo Actions 的一层薄封装。此外,只读 Action 的命名空间内还附带queryKeyqueryOptions两个工具函数(第 940–960 行),用于与 TanStack Query 集成:queryKey生成稳定的缓存键,queryOptions会在必需的响应式参数(如token)缺失时自动将enabled置为false,避免发起无效请求。

而对于写类(mutation-based)Action,则通过getConnectorClient获取已连接的钱包客户端发起交易。仓库测试 packages/core/src/tempo/actions/token.test.ts 对getMetadata的默认场景与queryOptions场景均有覆盖,可直接作为使用参考。

进阶:Tempo 链与默认费用代币

Tempo 生态提供多条链,均可从wagmi/chains导入(详见 site/tempo/chains.md):

import { tempo, tempoDevnet, tempoLocalnet, tempoTestnet, } from 'wagmi/chains'

设置默认费用代币

Tempo 支持为链设置默认费用代币(default fee token):通过在链对象上扩展feeToken属性,该链上所有交易将默认使用该代币支付费用,除非在单笔交易层面显式覆盖:

import { tempo } from 'wagmi/chains' const chain = tempo.extend({ feeToken: '0x20c0000000000000000000000000000000000001', })

这是一个非常实用的配置:对于只接受单一稳定币作为 gas 的应用,可以省去每笔交易重复指定费用代币的样板代码。

其他连接器与生态入口

tempoWallet外,packages/core/src/tempo/Connectors.ts 还提供两个基于accountsSDK 的额外连接器:

  • webAuthn()(第 115–132 行):WebAuthn EOA 连接器,通过authUrl(ceremony 模式)或ceremony配置生物识别登录,连接器type'webAuthn'
  • dangerous_secp256k1()(第 151–167 行):Secp256k1 EOA 连接器,以明文存储私钥并绑定会话存储生命周期,源码明确警告不推荐用于生产环境,仅适合本地开发调试。

完整的 Tempo 连接器文档位于 site/tempo/connectors/,更多协议模块的 Hooks 与 Actions 列表可查阅 site/tempo/hooks/ 与 site/tempo/actions/。

Next Steps:下一步可以做什么

完成 Tempo 与 Wagmi 的接入后,你可以进一步探索:

  • 指南与示例:阅读官方指南,学习如何使用账户、发起支付、发行稳定币、进行稳定币兑换等完整业务流程;
  • Tempo React Hooks:浏览全部 Hooks(amm.*dex.*fee.*token.*wallet.*zone.*等 10 大模块)并了解各 Hook 的参数与返回值;
  • Tempo Core Actions:在非 React 场景下直接使用@wagmi/core/tempo的 Actions,配合 TanStack Query 手动管理数据流。

建议的实践路径是:先通过本文的tempoWallet+Hooks.token.useGetMetadata打通第一条只读链路,再用useSendTransactionSynccalls/feePayer/nonceKey组合验证批量交易与费用赞助,最后按业务模块逐个引入dexfeepolicy等命名空间的能力。

【免费下载链接】wagmiReactive primitives for Ethereum apps项目地址: https://gitcode.com/GitHub_Trending/wa/wagmi

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 2:32:47

腾讯为什么开源蓝鲸PaaS?blueking-paas背后的企业级SaaS平台故事

腾讯为什么开源蓝鲸PaaS&#xff1f;blueking-paas背后的企业级SaaS平台故事 【免费下载链接】blueking-paas 蓝鲸智云 PaaS 平台是一个开放式的开发平台&#xff0c;让开发者可以方便快捷地创建、开发、部署和管理 SaaS 应用。它提供了完善的前后台开发框架、服务总线&#xf…

作者头像 李华
网站建设 2026/9/18 2:32:14

5分钟上手Pixelle-Video:AI短视频自动生成完整教程

5分钟上手Pixelle-Video&#xff1a;AI短视频自动生成完整教程 【免费下载链接】Pixelle-Video &#x1f680; AI 全自动短视频引擎 | AI Fully Automated Short Video Engine 项目地址: https://gitcode.com/GitHub_Trending/pi/Pixelle-Video 做短视频最劝退的环节不是…

作者头像 李华
网站建设 2026/9/18 2:28:48

OpenHarmony上Flutter渲染SVG图片的完整实践指南

去年年底我接到一个需求&#xff0c;要在 OpenHarmony 的板子上跑一套 Flutter 应用&#xff0c;里面图标、插画、启动背景全是 SVG 素材。试了一圈发现&#xff0c;网上讲 Flutter 渲染 SVG 的文章很多&#xff0c;但专门针对 OpenHarmony 这个宿主系统的少之又少&#xff0c;…

作者头像 李华
网站建设 2026/9/18 2:28:23

小样本图像分类实战:PIL实现亮度对比度翻转旋转数据增强

简介&#xff1a;对于深度学习初学者和面临小样本图像分类问题的开发者&#xff0c;这份PDF资料提供了一套可直接落地的数据集扩充方案。资源围绕图像亮度增强、对比度增强、水平翻转与随机方向旋转四种经典变换&#xff0c;结合PIL库给出完整Python实现&#xff0c;演示如何将…

作者头像 李华
网站建设 2026/9/18 2:27:21

vm0取消与超时恢复:stuck tool如何被SIGKILL收割而不泄漏资源

vm0取消与超时恢复&#xff1a;stuck tool如何被SIGKILL收割而不泄漏资源 【免费下载链接】okou Okou connects to the tools your team already uses and does the work — across marketing, sales, engineering, and operations, under your control. 项目地址: https://g…

作者头像 李华
网站建设 2026/9/18 2:26:25

Electron包体膨胀真相:从224MB到4.7MB的跨平台重构逻辑

1. 为什么 Electron 包体膨胀成了行业默认“税”&#xff1f;——从 224MB 到 4.7MB 的真实压缩逻辑你有没有打开过一个刚下载的桌面应用&#xff0c;点开安装包属性一看&#xff1a;224MB&#xff1f;再点开解压后的文件夹&#xff0c;发现光node_modules就占了 186MB&#xf…

作者头像 李华