#!/usr/bin/env bash
# AriaPool — aria_dtc (datacenter build) 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 aria_dtc options
#            MINER_URL / MINER_SHA256  override the pinned release (advanced)
#
# What it does: downloads the pinned aria_dtc 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/aria_dtc/miner.log (also on stdout).
set -uo pipefail

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

say() { echo "[aria_dtc] $*"; }

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:-dtc-${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/aria_dtc/aria_dtc"
if [ ! -x "$BIN" ] || [ "$(cat .version 2>/dev/null)" != "$MINER_VERSION" ]; then
  say "downloading aria_dtc $MINER_VERSION ..."
  rm -rf aria_dtc 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/aria_dtc"
while true; do
  say "starting miner $(date -u +%FT%TZ)"
  ./aria_dtc --pool "http://$POOL" --address "$WALLET" --worker "$WORKER" \
    --vectors vectors.txt ${EXTRA:-}
  say "miner exited with code $? — restarting in 15 s"
  sleep 15
done
