Files
smom-dbis-138/docs/deployment/PAYMENT_CHANNELS_DEPLOYMENT.md
2026-03-02 12:14:09 -08:00

4.8 KiB
Raw Permalink Blame History

Payment and State Channel Manager Deployment

Status: Ready for deployment
Contracts: PaymentChannelManager (payment channels), optional GenericStateChannelManager (state channels with stateHash). Both deployable on Mainnet and Chain-138.


Overview

PaymentChannelManager enables payment channels on each chain. Deploy once per chain. Channel open/close/update transactions on Chain-138 are mirrored and anchored by the existing TransactionMirror and MainnetTether (no changes to those contracts).


Environment Variables

Variable Required Default Description
PRIVATE_KEY Yes - Deployer private key (hex, no 0x prefix or with 0x)
CHANNEL_ADMIN No Deployer address Admin for pause, setChallengeWindow, setAdmin (multisig recommended)
CHALLENGE_WINDOW_SECONDS No 86400 (24h) Challenge period for unilateral close (seconds)
ETH_MAINNET_RPC_URL Yes (Mainnet) - RPC URL for Ethereum Mainnet
CHAIN138_RPC_URL Yes (Chain-138) - RPC URL for Chain-138

Deploy to Ethereum Mainnet

export PRIVATE_KEY=<deployer_private_key>
export CHANNEL_ADMIN=0x...   # optional; multisig recommended
export CHALLENGE_WINDOW_SECONDS=86400   # optional; 24h default

forge script script/DeployPaymentChannelManager.s.sol \
  --rpc-url $ETH_MAINNET_RPC_URL \
  --broadcast \
  --verify

After deployment, set in frontend config:

  • CONTRACT_ADDRESSES.mainnet.PAYMENT_CHANNEL_MANAGER = <deployed_address>

Optional Generic state channels (stateHash):

forge script script/DeployGenericStateChannelManager.s.sol \
  --rpc-url $ETH_MAINNET_RPC_URL \
  --broadcast \
  --verify

Set CONTRACT_ADDRESSES.mainnet.GENERIC_STATE_CHANNEL_MANAGER (and chain138 if deployed) if you use the generic state channel manager in the frontend.


Deploy to Chain-138

export PRIVATE_KEY=<deployer_private_key>
export CHANNEL_ADMIN=0x...
export CHALLENGE_WINDOW_SECONDS=86400   # optional

forge script script/DeployPaymentChannelManager.s.sol \
  --rpc-url $CHAIN138_RPC_URL \
  --broadcast \
  --verify

Then set:

  • CONTRACT_ADDRESSES.chain138.PAYMENT_CHANNEL_MANAGER = <deployed_address>

Verification

Verification uses the same chain as the deployment RPC. If the chain has a block explorer (Etherscan, Blockscout, etc.), pass --verify and ensure the appropriate API key is set for that chain.

Ethereum Mainnet

  • Use --verify with Forge; set ETHERSCAN_API_KEY in the environment.
  • Example: export ETHERSCAN_API_KEY=... then run the deploy script with --verify.

Chain-138

Chain-138 may use a different block explorer (e.g. Blockscout or a custom explorer). Verification steps:

  1. Identify the explorer for Chain-138 (e.g. Blockscout instance URL).
  2. Set the API key for that explorer. For Blockscout-compatible explorers, Forge often uses:
    • ETHERSCAN_API_KEY if the explorer is Etherscan-compatible, or
    • A chain-specific key (e.g. BLOCKSCOUT_API_KEY or the explorers env var documented in Foundry book Verify).
  3. RPC and chain ID: Use --rpc-url $CHAIN138_RPC_URL so Forge uses Chain-138 for verification. Ensure the deployment scripts chain ID matches (e.g. 138).
  4. If the explorer is not Etherscan-compatible, check Foundrys foundry.toml or docs for [etherscan] blocks and the correct key / url for your chain.

Document the exact env vars and foundry.toml snippet for Chain-138 in your runbook once the explorer is chosen.


Security Recommendations

  • Use a multisig (e.g. Gnosis Safe) for CHANNEL_ADMIN.
  • Keep challenge window short enough to limit griefing (e.g. 24h); document that participants or a watchtower must respond within the window.
  • Test on testnets (Mainnet fork and Chain-138 testnet if available) before mainnet.

Gas (Approximate)

  • Deployment: ~1.5M gas
  • openChannel: ~175k gas
  • fundChannel: ~60k gas
  • closeChannelCooperative: ~240k gas
  • submitClose: ~150k gas
  • challengeClose: ~180k gas
  • finalizeClose: ~100k gas