wagmi Tempo `dex.useWatchOrderPlaced` Hook 实战:监听 Stablecoin DEX 挂单事件

发布时间:2026/9/18 13:17:09

wagmi Tempo `dex.useWatchOrderPlaced` Hook 实战:监听 Stablecoin DEX 挂单事件 wagmi Tempodex.useWatchOrderPlacedHook 实战监听 Stablecoin DEX 挂单事件【免费下载链接】wagmiReactive primitives for Ethereum apps项目地址: https://gitcode.com/GitHub_Trending/wa/wagmidex.useWatchOrderPlaced是 wagmi Tempo 模块为 React 应用提供的声明式 Hook用于在 Stablecoin DEX 上实时监听订单已挂出Order Placed事件。本文以该 Hook 的官方文档为核心结合 packages/react/src/tempo/hooks/dex.ts、packages/core/src/tempo/actions/dex.ts 及对应测试源码完整讲解它的用法、参数、事件回调结构与底层实现原理帮助你在组件中像订阅普通状态一样订阅链上挂单事件。为什么需要dex.useWatchOrderPlaced在去中心化交易所DEX中挂单place order是最核心的用户行为之一。构建订单簿类 UI如实时行情、成交提示、订单流看板时前端需要第一时间感知新订单已挂出这一链上事件。wagmi Tempo 将这一能力封装成两层 API命令式 Actiondex.watchOrderPlaced直接调用并手动管理退订声明式 Hookdex.useWatchOrderPlaced在 React 组件中自动订阅、自动清理与WagmiProvider的配置体系天然打通。Hook 的核心价值在于以 React 的方式做链上事件订阅你只需要声明我要监听什么订阅生命周期挂载时开始、卸载时结束由 Hook 内部通过useEffect管理无需手写退订逻辑。基本用法最小示例在组件中调用Hooks.dex.useWatchOrderPlaced并传入onOrderPlaced回调即可开始监听import { Hooks } from wagmi/tempo function App() { Hooks.dex.useWatchOrderPlaced({ onOrderPlaced: (args, log) { console.log(args:, args) }, }) return divWatching for order placements.../div }该用法与官方文档示例一致见 site/tempo/hooks/dex.useWatchOrderPlaced.md。onOrderPlaced回调会收到两个参数args解析后的事件参数对象与log原始事件日志。组件级监听的正确姿势Hook 通常应在组件内部使用而非模块顶层因为它的订阅生命周期绑定组件挂载/卸载import { Hooks } from wagmi/tempo export function OrderFeed() { const [orders, setOrders] useStateArgs[]([]) Hooks.dex.useWatchOrderPlaced({ onOrderPlaced(args) { setOrders((prev) [...prev, args]) }, }) return ul{orders.map((o, i) li key{i}{String(o.amount)}/li)}/ul }注意在onOrderPlaced中直接调用setState更新状态即可驱动 UI 刷新这正是声明式 Hook 相比命令式 Action 的便捷之处。需要的配置环境Tempo 相关 Hook 依赖一个配置了tempo链与tempoWallet连接器的 wagmiConfig并通过WagmiProvider注入。官方文档代码组中引用的配置文件如下site/snippets/react/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(), }, })然后在应用根部用WagmiProvider提供该配置Hook 即可从最近的 Provider 中自动获取config。参数详解dex.useWatchOrderPlaced的参数类型定义如下packages/react/src/tempo/hooks/dex.tstype Parametersconfig ExactPartialActions.dex.watchOrderPlaced.Parametersconfig ConfigParameterconfig { enabled?: boolean | undefined }即底层 Action 的全部参数全部可选 可选的config Hook 特有的enabled开关。config类型Config | undefined作用指定要使用的 wagmiConfig即 createConfig 创建的配置替代从最近的WagmiProvider中获取。一般情况下无需传该参数只有在需要绕开 Provider 上下文、显式指定配置时才使用。enabledHook 独有类型boolean默认true这是 Hook 层特有的开关。当enabled为false时Hook 不会发起订阅。从实现看packages/react/src/tempo/hooks/dex.tsconst { enabled true, onOrderPlaced, ...rest } parameters ... useEffect(() { if (!enabled) return if (!onOrderPlaced) return return Actions.dex.watchOrderPlaced(config, { ...rest, chainId, onOrderPlaced, }) }, [...])enabled用于条件订阅场景例如仅在用户已连接钱包或某个交易对处于激活状态时才开启监听。onOrderPlaced必传回调类型(args: Args, log: Log) void挂单事件触发时被调用的回调。官方文档site/tempo/actions/dex.watchOrderPlaced.md给出了完整的Args结构type Args { /** ID of the placed order */ orderId: bigint /** Address that placed the order */ maker: Address /** Address of the base token */ token: Address /** Amount of tokens in the order */ amount: bigint /** Whether this is a buy order */ isBid: boolean /** Price tick for the order */ tick: number }各字段含义字段类型说明orderIdbigint被挂出的订单 IDmakerAddress挂单者的地址tokenAddress基础代币地址amountbigint订单中的代币数量isBidboolean是否为买单true 为买false 为卖ticknumber订单的价格 tick注意amount与orderId为bigint类型直接进行字符串拼接会得到十进制大整数表示建议使用BigInt相关的格式化工具如formatUnits处理展示。过滤参数args、maker、tokenHook 支持按订单 ID、maker 地址、token 地址过滤事件避免无关事件触发回调args可选object订阅过滤器对象包含三个可选字段orderId?: bigint | bigint[] | null—— 按订单 ID 过滤maker?: Address | Address[] | null—— 按挂单地址过滤token?: Address | Address[] | null—— 按代币地址过滤maker可选Address单独传入时等价于按 maker 地址过滤事件token可选Address单独传入时等价于按 token 地址过滤事件。args过滤器与单独的maker/token参数在类型上均映射到底层 Action 的过滤配置见 packages/core/src/tempo/actions/dex.ts 中watchOrderPlaced.Parameters对 viem 参数的透传可传入数组实现多值匹配。fromBlock可选类型bigint作用指定开始监听的区块高度用于从历史区块起回放事件例如页面刷新后补全错过的挂单记录。轮询相关poll与pollingIntervalpoll可选类型固定为true开启轮询模式默认采用订阅模式即通过链的过滤器推送事件pollingInterval可选类型为number轮询频率毫秒未指定时默认使用 Client 的pollingInterval配置。在无法使用 WebSocket 订阅推送的环境如某些 HTTP RPC 场景下可通过poll: true降级为定时拉取。onError可选类型(error: Error) void作用当获取新区块/新事件出错时调用例如网络抖动或 RPC 不可用可用于错误上报或 UI 提示。chainId可选虽然官方文档参数列表未单独列出但从实现packages/react/src/tempo/hooks/dex.ts可以看到 Hook 内部通过useConfig与useChainId解析链 IDconst config useConfig({ config: parameters.config }) const configChainId useChainId({ config }) const chainId parameters.chainId ?? configChainId即未显式传入chainId时默认使用当前 Provider 所激活的链。底层原理Hook 如何桥接 Actiondex.useWatchOrderPlaced的实现非常精简——它本质上是命令式 Action 的 React 封装。调用链为useWatchOrderPlaced (React Hook) └─ Actions.dex.watchOrderPlaced(config, parameters) // wagmi/core Action └─ config.getClient({ chainId }) // 获取链客户端 └─ viem Actions.dex.watchOrderPlaced(client, rest) // 底层链交互对应源码packages/react/src/tempo/hooks/dex.ts 与 packages/core/src/tempo/actions/dex.ts// React 层useEffect 内调用 Action 并返回退订函数 useEffect(() { if (!enabled) return if (!onOrderPlaced) return return Actions.dex.watchOrderPlaced(config, { ...rest, chainId, onOrderPlaced, }) }, [config, enabled, chainId, onOrderPlaced, rest.fromBlock, ...]) // Core 层解析出 chainId 对应的 client 后转发给 viem export function watchOrderPlacedconfig extends Config( config: config, parameters: watchOrderPlaced.Parametersconfig, ) { const { chainId, ...rest } parameters const client config.getClient({ chainId }) return Actions.dex.watchOrderPlaced(client, rest) }几个值得注意的实现细节退订即清理Actions.dex.watchOrderPlaced返回一个() void的退订函数官方文档 Return Type 亦标注为() voidHook 将其作为useEffect的清理函数返回因此组件卸载时订阅会被自动取消不会造成内存泄漏。依赖数组精确控制重订阅useEffect的依赖数组显式列出了rest.fromBlock、rest.maker、rest.onError、rest.poll、rest.pollingInterval、rest.token等参数。当这些参数变化时旧订阅会被取消并重新建立onOrderPlaced也在依赖中确保回调引用更新后立即生效。enabled前置短路enabled false或未传onOrderPlaced时直接不建立订阅避免无效的链上连接。测试验证过滤与事件数据完整性仓库中的测试packages/react/src/tempo/hooks/dex.test.ts从两个维度验证了该 Hook 的行为默认监听default先渲染 Hook再通过Actions.dex.placeSync依次挂出买单与卖单随后用vi.waitUntil(() events.length 2)等待两个事件到达并断言expect(events[0]?.isBid).toBe(true) expect(events[0]?.amount).toBe(parseUnits(100, 6)) expect(events[1]?.isBid).toBe(false) expect(events[1]?.amount).toBe(parseUnits(100, 6))即买单事件isBid为true、卖单事件isBid为false且amount精确等于挂单时解析后的数量验证了事件数据的完整性与方向标记的正确性。按 token 过滤filter by token为 Hook 传入token: base过滤器同时在base与另一个交易对base2上分别挂单只有匹配base的事件被回调捕获验证过滤参数确实生效。与 Action 的关系何时用 Hook、何时用 Action官方文档在 Hook 文档末尾列出了两个关联 Actiondex.place挂单 Action与watchOrderPlaced形成写-读配对——dex.place产生挂单事件useWatchOrderPlaced消费该事件dex.watchOrderPlaced命令式事件监听 ActionuseWatchOrderPlaced的底层实现。选择建议在 React 组件内需要监听挂单事件、且希望自动管理订阅生命周期首选Hooks.dex.useWatchOrderPlaced在组件外如事件总线、服务端逻辑、非 React 上下文需要监听或需要手动控制退订时机使用Actions.dex.watchOrderPlaced(config, { onOrderPlaced })并保存其返回的退订函数。命令式版本的典型用法见 site/tempo/actions/dex.watchOrderPlaced.mdimport { Actions } from wagmi/tempo import { config } from ./config const unwatch Actions.dex.watchOrderPlaced(config, { onOrderPlaced(args, log) { console.log(args:, args) }, }) // Later, stop watching unwatch()实战示例带过滤的订单流看板综合以上知识点一个监听指定交易对买单/卖单的完整组件如下import { useMemo, useState } from react import { Hooks } from wagmi/tempo import { formatUnits } from viem type OrderEvent { orderId: bigint maker: 0x${string} token: 0x${string} amount: bigint isBid: boolean tick: number } export function OrderBookFeed({ token }: { token: 0x${string} }) { const [orders, setOrders] useStateOrderEvent[]([]) const [error, setError] useStateError | null(null) Hooks.dex.useWatchOrderPlaced({ token, // 只监听该交易对的挂单 enabled: Boolean(token), fromBlock: undefined, // 默认从当前区块开始 onOrderPlaced(args) { setOrders((prev) [args, ...prev].slice(0, 50)) }, onError(err) { setError(err) }, }) const bids useMemo(() orders.filter((o) o.isBid), [orders]) const asks useMemo(() orders.filter((o) !o.isBid), [orders]) return ( div {error p style{{ color: red }}{error.message}/p} h3买单{bids.length}/h3 ul{bids.map((o) li key{String(o.orderId)}{formatUnits(o.amount, 6)} tick {o.tick}/li)}/ul h3卖单{asks.length}/h3 ul{asks.map((o) li key{String(o.orderId)}{formatUnits(o.amount, 6)} tick {o.tick}/li)}/ul /div ) }要点回顾用token过滤避免无关交易对事件干扰用enabled控制未传入 token 时不建立订阅在onOrderPlaced中更新 React state驱动 UI 实时刷新通过isBid区分买卖方向用formatUnits处理bigint数量展示。小结dex.useWatchOrderPlaced是 wagmi Tempo 中事件驱动 UI的代表性 Hook它以最小的心智负担一个回调 可选过滤器将 Stablecoin DEX 的挂单事件接入 React 组件底层通过useEffect桥接到wagmi/core的dex.watchOrderPlacedAction再透传到 viem 完成真实的链上事件订阅并在组件卸载时自动退订。配合dex.place挂单、token/maker过滤器与fromBlock历史回放你可以快速构建订单流看板、成交提示、实时行情等去中心化交易应用的核心功能。进一步阅读Tempo Hooks 总览、dex.placeAction、dex.watchOrderPlacedAction。【免费下载链接】wagmiReactive primitives for Ethereum apps项目地址: https://gitcode.com/GitHub_Trending/wa/wagmi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/18 13:17:09

Claude Code 配 TaoToken:把 ANTHROPIC_BASE_URL 指向兼容端点

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

2026/9/18 13:12:09

企业级AI算力规划实战:从Token估算到GPU选型与集群管理

企业级AI应用最近两年的变化,比前面十年加起来都多。“算力”这两个字,从技术圈的性能参数讨论,变成了企业管理者和财务都要盯着的经营指标;以“数谷”为代表的智能算力集聚区,也实实在在迎来了一轮高增长。我自己长期…

2026/9/18 13:12:08

【Stable Diffusion】修复去除图像中画面

图像修复和重绘技术一直以来是图像处理领域中的重要一环,而 Inpainting 作为一种创新的图像重绘方法,借助稳定扩散(Stable Diffusion)技术实现了精准的局部图像修改。Inpainting 的核心流程包括选择图像、在需要修改的部分绘制遮罩,并输入文字提示,这样一来模型便能识别需…

2026/9/18 14:32:20

实时翻译场景用 Gemini 3.8 Live,TaoToken 帮看 Token 消耗

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

2026/9/18 14:32:20

离线环境装MySQL 5.6并导入天龙八部游戏库完整指南

简介:面向天龙八部私服架设者和Linux运维入门者的MySQL部署指南,以PDF文档完整呈现mysql-5.0.45在Linux服务器上的安装流程,重点解决游戏数据库环境从无到有的搭建问题。内容按安装准备、解压编译、基础配置、开机自启四个阶段推进&#xff0…

2026/9/18 14:32:20

每日资产变化归档,DeepSeek-V4.1-Flash 点评调用 TaoToken

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

2026/9/18 14:32:20

【ComfyUI】Ollama 图像反推描述词

今天给大家演示一个基于 ComfyUI 的图像反推描述词工作流。加载任意图像后,工作流会利用 LlamaVision 模型生成高质量视觉描述,再由翻译节点将英文内容转换成中文。最后通过文本展示节点输出可直接用于提示词创作的自然语言描述。整个流程轻量、直观,也适合作为图像理解类任…

2026/9/18 14:27:20

AI视觉防拍屏技术评测与选型指南

1. 项目背景与行业痛点屏幕信息泄露已成为企业数据安全的头号威胁之一。根据Verizon《2023年数据泄露调查报告》,约23%的内部数据泄露事件源于屏幕被拍照或录像。传统防截屏方案主要依赖系统API拦截,但面对智能手机拍照这种"物理层攻击"完全失…

2026/9/18 14:13:01

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/18 0:01:09

Google Colab 实战:运行模型、数据加载与报错排查

1. 为什么我劝你先搞懂 Colab 的运行模型1.1 Colab 到底是什么,跟本地跑代码差在哪Google Colab 简单说就是一台跑在浏览器里的 Linux 虚拟机,你打开一个 Notebook,背后就连上了一台带 GPU 的远程机器。你在单元格里敲的每一行 Python&#x…

2026/9/18 0:01:09

C语言数据类型与表达式详解

1. C语言数据与数据类型概述在C语言编程中,数据是程序处理的核心对象。理解数据的分类和特性是掌握C语言的基础。C语言中的数据主要分为四大类:常量、变量、表达式和函数。这些数据类型构成了C语言程序的基本元素,每种类型都有其独特的特性和…

2026/9/18 0:01:09

SQL时间字段指定时间段查询:区间语义、索引与时区避坑

上周排查一个线上问题&#xff0c;用户反馈"昨天的订单一条都没查到"&#xff0c;但数据库里明明躺着两千多条。最后定位下来&#xff0c;不是数据丢了&#xff0c;也不是接口挂了&#xff0c;而是那个查询条件把时间段写成了> 2024-05-20 00:00:00 AND < 2024…

2026/9/18 14:13:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行&#xff0c;Type-C接口算是典型的“看着简单&#xff0c;做起来全坑”的东西。光引脚就24个&#xff0c;高低速信号、电源、控制线全部塞在一个小小的连接器里&#xff0c;如果PCB布局不做规划&#xff0c;打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/18 14:13:02

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/18 14:13:02

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

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

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

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