version: '3.7'

services:
  # Generates and funds the accounts required when setting up the L2 chain (outputs to volume l2_accounts)
  # Creates / updates the configuration for L1 contracts deployment
  # Deploys the L1 smart contracts (outputs to volume l1_deployment)
  fixturenet-optimism-contracts:
    hostname: fixturenet-optimism-contracts
    image: cerc/optimism-contracts:local
    env_file:
      - ../config/fixturenet-optimism/l1-params.env
    environment:
      CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG}
      CERC_L1_CHAIN_ID: ${CERC_L1_CHAIN_ID}
      CERC_L1_RPC: ${CERC_L1_RPC}
      CERC_L1_ACCOUNTS_CSV_URL: ${CERC_L1_ACCOUNTS_CSV_URL}
      CERC_L1_ADDRESS: ${CERC_L1_ADDRESS}
      CERC_L1_PRIV_KEY: ${CERC_L1_PRIV_KEY}
      CERC_L1_ADDRESS_2: ${CERC_L1_ADDRESS_2}
      CERC_L1_PRIV_KEY_2: ${CERC_L1_PRIV_KEY_2}
    # Waits for L1 endpoint to be up before running the script
    command: |
      "./wait-for-it.sh -h ${CERC_L1_HOST:-$${DEFAULT_CERC_L1_HOST}} -p ${CERC_L1_PORT:-$${DEFAULT_CERC_L1_PORT}} -s -t 60 -- ./run.sh"
    volumes:
      - ../config/wait-for-it.sh:/app/packages/contracts-bedrock/wait-for-it.sh
      - ../container-build/cerc-optimism-contracts/hardhat-tasks/verify-contract-deployment.ts:/app/packages/contracts-bedrock/tasks/verify-contract-deployment.ts
      - ../container-build/cerc-optimism-contracts/hardhat-tasks/rekey-json.ts:/app/packages/contracts-bedrock/tasks/rekey-json.ts
      - ../container-build/cerc-optimism-contracts/hardhat-tasks/send-balance.ts:/app/packages/contracts-bedrock/tasks/send-balance.ts
      - ../config/fixturenet-optimism/optimism-contracts/update-config.js:/app/packages/contracts-bedrock/update-config.js
      - ../config/fixturenet-optimism/optimism-contracts/run.sh:/app/packages/contracts-bedrock/run.sh
      - l2_accounts:/l2-accounts
      - l1_deployment:/app/packages/contracts-bedrock
    extra_hosts:
      - "host.docker.internal:host-gateway"

  # Generates the config files required for L2 (outputs to volume l2_config)
  op-node-l2-config-gen:
    image: cerc/optimism-op-node:local
    depends_on:
      fixturenet-optimism-contracts:
        condition: service_completed_successfully
    env_file:
      - ../config/fixturenet-optimism/l1-params.env
    environment:
      CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG}
      CERC_L1_RPC: ${CERC_L1_RPC}
    volumes:
      - ../config/fixturenet-optimism/generate-l2-config.sh:/app/generate-l2-config.sh
      - l1_deployment:/contracts-bedrock:ro
      - l2_config:/app
    command: ["sh", "/app/generate-l2-config.sh"]
    extra_hosts:
      - "host.docker.internal:host-gateway"

  # Initializes and runs the L2 execution client  (outputs to volume l2_geth_data)
  op-geth:
    image: cerc/optimism-l2geth:local
    depends_on:
      op-node-l2-config-gen:
        condition: service_started
    volumes:
      - ../config/fixturenet-optimism/run-op-geth.sh:/run-op-geth.sh
      - l2_config:/op-node:ro
      - l2_accounts:/l2-accounts:ro
      - l2_geth_data:/datadir
    entrypoint: "sh"
    command: "/run-op-geth.sh"
    ports:
      - "0.0.0.0:8545:8545"
    healthcheck:
      test: ["CMD", "nc", "-vz", "localhost:8545"]
      interval: 30s
      timeout: 10s
      retries: 10
      start_period: 10s

  # Runs the L2 consensus client (Sequencer node)
  op-node:
    image: cerc/optimism-op-node:local
    depends_on:
      op-geth:
        condition: service_healthy
    env_file:
      - ../config/fixturenet-optimism/l1-params.env
    environment:
      CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG}
      CERC_L1_RPC: ${CERC_L1_RPC}
    volumes:
      - ../config/fixturenet-optimism/run-op-node.sh:/app/run-op-node.sh
      - l2_config:/op-node-data:ro
      - l2_accounts:/l2-accounts:ro
    command: ["sh", "/app/run-op-node.sh"]
    ports:
      - "0.0.0.0:8547:8547"
    healthcheck:
      test: ["CMD", "nc", "-vz", "localhost:8547"]
      interval: 30s
      timeout: 10s
      retries: 10
      start_period: 10s
    extra_hosts:
      - "host.docker.internal:host-gateway"

  # Runs the batcher (takes transactions from the Sequencer and publishes them to L1)
  op-batcher:
    image: cerc/optimism-op-batcher:local
    depends_on:
      op-node:
        condition: service_healthy
      op-geth:
        condition: service_healthy
    env_file:
      - ../config/fixturenet-optimism/l1-params.env
    environment:
      CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG}
      CERC_L1_RPC: ${CERC_L1_RPC}
    volumes:
      - ../config/wait-for-it.sh:/wait-for-it.sh
      - ../config/fixturenet-optimism/run-op-batcher.sh:/run-op-batcher.sh
      - l2_accounts:/l2-accounts:ro
    entrypoint: ["sh", "-c"]
    # Waits for L1 endpoint to be up before running the batcher
    command: |
      "/wait-for-it.sh -h ${CERC_L1_HOST:-$${DEFAULT_CERC_L1_HOST}} -p ${CERC_L1_PORT:-$${DEFAULT_CERC_L1_PORT}} -s -t 60 -- /run-op-batcher.sh"
    ports:
      - "127.0.0.1:8548:8548"
    extra_hosts:
      - "host.docker.internal:host-gateway"

  # Runs the proposer (periodically submits new state roots to L1)
  op-proposer:
    image: cerc/optimism-op-proposer:local
    depends_on:
      op-node:
        condition: service_healthy
    env_file:
      - ../config/fixturenet-optimism/l1-params.env
    environment:
      CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG}
      CERC_L1_RPC: ${CERC_L1_RPC}
    volumes:
      - ../config/wait-for-it.sh:/wait-for-it.sh
      - ../config/fixturenet-optimism/run-op-proposer.sh:/run-op-proposer.sh
      - l1_deployment:/contracts-bedrock:ro
      - l2_accounts:/l2-accounts:ro
    entrypoint: ["sh", "-c"]
    # Waits for L1 endpoint to be up before running the proposer
    command: |
      "/wait-for-it.sh -h ${CERC_L1_HOST:-$${DEFAULT_CERC_L1_HOST}} -p ${CERC_L1_PORT:-$${DEFAULT_CERC_L1_PORT}} -s -t 60 -- /run-op-proposer.sh"
    ports:
      - "127.0.0.1:8560:8560"
    extra_hosts:
      - "host.docker.internal:host-gateway"

volumes:
  l1_deployment:
  l2_accounts:
  l2_config:
  l2_geth_data:
