结算域(AVIP-SET)
AVIP 结算的规范说明 —— 资金托管、提交清单、超时自助退款与争议裁决。
结算域 —— AVIP-SET
结算域管的是价值如何在合约控制下移动。资金由链上合约持有,任何单一方 —— 包括平台 operator —— 都无法在本域所述规则之外把它取走。存在两种托管模型(每个子协议一种),外加一个超时逃生口和一条链上争议路径。
| 组件 | 编码 | 用途 |
|---|---|---|
| 托管 Escrow | AVIP-SET-ESC | Agent 对 Agent 工作的双边托管 |
| 提交清单 | AVIP-SET-CHK | Agent 对 Business 支付的逐格门控资金流 |
| 超时自助退款 | AVIP-SET-EXP | 截止后无需许可的退款 |
| 争议裁决 | AVIP-SET-DSP | 链上仲裁,资金移动原子完成 |
AVIP-SET-ESC —— 托管 Escrow
Purpose
EscrowManager 合约在 requester 与 executor 之间托管 ERC-20 资金(通常是 USDC),只在证明验证通过后放款,或在失败、过期、争议时退款。
Normative Requirements
- 创建 escrow MUST 要求一个有效的 operator 签名,绑定 orderId、双方、token、金额、手续费和 nonce。
- 每个 nonce MUST 只能消费一次(防重放)。
- 放款 MUST 先对 AnchorRegistry 验证执行证明,再分发资金。
- 任何一方 —— requester、executor 或 operator —— 都 MUST NOT 能在放款 / 退款 / 争议 / 过期路径之外单方移动资金。
- 截止之后,退款 MUST 可被无许可调用(
refundExpired)。
Data Structures
Escrow 记录
| 字段 | 类型 | 说明 |
|---|---|---|
requester | address | 锁仓方 |
executor | address | 成功时收款方 |
token | address | ERC-20 token(如 USDC) |
amount | uint256 | 锁定总额(含平台手续费) |
platformFee | uint256 | 预留给平台的部分 |
proofHash | bytes32 | 放款时写入;链向 AnchorRegistry |
status | Status | 当前状态 |
createdAt | uint256 | 创建区块时间戳 |
deadline | uint256 | createdAt + 7 天 |
Status 枚举
| 值 | 数字 | 含义 |
|---|---|---|
| None | 0 | 不存在 |
| Funded | 1 | 资金已锁,任务进行中 |
| Frozen | 2 | 已起争议,资金冻结 |
| Released | 3 | 已分发(终止) |
| Refunded | 4 | 已退回 requester(终止) |
State Machine
Error Conditions
| 条件 | 结果 |
|---|---|
| operator 签名无效 / 重复使用 | createEscrow revert |
| 未锚定证明就放款 | release revert |
| 非 operator 在截止前退款 | revert |
On-Chain Mapping
| 函数 | 访问 |
|---|---|
createEscrow(orderId, executor, token, amount, fee, nonce, sig) | 任何持有效 operator 签名者 |
release(orderId, proofHash) | 仅 operator(验证 anchor) |
refund(orderId) | operator 或 DisputeController |
refundExpired(orderId) | 任何人,截止之后 |
freeze(orderId) | operator 或 DisputeController |
splitRelease(orderId, requesterShare, deductFee) | operator 或 DisputeController |
Events:EscrowCreated、EscrowReleased、EscrowRefunded、EscrowFrozen。完整接口见 Pro File · 智能合约。
AVIP-SET-CHK —— 提交清单
Purpose
A2BOrderGateway 合约为 Agent 对 Business 支付强制一个固定有序的资金格序列。只有前面每个格都按序填满,商户才可能被付款。
Normative Requirements
- 合约 MUST 拒绝任何不按格序的迁移。
- 在存在一张金额 ≤ 充值的已提交 invoice 之前,资金 MUST NOT 到达商户。
- 支付交易 MUST 由已提交 invoice 的字段构造,使任何一方都无法替换目的地或金额。
State Machine
终止状态
| 格 | 达到条件 |
|---|---|
DELIVERED | 商户交付确认;审计 root 已锚定 |
FAILED | 商户报告失败;资金路径重新开放退款 |
EXPIRED | 截止已过未完成;expireOrder 被调用 |
On-Chain Mapping
| 迁移 | Anchor key | 数据 |
|---|---|---|
createOrder | intentHash | 意图哈希 + 用户 SA + max + deadline |
depositOrder | intentHash | 充值金额(USDC) |
commitInvoice | intentHash | 商户地址 + 金额 + 选择哈希 + invoice 哈希 |
executePayment | intentHash | 审计 root(全部 ActionTrace 的 Merkle root) |
confirmDelivery | intentHash | 交付哈希 + 成功标志 |
AVIP-SET-EXP —— 超时自助退款
Purpose
通用逃生口:订单截止后,任何人都能触发退回用户,完全不依赖平台、Agent 或商户在线。
Normative Requirements
A2BOrderGateway.expireOrder(intentHash)MUST 可被任何人调用。- 合约 MUST 在动作前校验
block.timestamp > deadline。 - 过期时,被充值的资金 MUST 转回用户智能账户(
userSA)。
语义
expireOrder(intentHash):
require block.timestamp > deadline
order.status = EXPIRED
transfer(deposit) → userSA托管模型里由 refundExpired(AVIP-SET-ESC)提供同样的活性。只要世界上还有一个 EVM 兼容节点,用户就能取回资金 —— 这就是协议层"抗跑路"的含义。
AVIP-SET-DSP —— 争议裁决
Purpose
DisputeController 冻结被争议的 escrow,从双方收集证据哈希,并通过指挥 EscrowManager 执行仲裁人的裁决 —— 全程在链上,使裁决与其资金移动原子完成。
Normative Requirements
- 开启争议 MUST 立即冻结 escrow(
AVIP-SET-ESC→ Frozen)。 - 只有获授权的仲裁人 MUST 能
resolve争议。 - 若仲裁人在
DISPUTE_TIMEOUT(7 天)内未裁决,任何人 MUST 能调用resolveExpired退回 requester(失败安全)。 - 一次裁决 MUST 在单笔交易内记录决定并分发资金。
Data Structures
争议记录
| 字段 | 类型 | 说明 |
|---|---|---|
orderId | bytes32 | 被争议的 escrow |
initiator | address | 开启争议方 |
initiatorEvidence | bytes32 | 发起方证据哈希 |
respondentEvidence | bytes32 | 应答方证据哈希 |
status | DisputeStatus | None / Open / Resolved |
decision | Decision | 结果 |
openedAt | uint256 | 提交时间 |
resolvedAt | uint256 | 裁决时间 |
Decision 枚举
| 值 | 资金分配 |
|---|---|
| RequesterWins | 100% 给 requester,不扣手续费 |
| ExecutorWins | 100% 给 executor,扣手续费 |
| Split | 五五分,从 executor 份额扣手续费 |
| Cancelled(超时) | 100% 退回 requester |
证据以哈希(bytes32)存储,内容在链下。这样 gas 低,也避免把可能敏感的争议细节发到公链。
State Machine
On-Chain Mapping
| 裁决 | EscrowManager 调用 |
|---|---|
| RequesterWins | splitRelease(orderId, fullAmount, false) |
| ExecutorWins | splitRelease(orderId, 0, true) |
| Split | splitRelease(orderId, amount/2, true) |
| Cancelled(超时) | refund(orderId) |
Events:DisputeOpened、EvidenceSubmitted、DisputeResolved。完整接口见 Pro File · 智能合约。