Some checks failed
CI/CD Pipeline / Lint and Format (push) Failing after 46s
CI/CD Pipeline / Terraform Validation (push) Failing after 35s
CI/CD Pipeline / Kubernetes Validation (push) Successful in 37s
Deploy ChainID 138 / Deploy ChainID 138 (push) Failing after 1m50s
HYBX OMNL TypeScript & anchor / token-aggregation build + reconcile artifact (push) Failing after 2m19s
Validation / validate-genesis (push) Successful in 51s
Validation / validate-terraform (push) Failing after 39s
Validation / validate-kubernetes (push) Failing after 10s
CI/CD Pipeline / Solidity Contracts (push) Failing after 12m56s
Validation / validate-smart-contracts (push) Failing after 12s
CI/CD Pipeline / Security Scanning (push) Failing after 15m52s
Validation / validate-security (push) Failing after 10m59s
Validation / validate-documentation (push) Failing after 17s
Validate Token List / validate (push) Failing after 30s
OMNL reconcile anchor / Run omnl:reconcile and upload artifacts (push) Failing after 26s
Verify Deployment / Verify Deployment (push) Failing after 56s
131 lines
3.8 KiB
Bash
Executable File
131 lines
3.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Verify CompliantWrappedToken (cW*) on all chains where addresses exist in .env.
|
|
# Skips CW*_MAINNET (use verify-mainnet-cw-etherscan.sh). Same constructor as DeployCWTokens.
|
|
#
|
|
# Requires: ETHERSCAN_API_KEY (Etherscan v2 / unified explorers); CRONOSCAN_API_KEY for Cronos.
|
|
# CW_VERIFY_ADMIN or PRIVATE_KEY for constructor admin address.
|
|
#
|
|
# Usage: cd smom-dbis-138 && ./scripts/deployment/verify-multichain-cw-etherscan.sh
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
cd "$PROJECT_ROOT"
|
|
|
|
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" >&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 or PRIVATE_KEY" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Uppercase chain suffix -> forge --chain name (Foundry)
|
|
forge_chain() {
|
|
case "$1" in
|
|
BSC) echo bsc ;;
|
|
POLYGON) echo polygon ;;
|
|
GNOSIS) echo gnosis ;;
|
|
OPTIMISM) echo optimism ;;
|
|
BASE) echo base ;;
|
|
ARBITRUM) echo arbitrum ;;
|
|
AVALANCHE) echo avalanche ;;
|
|
CELO) echo celo ;;
|
|
CRONOS) echo cronos ;;
|
|
*) echo "" ;;
|
|
esac
|
|
}
|
|
|
|
# API key for forge (Cronos uses cronoscan)
|
|
api_key_for() {
|
|
case "$1" in
|
|
CRONOS) echo "${CRONOSCAN_API_KEY:-}" ;;
|
|
*) echo "${ETHERSCAN_API_KEY}" ;;
|
|
esac
|
|
}
|
|
|
|
# cWUSDT -> Wrapped cUSDT / cWUSDT
|
|
name_sym_from_cw() {
|
|
local cw="$1"
|
|
local core="${cw#CW}"
|
|
echo "Wrapped c${core}|cW${core}"
|
|
}
|
|
|
|
OK=0
|
|
SKIP=0
|
|
FAIL=0
|
|
|
|
while IFS= read -r line; do
|
|
[[ "$line" =~ ^CW[A-Z0-9]+_[A-Z0-9]+= ]] || continue
|
|
key="${line%%=*}"
|
|
addr="${line#*=}"
|
|
[[ -z "$addr" || "$addr" == "0x0000000000000000000000000000000000000000" ]] && continue
|
|
chain="${key##*_}"
|
|
[[ "$chain" == "MAINNET" ]] && continue
|
|
# Cronos: Foundry + Etherscan API v2 often errors ("chainid"); use verify-cronos-contracts.sh or explorer.cronos.org manual upload.
|
|
[[ "$chain" == "CRONOS" ]] && { echo " skip $key (Cronos: use verify-cronos-contracts.sh or CRONOS_VERIFICATION_RUNBOOK)"; SKIP=$((SKIP + 1)); continue; }
|
|
|
|
fc="$(forge_chain "$chain")"
|
|
if [[ -z "$fc" ]]; then
|
|
echo " skip $key (unknown chain suffix $chain)"
|
|
SKIP=$((SKIP + 1))
|
|
continue
|
|
fi
|
|
|
|
api="$(api_key_for "$chain")"
|
|
if [[ -z "$api" ]]; then
|
|
echo " skip $key (no API key for $chain; set CRONOSCAN_API_KEY for Cronos)" >&2
|
|
SKIP=$((SKIP + 1))
|
|
continue
|
|
fi
|
|
|
|
cwpart="${key%_*}"
|
|
IFS='|' read -r cname sym <<< "$(name_sym_from_cw "$cwpart")"
|
|
enc="$(cast abi-encode "constructor(string,string,uint8,address)" "$cname" "$sym" 6 "$ADMIN")"
|
|
|
|
echo "[$fc] $sym $addr ..."
|
|
set +e
|
|
out="$(forge verify-contract \
|
|
--chain "$fc" \
|
|
--num-of-optimizations 200 \
|
|
--via-ir \
|
|
--constructor-args "$enc" \
|
|
--etherscan-api-key "$api" \
|
|
"$addr" \
|
|
"contracts/tokens/CompliantWrappedToken.sol:CompliantWrappedToken" 2>&1)"
|
|
rc=$?
|
|
set -e
|
|
if [[ $rc -eq 0 ]]; then
|
|
echo " ok"
|
|
OK=$((OK + 1))
|
|
elif echo "$out" | grep -qiE 'already verified|Already Verified|Contract source code already verified'; then
|
|
echo " already verified"
|
|
OK=$((OK + 1))
|
|
else
|
|
echo " FAILED (exit $rc)" >&2
|
|
echo "$out" >&2
|
|
FAIL=$((FAIL + 1))
|
|
fi
|
|
sleep 1
|
|
done < <(env | grep '^CW[A-Z0-9]*_' | sort)
|
|
|
|
echo ""
|
|
echo "=== multichain cW*: ok/already=$OK skipped=$SKIP failed=$FAIL ==="
|