341 lines
13 KiB
Bash
Executable File
341 lines
13 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Deploy WETH9/WETH10 + CCIP bridges (and optionally Cronos D-WIN W) to all blockchains
|
|
# unless a canonical/pre-existing deployment is already present in .env.
|
|
#
|
|
# Deploys:
|
|
# - WETH9, WETH10, CCIPWETH9Bridge, CCIPWETH10Bridge (via DeployAll.s.sol) on each chain
|
|
# where WETH9_<CHAIN> and WETH10_<CHAIN> are not both set.
|
|
# - On Cronos (25): optionally ISO-4217 W system (USDW, EURW, ...) if not already deployed.
|
|
# - With --deploy-c: cUSDT/cUSDC (and optional c*) on each chain where CUSDT_<CHAIN>/CUSDC_<CHAIN> unset (via DeployCompliantFiatTokensForChain.s.sol).
|
|
# - With --deploy-cw: cWUSDT/cWUSDC on each chain where CWUSDT_<CHAIN> unset (via DeployCWTokens.s.sol; set CW_BRIDGE_ADDRESS or CW_BRIDGE_<CHAIN>).
|
|
# - Chain 651940 (ALL Mainnet): env validation only (check AUSDT_ADDRESS_651940 set); no token deploy from this repo.
|
|
#
|
|
# Skips:
|
|
# - Ethereum Mainnet (1): uses canonical WETH from .env (WETH9_MAINNET, WETH10_MAINNET).
|
|
# - Any chain where both WETH9_* and WETH10_* are already set in .env.
|
|
# - Chain 138: not in DeployAll; compliant tokens (c*) are deployed separately on 138.
|
|
#
|
|
# Usage:
|
|
# cd smom-dbis-138 && ./scripts/deployment/deploy-tokens-and-weth-all-chains-skip-canonical.sh [OPTIONS]
|
|
#
|
|
# Options:
|
|
# --dry-run Print commands only; do not broadcast.
|
|
# --chain 25 56 137 Deploy only to these chain IDs (default: all supported).
|
|
# --no-iso4217 Do not deploy ISO-4217 W system on Cronos even if missing.
|
|
# --iso4217-only Only run Cronos ISO-4217 W deploy (skip DeployAll).
|
|
# --deploy-c Deploy cUSDT/cUSDC (and optional c*) on chains where CUSDT_<CHAIN>/CUSDC_<CHAIN> unset (skip 138, 1).
|
|
# --deploy-cw Deploy cWUSDT/cWUSDC on chains where CWUSDT_<CHAIN> unset; requires CW_BRIDGE_ADDRESS or CW_BRIDGE_<CHAIN> in .env.
|
|
#
|
|
# Requires: .env with PRIVATE_KEY; per-chain RPC and CCIP vars for chains you deploy to.
|
|
# See: docs/11-references/TOKENS_DEPLOYER_DEPLOYED_ON_OTHER_CHAINS.md
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
cd "$PROJECT_ROOT"
|
|
|
|
[ -f .env ] && set -a && source .env && set +a
|
|
|
|
DRY_RUN=false
|
|
CHAINS_FILTER=""
|
|
NO_ISO4217=false
|
|
ISO4217_ONLY=false
|
|
DEPLOY_C=false
|
|
DEPLOY_CW=false
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--dry-run) DRY_RUN=true; shift ;;
|
|
--no-iso4217) NO_ISO4217=true; shift ;;
|
|
--iso4217-only) ISO4217_ONLY=true; shift ;;
|
|
--deploy-c) DEPLOY_C=true; shift ;;
|
|
--deploy-cw) DEPLOY_CW=true; shift ;;
|
|
--chain)
|
|
shift
|
|
CHAINS_FILTER="$*"
|
|
break
|
|
;;
|
|
*) shift ;;
|
|
esac
|
|
done
|
|
|
|
# Chain ID : Name : RPC env var (primary)
|
|
# DeployAll.s.sol supports: 1, 25, 56, 137, 100, 43114, 8453, 42161, 10. 651940 = env validation only.
|
|
ALL_CHAINS="1:Mainnet:ETH_MAINNET_RPC_URL 25:Cronos:CRONOS_RPC_URL 56:BSC:BSC_RPC_URL 137:Polygon:POLYGON_RPC_URL 100:Gnosis:GNOSIS_RPC_URL 43114:Avalanche:AVALANCHE_RPC_URL 8453:Base:BASE_RPC_URL 42161:Arbitrum:ARBITRUM_RPC_URL 10:Optimism:OPTIMISM_RPC_URL 651940:ALL:CHAIN_651940_RPC"
|
|
|
|
# Fallback RPC env names (some scripts use different names)
|
|
fallback_rpc() {
|
|
local chain_id="$1"
|
|
local rpc_var="$2"
|
|
local rpc="${!rpc_var:-}"
|
|
if [[ -z "$rpc" ]]; then
|
|
case "$chain_id" in
|
|
1) rpc="${ETHEREUM_MAINNET_RPC:-${ETH_MAINNET_RPC_URL:-}}";;
|
|
25) rpc="${CRONOS_RPC:-}";;
|
|
56) rpc="${BSC_RPC_URL:-}";;
|
|
137) rpc="${POLYGON_MAINNET_RPC:-}";;
|
|
100) rpc="${GNOSIS_RPC:-}";;
|
|
43114) rpc="${AVALANCHE_RPC_URL:-}";;
|
|
8453) rpc="${BASE_MAINNET_RPC:-}";;
|
|
42161) rpc="${ARBITRUM_MAINNET_RPC:-}";;
|
|
10) rpc="${OPTIMISM_MAINNET_RPC:-}";;
|
|
651940) rpc="${CHAIN_651940_RPC:-${ALL_MAINNET_RPC:-}}";;
|
|
esac
|
|
fi
|
|
echo "$rpc"
|
|
}
|
|
|
|
is_canonical_present() {
|
|
local weth9_var="$1"
|
|
local weth10_var="$2"
|
|
local w9="${!weth9_var:-}"
|
|
local w10="${!weth10_var:-}"
|
|
w9="${w9//0x/}"
|
|
w10="${w10//0x/}"
|
|
[[ -n "$w9" && "${#w9}" -ge 40 && "$w9" != "0000000000000000000000000000000000000000" ]] && \
|
|
[[ -n "$w10" && "${#w10}" -ge 40 && "$w10" != "0000000000000000000000000000000000000000" ]] && return 0
|
|
return 1
|
|
}
|
|
|
|
run_cmd() {
|
|
if $DRY_RUN; then
|
|
echo " [DRY-RUN] $*"
|
|
else
|
|
eval "$@" || return 1
|
|
fi
|
|
}
|
|
|
|
# ---------- DeployAll (WETH9, WETH10, CCIP bridges) per chain ----------
|
|
run_deploy_all() {
|
|
local chain_id="$1"
|
|
local name="$2"
|
|
local rpc_var="$3"
|
|
if [[ "$chain_id" == "651940" ]]; then
|
|
echo " Skip $name (chain 651940): DeployAll not supported; env validation only."
|
|
return 0
|
|
fi
|
|
local rpc
|
|
rpc=$(fallback_rpc "$chain_id" "$rpc_var")
|
|
if [[ -z "$rpc" ]]; then
|
|
echo " Skip $name (chain $chain_id): RPC not set ($rpc_var)."
|
|
return 0
|
|
fi
|
|
|
|
local weth9_var="WETH9_MAINNET" weth10_var="WETH10_MAINNET"
|
|
case "$chain_id" in
|
|
1) weth9_var="WETH9_MAINNET"; weth10_var="WETH10_MAINNET" ;;
|
|
25) weth9_var="WETH9_CRONOS"; weth10_var="WETH10_CRONOS" ;;
|
|
56) weth9_var="WETH9_BSC"; weth10_var="WETH10_BSC" ;;
|
|
137) weth9_var="WETH9_POLYGON"; weth10_var="WETH10_POLYGON" ;;
|
|
100) weth9_var="WETH9_GNOSIS"; weth10_var="WETH10_GNOSIS" ;;
|
|
43114) weth9_var="WETH9_AVALANCHE"; weth10_var="WETH10_AVALANCHE" ;;
|
|
8453) weth9_var="WETH9_BASE"; weth10_var="WETH10_BASE" ;;
|
|
42161) weth9_var="WETH9_ARBITRUM"; weth10_var="WETH10_ARBITRUM" ;;
|
|
10) weth9_var="WETH9_OPTIMISM"; weth10_var="WETH10_OPTIMISM" ;;
|
|
*) echo " Unsupported chain ID $chain_id"; return 1 ;;
|
|
esac
|
|
|
|
# Mainnet: use canonical WETH from .env; DeployAll only deploys CCIPLogger (placeholder). Skip to avoid requiring env.
|
|
if [[ "$chain_id" == "1" ]]; then
|
|
if is_canonical_present "$weth9_var" "$weth10_var"; then
|
|
echo " Skip $name (chain $chain_id): canonical WETH9/WETH10 already set."
|
|
return 0
|
|
fi
|
|
echo " Skip $name (chain $chain_id): set WETH9_MAINNET and WETH10_MAINNET in .env for canonical WETH; DeployAll on Mainnet does not deploy tokens."
|
|
return 0
|
|
fi
|
|
|
|
if is_canonical_present "$weth9_var" "$weth10_var"; then
|
|
echo " Skip $name (chain $chain_id): WETH9/WETH10 already set in .env."
|
|
return 0
|
|
fi
|
|
|
|
echo " Deploying WETH9, WETH10, CCIP bridges on $name (chain $chain_id)..."
|
|
local gas_opts="--legacy"
|
|
run_cmd "forge script script/DeployAll.s.sol:DeployAll --rpc-url \"$rpc\" --chain-id \"$chain_id\" --broadcast --private-key \"\$PRIVATE_KEY\" $gas_opts -vvv" || true
|
|
echo " → Set WETH9_${name^^}, WETH10_${name^^}, CCIPWETH9_BRIDGE_${name^^}, CCIPWETH10_BRIDGE_${name^^} in .env from script output."
|
|
}
|
|
|
|
# ---------- ISO-4217 W (Cronos): deploy only if USDW not already deployed ----------
|
|
run_iso4217_cronos() {
|
|
if $NO_ISO4217; then
|
|
echo " Skip Cronos ISO-4217 W (--no-iso4217)."
|
|
return 0
|
|
fi
|
|
|
|
local rpc
|
|
rpc=$(fallback_rpc 25 "CRONOS_RPC_URL")
|
|
[[ -z "$rpc" ]] && rpc="${CRONOS_RPC:-}"
|
|
if [[ -z "$rpc" ]]; then
|
|
echo " Skip Cronos ISO-4217 W: CRONOS_RPC_URL / CRONOS_RPC not set."
|
|
return 0
|
|
fi
|
|
|
|
local usdw_addr="0x948690147D2e50ffe50C5d38C14125aD6a9FA036"
|
|
local code_len
|
|
code_len=$(cast code "$usdw_addr" --rpc-url "$rpc" 2>/dev/null | wc -c)
|
|
if [[ -n "$code_len" && "$code_len" -gt 10 ]]; then
|
|
echo " Skip Cronos ISO-4217 W: USDW already deployed at $usdw_addr."
|
|
return 0
|
|
fi
|
|
|
|
echo " Deploying ISO-4217 W system on Cronos (25)..."
|
|
run_cmd "forge script script/deploy/iso4217w/DeployISO4217WSystem.s.sol:DeployISO4217WSystem --rpc-url \"$rpc\" --chain-id 25 --broadcast --private-key \"\$PRIVATE_KEY\" --legacy -vvv" || true
|
|
echo " → Record MintController, TokenRegistry, USDW, EURW, ... addresses from output; add to .env / docs."
|
|
}
|
|
|
|
# ---------- c* (cUSDT, cUSDC) on other chains: DeployCompliantFiatTokensForChain ----------
|
|
run_deploy_c() {
|
|
local chain_id="$1"
|
|
local name="$2"
|
|
local rpc_var="$3"
|
|
[[ "$chain_id" == "138" || "$chain_id" == "1" ]] && return 0
|
|
local rpc
|
|
rpc=$(fallback_rpc "$chain_id" "$rpc_var")
|
|
if [[ -z "$rpc" ]]; then return 0; fi
|
|
local cusdt_var="CUSDT_${name^^}" cusdc_var="CUSDC_${name^^}"
|
|
local cusdt_val="${!cusdt_var:-}" cusdc_val="${!cusdc_var:-}"
|
|
cusdt_val="${cusdt_val//0x/}"; cusdc_val="${cusdc_val//0x/}"
|
|
if [[ -n "$cusdt_val" && "${#cusdt_val}" -ge 40 ]] && [[ -n "$cusdc_val" && "${#cusdc_val}" -ge 40 ]]; then
|
|
echo " Skip c* on $name (chain $chain_id): CUSDT_${name^^} and CUSDC_${name^^} already set."
|
|
return 0
|
|
fi
|
|
echo " Deploying cUSDT/cUSDC on $name (chain $chain_id)..."
|
|
run_cmd "forge script script/deploy/DeployCompliantFiatTokensForChain.s.sol:DeployCompliantFiatTokensForChain --rpc-url \"$rpc\" --chain-id \"$chain_id\" --broadcast --private-key \"\$PRIVATE_KEY\" --legacy -vvv" || true
|
|
echo " → Set CUSDT_${name^^}, CUSDC_${name^^} in .env from script output."
|
|
}
|
|
|
|
# ---------- cW* (all 12: cWUSDT, cWUSDC, cWEURC, cWEURT, cWGBPC, cWGBPT, cWAUDC, cWJPYC, cWCHFC, cWCADC, cWXAUC, cWXAUT): DeployCWTokens ----------
|
|
run_deploy_cw() {
|
|
local chain_id="$1"
|
|
local name="$2"
|
|
local rpc_var="$3"
|
|
local rpc
|
|
rpc=$(fallback_rpc "$chain_id" "$rpc_var")
|
|
if [[ -z "$rpc" ]]; then return 0; fi
|
|
local bridge_var="CW_BRIDGE_${name^^}"
|
|
local bridge="${!bridge_var:-${CW_BRIDGE_ADDRESS:-}}"
|
|
if [[ -z "$bridge" || "$bridge" == "0x"*"0000000000000000000000000000000000000000" ]]; then
|
|
echo " Skip cW* on $name (chain $chain_id): set CW_BRIDGE_ADDRESS or CW_BRIDGE_${name^^} in .env."
|
|
return 0
|
|
fi
|
|
local cw_var="CWUSDT_${name^^}"
|
|
local cw_val="${!cw_var:-}"
|
|
cw_val="${cw_val//0x/}"
|
|
local deploy_opts=""
|
|
if [[ -n "$cw_val" && "${#cw_val}" -ge 40 ]]; then
|
|
echo " Deploying remaining cW* (cWEURC..cWXAUT) on $name (chain $chain_id) (bridge $bridge)..."
|
|
deploy_opts="DEPLOY_CWUSDT=0 DEPLOY_CWUSDC=0"
|
|
else
|
|
echo " Deploying all cW* (12 tokens) on $name (chain $chain_id) (bridge $bridge)..."
|
|
fi
|
|
local gas_opt=""
|
|
[[ "$chain_id" == "42161" && -n "${ARBITRUM_GAS_PRICE:-}" ]] && gas_opt="--with-gas-price ${ARBITRUM_GAS_PRICE}"
|
|
run_cmd "${deploy_opts:+$deploy_opts }CW_BRIDGE_ADDRESS=$bridge forge script script/deploy/DeployCWTokens.s.sol:DeployCWTokens --rpc-url \"$rpc\" --chain-id \"$chain_id\" --broadcast --private-key \"\$PRIVATE_KEY\" --legacy ${gas_opt} -vvv" || true
|
|
echo " → Set CWUSDT_*, CWUSDC_*, CWEURC_*, CWEURT_*, CWGBPC_*, CWGBPT_*, CWAUDC_*, CWJPYC_*, CWCHFC_*, CWCADC_*, CWXAUC_*, CWXAUT_* in .env from script output."
|
|
}
|
|
|
|
# ---------- 651940 (ALL Mainnet): env validation only ----------
|
|
run_651940_validate() {
|
|
local rpc
|
|
rpc=$(fallback_rpc 651940 "CHAIN_651940_RPC")
|
|
if [[ -z "$rpc" ]]; then
|
|
echo " Skip ALL (651940): CHAIN_651940_RPC not set."
|
|
return 0
|
|
fi
|
|
local ausdt_var="AUSDT_ADDRESS_651940"
|
|
local ausdt_val="${!ausdt_var:-}"
|
|
if [[ -z "$ausdt_val" || "$ausdt_val" == "0x0000000000000000000000000000000000000000" ]]; then
|
|
echo " ALL (651940): Set AUSDT_ADDRESS_651940 in .env (ecosystem token; not deployed by this script)."
|
|
else
|
|
echo " ALL (651940): AUSDT_ADDRESS_651940 set."
|
|
fi
|
|
}
|
|
|
|
# ---------- Main ----------
|
|
echo "=============================================="
|
|
echo "Deploy tokens/WETH to all chains (skip canonical)"
|
|
echo "=============================================="
|
|
echo " Dry-run: $DRY_RUN"
|
|
echo " Chain filter: ${CHAINS_FILTER:-all}"
|
|
echo " ISO-4217 on Cronos: $(! $NO_ISO4217 && ! $ISO4217_ONLY || $ISO4217_ONLY)"
|
|
echo " Deploy c* (cUSDT/cUSDC): $DEPLOY_C"
|
|
echo " Deploy cW* (cWUSDT/cWUSDC): $DEPLOY_CW"
|
|
echo ""
|
|
|
|
if [[ -z "${PRIVATE_KEY:-}" ]]; then
|
|
echo "ERROR: PRIVATE_KEY not set in .env." >&2
|
|
exit 1
|
|
fi
|
|
|
|
if ! $ISO4217_ONLY; then
|
|
echo "--- DeployAll (WETH9, WETH10, CCIP bridges) per chain ---"
|
|
for entry in $ALL_CHAINS; do
|
|
chain_id="${entry%%:*}"; rest="${entry#*:}"
|
|
name="${rest%%:*}"; rpc_var="${rest#*:}"
|
|
if [[ -n "$CHAINS_FILTER" ]]; then
|
|
echo "$CHAINS_FILTER" | grep -q "\b$chain_id\b" || continue
|
|
fi
|
|
run_deploy_all "$chain_id" "$name" "$rpc_var"
|
|
done
|
|
echo ""
|
|
fi
|
|
|
|
if ! $ISO4217_ONLY; then
|
|
if [[ -z "$CHAINS_FILTER" ]] || echo "$CHAINS_FILTER" | grep -q "\b25\b"; then
|
|
echo "--- Cronos: ISO-4217 W (USDW, EURW, ...) ---"
|
|
run_iso4217_cronos
|
|
echo ""
|
|
fi
|
|
else
|
|
echo "--- Cronos: ISO-4217 W only ---"
|
|
run_iso4217_cronos
|
|
echo ""
|
|
fi
|
|
|
|
if $DEPLOY_C; then
|
|
echo "--- Deploy c* (cUSDT/cUSDC) per chain (skip 138, 1) ---"
|
|
for entry in $ALL_CHAINS; do
|
|
chain_id="${entry%%:*}"; rest="${entry#*:}"
|
|
name="${rest%%:*}"; rpc_var="${rest#*:}"
|
|
if [[ "$chain_id" == "651940" ]]; then continue; fi
|
|
if [[ -n "$CHAINS_FILTER" ]]; then
|
|
echo "$CHAINS_FILTER" | grep -q "\b$chain_id\b" || continue
|
|
fi
|
|
run_deploy_c "$chain_id" "$name" "$rpc_var"
|
|
done
|
|
echo ""
|
|
fi
|
|
|
|
if $DEPLOY_CW; then
|
|
echo "--- Deploy cW* (cWUSDT/cWUSDC) per chain ---"
|
|
for entry in $ALL_CHAINS; do
|
|
chain_id="${entry%%:*}"; rest="${entry#*:}"
|
|
name="${rest%%:*}"; rpc_var="${rest#*:}"
|
|
if [[ "$chain_id" == "651940" ]]; then continue; fi
|
|
if [[ -n "$CHAINS_FILTER" ]]; then
|
|
echo "$CHAINS_FILTER" | grep -q "\b$chain_id\b" || continue
|
|
fi
|
|
run_deploy_cw "$chain_id" "$name" "$rpc_var"
|
|
done
|
|
echo ""
|
|
fi
|
|
|
|
echo "--- Chain 651940 (ALL Mainnet) env validation ---"
|
|
for entry in $ALL_CHAINS; do
|
|
chain_id="${entry%%:*}"; rest="${entry#*:}"
|
|
name="${rest%%:*}"; rpc_var="${rest#*:}"
|
|
if [[ "$chain_id" != "651940" ]]; then continue; fi
|
|
if [[ -n "$CHAINS_FILTER" ]]; then
|
|
echo "$CHAINS_FILTER" | grep -q "\b651940\b" || continue
|
|
fi
|
|
run_651940_validate
|
|
break
|
|
done
|
|
echo ""
|
|
|
|
echo "=============================================="
|
|
echo "Done. Update .env with deployed addresses; see TOKENS_DEPLOYER_DEPLOYED_ON_OTHER_CHAINS.md."
|
|
echo "=============================================="
|