#!/usr/bin/env bash # Helper script for interacting with CDK regtest environment # Run this after starting interactive_regtest_mprocs.sh # Check for environment state file first, then environment variable ENV_FILE="/tmp/cdk_regtest_env" if [ -f "$ENV_FILE" ]; then source "$ENV_FILE" elif [ ! -z "$CDK_ITESTS_DIR" ]; then # Environment variable is set, create state file for other sessions echo "export CDK_ITESTS_DIR=\"$CDK_ITESTS_DIR\"" > "$ENV_FILE" echo "export CDK_TEST_MINT_URL=\"$CDK_TEST_MINT_URL\"" >> "$ENV_FILE" echo "export CDK_TEST_MINT_URL_2=\"$CDK_TEST_MINT_URL_2\"" >> "$ENV_FILE" echo "export CDK_MINTD_PID=\"$CDK_MINTD_PID\"" >> "$ENV_FILE" echo "export CDK_MINTD_LND_PID=\"$CDK_MINTD_LND_PID\"" >> "$ENV_FILE" echo "export CDK_REGTEST_PID=\"$CDK_REGTEST_PID\"" >> "$ENV_FILE" else echo "❌ CDK regtest environment not found!" echo "Please run './misc/interactive_regtest_mprocs.sh' or 'just regtest' first" exit 1 fi # Validate that the environment is actually running if [ -z "$CDK_ITESTS_DIR" ] || [ ! -d "$CDK_ITESTS_DIR" ]; then echo "❌ CDK regtest environment not found or directory missing!" echo "Please run './misc/interactive_regtest_mprocs.sh' or 'just regtest' first" [ -f "$ENV_FILE" ] && rm "$ENV_FILE" # Clean up stale state file exit 1 fi show_help() { echo "CDK Regtest Environment Helper" echo "=============================" echo echo "Lightning Node Commands:" echo " ln-cln1 - Execute command on CLN node 1" echo " ln-cln2 - Execute command on CLN node 2" echo " ln-lnd1 - Execute command on LND node 1" echo " ln-lnd2 - Execute command on LND node 2" echo echo "Bitcoin Commands:" echo " btc - Execute bitcoin-cli command" echo " btc-mine [blocks] - Mine blocks (default: 10)" echo echo "CDK Mint Commands:" echo " mint-info - Show mint information" echo " mint-test - Run integration tests" echo " restart-mints - Stop, recompile, and restart both mints (log mode)" echo echo "Environment Commands:" echo " show-env - Show environment variables" echo " show-logs - Show recent mint logs" echo " show-status - Show status of all components" echo " logs - Start mprocs TUI (adapts to current mode)" echo echo "Environment Modes:" echo " just regtest - Log tailing mode (mints auto-start, logs to files)" echo " just regtest-mprocs - Direct management (mprocs controls mint processes)" echo echo "Examples:" echo " $0 ln-cln1 getinfo" echo " $0 ln-lnd1 getinfo" echo " $0 btc getblockcount" echo " $0 btc-mine 5" echo " $0 mint-info" echo " $0 restart-mints # Only works in log tailing mode" echo " $0 logs # Start mprocs viewer" } # Bitcoin commands btc_command() { bitcoin-cli -regtest -rpcuser=testuser -rpcpassword=testpass -rpcport=18443 "$@" } btc_mine() { local blocks=${1:-10} local address=$(btc_command getnewaddress) btc_command generatetoaddress "$blocks" "$address" echo "Mined $blocks blocks" } # CLN commands cln_command() { local node=$1 shift lightning-cli --rpc-file="$CDK_ITESTS_DIR/cln/$node/regtest/lightning-rpc" "$@" } # LND commands lnd_command() { local node=$1 shift local port case $node in "one") port=10009 ;; "two") port=10010 ;; *) echo "Unknown LND node: $node"; return 1 ;; esac lncli --rpcserver=localhost:$port \ --tlscertpath="$CDK_ITESTS_DIR/lnd/$node/tls.cert" \ --macaroonpath="$CDK_ITESTS_DIR/lnd/$node/data/chain/bitcoin/regtest/admin.macaroon" \ "$@" } # Mint commands mint_info() { echo "CLN Mint (Port 8085):" curl -s "$CDK_TEST_MINT_URL/v1/info" | jq . 2>/dev/null || curl -s "$CDK_TEST_MINT_URL/v1/info" echo echo "LND Mint (Port 8087):" curl -s "$CDK_TEST_MINT_URL_2/v1/info" | jq . 2>/dev/null || curl -s "$CDK_TEST_MINT_URL_2/v1/info" } mint_test() { echo "Running integration tests..." cargo test -p cdk-integration-tests } # Environment info show_env() { echo "CDK Regtest Environment Variables:" echo "=================================" echo "CDK_ITESTS_DIR=$CDK_ITESTS_DIR" echo "CDK_TEST_MINT_URL=$CDK_TEST_MINT_URL" echo "CDK_TEST_MINT_URL_2=$CDK_TEST_MINT_URL_2" echo "CDK_MINTD_PID=$CDK_MINTD_PID" echo "CDK_MINTD_LND_PID=$CDK_MINTD_LND_PID" echo "CDK_REGTEST_PID=$CDK_REGTEST_PID" } show_logs() { echo "=== Recent CLN Mint Logs ===" if [ -f "$CDK_ITESTS_DIR/cln_mint/mintd.log" ]; then tail -10 "$CDK_ITESTS_DIR/cln_mint/mintd.log" else echo "Log file not found" fi echo echo "=== Recent LND Mint Logs ===" if [ -f "$CDK_ITESTS_DIR/lnd_mint/mintd.log" ]; then tail -10 "$CDK_ITESTS_DIR/lnd_mint/mintd.log" else echo "Log file not found" fi } start_mprocs() { echo "Starting mprocs log viewer..." if ! command -v mprocs >/dev/null 2>&1; then echo "❌ mprocs not found! Please install it with:" echo " cargo install mprocs" echo " or your package manager" return 1 fi # Check if we have the direct process management config DIRECT_MPROCS_CONFIG="$CDK_ITESTS_DIR/mprocs.yaml" FALLBACK_MPROCS_CONFIG="$CDK_ITESTS_DIR/mprocs_fallback.yaml" if [ -f "$DIRECT_MPROCS_CONFIG" ]; then echo "Using direct process management mode..." echo "In mprocs: 's' to start, 'k' to kill, 'r' to restart processes" cd "$CDK_ITESTS_DIR" mprocs --config "$DIRECT_MPROCS_CONFIG" return fi # Create fallback mprocs configuration for log tailing cat > "$FALLBACK_MPROCS_CONFIG" << EOF procs: cln-mint: shell: "touch $CDK_ITESTS_DIR/cln_mint/mintd.log && tail -f $CDK_ITESTS_DIR/cln_mint/mintd.log" autostart: true lnd-mint: shell: "touch $CDK_ITESTS_DIR/lnd_mint/mintd.log && tail -f $CDK_ITESTS_DIR/lnd_mint/mintd.log" autostart: true bitcoind: shell: "touch $CDK_ITESTS_DIR/bitcoin/regtest/debug.log && tail -f $CDK_ITESTS_DIR/bitcoin/regtest/debug.log" autostart: true cln-one: shell: "while [ ! -f $CDK_ITESTS_DIR/cln/one/regtest/log ]; do sleep 1; done && tail -f $CDK_ITESTS_DIR/cln/one/regtest/log" autostart: true cln-two: shell: "while [ ! -f $CDK_ITESTS_DIR/cln/two/regtest/log ]; do sleep 1; done && tail -f $CDK_ITESTS_DIR/cln/two/regtest/log" autostart: true lnd-one: shell: "while [ ! -f $CDK_ITESTS_DIR/lnd/one/logs/bitcoin/regtest/lnd.log ]; do sleep 1; done && tail -f $CDK_ITESTS_DIR/lnd/one/logs/bitcoin/regtest/lnd.log" autostart: true lnd-two: shell: "while [ ! -f $CDK_ITESTS_DIR/lnd/two/logs/bitcoin/regtest/lnd.log ]; do sleep 1; done && tail -f $CDK_ITESTS_DIR/lnd/two/logs/bitcoin/regtest/lnd.log" autostart: true settings: mouse_scroll_speed: 3 proc_list_width: 20 hide_keymap_window: false EOF echo "Using log tailing mode..." echo "Use 'q' to quit the log viewer" cd "$CDK_ITESTS_DIR" mprocs --config "$FALLBACK_MPROCS_CONFIG" } show_status() { echo "CDK Regtest Environment Status:" echo "===============================" # Check processes echo "Processes:" if [ ! -z "$CDK_REGTEST_PID" ] && kill -0 $CDK_REGTEST_PID 2>/dev/null; then echo " ✓ Regtest network (PID: $CDK_REGTEST_PID)" else echo " ❌ Regtest network" fi if [ ! -z "$CDK_MINTD_PID" ] && kill -0 $CDK_MINTD_PID 2>/dev/null; then echo " ✓ CLN Mint (PID: $CDK_MINTD_PID)" else echo " ❌ CLN Mint" fi if [ ! -z "$CDK_MINTD_LND_PID" ] && kill -0 $CDK_MINTD_LND_PID 2>/dev/null; then echo " ✓ LND Mint (PID: $CDK_MINTD_LND_PID)" else echo " ❌ LND Mint" fi echo echo "Network connectivity:" if curl -s "$CDK_TEST_MINT_URL/v1/info" >/dev/null 2>&1; then echo " ✓ CLN Mint responding" else echo " ❌ CLN Mint not responding" fi if curl -s "$CDK_TEST_MINT_URL_2/v1/info" >/dev/null 2>&1; then echo " ✓ LND Mint responding" else echo " ❌ LND Mint not responding" fi } restart_mints() { echo "===============================" echo "Restarting CDK Mints" echo "===============================" # Stop existing mints echo "Stopping existing mints..." if [ ! -z "$CDK_MINTD_PID" ] && kill -0 $CDK_MINTD_PID 2>/dev/null; then echo " Stopping CLN Mint (PID: $CDK_MINTD_PID)" kill -2 $CDK_MINTD_PID wait $CDK_MINTD_PID 2>/dev/null || true fi if [ ! -z "$CDK_MINTD_LND_PID" ] && kill -0 $CDK_MINTD_LND_PID 2>/dev/null; then echo " Stopping LND Mint (PID: $CDK_MINTD_LND_PID)" kill -2 $CDK_MINTD_LND_PID wait $CDK_MINTD_LND_PID 2>/dev/null || true fi # Recompile echo "Recompiling cdk-mintd..." if ! cargo build --bin cdk-mintd; then echo "❌ Compilation failed" return 1 fi echo "✓ Compilation successful" # Restart CLN mint echo "Starting CLN Mint..." export CDK_MINTD_CLN_RPC_PATH="$CDK_ITESTS_DIR/cln/one/regtest/lightning-rpc" export CDK_MINTD_URL="http://127.0.0.1:8085" export CDK_MINTD_WORK_DIR="$CDK_ITESTS_DIR/cln_mint" export CDK_MINTD_LISTEN_HOST="127.0.0.1" export CDK_MINTD_LISTEN_PORT=8085 export CDK_MINTD_LN_BACKEND="cln" export CDK_MINTD_MNEMONIC="eye survey guilt napkin crystal cup whisper salt luggage manage unveil loyal" export RUST_BACKTRACE=1 cargo run --bin cdk-mintd > "$CDK_MINTD_WORK_DIR/mintd.log" 2>&1 & NEW_CLN_PID=$! # Wait for CLN mint to be ready echo "Waiting for CLN mint to start..." local start_time=$(date +%s) while true; do local current_time=$(date +%s) local elapsed_time=$((current_time - start_time)) if [ $elapsed_time -ge 30 ]; then echo "❌ Timeout waiting for CLN mint" return 1 fi if curl -s "http://127.0.0.1:8085/v1/info" >/dev/null 2>&1; then echo "✓ CLN Mint ready" break fi sleep 1 done # Restart LND mint echo "Starting LND Mint..." export CDK_MINTD_LND_ADDRESS="https://localhost:10010" export CDK_MINTD_LND_CERT_FILE="$CDK_ITESTS_DIR/lnd/two/tls.cert" export CDK_MINTD_LND_MACAROON_FILE="$CDK_ITESTS_DIR/lnd/two/data/chain/bitcoin/regtest/admin.macaroon" export CDK_MINTD_URL="http://127.0.0.1:8087" export CDK_MINTD_WORK_DIR="$CDK_ITESTS_DIR/lnd_mint" export CDK_MINTD_LISTEN_HOST="127.0.0.1" export CDK_MINTD_LISTEN_PORT=8087 export CDK_MINTD_LN_BACKEND="lnd" export CDK_MINTD_MNEMONIC="cattle gold bind busy sound reduce tone addict baby spend february strategy" cargo run --bin cdk-mintd > "$CDK_MINTD_WORK_DIR/mintd.log" 2>&1 & NEW_LND_PID=$! # Wait for LND mint to be ready echo "Waiting for LND mint to start..." start_time=$(date +%s) while true; do current_time=$(date +%s) elapsed_time=$((current_time - start_time)) if [ $elapsed_time -ge 30 ]; then echo "❌ Timeout waiting for LND mint" return 1 fi if curl -s "http://127.0.0.1:8087/v1/info" >/dev/null 2>&1; then echo "✓ LND Mint ready" break fi sleep 1 done # Update PIDs in state file CDK_MINTD_PID=$NEW_CLN_PID CDK_MINTD_LND_PID=$NEW_LND_PID # Update state file echo "export CDK_ITESTS_DIR=\"$CDK_ITESTS_DIR\"" > "$ENV_FILE" echo "export CDK_TEST_MINT_URL=\"$CDK_TEST_MINT_URL\"" >> "$ENV_FILE" echo "export CDK_TEST_MINT_URL_2=\"$CDK_TEST_MINT_URL_2\"" >> "$ENV_FILE" echo "export CDK_MINTD_PID=\"$CDK_MINTD_PID\"" >> "$ENV_FILE" echo "export CDK_MINTD_LND_PID=\"$CDK_MINTD_LND_PID\"" >> "$ENV_FILE" echo "export CDK_REGTEST_PID=\"$CDK_REGTEST_PID\"" >> "$ENV_FILE" echo echo "✅ Mints restarted successfully!" echo " CLN Mint: http://127.0.0.1:8085 (PID: $CDK_MINTD_PID)" echo " LND Mint: http://127.0.0.1:8087 (PID: $CDK_MINTD_LND_PID)" echo "===============================" } # Main command dispatcher case "$1" in "ln-cln1") shift cln_command "one" "$@" ;; "ln-cln2") shift cln_command "two" "$@" ;; "ln-lnd1") shift lnd_command "one" "$@" ;; "ln-lnd2") shift lnd_command "two" "$@" ;; "btc") shift btc_command "$@" ;; "btc-mine") shift btc_mine "$@" ;; "mint-info") mint_info ;; "mint-test") mint_test ;; "restart-mints") restart_mints ;; "show-env") show_env ;; "show-logs") show_logs ;; "show-status") show_status ;; "logs") start_mprocs ;; "help"|"-h"|"--help"|"") show_help ;; *) echo "Unknown command: $1" echo "Run '$0 help' for available commands" exit 1 ;; esac