**瑙勮寖婧愭枃浠?*锛氱敱 MetaRepo spec/ 鍚屾锛岃鍕跨洿鎺ョ紪杈戞湰椤点€?

MetaDEX 链下架构 · TS → Rust 无痛升级

版本: v0.1-draft · 最后更新: 2026-06-04

1. 设计目标

前期:NestJS + TypeScript 轻量实现(RPC + 少量事件 + 内存/ SQLite 缓存)
盈利后:仅替换 Port 实现 为 Rust Sidecar,Controller / Service / 前端 / OpenAPI 不变

┌─────────────────────────────────────────────────────────┐ │ web / wallet / 第三方 │ └───────────────────────────┬─────────────────────────────┘ │ REST /api/v1/dex/* ┌───────────────────────────▼─────────────────────────────┐ │ DexController (不变) │ └───────────────────────────┬─────────────────────────────┘ │ ┌───────────────────────────▼─────────────────────────────┐ │ DexService (业务编排,不变) │ │ - 参数校验、权限、组合多个 Port │ └─────┬─────────────┬─────────────┬───────────────────────┘ │ │ │ ▼ ▼ ▼ IDexChainReader IDexQuoteEngine IDexPoolSync IDexAnalytics │ │ │ │ │ ┌────────┴────────┐ │ │ │ │ DEX_ENGINE env │ │ │ │ └────────┬────────┘ │ │ ▼ ▼ ▼ ▼ TsAdapter TsAdapter TsAdapter DataLuminaryAdapter │ │ │ (外项目) └─────────────┴─────────────┴─── 未来 ──▶ RustSidecarAdapter (HTTP/gRPC 同接口)

2. Port 定义(稳定契约)

以下接口为 长期稳定边界;Rust 重写时必须保持语义等价。

2.1 IDexChainReader

链上只读:RPC 调用,无全链扫描。

// 概念签名 — 实现见 repos/api/src/modules/dex/ports/
getPoolReserves(poolAddress: string): Promise<{ reserve0: bigint; reserve1: bigint; blockNumber: number }>;
getTokenDecimals(token: string): Promise<number>;
callRouterQuote(params: QuoteParams): Promise<QuoteResult>;

2.2 IDexQuoteEngine

Swap 报价(可组合 Reader + 本地 math fallback)。

getQuote(params: QuoteParams): Promise<QuoteResult>;
// QuoteParams: tokenIn, tokenOut, amountIn, slippageBps?

2.3 IDexPoolSync

轻量同步 — v0.15 仅:

  • 配置内 白名单 Pool 列表
  • eth_getLogs 订阅最近 N 块 Swap/Mint/Burn(或定时 poll)
  • SQLite 缓存 Pool 状态

非目标:上万 Pool、重组深度回滚(Rust 阶段可选)。

syncPools(poolAddresses: string[]): Promise<SyncReport>;
listPools(): Promise<DexPoolSummary[]>;

2.4 IDexAnalytics

默认外接 DataLuminary

getOverview(): Promise<AnalyticsOverview | { redirectUrl: string }>;
// TVL 历史、手续费、套利信号 — 不在 VibeAgent 实现

3. 依赖注入(NestJS)

// dex.module.ts 伪代码
{
  provide: DEX_CHAIN_READER,
  useFactory: (config) =>
    config.get('DEX_ENGINE') === 'rust'
      ? new RustSidecarChainReader(config)
      : new TsChainReader(config),
}
环境变量 默认 说明
DEX_ENGINE typescript rust 时走 Sidecar
DEX_RUST_SIDECAR_URL http://127.0.0.1:13009
METADEX_CHAIN_ID 84532 Base Sepolia
METADEX_POOL_ALLOWLIST CSV 地址 轻量索引范围
DATALUMINARY_API_URL 分析外接

4. Rust Sidecar 契约(未来)

盈利后新增仓库 repos/dex-engine(Rust),不修改 NestJS 业务代码:

端点 方法 对应 Port
/v1/quote POST IDexQuoteEngine
/v1/pools/sync POST IDexPoolSync
/v1/pools GET IDexPoolSync.listPools
/health GET 探活

NestJS RustSidecarAdapter 仅为 HTTP 客户端;OpenAPI 与 TS Adapter 返回同 shape。

5. 与现有 Indexer 关系

模块 职责
indexer/(现有) AgentNFT / Skill / Escrow 事件
dex/(新增) 独立 MetaDEX Port 层,不混入 Escrow Indexer

避免 v0.15 把 DEX 逻辑塞进 indexer.service.ts

6. 前端(web)

  • 新增 /dex 路由:Swap、Pool、Vote(wagmi 调 Router/Voter 合约)
  • 数据 只调 /api/v1/dex/*,不直连 Rust
  • 高级图表 iframe / 链接 DataLuminary Dashboard

7. 文件布局(api)

src/modules/dex/ ├── dex.module.ts ├── dex.controller.ts ├── dex.service.ts ├── ports/ │ ├── dex.tokens.ts # DI tokens │ ├── dex-chain-reader.port.ts │ ├── dex-quote.port.ts │ ├── dex-pool-sync.port.ts │ └── dex-analytics.port.ts └── adapters/ ├── typescript/ │ ├── ts-chain-reader.adapter.ts │ ├── ts-quote-engine.adapter.ts │ └── ts-pool-sync.adapter.ts ├── rust/ │ └── rust-sidecar.adapter.ts # stub / HTTP └── external/ └── dataluminary-analytics.adapter.ts

产品范围见 METADEX.md