diff --git a/contracts/.env.example b/contracts/.env.example new file mode 100644 index 0000000..fc3fb1c --- /dev/null +++ b/contracts/.env.example @@ -0,0 +1,50 @@ +# ----------------------------------------------------------------------------- +# LensMint Camera — Foundry deployment environment (example only) +# ----------------------------------------------------------------------------- +# Copy this to `contracts/.env` (and DO NOT commit `contracts/.env`). +# +# IMPORTANT +# - Never put private keys directly into this file. +# - The signer for broadcasting is passed to `forge script` via CLI flags: +# --account (Foundry/cast account name) +# OR --keystore + --password-file +# - This .env file is for public configuration like RPC URLs and verifier params. + +# RPC URLs (used by deployMultichain.sh per network name) +SEPOLIA_RPC_URL="https://YOUR_SEPOLIA_RPC_URL" +MAINNET_RPC_URL="https://YOUR_MAINNET_RPC_URL" + +# Optional networks (deployMultichain.sh will look for _RPC_URL) +ARBITRUM_RPC_URL="https://YOUR_ARBITRUM_RPC_URL" +POLYGON_RPC_URL="https://YOUR_POLYGON_RPC_URL" +BASE_RPC_URL="https://YOUR_BASE_RPC_URL" + +# ----------------------------------------------------------------------------- +# LensMintVerifier (only required if you deploy target "verifier") +# These are read by Solidity scripts via: +# vm.envString / vm.envBytes32 / vm.envOr +# ----------------------------------------------------------------------------- +EXPECTED_URL="https://lensmint.onrender.com/api/metadata/" # must match the contract's expected URL pattern + +# bytes32 values (0x... 32-byte hex) +ZK_PROVER_GUEST_ID="0x0000000000000000000000000000000000000000000000000000000000000000" +NOTARY_KEY_FINGERPRINT="0x0000000000000000000000000000000000000000000000000000000000000000" +QUERIES_HASH="0x000000000000000000000000000000000000000000000000000000000000000000" + +# Optional: if set, DeployVerifier will reuse an existing RISC Zero verifier address +RISC_ZERO_VERIFIER_ADDRESS="0x0000000000000000000000000000000000000000" + +# ----------------------------------------------------------------------------- +# Etherscan verification (only if you pass --verify) +# ----------------------------------------------------------------------------- +# Must match foundry.toml's [etherscan] section keys. +ETHERSCAN_API_KEY="YOUR_ETHERSCAN_API_KEY" + +# ----------------------------------------------------------------------------- +# Optional defaults for deployMultichain.sh (all can be overridden by CLI) +# ----------------------------------------------------------------------------- +# NETWORKS="sepolia" +# DEPLOY_TARGETS="core" +# BROADCAST="true" +# VERIFY="false" + diff --git a/contracts/deployMultichain.sh b/contracts/deployMultichain.sh new file mode 100755 index 0000000..5a25b19 --- /dev/null +++ b/contracts/deployMultichain.sh @@ -0,0 +1,263 @@ +#!/usr/bin/env bash + +set -euo pipefail + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Defaults (can be overridden by flags or env) +NETWORKS="${NETWORKS:-sepolia}" +TARGETS="${DEPLOY_TARGETS:-core}" +BROADCAST="${BROADCAST:-true}" +DO_VERIFY="${VERIFY:-false}" + +# Signer (CLI) +ACCOUNT="" +KEYSTORE="" +PASSWORD="" +PASSWORD_FILE="" +PRIVATE_KEY_CLI="" + +# Verifier params (flags override env) +FLAG_EXPECTED_URL="" +FLAG_ZK_PROVER_GUEST_ID="" +FLAG_NOTARY_KEY_FINGERPRINT="" +FLAG_QUERIES_HASH="" +FLAG_RISC_ZERO_VERIFIER="" + +while [[ $# -gt 0 ]]; do + case $1 in + --networks) + NETWORKS="$2" + shift 2 + ;; + --targets) + TARGETS="$2" + shift 2 + ;; + --no-broadcast) + BROADCAST="false" + shift + ;; + --broadcast) + BROADCAST="true" + shift + ;; + --verify) + DO_VERIFY="true" + shift + ;; + --account) + ACCOUNT="$2" + shift 2 + ;; + --keystore) + KEYSTORE="$2" + shift 2 + ;; + --password) + PASSWORD="$2" + shift 2 + ;; + --password-file) + PASSWORD_FILE="$2" + shift 2 + ;; + --private-key) + PRIVATE_KEY_CLI="$2" + shift 2 + ;; + --expected-url) + FLAG_EXPECTED_URL="$2" + shift 2 + ;; + --zk-prover-guest-id) + FLAG_ZK_PROVER_GUEST_ID="$2" + shift 2 + ;; + --notary-key-fingerprint) + FLAG_NOTARY_KEY_FINGERPRINT="$2" + shift 2 + ;; + --queries-hash) + FLAG_QUERIES_HASH="$2" + shift 2 + ;; + --risc-zero-verifier) + FLAG_RISC_ZERO_VERIFIER="$2" + shift 2 + ;; + --help|-h) + cat <<'EOF' +deployMultichain.sh — deploy LensMint contracts via forge script + +USAGE + cd contracts && ./deployMultichain.sh [OPTIONS] + +OPTIONS + --networks LIST Comma-separated names (default: sepolia). Examples: sepolia,mainnet + --targets LIST core | verifier | core,verifier (default: core) + --broadcast Send txs (default) + --no-broadcast Simulate only; no signer required + --verify Pass --verify to forge (needs ETHERSCAN_API_KEY) + +SIGNER (required when broadcasting; same as forge script) + --account NAME + --keystore PATH [--password-file PATH | --password PASS] + --private-key HEX + +VERIFIER CONFIG (if --targets includes verifier; or set env vars) + --expected-url URL + --zk-prover-guest-id 0x... + --notary-key-fingerprint 0x... + --queries-hash 0x... + --risc-zero-verifier ADDR Optional existing RISC Zero verifier address + +ENVIRONMENT + SEPOLIA_RPC_URL, MAINNET_RPC_URL, ... For network name "foo", uses FOO_RPC_URL + EXPECTED_URL, ZK_PROVER_GUEST_ID, NOTARY_KEY_FINGERPRINT, QUERIES_HASH + RISC_ZERO_VERIFIER_ADDRESS (optional) + ETHERSCAN_API_KEY For --verify + NETWORKS, DEPLOY_TARGETS, BROADCAST, VERIFY Default overrides + +CAST / WALLET SETUP (example) + cast wallet import deployer --interactive + ./deployMultichain.sh --networks sepolia --account deployer + +EFFECTIVE COMMAND (per script) + forge script