<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://docs.eawf.com/index.php?action=history&amp;feed=atom&amp;title=Scripts</id>
	<title>Scripts - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://docs.eawf.com/index.php?action=history&amp;feed=atom&amp;title=Scripts"/>
	<link rel="alternate" type="text/html" href="https://docs.eawf.com/index.php?title=Scripts&amp;action=history"/>
	<updated>2026-08-15T02:50:48Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://docs.eawf.com/index.php?title=Scripts&amp;diff=255&amp;oldid=prev</id>
		<title>Admin: Created page with &quot;&lt;syntaxhighlight lang=&quot;bash&quot;&gt;  #!/usr/bin/env bash # # btc — Bitcoin Core + ckpool control utility # DESC: Bitcoin Core, Mining, and Wallet Manager # Description: #   Unified command-line control tool for operating a local Bitcoin Core node #   and ckpool solo mining setup. Provides commands for: #       • Core start / stop / restart #       • Node and mining status dashboard #       • ckpool control and payout address rotation #       • Wallet management and a...&quot;</title>
		<link rel="alternate" type="text/html" href="https://docs.eawf.com/index.php?title=Scripts&amp;diff=255&amp;oldid=prev"/>
		<updated>2026-06-10T07:45:53Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;  #!/usr/bin/env bash # # btc — Bitcoin Core + ckpool control utility # DESC: Bitcoin Core, Mining, and Wallet Manager # Description: #   Unified command-line control tool for operating a local Bitcoin Core node #   and ckpool solo mining setup. Provides commands for: #       • Core start / stop / restart #       • Node and mining status dashboard #       • ckpool control and payout address rotation #       • Wallet management and a...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#!/usr/bin/env bash&lt;br /&gt;
#&lt;br /&gt;
# btc — Bitcoin Core + ckpool control utility&lt;br /&gt;
# DESC: Bitcoin Core, Mining, and Wallet Manager&lt;br /&gt;
# Description:&lt;br /&gt;
#   Unified command-line control tool for operating a local Bitcoin Core node&lt;br /&gt;
#   and ckpool solo mining setup. Provides commands for:&lt;br /&gt;
#       • Core start / stop / restart&lt;br /&gt;
#       • Node and mining status dashboard&lt;br /&gt;
#       • ckpool control and payout address rotation&lt;br /&gt;
#       • Wallet management and archival&lt;br /&gt;
#&lt;br /&gt;
# Usage:&lt;br /&gt;
#   btc &amp;lt;command&amp;gt;&lt;br /&gt;
#&lt;br /&gt;
# Configuration:&lt;br /&gt;
#   Reads configuration from the first readable file:&lt;br /&gt;
#       /media/bob/BTC/.btc.conf&lt;br /&gt;
#       /etc/bitcoin/.btc.conf&lt;br /&gt;
#       ~/.config/bitcoin/.btc.conf&lt;br /&gt;
#&lt;br /&gt;
# Requirements:&lt;br /&gt;
#   • Bitcoin Core (bitcoind + bitcoin-cli)&lt;br /&gt;
#   • ckpool (optional but expected for mining functions)&lt;br /&gt;
#   • Bash shell&lt;br /&gt;
#&lt;br /&gt;
# Authors:&lt;br /&gt;
#   Bob Holden (operator / design)&lt;br /&gt;
#   ChatGPT (OpenAI) — development assistance&lt;br /&gt;
#&lt;br /&gt;
# License:&lt;br /&gt;
#   Intended for personal and educational use. May be freely modified&lt;br /&gt;
#   and redistributed.&lt;br /&gt;
#&lt;br /&gt;
VERSION=&amp;quot;2.4.0&amp;quot;&lt;br /&gt;
PROG=&amp;quot;$(basename -- &amp;quot;$0&amp;quot;)&amp;quot;&lt;br /&gt;
SCRIPT_PATH=&amp;quot;$(readlink -f &amp;quot;$0&amp;quot;)&amp;quot;&lt;br /&gt;
BTCPATH=&amp;quot;/home/bob/bitcoin&amp;quot;&lt;br /&gt;
BTCBIN=&amp;quot;${BTCPATH}/bin&amp;quot;&lt;br /&gt;
FDATE=&amp;quot;$(stat -c %Y &amp;quot;$SCRIPT_PATH&amp;quot; | xargs -I{} date -d @{} &amp;#039;+%Y%m%d:%H%M&amp;#039;)&amp;quot;&lt;br /&gt;
BITAXE_URL=&amp;quot;http://192.168.123.68&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# ---- Built-in ANSI colors ----&lt;br /&gt;
if [ -t 1 ]; then&lt;br /&gt;
  RCol=&amp;#039;\033[0m&amp;#039;&lt;br /&gt;
  BRed=&amp;#039;\033[1;31m&amp;#039;&lt;br /&gt;
  BIGre=&amp;#039;\033[1;32m&amp;#039;&lt;br /&gt;
  BIYel=&amp;#039;\033[1;33m&amp;#039;&lt;br /&gt;
  BIBlu=&amp;#039;\033[1;34m&amp;#039;&lt;br /&gt;
  BWhi=&amp;#039;\033[1;37m&amp;#039;&lt;br /&gt;
else&lt;br /&gt;
  RCol=&amp;quot;&amp;quot;; BRed=&amp;quot;&amp;quot;; BIGre=&amp;quot;&amp;quot;; BIYel=&amp;quot;&amp;quot;; BIBlu=&amp;quot;&amp;quot;; BWhi=&amp;quot;&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
die(){ echo -e &amp;quot;${BRed}ERROR: $*${RCol}&amp;quot; &amp;gt;&amp;amp;2; exit 1; }&lt;br /&gt;
&lt;br /&gt;
spinner() {&lt;br /&gt;
  local pid=&amp;quot;$1&amp;quot;&lt;br /&gt;
  local msg=&amp;quot;$2&amp;quot;&lt;br /&gt;
  local spin=&amp;#039;|/-\&amp;#039;&lt;br /&gt;
  local i=0&lt;br /&gt;
&lt;br /&gt;
  while kill -0 &amp;quot;$pid&amp;quot; 2&amp;gt;/dev/null; do&lt;br /&gt;
    printf &amp;quot;%s %c\r&amp;quot; &amp;quot;$msg&amp;quot; &amp;quot;${spin:i++%4:1}&amp;quot;&lt;br /&gt;
    sleep 0.1&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
  printf &amp;#039;%-100s\r&amp;#039; &amp;quot;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
wait_core() {&lt;br /&gt;
  local msg=&amp;quot;${1:-Waiting for Core RPC}&amp;quot;&lt;br /&gt;
  local spin=&amp;#039;|/-\&amp;#039;&lt;br /&gt;
  local i=0&lt;br /&gt;
&lt;br /&gt;
  while ! cli getblockchaininfo &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; do&lt;br /&gt;
    printf &amp;quot;%s %c\r&amp;quot; &amp;quot;$msg&amp;quot; &amp;quot;${spin:i++%4:1}&amp;quot;&lt;br /&gt;
    sleep 0.2&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
  printf &amp;#039;%-100s\r&amp;#039; &amp;quot;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
wait_ibd() {&lt;br /&gt;
  local spin=&amp;#039;|/-\&amp;#039;&lt;br /&gt;
  local i=0&lt;br /&gt;
&lt;br /&gt;
  while cli getblockchaininfo 2&amp;gt;/dev/null | grep -q &amp;#039;&amp;quot;initialblockdownload&amp;quot;[[:space:]]*:[[:space:]]*true&amp;#039;; do&lt;br /&gt;
    printf &amp;quot;Core: syncing blocks %c\r&amp;quot; &amp;quot;${spin:i++%4:1}&amp;quot;&lt;br /&gt;
    sleep 1&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
  printf &amp;#039;%-100s\r&amp;#039; &amp;quot;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
wait_txindex() {&lt;br /&gt;
  local spin=&amp;#039;|/-\&amp;#039;&lt;br /&gt;
  local i=0&lt;br /&gt;
  local idx synced&lt;br /&gt;
&lt;br /&gt;
  while :; do&lt;br /&gt;
    idx=&amp;quot;$(cli getindexinfo 2&amp;gt;/dev/null)&amp;quot;&lt;br /&gt;
    [ -z &amp;quot;$idx&amp;quot; ] &amp;amp;&amp;amp; break&lt;br /&gt;
    ! echo &amp;quot;$idx&amp;quot; | grep -q &amp;#039;&amp;quot;txindex&amp;quot;&amp;#039; &amp;amp;&amp;amp; break&lt;br /&gt;
&lt;br /&gt;
    synced=&amp;quot;$(echo &amp;quot;$idx&amp;quot; | grep -A3 &amp;#039;&amp;quot;txindex&amp;quot;&amp;#039; | grep -oE &amp;#039;&amp;quot;synced&amp;quot;[[:space:]]*:[[:space:]]*(true|false)&amp;#039; | head -1 | grep -oE &amp;#039;(true|false)&amp;#039;)&amp;quot;&lt;br /&gt;
    [ &amp;quot;$synced&amp;quot; = &amp;quot;true&amp;quot; ] &amp;amp;&amp;amp; break&lt;br /&gt;
&lt;br /&gt;
    printf &amp;quot;Core: indexing txindex %c\r&amp;quot; &amp;quot;${spin:i++%4:1}&amp;quot;&lt;br /&gt;
    sleep 1&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
  printf &amp;#039;%-100s\r&amp;#039; &amp;quot;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
wait_ckpool() {&lt;br /&gt;
  local msg=&amp;quot;${1:-Waiting for ckpool}&amp;quot;&lt;br /&gt;
  local spin=&amp;#039;|/-\&amp;#039;&lt;br /&gt;
  local i=0&lt;br /&gt;
&lt;br /&gt;
  while ! ck_running; do&lt;br /&gt;
    printf &amp;quot;%s %c\r&amp;quot; &amp;quot;$msg&amp;quot; &amp;quot;${spin:i++%4:1}&amp;quot;&lt;br /&gt;
    sleep 0.2&lt;br /&gt;
  done&lt;br /&gt;
&lt;br /&gt;
  printf &amp;#039;%-100s\r&amp;#039; &amp;quot;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# ---- Load config (first readable wins) ----&lt;br /&gt;
load_cfg() {&lt;br /&gt;
  local cfg&lt;br /&gt;
  for cfg in \&lt;br /&gt;
    &amp;quot;/media/bob/BTC/.btc.conf&amp;quot; \&lt;br /&gt;
    &amp;quot;/etc/bitcoin/.btc.conf&amp;quot; \&lt;br /&gt;
    &amp;quot;$HOME/.config/bitcoin/.btc.conf&amp;quot;&lt;br /&gt;
  do&lt;br /&gt;
    if [ -r &amp;quot;$cfg&amp;quot; ]; then&lt;br /&gt;
      # shellcheck disable=SC1090&lt;br /&gt;
      source &amp;quot;$cfg&amp;quot;&lt;br /&gt;
      CFG_LOADED_FROM=&amp;quot;$cfg&amp;quot;&lt;br /&gt;
      return 0&lt;br /&gt;
    fi&lt;br /&gt;
  done&lt;br /&gt;
  die &amp;quot;No config found.&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# ---- Helpers ----&lt;br /&gt;
cli() {&lt;br /&gt;
  &amp;quot;$BTCBIN/bitcoin-cli&amp;quot; -datadir=&amp;quot;$DATADIR&amp;quot; &amp;quot;$@&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
wcli() {&lt;br /&gt;
  local w=&amp;quot;$1&amp;quot;&lt;br /&gt;
  shift&lt;br /&gt;
  &amp;quot;$BTCBIN/bitcoin-cli&amp;quot; -datadir=&amp;quot;$DATADIR&amp;quot; -rpcwallet=&amp;quot;$w&amp;quot; &amp;quot;$@&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
usage() {&lt;br /&gt;
  clear&lt;br /&gt;
  cat &amp;lt;&amp;lt;TXT&lt;br /&gt;
Usage: btc &amp;lt;command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Core                  Bitaxe                       Wallet&lt;br /&gt;
----------------      -------------------------    ------------------------&lt;br /&gt;
start                 ckstart                      wlist&lt;br /&gt;
stop                  ckstop                       wdir&lt;br /&gt;
restart               cklog                        wcreate   &amp;lt;wallet&amp;gt;&lt;br /&gt;
status                ckaddr                       wload     &amp;lt;wallet&amp;gt;&lt;br /&gt;
log                                                wunload   &amp;lt;wallet&amp;gt;&lt;br /&gt;
paths                 bitaxe                       winfo     &amp;lt;wallet&amp;gt;&lt;br /&gt;
rate(USD/BTC)                                      wbal      &amp;lt;wallet&amp;gt;&lt;br /&gt;
version                                            wnew      &amp;lt;wallet&amp;gt; [label]&lt;br /&gt;
upgrade ##.#[.#.#]                                 warchive  &amp;lt;wallet&amp;gt;&lt;br /&gt;
                                                   warchived&lt;br /&gt;
                                                   wwatch    &amp;lt;wallet&amp;gt;&lt;br /&gt;
TXT&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
paths() {&lt;br /&gt;
  echo &amp;quot;cfg:        $CFG_LOADED_FROM&amp;quot;&lt;br /&gt;
  echo &amp;quot;btcbin:     $BTCBIN&amp;quot;&lt;br /&gt;
  echo &amp;quot;datadir:    $DATADIR&amp;quot;&lt;br /&gt;
  echo &amp;quot;wallets:    $DATADIR/&amp;lt;walletname&amp;gt;&amp;quot;&lt;br /&gt;
  echo &amp;quot;core conf:  $DATADIR/bitcoin.conf&amp;quot;&lt;br /&gt;
  echo &amp;quot;ck conf:    $CKPOOL_CONF&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# ---- Core ----&lt;br /&gt;
start() {&lt;br /&gt;
  &amp;quot;$BTCBIN/bitcoind&amp;quot; -datadir=&amp;quot;$DATADIR&amp;quot; -daemon || die &amp;quot;Failed to start bitcoind&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  wait_core &amp;quot;Waiting for Core RPC&amp;quot;&lt;br /&gt;
  wait_ibd&lt;br /&gt;
  wait_txindex&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;Bitcoin Core running&amp;quot;&lt;br /&gt;
  status&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
stop() {&lt;br /&gt;
  if cli stop &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
    :&lt;br /&gt;
  else&lt;br /&gt;
    if ! pgrep -x bitcoind &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
      echo &amp;quot;Core already stopped&amp;quot;&lt;br /&gt;
      status&lt;br /&gt;
      return 0&lt;br /&gt;
    fi&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;Waiting for bitcoind to stop...&amp;quot;&lt;br /&gt;
  while pgrep -x bitcoind &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; do&lt;br /&gt;
    sleep 1&lt;br /&gt;
  done&lt;br /&gt;
  echo &amp;quot;Core stopped&amp;quot;&lt;br /&gt;
  status&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
restart() {&lt;br /&gt;
  local ck_was_running=0&lt;br /&gt;
&lt;br /&gt;
  if ck_running; then&lt;br /&gt;
    ck_was_running=1&lt;br /&gt;
    echo &amp;quot;Stopping ckpool...&amp;quot;&lt;br /&gt;
    ckstop&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;Restarting Core...&amp;quot;&lt;br /&gt;
  stop&lt;br /&gt;
  sleep 2&lt;br /&gt;
  start&lt;br /&gt;
&lt;br /&gt;
  if [ &amp;quot;$ck_was_running&amp;quot; -eq 1 ]; then&lt;br /&gt;
    echo &amp;quot;Restarting ckpool...&amp;quot;&lt;br /&gt;
    ckstart&lt;br /&gt;
  fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
log() {&lt;br /&gt;
  tail -f &amp;quot;$DATADIR/debug.log&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bitaxe() {&lt;br /&gt;
# echo off&lt;br /&gt;
  curl -s &amp;quot;$BITAXE_URL/api/system/info&amp;quot; | jq .&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fmt_hms() {&lt;br /&gt;
  local s=&amp;quot;${1:-0}&amp;quot;&lt;br /&gt;
  printf &amp;#039;%02d:%02d:%02d&amp;#039; $((s/3600)) $(((s%3600)/60)) $((s%60))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fmt_commas() {&lt;br /&gt;
  printf &amp;quot;%s&amp;quot; &amp;quot;$1&amp;quot; | sed &amp;#039;:a;s/\B[0-9]\{3\}\&amp;gt;/,&amp;amp;/;ta&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
status() {&lt;br /&gt;
  clear&lt;br /&gt;
&lt;br /&gt;
  local now j blocks peers mempool txindex addr pool&lt;br /&gt;
  local ax_result ax_state ax_uptime ax_hash ax_acc ax_rej ax_stale ax_temp ax_vrtemp ax_fan ax_wifi ax_bestdiff&lt;br /&gt;
  local uptime_hms stale_pct acc_fmt stale_fmt&lt;br /&gt;
  local spin=&amp;#039;|/-\&amp;#039;&lt;br /&gt;
  local i=0&lt;br /&gt;
&lt;br /&gt;
  now=&amp;quot;$(date &amp;#039;+%Y-%m-%d %H:%M&amp;#039;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  # ---- Bitaxe Parsing Block&lt;br /&gt;
   exec 3&amp;lt; &amp;lt;(&lt;br /&gt;
    ax=&amp;quot;$(curl -fsS --connect-timeout 1 --max-time 1 &amp;quot;${BITAXE_URL}/api/system/info&amp;quot; 2&amp;gt;/dev/null)&amp;quot;&lt;br /&gt;
    uptime=&amp;quot;$(echo &amp;quot;$ax&amp;quot;   | grep -oE &amp;#039;&amp;quot;uptimeSeconds&amp;quot;[[:space:]]*:[[:space:]]*[0-9]+&amp;#039;    | head -1 | grep -oE &amp;#039;[0-9]+&amp;#039;)&amp;quot;&lt;br /&gt;
    hash1m=&amp;quot;$(echo &amp;quot;$ax&amp;quot; | grep -oE &amp;#039;&amp;quot;hashRate_1m&amp;quot;[[:space:]]*:[[:space:]]*[0-9.]+&amp;#039; | head -1 | sed -E &amp;#039;s/.*:[[:space:]]*//&amp;#039;)&amp;quot;&lt;br /&gt;
    accepted=&amp;quot;$(echo &amp;quot;$ax&amp;quot; | grep -oE &amp;#039;&amp;quot;sharesAccepted&amp;quot;[[:space:]]*:[[:space:]]*[0-9]+&amp;#039;    | head -1 | grep -oE &amp;#039;[0-9]+&amp;#039;)&amp;quot;&lt;br /&gt;
    rejected=&amp;quot;$(echo &amp;quot;$ax&amp;quot; | grep -oE &amp;#039;&amp;quot;sharesRejected&amp;quot;[[:space:]]*:[[:space:]]*[0-9]+&amp;#039;    | head -1 | grep -oE &amp;#039;[0-9]+&amp;#039;)&amp;quot;&lt;br /&gt;
    temp=&amp;quot;$(echo &amp;quot;$ax&amp;quot;     | grep -oE &amp;#039;&amp;quot;temp&amp;quot;[[:space:]]*:[[:space:]]*-?[0-9]+&amp;#039;            | head -1 | grep -oE -- &amp;#039;-?[0-9]+&amp;#039;)&amp;quot;&lt;br /&gt;
    vrtemp=&amp;quot;$(echo &amp;quot;$ax&amp;quot;   | grep -oE &amp;#039;&amp;quot;vrTemp&amp;quot;[[:space:]]*:[[:space:]]*-?[0-9]+&amp;#039;          | head -1 | grep -oE -- &amp;#039;-?[0-9]+&amp;#039;)&amp;quot;&lt;br /&gt;
    fan=&amp;quot;$(echo &amp;quot;$ax&amp;quot;      | grep -oE &amp;#039;&amp;quot;fanrpm&amp;quot;[[:space:]]*:[[:space:]]*[0-9]+&amp;#039;            | head -1 | grep -oE &amp;#039;[0-9]+&amp;#039;)&amp;quot;&lt;br /&gt;
    wifi=&amp;quot;$(echo &amp;quot;$ax&amp;quot;     | grep -oE &amp;#039;&amp;quot;wifiRSSI&amp;quot;[[:space:]]*:[[:space:]]*-?[0-9]+&amp;#039;        | head -1 | grep -oE -- &amp;#039;-?[0-9]+&amp;#039;)&amp;quot;&lt;br /&gt;
    bestdiff=&amp;quot;$(echo &amp;quot;$ax&amp;quot; | grep -oE &amp;#039;&amp;quot;bestDiff&amp;quot;[[:space:]]*:[[:space:]]*[0-9]+&amp;#039;          | head -1 | grep -oE &amp;#039;[0-9]+&amp;#039;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    stale=&amp;quot;$(echo &amp;quot;$ax&amp;quot; | awk &amp;#039;&lt;br /&gt;
      /&amp;quot;message&amp;quot;[[:space:]]*:[[:space:]]*&amp;quot;Stale&amp;quot;/ { want=1; next }&lt;br /&gt;
      want &amp;amp;&amp;amp; /&amp;quot;count&amp;quot;[[:space:]]*:/ {&lt;br /&gt;
        match($0, /[0-9]+/)&lt;br /&gt;
        print substr($0, RSTART, RLENGTH)&lt;br /&gt;
        exit&lt;br /&gt;
      }&amp;#039;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    [ -n &amp;quot;$uptime&amp;quot; ]   || uptime=0&lt;br /&gt;
    [ -n &amp;quot;$hash1m&amp;quot; ]   || hash1m=0&lt;br /&gt;
    [ -n &amp;quot;$accepted&amp;quot; ] || accepted=0&lt;br /&gt;
    [ -n &amp;quot;$rejected&amp;quot; ] || rejected=0&lt;br /&gt;
    [ -n &amp;quot;$stale&amp;quot; ]    || stale=0&lt;br /&gt;
    [ -n &amp;quot;$temp&amp;quot; ]     || temp=&amp;quot;?&amp;quot;&lt;br /&gt;
    [ -n &amp;quot;$vrtemp&amp;quot; ]   || vrtemp=&amp;quot;?&amp;quot;&lt;br /&gt;
    [ -n &amp;quot;$fan&amp;quot; ]      || fan=&amp;quot;?&amp;quot;&lt;br /&gt;
    [ -n &amp;quot;$wifi&amp;quot; ]     || wifi=&amp;quot;?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#======== hash_disp conversion from hash1m&lt;br /&gt;
&lt;br /&gt;
    s=${hash1m//$&amp;#039;\n&amp;#039;/}; s=${s//$&amp;#039;\r&amp;#039;/}&lt;br /&gt;
    upper=${s%%.*}; lower=${s#*.}; [ &amp;quot;$upper&amp;quot; = &amp;quot;$s&amp;quot; ] &amp;amp;&amp;amp; lower=&amp;quot;&amp;quot;&lt;br /&gt;
    unit=&amp;quot;GH/s&amp;quot;; whole=$upper; dec=$lower&lt;br /&gt;
    (( ${#upper} &amp;gt; 3 )) &amp;amp;&amp;amp; { unit=&amp;quot;TH/s&amp;quot;; whole=${upper:0:${#upper}-3}; dec=&amp;quot;${upper:${#upper}-3}$lower&amp;quot;; }&lt;br /&gt;
    hash_disp=&amp;quot;$whole.${dec:0:3} $unit&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#========&lt;br /&gt;
&lt;br /&gt;
    total=$((accepted + rejected))&lt;br /&gt;
    if [ &amp;quot;$total&amp;quot; -gt 0 ]; then&lt;br /&gt;
      stale_pct=&amp;quot;$(awk -v s=&amp;quot;$stale&amp;quot; -v t=&amp;quot;$total&amp;quot; &amp;#039;BEGIN { printf &amp;quot;%.2f&amp;quot;, (s/t)*100 }&amp;#039;)&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      stale_pct=&amp;quot;0.00&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    if [ -z &amp;quot;$ax&amp;quot; ]; then&lt;br /&gt;
      printf &amp;#039;STOPPED|0|0|0|0.00|?|?|?|?|0\n&amp;#039;&lt;br /&gt;
      exit 0&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    printf &amp;#039;RUNNING|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s\n&amp;#039; \&lt;br /&gt;
      &amp;quot;$uptime&amp;quot; &amp;quot;$hash_disp&amp;quot; &amp;quot;$accepted&amp;quot; &amp;quot;$stale&amp;quot; &amp;quot;$stale_pct&amp;quot; &amp;quot;$temp&amp;quot; &amp;quot;$vrtemp&amp;quot; &amp;quot;$fan&amp;quot; &amp;quot;$wifi&amp;quot; &amp;quot;$bestdiff&amp;quot;&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
  while ! read -t 0.1 -u 3 ax_result; do&lt;br /&gt;
    printf &amp;quot;Bitaxe: checking %c\r&amp;quot; &amp;quot;${spin:i++%4:1}&amp;quot;&lt;br /&gt;
  done&lt;br /&gt;
  printf &amp;#039;%-100s\r&amp;#039; &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  IFS=&amp;#039;|&amp;#039; read -r ax_state ax_uptime ax_hash ax_acc ax_stale stale_pct ax_temp ax_vrtemp ax_fan ax_wifi ax_bestdiff &amp;lt;&amp;lt;&amp;lt; &amp;quot;$ax_result&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  uptime_hms=&amp;quot;$(fmt_hms &amp;quot;$ax_uptime&amp;quot;)&amp;quot;&lt;br /&gt;
  acc_fmt=&amp;quot;$(fmt_commas &amp;quot;$ax_acc&amp;quot;)&amp;quot;&lt;br /&gt;
  stale_fmt=&amp;quot;$(fmt_commas &amp;quot;$ax_stale&amp;quot;)&amp;quot;&lt;br /&gt;
  ax_bestdiff=&amp;quot;$(fmt_commas &amp;quot;$ax_bestdiff&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  echo -e &amp;quot;Bitcoin Node Status: ${BIGre}${now}${RCol}    Uptime: ${BIGre}${uptime_hms}${RCol}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  # ---- Core ----&lt;br /&gt;
  if ! cli getblockchaininfo &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
    echo -e &amp;quot;Core:   ${BRed}STOPPED${RCol}&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
    j=&amp;quot;$(cli getblockchaininfo)&amp;quot;&lt;br /&gt;
    blocks=&amp;quot;$(echo &amp;quot;$j&amp;quot; | grep -oE &amp;#039;&amp;quot;blocks&amp;quot;[[:space:]]*:[[:space:]]*[0-9]+&amp;#039; | head -1 | grep -oE &amp;#039;[0-9]+&amp;#039;)&amp;quot;&lt;br /&gt;
    peers=&amp;quot;$(cli getconnectioncount 2&amp;gt;/dev/null)&amp;quot;&lt;br /&gt;
    mempool=&amp;quot;$(cli getmempoolinfo 2&amp;gt;/dev/null | grep -oE &amp;#039;&amp;quot;size&amp;quot;[[:space:]]*:[[:space:]]*[0-9]+&amp;#039; | grep -oE &amp;#039;[0-9]+&amp;#039;)&amp;quot;&lt;br /&gt;
    txindex=&amp;quot;$(cli getindexinfo 2&amp;gt;/dev/null | grep -A3 &amp;#039;&amp;quot;txindex&amp;quot;&amp;#039; | grep &amp;#039;&amp;quot;best_block_height&amp;quot;&amp;#039; | grep -o &amp;#039;[0-9]\+&amp;#039; | head -1)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    echo -e &amp;quot;Core:   ${BIGre}RUNNING${RCol}  block: ${BIGre}${blocks:-?}${RCol}  txindex: ${BIGre}${txindex:-?}${RCol}  mempool: ${BIGre}${mempool:-0}${RCol} txs  peers: ${BIGre}${peers:-?}${RCol}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
   # echo -e &amp;quot;Core:  ${BIGre}RUNNING${RCol}  block: ${BIGre}${blocks:-?}${RCol}  peers: ${BIGre}${peers:-?}${RCol}  mempool: ${BIGre}${mempool:-0}Txs${RCol}  txindex: ${BIGre}${txindex:-?}${RCol}&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  # ---- Pool / payout ----&lt;br /&gt;
  addr=&amp;quot;$(grep -oE &amp;#039;&amp;quot;btcaddress&amp;quot;[[:space:]]*:[[:space:]]*&amp;quot;[^&amp;quot;]+&amp;quot;&amp;#039; &amp;quot;$CKPOOL_CONF&amp;quot; \&lt;br /&gt;
        | head -1 \&lt;br /&gt;
        | sed -E &amp;#039;s/.*&amp;quot;btcaddress&amp;quot;[[:space:]]*:[[:space:]]*&amp;quot;([^&amp;quot;]+)&amp;quot;.*/\1/&amp;#039;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  if ck_running; then&lt;br /&gt;
    pool=&amp;quot;${BIGre}RUNNING${RCol}&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
    pool=&amp;quot;${BRed}STOPPED${RCol}&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  echo -e &amp;quot;Pool:   $pool&amp;quot;&lt;br /&gt;
  if [ &amp;quot;$ax_state&amp;quot; = &amp;quot;STOPPED&amp;quot; ]; then&lt;br /&gt;
    echo -e &amp;quot;Bitaxe: ${BRed}STOPPED${RCol}&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
    echo -e &amp;quot;Bitaxe: hash: ${BIGre}${ax_hash}${RCol}  shares: ${BIGre}${acc_fmt}${RCol}  stale: ${BIGre}${stale_fmt}${RCol}  stale%: ${BIGre}${stale_pct}${RCol}&amp;quot;&lt;br /&gt;
    echo -e &amp;quot;Temp:   ${BIGre}${ax_temp}${RCol}C  VRTemp: ${BIGre}${ax_vrtemp}${RCol}C  Fan: ${BIGre}${ax_fan}${RCol} RPM  WiFi: ${BIGre}${ax_wifi}${RCol} dBm&amp;quot;&lt;br /&gt;
    echo -e &amp;quot;Best:   ${BIGre}${ax_bestdiff}${RCol}&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
  echo -e &amp;quot;PayTo:  ${BIGre}${addr:-?}${RCol}&amp;quot;&lt;br /&gt;
  echo&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Bitcoin Exchange Rate&lt;br /&gt;
rate() {&lt;br /&gt;
  API=&amp;quot;https://www.bitstamp.net/api/v2/ticker/btcusd/&amp;quot;&lt;br /&gt;
  json=&amp;quot;$(curl -fsS &amp;quot;$API&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  # Parse with jq (requires: sudo apt install jq)&lt;br /&gt;
  timestamp=&amp;quot;$(jq -r &amp;#039;.timestamp&amp;#039; &amp;lt;&amp;lt;&amp;lt;&amp;quot;$json&amp;quot;)&amp;quot;&lt;br /&gt;
  open_24=&amp;quot;$(jq -r &amp;#039;.open_24&amp;#039;  &amp;lt;&amp;lt;&amp;lt;&amp;quot;$json&amp;quot;)&amp;quot;&lt;br /&gt;
  open=&amp;quot;$(jq -r &amp;#039;.open&amp;#039;        &amp;lt;&amp;lt;&amp;lt;&amp;quot;$json&amp;quot;)&amp;quot;&lt;br /&gt;
  high=&amp;quot;$(jq -r &amp;#039;.high&amp;#039;        &amp;lt;&amp;lt;&amp;lt;&amp;quot;$json&amp;quot;)&amp;quot;&lt;br /&gt;
  low=&amp;quot;$(jq -r &amp;#039;.low&amp;#039;          &amp;lt;&amp;lt;&amp;lt;&amp;quot;$json&amp;quot;)&amp;quot;&lt;br /&gt;
  last=&amp;quot;$(jq -r &amp;#039;.last&amp;#039;        &amp;lt;&amp;lt;&amp;lt;&amp;quot;$json&amp;quot;)&amp;quot;&lt;br /&gt;
  vwap=&amp;quot;$(jq -r &amp;#039;.vwap&amp;#039;        &amp;lt;&amp;lt;&amp;lt;&amp;quot;$json&amp;quot;)&amp;quot;&lt;br /&gt;
  volume=&amp;quot;$(jq -r &amp;#039;.volume&amp;#039;    &amp;lt;&amp;lt;&amp;lt;&amp;quot;$json&amp;quot;)&amp;quot;&lt;br /&gt;
  change=&amp;quot;$(jq -r &amp;#039;.percent_change_24&amp;#039; &amp;lt;&amp;lt;&amp;lt;&amp;quot;$json&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  ts=&amp;quot;$(date -d @&amp;quot;$timestamp&amp;quot; +&amp;#039;%Y-%m-%d %H:%M:%S&amp;#039;)&amp;quot;&lt;br /&gt;
  now=&amp;quot;$(date +%s)&amp;quot;&lt;br /&gt;
  elapsed=$(( now - timestamp ))&lt;br /&gt;
&lt;br /&gt;
  # Grouping with thousands separators (ensure this locale exists)&lt;br /&gt;
  export LC_NUMERIC=en_US.UTF-8&lt;br /&gt;
  format_btc=&amp;quot;%10s(\$): %&amp;#039;12.0f&amp;quot;&lt;br /&gt;
  format_vol=&amp;quot;%8s(BTC): %&amp;#039;21.8f&amp;quot;&lt;br /&gt;
  format_chg=&amp;quot;%13s: %&amp;#039;15.2f%%&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;USD/BTC@bitstamp.net $ts [${elapsed}s ago]:&amp;quot;&lt;br /&gt;
  printf &amp;quot;$format_btc\n&amp;quot; &amp;quot;Open24&amp;quot; &amp;quot;$open_24&amp;quot;&lt;br /&gt;
  printf &amp;quot;$format_btc\n&amp;quot; &amp;quot;Open&amp;quot;    &amp;quot;$open&amp;quot;&lt;br /&gt;
  printf &amp;quot;$format_btc\n&amp;quot; &amp;quot;High&amp;quot;    &amp;quot;$high&amp;quot;&lt;br /&gt;
  printf &amp;quot;$format_btc\n&amp;quot; &amp;quot;Low&amp;quot;     &amp;quot;$low&amp;quot;&lt;br /&gt;
  printf &amp;quot;$format_btc\n&amp;quot; &amp;quot;Last&amp;quot;    &amp;quot;$last&amp;quot;&lt;br /&gt;
  printf &amp;quot;$format_btc\n&amp;quot; &amp;quot;VWAP&amp;quot;    &amp;quot;$vwap&amp;quot;&lt;br /&gt;
  printf &amp;quot;$format_vol\n&amp;quot; &amp;quot;Volume&amp;quot;  &amp;quot;$volume&amp;quot;&lt;br /&gt;
  printf &amp;quot;$format_chg\n&amp;quot; &amp;quot;Change24&amp;quot; &amp;quot;$change&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
version() {&lt;br /&gt;
  echo -e &amp;quot;${PROG} v${VERSION} (${FDATE})&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  echo -n &amp;quot;Bitcoin Core: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;${BTCBIN}/bitcoin-cli&amp;quot; --version 2&amp;gt;/dev/null \&lt;br /&gt;
    | head -1 \&lt;br /&gt;
    | sed &amp;#039;s/Bitcoin Core RPC client version v//&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
upgrade() {&lt;br /&gt;
    VER=&amp;quot;$1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if [ -z &amp;quot;$VER&amp;quot; ]; then&lt;br /&gt;
        echo &amp;quot;Usage: btc upgrade VERSION&amp;quot;&lt;br /&gt;
        echo &amp;quot;Example: btc upgrade 31.0&amp;quot;&lt;br /&gt;
        return 1&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    if &amp;quot;${BTCBIN}/bitcoin-cli&amp;quot; getblockchaininfo &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
        echo &amp;quot;ERROR: Bitcoin Core appears to be running.&amp;quot;&lt;br /&gt;
        echo &amp;quot;Stop it before upgrading.&amp;quot;&lt;br /&gt;
        return 1&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    TARGET=&amp;quot;${BTCPATH}/Bitcoin-${VER}/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if [ ! -d &amp;quot;$TARGET&amp;quot; ]; then&lt;br /&gt;
        echo &amp;quot;Missing directory:&amp;quot;&lt;br /&gt;
        echo &amp;quot;  $TARGET&amp;quot;&lt;br /&gt;
        return 1&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    echo &amp;quot;Switching Bitcoin Core to version ${VER}...&amp;quot;&lt;br /&gt;
    echo&lt;br /&gt;
&lt;br /&gt;
    for f in \&lt;br /&gt;
        bitcoin-cli \&lt;br /&gt;
        bitcoind \&lt;br /&gt;
        bitcoin-qt \&lt;br /&gt;
        bitcoin-wallet \&lt;br /&gt;
        bitcoin-util \&lt;br /&gt;
        bitcoin-tx \&lt;br /&gt;
        bitcoin-gui&lt;br /&gt;
    do&lt;br /&gt;
        if [ -f &amp;quot;$TARGET/$f&amp;quot; ]; then&lt;br /&gt;
            ln -sfn &amp;quot;$TARGET/$f&amp;quot; &amp;quot;${BTCBIN}/$f&amp;quot;&lt;br /&gt;
            echo &amp;quot;Linked $f -&amp;gt; Bitcoin-${VER}&amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
    done&lt;br /&gt;
&lt;br /&gt;
    echo&lt;br /&gt;
    echo &amp;quot;Now using Bitcoin Core:&amp;quot;&lt;br /&gt;
    &amp;quot;${BTCBIN}/bitcoin-cli&amp;quot; --version | head -1&lt;br /&gt;
&lt;br /&gt;
    echo&lt;br /&gt;
    echo &amp;quot;Executable:&amp;quot;&lt;br /&gt;
    readlink -f &amp;quot;${BTCBIN}/bitcoind&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# ---- ckpool ----&lt;br /&gt;
ck_running() {&lt;br /&gt;
  pgrep -f &amp;quot;$CKPOOL_BIN&amp;quot; &amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ckstart() {&lt;br /&gt;
  if ck_running; then&lt;br /&gt;
    echo &amp;quot;ckpool already running&amp;quot;&lt;br /&gt;
    status&lt;br /&gt;
    return 0&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  if ! cli getblockchaininfo &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
    die &amp;quot;Core is not running. Start Core first.&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;Starting ckpool...&amp;quot;&lt;br /&gt;
  nohup &amp;quot;$CKPOOL_BIN&amp;quot; -c &amp;quot;$CKPOOL_CONF&amp;quot; &amp;gt;&amp;gt; &amp;quot;$CKPOOL_LOG&amp;quot; 2&amp;gt;&amp;amp;1 &amp;amp;&lt;br /&gt;
  echo $! &amp;gt; &amp;quot;$CKPOOL_PID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  wait_ckpool &amp;quot;Waiting for ckpool&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;ckpool started&amp;quot;&lt;br /&gt;
  status&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ckstop() {&lt;br /&gt;
  if [ -f &amp;quot;$CKPOOL_PID&amp;quot; ]; then&lt;br /&gt;
    kill &amp;quot;$(cat &amp;quot;$CKPOOL_PID&amp;quot;)&amp;quot; 2&amp;gt;/dev/null || true&lt;br /&gt;
    rm -f &amp;quot;$CKPOOL_PID&amp;quot;&lt;br /&gt;
    echo &amp;quot;ckpool stopped&amp;quot;&lt;br /&gt;
    status&lt;br /&gt;
  else&lt;br /&gt;
    local pid&lt;br /&gt;
    pid=&amp;quot;$(pgrep -f &amp;quot;$CKPOOL_BIN&amp;quot; | head -1)&amp;quot;&lt;br /&gt;
    if [ -n &amp;quot;$pid&amp;quot; ]; then&lt;br /&gt;
      kill &amp;quot;$pid&amp;quot; 2&amp;gt;/dev/null || true&lt;br /&gt;
      echo &amp;quot;ckpool stopped&amp;quot;&lt;br /&gt;
      status&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;ckpool not running&amp;quot;&lt;br /&gt;
      status&lt;br /&gt;
    fi&lt;br /&gt;
  fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cklog() {&lt;br /&gt;
  tail -f &amp;quot;$CKPOOL_LOG&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ckaddr() {&lt;br /&gt;
  local cur&lt;br /&gt;
  cur=&amp;quot;$(grep -oE &amp;#039;&amp;quot;btcaddress&amp;quot;[[:space:]]*:[[:space:]]*&amp;quot;[^&amp;quot;]+&amp;quot;&amp;#039; &amp;quot;$CKPOOL_CONF&amp;quot; \&lt;br /&gt;
        | head -1 \&lt;br /&gt;
        | sed -E &amp;#039;s/.*&amp;quot;btcaddress&amp;quot;[[:space:]]*:[[:space:]]*&amp;quot;([^&amp;quot;]+)&amp;quot;.*/\1/&amp;#039;)&amp;quot;&lt;br /&gt;
  [ -n &amp;quot;$cur&amp;quot; ] || die &amp;quot;Could not find btcaddress in $CKPOOL_CONF&amp;quot;&lt;br /&gt;
  echo -e &amp;quot;$cur\n&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# ---- Wallets ----&lt;br /&gt;
wlist() {&lt;br /&gt;
  cli listwallets&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
wdir() {&lt;br /&gt;
  cli listwalletdir&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
winfo() {&lt;br /&gt;
  local w=&amp;quot;$1&amp;quot;&lt;br /&gt;
  [ -n &amp;quot;$w&amp;quot; ] || die &amp;quot;Usage: btc winfo &amp;lt;wallet&amp;gt;&amp;quot;&lt;br /&gt;
  wcli &amp;quot;$w&amp;quot; getwalletinfo&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
wbal() {&lt;br /&gt;
  local w=&amp;quot;$1&amp;quot;&lt;br /&gt;
  [ -n &amp;quot;$w&amp;quot; ] || die &amp;quot;Usage: btc wbal &amp;lt;wallet&amp;gt;&amp;quot;&lt;br /&gt;
  wcli &amp;quot;$w&amp;quot; getbalances&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
wload() {&lt;br /&gt;
  local w=&amp;quot;$1&amp;quot;&lt;br /&gt;
  [ -n &amp;quot;$w&amp;quot; ] || die &amp;quot;Usage: btc wload &amp;lt;wallet&amp;gt;&amp;quot;&lt;br /&gt;
  cli loadwallet &amp;quot;$w&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
wunload() {&lt;br /&gt;
  local w=&amp;quot;$1&amp;quot;&lt;br /&gt;
  [ -n &amp;quot;$w&amp;quot; ] || die &amp;quot;Usage: btc wunload &amp;lt;wallet&amp;gt;&amp;quot;&lt;br /&gt;
  cli unloadwallet &amp;quot;$w&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
wcreate() {&lt;br /&gt;
  local w=&amp;quot;$1&amp;quot;&lt;br /&gt;
  [ -n &amp;quot;$w&amp;quot; ] || die &amp;quot;Usage: btc wcreate &amp;lt;wallet&amp;gt;&amp;quot;&lt;br /&gt;
  cli createwallet &amp;quot;$w&amp;quot; false false &amp;quot;&amp;quot; false true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
wnew() {&lt;br /&gt;
  local w=&amp;quot;$1&amp;quot;&lt;br /&gt;
  local label=&amp;quot;${2:-}&amp;quot;&lt;br /&gt;
  [ -n &amp;quot;$w&amp;quot; ] || die &amp;quot;Usage: btc wnew &amp;lt;wallet&amp;gt; [label]&amp;quot;&lt;br /&gt;
  wcli &amp;quot;$w&amp;quot; getnewaddress &amp;quot;$label&amp;quot; bech32m&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
warchive() {&lt;br /&gt;
  local w=&amp;quot;$1&amp;quot;&lt;br /&gt;
  [ -n &amp;quot;$w&amp;quot; ] || die &amp;quot;Usage: btc warchive &amp;lt;wallet&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  local src=&amp;quot;$DATADIR/$w&amp;quot;&lt;br /&gt;
  local dst=&amp;quot;$DATADIR/warchive/$w&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  [ -e &amp;quot;$src&amp;quot; ] || die &amp;quot;Wallet not found: $src&amp;quot;&lt;br /&gt;
  [ ! -e &amp;quot;$dst&amp;quot; ] || die &amp;quot;Archive target already exists: $dst&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  cli unloadwallet &amp;quot;$w&amp;quot; &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 || true&lt;br /&gt;
  mkdir -p &amp;quot;$DATADIR/warchive&amp;quot;&lt;br /&gt;
  mv &amp;quot;$src&amp;quot; &amp;quot;$dst&amp;quot; || die &amp;quot;Failed to archive wallet&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;Archived wallet:&amp;quot;&lt;br /&gt;
  echo &amp;quot;  from: $src&amp;quot;&lt;br /&gt;
  echo &amp;quot;  to:   $dst&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
warchived() {&lt;br /&gt;
  ls -1 &amp;quot;$DATADIR/warchive&amp;quot; 2&amp;gt;/dev/null&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
wwatch() {&lt;br /&gt;
  local w=&amp;quot;$1&amp;quot;&lt;br /&gt;
  [ -n &amp;quot;$w&amp;quot; ] || die &amp;quot;Usage: btc wwatch &amp;lt;wallet&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  local live=&amp;quot;$DATADIR/$w&amp;quot;&lt;br /&gt;
  local arch=&amp;quot;$DATADIR/warchive/$w&amp;quot;&lt;br /&gt;
  local staged=0&lt;br /&gt;
  local was_loaded=0&lt;br /&gt;
&lt;br /&gt;
  if [ -e &amp;quot;$live&amp;quot; ]; then&lt;br /&gt;
    :&lt;br /&gt;
  elif [ -e &amp;quot;$arch&amp;quot; ]; then&lt;br /&gt;
    mv &amp;quot;$arch&amp;quot; &amp;quot;$live&amp;quot; || die &amp;quot;Failed to stage archived wallet: $w&amp;quot;&lt;br /&gt;
    staged=1&lt;br /&gt;
  else&lt;br /&gt;
    die &amp;quot;Wallet not found: $w&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  if cli listwallets | grep -q &amp;quot;\&amp;quot;$w\&amp;quot;&amp;quot;; then&lt;br /&gt;
    was_loaded=1&lt;br /&gt;
  else&lt;br /&gt;
    cli loadwallet &amp;quot;$w&amp;quot; &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 || die &amp;quot;Failed to load wallet: $w&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;wallet: $w&amp;quot;&lt;br /&gt;
  wcli &amp;quot;$w&amp;quot; getbalances&lt;br /&gt;
&lt;br /&gt;
  if [ &amp;quot;$was_loaded&amp;quot; -eq 0 ]; then&lt;br /&gt;
    cli unloadwallet &amp;quot;$w&amp;quot; &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 || true&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  if [ &amp;quot;$staged&amp;quot; -eq 1 ]; then&lt;br /&gt;
    mv &amp;quot;$live&amp;quot; &amp;quot;$arch&amp;quot; || die &amp;quot;Failed to return wallet to warchive: $w&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# ---- Init ----&lt;br /&gt;
load_cfg&lt;br /&gt;
&lt;br /&gt;
[ -n &amp;quot;${BTCBIN:-}&amp;quot; ]  || die &amp;quot;BTCBIN not set in config&amp;quot;&lt;br /&gt;
[ -n &amp;quot;${DATADIR:-}&amp;quot; ] || die &amp;quot;DATADIR not set in config&amp;quot;&lt;br /&gt;
[ -x &amp;quot;$BTCBIN/bitcoind&amp;quot; ]    || die &amp;quot;bitcoind not found at $BTCBIN/bitcoind&amp;quot;&lt;br /&gt;
[ -x &amp;quot;$BTCBIN/bitcoin-cli&amp;quot; ] || die &amp;quot;bitcoin-cli not found at $BTCBIN/bitcoin-cli&amp;quot;&lt;br /&gt;
[ -d &amp;quot;$DATADIR&amp;quot; ]            || die &amp;quot;Datadir not found: $DATADIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[ -n &amp;quot;${CKPOOL_BIN:-}&amp;quot; ]  || die &amp;quot;CKPOOL_BIN not set in config&amp;quot;&lt;br /&gt;
[ -n &amp;quot;${CKPOOL_CONF:-}&amp;quot; ] || die &amp;quot;CKPOOL_CONF not set in config&amp;quot;&lt;br /&gt;
[ -n &amp;quot;${CKPOOL_LOG:-}&amp;quot; ]  || die &amp;quot;CKPOOL_LOG not set in config&amp;quot;&lt;br /&gt;
[ -n &amp;quot;${CKPOOL_PID:-}&amp;quot; ]  || die &amp;quot;CKPOOL_PID not set in config&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# ---- Command dispatcher ----&lt;br /&gt;
case &amp;quot;${1:-}&amp;quot; in&lt;br /&gt;
  &amp;quot;&amp;quot;)                 usage ;;&lt;br /&gt;
&lt;br /&gt;
  start)              start ;;&lt;br /&gt;
  stop)               stop ;;&lt;br /&gt;
  restart)            restart ;;&lt;br /&gt;
  status)             status ;;&lt;br /&gt;
  log)                log ;;&lt;br /&gt;
  bitaxe)             bitaxe ;;&lt;br /&gt;
  paths)              paths ;;&lt;br /&gt;
  rate)               rate ;;&lt;br /&gt;
  version)            version ;;&lt;br /&gt;
  upgrade)            upgrade &amp;quot;$2&amp;quot;;;&lt;br /&gt;
  ckstart)            ckstart ;;&lt;br /&gt;
  ckstop)             ckstop ;;&lt;br /&gt;
  cklog)              cklog ;;&lt;br /&gt;
  ckaddr)             ckaddr ;;&lt;br /&gt;
  wlist)              wlist ;;&lt;br /&gt;
  wdir)               wdir ;;&lt;br /&gt;
  winfo)              shift; winfo &amp;quot;$@&amp;quot; ;;&lt;br /&gt;
  wbal)               shift; wbal &amp;quot;$@&amp;quot; ;;&lt;br /&gt;
  wload)              shift; wload &amp;quot;$@&amp;quot; ;;&lt;br /&gt;
  wunload)            shift; wunload &amp;quot;$@&amp;quot; ;;&lt;br /&gt;
  wcreate)            shift; wcreate &amp;quot;$@&amp;quot; ;;&lt;br /&gt;
  wnew)               shift; wnew &amp;quot;$@&amp;quot; ;;&lt;br /&gt;
  warchive)           shift; warchive &amp;quot;$@&amp;quot; ;;&lt;br /&gt;
  warchived)          warchived ;;&lt;br /&gt;
  wwatch)             shift; wwatch &amp;quot;$@&amp;quot; ;;&lt;br /&gt;
  *)                  die &amp;quot;Unknown command: $1&amp;quot; ;;&lt;br /&gt;
esac&lt;br /&gt;
exit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ckrotate)           shift; ckrotate &amp;quot;$@&amp;quot; ;;&lt;br /&gt;
&lt;br /&gt;
ckrotate() {&lt;br /&gt;
  local w=&amp;quot;$1&amp;quot;&lt;br /&gt;
  local label=&amp;quot;${2:-}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  [ -n &amp;quot;$w&amp;quot; ] || die &amp;quot;Usage: btc ckrotate &amp;lt;wallet&amp;gt; [label]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  if ck_running; then&lt;br /&gt;
    die &amp;quot;ckpool is running. Stop it first: btc ckstop&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  local key=&amp;quot;btcaddress&amp;quot;&lt;br /&gt;
  local old new ts bak&lt;br /&gt;
  local was_loaded=0&lt;br /&gt;
&lt;br /&gt;
  old=&amp;quot;$(grep -oE &amp;quot;\&amp;quot;$key\&amp;quot;[[:space:]]*:[[:space:]]*\&amp;quot;[^\&amp;quot;]+\&amp;quot;&amp;quot; &amp;quot;$CKPOOL_CONF&amp;quot; \&lt;br /&gt;
        | head -1 \&lt;br /&gt;
        | sed -E &amp;quot;s/.*\&amp;quot;$key\&amp;quot;[[:space:]]*:[[:space:]]*\&amp;quot;([^\&amp;quot;]+)\&amp;quot;.*/\1/&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  [ -n &amp;quot;$old&amp;quot; ] || die &amp;quot;Could not find \&amp;quot;$key\&amp;quot; in $CKPOOL_CONF&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  if cli listwallets | grep -q &amp;quot;\&amp;quot;$w\&amp;quot;&amp;quot;; then&lt;br /&gt;
    was_loaded=1&lt;br /&gt;
  else&lt;br /&gt;
    cli loadwallet &amp;quot;$w&amp;quot; &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 || die &amp;quot;Failed to load wallet: $w&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  new=&amp;quot;$(wcli &amp;quot;$w&amp;quot; getnewaddress &amp;quot;$label&amp;quot; bech32m)&amp;quot; || die &amp;quot;Failed to get new address&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  echo&lt;br /&gt;
  echo &amp;quot;ckrotate preview&amp;quot;&lt;br /&gt;
  echo &amp;quot;wallet: $w&amp;quot;&lt;br /&gt;
  echo &amp;quot;old:    $old&amp;quot;&lt;br /&gt;
  echo &amp;quot;new:    $new&amp;quot;&lt;br /&gt;
  echo&lt;br /&gt;
&lt;br /&gt;
  echo -n &amp;quot;Type YES to continue: &amp;quot;&lt;br /&gt;
  read -r ans&lt;br /&gt;
  [ &amp;quot;$ans&amp;quot; = &amp;quot;YES&amp;quot; ] || die &amp;quot;Aborted.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  ts=&amp;quot;$(date +%Y%m%d-%H%M%S)&amp;quot;&lt;br /&gt;
  bak=&amp;quot;${CKPOOL_CONF}.bak.${ts}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  cp &amp;quot;$CKPOOL_CONF&amp;quot; &amp;quot;$bak&amp;quot; || die &amp;quot;Backup failed&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  sed -i -E &amp;quot;s/(\&amp;quot;$key\&amp;quot;[[:space:]]*:[[:space:]]*\&amp;quot;)([^\&amp;quot;]+)(\&amp;quot;)/\1${new}\3/&amp;quot; &amp;quot;$CKPOOL_CONF&amp;quot; \&lt;br /&gt;
    || die &amp;quot;Failed to update ckpool.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  if [ &amp;quot;$was_loaded&amp;quot; -eq 0 ]; then&lt;br /&gt;
    cli unloadwallet &amp;quot;$w&amp;quot; &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 || true&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  echo&lt;br /&gt;
  echo &amp;quot;Address rotated.&amp;quot;&lt;br /&gt;
  echo &amp;quot;backup: $bak&amp;quot;&lt;br /&gt;
  echo&lt;br /&gt;
  echo &amp;quot;Start ckpool again with:&amp;quot;&lt;br /&gt;
  echo &amp;quot;btc ckstart&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>