#!/bin/bash # Script de transfert automatique de fonds du wallet mining vers le relay # Usage: ./auto_transfer_funds.sh [amount] [relay_address] set -e # Configuration MINING_WALLET="mining_mnemonic" RELAY_WALLET="default" BITCOIN_RPC_URL="bitcoin:38332" COOKIE_FILE="/home/bitcoin/.bitcoin/signet/.cookie" MIN_AMOUNT=0.001 # Montant minimum à transférer (0.001 BTC = 100,000 sats) DEFAULT_AMOUNT=0.01 # Montant par défaut (0.01 BTC = 1,000,000 sats) # Couleurs pour les logs RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Fonctions de logging log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # Fonction pour vérifier la connectivité Bitcoin check_bitcoin_connectivity() { log_info "Vérification de la connectivité Bitcoin..." if ! docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" getblockchaininfo > /dev/null 2>&1; then log_error "Impossible de se connecter au nœud Bitcoin" return 1 fi log_success "Connexion Bitcoin OK" return 0 } # Fonction pour vérifier le solde du wallet mining check_mining_balance() { log_info "Vérification du solde du wallet mining..." local balance=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$MINING_WALLET" getbalance 2>/dev/null || echo "0") if [ "$balance" = "0" ]; then log_error "Wallet mining vide ou inaccessible" return 1 fi log_success "Solde wallet mining: $balance BTC" echo "$balance" return 0 } # Fonction pour vérifier le solde du wallet relay check_relay_balance() { log_info "Vérification du solde du wallet relay..." # Charger le wallet relay s'il n'est pas déjà chargé docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" loadwallet "$RELAY_WALLET" > /dev/null 2>&1 || true local balance=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$RELAY_WALLET" getbalance 2>/dev/null || echo "0") log_info "Solde wallet relay: $balance BTC" echo "$balance" return 0 } # Fonction pour générer une adresse pour le relay generate_relay_address() { log_info "Génération d'une adresse pour le relay..." # Charger le wallet relay docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" loadwallet "$RELAY_WALLET" > /dev/null 2>&1 || true local address=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$RELAY_WALLET" getnewaddress "relay_funding" 2>/dev/null) if [ -z "$address" ]; then log_error "Impossible de générer une adresse pour le relay" return 1 fi log_success "Adresse générée: $address" echo "$address" return 0 } # Fonction pour transférer des fonds transfer_funds() { local amount=$1 local address=$2 log_info "Transfert de $amount BTC vers $address..." local txid=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$MINING_WALLET" sendtoaddress "$address" "$amount" 2>/dev/null) if [ -z "$txid" ]; then log_error "Échec du transfert de fonds" return 1 fi log_success "Transfert effectué. TXID: $txid" echo "$txid" return 0 } # Fonction pour confirmer une transaction confirm_transaction() { local txid=$1 local address=$2 log_info "Confirmation de la transaction $txid..." # Générer des blocs pour confirmer la transaction docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$MINING_WALLET" generatetoaddress 6 "$address" > /dev/null 2>&1 # Vérifier les confirmations local confirmations=$(docker exec bitcoin-signet bitcoin-cli -signet -rpccookiefile="$COOKIE_FILE" -rpcwallet="$MINING_WALLET" gettransaction "$txid" 2>/dev/null | jq -r '.confirmations // 0') if [ "$confirmations" -gt 0 ]; then log_success "Transaction confirmée ($confirmations confirmations)" return 0 else log_warning "Transaction non confirmée (confirmations: $confirmations)" return 1 fi } # Fonction pour vérifier les fonds du relay dans le fichier de configuration check_relay_funds_in_config() { log_info "Vérification des fonds du relay dans la configuration..." local outputs_count=$(docker exec sdk_relay cat /home/bitcoin/.4nk/default 2>/dev/null | jq -r '.outputs | length // 0' 2>/dev/null || echo "0") log_info "Nombre d'outputs du relay: $outputs_count" echo "$outputs_count" return 0 } # Fonction principale main() { local amount=${1:-$DEFAULT_AMOUNT} local relay_address=${2:-""} log_info "=== TRANSFERT AUTOMATIQUE DE FONDS ===" log_info "Montant: $amount BTC" # Vérifications préliminaires if ! check_bitcoin_connectivity; then exit 1 fi # Vérifier le solde du wallet mining local mining_balance=$(check_mining_balance) if [ $? -ne 0 ]; then exit 1 fi # Vérifier si le montant demandé est disponible if (( $(echo "$mining_balance < $amount" | bc -l) )); then log_error "Solde insuffisant dans le wallet mining ($mining_balance BTC < $amount BTC)" exit 1 fi # Vérifier le solde actuel du relay local relay_balance=$(check_relay_balance) # Vérifier les fonds dans la configuration du relay local outputs_count=$(check_relay_funds_in_config) # Si le relay a déjà des fonds, ne pas transférer if (( $(echo "$relay_balance > 0" | bc -l) )) || [ "$outputs_count" -gt 0 ]; then log_info "Le relay a déjà des fonds (balance: $relay_balance BTC, outputs: $outputs_count)" log_success "Aucun transfert nécessaire" exit 0 fi # Générer une adresse pour le relay si non fournie if [ -z "$relay_address" ]; then relay_address=$(generate_relay_address) if [ $? -ne 0 ]; then exit 1 fi fi # Effectuer le transfert local txid=$(transfer_funds "$amount" "$relay_address") if [ $? -ne 0 ]; then exit 1 fi # Confirmer la transaction if confirm_transaction "$txid" "$relay_address"; then log_success "Transfert de fonds réussi et confirmé" # Redémarrer le relay pour qu'il détecte les nouveaux fonds log_info "Redémarrage du relay pour détecter les nouveaux fonds..." docker compose restart sdk_relay log_success "Relay redémarré. Les fonds devraient être détectés dans quelques secondes." else log_warning "Transfert effectué mais non confirmé. Le relay pourrait ne pas détecter les fonds immédiatement." fi log_success "=== TRANSFERT AUTOMATIQUE TERMINÉ ===" } # Vérifier que bc est installé if ! command -v bc &> /dev/null; then log_error "bc n'est pas installé. Installation..." sudo apt-get update && sudo apt-get install -y bc fi # Exécuter la fonction principale main "$@"