version: '3.4'

x-system-addr-env: &system-addr-env
  # private key: a6aecc98b63bafb0de3b29ae9964b14acb4086057808be29f90150214ebd4a0f
  # OK to publish this since it will only ever be used in itests
  SYSTEM_ADDRESS_0_DEPLOYER: '0xa961b0d6dce82db098cf70a42a14add3ee3db2d5'

  # private key: 3b8d2345102cce2443acb240db6e87c8edd4bb3f821b17fab8ea2c9da08ea132
  # OK to publish this since it will only ever be used in itests
  SYSTEM_ADDRESS_1_DEPLOYER: '0xdfc82d475833a50de90c642770f34a9db7deb725'

services:
  # this is a helper service used because there's no official hardhat image
  l1_chain:
    image: ethereumoptimism/hardhat-node:${DOCKER_TAG_HARDHAT:-latest}
    build:
      context: ./docker/hardhat
      dockerfile: Dockerfile
    env_file:
      - ./envs/l1_chain.env
    ports:
      # expose the service to the host for integration testing
      - ${L1CHAIN_HTTP_PORT:-9545}:8545

  deployer:
    depends_on:
      - l1_chain
    build:
      context: ..
      dockerfile: ./ops/docker/Dockerfile.packages
      target: deployer
    image: ethereumoptimism/deployer:${DOCKER_TAG_DEPLOYER:-latest}
    entrypoint: ./deployer.sh
    environment:
      # Env vars for the deployment script.
      CONTRACTS_RPC_URL: http://l1_chain:8545
      CONTRACTS_DEPLOYER_KEY: 'ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80'
      CONTRACTS_TARGET_NETWORK: 'local'
    ports:
      # expose the service to the host for getting the contract addrs
      - ${DEPLOYER_PORT:-8080}:8081

  dtl:
    depends_on:
      - l1_chain
      - deployer
      - l2geth
    build:
      context: ..
      dockerfile: ./ops/docker/Dockerfile.packages
      target: data-transport-layer
    image: ethereumoptimism/data-transport-layer:${DOCKER_TAG_DATA_TRANSPORT_LAYER:-latest}
    # override with the dtl script and the env vars required for it
    entrypoint: ./dtl.sh
    env_file:
      - ./envs/dtl.env
    # set the rest of the env vars for the network whcih do not
    # depend on the docker-compose setup
    environment:
      # used for setting the address manager address
      URL: http://deployer:8081/addresses.json
      # connect to the 2 layers
      DATA_TRANSPORT_LAYER__L1_RPC_ENDPOINT: http://l1_chain:8545
      DATA_TRANSPORT_LAYER__L2_RPC_ENDPOINT: http://l2geth:8545
      DATA_TRANSPORT_LAYER__SYNC_FROM_L2: 'true'
      DATA_TRANSPORT_LAYER__L2_CHAIN_ID: 17
    ports:
      - ${DTL_PORT:-7878}:7878

  l2geth:
    depends_on:
      - l1_chain
      - deployer
    build:
      context: ..
      dockerfile: ./l2geth/Dockerfile
    image: ethereumoptimism/l2geth:${DOCKER_TAG_L2GETH:-latest}
    # override with the geth script and the env vars required for it
    entrypoint: sh ./geth.sh
    env_file:
      - ./envs/geth.env
    environment:
      <<: *system-addr-env
      ETH1_HTTP: http://l1_chain:8545
      ROLLUP_TIMESTAMP_REFRESH: 5s
      ROLLUP_STATE_DUMP_PATH: http://deployer:8081/state-dump.latest.json
      # connecting to the DTL
      ROLLUP_CLIENT_HTTP: http://dtl:7878
      ETH1_CTC_DEPLOYMENT_HEIGHT: 8
      RETRIES: 60
      # no need to keep this secret, only used internally to sign blocks
      BLOCK_SIGNER_KEY: '6587ae678cf4fc9a33000cdbf9f35226b71dcc6a4684a31203241f9bcfd55d27'
      BLOCK_SIGNER_ADDRESS: '0x00000398232E2064F896018496b4b44b3D62751F'

      ROLLUP_ENFORCE_FEES: ${ROLLUP_ENFORCE_FEES:-true}
      ROLLUP_FEE_THRESHOLD_DOWN: 0.9
      ROLLUP_FEE_THRESHOLD_UP: 1.1
    ports:
      - ${L2GETH_HTTP_PORT:-8545}:8545
      - ${L2GETH_WS_PORT:-8546}:8546

  relayer:
    depends_on:
      - l1_chain
      - l2geth
    deploy:
      replicas: 0
    build:
      context: ..
      dockerfile: ./ops/docker/Dockerfile.packages
      target: message-relayer
    image: ethereumoptimism/message-relayer:${DOCKER_TAG_MESSAGE_RELAYER:-latest}
    entrypoint: ./relayer.sh
    environment:
      MESSAGE_RELAYER__L1_RPC_PROVIDER: http://l1_chain:8545
      MESSAGE_RELAYER__L2_RPC_PROVIDER: http://l2geth:8545
      MESSAGE_RELAYER__L1_WALLET: '0xdbda1821b80551c9d65939329250298aa3472ba22feea921c0cf5d620ea67b97'
      RETRIES: 60

  fault_detector:
    depends_on:
      - l1_chain
      - l2geth
    deploy:
      replicas: 0
    build:
      context: ..
      dockerfile: ./ops/docker/Dockerfile.packages
      target: fault-detector
    image: ethereumoptimism/fault-detector:${DOCKER_TAG_FAULT_DETECTOR:-latest}
    entrypoint: ./detector.sh
    environment:
      FAULT_DETECTOR__L1_RPC_PROVIDER: http://l1_chain:8545
      FAULT_DETECTOR__L2_RPC_PROVIDER: http://l2geth:8545
      RETRIES: 60

  verifier:
    depends_on:
      - l1_chain
      - deployer
      - dtl
      - l2geth
    deploy:
      replicas: 1
    build:
      context: ..
      dockerfile: ./l2geth/Dockerfile
    image: ethereumoptimism/l2geth:${DOCKER_TAG_L2GETH:-latest}
    entrypoint: sh ./geth.sh
    env_file:
      - ./envs/geth.env
    environment:
      <<: *system-addr-env
      ETH1_HTTP: http://l1_chain:8545
      SEQUENCER_CLIENT_HTTP: http://l2geth:8545
      ROLLUP_STATE_DUMP_PATH: http://deployer:8081/state-dump.latest.json
      ROLLUP_CLIENT_HTTP: http://dtl:7878
      ROLLUP_BACKEND: 'l1'
      ETH1_CTC_DEPLOYMENT_HEIGHT: 8
      RETRIES: 60
      ROLLUP_VERIFIER_ENABLE: 'true'
    ports:
      - ${VERIFIER_HTTP_PORT:-8547}:8545
      - ${VERIFIER_WS_PORT:-8548}:8546

  replica:
    depends_on:
      - dtl
      - l2geth
    deploy:
      replicas: 1
    build:
      context: ..
      dockerfile: ./l2geth/Dockerfile
    image: ethereumoptimism/l2geth:${DOCKER_TAG_L2GETH:-latest}
    entrypoint: sh ./geth.sh
    env_file:
      - ./envs/geth.env
    environment:
      <<: *system-addr-env
      ETH1_HTTP: http://l1_chain:8545
      SEQUENCER_CLIENT_HTTP: http://l2geth:8545
      ROLLUP_STATE_DUMP_PATH: http://deployer:8081/state-dump.latest.json
      ROLLUP_CLIENT_HTTP: http://dtl:7878
      ROLLUP_BACKEND: 'l2'
      ROLLUP_VERIFIER_ENABLE: 'true'
      ETH1_CTC_DEPLOYMENT_HEIGHT: 8
      RETRIES: 60
    ports:
      - ${REPLICA_HTTP_PORT:-8549}:8545
      - ${REPLICA_WS_PORT:-8550}:8546

  replica_healthcheck:
    depends_on:
      - l2geth
      - replica
    deploy:
      replicas: 0
    build:
      context: ..
      dockerfile: ./ops/docker/Dockerfile.packages
      target: replica-healthcheck
    image: ethereumoptimism/replica-healthcheck:${DOCKER_TAG_REPLICA_HEALTHCHECK:-latest}
    environment:
      HEALTHCHECK__REFERENCE_RPC_PROVIDER: http://l2geth:8545
      HEALTHCHECK__TARGET_RPC_PROVIDER: http://replica:8545
    ports:
      - ${HEALTHCHECK_HTTP_PORT:-7300}:7300

  integration_tests:
    deploy:
      replicas: 0
    build:
      context: ..
      dockerfile: ./ops/docker/Dockerfile.packages
      target: integration-tests
    image: ethereumoptimism/integration-tests:${DOCKER_TAG_INTEGRATION_TESTS:-latest}
    entrypoint: ./integration-tests.sh
    environment:
      L1_URL: http://l1_chain:8545
      L2_URL: http://l2geth:8545
      HEALTHCHECK_URL: http://replica_healthcheck:7300/metrics
      REPLICA_URL: http://replica:8545
      VERIFIER_URL: http://verifier:8545
      URL: http://deployer:8081/addresses.json
      ENABLE_GAS_REPORT: 1
      NO_NETWORK: 1
      BATCH_SUBMITTER_SEQUENCER_BATCH_TYPE: ${BATCH_SUBMITTER_SEQUENCER_BATCH_TYPE:-zlib}

      RUN_SYSTEM_ADDRESS_TESTS: 'true'

      # must match l2geth environment, see above for why it's safe to publish these
      SYSTEM_ADDRESS_0_DEPLOYER_KEY: 'a6aecc98b63bafb0de3b29ae9964b14acb4086057808be29f90150214ebd4a0f'
      SYSTEM_ADDRESS_1_DEPLOYER_KEY: '3b8d2345102cce2443acb240db6e87c8edd4bb3f821b17fab8ea2c9da08ea132'

  gas_oracle:
    deploy:
      replicas: 0
    build:
      context: ..
      dockerfile: ./gas-oracle/Dockerfile
    image: ethereumoptimism/gas-oracle:${DOCKER_TAG_GAS_ORACLE:-latest}
    environment:
      GAS_PRICE_ORACLE_ETHEREUM_HTTP_URL: http://l1_chain:8545
      GAS_PRICE_ORACLE_LAYER_TWO_HTTP_URL: http://l2geth:8545
      # Default hardhat account 5
      GAS_PRICE_ORACLE_PRIVATE_KEY: '0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba'

  batch_submitter:
    depends_on:
      - l1_chain
      - deployer
      - l2geth
    build:
      context: ..
      dockerfile: ./batch-submitter/Dockerfile
    image: ethereumoptimism/batch-submitter-service:${DOCKER_TAG_BATCH_SUBMITTER_SERVICE:-latest}
    entrypoint: ./batch-submitter.sh
    env_file:
      - ./envs/batch-submitter.env
    environment:
      L1_ETH_RPC: http://l1_chain:8545
      L2_ETH_RPC: http://l2geth:8545
      URL: http://deployer:8081/addresses.json
      BATCH_SUBMITTER_SEQUENCER_PRIVATE_KEY: '0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d'
      BATCH_SUBMITTER_PROPOSER_PRIVATE_KEY: '0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a'
      BATCH_SUBMITTER_SEQUENCER_BATCH_TYPE: ${BATCH_SUBMITTER_SEQUENCER_BATCH_TYPE:-zlib}
