- 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.
84 lines
3.0 KiB
Bash
Executable File
84 lines
3.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Find all contracts deployed to Ethereum Mainnet
|
|
# Searches broadcast files, .env, and Etherscan API
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
cd "$PROJECT_ROOT"
|
|
|
|
source .env 2>/dev/null || true
|
|
|
|
echo "=========================================="
|
|
echo "Finding All Deployed Mainnet Contracts"
|
|
echo "=========================================="
|
|
echo ""
|
|
|
|
# Get deployer address
|
|
if [ -n "${PRIVATE_KEY:-}" ]; then
|
|
PRIVATE_KEY_FIXED="${PRIVATE_KEY}"
|
|
[[ "$PRIVATE_KEY_FIXED" != 0x* ]] && PRIVATE_KEY_FIXED="0x${PRIVATE_KEY_FIXED}"
|
|
DEPLOYER=$(cast wallet address "$PRIVATE_KEY_FIXED" 2>/dev/null | head -1)
|
|
echo "Deployer: $DEPLOYER"
|
|
echo ""
|
|
else
|
|
echo "⚠️ PRIVATE_KEY not set"
|
|
DEPLOYER=""
|
|
fi
|
|
|
|
echo "=== Method 1: Broadcast Files ==="
|
|
if [ -d "broadcast" ]; then
|
|
MAINNET_FILES=$(find broadcast -path "*/1/*.json" -o -path "*mainnet/*.json" 2>/dev/null | head -10)
|
|
if [ -n "$MAINNET_FILES" ]; then
|
|
for file in $MAINNET_FILES; do
|
|
echo "Checking $file..."
|
|
jq -r '.transactions[]? | select(.transactionType == "CREATE") | " \(.contractName): \(.contractAddress)"' "$file" 2>/dev/null
|
|
done
|
|
else
|
|
echo " No Mainnet broadcast files found"
|
|
fi
|
|
else
|
|
echo " No broadcast directory"
|
|
fi
|
|
echo ""
|
|
|
|
echo "=== Method 2: .env File ==="
|
|
grep -E "^[A-Z_]+.*=0x[a-fA-F0-9]{40}" .env 2>/dev/null | grep -iE "mainnet|MAINNET" | while IFS= read -r line; do
|
|
key=$(echo "$line" | cut -d'=' -f1)
|
|
addr=$(echo "$line" | cut -d'=' -f2)
|
|
echo " $key: $addr"
|
|
done
|
|
echo ""
|
|
|
|
echo "=== Method 3: Etherscan API ==="
|
|
if [ -n "$DEPLOYER" ] && [ -n "${ETHERSCAN_API_KEY:-}" ]; then
|
|
echo "Fetching contracts created by $DEPLOYER..."
|
|
RESPONSE=$(curl -s "https://api.etherscan.io/api?module=account&action=txlist&address=$DEPLOYER&startblock=0&endblock=99999999&sort=asc&apikey=$ETHERSCAN_API_KEY")
|
|
|
|
CONTRACTS=$(echo "$RESPONSE" | jq -r '.result[] | select(.to == "" or .to == null) | "\(.contractAddress) | Block: \(.blockNumber) | \(.timeStamp | tonumber | strftime("%Y-%m-%d"))"' 2>/dev/null)
|
|
|
|
if [ -n "$CONTRACTS" ]; then
|
|
echo "$CONTRACTS" | while IFS= read -r contract; do
|
|
addr=$(echo "$contract" | cut -d'|' -f1 | xargs)
|
|
echo " $contract"
|
|
# Try to get contract name
|
|
CONTRACT_INFO=$(curl -s "https://api.etherscan.io/api?module=contract&action=getsourcecode&address=$addr&apikey=$ETHERSCAN_API_KEY")
|
|
NAME=$(echo "$CONTRACT_INFO" | jq -r '.result[0].ContractName' 2>/dev/null)
|
|
if [ -n "$NAME" ] && [ "$NAME" != "" ] && [ "$NAME" != "null" ]; then
|
|
echo " Contract Name: $NAME"
|
|
fi
|
|
done
|
|
else
|
|
echo " No contracts found"
|
|
fi
|
|
else
|
|
echo " Cannot check (missing PRIVATE_KEY or ETHERSCAN_API_KEY)"
|
|
fi
|
|
echo ""
|
|
|
|
echo "=========================================="
|
|
echo "Search Complete"
|
|
echo "=========================================="
|
|
|