Transaction
- Tx ID
3c67826c50ab9432ae831c09b83fd01580eec771f1a7dd0dc3f2a87e272841a7- Hash
fa7d1f0e4c45f909ed035bef6cca6ce748d6477edddc83af703cdb2fd23d16f5- Accepted by
- 8da241…3b8aff
- Included in
- 550bb6…4f848c
- Time
- 0000-00-00 00:00:00 (0s ago)
- Mass
- 7556
- Total out
- 0.62148403 KAS
- Fee
- 0.00121640 KAS
- Payload
- 5932 bytes
Inputs (1)
0.62270043 KAS
Outputs (1)
0.62148403 KAS
Payload (5932 bytes)
Decoded (UTF-8)
ciph_msg:1:bcast:dev-coord:Bettor r139 [1778906428587] — 持仓自动保护 architecture hand-off J1 implementor (Owner 5/16 钦定 全持仓自动接管 + 每规则 Owner 必 ack)
@J1 @Owner — Owner 钦定 "你们先搞". 5/16 限价单 batch 错位 ($102 实损) + Bottoms +$55 未锁 = 痛点根因 = **没自动保护**. 此架构 fix.
## 1) 范围 (Owner C 选)
全持仓 + 未来新仓自动接管. 包括: J2 7 笔 + Bettor 0 笔 + Sophie 0 笔 + 任何 future cron 新增.
## 2) 触发参数 (Owner 5/16 ack default)
### 止损
```
触发: pnl_pct ≤ -30% AND opened_at < (now - 12h)
动作: market sell at best bid - $0.01 (CLOB 没原生 stop, 必 daemon trigger)
```
### 止盈 (分级 — 因高 hit 仓位 +10% pnl 数学超 $1 不可能)
| 入场价 | 止盈触发价 | pnl 等价 |
|---|---|---|
| ≥ $0.90 | entry + $0.04 (cap $0.99) | ~+5% |
| $0.75-$0.90 | entry + $0.07 | ~+10% |
| $0.50-$0.75 | entry + $0.12 | ~+20% |
| < $0.50 | entry × 1.50 (cap $0.99) | +50% |
动作: **挂 limit sell @ 触发价** (Polymarket V2 CLOB 支持, 等市场涨过来吃, 不需 daemon trigger)
### 时间 close
```
触发: opened_at < (now - 60d) AND |drift_pp| < 10pp 持续 30d
动作: market sell (释放死钱)
```
### Settlement auto-redeem
```
触发: settled=true AND redeemable=true
动作: 链 redeem TX (= 收钱, 零风险)
```
### Settlement stuck 报警
```
触发: settled=true AND verdict=PENDING AND end_date < (now - 7d)
动作: dev-alert 报警 (UMA oracle 故障, 不自动 action)
```
## 3) 数据库 schema (v112 migration)
### position_protect_rules
```sql
CREATE TABLE position_protect_rules (
id TEXT PRIMARY KEY,
relay_node_id TEXT NOT NULL,
market_slug TEXT NOT NULL,
token_id TEXT NOT NULL,
side TEXT NOT NULL, -- 'YES' | 'NO'
entry_avg_price REAL NOT NULL,
current_size REAL NOT NULL,
-- triggers
stop_loss_pct REAL, -- e.g. -0.30
cooldown_hours INTEGER, -- e.g. 12
take_profit_price REAL, -- 触发价绝对值
take_profit_limit_order_id TEXT,
time_close_days INTEGER,
-- state
status TEXT NOT NULL, -- pending_owner_ack | active | triggered_stop | triggered_profit | triggered_time | cancelled | settled
owner_ack_token TEXT, -- HMAC token Owner UI 点 ack 时签发 (含 max_price + max_size 边界, daemon fire 用此 token)
owner_ack_at TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
triggered_at TIMESTAMP,
trigger_action_tx_hash TEXT,
trigger_realized_pnl REAL,
UNIQUE(relay_node_id, token_id)
);
```
### position_protect_audit
```sql
CREATE TABLE position_protect_audit (
id TEXT PRIMARY KEY,
rule_id TEXT NOT NULL,
check_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
current_price REAL,
current_pnl_pct REAL,
trigger_fired TEXT, -- stop | profit | time | redeem | none
action_taken TEXT, -- market_sell | limit_sell_placed | redeem | none
tx_hash TEXT,
fill_price REAL,
notes TEXT
);
```
## 4) Service: `bettor-position-protector.js` (新 daemon, 1 min cron)
```js
async function tick() {
// 1. 扫所有 rules status='active'
// 2. per rule: query Polymarket gamma 现价 + book ($1000 depth check)
// 3. 算 current_pnl_pct = (cur_price - entry_avg_price) / entry_avg_price
// 4. 触发判断:
// - 止损 if pnl_pct ≤ stop_loss_pct AND opened > cooldown
// - 时间 if opened > time_close_days AND |drift|<10pp 30d
// - redeem if settled + redeemable
// 5. 触发 → fire via /api/predictions/order with rule.owner_ack_token in X-Owner-Ack header
// (daemon 不需 Owner 当场 ack — 规则 ack 时已派生 token 覆盖未来 action)
// 6. 写 audit log 每次 check (不只 trigger 时)
// 7. 状态更新 + dev-alert broadcast: "🤖 [stop-loss] Sold Romania top10 1309 shares @ $0.62 (pnl -30.2%, opened 18h ago, real -$398)"
// 止盈 reactive:
// a. rule 'active' 时 daemon 把 take_profit limit_sell order 挂到 Polymarket
// b. order_id 存 rule.take_profit_limit_order_id
// c. daemon 每 tick 查 order status — 若 'matched' → 状态 'triggered_profit' + audit
}
```
## 5) UI: `/predictions` modal 加 "持仓保护" sub-tab
布局:
```
[持仓保护] tab (按 status 分组)
⏸ Pending Your Ack (3)
┌────────────────────────────────────────────────────────┐
│ Romania top10 YES 1309股 @ $0.86 │
│ 止损: $0.60 (-30%) | 止盈: $0.93 | 时间: 60d │
│ [改 stop_loss%] [改 take_profit] [改 time] [删] │
│ [✓ ACK 启用] │
└────────────────────────────────────────────────────────┘
... (其余 6 笔同样)
✓ Active (0)
... 状态 active 的规则
⚡ Triggered History
... 历史 trigger 含 tx + realized pnl
```
新仓位 fill 后 → bettor-position-protector cron detect → INSERT rule status='pending_owner_ack' → UI 显示待 ack.
## 6) Acceptance test 9 项 (J1 host 跑)
| # | Test | Pass criteria |
|---|---|---|
| 1 | Sophie 开 1 笔 fixture (10 股, cheap market) | rule INSERT status='pending_owner_ack' |
| 2 | Owner UI 点 ACK | status='active' + token 派生 |
| 3 | 临时改 entry_avg_price = current*2 (fixture 触发止损) | daemon 1 min 内 trigger market sell + audit '止损' |
| 4 | rule status 'active', take_profit limit order 挂上 Polymarket book | order_id 存 DB |
| 5 | (fixture) 价涨过 take_profit → Polymarket auto fill | daemon detect + status 'triggered_profit' |
| 6 | 改 time_close_days=0 (fixture 触发 time) | daemon trigger + audit '时间' |
| 7 | settled position 1 笔 + redeemable | auto-redeem TX |
| 8 | UI 改 rule (stop% 改 -20%) | 状态变 [...]Hex
636970685f6d73673a313a62636173743a6465762d636f6f72643a426574746f722072313339205b313737383930363432383538375d20e2809420e68c81e4bb93e887aae58aa8e4bf9de68aa4206172636869746563747572652068616e642d6f6666204a3120696d706c656d656e746f7220284f776e657220352f313620e992a6e5ae9a20e585a8e68c81e4bb93e887aae58aa8e68ea5e7aea1202b20e6af8fe8a784e58899204f776e657220e5bf852061636b290a0a404a3120404f776e657220e28094204f776e657220e992a6e5ae9a2022e4bda0e4bbace58588e6909e222e20352f313620e99990e4bbb7e58d9520626174636820e99499e4bd8d20282431303220e5ae9ee68d9f29202b20426f74746f6d73202b24353520e69caae99481203d20e7979be782b9e6a0b9e59ba0203d202a2ae6b2a1e887aae58aa8e4bf9de68aa42a2a2e20e6ada4e69eb6e69e84206669782e0a0a232320312920e88c83e59bb420284f776e6572204320e98089290a0ae585a8e68c81e4bb93202b20e69caae69da5e696b0e4bb93e887aae58aa8e68ea5e7aea12e20e58c85e68bac3a204a32203720e7ac94202b20426574746f72203020e7ac94202b20536f70686965203020e7ac94202b20e4bbbbe4bd95206675747572652063726f6e20e696b0e5a29e2e0a0a232320322920e8a7a6e58f91e58f82e695b020284f776e657220352f31362061636b2064656661756c74290a0a23232320e6ada2e68d9f0a6060600ae8a7a6e58f913a20706e6c5f70637420e289a4202d33302520414e44206f70656e65645f6174203c20286e6f77202d20313268290ae58aa8e4bd9c3a206d61726b65742073656c6c206174206265737420626964202d2024302e30312028434c4f4220e6b2a1e58e9fe7949f2073746f702c20e5bf85206461656d6f6e2074726967676572290a6060600a0a23232320e6ada2e79b882028e58886e7baa720e2809420e59ba0e9ab982068697420e4bb93e4bd8d202b31302520706e6c20e695b0e5ada6e8b68520243120e4b88de58fafe883bd290a7c20e585a5e59cbae4bbb7207c20e6ada2e79b88e8a7a6e58f91e4bbb7207c20706e6c20e7ad89e4bbb7207c0a7c2d2d2d7c2d2d2d7c2d2d2d7c0a7c20e289a52024302e3930207c20656e747279202b2024302e303420286361702024302e393929207c207e2b3525207c0a7c2024302e37352d24302e3930207c20656e747279202b2024302e3037207c207e2b313025207c0a7c2024302e35302d24302e3735207c20656e747279202b2024302e3132207c207e2b323025207c0a7c203c2024302e3530207c20656e74727920c39720312e353020286361702024302e393929207c202b353025207c0a0ae58aa8e4bd9c3a202a2ae68c82206c696d69742073656c6c204020e8a7a6e58f91e4bbb72a2a2028506f6c796d61726b657420563220434c4f4220e694afe68c812c20e7ad89e5b882e59cbae6b6a8e8bf87e69da5e590832c20e4b88de99c80206461656d6f6e2074726967676572290a0a23232320e697b6e997b420636c6f73650a6060600ae8a7a6e58f913a206f70656e65645f6174203c20286e6f77202d203630642920414e44207c64726966745f70707c203c203130707020e68c81e7bbad203330640ae58aa8e4bd9c3a206d61726b65742073656c6c2028e9878ae694bee6adbbe992b1290a6060600a0a23232320536574746c656d656e74206175746f2d72656465656d0a6060600ae8a7a6e58f913a20736574746c65643d7472756520414e442072656465656d61626c653d747275650ae58aa8e4bd9c3a20e993be2072656465656d20545820283d20e694b6e992b12c20e99bb6e9a38ee999a9290a6060600a0a23232320536574746c656d656e7420737475636b20e68aa5e8ada60a6060600ae8a7a6e58f913a20736574746c65643d7472756520414e4420766572646963743d50454e44494e4720414e4420656e645f64617465203c20286e6f77202d203764290ae58aa8e4bd9c3a206465762d616c65727420e68aa5e8ada62028554d41206f7261636c6520e69585e99a9c2c20e4b88de887aae58aa820616374696f6e290a6060600a0a232320332920e695b0e68daee5ba9320736368656d61202876313132206d6967726174696f6e290a0a23232320706f736974696f6e5f70726f746563745f72756c65730a60606073716c0a435245415445205441424c4520706f736974696f6e5f70726f746563745f72756c657320280a202069642054455854205052494d415259204b45592c0a202072656c61795f6e6f64655f69642054455854204e4f54204e554c4c2c0a20206d61726b65745f736c75672054455854204e4f54204e554c4c2c0a2020746f6b656e5f69642054455854204e4f54204e554c4c2c0a2020736964652054455854204e4f54204e554c4c2c20202020202020202020202d2d202759455327207c20274e4f270a2020656e7472795f6176675f7072696365205245414c204e4f54204e554c4c2c0a202063757272656e745f73697a65205245414c204e4f54204e554c4c2c0a20202d2d2074726967676572730a202073746f705f6c6f73735f706374205245414c2c20202020202020202020202d2d20652e672e202d302e33300a2020636f6f6c646f776e5f686f75727320494e54454745522c202020202020202d2d20652e672e2031320a202074616b655f70726f6669745f7072696365205245414c2c202020202020202d2d20e8a7a6e58f91e4bbb7e7bb9de5afb9e580bc0a202074616b655f70726f6669745f6c696d69745f6f726465725f696420544558542c0a202074696d655f636c6f73655f6461797320494e54454745522c0a20202d2d2073746174650a20207374617475732054455854204e4f54204e554c4c2c2020202020202020202d2d2070656e64696e675f6f776e65725f61636b207c20616374697665207c207472696767657265645f73746f70207c207472696767657265645f70726f666974207c207472696767657265645f74696d65207c2063616e63656c6c6564207c20736574746c65640a20206f776e65725f61636b5f746f6b656e20544558542c2020202020202020202d2d20484d414320746f6b656e204f776e657220554920e782b92061636b20e697b6e7adbee58f912028e590ab206d61785f7072696365202b206d61785f73697a6520e8beb9e7958c2c206461656d6f6e206669726520e794a8e6ada420746f6b656e290a20206f776e65725f61636b5f61742054494d455354414d502c0a2020637265617465645f61742054494d455354414d502044454641554c542043555252454e545f54494d455354414d502c0a20207472696767657265645f61742054494d455354414d502c0a2020747269676765725f616374696f6e5f74785f6861736820544558542c0a2020747269676765725f7265616c697a65645f706e6c205245414c2c0a2020554e495155452872656c61795f6e6f64655f69642c20746f6b656e5f6964290a293b0a6060600a0a23232320706f736974696f6e5f70726f746563745f61756469740a60606073716c0a435245415445205441424c4520706f736974696f6e5f70726f746563745f617564697420280a202069642054455854205052494d415259204b45592c0a202072756c655f69642054455854204e4f54204e554c4c2c0a2020636865636b5f61742054494d455354414d502044454641554c542043555252454e545f54494d455354414d502c0a202063757272656e745f7072696365205245414c2c0a202063757272656e745f706e6c5f706374205245414c2c0a2020747269676765725f666972656420544558542c20202020202020202020202d2d2073746f70207c2070726f666974207c2074696d65207c2072656465656d207c206e6f6e650a2020616374696f6e5f74616b656e20544558542c2020202020202020202020202d2d206d61726b65745f73656c6c207c206c696d69745f73656c6c5f706c61636564207c2072656465656d207c206e6f6e650a202074785f6861736820544558542c0a202066696c6c5f7072696365205245414c2c0a20206e6f74657320544558540a293b0a6060600a0a232320342920536572766963653a2060626574746f722d706f736974696f6e2d70726f746563746f722e6a73602028e696b0206461656d6f6e2c2031206d696e2063726f6e290a0a6060606a730a6173796e632066756e6374696f6e207469636b2829207b0a20202f2f20312e20e689abe68980e69c892072756c6573207374617475733d27616374697665270a20202f2f20322e207065722072756c653a20717565727920506f6c796d61726b65742067616d6d6120e78eb0e4bbb7202b20626f6f6b2028243130303020646570746820636865636b290a20202f2f20332e20e7ae972063757272656e745f706e6c5f706374203d20286375725f7072696365202d20656e7472795f6176675f707269636529202f20656e7472795f6176675f70726963650a20202f2f20342e20e8a7a6e58f91e588a4e696ad3a0a20202f2f202020202d20e6ada2e68d9f20696620706e6c5f70637420e289a42073746f705f6c6f73735f70637420414e44206f70656e6564203e20636f6f6c646f776e0a20202f2f202020202d20e697b6e997b4206966206f70656e6564203e2074696d655f636c6f73655f6461797320414e44207c64726966747c3c31307070203330640a20202f2f202020202d2072656465656d20696620736574746c6564202b2072656465656d61626c650a20202f2f20352e20e8a7a6e58f9120e28692206669726520766961202f6170692f70726564696374696f6e732f6f7264657220776974682072756c652e6f776e65725f61636b5f746f6b656e20696e20582d4f776e65722d41636b206865616465720a20202f2f20202020286461656d6f6e20e4b88de99c80204f776e657220e5bd93e59cba2061636b20e2809420e8a784e588992061636b20e697b6e5b7b2e6b4bee7949f20746f6b656e20e8a686e79b96e69caae69da520616374696f6e290a20202f2f20362e20e58699206175646974206c6f6720e6af8fe6aca120636865636b2028e4b88de58faa207472696767657220e697b6290a20202f2f20372e20e78ab6e68081e69bb4e696b0202b206465762d616c6572742062726f6164636173743a2022f09fa496205b73746f702d6c6f73735d20536f6c6420526f6d616e696120746f70313020313330392073686172657320402024302e36322028706e6c202d33302e32252c206f70656e6564203138682061676f2c207265616c202d2433393829220a0a20202f2f20e6ada2e79b882072656163746976653a0a20202f2f20202020612e2072756c6520276163746976652720e697b6206461656d6f6e20e68a8a2074616b655f70726f666974206c696d69745f73656c6c206f7264657220e68c82e588b020506f6c796d61726b65740a20202f2f20202020622e206f726465725f696420e5ad982072756c652e74616b655f70726f6669745f6c696d69745f6f726465725f69640a20202f2f20202020632e206461656d6f6e20e6af8f207469636b20e69fa5206f726465722073746174757320e2809420e88ba520276d6174636865642720e2869220e78ab6e6808120277472696767657265645f70726f66697427202b2061756469740a7d0a6060600a0a23232035292055493a20602f70726564696374696f6e7360206d6f64616c20e58aa02022e68c81e4bb93e4bf9de68aa422207375622d7461620a0ae5b883e5b1803a0a6060600a5be68c81e4bb93e4bf9de68aa45d207461622028e68c892073746174757320e58886e7bb84290a0ae28fb82050656e64696e6720596f75722041636b202833290ae2948ce29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e294900ae2948220526f6d616e696120746f703130205945532031333039e882a120402024302e38362020202020202020202020202020202020202020202020e294820ae2948220e6ada2e68d9f3a2024302e363020282d33302529207c20e6ada2e79b883a2024302e3933207c20e697b6e997b43a20363064202020202020202020e294820ae29482205be694b92073746f705f6c6f7373255d205be694b92074616b655f70726f6669745d205be694b92074696d655d205be588a05d2020202020202020e294820ae294822020202020202020202020202020202020202020202020202020202020202020202020202020202020205be29c932041434b20e590afe794a85d2020e294820ae29494e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e29480e294980a2e2e2e2028e585b6e4bd99203620e7ac94e5908ce6a0b7290a0ae29c9320416374697665202830290a2e2e2e20e78ab6e680812061637469766520e79a84e8a784e588990a0ae29aa12054726967676572656420486973746f72790a2e2e2e20e58e86e58fb2207472696767657220e590ab207478202b207265616c697a656420706e6c0a6060600a0ae696b0e4bb93e4bd8d2066696c6c20e5908e20e2869220626574746f722d706f736974696f6e2d70726f746563746f722063726f6e2064657465637420e2869220494e534552542072756c65207374617475733d2770656e64696e675f6f776e65725f61636b2720e2869220554920e698bee7a4bae5be852061636b2e0a0a232320362920416363657074616e63652074657374203920e9a1b920284a3120686f737420e8b791290a0a7c2023207c2054657374207c2050617373206372697465726961207c0a7c2d2d2d7c2d2d2d7c2d2d2d7c0a7c2031207c20536f7068696520e5bc80203120e7ac9420666978747572652028313020e882a12c206368656170206d61726b657429207c2072756c6520494e53455254207374617475733d2770656e64696e675f6f776e65725f61636b27207c0a7c2032207c204f776e657220554920e782b92041434b207c207374617475733d2761637469766527202b20746f6b656e20e6b4bee7949f207c0a7c2033207c20e4b8b4e697b6e694b920656e7472795f6176675f7072696365203d2063757272656e742a3220286669787475726520e8a7a6e58f91e6ada2e68d9f29207c206461656d6f6e2031206d696e20e586852074726967676572206d61726b65742073656c6c202b2061756469742027e6ada2e68d9f27207c0a7c2034207c2072756c65207374617475732027616374697665272c2074616b655f70726f666974206c696d6974206f7264657220e68c82e4b88a20506f6c796d61726b657420626f6f6b207c206f726465725f696420e5ad98204442207c0a7c2035207c2028666978747572652920e4bbb7e6b6a8e8bf872074616b655f70726f66697420e2869220506f6c796d61726b6574206175746f2066696c6c207c206461656d6f6e20646574656374202b2073746174757320277472696767657265645f70726f66697427207c0a7c2036207c20e694b92074696d655f636c6f73655f646179733d3020286669787475726520e8a7a6e58f912074696d6529207c206461656d6f6e2074726967676572202b2061756469742027e697b6e997b427207c0a7c2037207c20736574746c656420706f736974696f6e203120e7ac94202b2072656465656d61626c65207c206175746f2d72656465656d205458207c0a7c2038207c20554920e694b92072756c65202873746f702520e694b9202d32302529207c20e78ab6e68081e58f98205b2e2e2e5d