@bolloon/bolloon-agent 0.4.31 → 0.4.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/agents/chain/chain-config.js +504 -0
  2. package/dist/agents/chain/chain-index-query.js +135 -0
  3. package/dist/agents/chain/chain-indexer.js +1045 -0
  4. package/dist/agents/chain/chain-settlement.js +284 -0
  5. package/dist/agents/chain/chain-state-store.js +245 -0
  6. package/dist/agents/chain/chain-wallet.js +198 -0
  7. package/dist/agents/chain/escrow-client.js +433 -0
  8. package/dist/agents/chain/index.js +20 -0
  9. package/dist/agents/chain/onchain-trade.js +691 -0
  10. package/dist/agents/network-pulse.js +464 -2
  11. package/dist/agents/task/task-onchain-runner.js +284 -0
  12. package/dist/agents/x402/paid-info-store.js +75 -6
  13. package/dist/cli/commands/chain.js +926 -0
  14. package/dist/cli/commands/index.js +10 -2
  15. package/dist/cli/mcp/server.js +4 -1
  16. package/dist/cli/mcp/tools.js +348 -5
  17. package/dist/cli/protocol-envelope.js +12 -0
  18. package/dist/cli-entry.js +5 -0
  19. package/dist/electron-build/agents/chain/chain-config.js +556 -0
  20. package/dist/electron-build/agents/chain/chain-config.js.map +1 -0
  21. package/dist/electron-build/agents/chain/chain-index-query.js +145 -0
  22. package/dist/electron-build/agents/chain/chain-index-query.js.map +1 -0
  23. package/dist/electron-build/agents/chain/chain-indexer.js +1095 -0
  24. package/dist/electron-build/agents/chain/chain-indexer.js.map +1 -0
  25. package/dist/electron-build/agents/chain/chain-settlement.js +291 -0
  26. package/dist/electron-build/agents/chain/chain-settlement.js.map +1 -0
  27. package/dist/electron-build/agents/chain/escrow-client.js +443 -0
  28. package/dist/electron-build/agents/chain/escrow-client.js.map +1 -0
  29. package/dist/electron-build/agents/network-pulse.js +478 -3
  30. package/dist/electron-build/agents/network-pulse.js.map +1 -1
  31. package/dist/electron-build/agents/x402/paid-info-store.js +76 -6
  32. package/dist/electron-build/agents/x402/paid-info-store.js.map +1 -1
  33. package/dist/web/chain-explorer.js +617 -0
  34. package/dist/web/explorer.html +163 -0
  35. package/dist/web/index.html +5 -0
  36. package/dist/web/routes-chain-index.js +108 -0
  37. package/dist/web/routes-onchain-trade.js +99 -0
  38. package/dist/web/server.js +13 -0
  39. package/package.json +2 -1
  40. package/scripts/build-web.ts +20 -1
@@ -0,0 +1,443 @@
1
+ "use strict";
2
+ /**
3
+ * escrow-client.ts — AgentEscrow v2 的链桥客户端 (P3: Bolloon 链桥)
4
+ *
5
+ * 职责 (只有这些, 不做判断):
6
+ * · 用 ethers v6 调 AgentEscrow v2 的 4 个写方法:
7
+ * createEscrowV2 / submitProofV2 / releaseV2 / claimAfterTimeoutV2
8
+ * · 读 escrow 结构 (19 字段) 与链上 hash 复算入口
9
+ * · 听 5 个 v2 事件
10
+ * · 读 receipt / 数确认数 (把"链上到底成没成"的**原始事实**拿出来)
11
+ *
12
+ * 它**不判断**"算不算已结算" —— 那是 chain-settlement.ts 的事。
13
+ * 这样客户端能随便换 provider 做测试, 而判定逻辑只有一份。
14
+ *
15
+ * 两个必须照做的本机坑:
16
+ * ① `new JsonRpcProvider(url, null, { cacheTimeout: -1 })`:
17
+ * ethers v6 默认缓存 eth_getTransactionCount/eth_blockNumber 250ms。
18
+ * 本地链瞬时出块 → 第二笔交易会拿旧 nonce → "nonce has already been used"。
19
+ * 构造入口统一走 `createJsonRpcProvider()`, 不散落在调用方。
20
+ * ② signer / provider **可注入**: 测试要能用假 provider 造重组 / 掉 RPC,
21
+ * 而不能真的去连网。
22
+ */
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.EscrowClient = exports.V2_EVENT_NAMES = exports.AGENT_ESCROW_V2_ABI = exports.ESCROW_STATES = exports.TAG_TASK = void 0;
25
+ exports.computeTaskKeyOffChain = computeTaskKeyOffChain;
26
+ exports.computeLegacyTaskKeyOffChain = computeLegacyTaskKeyOffChain;
27
+ exports.computeResultHashOffChain = computeResultHashOffChain;
28
+ exports.computeProofHashOffChain = computeProofHashOffChain;
29
+ exports.createJsonRpcProvider = createJsonRpcProvider;
30
+ const ethers_1 = require("ethers");
31
+ const chain_config_js_1 = require("./chain-config.js");
32
+ // ── 冻结 hash 口径 (与 AgentEscrow.sol / MODEL_FREEZE.md §4 逐字一致) ─────────
33
+ exports.TAG_TASK = (0, ethers_1.encodeBytes32String)('bolloon.task.v1'); // "bolloon.task.v1" → bytes32
34
+ const ABICODER = ethers_1.AbiCoder.defaultAbiCoder();
35
+ /** taskKey = keccak256(abi.encode(bytes32("bolloon.task.v1"), taskId)) */
36
+ function computeTaskKeyOffChain(taskId) {
37
+ return (0, ethers_1.keccak256)(ABICODER.encode(['bytes32', 'string'], [exports.TAG_TASK, taskId]));
38
+ }
39
+ /** v1 过渡兼容键 = keccak256(utf8(taskId)) */
40
+ function computeLegacyTaskKeyOffChain(taskId) {
41
+ return (0, ethers_1.keccak256)(new TextEncoder().encode(taskId));
42
+ }
43
+ /** resultHash/inputHash/manifestHash = keccak256(utf8("sha256:<hex>")) */
44
+ function computeResultHashOffChain(sha256Digest) {
45
+ return (0, ethers_1.keccak256)(new TextEncoder().encode(String(sha256Digest)));
46
+ }
47
+ /** proofHash = keccak256(abi.encode(bytes32("bolloon.proof.v1"), resultHash, proofVersion)) */
48
+ function computeProofHashOffChain(resultHash, proofVersion) {
49
+ return (0, ethers_1.keccak256)(ABICODER.encode(['bytes32', 'bytes32', 'uint16'], [(0, ethers_1.encodeBytes32String)('bolloon.proof.v1'), resultHash, proofVersion]));
50
+ }
51
+ /** EscrowState 枚举名 (与合约顺序一致) */
52
+ exports.ESCROW_STATES = ['ACTIVE', 'RELEASED', 'DISPUTED', 'REFUNDED'];
53
+ // ── ABI (只嵌 v2 面 + 复算入口 + 5 个 v2 事件; 不改合约, 只是本地 ABI 视图) ────
54
+ exports.AGENT_ESCROW_V2_ABI = [
55
+ // ── 写 ──
56
+ 'function createEscrowV2(bytes32 taskKey, address agent, uint256 amount, address paymentAsset, bytes32 termsHash, bytes32 quoteHash, bytes32 inputHash, bytes32 manifestHash, uint64 deadline, uint32 confirmationWindow, uint16 proofVersion) returns (bytes32)',
57
+ 'function submitProofV2(bytes32 taskKey, bytes32 resultHash, bytes32 manifestHash, uint16 proofVersion) returns (bytes32 proofHash)',
58
+ 'function releaseV2(bytes32 taskKey)',
59
+ 'function claimAfterTimeoutV2(bytes32 taskKey)',
60
+ 'function disputeV2(bytes32 taskKey, bytes32 reasonHash)',
61
+ 'function refundV2(bytes32 taskKey, bytes32 reasonHash)',
62
+ 'function releaseAfterArbitrationV2(bytes32 taskKey)',
63
+ // ── 读 ──
64
+ 'function escrows(bytes32 taskKey) view returns (tuple(address buyer, address agent, uint256 amount, uint8 state, uint256 createdAt, bytes32 proofHash, bytes32 taskKey, bytes32 termsHash, bytes32 quoteHash, bytes32 inputHash, bytes32 resultHash, bytes32 manifestHash, uint256 chainId, uint32 contractVersion, uint64 createdBlock, uint64 deadline, uint32 confirmationWindow, address paymentAsset, uint16 proofVersion))',
65
+ 'function claimableAt(bytes32 taskKey) view returns (uint256)',
66
+ 'function balance() view returns (uint256)',
67
+ 'function token() view returns (address)',
68
+ 'function releaseTimeout() view returns (uint256)',
69
+ 'function CONTRACT_VERSION() view returns (uint32)',
70
+ // P4 追加的只读视图 (与 contracts/deployments/abis/AgentEscrow.json 逐字一致; 只加读, 不改写面)
71
+ 'function expireGrace() view returns (uint256)',
72
+ 'function DEFAULT_EXPIRE_GRACE() view returns (uint256)',
73
+ 'function expireAt(bytes32 taskKey) view returns (uint256)',
74
+ 'function owner() view returns (address)',
75
+ 'function taskIds(uint256 index) view returns (bytes32)',
76
+ // ── 链上复算入口 ──
77
+ 'function computeTaskKey(string taskId) pure returns (bytes32)',
78
+ 'function computeLegacyTaskKey(string taskId) pure returns (bytes32)',
79
+ 'function computeResultHash(string sha256Digest) pure returns (bytes32)',
80
+ 'function computeProofHash(bytes32 resultHash, uint16 proofVersion) pure returns (bytes32)',
81
+ // ── 5 个 v2 事件 ──
82
+ 'event EscrowCreatedV2(bytes32 indexed taskKey, bytes32 indexed quoteHash, address indexed buyer, address agent, address paymentAsset, uint256 amount, uint256 deadline, uint32 confirmationWindow, uint16 proofVersion, uint32 contractVersion)',
83
+ 'event ProofSubmittedV2(bytes32 indexed taskKey, bytes32 resultHash, bytes32 manifestHash, bytes32 proofHash, uint16 proofVersion)',
84
+ 'event ReleasedV2(bytes32 indexed taskKey, address to, uint256 amount, uint8 by)',
85
+ 'event RefundedV2(bytes32 indexed taskKey, address to, uint256 amount, bytes32 reasonHash)',
86
+ 'event DisputedV2(bytes32 indexed taskKey, address by, bytes32 reasonHash)',
87
+ ];
88
+ exports.V2_EVENT_NAMES = ['EscrowCreatedV2', 'ProofSubmittedV2', 'ReleasedV2', 'RefundedV2', 'DisputedV2'];
89
+ /** ★ 唯一的 provider 构造入口 (cacheTimeout: -1 是本机链的硬要求)
90
+ * 注: ethers v6 的 TS 签名把 network 标成 `Networkish | undefined`, 但运行时支持 `null`
91
+ * (部署脚本 scripts/deploy.js 一直这么用)。这里保留 `null` 的运行时语义并显式转型,
92
+ * 不改成本地默认值 —— 本地瞬时出块不缓存 nonce 才是要点。 */
93
+ function createJsonRpcProvider(rpcUrl) {
94
+ return new ethers_1.JsonRpcProvider(rpcUrl, null, { cacheTimeout: -1 });
95
+ }
96
+ class EscrowClient {
97
+ provider;
98
+ escrowAddress;
99
+ confirmations;
100
+ iface;
101
+ chainId;
102
+ injectedSigner;
103
+ constructor(opts = {}) {
104
+ let cfg = opts.config;
105
+ if (!cfg && (opts.rpcUrl || opts.escrowAddress)) {
106
+ // 允许只给部分字段的轻量构造 (测试): 缺的用默认值填, 但地址必须有
107
+ cfg = {
108
+ chainId: chain_config_js_1.LOCAL_DEV_CHAIN_ID, networkName: 'unknown', rpcUrl: opts.rpcUrl || '',
109
+ escrowAddress: opts.escrowAddress || '', tokenAddress: null, tokenDecimals: 6,
110
+ confirmations: opts.confirmations || chain_config_js_1.DEFAULT_CONFIRMATIONS, sources: {},
111
+ };
112
+ }
113
+ if (!cfg)
114
+ cfg = (0, chain_config_js_1.loadChainConfig)();
115
+ if (!cfg.escrowAddress)
116
+ throw new Error('EscrowClient: 缺 escrowAddress (给 config 或 escrowAddress)');
117
+ this.escrowAddress = cfg.escrowAddress;
118
+ this.confirmations = opts.confirmations || cfg.confirmations || chain_config_js_1.DEFAULT_CONFIRMATIONS;
119
+ this.chainId = cfg.chainId || undefined;
120
+ this.iface = new ethers_1.Interface(exports.AGENT_ESCROW_V2_ABI);
121
+ this.injectedSigner = opts.signer;
122
+ if (opts.provider)
123
+ this.provider = opts.provider;
124
+ else if (cfg.rpcUrl)
125
+ this.provider = createJsonRpcProvider(cfg.rpcUrl);
126
+ else
127
+ throw new Error('EscrowClient: 既没注入 provider, 也没给 rpcUrl');
128
+ }
129
+ /** 只读合约 (事件过滤 / 读结构都走它) */
130
+ get readContract() {
131
+ return new ethers_1.Contract(this.escrowAddress, exports.AGENT_ESCROW_V2_ABI, this.provider);
132
+ }
133
+ /** 造一个连着 signer 的合约 (写路径) */
134
+ contractWith(signer) {
135
+ return new ethers_1.Contract(this.escrowAddress, exports.AGENT_ESCROW_V2_ABI, signer);
136
+ }
137
+ /**
138
+ * 本机钱包 signer。私钥只在这里的局部变量里存在一瞬, 不返回给外部。
139
+ * 注: 真正的"允不允许签"由 chain-wallet.ts 的放行闸决定 —— 本方法只负责造对象。
140
+ */
141
+ localSigner(opts = {}) {
142
+ if (this.injectedSigner)
143
+ return this.injectedSigner;
144
+ const { privateKey } = (0, chain_config_js_1.readWalletPrivateKey)({ home: opts.home });
145
+ return new ethers_1.Wallet(privateKey, this.provider);
146
+ }
147
+ // ── 读: escrow 结构 ────────────────────────────────────────────────────────
148
+ normalizeEscrow(raw) {
149
+ const state = Number(raw.state);
150
+ return {
151
+ buyer: raw.buyer,
152
+ agent: raw.agent,
153
+ amount: BigInt(raw.amount),
154
+ state,
155
+ stateName: exports.ESCROW_STATES[state] || 'UNKNOWN',
156
+ createdAt: BigInt(raw.createdAt),
157
+ proofHash: raw.proofHash,
158
+ taskKey: raw.taskKey,
159
+ termsHash: raw.termsHash,
160
+ quoteHash: raw.quoteHash,
161
+ inputHash: raw.inputHash,
162
+ resultHash: raw.resultHash,
163
+ manifestHash: raw.manifestHash,
164
+ chainId: BigInt(raw.chainId),
165
+ contractVersion: Number(raw.contractVersion),
166
+ createdBlock: Number(raw.createdBlock),
167
+ deadline: BigInt(raw.deadline),
168
+ confirmationWindow: Number(raw.confirmationWindow),
169
+ paymentAsset: raw.paymentAsset,
170
+ proofVersion: Number(raw.proofVersion),
171
+ };
172
+ }
173
+ /** 读 escrow; 不存在 (buyer == 0) → null (不假装读到了一条空 escrow) */
174
+ async getEscrow(taskKey) {
175
+ const raw = await this.readContract.escrows(taskKey);
176
+ const e = this.normalizeEscrow(raw);
177
+ if (/^0x0{40}$/i.test(String(e.buyer)))
178
+ return null;
179
+ return e;
180
+ }
181
+ async balance() {
182
+ return BigInt(await this.readContract.balance());
183
+ }
184
+ async tokenAddress() {
185
+ return await this.readContract.token();
186
+ }
187
+ async contractVersion() {
188
+ return Number(await this.readContract.CONTRACT_VERSION());
189
+ }
190
+ async claimableAt(taskKey) {
191
+ return BigInt(await this.readContract.claimableAt(taskKey));
192
+ }
193
+ /** P4: 托管过期宽限期 (秒) 与单条 taskKey 的过期时间 (只读) */
194
+ async expireGrace() {
195
+ return BigInt(await this.readContract.expireGrace());
196
+ }
197
+ async defaultExpireGrace() {
198
+ return BigInt(await this.readContract.DEFAULT_EXPIRE_GRACE());
199
+ }
200
+ async expireAt(taskKey) {
201
+ return BigInt(await this.readContract.expireAt(taskKey));
202
+ }
203
+ async owner() {
204
+ return await this.readContract.owner();
205
+ }
206
+ /** 链上任务数组的第 index 个 taskKey (越界会 revert; 调用方自己 try/catch) */
207
+ async taskIdAt(index) {
208
+ return await this.readContract.taskIds(index);
209
+ }
210
+ async releaseTimeout() {
211
+ return BigInt(await this.readContract.releaseTimeout());
212
+ }
213
+ /** 链上复算入口 (交叉核对口径用; 与本地复算不一致 = 口径漂了) */
214
+ async computeTaskKey(taskId) { return await this.readContract.computeTaskKey(taskId); }
215
+ async computeLegacyTaskKey(taskId) { return await this.readContract.computeLegacyTaskKey(taskId); }
216
+ async computeResultHash(sha256Digest) { return await this.readContract.computeResultHash(sha256Digest); }
217
+ async computeProofHash(resultHash, proofVersion) {
218
+ return await this.readContract.computeProofHash(resultHash, proofVersion);
219
+ }
220
+ // ── 读: receipt / 确认数 ──────────────────────────────────────────────────
221
+ /** 读 receipt; 读不到 (未打包 / RPC 报错) → null。异常原样抛出由调用方区分"没有"和"读不到"。 */
222
+ async getReceipt(txHash) {
223
+ return await this.provider.getTransactionReceipt(txHash);
224
+ }
225
+ async getLatestBlockNumber() {
226
+ return await this.provider.getBlockNumber();
227
+ }
228
+ /**
229
+ * 确认数 = latestBlock - receipt.blockNumber + 1。
230
+ * 读不到 receipt 或 latestBlock → 抛错 (调用方必须如实报"不知道")。
231
+ */
232
+ async confirmationsOf(txHash) {
233
+ const rc = await this.getReceipt(txHash);
234
+ if (!rc)
235
+ throw new Error(`tx 还没上链 (拿不到 receipt): ${txHash}`);
236
+ const latestBlock = await this.getLatestBlockNumber();
237
+ return { confirmations: latestBlock - rc.blockNumber + 1, blockNumber: rc.blockNumber, latestBlock };
238
+ }
239
+ /** 交易被哪个块打包 (重组检测用: 同一个 tx 换块 = 提示) */
240
+ async transactionBlockNumber(txHash) {
241
+ const tx = await this.provider.getTransaction(txHash);
242
+ return tx ? Number(tx.blockNumber) : null;
243
+ }
244
+ // ── 写 (全部返回 TxOutcome; 失败如实报, 不抛成"成功") ──────────────────────
245
+ async send(fn, signer) {
246
+ const c = this.contractWith(signer);
247
+ let tx = null;
248
+ try {
249
+ tx = await fn(c);
250
+ }
251
+ catch (e) {
252
+ // 广播前就失败 (estimateGas / 非白名单) → 没有 txHash, 如实报"没发出去"
253
+ const hash = e?.transaction?.hash || e?.receipt?.hash || '';
254
+ if (!hash) {
255
+ return { txHash: '', blockNumber: null, gasUsed: null, status: null, reverted: false, logs: [], broadcast: false, error: String(e?.shortMessage || e?.reason || e?.message || e).slice(0, 300) };
256
+ }
257
+ // 有 hash: 交易确实发出去了
258
+ const rc = e?.receipt;
259
+ return {
260
+ txHash: hash, blockNumber: rc?.blockNumber ?? null, gasUsed: rc ? rc.gasUsed.toString() : null,
261
+ status: rc ? Number(rc.status) : null, reverted: rc ? Number(rc.status) === 0 : false,
262
+ logs: rc?.logs ?? [], broadcast: true,
263
+ error: String(e?.shortMessage || e?.reason || e?.message || e).slice(0, 300),
264
+ };
265
+ }
266
+ const txHash = tx.hash;
267
+ try {
268
+ const rc = await tx.wait();
269
+ if (!rc) {
270
+ return { txHash, blockNumber: null, gasUsed: null, status: null, reverted: false, logs: [], broadcast: true, error: 'receipt 为空 (还没打包?)' };
271
+ }
272
+ return {
273
+ txHash, blockNumber: rc.blockNumber, gasUsed: rc.gasUsed.toString(),
274
+ status: Number(rc.status), reverted: Number(rc.status) === 0,
275
+ logs: rc.logs ?? [], broadcast: true,
276
+ };
277
+ }
278
+ catch (e) {
279
+ // ethers v6: status 0 时 tx.wait() 会抛, 但 e.receipt 带着真 receipt
280
+ const rc = e?.receipt;
281
+ return {
282
+ txHash, blockNumber: rc?.blockNumber ?? null, gasUsed: rc ? rc.gasUsed.toString() : null,
283
+ status: rc ? Number(rc.status) : null, reverted: rc ? Number(rc.status) === 0 : false,
284
+ logs: rc?.logs ?? [], broadcast: true,
285
+ error: String(e?.shortMessage || e?.reason || e?.message || e).slice(0, 300),
286
+ };
287
+ }
288
+ }
289
+ async createEscrowV2(p, signer) {
290
+ return this.send((c) => c.createEscrowV2(p.taskKey, p.agent, p.amount, p.paymentAsset, p.termsHash, p.quoteHash, p.inputHash, p.manifestHash, p.deadline, p.confirmationWindow, p.proofVersion), signer);
291
+ }
292
+ async submitProofV2(taskKey, resultHash, manifestHash, proofVersion, signer) {
293
+ return this.send((c) => c.submitProofV2(taskKey, resultHash, manifestHash, proofVersion), signer);
294
+ }
295
+ async releaseV2(taskKey, signer) {
296
+ return this.send((c) => c.releaseV2(taskKey), signer);
297
+ }
298
+ async claimAfterTimeoutV2(taskKey, signer) {
299
+ return this.send((c) => c.claimAfterTimeoutV2(taskKey), signer);
300
+ }
301
+ async disputeV2(taskKey, reasonHash, signer) {
302
+ return this.send((c) => c.disputeV2(taskKey, reasonHash), signer);
303
+ }
304
+ /** 静态调用 (不花 gas 地读 revert reason; F2 门槛类断言用) */
305
+ async staticCallClaimAfterTimeout(taskKey, from) {
306
+ try {
307
+ const data = this.iface.encodeFunctionData('claimAfterTimeoutV2', [taskKey]);
308
+ await this.provider.call({ to: this.escrowAddress, from, data });
309
+ return { ok: true };
310
+ }
311
+ catch (e) {
312
+ return { ok: false, reason: e?.reason || e?.shortMessage || String(e?.message || e).slice(0, 200) };
313
+ }
314
+ }
315
+ // ── 5 个 v2 事件监听 ──────────────────────────────────────────────────────
316
+ /** 只认本合约发出的、topic 匹配的日志 (别的合约发出的一律不算) */
317
+ escrowLogsOf(outcome) {
318
+ return (outcome.logs || []).filter((l) => String(l.address).toLowerCase() === this.escrowAddress.toLowerCase());
319
+ }
320
+ /** 把一笔 receipt 的日志里属于本合约的、指定 v2 事件的解码出来 */
321
+ decodeV2Events(outcome, eventName) {
322
+ const out = [];
323
+ for (const log of this.escrowLogsOf(outcome)) {
324
+ let parsed;
325
+ try {
326
+ parsed = this.iface.parseLog({ topics: [...log.topics], data: log.data });
327
+ }
328
+ catch {
329
+ continue;
330
+ }
331
+ if (!parsed)
332
+ continue;
333
+ if (eventName && parsed.name !== eventName)
334
+ continue;
335
+ const args = {};
336
+ parsed.fragment.inputs.forEach((inp, i) => { args[inp.name] = parsed.args[i]; });
337
+ out.push({ name: parsed.name, args, log });
338
+ }
339
+ return out;
340
+ }
341
+ /** 用**我们自己的 Interface** 从原始日志解码 (不依赖 ethers 传参形状) */
342
+ decodeLogArgs(eventName, log) {
343
+ const frag = this.iface.getEvent(eventName);
344
+ if (!frag || !log?.topics)
345
+ return null;
346
+ try {
347
+ const decoded = this.iface.decodeEventLog(frag, log.data, [...log.topics]);
348
+ const args = {};
349
+ frag.inputs.forEach((inp, i) => { args[inp.name] = decoded[i]; });
350
+ return args;
351
+ }
352
+ catch {
353
+ return null;
354
+ }
355
+ }
356
+ /**
357
+ * 监听某个 v2 事件。可给 taskKey 过滤 (链上 indexed 字段, 在回调里核对)。
358
+ * 返回取消订阅函数 —— 调用方必须能干净地摘掉监听 (否则重启会叠加)。
359
+ *
360
+ * 实现说明 (踩过的坑): 把 `contract.filters.X(...)` 这种 Filter 对象交给
361
+ * `contract.on()` 时, ethers v6 会把 fragment 解析成 null, 于是回调只收到一个
362
+ * ContractEventPayload (位置参数全空)。所以这里用**事件名字符串**注册, 自己按
363
+ * topic0/taskKey 过滤, 并从原始 log 用本地 Interface 解码 —— 参数形状永远一致。
364
+ */
365
+ onV2Event(eventName, handler, filter) {
366
+ const contract = this.readContract;
367
+ const frag = this.iface.getEvent(eventName);
368
+ if (!frag)
369
+ throw new Error(`AgentEscrow ABI 里没有事件 ${eventName}`);
370
+ const topic0 = String(frag.topicHash).toLowerCase();
371
+ const wantKey = filter?.taskKey ? String(filter.taskKey).toLowerCase() : null;
372
+ const selfAddr = this.escrowAddress.toLowerCase();
373
+ const listener = (...a) => {
374
+ const payload = a[a.length - 1];
375
+ const log = payload?.log ?? (payload?.topics ? payload : undefined);
376
+ // 只认本合约 + 本事件 topic0 (别的合约/别的事件一律不算)
377
+ if (log?.address && String(log.address).toLowerCase() !== selfAddr)
378
+ return;
379
+ if (log?.topics?.[0] && String(log.topics[0]).toLowerCase() !== topic0)
380
+ return;
381
+ // taskKey 过滤 (indexed topic1)
382
+ if (wantKey && log?.topics?.[1] && String(log.topics[1]).toLowerCase() !== wantKey)
383
+ return;
384
+ let args = log ? this.decodeLogArgs(eventName, log) : null;
385
+ if (!args) {
386
+ args = {};
387
+ frag.inputs.forEach((inp, i) => { args[inp.name] = a[i]; });
388
+ if (wantKey && String(args.taskKey || '').toLowerCase() !== wantKey)
389
+ return;
390
+ }
391
+ try {
392
+ handler(args, log);
393
+ }
394
+ catch { /* 监听回调不许炸主流程 */ }
395
+ };
396
+ contract.on(eventName, listener); // ethers v6: 返回 Promise, 订阅失败不抛同步异常
397
+ const swallow = (r) => { if (r && typeof r.catch === 'function')
398
+ r.catch(() => { }); };
399
+ return () => { try {
400
+ swallow(contract.off(eventName, listener));
401
+ }
402
+ catch { /* 已摘 */ } };
403
+ }
404
+ onEscrowCreatedV2(h, f) { return this.onV2Event('EscrowCreatedV2', h, f); }
405
+ onProofSubmittedV2(h, f) { return this.onV2Event('ProofSubmittedV2', h, f); }
406
+ onReleasedV2(h, f) { return this.onV2Event('ReleasedV2', h, f); }
407
+ onRefundedV2(h, f) { return this.onV2Event('RefundedV2', h, f); }
408
+ onDisputedV2(h, f) { return this.onV2Event('DisputedV2', h, f); }
409
+ /** 等某个 v2 事件出现 (真等链上, 不猜); 超时 → 明确报超时, 不假装收到 */
410
+ waitForV2Event(eventName, opts = {}) {
411
+ const timeoutMs = opts.timeoutMs ?? 60_000;
412
+ return new Promise((resolve) => {
413
+ let done = false;
414
+ const off = this.onV2Event(eventName, (args, raw) => {
415
+ if (done)
416
+ return;
417
+ if (opts.predicate && !opts.predicate(args))
418
+ return;
419
+ done = true;
420
+ off();
421
+ clearTimeout(timer);
422
+ resolve({ args, raw });
423
+ }, { taskKey: opts.taskKey });
424
+ const timer = setTimeout(() => { if (done)
425
+ return; done = true; off(); resolve(null); }, timeoutMs);
426
+ });
427
+ }
428
+ /** 摘掉所有监听 (重启/收尾用) */
429
+ removeAllListeners() {
430
+ const swallow = (r) => { if (r && typeof r.catch === 'function')
431
+ r.catch(() => { }); };
432
+ try {
433
+ swallow(this.readContract.removeAllListeners());
434
+ }
435
+ catch { /* noop */ }
436
+ try {
437
+ swallow(this.provider.removeAllListeners?.());
438
+ }
439
+ catch { /* noop */ }
440
+ }
441
+ }
442
+ exports.EscrowClient = EscrowClient;
443
+ //# sourceMappingURL=escrow-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escrow-client.js","sourceRoot":"","sources":["../../../../src/agents/chain/escrow-client.ts"],"names":[],"mappings":"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"}