230 lines
7.0 KiB
Bash
Executable File
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 "$@"
|