Files
smom-dbis-138/scripts/deployment/deploy-official-dvm-chain138.sh
defiQUG 76aa419320 feat: bridges, PMM, flash workflow, token-aggregation, and deployment docs
- CCIP/trustless bridge contracts, GRU tokens, DEX/PMM tests, reserve vault.
- Token-aggregation service routes, planner, chain config, relay env templates.
- Config snapshots and multi-chain deployment markdown updates.
- gitignore services/btc-intake/dist/ (tsc output); do not track dist.

Run forge build && forge test before deploy (large solc graph).

Made-with: Cursor
2026-04-07 23:40:52 -07:00

206 lines
6.7 KiB
Bash

#!/usr/bin/env bash
# Deploy official DODO DVM (DVMFactory + deps) to Chain 138 via DODOEX/contractV2 Truffle,
# then deploy DVMFactoryAdapter (createDVM -> createDODOVendingMachine) via Forge and update .env.
# Requires: smom-dbis-138/.env with PRIVATE_KEY, RPC_URL_138
#
# Notes:
# - The vendored DODO V2 tree contains both Solidity 0.6.9 and 0.8.x sources.
# Truffle uses a single configured compiler, so this script temporarily hides the
# unrelated 0.8.x contracts during compile/migrate, then restores them on exit.
# - Use --compile-only to verify the official DVM stack compiles cleanly before broadcast.
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
DODO_DIR="$PROJECT_ROOT/lib/dodo-contractV2"
COMPILE_ONLY=false
TRUFFLE_RESET=false
HIDDEN_ROOT="$DODO_DIR/.chain138-dvm-solc-excludes"
declare -a HIDDEN_SOL_FILES=()
usage() {
cat <<'EOF'
Usage: deploy-official-dvm-chain138.sh [--compile-only] [--reset]
Options:
--compile-only Compile the official DODO V2 DVM stack in DVM-only mode, then exit.
--reset Pass --reset to truffle migrate.
EOF
}
while [[ $# -gt 0 ]]; do
case "$1" in
--compile-only)
COMPILE_ONLY=true
shift
;;
--reset)
TRUFFLE_RESET=true
shift
;;
-h|--help)
usage
exit 0
;;
*)
echo "Unknown argument: $1" >&2
usage >&2
exit 1
;;
esac
done
prepare_dvm_only_sources() {
local rel_path
rm -rf "$HIDDEN_ROOT"
mkdir -p "$HIDDEN_ROOT"
while IFS= read -r rel_path; do
[[ -z "$rel_path" ]] && continue
mkdir -p "$HIDDEN_ROOT/$(dirname "$rel_path")"
mv "$DODO_DIR/$rel_path" "$HIDDEN_ROOT/$rel_path"
HIDDEN_SOL_FILES+=("$rel_path")
done < <(
cd "$DODO_DIR" &&
find contracts -type f -name '*.sol' -print0 |
xargs -0 grep -El 'pragma solidity (\^?0\.8|>=0\.8)' |
sort
)
if [[ ${#HIDDEN_SOL_FILES[@]} -gt 0 ]]; then
echo "Temporarily hiding ${#HIDDEN_SOL_FILES[@]} Solidity 0.8.x sources for Chain 138 DVM-only compile..."
fi
}
restore_hidden_sources() {
local rel_path
if [[ -d "$HIDDEN_ROOT" ]]; then
while IFS= read -r rel_path; do
[[ -z "$rel_path" ]] && continue
mkdir -p "$DODO_DIR/$(dirname "$rel_path")"
mv "$HIDDEN_ROOT/$rel_path" "$DODO_DIR/$rel_path"
done < <(cd "$HIDDEN_ROOT" && find contracts -type f -name '*.sol' | sort)
rm -rf "$HIDDEN_ROOT"
fi
}
trap restore_hidden_sources EXIT
cd "$PROJECT_ROOT"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
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:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
if [[ ! -f .env ]]; then
echo "ERROR: .env not found" >&2
exit 1
fi
set -a
source .env
set +a
if [[ -z "${PRIVATE_KEY:-}" ]]; then
echo "ERROR: PRIVATE_KEY not set" >&2
exit 1
fi
if [[ -z "${RPC_URL_138:-}" ]]; then
echo "ERROR: RPC_URL_138 not set" >&2
exit 1
fi
# Ensure DODO submodule has deps and compiles
if [[ ! -d "$DODO_DIR/node_modules" ]]; then
echo "Installing DODO contractV2 dependencies..."
(cd "$DODO_DIR" && npm install)
fi
# Export for Truffle (privKey without 0x for HDWalletProvider if needed)
export privKey="${PRIVATE_KEY#0x}"
export RPC_URL_138
export GAS_PRICE_138="${GAS_PRICE_138:-1000000000}"
prepare_dvm_only_sources
echo "=== Compiling official DODO V2 DVM-only subset for Chain 138 ==="
(cd "$DODO_DIR" && rm -rf build/contracts && npx truffle compile)
if [[ "$COMPILE_ONLY" == "true" ]]; then
echo "DODO V2 DVM-only compile completed successfully."
exit 0
fi
TRUFFLE_RESET_ARGS=()
if [[ "$TRUFFLE_RESET" == "true" ]]; then
TRUFFLE_RESET_ARGS+=(--reset)
fi
# Deploy Migrations (required for Truffle), then DVM stack only
echo "=== Running Truffle migration 1 (Migrations) on Chain 138 ==="
(cd "$DODO_DIR" && npx truffle migrate -f 1 --to 1 --network chain138 "${TRUFFLE_RESET_ARGS[@]}") || true
echo "=== Running Truffle migration 9 (DVM stack) on Chain 138 ==="
(cd "$DODO_DIR" && npx truffle migrate -f 9 --to 9 --network chain138 "${TRUFFLE_RESET_ARGS[@]}")
# Parse DVMFactory address from Truffle build (network id 138 as string or number)
DVM_FACTORY_ADDRESS=$(cd "$DODO_DIR" && node -e "
const fs = require('fs');
const path = require('path');
const buildPath = path.join(__dirname, 'build', 'contracts', 'DVMFactory.json');
if (!fs.existsSync(buildPath)) process.exit(1);
const j = JSON.parse(fs.readFileSync(buildPath, 'utf8'));
const n = j.networks || {};
const addr = n['138']?.address || n[138]?.address;
if (!addr) process.exit(1);
console.log(addr);
" 2>/dev/null) || true
if [[ -z "$DVM_FACTORY_ADDRESS" ]]; then
echo "Could not read DVMFactory from build. If you already deployed, set DODO_DVM_FACTORY and run:" >&2
echo " DODO_DVM_FACTORY=<dvm_factory_address> forge script script/dex/DeployDVMFactoryAdapter.s.sol:DeployDVMFactoryAdapter --rpc-url \$RPC_URL_138 --broadcast --private-key \$PRIVATE_KEY --legacy" >&2
exit 1
fi
echo "DVMFactory deployed at: $DVM_FACTORY_ADDRESS"
echo "=== Deploying DVMFactoryAdapter (createDVM wrapper) via Forge ==="
export DODO_DVM_FACTORY="$DVM_FACTORY_ADDRESS"
forge script script/dex/DeployDVMFactoryAdapter.s.sol:DeployDVMFactoryAdapter \
--rpc-url "$RPC_URL_138" --broadcast --private-key "$PRIVATE_KEY" --legacy
# Extract adapter address from broadcast (or script output)
ADAPTER_BROADCAST="$PROJECT_ROOT/broadcast/DeployDVMFactoryAdapter.s.sol/138/run-latest.json"
ADAPTER_ADDRESS=$(
node -e "
const fs = require('fs');
const path = process.argv[1];
if (!fs.existsSync(path)) process.exit(1);
const j = JSON.parse(fs.readFileSync(path, 'utf8'));
const tx = (j.transactions || []).find((entry) => entry.contractName === 'DVMFactoryAdapter' && entry.contractAddress);
if (!tx) process.exit(1);
console.log(tx.contractAddress);
" "$ADAPTER_BROADCAST" 2>/dev/null
) || true
if [[ -z "$ADAPTER_ADDRESS" ]]; then
echo "Set DODO_VENDING_MACHINE_ADDRESS to the DVMFactoryAdapter address printed above."
exit 0
fi
echo "DVMFactoryAdapter at: $ADAPTER_ADDRESS"
echo "Updating .env DODO_VENDING_MACHINE_ADDRESS=$ADAPTER_ADDRESS"
if grep -q '^DODO_VENDING_MACHINE_ADDRESS=' .env; then
sed -i "s|^DODO_VENDING_MACHINE_ADDRESS=.*|DODO_VENDING_MACHINE_ADDRESS=$ADAPTER_ADDRESS|" .env
else
echo "DODO_VENDING_MACHINE_ADDRESS=$ADAPTER_ADDRESS" >> .env
fi
echo "Done. Run scripts/deployment/run-pmm-and-pools.sh to deploy DODOPMMIntegration with the official DVM."