#!/usr/bin/env bash # Verify Ethereum Mainnet CompliantWrappedToken (cWUSDT…cWXAUT) on Etherscan. # Constructor matches script/deploy/DeployCWTokens.s.sol (name, symbol, 6 decimals, deployer admin). # # Requires: ETHERSCAN_API_KEY, and either CW_VERIFY_ADMIN=0x... (deployer used at deploy) or PRIVATE_KEY # (address derived via cast wallet address) to ABI-encode constructor args. # # Usage: # cd smom-dbis-138 && ./scripts/deployment/verify-mainnet-cw-etherscan.sh # ./scripts/deployment/verify-mainnet-cw-etherscan.sh --dry-run # print forge commands only set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" cd "$PROJECT_ROOT" DRY_RUN=false for a in "$@"; do case "$a" in --dry-run) DRY_RUN=true ;; esac done if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then # shellcheck disable=SC1090 source "$SCRIPT_DIR/../lib/deployment/dotenv.sh" load_deployment_env --repo-root "${PROJECT_ROOT}" elif [[ -f "$PROJECT_ROOT/.env" ]]; then set -a # shellcheck disable=SC1090 source "$PROJECT_ROOT/.env" set +a fi if [[ -z "${ETHERSCAN_API_KEY:-}" ]]; then echo "ETHERSCAN_API_KEY not set (see https://etherscan.io/myapikey)" >&2 exit 1 fi ADMIN="${CW_VERIFY_ADMIN:-}" if [[ -z "$ADMIN" && -n "${PRIVATE_KEY:-}" ]]; then ADMIN="$(cast wallet address --private-key "$PRIVATE_KEY")" fi if [[ -z "$ADMIN" || "$ADMIN" == "0x0000000000000000000000000000000000000000" ]]; then echo "Set CW_VERIFY_ADMIN to the deployer address used in CompliantWrappedToken constructor, or set PRIVATE_KEY." >&2 exit 1 fi verify_one() { local envkey="$1" cname="$2" sym="$3" local addr addr="${!envkey:-}" if [[ -z "$addr" ]]; then echo " skip $sym: $envkey unset" return 0 fi local enc enc="$(cast abi-encode "constructor(string,string,uint8,address)" "$cname" "$sym" 6 "$ADMIN")" if $DRY_RUN; then echo "forge verify-contract --chain-id 1 --num-of-optimizations 200 --via-ir --constructor-args \"$enc\" --etherscan-api-key \"\$ETHERSCAN_API_KEY\" \"$addr\" contracts/tokens/CompliantWrappedToken.sol:CompliantWrappedToken" return 0 fi set +e out="$(forge verify-contract \ --chain-id 1 \ --num-of-optimizations 200 \ --via-ir \ --constructor-args "$enc" \ --etherscan-api-key "$ETHERSCAN_API_KEY" \ "$addr" \ "contracts/tokens/CompliantWrappedToken.sol:CompliantWrappedToken" 2>&1)" rc=$? set -e if [[ $rc -eq 0 ]]; then echo " ok $sym $addr" elif echo "$out" | grep -qiE 'already verified|Already Verified'; then echo " already verified $sym $addr" else echo " FAILED $sym $addr (exit $rc)" >&2 echo "$out" >&2 return "$rc" fi } echo "=== Verify Mainnet CompliantWrappedToken (admin=$ADMIN) ===" # envVar|constructor name|symbol — must match DeployCWTokens.s.sol while IFS='|' read -r envkey cname sym; do [[ -z "$envkey" ]] && continue verify_one "$envkey" "$cname" "$sym" done <<'EOF' CWUSDT_MAINNET|Wrapped cUSDT|cWUSDT CWUSDC_MAINNET|Wrapped cUSDC|cWUSDC CWEURC_MAINNET|Wrapped cEURC|cWEURC CWEURT_MAINNET|Wrapped cEURT|cWEURT CWGBPC_MAINNET|Wrapped cGBPC|cWGBPC CWGBPT_MAINNET|Wrapped cGBPT|cWGBPT CWAUDC_MAINNET|Wrapped cAUDC|cWAUDC CWJPYC_MAINNET|Wrapped cJPYC|cWJPYC CWCHFC_MAINNET|Wrapped cCHFC|cWCHFC CWCADC_MAINNET|Wrapped cCADC|cWCADC CWXAUC_MAINNET|Wrapped cXAUC|cWXAUC CWXAUT_MAINNET|Wrapped cXAUT|cWXAUT EOF echo "Done."