#!/usr/bin/env bash # Deploy 1,000 BTC ledger real contract wiring to production settlement middleware. # # Run on the OMNL bank host (dev-bis-ali / secure.omdnl.org backend): # OMNL_SKIP_GIT_PULL=1 bash scripts/deployment/deploy-btc-ledger-production.sh # Or after push to main: # bash scripts/deployment/deploy-btc-ledger-production.sh # set -euo pipefail REPO_DIR="${OMNL_BANK_ROOT:-$HOME/smom-dbis-138}" ENV_FILE="${OMNL_BANK_ENV:-$REPO_DIR/.env}" LOG_DIR="${OMNL_BANK_LOG_DIR:-$HOME/omnl-bank/logs}" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" log() { echo "[$(date -Iseconds)] $*"; } cd "$REPO_DIR" if [[ "${OMNL_SKIP_GIT_PULL:-0}" != "1" ]]; then log "Pull latest main..." git fetch origin git checkout main git pull --ff-only origin main fi export SETTLEMENT_MIDDLEWARE_CONFIG="${SETTLEMENT_MIDDLEWARE_CONFIG:-$REPO_DIR/config/settlement-middleware.production.v1.json}" export OMNL_BTC_LEDGER_CONFIG="${OMNL_BTC_LEDGER_CONFIG:-$REPO_DIR/config/btc-l1-ledger-1000.chain138.v1.json}" if [[ ! -f "$OMNL_BTC_LEDGER_CONFIG" ]]; then echo "Missing BTC ledger config: $OMNL_BTC_LEDGER_CONFIG" >&2 exit 1 fi if [[ -f "$ENV_FILE" ]]; then set -a set +u # shellcheck disable=SC1090 source "$ENV_FILE" set -u set +a fi # Ensure contract env keys are present (merge from canonical JSON if missing). if [[ -f "$REPO_DIR/scripts/deployment/sync-btc-ledger-contract-env.mjs" ]]; then FRAG="$(mktemp)" node "$REPO_DIR/scripts/deployment/sync-btc-ledger-contract-env.mjs" >"$FRAG" while IFS= read -r line; do key="${line%%=*}" if ! grep -q "^${key}=" "$ENV_FILE" 2>/dev/null; then echo "$line" >>"$ENV_FILE" log "Added missing env: $key" fi done <"$FRAG" rm -f "$FRAG" set -a set +u # shellcheck disable=SC1090 source "$ENV_FILE" set -u set +a fi log "Building settlement-core + settlement-middleware..." for dir in packages/settlement-core services/settlement-middleware; do cd "$REPO_DIR/$dir" NODE_ENV=development npm install --no-fund --no-audit npm run build done mkdir -p "$LOG_DIR" cd "$REPO_DIR/services/settlement-middleware" pkill -f "smom-dbis-138/services/settlement-middleware" 2>/dev/null || true fuser -k 3011/tcp 2>/dev/null || true sleep 1 log "Starting settlement-middleware :3011 with BTC ledger config..." nohup env \ SETTLEMENT_MIDDLEWARE_CONFIG="$SETTLEMENT_MIDDLEWARE_CONFIG" \ OMNL_BTC_LEDGER_CONFIG="$OMNL_BTC_LEDGER_CONFIG" \ OMNL_SUPPORTED_CHAINS_CONFIG="${OMNL_SUPPORTED_CHAINS_CONFIG:-$REPO_DIR/config/omnl-supported-chains.v1.json}" \ OMNL_M2_TOKEN_REGISTRY="${OMNL_M2_TOKEN_REGISTRY:-$REPO_DIR/config/omnl-m2-token-registry.v1.json}" \ OMNL_API_KEY="${OMNL_API_KEY:-${OMNL_SUPER_ADMIN_SECURE_KEY:-}}" \ OMNL_SUPER_ADMIN_OFFICE24_KEY="${OMNL_SUPER_ADMIN_OFFICE24_KEY:-}" \ OMNL_SUPER_ADMIN_EXCHANGE_KEY="${OMNL_SUPER_ADMIN_EXCHANGE_KEY:-}" \ OMNL_SUPER_ADMIN_SECURE_KEY="${OMNL_SUPER_ADMIN_SECURE_KEY:-}" \ OMNL_SUPER_ADMIN_FOREX_KEY="${OMNL_SUPER_ADMIN_FOREX_KEY:-}" \ OMNL_FINERACT_BASE_URL="${OMNL_FINERACT_BASE_URL:-${FINERACT_BASE_URL:-}}" \ OMNL_FINERACT_TENANT="${OMNL_FINERACT_TENANT:-${FINERACT_TENANT:-omnl}}" \ OMNL_FINERACT_USER="${OMNL_FINERACT_USER:-}" \ OMNL_FINERACT_USERNAME="${OMNL_FINERACT_USERNAME:-}" \ OMNL_FINERACT_PASSWORD="${OMNL_FINERACT_PASSWORD:-}" \ OMNL_PUBLIC_MONEY_SUPPLY="${OMNL_PUBLIC_MONEY_SUPPLY:-1}" \ SETTLEMENT_ALLOW_HYBX_PRODUCTION="${SETTLEMENT_ALLOW_HYBX_PRODUCTION:-1}" \ SETTLEMENT_ALLOW_CHAIN_MINT_EXECUTE="${SETTLEMENT_ALLOW_CHAIN_MINT_EXECUTE:-1}" \ TOKEN_AGGREGATION_URL="${TOKEN_AGGREGATION_URL:-http://127.0.0.1:3000}" \ CHAIN138_ORACLE_URL="${CHAIN138_ORACLE_URL:-http://127.0.0.1:3500}" \ RPC_URL_138="${RPC_URL_138:-${CHAIN_138_RPC_URL:-}}" \ CHAIN_138_RPC_URL="${CHAIN_138_RPC_URL:-${RPC_URL_138:-}}" \ OMNL_MINT_OPERATOR_PRIVATE_KEY="${OMNL_MINT_OPERATOR_PRIVATE_KEY:-}" \ OMNL_REQUIRE_LIVE_BTC_PRICE="${OMNL_REQUIRE_LIVE_BTC_PRICE:-1}" \ CBTC_ADDRESS_138="${CBTC_ADDRESS_138:-}" \ BTC_L1_RECIPIENT_ADDRESS="${BTC_L1_RECIPIENT_ADDRESS:-}" \ BTC_EXISTING_MINT_HOLDER="${BTC_EXISTING_MINT_HOLDER:-}" \ DODO_PMM_INTEGRATION="${DODO_PMM_INTEGRATION:-${CHAIN_138_DODO_PMM_INTEGRATION:-}}" \ CHAIN138_POOL_CBTC_CUSDT="${CHAIN138_POOL_CBTC_CUSDT:-}" \ CHAIN138_POOL_CBTC_CUSDC="${CHAIN138_POOL_CBTC_CUSDC:-}" \ CHAIN138_POOL_CBTC_CXAUC="${CHAIN138_POOL_CBTC_CXAUC:-}" \ RESERVE_SYSTEM="${RESERVE_SYSTEM:-}" \ ORACLE_PROXY_ADDRESS="${ORACLE_PROXY_ADDRESS:-}" \ ORACLE_AGGREGATOR_ADDRESS="${ORACLE_AGGREGATOR_ADDRESS:-${AGGREGATOR_ADDRESS:-}}" \ PRICE_FEED_KEEPER_ADDRESS="${PRICE_FEED_KEEPER_ADDRESS:-}" \ HYBX_MIFOS_FINERACT_SIDECAR_URL="${HYBX_MIFOS_FINERACT_SIDECAR_URL:-}" \ HYBX_BASE_URL="${HYBX_BASE_URL:-}" \ HYBX_API="${HYBX_API:-}" \ npm run start >"$LOG_DIR/settlement-middleware.log" 2>&1 & echo $! >"$LOG_DIR/settlement-middleware.pid" sleep 4 API_KEY="${OMNL_API_KEY:-${OMNL_SUPER_ADMIN_SECURE_KEY:-}}" log "Smoke: /btc/contracts" curl -sf -H "Authorization: Bearer ${API_KEY}" \ "http://127.0.0.1:3011/api/v1/settlement/btc/contracts" | head -c 400 || { echo "FAIL: /btc/contracts not reachable" >&2 tail -n 40 "$LOG_DIR/settlement-middleware.log" >&2 || true exit 1 } echo log "Smoke: /btc/ledger headroom" curl -sf -H "Authorization: Bearer ${API_KEY}" \ "http://127.0.0.1:3011/api/v1/settlement/btc/ledger" | head -c 500 || true echo log "BTC ledger production deploy complete" log "Public: https://secure.omdnl.org/settlement/btc/contracts"