183 lines
5.2 KiB
Bash
Executable File
183 lines
5.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Unified Contract Deployment Script
|
|
# Supports both parallel and ordered deployment modes
|
|
|
|
set -e
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
source "$SCRIPT_DIR/../lib/init.sh"
|
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
cd "$PROJECT_ROOT"
|
|
|
|
# Default values
|
|
MODE="${MODE:-ordered}" # ordered or parallel
|
|
RPC_URL="${RPC_URL:-http://localhost:8545}"
|
|
PRIVATE_KEY="${PRIVATE_KEY:-}"
|
|
DRY_RUN="${DRY_RUN:-false}"
|
|
|
|
usage() {
|
|
cat <<EOF
|
|
Usage: $0 [OPTIONS]
|
|
|
|
Deploy all contracts using unified deployment script.
|
|
|
|
Options:
|
|
--mode MODE Deployment mode: ordered or parallel (default: ordered)
|
|
--rpc-url URL RPC endpoint URL (default: http://localhost:8545)
|
|
--private-key KEY Deployer private key
|
|
--dry-run Show what would be deployed without executing
|
|
--help Show this help message
|
|
|
|
Examples:
|
|
# Deploy in ordered mode (respects dependencies)
|
|
$0 --mode ordered
|
|
|
|
# Deploy in parallel mode (where dependencies allow)
|
|
$0 --mode parallel
|
|
|
|
# Dry run to see deployment plan
|
|
$0 --dry-run
|
|
EOF
|
|
exit 0
|
|
}
|
|
|
|
# Parse arguments
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--mode)
|
|
MODE="$2"
|
|
shift 2
|
|
;;
|
|
--rpc-url)
|
|
RPC_URL="$2"
|
|
shift 2
|
|
;;
|
|
--private-key)
|
|
PRIVATE_KEY="$2"
|
|
shift 2
|
|
;;
|
|
--dry-run)
|
|
DRY_RUN=true
|
|
shift
|
|
;;
|
|
--help)
|
|
usage
|
|
;;
|
|
*)
|
|
echo "Unknown option: $1"
|
|
usage
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [ -z "$PRIVATE_KEY" ]; then
|
|
if [ -f .env ]; then
|
|
source .env
|
|
fi
|
|
if [ -z "$PRIVATE_KEY" ]; then
|
|
log_error "Error: PRIVATE_KEY not set. Use --private-key or set in .env"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
if [ -z "$RPC_URL" ]; then
|
|
log_error "Error: RPC_URL not set. Use --rpc-url or set in .env"
|
|
exit 1
|
|
fi
|
|
|
|
# Verify RPC endpoint
|
|
log_info "Verifying RPC endpoint..."
|
|
if ! curl -s -m 10 -X POST "$RPC_URL" -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' > /dev/null 2>&1; then
|
|
log_error "Error: RPC endpoint is not accessible at $RPC_URL"
|
|
exit 1
|
|
fi
|
|
|
|
log_success "✅ RPC endpoint is accessible"
|
|
|
|
# Export variables
|
|
export PRIVATE_KEY
|
|
export RPC_URL
|
|
export CCIP_ROUTER="${CCIP_ROUTER:-}"
|
|
export CCIP_FEE_TOKEN="${CCIP_FEE_TOKEN:-0x0000000000000000000000000000000000000000}"
|
|
export ORACLE_DESCRIPTION="${ORACLE_DESCRIPTION:-ETH/USD Price Feed}"
|
|
export ORACLE_HEARTBEAT="${ORACLE_HEARTBEAT:-60}"
|
|
export ORACLE_DEVIATION_THRESHOLD="${ORACLE_DEVIATION_THRESHOLD:-50}"
|
|
|
|
# Function to update .env file
|
|
update_env() {
|
|
local key=$1
|
|
local value=$2
|
|
if [ "$DRY_RUN" = "true" ]; then
|
|
echo " [DRY RUN] Would set ${key}=${value}"
|
|
return
|
|
fi
|
|
if grep -q "^${key}=" .env 2>/dev/null; then
|
|
sed -i "s|^${key}=.*|${key}=${value}|" .env
|
|
else
|
|
echo "${key}=${value}" >> .env
|
|
fi
|
|
}
|
|
|
|
# Function to deploy a contract
|
|
deploy_contract() {
|
|
local name=$1
|
|
local script=$2
|
|
local sig="${3:-run()}"
|
|
|
|
log_section "Deploying $name"
|
|
if [ "$DRY_RUN" = "true" ]; then
|
|
echo " [DRY RUN] Would deploy: $script"
|
|
return
|
|
fi
|
|
|
|
forge script "$script" \
|
|
--rpc-url "$RPC_URL" \
|
|
--broadcast \
|
|
--private-key "$PRIVATE_KEY" \
|
|
--sig "$sig" \
|
|
-vvv 2>&1 | tee "/tmp/deploy-${name}.log"
|
|
|
|
# Extract address from log (simplified - may need adjustment)
|
|
local address=$(grep -oP "Deployed to: \K0x[a-fA-F0-9]{40}" "/tmp/deploy-${name}.log" | tail -1 || echo "")
|
|
if [ -n "$address" ]; then
|
|
update_env "${name^^}_ADDRESS" "$address"
|
|
log_success "✅ $name deployed at: $address"
|
|
fi
|
|
}
|
|
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo "🚀 Unified Contract Deployment"
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo "Mode: $MODE"
|
|
echo "RPC URL: $RPC_URL"
|
|
echo "Dry Run: $DRY_RUN"
|
|
echo ""
|
|
|
|
if [ "$MODE" = "parallel" ]; then
|
|
log_info "Deploying contracts in parallel mode..."
|
|
# Deploy independent contracts in parallel
|
|
deploy_contract "Multicall" "script/DeployMulticall.s.sol" &
|
|
deploy_contract "CREATE2Factory" "script/DeployCREATE2Factory.s.sol" &
|
|
deploy_contract "Oracle" "script/DeployOracle.s.sol" &
|
|
wait
|
|
log_success "✅ Parallel deployment complete"
|
|
else
|
|
log_info "Deploying contracts in ordered mode (respecting dependencies)..."
|
|
# Phase 1: Core utilities (no dependencies)
|
|
deploy_contract "Multicall" "script/DeployMulticall.s.sol"
|
|
deploy_contract "CREATE2Factory" "script/DeployCREATE2Factory.s.sol"
|
|
|
|
# Phase 2: Oracle (no dependencies)
|
|
deploy_contract "Oracle" "script/DeployOracle.s.sol"
|
|
|
|
# Phase 3: Governance (may depend on oracle)
|
|
if [ -f "script/DeployMultiSig.s.sol" ]; then
|
|
deploy_contract "MultiSig" "script/DeployMultiSig.s.sol"
|
|
fi
|
|
|
|
log_success "✅ Ordered deployment complete"
|
|
fi
|
|
|
|
echo ""
|
|
log_success "🎉 All contracts deployed successfully!"
|