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