diff --git a/tooling/l2/dev/README.md b/tooling/l2/dev/README.md new file mode 100644 index 0000000000..5273c77730 --- /dev/null +++ b/tooling/l2/dev/README.md @@ -0,0 +1,31 @@ +# L2 dev environment + +## Usage + +1. Download the docker compose + +curl -L https://raw.githubusercontent.com/lambdaclass/ethrex/main/tooling/l2/dev/docker-compose.yaml -o docker-compose.yaml + +2. Start the containers + +```shell +docker compose up +``` + +this will launch: + +- on localhost:8083 blockscout explorer for L1 +- on localhost:8082 blockscout explorer for L2 +- on localhost:1729 l2 rpc +- on localhost:8545 l1 rpc +- on localhost:5173 ethrex L2 hub for withdrawals deposits and account abstraction + +3. Stop the containers and delete the volumes + +> [!NOTE] +> It is recommended to delete all the volumes because blockscout will keep the old state of the blockchain on its db +> but ethrex l2 dev mode starts a new chain on every restart. For this reason we use the `-v` flag + +```shell +docker compose down -v +``` diff --git a/tooling/l2/dev/docker-compose.yaml b/tooling/l2/dev/docker-compose.yaml new file mode 100644 index 0000000000..238ecc26ba --- /dev/null +++ b/tooling/l2/dev/docker-compose.yaml @@ -0,0 +1,600 @@ +services: + # DB services + redis-db: + image: 'redis:alpine' + container_name: redis-db + command: redis-server + + db-init: + image: postgres:17 + volumes: + - blockscout-db-data:/var/lib/postgresql/data + entrypoint: + - sh + - -c + - | + chown -R 2000:2000 /var/lib/postgresql/data + + db: + image: postgres:17 + user: 2000:2000 + shm_size: 256m + restart: always + container_name: 'db' + command: postgres -c 'max_connections=200' -c 'client_connection_check_interval=60000' + environment: + POSTGRES_DB: 'blockscout' + POSTGRES_USER: 'blockscout' + POSTGRES_PASSWORD: 'ceWb1MeLBEeOIfk65gU8EjF8' + ports: + - target: 5432 + published: 7432 + volumes: + - blockscout-db-data:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U blockscout -d blockscout"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 10s + depends_on: + db-init: + condition: service_completed_successfully + + stats-db-init: + image: postgres:17 + volumes: + - stats-db-data:/var/lib/postgresql/data + entrypoint: + - sh + - -c + - | + chown -R 2000:2000 /var/lib/postgresql/data + + stats-db: + image: postgres:17 + user: 2000:2000 + shm_size: 256m + restart: always + container_name: 'stats-db' + command: postgres -c 'max_connections=200' + environment: + POSTGRES_DB: 'stats' + POSTGRES_USER: 'stats' + POSTGRES_PASSWORD: 'n0uejXPl61ci6ldCuE2gQU5Y' + ports: + - target: 5432 + published: 7433 + volumes: + - stats-db-data:/var/lib/postgresql/data + depends_on: + stats-db-init: + condition: service_completed_successfully + healthcheck: + test: ["CMD-SHELL", "pg_isready -U stats -d stats"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 10s + + # L1 Blockscout Services + backend-l1: + image: ghcr.io/lambdaclass/blockscout-private:9.2.2.commit.763c41da + pull_policy: always + depends_on: + db: + condition: service_healthy + redis-db: + condition: service_started + links: + - db:database + stop_grace_period: 5m + container_name: 'backend-l1' + command: sh -c "bin/blockscout eval \"Elixir.Explorer.ReleaseTasks.create_and_migrate()\" && bin/blockscout start" + extra_hosts: + - 'host.docker.internal:host-gateway' + environment: + ETHEREUM_JSONRPC_HTTP_URL: http://host.docker.internal:8545/ + ETHEREUM_JSONRPC_TRACE_URL: http://host.docker.internal:8545/ + CHAIN_ID: '9' + ETHEREUM_JSONRPC_VARIANT: geth + DISABLE_FILE_LOGGING: false + DATABASE_URL: postgresql://blockscout:ceWb1MeLBEeOIfk65gU8EjF8@db:5432/blockscout_l1 + ETHEREUM_JSONRPC_TRANSPORT: http + ETHEREUM_JSONRPC_DISABLE_ARCHIVE_BALANCES: false + SECRET_KEY_BASE: 56NtB48ear7+wMSf0IQuWDAAazhpb31qyc7GiyspBP2vh7t5zlCsF5QDv76chXeN + PORT: 4000 + COIN_NAME: Ether + COIN: ETH + DISABLE_MARKET: true + POOL_SIZE: 80 + POOL_SIZE_API: 10 + ECTO_USE_SSL: false + HEART_BEAT_TIMEOUT: 30 + RELEASE_LINK: "prague,default" + ADMIN_PANEL_ENABLED: false + API_V1_READ_METHODS_DISABLED: false + API_V1_WRITE_METHODS_DISABLED: false + TXS_STATS_DAYS_TO_COMPILE_AT_INIT: 10 + COIN_BALANCE_HISTORY_DAYS: 90 + RE_CAPTCHA_DISABLED: false + MICROSERVICE_SC_VERIFIER_TYPE: eth_bytecode_db + MICROSERVICE_VISUALIZE_SOL2UML_ENABLED: true + MICROSERVICE_VISUALIZE_SOL2UML_URL: http://visualizer-l1:8050/ + MICROSERVICE_SIG_PROVIDER_ENABLED: true + MICROSERVICE_SIG_PROVIDER_URL: http://sig-provider-l1:8050/ + MICROSERVICE_ACCOUNT_ABSTRACTION_ENABLED: false + DECODE_NOT_A_CONTRACT_CALLS: true + ACCOUNT_ENABLED: false + ACCOUNT_REDIS_URL: redis://redis-db:6379/1 + NFT_MEDIA_HANDLER_ENABLED: false + NFT_MEDIA_HANDLER_REMOTE_DISPATCHER_NODE_MODE_ENABLED: false + NFT_MEDIA_HANDLER_BUCKET_FOLDER: /folder_1 + RELEASE_NODE: producer@172.18.0.4 + RELEASE_DISTRIBUTION: name + RELEASE_COOKIE: secret_cookie + + visualizer-l1: + image: ghcr.io/blockscout/visualizer:v0.2.1 + platform: linux/amd64 + restart: always + container_name: 'visualizer-l1' + environment: + VISUALIZER__SERVER__GRPC__ENABLED: false + + sig-provider-l1: + image: ghcr.io/blockscout/sig-provider:v1.1.1 + platform: linux/amd64 + restart: always + container_name: 'sig-provider-l1' + + frontend-l1: + image: ghcr.io/lambdaclass/frontend-private:test + platform: linux/amd64 + container_name: 'frontend-l1' + depends_on: + - backend-l1 + environment: + NEXT_PUBLIC_API_HOST: localhost:8083 + NEXT_PUBLIC_API_PROTOCOL: http + NEXT_PUBLIC_STATS_API_HOST: http://localhost:8084 + NEXT_PUBLIC_NETWORK_NAME: Ethrex L1 + NEXT_PUBLIC_NETWORK_SHORT_NAME: Ethrex L1 + NEXT_PUBLIC_NETWORK_ID: 9 + NEXT_PUBLIC_NETWORK_CURRENCY_NAME: Ether + NEXT_PUBLIC_NETWORK_CURRENCY_SYMBOL: ETH + NEXT_PUBLIC_NETWORK_CURRENCY_DECIMALS: 18 + NEXT_PUBLIC_API_BASE_PATH: / + NEXT_PUBLIC_APP_HOST: localhost:8083 + NEXT_PUBLIC_APP_PROTOCOL: http + NEXT_PUBLIC_HOMEPAGE_CHARTS: "['daily_txs']" + NEXT_PUBLIC_VISUALIZE_API_HOST: http://localhost:8085 + NEXT_PUBLIC_IS_TESTNET: true + NEXT_PUBLIC_API_WEBSOCKET_PROTOCOL: ws + NEXT_PUBLIC_API_SPEC_URL: https://raw.githubusercontent.com/blockscout/blockscout-api-v2-swagger/main/swagger.yaml + NEXT_PUBLIC_AD_BANNER_PROVIDER: none + NEXT_PUBLIC_AD_TEXT_PROVIDER: none + NEXT_PUBLIC_MARKETPLACE_ENABLED: false + NEXT_PUBLIC_PROMOTE_BLOCKSCOUT_IN_TITLE: false + + stats-l1: + image: ghcr.io/blockscout/stats:v2.12.0 + platform: linux/amd64 + restart: always + container_name: 'stats-l1' + extra_hosts: + - 'host.docker.internal:host-gateway' + depends_on: + - stats-db + - backend-l1 + environment: + - STATS__DB_URL=${STATS__DB_URL:-postgres://stats:n0uejXPl61ci6ldCuE2gQU5Y@stats-db:5432/stats_l1} + - STATS__BLOCKSCOUT_DB_URL=${STATS__BLOCKSCOUT_DB_URL:-postgresql://blockscout:ceWb1MeLBEeOIfk65gU8EjF8@db:5432/blockscout_l1} + - STATS__CREATE_DATABASE=${STATS__CREATE_DATABASE:-true} + - STATS__RUN_MIGRATIONS=${STATS__RUN_MIGRATIONS:-true} + - STATS__BLOCKSCOUT_API_URL=${STATS__BLOCKSCOUT_API_URL:-http://host.docker.internal:8083} + - STATS__SERVER__HTTP__CORS__ENABLED=${STATS__SERVER__HTTP__CORS__ENABLED:-false} + - STATS__SERVER__HTTP__CORS__ALLOWED_ORIGIN=${STATS__SERVER__HTTP__CORS__ALLOWED_ORIGIN} + - STATS__CONDITIONAL_START__USER_OPS_PAST_INDEXING_FINISHED__ENABLED=false + - STATS__SERVER__HTTP__ENABLED=true + - STATS__SERVER__HTTP__ADDR=0.0.0.0:8050 + - STATS__SERVER__HTTP__MAX_BODY_SIZE=2097152 + - STATS__SERVER__HTTP__CORS__ALLOWED_ORIGIN=http://localhost:8084 + - STATS__SERVER__GRPC__ENABLED=false + - STATS__SERVER__GRPC__ADDR=0.0.0.0:8051 + - STATS__DEFAULT_SCHEDULE=0 0 1 * * * * + - STATS__FORCE_UPDATE_ON_START=false + - STATS__METRICS__ENABLED=false + - STATS__METRICS__ADDR=0.0.0.0:6060 + - STATS__METRICS__ROUTE=/metrics + - STATS__JAEGER__ENABLED=false + - STATS__JAEGER__AGENT_ENDPOINT=localhost:6831 + - STATS__TRACING__ENABLED=true + - STATS__TRACING__FORMAT=default + + # L2 Blockscout Services + backend: + image: ghcr.io/lambdaclass/blockscout-private:9.2.2.commit.763c41da + depends_on: + db: + condition: service_healthy + redis-db: + condition: service_started + links: + - db:database + stop_grace_period: 5m + container_name: 'backend' + command: sh -c "bin/blockscout eval \"Elixir.Explorer.ReleaseTasks.create_and_migrate()\" && bin/blockscout start" + extra_hosts: + - 'host.docker.internal:host-gateway' + environment: + ETHEREUM_JSONRPC_HTTP_URL: http://host.docker.internal:1729/ + ETHEREUM_JSONRPC_TRACE_URL: http://host.docker.internal:1729/ + CHAIN_ID: '65536999' + ETHEREUM_JSONRPC_VARIANT: geth + DISABLE_FILE_LOGGING: false + DATABASE_URL: postgresql://blockscout:ceWb1MeLBEeOIfk65gU8EjF8@db:5432/blockscout_l2 + ETHEREUM_JSONRPC_TRANSPORT: http + ETHEREUM_JSONRPC_DISABLE_ARCHIVE_BALANCES: false + SECRET_KEY_BASE: 56NtB48ear7+wMSf0IQuWDAAazhpb31qyc7GiyspBP2vh7t5zlCsF5QDv76chXeN + PORT: 4000 + COIN_NAME: Ether + COIN: ETH + DISABLE_MARKET: true + POOL_SIZE: 80 + POOL_SIZE_API: 10 + ECTO_USE_SSL: false + HEART_BEAT_TIMEOUT: 30 + RELEASE_LINK: "prague,default" + ADMIN_PANEL_ENABLED: false + API_V1_READ_METHODS_DISABLED: false + API_V1_WRITE_METHODS_DISABLED: false + TXS_STATS_DAYS_TO_COMPILE_AT_INIT: 10 + COIN_BALANCE_HISTORY_DAYS: 90 + RE_CAPTCHA_DISABLED: false + MICROSERVICE_SC_VERIFIER_TYPE: eth_bytecode_db + MICROSERVICE_VISUALIZE_SOL2UML_ENABLED: true + MICROSERVICE_VISUALIZE_SOL2UML_URL: http://visualizer:8050/ + MICROSERVICE_SIG_PROVIDER_ENABLED: true + MICROSERVICE_SIG_PROVIDER_URL: http://sig-provider:8050/ + MICROSERVICE_ACCOUNT_ABSTRACTION_ENABLED: false + DECODE_NOT_A_CONTRACT_CALLS: true + ACCOUNT_ENABLED: false + ACCOUNT_REDIS_URL: redis://redis-db:6379/2 + NFT_MEDIA_HANDLER_ENABLED: false + NFT_MEDIA_HANDLER_REMOTE_DISPATCHER_NODE_MODE_ENABLED: false + NFT_MEDIA_HANDLER_BUCKET_FOLDER: /folder_1 + RELEASE_NODE: producer@172.18.0.4 + RELEASE_DISTRIBUTION: name + RELEASE_COOKIE: secret_cookie + + visualizer: + image: ghcr.io/blockscout/visualizer:v0.2.1 + platform: linux/amd64 + restart: always + container_name: 'visualizer' + environment: + VISUALIZER__SERVER__GRPC__ENABLED: false + + sig-provider: + image: ghcr.io/blockscout/sig-provider:v1.1.1 + platform: linux/amd64 + restart: always + container_name: 'sig-provider' + + frontend: + image: ghcr.io/lambdaclass/frontend-private:test + platform: linux/amd64 + container_name: 'frontend' + depends_on: + - backend + environment: + NEXT_PUBLIC_API_HOST: localhost:8082 + NEXT_PUBLIC_API_PROTOCOL: http + NEXT_PUBLIC_STATS_API_HOST: http://localhost:8080 + NEXT_PUBLIC_NETWORK_NAME: Ethrex L2 + NEXT_PUBLIC_NETWORK_SHORT_NAME: Ethrex L2 + NEXT_PUBLIC_NETWORK_ID: 65536999 + NEXT_PUBLIC_NETWORK_CURRENCY_NAME: Ether + NEXT_PUBLIC_NETWORK_CURRENCY_SYMBOL: ETH + NEXT_PUBLIC_NETWORK_CURRENCY_DECIMALS: 18 + NEXT_PUBLIC_API_BASE_PATH: / + NEXT_PUBLIC_APP_HOST: localhost:8082 + NEXT_PUBLIC_APP_PROTOCOL: http + NEXT_PUBLIC_HOMEPAGE_CHARTS: "['daily_txs']" + NEXT_PUBLIC_VISUALIZE_API_HOST: http://localhost:8081 + NEXT_PUBLIC_IS_TESTNET: true + NEXT_PUBLIC_API_WEBSOCKET_PROTOCOL: ws + NEXT_PUBLIC_API_SPEC_URL: https://raw.githubusercontent.com/blockscout/blockscout-api-v2-swagger/main/swagger.yaml + NEXT_PUBLIC_AD_BANNER_PROVIDER: none + NEXT_PUBLIC_AD_TEXT_PROVIDER: none + NEXT_PUBLIC_MARKETPLACE_ENABLED: false + NEXT_PUBLIC_PROMOTE_BLOCKSCOUT_IN_TITLE: false + + stats: + image: ghcr.io/blockscout/stats:v2.12.0 + platform: linux/amd64 + restart: always + container_name: 'stats' + extra_hosts: + - 'host.docker.internal:host-gateway' + depends_on: + - stats-db + - backend + environment: + - STATS__DB_URL=${STATS__DB_URL:-postgres://stats:n0uejXPl61ci6ldCuE2gQU5Y@stats-db:5432/stats_l2} + - STATS__BLOCKSCOUT_DB_URL=${STATS__BLOCKSCOUT_DB_URL:-postgresql://blockscout:ceWb1MeLBEeOIfk65gU8EjF8@db:5432/blockscout_l2} + - STATS__CREATE_DATABASE=${STATS__CREATE_DATABASE:-true} + - STATS__RUN_MIGRATIONS=${STATS__RUN_MIGRATIONS:-true} + - STATS__BLOCKSCOUT_API_URL=${STATS__BLOCKSCOUT_API_URL:-http://host.docker.internal:8082} + - STATS__SERVER__HTTP__CORS__ENABLED=${STATS__SERVER__HTTP__CORS__ENABLED:-false} + - STATS__SERVER__HTTP__CORS__ALLOWED_ORIGIN=${STATS__SERVER__HTTP__CORS__ALLOWED_ORIGIN} + - STATS__CONDITIONAL_START__USER_OPS_PAST_INDEXING_FINISHED__ENABLED=false + - STATS__SERVER__HTTP__ENABLED=true + - STATS__SERVER__HTTP__ADDR=0.0.0.0:8050 + - STATS__SERVER__HTTP__MAX_BODY_SIZE=2097152 + # - STATS__SERVER__HTTP__CORS__ENABLED=true + - STATS__SERVER__HTTP__CORS__ALLOWED_ORIGIN=http://localhost:8080 + - STATS__SERVER__GRPC__ENABLED=false + - STATS__SERVER__GRPC__ADDR=0.0.0.0:8051 + - STATS__DEFAULT_SCHEDULE=0 0 1 * * * * + - STATS__FORCE_UPDATE_ON_START=false + - STATS__METRICS__ENABLED=false + - STATS__METRICS__ADDR=0.0.0.0:6060 + - STATS__METRICS__ROUTE=/metrics + - STATS__JAEGER__ENABLED=false + - STATS__JAEGER__AGENT_ENDPOINT=localhost:6831 + - STATS__TRACING__ENABLED=true + - STATS__TRACING__FORMAT=default + ports: + - 8050:8050 + + proxy: + depends_on: + - backend + - frontend + - stats + - backend-l1 + - frontend-l1 + - stats-l1 + image: nginx + container_name: proxy + extra_hosts: + - 'host.docker.internal:host-gateway' + configs: + - source: nginx_conf + target: /etc/nginx/conf.d/default.conf + restart: always + ports: + - target: 8082 + published: 8082 + - target: 8080 + published: 8080 + - target: 8081 + published: 8081 + - target: 8083 + published: 8083 + - target: 8084 + published: 8084 + - target: 8085 + published: 8085 + + # Ethrex Services + ethrex-dev: + container_name: ethrex-dev + pull_policy: always + image: "ghcr.io/lambdaclass/ethrex:l2" + depends_on: + - proxy + ports: + - 8545:8545 + - 5555:5555 + - 1729:1729 + configs: + - source: ethrex-sponsor-addresses + target: /usr/local/bin/sponsorable-addresses.txt + command: > + l2 --dev --no-monitor --proof-coordinator.addr 0.0.0.0 --admin-server.addr 0.0.0.0 --block-producer.block-time 1000 --sponsorable-addresses sponsorable-addresses.txt + + ethrex-prover: + container_name: ethrex-prover + pull_policy: always + image: "ghcr.io/lambdaclass/ethrex:l2" + depends_on: + - ethrex-dev + command: > + l2 prover --proof-coordinators tcp://ethrex-dev:3900 + + ethrex-delegation-contracts: + image: ghcr.io/lambdaclass/rex:latest + platform: linux/amd64 + depends_on: + - ethrex-dev + entrypoint: > + sh -c " + set -e + echo 'Waiting for L2...' + until rex block-number http://ethrex-dev:1729 >/dev/null 2>&1; do + echo 'Not ready, retrying...' + sleep 2 + done + echo 'L2 is ready!' + while true; do + BAL=\$(rex balance 0x0000bd19F707CA481886244bDd20Bd6B8a81bd3e http://ethrex-dev:1729) + if [ \"$$BAL\" != \"0\" ]; then + echo 'Account has funds' + break + fi + echo 'Balance still zero, retrying...' + sleep 2 + done + rex deploy --bytecode 0x608060405234601c57600e6020565b6118c761002b82396118c790f35b6026565b60405190565b5f80fdfe60806040526004361015610015575b366103d457005b61001f5f3561005e565b80630f0b3785146100595780633bc67d4b14610054578063affed0e01461004f5763c417a8c50361000e5761039e565b610303565b61025d565b6100d2565b60e01c90565b60405190565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b908160409103126100885790565b610076565b9081606091031261009b5790565b610076565b919060a0838203126100c857806100bc6100c5925f860161007a565b9360400161008d565b90565b61006e565b5f0190565b34610101576100eb6100e53660046100a0565b9061076f565b6100f3610064565b806100fd816100cd565b0390f35b61006a565b60018060a01b031690565b61011a90610106565b90565b61012681610111565b0361012d57565b5f80fd5b9050359061013e8261011d565b565b90565b61014c81610140565b0361015357565b5f80fd5b9050359061016482610143565b565b5f80fd5b5f80fd5b5f80fd5b909182601f830112156101ac5781359167ffffffffffffffff83116101a75760200192600183028401116101a257565b61016e565b61016a565b610166565b908160409103126101bf5790565b610076565b908160a09103126101d25790565b610076565b60c081830312610258576101ed825f8301610131565b926101fb8360208401610157565b92604083013567ffffffffffffffff8111610253578161021c918501610172565b92909361022c83606083016101b1565b9260a082013567ffffffffffffffff811161024e5761024b92016101c4565b90565b610072565b610072565b61006e565b346102925761027c6102703660046101d7565b94939093929192610e00565b610284610064565b8061028e816100cd565b0390f35b61006a565b5f9103126102a157565b61006e565b1c90565b90565b6102bd9060086102c293026102a6565b6102aa565b90565b906102d091546102ad565b90565b6102de5f5f906102c5565b90565b6102ea90610140565b9052565b9190610301905f602085019401906102e1565b565b3461033357610313366004610297565b61032f61031e6102d3565b610326610064565b918291826102ee565b0390f35b61006a565b5f1c90565b61034961034e91610338565b6102aa565b90565b61035b905461033d565b90565b60019061037860016103715f8501610351565b9301610351565b90565b91602061039c92949361039560408201965f8301906102e1565b01906102e1565b565b346103cf576103ae366004610297565b6103b661035e565b906103cb6103c2610064565b9283928361037b565b0390f35b61006a565b5f80fd5b356103e281610143565b90565b90565b6103f46103f991610140565b6103e5565b9052565b6020939261041c85836104148295610424976103e8565b0180926103e8565b0180926103e8565b0190565b601f801991011690565b634e487b7160e01b5f52604160045260245ffd5b9061045090610428565b810190811067ffffffffffffffff82111761046a57604052565b610432565b60200190565b5190565b634e487b7160e01b5f52601160045260245ffd5b61049690610140565b5f1981146104a45760010190565b610479565b5f1b90565b906104ba5f19916104a9565b9181191691161790565b90565b6104db6104d66104e092610140565b6104c4565b610140565b90565b90565b906104fb6104f6610502926104c7565b6104e3565b82546104ae565b9055565b60ff1690565b61051581610506565b0361051c57565b5f80fd5b3561052a8161050c565b90565b90565b61054461053f6105499261052d565b6104c4565b610506565b90565b90565b61056361055e6105689261054c565b6104c4565b610506565b90565b90565b61058261057d6105879261056b565b6104c4565b610506565b90565b90565b6105a161059c6105a692610140565b6104a9565b61058a565b90565b6105b29061058a565b9052565b6105bf90610506565b9052565b6105f86105ff946105ee6060949897956105e4608086019a5f8701906105a9565b60208501906105b6565b60408301906105a9565b01906105a9565b565b610609610064565b3d5f823e3d90fd5b61062561062061062a92610106565b6104c4565b610106565b90565b61063690610611565b90565b6106429061062d565b90565b60209181520190565b5f7f556e617574686f72697a65640000000000000000000000000000000000000000910152565b610682600c602092610645565b61068b8161064e565b0190565b6106a49060208101905f818303910152610675565b90565b906106d2602060016106d8946106ca5f82016106c45f88016103d8565b906104e6565b0192016103d8565b906104e6565b565b906106e4916106a7565b565b506106f5906020810190610157565b90565b61070190610140565b9052565b90610712816020936106f8565b0190565b61073c6107316107419361072c5f8501856106e6565b610705565b9160208101906106e6565b610705565b50565b61075081604093610716565b0190565b61076990610760610064565b91829182610744565b03902090565b905f60209161077d82610351565b6107bb61078b8487016103d8565b916107ad61079a8789016103d8565b6107a2610064565b9485938985016103fd565b868201810382520382610446565b6107cd6107c782610475565b9161046f565b206107e86107e26107dd85610351565b61048d565b846104e6565b6107f460408301610520565b61080661080085610530565b91610506565b1483146108ff5761085461081a601b61056e565b925b61084261083d876108366108318986016103d8565b61058d565b93016103d8565b61058d565b9061084b610064565b948594856105c3565b838052039060015afa156108fa5761086c5f516104a9565b61088661088061087b30610639565b610111565b91610111565b036108d8576108968160016106da565b6108c07f7ab2d3841cf199f7bdf9a46a067653d528b42029acf32bdbe62dd8191ce226ad91610754565b906108c9610064565b806108d3816100cd565b0390a2565b6108e0610064565b62461bcd60e51b8152806108f66004820161068f565b0390fd5b610601565b61085461090c601c61054f565b9261081c565b60601b90565b61092190610912565b90565b61092d90610918565b90565b61093c61094191610111565b610924565b9052565b905090565b90825f939282370152565b9091826109658161096c93610945565b809361094a565b0190565b6014602093610994858461098c61099c966109a39c9a986103e8565b018092610930565b0180926103e8565b0191610955565b90565b5f80fd5b906109bd6109b6610064565b9283610446565b565b5f80fd5b5f80fd5b67ffffffffffffffff81116109e5576109e1602091610428565b0190565b610432565b909291926109ff6109fa826109c7565b6109aa565b93818552602085019082840111610a1b57610a199261094a565b565b6109c3565b9080601f83011215610a3e57816020610a3b933591016109ea565b90565b610166565b67ffffffffffffffff8111610a6157610a5d602091610428565b0190565b610432565b90929192610a7b610a7682610a43565b6109aa565b93818552602085019082840111610a9757610a959261094a565b565b6109c3565b9080601f83011215610aba57816020610ab793359101610a66565b90565b610166565b61ffff1690565b610acf81610abf565b03610ad657565b5f80fd5b90503590610ae782610ac6565b565b151590565b610af781610ae9565b03610afe57565b5f80fd5b90503590610b0f82610aee565b565b91909160a081840312610bb257610b2860a06109aa565b925f82013567ffffffffffffffff8111610bad5781610b48918401610a20565b5f85015260208201359167ffffffffffffffff8311610ba857610b7082610ba1948301610a9c565b6020860152610b828260408301610ada565b6040860152610b948260608301610ada565b6060860152608001610b02565b6080830152565b6109bf565b6109bf565b6109a6565b610bc2903690610b11565b90565b9190604083820312610bff57610bf890610bdf60406109aa565b93610bec825f8301610157565b5f860152602001610157565b6020830152565b6109a6565b610c0f903690610bc5565b90565b90610c1c90610140565b9052565b610c2a60406109aa565b90565b90610c64610c5b6001610c3e610c20565b94610c55610c4d5f8301610351565b5f8801610c12565b01610351565b60208401610c12565b565b610c6f90610c2d565b90565b5f7f496e76616c6964207369676e6174757265000000000000000000000000000000910152565b610ca66011602092610645565b610caf81610c72565b0190565b610cc89060208101905f818303910152610c99565b90565b9091610cd692610955565b90565b90610ceb610ce6836109c7565b6109aa565b918252565b606090565b3d5f14610d1057610d053d610cd9565b903d5f602084013e5b565b610d18610cf0565b90610d0e565b5f7f43616c6c206661696c6564000000000000000000000000000000000000000000910152565b610d52600b602092610645565b610d5b81610d1e565b0190565b610d749060208101905f818303910152610d45565b90565b15610d7e57565b610d86610064565b62461bcd60e51b815280610d9c60048201610d5f565b0390fd5b610da99061062d565b90565b60209181520190565b9190610dcf81610dc881610dd495610dac565b809561094a565b610428565b0190565b91610dfd939192610df060408201945f8301906102e1565b6020818503910152610db5565b90565b9194610e9590610e9b9295610e145f610351565b610e438691610e348a8c8b91610e28610064565b96879560208701610970565b60208201810382520382610446565b610e55610e4f82610475565b9161046f565b20610e70610e6a610e655f610351565b61048d565b5f6104e6565b9190610e8f610e89610e83600194610bb7565b92610c04565b92610c66565b9261117d565b15610ae9565b610f1857610ed05f80838688908791610ebe610eb5610064565b93849283610ccb565b03925af1610eca610cf5565b50610d77565b91929092610f13610f017fcaf938de11c367272220bfd1d2baa99ca46665e7bc4d85f00adb51b90fe1fa9f94610da0565b94610f0a610064565b93849384610dd8565b0390a2565b610f20610064565b62461bcd60e51b815280610f3660048201610cb3565b0390fd5b5f90565b90565b610f55610f50610f5a92610f3e565b6104c4565b610140565b90565b634e487b7160e01b5f52603260045260245ffd5b90610f7b82610475565b811015610f8d57600160209102010190565b610f5d565b90565b610fa9610fa4610fae92610f92565b6104c4565b610140565b90565b60ff60f81b1690565b610fc49051610fb1565b90565b610fd19051610ae9565b90565b90610fe6610fe183610a43565b6109aa565b918252565b5f74113a3cb832911d113bb2b130baba34371733b2ba1160591b910152565b6110146015610fd4565b9061102160208301610feb565b565b61102b61100a565b90565b6110389051610abf565b90565b61104f61104a61105492610abf565b6104c4565b610140565b90565b90565b61106661106b9161058a565b611057565b9052565b61107b8160209361105a565b0190565b6c1131b430b63632b733b2911d1160991b9052565b5190565b905090565b90825f9392825e0152565b6110cd6110c4926020926110bb81611094565b94858093611098565b9384910161109d565b0190565b601160f91b9052565b600191600d6110f3926110ec8161107f565b01906110a8565b6110fc816110d1565b0190565b9061112861110c610064565b809361111c6020830191826110da565b90810382520383610446565b565b90565b6111526111499260209261114081610475565b94858093610945565b9384910161109d565b0190565b61115f9161112d565b90565b611172611179916020949361112d565b809261105a565b0190565b611185610f3a565b506111925f830151610475565b6111a561119f6025610f41565b91610140565b108015611315575b61130d576111e46111de6111bf611023565b60208501516111d86111d36060880161102e565b61103b565b91611530565b15610ae9565b6113055761124b61122c61122761120f61121e61125195611203610064565b9283916020830161106f565b60208201810382520382610446565b60018091611620565b611100565b60208401516112456112406040870161102e565b61103b565b91611530565b15610ae9565b6112fe5760205f6112786112678385015161112a565b61126f610064565b91829182611156565b039060025afa156112f9575f6112d06020926112bf8361129881516104a9565b9201516112b16112a6610064565b938492888401611162565b868201810382520382610446565b6112c7610064565b91829182611156565b039060025afa156112f4576112f1916112e95f516104a9565b9190916117d5565b90565b610601565b610601565b5050505f90565b505050505f90565b505050505f90565b5061135361134d61133b6113365f8601516113306020610f95565b90610f71565b610fba565b61134760808601610fc7565b9061140e565b15610ae9565b6111ad565b90565b60f81b90565b61137561137061137a92611358565b61135b565b610fb1565b90565b6113876001611361565b90565b90565b6113a161139c6113a69261138a565b61135b565b610fb1565b90565b6113b3600461138d565b90565b90565b6113cd6113c86113d2926113b6565b61135b565b610fb1565b90565b6113df60086113b9565b90565b90565b6113f96113f46113fe926113e2565b61135b565b610fb1565b90565b61140b60106113e5565b90565b90611417610f3a565b508161142161137d565b1661143b61143561143061137d565b610fb1565b91610fb1565b036114da57806114af575b6114aa57806114536113d5565b1661146d6114676114626113d5565b610fb1565b91610fb1565b03611479575b50600190565b611481611401565b1661149b611495611490611401565b610fb1565b91610fb1565b146114a6575f611473565b5f90565b505f90565b50806114b96113a9565b166114d36114cd6114c86113a9565b610fb1565b91610fb1565b1415611446565b50505f90565b6114f46114ef6114f99261052d565b6104c4565b610140565b90565b60016115089101610140565b90565b61151a61152091939293610140565b92610140565b820180921161152b57565b610479565b61154861154e91939293611542610f3a565b5061112a565b9261112a565b9061155883610475565b9261156283610475565b61156b5f6114e0565b5b8061157f61157988610140565b91610140565b10156116105761159084829061150b565b6115a261159c84610140565b91610140565b1015611606576115bb6115b6848390610f71565b610fba565b6115e96115e36115de6115d9896115d38a889061150b565b90610f71565b610fba565b610fb1565b91610fb1565b036115fc576115f7906114fc565b61156c565b5050505050505f90565b5050505050505f90565b505050505050600190565b606090565b92919261162b61161b565b9381518061163a575b50505050565b90919294506003600282010460021b91610670604051967f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f5215027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f18603f5260208601938385019280826020010195600460038851945f8a525b0191603f8351818160121c16515f538181600c1c1651600153818160061c165160025316516003535f5181520190858210156117005790603f60036004939091509291926116b7565b50955f9460039360209252016040520660020490613d3d60f01b82860352151502809303520382525f808080611634565b90565b61174861174361174d92611731565b6104c4565b610106565b90565b61175990611734565b90565b6117669051610140565b90565b909594926117b4946117a36117ad9261179960809661178f60a088019c5f8901906105a9565b60208701906102e1565b60408501906102e1565b60608301906102e1565b01906102e1565b565b90565b6117cd6117c86117d2926117b6565b6104c4565b610140565b90565b5f929161184984936117e5610f3a565b5061183a6117f4610100611750565b949161180d602061180689880161175c565b960161175c565b90611825602061181e8a840161175c565b920161175c565b9161182e610064565b96879560208701611769565b60208201810382520382610446565b602081019051915afa61185a610cf5565b90806118a4575b908161186c575b5090565b61188a91506118859061187f601f6117b9565b90610f71565b610fba565b61189d6118976001611361565b91610fb1565b145f611868565b506118ae81610475565b6118c16118bb6020610f95565b91610140565b1461186156 0 0xe4f7dc8b199fdaac6693c9c412ea68aed9e1584d193e1c3478d30a6f01f26057 --rpc-url http://ethrex-dev:1729 + rex deploy --bytecode 0x6080604052346100275761001161015e565b61001961002c565b610d6c6103e98239610d6c90f35b610032565b60405190565b5f80fd5b601f801991011690565b634e487b7160e01b5f52604160045260245ffd5b9061005e90610036565b810190811060018060401b0382111761007657604052565b610040565b9061008e61008761002c565b9283610054565b565b60018060401b0381116100ac576100a8602091610036565b0190565b610040565b906100c36100be83610090565b61007b565b918252565b5f7f54657374546f6b656e0000000000000000000000000000000000000000000000910152565b6100f960096100b1565b90610106602083016100c8565b565b6101106100ef565b90565b5f7f54544f4b00000000000000000000000000000000000000000000000000000000910152565b61014460046100b1565b9061015160208301610113565b565b61015b61013a565b90565b610177610169610108565b610171610153565b906103d0565b565b5190565b634e487b7160e01b5f52602260045260245ffd5b90600160028304921680156101b1575b60208310146101ac57565b61017d565b91607f16916101a1565b5f5260205f2090565b601f602091010490565b1b90565b919060086101ed9102916101e75f19846101ce565b926101ce565b9181191691161790565b90565b90565b61021161020c610216926101f7565b6101fa565b6101f7565b90565b90565b919061023261022d61023a936101fd565b610219565b9083546101d2565b9055565b5f90565b6102549161024e61023e565b9161021c565b565b5b818110610262575050565b8061026f5f600193610242565b01610257565b9190601f8111610285575b505050565b6102916102b6936101bb565b90602061029d846101c4565b830193106102be575b6102af906101c4565b0190610256565b5f8080610280565b91506102af819290506102a6565b1c90565b906102e0905f19906008026102cc565b191690565b816102ef916102d0565b906002021790565b9061030181610179565b9060018060401b0382116103bf576103238261031d8554610191565b85610275565b602090601f831160011461035757918091610346935f9261034b575b50506102e5565b90555b565b90915001515f8061033f565b601f19831691610366856101bb565b925f5b8181106103a75750916002939185600196941061038d575b50505002019055610349565b61039d910151601f8416906102d0565b90555f8080610381565b91936020600181928787015181550195019201610369565b610040565b906103ce916102f7565b565b906103df6103e69260036103c4565b60046103c4565b56fe60806040526004361015610013575b6104e7565b61001d5f356100bc565b806306fdde03146100b7578063095ea7b3146100b257806318160ddd146100ad57806323b872dd146100a8578063313ce567146100a357806340c10f191461009e57806370a082311461009957806395d89b4114610094578063a9059cbb1461008f5763dd62ed3e0361000e576104b1565b61044e565b610419565b6103e4565b610392565b610358565b6102fa565b61028b565b610233565b61014a565b60e01c90565b60405190565b5f80fd5b5f80fd5b5f9103126100da57565b6100cc565b5190565b60209181520190565b90825f9392825e0152565b601f801991011690565b61012061012960209361012e93610117816100df565b938480936100e3565b958691016100ec565b6100f7565b0190565b6101479160208201915f818403910152610101565b90565b3461017a5761015a3660046100d0565b610176610165610644565b61016d6100c2565b91829182610132565b0390f35b6100c8565b60018060a01b031690565b6101939061017f565b90565b61019f8161018a565b036101a657565b5f80fd5b905035906101b782610196565b565b90565b6101c5816101b9565b036101cc57565b5f80fd5b905035906101dd826101bc565b565b919060408382031261020757806101fb610204925f86016101aa565b936020016101d0565b90565b6100cc565b151590565b61021a9061020c565b9052565b9190610231905f60208501940190610211565b565b346102645761026061024f6102493660046101df565b9061065e565b6102576100c2565b9182918261021e565b0390f35b6100c8565b610272906101b9565b9052565b9190610289905f60208501940190610269565b565b346102bb5761029b3660046100d0565b6102b76102a66106ad565b6102ae6100c2565b91829182610276565b0390f35b6100c8565b90916060828403126102f5576102f26102db845f85016101aa565b936102e981602086016101aa565b936040016101d0565b90565b6100cc565b3461032b576103276103166103103660046102c0565b916106c3565b61031e6100c2565b9182918261021e565b0390f35b6100c8565b60ff1690565b61033f90610330565b9052565b9190610356905f60208501940190610336565b565b34610388576103683660046100d0565b610384610373610718565b61037b6100c2565b91829182610343565b0390f35b6100c8565b5f0190565b346103c1576103ab6103a53660046101df565b9061072e565b6103b36100c2565b806103bd8161038d565b0390f35b6100c8565b906020828203126103df576103dc915f016101aa565b90565b6100cc565b34610414576104106103ff6103fa3660046103c6565b610784565b6104076100c2565b91829182610276565b0390f35b6100c8565b34610449576104293660046100d0565b6104456104346107a2565b61043c6100c2565b91829182610132565b0390f35b6100c8565b3461047f5761047b61046a6104643660046101df565b906107b8565b6104726100c2565b9182918261021e565b0390f35b6100c8565b91906040838203126104ac57806104a06104a9925f86016101aa565b936020016101aa565b90565b6100cc565b346104e2576104de6104cd6104c7366004610484565b906107f0565b6104d56100c2565b91829182610276565b0390f35b6100c8565b5f80fd5b606090565b634e487b7160e01b5f52602260045260245ffd5b9060016002830492168015610524575b602083101461051f57565b6104f0565b91607f1691610514565b60209181520190565b5f5260205f2090565b905f929180549061055a61055383610504565b809461052e565b916001811690815f146105b15750600114610575575b505050565b6105829192939450610537565b915f925b81841061059957505001905f8080610570565b60018160209295939554848601520191019290610586565b92949550505060ff19168252151560200201905f8080610570565b906105d691610540565b90565b634e487b7160e01b5f52604160045260245ffd5b906105f7906100f7565b810190811067ffffffffffffffff82111761061157604052565b6105d9565b9061063661062f926106266100c2565b938480926105cc565b03836105ed565b565b61064190610616565b90565b61064c6104eb565b506106576003610638565b90565b5f90565b61067b9161066a61065a565b5061067361081c565b919091610829565b600190565b5f90565b5f1c90565b90565b61069861069d91610684565b610689565b90565b6106aa905461068c565b90565b6106b5610680565b506106c060026106a0565b90565b916106ed926106d061065a565b506106e56106dc61081c565b82908491610886565b919091610952565b600190565b5f90565b90565b90565b61071061070b610715926106f6565b6106f9565b610330565b90565b6107206106f2565b5061072b60126106fc565b90565b90610738916109ef565b565b61074e6107496107539261017f565b6106f9565b61017f565b90565b61075f9061073a565b90565b61076b90610756565b90565b9061077890610762565b5f5260205260405f2090565b61079a61079f91610793610680565b505f61076e565b6106a0565b90565b6107aa6104eb565b506107b56004610638565b90565b6107d5916107c461065a565b506107cd61081c565b919091610952565b600190565b906107e490610762565b5f5260205260405f2090565b6108159161080b61081092610803610680565b5060016107da565b61076e565b6106a0565b90565b5f90565b610824610818565b503390565b916108379291600192610aa7565b565b6108429061018a565b9052565b60409061086f610876949695939661086560608401985f850190610839565b6020830190610269565b0190610269565b565b9061088391036101b9565b90565b9291926108948183906107f0565b90816108a96108a35f196101b9565b916101b9565b106108b6575b5050509050565b816108c96108c3876101b9565b916101b9565b106108ef576108e693946108de919392610878565b905f92610aa7565b805f80806108af565b5061090e849291925f938493637dc7a0d960e11b855260048501610846565b0390fd5b90565b61092961092461092e92610912565b6106f9565b61017f565b90565b61093a90610915565b90565b9190610950905f60208501940190610839565b565b918261096e6109686109635f610931565b61018a565b9161018a565b146109c8578161098e6109886109835f610931565b61018a565b9161018a565b146109a15761099f92919091610bfd565b565b6109c46109ad5f610931565b5f91829163ec442f0560e01b83526004830161093d565b0390fd5b6109eb6109d45f610931565b5f918291634b637e8f60e11b83526004830161093d565b0390fd5b80610a0a610a046109ff5f610931565b61018a565b9161018a565b14610a2657610a2491610a1c5f610931565b919091610bfd565b565b610a49610a325f610931565b5f91829163ec442f0560e01b83526004830161093d565b0390fd5b5f1b90565b90610a5e5f1991610a4d565b9181191691161790565b610a7c610a77610a81926101b9565b6106f9565b6101b9565b90565b90565b90610a9c610a97610aa392610a68565b610a84565b8254610a52565b9055565b909281610ac4610abe610ab95f610931565b61018a565b9161018a565b14610b8f5783610ae4610ade610ad95f610931565b61018a565b9161018a565b14610b6857610b0883610b03610afc600186906107da565b879061076e565b610a87565b610b12575b505050565b919091610b5d610b4b610b457f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92593610762565b93610762565b93610b546100c2565b91829182610276565b0390a35f8080610b0d565b610b8b610b745f610931565b5f918291634a1406b160e11b83526004830161093d565b0390fd5b610bb2610b9b5f610931565b5f91829163e602df0560e01b83526004830161093d565b0390fd5b634e487b7160e01b5f52601160045260245ffd5b610bd9610bdf919392936101b9565b926101b9565b8201809211610bea57565b610bb6565b90610bfa91016101b9565b90565b91909180610c1b610c15610c105f610931565b61018a565b9161018a565b145f14610cfc57610c3f610c3883610c3360026106a0565b610bca565b6002610a87565b5b82610c5b610c55610c505f610931565b61018a565b9161018a565b145f14610cd057610c7f610c7883610c7360026106a0565b610878565b6002610a87565b5b919091610ccb610cb9610cb37fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef93610762565b93610762565b93610cc26100c2565b91829182610276565b0390a3565b610cf782610cf1610ce25f879061076e565b91610cec836106a0565b610bef565b90610a87565b610c80565b610d0f610d0a5f839061076e565b6106a0565b80610d22610d1c856101b9565b916101b9565b10610d4a57610d35610d45918490610878565b610d405f849061076e565b610a87565b610c40565b90610d689091925f93849363391434e360e21b855260048501610846565b0390fd 0 0xe4f7dc8b199fdaac6693c9c412ea68aed9e1584d193e1c3478d30a6f01f26057 --rpc-url http://ethrex-dev:1729 + " + + ethrex-l2-hub: + container_name: l2-hub + image: "ghcr.io/lambdaclass/ethrex_l2_hub:latest" + pull_policy: always + depends_on: + ethrex-delegation-contracts: + condition: service_completed_successfully + ports: + - 5173:5173 + extra_hosts: + - 'host.docker.internal:host-gateway' + environment: + VITE_HEALTH_ENDPOINT: http://host.docker.internal:5555 + VITE_L1_NAME: "Ethrex L1 Local" + VITE_L1_RPC_URL: "http://localhost:8545" + VITE_L1_CHAIN_ID: 9 + VITE_L2_NAME: "Ethrex L2 Local" + VITE_L2_RPC_URL: "http://localhost:1729" + VITE_L2_CHAIN_ID: 65536999 + VITE_L2_BRIDGE_ADDRESS: "0x000000000000000000000000000000000000ffff" + VITE_DELEGATION_CONTRACT_ADDRESS: "0x12382432f3f26399ed9919e9422ba39e9415fe53" + VITE_TEST_TOKEN_CONTRACT_ADDRESS: "0xa0c79e7f98c9914c337d5b010af208b98f23f117" + +configs: + ethrex-sponsor-addresses: + content: | + 0x12382432f3f26399ed9919e9422ba39e9415fe53 + + nginx_conf: + content: | + map $$http_upgrade $$connection_upgrade { + default upgrade; + '' close; + } + + # L2 Blockscout - Main API/Frontend + server { + listen 8082; + server_name localhost; + proxy_http_version 1.1; + + location ~ ^/(api(?!-docs$$)|socket|sitemap.xml|auth/auth0|auth/auth0/callback|auth/logout) { + proxy_pass http://backend:4000; + proxy_http_version 1.1; + proxy_set_header Host "$$host"; + proxy_set_header X-Real-IP "$$remote_addr"; + proxy_set_header X-Forwarded-For "$$proxy_add_x_forwarded_for"; + proxy_set_header X-Forwarded-Proto "$$scheme"; + proxy_set_header Upgrade "$$http_upgrade"; + proxy_set_header Connection $$connection_upgrade; + proxy_cache_bypass $$http_upgrade; + } + + location / { + proxy_pass http://frontend:3000; + proxy_http_version 1.1; + proxy_set_header Host "$$host"; + proxy_set_header X-Real-IP "$$remote_addr"; + proxy_set_header X-Forwarded-For "$$proxy_add_x_forwarded_for"; + proxy_set_header X-Forwarded-Proto "$$scheme"; + proxy_set_header Upgrade "$$http_upgrade"; + proxy_set_header Connection $$connection_upgrade; + proxy_cache_bypass $$http_upgrade; + } + } + + # L2 Stats + server { + listen 8080; + server_name localhost; + proxy_http_version 1.1; + proxy_hide_header Access-Control-Allow-Origin; + proxy_hide_header Access-Control-Allow-Methods; + add_header 'Access-Control-Allow-Origin' 'http://localhost:8082' always; + add_header 'Access-Control-Allow-Credentials' 'true' always; + add_header 'Access-Control-Allow-Methods' 'PUT, GET, POST, OPTIONS, DELETE, PATCH' always; + + location / { + proxy_pass http://stats:8050/; + } + } + + # L2 Visualizer + server { + listen 8081; + server_name localhost; + proxy_http_version 1.1; + proxy_hide_header Access-Control-Allow-Origin; + proxy_hide_header Access-Control-Allow-Methods; + add_header 'Access-Control-Allow-Origin' 'http://localhost:8082' always; + add_header 'Access-Control-Allow-Credentials' 'true' always; + add_header 'Access-Control-Allow-Methods' 'PUT, GET, POST, OPTIONS, DELETE, PATCH' always; + add_header 'Access-Control-Allow-Headers' 'DNT,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization,x-csrf-token' always; + + location / { + proxy_pass http://visualizer:8050/; + } + } + + # L1 Blockscout - Main API/Frontend + server { + listen 8083; + server_name localhost; + proxy_http_version 1.1; + + location ~ ^/(api(?!-docs$$)|socket|sitemap.xml|auth/auth0|auth/auth0/callback|auth/logout) { + proxy_pass http://backend-l1:4000; + proxy_http_version 1.1; + proxy_set_header Host "$$host"; + proxy_set_header X-Real-IP "$$remote_addr"; + proxy_set_header X-Forwarded-For "$$proxy_add_x_forwarded_for"; + proxy_set_header X-Forwarded-Proto "$$scheme"; + proxy_set_header Upgrade "$$http_upgrade"; + proxy_set_header Connection $$connection_upgrade; + proxy_cache_bypass $$http_upgrade; + } + + location / { + proxy_pass http://frontend-l1:3000; + proxy_http_version 1.1; + proxy_set_header Host "$$host"; + proxy_set_header X-Real-IP "$$remote_addr"; + proxy_set_header X-Forwarded-For "$$proxy_add_x_forwarded_for"; + proxy_set_header X-Forwarded-Proto "$$scheme"; + proxy_set_header Upgrade "$$http_upgrade"; + proxy_set_header Connection $$connection_upgrade; + proxy_cache_bypass $$http_upgrade; + } + } + + # L1 Stats + server { + listen 8084; + server_name localhost; + proxy_http_version 1.1; + proxy_hide_header Access-Control-Allow-Origin; + proxy_hide_header Access-Control-Allow-Methods; + add_header 'Access-Control-Allow-Origin' 'http://localhost:8083' always; + add_header 'Access-Control-Allow-Credentials' 'true' always; + add_header 'Access-Control-Allow-Methods' 'PUT, GET, POST, OPTIONS, DELETE, PATCH' always; + + location / { + proxy_pass http://stats-l1:8050/; + } + } + + # L1 Visualizer + server { + listen 8085; + server_name localhost; + proxy_http_version 1.1; + proxy_hide_header Access-Control-Allow-Origin; + proxy_hide_header Access-Control-Allow-Methods; + add_header 'Access-Control-Allow-Origin' 'http://localhost:8083' always; + add_header 'Access-Control-Allow-Credentials' 'true' always; + add_header 'Access-Control-Allow-Methods' 'PUT, GET, POST, OPTIONS, DELETE, PATCH' always; + add_header 'Access-Control-Allow-Headers' 'DNT,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization,x-csrf-token' always; + + location / { + proxy_pass http://visualizer-l1:8050/; + } + } + +volumes: + blockscout-db-data: + stats-db-data: