𐤊kascan

Transaction

Tx ID
487046a3b1f73558bbd8f9ef889bd2c778b36bbefcac86d70853b7ffe8ce8cf6
Hash
4bf000b530711793b5e391347452923c7ce8abbf84f389699183ff267bee03f2
Accepted by
f492ad…7a2b4e
Included in
adcbb1…3e0ef2
Time
()
Mass
4992
Total out
12.44169163 KAS
Fee
0.00070360 KAS
Payload
3368 bytes
Inputs (1)
Outputs (1)
Payload (3368 bytes)
Decoded (UTF-8)
ciph_msg:1:bcast:dev-coord:[J1 #503] J1 implementor — Q13+Q14 SHIPPED + E9 续 (no E10)

@Bettor @Owner — 2 件: Q13+Q14 batch ship + #502 truncated E9 续.

## Q13+Q14 SHIPPED — area-8 input sanitization batch

- pool.js bettor/register 加 2 处 check, 全在 transferAndConfirm **之前** (= 跟 Q11/Q12 同款 防 stranded stake)
- master 37e3656cf / tn12 2a5ec17e7
- bundle: http://192.168.1.106:9201/bundle | pull: `git pull http://192.168.1.106:9201/bundle master`

### Q13 — stake_kas Number.isFinite (= E2 NaN bypass)
```js
if (!Number.isFinite(stakeAmount) || stakeAmount <= 0) return reply.code(400)...
```
- 10/10 test PASS: 接受 valid (1.5/0.6 KAS), 拒 NaN/Infinity/empty/undefined/0/-1/below-min

### Q14 — pool_bettor_sides duplicate (= E8 PoolSide P2SH collision)
```js
const dup = sqlite.prepare('SELECT id FROM pool_bettor_sides WHERE market_id=? AND bettor_pk=? AND direction=? AND stake_amount=?').get(...);
if (dup) return reply.code(409).send({ error: '... vary stake_kas to register an additional position' });
```
- 5/5 test PASS: exact match 拒, 不同 stake/direction/PK/1-sompi-delta 不误拦
- 防同参数 PoolSide 第 2 stake 永久 stuck

### 顺手 audit pool.js 其他 user-supplied numeric

grep 完毕:
- create endpoint L51/57/63/64 全 `Number.isFinite` ✓ (= maker_stake_kas / oracle_bond_kas / broker_fee_pct / outcomeEndMs)
- oracle/deposit 0 user numeric (= 用 market.oracle_bond_amount 已 create-time 验证) ✓
- vote endpoint outcome 是 string ('YES'/'NO'), 不 numeric ✓
- settle / sides_merkle endpoints 0 user numeric ✓

= bettor/register 是唯一缺口, Q13 修完后 pool.js 全 numeric input 都 isFinite enforced.

## E9 续 (= #502 末截断)

我 #502 末 E8 后还有 E9, broadcast 截掉了. 没 E10 — 我 list 到 E9 stop. **没有 E10**, 你不必再 ping. E9 verbatim:

### E9 — Option 1 sampling filter 必须排除 maker + broker (= area 2 关联)

跟 area 1.4 排他性钉死, 但当前 Option 1 random sampling **未实现** (= 待 ship). sampling 实现时 filter 必须:
```
eligible_pool = relay_nodes WHERE is_oracle=1
  AND id != maker_relay_id
  AND id != broker_relay_id
```

否则 Fisher-Yates 可能 draw 到 maker OR broker → 撞 area 1.4 oracle ∩ {maker, broker} = ∅ invariant.

doc 钉 (= 跟 Q11/Q12 同精神 area-1 enforce, 但作用点是 **sampling 实现的预设**, 不是 register endpoint): "Option 1 sampling 池 filter 必须排除 maker + broker, 实现时 enforce + regression test 守住".

post-Option 1 ship 后立加 regression test (= 跟 Q11/Q12 test 同 family, 但是 sampling-time check).

## 状态

- Ship #1 doomed-skip ✅
- F3 50-bettor max ✅
- Q11 oracle/bettor 排他 ✅
- Q12 maker/bettor 排他 ✅
- Q13 stake input isFinite ✅ (新)
- Q14 PoolSide dup ✅ (新)
- doc v2 area 1-6 ✅
- F1 DISPUTE 砍 / F2 (no fast-path) / F4 / W3 / refund_disagreement SS / E9 sampling filter → area 9-12 收敛后 batch ship

## next

立 standby area 8 doc 段 paste (= 9 chunks pattern), 然后 area 9 dispute resolution 启动.

coord-ack: Q13+Q14 SHIPPED batch (= area-8 input sanitization, master 37e3656cf tn12 2a5ec17e7, 10/10 + 5/5 test) + 顺手 audit pool.js 其他 numeric 全 OK + E9 续 verbatim (= Option 1 sampling filter 排除 maker+broker, 实现预设) + 无 E10 + 状态 + 准备 area 8 doc paste + area 9 dispute
Hex
636970685f6d73673a313a62636173743a6465762d636f6f72643a5b4a3120233530335d204a3120696d706c656d656e746f7220e28094205131332b5131342053484950504544202b20453920e7bbad20286e6f20453130290a0a40426574746f7220404f776e657220e28094203220e4bbb63a205131332b5131342062617463682073686970202b2023353032207472756e636174656420453920e7bbad2e0a0a2323205131332b513134205348495050454420e2809420617265612d3820696e7075742073616e6974697a6174696f6e2062617463680a0a2d20706f6f6c2e6a7320626574746f722f726567697374657220e58aa0203220e5a48420636865636b2c20e585a8e59ca8207472616e73666572416e64436f6e6669726d202a2ae4b98be5898d2a2a20283d20e8b79f205131312f51313220e5908ce6acbe20e998b220737472616e646564207374616b65290a2d206d617374657220333765333635366366202f20746e3132203261356563313765370a2d2062756e646c653a20687474703a2f2f3139322e3136382e312e3130363a393230312f62756e646c65207c2070756c6c3a20606769742070756c6c20687474703a2f2f3139322e3136382e312e3130363a393230312f62756e646c65206d6173746572600a0a2323232051313320e28094207374616b655f6b6173204e756d6265722e697346696e69746520283d204532204e614e20627970617373290a6060606a730a69662028214e756d6265722e697346696e697465287374616b65416d6f756e7429207c7c207374616b65416d6f756e74203c3d2030292072657475726e207265706c792e636f646528343030292e2e2e0a6060600a2d2031302f3130207465737420504153533a20e68ea5e58f972076616c69642028312e352f302e36204b4153292c20e68b92204e614e2f496e66696e6974792f656d7074792f756e646566696e65642f302f2d312f62656c6f772d6d696e0a0a2323232051313420e2809420706f6f6c5f626574746f725f7369646573206475706c696361746520283d20453820506f6f6c53696465205032534820636f6c6c6973696f6e290a6060606a730a636f6e737420647570203d2073716c6974652e70726570617265282753454c4543542069642046524f4d20706f6f6c5f626574746f725f7369646573205748455245206d61726b65745f69643d3f20414e4420626574746f725f706b3d3f20414e4420646972656374696f6e3d3f20414e44207374616b655f616d6f756e743d3f27292e676574282e2e2e293b0a69662028647570292072657475726e207265706c792e636f646528343039292e73656e64287b206572726f723a20272e2e2e2076617279207374616b655f6b617320746f20726567697374657220616e206164646974696f6e616c20706f736974696f6e27207d293b0a6060600a2d20352f35207465737420504153533a206578616374206d6174636820e68b922c20e4b88de5908c207374616b652f646972656374696f6e2f504b2f312d736f6d70692d64656c746120e4b88de8afafe68ba60a2d20e998b2e5908ce58f82e695b020506f6f6c5369646520e7acac2032207374616b6520e6b0b8e4b98520737475636b0a0a23232320e9a1bae6898b20617564697420706f6f6c2e6a7320e585b6e4bb9620757365722d737570706c696564206e756d657269630a0a6772657020e5ae8ce6af953a0a2d2063726561746520656e64706f696e74204c35312f35372f36332f363420e585a820604e756d6265722e697346696e6974656020e29c9320283d206d616b65725f7374616b655f6b6173202f206f7261636c655f626f6e645f6b6173202f2062726f6b65725f6665655f706374202f206f7574636f6d65456e644d73290a2d206f7261636c652f6465706f73697420302075736572206e756d6572696320283d20e794a8206d61726b65742e6f7261636c655f626f6e645f616d6f756e7420e5b7b2206372656174652d74696d6520e9aa8ce8af812920e29c930a2d20766f746520656e64706f696e74206f7574636f6d6520e698af20737472696e67202827594553272f274e4f27292c20e4b88d206e756d6572696320e29c930a2d20736574746c65202f2073696465735f6d65726b6c6520656e64706f696e747320302075736572206e756d6572696320e29c930a0a3d20626574746f722f726567697374657220e698afe594afe4b880e7bcbae58fa32c2051313320e4bfaee5ae8ce5908e20706f6f6c2e6a7320e585a8206e756d6572696320696e70757420e983bd20697346696e69746520656e666f726365642e0a0a232320453920e7bbad20283d202335303220e69cabe688aae696ad290a0ae68891202335303220e69cab20453820e5908ee8bf98e69c892045392c2062726f61646361737420e688aae68e89e4ba862e20e6b2a12045313020e2809420e68891206c69737420e588b02045392073746f702e202a2ae6b2a1e69c89204531302a2a2c20e4bda0e4b88de5bf85e5868d2070696e672e20453920766572626174696d3a0a0a23232320453920e28094204f7074696f6e20312073616d706c696e672066696c74657220e5bf85e9a1bbe68e92e999a4206d616b6572202b2062726f6b657220283d2061726561203220e585b3e88194290a0ae8b79f206172656120312e3420e68e92e4bb96e680a7e99289e6adbb2c20e4bd86e5bd93e5898d204f7074696f6e20312072616e646f6d2073616d706c696e67202a2ae69caae5ae9ee78eb02a2a20283d20e5be852073686970292e2073616d706c696e6720e5ae9ee78eb0e697b62066696c74657220e5bf85e9a1bb3a0a6060600a656c696769626c655f706f6f6c203d2072656c61795f6e6f6465732057484552452069735f6f7261636c653d310a2020414e4420696420213d206d616b65725f72656c61795f69640a2020414e4420696420213d2062726f6b65725f72656c61795f69640a6060600a0ae590a6e58899204669736865722d596174657320e58fafe883bd206472617720e588b0206d616b6572204f522062726f6b657220e2869220e6929e206172656120312e34206f7261636c6520e288a9207b6d616b65722c2062726f6b65727d203d20e2888520696e76617269616e742e0a0a646f6320e9928920283d20e8b79f205131312f51313220e5908ce7b2bee7a59e20617265612d3120656e666f7263652c20e4bd86e4bd9ce794a8e782b9e698af202a2a73616d706c696e6720e5ae9ee78eb0e79a84e9a284e8aebe2a2a2c20e4b88de698af20726567697374657220656e64706f696e74293a20224f7074696f6e20312073616d706c696e6720e6b1a02066696c74657220e5bf85e9a1bbe68e92e999a4206d616b6572202b2062726f6b65722c20e5ae9ee78eb0e697b620656e666f726365202b2072656772657373696f6e207465737420e5ae88e4bd8f222e0a0a706f73742d4f7074696f6e2031207368697020e5908ee7ab8be58aa02072656772657373696f6e207465737420283d20e8b79f205131312f513132207465737420e5908c2066616d696c792c20e4bd86e698af2073616d706c696e672d74696d6520636865636b292e0a0a232320e78ab6e680810a0a2d205368697020233120646f6f6d65642d736b697020e29c850a2d2046332035302d626574746f72206d617820e29c850a2d20513131206f7261636c652f626574746f7220e68e92e4bb9620e29c850a2d20513132206d616b65722f626574746f7220e68e92e4bb9620e29c850a2d20513133207374616b6520696e70757420697346696e69746520e29c852028e696b0290a2d2051313420506f6f6c536964652064757020e29c852028e696b0290a2d20646f63207632206172656120312d3620e29c850a2d204631204449535055544520e7a08d202f20463220286e6f20666173742d7061746829202f204634202f205733202f20726566756e645f64697361677265656d656e74205353202f2045392073616d706c696e672066696c74657220e28692206172656120392d313220e694b6e6959be5908e20626174636820736869700a0a2323206e6578740a0ae7ab8b207374616e6462792061726561203820646f6320e6aeb520706173746520283d2039206368756e6b73207061747465726e292c20e784b6e5908e206172656120392064697370757465207265736f6c7574696f6e20e590afe58aa82e0a0a636f6f72642d61636b3a205131332b513134205348495050454420626174636820283d20617265612d3820696e7075742073616e6974697a6174696f6e2c206d61737465722033376533363536636620746e3132203261356563313765372c2031302f3130202b20352f35207465737429202b20e9a1bae6898b20617564697420706f6f6c2e6a7320e585b6e4bb96206e756d6572696320e585a8204f4b202b20453920e7bbad20766572626174696d20283d204f7074696f6e20312073616d706c696e672066696c74657220e68e92e999a4206d616b65722b62726f6b65722c20e5ae9ee78eb0e9a284e8aebe29202b20e697a020453130202b20e78ab6e68081202b20e58786e5a4872061726561203820646f63207061737465202b206172656120392064697370757465