Files
explorer-monorepo/scripts/run-migration-0010.sh
defiQUG bdae5a9f6e feat: explorer API, wallet, CCIP scripts, and config refresh
- Backend REST/gateway/track routes, analytics, Blockscout proxy paths.
- Frontend wallet and liquidity surfaces; MetaMask token list alignment.
- Deployment docs, verification scripts, address inventory updates.

Check: go build ./... under backend/ (pass).
Made-with: Cursor
2026-04-07 23:22:12 -07:00

139 lines
4.6 KiB
Bash

#!/bin/bash
# Run migration 0010_track_schema with shared-DB detection.
#
# - Standalone explorer DB: applies the full Track 2-4 schema.
# - Shared Blockscout DB: applies only explorer-owned auth/operator tables to
# avoid colliding with Blockscout's existing addresses/token_transfers schema.
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
MIGRATION_DIR="$PROJECT_ROOT/backend/database/migrations"
FULL_MIGRATION_FILE="$MIGRATION_DIR/0010_track_schema.up.sql"
AUTH_ONLY_MIGRATION_FILE="$MIGRATION_DIR/0010_track_schema.auth_only.sql"
MIGRATION_FILE="$FULL_MIGRATION_FILE"
MIGRATION_MODE="full"
REQUIRED_TABLES=(addresses token_transfers operator_roles wallet_nonces)
echo "=== Running Track Schema Migration (0010) ==="
echo ""
if [ ! -f "$FULL_MIGRATION_FILE" ]; then
echo "❌ Migration file not found: $FULL_MIGRATION_FILE"
exit 1
fi
if [ ! -f "$AUTH_ONLY_MIGRATION_FILE" ]; then
echo "❌ Migration file not found: $AUTH_ONLY_MIGRATION_FILE"
exit 1
fi
# Load database config from environment or use defaults
DB_HOST="${DB_HOST:-localhost}"
DB_PORT="${DB_PORT:-5432}"
DB_USER="${DB_USER:-explorer}"
DB_PASSWORD="${DB_PASSWORD:-changeme}"
DB_NAME="${DB_NAME:-explorer}"
sql_scalar() {
local sql="$1"
export PGPASSWORD="$DB_PASSWORD"
psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -Atc "$sql" 2>/dev/null | tr -d ' '
}
is_shared_blockscout_db() {
sql_scalar "
SELECT CASE
WHEN EXISTS (
SELECT 1
FROM information_schema.tables
WHERE table_schema = 'public' AND table_name = 'addresses'
) AND NOT EXISTS (
SELECT 1
FROM information_schema.columns
WHERE table_schema = 'public' AND table_name = 'addresses' AND column_name = 'address'
)
THEN 'yes'
ELSE 'no'
END;
"
}
count_required_tables() {
local table_list=""
local table
for table in "${REQUIRED_TABLES[@]}"; do
if [ -n "$table_list" ]; then
table_list+=", "
fi
table_list+="'$table'"
done
sql_scalar "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'public' AND table_name IN (${table_list});"
}
if [ "$(is_shared_blockscout_db || echo no)" = "yes" ]; then
MIGRATION_MODE="auth-only"
MIGRATION_FILE="$AUTH_ONLY_MIGRATION_FILE"
REQUIRED_TABLES=(operator_events operator_ip_whitelist operator_roles wallet_nonces)
fi
echo "Database: $DB_NAME@$DB_HOST:$DB_PORT"
echo "User: $DB_USER"
if [ "$MIGRATION_MODE" = "auth-only" ]; then
echo "Mode: shared Blockscout DB detected; applying explorer auth/operator tables only"
else
echo "Mode: standalone explorer DB; applying full Track 2-4 schema"
fi
echo ""
TABLE_COUNT="$(count_required_tables || echo 0)"
if [ "${TABLE_COUNT:-0}" -ge "${#REQUIRED_TABLES[@]}" ]; then
echo "✅ Migration already applied (${TABLE_COUNT}/${#REQUIRED_TABLES[@]} required tables present)"
echo ""
echo "Verified tables:"
for table in "${REQUIRED_TABLES[@]}"; do
echo " - $table"
done
exit 0
fi
export PGPASSWORD="$DB_PASSWORD"
if psql -v ON_ERROR_STOP=1 -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -f "$MIGRATION_FILE"; then
TABLE_COUNT="$(count_required_tables || echo 0)"
if [ "${TABLE_COUNT:-0}" -lt "${#REQUIRED_TABLES[@]}" ]; then
echo ""
echo "❌ Migration finished but required tables are still missing (${TABLE_COUNT}/${#REQUIRED_TABLES[@]})"
exit 1
fi
echo ""
echo "✅ Migration ${MIGRATION_MODE} completed successfully"
echo ""
if [ "$MIGRATION_MODE" = "auth-only" ]; then
echo "Created or verified tables:"
echo " - operator_events (Track 4)"
echo " - operator_ip_whitelist (Track 4)"
echo " - operator_roles (Track 4)"
echo " - wallet_nonces (Authentication)"
else
echo "Created tables:"
echo " - addresses (Track 2)"
echo " - token_transfers (Track 2)"
echo " - token_balances (Track 2)"
echo " - internal_transactions (Track 2)"
echo " - analytics_flows (Track 3)"
echo " - analytics_bridge_history (Track 3)"
echo " - token_distribution (Track 3 - materialized view)"
echo " - operator_events (Track 4)"
echo " - operator_ip_whitelist (Track 4)"
echo " - operator_roles (Track 4)"
echo " - wallet_nonces (Authentication)"
fi
else
echo ""
echo "❌ Migration failed"
exit 1
fi
unset PGPASSWORD