#!/usr/bin/env bash # Mint LINK, cUSDT, cUSDC to deployment wallet; optionally wrap ETH to WETH9/WETH10. # Usage: ./scripts/mint-tokens-for-deployer.sh [--amount-link N] [--amount-stable N] [--wrap-eth N] [--dry-run] # # Defaults: 1000000 LINK (18 decimals), 100000 cUSDT + 100000 cUSDC (6 decimals each), 1 ETH wrap. # Requires: PRIVATE_KEY, RPC_URL_138 in smom-dbis-138/.env # Chain 138: use --gas-price 1000000000 (1 gwei) for all txs. # # If you get "Replacement transaction underpriced": a stuck tx is blocking the deployer nonce. # Workarounds: (1) Wait for the stuck tx to be mined, (2) Use MetaMask to send a 0-ETH tx to clear, # (3) Restart Besu RPC and flush mempool from Proxmox host. set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" cd "$PROJECT_ROOT" # Load smom-dbis-138 .env if [[ -f smom-dbis-138/.env ]]; then set -a source smom-dbis-138/.env set +a fi RPC="${RPC_URL_138:-${CHAIN138_RPC_URL:-http://192.168.11.211:8545}}" GAS_PRICE="${GAS_PRICE:-1000000000}" GAS_LIMIT="${GAS_LIMIT:-100000}" # Token addresses (Chain 138) LINK="0xb7721dD53A8c629d9f1Ba31a5819AFe250002b03" CUSDT="0x93E66202A11B1772E55407B32B44e5Cd8eda7f22" CUSDC="0xf22258f57794CC8E06237084b353Ab30fFfa640b" WETH9="0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" WETH10="0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9f" # Default amounts AMOUNT_LINK="${AMOUNT_LINK:-1000000}" AMOUNT_STABLE="${AMOUNT_STABLE:-100000}" WRAP_ETH="${WRAP_ETH:-1}" DRY_RUN=false for a in "$@"; do case "$a" in --amount-link=*) AMOUNT_LINK="${a#*=}";; --amount-stable=*) AMOUNT_STABLE="${a#*=}";; --wrap-eth=*) WRAP_ETH="${a#*=}";; --dry-run) DRY_RUN=true;; esac done DEPLOYER="" if [[ -n "${PRIVATE_KEY:-}" ]]; then DEPLOYER=$(cast wallet address --private-key "$PRIVATE_KEY" 2>/dev/null || true) fi if [[ -z "$DEPLOYER" ]]; then DEPLOYER="${DEPLOYER_ADDRESS:-0x4A666F96fC8764181194447A7dFdb7d471b301C8}" fi LINK_RAW="${AMOUNT_LINK}000000000000000000" # 18 decimals STABLE_RAW="${AMOUNT_STABLE}000000" # 6 decimals # 1 ETH = 10^18 wei WRAP_WEI=$(awk "BEGIN {printf \"%.0f\", ${WRAP_ETH} * 1000000000000000000}" 2>/dev/null || echo "1000000000000000000") echo "=== Mint tokens for deployer ===" echo "Deployer: $DEPLOYER" echo "RPC: $RPC" echo "Amounts: LINK=$AMOUNT_LINK, cUSDT/cUSDC=$AMOUNT_STABLE each, wrap ETH=$WRAP_ETH" echo "" run_tx() { local desc="$1" shift if $DRY_RUN; then echo "[dry-run] Would run: $*" return 0 fi echo "Running: $desc ..." if "$@" 2>&1; then echo " OK" return 0 else echo " FAILED" return 1 fi } if [[ -z "${PRIVATE_KEY:-}" ]] && ! $DRY_RUN; then echo "Error: PRIVATE_KEY not set in smom-dbis-138/.env" exit 1 fi # 1. Mint LINK (MockLinkToken has unrestricted mint) echo "1. Mint LINK to deployer..." if $DRY_RUN; then echo " [dry-run] cast send $LINK \"mint(address,uint256)\" $DEPLOYER $LINK_RAW --rpc-url \$RPC --private-key \$PRIVATE_KEY --legacy --gas-price $GAS_PRICE" else if cast send "$LINK" "mint(address,uint256)" "$DEPLOYER" "$LINK_RAW" \ --rpc-url "$RPC" --private-key "$PRIVATE_KEY" --legacy --gas-limit "$GAS_LIMIT" --gas-price "$GAS_PRICE" 2>&1; then echo " OK" else echo " (LINK may not have mint or different interface)" fi fi echo "" # 2. Mint cUSDT (onlyOwner - deployer must be owner) echo "2. Mint cUSDT to deployer..." if $DRY_RUN; then echo " [dry-run] cast send $CUSDT \"mint(address,uint256)\" $DEPLOYER $STABLE_RAW --rpc-url \$RPC --private-key \$PRIVATE_KEY --legacy --gas-price $GAS_PRICE" else if cast send "$CUSDT" "mint(address,uint256)" "$DEPLOYER" "$STABLE_RAW" \ --rpc-url "$RPC" --private-key "$PRIVATE_KEY" --legacy --gas-limit "$GAS_LIMIT" --gas-price "$GAS_PRICE" 2>&1; then echo " OK" else echo " (Deployer may not be owner of cUSDT)" fi fi echo "" # 3. Mint cUSDC (onlyOwner) echo "3. Mint cUSDC to deployer..." if $DRY_RUN; then echo " [dry-run] cast send $CUSDC \"mint(address,uint256)\" $DEPLOYER $STABLE_RAW --rpc-url \$RPC --private-key \$PRIVATE_KEY --legacy --gas-price $GAS_PRICE" else if cast send "$CUSDC" "mint(address,uint256)" "$DEPLOYER" "$STABLE_RAW" \ --rpc-url "$RPC" --private-key "$PRIVATE_KEY" --legacy --gas-limit "$GAS_LIMIT" --gas-price "$GAS_PRICE" 2>&1; then echo " OK" else echo " (Deployer may not be owner of cUSDC)" fi fi echo "" # 4. Wrap ETH to WETH9 (if WRAP_ETH > 0) if [[ "${WRAP_ETH:-0}" != "0" ]] && [[ -n "${WRAP_WEI:-}" ]]; then echo "4. Wrap $WRAP_ETH ETH to WETH9..." if $DRY_RUN; then echo " [dry-run] cast send $WETH9 \"deposit()\" --value $WRAP_WEI --rpc-url \$RPC --private-key \$PRIVATE_KEY --legacy --gas-price $GAS_PRICE" else if cast send "$WETH9" "deposit()" --value "$WRAP_WEI" \ --rpc-url "$RPC" --private-key "$PRIVATE_KEY" --legacy --gas-limit "$GAS_LIMIT" --gas-price "$GAS_PRICE" 2>&1; then echo " OK" else echo " (Insufficient ETH balance?)" fi fi echo "" fi # 5. Wrap ETH to WETH10 (optional, same amount) if [[ "${WRAP_ETH:-0}" != "0" ]] && [[ -n "${WRAP_WEI:-}" ]]; then echo "5. Wrap $WRAP_ETH ETH to WETH10..." if $DRY_RUN; then echo " [dry-run] cast send $WETH10 \"deposit()\" --value $WRAP_WEI --rpc-url \$RPC --private-key \$PRIVATE_KEY --legacy --gas-price $GAS_PRICE" else if cast send "$WETH10" "deposit()" --value "$WRAP_WEI" \ --rpc-url "$RPC" --private-key "$PRIVATE_KEY" --legacy --gas-limit "$GAS_LIMIT" --gas-price "$GAS_PRICE" 2>&1; then echo " OK" else echo " (Insufficient ETH balance?)" fi fi echo "" fi echo "=== Done ===" if ! $DRY_RUN; then echo "Verify balances: cd smom-dbis-138 && ./scripts/deployment/list-deployer-tokens-all-networks.sh" fi