Files
wtf-contract/README.md
T

284 lines
13 KiB
Markdown
Raw 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.
# WTFX 核心智能合约系统设计与实战开发指南
> **项目名称**WTFX (原 WTFPred / WTF Market)
> **核心定位**:基于 Bonding Curve(多结果联动幂律 LDA 曲线)的高频预测市场协议,支持内盘快速发射与毕业后无缝转入现货/订单簿。
> **设计语言**Solidity `^0.8.29` / `Cancun EVM` / `Arbitrum Nitro`
---
## 目录
1. [系统整体架构与核心组件](#1-系统整体架构与核心组件)
2. [经济模型与核心数学机制](#2-经济模型与核心数学机制)
3. [分档位治理体系与单市场覆盖](#3-分档位治理体系与单市场覆盖)
4. [完整生命周期与业务流程](#4-完整生命周期与业务流程)
5. [目录结构与代码组织](#5-目录结构与代码组织)
6. [编译、部署与测试指南 (Robinhood Chain & 本地)](#6-编译部署与测试指南)
7. [关键接口速查与开发示例](#7-关键接口速查与开发示例)
---
## 1. 系统整体架构与核心组件
WTFX 采用模块化解耦与可升级代理架构(Upgradeable Proxy Pattern),核心由三大支柱构成:
```
┌────────────────────────┐
│ WTFX 用户 / 交易者 │
└───────────┬────────────┘
│ (Mint/Redeem/Claim/Transfer)
┌─────────────────────────────────────────────────────────────┐
│ WTFMarketV2.sol │
│ - ERC-6909 多代币标准(每个结果选项一个 TokenId: 1, 2, 4...
│ - 市场资金池状态机(Trading -> Graduated / Finalised / Refunded)│
└──────────────┬──────────────────────────────┬───────────────┘
│ │
(查询联动曲线边际价与成本) (查询市场元数据、档位与治理配置)
▼ ▼
┌─────────────────────────────┐┌──────────────────────────────┐
│ PowerLDACurveV2.sol ││ WTFControllerV2.sol │
│ - 幂律 LDA 联合曲线计算库 ││ (Upgradeable Proxy + Facade)│
│ - calMarginalPrice / Seed ││ - MarketFactory (建盘分发) │
│ - 多结果自平衡与时间衰减 ││ - Governance (分档位与参数) │
│ ││ - Registry (命题确权与争议期) │
└─────────────────────────────┘└──────────────────────────────┘
```
### 核心合约模块职责
1. **`WTFControllerV2.sol` (中枢控制器)**
- 作为协议的主入口与可升级代理实现(Proxy Pattern);
- **`MarketFactory`**:负责根据创作者配置部署专属 `WTFMarketV2` 实例,并完成初始流动性(Seed)注入;
- **`Governance`**:管理创作者手续费分成、中心化收益钱包(Central Wallet)、全局默认毕业阈值与 **分档位(Tiers/ 单市场覆盖(Overrides**
- **`Registry`**:负责链上命题元数据确权(`questionId`)、选项绑定与裁决争议期管理。
2. **`WTFMarketV2.sol` (预测市场交易实例)**
- 采用 **ERC-6909** 多资产标准,每个预测选项对应一个独立的 `tokenId`(如 `Yes = 1`, `No = 2`);
- 独立托管抵押品(WUSD / USDC),执行交易者的买入(`mintCollateralToExactOt`)与卖出(`redeemExactOtToCollateral`);
- 实现市场毕业(`graduate`)、全员返还(`refund`)以及最终兑付(`claim`)。
3. **`PowerLDACurveV2.sol` (联合曲线引擎)**
- 基于幂律连续拍卖(Linear Discrete Auction / Power Curve)算法;
- 实现任意数量选项(2 ~ 255 个)的联动价格发现;
- 保证资金池抵押品与代币铸造的严格守恒与无摩擦做市。
---
## 2. 经济模型与核心数学机制
### 2.1 创作者 Seed 机制(冷启动注入)
创作者建盘时需注入一定量的底仓(Seed OT),例如每个选项 1 ~ 10 OT:
- **零额外费用**:初始 Seed 调用 `curve.calSeedCost`,不收取创作者手续费;
- **博弈论本质**:Seed 锁在池子中作为底仓,创作者持有全套结果代币。即使盘子无人交易,创作者可通过 `refund()` 或到期 `claim()` **100% 取回大部分本金**
### 2.2 交易手续费流向 (Fee Split)
每一笔买入/卖出交易扣除的 `feeRate`(创作者建盘时在 0.1% ~ 3.0% 之间自主选择并冻结):
- **50% 创作者激励**:直接沉淀为创作者待提取收入;
- **50% 平台中心化钱包**:流入超级管理员配置的 `centralWallet`
### 2.3 毕业(Graduation)机制
当买方狂热将资金池推升至阈值时触发毕业:
- **触发条件**`totalMarketCap >= thresholdMcap``maxSupplySingle >= thresholdMaxSupply`
- **毕业效果**
1. 联合曲线立即永久冻结,停止 Curve 买卖;
2. 按照各选项最终边际价格归一化计算概率分布,锁定 `redeemValue`
3. 资金池流动性与代币可平滑迁移至外部 CLOB 订单簿或 AMM 现货池。
---
## 3. 分档位治理体系与单市场覆盖
系统彻底废弃全局一刀切设计,建立了三级优先级的治理读取模型:
$$ ext{生效参数} = \mathbf{单市场独立覆盖 (Override)} \succ \mathbf{所属市场档位 (Tier)} \succ \mathbf{全局兜底配置 (Global Default)}$$
### 3.1 预设标准档位参数 (Robinhood / Production Grade)
| 档位 | 命名 | 定位与场景 | 毕业 mcap | 单结果供给 | 争议窗口期 |
| :--- | :--- | :--- | :--- | :--- | :--- |
| **Tier 1** | **PvP 极速盘** | 链上热点、KOL 互撕、数小时结算 | **$3,000 WUSD** | 50,000 OT | **10 分钟 (600s)** |
| **Tier 2** | **社区主流盘** | 赛事决赛、周度行情、经济指标 | **$25,000 WUSD** | 300,000 OT | **2 小时 (7200s)** |
| **Tier 3** | **旗舰宏观盘** | 总统大选、宏观政策、机构大盘 | **$100,000 WUSD**| 1,000,000 OT| **24 小时 (86400s)**|
| **Tier 0** | **全局默认** | 兜底未分档市场 | $10,000 WUSD | 100,000 OT | 1 小时 (3600s) |
### 3.2 治理接口说明
- `setMarketTier(tierId, mcap, maxSupply, disputeWindow)`:管理员配置指定档位的标准参数;
- `setMarketTierBinding(market, tierId)`:为特定市场切换绑定的档位;
- `setMarketConfigOverride(market, mcap, maxSupply, disputeWindow, isCustom)`:为某个重要盘子定制独一无二的阈值(`isCustom=true` 立即生效覆盖,`isCustom=false` 撤销并回退到档位)。
---
## 4. 完整生命周期与业务流程
```
[创作者建盘] ──> [联合曲线交易阶段] ──> [触发毕业] (自动/Keeper冻结曲线)
▼ (事件截止)
[创作者裁决] (resolveOutcome -> finaliseOutcome)
[争议窗口期内] (10分钟 ~ 24小时)
├── 超级管理员改判 (overrideFinalise)
└── 创作者/管理员全员返还 (refund)
▼ (争议期结束)
[赢家兑付] (claim 销毁获胜 OT 领取抵押品)
```
---
## 5. 目录结构与代码组织
`wtf-contract/` 目录下包含了完整的合约体系与依赖:
```
wtf-contract/
├── main/ # 核心主合约体系
│ ├── src/
│ │ ├── controllerv2/ # 控制器、工厂、存储与治理逻辑
│ │ │ ├── ControllerStorage.sol # 统一存储槽与数据结构定义
│ │ │ ├── Governance.sol # 治理分档位与费率逻辑
│ │ │ ├── MarketFactory.sol # 市场部署与 Seed 注入
│ │ │ ├── Registry.sol # 命题注册与裁决逻辑
│ │ │ └── WTFControllerV2.sol # 主入口与代理合约
│ │ ├── interfaces/ # 外部与内部接口
│ │ │ ├── IRegistry.sol
│ │ │ ├── IWTFControllerV2.sol
│ │ │ ├── IWTFCurve.sol
│ │ │ └── IWTFMarketV2.sol
│ │ ├── libraries/ # 核心算法、事件与自定义错误
│ │ │ ├── Errors.sol # 统一 EVM Custom Errors
│ │ │ ├── Event.sol # 链上日志定义
│ │ │ ├── QuestionV2.sol # 命题状态与哈希算法
│ │ │ └── WTFMath.sol # 高精度定点数数学库
│ │ ├── WTFERC6909.sol # 极简高效 ERC-6909 多代币实现
│ │ └── WTFMarketV2.sol # 预测市场交易与资金池状态机
│ └── lib/ # OpenZeppelin & Solady 标准依赖库
├── curve/ # 联合曲线与高阶数学计算库
│ └── src/
│ └── curves/
│ ├── math/ # 幂律与 LDA 边际价求解器
│ │ ├── PowerLDAMath.sol
│ │ ├── PowerMath.sol
│ │ └── LDAMath.sol
│ └── PowerLDACurveV2.sol # 联合曲线合约
└── mock/ # 测试辅助合约
├── MockERC20.sol # 支持无限 Mint 领水的 WUSD 抵押品
└── TestProxy.sol # 极简 Delegatecall 可升级代理
```
---
## 6. 编译、部署与测试指南
### 6.1 本地与 Robinhood Chain 测试网环境要求
- **Node.js**: `>= 18.0.0`
- **Solidity 编译器**: `0.8.29`
- **EVM Target**: `cancun` (或 `paris` / `shanghai`,若目标链不支持 Cancun EIP-1153,可在 `MarketV2` 中使用标准 ReentrancyGuard)
### 6.2 部署到 Robinhood Chain Testnet 快速配置
在 Hardhat 配置文件中添加测试网网络:
```javascript
module.exports = {
solidity: {
version: "0.8.29",
settings: {
evmVersion: "cancun",
optimizer: { enabled: true, runs: 200 }
}
},
networks: {
robinhoodTestnet: {
url: "https://rpc.testnet.chain.robinhood.com",
chainId: 46630,
accounts: [process.env.PRIVATE_KEY] // 部署者私钥
}
}
};
```
### 6.3 部署核心步骤
1. **部署抵押品 (WUSD)**:部署 `MockERC20("WTF USD", "WUSD", 18)`
2. **部署联合曲线**:部署 `PowerLDACurveV2`
3. **部署控制器代理**
- 部署 `Registry` 库并链接部署 `WTFControllerV2` 实现;
- 部署 `TestProxy` 指向实现合约;
- 调用 `controller.initialize(admin, treasury, defaultFeeRate, delay)`
4. **初始化参数与档位**
- 授权抵押品与曲线进入白名单;
- 调用 `setMarketTier` 初始化 Tier 1 ($3k)、Tier 2 ($25k)、Tier 3 ($100k)。
---
## 7. 关键接口速查与开发示例
### 1) 创建预测市场 (`deployMarket`)
```solidity
QuestionParams memory qParams = QuestionParams({
timestampEnd: block.timestamp + 7 days,
title: "WTFXRobinhood Chain 主网本季度会上线吗?",
ancillaryData: "0x",
imageUri: "https://...",
outcomeNames: ["会", "不会"],
outcomeImageUris: ["", ""]
});
MarketParams memory mParams = MarketParams({
parentTokenId: 0,
collateral: wusdAddress,
curve: curveAddress,
timestampStart: block.timestamp,
feeRate: 6000000000000000, // 0.6%
tierId: 1 // Tier 1: PvP 盘
});
// otSeed = 1e18 (每选项 1 个 OT)
(bytes32 questionId, address market) = controller.deployMarket(
qParams,
mParams,
oracleAddress,
1 ether
);
```
### 2) 买入指定结果代币 (`mintCollateralToExactOt`)
```solidity
// 在 market 合约中买入 10 个 Yes (tokenId = 1)
uint256 tokenId = 1; // 2^0
uint256 otAmount = 10 ether;
// 先 approve 给 market 合约抵押品
wusd.approve(market, type(uint256).max);
// 执行买入
market.mintCollateralToExactOt(
msg.sender,
tokenId,
otAmount,
""
);
```
### 3) 创作者裁决与结算 (`resolveOutcome` & `finaliseOutcome`)
```solidity
uint256 winningAnswer = 1; // 2^0 表示 Yes 赢
// 1. 提交裁决
controller.resolveOutcome(questionId, winningAnswer);
// 2. 定案并开启争议期
controller.finaliseOutcome(questionId, winningAnswer);
```
### 4) 争议期后领取获胜收益 (`claim`)
```solidity
uint256[] memory tokenIds = new uint256[](1);
tokenIds[0] = 1;
uint256[] memory amounts = new uint256[](1);
amounts[0] = 10 ether; // 销毁 10 个 Yes
// 自动根据资金池总金额结算抵押品返回至接收者
market.claim(msg.sender, tokenIds, amounts);
```