4NK_env/scripts/lecoffre_node/funds/auto_transfer_funds.sh
LeCoffre Deployment 43a05a2742 clean
2025-09-25 12:19:35 +00:00

230 lines
7.0 KiB
Bash
Executable File

#!/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 "$@"