#!/usr/bin/env bash # Mint Official USDC mirror (Chain 138) to deployer so PMM soak grid funding can transfer out. # OfficialStableMirrorToken: onlyOwner mint(address,uint256). Deployer is owner. # # Waits until deployer latest nonce == pending (no in-flight txs from this EOA), then mints shortfall: # (PMM_SOAK_SEED_MIRROR_USDC_RAW × (6534 wallets)) − deployer balance # # Usage: # bash scripts/deployment/pmm-soak-mint-mirror-usdc-deployer-shortfall.sh --dry-run # bash scripts/deployment/pmm-soak-mint-mirror-usdc-deployer-shortfall.sh --apply # # Env: RPC_URL_138, PMM_SOAK_RPC_URL_OVERRIDE, PRIVATE_KEY / DEPLOYER_PRIVATE_KEY, PMM_SOAK_GRID_JSON, PMM_SOAK_SEED_MIRROR_USDC_RAW, # PMM_SOAK_WAIT_NONCE_CLEAR_SEC, CHAIN138_DEPLOY_GAS_PRICE_WEI # set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" cd "$PROJECT_ROOT" # shellcheck source=/dev/null source "${PROJECT_ROOT}/scripts/lib/pmm-soak-dotenv-override.sh" pmm_soak_snapshot_pool_env_for_restore # shellcheck source=/dev/null [[ -f "${PROJECT_ROOT}/scripts/lib/load-project-env.sh" ]] && source "${PROJECT_ROOT}/scripts/lib/load-project-env.sh" pmm_soak_restore_pool_env_after_dotenv if [[ -n "${PMM_SOAK_RPC_URL_OVERRIDE:-}" ]]; then export RPC_URL_138="$PMM_SOAK_RPC_URL_OVERRIDE" export CHAIN138_RPC_URL="$RPC_URL_138" export CHAIN138_RPC="$RPC_URL_138" export ETH_RPC_URL="$RPC_URL_138" fi USDC_M=0x71D6687F38b93CCad569Fa6352c876eea967201b D=0x4A666F96fC8764181194447A7dFdb7d471b301C8 RPC="${RPC_URL_138:-http://192.168.11.211:8545}" PK="${DEPLOYER_PRIVATE_KEY:-${PRIVATE_KEY:-}}" SEED_USDC="${PMM_SOAK_SEED_MIRROR_USDC_RAW:-100000000}" MAX_LI=6533 GAS_WEI="${CHAIN138_DEPLOY_GAS_PRICE_WEI:-1000}" MAX_WAIT="${PMM_SOAK_WAIT_NONCE_CLEAR_SEC:-7200}" APPLY=0 while [[ $# -gt 0 ]]; do case "$1" in --apply) APPLY=1 ;; --dry-run) APPLY=0 ;; *) echo "unknown: $1" >&2; exit 2 ;; esac shift done if [[ "$APPLY" -eq 1 && -z "$PK" ]]; then echo "[mint-usdc] FATAL: --apply needs PRIVATE_KEY" >&2 exit 1 fi USDC_NEEDED="$(python3 -c "print(int('$SEED_USDC') * (int('$MAX_LI') + 1))")" USDC_BAL="$(cast call "$USDC_M" 'balanceOf(address)(uint256)' "$D" --rpc-url "$RPC" | awk '{print $1}')" if (( USDC_BAL >= USDC_NEEDED )); then echo "[mint-usdc] deployer already has $USDC_BAL >= need $USDC_NEEDED - nothing to do" exit 0 fi SHORTFALL="$(python3 -c "print(int('$USDC_NEEDED') - int('$USDC_BAL'))")" echo "[mint-usdc] need=$USDC_NEEDED bal=$USDC_BAL shortfall=$SHORTFALL" if [[ "$APPLY" -eq 0 ]]; then echo "[mint-usdc] dry-run: after mempool clear, would run:" echo " cast send $USDC_M 'mint(address,uint256)' $D $SHORTFALL --rpc-url \"\$RPC_URL_138\" --private-key \"\$PRIVATE_KEY\" --legacy --gas-price $GAS_WEI" exit 0 fi start="$SECONDS" while true; do nl="$(cast nonce "$D" --rpc-url "$RPC" -B latest)" np="$(cast nonce "$D" --rpc-url "$RPC" -B pending)" if [[ "$nl" == "$np" ]]; then echo "[mint-usdc] nonce clear (latest=pending=$nl)" break fi if (( SECONDS - start > MAX_WAIT )); then echo "[mint-usdc] FATAL: pending nonce (latest=$nl pending=$np) after ${MAX_WAIT}s" >&2 exit 1 fi echo "[mint-usdc] waiting mempool latest=$nl pending=$np ..." sleep 3 done cast send "$USDC_M" 'mint(address,uint256)' "$D" "$SHORTFALL" \ --rpc-url "$RPC" --private-key "$PK" --legacy --gas-price "$GAS_WEI" USDC_BAL="$(cast call "$USDC_M" 'balanceOf(address)(uint256)' "$D" --rpc-url "$RPC" | awk '{print $1}')" echo "[mint-usdc] done deployer mirror USDC balance=$USDC_BAL"