#!/usr/bin/env bash # Deploy Canonical LINK Token on ChainID 138 # Note: Cannot deploy to exact canonical address (0x514910771AF9Ca656af840dff83E8264EcF986CA) # using CREATE - would require CREATE2 with specific factory and salt. # This deploys a LINK token with the same interface as canonical LINK. 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 RPC_URL="${RPC_URL:-${RPC_URL_138:-http://${RPC_ALLTRA_1:-192.168.11.250}:8545}}" PRIVATE_KEY="${PRIVATE_KEY:-}" CANONICAL_LINK="0x514910771AF9Ca656af840dff83E8264EcF986CA" log_section "Deploy Canonical LINK Token on ChainID 138" 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 from PRIVATE_KEY" exit 1 fi log_info "Configuration:" log_info " RPC URL: $RPC_URL" log_info " Deployer: $DEPLOYER" log_info " Canonical LINK (Mainnet): $CANONICAL_LINK" log_info "" # Check if canonical address already has code log_info "Checking canonical address on ChainID 138..." 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 $CANONICAL_LINK" 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" log_info "" log_success "Deployment not needed - token already exists at canonical address" exit 0 else log_warn "Contract exists but may not be LINK token (Name: $NAME)" fi else log_warn "⚠ Cannot deploy to canonical address using CREATE deployment" log_info "The canonical address $CANONICAL_LINK is an Ethereum Mainnet address" log_info "To deploy at that exact address on ChainID 138 would require CREATE2" log_info "with specific factory contract and salt calculations" log_info "" log_info "Proceeding with standard deployment to a new address..." fi # Change to project directory cd "$PROJECT_ROOT/smom-dbis-138" # Deploy using Foundry script log_section "Deploying LINK Token" log_info "Using deployment script: script/DeployMockLinkToken.s.sol" log_info "This will deploy a LINK token matching canonical LINK interface" log_info "" forge script script/DeployMockLinkToken.s.sol:DeployMockLinkToken \ --rpc-url "$RPC_URL" \ --broadcast \ --private-key "$PRIVATE_KEY" \ --legacy \ -vvv # Extract deployed address from output log_info "" log_section "Extracting Deployed Address" # The address is printed in the console output log_info "Check the forge output above for the deployed address" log_info "Or verify with: cast code
--rpc-url $RPC_URL" log_warn "" log_warn "⚠ Important Notes:" log_warn "1. The deployed address will be different from the canonical Mainnet address" log_warn "2. Update .env with: LINK_TOKEN=