101 lines
3.1 KiB
Bash
Executable File
101 lines
3.1 KiB
Bash
Executable File
#!/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"
|
|
|