内容
<p align="center">
<img src="./public/banner.svg" alt="凯塔尼亚chio" width="100%" />
</p>
<h1 align="center">凯塔尼亚chio</h1>
<p align="center">
一个自主的比赛过程中足球市场做市商。它摄取TxLINE的实时赔率和比分,在进球确认后约400毫秒内调整价格,以防止因延迟套利而被选中,并将所有价格锚定在Solana上。
</p>
<p align="center">
<img src="https://img.shields.io/badge/Solana-Devnet-9945FF?style=flat-square&logo=solana&logoColor=white" alt="Solana Devnet" />
<img src="./public/badge-build.svg" alt="build passing" />
<img src="./public/badge-tests.svg" alt="36 tests passing" />
<img src="https://img.shields.io/badge/Next.js-15-000000?style=flat-square&logo=next.js" alt="Next.js 15" />
<img src="https://img.shields.io/badge/TypeScript-strict-3178C6?style=flat-square&logo=typescript&logoColor=white" alt="TypeScript" />
</p>
<p align="center">
<b>提交给:交易工具与代理。</b> TxODDS × Solana世界杯黑客马拉松。
</p>
<p align="center">
<b>▶ 演示视频:</b> <a href="https://youtu.be/_Xxgt5fyRn0">youtu.be/_Xxgt5fyRn0</a>
·
<b>实时演示:</b> <a href="https://catenaccio-six.vercel.app">catenaccio-six.vercel.app</a>
</p>
<p align="center">
<video src="https://github.com/user-attachments/assets/8905a5e2-fe66-4d1e-b571-88d0a3044c93" controls muted playsinline width="80%"></video>
</p>
<p align="center">
<sub>▶ 演示视频在上面实时播放(点击播放,开启声音) · 也可在 <a href="https://youtu.be/_Xxgt5fyRn0"><b>YouTube</b></a> · <a href="https://catenaccio-six.vercel.app">实时演示</a></sub>
</p>
---
## 它是什么,以及如何赚钱
凯塔尼亚chio是一个比赛过程中的做市商,可以作为独立工具部署。它为世界杯比赛市场(比赛结果,进球数大于/小于2.5,雙方进球)提供双向报价,读取TxLINE的实时赔率和比分,并在比赛状态变化时调整价格。它不预测足球比赛。它通过赚取买卖价差来赚钱,比赛一场接着一场,其全部工作是持续进行而不被选中。
**收入来源。** 普通的双向流动交易穿越价差,账簿银行赚取利润。这是一个稳定的优势,原因在于回测平均表现良好,夏普比率为3.16。没有预测优势,也没有声称:公平价值锚定在TxLINE自己的去边际共识中,只有在比分或时钟移动时才会变化。
**唯一的真正敌人:被选中。** 当进球进账时,公平价值立即跳跃(结果可能从3.00跳到1.30),但缓慢的账簿在几秒钟内仍显示旧价格。无论谁先看到进球,是现场观众还是快速馈送的延迟套利者,都可以以几乎无风险的利润购买该停滞价格。在足球比赛中,这是账簿流失的主要方式,今天只有最大的交易台才能快速反应以避免这种情况。
**优势是速度,而不是预测。** 凯塔尼亚chio在约400毫秒内对TxLINE确认的进球做出反应:它暂停受影响的市场,根据其模型调整价格,然后重新开放,在现场观众(约1.5秒)或广播延迟账簿(5至8秒)采取行动之前。停滞价格窗口关闭,防止有人通过它交易。这将单一的最大损失转化为几乎零,留下价差作为干净的优势:每场比赛约639美元的延迟套利被阻止,99%的比赛在回测中盈利。
**为什么交易台可以实际部署它。** 每个报价都锚定在真实的TxLINE数据上,并在Solana上得到验证,每个头寸都根据Txoracle `validate_stat`的Merkle证明结果进行结算。损益(P&L)是可验证的,而不是声称的,这是一个真正的(和受监管的)运营商在允许代理报价其账簿之前所需的东西。
一句话:**自主的价差收入,减去延迟套利出血,价格可供任何人审计。**
## 各部分如何组合,为什么每个部分都存在
一切都围绕着**一个公平价值引擎**。该引擎是脊柱;系统的每个其他部分都为其提供真实的数据或消费其输出。这里没有附加组件,每个部分都是解决真实交易台特定问题的答案。
| 组件 | 存在原因 | 功能 |
|---|---|---|
| **实时TxLINE摄取** | 引擎的好坏取决于其输入,过期或伪造的输入正是账簿被选中的原因 | 流式传输赔率+比分,重新连接,检测序列间隙,并在恢复之前回填 |
| **公平价值引擎** | 无法报价,发出信号或结算没有可信赖的数字 | 基于时间衰减的泊松/迪克森-科尔斯模型,校准到去边际共识 |
| **报价** | 核心工作:创建双向市场,赚取价差 | 每种结果的买入/卖出报价,库存倾斜和跨市场一致性保护 |
| **~400毫秒热路径** | 进球使真实价格在慢账簿更新前几秒移动;这就是账簿损失钱的地方 | 暂停→重新定价→在确认事件后重新开放,防止现场观众采取行动 |
| **信号** | 定价模型还衡量其与市场的分歧;这种分歧是一种可交易的信号 | 显示模型与市场价值,急剧的共识变化和实时获胜概率 |
| **风险轨道** | 自主代理可能崩溃,因此无法部署 | 暴露上限,回调开关,费用和暂停间隙 |
| **结算** | 必须平仓,并且将其与权威证明进行结算,这使得损益可信,而不是声称 | 通过Txoracle `validate_stat`将代理自己的市场与Merkle证明的比分联系起来 |
| **链上锚定+验证** | 没有人可以审计的交易记录价值不大 | 锚定决策日志根,让任何人都可以验证任何填充的TxLINE证明 |
| **MCP服务器** | 其他代理应该能够消费这些信号 | 公开公平价值,报价,信号,套利报告和结算为可调用工具 |
从上到下阅读,这是一个循环:**真实数据→公平价值→报价,信号和管理风险→结算和证明。**
## 它解决了什么问题
当进球被记录时,公平价格会立即改变,但许多账簿需要几秒钟才能更新。在此窗口中,先看到进球的人可以以旧价格支持结果以获取近乎无风险的利润。这是延迟套利或现场观众行为。今天,只有最大的运营商才能快速反应以避免这种情况。
示例:比赛是1-1,客队在第84分钟进球。“客队获胜”应该立即从约3.0缩短到约1.3。慢速馈送的账簿在几秒钟内仍显示3.0;现场观众支持它并获利。凯塔尼亚chio暂停并在交易落地前重新定价。
## 它如何工作
<p align="center">
<img src="./public/architecture.svg" alt="凯塔尼亚chio架构" width="100%" />
</p>
```mermaid
graph LR
subgraph Feed["TxLINE馈送"]
Odds[赔率SSE - 百分比共识]
Scores[比分SSE - 确认进球]
end
subgraph Ingest["摄取"]
SSE[重新连接+间隙回填]
Verify[Merkle验证]
end
subgraph Brain["公平价值引擎-确定性"]
FV[公平价值:泊松/迪克森-科尔斯]
Q[报价:买入/卖出+倾斜]
SG[信号:价值+急剧]
HOT[热路径:约400毫秒重新定价]
Risk[风险:上限+开关]
SET[结算:validate_stat]
end
subgraph Chain["Solana + Surface"]
Txo[Txoracle:validate_stat]
Memo[Memo:锚定根]
UI[仪表板]
MCP[MCP服务器]
end
Odds & Scores --> SSE --> Verify --> FV
FV --> Q --> Risk
FV --> SG
Scores --> HOT --> Risk
Scores --> SET --> Txo
Risk --> Memo
Verify --> Txo
Risk --> UI & MCP
SG --> UI & MCP
```
模型。剩余进球被建模为时间衰减的泊松过程,并具有迪克森-科尔斯低比分修正。在开球时,评分率根据TxLINE的去边际共识(`Pct`)进行校准,因此代理从市场开始。之后,公平价值仅在比分、时钟或卡片移动时发生变化。在确认进球时,模型立即更新,而市场共识因其馈送延迟而滞后;代理在滞后之前重新定价,而不是试图预测。
热路径,在确认进球时:
```mermaid
sequenceDiagram
participant TX as TxLINE比分SSE
participant EN as 引擎
participant BK as 订单簿
participant CT as 现场观众
participant SOL as Solana
TX->>EN: 确认进球(statKey,seq)
EN->>BK: 暂停受影响的市场
EN->>EN: 重新计算公平价值
EN->>BK: 重新定价并重新开放(~400毫秒)
CT->>BK: 打击停滞价格(延迟约1.5秒)
BK-->>CT: 拒绝 - 停滞报价已消失
par in parallel, never blocking the reprice
EN->>SOL: 验证TxLINE Merkle证明(Txoracle)
EN->>SOL: 锚定决策日志根(Memo)
end
```
## 实时TxLINE集成(在devnet上证明)
TxLINE是**主要数据源**。代理通过坚韧的客户端消费两个SSE流,赔率(`Pct`去边际共识)和比分(亚秒确认进球和卡),该客户端重新连接,检测`seq`间隙,并在恢复报价之前回填缺失的间隔。
这是端到端连接并在devnet上运行,而不是仅仅使用捆绑的重放:
```bash
npm run subscribe # 在链上:订阅devnet上的免费世界杯层并激活API令牌
npm run live # 将实时TxLINE赔率和比分馈送到同一个引擎中
```
`npm run subscribe`执行TxLINE的快速入门的实际身份验证流程:它为devnet钱包提供资金,调用Txoracle的`subscribe`指令(免费的世界杯层移动没有TxL,只是注册链上的订阅),获取访客JWT,签署激活消息,并将激活令牌写入`.env.local`。然后`npm run live`流式传输真实的数据包。捕获的运行在[`docs/live-run.txt`](docs/live-run.txt)中:
```
[赔率] 已连接
[原始赔率#1] {"FixtureId":18172280,"MessageId":"1835583265:00003:000334-10021-stab",
"Bookmaker":"TXLineStablePriceDemargined","SuperOddsType":"1X2_PARTICIPANTS", ...}
0' 0-0 | 胜主 42% | 重新定价 n/a | 馈送连接 | 急剧变化:客队漂移5.3pp
```
Devnet订阅交易:[`4A66g1kk…RDyk5E`](https://explorer.solana.com/tx/4A66g1kkSMDNnwv6zoW4aZd9NK1Z3tiHcLTJsHkqKyPKx2Kr9HPf2ak5KKwDoismCGUwZSkprBNvEVmvKfRDyk5E?cluster=devnet).
相同的确定性引擎在事件来自实时套接字或捆绑的重放时运行(`npm run agent`),因此演示版是可重现的,无需凭证。
**实时赔率输入,测量重新定价输出。** `npm run capture:real`记录[`data/real-odds-capture.json`](data/real-odds-capture.json)中的实时去边际共识滴答;`npm run replay:real`然后在它们上运行引擎,校准公平价值与实时共识,并使用`performance.now()`计时暂停,重新定价,重新打开热路径。免费层在我们的窗口中没有实时比分事件,因此重放中的进球标记为合成,但市场数据和测量的热路径是真实的。引擎自己的计算是亚毫秒级的;**400毫秒**的标题是部署的运营商看到的端到端反应预算(事件确认,网络交付以及计算),这是现场观众实际比赛的数字。
部署的仪表板也流式传输它: [catenaccio-six.vercel.app](https://catenaccio-six.vercel.app),切换**重放→实时**,页面连接到服务器端Edge路由(`app/api/stream/route.ts`)生成访客JWT,代理实时TxLINE赔率和比分馈送,并将标准化事件转发到浏览器。 API令牌永远不会离开服务器。 Devnet是60秒的免费层(实时数据);真正的实时(0延迟)是主网层。
## 信号
公平价值引擎有双重用途。用于报价的数字也是预测,并且与其与市场的分歧是信号:
- **价值**:模型对其与去边际共识的评分差异(例如“平局低估4.1pp”)。
- **急剧**:共识本身的快速移动,tick over tick。
- **实时获胜概率**:模型的当前1X2读取。
这些是代理的信号检测输出:人类交易者或其他机器人将采取行动。它们实时显示在仪表板上,并通过MCP暴露(`get_signals`)。
还有一个**独立的信号检测器用Rust编写**,位于
[`sharp-detector/`](sharp-detector/):一个编译的二进制文件,流式传输赔率馈送,标记60秒内的显着偏移,并跟踪后续命中率(是否预测持续方向?)。它使用Rust,因为这是正确的工具,用于精简的始终在线监视器,交易台会运行它;它经过单元测试(`cargo test`)并重用相同的devnet凭证。
## 代理 vs 代理竞技场
赛道的第二个启动器也构建了。 `npm run arena`在多个匹配上运行许多策略代理在相同的TxLINE形馈送上打印排行榜(损益,ROI,命中率,投注次数)。反应最快的代理赢;一个策略淡化移动会损失。整个论点阶段作为比赛:速度,而不是预测,是优势。最终 standings摘要在Solana devnet上锚定(实际的Memo交易,当存在资金devnet钱包时,模拟否则),所以谁赢是防篡改的。比赛是确定性和单元测试的。
```bash
npm run arena # 200场比赛(默认)
npm run arena -- 500 // 更多比赛
```
## 结算
在全时,代理必须关闭自己的头寸。它们与其自身的市场结算,而不是对其进行评级,而是通过Txoracle的`validate_stat`,它评估参数化谓词并返回结果,因此结算的损益是可验证的,而不是声称的。每个市场都映射到一个具体的谓词:
| 市场 | 获胜出结果预测器(dict作为`validate_stat`评估) |
|---|---|
| 比赛结果(主队) | `homeGoals - awayGoals > 0` |
| 进球数/总进球数(超过) | `homeGoals + awayGoals > 2` |
| 两队进球(是) | `homeGoals ≥ 1 AND awayGoals ≥
这是代理结算**自己的账簿**,没有用户资金,没有托管,没有对手方。它是交易循环的最后一步,使损益可信赖,而不是声称的。(`get_settlement`通过MCP公开相同的内容)。
## 链上层,以及使用了多少Rust
一切都在链上使用**Solana**,TxLINE是Solana产品(其数据在链下提供,通过`Txoracle`程序锚定在Solana上);这里没有单独的链。两个东西触及它,都不需要自定义智能合约:
1. 验证TxLINE数据并解决结果:调用TxODDS部署的`Txoracle` `validate_stat`从TypeScript客户端。 我们没有编写Rust。
2. 锚定决策日志:通过SPL Memo程序写入32字节的Merkle根哈希。 没有Rust。
两者都已连接并在devnet上运行(捕获在[`docs/onchain-proof.txt`](docs/onchain-proof.txt)中):
```bash
npm run anchor # 通过Memo写入决策日志根哈希→真正的devnet交易
npm run verify # 在真正的TxLINE Merkle证明上调用Txoracle.validate_stat→真/假
```
例如,一个决策日志根哈希在devnet tx中锚定
[`5kUp4xP3…547qs`](https://explorer.solana.com/tx/5kUp4xP3DfgVHQRCWxa5mRrkfBDc85zRVA9THfjaaqZgHDwJMgf2MHR3u9vfDefE9havtumEuvatpnQUJXQ547qs?cluster=devnet),
以及`validate_stat`返回`true`,用于在链日记账根哈希上检查的真实TxLINE证明。所以实时系统在TypeScript方面是端到端的。可选的~50行Anchor程序位于
[`onchain/`](onchain/),适用于想要专用账户的团队,而不是备忘录;不需要它。
证明确认用于价格或结算后面的数据是真实且未更改的。它并不声称某个决定是最佳的。整个措辞是“防篡改且可独立验证”,而不是“值得信赖”。
## 它如何映射到评审标准
| 评审标准 | 它出现在哪里 |
|---|---|
| 核心功能和数据摄取 | 报价是根据TxLINE赔率和比分SSE的实时/重放数据做出的决定;重新连接和间隙回填;`npm run live` |
| 自主操作 | 一个封闭的循环,没有手动输入,摄取,价格,报价,风险管理,结算 |
| 逻辑和代码架构 | 确定性,事件源,文档齐全,36个测试;一个根据共识校准的模型 |
| 创新和新颖性 | 链上可验证的报价加上测量的已验证事件重新定价(~400毫秒端到端,具有MCP暴露的信号) |
| 生产就绪情况 | 暴露上限,杀伤开关,暂停间隙,真实费用, 回测和可验证的结算,以及一个可用的仪表板 |
## 技术栈
| 层 | 技术 | 用途 |
|---|---|---|
| 代理核心 | TypeScript,无运行时依赖 | 确定性事件源引擎;浏览器和Node中运行 |
| 模型 | 泊松/迪克森-科尔斯 | 比赛过程的公平价值,根据TxLINE共识校准 |
| 网络 | Next.js 15(应用路由器),React 19 | 登陆页面(动画3D足球场)和实时仪表板 |
| 界面 | Tailwind CSS,Framer Motion,Three.js(react-three-fiber) | 动态设计,3D球场英雄,浅色主题 |
| 数据 | TxLINE SSE(赔率+比分) | 实时,粒度比赛数据 |
| 链上 | @solana/web3.js,SPL Memo,TxODDS Txoracle | 验证数据,解决结果,锚定审计轨迹 |
| 加密 | SHA-256 + Merkle树(存储库中) | 包含证明 |
| 互操作性 | 模型上下文协议服务器 | 将代理的信号暴露给其他代理 |
| 测试 | Vitest | 数学,确定性,防御逻辑,结算 |
## 快速入门
所有操作均在无凭证的情况下运行,通过模拟链上锚定进行确定性重放(Merkle 验证本身是真实的)。要上线运行,请先执行 `npm run subscribe`(它会在 `.env.local` 中配置开发网络钱包和 API令牌),然后执行 `npm run live`。
```bash
npm install
npm run dev # 登录页面位于 :3000;"启动应用" 打开仪表盘位于 /app
npm run agent # 无头运行相同的引擎(确定性重放)
npm run subscribe # 一次性:订阅开发网络上的免费世界杯层级并激活令牌
npm run live # 将实时 TxLINE 赔率和比分馈送到引擎中
npm run capture:real # 记录真实的 TxLINE 赔率ticks到 data/real-odds-capture.json
npm run replay:real # 通过引擎重放真实赔率,并进行衡量后的重新定价
npm run anchor # 在开发网络上锚定决策日志根(真实的 Memo 交易)
npm run verify # 通过 Txoracle.validate_stat 验证开发网络上的真实 TxLINE 统计数据
npm run backtest # 500 次模拟比赛
npm run sweep # 延迟套利敏感度曲线
npm run arena # 代理 vs 代理竞技场( standings 锚定在开发网络上)
npm run mcp # MCP 服务器通过 stdio
npm test # 36 项测试
```
500 次模拟比赛的回测结果(可通过 `npm run backtest` 重现):
```
平均利润/比赛 $2,629 盈利比赛 99%
夏普比率(每场比赛) 3.16 最差/最佳比赛 -$1,132 / $4,233
平均佣金/比赛 $668 平均套利预防 $639 / 比赛
重新定价(端到端) ~410 毫秒 引擎热路径 毫秒级(已测量)
```
市场 maker 可能在一场比赛中亏损;价值在于多次比赛的平均值,以及它避免的延迟套利。不能保证利润。
## MCP 工具
服务器通过 stdio 公开代理,以便其他代理可以调用:
`get_fair_value`, `get_quote`, `get_signals`, `get_arb_report`, `verify_decision`,
`run_backtest`, `get_settlement`.
## 测试
```bash
npm test
```
| 套件 | 覆盖范围 |
|---|---|
| `crypto` | SHA-256 针对 NIST 矢量;Merkle 证明验证;检测篡改 |
| `model` | 校准到共识;进球增加胜率;平局随时间增加;红牌效应 |
| `courtsiding` | 当重新定价击败攻击者时,泄漏为零;慢速防御者泄漏 |
| `engine` | 确定性(相同种子 → 相同 Merkle 根和利润和损失);重新定价触发;测量的热路径保持在哈希日志之外;有界暴露;干净结算 |
| `settlement` | 结果映射的谓词;正确的获胜者;收据引用 Txoracle 和证明;信号触发并在模型和市场同意时保持静默 |
## 开发网络地址
| 程序/令牌 | 地址 |
|---|---|
| TxODDS Txoracle(验证 + 解决) | [`6pW64gN1s2uqjHkn1unFeEjAwJkPGHoppGvS715wyP2J`](https://explorer.solana.com/address/6pW64gN1s2uqjHkn1unFeEjAwJkPGHoppGvS715wyP2J?cluster=devnet) |
| SPL Memo(决策日志锚定) | [`MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr`](https://explorer.solana.com/address/MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr?cluster=devnet) |
| TxL 铸造(开发网络) | [`4Zao8ocPhmMgq7PdsYWyxvqySMGx7xb9cMftPMkEokRG`](https://explorer.solana.com/address/4Zao8ocPhmMgq7PdsYWyxvqySMGx7xb9cMftPMkEokRG?cluster=devnet) |
## 使用的 TxLINE 端点
| 端点 | 用途 |
|---|---|
| `POST /auth/guest/start` | guest JWT |
| `POST /api/token/activate` | 在链上订阅后激活 API 令牌 |
| `GET /api/odds/stream` | 去边际共识(`Pct`),公平价值锚点 |
| `GET /api/scores/stream` | 秒级确认进球和红牌 |
| `GET /api/{odds,scores}/updates/{day}/{hour}/{interval}` | 重放和序列间隙回填 |
| `GET /api/scores/stat-validation` | 统计数据及其 Merkle 证明 |
| `Txoracle` `validate_stat` | 确认统计数据/解决结果与链上根 |
## API 反馈
优点:跨市场的规范 JSON 模式,赔率和比分的实时 SSE,以及去边际的 `Pct` 共识,作为公平价值锚点。每个数据都可以通过 Merkle 验证到链上,这使得审计轨迹和结算变得简单,`validate_stat` 可以直接映射到市场结果。
摩擦:文档在 `txline-docs.txodds.com` 上解析,与列表中的链接不同;开发网络基准 URL 可以更清楚地指出;文档化的 SSE 重新连接和序列间隙合约将使集成商不必重新实现它。在免费开发层上,`scores/updates` 窗口对于安静的比赛返回为空,所以实时进球并不总是可用于记录;一个发出运行中比分事件的沙盒比赛将使真实数据测试变得更加容易(这就是为什么 `npm run replay:real` 通过标记的合成进球驱动其重新定价,而不是使用真实的赔率)。
## 项目结构
```
lib/engine/ 确定性代理(纯 TypeScript)
math/ SHA-256,比赛中模型
merkle.ts Merkle 树和包含证明
quote.ts 双边报价 + 跨市场一致性保护
signals.ts 价值 + 夏普预测信号
risk.ts 暴露上限,杀死开关,费用
courtsiding.ts 校准的延迟套利攻击者
engine.ts 事件源编排器
replay.ts 脚本化演示比赛;simulate.ts 生成随机比赛
lib/txline/ 认证,弹性 SSE 客户端,载荷规范化
lib/onchain/ Memo 锚定(solana.ts)和 validate_stat 结算(settlement.ts)
components/ 仪表盘,登录页面,插图,徽标
mcp/ MCP 服务器
scripts/ 代理,订阅(开发网络认证流程),实时,锚定,验证,回测,扫描
tests/ Vitest 套件
onchain/ 可选的 Anchor 程序和注释
sharp-detector/ 独立的 Sharp Movement Detector(Rust 二进制文件,单元测试)
```
## 限制
- 单场比赛的利润和损失变化;市场 maker 有时会下注最终的获胜者。多次比赛的平均值是正的(见回测)。没有保证的利润。
- 在黑客马拉松中没有真正的对手,因此订单流和 courtsider 是模拟的。攻击者是校准的,结果是一条灵敏度曲线,而不是一个单独的数字。
- Merkle 证明保证数据真实性,而不是决策质量。这里的结算解决代理自己的头寸;它不是用户面向的托管。
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器