Files
smom-dbis-138/scripts/deployment/fund-ccip-bridges-with-link.sh
defiQUG 0561d26bcd
Some checks failed
CI/CD Pipeline / Solidity Contracts (push) Failing after 1m8s
CI/CD Pipeline / Lint and Format (push) Failing after 1m8s
CI/CD Pipeline / Terraform Validation (push) Failing after 25s
CI/CD Pipeline / Kubernetes Validation (push) Successful in 26s
CI/CD Pipeline / Security Scanning (push) Successful in 3m5s
Deploy ChainID 138 / Deploy ChainID 138 (push) Failing after 51s
HYBX OMNL TypeScript & anchor / token-aggregation build + reconcile artifact (push) Failing after 58s
OMNL reconcile anchor / Run omnl:reconcile and upload artifacts (push) Failing after 30s
Validation / validate-genesis (push) Successful in 27s
Validation / validate-kubernetes (push) Failing after 9s
Validation / validate-smart-contracts (push) Failing after 8s
Validation / validate-terraform (push) Failing after 44s
Validation / validate-documentation (push) Failing after 18s
Validation / validate-security (push) Failing after 2m14s
Verify Deployment / Verify Deployment (push) Failing after 51s
fix(deployment): parse cast send receipts and extend RPC timeouts for LINK ops
Cast can exit 0 on mined reverts; classify receipt output so operators see
failures. Add cast --timeout/--rpc-timeout on mainnet and L2 LINK transfers.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-11 15:23:05 -07:00

184 lines
7.8 KiB
Bash
Executable File

#!/usr/bin/env bash
# Fund all CCIP WETH9/WETH10 bridge contracts with LINK on each chain.
# Amount via tag (not .env): --link <amount> (default 10 LINK), --dry-run to print commands only.
# Usage: ./scripts/deployment/fund-ccip-bridges-with-link.sh [--link 10] [--dry-run]
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$PROJECT_ROOT"
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
source "$SCRIPT_DIR/../lib/deployment/prompts.sh"
load_deployment_env
parse_link_tags "$@"
[[ -f "$SCRIPT_DIR/../lib/infura.sh" ]] && source "$SCRIPT_DIR/../lib/infura.sh" 2>/dev/null || true
[[ -n "${PRIVATE_KEY:-}" && ! "$PRIVATE_KEY" =~ ^0x ]] && PRIVATE_KEY="0x$PRIVATE_KEY"
report_cast_send_result() {
local _out="$1"
if echo "$_out" | grep -qE 'status[[:space:]]+0[[:space:]]+\(failed\)'; then
echo " On-chain revert (mined, status=0)" >&2
echo " $_out" >&2
elif echo "$_out" | grep -qE 'status[[:space:]]+1[[:space:]]+\(success\)'; then
echo " OK (mined)"
[[ -n "$_out" ]] && echo " $_out"
elif echo "$_out" | grep -qiE 'Error:|revert|Failed|timeout|null response|invalid nonce'; then
echo " RPC / client failure (non-fatal)" >&2
echo " $_out" >&2
elif echo "$_out" | grep -q 'transactionHash'; then
echo " OK (submitted)"
[[ -n "$_out" ]] && echo " $_out"
else
echo " Ambiguous cast output (non-fatal)" >&2
echo " $_out" >&2
fi
}
run_or_echo() {
if [[ "${DRY_RUN:-0}" = "1" ]]; then
echo " [DRY RUN] $*"
else
local _out
if _out=$(eval "$*" 2>&1); then
report_cast_send_result "$_out"
else
echo " Failed (non-fatal)" >&2
echo " $_out" >&2
fi
fi
}
ensure_rpc() { local rpc="$1"; type ensure_infura_rpc_url &>/dev/null && [[ -n "$rpc" ]] && rpc=$(ensure_infura_rpc_url "$rpc"); echo "$rpc"; }
get_token_balance() {
local token="$1" owner="$2" rpc="$3"
cast call "${token,,}" "balanceOf(address)(uint256)" "${owner,,}" --rpc-url "$rpc" 2>/dev/null || echo "0"
}
has_sufficient_link() {
local token="$1" owner="$2" rpc="$3" needed="$4"
local bal
bal=$(get_token_balance "$token" "$owner" "$rpc")
bal="${bal%% *}"
[[ "$bal" =~ ^[0-9]+$ ]] || bal="0"
python3 - <<PY
bal = int("$bal")
needed = int("$needed")
raise SystemExit(0 if bal >= needed else 1)
PY
}
print_skip() {
local label="$1" token="$2" owner="$3" rpc="$4" needed="$5"
local bal
bal=$(get_token_balance "$token" "$owner" "$rpc")
echo " Skipped (insufficient LINK balance: have ${bal%% *}, need $needed)"
}
if [[ -z "$PRIVATE_KEY" ]]; then
echo "ERROR: PRIVATE_KEY not set" >&2
exit 1
fi
DEPLOYER_ADDR=$(cast wallet address --private-key "$PRIVATE_KEY" 2>/dev/null || true)
if [[ -z "$DEPLOYER_ADDR" ]]; then
echo "ERROR: could not derive deployer address from PRIVATE_KEY" >&2
exit 1
fi
echo "Funding CCIP bridges with LINK (amount per bridge: $LINK_AMOUNT_WEI wei)"
echo "Deployer: $DEPLOYER_ADDR"
echo ""
# Chain 138 (Besu: gas estimation often fails; use explicit legacy gas like manual cast)
if [[ -n "${RPC_URL_138:-}" && -n "${LINK_TOKEN_CHAIN138:-${LINK_TOKEN:-}}" ]]; then
link="${LINK_TOKEN_CHAIN138:-$LINK_TOKEN}"
link="${link,,}"
rpc=$(ensure_rpc "$RPC_URL_138")
echo "Chain 138 (RPC: ${rpc%%\?*}...)"
_gas138="--legacy --gas-limit 250000 --gas-price 2000000000 --timeout 120"
if [[ -n "${CCIPWETH9_BRIDGE_CHAIN138:-}" ]]; then
if has_sufficient_link "$link" "$DEPLOYER_ADDR" "$rpc" "$LINK_AMOUNT_WEI"; then
run_or_echo "cast send $link \"transfer(address,uint256)\" ${CCIPWETH9_BRIDGE_CHAIN138,,} $LINK_AMOUNT_WEI --rpc-url \"$rpc\" --private-key \"\$PRIVATE_KEY\" $_gas138"
else
print_skip "CHAIN138/WETH9" "$link" "$DEPLOYER_ADDR" "$rpc" "$LINK_AMOUNT_WEI"
fi
fi
if [[ -n "${CCIPWETH10_BRIDGE_CHAIN138:-}" ]]; then
if has_sufficient_link "$link" "$DEPLOYER_ADDR" "$rpc" "$LINK_AMOUNT_WEI"; then
run_or_echo "cast send $link \"transfer(address,uint256)\" ${CCIPWETH10_BRIDGE_CHAIN138,,} $LINK_AMOUNT_WEI --rpc-url \"$rpc\" --private-key \"\$PRIVATE_KEY\" $_gas138"
else
print_skip "CHAIN138/WETH10" "$link" "$DEPLOYER_ADDR" "$rpc" "$LINK_AMOUNT_WEI"
fi
fi
echo ""
fi
# Ethereum
if [[ -n "${ETHEREUM_MAINNET_RPC:-}" && -n "${MAINNET_LINK_TOKEN:-${CCIP_ETH_LINK_TOKEN:-}}" ]]; then
link="${MAINNET_LINK_TOKEN:-$CCIP_ETH_LINK_TOKEN}"
rpc=$(ensure_rpc "$ETHEREUM_MAINNET_RPC")
echo "Ethereum Mainnet"
_pub_timeout="--timeout 300 --rpc-timeout 120"
if [[ -n "${MAINNET_CCIP_WETH9_BRIDGE:-}" ]]; then
if has_sufficient_link "$link" "$DEPLOYER_ADDR" "$rpc" "$LINK_AMOUNT_WEI"; then
run_or_echo "cast send $link \"transfer(address,uint256)\" $MAINNET_CCIP_WETH9_BRIDGE $LINK_AMOUNT_WEI --rpc-url \"$rpc\" --private-key \"\$PRIVATE_KEY\" --legacy $_pub_timeout"
else
print_skip "ETH/WETH9" "$link" "$DEPLOYER_ADDR" "$rpc" "$LINK_AMOUNT_WEI"
fi
fi
if [[ -n "${MAINNET_CCIP_WETH10_BRIDGE:-}" ]]; then
if has_sufficient_link "$link" "$DEPLOYER_ADDR" "$rpc" "$LINK_AMOUNT_WEI"; then
run_or_echo "cast send $link \"transfer(address,uint256)\" $MAINNET_CCIP_WETH10_BRIDGE $LINK_AMOUNT_WEI --rpc-url \"$rpc\" --private-key \"\$PRIVATE_KEY\" --legacy $_pub_timeout"
else
print_skip "ETH/WETH10" "$link" "$DEPLOYER_ADDR" "$rpc" "$LINK_AMOUNT_WEI"
fi
fi
echo ""
fi
# BSC, Polygon, Base, Optimism, Arbitrum, Avalanche, Cronos, Gnosis, Celo, Wemix (matches check-link-balance-config-ready-chains.sh)
for label in BSC POLYGON BASE OPTIMISM ARBITRUM AVALANCHE CRONOS GNOSIS CELO WEMIX; do
case "$label" in
BSC) rpc_var="BSC_RPC_URL"; link_var="CCIP_BSC_LINK_TOKEN"; ;;
POLYGON) rpc_var="POLYGON_MAINNET_RPC"; link_var="CCIP_POLYGON_LINK_TOKEN"; ;;
BASE) rpc_var="BASE_MAINNET_RPC"; link_var="CCIP_BASE_LINK_TOKEN"; ;;
OPTIMISM) rpc_var="OPTIMISM_MAINNET_RPC"; link_var="CCIP_OPTIMISM_LINK_TOKEN"; ;;
ARBITRUM) rpc_var="ARBITRUM_MAINNET_RPC"; link_var="CCIP_ARBITRUM_LINK_TOKEN"; ;;
AVALANCHE) rpc_var="AVALANCHE_RPC_URL"; link_var="CCIP_AVALANCHE_LINK_TOKEN"; ;;
CRONOS) rpc_var="CRONOS_RPC_URL"; link_var="CCIP_CRONOS_LINK_TOKEN"; rpc_fb="CRONOS_RPC"; link_fb="LINK_TOKEN_CRONOS"; ;;
GNOSIS) rpc_var="GNOSIS_MAINNET_RPC"; link_var="CCIP_GNOSIS_LINK_TOKEN"; rpc_fb="GNOSIS_RPC"; link_fb="LINK_TOKEN_GNOSIS"; ;;
CELO) rpc_var="CELO_MAINNET_RPC"; link_var="CCIP_CELO_LINK_TOKEN"; rpc_fb="CELO_RPC"; link_fb="LINK_TOKEN_CELO"; ;;
WEMIX) rpc_var="WEMIX_RPC"; link_var="CCIP_WEMIX_LINK_TOKEN"; rpc_fb="WEMIX_MAINNET_RPC"; link_fb="LINK_TOKEN_WEMIX"; ;;
esac
rpc="${!rpc_var:-${!rpc_fb:-}}"
link="${!link_var:-${!link_fb:-}}"
rpc=$(ensure_rpc "$rpc")
[[ -z "$rpc" || -z "$link" ]] && continue
bridge9_var="CCIPWETH9_BRIDGE_${label}"
bridge10_var="CCIPWETH10_BRIDGE_${label}"
addr9="${!bridge9_var:-}"
addr10="${!bridge10_var:-}"
[[ -z "$addr9" && -z "$addr10" ]] && continue
echo "$label"
_pub_timeout_loop="--timeout 300 --rpc-timeout 120"
if [[ -n "$addr9" ]]; then
if has_sufficient_link "$link" "$DEPLOYER_ADDR" "$rpc" "$LINK_AMOUNT_WEI"; then
run_or_echo "cast send ${link,,} \"transfer(address,uint256)\" ${addr9,,} $LINK_AMOUNT_WEI --rpc-url \"$rpc\" --private-key \"\$PRIVATE_KEY\" --legacy $_pub_timeout_loop"
else
print_skip "$label/WETH9" "$link" "$DEPLOYER_ADDR" "$rpc" "$LINK_AMOUNT_WEI"
fi
fi
if [[ -n "$addr10" ]]; then
if has_sufficient_link "$link" "$DEPLOYER_ADDR" "$rpc" "$LINK_AMOUNT_WEI"; then
run_or_echo "cast send ${link,,} \"transfer(address,uint256)\" ${addr10,,} $LINK_AMOUNT_WEI --rpc-url \"$rpc\" --private-key \"\$PRIVATE_KEY\" --legacy $_pub_timeout_loop"
else
print_skip "$label/WETH10" "$link" "$DEPLOYER_ADDR" "$rpc" "$LINK_AMOUNT_WEI"
fi
fi
echo ""
done
echo "Done. Use --link <amount> and --dry-run to adjust."