Files
pangolin/pay/scripts/selfcheck.sh
T
wangjia e169099524 feat(pay): selfcheck.sh 从 Bitwarden 取 xpub 跑派生自检 + 打印 xpub 便于核对(#34/34A)
rbw 取钱包 A 的 account xpub(公钥,不写死/不落盘)→ go run paywatch selfcheck 打印
前 N 个派生地址,供与 TronLink 插件/Ian Coleman 逐个核对;并打印 xpub 本身 + 长度/前缀,
便于判断存的是 Account(m/44'/195'/0')还是 BIP32(m/44'/195'/0'/0)那个(存错会全错)。
无 $() 命令替换。私钥/助记词永不进此脚本。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-09 13:33:24 +08:00

54 lines
2.1 KiB
Bash
Executable File

#!/usr/bin/env bash
# selfcheck.sh — 从 Bitwarden 取钱包 A 的 account xpub(公钥),跑 paywatch selfcheck,
# 打印前 N 个派生收款地址,供与你钱包(TronLink 插件)/ Ian Coleman 的 m/44'/195'/0'/0/i
# 逐个核对。全部一致 = 派生对齐、收款地址是你控制的。
#
# 用法:
# bash pay/scripts/selfcheck.sh [BW条目名] [地址个数]
# 例: bash pay/scripts/selfcheck.sh pangolin-pay-xpub 5
#
# xpub 是公钥、不敏感,但仍统一走 Bitwarden,不写死在脚本/仓库里。
# 私钥/助记词永远不进这里,也不该在任何联网机上出现。
set -euo pipefail
# ① Bitwarden 条目名:改成你存 xpub 的那个条目(或用第 1 个参数覆盖)。
ITEM="${1:-${PAY_XPUB_ITEM:-pangolin-pay-xpub}}"
# ② 打印几个地址(默认 5)。
COUNT="${2:-5}"
# ③ 若 xpub 存在自定义字段(不是默认密码字段),设 PAY_XPUB_FIELD=字段名。
FIELD="${PAY_XPUB_FIELD:-}"
# 切到 pay 模块目录(脚本在 pay/scripts/ 下),不依赖当前工作目录。
here="${BASH_SOURCE[0]%/*}"
[ "$here" = "${BASH_SOURCE[0]}" ] && here="."
cd "$here/.."
# 确保 Bitwarden 已解锁(rbw)。
if ! rbw unlocked >/dev/null 2>&1; then
rbw unlock
fi
# 取 xpub → 直接喂给 selfcheck(不落盘、不进 shell history)。
if [ -n "$FIELD" ]; then
rbw get --field "$FIELD" "$ITEM"
else
rbw get "$ITEM"
fi | {
IFS= read -r xpub || true
if [ -z "${xpub:-}" ]; then
echo "selfcheck: 未从 Bitwarden 条目 '$ITEM' 取到 xpub(核对条目名/字段)" >&2
exit 1
fi
echo "== paywatch selfcheck · 条目=$ITEM · 前 $COUNT 个地址 =="
echo
echo "取到的 account xpub(应等于 Ian Coleman 的『Account Extended Public Key』,即 m/44'/195'/0' 那个):"
echo " $xpub"
echo " 长度 ${#xpub} 字符 · 前缀 ${xpub:0:4}"
echo
echo "⚠️ 核对:上面这串必须 == Ian Coleman 的『Account Extended Public Key』。"
echo " 若你误存了下面那个『BIP32 Extended Public Key』(m/44'/195'/0'/0 那个),地址就会全错。"
echo
echo "派生地址(和 TronLink 插件 / Ian Coleman 的 m/44'/195'/0'/0/0.. 逐个核对):"
PAY_ACCOUNT_XPUB="$xpub" go run ./cmd/paywatch selfcheck "$COUNT"
}