#!/bin/bash # Automated deployment script for MainnetTether and TransactionMirror # This script will automatically deploy once RPC is configured set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../" && pwd)" cd "$PROJECT_ROOT" # Source environment variables if [ -f .env ]; then source .env else echo "❌ Error: .env file not found" exit 1 fi # Check required variables if [ -z "$PRIVATE_KEY" ]; then echo "❌ Error: PRIVATE_KEY not set in .env" exit 1 fi if [ -z "$ETHEREUM_MAINNET_RPC" ]; then echo "❌ Error: ETHEREUM_MAINNET_RPC not set in .env" exit 1 fi # Get deployer address DEPLOYER=$(cast wallet address $PRIVATE_KEY 2>/dev/null || echo "") if [ -z "$DEPLOYER" ]; then echo "❌ Error: Could not derive deployer address from PRIVATE_KEY" exit 1 fi echo "=== MainnetTether & TransactionMirror Deployment ===" echo "" echo "Deployer: $DEPLOYER" echo "Admin: $DEPLOYER (EOA - no multisig)" echo "RPC: $ETHEREUM_MAINNET_RPC" echo "" # Test RPC connection echo "Testing RPC connection..." if ! cast block-number --rpc-url "$ETHEREUM_MAINNET_RPC" >/dev/null 2>&1; then echo "❌ RPC connection failed!" echo "" echo "Please fix the Infura RPC configuration:" echo " 1. Go to https://infura.io/" echo " 2. Project ID: (set in .env as INFURA_PROJECT_ID; use INFURA_PROJECT_SECRET for Basic Auth)" echo " 3. Settings → Disable 'Private Key Only'" echo " 4. Save and run this script again" echo "" echo "See: docs/deployment/INFURA_SETTINGS_FIX.md" exit 1 fi echo "✅ RPC connection successful!" echo "" # Check balance BALANCE=$(cast balance $DEPLOYER --rpc-url "$ETHEREUM_MAINNET_RPC" 2>/dev/null || echo "0") BALANCE_ETH=$(cast --to-unit $BALANCE ether 2>/dev/null || echo "0") echo "Deployer Balance: $BALANCE_ETH ETH" echo "" # Deploy MainnetTether echo "=== Deploying MainnetTether ===" LOG_FILE="/tmp/mainnet_tether_deploy.log" forge script script/DeployMainnetTether.s.sol \ --rpc-url "$ETHEREUM_MAINNET_RPC" \ --private-key $PRIVATE_KEY \ --broadcast \ --verify \ --via-ir \ -vvvv 2>&1 | tee "$LOG_FILE" # Extract MainnetTether address MAINNET_TETHER=$(grep -oP "MainnetTether deployed at: 0x[a-fA-F0-9]{40}" "$LOG_FILE" 2>/dev/null | grep -oP "0x[a-fA-F0-9]{40}" | head -1) TETHER_ADMIN=$(grep -oP "Admin: 0x[a-fA-F0-9]{40}" "$LOG_FILE" 2>/dev/null | grep -oP "0x[a-fA-F0-9]{40}" | head -1) if [ -n "$MAINNET_TETHER" ]; then echo "" echo "✅ MainnetTether deployed successfully!" echo " Address: $MAINNET_TETHER" echo " Admin: ${TETHER_ADMIN:-$DEPLOYER}" echo " Explorer: https://etherscan.io/address/$MAINNET_TETHER" # Update .env if grep -q "^MAINNET_TETHER_ADDRESS" .env; then sed -i "s|^MAINNET_TETHER_ADDRESS=.*|MAINNET_TETHER_ADDRESS=$MAINNET_TETHER|" .env else echo "MAINNET_TETHER_ADDRESS=$MAINNET_TETHER" >> .env fi else echo "" echo "⚠️ MainnetTether deployment may have failed" echo " Check log: $LOG_FILE" fi echo "" echo "=== Deploying TransactionMirror ===" LOG_FILE="/tmp/transaction_mirror_deploy.log" forge script script/DeployTransactionMirror.s.sol \ --rpc-url "$ETHEREUM_MAINNET_RPC" \ --private-key $PRIVATE_KEY \ --broadcast \ --verify \ --via-ir \ -vvvv 2>&1 | tee "$LOG_FILE" # Extract TransactionMirror address TRANSACTION_MIRROR=$(grep -oP "TransactionMirror deployed at: 0x[a-fA-F0-9]{40}" "$LOG_FILE" 2>/dev/null | grep -oP "0x[a-fA-F0-9]{40}" | head -1) MIRROR_ADMIN=$(grep -oP "Admin: 0x[a-fA-F0-9]{40}" "$LOG_FILE" 2>/dev/null | grep -oP "0x[a-fA-F0-9]{40}" | head -1) if [ -n "$TRANSACTION_MIRROR" ]; then echo "" echo "✅ TransactionMirror deployed successfully!" echo " Address: $TRANSACTION_MIRROR" echo " Admin: ${MIRROR_ADMIN:-$DEPLOYER}" echo " Explorer: https://etherscan.io/address/$TRANSACTION_MIRROR" # Update .env if grep -q "^TRANSACTION_MIRROR_ADDRESS" .env; then sed -i "s|^TRANSACTION_MIRROR_ADDRESS=.*|TRANSACTION_MIRROR_ADDRESS=$TRANSACTION_MIRROR|" .env else echo "TRANSACTION_MIRROR_ADDRESS=$TRANSACTION_MIRROR" >> .env fi else echo "" echo "⚠️ TransactionMirror deployment may have failed" echo " Check log: $LOG_FILE" fi echo "" echo "=== Deployment Summary ===" echo "" if [ -n "$MAINNET_TETHER" ] && [ -n "$TRANSACTION_MIRROR" ]; then echo "🎉 Both contracts deployed successfully!" echo "" echo "MainnetTether:" echo " Address: $MAINNET_TETHER" echo " Explorer: https://etherscan.io/address/$MAINNET_TETHER" echo "" echo "TransactionMirror:" echo " Address: $TRANSACTION_MIRROR" echo " Explorer: https://etherscan.io/address/$TRANSACTION_MIRROR" echo "" echo "Next Steps:" echo " 1. Verify contracts on Etherscan" echo " 2. Set up off-chain services for state anchoring and mirroring" echo " 3. Configure monitoring and alerting" else echo "⚠️ Deployment incomplete - check logs for details" fi