version: '3.4'

# This Compose file is expected to be used with the devnet-up.sh script.
# The volumes below mount the configs generated by the script into each
# service.

volumes:
  l1_data:
  l2_data:
  op_log:


services:
  op_stack_go_builder:  # Not an actual service, but builds the prerequisite go images
    build:
      context: ../
      dockerfile: ops/docker/op-stack-go/Dockerfile
      args:
        GIT_COMMIT: "dev"
        GIT_DATE: "0"
    image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-stack-go:devnet
    entrypoint: ["echo", "build complete"]

  l1:
    build:
      context: .
      dockerfile: Dockerfile.l1
    ports:
      - "8545:8545"
      - "8546:8546"
      - "7060:6060"
    volumes:
      - "l1_data:/db"
      - "${PWD}/../.devnet/genesis-l1.json:/genesis.json"
      - "${PWD}/test-jwt-secret.txt:/config/test-jwt-secret.txt"
    environment:
      GETH_MINER_RECOMMIT: 100ms

  l2:
    build:
      context: .
      dockerfile: Dockerfile.l2
    ports:
      - "9545:8545"
      - "8060:6060"
    volumes:
      - "l2_data:/db"
      - "${PWD}/../.devnet/genesis-l2.json:/genesis.json"
      - "${PWD}/test-jwt-secret.txt:/config/test-jwt-secret.txt"
    entrypoint:  # pass the L2 specific flags by overriding the entry-point and adding extra arguments
      - "/bin/sh"
      - "/entrypoint.sh"
      - "--authrpc.jwtsecret=/config/test-jwt-secret.txt"
    environment:
      GETH_MINER_RECOMMIT: 100ms

  op-node:
    depends_on:
      - op_stack_go_builder
      - l1
      - l2
    build:
      context: ../
      dockerfile: ./op-node/Dockerfile
      args:
        OP_STACK_GO_BUILDER: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-stack-go:devnet
    image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:devnet
    command: >
      op-node
      --l1=ws://l1:8546
      --l2=http://l2:8551
      --l2.jwt-secret=/config/test-jwt-secret.txt
      --sequencer.enabled
      --sequencer.l1-confs=0
      --verifier.l1-confs=0
      --p2p.sequencer.key=8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba
      --rollup.config=/rollup.json
      --rpc.addr=0.0.0.0
      --rpc.port=8545
      --p2p.listen.ip=0.0.0.0
      --p2p.listen.tcp=9003
      --p2p.listen.udp=9003
      --p2p.scoring.peers=light
      --p2p.ban.peers=true
      --snapshotlog.file=/op_log/snapshot.log
      --p2p.priv.path=/config/p2p-node-key.txt
      --metrics.enabled
      --metrics.addr=0.0.0.0
      --metrics.port=7300
      --pprof.enabled
      --rpc.enable-admin
    ports:
      - "7545:8545"
      - "9003:9003"
      - "7300:7300"
      - "6060:6060"
    volumes:
      - "${PWD}/p2p-sequencer-key.txt:/config/p2p-sequencer-key.txt"
      - "${PWD}/p2p-node-key.txt:/config/p2p-node-key.txt"
      - "${PWD}/test-jwt-secret.txt:/config/test-jwt-secret.txt"
      - "${PWD}/../.devnet/rollup.json:/rollup.json"
      - op_log:/op_log

  op-proposer:
    depends_on:
      - op_stack_go_builder
      - l1
      - l2
      - op-node
    build:
      context: ../
      dockerfile: ./op-proposer/Dockerfile
      args:
        OP_STACK_GO_BUILDER: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-stack-go:devnet
    image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-proposer:devnet
    ports:
      - "6062:6060"
      - "7302:7300"
      - "6546:8545"
    environment:
      OP_PROPOSER_L1_ETH_RPC: http://l1:8545
      OP_PROPOSER_ROLLUP_RPC: http://op-node:8545
      OP_PROPOSER_POLL_INTERVAL: 1s
      OP_PROPOSER_NUM_CONFIRMATIONS: 1
      OP_PROPOSER_MNEMONIC: test test test test test test test test test test test junk
      OP_PROPOSER_L2_OUTPUT_HD_PATH: "m/44'/60'/0'/0/1"
      OP_PROPOSER_L2OO_ADDRESS: "${L2OO_ADDRESS}"
      OP_PROPOSER_PPROF_ENABLED: "true"
      OP_PROPOSER_METRICS_ENABLED: "true"
      OP_PROPOSER_ALLOW_NON_FINALIZED: "true"
      OP_PROPOSER_RPC_ENABLE_ADMIN: "true"

  op-batcher:
    depends_on:
      - op_stack_go_builder
      - l1
      - l2
      - op-node
    build:
      context: ../
      dockerfile: ./op-batcher/Dockerfile
      args:
        OP_STACK_GO_BUILDER: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-stack-go:devnet
    image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-batcher:devnet
    ports:
      - "6061:6060"
      - "7301:7300"
      - "6545:8545"
    environment:
      OP_BATCHER_L1_ETH_RPC: http://l1:8545
      OP_BATCHER_L2_ETH_RPC: http://l2:8545
      OP_BATCHER_ROLLUP_RPC: http://op-node:8545
      OP_BATCHER_MAX_CHANNEL_DURATION: 1
      OP_BATCHER_SUB_SAFETY_MARGIN: 4 # SWS is 15, ChannelTimeout is 40
      OP_BATCHER_POLL_INTERVAL: 1s
      OP_BATCHER_NUM_CONFIRMATIONS: 1
      OP_BATCHER_MNEMONIC: test test test test test test test test test test test junk
      OP_BATCHER_SEQUENCER_HD_PATH: "m/44'/60'/0'/0/2"
      OP_BATCHER_PPROF_ENABLED: "true"
      OP_BATCHER_METRICS_ENABLED: "true"
      OP_BATCHER_RPC_ENABLE_ADMIN: "true"
      OP_BATCHER_BATCH_TYPE: 0

  artifact-server:
    depends_on:
      - l1
    image: nginx:1.25-alpine
    ports:
      - "8080:80"
    volumes:
      - "${PWD}/../.devnet/:/usr/share/nginx/html/:ro"
    security_opt:
      - "no-new-privileges:true"

#  stateviz:
#    build:
#      context: ../
#      dockerfile: ./ops-bedrock/Dockerfile.stateviz
#    command:
#      - stateviz
#      - -addr=0.0.0.0:8080
#      - -snapshot=/op_log/snapshot.log
#      - -refresh=10s
#    ports:
#      - "9090:8080"
#    volumes:
#      - op_log:/op_log:ro
