#!/usr/bin/env bash # Deploy TransactionMirror to Chain 138. # Use this when forge script DeployTransactionMirror.s.sol fails with constructor-args decode (forge create works). # Usage: ./scripts/deployment/deploy-transaction-mirror-chain138.sh [--dry-run] # --dry-run Print forge create command and exit 0 (no deploy). # Requires: smom-dbis-138/.env with PRIVATE_KEY, RPC_URL_138 or RPC_URL (Chain 138 Core). Optional: MIRROR_ADMIN. # Also sources load-project-env (secure-secrets, config). Must run from a host that can reach RPC (e.g. LAN to 192.168.11.211:8545). set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" SMOM="${SMOM_DIR:-${PROJECT_ROOT}/smom-dbis-138}" DRY_RUN=false for a in "$@"; do [[ "$a" == "--dry-run" ]] && DRY_RUN=true && break; done [[ -f "${SCRIPT_DIR}/../lib/load-project-env.sh" ]] && source "${SCRIPT_DIR}/../lib/load-project-env.sh" 2>/dev/null || true [[ -f "${SMOM}/.env" ]] && set -a && source "${SMOM}/.env" 2>/dev/null && set +a || true # RPC_URL_138 or RPC_URL (alias) RPC="${RPC_URL_138:-${RPC_URL:-http://192.168.11.211:8545}}" export RPC_URL_138="$RPC" export ETH_RPC_URL="$RPC" GAS_PRICE="${GAS_PRICE:-1000000000}" if ! $DRY_RUN && [[ -z "${PRIVATE_KEY:-}" ]]; then echo "ERROR: PRIVATE_KEY not set. Set in smom-dbis-138/.env" exit 1 fi if [[ "${PRIVATE_KEY#0x}" == "$PRIVATE_KEY" ]]; then export PRIVATE_KEY="0x$PRIVATE_KEY" fi export PRIVATE_KEY # Ensure subshells/forge inherit it # MIRROR_ADMIN or deployer address if [[ -n "${MIRROR_ADMIN:-}" ]]; then ADMIN="$MIRROR_ADMIN" else if $DRY_RUN; then ADMIN=""; else ADMIN=$(cast wallet address --private-key "$PRIVATE_KEY" 2>/dev/null) || { echo "ERROR: cast not found or PRIVATE_KEY invalid"; exit 1; }; fi fi if $DRY_RUN; then echo "[dry-run] Would run: forge create ... TransactionMirror --constructor-args $ADMIN --rpc-url $RPC --legacy --gas-price $GAS_PRICE" echo " Add TRANSACTION_MIRROR_ADDRESS= to smom-dbis-138/.env after deploy." exit 0 fi echo "Deploying TransactionMirror to Chain 138 (admin=$ADMIN)" echo " RPC=$RPC" cd "$SMOM" # Use forge script (DeployTransactionMirror.s.sol) — more reliable than forge create with env out=$(env ETH_RPC_URL="$RPC" MIRROR_ADMIN="$ADMIN" forge script script/DeployTransactionMirror.s.sol:DeployTransactionMirror \ --rpc-url "$RPC" \ --broadcast \ --private-key "$PRIVATE_KEY" \ --legacy \ --gas-price "$GAS_PRICE" 2>&1) || { echo "$out"; echo "Run from a host on LAN that can reach $RPC"; exit 1; } echo "$out" addr=$(echo "$out" | grep -oE 'TransactionMirror deployed at: (0x[a-fA-F0-9]{40})' | sed 's/TransactionMirror deployed at: //') if [[ -n "$addr" ]]; then echo "" echo "Deployed TransactionMirror at: $addr" env_file="${SMOM}/.env" if [[ -f "$env_file" ]]; then if grep -q "^TRANSACTION_MIRROR_ADDRESS=" "$env_file" 2>/dev/null; then sed -i "s|^TRANSACTION_MIRROR_ADDRESS=.*|TRANSACTION_MIRROR_ADDRESS=$addr|" "$env_file" echo " Updated TRANSACTION_MIRROR_ADDRESS in $env_file" else echo "TRANSACTION_MIRROR_ADDRESS=$addr" >> "$env_file" echo " Appended TRANSACTION_MIRROR_ADDRESS to $env_file" fi fi fi echo "" echo "Done. Add TRANSACTION_MIRROR_ADDRESS= to smom-dbis-138/.env if not already set."