64 lines
2.6 KiB
Bash
64 lines
2.6 KiB
Bash
#!/usr/bin/env bash
|
|
# Infura RPC URL builder: uses INFURA_PROJECT_ID and optional INFURA_PROJECT_SECRET (Basic Auth).
|
|
# Usage: source "$SCRIPT_DIR/lib/infura.sh" # then call build_infura_rpc "avalanche-mainnet"
|
|
# When INFURA_PROJECT_SECRET is set, the URL uses Basic Auth (required for some operations e.g. eth_sendTransaction).
|
|
# Set INFURA_PROJECT_ID and optionally INFURA_PROJECT_SECRET in .env; never commit secrets.
|
|
|
|
build_infura_rpc() {
|
|
local host_path="${1:?Usage: build_infura_rpc <host-path> e.g. avalanche-mainnet}"
|
|
local id="${INFURA_PROJECT_ID:-}"
|
|
local secret="${INFURA_PROJECT_SECRET:-}"
|
|
if [[ -z "$id" ]]; then
|
|
return 1
|
|
fi
|
|
local auth=""
|
|
if [[ -n "$secret" && ! "$secret" =~ \$\{ ]]; then
|
|
local encoded
|
|
encoded=$(printf '%s' "$secret" | python3 -c "import sys, urllib.parse; print(urllib.parse.quote(sys.stdin.read(), safe=''))" 2>/dev/null) || encoded="$secret"
|
|
auth="${id}:${encoded}@"
|
|
fi
|
|
echo "https://${auth}${host_path}.infura.io/v3/${id}"
|
|
}
|
|
|
|
# Given any RPC URL, if it is an Infura URL (https://HOST.infura.io/v3/PROJECT_ID) and
|
|
# INFURA_PROJECT_SECRET is set, return the same URL with Basic Auth so requests succeed.
|
|
# If the URL already contains @ (already has auth), or is not Infura, return as-is.
|
|
# Use this before passing .env RPC vars to cast/curl so Infura is accessed with the secret.
|
|
ensure_infura_rpc_url() {
|
|
local url="${1:-}"
|
|
[[ -z "$url" ]] && echo "" && return 0
|
|
[[ "$url" == *"@"* ]] && echo "$url" && return 0
|
|
if [[ "$url" =~ ^https://([a-zA-Z0-9.-]+)\.infura\.io/v3/([a-zA-Z0-9]+)$ ]]; then
|
|
local host="${BASH_REMATCH[1]}"
|
|
local id="${BASH_REMATCH[2]}"
|
|
local secret="${INFURA_PROJECT_SECRET:-}"
|
|
if [[ -n "$secret" && ! "$secret" =~ \$\{ ]]; then
|
|
local encoded
|
|
encoded=$(printf '%s' "$secret" | python3 -c "import sys, urllib.parse; print(urllib.parse.quote(sys.stdin.read(), safe=''))" 2>/dev/null) || encoded="$secret"
|
|
echo "https://${id}:${encoded}@${host}.infura.io/v3/${id}"
|
|
return 0
|
|
fi
|
|
fi
|
|
echo "$url"
|
|
}
|
|
|
|
# Build Infura Gas API URL for Ethereum mainnet (networks/1).
|
|
# INFURA_GAS_API can be set to full URL; otherwise uses INFURA_PROJECT_ID.
|
|
get_infura_gas_api_url() {
|
|
local url="${INFURA_GAS_API:-}"
|
|
if [[ -n "$url" ]]; then
|
|
if [[ "$url" == *"/v3/"* ]]; then
|
|
local key="${url#*v3/}"
|
|
key="${key%%/*}"
|
|
echo "https://gas.api.infura.io/v3/${key}/networks/1/suggestedGasFees"
|
|
return
|
|
fi
|
|
echo "$url"
|
|
return
|
|
fi
|
|
local id="${INFURA_PROJECT_ID:-}"
|
|
if [[ -n "$id" ]]; then
|
|
echo "https://gas.api.infura.io/v3/${id}/networks/1/suggestedGasFees"
|
|
fi
|
|
}
|