Files
smom-dbis-138/scripts/deployment/verify-mainnet-cw-bridge-etherscan.sh
defiQUG 78edb86c3b
Some checks failed
CI/CD Pipeline / Solidity Contracts (push) Failing after 1m25s
CI/CD Pipeline / Security Scanning (push) Successful in 3m28s
CI/CD Pipeline / Lint and Format (push) Failing after 43s
CI/CD Pipeline / Terraform Validation (push) Failing after 25s
CI/CD Pipeline / Kubernetes Validation (push) Successful in 28s
Deploy ChainID 138 / Deploy ChainID 138 (push) Failing after 45s
HYBX OMNL TypeScript & anchor / token-aggregation build + reconcile artifact (push) Failing after 29s
Validation / validate-genesis (push) Successful in 32s
Validation / validate-terraform (push) Failing after 30s
Validation / validate-kubernetes (push) Failing after 10s
Validation / validate-smart-contracts (push) Failing after 10s
Validation / validate-security (push) Failing after 1m36s
Validation / validate-documentation (push) Failing after 17s
Verify Deployment / Verify Deployment (push) Failing after 48s
Add mainnet cWBTC token-aggregation indexing, supply proof, and Etherscan verify scripts.
Wire live 0x2BBe3c… address into canonical tokens, pool catalog merge from mesh health, and bridge/cWBTC explorer verification helpers.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-13 12:35:15 -07:00

121 lines
3.9 KiB
Bash
Executable File

#!/usr/bin/env bash
# Verify Ethereum Mainnet CWMultiTokenBridgeL2 (CW_BRIDGE_MAINNET) on Etherscan.
#
# Constructor: (sendRouter, receiveRouter, feeToken) — read from chain if unset.
#
# Usage:
# cd smom-dbis-138 && ./scripts/deployment/verify-mainnet-cw-bridge-etherscan.sh
# ./scripts/deployment/verify-mainnet-cw-bridge-etherscan.sh --dry-run
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
[[ -n "${ETHERSCAN_API_KEY:-}" ]] || {
echo "ETHERSCAN_API_KEY not set" >&2
exit 1
}
RPC="${ETHEREUM_MAINNET_RPC:-${ETH_MAINNET_RPC_URL:-https://ethereum-rpc.publicnode.com}}"
BRIDGE="${CW_BRIDGE_MAINNET:-0x2bF74583206A49Be07E0E8A94197C12987AbD7B5}"
fetch_creation_ctor() {
python3 - "$BRIDGE" "$ETHERSCAN_API_KEY" <<'PY'
import json, sys, urllib.request
bridge, api_key = sys.argv[1:3]
url = (
"https://api.etherscan.io/v2/api?chainid=1&module=contract&action=getcontractcreation"
f"&contractaddresses={bridge}&apikey={api_key}"
)
with urllib.request.urlopen(url, timeout=30) as resp:
doc = json.load(resp)
rows = doc.get("result") or []
if not rows:
raise SystemExit("Etherscan getcontractcreation returned no rows")
creation = (rows[0].get("creationBytecode") or "").lower().removeprefix("0x")
if len(creation) < 192:
raise SystemExit("creationBytecode too short")
# constructor args are last 3 x 32-byte words
args_hex = creation[-192:]
words = [args_hex[i : i + 64] for i in range(0, 192, 64)]
for w in words:
print("0x" + w[-40:])
PY
}
SEND="${CW_BRIDGE_MAINNET_SEND_ROUTER:-}"
RECV="${CW_BRIDGE_MAINNET_RECEIVE_ROUTER:-}"
FEE="${CW_BRIDGE_MAINNET_FEE_TOKEN:-}"
if [[ -z "$SEND" || -z "$RECV" || -z "$FEE" ]]; then
mapfile -t _CTOR_ADDRS < <(fetch_creation_ctor 2>/dev/null || true)
if [[ ${#_CTOR_ADDRS[@]} -eq 3 ]]; then
SEND="${_CTOR_ADDRS[0]}"
RECV="${_CTOR_ADDRS[1]}"
FEE="${_CTOR_ADDRS[2]}"
echo "Using deployment-time constructor args from Etherscan creation tx"
else
SEND="$(cast call "$BRIDGE" 'sendRouter()(address)' --rpc-url "$RPC")"
RECV="$(cast call "$BRIDGE" 'receiveRouter()(address)' --rpc-url "$RPC")"
FEE="$(cast call "$BRIDGE" 'feeToken()(address)' --rpc-url "$RPC")"
echo "WARN: using live on-chain router fields (may differ from deploy immutables)" >&2
fi
fi
CTOR="$(cast abi-encode 'constructor(address,address,address)' "$SEND" "$RECV" "$FEE")"
echo "=== Verify CWMultiTokenBridgeL2 (CW_BRIDGE_MAINNET) ==="
echo " bridge=$BRIDGE"
echo " sendRouter=$SEND"
echo " receiveRouter=$RECV"
echo " feeToken=$FEE"
export FOUNDRY_SRC="contracts/bridge,contracts/interfaces"
export FOUNDRY_OUT="out/scopes/bridge"
export FOUNDRY_CACHE_PATH="cache/scopes/bridge"
if $DRY_RUN; then
echo "forge verify-contract --chain-id 1 --num-of-optimizations 200 --via-ir \\"
echo " --constructor-args \"$CTOR\" --etherscan-api-key \"\$ETHERSCAN_API_KEY\" \\"
echo " \"$BRIDGE\" contracts/bridge/CWMultiTokenBridgeL2.sol:CWMultiTokenBridgeL2"
exit 0
fi
bash "$PROJECT_ROOT/scripts/forge/scope.sh" build bridge -q
set +e
out="$(forge verify-contract \
--chain-id 1 \
--num-of-optimizations 200 \
--via-ir \
--constructor-args "$CTOR" \
--etherscan-api-key "$ETHERSCAN_API_KEY" \
"$BRIDGE" \
"contracts/bridge/CWMultiTokenBridgeL2.sol:CWMultiTokenBridgeL2" 2>&1)"
rc=$?
set -e
echo "$out"
if [[ $rc -eq 0 ]] || echo "$out" | grep -qiE 'already verified|Contract source code already verified'; then
echo "OK: https://etherscan.io/address/$BRIDGE#code"
exit 0
fi
exit "$rc"