# Payclaw
> Agent-native payment system on Monad — 让 AI Agent 在用户设定的安全边界内自主完成链上 USDC 支付。
**Monad Blitz 杭州 · Agentic Payment**
---
## 是什么
AgentPay 让 AI Agent 通过 MCP 工具发起链上支付,经由链下 Policy Engine 和链上 Session Key 双重约束执行。每笔支付:
- **可追溯** — SQLite 审计日志 + 链上 `tx_hash` 锚点
- **可拦截** — Telegram 人机协同审批(超过阈值自动触发)
- **可撤销** — 一笔链上交易立即停掉 Session Key
- **x402 原生** — 遇到付费 API 的 402 响应自动完成支付并重试
---
## 目录结构
```
monad_agent_payment/
├── contracts/ # Foundry 合约项目
│ ├── src/
│ │ ├── AgentVault.sol # 私有金库:资产托管 + Session Key 权限 + 受限执行
│ │ └── VaultFactory.sol # 工厂合约:一键为用户部署独立金库
│ ├── test/
│ │ └── AgentVault.t.sol # 15 个测试用例(签名验证 / 额度 / 权限)
│ └── script/
│ └── Deploy.s.sol # 部署脚本:Factory + Vault
├── mcp-server/ # MCP Control Center(核心交付物)
│ └── src/
│ ├── index.ts # 6 个 MCP 工具入口
│ ├── tools.ts # 工具 schema 定义
│ ├── glue.ts # x402 胶水:拦截 402 → 自动支付 → 重试
│ └── kernel/ # 链下核心逻辑(内嵌)
│ ├── session-key.ts # Session Key 生成 / 本地存储 / 链上签名
│ ├── policy-engine.ts # Policy 校验(额度 / 白名单 / 黑名单)
│ ├── audit.ts # SQLite 审计日志
│ ├── approval.ts # Telegram / Mock 审批路由
│ └── types.ts # 共享类型
├── demo/ # Demo 用付费 API(3 个端点,返回 402)
├── frontend/ # H5 Action Center(部署金库 / 授权 Session Key)[WIP]
└── docs/
```
---
## 业务流程
```
用户说"调研 $MONAD"
│
▼
MCP research_token
│── 请求付费 API
│── 收到 402(含价格 + 收款地址)
│── Policy Check → Telegram 审批(如超阈值)
│── Session Key 签名 → AgentVault.execute()
│── Monad 链验签 + 转账 USDC
└── 携带 tx_hash 重试 API → 返回数据
│
▼
Agent 回答:"调研完成,已自动支付 0.50 USDC 审计费。"
```
---
## MCP 工具列表
| 工具 | 作用 |
|---|---|
| `init_session` | 生成 Session Key,返回公钥地址供链上注册 |
| `request_permission` | 任务开始前声明预算和允许收款方 |
| `request_payment` | 直接发起 USDC 支付(含 Policy 校验 + 链上执行) |
| `research_token` | 调研代币,自动处理 x402 付费 API 全流程 |
| `check_budget` | 查询今日 / 本周剩余额度 |
| `list_payments` | 查询支付历史 |
---
## 快速开始
### 1. 安装依赖
```bash
pnpm install
```
### 2. 配置环境变量
```bash
cp .env.example .env
# 填入:MONAD_RPC_URL / OWNER_PRIVATE_KEY / USDC_ADDRESS
# 可选:TELEGRAM_BOT_TOKEN / TELEGRAM_CHAT_ID(启用人工审批)
```
### 3. 部署合约
```bash
cd contracts
forge build
forge test # 16 个测试全部通过后再部署
# 部署到 Monad testnet(必须加 --legacy)
forge script script/Deploy.s.sol \
--rpc-url $MONAD_RPC_URL \
--broadcast --legacy
```
部署完成后将 `VaultFactory` 地址填入 `.env`:
```bash
VAULT_FACTORY_ADDRESS=0x...
VAULT_ADDRESS=0x... # 你自己的 AgentVault 地址
```
### 4. 初始化 Session Key
在 Claude Code / Cline 等 AI Agent 中调用:
```
init_session
```
将返回的公钥地址注册到你的 AgentVault:
```solidity
vault.registerSession(
"0x<session_key_address>",
5_000_000, // 5 USDC / tx
20_000_000, // 20 USDC / day
2592000 // 30 days
)
```
### 5. 启动服务
```bash
# Mock 付费 API(Demo 用)
pnpm --filter @agentpay/mock-x402 dev
# MCP Server
pnpm --filter @agentpay/mcp-server dev
# 合约测试
cd contracts && forge test -vv
```
---
## 架构
| 层 | 组件 | 职责 |
|---|---|---|
| 合约层 | `VaultFactory` + `AgentVault` | 一户一仓;Session Key 权限隔离;链上执行 |
| Kernel | Policy Engine + Session Key | 链下策略校验;ECDSA 签名 |
| MCP Server | 6 个工具 + x402 glue | Agent 接口;x402 协议支持 |
| 前端 | React + wagmi | 金库部署 / Session Key 授权 |
---
## 安全边界
- **私钥不出进程**:Session Key 私钥加密存储在 `~/.agentpay/session.key`(mode 0600)
- **双重限额**:单笔上限 + 每日上限,在合约层强制执行
- **Session 有效期**:过期自动失效,无需链上交互
- **紧急停止**:`revokeSession()` 一笔交易立即生效
- **签名绑定合约**:签名包含 `chainId` + `vault address`,防止跨链/跨合约重放
---
## License
MIT