From 618dc0b4c1ff6b6983749f49336b9ac5a27b292d Mon Sep 17 00:00:00 2001 From: PolyBatch Dev Date: Sat, 4 Jul 2026 08:33:59 +0000 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=E5=8B=BE=E9=80=89=E5=90=8E?= =?UTF-8?q?=E4=BB=B7=E6=A0=BC=E5=AE=9E=E6=97=B6=E5=88=B7=E6=96=B0=20?= =?UTF-8?q?=E2=80=94=2010s=20=E8=BD=AE=E8=AF=A2=E8=AE=A2=E5=8D=95=E7=B0=BF?= =?UTF-8?q?=EF=BC=8C=E4=B8=8B=E5=8D=95=E9=99=90=E4=BB=B7=E5=BC=BA=E5=88=B6?= =?UTF-8?q?=E5=8F=96=E6=9C=80=E6=96=B0=20book?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 勾选 bin 后价格不再冻结:recompute/bookFor 增加 fresh 参数, 每 10 秒强制拉新订单簿重算(下单中暂停轮询),无需刷新整页。 submitLeg 填限价时也强制取最新 book,避免用 30s 缓存价挂偏。 Co-Authored-By: Claude Fable 5 --- content.js | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/content.js b/content.js index 623420a..a8a2b20 100644 --- a/content.js +++ b/content.js @@ -131,16 +131,16 @@ function tokenFor(bin) { return state.dir === 'YES' ? bin.yesToken : bin.noToken; } - async function bookFor(bin) { + async function bookFor(bin, fresh) { const tok = tokenFor(bin); const c = bookCache[tok]; - if (c && (Date.now() - c.ts) < 30000) return c.book; + if (!fresh && c && (Date.now() - c.ts) < 30000) return c.book; const book = await fetchBook(tok); bookCache[tok] = { book, ts: Date.now() }; return book; } - async function recompute() { + async function recompute(fresh) { const gen = ++_gen; const avgPrices = []; let ok = true, totalShares = 0; @@ -149,7 +149,7 @@ if (!cell) continue; if (!state.checked.has(i)) { cell.textContent = '·'; cell.className = 'pb-leg-cost'; continue; } let book; - try { book = await bookFor(state.bins[i]); } + try { book = await bookFor(state.bins[i], fresh); } catch { if (gen !== _gen) return; cell.textContent = t('loadFail'); cell.className = 'pb-leg-cost warn'; ok = false; continue; } if (gen !== _gen) return; const r = calcLegCost(book, state.shares); @@ -272,7 +272,8 @@ await sleep(500); // 等右侧组件加载该 bin // 2. 限价(美分)→ Limit price:挂到「吃完所填股数深度的最高卖档」,否则超一档深度时剩余不成交 - const book = await bookFor(leg.bin); + // 强制拉最新订单簿:勾选到确认下单之间价格可能已变,用缓存价挂限价会挂偏 + const book = await bookFor(leg.bin, true); const cents = worstFillCents(book, leg.shares); if (cents == null) throw new Error('ask'); const priceInput = await waitEl(PB_SELECTORS.limitPriceInput); @@ -428,9 +429,13 @@ panel.querySelector('#pb-close').onclick = clearOverlay; } + // 勾选后价格跟随订单簿实时刷新:每 10 秒强制拉新 book 重算,不用刷新整页。 + // 下单流程中(_running)暂停轮询,避免与 submitLeg 的取书/填价互抢。 + const liveRefresh = setInterval(() => { if (state.checked.size && !_running) recompute(true); }, 10000); + return { slug, - destroy: () => panel.remove(), + destroy: () => { clearInterval(liveRefresh); panel.remove(); }, // 工具栏图标点一下:隐了就召唤、显着就收起 toggle: () => { panel.style.display = panel.style.display === 'none' ? '' : 'none'; }, }; From 1cc55757e89eab9e658c5a4f2016283e0b5707a9 Mon Sep 17 00:00:00 2001 From: PolyBatch Dev Date: Sat, 4 Jul 2026 09:06:28 +0000 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20WebSocket=20=E5=AE=9E=E6=97=B6?= =?UTF-8?q?=E4=BB=B7=E6=A0=BC=20=E2=80=94=20=E8=AE=A2=E5=8D=95=E7=B0=BF?= =?UTF-8?q?=E4=B8=80=E5=8F=98=E5=8D=B3=E5=88=B7=E6=96=B0=EF=BC=8C10s=20?= =?UTF-8?q?=E8=BD=AE=E8=AF=A2=E9=99=8D=E7=BA=A7=E4=B8=BA=E6=8E=89=E7=BA=BF?= =?UTF-8?q?=E5=85=9C=E5=BA=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 订阅 CLOB market 频道(勾选 bin × 当前方向的 token): book 快照直接入缓存,price_change 等事件标脏后 REST 重取, 250ms 防抖合并连发推送。订阅集变化即重连,掉线由兜底轮询自愈。 Co-Authored-By: Claude Fable 5 --- content.js | 50 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/content.js b/content.js index a8a2b20..a1f10b1 100644 --- a/content.js +++ b/content.js @@ -140,7 +140,43 @@ return book; } + // 实时价:CLOB WebSocket market 频道,订单簿一变即推送。订阅集 =「勾选 bin × 当前方向」的 token, + // 该频道只在连接时订阅一次,集合变了就重连(连接很轻,勾选是低频动作)。 + const WSS = 'wss://ws-subscriptions-clob.polymarket.com/ws/market'; + let ws = null, wsAssets = '', wsPing = null, wsDebounce = null; + function syncWS() { + const assets = [...state.checked].map(i => tokenFor(state.bins[i])).filter(Boolean).sort(); + const key = assets.join(','); + if (key === wsAssets) return; + wsAssets = key; + clearInterval(wsPing); + if (ws) { ws.onclose = null; ws.close(); ws = null; } + if (!assets.length) return; + const sock = ws = new WebSocket(WSS); + sock.onopen = () => { + sock.send(JSON.stringify({ type: 'market', assets_ids: assets })); + wsPing = setInterval(() => { if (sock.readyState === 1) sock.send('PING'); }, 10000); // 不 PING 会被服务端断开 + }; + sock.onmessage = (e) => { + let evs; try { evs = JSON.parse(e.data); } catch { return; } // PONG 等非 JSON 心跳 + let dirty = false; + for (const ev of [].concat(evs)) { + if (!ev || !ev.asset_id) continue; + // book 快照直接入缓存(与 REST /book 同为 asks:[{price,size}]);其余事件(price_change 等)标脏待 REST 重取 + if (ev.event_type === 'book' && ev.asks) bookCache[ev.asset_id] = { book: ev, ts: Date.now() }; + else delete bookCache[ev.asset_id]; + dirty = true; + } + if (!dirty) return; + clearTimeout(wsDebounce); + wsDebounce = setTimeout(() => { if (!_running) recompute(); }, 250); // 合并连发推送,一次重算 + }; + // 掉线:清状态,10s 兜底轮询里的 recompute → syncWS 会自动重连 + sock.onclose = () => { if (ws === sock) { ws = null; wsAssets = ''; clearInterval(wsPing); } }; + } + async function recompute(fresh) { + syncWS(); // 勾选/方向一变,这里是唯一汇聚点:顺带对齐 WS 订阅集 const gen = ++_gen; const avgPrices = []; let ok = true, totalShares = 0; @@ -429,13 +465,19 @@ panel.querySelector('#pb-close').onclick = clearOverlay; } - // 勾选后价格跟随订单簿实时刷新:每 10 秒强制拉新 book 重算,不用刷新整页。 - // 下单流程中(_running)暂停轮询,避免与 submitLeg 的取书/填价互抢。 - const liveRefresh = setInterval(() => { if (state.checked.size && !_running) recompute(true); }, 10000); + // 兜底轮询:仅 WS 未连上(初连失败/掉线)时每 10 秒强拉一次,recompute 内的 syncWS 顺带重连。 + // 下单流程中(_running)不刷,避免与 submitLeg 的取书/填价互抢。 + const liveRefresh = setInterval(() => { + if (state.checked.size && !_running && !(ws && ws.readyState === 1)) recompute(true); + }, 10000); return { slug, - destroy: () => { clearInterval(liveRefresh); panel.remove(); }, + destroy: () => { + clearInterval(liveRefresh); clearInterval(wsPing); clearTimeout(wsDebounce); + if (ws) { ws.onclose = null; ws.close(); } + panel.remove(); + }, // 工具栏图标点一下:隐了就召唤、显着就收起 toggle: () => { panel.style.display = panel.style.display === 'none' ? '' : 'none'; }, }; From 0eb465b4df507489f14522122427cc7a14c0ebfc Mon Sep 17 00:00:00 2001 From: PolyBatch Dev Date: Sat, 4 Jul 2026 09:12:23 +0000 Subject: [PATCH 3/3] =?UTF-8?q?chore:=20=E9=87=8D=E6=89=93=E5=8C=85=20poly?= =?UTF-8?q?batch-ext.zip=EF=BC=88=E5=90=AB=20WebSocket=20=E5=AE=9E?= =?UTF-8?q?=E6=97=B6=E4=BB=B7=E6=A0=BC=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- polybatch-ext.zip | Bin 50373 -> 51470 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/polybatch-ext.zip b/polybatch-ext.zip index 1e4f89a077bbb8fbcae22a4a11d134f8c6ecc44a..1c03bfb76d89d102abed8ae092e3708fe42a60a0 100644 GIT binary patch delta 11316 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