#!/usr/bin/env bash # Deploy fresh source-aligned GRU c* V2 USD tokens to Chain 138 and stage them in UniversalAssetRegistry. # # Usage: # bash scripts/deployment/deploy-gru-v2-chain138.sh # bash scripts/deployment/deploy-gru-v2-chain138.sh --dry-run # # Defaults: # - INITIAL_SUPPLY=0 # - FORWARD_CANONICAL=1 # - REGISTER_IN_GRU=1 # - GOVERNANCE_CONTROLLER from env or canonical Chain 138 inventory # - per-token metadata/disclosure/reporting URIs can be exported from # scripts/deployment/publish-gru-v2-chain138-metadata-to-ipfs.sh set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" SMOM_ROOT="${PROJECT_ROOT}/smom-dbis-138" DRY_RUN=0 for arg in "$@"; do case "$arg" in --dry-run) DRY_RUN=1 ;; *) echo "Unknown argument: $arg" >&2 exit 2 ;; esac done if [[ -f "${PROJECT_ROOT}/scripts/lib/load-project-env.sh" ]]; then set +eu # shellcheck source=../lib/load-project-env.sh source "${PROJECT_ROOT}/scripts/lib/load-project-env.sh" 2>/dev/null || true set -euo pipefail fi : "${PRIVATE_KEY:?PRIVATE_KEY is required}" RPC_URL_138="${RPC_URL_138:-http://192.168.11.211:8545}" UNIVERSAL_ASSET_REGISTRY="${UNIVERSAL_ASSET_REGISTRY:-0xAEE4b7fBe82E1F8295951584CBc772b8BBD68575}" GOVERNANCE_CONTROLLER="${GOVERNANCE_CONTROLLER:-0xA6891D5229f2181a34D4FF1B515c3Aa37dd90E0e}" INITIAL_SUPPLY="${INITIAL_SUPPLY:-0}" FORWARD_CANONICAL="${FORWARD_CANONICAL:-1}" REGISTER_IN_GRU="${REGISTER_IN_GRU:-1}" DEPLOY_CUSDT_V2="${DEPLOY_CUSDT_V2:-1}" DEPLOY_CUSDC_V2="${DEPLOY_CUSDC_V2:-1}" GAS_PRICE_WEI="${GAS_PRICE_WEI:-1000000000}" if ! command -v cast >/dev/null 2>&1; then echo "cast is required for nonce preflight checks" >&2 exit 1 fi deployer_address="$(cast wallet address --private-key "$PRIVATE_KEY" 2>/dev/null)" latest_nonce="$(cast rpc --rpc-url "$RPC_URL_138" eth_getTransactionCount "$deployer_address" latest | tr -d '\"')" pending_nonce="$(cast rpc --rpc-url "$RPC_URL_138" eth_getTransactionCount "$deployer_address" pending | tr -d '\"')" if [[ "$latest_nonce" != "$pending_nonce" ]]; then echo "Refusing GRU v2 deploy: deployer has pending transactions." >&2 echo "deployer=$deployer_address latest_nonce=$latest_nonce pending_nonce=$pending_nonce" >&2 echo "Resolve or replace the pending transaction set before retrying." >&2 exit 1 fi CMD=( forge script script/deploy/DeployAndStageCompliantFiatTokensV2ForChain.s.sol --rpc-url "$RPC_URL_138" --broadcast --private-key "$PRIVATE_KEY" --with-gas-price "$GAS_PRICE_WEI" ) echo "=== GRU v2 Chain 138 deploy ===" echo "RPC_URL_138=$RPC_URL_138" echo "UNIVERSAL_ASSET_REGISTRY=$UNIVERSAL_ASSET_REGISTRY" echo "GOVERNANCE_CONTROLLER=$GOVERNANCE_CONTROLLER" echo "INITIAL_SUPPLY=$INITIAL_SUPPLY" echo "FORWARD_CANONICAL=$FORWARD_CANONICAL" echo "REGISTER_IN_GRU=$REGISTER_IN_GRU" echo "DEPLOY_CUSDT_V2=$DEPLOY_CUSDT_V2" echo "DEPLOY_CUSDC_V2=$DEPLOY_CUSDC_V2" echo "DEPLOYER=$deployer_address" echo "NONCE_LATEST=$latest_nonce" echo "NONCE_PENDING=$pending_nonce" echo "CUSDT_V2_TOKEN_URI=${CUSDT_V2_TOKEN_URI:-}" echo "CUSDC_V2_TOKEN_URI=${CUSDC_V2_TOKEN_URI:-}" if [[ "$DRY_RUN" == "1" ]]; then printf '[DRY_RUN] (cd %s && ' "$SMOM_ROOT" printf 'INITIAL_SUPPLY=%q FORWARD_CANONICAL=%q REGISTER_IN_GRU=%q GOVERNANCE_CONTROLLER=%q UNIVERSAL_ASSET_REGISTRY=%q DEPLOY_CUSDT_V2=%q DEPLOY_CUSDC_V2=%q GAS_PRICE_WEI=%q ' \ "$INITIAL_SUPPLY" "$FORWARD_CANONICAL" "$REGISTER_IN_GRU" "$GOVERNANCE_CONTROLLER" "$UNIVERSAL_ASSET_REGISTRY" "$DEPLOY_CUSDT_V2" "$DEPLOY_CUSDC_V2" "$GAS_PRICE_WEI" printf 'CUSDT_V2_TOKEN_URI=%q CUSDT_V2_REGULATORY_DISCLOSURE_URI=%q CUSDT_V2_REPORTING_URI=%q ' \ "${CUSDT_V2_TOKEN_URI:-}" "${CUSDT_V2_REGULATORY_DISCLOSURE_URI:-}" "${CUSDT_V2_REPORTING_URI:-}" printf 'CUSDC_V2_TOKEN_URI=%q CUSDC_V2_REGULATORY_DISCLOSURE_URI=%q CUSDC_V2_REPORTING_URI=%q ' \ "${CUSDC_V2_TOKEN_URI:-}" "${CUSDC_V2_REGULATORY_DISCLOSURE_URI:-}" "${CUSDC_V2_REPORTING_URI:-}" printed=() skip_next=0 for arg in "${CMD[@]}"; do if [[ "$skip_next" == "1" ]]; then printed+=("") skip_next=0 continue fi if [[ "$arg" == "--private-key" ]]; then printed+=("$arg") skip_next=1 continue fi printed+=("$arg") done printf '%q ' "${printed[@]}" printf ')\n' exit 0 fi ( cd "$SMOM_ROOT" INITIAL_SUPPLY="$INITIAL_SUPPLY" \ FORWARD_CANONICAL="$FORWARD_CANONICAL" \ REGISTER_IN_GRU="$REGISTER_IN_GRU" \ DEPLOY_CUSDT_V2="$DEPLOY_CUSDT_V2" \ DEPLOY_CUSDC_V2="$DEPLOY_CUSDC_V2" \ GOVERNANCE_CONTROLLER="$GOVERNANCE_CONTROLLER" \ UNIVERSAL_ASSET_REGISTRY="$UNIVERSAL_ASSET_REGISTRY" \ GAS_PRICE_WEI="$GAS_PRICE_WEI" \ CUSDT_V2_TOKEN_URI="${CUSDT_V2_TOKEN_URI:-}" \ CUSDT_V2_REGULATORY_DISCLOSURE_URI="${CUSDT_V2_REGULATORY_DISCLOSURE_URI:-}" \ CUSDT_V2_REPORTING_URI="${CUSDT_V2_REPORTING_URI:-}" \ CUSDC_V2_TOKEN_URI="${CUSDC_V2_TOKEN_URI:-}" \ CUSDC_V2_REGULATORY_DISCLOSURE_URI="${CUSDC_V2_REGULATORY_DISCLOSURE_URI:-}" \ CUSDC_V2_REPORTING_URI="${CUSDC_V2_REPORTING_URI:-}" \ "${CMD[@]}" )