智能合约概览¶
Sera 协议由多个部署在以太坊上的互联智能合约组成。
合约地址(Sepolia 测试网)¶
| 合约 | 地址 |
|---|---|
| Market Router | 0x82bfe1b31b6c1c3d201a0256416a18d93331d99e |
| Market Factory | 0xe54648526027e236604f0d91413a6aad3a80c01e |
| Order Canceller | 0x53ad1ffcd7afb1b14c5f18be8f256606efb11b1b |
Warning
以上是 Sepolia 测试网地址。主网地址将会不同。
架构¶
flowchart TD
Router["Market Router<br/><i>所有交易的入口</i>"] --> OB1["OrderBook A<br/>EURC/USDC"]
Router --> OB2["OrderBook B<br/>XSGD/USDC"]
Router --> OB3["OrderBook C<br/>XSGD/USDT"]
OB1 --> PB1["PriceBook A"]
OB2 --> PB2["PriceBook B"]
OB3 --> PB3["PriceBook C"] 核心合约¶
Market Router(市场路由器)¶
所有交易操作的主要入口点。用户应通过 Router 而非直接与 OrderBook 交互。
主要函数:
limitBid/limitAsk- 下限价单marketBid/marketAsk- 执行市价单claim- 领取已成交订单的收益
OrderBook(订单簿)¶
每个交易对都有自己的 OrderBook 合约:
- 存储所有未成交订单
- 撮合新订单与订单簿
- 跟踪订单成交情况和可领取金额
主要函数:
getDepth- 获取某价格的订单深度getOrder- 获取订单详情bestPriceIndex- 获取最佳买/卖价getClaimable- 查询可领取收益
PriceBook(价格簿)¶
使用算术定价公式进行价格计算:
主要函数:
indexToPrice- 将价格索引转换为实际价格priceToIndex- 将价格转换为最近的索引maxPriceIndex- 获取支持的最大索引
Order Canceller(订单取消器)¶
用于批量取消多个市场订单的工具合约。
地址(Sepolia): 0x53ad1ffcd7afb1b14c5f18be8f256606efb11b1b
主要函数:
cancel(params[])- 取消订单并将代币返还给调用者cancelTo(params[], to)- 取消订单并将代币发送到指定地址
订单通过其 NFT 代币 ID 标识,可从 Orders GraphQL 查询(nftId 字段)获取。
代币流转¶
下买单(Bid)¶
sequenceDiagram
participant 用户
participant Router
participant OrderBook
用户->>Router: approve(router, amount)
用户->>Router: limitBid(params)
Router->>OrderBook: transferFrom(用户)
Router->>OrderBook: limitOrder(...)
OrderBook-->>Router: orderId
Router-->>用户: orderId 领取收益¶
sequenceDiagram
participant 用户
participant Router
participant OrderBook
用户->>Router: claim(params)
Router->>OrderBook: claim(orderKeys)
OrderBook-->>Router: transfer(用户, tokens)
Router-->>用户: tokens Gas 优化¶
Sera 针对 Gas 效率进行了优化:
| 操作 | 典型 Gas |
|---|---|
| 限价单(仅挂单) | ~150,000 |
| 限价单(吃单+挂单) | ~200,000 |
| 市价单 | ~120,000 |
| 领取单个订单 | ~80,000 |
| 取消订单 | ~60,000 |
Tip
在单笔交易中使用 claim 领取多个订单可节省批量领取的 Gas。
安全注意事项¶
- 只授权您需要的金额或使用 permit 签名
- 检查 deadline 参数以防止过时交易
- 使用 postOnly 挂单避免意外成交
- 设置合理的 limitPriceIndex防止三明治攻击