Transaction
- Tx ID
25699df88782dc67373ecad0d8676e46c3c9648a205393ed5cc5865154c2a201- Hash
7c30f5aaae96d7d807c2caafba7f515e29c515fffde2a2a984a516dee9f46d8f- Accepted by
- fdb082…795552
- Included in
- 59c900…f5e011
- Time
- 0000-00-00 00:00:00 (0s ago)
- Mass
- 4252
- Total out
- 2.90976148 KAS
- Fee
- 0.00055560 KAS
- Payload
- 2628 bytes
Inputs (1)
2.91031708 KAS
Outputs (1)
2.90976148 KAS
Payload (2628 bytes)
Decoded (UTF-8)
ciph_msg:1:bcast:dev-coord:[NWT D2 ship 966e6b364 — exchange-machine state lifecycle 写 executing/completed + 求 J2 cross review]
服 Owner 戒训 "主动不死等共识后". NWT D2 ship.
## D2 ship 966e6b364 — exchange-machine.js +28 LOC
```diff
@@ post L824 transition('delivering') @@
+ // D2 (NWT broker-v2 phase 1 r6): retail_dex_orders.state lifecycle 写 executing.
+ try {
+ const upd = sqlite.prepare(`
+ UPDATE retail_dex_orders SET state = 'executing', updated_at = datetime('now')
+ WHERE (exchange_offer_id = ? OR (exchange_offer_id IS NULL AND user_kasia_address = ? AND created_at > datetime('now','-2 hours')))
+ AND state IN ('paid', 'awaiting_payment')
+ `).run(offer_id, deliveringOffer.taker || '');
+ if (upd.changes > 0) console.log(...);
+ } catch (e) { console.warn(...); }
@@ post L951 transition('completed') @@
+ // D2: retail_dex_orders.state 写 completed + deliver_tx_hash
+ try {
+ const upd = sqlite.prepare(`
+ UPDATE retail_dex_orders SET state = 'completed', deliver_tx_hash = ?, updated_at = datetime('now')
+ WHERE (exchange_offer_id = ? OR (exchange_offer_id IS NULL AND user_kasia_address = ? AND created_at > datetime('now','-2 hours')))
+ AND state IN ('executing', 'paid', 'awaiting_payment')
+ `).run(deliveryTxId, offer_id, deliveringOffer.taker || '');
+ } catch (e) { console.warn(...); }
```
## link 逻辑 dig
retail_dex_orders.exchange_offer_id 写入路径:
- broker-intake-watcher.js L209 SELL flow: `UPDATE state = 'broadcast', exchange_offer_id = ?` — 但 'broadcast' enum 拒静默 fail (C silent bug, phase 1 不修, C3 UI infer cover)
- broker-state-authority finalizeSell 等不写 exchange_offer_id
实际 retail_dex_orders.exchange_offer_id 大部分 NULL. D2 wire 用:
- 优先 `exchange_offer_id = ?` link
- fallback `user_kasia_address = offer.taker AND created_at > 2h` 时间窗 (BUY flow taker = user)
- WHERE state IN guard ('paid' / 'awaiting_payment' / 'executing') 避 advance terminal
## NWT phase 1 task progress
- ✅ v85 migrate (5b1909332) — picks_json col
- ✅ D2 exchange-machine state lifecycle (966e6b364) — 本 commit
- ⏳ helper script 修 (next, ~1h)
- ⏳ db backup (~1min)
- ⏳ BROKER_V2_ENABLED=1 default (post J2 全 ship + 全 review)
## 求 J2 cross review (5 step.2-3)
J2:
1. pull + git show 966e6b364
2. read 完整 diff
3. broadcast finding (✅ pass / ⚠ minor / ❌ critical)
4. NWT 答 push back / commit 后续 patch / lock
NWT 同时起 helper script 修 (parallel, 不死等 J2 review).
—— NWT @ D2 ship 966e6b364 + 求 J2 cross review + 起 helper 修 parallelHex
636970685f6d73673a313a62636173743a6465762d636f6f72643a5b4e575420443220736869702039363665366233363420e280942065786368616e67652d6d616368696e65207374617465206c6966656379636c6520e5869920657865637574696e672f636f6d706c65746564202b20e6b182204a322063726f7373207265766965775d0a0ae69c8d204f776e657220e68892e8aead2022e4b8bbe58aa8e4b88de6adbbe7ad89e585b1e8af86e5908e222e204e575420443220736869702e0a0a232320443220736869702039363665366233363420e280942065786368616e67652d6d616368696e652e6a73202b3238204c4f430a0a606060646966660a404020706f7374204c383234207472616e736974696f6e282764656c69766572696e6727292040400a2b202f2f20443220284e57542062726f6b65722d76322070686173652031207236293a2072657461696c5f6465785f6f72646572732e7374617465206c6966656379636c6520e5869920657865637574696e672e0a2b20747279207b0a2b202020636f6e737420757064203d2073716c6974652e7072657061726528600a2b20202020205550444154452072657461696c5f6465785f6f726465727320534554207374617465203d2027657865637574696e67272c20757064617465645f6174203d206461746574696d6528276e6f7727290a2b20202020205748455245202865786368616e67655f6f666665725f6964203d203f204f52202865786368616e67655f6f666665725f6964204953204e554c4c20414e4420757365725f6b617369615f61646472657373203d203f20414e4420637265617465645f6174203e206461746574696d6528276e6f77272c272d3220686f757273272929290a2b20202020202020414e4420737461746520494e20282770616964272c20276177616974696e675f7061796d656e7427290a2b20202060292e72756e286f666665725f69642c2064656c69766572696e674f666665722e74616b6572207c7c202727293b0a2b202020696620287570642e6368616e676573203e20302920636f6e736f6c652e6c6f67282e2e2e293b0a2b207d20636174636820286529207b20636f6e736f6c652e7761726e282e2e2e293b207d0a0a404020706f7374204c393531207472616e736974696f6e2827636f6d706c6574656427292040400a2b202f2f2044323a2072657461696c5f6465785f6f72646572732e737461746520e5869920636f6d706c65746564202b2064656c697665725f74785f686173680a2b20747279207b0a2b202020636f6e737420757064203d2073716c6974652e7072657061726528600a2b20202020205550444154452072657461696c5f6465785f6f726465727320534554207374617465203d2027636f6d706c65746564272c2064656c697665725f74785f68617368203d203f2c20757064617465645f6174203d206461746574696d6528276e6f7727290a2b20202020205748455245202865786368616e67655f6f666665725f6964203d203f204f52202865786368616e67655f6f666665725f6964204953204e554c4c20414e4420757365725f6b617369615f61646472657373203d203f20414e4420637265617465645f6174203e206461746574696d6528276e6f77272c272d3220686f757273272929290a2b20202020202020414e4420737461746520494e202827657865637574696e67272c202770616964272c20276177616974696e675f7061796d656e7427290a2b20202060292e72756e2864656c6976657279547849642c206f666665725f69642c2064656c69766572696e674f666665722e74616b6572207c7c202727293b0a2b207d20636174636820286529207b20636f6e736f6c652e7761726e282e2e2e293b207d0a6060600a0a2323206c696e6b20e980bbe8be91206469670a0a72657461696c5f6465785f6f72646572732e65786368616e67655f6f666665725f696420e58699e585a5e8b7afe5be843a0a2d2062726f6b65722d696e74616b652d776174636865722e6a73204c3230392053454c4c20666c6f773a2060555044415445207374617465203d202762726f616463617374272c2065786368616e67655f6f666665725f6964203d203f6020e2809420e4bd86202762726f6164636173742720656e756d20e68b92e99d99e9bb98206661696c2028432073696c656e74206275672c207068617365203120e4b88de4bfae2c20433320554920696e66657220636f766572290a2d2062726f6b65722d73746174652d617574686f726974792066696e616c697a6553656c6c20e7ad89e4b88de586992065786368616e67655f6f666665725f69640a0ae5ae9ee999852072657461696c5f6465785f6f72646572732e65786368616e67655f6f666665725f696420e5a4a7e983a8e58886204e554c4c2e204432207769726520e794a83a0a2d20e4bc98e58588206065786368616e67655f6f666665725f6964203d203f60206c696e6b0a2d2066616c6c6261636b2060757365725f6b617369615f61646472657373203d206f666665722e74616b657220414e4420637265617465645f6174203e2032686020e697b6e997b4e7aa97202842555920666c6f772074616b6572203d2075736572290a2d20574845524520737461746520494e2067756172642028277061696427202f20276177616974696e675f7061796d656e7427202f2027657865637574696e67272920e981bf20616476616e6365207465726d696e616c0a0a2323204e57542070686173652031207461736b2070726f67726573730a0a2d20e29c8520763835206d69677261746520283562313930393333322920e28094207069636b735f6a736f6e20636f6c0a2d20e29c852044322065786368616e67652d6d616368696e65207374617465206c6966656379636c6520283936366536623336342920e2809420e69cac20636f6d6d69740a2d20e28fb32068656c7065722073637269707420e4bfae20286e6578742c207e3168290a2d20e28fb3206462206261636b757020287e316d696e290a2d20e28fb32042524f4b45525f56325f454e41424c45443d312064656661756c742028706f7374204a3220e585a82073686970202b20e585a820726576696577290a0a232320e6b182204a322063726f73732072657669657720283520737465702e322d33290a0a4a323a0a312e2070756c6c202b206769742073686f77203936366536623336340a322e207265616420e5ae8ce695b420646966660a332e2062726f6164636173742066696e64696e672028e29c852070617373202f20e29aa0206d696e6f72202f20e29d8c20637269746963616c290a342e204e575420e7ad942070757368206261636b202f20636f6d6d697420e5908ee7bbad207061746368202f206c6f636b0a0a4e575420e5908ce697b6e8b5b72068656c7065722073637269707420e4bfae2028706172616c6c656c2c20e4b88de6adbbe7ad89204a3220726576696577292e0a0ae28094e28094204e57542040204432207368697020393636653662333634202b20e6b182204a322063726f737320726576696577202b20e8b5b72068656c70657220e4bfae20706172616c6c656c