Files
explorer-monorepo/scripts/get-optimal-gas-from-api.sh

101 lines
3.1 KiB
Bash
Raw Permalink Normal View History

#!/usr/bin/env bash
# Get Optimal Gas Price from Etherscan Gas API
# Provides Safe, Proposed, and Fast gas prices
# Usage: ./get-optimal-gas-from-api.sh [speed] [chain_id]
# Speed: safe, proposed, fast (default: proposed)
# Chain ID: 1 for Ethereum Mainnet (default: uses RPC chain)
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
# 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
SPEED="${1:-proposed}" # safe, proposed, fast
CHAIN_ID="${2:-}"
RPC_URL="${RPC_URL_138:-http://192.168.11.250:8545}"
# Get chain ID from RPC if not provided
if [ -z "$CHAIN_ID" ]; then
CHAIN_ID=$(cast chain-id --rpc-url "$RPC_URL" 2>/dev/null || echo "1")
fi
# Etherscan API endpoints by chain
declare -A ETHERSCAN_APIS=(
["1"]="https://api.etherscan.io/api"
["56"]="https://api.bscscan.com/api"
["137"]="https://api.polygonscan.com/api"
["43114"]="https://api.snowtrace.io/api"
["8453"]="https://api.basescan.org/api"
["42161"]="https://api.arbiscan.io/api"
["10"]="https://api-optimistic.etherscan.io/api"
)
# Get API endpoint
API_ENDPOINT="${ETHERSCAN_APIS[$CHAIN_ID]:-}"
if [ -z "$API_ENDPOINT" ]; then
# Fallback to RPC gas price for unsupported chains
GAS_PRICE=$(cast gas-price --rpc-url "$RPC_URL" 2>/dev/null || echo "1000000000")
echo "$GAS_PRICE"
exit 0
fi
# Get API key (optional, works without it but with rate limits)
API_KEY="${ETHERSCAN_API_KEY:-}"
# Build API URL
if [ -n "$API_KEY" ]; then
API_URL="${API_ENDPOINT}?module=gastracker&action=gasoracle&apikey=${API_KEY}"
else
API_URL="${API_ENDPOINT}?module=gastracker&action=gasoracle"
fi
# Fetch gas prices from API
GAS_DATA=$(curl -s "$API_URL" 2>/dev/null || echo "")
if [ -z "$GAS_DATA" ]; then
# Fallback to RPC gas price
GAS_PRICE=$(cast gas-price --rpc-url "$RPC_URL" 2>/dev/null || echo "1000000000")
echo "$GAS_PRICE"
exit 0
fi
# Parse gas price based on speed
case "$SPEED" in
safe)
GAS_PRICE_GWEI=$(echo "$GAS_DATA" | grep -oE '"SafeGasPrice":"[0-9.]+"' | cut -d'"' -f4 || echo "")
;;
proposed)
GAS_PRICE_GWEI=$(echo "$GAS_DATA" | grep -oE '"ProposeGasPrice":"[0-9.]+"' | cut -d'"' -f4 || echo "")
;;
fast)
GAS_PRICE_GWEI=$(echo "$GAS_DATA" | grep -oE '"FastGasPrice":"[0-9.]+"' | cut -d'"' -f4 || echo "")
;;
*)
GAS_PRICE_GWEI=$(echo "$GAS_DATA" | grep -oE '"ProposeGasPrice":"[0-9.]+"' | cut -d'"' -f4 || echo "")
;;
esac
# Convert Gwei to Wei
if [ -n "$GAS_PRICE_GWEI" ] && [ "$GAS_PRICE_GWEI" != "0" ]; then
# Convert decimal Gwei to Wei (multiply by 1e9)
GAS_PRICE=$(echo "scale=0; $GAS_PRICE_GWEI * 1000000000 / 1" | bc 2>/dev/null || echo "")
if [ -n "$GAS_PRICE" ] && [ "$GAS_PRICE" != "0" ]; then
echo "$GAS_PRICE"
exit 0
fi
fi
# Fallback to RPC gas price
GAS_PRICE=$(cast gas-price --rpc-url "$RPC_URL" 2>/dev/null || echo "1000000000")
echo "$GAS_PRICE"