|
|
@@ -12,6 +12,7 @@ DEFAULT_MASTER_PUBKEY="33zmSubiizyAVzeSfKbVtLMKifm5u6VaTt9wae5K4CT6h5PLXovecjYwx
|
|
|
# 颜色输出
|
|
|
GREEN='\033[0;32m'
|
|
|
BLUE='\033[0;34m'
|
|
|
+RED='\033[0;31m'
|
|
|
NC='\033[0m'
|
|
|
|
|
|
print_info() {
|
|
|
@@ -22,6 +23,10 @@ print_success() {
|
|
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
|
|
}
|
|
|
|
|
|
+print_error() {
|
|
|
+ echo -e "${RED}[ERROR]${NC} $1"
|
|
|
+}
|
|
|
+
|
|
|
# 显示帮助
|
|
|
show_help() {
|
|
|
echo "快速UTXO归集脚本"
|
|
|
@@ -83,7 +88,11 @@ nockchain-wallet scan --master-pubkey "$MASTER_PUBKEY"
|
|
|
|
|
|
# 2. 获取所有notes
|
|
|
print_info "获取notes列表..."
|
|
|
-NOTES_OUTPUT=$(nockchain-wallet list-notes 2>&1 | strings)
|
|
|
+NOTES_OUTPUT=$(nockchain-wallet list-notes 2>&1 | strings | sed 's/\x1b\[[0-9;]*m//g')
|
|
|
+
|
|
|
+# 调试:显示原始输出格式
|
|
|
+print_info "原始notes输出格式:"
|
|
|
+echo "$NOTES_OUTPUT" | head -20
|
|
|
|
|
|
# 3. 解析notes并构建参数
|
|
|
NAMES=""
|
|
|
@@ -93,28 +102,33 @@ TOTAL_BALANCE=0
|
|
|
NOTE_COUNT=0
|
|
|
|
|
|
# 提取Name和Assets信息
|
|
|
-# Name字段是跨行的,需要特殊处理,并保持完整的方括号格式
|
|
|
-ASSETS_LINES=$(echo "$NOTES_OUTPUT" | grep "Assets:" | sed 's/.*Assets: \([0-9]*\).*/\1/')
|
|
|
+# 先处理跨行的note名称,将换行符替换为空格
|
|
|
+CLEANED_OUTPUT=$(echo "$NOTES_OUTPUT" | tr '\n' ' ' | sed 's/\[/\n\[/g' | sed 's/\]/\]\n/g' | grep '^\[' | sed 's/^\[\(.*\)\]$/\1/' | grep -E '^[A-Za-z0-9 ]{20,}$')
|
|
|
|
|
|
-# 手动构建完整的note名称
|
|
|
+# 重新构建完整的note名称
|
|
|
NAMES_LINES=""
|
|
|
while IFS= read -r line; do
|
|
|
- if [[ $line =~ Name: ]]; then
|
|
|
- # 提取前缀部分 (去掉 "- Name: [" 和行末的换行)
|
|
|
- prefix=$(echo "$line" | sed 's/^- Name: \[\(.*\)$/\1/' | sed 's/[[:space:]]*$//')
|
|
|
- # 读取下一行获取后缀部分
|
|
|
- read -r next_line
|
|
|
- # 去掉后缀末尾的 "]"
|
|
|
- suffix=$(echo "$next_line" | sed 's/\]$//')
|
|
|
- # 构建完整的note名称: [prefix suffix]
|
|
|
- full_name="[$prefix $suffix]"
|
|
|
- NAMES_LINES+="$full_name"$'\n'
|
|
|
+ if [[ -n "$line" ]]; then
|
|
|
+ # 将空格分隔的两部分重新组合成方括号格式
|
|
|
+ parts=($line)
|
|
|
+ if [[ ${#parts[@]} -eq 2 ]]; then
|
|
|
+ full_name="[${parts[0]} ${parts[1]}]"
|
|
|
+ NAMES_LINES+="$full_name"$'\n'
|
|
|
+ fi
|
|
|
fi
|
|
|
-done <<< "$NOTES_OUTPUT"
|
|
|
+done <<< "$CLEANED_OUTPUT"
|
|
|
+
|
|
|
+ASSETS_LINES=$(echo "$NOTES_OUTPUT" | grep "Assets:" | sed 's/.*Assets: \([0-9]*\).*/\1/')
|
|
|
+
|
|
|
+print_info "提取的NAMES_LINES:"
|
|
|
+echo "$NAMES_LINES" | head -10
|
|
|
+print_info "提取的ASSETS_LINES:"
|
|
|
+echo "$ASSETS_LINES" | head -10
|
|
|
|
|
|
# 将Name和Assets转换为数组(使用 mapfile 避免 set -e 下的 read -d 错误)
|
|
|
-mapfile -t NAMES_ARRAY < <(printf '%s\n' "$NAMES_LINES")
|
|
|
-mapfile -t ASSETS_ARRAY < <(printf '%s\n' "$ASSETS_LINES")
|
|
|
+# 过滤掉空行
|
|
|
+mapfile -t NAMES_ARRAY < <(printf '%s\n' "$NAMES_LINES" | grep -v '^$')
|
|
|
+mapfile -t ASSETS_ARRAY < <(printf '%s\n' "$ASSETS_LINES" | grep -v '^$')
|
|
|
|
|
|
if [[ ${#NAMES_ARRAY[@]} -eq 0 || ${#ASSETS_ARRAY[@]} -eq 0 ]]; then
|
|
|
print_info "没有找到可归集的notes"
|
|
|
@@ -137,6 +151,18 @@ for i in "${!NAMES_ARRAY[@]}"; do
|
|
|
note_name="${NAMES_ARRAY[$i]}"
|
|
|
balance="${ASSETS_ARRAY[$i]}"
|
|
|
|
|
|
+ # 验证note_name和balance不为空
|
|
|
+ if [[ -z "$note_name" || -z "$balance" ]]; then
|
|
|
+ print_error "发现空的note名称或余额,跳过: name='$note_name', balance='$balance'"
|
|
|
+ continue
|
|
|
+ fi
|
|
|
+
|
|
|
+ # 验证balance是数字
|
|
|
+ if ! [[ "$balance" =~ ^[0-9]+$ ]]; then
|
|
|
+ print_error "发现无效的余额格式,跳过: '$balance'"
|
|
|
+ continue
|
|
|
+ fi
|
|
|
+
|
|
|
if [[ -n "$NAMES" ]]; then
|
|
|
NAMES+=","
|
|
|
RECIPIENTS+=","
|
|
|
@@ -172,11 +198,38 @@ fi
|
|
|
|
|
|
print_info "找到 $NOTE_COUNT 个notes,总余额: $TOTAL_BALANCE nicks"
|
|
|
|
|
|
+# 验证参数长度一致性
|
|
|
+NAMES_COUNT=$(echo "$NAMES" | tr ',' '\n' | grep -v '^$' | wc -l)
|
|
|
+RECIPIENTS_COUNT=$(echo "$RECIPIENTS" | tr ',' '\n' | grep -v '^$' | wc -l)
|
|
|
+GIFTS_COUNT=$(echo "$GIFTS" | tr ',' '\n' | grep -v '^$' | wc -l)
|
|
|
+
|
|
|
+print_info "调试信息:"
|
|
|
+print_info "NAMES 长度: $NAMES_COUNT"
|
|
|
+print_info "RECIPIENTS 长度: $RECIPIENTS_COUNT"
|
|
|
+print_info "GIFTS 长度: $GIFTS_COUNT"
|
|
|
+print_info "NAMES 内容: $NAMES"
|
|
|
+print_info "RECIPIENTS 内容: $RECIPIENTS"
|
|
|
+print_info "GIFTS 内容: $GIFTS"
|
|
|
+
|
|
|
+# 检查参数长度是否一致
|
|
|
+if [[ $NAMES_COUNT -ne $RECIPIENTS_COUNT || $NAMES_COUNT -ne $GIFTS_COUNT || $RECIPIENTS_COUNT -ne $GIFTS_COUNT ]]; then
|
|
|
+ print_error "参数长度不一致!"
|
|
|
+ print_error "NAMES: $NAMES"
|
|
|
+ print_error "RECIPIENTS: $RECIPIENTS"
|
|
|
+ print_error "GIFTS: $GIFTS"
|
|
|
+ exit 1
|
|
|
+fi
|
|
|
+
|
|
|
# 4. 创建归集交易
|
|
|
print_info "创建归集交易..."
|
|
|
print_info "归集到地址: $RECIPIENT"
|
|
|
print_info "手续费: $FEE nicks"
|
|
|
|
|
|
-nockchain-wallet create-tx --names "$NAMES" --recipients "$RECIPIENTS" --gifts "$GIFTS" --fee "$FEE"
|
|
|
+nock_cmd="nockchain-wallet create-tx --names \"$NAMES\" --recipients \"$RECIPIENTS\" --gifts \"$GIFTS\" --fee \"$FEE\""
|
|
|
+print_info "即将执行命令(可复制粘贴手动运行):"
|
|
|
+echo "$nock_cmd"
|
|
|
+
|
|
|
+# 使用 eval 来正确执行包含引号的命令
|
|
|
+eval "$nock_cmd"
|
|
|
|
|
|
print_success "归集完成!归集了 $NOTE_COUNT 个notes,总金额: $TOTAL_BALANCE nicks"
|