#!/usr/bin/env bash # Deploy Contracts Using cast send with Nonce Skip # Bypasses stuck transactions by using explicit nonce set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" cd "$PROJECT_ROOT" # Colors RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' NC='\033[0m' log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } log_success() { echo -e "${GREEN}[✓]${NC} $1"; } log_warn() { echo -e "${YELLOW}[⚠]${NC} $1"; } log_error() { echo -e "${RED}[✗]${NC} $1"; } log_section() { echo -e "\n${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"; echo -e "${CYAN}$1${NC}"; echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n"; } # Load environment if [ -f "$PROJECT_ROOT/smom-dbis-138/.env" ]; then set +e source "$PROJECT_ROOT/smom-dbis-138/.env" 2>/dev/null || true set -e fi PRIVATE_KEY="${PRIVATE_KEY:-}" RPC_URL="${RPC_URL_138:-http://localhost:8545}" if [ -z "$PRIVATE_KEY" ]; then log_error "PRIVATE_KEY not set" exit 1 fi DEPLOYER=$(cast wallet address "$PRIVATE_KEY" 2>/dev/null || echo "") if [ -z "$DEPLOYER" ]; then log_error "Failed to derive deployer address" exit 1 fi log_section "Deploy Contracts with cast send (Nonce Skip)" log_info "Deployer: $DEPLOYER" log_info "RPC: $RPC_URL" # Get current nonce and use next CURRENT_NONCE=$(cast nonce "$DEPLOYER" --rpc-url "$RPC_URL" 2>/dev/null || echo "0") NEXT_NONCE=$((CURRENT_NONCE + 1)) log_info "Current nonce: $CURRENT_NONCE" log_info "Using nonce: $NEXT_NONCE (skipping stuck nonce)" # Gas prices MAX_FEE="2000000000" # 2 gwei PRIORITY="1900000000" # 1.9 gwei cd "$PROJECT_ROOT/smom-dbis-138" # Deploy WETH9 Bridge log_section "Deploy WETH9 Bridge" # Ensure compiled if [ ! -f "out/CCIPWETH9Bridge.sol/CCIPWETH9Bridge.json" ]; then log_info "Compiling WETH9 Bridge..." forge build --force script/DeployCCIPWETH9Bridge.s.sol 2>&1 | tail -10 fi BYTECODE=$(jq -r '.bytecode.object' out/CCIPWETH9Bridge.sol/CCIPWETH9Bridge.json 2>/dev/null || echo "") if [ -z "$BYTECODE" ] || [ "$BYTECODE" = "null" ]; then log_error "Failed to extract bytecode" exit 1 fi log_info "Deploying WETH9 Bridge with cast send..." DEPLOY_OUTPUT=$(cast send --rpc-url "$RPC_URL" \ --private-key "$PRIVATE_KEY" \ --nonce "$NEXT_NONCE" \ --gas-price "$MAX_FEE" \ --create "$BYTECODE" 2>&1 || echo "") echo "$DEPLOY_OUTPUT" | tail -30 # Extract contract address from output WETH9_ADDR=$(echo "$DEPLOY_OUTPUT" | grep -oE "contractAddress.*0x[a-fA-F0-9]{40}" | grep -oE "0x[a-fA-F0-9]{40}" | head -1 || echo "0x646e0026F8B5BCB94986377a25Da6f89BdCbBF6e") if [ -n "$WETH9_ADDR" ]; then log_success "WETH9 Bridge deployment transaction sent" log_info "Address: $WETH9_ADDR" sleep 10 CODE_SIZE=$(cast code "$WETH9_ADDR" --rpc-url "$RPC_URL" 2>/dev/null | wc -c || echo "0") if [ "$CODE_SIZE" -gt 1000 ]; then log_success "WETH9 Bridge deployed! Code size: $CODE_SIZE bytes" else log_warn "WETH9 Bridge not yet deployed (code size: $CODE_SIZE bytes)" fi else log_error "Failed to deploy WETH9 Bridge" exit 1 fi # Update nonce for next deployment NEXT_NONCE=$((NEXT_NONCE + 1)) # Deploy WETH10 Bridge log_section "Deploy WETH10 Bridge" # Ensure compiled if [ ! -f "out/CCIPWETH10Bridge.sol/CCIPWETH10Bridge.json" ]; then log_info "Compiling WETH10 Bridge..." forge build --force script/DeployCCIPWETH10Bridge.s.sol 2>&1 | tail -10 fi BYTECODE=$(jq -r '.bytecode.object' out/CCIPWETH10Bridge.sol/CCIPWETH10Bridge.json 2>/dev/null || echo "") if [ -z "$BYTECODE" ] || [ "$BYTECODE" = "null" ]; then log_error "Failed to extract bytecode" exit 1 fi log_info "Deploying WETH10 Bridge with cast send (nonce: $NEXT_NONCE)..." DEPLOY_OUTPUT=$(cast send --rpc-url "$RPC_URL" \ --private-key "$PRIVATE_KEY" \ --nonce "$NEXT_NONCE" \ --gas-price "$MAX_FEE" \ --create "$BYTECODE" 2>&1 || echo "") echo "$DEPLOY_OUTPUT" | tail -30 WETH10_ADDR=$(echo "$DEPLOY_OUTPUT" | grep -oE "contractAddress.*0x[a-fA-F0-9]{40}" | grep -oE "0x[a-fA-F0-9]{40}" | head -1 || echo "") if [ -n "$WETH10_ADDR" ]; then log_success "WETH10 Bridge deployment transaction sent" log_info "Address: $WETH10_ADDR" sleep 10 CODE_SIZE=$(cast code "$WETH10_ADDR" --rpc-url "$RPC_URL" 2>/dev/null | wc -c || echo "0") if [ "$CODE_SIZE" -gt 1000 ]; then log_success "WETH10 Bridge deployed! Code size: $CODE_SIZE bytes" else log_warn "WETH10 Bridge not yet deployed (code size: $CODE_SIZE bytes)" fi else log_error "Failed to deploy WETH10 Bridge" exit 1 fi # Configure destinations log_section "Configure Bridge Destinations" MAINNET_SELECTOR="5009297550715157269" MAINNET_WETH9="0x3304b747E565a97ec8AC220b0B6A1f6ffDB837e6" MAINNET_WETH10="0x8078A09637e47Fa5Ed34F626046Ea2094a5CDE5e" NEXT_NONCE=$((NEXT_NONCE + 1)) if [ "$CODE_SIZE" -gt 1000 ]; then log_info "Configuring WETH9 Bridge with Mainnet..." cast send "$WETH9_ADDR" \ "addDestination(uint64,address)" \ "$MAINNET_SELECTOR" \ "$MAINNET_WETH9" \ --rpc-url "$RPC_URL" \ --private-key "$PRIVATE_KEY" \ --nonce "$NEXT_NONCE" \ --gas-price "$MAX_FEE" \ 2>&1 | tail -15 NEXT_NONCE=$((NEXT_NONCE + 1)) fi if [ -n "$WETH10_ADDR" ]; then CODE10_SIZE=$(cast code "$WETH10_ADDR" --rpc-url "$RPC_URL" 2>/dev/null | wc -c || echo "0") if [ "$CODE10_SIZE" -gt 1000 ]; then log_info "Configuring WETH10 Bridge with Mainnet..." cast send "$WETH10_ADDR" \ "addDestination(uint64,address)" \ "$MAINNET_SELECTOR" \ "$MAINNET_WETH10" \ --rpc-url "$RPC_URL" \ --private-key "$PRIVATE_KEY" \ --nonce "$NEXT_NONCE" \ --gas-price "$MAX_FEE" \ 2>&1 | tail -15 fi fi # Final summary log_section "Deployment Complete" echo "Deployed Addresses:" log_success "WETH9 Bridge: $WETH9_ADDR" if [ -n "$WETH10_ADDR" ]; then log_success "WETH10 Bridge: $WETH10_ADDR" fi # Save to file cat > /tmp/chain138-deployed-addresses-$(date +%Y%m%d-%H%M%S).txt <