324 lines
13 KiB
Bash
Executable File
324 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/.env" 2>/dev/null || source "$PROJECT_ROOT/../.env" 2>/dev/null || true
|
|
|
|
RPC_URL="${RPC_URL_138:-http://192.168.11.250:8545}"
|
|
CHAIN_ID=138
|
|
|
|
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 set in .env"
|
|
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 .env"
|
|
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
|
|
|