#!/usr/bin/env bash set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")"/.. && pwd)" ENV_FILE="$ROOT_DIR/.env" if [ ! -f "$ENV_FILE" ]; then echo "Fichier d'env introuvable: $ENV_FILE" >&2 exit 1 fi # shellcheck disable=SC1090 source "$ENV_FILE" cli() { docker exec "$BITCOIN_CONTAINER" sh -lc "bitcoin-cli -conf=/etc/bitcoin/bitcoin.conf -signet $*" } cli_stdin() { local subcmd="$1"; shift || true docker exec -i "$BITCOIN_CONTAINER" sh -lc "bitcoin-cli -conf=/etc/bitcoin/bitcoin.conf -signet -stdin $subcmd" } extract_checksum() { sed -n 's/.*"checksum"[[:space:]]*:[[:space:]]*"\([a-z0-9]\{8\}\)".*/\1/p' | tr -d '\n' } wallet_is_descriptors() { cli -rpcwallet="$MINING_WALLET" getwalletinfo 2>/dev/null | grep -q '"descriptors"[[:space:]]*:[[:space:]]*true' } wallet_exists() { cli -rpcwallet="$MINING_WALLET" getwalletinfo >/dev/null 2>&1 } ensure_descriptors_wallet() { local wallet_path="/home/bitcoin/.bitcoin/signet/wallets/$MINING_WALLET" if wallet_exists && wallet_is_descriptors; then return 0 fi cli -rpcwallet="$MINING_WALLET" unloadwallet "$MINING_WALLET" >/dev/null 2>&1 || true docker exec "$BITCOIN_CONTAINER" sh -lc "if [ -d '$wallet_path' ]; then rm -rf '$wallet_path'; fi" cli createwallet "$MINING_WALLET" false true "" true true true false >/dev/null } ensure_descriptors_wallet DESC_EXT_ORIG="wsh(multi(1,[$MINING_FINGERPRINT/$MINING_PATH_PREFIX]$MINING_XPRV/0/*))" DESC_INT_ORIG="wsh(multi(1,[$MINING_FINGERPRINT/$MINING_PATH_PREFIX]$MINING_XPRV/1/*))" CS_EXT=$(printf '%s' "$DESC_EXT_ORIG" | cli_stdin getdescriptorinfo | extract_checksum) CS_INT=$(printf '%s' "$DESC_INT_ORIG" | cli_stdin getdescriptorinfo | extract_checksum) DESC_EXT="$DESC_EXT_ORIG#$CS_EXT" DESC_INT="$DESC_INT_ORIG#$CS_INT" PAYLOAD_MINER=$(printf '[{"desc":"%s","timestamp":"now","active":true,"range":[0,1000]},{"desc":"%s","timestamp":"now","active":true,"internal":true,"range":[0,1000]}]' "$DESC_EXT" "$DESC_INT") printf '%s\n' "$PAYLOAD_MINER" | cli_stdin importdescriptors | cat # Adresse coinbase: si vide, utiliser getnewaddress du wallet (garanti p2wsh multisig) if [ -z "${COINBASE_ADDRESS:-}" ]; then ADDR=$(cli -rpcwallet="$MINING_WALLET" getnewaddress coinbase bech32) tmpfile=$(mktemp) awk -v addr="$ADDR" 'BEGIN{updated=0} /^COINBASE_ADDRESS=/{print "COINBASE_ADDRESS=" addr; updated=1; next} {print} END{if(updated==0) print "COINBASE_ADDRESS=" addr}' "$ENV_FILE" > "$tmpfile" mv "$tmpfile" "$ENV_FILE" echo "COINBASE_ADDRESS=$ADDR" else echo "COINBASE_ADDRESS=$COINBASE_ADDRESS" fi if [ -n "${CHALLENGE_ALLPUBS:-}" ]; then CHALL_PRIV_ORIG=$(printf '%s' "$CHALLENGE_ALLPUBS" | sed -E "s#\[$MINING_FINGERPRINT/$MINING_PATH_PREFIX\]tpub[[:alnum:]]+#[$MINING_FINGERPRINT/$MINING_PATH_PREFIX]$MINING_XPRV#g") CS_CHALL=$(printf '%s' "$CHALL_PRIV_ORIG" | cli_stdin getdescriptorinfo | extract_checksum) CHALL_PRIV="$CHALL_PRIV_ORIG#$CS_CHALL" PAYLOAD_CHAL=$(printf '[{"desc":"%s","timestamp":"now","active":false,"range":[0,1000]}]' "$CHALL_PRIV") printf '%s\n' "$PAYLOAD_CHAL" | cli_stdin importdescriptors | cat fi echo "Import terminé."