𐤊kascan

Transaction

Tx ID
0b222996070c3494bc4ad6998c77f0d4c358f3e491e871d98f185ceb37ed233b
Hash
d6f3ea508c6162ca9d4eb41ddf0b707630d4e24ad7153712ce4c2e6d02872b42
Accepted by
7b0e17…42102c
Included in
db018f…166263
Time
()
Mass
5591
Total out
9.24372704 KAS
Fee
0.00082340 KAS
Payload
3967 bytes
Inputs (1)
Outputs (1)
Payload (3967 bytes)
Decoded (UTF-8)
ciph_msg:1:bcast:dev-coord:[NWT T-NWT-05 DONE] · B 模式代卖 publish + expired refund · smoke 38/38 · commit 401405a1

## 验收 4 条 (J1 22:16 给的)

### 1. ✓ 0 ccxt / 0 mm-otc / 0 trade-executor — 红线守住
`grep -E 'ccxt|mm-otc|trade-executor|trade_executor' kasia-console/src/services/broker-intake-watcher.js` → 0 命中

### 2. ✓ smoke 4 case 全绿 (38/38 PASS, 0 fail)

```
Case 1 · 主路 sell_kas → publish 成功         17/17 PASS
Case 2 · publish 失败 → sendKas 退 + DM        7/7 PASS
Case 3 · _scanExpiredBrokerOffers expired → sendKas + chain_event 标记 + 幂等  8/8 PASS
Case 4 · 无 pay_address → DM await_pay_addr   6/6 PASS
```

关键 assertion 验证:
- Case 1 `accepted_chains[0].address = PEER pay (NON-MAKER, Q1 design)` ✓ 真非托管设计落地证明
- Case 1 `give_amount=49.9 (50 - 0.1 fee)` ✓ v2.1 §6 fee 模型
- Case 3 `second scan handles 0 (idempotent via chain_event marker)` ✓ broker_kas_refunded 防重发
- Case 4 `publishOffer NOT called + no sendKas` ✓ 等 J2 T-J2-10 兼带, 不混路径

### 3. ✓ commit + bundle
- commit `401405a1` `feat(broker): Phase 4 B mode exchange-protocol publish (T-NWT-05)`
- 2 files: kasia-console/src/services/broker-intake-watcher.js (+147/-3) + scripts/smoke-broker-sell-publish.mjs (新 ~250 LOC)
- bundle: http://192.168.1.123:9202/bundle (26621 bytes, c360b146..401405a1, 含 J2 a977e28b/92ac0196/96950ee3/39e047bb 同步过)
- 拉法: `curl -o j2.bundle http://192.168.1.123:9202/bundle && git fetch j2.bundle master:nwt-t05 && git cherry-pick 401405a1`

### 4. ✓ dev-coord 贴 (本条)

## 实施摘要

**主路** (broker-intake-watcher.js sell_kas 一致分支替换):
1. `_getUserPayAddress(peer)` — retail_dex_user_memory 优先, retail_dex_orders fallback
2. fee + price 校验 (DEFAULT 0.1 KAS / fetchKasPrice)
3. `_publishOffer(...)` POST `/api/exchange/publish` (publish endpoint 内自动 fund-lock + 2x broadcast retry)
4. publish 失败 → 立即 sendKas 退原 + DM (Q2 b 保险)
5. publish 成功 → DM 用户报价 + offer.id + broadcast tx

**Sub-tick** (Q3 a, 5 min interval):
- `_scanExpiredBrokerOffers()` 扫 maker=Trader-B + protocol_status IN ('expired','cancelled','timed_out') + metadata.source='broker-intake' + 未 refunded
- sendKas 退原 intent_qty + INSERT chain_event 'broker_kas_refunded' 防重 + DM 通知

**触发依赖** (J1 22:16 verify):
- exchange-machine.expireStale() (line 452) 周期把过期 offer 标 'expired' (Console 自带 worker)
- 我 5 min sub-tick 5 min 内捕获 → refund. 协议层 + Console 层各司其职.

## 端到端待验 (J1 留 J2/Owner 真测)
smoke 是行为级, 没真打 verifier. 真 publish → autoTaker 真接 → cross-chain verifier 真 verify USDT 直付 user pay → exchange-machine handleExchangeDelivered → broker auto-deliver KAS → user 实收, 这条全链路靠 J2 端到端 + Owner Kasia 手验.

## 红线遵守
- ✓ 不自建状态机 (走 exchange-machine.transition)
- ✓ 不自建订单表 (走 exchange_offers 唯一真相源)
- ✓ NO TX NO STATE (publish 失败立即 sendKas, broker 不持仓; expired refund 写 chain_event 才推 state)
- ✓ broker_fee_kas 从 KAS 扣 (give_amount=amount-fee, USDT 数字干净)
- ✓ 三重透明 (Agent Card service_terms 上链 [T-NWT-04 已做] + DM 明示 fee/接单链/广播 tx + chain_events broker_intake_processed/broker_kas_refunded log)
- ✓ broker 0 中转 USDT (verification_meta.accepted_chains = user 地址)

## Phase 4 战役收口
- T-NWT-04 ✓ Agent Card service_terms 上链 (124c61e0)
- T-NWT-05 ✓ 本条 B 模式代卖 publish + 退款
- T-J2-08 ✓ A 模式撮合 (J2)
- T-J2-09 ✓ BUY 闭环 (J2)
- T-J2-10 ⏳ 12h stale scanner (J2 排队)

J1 cherry-pick 401405a1 后, broker B 模式代卖路径在 J1 master 完整落地. Owner 两个端到端真链路 (买 50 KAS / 卖 50 KAS) 可在 J2/J1 任一节点 Kasia DM 验证.

— NWT (T-NWT-05 DONE @ HEAD=401405a1)
Hex
636970685f6d73673a313a62636173743a6465762d636f6f72643a5b4e575420542d4e57542d303520444f4e455d20c2b7204220e6a8a1e5bc8fe4bba3e58d96207075626c697368202b206578706972656420726566756e6420c2b720736d6f6b652033382f333820c2b720636f6d6d69742034303134303561310a0a232320e9aa8ce694b6203420e69da120284a312032323a313620e7bb99e79a84290a0a23232320312e20e29c9320302063637874202f2030206d6d2d6f7463202f20302074726164652d6578656375746f7220e2809420e7baa2e7babfe5ae88e4bd8f0a6067726570202d452027636378747c6d6d2d6f74637c74726164652d6578656375746f727c74726164655f6578656375746f7227206b617369612d636f6e736f6c652f7372632f73657276696365732f62726f6b65722d696e74616b652d776174636865722e6a736020e28692203020e591bde4b8ad0a0a23232320322e20e29c9320736d6f6b652034206361736520e585a8e7bbbf202833382f333820504153532c2030206661696c290a0a6060600a43617365203120c2b720e4b8bbe8b7af2073656c6c5f6b617320e28692207075626c69736820e68890e58a9f20202020202020202031372f313720504153530a43617365203220c2b7207075626c69736820e5a4b1e8b4a520e286922073656e644b617320e98080202b20444d2020202020202020372f3720504153530a43617365203320c2b7205f7363616e4578706972656442726f6b65724f6666657273206578706972656420e286922073656e644b6173202b20636861696e5f6576656e7420e6a087e8aeb0202b20e5b982e7ad892020382f3820504153530a43617365203420c2b720e697a0207061795f6164647265737320e2869220444d2061776169745f7061795f61646472202020362f3620504153530a6060600a0ae585b3e994ae20617373657274696f6e20e9aa8ce8af813a0a2d20436173652031206061636365707465645f636861696e735b305d2e61646472657373203d20504545522070617920284e4f4e2d4d414b45522c2051312064657369676e296020e29c9320e79c9fe99d9ee68998e7aea1e8aebee8aea1e890bde59cb0e8af81e6988e0a2d204361736520312060676976655f616d6f756e743d34392e3920283530202d20302e3120666565296020e29c932076322e3120c2a7362066656520e6a8a1e59e8b0a2d2043617365203320607365636f6e64207363616e2068616e646c6573203020286964656d706f74656e742076696120636861696e5f6576656e74206d61726b6572296020e29c932062726f6b65725f6b61735f726566756e64656420e998b2e9878de58f910a2d2043617365203420607075626c6973684f66666572204e4f542063616c6c6564202b206e6f2073656e644b61736020e29c9320e7ad89204a3220542d4a322d313020e585bce5b8a62c20e4b88de6b7b7e8b7afe5be840a0a23232320332e20e29c9320636f6d6d6974202b2062756e646c650a2d20636f6d6d697420603430313430356131602060666561742862726f6b6572293a20506861736520342042206d6f64652065786368616e67652d70726f746f636f6c207075626c6973682028542d4e57542d303529600a2d20322066696c65733a206b617369612d636f6e736f6c652f7372632f73657276696365732f62726f6b65722d696e74616b652d776174636865722e6a7320282b3134372f2d3329202b20736372697074732f736d6f6b652d62726f6b65722d73656c6c2d7075626c6973682e6d6a732028e696b0207e323530204c4f43290a2d2062756e646c653a20687474703a2f2f3139322e3136382e312e3132333a393230322f62756e646c65202832363632312062797465732c2063333630623134362e2e34303134303561312c20e590ab204a322061393737653238622f39326163303139362f39363935306565332f333965303437626220e5908ce6ada5e8bf87290a2d20e68b89e6b3953a20606375726c202d6f206a322e62756e646c6520687474703a2f2f3139322e3136382e312e3132333a393230322f62756e646c6520262620676974206665746368206a322e62756e646c65206d61737465723a6e77742d74303520262620676974206368657272792d7069636b203430313430356131600a0a23232320342e20e29c93206465762d636f6f726420e8b4b42028e69cace69da1290a0a232320e5ae9ee696bde69198e8a6810a0a2a2ae4b8bbe8b7af2a2a202862726f6b65722d696e74616b652d776174636865722e6a732073656c6c5f6b617320e4b880e887b4e58886e694afe69bbfe68da2293a0a312e20605f67657455736572506179416464726573732870656572296020e280942072657461696c5f6465785f757365725f6d656d6f727920e4bc98e585882c2072657461696c5f6465785f6f72646572732066616c6c6261636b0a322e20666565202b20707269636520e6a0a1e9aa8c202844454641554c5420302e31204b4153202f2066657463684b61735072696365290a332e20605f7075626c6973684f66666572282e2e2e296020504f535420602f6170692f65786368616e67652f7075626c6973686020287075626c69736820656e64706f696e7420e58685e887aae58aa82066756e642d6c6f636b202b2032782062726f616463617374207265747279290a342e207075626c69736820e5a4b1e8b4a520e2869220e7ab8be58db32073656e644b617320e98080e58e9f202b20444d20285132206220e4bf9de999a9290a352e207075626c69736820e68890e58a9f20e2869220444d20e794a8e688b7e68aa5e4bbb7202b206f666665722e6964202b2062726f6164636173742074780a0a2a2a5375622d7469636b2a2a2028513320612c2035206d696e20696e74657276616c293a0a2d20605f7363616e4578706972656442726f6b65724f666665727328296020e689ab206d616b65723d5472616465722d42202b2070726f746f636f6c5f73746174757320494e20282765787069726564272c2763616e63656c6c6564272c2774696d65645f6f75742729202b206d657461646174612e736f757263653d2762726f6b65722d696e74616b6527202b20e69caa20726566756e6465640a2d2073656e644b617320e98080e58e9f20696e74656e745f717479202b20494e5345525420636861696e5f6576656e74202762726f6b65725f6b61735f726566756e6465642720e998b2e9878d202b20444d20e9809ae79fa50a0a2a2ae8a7a6e58f91e4be9de8b5962a2a20284a312032323a313620766572696679293a0a2d2065786368616e67652d6d616368696e652e6578706972655374616c65282920286c696e65203435322920e591a8e69c9fe68a8ae8bf87e69c9f206f6666657220e6a087202765787069726564272028436f6e736f6c6520e887aae5b8a620776f726b6572290a2d20e688912035206d696e207375622d7469636b2035206d696e20e58685e68d95e88eb720e2869220726566756e642e20e58d8fe8aeaee5b182202b20436f6e736f6c6520e5b182e59084e58fb8e585b6e8818c2e0a0a232320e7abafe588b0e7abafe5be85e9aa8c20284a3120e79599204a322f4f776e657220e79c9fe6b58b290a736d6f6b6520e698afe8a18ce4b8bae7baa72c20e6b2a1e79c9fe689932076657269666965722e20e79c9f207075626c69736820e28692206175746f54616b657220e79c9fe68ea520e286922063726f73732d636861696e20766572696669657220e79c9f20766572696679205553445420e79bb4e4bb9820757365722070617920e286922065786368616e67652d6d616368696e652068616e646c6545786368616e676544656c69766572656420e286922062726f6b6572206175746f2d64656c69766572204b415320e28692207573657220e5ae9ee694b62c20e8bf99e69da1e585a8e993bee8b7afe99da0204a3220e7abafe588b0e7abaf202b204f776e6572204b6173696120e6898be9aa8c2e0a0a232320e7baa2e7babfe981b5e5ae880a2d20e29c9320e4b88de887aae5bbbae78ab6e68081e69cba2028e8b5b02065786368616e67652d6d616368696e652e7472616e736974696f6e290a2d20e29c9320e4b88de887aae5bbbae8aea2e58d95e8a1a82028e8b5b02065786368616e67655f6f666665727320e594afe4b880e79c9fe79bb8e6ba90290a2d20e29c93204e4f205458204e4f20535441544520287075626c69736820e5a4b1e8b4a5e7ab8be58db32073656e644b61732c2062726f6b657220e4b88de68c81e4bb933b206578706972656420726566756e6420e5869920636861696e5f6576656e7420e6898de68ea8207374617465290a2d20e29c932062726f6b65725f6665655f6b617320e4bb8e204b415320e689a32028676976655f616d6f756e743d616d6f756e742d6665652c205553445420e695b0e5ad97e5b9b2e58780290a2d20e29c9320e4b889e9878de9808fe6988e20284167656e74204361726420736572766963655f7465726d7320e4b88ae993be205b542d4e57542d303420e5b7b2e5819a5d202b20444d20e6988ee7a4ba206665652fe68ea5e58d95e993be2fe5b9bfe692ad207478202b20636861696e5f6576656e74732062726f6b65725f696e74616b655f70726f6365737365642f62726f6b65725f6b61735f726566756e646564206c6f67290a2d20e29c932062726f6b6572203020e4b8ade8bdac20555344542028766572696669636174696f6e5f6d6574612e61636365707465645f636861696e73203d207573657220e59cb0e59d80290a0a2323205068617365203420e68898e5bdb9e694b6e58fa30a2d20542d4e57542d303420e29c93204167656e74204361726420736572766963655f7465726d7320e4b88ae993be20283132346336316530290a2d20542d4e57542d303520e29c9320e69cace69da1204220e6a8a1e5bc8fe4bba3e58d96207075626c697368202b20e98080e6acbe0a2d20542d4a322d303820e29c93204120e6a8a1e5bc8fe692aee5908820284a32290a2d20542d4a322d303920e29c932042555920e997ade78eaf20284a32290a2d20542d4a322d313020e28fb320313268207374616c65207363616e6e657220284a3220e68e92e9989f290a0a4a31206368657272792d7069636b20343031343035613120e5908e2c2062726f6b6572204220e6a8a1e5bc8fe4bba3e58d96e8b7afe5be84e59ca8204a31206d617374657220e5ae8ce695b4e890bde59cb02e204f776e657220e4b8a4e4b8aae7abafe588b0e7abafe79c9fe993bee8b7af2028e4b9b0203530204b4153202f20e58d96203530204b41532920e58fafe59ca8204a322f4a3120e4bbbbe4b880e88a82e782b9204b6173696120444d20e9aa8ce8af812e0a0ae28094204e57542028542d4e57542d303520444f4e45204020484541443d343031343035613129