#!/usr/bin/env zsh

# Mempool.Space CKSolo Pool Start Script - PortlandHODL
#
# Options for base CKSolo config [No Failover / Proxy]
#   $1 - NETWORK
#   $2 - Payout Address
#   $3 - Port (optional, defaults to 3333)

# Initialize variables
DAEMON=$1
NETWORK=${DAEMON} # Context Alias
COINBASE_PAYOUT_ADDRESS=$2
PORT=${3:-3333}  # Use port provided as 3rd argument, or default to 3333 if not specified
RPC_PORT=8332    # Default to mainnet RPC port, will be updated based on network

# Check that the NETWORK provided is correct
# 'bitcoin' is mainnet and needs an mainnet address
if [ "$NETWORK" = "bitcoin" ] || [ "$NETWORK" = "testnet3" ] || [ "$NETWORK" = "testnet4" ]; then
    echo "Setting up Mempool.space CKPool with NETWORK $NETWORK"

    if [ "$NETWORK" = "bitcoin" ]; then
        RPC_PORT=8332   # Mainnet RPC port
        COINBASE_PAYOUT_ADDRESS="1wizSAYSbuyXbt9d8JV8ytm5acqq2TorC"
    elif [ "$NETWORK" = "testnet3" ]; then
        RPC_PORT=18332  # Testnet3 RPC port
        COINBASE_PAYOUT_ADDRESS="tb1qjfplwf7a2dpjj04cx96rysqeastvycc0j50cch"
    elif [ "$NETWORK" = "testnet4" ]; then
        RPC_PORT=48332  # Testnet4 RPC port
        COINBASE_PAYOUT_ADDRESS="tb1qjfplwf7a2dpjj04cx96rysqeastvycc0j50cch"
    else
        echo "Network setting unsupported for magic coinbase payout address replacement"
    fi
else
    echo "Invalid network selected: $NETWORK, please use bitcoin, testnet3, testnet4"
    exit 1
fi

echo "Starting Mempool.space CKSolo using ${NETWORK} network with payout address ${COINBASE_PAYOUT_ADDRESS}"
echo "Using Bitcoin RPC port: ${RPC_PORT} and CKPool port: ${PORT}"

# Fetch Bitcoin node credentials from the Bitcoin.conf file
DAEMON_CONF="/bitcoin/${DAEMON}.conf"
echo "[*] Getting RPC credentials from ${DAEMON_CONF}"
RPC_USER=$(grep 'rpcuser=' "${DAEMON_CONF}"|cut -d = -f2|head -1)
RPC_PASS=$(grep 'rpcpassword=' "${DAEMON_CONF}"|cut -d = -f2|head -1)

# Create ckpool config file
CONFIG_DIR="${HOME}/.ckpool/${NETWORK}"
CONFIG_FILE="${CONFIG_DIR}/ckpool.conf"

mkdir -p "${CONFIG_DIR}"

cat > "${CONFIG_FILE}" << EOF
{
    "btcd" :  [
        {
            "url" : "127.0.0.1:${RPC_PORT}",
            "auth" : "${RPC_USER}",
            "pass" : "${RPC_PASS}",
            "notify" : true
        }
    ],
    "btcaddress" : "${COINBASE_PAYOUT_ADDRESS}",
    "btcsig" : "/@wiz/",
    "blockpoll" : 100,
    "nonce1length" : 4,
    "nonce2length" : 8,
    "update_interval" : 30,
    "version_mask" : "1fffe000",
    "serverurl" : [
        "127.0.0.1:${PORT}"
    ],
    "mindiff" : 1,
    "startdiff" : 42,
    "maxdiff" : 0,
    "logdir" : "logs"
}
EOF

echo "[*] Created config file at ${CONFIG_FILE}"

# run in loop in case of crash
until false
do
    # reset CWD
    cd "${CONFIG_DIR}"

    # disable making core files
    ulimit -c 0

    echo "[*] Starting ckpool..."

    # Run ckpool with the config
    ckpool "${CONFIG_FILE}"

    # Wait a bit before restarting
    echo "[*] ckpool exited, restarting in 1 second..."
    sleep 1
done
