- 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.
181 lines
6.4 KiB
Bash
Executable File
181 lines
6.4 KiB
Bash
Executable File
#!/bin/bash
|
|
# Fetch Runtime Bytecode from Mainnet
|
|
# Fetches runtime bytecode for contracts from Ethereum mainnet to use in genesis predeploy
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PHASE1_DIR="$SCRIPT_DIR/../"
|
|
PROJECT_ROOT="$(cd "$PHASE1_DIR/../../.." && pwd)"
|
|
GENESIS_FILE="$PHASE1_DIR/config/genesis-138.json"
|
|
|
|
# Load .env (try multiple locations)
|
|
ENV_FILE=""
|
|
for path in "$PROJECT_ROOT/.env" "$PHASE1_DIR/../../.env" "$HOME/.env"; do
|
|
if [ -f "$path" ]; then
|
|
ENV_FILE="$path"
|
|
break
|
|
fi
|
|
done
|
|
|
|
if [ -n "$ENV_FILE" ]; then
|
|
export $(grep -v '^#' "$ENV_FILE" | grep -E "^(ETHEREUM_MAINNET_RPC)" | xargs)
|
|
fi
|
|
|
|
# Try multiple RPC endpoints
|
|
RPC_ENDPOINTS=(
|
|
"${ETHEREUM_MAINNET_RPC:-}"
|
|
"https://eth.llamarpc.com"
|
|
"https://rpc.ankr.com/eth"
|
|
"https://ethereum.publicnode.com"
|
|
"https://eth-mainnet.public.blastapi.io"
|
|
)
|
|
|
|
MAINNET_RPC=""
|
|
for RPC in "${RPC_ENDPOINTS[@]}"; do
|
|
if [ -n "$RPC" ]; then
|
|
if cast code "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" --rpc-url "$RPC" &>/dev/null; then
|
|
MAINNET_RPC="$RPC"
|
|
echo "Using RPC: $RPC"
|
|
break
|
|
fi
|
|
fi
|
|
done
|
|
|
|
if [ -z "$MAINNET_RPC" ]; then
|
|
echo "Error: Could not find working mainnet RPC endpoint"
|
|
exit 1
|
|
fi
|
|
|
|
echo "=========================================="
|
|
echo "Fetch Runtime Bytecode from Mainnet"
|
|
echo "=========================================="
|
|
echo "RPC: $MAINNET_RPC"
|
|
echo ""
|
|
|
|
# Contract addresses
|
|
WETH9_ADDRESS="0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"
|
|
WETH10_ADDRESS="0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9f"
|
|
CCIP_ROUTER="0x80226fc0Ee2b096224EeAc085Bb9a8cba1146f7D"
|
|
CCIPWETH9_BRIDGE="0x3304b747E565a97ec8AC220b0B6A1f6ffDB837e6"
|
|
CCIPWETH10_BRIDGE="0x8078A09637e47Fa5Ed34F626046Ea2094a5CDE5e"
|
|
LINK_TOKEN="0x514910771AF9Ca656af840dff83E8264EcF986CA"
|
|
|
|
# Fetch bytecode
|
|
echo "Fetching bytecode from mainnet..."
|
|
WETH9_CODE=$(cast code "$WETH9_ADDRESS" --rpc-url "$MAINNET_RPC" 2>/dev/null | grep -v "Error\|Warning" || echo "")
|
|
WETH10_CODE=$(cast code "$WETH10_ADDRESS" --rpc-url "$MAINNET_RPC" 2>/dev/null | grep -v "Error\|Warning" || echo "")
|
|
CCIP_ROUTER_CODE=$(cast code "$CCIP_ROUTER" --rpc-url "$MAINNET_RPC" 2>/dev/null | grep -v "Error\|Warning" || echo "")
|
|
CCIPWETH9_BRIDGE_CODE=$(cast code "$CCIPWETH9_BRIDGE" --rpc-url "$MAINNET_RPC" 2>/dev/null | grep -v "Error\|Warning" || echo "")
|
|
CCIPWETH10_BRIDGE_CODE=$(cast code "$CCIPWETH10_BRIDGE" --rpc-url "$MAINNET_RPC" 2>/dev/null | grep -v "Error\|Warning" || echo "")
|
|
LINK_TOKEN_CODE=$(cast code "$LINK_TOKEN" --rpc-url "$MAINNET_RPC" 2>/dev/null | grep -v "Error\|Warning" || echo "")
|
|
|
|
# Check results
|
|
SUCCESS_COUNT=0
|
|
TOTAL=6
|
|
|
|
if [ -n "$WETH9_CODE" ] && [ "$WETH9_CODE" != "0x" ]; then
|
|
echo "✓ WETH9 bytecode retrieved (${#WETH9_CODE} characters)"
|
|
((SUCCESS_COUNT++))
|
|
else
|
|
echo "✗ WETH9 bytecode not available"
|
|
fi
|
|
|
|
if [ -n "$WETH10_CODE" ] && [ "$WETH10_CODE" != "0x" ]; then
|
|
echo "✓ WETH10 bytecode retrieved (${#WETH10_CODE} characters)"
|
|
((SUCCESS_COUNT++))
|
|
else
|
|
echo "✗ WETH10 bytecode not available"
|
|
fi
|
|
|
|
if [ -n "$CCIP_ROUTER_CODE" ] && [ "$CCIP_ROUTER_CODE" != "0x" ]; then
|
|
echo "✓ CCIP Router bytecode retrieved (${#CCIP_ROUTER_CODE} characters)"
|
|
((SUCCESS_COUNT++))
|
|
else
|
|
echo "✗ CCIP Router bytecode not available"
|
|
fi
|
|
|
|
if [ -n "$CCIPWETH9_BRIDGE_CODE" ] && [ "$CCIPWETH9_BRIDGE_CODE" != "0x" ]; then
|
|
echo "✓ CCIP WETH9 Bridge bytecode retrieved (${#CCIPWETH9_BRIDGE_CODE} characters)"
|
|
((SUCCESS_COUNT++))
|
|
else
|
|
echo "✗ CCIP WETH9 Bridge bytecode not available"
|
|
fi
|
|
|
|
if [ -n "$CCIPWETH10_BRIDGE_CODE" ] && [ "$CCIPWETH10_BRIDGE_CODE" != "0x" ]; then
|
|
echo "✓ CCIP WETH10 Bridge bytecode retrieved (${#CCIPWETH10_BRIDGE_CODE} characters)"
|
|
((SUCCESS_COUNT++))
|
|
else
|
|
echo "✗ CCIP WETH10 Bridge bytecode not available"
|
|
fi
|
|
|
|
if [ -n "$LINK_TOKEN_CODE" ] && [ "$LINK_TOKEN_CODE" != "0x" ]; then
|
|
echo "✓ LINK Token bytecode retrieved (${#LINK_TOKEN_CODE} characters)"
|
|
((SUCCESS_COUNT++))
|
|
else
|
|
echo "✗ LINK Token bytecode not available"
|
|
fi
|
|
|
|
echo ""
|
|
echo "Retrieved: $SUCCESS_COUNT/$TOTAL contracts"
|
|
|
|
if [ $SUCCESS_COUNT -eq 0 ]; then
|
|
echo "Error: Could not retrieve any bytecode"
|
|
exit 1
|
|
fi
|
|
|
|
# Update genesis file
|
|
echo ""
|
|
echo "Updating genesis file with retrieved bytecode..."
|
|
|
|
# Create backup
|
|
cp "$GENESIS_FILE" "$GENESIS_FILE.backup"
|
|
|
|
# Update using jq
|
|
if [ -n "$WETH9_CODE" ] && [ "$WETH9_CODE" != "0x" ]; then
|
|
jq --arg addr "$WETH9_ADDRESS" --arg code "$WETH9_CODE" \
|
|
'.alloc[$addr].code = $code' "$GENESIS_FILE" > "$GENESIS_FILE.tmp" && mv "$GENESIS_FILE.tmp" "$GENESIS_FILE"
|
|
echo "✓ Updated WETH9"
|
|
fi
|
|
|
|
if [ -n "$WETH10_CODE" ] && [ "$WETH10_CODE" != "0x" ]; then
|
|
jq --arg addr "$WETH10_ADDRESS" --arg code "$WETH10_CODE" \
|
|
'.alloc[$addr].code = $code' "$GENESIS_FILE" > "$GENESIS_FILE.tmp" && mv "$GENESIS_FILE.tmp" "$GENESIS_FILE"
|
|
echo "✓ Updated WETH10"
|
|
fi
|
|
|
|
if [ -n "$CCIP_ROUTER_CODE" ] && [ "$CCIP_ROUTER_CODE" != "0x" ]; then
|
|
jq --arg addr "$CCIP_ROUTER" --arg code "$CCIP_ROUTER_CODE" \
|
|
'.alloc[$addr].code = $code' "$GENESIS_FILE" > "$GENESIS_FILE.tmp" && mv "$GENESIS_FILE.tmp" "$GENESIS_FILE"
|
|
echo "✓ Updated CCIP Router"
|
|
fi
|
|
|
|
if [ -n "$CCIPWETH9_BRIDGE_CODE" ] && [ "$CCIPWETH9_BRIDGE_CODE" != "0x" ]; then
|
|
jq --arg addr "$CCIPWETH9_BRIDGE" --arg code "$CCIPWETH9_BRIDGE_CODE" \
|
|
'.alloc[$addr].code = $code' "$GENESIS_FILE" > "$GENESIS_FILE.tmp" && mv "$GENESIS_FILE.tmp" "$GENESIS_FILE"
|
|
echo "✓ Updated CCIP WETH9 Bridge"
|
|
fi
|
|
|
|
if [ -n "$CCIPWETH10_BRIDGE_CODE" ] && [ "$CCIPWETH10_BRIDGE_CODE" != "0x" ]; then
|
|
jq --arg addr "$CCIPWETH10_BRIDGE" --arg code "$CCIPWETH10_BRIDGE_CODE" \
|
|
'.alloc[$addr].code = $code' "$GENESIS_FILE" > "$GENESIS_FILE.tmp" && mv "$GENESIS_FILE.tmp" "$GENESIS_FILE"
|
|
echo "✓ Updated CCIP WETH10 Bridge"
|
|
fi
|
|
|
|
if [ -n "$LINK_TOKEN_CODE" ] && [ "$LINK_TOKEN_CODE" != "0x" ]; then
|
|
jq --arg addr "$LINK_TOKEN" --arg code "$LINK_TOKEN_CODE" \
|
|
'.alloc[$addr].code = $code' "$GENESIS_FILE" > "$GENESIS_FILE.tmp" && mv "$GENESIS_FILE.tmp" "$GENESIS_FILE"
|
|
echo "✓ Updated LINK Token"
|
|
fi
|
|
|
|
echo ""
|
|
echo "=========================================="
|
|
echo "Genesis File Updated"
|
|
echo "=========================================="
|
|
echo "Backup saved to: $GENESIS_FILE.backup"
|
|
echo "Updated file: $GENESIS_FILE"
|
|
echo ""
|
|
echo "Note: Storage layouts may need to be filled in manually"
|
|
echo " See config/GENESIS_PREDEPLOY_INSTRUCTIONS.md"
|
|
|