- Introduced Aggregator.sol for Chainlink-compatible oracle functionality, including round-based updates and access control. - Added OracleWithCCIP.sol to extend Aggregator with CCIP cross-chain messaging capabilities. - Created .gitmodules to include OpenZeppelin contracts as a submodule. - Developed a comprehensive deployment guide in NEXT_STEPS_COMPLETE_GUIDE.md for Phase 2 and smart contract deployment. - Implemented Vite configuration for the orchestration portal, supporting both Vue and React frameworks. - Added server-side logic for the Multi-Cloud Orchestration Portal, including API endpoints for environment management and monitoring. - Created scripts for resource import and usage validation across non-US regions. - Added tests for CCIP error handling and integration to ensure robust functionality. - Included various new files and directories for the orchestration portal and deployment scripts.
137 lines
7.1 KiB
Bash
Executable File
137 lines
7.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Deploy all contracts once network is producing blocks
|
|
# Usage: ./deploy-contracts-once-ready.sh
|
|
|
|
set -e
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
cd "$PROJECT_ROOT"
|
|
|
|
source .env 2>/dev/null || true
|
|
|
|
RPC_URL="${RPC_URL:-http://localhost:8545}"
|
|
PRIVATE_KEY="${PRIVATE_KEY:-}"
|
|
NGINX_IP="${NGINX_PROXY_IP:-20.160.58.99}"
|
|
|
|
if [ -z "$PRIVATE_KEY" ]; then
|
|
echo "❌ Error: PRIVATE_KEY environment variable not set"
|
|
exit 1
|
|
fi
|
|
|
|
# Ensure PRIVATE_KEY has 0x prefix
|
|
if [[ ! "$PRIVATE_KEY" =~ ^0x ]]; then
|
|
export PRIVATE_KEY="0x$PRIVATE_KEY"
|
|
fi
|
|
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo "Deploy All Contracts - Network Ready"
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo ""
|
|
echo "RPC URL: $RPC_URL"
|
|
echo "Deployer: $(cast wallet address --private-key "$PRIVATE_KEY" 2>/dev/null || echo 'unknown')"
|
|
echo ""
|
|
|
|
# Step 1: Verify network is ready
|
|
echo "📋 Step 1: Verifying network is producing blocks..."
|
|
BLOCK=$(cast block-number --rpc-url "$RPC_URL" 2>/dev/null | xargs printf "%d" 2>/dev/null || echo "0")
|
|
CHAIN=$(cast chain-id --rpc-url "$RPC_URL" 2>/dev/null | xargs printf "%d" 2>/dev/null || echo "0")
|
|
|
|
if [ "$BLOCK" -eq 0 ]; then
|
|
echo "⚠️ Network is still at block 0"
|
|
echo " Setting up SSH tunnel..."
|
|
pkill -f "ssh.*8545:10" 2>/dev/null || true
|
|
ssh -o StrictHostKeyChecking=no -f -N -L 8545:10.3.1.4:8545 besuadmin@"$NGINX_IP"
|
|
sleep 3
|
|
BLOCK=$(cast block-number --rpc-url "$RPC_URL" 2>/dev/null | xargs printf "%d" 2>/dev/null || echo "0")
|
|
fi
|
|
|
|
if [ "$BLOCK" -eq 0 ]; then
|
|
echo "❌ Network is not producing blocks yet"
|
|
echo " Please wait for IBFT validators to initialize"
|
|
echo " Run this script again once blocks are being produced"
|
|
exit 1
|
|
fi
|
|
|
|
echo "✅ Network is ready!"
|
|
echo " Current block: $BLOCK"
|
|
echo " Chain ID: $CHAIN"
|
|
echo ""
|
|
|
|
# Step 2: Deploy CCIP Infrastructure
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo "Step 2: Deploy CCIP Infrastructure"
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo ""
|
|
|
|
echo "📋 2.1: Deploy CCIP Router..."
|
|
forge script script/DeployCCIPRouter.s.sol:DeployCCIPRouter --rpc-url "$RPC_URL" --broadcast --private-key "$PRIVATE_KEY" --legacy -vvv 2>&1 | tee /tmp/ccip-router.log | grep -E "CCIP Router deployed|deployed at:|Error" | head -3
|
|
CCIP_ROUTER=$(grep -oE "0x[a-fA-F0-9]{40}" /tmp/ccip-router.log 2>/dev/null | head -1)
|
|
if [ -n "$CCIP_ROUTER" ]; then
|
|
echo " ✅ CCIP Router: $CCIP_ROUTER"
|
|
sed -i "s|^CCIP_ROUTER_ADDRESS=.*|CCIP_ROUTER_ADDRESS=$CCIP_ROUTER|" .env 2>/dev/null || echo "CCIP_ROUTER_ADDRESS=$CCIP_ROUTER" >> .env
|
|
export CCIP_ROUTER_ADDRESS="$CCIP_ROUTER"
|
|
fi
|
|
|
|
echo ""
|
|
echo "📋 2.2: Deploy CCIP Sender..."
|
|
forge script script/DeployCCIPSender.s.sol:DeployCCIPSender --rpc-url "$RPC_URL" --broadcast --private-key "$PRIVATE_KEY" --legacy -vvv 2>&1 | tee /tmp/ccip-sender.log | grep -E "CCIPSender deployed|deployed at:|Error" | head -3
|
|
CCIP_SENDER=$(grep -oE "0x[a-fA-F0-9]{40}" /tmp/ccip-sender.log 2>/dev/null | head -1)
|
|
if [ -n "$CCIP_SENDER" ]; then
|
|
echo " ✅ CCIP Sender: $CCIP_SENDER"
|
|
sed -i "s|^CCIP_SENDER_ADDRESS=.*|CCIP_SENDER_ADDRESS=$CCIP_SENDER|" .env 2>/dev/null || echo "CCIP_SENDER_ADDRESS=$CCIP_SENDER" >> .env
|
|
fi
|
|
|
|
echo ""
|
|
echo "📋 2.3: Deploy CCIP Receiver..."
|
|
forge script script/DeployCCIPReceiver.s.sol:DeployCCIPReceiver --rpc-url "$RPC_URL" --broadcast --private-key "$PRIVATE_KEY" --legacy -vvv 2>&1 | tee /tmp/ccip-receiver.log | grep -E "CCIPReceiver deployed|deployed at:|Error" | head -3
|
|
CCIP_RECEIVER=$(grep -oE "0x[a-fA-F0-9]{40}" /tmp/ccip-receiver.log 2>/dev/null | head -1)
|
|
if [ -n "$CCIP_RECEIVER" ]; then
|
|
echo " ✅ CCIP Receiver: $CCIP_RECEIVER"
|
|
sed -i "s|^CCIP_RECEIVER_ADDRESS=.*|CCIP_RECEIVER_ADDRESS=$CCIP_RECEIVER|" .env 2>/dev/null || echo "CCIP_RECEIVER_ADDRESS=$CCIP_RECEIVER" >> .env
|
|
fi
|
|
|
|
echo ""
|
|
echo "📋 2.4: Deploy CCIP WETH9 Bridge..."
|
|
forge script script/DeployCCIPWETH9Bridge.s.sol:DeployCCIPWETH9Bridge --rpc-url "$RPC_URL" --broadcast --private-key "$PRIVATE_KEY" --legacy -vvv 2>&1 | tee /tmp/ccip-weth9-bridge.log | grep -E "CCIPWETH9Bridge deployed|deployed at:|Error" | head -3
|
|
WETH9_BRIDGE=$(grep -oE "0x[a-fA-F0-9]{40}" /tmp/ccip-weth9-bridge.log 2>/dev/null | head -1)
|
|
if [ -n "$WETH9_BRIDGE" ]; then
|
|
echo " ✅ CCIP WETH9 Bridge: $WETH9_BRIDGE"
|
|
sed -i "s|^CCIP_WETH9_BRIDGE_ADDRESS=.*|CCIP_WETH9_BRIDGE_ADDRESS=$WETH9_BRIDGE|" .env 2>/dev/null || echo "CCIP_WETH9_BRIDGE_ADDRESS=$WETH9_BRIDGE" >> .env
|
|
fi
|
|
|
|
echo ""
|
|
echo "📋 2.5: Deploy CCIP WETH10 Bridge..."
|
|
forge script script/DeployCCIPWETH10Bridge.s.sol:DeployCCIPWETH10Bridge --rpc-url "$RPC_URL" --broadcast --private-key "$PRIVATE_KEY" --legacy -vvv 2>&1 | tee /tmp/ccip-weth10-bridge.log | grep -E "CCIPWETH10Bridge deployed|deployed at:|Error" | head -3
|
|
WETH10_BRIDGE=$(grep -oE "0x[a-fA-F0-9]{40}" /tmp/ccip-weth10-bridge.log 2>/dev/null | head -1)
|
|
if [ -n "$WETH10_BRIDGE" ]; then
|
|
echo " ✅ CCIP WETH10 Bridge: $WETH10_BRIDGE"
|
|
sed -i "s|^CCIP_WETH10_BRIDGE_ADDRESS=.*|CCIP_WETH10_BRIDGE_ADDRESS=$WETH10_BRIDGE|" .env 2>/dev/null || echo "CCIP_WETH10_BRIDGE_ADDRESS=$WETH10_BRIDGE" >> .env
|
|
fi
|
|
|
|
# Step 3: Deploy Core Contracts
|
|
echo ""
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo "Step 3: Deploy Core Contracts"
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo ""
|
|
|
|
echo "📋 3.1: Deploy Multicall..."
|
|
forge script script/DeployMulticall.s.sol:DeployMulticall --rpc-url "$RPC_URL" --broadcast --private-key "$PRIVATE_KEY" --legacy -vvv 2>&1 | tee /tmp/multicall.log | grep -E "Multicall deployed|deployed at:|Error" | head -3
|
|
|
|
echo ""
|
|
echo "📋 3.2: Deploy Oracle..."
|
|
forge script script/DeployOracle.s.sol:DeployOracle --rpc-url "$RPC_URL" --broadcast --private-key "$PRIVATE_KEY" --legacy -vvv 2>&1 | tee /tmp/oracle.log | grep -E "Aggregator|Proxy|deployed at:|Error" | head -5
|
|
|
|
echo ""
|
|
echo "📋 3.3: Deploy MultiSig..."
|
|
forge script script/DeployMultiSig.s.sol:DeployMultiSig --rpc-url "$RPC_URL" --broadcast --private-key "$PRIVATE_KEY" --legacy -vvv 2>&1 | tee /tmp/multisig.log | grep -E "MultiSig|deployed at:|Error" | head -3
|
|
|
|
echo ""
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo "✅ Deployment Complete!"
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo ""
|
|
echo "📋 Deployment addresses saved to .env"
|
|
echo ""
|