/ contracts / upgrade-proxy.sh
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