#!/usr/bin/env bash # Deploy LINK Token to Canonical Address using CREATE2 # Target: 0x514910771AF9Ca656af840dff83E8264EcF986CA set -euo pipefail # Load IP configuration SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" source "${PROJECT_ROOT}/config/ip-addresses.conf" 2>/dev/null || true SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" # 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 source "$PROJECT_ROOT/smom-dbis-138/.env" 2>/dev/null || true fi # Try multiple RPC endpoints in order if [ -n "${RPC_URL_138:-}" ]; then RPC_URL="${RPC_URL_138}" elif [ -n "${RPC_URL:-}" ]; then RPC_URL="${RPC_URL}" else # Try working endpoint first RPC_URL="http://${RPC_CORE_1}:8545" fi # Test RPC connection log_info "Testing RPC connection to $RPC_URL..." CHAIN_ID=$(cast chain-id --rpc-url "$RPC_URL" 2>/dev/null || echo "") if [ -z "$CHAIN_ID" ]; then log_warn "Failed to connect to $RPC_URL, trying alternative..." RPC_URL="http://${RPC_ALLTRA_1:-192.168.11.250}:8545" CHAIN_ID=$(cast chain-id --rpc-url "$RPC_URL" 2>/dev/null || echo "") if [ -z "$CHAIN_ID" ]; then log_error "Failed to connect to RPC endpoints" exit 1 fi log_info "Using alternative RPC: $RPC_URL" fi PRIVATE_KEY="${PRIVATE_KEY:-}" CANONICAL_LINK="0x514910771AF9Ca656af840dff83E8264EcF986CA" log_section "Deploy LINK Token to Canonical Address (CREATE2)" if [ -z "$PRIVATE_KEY" ]; then log_error "PRIVATE_KEY not found in environment" 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_info "Configuration:" log_info " Target Address: $CANONICAL_LINK" log_info " RPC URL: $RPC_URL" log_info " Deployer: $DEPLOYER" log_info "" # Check if canonical address already has code log_info "Checking canonical address..." EXISTING_CODE=$(cast code "$CANONICAL_LINK" --rpc-url "$RPC_URL" 2>/dev/null || echo "") CODE_SIZE=$(echo -n "$EXISTING_CODE" | wc -c 2>/dev/null || echo "0") if [ "$CODE_SIZE" -gt 10 ]; then log_warn "Contract already exists at canonical address!" log_info "Code size: $CODE_SIZE bytes" # Check if it's a LINK token NAME=$(cast call "$CANONICAL_LINK" "name()(string)" --rpc-url "$RPC_URL" 2>/dev/null || echo "") SYMBOL=$(cast call "$CANONICAL_LINK" "symbol()(string)" --rpc-url "$RPC_URL" 2>/dev/null || echo "") if [ -n "$NAME" ] && [ "$NAME" = "Chainlink Token" ]; then log_success "✓ Canonical LINK token already deployed!" log_info " Name: $NAME" log_info " Symbol: $SYMBOL" exit 0 fi else log_info "Canonical address is empty - proceeding with CREATE2 deployment" fi log_warn "" log_warn "⚠ IMPORTANT NOTES:" log_warn "1. This attempts to brute-force a salt value to match the canonical address" log_warn "2. May not succeed if bytecode differs from original LINK token" log_warn "3. May not succeed if original LINK was deployed with CREATE (not CREATE2)" log_warn "4. Brute-force search may take significant time/gas" log_warn "" read -p "Continue with CREATE2 deployment attempt? (y/N): " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then log_info "Deployment cancelled" exit 0 fi # Change to project directory cd "$PROJECT_ROOT/smom-dbis-138" log_section "Deploying LINK Token to Canonical Address" log_info "Using Foundry script: script/DeployLinkToCanonicalAddress.s.sol" log_info "This will:" log_info " 1. Deploy CREATE2Factory" log_info " 2. Search for salt that produces canonical address" log_info " 3. Deploy LINK token using CREATE2" log_info "" forge script script/DeployLinkToCanonicalAddress.s.sol:DeployLinkToCanonicalAddress \ --rpc-url "$RPC_URL" \ --broadcast \ --private-key "$PRIVATE_KEY" \ --legacy \ -vvv log_info "" log_section "Verification" # Check if deployment succeeded DEPLOYED_CODE=$(cast code "$CANONICAL_LINK" --rpc-url "$RPC_URL" 2>/dev/null || echo "") DEPLOYED_SIZE=$(echo -n "$DEPLOYED_CODE" | wc -c 2>/dev/null || echo "0") if [ "$DEPLOYED_SIZE" -gt 10 ]; then log_success "✓ LINK token deployed at canonical address!" NAME=$(cast call "$CANONICAL_LINK" "name()(string)" --rpc-url "$RPC_URL" 2>/dev/null || echo "") SYMBOL=$(cast call "$CANONICAL_LINK" "symbol()(string)" --rpc-url "$RPC_URL" 2>/dev/null || echo "") log_info " Address: $CANONICAL_LINK" log_info " Name: $NAME" log_info " Symbol: $SYMBOL" log_info "" log_success "Update .env with:" log_info " LINK_TOKEN=$CANONICAL_LINK" log_info " CCIP_FEE_TOKEN=$CANONICAL_LINK" else log_warn "⚠ Deployment may not have succeeded" log_warn "Canonical address still appears empty" log_warn "Check the forge output above for details" fi