#!/usr/bin/env bash
# AriaPool — ariaminer-qtc on a rented GPU (vast.ai / RunPod / Clore).
# One container = one instance of the miner driving every GPU it can see.
#
# Required : WALLET=qz...            your Quantus address (credited for shares)
# Optional : WORKER=name             worker name shown on the pool (default: vast-<host id>)
#            POOL=host:port          getwork endpoint (default: qtc-node.ariabrain.com:9412)
#            EXTRA="--gpu-list 0,1"  extra ariaminer-qtc options
#            MINER_URL / MINER_SHA256  override the pinned release (advanced)
#
# What it does: downloads the pinned ariaminer-qtc release, verifies its SHA-256,
# runs the built-in oracle check, then mines in a loop (auto-restart on any exit).
# Nothing else is installed. Log: /root/ariaminer-qtc/miner.log (also on stdout).
set -uo pipefail

MINER_VERSION="${MINER_VERSION:-1.6.0}"
MINER_URL="${MINER_URL:-https://pub-4bc92882522745e291a08f11119e3205.r2.dev/qtc-dl/6hwvzd49dvt/ariaminer-qtc-v1.6.0-linux-x86_64.tar.gz}"
MINER_SHA256="${MINER_SHA256:-b1cdc3f1df3a6f8245c87be155c61d19c40d6b4beca5195a37ee5ecc9ba2a979}"
POOL="${POOL:-qtc-node.ariabrain.com:9412}"
POOL="${POOL#http://}"; POOL="${POOL#https://}"
WORKDIR=/root/ariaminer-qtc
LOG="$WORKDIR/miner.log"
mkdir -p "$WORKDIR"
exec > >(tee -a "$LOG") 2>&1

say() { echo "[aria-qtc] $*"; }

WALLET="${WALLET:-${WALLET_ADDRESS:-}}"
if [ -z "$WALLET" ] || [ "${WALLET#qz}" = "$WALLET" ]; then
  say "ERROR: set the WALLET environment variable to your Quantus address (starts with qz)."
  say "       vast.ai: Docker options / Environment  ->  -e WALLET=qzYOURADDRESS"
  sleep 60; exit 1
fi
HOSTID="$(hostname 2>/dev/null | cut -c1-8)"
WORKER="${WORKER:-vast-${HOSTID:-gpu}}"

if command -v nvidia-smi >/dev/null 2>&1; then
  say "GPUs: $(nvidia-smi --query-gpu=name --format=csv,noheader 2>/dev/null | paste -sd, -)"
  say "driver: $(nvidia-smi --query-gpu=driver_version --format=csv,noheader 2>/dev/null | head -1) (580 or newer required)"
else
  say "WARNING: nvidia-smi not found — the host must expose an NVIDIA driver 580+ (CUDA 13)."
fi

# Fetch tool (the CUDA base images do not always ship curl).
fetch() {
  if command -v curl >/dev/null 2>&1; then curl -fsSL --retry 5 --retry-delay 5 -o "$2" "$1"
  elif command -v wget >/dev/null 2>&1; then wget -q -O "$2" "$1"
  else
    say "installing curl..."
    (apt-get update -qq && apt-get install -y -qq curl ca-certificates) >/dev/null 2>&1 || true
    curl -fsSL --retry 5 --retry-delay 5 -o "$2" "$1"
  fi
}

cd "$WORKDIR"
BIN="$WORKDIR/ariaminer-qtc/ariaminer-qtc"
if [ ! -x "$BIN" ] || [ "$(cat .version 2>/dev/null)" != "$MINER_VERSION" ]; then
  say "downloading ariaminer-qtc $MINER_VERSION ..."
  rm -rf ariaminer-qtc miner.tar.gz
  n=0
  until fetch "$MINER_URL" miner.tar.gz; do
    n=$((n+1)); say "download failed (try $n), retrying in 30 s"; sleep 30
    [ $n -ge 20 ] && { say "ERROR: cannot download the miner"; exit 1; }
  done
  GOT="$(sha256sum miner.tar.gz | cut -d' ' -f1)"
  if [ "$GOT" != "$MINER_SHA256" ]; then
    say "ERROR: SHA-256 mismatch (got $GOT, expected $MINER_SHA256) — refusing to run."
    rm -f miner.tar.gz; sleep 60; exit 1
  fi
  say "SHA-256 verified: $GOT"
  tar xzf miner.tar.gz && rm -f miner.tar.gz
  echo "$MINER_VERSION" > .version
fi
chmod +x "$BIN"
say "version: $("$BIN" --version 2>/dev/null)"
say "pool=http://$POOL  wallet=$WALLET  worker=$WORKER"

# Mining loop: the miner never stays down (vast.ai does not restart a finished onstart).
cd "$WORKDIR/ariaminer-qtc"
while true; do
  say "starting miner $(date -u +%FT%TZ)"
  ./ariaminer-qtc --pool "http://$POOL" --address "$WALLET" --worker "$WORKER" \
    --vectors vectors.txt ${EXTRA:-}
  say "miner exited with code $? — restarting in 15 s"
  sleep 15
done
