Files
explorer-monorepo/scripts/test-link-deployment.sh
defiQUG 7a7ce770c2 feat(scripts): resolve CCIP/LINK addresses via config inventory
- Add scripts/lib/address-inventory.sh (jq + JSON inventory fallback)
- Wire deployment helper scripts to load_explorer_runtime_env + resolve_address_value
- Persist new LINK to address-inventory.json via persist_inventory_value
- Document config/*.json in config/README.md

Made-with: Cursor
2026-03-27 22:09:32 -07:00

325 lines
13 KiB
Bash
Executable File

#!/usr/bin/env bash
# Comprehensive Test of LINK Token Contract and Deployment Script
# Tests all components before actual deployment
set -uo pipefail # Remove -e to allow error handling
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
source "$PROJECT_ROOT/scripts/lib/address-inventory.sh"
load_explorer_runtime_env
RPC_URL="${RPC_URL_138:-http://192.168.11.250:8545}"
CHAIN_ID=138
LINK_TOKEN="${LINK_TOKEN:-$(resolve_address_value LINK_TOKEN LINK_TOKEN "")}"
echo "╔══════════════════════════════════════════════════════════════╗"
echo "║ LINK TOKEN DEPLOYMENT TEST SUITE ║"
echo "╚══════════════════════════════════════════════════════════════╝"
echo ""
echo "ChainID: $CHAIN_ID"
echo "RPC: $RPC_URL"
echo ""
# Color codes
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
PASSED=0
FAILED=0
WARNINGS=0
test_pass() {
echo -e "${GREEN}✅ PASS:${NC} $1"
((PASSED++))
}
test_fail() {
echo -e "${RED}❌ FAIL:${NC} $1"
((FAILED++))
}
test_warn() {
echo -e "${YELLOW}⚠️ WARN:${NC} $1"
((WARNINGS++))
}
echo "═══════════════════════════════════════════════════════════════"
echo "TEST 1: Environment Variables"
echo "═══════════════════════════════════════════════════════════════"
echo ""
if [ -z "${PRIVATE_KEY:-}" ]; then
test_fail "PRIVATE_KEY not available in effective environment"
else
test_pass "PRIVATE_KEY is set"
DEPLOYER=$(cast wallet address "$PRIVATE_KEY" 2>/dev/null || echo "")
if [ -n "$DEPLOYER" ]; then
test_pass "PRIVATE_KEY is valid (deployer: $DEPLOYER)"
else
test_fail "PRIVATE_KEY is invalid"
fi
fi
if [ -z "${RPC_URL_138:-}" ]; then
test_warn "RPC_URL_138 not set, using default: $RPC_URL"
else
test_pass "RPC_URL_138 is set: $RPC_URL"
fi
echo ""
echo "═══════════════════════════════════════════════════════════════"
echo "TEST 2: Network Connectivity"
echo "═══════════════════════════════════════════════════════════════"
echo ""
# Test RPC connectivity
if cast block-number --rpc-url "$RPC_URL" > /dev/null 2>&1; then
BLOCK_NUM=$(cast block-number --rpc-url "$RPC_URL" 2>/dev/null || echo "0")
test_pass "RPC is accessible (block: $BLOCK_NUM)"
else
test_fail "RPC is not accessible"
fi
# Test chain ID
ACTUAL_CHAIN_ID=$(cast chain-id --rpc-url "$RPC_URL" 2>/dev/null || echo "0")
if [ "$ACTUAL_CHAIN_ID" = "$CHAIN_ID" ]; then
test_pass "Chain ID matches ($CHAIN_ID)"
else
test_fail "Chain ID mismatch (expected: $CHAIN_ID, got: $ACTUAL_CHAIN_ID)"
fi
echo ""
echo "═══════════════════════════════════════════════════════════════"
echo "TEST 3: Deployer Account"
echo "═══════════════════════════════════════════════════════════════"
echo ""
if [ -z "${DEPLOYER:-}" ]; then
test_fail "Cannot determine deployer address"
else
test_pass "Deployer address: $DEPLOYER"
# Check balance
BALANCE=$(cast balance "$DEPLOYER" --rpc-url "$RPC_URL" 2>/dev/null || echo "0")
BALANCE_ETH=$(echo "scale=4; $BALANCE / 1000000000000000000" | bc 2>/dev/null || echo "0")
if (( $(echo "$BALANCE_ETH > 0.1" | bc -l 2>/dev/null || echo 0) )); then
test_pass "Deployer has sufficient balance: $BALANCE_ETH ETH"
else
test_fail "Deployer has insufficient balance: $BALANCE_ETH ETH (need > 0.1 ETH)"
fi
# Check nonce
NONCE=$(cast nonce "$DEPLOYER" --rpc-url "$RPC_URL" 2>/dev/null || echo "0")
test_pass "Deployer nonce: $NONCE"
fi
echo ""
echo "═══════════════════════════════════════════════════════════════"
echo "TEST 4: Contract Source Files"
echo "═══════════════════════════════════════════════════════════════"
echo ""
# Check for MockLinkToken in source project
SOURCE_PROJECT="/home/intlc/projects/smom-dbis-138"
if [ -f "$SOURCE_PROJECT/contracts/tokens/MockLinkToken.sol" ]; then
test_pass "MockLinkToken.sol found in source project"
CONTRACT_FILE="$SOURCE_PROJECT/contracts/tokens/MockLinkToken.sol"
else
test_warn "MockLinkToken.sol not found in source project"
CONTRACT_FILE=""
fi
# Check for deployment script
if [ -f "$SOURCE_PROJECT/script/DeployMockLinkToken.s.sol" ]; then
test_pass "DeployMockLinkToken.s.sol found"
SCRIPT_FILE="$SOURCE_PROJECT/script/DeployMockLinkToken.s.sol"
else
test_warn "DeployMockLinkToken.s.sol not found"
SCRIPT_FILE=""
fi
echo ""
echo "═══════════════════════════════════════════════════════════════"
echo "TEST 5: Foundry Installation"
echo "═══════════════════════════════════════════════════════════════"
echo ""
if command -v forge &> /dev/null; then
FORGE_VERSION=$(forge --version 2>/dev/null || echo "unknown")
test_pass "Foundry is installed ($FORGE_VERSION)"
else
test_fail "Foundry is not installed"
fi
if command -v cast &> /dev/null; then
CAST_VERSION=$(cast --version 2>/dev/null || echo "unknown")
test_pass "Cast is installed ($CAST_VERSION)"
else
test_fail "Cast is not installed"
fi
echo ""
echo "═══════════════════════════════════════════════════════════════"
echo "TEST 6: Contract Compilation"
echo "═══════════════════════════════════════════════════════════════"
echo ""
if [ -n "$CONTRACT_FILE" ] && [ -f "$CONTRACT_FILE" ]; then
cd "$SOURCE_PROJECT"
if forge build --contracts contracts/tokens/MockLinkToken.sol > /dev/null 2>&1; then
test_pass "MockLinkToken compiles successfully"
# Check if artifact exists
ARTIFACT="$SOURCE_PROJECT/out/MockLinkToken.sol/MockLinkToken.json"
if [ -f "$ARTIFACT" ]; then
BYTECODE=$(jq -r '.bytecode.object' "$ARTIFACT" 2>/dev/null || echo "")
if [ -n "$BYTECODE" ] && [ "$BYTECODE" != "null" ] && [ ${#BYTECODE} -gt 100 ]; then
test_pass "Contract bytecode generated (${#BYTECODE} chars)"
else
test_fail "Contract bytecode is invalid"
fi
else
test_fail "Contract artifact not found"
fi
else
test_fail "MockLinkToken compilation failed"
echo " Run: cd $SOURCE_PROJECT && forge build"
fi
cd "$PROJECT_ROOT"
else
test_warn "Skipping compilation test (contract file not found)"
fi
echo ""
echo "═══════════════════════════════════════════════════════════════"
echo "TEST 7: Deployment Script Validation"
echo "═══════════════════════════════════════════════════════════════"
echo ""
if [ -n "$SCRIPT_FILE" ] && [ -f "$SCRIPT_FILE" ]; then
test_pass "Deployment script exists"
# Check script syntax
cd "$SOURCE_PROJECT"
if forge script script/DeployMockLinkToken.s.sol:DeployMockLinkToken --dry-run > /dev/null 2>&1; then
test_pass "Deployment script syntax is valid"
else
test_warn "Deployment script dry-run failed (may need environment)"
fi
cd "$PROJECT_ROOT"
else
test_warn "Deployment script not found"
fi
echo ""
echo "═══════════════════════════════════════════════════════════════"
echo "TEST 8: Existing LINK Token Check"
echo "═══════════════════════════════════════════════════════════════"
echo ""
if [ -n "${LINK_TOKEN:-}" ] && [ "$LINK_TOKEN" != "" ]; then
test_pass "LINK_TOKEN is configured: $LINK_TOKEN"
# Check if contract exists
CODE=$(cast code "$LINK_TOKEN" --rpc-url "$RPC_URL" 2>/dev/null || echo "")
if [ -n "$CODE" ] && [ "$CODE" != "0x" ] && [ ${#CODE} -gt 100 ]; then
test_pass "LINK token contract exists on-chain (${#CODE} chars)"
# Try to call contract functions
NAME=$(cast call "$LINK_TOKEN" "name()(string)" --rpc-url "$RPC_URL" 2>/dev/null || echo "")
SYMBOL=$(cast call "$LINK_TOKEN" "symbol()(string)" --rpc-url "$RPC_URL" 2>/dev/null || echo "")
if [ -n "$NAME" ] && [ -n "$SYMBOL" ]; then
test_pass "LINK token is valid ERC20 (Name: $NAME, Symbol: $SYMBOL)"
else
test_warn "LINK token exists but may not be valid ERC20"
fi
else
test_warn "LINK token address configured but contract not found on-chain"
fi
else
test_warn "LINK_TOKEN not configured in address inventory"
fi
echo ""
echo "═══════════════════════════════════════════════════════════════"
echo "TEST 9: Gas Estimation"
echo "═══════════════════════════════════════════════════════════════"
echo ""
if [ -n "$CONTRACT_FILE" ] && [ -f "$CONTRACT_FILE" ]; then
cd "$SOURCE_PROJECT"
# Try to estimate gas (this may fail if network doesn't support it)
GAS_PRICE=$(cast gas-price --rpc-url "$RPC_URL" 2>/dev/null || echo "0")
if [ "$GAS_PRICE" != "0" ]; then
GAS_PRICE_GWEI=$(echo "scale=2; $GAS_PRICE / 1000000000" | bc 2>/dev/null || echo "0")
test_pass "Current gas price: $GAS_PRICE_GWEI gwei"
else
test_warn "Could not fetch gas price"
fi
cd "$PROJECT_ROOT"
else
test_warn "Skipping gas estimation (contract not available)"
fi
echo ""
echo "═══════════════════════════════════════════════════════════════"
echo "TEST 10: Deployment Scripts Availability"
echo "═══════════════════════════════════════════════════════════════"
echo ""
DEPLOY_SCRIPTS=(
"scripts/force-deploy-link.sh"
"scripts/deploy-link-token.sh"
"scripts/deploy-via-rpc-json.sh"
)
for script in "${DEPLOY_SCRIPTS[@]}"; do
if [ -f "$PROJECT_ROOT/$script" ]; then
if [ -x "$PROJECT_ROOT/$script" ]; then
test_pass "$script exists and is executable"
else
test_warn "$script exists but not executable"
fi
else
test_warn "$script not found"
fi
done
echo ""
echo "═══════════════════════════════════════════════════════════════"
echo "TEST SUMMARY"
echo "═══════════════════════════════════════════════════════════════"
echo ""
echo -e "${GREEN}Passed:${NC} $PASSED"
echo -e "${RED}Failed:${NC} $FAILED"
echo -e "${YELLOW}Warnings:${NC} $WARNINGS"
echo ""
if [ $FAILED -eq 0 ]; then
echo -e "${GREEN}✅ All critical tests passed! Ready for deployment.${NC}"
echo ""
echo "To deploy LINK token, run:"
echo " ./scripts/force-deploy-link.sh [GAS_PRICE]"
echo ""
echo "Or use the source project deployment script:"
echo " cd /home/intlc/projects/smom-dbis-138"
echo " forge script script/DeployMockLinkToken.s.sol:DeployMockLinkToken \\"
echo " --rpc-url $RPC_URL \\"
echo " --broadcast \\"
echo " --legacy"
exit 0
else
echo -e "${RED}❌ Some critical tests failed. Please fix issues before deploying.${NC}"
exit 1
fi