upgrade-proxy.sh
1 #!/bin/bash 2 3 # Upgrade script for KaraokeSchool proxy contracts 4 # Simple and clean - just run it 5 6 set -e 7 8 # Colors for output 9 RED='\033[0;31m' 10 GREEN='\033[0;32m' 11 YELLOW='\033[1;33m' 12 BLUE='\033[0;34m' 13 NC='\033[0m' # No Color 14 15 # Source environment files 16 if [ -f ".env" ]; then 17 source .env 18 fi 19 if [ -f "../.env" ]; then 20 source ../.env 21 fi 22 23 # Parse arguments 24 NETWORK="" 25 PROXY_ADDRESS="" 26 NEW_IMPLEMENTATION="" 27 USE_LEDGER=false 28 29 while [[ $# -gt 0 ]]; do 30 case $1 in 31 -n|--network) 32 NETWORK="$2" 33 shift 2 34 ;; 35 -p|--proxy) 36 PROXY_ADDRESS="$2" 37 shift 2 38 ;; 39 -i|--implementation) 40 NEW_IMPLEMENTATION="$2" 41 shift 2 42 ;; 43 -l|--ledger) 44 USE_LEDGER=true 45 shift 46 ;; 47 -h|--help) 48 echo "Usage: $0 -n <network> -p <proxy-address> -i <implementation-address> [--ledger]" 49 echo "" 50 echo "Options:" 51 echo " -n, --network Network (base-mainnet, base-sepolia)" 52 echo " -p, --proxy Proxy contract address" 53 echo " -i, --implementation New implementation address" 54 echo " -l, --ledger Use Ledger hardware wallet" 55 echo "" 56 echo "Examples:" 57 echo " $0 -n base-sepolia -p 0xED93... -i 0x2DFb..." 58 echo " $0 -n base-mainnet -p 0x00a4... -i 0x1234... --ledger" 59 exit 0 60 ;; 61 *) 62 echo "Unknown option: $1" 63 exit 1 64 ;; 65 esac 66 done 67 68 # Validate inputs 69 if [ -z "$NETWORK" ] || [ -z "$PROXY_ADDRESS" ] || [ -z "$NEW_IMPLEMENTATION" ]; then 70 echo -e "${RED}Error: Missing required arguments${NC}" 71 echo "Usage: $0 -n <network> -p <proxy-address> -i <implementation-address>" 72 exit 1 73 fi 74 75 # Network configuration 76 case $NETWORK in 77 "base-mainnet") 78 CHAIN_ID=8453 79 RPC_URL="https://mainnet.base.org" 80 ;; 81 "base-sepolia") 82 CHAIN_ID=84532 83 RPC_URL="https://sepolia.base.org" 84 ;; 85 *) 86 echo -e "${RED}Error: Unknown network $NETWORK${NC}" 87 exit 1 88 ;; 89 esac 90 91 # Handle Ledger vs Private Key 92 if [ "$USE_LEDGER" = true ]; then 93 echo -e "${YELLOW}⚠️ Ledger Upgrade Requirements:${NC}" 94 echo " - Ledger connected and unlocked" 95 echo " - Ethereum app open" 96 echo " - Blind signing enabled" 97 echo "" 98 99 # Get Ledger address 100 echo -e "${BLUE}🔍 Detecting Ledger address...${NC}" 101 LEDGER_ADDRESS=$(cast wallet address --ledger) 102 echo -e "${GREEN}📍 Ledger address: $LEDGER_ADDRESS${NC}" 103 104 # Check balance 105 BALANCE=$(cast balance $LEDGER_ADDRESS --rpc-url $RPC_URL | sed 's/[^0-9.]//g') 106 echo -e "${GREEN}💰 Balance: $BALANCE ETH${NC}" 107 108 SENDER_ARGS="--ledger --sender $LEDGER_ADDRESS" 109 else 110 # Check for private key 111 if [ -z "$PRIVATE_KEY" ]; then 112 echo -e "${RED}Error: PRIVATE_KEY not found${NC}" 113 echo "Please set PRIVATE_KEY in .env file" 114 exit 1 115 fi 116 117 # Add 0x prefix if missing 118 if [[ ! "$PRIVATE_KEY" =~ ^0x ]]; then 119 PRIVATE_KEY="0x${PRIVATE_KEY}" 120 fi 121 122 SENDER_ARGS="" 123 fi 124 125 # Export for forge script 126 export USE_LEDGER=$USE_LEDGER 127 export PRIVATE_KEY=$PRIVATE_KEY 128 export PROXY_ADDRESS=$PROXY_ADDRESS 129 export NEW_IMPLEMENTATION=$NEW_IMPLEMENTATION 130 131 # Display configuration 132 echo -e "${BLUE}🚀 Proxy Upgrade Configuration${NC}" 133 echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" 134 echo -e "Network: ${GREEN}$NETWORK${NC}" 135 echo -e "Chain ID: ${GREEN}$CHAIN_ID${NC}" 136 echo -e "RPC URL: ${GREEN}$RPC_URL${NC}" 137 echo -e "Proxy: ${YELLOW}$PROXY_ADDRESS${NC}" 138 echo -e "New Impl: ${YELLOW}$NEW_IMPLEMENTATION${NC}" 139 echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" 140 echo "" 141 142 # Show warning for mainnet 143 if [ "$NETWORK" == "base-mainnet" ]; then 144 echo -e "${YELLOW}⚠️ WARNING: This is a mainnet upgrade!${NC}" 145 fi 146 147 # Execute upgrade 148 echo -e "${BLUE}🚀 Starting upgrade...${NC}" 149 150 # Build forge command 151 FORGE_CMD="forge script script/UpgradeProxy.s.sol --rpc-url $RPC_URL $SENDER_ARGS" 152 153 # Add private key for non-ledger deployments 154 if [ "$USE_LEDGER" = false ] && [ -n "$PRIVATE_KEY" ]; then 155 FORGE_CMD="$FORGE_CMD --private-key $PRIVATE_KEY" 156 fi 157 158 FORGE_CMD="$FORGE_CMD --broadcast -vvv" 159 160 # Execute 161 eval $FORGE_CMD 162 163 if [ $? -eq 0 ]; then 164 echo "" 165 echo -e "${GREEN}✅ Upgrade successful!${NC}" 166 echo "" 167 echo -e "${YELLOW}📌 Next Steps:${NC}" 168 echo "1. Verify the upgrade on the block explorer" 169 echo "2. Test the new functionality" 170 echo "3. Update any documentation" 171 else 172 echo -e "${RED}❌ Upgrade failed${NC}" 173 exit 1 174 fi