99 lines
3.1 KiB
Bash
99 lines
3.1 KiB
Bash
|
|
#!/usr/bin/env bash
|
||
|
|
# Monitor Transactions for Stuck/Failed Status
|
||
|
|
# Usage: ./monitor-transactions.sh [tx_hash] [max_wait_seconds]
|
||
|
|
|
||
|
|
set -euo pipefail
|
||
|
|
|
||
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
|
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||
|
|
|
||
|
|
# Colors
|
||
|
|
RED='\033[0;31m'
|
||
|
|
GREEN='\033[0;32m'
|
||
|
|
YELLOW='\033[1;33m'
|
||
|
|
BLUE='\033[0;34m'
|
||
|
|
NC='\033[0m'
|
||
|
|
|
||
|
|
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
|
||
|
|
log_success() { echo -e "${GREEN}[✓]${NC} $1"; }
|
||
|
|
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
|
||
|
|
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
||
|
|
|
||
|
|
# Load environment variables
|
||
|
|
if [ -f "$PROJECT_ROOT/.env" ]; then
|
||
|
|
source "$PROJECT_ROOT/.env"
|
||
|
|
elif [ -f "$PROJECT_ROOT/../.env" ]; then
|
||
|
|
source "$PROJECT_ROOT/../.env"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Configuration
|
||
|
|
RPC_URL="${RPC_URL_138:-http://192.168.11.250:8545}"
|
||
|
|
TX_HASH="${1:-}"
|
||
|
|
MAX_WAIT="${2:-300}" # Default 5 minutes
|
||
|
|
CHECK_INTERVAL=10
|
||
|
|
|
||
|
|
if [ -z "$TX_HASH" ]; then
|
||
|
|
log_error "Transaction hash required"
|
||
|
|
log_info "Usage: $0 <tx_hash> [max_wait_seconds]"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
log_info "========================================="
|
||
|
|
log_info "Transaction Monitor"
|
||
|
|
log_info "========================================="
|
||
|
|
log_info ""
|
||
|
|
log_info "Transaction: $TX_HASH"
|
||
|
|
log_info "Max Wait: $MAX_WAIT seconds"
|
||
|
|
log_info "Check Interval: $CHECK_INTERVAL seconds"
|
||
|
|
log_info ""
|
||
|
|
|
||
|
|
ELAPSED=0
|
||
|
|
while [ $ELAPSED -lt $MAX_WAIT ]; do
|
||
|
|
# Get transaction receipt
|
||
|
|
RECEIPT=$(cast receipt "$TX_HASH" --rpc-url "$RPC_URL" 2>/dev/null || echo "")
|
||
|
|
|
||
|
|
if [ -n "$RECEIPT" ]; then
|
||
|
|
# Check status
|
||
|
|
STATUS=$(echo "$RECEIPT" | grep -oE "status[[:space:]]+[0-9]+" | awk '{print $2}' || echo "")
|
||
|
|
BLOCK_NUMBER=$(echo "$RECEIPT" | grep -oE "blockNumber[[:space:]]+[0-9]+" | awk '{print $2}' || echo "")
|
||
|
|
|
||
|
|
if [ "$STATUS" = "1" ]; then
|
||
|
|
log_success "Transaction confirmed!"
|
||
|
|
log_info " Block: $BLOCK_NUMBER"
|
||
|
|
log_info " Status: Success"
|
||
|
|
exit 0
|
||
|
|
elif [ "$STATUS" = "0" ]; then
|
||
|
|
log_error "Transaction reverted!"
|
||
|
|
log_info " Block: $BLOCK_NUMBER"
|
||
|
|
log_info " Status: Failed"
|
||
|
|
|
||
|
|
# Try to get revert reason
|
||
|
|
TX_DATA=$(cast tx "$TX_HASH" --rpc-url "$RPC_URL" 2>/dev/null || echo "")
|
||
|
|
if echo "$TX_DATA" | grep -qi "revert"; then
|
||
|
|
REVERT_REASON=$(echo "$TX_DATA" | grep -i "revert" | head -1 || echo "")
|
||
|
|
log_info " Reason: $REVERT_REASON"
|
||
|
|
fi
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
else
|
||
|
|
# Check if transaction exists in mempool
|
||
|
|
TX_DATA=$(cast tx "$TX_HASH" --rpc-url "$RPC_URL" 2>/dev/null || echo "")
|
||
|
|
if [ -z "$TX_DATA" ]; then
|
||
|
|
log_warn "Transaction not found (may have been dropped)"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
log_info "[$ELAPSED/$MAX_WAIT] Transaction pending... waiting..."
|
||
|
|
sleep $CHECK_INTERVAL
|
||
|
|
ELAPSED=$((ELAPSED + CHECK_INTERVAL))
|
||
|
|
done
|
||
|
|
|
||
|
|
log_warn "Timeout reached. Transaction still pending."
|
||
|
|
log_info "Transaction may be stuck. Consider:"
|
||
|
|
log_info " 1. Checking gas price"
|
||
|
|
log_info " 2. Replacing with higher gas price"
|
||
|
|
log_info " 3. Contacting network administrator"
|
||
|
|
exit 1
|
||
|
|
|