通过 TEE(Trusted Execution Environment)解决方案,使用智能账户(Smart Account)实现自动化策略交易,涵盖限价单、止盈止损(TP/SL)、清仓等场景,同时支持 Solana 和 EVM 链。
已将账户下的多链私钥安全传送给 TEE 服务器的用户被标记为 SA 用户:
钱包鉴权接口参数:
| 方向 | 字段 |
|---|---|
| 入参 | accountId、address、chainId、teeId、command、signMsg、signature |
| 出参 | accountId、address、chainId、teeId、teeIsActive、command |
下策略单签名示例:
Chain Index: 501
Strategy Type: Swap
Recipient: jqJw52AgRtdHNmKuxaXSg1ATtTK6JXwTxe4RAuG97jg
Created At: 2025-09-02T10:30:00+09:00
Expired At: 2025-10-24T15:30:00+09:00
From Token: 11111111111111111111111111111111
To Token: So11111111111111111111111111111111111111112
From Amount: 1000000000
Min Return Amount: 1000000000查询订单签名:
Strategy Type: ReadOrders
Created At: 2023-09-24T18:00:00+09:00
Expired At: 2025-09-24T18:30:00+09:00取消订单签名:
Strategy Type: CancelSingleOrder / CancelAllOrders
Order Id: 123456通过钱包静默签名完成 JWT 生成,保护敏感数据(用户订单数据),授权一次全站通用。
sequenceDiagram
participant User as 用户
participant Wallet as 钱包
participant Passport as Passport SDK
participant Store as AuthStore
participant API as 后端 API
User->>Wallet: 触发登录
Wallet->>Passport: 检查链支持 & 静默签名支持
Passport->>Passport: passport.login(needSign, isSilent)
Passport-->>Store: authToken → AUTHENTICATED
Note over User,API: API 请求携带 JWT
User->>API: 请求 + Header: X-Web3-Auth
API-->>User: 正常响应
Note over User,API: Token 过期场景
User->>API: 请求 + 过期 Token
API-->>Passport: 返回错误码 10026
Passport->>Store: removeToken → UNAUTHENTICATED
订单列表查询需融合多个数据源:
| 入口 | 说明 |
|---|---|
| PC OpenOrders | 当前活跃订单 |
| PC OrderHistory | 历史订单 |
| App Orders | order + orderHistory 按时间倒序 |
| Transactions | order + orderHistory 按时间倒序(cursor: createTime, orderId) |
游标分页 + 内存排序:
graph TB
A["查询请求<br/>携带两个数据源的游标"] --> B["并行查询两个数据源<br/>各查 pageSize 条"]
B --> C["内存合并排序<br/>取前 pageSize 条"]
C --> D{"结果集包含<br/>哪些数据源?"}
D -->|"两个源都有"| E["返回结果 + 两个游标<br/>各取最后一条的点位"]
D -->|"只有源A<br/>源B有数据"| F["源A游标=最后一条<br/>源B游标=第一条+1"]
D -->|"只有源A<br/>源B无数据"| G["源A游标=最后一条<br/>源B游标=null"]
D -->|"都无数据"| H["无下一页"]
graph TB
subgraph 用户下单
A["用户创建市价 Swap<br/>+ 附加 TP/SL"] --> B["意图签名"]
B --> C["后端创建策略单"]
end
subgraph Swap执行
C --> D["触发市价交易"]
D --> E["TEE 验证 + 签名"]
E --> F["广播交易"]
F --> G{"链上结果"}
end
subgraph 后续处理
G -->|成功| H["创建 TP/SL 子订单"]
G -->|失败| I["策略单标记失败"]
H --> J["监听价格信号"]
J --> K["触发止盈/止损"]
K --> L["TEE 签名 + 广播"]
end
stateDiagram-v2
[*] --> 挂单中: 创建策略单
挂单中 --> 交易中: 信号触发
交易中 --> 成功: 链上确认
交易中 --> 失败: 链上失败
挂单中 --> 系统暂停: TEE/SA 状态变更
系统暂停 --> 挂单中: TEE 重新激活 + 用户唤醒
系统暂停 --> 已取消: 用户取消 / 过期
挂单中 --> 已过期: 超过有效期
EVM 链上的 nonce 管理面临两大挑战:
| 问题 | 描述 |
|---|---|
| 低 gas 卡单 | 需要获取卡单交易 nonce 进行加速 |
| Nonce 冲突 | 同一用户多策略被同一信号并发触发 |
方案对比:
| 维度 | 方案一(不管理 nonce) | 方案二(本地 nonce 管理) |
|---|---|---|
| 实现 | 每次从链上查最新 nonce,批内内存自增 | 本地派发 nonce,管理生命周期 |
| 优点 | 方案简单,支持批量广播 | 保证 nonce 连续,支持 nonce 重用和卡单解锁 |
| 缺点 | 卡单影响后续订单,并发场景成功率低 | 方案复杂 |
| 结论 | ✅ 采用 | — |
graph TB
subgraph 三种方案
A["方案一<br/>等待基本不可逆终态<br/>ETH ~13min / BSC ~7.5s"]
B["方案二<br/>等待 N 个区块确认<br/>ETH ~36s / BSC ~4.5s"]
C["方案三<br/>监听回滚事件<br/>实时修正订单"]
end
D["交易结果回调"] --> C
E["Auto Sell 场景"] --> B
style C fill:#e8f5e9
style B fill:#fff3e0
回滚场景分析:
| 回滚类型 | 影响 | 处理方式 |
|---|---|---|
| 失败 → 成功 | 正常创建 TP/SL | Trigger 正常处理 |
| 成功 → 失败 | 资损风险 | 回滚删除 TP/SL |
| 成功 → 成功(数量变化) | 可能资损 | 用最新状态覆盖 TP/SL |
结论:Auto Sell 场景实时处理,如果回滚到达时 TP/SL 已触发则跳过,未触发则覆盖。
graph LR
subgraph 触发场景
A["止盈/止损"]
B["抄底/追涨"]
end
subgraph 异常处理
C["信号超时"] --> D["中断"]
E["风险代币"] --> F["终止订单 + 推送"]
G["余额不足 / Gas 不足"] --> H["关闭订单"]
I["不满足 minReceive / 预执行失败"] --> J["重置触发器"]
K["TEE 验证/签名失败(未知)"] --> L["重试 N 次后关闭"]
M["TEE 签名失败(未授权)"] --> N["关闭订单 + 推送"]
O["广播/链上失败"] --> J
end
{
"eventType": 7,
"chain": 501,
"userWalletAddress": "XXX",
"orderInfo": {
"strategyOrderId": "123456",
"strategyMode": 3,
"fromTokenAddress": "XXX",
"fromTokenAmount": "100.0",
"toTokenAddress": "XXX",
"teeVerifyData": { }
},
"executeUntilMillis": 1750390482000
}主要复用 TG TEE 交易流程,改动:验证服务与签名服务合并到签名服务中,通过 SDK 接入。
graph TB
A["收到触发消息"] --> B["询价(批量)"]
B --> C{"需要授权?"}
C -->|是| D["发送 Approve 交易"]
D --> E["等待授权确认"]
C -->|否| F["TEE 验证 + 签名"]
E --> F
F --> G["广播 Swap 交易"]
G --> H["等待链上结果"]
H --> I{"交易状态"}
I -->|成功| J["回调 Trigger<br/>更新订单状态"]
I -->|失败| K["标记失败<br/>等待下次信号"]
签名接口合并验证和签名:/external/api/v2/sign
新增 intent 字段:
intent.signature:用户意图签名(Base64),端上透传intent.data:签名原文(UTF-8 编码)intent.extra:附加验证数据(pool token0/token1、fee 等)前端 SA 状态校验链(15+ 检查状态):
graph TB
START["开始检查"] --> C1{"系统就绪?"}
C1 -->|否| WAIT["等待加载"]
C1 -->|是| C2{"钱包已连接?"}
C2 -->|否| S1["未连接钱包"]
C2 -->|是| C3{"支持的钱包?"}
C3 -->|否| S2["不支持的钱包"]
C3 -->|是| C4{"已安装插件?"}
C4 -->|否| S3["未安装插件"]
C4 -->|是| C5{"版本支持 SA?"}
C5 -->|否| S4["版本过低"]
C5 -->|是| C6{"SA 服务正常?"}
C6 -->|否| S5["服务异常"]
C6 -->|是| C7{"SA 账户已创建?"}
C7 -->|否| S6["SA 未创建"]
C7 -->|是| C8{"SA 账户活跃?"}
C8 -->|否| S7["SA 已关闭"]
C8 -->|是| C9{"链支持?"}
C9 -->|否| S8["不支持该链"]
C9 -->|是| C10{"即将过期?"}
C10 -->|是| S9["⚠️ 即将过期(警告)"]
C10 -->|否| OK["✅ 正常"]
graph TB
subgraph SA基础
A["Smart Account<br/>TEE 托管私钥"]
B["7天有效期<br/>过期自动删除私钥"]
C["意图签名<br/>Intent Signing"]
end
subgraph 订单系统
D["策略单<br/>限价/TP/SL/清仓"]
E["订单鉴权<br/>JWT + 静默签名"]
F["多源分页查询<br/>游标 + 内存排序"]
end
subgraph 执行引擎
G["Trigger<br/>信号触发"]
H["Trade<br/>TEE验证+签名+广播"]
I["回滚处理<br/>方案二/三混合"]
end
subgraph EVM扩展
J["授权管理<br/>无限授权"]
K["Nonce 管理<br/>链上查询+批内自增"]
L["广播回调<br/>状态流转"]
end
A --> D
A --> E
B --> D
C --> D
D --> G
G --> H
H --> I
D --> J
J --> K
K --> L