
# coincoin
**一个基于 EIP-7702 的链上防火墙,它能检测到实时的漏洞利用,并在非原子性攻击留下的反应窗口期内,将您的资金——包括已存入 DeFi 的头寸——撤离到您控制的保险库中。**
[](https://coincoin-five.vercel.app/)
[-7af7c0?style=flat-square)](#deployed-addresses)
[](contracts/)
[](https://github.com/gamween/coincoin/actions/workflows/ci.yml)
[](LICENSE)
coincoin 是一个面向 EOA 的、由开发者运行的守护者——它包含一个 CLI 监控 daemon 以及一组 EIP-7702 合约。它针对的是一种特定的、技术性的故障模式:在非原子性漏洞利用期间,钱包的密钥已被窃取但资金尚未被完全转移,且用户端在此期间没有任何应对操作的窗口期。这是其刻意设计的专攻领域。
## 目录
- [问题所在](#the-problem)
- [工作原理](#how-it-works)
- [架构](#architecture)
- [已上线功能 vs. 路线图](#whats-live-vs-roadmap)
- [技术栈](#tech-stack)
- [仓库结构](#repository-structure)
- [快速入门](#getting-started)
- [已部署地址](#deployed-addresses)
- [安全与信任模型](#security--trust-model)
- [测试](#testing)
- [Buildathon](#buildathon)
- [License](#license)
## 问题所在
如今的钱包安全几乎完全处于*签名前*阶段:模拟交易、标记恶意签名、撤销过期的授权。一旦密钥泄露,这些机制都无济于事,而且它们也无法触及已经提供给协议的资金。有两个事实定义了这一盲区:
- **Drainer 转向了签名后和链上。** 在 2025 年,钱包 drainer 和钓鱼攻击从 **106,106 名受害者手中窃取了 8385 万美元**([Scam Sniffer](https://www.scamsniffer.io/))。攻击者现在将 **EIP-7702 本身**武器化——超过 90% 的链上 7702 委托是掠夺者,会在下一次转入时将资产洗劫一空。
- **大多数协议漏洞利用是非原子性的。** 从第一笔恶意交易到资金被彻底抽干,间隔大约在 **4 分钟到 5 天**不等(Defimon)。这个间隔就是一个*响应窗口*——而在用户端,没有任何东西会在其中做出反应。
签名前工具(如 Blockaid、Revoke.cash)在其生命周期中所处的节点对此无能为力。Harpie 是最接近的现有技术——提供密钥泄露后的保护——但它只能与攻击者进行脆弱的抢跑竞争,且从未覆盖过已质押的头寸,最终在 2025 年停止运营。
coincoin 通过 **EIP-7702**(一种在 Harpie 之后出现的原语)在账户层面进行强制执行,并将 **DeFi 头寸视为一等公民**,从而填补了这一空白:这些资产因为不存放在钱包中而被大多数保护工具所忽略。
## 工作原理
分为四个部分。核心产品是监控 daemon 和合约;没有强制要求的 UI。
1. **委托(一次性)。** EOA 签署一份指向 `GuardianModule` 的 EIP-7702 授权,并在同一笔交易中调用 `configure()` 来设置其策略:一个**冻结的**安全保险库(只能设置一次——泄露的密钥无法重新指向它)以及一个授权的 **keeper** 集合。策略也可以通过中继器提交的 **EIP-712 签名**来安装(`configureWithSig`)——这为 `/app` 仪表板中的**一键式、无 gas 引导**提供了支持(钱包只需签名;由中继器支付费用)。
2. **监控。** 一个 TypeScript/viem daemon(`ChainThreatSource`)直接从链上轮询受监控协议的 `Drained` 日志——无需第三方数据源,也不依赖 websocket。它会在有界的 `getLogs` 窗口内更新至最新区块。
3. **响应。** 在验证威胁后,**keeper**(在加密学上被限制为只能执行两项操作)会调用 `exitAaveV3()` 将存入的头寸解除并退回账户,然后调用 `evacuateERC20()` 将所有 token 清算转入安全保险库。
4. **防火墙(主动防御)。** 通过 `execute()` 路由的调用会由无状态的 `RulesEngineV1` 进行评分;针对不受信任的调用方发起的无限额 `approve` / `increaseAllowance` / EIP-2612 `permit` / 一揽子 `setApprovalForAll` 操作,会在落地之前在账户层面直接回滚。
## 架构
```
on-chain Drained log
─────────────────────────▶ ┌───────────────────────────────┐
│ watcher (ChainThreatSource) │ TS / viem daemon
│ polls getLogs · zero deps │
└───────────────┬───────────────┘
│ threat alert
▼
your EOA ──EIP-7702──▶ GuardianModule ┌───────────────────────────────┐
(delegate + configure) │ keeper (bounded) │ can ONLY:
│ 1. exitAaveV3() unwind DeFi │
│ 2. evacuateERC20() sweep │
└───────────────┬───────────────┘
▼
┌───────────────────────────────┐
│ SafeVault (owner-only) │
└───────────────────────────────┘
proactive: EOA.execute(to, value, data) ─▶ RulesEngineV1.score() ─▶ revert if risk ≥ threshold
```
- **`GuardianModule`** —— EIP-7702 委托合约。持有策略(冻结的保险库、keeper 集合、签名策略的 nonce)、清算/退出逻辑以及防火墙钩子。状态保存在每个受保护的 EOA 中,而不是保存在实现地址中。
- **`SafeVault`** —— 仅限所有者提款的接收目的地,为每个用户单独部署。
- **`RulesEngineV1`** —— 防火墙调用的无状态风险评分器;设计为可替换(Stylus 已在路线图上)。
- **watcher** —— 链下操作者:检测源、风险敞口注册表、keeper 客户端和编排器,具有端到端的运行器。
## 已上线功能 vs. 路线图
除非另有说明,均在 **Robinhood Chain 测试网 (链 46630)** 上部署并进行了测试验证。
| 状态 | 功能 |
|---|---|
| ✅ | EIP-7702 委托 + 自配置 · ERC-20 清算 · 撤销授权 |
| ✅ | 冻结的保险库 · 签名的多 keeper 策略 (EIP-712 `configureWithSig`) |
| ✅ | **浏览器内无 gas 引导** —— 钱包进行签名(EIP-712 策略 + EIP-7702 授权);中继器 (`site/api`) 部署用户的确定性 `SafeVaultFactory` 保险库,并赞助委托+配置交易(用户零 gas 费用) |
| ✅ | 本地防火墙 (`RulesEngineV1`) —— 无限额授权 / `permit` / `setApprovalForAll` 规则 |
| ✅ | 真实的链上检测 → 救援循环,已进行端到端运行(静止资金**以及**已存入的 DeFi 头寸在一个 keeper 驱动的序列中成功获救) |
| ✅ | DeFi 退出引擎 (`exitAaveV3`) —— 已构建并通过 Arbitrum One 分叉测试,针对**真实的 Aave V3 Pool** 进行了验证 |
| 🛣️ | **原生 Aave V3 集成** —— 已构建并准备就绪;将在 Aave V3 部署到 Robinhood Chain 的当天上线。等待的是可用性,而不是代码。 |
| 🛣️ | **GMX V2 头寸退出** —— 相同的模式,一旦 GMX 在目标链上可用即生效 |
| 🛣️ | 更广泛的防火墙覆盖范围 —— Permit2、multicall、直接转账启发式检测 |
| 🛣️ | 策略资产/协议范围界定 · Stylus 规则引擎 · 安全审计 |
## 技术栈
| 层级 | 技术栈 |
|---|---|
| 合约 | Solidity 0.8.24、Foundry、OpenZeppelin、EIP-7702、EIP-712 |
| 监控器 | TypeScript、viem、Vitest |
| 链 | Arbitrum Orbit (Robinhood Chain 测试网),通过 Alchemy 进行 RPC 调用 |
| 前端 | React 19、Vite、Tailwind(落地页 + `/app` 仪表板) |
## 仓库结构
```
coincoin/
├── contracts/ Foundry — GuardianModule (EIP-7702), RulesEngineV1, SafeVault(+Factory), mocks, scripts
├── watcher/ TypeScript/viem detection → rescue daemon (onboard · watch · exploit · revoke)
├── site/ Vite/React/Tailwind landing + /app dashboard + api/ (gasless onboarding relayer)
├── deployments/ On-chain address records (robinhood-testnet.json, arbitrum-sepolia.json)
├── docs/readme/ README images
├── video/ Remotion pitch + demo videos (code → MP4)
├── .env.example Config template (RPC, disposable keys, demo addresses)
└── LICENSE MIT
```
## 快速入门
在 Robinhood Chain 测试网上复现检测 → 撤离循环。
**前置条件:** [Foundry](https://getfoundry.sh)、Node ≥ 22、[pnpm](https://pnpm.io)、一个有测试币余额的钱包。
```
git clone --recursive https://github.com/gamween/coincoin.git # --recursive pulls Foundry deps (submodules)
cd coincoin
cp .env.example .env # RPC + disposable testnet keys — see .env.example
# contracts: 构建 + 测试(已经非递归克隆过了?运行:git submodule update --init --recursive)
cd contracts && forge test # set ARBITRUM_ONE_RPC to also run the live-Aave fork test
# deployment runbook: watcher/README.md → Deployment
# watcher: 产品(在每个步骤各自的终端中运行)
cd ../watcher && pnpm install
pnpm onboard # one-time: EIP-7702 delegation + policy config
pnpm watch # the guardian, watching real on-chain logs
pnpm exploit # (separate terminal) replay an exploit → real Drained log
# → watch detects it and evacuates to the vault
pnpm revoke # remove the delegation in one tx
```
## 已部署地址
Robinhood Chain 测试网(链 `46630`)—— [浏览器](https://explorer.testnet.chain.robinhood.com/)。完整记录:[`deployments/robinhood-testnet.json`](deployments/robinhood-testnet.json)。
| 合约 | 地址 |
|---|---|
| `GuardianModule` (EIP-7702 守护者) | [`0x9953BB30cFef2ac842C74417eA6DC661b492E8dA`](https://explorer.testnet.chain.robinhood.com/address/0x9953BB30cFef2ac842C74417eA6DC661b492E8dA) |
| `RulesEngineV1` (防火墙) | [`0xc20A9d7D38B07a9C74A1fD87A2e25CA1973Cbc52`](https://explorer.testnet.chain.robinhood.com/address/0xc20A9d7D38B07a9C74A1fD87A2e25CA1973Cbc52) |
| `SafeVaultFactory` (确定性用户专属保险库) | [`0x1ef2B2539fa842A9c7e4EA07790aA6dBc47ec4A5`](https://explorer.testnet.chain.robinhood.com/address/0x1ef2B2539fa842A9c7e4EA07790aA6dBc47ec4A5) |
| `SafeVault` (演示) | [`0x530921CFFCeCc01B3Ad20E48A8c1707d27204b91`](https://explorer.testnet.chain.robinhood.com/address/0x530921CFFCeCc01B3Ad20E48A8c1707d27204b91) |
`GuardianModule` 最初也在 Arbitrum Sepolia 上进行了部署和 **Arbiscan 验证**,地址为 [`0x6671…200F`](https://sepolia.arbiscan.io/address/0x6671b4B73b79c284A710B00ef777d8E65f55200F)。
## 安全与信任模型
在设计上是非托管的,但属于**实验性且未经过审计**——这是一个部署在测试网上的研究原型。
**信任假设**
- 所有者保留其密钥;守护者是一个委托合约,而不是托管方。
- 安全保险库在首次配置后被**冻结**——泄露的密钥无法将资金重定向到其他地方。
- keeper 是**受限的**:它只能触发向已注册保险库的撤离并撤销授权。轮换 keeper 集合会撤销前一代 keeper 的权限;泄露的 keeper 密钥无法更改策略。
- 该委托**可在单笔交易中撤销**。
**已知限制**
- 防火墙仅保护通过 `execute()` 路由的调用,并且仅涵盖四种授权向量——暂不支持 Permit2、multicall 或直接转账(尚未支持——见路线图)。
- 策略资产/协议范围界定尚未实现。
- 原生 Aave V3 / GMX V2 集成已构建并验证,但需等待这些协议在 coincoin 运行的链上部署。
**负责任的披露:** 在提交公开 issue 之前,请通过 [X (@dvb_fianso)](https://x.com/dvb_fianso) 或 [Telegram](https://t.me/dvb_fianso) 私下报告问题。
## 测试
95 个测试,采用测试优先原则编写。
```
cd contracts && forge test # 69 unit/integration tests (+1 fork test, gated on ARBITRUM_ONE_RPC)
ARBITRUM_ONE_RPC=
forge test # includes AaveRealFork.t.sol against the live Aave V3 Pool
cd ../watcher && pnpm test # 25 watcher tests (vitest)
```
`AaveRealFork.t.sol` 针对 **Arbitrum One 上的真实 Aave V3 Pool**(分叉)进行真实头寸的退出——这与守护者运行的代码路径完全相同。监控器测试套件涵盖了警报 schema、风险敞口注册表、keeper 客户端以及端到端编排器。无 gas 引导路径已通过测试网上的 `pnpm onboard:gasless` 完成了端到端验证(一个全新的、无余额的 EOA 进行签名;由中继器赞助委托+配置交易)。
## Buildathon
为 **[Arbitrum Open House London](https://arbitrum-london.hackquest.io/)** 构建——由 Arbitrum Foundation 主办的项目。在线 Buildathon 于 2026 年 5 月 25 日至 6 月 14 日举行(由 HackQuest 提供支持);coincoin 目标是参与 **Robinhood Chain** 赛道。使用的赞助商技术:Robinhood Chain、Alchemy、OpenZeppelin。公开构建日志:[@dvb_fianso](https://x.com/dvb_fianso)。
## License
[MIT](LICENSE) © 2026 coincoin
为 Arbitrum Open House London 2026 构建 · Robinhood Chain 赛道