Add full monorepo: virtual-banker, backend, frontend, docs, scripts, deployment
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
98
scripts/monitor-transactions.sh
Executable file
98
scripts/monitor-transactions.sh
Executable file
@@ -0,0 +1,98 @@
|
||||
#!/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
|
||||
|
||||
Reference in New Issue
Block a user