Files
lp-terminal/lp-terminal使用文档.md

633 lines
31 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# LP TERMINAL 使用文档
> LP TERMINAL v0.2 · Robinhood Chain (链 ID 4663) 上的 LP(流动性提供者)终端
> 面向 UP33ve(3,3) DEX)与官方 Uniswap v2 / v3 部署,提供池子浏览、仓位管理、兑换与限价挂单功能。
---
## 目录
1. [基本常识:这是什么 / 给谁用](#1-基本常识这是什么--给谁用)
2. [启动与运行环境](#2-启动与运行环境)
3. [界面总览:顶栏 / 底栏 / 快捷键](#3-界面总览顶栏--底栏--快捷键)
4. [连接钱包](#4-连接钱包)
5. [POOLS 池子页](#5-pools-池子页)
- 5.1 筛选与搜索
- 5.2 表格列含义
- 5.3 添加流动性(双币 / ZAP 单币)
- 5.4 区间选择器(CL 池)
6. [POSITIONS 仓位页](#6-positions-仓位页)
- 6.1 汇总条
- 6.2 CL 仓位卡片
- 6.3 V2 仓位卡片
- 6.4 区间订单
7. [SWAP 兑换页](#7-swap-兑换页)
- 7.1 市价模式
- 7.2 限价模式(挂 LP 卖出)
8. [实盘操作全流程](#8-实盘操作全流程)
9. [安全机制](#9-安全机制)
10. [常见问题](#10-常见问题)
---
## 1. 基本常识:这是什么 / 给谁用
### 1.1 一句话定义
LP TERMINAL 是一个 **终端风格** 的网页前端,让你在 Robinhood Chain 上做三件事:
- **浏览池子**:全协议(UP33 + Uniswap v2/v3)的池子目录,按 TVL/量/费率排序,找到一个值得投入的池子。
- **管理仓位**:集中查看你所有的 LP 仓位(CL + v2、UP33 + Uniswap),一站式做质押 / 解押 / 领取 / 加减仓。
- **兑换与挂单**:市价兑换(比价 Kyber 与原生路由取最优),或用单边 LP「区间订单」挂单卖出代币(做挂单方,不付手续费还赚手续费)。
### 1.2 涉及的协议
| 协议 | 说明 | 在本终端的体现 |
|---|---|---|
| **UP33** | Robinhood Chain 上的 ve(3,3) DEX(类 Velodrome/Solidly 架构)。有 v2 恒定乘积池和 CL(集中流动性)池,带 **gauge 质押****UP 代币排放**。 | 池子标记 `CL` / `v2`,带 `gauge` 字样的有排放奖励。质押 LP 赚 UP,不质押赚手续费,**二选一**。 |
| **Uniswap v3** | 官方 Uniswap v3 部署。集中流动性(CL),无 gauge、无质押,LP 100% 拿手续费。 | 池子标记 `v3 tsX`ts = tick spacing)。仓位以 NFT 形式存在官方 NPM。 |
| **Uniswap v2** | 官方 Uniswap v2 部署。恒定乘积 0.30% 池,LP 代币是普通 ERC-20。 | 池子标记 `v2 · 0.30%`。手续费自动滚入储备复利。 |
### 1.3 关键代币
| 代币 | 合约地址 | 作用 |
|---|---|---|
| **WETH** | `0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73` | 链上 ETH 的封装版本,绝大多数池子的报价基准 |
| **USDG** | `0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168` | 稳定币锚(≈ $1),价格传播的启动锚点 |
| **UP** | `0x57C0E45cB534413D1C20A4240955d6bB250BB4F1` | UP33 的排放代币;质押 LP 赚取 |
| **ETH**(原生) | — | gas 代币;与 WETH 1:1 可互转 |
### 1.4 ve(3,3) 收益模型(UP33 独有,必读)
UP33 池的 LP 收益是 **二选一** 的:
- **不质押** → 赚 **交易手续费**(费率 APR)。CL 池还要扣 10% 未质押抽成给投票者。
- **质押进 gauge** → 赚 **UP 代币排放**(排放 APR)。但质押期间你的手续费份额归该池的投票者,自己拿不到手续费。
> 一个仓位只能赚其一,不能兼得。APR 都是单利、不复利,且随 TVL / 质押量增长而稀释。
### 1.5 重要约定
- 所有写入操作 **只认 chainId 4663**;连错网络会有红色横幅提示。
- 签名只在浏览器钱包完成(RainbowKit / 注入钱包),**应用本身不存任何私钥**。
- 所有授权都是 **精确金额授权**exact-amount approval),无无限授权。
- 链上状态每 ~15 秒刷新一次;你持有的区间订单所在池子有 **4 秒** 的专项 slot0 推送。
---
## 2. 启动与运行环境
### 2.1 依赖
- Node.js **≥ 22.13**indexer 用了内置的 `node:sqlite`
- npm
### 2.2 首次启动(开发模式)
```bash
npm install
cp .env.example .env # 所有 key 都可选;默认走公共端点
npm run indexer # 池索引器,端口 :8787(首次回填约 18 分钟,后续启动很快)
npm run dev # 前端,http://localhost:5173(自动代理 /api -> :8787
```
> **首次 indexer 启动耗时**(实测):
> - V3 池回填(Blockscout 分页扫 ~14.2 万池):约 18 分钟
> - V2 池同步(allPairs 枚举 ~1.5 万):约 2 分钟
> - token 元数据拉取(symbol/decimals~15.5 万 token):约 13 分钟
> - 全量状态扫描(slot0/getReserves~15.7 万池):约 32 分钟
> - GT 统计 + 定价:约 1 分钟
> - **总计约 65 分钟** 首次 boot。之后重启因有 `v3_backfilled` 标记和已存 `pool_state`,会快很多。
### 2.3 网络代理(重要!)
如果你的环境需要代理才能访问 Blockscout / Alchemy(例如系统已开 `127.0.0.1:7890` 代理但 Node 默认不读系统代理),启动 indexer 前必须设:
```powershell
$env:NODE_USE_ENV_PROXY='1'
$env:HTTPS_PROXY='http://127.0.0.1:7890'
$env:HTTP_PROXY='http://127.0.0.1:7890'
npm run indexer
```
否则 indexer 会卡在 Blockscout 回填阶段(Node 的 fetch 连不上被墙域名)。
### 2.4 `.env` 配置项
| key | 说明 |
|---|---|
| `RPC` | 私有 Robinhood Chain RPC。**注意:Vite 会把它打进 JS bundle,公开部署务必留空**。留空 → 公共 RPC(`https://rpc.mainnet.chain.robinhood.com`)。 |
| `KYBERSWAP_AGGREGATOR_API_BASE_URL` | Kyber 聚合器基础 URL |
| `KYBERSWAP_CHAIN` | 链 slug`robinhood` |
| `KYBERSWAP_ROUTER_ADDRESS` | **白名单**:兑换 calldata 只发往这个地址 |
| `KYBERSWAP_FEE_BPS` | 可选平台费(bps),如 `10` = 0.1% |
| `KYBERSWAP_FEE_RECEIVER` | 平台费接收地址(必须与上一项同时设才生效) |
| `VITE_WALLETCONNECT_PROJECT_ID` | 可选;仅 WalletConnect 二维码配对需要,注入钱包不需要 |
### 2.5 生产部署
```bash
RPC="" npm run build # 公开部署 RPC 必须为空
```
产出静态 `dist/`hash 路由无需 rewrite,任意静态托管(CF Pages / Netlify / S3)均可。若想保留私有 RPC,在反向代理后端终止 `/rpc``/api``/kyber` 等同源路径。
---
## 3. 界面总览:顶栏 / 底栏 / 快捷键
### 3.1 顶栏
```
LP▮TERMINAL [1]池子 [2]仓位 [3]兑换 epoch 1 · 翻转 4d 5h · 块 13195940 [ 连接 ]
```
| 元素 | 含义 |
|---|---|
| `LP▮TERMINAL` | 品牌标题 |
| `[1]池子` `[2]仓位` `[3]兑换` | 三个主标签页,数字是快捷键 |
| `epoch N · 翻转 Xd Yh · 块 N` | UP33 epoch 编号、距下次 epoch 翻转(每周四)的倒计时、当前区块高度 |
| `[ 连接 ]` | 连接钱包按钮(连错链显示 `[ 链错误 ]` |
### 3.2 底栏
```
LP TERMINAL v0.2 · 精确授权 · 链上实时读取
快捷键: [1] 池子 [2] 仓位 [3] 兑换 [4] 限价
rpc:DEFAULT theme: MONO PHOSPHOR AMBER ICE VIOLET lang: EN 中文 blockscout↗
```
| 控件 | 作用 |
|---|---|
| `rpc:DEFAULT` | 点击可设置 **自己的 RPC**(仅存于本浏览器 localStorage,经 `eth_chainId` 探针校验必须返回 4663)。优先级高于部署默认。 |
| `theme:` | 5 个主题:MONO / PHOSPHOR / AMBER / ICE / VIOLET |
| `lang:` | 中英双语切换,持久化在 `up33.lang.v1`;也可用 URL `?lang=zh` 临时覆盖(截图用) |
| `blockscout↗` | 跳转区块浏览器 |
### 3.3 快捷键
| 键 | 动作 |
|---|---|
| `1` | 切到 **POOLS** 池子页 |
| `2` | 切到 **POSITIONS** 仓位页 |
| `3` | 切到 **SWAP** 兑换页(市价) |
| `4` | 切到 **LIMIT** 限价挂单页 |
| `/` | 聚焦池子搜索框 |
标签页是 **hash 路由**`#pools` / `#swap` / `#limit` / `#positions`),刷新和深链都能保持位置。`#lab` 是组件实验室(合成数据,仅供视觉调试)。
---
## 4. 连接钱包
1. 点击顶栏 `[ 连接 ]`
2. 选择钱包(RainbowKit 弹窗:MetaMask 等注入钱包,或 WalletConnect 二维码)。
3. 钱包会请求切换 / 添加 **Robinhood Chain (4663)**
- 链 ID`4663`
- RPC`https://rpc.mainnet.chain.robinhood.com`(公共,钱包端始终用公共 RPC
- 原生货币:ETH18 位小数)
4. 连错链时顶栏显示 `[ 链错误 ]`,页面顶部出现红色 `!! 网络错误 - 本终端只在 Robinhood Chain (4663) 上写入` 横幅,点「切换」回到正确链。
> 应用是纯静态 SPA,无后端账户系统。你的钱包地址只存在浏览器内存中,关闭即清。
---
## 5. POOLS 池子页
`#pools`,快捷键 `1`。这是默认首页,也是发现池子、添加流动性的入口。
### 5.1 筛选与搜索
页面顶部一行控件:
```
[搜索框] [全部] [UP33] [UNI V3] [UNI V2] [隐藏 <$1K]
显示 149 · up33 29 · uniswap 目录 158,275 · 匹配 2,629
```
| 控件 | 作用 |
|---|---|
| **搜索框** | 支持四种输入:代币地址(`0x…40`)、池地址、代币符号(如 `WETH`)、交易对符号 `sym0/sym1`(如 `WETH/UP`,两侧都要匹配,方向不限)。空 = 全部按 TVL 排序。快捷键 `/` 聚焦。 |
| `全部` / `UP33` / `UNI V3` / `UNI V2` | 协议过滤。`UP33` 只看 ve(3,3) 池(含排放奖励明细);`UNI V3` / `UNI V2` 看官方 Uniswap 池。 |
| `隐藏 <$1K` | 默认开启,隐藏 TVL 低于 $1K 的灰尘池(目录里 95% 是 meme 灰尘池)。 |
| `● 我的 (N)` | 仅在你连接钱包且持有仓位时出现:筛选你已参与的池子。 |
| 统计行 | `显示 N`(当前页显示数)· `up33 N`UP33 池数)· `uniswap 目录 N`(索引器全目录)· `匹配 N`(当前筛选命中数) |
### 5.2 表格列含义
| 列 | 含义 |
|---|---|
| **交易对** | 代币对符号 + 协议徽章。例如 `WETH/UP CL ts200 · 1.00% · gauge` 表示 UP33 的 CL 池,tick 间距 200,费率 1%,有 gauge(可质押)。`v3 ts200 · 1.00%` 是 Uniswap v3。`v2 · 0.30%` 是 Uniswap v2。鼠标悬停费率可见说明 tooltip。 |
| **价格 / 储备** | CL 池显示 `价格 报价币/基准币`(如 `11,579 UP/WETH`);v2 池显示两侧储备 `587.9 WETH + 1.1M USDG``⇄` 可翻转价格方向。 |
| **TVL** | 池子总锁仓量(USD)。链上推导:已定价侧之和;只有一侧有价时按 2× 该侧估算并标记 approximate。点击表头排序。 |
| **24H 量** | 24 小时成交量(USD)。Uniswap 池来自 GeckoTerminalUP33 池来自 DexScreener + Goldsky 子图。`-` 表示长尾池无数据。 |
| **24H 费** | 24 小时手续费(USD)= 量 × 费率(毛,不含 ve(3,3) 抽成)。 |
| **费率 APR** | **未质押** LP 的手续费年化收益 = `vol24h × feeRate × 365 / TVL`。CL 池再 ×(1 − 10% 未质押抽成)。注意这是池平均,集中区间内的仓位会成倍高。 |
| **排放奖励** | 仅 UP33 池有值:**质押** LP 的 UP 排放 APR = `rewardRate × 31.536M × UP价格 / 质押TVL``∞` = 排放流向几乎零质押量的池(首个质押者全拿)。 |
| **操作列** | `+ LP`(展开添加流动性面板)· `↗`(跳转 Blockscout 查看池合约) |
> **脚注**:表格下方有说明:费率 APR = 未质押 LP 手续费收益;排放奖励 = UP33 质押 UP 排放 APR;一个仓位只赚其一。
### 5.3 添加流动性(双币 / ZAP 单币)
点击任一池子的 `+ LP`,行内展开面板。
#### 区间选择器(CL 池独有,v2 无区间)
```
区间 ±0.5% ±1% ±2% ±5% ±10% ±20% ±30% 全区间 ± % … ↑上方 ↓下方 价格 TICKS
10,504 12,830
-9.28% -> 下界 px 11,579 UP/WETH ⇄ 上界 ← +10.8%
区间内 · 已穿过 48.7% · 带宽 ±10.5%
```
| 控件 | 作用 |
|---|---|
| `±0.5%``±30%` / `全区间` | 对称区间预设:以当前价为中心,±N%。`全区间` = 全价格区间。 |
| `± % …` | 自定义对称百分比。 |
| `↑ 上方` | 单边存入:只在当前价**上方**建区间,只存 token1,价格涨入区间后开始赚钱(涨了才卖)。 |
| `↓ 下方` | 单边存入:只在当前价**下方**建区间,只存 token0,价格跌入区间后开始赚钱(跌了才接)。 |
| `价格` | 直接输入价格上下界(对齐 tick spacing)。 |
| `TICKS` | 直接输入原始 tick 上下界(高级)。 |
| 区间条 | 可视化:两端 = 你的价格边界,标记 = 当前价,显示到上下界的偏离百分比、带宽。区间不含当前价时会提示「不产生任何收益」。 |
> 切换区间时,下方输入框的金额会按新比例**自动联动**。
#### 资金模式
面板有 `双币` / `⚡ ZAP - 单币` 切换:
**双币模式**CL):
```
资金 双币 | ⚡ ZAP - 单币
WETH [0.0]
UP [0.0]
[铸造仓位] NFT 进入钱包 - 去仓位页质押赚 UP
```
- 两个输入框,按当前价自动配比;改一个另一个联动。
- `铸造仓位` 按钮铸造一个 NFT 仓位进钱包(CL 用 NPMUP33 用 CL_PM)。
**双币模式**v2):
- 数量按储备自动配平,最小值容差保护。
- UP33 v2 → LP 代币进钱包,去仓位页质押;Uniswap v2 → LP 代币进钱包,手续费在储备中自动复利。
**ZAP 单币模式**
```
ZAP 输入 WETH | UP | ETH [0.0]
滑点 0.5% | 1% | 3%
[连接钱包] 任一步失败即停 - 资金都在你钱包里,不会悬空
```
- 只持有一边代币(或原生 ETH)即可注入流动性:ZAP 先用 Kyber 把一部分换成对手代币,再按池子需要的比例双币存入。
- 输入代币三选一:池子的 token0 / token1 / 原生 ETH(若某侧是 WETHETH 会先包装成 WETH)。
- 滑点挡位控制兑换腿最小到账;存入最小值按 1% 带边计算。
- 执行时列出完整交易序列(wrap? → 授权 → Kyber 兑换 → 授权双方 → mint/increase),**逐步执行,任一步失败即停**——所有中间资产都是普通钱包余额,不会悬空。
- 存入金额用 **实际到账**receipt Transfer 日志),而非报价,杜绝报价与执行不符。
### 5.4 索引器离线兜底
如果 indexer 进程没启动或还在首次回填(`ready:false`),POOLS 页顶部会出现琥珀色提示 `索引器离线 - dexscreener 兜底(v3 前 30`,此时改用客户端 DexScreener 发现 + 链上 `factory.getPool` 验证(仅 v3 前 30 个)。伪造池会被结构性地拦截。
---
## 6. POSITIONS 仓位页
`#positions`,快捷键 `2`。连接钱包后显示你所有的 LP 仓位。
未连接时显示空态:`> 连接钱包以枚举仓位。还没有仓位?去池子页看看 ->`
### 6.1 汇总条
页面顶部一条全局汇总:
| 字段 | 含义 |
|---|---|
| **LP 总值** | 你所有仓位(含未领手续费)的 USD 总值。子标题:`X CL · Y v2 · Z 已质押` |
| **未领手续费** | 所有仓位累计的未领取手续费(USD) |
| **待领 UP** | 所有质押仓位累计的待领取 UP 数量 + USD 估值 + 实时 `+UP/天` 累积速率 |
| **全部领取(N 笔)** | 一键领取所有可领 UP(N = 涉及的笔数)。无可领时显示「暂无可领取」。 |
| **区间状态** | `全部在区间内``N 个超出区间`,子标题提示「超出区间的 CL 没有任何收益」。区间订单不计入。 |
| **区间订单** | `N 个挂单` / `N 个已完全成交 - 提取以锁定` / `尚无成交 - 卖出代币升值时逐步成交` |
### 6.2 CL 仓位卡片(UP33 CL + Uniswap v3
每张卡片带协议徽章(UP 箭头 / Uniswap 独角兽,品牌色)。按「质押优先、价值降序」排列。
**信息区**
| 区块 | 内容 |
|---|---|
| **价值** | `value ≈ $…`,代币按池子自身价格对 USDG/WETH/UP 锚定价。无锚时显示 `- 无价格锚`。 |
| **收益中** | 质押:`≈ N UP/天 (≈$X/天) APR ≈ Y% 占质押流动性 Z%`;未质押且在区间:`费率 APR ≈ X 占活跃流动性 Y% 区间内有效`;超出区间:红色 `0 - 超出区间`;排放干涸:琥珀色 `0 - 本 epoch 无 UP 排放流入`。 |
| **持有** | 仓位持有的 token0 / token1 数量。 |
| **未领手续费** | 精确值(经 `collect` 模拟),USD 估值。UP33 未质押 CL 显示 `10% 未质押抽成已扣除)`。 |
| **待领 UP** | 质押仓位才有。 |
| **区间条** | 两端 = 你的价格边界,标记 = 当前价,显示到上下界偏离 %、超出时的回入距离、在/近/出着色。 |
**操作按钮**(视仓位状态显示):
| 按钮 | 作用 |
|---|---|
| `质押` | 把 NFT 质押进 gauge 赚 UP(质押期间手续费归投票者) |
| `解押` | 解押后才能调整流动性或领手续费;解押会**自动领取**待发 UP |
| `领取 UP` | 领取待发 UP 排放 |
| `领取手续费` | 领取未领交易手续费 |
| `+ 加仓` | 在同一区间追加流动性(区间铸造时固定,不可移动);面板显示钱包余额 + MAX,按实时池价联动两币,预览拉取量 / 新规模 |
| ` 减仓` | 减仓 + 领取(2 笔交易),最小值容差保护 |
| `全部撤出` | 移除 100% 流动性并领取全部,**双击确认** |
> 领取 UP(或 CL 解押自动领取)后,日志显示收到的 UP 数量,并附 **SWAP -> ETH** 按钮——一键跳到 SWAP 页预填该金额。
### 6.3 V2 仓位卡片(UP33 v2
UP33 v2 LP 是普通 ERC-20,分「钱包 LP」与「质押 LP」两部分:
| 区块 | 内容 |
|---|---|
| **合计 / 钱包 LP / 质押 LP** | 各自的 LP 代币数量与对应底层 token 数量 |
| **可领手续费** | 钱包 LP 可领的池手续费 |
| **待领 UP** | 质押 LP 的待领 UP |
操作:`全部质押` / `全部解押` / `领取 UP` / `领取手续费` / `移除 %`(按钱包 LP 计,质押的需先解押)。
> Uniswap v2 的仓位管理(LP 余额、移除流动性)尚未接入——POOLS 浏览 + 添加可用,仓位追踪靠钱包层面。
### 6.4 区间订单(通过 SWAP→LIMIT 挂出)
挂出的单边 CL 区间订单会带 `限价 sell->buy` 徽章,在仓位页有专门的订单模式展示:
- **区间条**:等待 / 成交中 X% / 已成交,以卖出代币计价(不是红色的超出区间告警)。
- **状态感知一键操作**
- 未成交 → `取消 - 拿回 <卖出币>`
- 部分成交 → `立即平仓(部分成交)`
- 已完全成交 → `提取 -> 锁定 <买入币>`
- 100% 提取后徽章清除。
> 区间订单所在池有 **4 秒** 的专项 slot0 推送,成交 % / 持有 / 区间条近实时跟踪;数值更新按方向闪绿 ▲ / 红 ▼。
---
## 7. SWAP 兑换页
`#swap`,快捷键 `3`。两种模式:市价 / 限价。
### 7.1 市价模式
```
模式 市价 | 限价 · 挂 LP 卖出
卖出 ETH ▾ [0.0] 余额 - MAX
买入 UP ▾ 0.0 余额 -
┌─ 报价 ─
(输入数量后显示两路报价)
```
| 控件 | 作用 |
|---|---|
| 卖出 / 买入代币选择 | 点 `▾` 弹出代币选择器:搜索框(符号或地址)+ 代币列表,**每行都显示合约地址缩写**(反 symbol 伪造)。 |
| `[0.0]` 输入 | 输入卖出数量;`MAX` 一键填入余额。 |
| `⇅` | 翻转买卖方向。 |
| 报价区 | 输入数量后并排显示两路报价:**KYBER 聚合**(多跳路由)vs **UP33 原生**v2 `getAmountsOut` + CL quoter 全匹配池直连),标出 bps 差与「最优」。 |
| `gas $X` | 估算 gas 成本。 |
| `最少到账: N SYM @ 滑点%` | 最小到账保护。 |
| 滑点 | 可调。 |
| `↻ 刷新` | 手动刷新报价。 |
| `通过 <路由> 执行 ->` | 选定路由执行。 |
**ETH / WETH 处理**
- 原生 ETH 买入 / 卖出自动 wrap / unwrap1:1,无费用,WETH9 = `0x0Bd7…AD73`)。
- UP33 原生路由需要 WETH——选 ETH→UP 时会提示「需要 WETH - 先包装」,点 `包装 N ETH` 即可。
- 原生路由到账的是 WETH(不是 ETH),会有提示。
### 7.2 限价模式(挂 LP 卖出)
`#limit`,快捷键 `4`。这是本终端的特色功能:**用单边 CL 区间订单卖出代币,做挂单方而非吃单方**。
核心理念:市价兑换是「吃单」付池子费;限价挂单是「挂单方」——不付手续费,成交过程中还**赚**手续费。
#### 面板结构
```
卖出 UP ▾ [0.0] 25% 50% 75% MAX 余额 -
换成 WETH ▾
市价: 1 UP = 0.000086361 WETH · 1 WETH = 11,579 UP · 池 CL ts200 1.00%
卖出区间 [?] 贴市·1TICK +1->3% +2->5% +5->10% +10->25% 自定义
── 订单 ──
开始成交 +1.8% 1 UP = 0.00008788 WETH
全部卖出 +3.8% 1 UP = 0.000089656 WETH
平均成交 +2.8% 1 UP ≈ 0.000088764 WETH · √(起点·终点)
区间 [93200 -> 93400] tick 网格 ts200 · 约 2.0% 步长 · 最窄合法区间
[区间条] 订单等待中 · 价格需上涨 1.76% 开始成交
── 费用 · 挂单 VS 吃单 ──
本订单 0% 挂单方 - 不付交易费,成交时还赚手续费
市价兑换 1.00% 吃单方 - 池子费付给 LP
── 机制 ──
成交 UP ↑ 价格向上穿过区间时逐步转换为 WETH
回吐 UP ↓ 价格回落会转换回来 - 不是挂单簿订单,没有自动执行
成交后 提取 仓位 -> 一键锁定 · 限价徽章,实时成交 %
质押 不要 质押的 LP 会放弃交易手续费 - 订单保持不质押
[连接钱包]
```
#### 卖出区间预设
| 预设 | 含义 |
|---|---|
| `贴市 · 1 TICK` | 最窄合法区间,贴着市场一个 tick 间距;第一个上涨 tick 就开始成交,手续费捕获最大。 |
| `+1->3%` / `+2->5%` / `+5->10%` / `+10->25%` | 阶梯区间:起点在市价 +X%,终点在 +Y%。 |
| `自定义` | 自定义起点 / 终点百分比(< tick 间距的输入会吸附到贴市区间,标 `≡ 贴市`)。 |
`?` 打开结构化区间说明:起点 / 终点 / 均价(几何平均 √(起点·终点))/ 网格(tick 步长)。
#### 订单关键字段
- **开始成交**:区间起点价(第一批卖出位置)。越近越早成交,但回调也越容易回吐。
- **全部卖出**:区间终点价。
- **平均成交**:起终点的几何平均,即你的混合退出溢价。
- **区间**`[tickLo -> tickHi]`,对齐 tick 网格。
#### 费用对比
直观对比挂单(0%)vs 市价吃单(池费,约 $X)。
#### 机制(必读)
- **成交**:价格向上穿过区间时逐步转换为买入代币。
- **回吐**:价格回落会转换回来——**这不是挂单簿订单,没有自动执行**。
- **成交后**:去仓位页「提取」一键锁定;带限价徽章,实时成交 %。
- **不要质押**:质押的 LP 放弃交易手续费,订单必须保持不质押。
#### 下单
`挂出区间订单 ->` 最多 2 笔交易(精确授权 + 铸造),无自动执行。铸一个区间起点 ≈ 100% 的单边仓位(防价格已进入区间)。下单后跳仓位页跟踪。
---
## 8. 实盘操作全流程
### 8.1 流程一:用 WETH 给 UP33 CL 池加流动性并质押赚 UP
1. **启动**`npm run indexer` + `npm run dev`,浏览器开 `http://localhost:5173`
2. **连钱包**:顶栏 `[ 连接 ]`,选 MetaMask,切到 Robinhood Chain (4663)。
3. **找池子**POOLS 页,搜 `WETH/UP`,点 `UNI V3` 过滤看 UP33 的 CL 池(带 `gauge` 字样)。
4. **选区间**:点 `+ LP`,区间选 `±10%`(对称)或 `↓ 下方`(单边接)。
5. **输入金额**:双币模式下输入 WETH 数量,UP 自动联动。
6. **预览**:面板显示 `预估`:存入 ≈ $X、占活跃流动性 Y%、费率 APR(不质押时)、排放 APR(质押时)。超出区间会警告。
7. **铸造**:点 `铸造仓位`,钱包确认授权 + mint(CL_PM),NFT 进钱包。
8. **质押**:去 POSITIONS 页找到新仓位,点 `质押`,授权 NFT 给 gauge + 质押。开始赚 UP。
9. **领取**:累计后点 `领取 UP` 或汇总条 `全部领取`。日志显示收到的 UP,附 `SWAP -> ETH` 一键卖出。
### 8.2 流程二:用单币(ETHZAP 进 WETH/UP 池
1. POOLS 页找到 WETH/UP CL 池,点 `+ LP`
2. 资金模式切到 `⚡ ZAP - 单币`
3. 输入选 `ETH`,填数量,选滑点 `1%`
4.`连接钱包`(实为执行),ZAP 列出交易序列:`包装 ETH -> WETH``授权 WETH -> kyber 路由``兑换 N WETH -> ≈M UP``授权 WETH -> 仓位管理器``授权 UP -> 仓位管理器``铸造仓位`
5. 逐步执行,任一步失败即停,资金始终在钱包。
6. 完成后去仓位页质押。
### 8.3 流程三:用限价单卖出 UP 换 WETH
1. SWAP 页,切 `限价 · 挂 LP 卖出`
2. 卖出选 `UP`,换成 `WETH`。金额选 `50%`
3. 区间选 `+1->3%`(在市价上方 1%~3% 阶梯卖出)。
4. 查看「订单」区:开始成交价 / 全部卖出价 / 平均成交价 / 区间 tick。
5. 查看费用对比:挂单 0% vs 市价 1.00%。
6.`挂出区间订单 ->`,授权 UP + 铸造单边仓位。
7. 去 POSITIONS 页,该仓位带 `限价 UP->WETH` 徽章,显示 `订单等待中 · 价格需上涨 1.76% 开始成交`
8. UP 升值进入区间后逐步成交为 WETH,期间还赚手续费;价格回落会回吐。
9. 完全成交后点 `提取 -> 锁定 WETH`
### 8.4 流程四:仓位管理日常
- **加仓**:仓位卡片 `+ 加仓`,同区间追加流动性。
- **减仓**` 减仓`,按百分比移除 + 领取(2 笔交易)。
- **调整区间**:CL 区间不可移动——要换区间需 `全部撤出` 后重新 mint。
- **领手续费**:未质押 CL / v2 钱包 LP 点 `领取手续费`
- **解押**`解押` 自动领 UP,之后才能动流动性或领手续费。
---
## 9. 安全机制
### 9.1 钱包交互
- 仅浏览器钱包签名,应用 / 服务端 / 存储均无任何私钥。
- **精确金额授权**exact-amount),无无限授权。
- 所有写入 chainId 4663 锁定,带 deadline;原生路由最小值从实时链上价推导。
### 9.2 Kyber 兑换四道闸门(`lib/kyberExec.ts`
Kyber 的 calldata 是不透明的,发送前过四道闸:
1. API 返回的 `routerAddress` 必须等于 `.env` 白名单(且 tx `to` 永远是白名单地址,不是 API 给的)。
2. `transactionValue` 必须精确匹配预期(ERC-20 入 = 0,原生 ETH 入 = amountIn)。
3. 构建的 `amountIn` 必须等于请求。
4. 构建的 `amountOut` 必须 ≥ 新鲜报价 用户滑点。
SWAP 和 ZAP 共用同一处闸门,永不分叉。
### 9.3 ZAP 额外两道闸
- 新鲜路由的 `tokenOut` 必须是池子的对手代币。
- 新鲜输出必须仍在预览计划的滑点内(+0.5% 宽容),否则在钱包看到交易前就停。
- 存入用 receipt 的实际到账,授权每步精确金额。
### 9.4 反 spoofing
- 代币选择器每行都显示合约地址缩写。
- 合约目录列出完整地址并链接区块浏览器。
- 索引器只从官方工厂事件 / 枚举接纳池子,第三方 API 只能富化不能引入——伪造 / 分叉池结构性被排除。
### 9.5 XSS / 注入防御
- 内置 CSP `script-src 'self'` 思路:无内联脚本、无 eval、无第三方 / CDN 脚本,全部自托管 + content-hash。
- React 转义,无 `dangerouslySetInnerHTML`;外链 `noreferrer`
- 依赖精确锁定(`.npmrc save-exact`+ lockfile,防供应链 patch 投毒。
### 9.6 区间订单所在池的近实时推送
你持有区间订单的池有 **4 秒** 的专项 slot0 推送(单次 multicall),成交 % / 持有 / 区间条近实时跟踪;数值更新按方向闪绿 ▲ / 红 ▼,区间条标记滑动显示漂移方向。
---
## 10. 常见问题
### Q1POOLS 页显示「索引器离线 - dexscreener 兜底」?
indexer 进程没启动或还在首次回填(`ready:false`)。启动 `npm run indexer` 并等首次 boot 完成(约 1 小时)。期间前端用 DexScreener 兜底(v3 前 30),功能可用但池子不全。
### Q2indexer 启动报 `EADDRINUSE: address already in use :::8787`
8787 端口被占。先停掉旧 indexer 进程(任务管理器找 node.exe,或 `Get-Process node | Stop-Process -Force`)再重启。
### Q3indexer 卡在 `v3 backfill` 不动?
Blockscout 被墙 / Node fetch 不走代理。设 `NODE_USE_ENV_PROXY=1` + `HTTPS_PROXY=http://127.0.0.1:7890`(换成你的代理)后重启 indexer。或设 `INDEXER_BACKFILL=rpc` 走 RPC 窗口扫描(较慢但无需 Blockscout)。
### Q4:连钱包后显示「链错误」?
钱包不在 Robinhood Chain (4663)。点顶栏 `[ 链错误 ]` 或横幅「切换」按钮,钱包会请求切链。
### Q5:CL 仓位的 APR 跟池子表格里的不一样?
表格里是 **池平均** APR;仓位卡片是 **你的区间专属** APR`share = L_yours / (activeLiquidity + L_yours)`。集中区间内的仓位会成倍高于池平均,超出区间则 0。
### Q6:质押了为什么手续费归零?
ve(3,3) 模型:质押 LP 赚 UP 排放,**手续费份额归该池投票者**。想赚手续费就解押。二者不可兼得。
### Q7:限价单为什么「回吐」?不是挂单吗?
区间订单是单边 LP,不是订单簿限价单。价格穿过区间时逐步成交,**价格回落会转换回来**,没有自动执行。完全成交后需手动「提取」锁定买入代币。
### Q8:ZAP 中途失败了怎么办?
ZAP 任一步失败即停,所有中间资产都是普通钱包余额,不会悬空。解决后重新执行(按当前余额重新规划),或切双币模式手动收尾。
### Q9:想创建全新的 Uniswap v3 池子?
v1 不支持 `createAndInitializePoolIfNecessary`,只能 mint 进已有池子。
### Q10Uniswap v2 仓位怎么管理?
v1 未接入 v2 LP 余额 / 移除流动性。POOLS 浏览 + 添加可用;仓位追踪靠钱包层面(v2 LP 是普通 ERC-20)。
---
## 附录:关键合约地址
### UP33ve(3,3) DEX
| 合约 | 地址 |
|---|---|
| UP 代币 | `0x57C0E45cB534413D1C20A4240955d6bB250BB4F1` |
| veUP | `0x5d321dE36F0bf98D92b291280514F3878582B7B6` |
| Voter | `0x7F749fDD351C1Ceed82d76d7699CB631Eb8332a7` |
| Minter | `0x912EC7A90e8C9829eE0e0f6a4Db5270776Fc3Da5` |
| V2 Factory | `0xFA5429AEBa338BEa2BFcc1b9a889862Ee395bc28` |
| V2 Router | `0xf5198743240fAC98db71868F34c70139b1eb0474` |
| CL Factory | `0x1ac9dB4a2608ba45D6127B1737949b51Bb54B7F3` |
| CL PositionManager | `0x07F44c47743A2f36414A82b9F558ECFCf0EEdCEf` |
| CL SwapRouter | `0xC062b870E813fcA720f1e002c234369Ab3aB9415` |
| CL Quoter | `0x03983AB2C057a2eac211ff01738a1e49ff325B49` |
| WETH | `0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73` |
| USDG | `0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168` |
### Uniswap(官方部署,链 4663
| 合约 | 地址 |
|---|---|
| V3 Factory | `0x1f7d7550B1b028f7571E69A784071F0205FD2EfA` |
| V3 NonfungiblePositionManager | `0x73991a25C818Bf1f1128dEAaB1492D45638DE0D3` |
| V2 Factory | `0x8bcEaA40B9AcdfAedF85AdF4FF01F5Ad6517937f` |
| V2 Router02 | `0x89e5DB8B5aA49aA85AC63f691524311AEB649eba` |
### 其他
| 项 | 值 |
|---|---|
| 链 ID | 4663 |
| 区块浏览器 | https://robinhoodchain.blockscout.com |
| 公共 RPC | https://rpc.mainnet.chain.robinhood.com |
| Multicall3 | `0xcA11bde05977b3631167028862bE2a173976CA11` |
---
*本文档基于 LP TERMINAL v0.2 实测整理。协议参数由 Safe 控制,随时可能变化;一切以链上实时状态为准。本文不构成财务建议。*