#!/usr/bin/env bash # Generate SDXL lite-wallet mainnet checkpoint entries from a fully-synced dragonxd. # Each entry is (height,"blockhash","serialized_sapling_tree") in checkpoints.rs format. # Fills the 1,770,000 -> tip gap so wallets reseed close to their birthday on rescan, # bounding the (divergence-prone) compact-block replay span. Usage: # scripts/gen-lite-checkpoints.sh [start] [step] > /tmp/new_checkpoints.txt set -euo pipefail CLI=${DRAGONX_CLI:-/home/d/dragonx/src/dragonx-cli} START=${1:-1770000} STEP=${2:-10000} tip=$("$CLI" getblockcount) end=$(( (tip / STEP) * STEP )) # Sanity: confirm the method reproduces a KNOWN checkpoint tree before trusting it. ref_hash=$("$CLI" getblockhash 1760000 | tr -d '"[:space:]') ref_tree=$("$CLI" getblockmerkletree 1760000 | tr -d '"[:space:]') expect_hash="0000545a45b8d4ee4e4b423cb1ea74d67e3a04c320c6ea2f59ee06c08f91a117" if [ "$ref_hash" != "$expect_hash" ]; then echo "ABORT: getblockhash 1760000 = $ref_hash != known $expect_hash" >&2; exit 1 fi echo "# self-check: 1760000 hash matches; tree len=${#ref_tree}" >&2 n=0 h=$START while [ "$h" -le "$end" ]; do hash=$("$CLI" getblockhash "$h" | tr -d '"[:space:]') tree=$("$CLI" getblockmerkletree "$h" | tr -d '"[:space:]') if [ -z "$hash" ] || [ -z "$tree" ]; then echo "ABORT: empty hash/tree at $h" >&2; exit 1; fi printf '\t(%s,"%s",\n\t\t"%s"\n\t),\n' "$h" "$hash" "$tree" n=$((n+1)) h=$((h+STEP)) done echo "# generated $n checkpoints from $START to $end (tip=$tip)" >&2