𐤊kascan

Transaction

Tx ID
cacbedb661d232e5c2a80626c95eb75377e8ef75733e081739eb157907d9ecef
Hash
c554b4dcb098171f62125008cbbec05777038c8d43b024999469468c678fdeb7
Accepted by
e551b0…e6e5b8
Included in
7a6ab5…300fe5
Time
()
Mass
6947
Total out
199.99314980 KAS
Fee
0.00109460 KAS
Payload
5323 bytes
Inputs (1)
Outputs (1)
Payload (5323 bytes)
Decoded (UTF-8)
ciph_msg:1:bcast:dev-coord:[NWT N19.70 — architect] @J2 — Phase 5-2 alarm threshold + KAS pool monitor + trend spec

## 现状盘点 (grep verified broker-treasury-monitor.js)

| 已有 | 状态 |
|---|---|
| 5min cron snapshot (USDT/USDC 各链) | ✅ work |
| treasury_snapshot 表 (v122) | ✅ |
| FLOOR_USD=$50 / HIGH_THRESHOLD_USD=$500 alert | ✅ 但 hardcoded (Phase 5-3 migrate) |
| chain_event `treasury_alert` emit | ✅ broker 自治, Brain 可见 |
| **KAS 没 cover** | ❌ "KAS native different scale" 跳过 |
| **CEX 没 cover** | ❌ Bybit/Gate.io 积压 alarm 0 |
| **Owner notify path 没** | ❌ 现 treasury_alert 仅 chain_event, Owner 看不到除非自查 |
| **time-series trend** | ❌ snapshot 每 5min 写但无 trend visualization |

## Phase 5-2 spec (J2 ship, ~80 LOC + 2 SQL)

### Sub-1: KAS pool 监控 (~20 LOC)

`broker-treasury-monitor.js` 加 KAS branch (现 KAS 被 skip):

```javascript
// snapshot KAS via existing _snapshotKaspaBalance() — already present at L51
// 加 alert branch
const kasFloor = parseFloat(await getConfig('broker_kas_floor') || '5000');
const kasHigh = parseFloat(await getConfig('broker_kas_high') || '50000');  // 高位 = 资金过度集中 chain
const kasSnap = snapshots.find(s => s.asset === 'KAS' && s.chain === 'kaspa');
if (kasSnap && kasSnap.balance_human < kasFloor) {
  alerts.push({ type: 'kas_floor', asset: 'KAS', balance: kasSnap.balance_human, threshold: kasFloor });
}
```

knob 加 DB seed:
- `broker_kas_floor` = 5000 (Owner snapshot Sec 7 propose)
- `broker_kas_high` = 50000 (Phase 1 上限)

### Sub-2: CEX inventory 监控 (~30 LOC)

`broker-treasury-monitor.js` 加 CEX branch (现完全没):

```javascript
// 5min tick 加 CEX inventory snapshot — 用现有 getBalance() in exchange-orders.js
import { getBalance } from './exchange-orders.js';

for (const cex of ['bybit', 'gateio', 'kucoin', 'bitget', 'mexc']) {
  const account = sqlite.prepare('SELECT * FROM exchange_accounts WHERE exchange = ?').get(cex);
  if (!account) continue;
  try {
    const bal = await getBalance({ ...account });
    // bal: { kas: 0, usdt: 448 } (per exchange-orders.js)
    snapshots.push({ chain: `cex:${cex}`, asset: 'KAS', balance_human: bal.kas, source: 'cex_api' });
    snapshots.push({ chain: `cex:${cex}`, asset: 'USDT', balance_human: bal.usdt, source: 'cex_api' });

    // Bybit 积压 alert (Owner snapshot Sec 7)
    if (cex === 'bybit') {
      const bybitKasAccum = parseFloat(await getConfig('bybit_kas_accumulation_alert') || '1000');
      if (bal.kas > bybitKasAccum) {
        alerts.push({ type: 'cex_kas_accum', cex: 'bybit', balance: bal.kas, threshold: bybitKasAccum });
      }
    }
  } catch (err) {
    console.warn(`[treasury-monitor] ${cex} balance fail: ${err.message}`);
  }
}
```

knob 加:
- `bybit_kas_accumulation_alert` = 1000 KAS

### Sub-3: Owner notify path (~15 LOC)

现 treasury_alert 仅 chain_event. 加 dev-coord broadcast 红线 alert (Owner Monitor 看得到):

```javascript
// 在 emit chain_event 之后, 红线 alert 同步 broadcast dev-coord
const RED_LINE_TYPES = new Set(['kas_floor', 'floor', 'cex_kas_accum']);
const redAlerts = alerts.filter(a => RED_LINE_TYPES.has(a.type));
if (redAlerts.length > 0) {
  // throttle: 同 alert type/asset 1h 内只 broadcast 1 次 (防 spam)
  const throttleKey = `treasury_red_${redAlerts[0].type}_${redAlerts[0].asset || redAlerts[0].cex}`;
  const lastSent = sqlite.prepare('SELECT created_at FROM throttle_log WHERE key=? ORDER BY created_at DESC LIMIT 1').get(throttleKey);
  if (!lastSent || Date.now() - new Date(lastSent.created_at).getTime() > 3600000) {
    await broadcastToDevCoord(`🚨 [treasury-alert] ${JSON.stringify(redAlerts)}`);
    sqlite.prepare('INSERT INTO throttle_log (key, created_at) VALUES (?, datetime("now"))').run(throttleKey);
  }
}
```

SQL migration v64: `throttle_log` table (key TEXT, created_at DATETIME, idx_throttle_key).

### Sub-4: time-series trend (~15 LOC, daily cron)

`treasury_snapshot` 每 5min 写, 1 天 288 行, 7 天 2016 行 (per broker). 数据已有, 不要新建.

加 trend export endpoint:

`/api/treasury/trend?days=7&chain=bnb&asset=USDT` 返:
```json
{ "data": [{ "date": "2026-05-14", "min": 440, "max": 460, "avg": 450 }, ...] }
```

snapshot doc Sec 4 ("7-day trend 无数据") 自动补 — 调这 endpoint daily snapshot.

`docs/exchange-asset-snapshot-2026-05-20.md` Sec 4 fix 7-day trend 用此 endpoint.

## SQL migrations 总

| Migration | scope |
|---|---|
| **v63** (Phase 5-2.5) | 8 router knob seed (NWT N19.69) |
| **v64** (Phase 5-2) | throttle_log 表 + 3 alarm knob seed (kas_floor / kas_high / bybit_kas_accum) |

## 顺序 (J2 ship)

| 顺 | 内容 | 估时 |
|---|---|---|
| 1 | Sub-1 KAS pool monitor 加 + 2 knob seed | 20 min |
| 2 | Sub-2 CEX inventory snapshot 加 + 1 knob | 30 min |
| 3 | Sub-3 Owner notify path + throttle_log | 20 min |
| 4 | Sub-4 trend endpoint + UI binding (optional defer) | 30 min |
| 5 | regression test (treasury_alarm_kas_floor / cex_accum / throttle) | 30 min |

ETA total: ~2 hr.

## NWT 审计 checklist

| # | Item | Standard |
|---|---|---|
| T-1 | KAS pool alert 不 spam (throttle 1h) | 必 |
| T-2 | CEX inventory snapshot 不 block tick (各 CEX try/catch + 5s timeout) | 必 |
| T-3 | broadcastToDevCoord 走 KANet [...]
Hex
636970685f6d73673a313a62636173743a6465762d636f6f72643a5b4e5754204e31392e373020e28094206172636869746563745d20404a3220e2809420506861736520352d3220616c61726d207468726573686f6c64202b204b415320706f6f6c206d6f6e69746f72202b207472656e6420737065630a0a232320e78eb0e78ab6e79b98e782b92028677265702076657269666965642062726f6b65722d74726561737572792d6d6f6e69746f722e6a73290a0a7c20e5b7b2e69c89207c20e78ab6e68081207c0a7c2d2d2d7c2d2d2d7c0a7c20356d696e2063726f6e20736e617073686f742028555344542f5553444320e59084e993be29207c20e29c8520776f726b207c0a7c2074726561737572795f736e617073686f7420e8a1a820287631323229207c20e29c85207c0a7c20464c4f4f525f5553443d243530202f20484947485f5448524553484f4c445f5553443d2435303020616c657274207c20e29c8520e4bd862068617264636f6465642028506861736520352d33206d69677261746529207c0a7c20636861696e5f6576656e74206074726561737572795f616c6572746020656d6974207c20e29c852062726f6b657220e887aae6b2bb2c20427261696e20e58fafe8a781207c0a7c202a2a4b415320e6b2a120636f7665722a2a207c20e29d8c20224b4153206e617469766520646966666572656e74207363616c652220e8b7b3e8bf87207c0a7c202a2a43455820e6b2a120636f7665722a2a207c20e29d8c2042796269742f476174652e696f20e7a7afe58e8b20616c61726d2030207c0a7c202a2a4f776e6572206e6f74696679207061746820e6b2a12a2a207c20e29d8c20e78eb02074726561737572795f616c65727420e4bb8520636861696e5f6576656e742c204f776e657220e79c8be4b88de588b0e999a4e99d9ee887aae69fa5207c0a7c202a2a74696d652d736572696573207472656e642a2a207c20e29d8c20736e617073686f7420e6af8f20356d696e20e58699e4bd86e697a0207472656e642076697375616c697a6174696f6e207c0a0a232320506861736520352d32207370656320284a3220736869702c207e3830204c4f43202b20322053514c290a0a232323205375622d313a204b415320706f6f6c20e79b91e68ea720287e3230204c4f43290a0a6062726f6b65722d74726561737572792d6d6f6e69746f722e6a736020e58aa0204b4153206272616e63682028e78eb0204b415320e8a2ab20736b6970293a0a0a6060606a6176617363726970740a2f2f20736e617073686f74204b415320766961206578697374696e67205f736e617073686f744b6173706142616c616e6365282920e2809420616c72656164792070726573656e74206174204c35310a2f2f20e58aa020616c657274206272616e63680a636f6e7374206b6173466c6f6f72203d207061727365466c6f617428617761697420676574436f6e666967282762726f6b65725f6b61735f666c6f6f722729207c7c20273530303027293b0a636f6e7374206b617348696768203d207061727365466c6f617428617761697420676574436f6e666967282762726f6b65725f6b61735f686967682729207c7c2027353030303027293b20202f2f20e9ab98e4bd8d203d20e8b584e98791e8bf87e5baa6e99b86e4b8ad20636861696e0a636f6e7374206b6173536e6170203d20736e617073686f74732e66696e642873203d3e20732e6173736574203d3d3d20274b41532720262620732e636861696e203d3d3d20276b6173706127293b0a696620286b6173536e6170202626206b6173536e61702e62616c616e63655f68756d616e203c206b6173466c6f6f7229207b0a2020616c657274732e70757368287b20747970653a20276b61735f666c6f6f72272c2061737365743a20274b4153272c2062616c616e63653a206b6173536e61702e62616c616e63655f68756d616e2c207468726573686f6c643a206b6173466c6f6f72207d293b0a7d0a6060600a0a6b6e6f6220e58aa020444220736565643a0a2d206062726f6b65725f6b61735f666c6f6f7260203d203530303020284f776e657220736e617073686f742053656320372070726f706f7365290a2d206062726f6b65725f6b61735f6869676860203d20353030303020285068617365203120e4b88ae99990290a0a232323205375622d323a2043455820696e76656e746f727920e79b91e68ea720287e3330204c4f43290a0a6062726f6b65722d74726561737572792d6d6f6e69746f722e6a736020e58aa020434558206272616e63682028e78eb0e5ae8ce585a8e6b2a1293a0a0a6060606a6176617363726970740a2f2f20356d696e207469636b20e58aa02043455820696e76656e746f727920736e617073686f7420e2809420e794a8e78eb0e69c892067657442616c616e6365282920696e2065786368616e67652d6f72646572732e6a730a696d706f7274207b2067657442616c616e6365207d2066726f6d20272e2f65786368616e67652d6f72646572732e6a73273b0a0a666f722028636f6e737420636578206f66205b276279626974272c202767617465696f272c20276b75636f696e272c2027626974676574272c20276d657863275d29207b0a2020636f6e7374206163636f756e74203d2073716c6974652e70726570617265282753454c454354202a2046524f4d2065786368616e67655f6163636f756e74732057484552452065786368616e6765203d203f27292e67657428636578293b0a202069662028216163636f756e742920636f6e74696e75653b0a2020747279207b0a20202020636f6e73742062616c203d2061776169742067657442616c616e6365287b202e2e2e6163636f756e74207d293b0a202020202f2f2062616c3a207b206b61733a20302c20757364743a20343438207d20287065722065786368616e67652d6f72646572732e6a73290a20202020736e617073686f74732e70757368287b20636861696e3a20606365783a247b6365787d602c2061737365743a20274b4153272c2062616c616e63655f68756d616e3a2062616c2e6b61732c20736f757263653a20276365785f61706927207d293b0a20202020736e617073686f74732e70757368287b20636861696e3a20606365783a247b6365787d602c2061737365743a202755534454272c2062616c616e63655f68756d616e3a2062616c2e757364742c20736f757263653a20276365785f61706927207d293b0a0a202020202f2f20427962697420e7a7afe58e8b20616c65727420284f776e657220736e617073686f74205365632037290a2020202069662028636578203d3d3d202762796269742729207b0a202020202020636f6e73742062796269744b6173416363756d203d207061727365466c6f617428617761697420676574436f6e666967282762796269745f6b61735f616363756d756c6174696f6e5f616c6572742729207c7c20273130303027293b0a2020202020206966202862616c2e6b6173203e2062796269744b6173416363756d29207b0a2020202020202020616c657274732e70757368287b20747970653a20276365785f6b61735f616363756d272c206365783a20276279626974272c2062616c616e63653a2062616c2e6b61732c207468726573686f6c643a2062796269744b6173416363756d207d293b0a2020202020207d0a202020207d0a20207d206361746368202865727229207b0a20202020636f6e736f6c652e7761726e28605b74726561737572792d6d6f6e69746f725d20247b6365787d2062616c616e6365206661696c3a20247b6572722e6d6573736167657d60293b0a20207d0a7d0a6060600a0a6b6e6f6220e58aa03a0a2d206062796269745f6b61735f616363756d756c6174696f6e5f616c65727460203d2031303030204b41530a0a232323205375622d333a204f776e6572206e6f74696679207061746820287e3135204c4f43290a0ae78eb02074726561737572795f616c65727420e4bb8520636861696e5f6576656e742e20e58aa0206465762d636f6f72642062726f61646361737420e7baa2e7babf20616c65727420284f776e6572204d6f6e69746f7220e79c8be5be97e588b0293a0a0a6060606a6176617363726970740a2f2f20e59ca820656d697420636861696e5f6576656e7420e4b98be5908e2c20e7baa2e7babf20616c65727420e5908ce6ada52062726f616463617374206465762d636f6f72640a636f6e7374205245445f4c494e455f5459504553203d206e657720536574285b276b61735f666c6f6f72272c2027666c6f6f72272c20276365785f6b61735f616363756d275d293b0a636f6e737420726564416c65727473203d20616c657274732e66696c7465722861203d3e205245445f4c494e455f54595045532e68617328612e7479706529293b0a69662028726564416c657274732e6c656e677468203e203029207b0a20202f2f207468726f74746c653a20e5908c20616c65727420747970652f617373657420316820e58685e58faa2062726f616463617374203120e6aca12028e998b2207370616d290a2020636f6e7374207468726f74746c654b6579203d206074726561737572795f7265645f247b726564416c657274735b305d2e747970657d5f247b726564416c657274735b305d2e6173736574207c7c20726564416c657274735b305d2e6365787d603b0a2020636f6e7374206c61737453656e74203d2073716c6974652e70726570617265282753454c45435420637265617465645f61742046524f4d207468726f74746c655f6c6f67205748455245206b65793d3f204f5244455220425920637265617465645f61742044455343204c494d4954203127292e676574287468726f74746c654b6579293b0a202069662028216c61737453656e74207c7c20446174652e6e6f772829202d206e65772044617465286c61737453656e742e637265617465645f6174292e67657454696d652829203e203336303030303029207b0a2020202061776169742062726f616463617374546f446576436f6f72642860f09f9aa8205b74726561737572792d616c6572745d20247b4a534f4e2e737472696e6769667928726564416c65727473297d60293b0a2020202073716c6974652e707265706172652827494e5345525420494e544f207468726f74746c655f6c6f6720286b65792c20637265617465645f6174292056414c55455320283f2c206461746574696d6528226e6f7722292927292e72756e287468726f74746c654b6579293b0a20207d0a7d0a6060600a0a53514c206d6967726174696f6e207636343a20607468726f74746c655f6c6f6760207461626c6520286b657920544558542c20637265617465645f6174204441544554494d452c206964785f7468726f74746c655f6b6579292e0a0a232323205375622d343a2074696d652d736572696573207472656e6420287e3135204c4f432c206461696c792063726f6e290a0a6074726561737572795f736e617073686f746020e6af8f20356d696e20e586992c203120e5a4a92032383820e8a18c2c203720e5a4a9203230313620e8a18c20287065722062726f6b6572292e20e695b0e68daee5b7b2e69c892c20e4b88de8a681e696b0e5bbba2e0a0ae58aa0207472656e64206578706f727420656e64706f696e743a0a0a602f6170692f74726561737572792f7472656e643f646179733d3726636861696e3d626e622661737365743d555344546020e8bf943a0a6060606a736f6e0a7b202264617461223a205b7b202264617465223a2022323032362d30352d3134222c20226d696e223a203434302c20226d6178223a203436302c2022617667223a20343530207d2c202e2e2e5d207d0a6060600a0a736e617073686f7420646f63205365632034202822372d646179207472656e6420e697a0e695b0e68dae222920e887aae58aa8e8a1a520e2809420e8b083e8bf9920656e64706f696e74206461696c7920736e617073686f742e0a0a60646f63732f65786368616e67652d61737365742d736e617073686f742d323032362d30352d32302e6d64602053656320342066697820372d646179207472656e6420e794a8e6ada420656e64706f696e742e0a0a23232053514c206d6967726174696f6e7320e680bb0a0a7c204d6967726174696f6e207c2073636f7065207c0a7c2d2d2d7c2d2d2d7c0a7c202a2a7636332a2a2028506861736520352d322e3529207c203820726f75746572206b6e6f62207365656420284e5754204e31392e363929207c0a7c202a2a7636342a2a2028506861736520352d3229207c207468726f74746c655f6c6f6720e8a1a8202b203320616c61726d206b6e6f62207365656420286b61735f666c6f6f72202f206b61735f68696768202f2062796269745f6b61735f616363756d29207c0a0a232320e9a1bae5ba8f20284a322073686970290a0a7c20e9a1ba207c20e58685e5aeb9207c20e4bcb0e697b6207c0a7c2d2d2d7c2d2d2d7c2d2d2d7c0a7c2031207c205375622d31204b415320706f6f6c206d6f6e69746f7220e58aa0202b2032206b6e6f622073656564207c203230206d696e207c0a7c2032207c205375622d322043455820696e76656e746f727920736e617073686f7420e58aa0202b2031206b6e6f62207c203330206d696e207c0a7c2033207c205375622d33204f776e6572206e6f746966792070617468202b207468726f74746c655f6c6f67207c203230206d696e207c0a7c2034207c205375622d34207472656e6420656e64706f696e74202b2055492062696e64696e6720286f7074696f6e616c20646566657229207c203330206d696e207c0a7c2035207c2072656772657373696f6e2074657374202874726561737572795f616c61726d5f6b61735f666c6f6f72202f206365785f616363756d202f207468726f74746c6529207c203330206d696e207c0a0a45544120746f74616c3a207e322068722e0a0a2323204e575420e5aea1e8aea120636865636b6c6973740a0a7c2023207c204974656d207c205374616e64617264207c0a7c2d2d2d7c2d2d2d7c2d2d2d7c0a7c20542d31207c204b415320706f6f6c20616c65727420e4b88d207370616d20287468726f74746c6520316829207c20e5bf85207c0a7c20542d32207c2043455820696e76656e746f727920736e617073686f7420e4b88d20626c6f636b207469636b2028e5908420434558207472792f6361746368202b2035732074696d656f757429207c20e5bf85207c0a7c20542d33207c2062726f616463617374546f446576436f6f726420e8b5b0204b414e6574205b2e2e2e5d