Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 13 additions & 11 deletions ANCHOR.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,26 @@
## 项目概览
- 名称:Nof1 Bottom Board
- 主要组件:`AlphaBoard.js`
- 当前版本:`v1.5.1`(bugfix
- 当前版本:`v1.7.0`(feature

## 当前目标
- 当前任务:修复浏览器切回前台标签页时面板未自动折叠的问题
- 行为约束:仅在面板所在标签页位于前台时执行实时更新(含折叠/展开状态下的时间与数据刷新);保持主次面板既有交互
- 兼容策略:保留行情卡原有渲染字段(price/change/percent/ts),仅替换数据源与交易对
- 当前任务:按评审意见移除 AXS 卡片,改为 OPENAI 卡片,并继续由欧易(OKX)提供该卡片行情
- 行为约束:保持主次面板既有交互与前台轮询门控;新 source 接入需兼容现有 price/change/percent/ts 渲染字段
- 兼容策略:Binance 与 OKX 行情统一映射为 `price/change/percent/ts`,渲染层无感知切换

## 约束
- 遵循 `AGENTS.md` 中列出的沟通、流程与审计要求。
- 维护轻量、可读的前端代码结构。
- 版本号按 `v主.次.修` 维护;本次属于 bugfix,升级到 `v1.5.1`。
- 版本号按 `v主.次.修` 维护;本次属于 feature,升级到 `v1.7.0`。

## 设计笔记
- 复用现有 `visibilitychange` 前台补偿逻辑,在标签页恢复可见时优先执行自动最小化,保证回到前台后默认折叠
- 自动折叠时同步收起次面板(`setFeatureState(false)`),避免下次展开时残留展开状态造成高度突变
- 保持原有“仅前台轮询”策略不变:自动折叠后仍立即触发一次数据补偿刷新
- 将 `fetchPerpTicker` 升级为按 `source` 分流:`binance` 继续走 `fapi/v1/ticker/24hr`,`okx` 走 `api/v5/market/ticker`
- 在 FEATURE_CARDS 中保留 BTC/XAU 使用 Binance,并将第三张卡片由 AXS 调整为 OPENAI(`OPENAI-USDT-SWAP`,OKX)
- OKX 返回字段映射:`last` -> `price`;`open24h` 计算 `change`;`sodUtc0` 计算 `percent`,并统一输出比例值

## 验证记录
- 2026-05-11:按评审意见移除 AXS 并新增 OPENAI 卡片(OKX),执行 `node --check AlphaBoard.js`,语法检查通过。
- 2026-05-11:新增 FEATURE_CARDS 多 source 支持并接入 OKX AXS-SWAP,执行 `node --check AlphaBoard.js`,语法检查通过。
- 2026-02-10:修复切回前台自动折叠行为,执行 `node --check AlphaBoard.js`,语法检查通过。
- 2026-02-10:新增 AXSUSDT 永续卡片并改造折叠态为状态灯入口,执行 `node --check AlphaBoard.js`,语法检查通过。
- 2026-02-10:将 BTC/XAU 改为 USDT 永续合约行情,执行 `node --check AlphaBoard.js`,语法检查通过。
Expand All @@ -31,6 +33,6 @@
- 2026-02-10:执行 `node --check AlphaBoard.js`,语法检查通过。

## 潜在影响
- 标签页从后台切回前台时,若面板处于展开态会自动折叠;用户需要再次点击状态灯展开
- 自动折叠会同时重置次面板为收起态,减少恢复前台后的布局抖动
- 前台补偿刷新与状态点更新逻辑保持不变,不影响原有网络退避策略
- 新增 `www.okx.com` 访问依赖;若目标环境屏蔽该域名,相关卡片会显示获取失败
- OKX 的 `percent` 由日内基准价计算,和 Binance 的 24h 统计口径可能存在轻微差异
- 渲染层保持统一字段,不影响既有样式、排序与前台刷新策略
57 changes: 34 additions & 23 deletions AlphaBoard.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
// ==UserScript==
// @name Alpha Board(链上盈利数据展示/底部横排暂时/可隐藏/柔和玻璃)
// @namespace https://greasyfork.org/zh-CN/users/1211909-amazing-fish
// @version 1.5.2
// @version 1.7.0
// @description 链上实时账户看板 · 默认最小化 · 按模型独立退避 · 轻量玻璃态 UI · 低饱和 P&L · 横排 6 卡片并展示相对更新时间
// @match *://*/*
// @grant GM_xmlhttpRequest
// @grant GM_addStyle
// @grant GM_setClipboard
// @connect api.hyperliquid.xyz
// @connect fapi.binance.com
// @connect www.okx.com
// @license MIT
// ==/UserScript==

Expand All @@ -26,9 +27,9 @@
globalScope[INSTALL_FLAG] = true;

/**
* Alpha Board 1.5.2
* Alpha Board 1.7.0
* ------------------
* - 主面板展示行情卡片(BTC / XAU / AXS
* - 主面板展示行情卡片(BTC / XAU / OPENAI
* - 次面板展示多模型链上账户价值
* - Hyperliquid 地址轮询:独立退避 + 共享缓存/锁 + 无本地配置持久化
* - 行情轮询:折叠态降频,展开主面板后立即刷新
Expand Down Expand Up @@ -73,21 +74,21 @@
badge: 'BTC',
name: 'BTCUSDT · 永续',
source: '数据源 Binance Futures',
fetcher: fetchBtcPerpTicker,
fetcher: ()=>fetchPerpTicker({ source: 'binance', symbol: 'BTCUSDT' }),
},
{
key: 'xau',
badge: 'XAU',
name: 'XAUUSDT · 永续',
source: '数据源 Binance Futures',
fetcher: fetchXauPerpTicker,
fetcher: ()=>fetchPerpTicker({ source: 'binance', symbol: 'XAUUSDT' }),
},
{
key: 'axs',
badge: 'AXS',
name: 'AXSUSDT · 永续',
source: '数据源 Binance Futures',
fetcher: fetchAxsPerpTicker,
key: 'openai',
badge: 'OAI',
name: 'OPENAIUSDT · 永续',
source: '数据源 OKX Swap',
fetcher: ()=>fetchPerpTicker({ source: 'okx', symbol: 'OPENAI-USDT-SWAP' }),
},
];

Expand Down Expand Up @@ -864,8 +865,30 @@
}
}

async function fetchPerpTicker(symbol){
async function fetchPerpTicker({ source, symbol }){
try {
if (source === 'okx') {
const resp = await gmGetJson(`https://www.okx.com/api/v5/market/ticker?instId=${encodeURIComponent(symbol)}`);
const item = Array.isArray(resp?.data) ? resp.data[0] : null;
const priceRaw = item?.last ?? item?.lastPx;
const changeRaw = item?.open24h != null && priceRaw != null
? (parseFloat(priceRaw) - parseFloat(item.open24h)).toString()
: null;
const pctRaw = item?.sodUtc0 != null && priceRaw != null
? (((parseFloat(priceRaw) - parseFloat(item.sodUtc0)) / parseFloat(item.sodUtc0)) * 100).toString()
: null;
const price = priceRaw == null ? NaN : parseFloat(priceRaw);
if (!Number.isFinite(price)) return null;
const change = changeRaw == null ? NaN : parseFloat(changeRaw);
const percent = pctRaw == null ? NaN : parseFloat(pctRaw);
return {
price,
change: Number.isFinite(change) ? change : null,
percent: Number.isFinite(percent) ? percent / 100 : null,
ts: Date.now(),
};
}

const resp = await gmGetJson(`https://fapi.binance.com/fapi/v1/ticker/24hr?symbol=${encodeURIComponent(symbol)}`);
const priceRaw = resp?.lastPrice ?? resp?.weightedAvgPrice ?? resp?.price;
const changeRaw = resp?.priceChange;
Expand All @@ -885,18 +908,6 @@
}
}

async function fetchBtcPerpTicker(){
return fetchPerpTicker('BTCUSDT');
}

async function fetchXauPerpTicker(){
return fetchPerpTicker('XAUUSDT');
}

async function fetchAxsPerpTicker(){
return fetchPerpTicker('AXSUSDT');
}

function tryUseSharedResult(canon, rec){
if (!canon) return false;
const payload = getFreshSharedResult(canon);
Expand Down
4 changes: 4 additions & 0 deletions docs/audit.log
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
# 审计日志(倒序)
- 2026-05-11 feature v1.7.0:按评审意见去除 AXS 行情卡并替换为 OPENAI(`OPENAI-USDT-SWAP`,OKX);涉及 `AlphaBoard.js`、`ANCHOR.md`、`docs/audit.log`;测试命令 `node --check AlphaBoard.js`,结论:通过。

- 2026-05-11 feature v1.6.0:为 FEATURE_CARDS 新增多交易所 source 分流能力;Binance 维持 BTC/XAU 永续,AXS 卡片切换为欧易 `AXS-USDT-SWAP`;涉及 `AlphaBoard.js`、`ANCHOR.md`、`docs/audit.log`;测试命令 `node --check AlphaBoard.js`,结论:通过。

- 2026-02-10 bugfix v1.5.1:修复浏览器切回前台标签页时未自动折叠的问题;切回前台若处于展开态则自动最小化并同步收起次面板;涉及 `AlphaBoard.js`、`ANCHOR.md`、`docs/audit.log`;测试命令 `node --check AlphaBoard.js`,结论:通过。

- 2026-02-10 feature v1.5.0:新增 `AXSUSDT` 永续行情卡;折叠态入口去掉“Alpha Board”标题并改为状态灯极简显示(与顶栏状态同步);涉及 `AlphaBoard.js`、`ANCHOR.md`、`docs/audit.log`;测试命令 `node --check AlphaBoard.js`,结论:通过。
Expand Down