├── .env.example ├── .gitignore ├── Makefile ├── README.md ├── config ├── bridge │ ├── claimtx.keystore │ └── config.toml ├── dac │ ├── config.toml │ └── dac-member.keystore ├── deploy_parameters.json.example ├── metrics │ └── prometheus │ │ └── prometheus.yml └── node │ ├── aggregator.keystore │ ├── config.toml │ ├── db_scripts │ ├── init_event_db.sql │ └── init_prover_db.sql │ ├── genesis.config.json │ ├── prover.config.json │ └── sequencer.keystore ├── docker-compose.yml ├── envs ├── common-blockscout.env ├── common-frontend.env ├── common-smart-contract-verifier.env ├── common-stats.env └── common-visualizer.env ├── package-lock.json ├── package.json ├── proxy ├── default.conf.template └── visualizer.conf.template ├── scripts ├── set-compose.js ├── set-configs.js └── set-keystore.js └── services ├── docker-compose-explorer-backend.yml ├── docker-compose-explorer-frontend.yml ├── docker-compose-explorer-nginx.yml ├── docker-compose-explorer-sig-provider.yml ├── docker-compose-explorer-smart-contract-verifier.yml ├── docker-compose-explorer-stats.yml └── docker-compose-explorer-visualizer.yml /.env.example: -------------------------------------------------------------------------------- 1 | COMMON_HOST=localhost 2 | KEYSTORE_PASSWORD=testonly 3 | L1_RPC_URL=http://zkevm-mock-l1-network:8545 4 | L1_WS_RPC_URL=ws://zkevm-mock-l1-network:8546 5 | L1_EXPLORER_URL=http://localhost:81 6 | ETHERSCAN_API_KEY= 7 | # see `secret_key_base` in https://hexdocs.pm/plug/Plug.Session.COOKIE.html 8 | # can be generated by https://hexdocs.pm/phoenix/Mix.Tasks.Phx.Gen.Secret.html 9 | EXPLORER_DOCKER_TAG_BACKEND=6.1.0 10 | EXPLORER_DOCKER_TAG_FRONTEND=v1.22.0 11 | EXPLORER_DOCKER_TAG_SIG_PROVIDER=v1.0.0 12 | EXPLORER_DOCKER_TAG_SMART_CONTRACT_VERIFIER=v1.6.0 13 | EXPLORER_DOCKER_TAG_STATS=v1.5.0 14 | EXPLORER_DOCKER_TAG_VISUALIZER=v0.2.0 15 | EXPLORER_L1_SECRET_KEY_BASE=5LSuVfZikCc3HVIyabkfoiqnUfwyhJaam8btXA3g5kHCi5CCu3iS9VZ28bC7LMiE 16 | EXPLORER_L2_SECRET_KEY_BASE=PGfceH3KD+rg3Po7hjvvG7vRepRgqA3R/45ApXbLfAhqyrj616/abOijFQ8lte5z 17 | EXPLORER_WALLET_CONNECT_PROJECT_ID= -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .env 3 | datastream.db/ 4 | datastream.bin 5 | node_modules 6 | deploy_output.json 7 | wallets.txt -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | DOCKERCOMPOSE := docker compose -f docker-compose.yml 2 | DOCKERCOMPOSEAPPSEQ := zkevm-sequencer 3 | DOCKERCOMPOSEAPPSEQSENDER := zkevm-sequence-sender 4 | DOCKERCOMPOSEAPPL2GASP := zkevm-l2gaspricer 5 | DOCKERCOMPOSEAPPAGG := zkevm-aggregator 6 | DOCKERCOMPOSEAPPRPC := zkevm-json-rpc 7 | DOCKERCOMPOSEAPPSYNC := zkevm-sync 8 | DOCKERCOMPOSEAPPETHTXMANAGER := zkevm-eth-tx-manager 9 | DOCKERCOMPOSESTATEDB := zkevm-state-db 10 | DOCKERCOMPOSEPOOLDB := zkevm-pool-db 11 | DOCKERCOMPOSEEVENTDB := zkevm-event-db 12 | DOCKERCOMPOSENETWORK := zkevm-mock-l1-network 13 | DOCKERCOMPOSEDEPLOYSEPOLIA := zkevm-deploy-sepolia 14 | DOCKERCOMPOSEDAC := zkevm-data-availability 15 | DOCKERCOMPOSESETUPDACMOCKL1 := dac-setup-committee-mock-l1 16 | DOCKERCOMPOSESETUPDACSEPOLIA := dac-setup-committee-sepolia 17 | DOCKERCOMPOSEEXPLORERL1 := explorer-backend-l1 18 | DOCKERCOMPOSEEXPLORERL1DB := explorer-backend-l1-db 19 | DOCKERCOMPOSEEXPLORERFRONTENDL1 := explorer-frontend-l1 20 | DOCKERCOMPOSEEXPLORERSTATSL1 := explorer-stats-l1 21 | DOCKERCOMPOSEEXPLORERSTATSDBL1 := explorer-stats-db-l1 22 | DOCKERCOMPOSEEXPLORERSMARTCONTRACTVERIFIER := explorer-smart-contract-verifier 23 | DOCKERCOMPOSEEXPLORERVISUALIZER := explorer-visualizer 24 | DOCKERCOMPOSEEXPLORERVISUALIZERPROXY := explorer-visualizer-proxy 25 | DOCKERCOMPOSEEXPLORERSIGPROVIDER := explorer-sig-provider 26 | DOCKERCOMPOSEEXPLORERPROXYL1 := explorer-proxy-l1 27 | DOCKERCOMPOSEEXPLORERL2 := explorer-backend-l2 28 | DOCKERCOMPOSEEXPLORERL2DB := explorer-backend-l2-db 29 | DOCKERCOMPOSEEXPLORERFRONTENDL2 := explorer-frontend-l2 30 | DOCKERCOMPOSEEXPLORERSTATSL2 := explorer-stats-l2 31 | DOCKERCOMPOSEEXPLORERSTATSDBL2 := explorer-stats-db-l2 32 | DOCKERCOMPOSEEXPLORERPROXYL2 := explorer-proxy-l2 33 | DOCKERCOMPOSEEXPLORERRPC := zkevm-explorer-json-rpc 34 | DOCKERCOMPOSEZKPROVER := zkevm-prover 35 | DOCKERCOMPOSEPERMISSIONLESSDB := zkevm-permissionless-db 36 | DOCKERCOMPOSEPERMISSIONLESSNODE := zkevm-permissionless-node 37 | DOCKERCOMPOSEPERMISSIONLESSNODEDAC := zkevm-node-forced-DAC 38 | DOCKERCOMPOSEPERMISSIONLESSZKPROVER := zkevm-permissionless-prover 39 | DOCKERCOMPOSENODEAPPROVE := zkevm-approve 40 | DOCKERCOMPOSEMETRICS := zkevm-metrics 41 | DOCKERCOMPOSEGRAFANA := grafana 42 | DOCKERCOMPOSEBRIDGEDB := zkevm-bridge-db 43 | DOCKERCOMPOSEBRIDGESERVICE := zkevm-bridge-service 44 | DOCKERCOMPOSEBRIDGEUI := zkevm-bridge-ui 45 | 46 | RUNSTATEDB := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSESTATEDB) 47 | RUNPOOLDB := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEPOOLDB) 48 | RUNEVENTDB := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEEVENTDB) 49 | RUNSEQUENCER := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEAPPSEQ) 50 | RUNSEQUENCESENDER := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEAPPSEQSENDER) 51 | RUNL2GASPRICER := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEAPPL2GASP) 52 | RUNAGGREGATOR := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEAPPAGG) 53 | RUNJSONRPC := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEAPPRPC) 54 | RUNSYNC := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEAPPSYNC) 55 | RUNETHTXMANAGER := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEAPPETHTXMANAGER) 56 | RUNGRAFANA := DOCKERGID=`stat -c '%g' /var/run/docker.sock` $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEGRAFANA) 57 | 58 | RUNDEPLOYSEPOLIA := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEDEPLOYSEPOLIA) 59 | RUNL1NETWORK := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSENETWORK) 60 | RUNDAC := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEDAC) 61 | RUNSETUPDACMOCKL1 := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSESETUPDACMOCKL1) 62 | RUNSETUPDACSEPOLIA := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSESETUPDACSEPOLIA) 63 | RUNEXPLORERL1 := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEEXPLORERL1) 64 | RUNEXPLORERL1DB := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEEXPLORERL1DB) 65 | RUNEXPLORERFRONTENDL1 := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEEXPLORERFRONTENDL1) 66 | RUNEXPLORERSTATSDBL1 := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEEXPLORERSTATSDBL1) 67 | RUNEXPLORERSTATSL1 := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEEXPLORERSTATSL1) 68 | RUNEXPLORERSMARTCONTRACTVERIFIER := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEEXPLORERSMARTCONTRACTVERIFIER) 69 | RUNEXPLORERVISUALIZER := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEEXPLORERVISUALIZER) 70 | RUNEXPLORERVISUALIZERPROXY := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEEXPLORERVISUALIZERPROXY) 71 | RUNEXPLORERSIGPROVIDER := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEEXPLORERSIGPROVIDER) 72 | RUNEXPLORERPROXYL1 := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEEXPLORERPROXYL1) 73 | RUNEXPLORERL2 := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEEXPLORERL2) 74 | RUNEXPLORERL2DB := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEEXPLORERL2DB) 75 | RUNEXPLORERFRONTENDL2 := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEEXPLORERFRONTENDL2) 76 | RUNEXPLORERSTATSDBL2 := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEEXPLORERSTATSDBL2) 77 | RUNEXPLORERSTATSL2 := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEEXPLORERSTATSL2) 78 | RUNEXPLORERPROXYL2 := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEEXPLORERPROXYL2) 79 | RUNEXPLORERJSONRPC := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEEXPLORERRPC) 80 | RUNZKPROVER := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEZKPROVER) 81 | 82 | RUNBRIDGEDB := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEBRIDGEDB) 83 | RUNBRIDGESERVICE := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEBRIDGESERVICE) 84 | RUNBRIDGEUI := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEBRIDGEUI) 85 | 86 | RUNPERMISSIONLESSDB := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEPERMISSIONLESSDB) 87 | RUNPERMISSIONLESSNODE := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEPERMISSIONLESSNODE) 88 | RUNPERMISSIONLESSNODEDAC := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEPERMISSIONLESSNODEDAC) 89 | RUNPERMISSIONLESSZKPROVER := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEPERMISSIONLESSZKPROVER) 90 | 91 | RUNAPPROVE := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSENODEAPPROVE) 92 | 93 | RUNMETRICS := $(DOCKERCOMPOSE) up -d $(DOCKERCOMPOSEMETRICS) 94 | 95 | RUN := $(DOCKERCOMPOSE) up -d 96 | 97 | STOPSTATEDB := $(DOCKERCOMPOSE) stop $(DOCKERCOMPOSESTATEDB) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSESTATEDB) 98 | STOPPOOLDB := $(DOCKERCOMPOSE) stop $(DOCKERCOMPOSEPOOLDB) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSEPOOLDB) 99 | STOPEVENTDB := $(DOCKERCOMPOSE) stop $(DOCKERCOMPOSEEVENTDB) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSEEVENTDB) 100 | STOPSEQUENCER := $(DOCKERCOMPOSE) stop $(DOCKERCOMPOSEAPPSEQ) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSEAPPSEQ) 101 | STOPSEQUENCESENDER := $(DOCKERCOMPOSE) stop $(DOCKERCOMPOSEAPPSEQSENDER) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSEAPPSEQSENDER) 102 | STOPL2GASPRICER := $(DOCKERCOMPOSE) stop $(DOCKERCOMPOSEAPPL2GASP) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSEAPPL2GASP) 103 | STOPAGGREGATOR := $(DOCKERCOMPOSE) stop $(DOCKERCOMPOSEAPPAGG) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSEAPPAGG) 104 | STOPJSONRPC := $(DOCKERCOMPOSE) stop $(DOCKERCOMPOSEAPPRPC) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSEAPPRPC) 105 | STOPSYNC := $(DOCKERCOMPOSE) stop $(DOCKERCOMPOSEAPPSYNC) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSEAPPSYNC) 106 | STOPETHTXMANAGER := $(DOCKERCOMPOSE) stop $(DOCKERCOMPOSEAPPETHTXMANAGER) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSEAPPETHTXMANAGER) 107 | STOPGRAFANA := $(DOCKERCOMPOSE) stop $(DOCKERCOMPOSEGRAFANA) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSEGRAFANA) 108 | 109 | STOPNETWORK := $(DOCKERCOMPOSE) stop $(DOCKERCOMPOSENETWORK) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSENETWORK) 110 | STOPEXPLORERL1 := $(DOCKERCOMPOSE) stop $(DOCKERCOMPOSEEXPLORERL1) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSEEXPLORERL1) 111 | STOPEXPLORERL1DB := $(DOCKERCOMPOSE) stop $(DOCKERCOMPOSEEXPLORERL1DB) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSEEXPLORERL1DB) 112 | STOPEXPLORERFRONTENDL1 := $(DOCKERCOMPOSE) stop -d $(DOCKERCOMPOSEEXPLORERFRONTENDL1) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSEEXPLORERFRONTENDL1) 113 | STOPEXPLORERSTATSDBL1 := $(DOCKERCOMPOSE) stop -d $(DOCKERCOMPOSEEXPLORERSTATSDBL1) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSEEXPLORERSTATSDBL1) 114 | STOPEXPLORERSTATSL1 := $(DOCKERCOMPOSE) stop -d $(DOCKERCOMPOSEEXPLORERSTATSL1) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSEEXPLORERSTATSL1) 115 | STOPEXPLORERSMARTCONTRACTVERIFIER := $(DOCKERCOMPOSE) stop -d $(DOCKERCOMPOSEEXPLORERSMARTCONTRACTVERIFIER) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSEEXPLORERSMARTCONTRACTVERIFIER) 116 | STOPEXPLORERVISUALIZER := $(DOCKERCOMPOSE) stop -d $(DOCKERCOMPOSEEXPLORERVISUALIZER) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSEEXPLORERVISUALIZER) 117 | STOPEXPLORERVISUALIZERPROXY := $(DOCKERCOMPOSE) stop -d $(DOCKERCOMPOSEEXPLORERVISUALIZERPROXY) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSEEXPLORERVISUALIZERPROXY) 118 | STOPEXPLORERSIGPROVIDER := $(DOCKERCOMPOSE) stop -d $(DOCKERCOMPOSEEXPLORERSIGPROVIDER) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSEEXPLORERSIGPROVIDER) 119 | STOPEXPLORERPROXYL1 := $(DOCKERCOMPOSE) stop -d $(DOCKERCOMPOSEEXPLORERPROXYL1) 120 | STOPEXPLORERFRONTENDL2 := $(DOCKERCOMPOSE) stop -d $(DOCKERCOMPOSEEXPLORERFRONTENDL2) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSEEXPLORERFRONTENDL2) 121 | STOPEXPLORERSTATSDBL2 := $(DOCKERCOMPOSE) stop -d $(DOCKERCOMPOSEEXPLORERSTATSDBL2) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSEEXPLORERSTATSDBL2) 122 | STOPEXPLORERSTATSL2 := $(DOCKERCOMPOSE) stop -d $(DOCKERCOMPOSEEXPLORERSTATSL2) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSEEXPLORERSTATSL2) 123 | STOPEXPLORERPROXYL2 := $(DOCKERCOMPOSE) stop -d $(DOCKERCOMPOSEEXPLORERPROXYL2) 124 | STOPEXPLORERL2 := $(DOCKERCOMPOSE) stop $(DOCKERCOMPOSEEXPLORERL2) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSEEXPLORERL2) 125 | STOPEXPLORERL2DB := $(DOCKERCOMPOSE) stop $(DOCKERCOMPOSEEXPLORERL2DB) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSEEXPLORERL2DB) 126 | STOPEXPLORERJSONRPC := $(DOCKERCOMPOSE) stop $(DOCKERCOMPOSEEXPLORERRPC) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSEEXPLORERRPC) 127 | STOPZKPROVER := $(DOCKERCOMPOSE) stop $(DOCKERCOMPOSEZKPROVER) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSEZKPROVER) 128 | 129 | STOPPERMISSIONLESSDB := $(DOCKERCOMPOSE) stop $(DOCKERCOMPOSEPERMISSIONLESSDB) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSEPERMISSIONLESSDB) 130 | STOPPERMISSIONLESSNODE := $(DOCKERCOMPOSE) stop $(DOCKERCOMPOSEPERMISSIONLESSNODE) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSEPERMISSIONLESSNODE) 131 | STOPPERMISSIONLESSNODEDAC := $(DOCKERCOMPOSE) stop $(DOCKERCOMPOSEPERMISSIONLESSNODEDAC) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSEPERMISSIONLESSNODEDAC) 132 | STOPPERMISSIONLESSZKPROVER := $(DOCKERCOMPOSE) stop $(DOCKERCOMPOSEPERMISSIONLESSZKPROVER) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSEPERMISSIONLESSZKPROVER) 133 | 134 | STOPAPPROVE := $(DOCKERCOMPOSE) stop $(DOCKERCOMPOSENODEAPPROVE) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSENODEAPPROVE) 135 | 136 | STOPMETRICS := $(DOCKERCOMPOSE) stop $(DOCKERCOMPOSEMETRICS) && $(DOCKERCOMPOSE) rm -f $(DOCKERCOMPOSEMETRICS) 137 | 138 | STOP := $(DOCKERCOMPOSE) down --remove-orphans 139 | STOPCLEAN := $(DOCKERCOMPOSE) down --remove-orphans -v 140 | 141 | RUNDACDB := docker compose up -d zkevm-data-node-db 142 | STOPDACDB := docker compose stop zkevm-data-node-db && docker compose rm -f zkevm-data-node-db 143 | 144 | .PHONY: test-full-non-e2e 145 | test-full-non-e2e: stop ## Runs non-e2e tests checking race conditions 146 | $(RUNSTATEDB) 147 | $(RUNPOOLDB) 148 | $(RUNEVENTDB) 149 | sleep 2 150 | $(RUNZKPROVER) 151 | sleep 7 152 | $(RUNL1NETWORK) 153 | sleep 15 154 | docker logs $(DOCKERCOMPOSEZKPROVER) 155 | trap '$(STOP)' EXIT; MallocNanoZone=0 go test -count=1 -short -race -p 1 -covermode=atomic -coverprofile=../coverage.out -timeout 70s ../... 156 | 157 | .PHONY: test-e2e-group-1 158 | test-e2e-group-1: stop ## Runs group 1 e2e tests checking race conditions 159 | $(RUNSTATEDB) 160 | $(RUNPOOLDB) 161 | $(RUNEVENTDB) 162 | sleep 5 163 | $(RUNZKPROVER) 164 | docker ps -a 165 | docker logs $(DOCKERCOMPOSEZKPROVER) 166 | trap '$(STOP)' EXIT; MallocNanoZone=0 go test -count=1 -race -v -p 1 -timeout 600s ../ci/e2e-group1/... 167 | 168 | .PHONY: test-e2e-group-2 169 | test-e2e-group-2: stop ## Runs group 2 e2e tests checking race conditions 170 | $(RUNSTATEDB) 171 | $(RUNPOOLDB) 172 | $(RUNEVENTDB) 173 | sleep 5 174 | $(RUNZKPROVER) 175 | docker ps -a 176 | docker logs $(DOCKERCOMPOSEZKPROVER) 177 | trap '$(STOP)' EXIT; MallocNanoZone=0 go test -count=1 -race -v -p 1 -timeout 600s ../ci/e2e-group2/... 178 | 179 | .PHONY: test-e2e-group-3 180 | test-e2e-group-3: stop ## Runs group 3 e2e tests checking race conditions 181 | $(RUNSTATEDB) 182 | $(RUNPOOLDB) 183 | $(RUNEVENTDB) 184 | sleep 5 185 | $(RUNZKPROVER) 186 | docker ps -a 187 | docker logs $(DOCKERCOMPOSEZKPROVER) 188 | trap '$(STOP)' EXIT; MallocNanoZone=0 go test -count=1 -race -v -p 1 -timeout 600s ../ci/e2e-group3/... 189 | 190 | .PHONY: test-e2e-group-4 191 | test-e2e-group-4: stop ## Runs group 4 e2e tests checking race conditions 192 | $(RUNSTATEDB) 193 | $(RUNPOOLDB) 194 | $(RUNEVENTDB) 195 | sleep 5 196 | $(RUNZKPROVER) 197 | docker ps -a 198 | docker logs $(DOCKERCOMPOSEZKPROVER) 199 | trap '$(STOP)' EXIT; MallocNanoZone=0 go test -count=1 -race -v -p 1 -timeout 600s ../ci/e2e-group4/... 200 | 201 | .PHONY: test-e2e-group-5 202 | test-e2e-group-5: stop ## Runs group 5 e2e tests checking race conditions 203 | $(RUNSTATEDB) 204 | $(RUNPOOLDB) 205 | $(RUNEVENTDB) 206 | sleep 5 207 | $(RUNZKPROVER) 208 | docker ps -a 209 | docker logs $(DOCKERCOMPOSEZKPROVER) 210 | trap '$(STOP)' EXIT; MallocNanoZone=0 go test -count=1 -race -v -p 1 -timeout 1200s ../ci/e2e-group5/... 211 | 212 | .PHONY: test-e2e-group-6 213 | test-e2e-group-6: stop ## Runs group 6 e2e tests checking race conditions 214 | $(RUNSTATEDB) 215 | $(RUNPOOLDB) 216 | $(RUNEVENTDB) 217 | sleep 5 218 | $(RUNZKPROVER) 219 | docker ps -a 220 | docker logs $(DOCKERCOMPOSEZKPROVER) 221 | trap '$(STOP)' EXIT; MallocNanoZone=0 go test -count=1 -race -v -p 1 -timeout 600s ../ci/e2e-group6/... 222 | 223 | .PHONY: test-e2e-group-7 224 | test-e2e-group-7: stop ## Runs group 7 e2e tests checking race conditions 225 | $(RUNSTATEDB) 226 | $(RUNPOOLDB) 227 | $(RUNEVENTDB) 228 | sleep 5 229 | $(RUNZKPROVER) 230 | docker ps -a 231 | docker logs $(DOCKERCOMPOSEZKPROVER) 232 | trap '$(STOP)' EXIT; MallocNanoZone=0 go test -count=1 -race -v -p 1 -timeout 600s ../ci/e2e-group7/... 233 | 234 | .PHONY: test-e2e-group-8 235 | test-e2e-group-8: stop ## Runs group 8 e2e tests checking race conditions 236 | $(RUNSTATEDB) 237 | $(RUNPOOLDB) 238 | $(RUNEVENTDB) 239 | sleep 5 240 | $(RUNZKPROVER) 241 | docker ps -a 242 | docker logs $(DOCKERCOMPOSEZKPROVER) 243 | trap '$(STOP)' EXIT; MallocNanoZone=0 go test -count=1 -race -v -p 1 -timeout 1200s ../ci/e2e-group8/... 244 | 245 | 246 | .PHONY: test-e2e-group-9 247 | test-e2e-group-9: stop ## Runs group 9 e2e tests checking race conditions 248 | $(RUNSTATEDB) 249 | $(RUNPOOLDB) 250 | $(RUNEVENTDB) 251 | sleep 5 252 | $(RUNZKPROVER) 253 | docker ps -a 254 | docker logs $(DOCKERCOMPOSEZKPROVER) 255 | trap '$(STOP)' EXIT; MallocNanoZone=0 go test -count=1 -race -v -p 1 -timeout 2000s ../ci/e2e-group9/... 256 | 257 | 258 | .PHONY: test-e2e-group-10 259 | test-e2e-group-10: stop ## Runs group 10 e2e tests checking race conditions 260 | $(RUNSTATEDB) 261 | $(RUNPOOLDB) 262 | $(RUNEVENTDB) 263 | sleep 5 264 | $(RUNZKPROVER) 265 | docker ps -a 266 | docker logs $(DOCKERCOMPOSEZKPROVER) 267 | trap '$(STOP)' EXIT; MallocNanoZone=0 go test -count=1 -race -v -p 1 -timeout 2000s ../ci/e2e-group10/... 268 | 269 | 270 | .PHONY: test-e2e-group-11 271 | test-e2e-group-11: stop ## Runs group 11 e2e tests checking race conditions 272 | $(RUNSTATEDB) 273 | $(RUNPOOLDB) 274 | $(RUNEVENTDB) 275 | sleep 5 276 | $(RUNZKPROVER) 277 | docker ps -a 278 | docker logs $(DOCKERCOMPOSEZKPROVER) 279 | trap '$(STOP)' EXIT; MallocNanoZone=0 go test -count=1 -race -v -p 1 -timeout 2000s ../ci/e2e-group11/... 280 | 281 | .PHONY: test-e2e-group-cdk-validium-1 282 | test-e2e-group-cdk-validium-1: stop ## Runs cdk-validium-1 e2e tests checking race conditions 283 | $(RUNSTATEDB) 284 | $(RUNPOOLDB) 285 | $(RUNEVENTDB) 286 | sleep 5 287 | $(RUNZKPROVER) 288 | docker ps -a 289 | docker logs $(DOCKERCOMPOSEZKPROVER) 290 | trap '$(STOP)' EXIT; MallocNanoZone=0 go test -count=1 -race -v -p 1 -timeout 2000s ../ci/e2e-group-cdk-validium-1/... 291 | 292 | .PHONY: benchmark-sequencer-eth-transfers 293 | benchmark-sequencer-eth-transfers: stop 294 | $(RUNL1NETWORK) 295 | $(RUNSTATEDB) 296 | $(RUNPOOLDB) 297 | $(RUNEVENTDB) 298 | sleep 5 299 | $(RUNZKPROVER) 300 | $(RUNSYNC) 301 | sleep 2 302 | $(RUNL2GASPRICER) 303 | $(RUNJSONRPC) 304 | docker ps -a 305 | docker logs $(DOCKERCOMPOSEZKPROVER) 306 | @ cd benchmarks/sequencer/e2e/eth-transfers ; \ 307 | mkdir -p results ; \ 308 | touch ./results/out.dat ; \ 309 | go test -bench=. -timeout=600m | tee ./results/out.dat ; 310 | 311 | .PHONY: benchmark-sequencer-erc20-transfers 312 | benchmark-sequencer-erc20-transfers: stop 313 | $(RUNL1NETWORK) 314 | $(RUNSTATEDB) 315 | $(RUNPOOLDB) 316 | $(RUNEVENTDB) 317 | sleep 5 318 | $(RUNZKPROVER) 319 | $(RUNSYNC) 320 | sleep 2 321 | $(RUNL2GASPRICER) 322 | $(RUNJSONRPC) 323 | docker ps -a 324 | docker logs $(DOCKERCOMPOSEZKPROVER) 325 | @ cd benchmarks/sequencer/e2e/erc20-transfers ; \ 326 | mkdir -p results ; \ 327 | touch ./results/out.dat ; \ 328 | go test -bench=. -timeout=600m | tee ./results/out.dat ; 329 | 330 | 331 | .PHONY: benchmark-sequencer-uniswap-transfers 332 | benchmark-sequencer-uniswap-transfers: stop 333 | $(RUNL1NETWORK) 334 | $(RUNSTATEDB) 335 | $(RUNPOOLDB) 336 | $(RUNEVENTDB) 337 | sleep 5 338 | $(RUNZKPROVER) 339 | $(RUNSYNC) 340 | sleep 2 341 | $(RUNL2GASPRICER) 342 | $(RUNJSONRPC) 343 | docker ps -a 344 | docker logs $(DOCKERCOMPOSEZKPROVER) 345 | @ cd benchmarks/sequencer/e2e/uniswap-transfers ; \ 346 | mkdir -p results ; \ 347 | touch ./results/out.dat ; \ 348 | go test -bench=. -timeout=600m | tee ./results/out.dat ; 349 | 350 | .PHONY: run-db 351 | run-db: ## Runs the node database 352 | $(RUNSTATEDB) 353 | $(RUNPOOLDB) 354 | $(RUNEVENTDB) 355 | 356 | .PHONY: stop-db 357 | stop-db: ## Stops the node database 358 | $(STOPEVENTDB) 359 | $(STOPPOOLDB) 360 | $(STOPSTATEDB) 361 | 362 | .PHONY: run-node 363 | run-node: ## Runs the node 364 | $(RUNSYNC) 365 | sleep 4 366 | $(RUNETHTXMANAGER) 367 | $(RUNSEQUENCER) 368 | $(RUNSEQUENCESENDER) 369 | $(RUNL2GASPRICER) 370 | $(RUNAGGREGATOR) 371 | $(RUNJSONRPC) 372 | 373 | .PHONY: stop-node 374 | stop-node: ## Stops the node 375 | $(STOPSEQUENCER) 376 | $(STOPSEQUENCESENDER) 377 | $(STOPJSONRPC) 378 | $(STOPL2GASPRICER) 379 | $(STOPAGGREGATOR) 380 | $(STOPSYNC) 381 | $(STOPETHTXMANAGER) 382 | 383 | .PHONY: run-network 384 | run-network: ## Runs the l1 network 385 | $(RUNL1NETWORK) 386 | 387 | .PHONY: stop-network 388 | stop-network: ## Stops the l1 network 389 | $(STOPNETWORK) 390 | 391 | .PHONY: run-zkprover 392 | run-zkprover: ## Runs zkprover 393 | $(RUNZKPROVER) 394 | 395 | .PHONY: stop-zkprover 396 | stop-zkprover: ## Stops zkprover 397 | $(STOPZKPROVER) 398 | 399 | .PHONY: run-explorer-services 400 | run-explorer-services: ## Runs blockscout explorer services 401 | $(RUNEXPLORERSMARTCONTRACTVERIFIER) 402 | $(RUNEXPLORERVISUALIZER) 403 | $(RUNEXPLORERVISUALIZERPROXY) 404 | $(RUNEXPLORERSIGPROVIDER) 405 | 406 | .PHONY: run-l1-explorer 407 | run-l1-explorer: ## Runs L1 blockscout explorer 408 | $(RUNEXPLORERL1DB) 409 | $(RUNEXPLORERL1) 410 | $(RUNEXPLORERFRONTENDL1) 411 | $(RUNEXPLORERSTATSDBL1) 412 | $(RUNEXPLORERSTATSL1) 413 | $(RUNEXPLORERPROXYL1) 414 | 415 | .PHONY: run-l2-explorer 416 | run-l2-explorer: ## Runs L2 blockscout explorer 417 | $(RUNEXPLORERL2DB) 418 | $(RUNEXPLORERJSONRPC) 419 | $(RUNEXPLORERL2) 420 | $(RUNEXPLORERFRONTENDL2) 421 | $(RUNEXPLORERSTATSDBL2) 422 | $(RUNEXPLORERSTATSL2) 423 | $(RUNEXPLORERPROXYL2) 424 | 425 | .PHONY: run-l2-explorer-json-rpc 426 | run-l2-explorer-json-rpc: ## Runs L2 explorer json rpc 427 | $(RUNEXPLORERJSONRPC) 428 | 429 | .PHONY: stop-l2-explorer-json-rpc 430 | stop-l2-explorer-json-rpc: ## Stops L2 explorer json rpc 431 | $(STOPEXPLORERJSONRPC) 432 | 433 | .PHONY: run-explorer 434 | run-explorer: run-l1-explorer run-l2-explorer run-explorer-services ## Runs L1 explorer and services 435 | 436 | .PHONY: stop-explorer 437 | stop-explorer: ## Stops the explorer 438 | $(STOPEXPLORERL2) 439 | $(STOPEXPLORERL1) 440 | $(STOPEXPLORERJSONRPC) 441 | $(STOPEXPLORERL2DB) 442 | $(STOPEXPLORERL1DB) 443 | $(STOPEXPLORERFRONTENDL1) 444 | $(STOPEXPLORERSTATSDBL1) 445 | $(STOPEXPLORERSTATSL1) 446 | $(STOPEXPLORERSMARTCONTRACTVERIFIER) 447 | $(STOPEXPLORERVISUALIZER) 448 | $(STOPEXPLORERVISUALIZERPROXY) 449 | $(STOPEXPLORERSIGPROVIDER) 450 | $(STOPEXPLORERPROXYL1) 451 | $(STOPEXPLORERFRONTENDL2) 452 | $(STOPEXPLORERSTATSDBL2) 453 | $(STOPEXPLORERSTATSL2) 454 | $(STOPEXPLORERPROXYL2) 455 | 456 | .PHONY: run-explorer-db 457 | run-explorer-db: ## Runs the explorer database 458 | $(RUNEXPLORERL1DB) 459 | $(RUNEXPLORERL2DB) 460 | 461 | .PHONY: stop-explorer-db 462 | stop-explorer-db: ## Stops the explorer database 463 | $(STOPEXPLORERL2DB) 464 | $(STOPEXPLORERL1DB) 465 | 466 | .PHONY: run-seq 467 | run-seq: ## runs the sequencer 468 | $(RUNSEQUENCER) 469 | 470 | .PHONY: stop-seq 471 | stop-seq: ## stops the sequencer 472 | $(STOPSEQUENCER) 473 | 474 | .PHONY: run-seqsender 475 | run-seqsender: ## runs the sequencer sender 476 | $(RUNSEQUENCESENDER) 477 | 478 | .PHONY: stop-seqsender 479 | stop-seqsender: ## stops the sequencer sender 480 | $(STOPSEQUENCESENDER) 481 | 482 | .PHONY: run-sync 483 | run-sync: ## runs the synchronizer 484 | $(RUNSYNC) 485 | 486 | .PHONY: stop-sync 487 | stop-sync: ## stops the synchronizer 488 | $(STOPSYNC) 489 | 490 | .PHONY: run-json-rpc 491 | run-json-rpc: ## runs the JSON-RPC 492 | $(RUNJSONRPC) 493 | 494 | .PHONY: stop-json-rpc 495 | stop-json-rpc: ## stops the JSON-RPC 496 | $(STOPJSONRPC) 497 | 498 | .PHONY: run-l2gaspricer 499 | run-l2gaspricer: ## runs the L2 Gas Price component 500 | $(RUNL2GASPRICER) 501 | 502 | .PHONY: stop-l2gaspricer 503 | stop-l2gaspricer: ## stops the L2 Gas Price component 504 | $(STOPL2GASPRICER) 505 | 506 | .PHONY: run-eth-tx-manager 507 | run-eth-tx-manager: ## Runs the eth tx manager service 508 | $(RUNETHTXMANAGER) 509 | 510 | .PHONY: stop-eth-tx-manager 511 | stop-eth-tx-manager: ## Stops the eth tx manager service 512 | $(STOPETHTXMANAGER) 513 | 514 | .PHONY: run-agg 515 | run-agg: ## Runs the aggregator service 516 | $(RUNAGGREGATOR) 517 | 518 | .PHONY: stop-agg 519 | stop-agg: ## Stops the aggregator service 520 | $(STOPAGGREGATOR) 521 | 522 | .PHONY: run-grafana 523 | run-grafana: ## Runs the grafana service 524 | $(RUNGRAFANA) 525 | 526 | .PHONY: stop-grafana 527 | stop-grafana: ## Stops the grafana service 528 | $(STOPGRAFANA) 529 | 530 | .PHONY: run-permissionless 531 | run-permissionless: run-node run-permissionless-dependencies ## Runs the trusted and permissionless node 532 | $(RUNPERMISSIONLESSDB) 533 | sleep 3 534 | $(RUNPERMISSIONLESSZKPROVER) 535 | $(RUNPERMISSIONLESSNODE) 536 | 537 | .PHONY: stop-permissionless 538 | stop-permissionless: stop-node stop-permissionless-dependencies ## Stops the permissionless node 539 | $(STOPPERMISSIONLESSNODE) 540 | 541 | 542 | PHONY: run-permissionless-dependencies 543 | run-permissionless-dependencies: ## Runs the permissionless dependencies (db + prover) without the node 544 | $(RUNPERMISSIONLESSDB) 545 | sleep 3 546 | $(RUNPERMISSIONLESSZKPROVER) 547 | 548 | 549 | PHONY: stop-permissionless-dependencies 550 | stop-permissionless-dependencies: ## Stop the permissionless dependencies (db + prover) without the node 551 | $(STOPPERMISSIONLESSNODE) 552 | $(STOPPERMISSIONLESSZKPROVER) 553 | $(STOPPERMISSIONLESSDB) 554 | 555 | .PHONY: run-approve-matic 556 | run-approve-matic: ## Runs approve in node container 557 | $(RUNAPPROVE) 558 | 559 | .PHONY: stop-approve-matic 560 | stop-approve-matic: ## Stops approve in node container 561 | $(STOPAPPROVE) 562 | 563 | .PHONY: run-dac 564 | run-dac: ## Runs the DAC DB and service 565 | $(RUNDACDB) 566 | $(RUNDAC) 567 | 568 | .PHONY: run-bridge 569 | run-bridge: ## Runs the native bridge 570 | $(RUNBRIDGEDB) 571 | sleep 1 572 | $(RUNBRIDGESERVICE) 573 | sleep 1 574 | $(RUNBRIDGEUI) 575 | 576 | .PHONY: run 577 | run: ## Runs a full node 578 | $(MAKE) gasless on 579 | $(MAKE) run-db 580 | $(RUNL1NETWORK) 581 | sleep 2 582 | $(RUNZKPROVER) 583 | $(RUNAPPROVE) 584 | sleep 3 585 | $(MAKE) run-node 586 | $(MAKE) run-dac 587 | $(MAKE) run-bridge 588 | $(MAKE) run-explorer 589 | $(MAKE) run-metrics 590 | 591 | .PHONY: run-resume 592 | run-resume: ## Resumes a full node 593 | $(MAKE) run-db 594 | $(RUNL1NETWORK) 595 | sleep 2 596 | $(RUNZKPROVER) 597 | sleep 3 598 | $(MAKE) run-node 599 | $(MAKE) run-dac 600 | $(MAKE) run-bridge 601 | $(MAKE) run-explorer 602 | $(MAKE) run-metrics 603 | 604 | .PHONY: run-sepolia 605 | run-sepolia: 606 | $(MAKE) gasless on 607 | $(MAKE) run-db 608 | sleep 2 609 | $(RUNZKPROVER) 610 | sleep 3 611 | $(MAKE) run-node 612 | $(MAKE) run-dac 613 | $(MAKE) run-bridge 614 | $(MAKE) run-l2-explorer 615 | $(MAKE) run-metrics 616 | 617 | .PHONY: run-sepolia-restart 618 | run-sepolia-restart: 619 | $(MAKE) gasless off 620 | $(MAKE) stop-node 621 | $(MAKE) run-node 622 | 623 | .PHONY: run-sepolia-resume 624 | run-sepolia-resume: 625 | $(MAKE) gasless off 626 | $(MAKE) run-db 627 | sleep 2 628 | $(RUNZKPROVER) 629 | sleep 3 630 | $(MAKE) run-node 631 | $(MAKE) run-dac 632 | $(MAKE) run-bridge 633 | $(MAKE) run-l2-explorer 634 | $(MAKE) run-metrics 635 | 636 | .PHONY: gasless-on gasless-off 637 | gasless-on gasless-off: 638 | @: 639 | 640 | .PHONY: gasless 641 | gasless: ## Controls gasless mode 642 | @if [ "$(MAKECMDGOALS)" = "gasless on" ]; then \ 643 | sed -i 's/DefaultMinGasPriceAllowed = 1000000000/DefaultMinGasPriceAllowed = 0/g' config/node/config.toml; \ 644 | sed -i 's/EnableL2SuggestedGasPricePolling = true/EnableL2SuggestedGasPricePolling = false/g' config/node/config.toml; \ 645 | sed -i 's/DefaultGasPriceWei = 1000000000/DefaultGasPriceWei = 0/g' config/node/config.toml; \ 646 | elif [ "$(MAKECMDGOALS)" = "gasless off" ]; then \ 647 | sed -i 's/DefaultMinGasPriceAllowed = 0/DefaultMinGasPriceAllowed = 1000000000/g' config/node/config.toml; \ 648 | sed -i 's/EnableL2SuggestedGasPricePolling = false/EnableL2SuggestedGasPricePolling = true/g' config/node/config.toml; \ 649 | sed -i 's/DefaultGasPriceWei = 0/DefaultGasPriceWei = 1000000000/g' config/node/config.toml; \ 650 | else \ 651 | echo "Invalid command. Use 'make gasless on' or 'make gasless off'"; \ 652 | fi 653 | 654 | ## to prevent make from complaining about "No rule to make target 'on'/'off'" 655 | %: 656 | @: 657 | 658 | .PHONY: set-env 659 | set-env: 660 | cp .env.example .env 661 | sed -i 's/COMMON_HOST=localhost/COMMON_HOST=$(host)/' .env 662 | 663 | .PHONY: stop 664 | stop: ## Stops all services 665 | $(STOP) 666 | 667 | .PHONY: stop-clean 668 | stop-clean: ## Stops all services and remove volumes 669 | $(STOPCLEAN) 670 | $(MAKE) gasless on 671 | 672 | .PHONY: ship 673 | ship: ## Builds docker images and run them 674 | cd .. && make build-docker && cd ./test && make run 675 | 676 | .PHONY: reship 677 | reship: stop ship ## Executes `make stop` and `make sail` commands 678 | 679 | .PHONY: restart 680 | restart: stop run ## Executes `make stop` and `make run` commands 681 | 682 | .PHONY: run-metrics 683 | run-metrics: ## Runs the metrics container 684 | $(RUNMETRICS) 685 | 686 | .PHONY: stop-metrics 687 | stop-metrics: ## Stops the metrics container 688 | $(STOPMETRICS) 689 | 690 | .PHONY: init-network 691 | init-network: ## Initializes the network 692 | go run ./scripts/init_network/main.go . 693 | 694 | .PHONY: deploy-sc 695 | deploy-sc: ## deploys some examples of transactions and smart contracts 696 | go run ./scripts/deploy_sc/main.go . 697 | 698 | .PHONY: send-transfers 699 | send-transfers: ## sends some ETH transfers txs to test the network 700 | go run ./scripts/send_transfers/main.go . 701 | 702 | .PHONY: deploy-uniswap 703 | deploy-uniswap: ## deploy the uniswap environment to the network 704 | go run ./scripts/uniswap/main.go . 705 | 706 | .PHONY: run-db-scripts 707 | run-db-scripts: ## Executes scripts on the db after it has been initialized, potentially using info from the environment 708 | ./scripts/postgres/run.sh 709 | 710 | .PHONY: install-mockery 711 | install-mockery: ## Installs mockery with the correct version to generate the mocks 712 | go install github.com/vektra/mockery/v2@v2.22.1 713 | 714 | .PHONY: generate-mocks 715 | generate-mocks: generate-mocks-jsonrpc generate-mocks-sequencer generate-mocks-synchronizer generate-mocks-etherman generate-mocks-aggregator ## Generates mocks for the tests, using mockery tool 716 | 717 | .PHONY: generate-mocks-jsonrpc 718 | generate-mocks-jsonrpc: ## Generates mocks for jsonrpc , using mockery tool 719 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=storageInterface --dir=../jsonrpc --output=../jsonrpc --outpkg=jsonrpc --inpackage --structname=storageMock --filename=mock_storage.go 720 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=PoolInterface --dir=../jsonrpc/types --output=../jsonrpc/mocks --outpkg=mocks --structname=PoolMock --filename=mock_pool.go 721 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=StateInterface --dir=../jsonrpc/types --output=../jsonrpc/mocks --outpkg=mocks --structname=StateMock --filename=mock_state.go 722 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=EthermanInterface --dir=../jsonrpc/types --output=../jsonrpc/mocks --outpkg=mocks --structname=EthermanMock --filename=mock_etherman.go 723 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=Tx --srcpkg=github.com/jackc/pgx/v4 --output=../jsonrpc/mocks --outpkg=mocks --structname=DBTxMock --filename=mock_dbtx.go 724 | 725 | .PHONY: generate-mocks-sequencer 726 | generate-mocks-sequencer: ## Generates mocks for sequencer , using mockery tool 727 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=workerInterface --dir=../sequencer --output=../sequencer --outpkg=sequencer --inpackage --structname=WorkerMock --filename=mock_worker.go 728 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=stateInterface --dir=../sequencer --output=../sequencer --outpkg=sequencer --inpackage --structname=StateMock --filename=mock_state.go 729 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=txPool --dir=../sequencer --output=../sequencer --outpkg=sequencer --inpackage --structname=PoolMock --filename=mock_pool.go 730 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=Tx --srcpkg=github.com/jackc/pgx/v4 --output=../sequencer --outpkg=sequencer --structname=DbTxMock --filename=mock_dbtx.go 731 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=dbManagerInterface --dir=../sequencer --output=../sequencer --outpkg=sequencer --inpackage --structname=DbManagerMock --filename=mock_db_manager.go 732 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=etherman --dir=../sequencer --output=../sequencer --outpkg=sequencer --inpackage --structname=EthermanMock --filename=mock_etherman.go 733 | 734 | .PHONY: generate-mocks-synchronizer 735 | generate-mocks-synchronizer: ## Generates mocks for synchronizer , using mockery tool 736 | ## mocks for synchronizer 737 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=EthermanInterface --dir=../synchronizer --output=../synchronizer --outpkg=synchronizer --structname=ethermanMock --filename=mock_etherman.go 738 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=stateInterface --dir=../synchronizer --output=../synchronizer --outpkg=synchronizer --structname=stateMock --filename=mock_state.go 739 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=ethTxManager --dir=../synchronizer --output=../synchronizer --outpkg=synchronizer --structname=ethTxManagerMock --filename=mock_ethtxmanager.go 740 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=poolInterface --dir=../synchronizer --output=../synchronizer --outpkg=synchronizer --structname=poolMock --filename=mock_pool.go 741 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=zkEVMClientInterface --dir=../synchronizer --output=../synchronizer --outpkg=synchronizer --structname=zkEVMClientMock --filename=mock_zkevmclient.go 742 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=Tx --srcpkg=github.com/jackc/pgx/v4 --output=../synchronizer --outpkg=synchronizer --structname=dbTxMock --filename=mock_dbtx.go 743 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=l1RollupProducerInterface --dir=../synchronizer --output=../synchronizer --outpkg=synchronizer --structname=l1RollupProducerInterfaceMock --filename=mock_l1_rollup_producer_interface.go --inpackage 744 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=l1RollupConsumerInterface --dir=../synchronizer --output=../synchronizer --outpkg=synchronizer --structname=l1RollupConsumerInterfaceMock --filename=mock_l1_rollup_consumer_interface.go --inpackage 745 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=worker --dir=../synchronizer --output=../synchronizer --outpkg=synchronizer --structname=workerMock --filename=mock_l1_worker.go --inpackage 746 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=synchronizerProcessBlockRangeInterface --dir=../synchronizer --output=../synchronizer --outpkg=synchronizer --structname=synchronizerProcessBlockRangeMock --filename=mock_synchronizer_process_block_range.go --inpackage 747 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=workersInterface --dir=../synchronizer --output=../synchronizer --outpkg=synchronizer --structname=workersMock --filename=mock_workers.go --inpackage 748 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=ClientFactoryInterface --srcpkg=github.com/0xPolygon/cdk-data-availability/client --output=../synchronizer --outpkg=synchronizer --structname=dataCommitteeClientFactoryMock --filename=mock_datacommitteeclientfactory.go 749 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=ClientInterface --srcpkg=github.com/0xPolygon/cdk-data-availability/client --output=../synchronizer --outpkg=synchronizer --structname=dataCommitteeClientMock --filename=mock_datacommitteeclient.go 750 | 751 | .PHONY: generate-mocks-etherman 752 | generate-mocks-etherman: ## Generates mocks for etherman , using mockery tool 753 | ## mocks for etherman 754 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=GasPricer --srcpkg=github.com/ethereum/go-ethereum --output=../etherman --outpkg=etherman --structname=etherscanMock --filename=mock_etherscan.go 755 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=GasPricer --srcpkg=github.com/ethereum/go-ethereum --output=../etherman --outpkg=etherman --structname=ethGasStationMock --filename=mock_ethgasstation.go 756 | 757 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=ethermanInterface --dir=../ethtxmanager --output=../ethtxmanager --outpkg=ethtxmanager --structname=ethermanMock --filename=mock_etherman_test.go 758 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=stateInterface --dir=../ethtxmanager --output=../ethtxmanager --outpkg=ethtxmanager --structname=stateMock --filename=mock_state_test.go 759 | 760 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=poolInterface --dir=../gasprice --output=../gasprice --outpkg=gasprice --structname=poolMock --filename=mock_pool.go 761 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=ethermanInterface --dir=../gasprice --output=../gasprice --outpkg=gasprice --structname=ethermanMock --filename=mock_etherman.go 762 | 763 | .PHONY: generate-mocks-aggregator 764 | generate-mocks-aggregator: ## Generates mocks for aggregator , using mockery tool 765 | ## mocks for the aggregator tests 766 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=stateInterface --dir=../aggregator --output=../aggregator/mocks --outpkg=mocks --structname=StateMock --filename=mock_state.go 767 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=proverInterface --dir=../aggregator --output=../aggregator/mocks --outpkg=mocks --structname=ProverMock --filename=mock_prover.go 768 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=etherman --dir=../aggregator --output=../aggregator/mocks --outpkg=mocks --structname=Etherman --filename=mock_etherman.go 769 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=ethTxManager --dir=../aggregator --output=../aggregator/mocks --outpkg=mocks --structname=EthTxManager --filename=mock_ethtxmanager.go 770 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=aggregatorTxProfitabilityChecker --dir=../aggregator --output=../aggregator/mocks --outpkg=mocks --structname=ProfitabilityCheckerMock --filename=mock_profitabilitychecker.go 771 | export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=Tx --srcpkg=github.com/jackc/pgx/v4 --output=../aggregator/mocks --outpkg=mocks --structname=DbTxMock --filename=mock_dbtx.go 772 | 773 | .PHONY: run-benchmarks 774 | run-benchmarks: run-db ## Runs benchmars 775 | go test -bench=. ./state/tree 776 | 777 | .PHONY: run-dac-db 778 | run-dac-db: ## Suns the DAC DB 779 | $(RUNDACDB) 780 | 781 | .PHONY: stop-dac-db 782 | stop-dac-db: ## Stops the DAC DB 783 | $(STOPDACDB) 784 | 785 | .PHONY: run-permissionless-dac 786 | run-permissionless-dac: ## Runs a permissionless node that is forced to sync through DAC 787 | $(RUNPERMISSIONLESSDB) 788 | sleep 1 789 | $(RUNPERMISSIONLESSZKPROVER) 790 | $(RUNPERMISSIONLESSNODEDAC) 791 | 792 | .PHONY: stop-permissionless-dac 793 | stop-permissionless-dac: ## Stops the permissionless node that is forced to sync through DAC 794 | $(STOPPERMISSIONLESSNODEDAC) 795 | $(STOPPERMISSIONLESSZKPROVER) 796 | $(STOPPERMISSIONLESSDB) 797 | 798 | .PHONY: compile-scs 799 | compile-scs: ## Compiles smart contracts, configuration in test/contracts/index.yaml 800 | go run ./scripts/cmd... compilesc --input ./contracts 801 | 802 | .PHONY: ps 803 | ps: ## Chekc all running services 804 | $(DOCKERCOMPOSE) ps --status running --format "table {{.Service}}\t{{.Image}}\t{{.Status}}" 805 | 806 | .PHONY: ps-exited 807 | ps-exited: ## Chekc all exited services 808 | $(DOCKERCOMPOSE) ps -a --format "table {{.Service}}\t{{.Image}}\t{{.Status}}" \ 809 | | grep 'Exited' \ 810 | || echo "No exited containers" 811 | 812 | ## Help display. 813 | ## Pulls comments from beside commands and prints a nicely formatted 814 | ## display with the commands and their usage information. 815 | .DEFAULT_GOAL := help 816 | 817 | .PHONY: help 818 | help: ## Prints this help 819 | @grep -h -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) \ 820 | | sort \ 821 | | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Polygon CDK Quickstart 2 | 3 | This tutorial will guide you through the process of setting up a CDK Validium on your local machine. Please refer to https://docs.polygon.technology/cdk/overview/ to read more about the CDK framework. 4 | 5 | > Note: Polygon CDK is in public preview stage and subject to changes 6 | 7 | 8 | ## What You'll Learn 9 | 10 | In this tutorial, you'll quickly dive into the world of Polygon CDK. You'll learn to set up and run a local CDK-based chain, enabling you to: 11 | 12 | - Gain a rapid understanding of Polygon CDK. 13 | - Test smart contracts. 14 | - Execute web3 transactions. 15 | - Investigate network capabilities. 16 | 17 | ## What You'll Need 18 | 19 | This tutorial requires Docker and Docker Compose. They allow you to run multiple services in separate environments. If you haven't installed these tools yet, you can do so by following the guides at the following links: 20 | 21 | - [Docker](https://www.docker.com/get-started) 22 | - [Docker Compose](https://docs.docker.com/compose/install/) 23 | 24 | ### Recommended System Requirements 25 | 26 | Ensure that your system meets the following recommended specifications before starting this tutorial: 27 | 28 | - A Linux-based OS (e.g., Ubuntu Server 22.04 LTS) 29 | - At least 16GB RAM with a 4-core CPU 30 | - An AMD64 architecture system 31 | 32 | > Note: Does not yet support ARM-based Macs 33 | 34 | ## What You'll Do 35 | 36 | In this tutorial, you'll go through the following steps. Make sure to follow each section in order if this is your first time setting up a zkValidium. 37 | 38 | 1. Download Configuration Files: You'll start by downloading necessary configuration files from our repository. 39 | 2. Launch the Validium Locally: After setting up your workspace, you'll launch the zkValidium on your local machine and ensure all services are running properly. 40 | 3. Test the Validium: With your local CDK Validium running, you'll verify its functionalities, including testing block explorers and making transactions. 41 | 42 | ## Step 1: Download Configuration Files 43 | 44 | The first step involves downloading the necessary configuration files from our repository. Run the following commands in your terminal to clone the repository and navigate into it: 45 | 46 | ```bash 47 | git clone https://github.com/Snapchain/zkValidium-quickstart.git 48 | cd zkValidium-quickstart 49 | ``` 50 | 51 | The repository includes these key files: 52 | 53 | - `Docker-compose.yml`: This Docker Compose file defines all the necessary containers to set up the CDK Validium. 54 | - `Makefile`: This file includes a series of commands that will help you manage your CDK Validium node. 55 | - `config`: This folder contains configuration files required for the CDK Validium. 56 | 57 | ## Step 2: Launch the Validium Locally 58 | 59 | With the repository cloned and your working directory set, let's start up the CDK Validium. First, you'll need to pull the necessary Docker images from Docker Hub: 60 | 61 | ```bash 62 | docker-compose pull 63 | ``` 64 | 65 | After pulling the images, you can start your local CDK Validium: 66 | 67 | ```bash 68 | make run 69 | ``` 70 | 71 | To ensure all services are running properly, check the status of each container: 72 | 73 | ```bash 74 | docker-compose ps 75 | ``` 76 | 77 | You will see results similar to the following: 78 | 79 | ```shell 80 | Name Command State Ports 81 | --------------------------------------------------------------------------------------------------------------- 82 | cdk-validium-aggregator /bin/sh -c /app/cdk-validi ... Up 0.0.0.0:50081- 83 | >50081/tcp,:::50081- 84 | >50081/tcp, 8123/tcp, 0.0.0.0: 85 | 9093->9091/tcp,:::9093- 86 | >9091/tcp 87 | cdk-validium-approve /bin/sh -c /app/cdk-validi ... Exit 0 88 | cdk-validium-data-availability /bin/sh -c /app/cdk-data-a ... Up 0.0.0.0:8444- 89 | >8444/tcp,:::8444->8444/tcp 90 | cdk-validium-data-node-db docker-entrypoint.sh postg ... Up (healthy) 0.0.0.0:5444- 91 | >5432/tcp,:::5444->5432/tcp 92 | cdk-validium-eth-tx-manager /bin/sh -c /app/cdk-validi ... Up 8123/tcp, 0.0.0.0:9094- 93 | >9091/tcp,:::9094->9091/tcp 94 | cdk-validium-event-db docker-entrypoint.sh postg ... Up 0.0.0.0:5435- 95 | >5432/tcp,:::5435->5432/tcp 96 | cdk-validium-explorer-json-rpc /bin/sh -c /app/cdk-validi ... Up 8123/tcp, 0.0.0.0:8124- 97 | >8124/tcp,:::8124->8124/tcp, 0 98 | .0.0.0:8134->8134/tcp,:::8134- 99 | >8134/tcp 100 | cdk-validium-explorer-l1 /bin/sh -c mix do ecto.cre ... Up 0.0.0.0:4000- 101 | >4000/tcp,:::4000->4000/tcp 102 | cdk-validium-explorer-l1-db docker-entrypoint.sh postg ... Up 0.0.0.0:5436- 103 | >5432/tcp,:::5436->5432/tcp 104 | cdk-validium-explorer-l2 /bin/sh -c mix do ecto.cre ... Up 0.0.0.0:4001- 105 | >4000/tcp,:::4001->4000/tcp 106 | cdk-validium-explorer-l2-db docker-entrypoint.sh postg ... Up 0.0.0.0:5437- 107 | >5432/tcp,:::5437->5432/tcp 108 | cdk-validium-json-rpc /bin/sh -c /app/cdk-validi ... Up 0.0.0.0:8123- 109 | >8123/tcp,:::8123->8123/tcp, 0 110 | .0.0.0:8133->8133/tcp,:::8133- 111 | >8133/tcp, 0.0.0.0:9091- 112 | >9091/tcp,:::9091->9091/tcp 113 | cdk-validium-l2gaspricer /bin/sh -c /app/cdk-validi ... Up 8123/tcp 114 | cdk-validium-mock-l1-network geth --http --http.api adm ... Up 30303/tcp, 30303/udp, 0.0.0.0: 115 | 8545->8545/tcp,:::8545- 116 | >8545/tcp, 0.0.0.0:8546- 117 | >8546/tcp,:::8546->8546/tcp 118 | cdk-validium-pool-db docker-entrypoint.sh postg ... Up 0.0.0.0:5433- 119 | >5432/tcp,:::5433->5432/tcp 120 | cdk-validium-prover zkProver -c /usr/src/app/c ... Up 0.0.0.0:50052- 121 | >50052/tcp,:::50052- 122 | >50052/tcp, 0.0.0.0:50061- 123 | >50061/tcp,:::50061- 124 | >50061/tcp, 0.0.0.0:50071- 125 | >50071/tcp,:::50071->50071/tcp 126 | cdk-validium-sequence-sender /bin/sh -c /app/cdk-validi ... Up 8123/tcp 127 | cdk-validium-sequencer /bin/sh -c /app/cdk-validi ... Up 0.0.0.0:6060- 128 | >6060/tcp,:::6060->6060/tcp, 129 | 8123/tcp, 0.0.0.0:9092- 130 | >9091/tcp,:::9092->9091/tcp 131 | cdk-validium-state-db docker-entrypoint.sh postg ... Up 0.0.0.0:5432- 132 | >5432/tcp,:::5432->5432/tcp 133 | cdk-validium-sync /bin/sh -c /app/cdk-validi ... Up 8123/tcp 134 | dac-setup-committee docker-entrypoint.sh npm r ... Exit 0 135 | ``` 136 | 137 | If any service isn't running (i.e., in Exit 1 state), you can investigate further using the logs: 138 | 139 | ```bash 140 | docker-compose logs 141 | ``` 142 | 143 | Note: `` can be found in results above. 144 | 145 | 146 | To stop the zkValidium, use: 147 | 148 | ```bash 149 | make stop 150 | ``` 151 | 152 | And to restart all the services: 153 | 154 | ```bash 155 | make restart 156 | ``` 157 | 158 | ## Step 3: Test the Validium 159 | 160 | Congratulations! Your local zkValidium is now up and running. Let's test its functionalities. 161 | 162 | First, verify the block explorer by navigating to [localhost:4001](http://localhost:4001/). You should see a page similar to this: 163 | 164 | ![image](https://github.com/Snapchain/zkValidium-quickstart/assets/111917526/bfc027a2-2f9d-40f4-a229-eb7528cfa51b) 165 | 166 | Now, let's add the network to your Web3 wallet by populating the necessary fields. 167 | > **We'll use MetaMask for our example.** 168 | 169 | - Set the chain ID to be **1001**. 170 | - The currency symbol can be anything but we will use **POL** by default. 171 | - The RPC node and block explorer containers can be found at ports **8123** and **4001**, respectively. 172 | 173 | Next, switch to the new network. 174 | 175 | By default, an account with private key `0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80` has been preloaded with tokens. 176 | 177 | > Note: NEVER transfer real assets to the address associated with the above private key 178 | 179 | Import this account and you will see the balance shown up as 100000 POL. You can now try a transaction by transferring some tokens to another account. After confirming the transaction, check the updated balances. You can also view the transaction details in the block explorer by clicking on the transaction details in MetaMask. 180 | -------------------------------------------------------------------------------- /config/bridge/claimtx.keystore: -------------------------------------------------------------------------------- 1 | {"address":"f39fd6e51aad88f6f4ce6ab8827279cfffb92266","crypto":{"cipher":"aes-128-ctr","ciphertext":"d005030a7684f3adad2447cbb27f63039eec2224c451eaa445de0d90502b9f3d","cipherparams":{"iv":"dc07a54bc7e388efa89c34d42f2ebdb4"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"cf2ec55ecae11171de575112cfb16963570533a9c46fb774473ceb11519eb24a"},"mac":"3eb180d405a5da6e462b2adc00091c14856c91d574bf27348714506357d6e177"},"id":"035454db-6b6d-477f-8a79-ce24c10b185f","version":3} -------------------------------------------------------------------------------- /config/bridge/config.toml: -------------------------------------------------------------------------------- 1 | [Log] 2 | Level = "debug" 3 | Outputs = ["stdout"] 4 | 5 | [SyncDB] 6 | Database = "postgres" 7 | User = "test_user" 8 | Password = "test_password" 9 | Name = "test_db" 10 | Host = "zkevm-bridge-db" 11 | Port = "5432" 12 | MaxConns = 20 13 | 14 | [ClaimTxManager] 15 | Enabled = true 16 | FrequencyToMonitorTxs = "1s" 17 | PrivateKey = {Path = "/pk/keystore.claimtxmanager", Password = "testonly"} 18 | RetryInterval = "1s" 19 | RetryNumber = 10 20 | AuthorizedClaimMessageAddresses = ["0x90F79bf6EB2c4f870365E785982E1f101E93b906"] 21 | 22 | [Etherman] 23 | L1URL = "http://zkevm-mock-l1-network:8545" 24 | L2URLs = ["http://zkevm-json-rpc:8123"] 25 | 26 | [Synchronizer] 27 | SyncInterval = "1s" 28 | SyncChunkSize = 100 29 | 30 | [BridgeController] 31 | Store = "postgres" 32 | Height = 32 33 | 34 | [BridgeServer] 35 | GRPCPort = "9090" 36 | HTTPPort = "8080" 37 | CacheSize = 100000 38 | DefaultPageLimit = 25 39 | MaxPageLimit = 100 40 | BridgeVersion = "v1" 41 | [BridgeServer.DB] 42 | Database = "postgres" 43 | User = "test_user" 44 | Password = "test_password" 45 | Name = "test_db" 46 | Host = "zkevm-bridge-db" 47 | Port = "5432" 48 | MaxConns = 20 49 | 50 | [NetworkConfig] 51 | GenBlockNumber = 31 52 | PolygonBridgeAddress = "0xFe12ABaa190Ef0c8638Ee0ba9F828BF41368Ca0E" 53 | PolygonZkEVMGlobalExitRootAddress = "0x610178dA211FEF7D417bC0e6FeD39F05609AD788" 54 | PolygonRollupManagerAddress = "0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0" 55 | PolygonZkEvmAddress = "0x1F708C24a0D3A740cD47cC0444E9480899f3dA7D" 56 | L2PolygonBridgeAddresses = ["0xFe12ABaa190Ef0c8638Ee0ba9F828BF41368Ca0E"] -------------------------------------------------------------------------------- /config/dac/config.toml: -------------------------------------------------------------------------------- 1 | PrivateKey = {Path = "/pk/dac-member.keystore", Password = "testonly"} 2 | 3 | [L1] 4 | WsURL = "ws://zkevm-mock-l1-network:8546" 5 | RpcURL = "http://zkevm-mock-l1-network:8545" 6 | PolygonValidiumAddress = "0x1F708C24a0D3A740cD47cC0444E9480899f3dA7D" 7 | DataCommitteeAddress = "0x68B1D87F95878fE05B998F19b66F4baba5De1aed" 8 | Timeout = "3m" 9 | RetryPeriod = "5s" 10 | BlockBatchSize = "32" 11 | GenesisBlock = "31" 12 | 13 | [Log] 14 | Environment = "development" # "production" or "development" 15 | Level = "debug" 16 | Outputs = ["stderr"] 17 | 18 | [DB] 19 | User = "committee_user" 20 | Password = "committee_password" 21 | Name = "committee_db" 22 | Host = "zkevm-data-node-db" 23 | Port = "5432" 24 | EnableLog = false 25 | MaxConns = 200 26 | 27 | [RPC] 28 | Host = "0.0.0.0" 29 | Port = 8444 30 | ReadTimeout = "60s" 31 | WriteTimeout = "60s" 32 | MaxRequestsPerIPAndSecond = 500 33 | -------------------------------------------------------------------------------- /config/dac/dac-member.keystore: -------------------------------------------------------------------------------- 1 | {"version":3,"id":"71b028b6-9b1d-4f4c-9e66-31c94a6eb679","address":"70997970c51812dc3a010c7d01b50e0d17dc79c8","crypto":{"ciphertext":"985d5dc5f7750fc4ad0ad0d370486870016bb97e00ef1f7b146d6ad95d456861","cipherparams":{"iv":"f51b18b9f45872f71c3578513fca6cb0"},"cipher":"aes-128-ctr","kdf":"scrypt","kdfparams":{"dklen":32,"salt":"6253e2d8a71e4808dd11143329cfea467cabb37ac1e1e55dbc0dd90ff22524a7","n":8192,"r":8,"p":1},"mac":"922f741e84201fc7c17bbf9fae5dba6c04a2a99a7268998b5a0268aa690004be"}} -------------------------------------------------------------------------------- /config/deploy_parameters.json.example: -------------------------------------------------------------------------------- 1 | { 2 | "realVerifier": false, 3 | "trustedSequencerURL": "http://zkevm-json-rpc:8123", 4 | "networkName": "cdk-validium", 5 | "version":"0.0.1", 6 | "trustedSequencer":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", 7 | "chainID": 1001, 8 | "trustedAggregator":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", 9 | "trustedAggregatorTimeout": 604799, 10 | "pendingStateTimeout": 604799, 11 | "forkID": 6, 12 | "admin":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", 13 | "cdkValidiumOwner": "0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", 14 | "timelockAddress": "0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", 15 | "minDelayTimelock": 3600, 16 | "salt": "0x0000000000000000000000000000000000000000000000000000000000000000", 17 | "initialCDKValidiumDeployerOwner" :"0xaddress", 18 | "maticTokenAddress":"0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", 19 | "cdkValidiumDeployerAddress":"", 20 | "deployerPvtKey": "", 21 | "maxFeePerGas":"", 22 | "maxPriorityFeePerGas":"", 23 | "multiplierGas": "", 24 | "setupEmptyCommittee": true, 25 | "committeeTimelock": false 26 | } -------------------------------------------------------------------------------- /config/metrics/prometheus/prometheus.yml: -------------------------------------------------------------------------------- 1 | global: 2 | scrape_interval: 3s # By default, scrape targets every 15 seconds. 3 | evaluation_interval: 3s # By default, scrape targets every 15 seconds. 4 | # scrape_timeout is set to the global default (10s). 5 | 6 | scrape_configs: 7 | 8 | - job_name: zkevm-node 9 | scrape_interval: 3s 10 | metrics_path: /metrics 11 | static_configs: 12 | - targets: 13 | - zkevm-sequencer:9091 14 | - zkevm-json-rpc:9091 15 | - zkevm-aggregator:9091 16 | - zkevm-sync:9091 17 | - zkevm-eth-tx-manager:9091 -------------------------------------------------------------------------------- /config/node/aggregator.keystore: -------------------------------------------------------------------------------- 1 | {"version":3,"id":"71b028b6-9b1d-4f4c-9e66-31c94a6eb679","address":"70997970c51812dc3a010c7d01b50e0d17dc79c8","crypto":{"ciphertext":"985d5dc5f7750fc4ad0ad0d370486870016bb97e00ef1f7b146d6ad95d456861","cipherparams":{"iv":"f51b18b9f45872f71c3578513fca6cb0"},"cipher":"aes-128-ctr","kdf":"scrypt","kdfparams":{"dklen":32,"salt":"6253e2d8a71e4808dd11143329cfea467cabb37ac1e1e55dbc0dd90ff22524a7","n":8192,"r":8,"p":1},"mac":"922f741e84201fc7c17bbf9fae5dba6c04a2a99a7268998b5a0268aa690004be"}} -------------------------------------------------------------------------------- /config/node/config.toml: -------------------------------------------------------------------------------- 1 | IsTrustedSequencer = true 2 | 3 | [Log] 4 | Environment = "development" # "production" or "development" 5 | Level = "debug" 6 | Outputs = ["stderr"] 7 | 8 | [State] 9 | [State.DB] 10 | User = "state_user" 11 | Password = "state_password" 12 | Name = "state_db" 13 | Host = "zkevm-state-db" 14 | Port = "5432" 15 | EnableLog = false 16 | MaxConns = 200 17 | [State.Batch] 18 | [State.Batch.Constraints] 19 | MaxTxsPerBatch = 300 20 | MaxBatchBytesSize = 120000 21 | MaxCumulativeGasUsed = 1125899906842624 22 | MaxKeccakHashes = 2145 23 | MaxPoseidonHashes = 252357 24 | MaxPoseidonPaddings = 135191 25 | MaxMemAligns = 236585 26 | MaxArithmetics = 236585 27 | MaxBinaries = 473170 28 | MaxSteps = 7570538 29 | MaxSHA256Hashes = 1596 30 | 31 | [Pool] 32 | FreeClaimGasLimit = 1500000 33 | IntervalToRefreshBlockedAddresses = "5m" 34 | IntervalToRefreshGasPrices = "5s" 35 | MaxTxBytesSize=100132 36 | MaxTxDataBytesSize=100000 37 | DefaultMinGasPriceAllowed = 0 38 | MinAllowedGasPriceInterval = "5m" 39 | PollMinAllowedGasPriceInterval = "15s" 40 | AccountQueue = 64 41 | GlobalQueue = 1024 42 | [Pool.EffectiveGasPrice] 43 | Enabled = false 44 | L1GasPriceFactor = 0.25 45 | ByteGasCost = 16 46 | ZeroByteGasCost = 4 47 | NetProfit = 1 48 | BreakEvenFactor = 1.1 49 | FinalDeviationPct = 10 50 | EthTransferGasPrice = 0 51 | EthTransferL1GasPriceFactor = 0 52 | L2GasPriceSuggesterFactor = 0.5 53 | [Pool.DB] 54 | User = "pool_user" 55 | Password = "pool_password" 56 | Name = "pool_db" 57 | Host = "zkevm-pool-db" 58 | Port = "5432" 59 | EnableLog = false 60 | MaxConns = 200 61 | 62 | [Etherman] 63 | URL = "http://zkevm-mock-l1-network:8545" 64 | ForkIDChunkSize = 20000 65 | MultiGasProvider = false 66 | [Etherscan] 67 | ApiKey = "" 68 | 69 | [RPC] 70 | Host = "0.0.0.0" 71 | Port = 8123 72 | ReadTimeout = "60s" 73 | WriteTimeout = "60s" 74 | MaxRequestsPerIPAndSecond = 5000 75 | SequencerNodeURI = "" 76 | EnableL2SuggestedGasPricePolling = false 77 | BatchRequestsEnabled = true 78 | [RPC.WebSockets] 79 | Enabled = true 80 | Port = 8133 81 | 82 | [Synchronizer] 83 | SyncInterval = "1s" 84 | SyncChunkSize = 100 85 | TrustedSequencerURL = "" # If it is empty or not specified, then the value is read from the smc. 86 | L1SynchronizationMode = "sequential" 87 | [Synchronizer.L1ParallelSynchronization] 88 | MaxClients = 10 89 | MaxPendingNoProcessedBlocks = 25 90 | RequestLastBlockPeriod = "5s" 91 | RequestLastBlockTimeout = "5s" 92 | RequestLastBlockMaxRetries = 3 93 | StatisticsPeriod = "5m" 94 | TimeoutMainLoop = "5m" 95 | RollupInfoRetriesSpacing= "5s" 96 | FallbackToSequentialModeOnSynchronized = false 97 | [Synchronizer.L1ParallelSynchronization.PerformanceWarning] 98 | AceptableInacctivityTime = "5s" 99 | ApplyAfterNumRollupReceived = 10 100 | 101 | [Sequencer] 102 | DeletePoolTxsL1BlockConfirmations = 100 103 | DeletePoolTxsCheckInterval = "12h" 104 | TxLifetimeCheckInterval = "10m" 105 | TxLifetimeMax = "3h" 106 | LoadPoolTxsCheckInterval = "500ms" 107 | StateConsistencyCheckInterval = "5s" 108 | [Sequencer.Finalizer] 109 | NewTxsWaitInterval = "100ms" 110 | ForcedBatchesTimeout = "5s" 111 | ForcedBatchesL1BlockConfirmations = 0 112 | ForcedBatchesCheckInterval = "10s" 113 | L1InfoTreeL1BlockConfirmations = 0 114 | L1InfoTreeCheckInterval = "10s" 115 | BatchMaxDeltaTimestamp = "20s" 116 | L2BlockMaxDeltaTimestamp = "4s" 117 | ResourceExhaustedMarginPct = 10 118 | HaltOnBatchNumber = 0 119 | SequentialBatchSanityCheck = false 120 | SequentialProcessL2Block = true 121 | [Sequencer.Finalizer.Metrics] 122 | Interval = "60m" 123 | EnableLog = true 124 | [Sequencer.StreamServer] 125 | Port = 6900 126 | Filename = "/datastreamer/datastream.bin" 127 | Version = 1 128 | ChainID = 1337 129 | Enabled = true 130 | 131 | [SequenceSender] 132 | WaitPeriodSendSequence = "15s" 133 | LastBatchVirtualizationTimeMaxWaitPeriod = "10s" 134 | L1BlockTimestampMargin = "5s" 135 | MaxTxSizeForL1 = 131072 136 | L2Coinbase = "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266" 137 | PrivateKey = {Path = "/pk/sequencer.keystore", Password = "testonly"} 138 | [SequenceSender.StreamClient] 139 | Server = "zkevm-sequencer:6900" 140 | 141 | [Aggregator] 142 | Host = "0.0.0.0" 143 | Port = 50081 144 | RetryTime = "5s" 145 | VerifyProofInterval = "10s" 146 | TxProfitabilityCheckerType = "acceptall" 147 | TxProfitabilityMinReward = "1.1" 148 | ProofStatePollingInterval = "5s" 149 | SenderAddress = "0x70997970c51812dc3a010c7d01b50e0d17dc79c8" 150 | CleanupLockedProofsInterval = "2m" 151 | GeneratingProofCleanupThreshold = "10m" 152 | UpgradeEtrogBatchNumber = 0 153 | BatchProofL1BlockConfirmations = 2 154 | SettlementBackend = "l1" 155 | 156 | [EthTxManager] 157 | ForcedGas = 0 158 | PrivateKeys = [ 159 | {Path = "/pk/sequencer.keystore", Password = "testonly"}, 160 | {Path = "/pk/aggregator.keystore", Password = "testonly"} 161 | ] 162 | 163 | [L2GasPriceSuggester] 164 | Type = "default" 165 | UpdatePeriod = "10s" 166 | Factor = 0.5 167 | DefaultGasPriceWei = 0 168 | MaxGasPriceWei = 0 169 | 170 | [MTClient] 171 | URI = "zkevm-prover:50061" 172 | 173 | [Executor] 174 | URI = "zkevm-prover:50071" 175 | MaxGRPCMessageSize = 100000000 176 | 177 | [Metrics] 178 | Host = "0.0.0.0" 179 | Port = 9091 180 | Enabled = true 181 | ProfilingHost = "0.0.0.0" 182 | ProfilingPort = 6060 183 | ProfilingEnabled = true 184 | 185 | [EventLog] 186 | [EventLog.DB] 187 | User = "event_user" 188 | Password = "event_password" 189 | Name = "event_db" 190 | Host = "zkevm-event-db" 191 | Port = "5432" 192 | EnableLog = false 193 | MaxConns = 200 194 | 195 | [HashDB] 196 | User = "prover_user" 197 | Password = "prover_pass" 198 | Name = "prover_db" 199 | Host = "zkevm-state-db" 200 | Port = "5432" 201 | EnableLog = false 202 | MaxConns = 200 -------------------------------------------------------------------------------- /config/node/db_scripts/init_event_db.sql: -------------------------------------------------------------------------------- 1 | CREATE TYPE level_t AS ENUM ('emerg', 'alert', 'crit', 'err', 'warning', 'notice', 'info', 'debug'); 2 | 3 | CREATE TABLE public.event ( 4 | id BIGSERIAL PRIMARY KEY, 5 | received_at timestamp WITH TIME ZONE default CURRENT_TIMESTAMP, 6 | ip_address inet, 7 | source varchar(32) not null, 8 | component varchar(32), 9 | level level_t not null, 10 | event_id varchar(32) not null, 11 | description text, 12 | data bytea, 13 | json jsonb 14 | ); 15 | -------------------------------------------------------------------------------- /config/node/db_scripts/init_prover_db.sql: -------------------------------------------------------------------------------- 1 | CREATE DATABASE prover_db; 2 | \connect prover_db; 3 | 4 | CREATE SCHEMA state; 5 | 6 | CREATE TABLE state.nodes (hash BYTEA PRIMARY KEY, data BYTEA NOT NULL); 7 | CREATE TABLE state.program (hash BYTEA PRIMARY KEY, data BYTEA NOT NULL); 8 | 9 | CREATE USER prover_user with password 'prover_pass'; 10 | ALTER DATABASE prover_db OWNER TO prover_user; 11 | ALTER SCHEMA state OWNER TO prover_user; 12 | ALTER SCHEMA public OWNER TO prover_user; 13 | ALTER TABLE state.nodes OWNER TO prover_user; 14 | ALTER TABLE state.program OWNER TO prover_user; 15 | ALTER USER prover_user SET SEARCH_PATH=state; 16 | -------------------------------------------------------------------------------- /config/node/genesis.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "l1Config": { 3 | "chainId": 1337, 4 | "polygonZkEVMAddress": "0x1F708C24a0D3A740cD47cC0444E9480899f3dA7D", 5 | "polygonRollupManagerAddress": "0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0", 6 | "polTokenAddress": "0x5FbDB2315678afecb367f032d93F642f64180aa3", 7 | "polygonZkEVMGlobalExitRootAddress": "0x610178dA211FEF7D417bC0e6FeD39F05609AD788" 8 | }, 9 | "rollupCreationBlockNumber": 37, 10 | "rollupManagerCreationBlockNumber": 31, 11 | "root": "0xa1ae4c1fb61b82533705d6c1f685a7f6affd51e10f92e45cad9feaa0f6a103b0", 12 | "genesis": [ 13 | { 14 | "contractName": "PolygonZkEVMDeployer", 15 | "balance": "0", 16 | "nonce": "4", 17 | "address": "0xFbD07134824dDEa24E4ae414c18ecbFa98169A24", 18 | "bytecode": "0x60806040526004361061006e575f3560e01c8063715018a61161004c578063715018a6146100e25780638da5cb5b146100f6578063e11ae6cb1461011f578063f2fde38b14610132575f80fd5b80632b79805a146100725780634a94d487146100875780636d07dbf81461009a575b5f80fd5b610085610080366004610908565b610151565b005b6100856100953660046109a2565b6101c2565b3480156100a5575f80fd5b506100b96100b43660046109f5565b610203565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ed575f80fd5b50610085610215565b348015610101575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff166100b9565b61008561012d366004610a15565b610228565b34801561013d575f80fd5b5061008561014c366004610a61565b61028e565b61015961034a565b5f6101658585856103ca565b90506101718183610527565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a15050505050565b6101ca61034a565b6101d583838361056a565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b905f90a1505050565b5f61020e8383610598565b9392505050565b61021d61034a565b6102265f6105a4565b565b61023061034a565b5f61023c8484846103ca565b60405173ffffffffffffffffffffffffffffffffffffffff821681529091507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a150505050565b61029661034a565b73ffffffffffffffffffffffffffffffffffffffff811661033e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610347816105a4565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610335565b5f83471015610435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610335565b81515f0361049f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610335565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff811661020e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610335565b606061020e83835f6040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c65640000815250610618565b6060610590848484604051806060016040528060298152602001610b0860299139610618565b949350505050565b5f61020e83833061072d565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156106aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610335565b5f808673ffffffffffffffffffffffffffffffffffffffff1685876040516106d29190610a9c565b5f6040518083038185875af1925050503d805f811461070c576040519150601f19603f3d011682016040523d82523d5f602084013e610711565b606091505b509150915061072287838387610756565b979650505050505050565b5f604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b606083156107eb5782515f036107e45773ffffffffffffffffffffffffffffffffffffffff85163b6107e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610335565b5081610590565b61059083838151156108005781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103359190610ab7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112610870575f80fd5b813567ffffffffffffffff8082111561088b5761088b610834565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156108d1576108d1610834565b816040528381528660208588010111156108e9575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f806080858703121561091b575f80fd5b8435935060208501359250604085013567ffffffffffffffff80821115610940575f80fd5b61094c88838901610861565b93506060870135915080821115610961575f80fd5b5061096e87828801610861565b91505092959194509250565b803573ffffffffffffffffffffffffffffffffffffffff8116811461099d575f80fd5b919050565b5f805f606084860312156109b4575f80fd5b6109bd8461097a565b9250602084013567ffffffffffffffff8111156109d8575f80fd5b6109e486828701610861565b925050604084013590509250925092565b5f8060408385031215610a06575f80fd5b50508035926020909101359150565b5f805f60608486031215610a27575f80fd5b8335925060208401359150604084013567ffffffffffffffff811115610a4b575f80fd5b610a5786828701610861565b9150509250925092565b5f60208284031215610a71575f80fd5b61020e8261097a565b5f5b83811015610a94578181015183820152602001610a7c565b50505f910152565b5f8251610aad818460208701610a7a565b9190910192915050565b602081525f8251806020840152610ad5816040850160208701610a7a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220330b94dc698c4d290bf55c23f13b473cde6a6bae0030cb902de18af54e35839f64736f6c63430008140033", 19 | "storage": { 20 | "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" 21 | } 22 | }, 23 | { 24 | "contractName": "ProxyAdmin", 25 | "balance": "0", 26 | "nonce": "1", 27 | "address": "0xfADB60b5059e31614e02083fF6C021a24C31c891", 28 | "bytecode": "0x608060405260043610610079575f3560e01c80639623609d1161004c5780639623609d1461012357806399a88ec414610136578063f2fde38b14610155578063f3b7dead14610174575f80fd5b8063204e1c7a1461007d578063715018a6146100c55780637eff275e146100db5780638da5cb5b146100fa575b5f80fd5b348015610088575f80fd5b5061009c6100973660046105e8565b610193565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d0575f80fd5b506100d9610244565b005b3480156100e6575f80fd5b506100d96100f536600461060a565b610257565b348015610105575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff1661009c565b6100d961013136600461066e565b6102e0565b348015610141575f80fd5b506100d961015036600461060a565b610371565b348015610160575f80fd5b506100d961016f3660046105e8565b6103cd565b34801561017f575f80fd5b5061009c61018e3660046105e8565b610489565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b5f60405180830381855afa9150503d805f8114610215576040519150601f19603f3d011682016040523d82523d5f602084013e61021a565b606091505b509150915081610228575f80fd5b8080602001905181019061023c919061075b565b949350505050565b61024c6104d3565b6102555f610553565b565b61025f6104d3565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b5f604051808303815f87803b1580156102c6575f80fd5b505af11580156102d8573d5f803e3d5ffd5b505050505050565b6102e86104d3565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061033e9086908690600401610776565b5f604051808303818588803b158015610355575f80fd5b505af1158015610367573d5f803e3d5ffd5b5050505050505050565b6103796104d3565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102af565b6103d56104d3565b73ffffffffffffffffffffffffffffffffffffffff811661047d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61048681610553565b50565b5f805f8373ffffffffffffffffffffffffffffffffffffffff166040516101dd907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610474565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff81168114610486575f80fd5b5f602082840312156105f8575f80fd5b8135610603816105c7565b9392505050565b5f806040838503121561061b575f80fd5b8235610626816105c7565b91506020830135610636816105c7565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f805f60608486031215610680575f80fd5b833561068b816105c7565b9250602084013561069b816105c7565b9150604084013567ffffffffffffffff808211156106b7575f80fd5b818601915086601f8301126106ca575f80fd5b8135818111156106dc576106dc610641565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561072257610722610641565b8160405282815289602084870101111561073a575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f6020828403121561076b575f80fd5b8151610603816105c7565b73ffffffffffffffffffffffffffffffffffffffff831681525f602060408184015283518060408501525f5b818110156107be578581018301518582016060015282016107a2565b505f6060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea26469706673582212203083a4ccc2e42eed60bd19037f2efa77ed086dc7a5403f75bebb995dcba2221c64736f6c63430008140033", 29 | "storage": { 30 | "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f" 31 | } 32 | }, 33 | { 34 | "contractName": "PolygonZkEVMBridge implementation", 35 | "balance": "0", 36 | "nonce": "1", 37 | "address": "0x608484d3e94Fc775E3dCb06B0B48486c60A315e6", 38 | "bytecode": "0x6080604052600436106101db575f3560e01c806383f24403116100fd578063ccaa2d1111610092578063ee25560b11610062578063ee25560b146105a9578063f5efcd79146105d4578063f811bff7146105f3578063fb57083414610612575f80fd5b8063ccaa2d111461053b578063cd5865791461055a578063d02103ca1461056d578063dbc1697614610595575f80fd5b8063bab161bf116100cd578063bab161bf146104b9578063be5831c7146104da578063c00f14ab146104fd578063cc4616321461051c575f80fd5b806383f244031461043d5780638ed7e3f21461045c578063aaa13cc21461047b578063b8b284d01461049a575f80fd5b80633cbc795b116101735780637843298b116101435780637843298b146103c257806379e2cf97146103e157806381b1c174146103f557806383c43a5514610429575f80fd5b80633cbc795b146103385780633e197043146103705780634b2f336d1461038f5780635ca1e165146103ae575f80fd5b806327aef4e8116101ae57806327aef4e81461026d5780632dfdf0b51461028e578063318aee3d146102b15780633c351e1014610319575f80fd5b806315064c96146101df5780632072f6c51461020d57806322e95f2c14610223578063240ff3781461025a575b5f80fd5b3480156101ea575f80fd5b506068546101f89060ff1681565b60405190151581526020015b60405180910390f35b348015610218575f80fd5b50610221610631565b005b34801561022e575f80fd5b5061024261023d366004612fb9565b610666565b6040516001600160a01b039091168152602001610204565b610221610268366004613040565b6106d0565b348015610278575f80fd5b50610281610759565b6040516102049190613102565b348015610299575f80fd5b506102a360535481565b604051908152602001610204565b3480156102bc575f80fd5b506102f56102cb36600461311b565b606b6020525f908152604090205463ffffffff81169064010000000090046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b03909116602083015201610204565b348015610324575f80fd5b50606d54610242906001600160a01b031681565b348015610343575f80fd5b50606d5461035b90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610204565b34801561037b575f80fd5b506102a361038a366004613144565b6107e5565b34801561039a575f80fd5b50606f54610242906001600160a01b031681565b3480156103b9575f80fd5b506102a361088e565b3480156103cd575f80fd5b506102426103dc3660046131be565b61096a565b3480156103ec575f80fd5b50610221610993565b348015610400575f80fd5b5061024261040f366004613204565b606a6020525f90815260409020546001600160a01b031681565b348015610434575f80fd5b506102816109b4565b348015610448575f80fd5b506102a361045736600461322c565b6109d3565b348015610467575f80fd5b50606c54610242906001600160a01b031681565b348015610486575f80fd5b5061024261049536600461332d565b610aa8565b3480156104a5575f80fd5b506102216104b43660046133c3565b610be7565b3480156104c4575f80fd5b5060685461035b90610100900463ffffffff1681565b3480156104e5575f80fd5b5060685461035b90600160c81b900463ffffffff1681565b348015610508575f80fd5b5061028161051736600461311b565b610cc2565b348015610527575f80fd5b506101f8610536366004613441565b610d07565b348015610546575f80fd5b50610221610555366004613472565b610d8f565b610221610568366004613556565b6112c0565b348015610578575f80fd5b50606854610242906501000000000090046001600160a01b031681565b3480156105a0575f80fd5b5061022161172c565b3480156105b4575f80fd5b506102a36105c3366004613204565b60696020525f908152604090205481565b3480156105df575f80fd5b506102216105ee366004613472565b61175f565b3480156105fe575f80fd5b5061022161060d3660046135e6565b611a25565b34801561061d575f80fd5b506101f861062c366004613689565b611d40565b606c546001600160a01b0316331461065c57604051631736745960e31b815260040160405180910390fd5b610664611d57565b565b6040805160e084901b6001600160e01b031916602080830191909152606084901b6bffffffffffffffffffffffff1916602483015282516018818403018152603890920183528151918101919091205f908152606a90915220546001600160a01b03165b92915050565b60685460ff16156106f457604051630bc011ff60e21b815260040160405180910390fd5b341580159061070d5750606f546001600160a01b031615155b15610744576040517f6f625c4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610752858534868686611db2565b5050505050565b606e8054610766906136ce565b80601f0160208091040260200160405190810160405280929190818152602001828054610792906136ce565b80156107dd5780601f106107b4576101008083540402835291602001916107dd565b820191905f5260205f20905b8154815290600101906020018083116107c057829003601f168201915b505050505081565b6040517fff0000000000000000000000000000000000000000000000000000000000000060f889901b1660208201526001600160e01b031960e088811b821660218401526bffffffffffffffffffffffff19606089811b821660258601529188901b909216603984015285901b16603d82015260518101839052607181018290525f90609101604051602081830303815290604052805190602001209050979650505050505050565b6053545f90819081805b6020811015610961578083901c6001166001036108f557603381602081106108c2576108c2613706565b01546040805160208101929092528101859052606001604051602081830303815290604052805190602001209350610922565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806109599061372e565b915050610898565b50919392505050565b5f61098b848461097985611e7c565b61098286611f66565b61049587612047565b949350505050565b605354606854600160c81b900463ffffffff16101561066457610664612114565b60405180611ba00160405280611b668152602001613d80611b66913981565b5f83815b6020811015610a9f57600163ffffffff8516821c81169003610a4257848160208110610a0557610a05613706565b602002013582604051602001610a25929190918252602082015260400190565b604051602081830303815290604052805190602001209150610a8d565b81858260208110610a5557610a55613706565b6020020135604051602001610a74929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610a978161372e565b9150506109d7565b50949350505050565b6040516001600160e01b031960e087901b1660208201526bffffffffffffffffffffffff19606086901b1660248201525f9081906038016040516020818303038152906040528051906020012090505f60ff60f81b308360405180611ba00160405280611b668152602001613d80611b669139898989604051602001610b3093929190613746565b60408051601f1981840301815290829052610b4e929160200161377e565b60405160208183030381529060405280519060200120604051602001610bc394939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b6bffffffffffffffffffffffff191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff1615610c0b57604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b0316610c4d576040517fdde3cda700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f54604051632770a7eb60e21b8152336004820152602481018690526001600160a01b0390911690639dc29fac906044015f604051808303815f87803b158015610c96575f80fd5b505af1158015610ca8573d5f803e3d5ffd5b50505050610cba868686868686611db2565b505050505050565b6060610ccd82611e7c565b610cd683611f66565b610cdf84612047565b604051602001610cf193929190613746565b6040516020818303038152906040529050919050565b6068545f908190610100900463ffffffff16158015610d2c575063ffffffff83166001145b15610d3e575063ffffffff8316610d66565b610d5364010000000063ffffffff85166137ac565b610d639063ffffffff86166137c3565b90505b600881901c5f90815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff1615610db357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614610de3576040516302caf51760e11b815260040160405180910390fd5b610e168c8c8c8c8c610e115f8e8e8e8e8e8e8e604051610e049291906137d6565b60405180910390206107e5565b6121c2565b6001600160a01b038616610f6057606f546001600160a01b0316610efa575f6001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015610e6c576020820181803683370190505b50604051610e7a91906137e5565b5f6040518083038185875af1925050503d805f8114610eb4576040519150601f19603f3d011682016040523d82523d5f602084013e610eb9565b606091505b5050905080610ef4576040517f6747a28800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611256565b606f546040516340c10f1960e01b81526001600160a01b03868116600483015260248201869052909116906340c10f19906044015f604051808303815f87803b158015610f45575f80fd5b505af1158015610f57573d5f803e3d5ffd5b50505050611256565b606d546001600160a01b038781169116148015610f8e5750606d5463ffffffff888116600160a01b90920416145b15610fa5575f6001600160a01b0385168482610e42565b60685463ffffffff610100909104811690881603610fd657610fd16001600160a01b0387168585612354565b611256565b6040516001600160e01b031960e089901b1660208201526bffffffffffffffffffffffff19606088901b1660248201525f9060380160408051601f1981840301815291815281516020928301205f818152606a9093529120549091506001600160a01b0316806111f5575f6110808386868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506123d592505050565b6040516340c10f1960e01b81526001600160a01b03898116600483015260248201899052919250908216906340c10f19906044015f604051808303815f87803b1580156110cb575f80fd5b505af11580156110dd573d5f803e3d5ffd5b5050505080606a5f8581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b5f836001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548163ffffffff021916908363ffffffff1602179055506020820151815f0160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a8388886040516111e7959493929190613828565b60405180910390a150611253565b6040516340c10f1960e01b81526001600160a01b038781166004830152602482018790528216906340c10f19906044015f604051808303815f87803b15801561123c575f80fd5b505af115801561124e573d5f803e3d5ffd5b505050505b50505b604080518b815263ffffffff891660208201526001600160a01b0388811682840152861660608201526080810185905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a1505050505050505050505050565b60685460ff16156112e457604051630bc011ff60e21b815260040160405180910390fd5b6112ec612468565b60685463ffffffff61010090910481169088160361131d576040516302caf51760e11b815260040160405180910390fd5b5f806060876001600160a01b03881661141957883414611369576040517fb89240f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff16945090611396906136ce565b80601f01602080910402602001604051908101604052809291908181526020018280546113c2906136ce565b801561140d5780601f106113e45761010080835404028352916020019161140d565b820191905f5260205f20905b8154815290600101906020018083116113f057829003601f168201915b505050505091506116a3565b3415611451576040517f798ee6f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606f546001600160a01b03908116908916036114c757604051632770a7eb60e21b8152336004820152602481018a90526001600160a01b03891690639dc29fac906044015f604051808303815f87803b1580156114ac575f80fd5b505af11580156114be573d5f803e3d5ffd5b505050506116a3565b6001600160a01b038089165f908152606b602090815260409182902082518084019093525463ffffffff811683526401000000009004909216918101829052901561157957604051632770a7eb60e21b8152336004820152602481018b90526001600160a01b038a1690639dc29fac906044015f604051808303815f87803b158015611551575f80fd5b505af1158015611563573d5f803e3d5ffd5b5050505080602001519450805f01519350611696565b851561158b5761158b898b89896124c1565b6040516370a0823160e01b81523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa1580156115cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f39190613860565b905061160a6001600160a01b038b1633308e612860565b6040516370a0823160e01b81523060048201525f906001600160a01b038c16906370a0823190602401602060405180830381865afa15801561164e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116729190613860565b905061167e8282613877565b6068548c9850610100900463ffffffff169650935050505b61169f89610cc2565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b5f84868e8e86886053546040516116e298979695949392919061388a565b60405180910390a16117086117035f85878f8f8789805190602001206107e5565b6128b1565b861561171657611716612114565b5050505061172360018055565b50505050505050565b606c546001600160a01b0316331461175757604051631736745960e31b815260040160405180910390fd5b6106646129b2565b60685460ff161561178357604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146117b3576040516302caf51760e11b815260040160405180910390fd5b6117d58c8c8c8c8c610e1160018e8e8e8e8e8e8e604051610e049291906137d6565b606f545f906001600160a01b031661188857846001600160a01b031684888a868660405160240161180994939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161183e91906137e5565b5f6040518083038185875af1925050503d805f8114611878576040519150601f19603f3d011682016040523d82523d5f602084013e61187d565b606091505b505080915050611983565b606f546040516340c10f1960e01b81526001600160a01b03878116600483015260248201879052909116906340c10f19906044015f604051808303815f87803b1580156118d3575f80fd5b505af11580156118e5573d5f803e3d5ffd5b50505050846001600160a01b03168789858560405160240161190a94939291906138f3565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161193f91906137e5565b5f604051808303815f865af19150503d805f8114611978576040519150601f19603f3d011682016040523d82523d5f602084013e61197d565b606091505b50909150505b806119ba576040517f37e391c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518c815263ffffffff8a1660208201526001600160a01b0389811682840152871660608201526080810186905290517f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9181900360a00190a150505050505050505050505050565b5f54610100900460ff1615808015611a4357505f54600160ff909116105b80611a5c5750303b158015611a5c57505f5460ff166001145b611ad35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805460ff191660011790558015611af4575f805461ff0019166101001790555b606880547fffffffffffffff000000000000000000000000000000000000000000000000ff1661010063ffffffff8a16027fffffffffffffff0000000000000000000000000000000000000000ffffffffff1617650100000000006001600160a01b038781169190910291909117909155606c805473ffffffffffffffffffffffffffffffffffffffff19168583161790558616611bcf5763ffffffff851615611bca576040517f1a874c1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ceb565b606d805463ffffffff8716600160a01b027fffffffffffffffff0000000000000000000000000000000000000000000000009091166001600160a01b03891617179055606e611c1e8382613970565b50611cbd5f801b6012604051602001611ca991906060808252600d908201527f5772617070656420457468657200000000000000000000000000000000000000608082015260a0602082018190526004908201527f574554480000000000000000000000000000000000000000000000000000000060c082015260ff91909116604082015260e00190565b6040516020818303038152906040526123d5565b606f805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790555b611cf3612a22565b8015611723575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b5f81611d4d8686866109d3565b1495945050505050565b60685460ff1615611d7b57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a5497905f90a1565b60685463ffffffff610100909104811690871603611de3576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051611e3799989796959493929190613a2c565b60405180910390a1611e6e6117036001606860019054906101000a900463ffffffff16338a8a8a8989604051610e049291906137d6565b8215610cba57610cba612114565b60408051600481526024810182526020810180516001600160e01b03167f06fdde030000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611edb91906137e5565b5f60405180830381855afa9150503d805f8114611f13576040519150601f19603f3d011682016040523d82523d5f602084013e611f18565b606091505b509150915081611f5d576040518060400160405280600781526020017f4e4f5f4e414d450000000000000000000000000000000000000000000000000081525061098b565b61098b81612a94565b60408051600481526024810182526020810180516001600160e01b03167f95d89b410000000000000000000000000000000000000000000000000000000017905290516060915f9182916001600160a01b03861691611fc591906137e5565b5f60405180830381855afa9150503d805f8114611ffd576040519150601f19603f3d011682016040523d82523d5f602084013e612002565b606091505b509150915081611f5d576040518060400160405280600981526020017f4e4f5f53594d424f4c000000000000000000000000000000000000000000000081525061098b565b60408051600481526024810182526020810180516001600160e01b03167f313ce5670000000000000000000000000000000000000000000000000000000017905290515f91829182916001600160a01b038616916120a591906137e5565b5f60405180830381855afa9150503d805f81146120dd576040519150601f19603f3d011682016040523d82523d5f602084013e6120e2565b606091505b50915091508180156120f5575080516020145b61210057601261098b565b8080602001905181019061098b9190613a97565b6053546068805463ffffffff909216600160c81b027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90921691909117908190556001600160a01b0365010000000000909104166333d6247d61217561088e565b6040518263ffffffff1660e01b815260040161219391815260200190565b5f604051808303815f87803b1580156121aa575f80fd5b505af11580156121bc573d5f803e3d5ffd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101207f257b36320000000000000000000000000000000000000000000000000000000090925260648101919091525f916501000000000090046001600160a01b03169063257b3632906084016020604051808303815f875af1158015612253573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122779190613860565b9050805f036122b1576040517e2f6fad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80680100000000000000008716156122f5578691506122d3848a8489611d40565b6122f0576040516338105f3b60e21b815260040160405180910390fd5b61233f565b602087901c612305816001613ab2565b9150879250612320612318868c866109d3565b8a8389611d40565b61233d576040516338105f3b60e21b815260040160405180910390fd5b505b6123498282612c64565b505050505050505050565b6040516001600160a01b0383166024820152604481018290526123d09084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612d24565b505050565b5f8060405180611ba00160405280611b668152602001613d80611b6691398360405160200161240592919061377e565b6040516020818303038152906040529050838151602083015ff591506001600160a01b038216612461576040517fbefb092000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5092915050565b6002600154036124ba5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611aca565b6002600155565b5f6124cf6004828486613acf565b6124d891613af6565b90507f2afa5331000000000000000000000000000000000000000000000000000000006001600160e01b03198216016126b2575f80808080808061251f896004818d613acf565b81019061252c9190613b26565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161461256c5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146125955760405163750643af60e01b815260040160405180910390fd5b8a85146125ce576040517f03fffc4b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b03167fd505accf000000000000000000000000000000000000000000000000000000001790529151918e169161266591906137e5565b5f604051808303815f865af19150503d805f811461269e576040519150601f19603f3d011682016040523d82523d5f602084013e6126a3565b606091505b50505050505050505050610752565b6001600160e01b031981166323f2ebc360e21b146126fc576040517fe282c0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f808080808080806127118a6004818e613acf565b81019061271e9190613b75565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146127605760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146127895760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f169161281091906137e5565b5f604051808303815f865af19150503d805f8114612849576040519150601f19603f3d011682016040523d82523d5f602084013e61284e565b606091505b50505050505050505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526121bc9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612399565b8060016128c060206002613cd3565b6128ca9190613877565b60535410612904576040517fef5ccf6600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60535f81546129139061372e565b918290555090505f5b60208110156129a3578082901c60011660010361294f57826033826020811061294757612947613706565b015550505050565b6033816020811061296257612962613706565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061299b9061372e565b91505061291c565b506123d0613cde565b60018055565b60685460ff166129ee576040517f5386698100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b3905f90a1565b5f54610100900460ff16612a8c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b610664612e08565b60606040825110612ab357818060200190518101906106ca9190613cf2565b8151602003612c26575f5b602081108015612b055750828181518110612adb57612adb613706565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15612b1c5780612b148161372e565b915050612abe565b805f03612b5e57505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e4700000000000000000000000000006020820152919050565b5f8167ffffffffffffffff811115612b7857612b78613268565b6040519080825280601f01601f191660200182016040528015612ba2576020820181803683370190505b5090505f5b82811015612c1e57848181518110612bc157612bc1613706565b602001015160f81c60f81b828281518110612bde57612bde613706565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535080612c168161372e565b915050612ba7565b509392505050565b505060408051808201909152601281527f4e4f545f56414c49445f454e434f44494e470000000000000000000000000000602082015290565b919050565b6068545f90610100900463ffffffff16158015612c87575063ffffffff82166001145b15612c99575063ffffffff8216612cc1565b612cae64010000000063ffffffff84166137ac565b612cbe9063ffffffff85166137c3565b90505b600881901c5f8181526069602052604081208054600160ff861690811b91821892839055929091908183169003611723576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612d78826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e729092919063ffffffff16565b8051909150156123d05780806020019051810190612d969190613d64565b6123d05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611aca565b5f54610100900460ff166129ac5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401611aca565b606061098b84845f85855f80866001600160a01b03168587604051612e9791906137e5565b5f6040518083038185875af1925050503d805f8114612ed1576040519150601f19603f3d011682016040523d82523d5f602084013e612ed6565b606091505b5091509150612ee787838387612ef2565b979650505050505050565b60608315612f605782515f03612f59576001600160a01b0385163b612f595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611aca565b508161098b565b61098b8383815115612f755781518083602001fd5b8060405162461bcd60e51b8152600401611aca9190613102565b803563ffffffff81168114612c5f575f80fd5b6001600160a01b0381168114612fb6575f80fd5b50565b5f8060408385031215612fca575f80fd5b612fd383612f8f565b91506020830135612fe381612fa2565b809150509250929050565b8015158114612fb6575f80fd5b5f8083601f84011261300b575f80fd5b50813567ffffffffffffffff811115613022575f80fd5b602083019150836020828501011115613039575f80fd5b9250929050565b5f805f805f60808688031215613054575f80fd5b61305d86612f8f565b9450602086013561306d81612fa2565b9350604086013561307d81612fee565b9250606086013567ffffffffffffffff811115613098575f80fd5b6130a488828901612ffb565b969995985093965092949392505050565b5f5b838110156130cf5781810151838201526020016130b7565b50505f910152565b5f81518084526130ee8160208601602086016130b5565b601f01601f19169290920160200192915050565b602081525f61311460208301846130d7565b9392505050565b5f6020828403121561312b575f80fd5b813561311481612fa2565b60ff81168114612fb6575f80fd5b5f805f805f805f60e0888a03121561315a575f80fd5b873561316581613136565b965061317360208901612f8f565b9550604088013561318381612fa2565b945061319160608901612f8f565b935060808801356131a181612fa2565b9699959850939692959460a0840135945060c09093013592915050565b5f805f606084860312156131d0575f80fd5b6131d984612f8f565b925060208401356131e981612fa2565b915060408401356131f981612fa2565b809150509250925092565b5f60208284031215613214575f80fd5b5035919050565b8061040081018310156106ca575f80fd5b5f805f610440848603121561323f575f80fd5b83359250613250856020860161321b565b915061325f6104208501612f8f565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156132a5576132a5613268565b604052919050565b5f67ffffffffffffffff8211156132c6576132c6613268565b50601f01601f191660200190565b5f6132e66132e1846132ad565b61327c565b90508281528383830111156132f9575f80fd5b828260208301375f602084830101529392505050565b5f82601f83011261331e575f80fd5b613114838335602085016132d4565b5f805f805f60a08688031215613341575f80fd5b61334a86612f8f565b9450602086013561335a81612fa2565b9350604086013567ffffffffffffffff80821115613376575f80fd5b61338289838a0161330f565b94506060880135915080821115613397575f80fd5b506133a48882890161330f565b92505060808601356133b581613136565b809150509295509295909350565b5f805f805f8060a087890312156133d8575f80fd5b6133e187612f8f565b955060208701356133f181612fa2565b945060408701359350606087013561340881612fee565b9250608087013567ffffffffffffffff811115613423575f80fd5b61342f89828a01612ffb565b979a9699509497509295939492505050565b5f8060408385031215613452575f80fd5b61345b83612f8f565b915061346960208401612f8f565b90509250929050565b5f805f805f805f805f805f806109208d8f03121561348e575f80fd5b6134988e8e61321b565b9b506134a88e6104008f0161321b565b9a506108008d013599506108208d013598506108408d013597506134cf6108608e01612f8f565b96506134df6108808e0135612fa2565b6108808d013595506134f46108a08e01612f8f565b94506135046108c08e0135612fa2565b6108c08d013593506108e08d0135925067ffffffffffffffff6109008e0135111561352d575f80fd5b61353e8e6109008f01358f01612ffb565b81935080925050509295989b509295989b509295989b565b5f805f805f805f60c0888a03121561356c575f80fd5b61357588612f8f565b9650602088013561358581612fa2565b955060408801359450606088013561359c81612fa2565b935060808801356135ac81612fee565b925060a088013567ffffffffffffffff8111156135c7575f80fd5b6135d38a828b01612ffb565b989b979a50959850939692959293505050565b5f805f805f8060c087890312156135fb575f80fd5b61360487612f8f565b9550602087013561361481612fa2565b945061362260408801612f8f565b9350606087013561363281612fa2565b9250608087013561364281612fa2565b915060a087013567ffffffffffffffff81111561365d575f80fd5b8701601f8101891361366d575f80fd5b61367c898235602084016132d4565b9150509295509295509295565b5f805f80610460858703121561369d575f80fd5b843593506136ae866020870161321b565b92506136bd6104208601612f8f565b939692955092936104400135925050565b600181811c908216806136e257607f821691505b60208210810361370057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f6001820161373f5761373f61371a565b5060010190565b606081525f61375860608301866130d7565b828103602084015261376a81866130d7565b91505060ff83166040830152949350505050565b5f835161378f8184602088016130b5565b8351908301906137a38183602088016130b5565b01949350505050565b80820281158282048414176106ca576106ca61371a565b808201808211156106ca576106ca61371a565b818382375f9101908152919050565b5f82516137f68184602087016130b5565b9190910192915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b63ffffffff861681525f6001600160a01b03808716602084015280861660408401525060806060830152612ee7608083018486613800565b5f60208284031215613870575f80fd5b5051919050565b818103818111156106ca576106ca61371a565b5f61010060ff8b16835263ffffffff808b1660208501526001600160a01b03808b166040860152818a1660608601528089166080860152508660a08501528160c08501526138da828501876130d7565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff84166020820152606060408201525f613921606083018486613800565b9695505050505050565b601f8211156123d0575f81815260208120601f850160051c810160208610156139515750805b601f850160051c820191505b81811015610cba5782815560010161395d565b815167ffffffffffffffff81111561398a5761398a613268565b61399e8161399884546136ce565b8461392b565b602080601f8311600181146139d1575f84156139ba5750858301515b5f19600386901b1c1916600185901b178555610cba565b5f85815260208120601f198616915b828110156139ff578886015182559484019460019091019084016139e0565b5085821015613a1c57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f61010060ff8c16835263ffffffff808c1660208501526001600160a01b03808c166040860152818b166060860152808a166080860152508760a08501528160c0850152613a7d8285018789613800565b925080851660e085015250509a9950505050505050505050565b5f60208284031215613aa7575f80fd5b815161311481613136565b63ffffffff8181168382160190808211156124615761246161371a565b5f8085851115613add575f80fd5b83861115613ae9575f80fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015613b1e5780818660040360031b1b83161692505b505092915050565b5f805f805f805f60e0888a031215613b3c575f80fd5b8735613b4781612fa2565b96506020880135613b5781612fa2565b9550604088013594506060880135935060808801356131a181613136565b5f805f805f805f80610100898b031215613b8d575f80fd5b8835613b9881612fa2565b97506020890135613ba881612fa2565b965060408901359550606089013594506080890135613bc681612fee565b935060a0890135613bd681613136565b979a969950949793969295929450505060c08201359160e0013590565b600181815b80851115613c2d57815f1904821115613c1357613c1361371a565b80851615613c2057918102915b93841c9390800290613bf8565b509250929050565b5f82613c43575060016106ca565b81613c4f57505f6106ca565b8160018114613c655760028114613c6f57613c8b565b60019150506106ca565b60ff841115613c8057613c8061371a565b50506001821b6106ca565b5060208310610133831016604e8410600b8410161715613cae575081810a6106ca565b613cb88383613bf3565b805f1904821115613ccb57613ccb61371a565b029392505050565b5f6131148383613c35565b634e487b7160e01b5f52600160045260245ffd5b5f60208284031215613d02575f80fd5b815167ffffffffffffffff811115613d18575f80fd5b8201601f81018413613d28575f80fd5b8051613d366132e1826132ad565b818152856020838501011115613d4a575f80fd5b613d5b8260208301602086016130b5565b95945050505050565b5f60208284031215613d74575f80fd5b815161311481612fee56fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a2646970667358221220432f6d6b4446edbe1f73c19fd2115454d5c35d8b03b98a74fd46724151d7672264736f6c63430008140033" 39 | }, 40 | { 41 | "contractName": "PolygonZkEVMBridge proxy", 42 | "balance": "340282366920938463463374607431768211455", 43 | "nonce": "1", 44 | "address": "0xFe12ABaa190Ef0c8638Ee0ba9F828BF41368Ca0E", 45 | "bytecode": "0x60806040526004361061005d575f3560e01c80635c60da1b116100425780635c60da1b146100a65780638f283970146100e3578063f851a440146101025761006c565b80633659cfe6146100745780634f1ef286146100935761006c565b3661006c5761006a610116565b005b61006a610116565b34801561007f575f80fd5b5061006a61008e366004610854565b610130565b61006a6100a136600461086d565b610178565b3480156100b1575f80fd5b506100ba6101eb565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee575f80fd5b5061006a6100fd366004610854565b610228565b34801561010d575f80fd5b506100ba610255565b61011e610282565b61012e610129610359565b610362565b565b610138610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d8160405180602001604052805f8152505f6103bf565b50565b61016d610116565b610180610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101e3576101de8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250600192506103bf915050565b505050565b6101de610116565b5f6101f4610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610359565b905090565b610225610116565b90565b610230610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d816103e9565b5f61025e610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610380565b61028a610380565b73ffffffffffffffffffffffffffffffffffffffff16330361012e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b5f61021861044a565b365f80375f80365f845af43d5f803e80801561037c573d5ff35b3d5ffd5b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b6103c883610471565b5f825111806103d45750805b156101de576103e383836104bd565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f610412610380565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a161016d816104e9565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103a3565b61047a816105f5565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606104e28383604051806060016040528060278152602001610977602791396106c0565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811661058c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610350565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b73ffffffffffffffffffffffffffffffffffffffff81163b610699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610350565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105af565b60605f808573ffffffffffffffffffffffffffffffffffffffff16856040516106e9919061090b565b5f60405180830381855af49150503d805f8114610721576040519150601f19603f3d011682016040523d82523d5f602084013e610726565b606091505b509150915061073786838387610741565b9695505050505050565b606083156107d65782515f036107cf5773ffffffffffffffffffffffffffffffffffffffff85163b6107cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610350565b50816107e0565b6107e083836107e8565b949350505050565b8151156107f85781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103509190610926565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f575f80fd5b919050565b5f60208284031215610864575f80fd5b6104e28261082c565b5f805f6040848603121561087f575f80fd5b6108888461082c565b9250602084013567ffffffffffffffff808211156108a4575f80fd5b818601915086601f8301126108b7575f80fd5b8135818111156108c5575f80fd5b8760208285010111156108d6575f80fd5b6020830194508093505050509250925092565b5f5b838110156109035781810151838201526020016108eb565b50505f910152565b5f825161091c8184602087016108e9565b9190910192915050565b602081525f82518060208401526109448160408501602087016108e9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212202ac98acbfbb3d3ac1b74050e18c4e76db25a3ff2801ec69bf85d0c61414d502b64736f6c63430008140033", 46 | "storage": { 47 | "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000fadb60b5059e31614e02083ff6c021a24c31c891", 48 | "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x000000000000000000000000608484d3e94fc775e3dcb06b0b48486c60a315e6" 49 | } 50 | }, 51 | { 52 | "contractName": "PolygonZkEVMGlobalExitRootL2 implementation", 53 | "balance": "0", 54 | "nonce": "1", 55 | "address": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9", 56 | "bytecode": "0x608060405234801561000f575f80fd5b506004361061004a575f3560e01c806301fd90441461004e578063257b36321461006a57806333d6247d14610089578063a3c573eb1461009e575b5f80fd5b61005760015481565b6040519081526020015b60405180910390f35b61005761007836600461015e565b5f6020819052908152604090205481565b61009c61009736600461015e565b6100ea565b005b6100c57f000000000000000000000000fe12abaa190ef0c8638ee0ba9f828bf41368ca0e81565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610061565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000fe12abaa190ef0c8638ee0ba9f828bf41368ca0e1614610159576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b5f6020828403121561016e575f80fd5b503591905056fea26469706673582212205108c6c4f924146b736832a1bdf696e20d900450207b7452462368d150f2c71c64736f6c63430008140033" 57 | }, 58 | { 59 | "contractName": "PolygonZkEVMGlobalExitRootL2 proxy", 60 | "balance": "0", 61 | "nonce": "1", 62 | "address": "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa", 63 | "bytecode": "0x60806040523661001357610011610017565b005b6100115b61001f6101b7565b6001600160a01b0316336001600160a01b0316141561016f5760606001600160e01b031960003516631b2ce7f360e11b8114156100655761005e6101ea565b9150610167565b6001600160e01b0319811663278f794360e11b14156100865761005e610241565b6001600160e01b031981166308f2839760e41b14156100a75761005e610287565b6001600160e01b031981166303e1469160e61b14156100c85761005e6102b8565b6001600160e01b03198116635c60da1b60e01b14156100e95761005e6102f8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b61017761030c565b565b606061019e83836040518060600160405280602781526020016108576027913961031c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101f4610394565b600061020336600481846106a2565b81019061021091906106e8565b905061022d8160405180602001604052806000815250600061039f565b505060408051602081019091526000815290565b606060008061025336600481846106a2565b8101906102609190610719565b915091506102708282600161039f565b604051806020016040528060008152509250505090565b6060610291610394565b60006102a036600481846106a2565b8101906102ad91906106e8565b905061022d816103cb565b60606102c2610394565b60006102cc6101b7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b6060610302610394565b60006102cc610422565b610177610317610422565b610431565b6060600080856001600160a01b0316856040516103399190610807565b600060405180830381855af49150503d8060008114610374576040519150601f19603f3d011682016040523d82523d6000602084013e610379565b606091505b509150915061038a86838387610455565b9695505050505050565b341561017757600080fd5b6103a8836104d3565b6000825111806103b55750805b156103c6576103c48383610179565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103f46101b7565b604080516001600160a01b03928316815291841660208301520160405180910390a161041f81610513565b50565b600061042c6105bc565b905090565b3660008037600080366000845af43d6000803e808015610450573d6000f35b3d6000fd5b606083156104c15782516104ba576001600160a01b0385163b6104ba5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161015e565b50816104cb565b6104cb83836105e4565b949350505050565b6104dc8161060e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105785760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161015e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101db565b8151156105f45781518083602001fd5b8060405162461bcd60e51b815260040161015e9190610823565b6001600160a01b0381163b61067b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161015e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61059b565b600080858511156106b257600080fd5b838611156106bf57600080fd5b5050820193919092039150565b80356001600160a01b03811681146106e357600080fd5b919050565b6000602082840312156106fa57600080fd5b61019e826106cc565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561072c57600080fd5b610735836106cc565b9150602083013567ffffffffffffffff8082111561075257600080fd5b818501915085601f83011261076657600080fd5b81358181111561077857610778610703565b604051601f8201601f19908116603f011681019083821181831017156107a0576107a0610703565b816040528281528860208487010111156107b957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107f65781810151838201526020016107de565b838111156103c45750506000910152565b600082516108198184602087016107db565b9190910192915050565b60208152600082518060208401526108428160408501602087016107db565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122012bb4f564f73959a03513dc74fc3c6e40e8386e6f02c16b78d6db00ce0aa16af64736f6c63430008090033", 64 | "storage": { 65 | "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000fadb60b5059e31614e02083ff6c021a24c31c891", 66 | "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9" 67 | } 68 | }, 69 | { 70 | "contractName": "PolygonZkEVMTimelock", 71 | "balance": "0", 72 | "nonce": "1", 73 | "address": "0x0165878A594ca255338adfa4d48449f69242Eb8F", 74 | "bytecode": "0x6080604052600436106101bd575f3560e01c806364d62353116100f2578063b1c5f42711610092578063d547741f11610062578063d547741f1461063a578063e38335e514610659578063f23a6e611461066c578063f27a0c92146106b0575f80fd5b8063b1c5f4271461058d578063bc197c81146105ac578063c4d252f5146105f0578063d45c44351461060f575f80fd5b80638f61f4f5116100cd5780638f61f4f5146104c557806391d14854146104f8578063a217fddf14610547578063b08e51c01461055a575f80fd5b806364d62353146104685780638065657f146104875780638f2a0bb0146104a6575f80fd5b8063248a9ca31161015d57806331d507501161013857806331d50750146103b357806336568abe146103d25780633a6aae72146103f1578063584b153e14610449575f80fd5b8063248a9ca3146103375780632ab0f529146103655780632f2ff15d14610394575f80fd5b80630d3cf6fc116101985780630d3cf6fc1461025e578063134008d31461029157806313bc9f20146102a4578063150b7a02146102c3575f80fd5b806301d5062a146101c857806301ffc9a7146101e957806307bd02651461021d575f80fd5b366101c457005b5f80fd5b3480156101d3575f80fd5b506101e76101e2366004611bf6565b6106c4565b005b3480156101f4575f80fd5b50610208610203366004611c65565b610757565b60405190151581526020015b60405180910390f35b348015610228575f80fd5b506102507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610214565b348015610269575f80fd5b506102507f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101e761029f366004611ca4565b6107b2565b3480156102af575f80fd5b506102086102be366004611d0b565b6108a7565b3480156102ce575f80fd5b506103066102dd366004611e28565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610214565b348015610342575f80fd5b50610250610351366004611d0b565b5f9081526020819052604090206001015490565b348015610370575f80fd5b5061020861037f366004611d0b565b5f908152600160208190526040909120541490565b34801561039f575f80fd5b506101e76103ae366004611e8c565b6108cc565b3480156103be575f80fd5b506102086103cd366004611d0b565b6108f5565b3480156103dd575f80fd5b506101e76103ec366004611e8c565b61090d565b3480156103fc575f80fd5b506104247f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b348015610454575f80fd5b50610208610463366004611d0b565b6109c5565b348015610473575f80fd5b506101e7610482366004611d0b565b6109da565b348015610492575f80fd5b506102506104a1366004611ca4565b610aaa565b3480156104b1575f80fd5b506101e76104c0366004611ef7565b610ae8565b3480156104d0575f80fd5b506102507fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b348015610503575f80fd5b50610208610512366004611e8c565b5f9182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610552575f80fd5b506102505f81565b348015610565575f80fd5b506102507ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b348015610598575f80fd5b506102506105a7366004611fa0565b610d18565b3480156105b7575f80fd5b506103066105c63660046120be565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b3480156105fb575f80fd5b506101e761060a366004611d0b565b610d5c565b34801561061a575f80fd5b50610250610629366004611d0b565b5f9081526001602052604090205490565b348015610645575f80fd5b506101e7610654366004611e8c565b610e56565b6101e7610667366004611fa0565b610e7a565b348015610677575f80fd5b50610306610686366004612161565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106bb575f80fd5b50610250611121565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc16106ee81611200565b5f6106fd898989898989610aaa565b9050610709818461120d565b5f817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a60405161074496959493929190612208565b60405180910390a3505050505050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107ac57506107ac82611359565b92915050565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661082e5761082e81336113ef565b5f61083d888888888888610aaa565b905061084981856114a6565b610855888888886115e2565b5f817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a60405161088c9493929190612252565b60405180910390a361089d816116e2565b5050505050505050565b5f818152600160205260408120546001811180156108c55750428111155b9392505050565b5f828152602081905260409020600101546108e681611200565b6108f0838361178a565b505050565b5f8181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109c18282611878565b5050565b5f818152600160208190526040822054610906565b333014610a69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109ae565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b5f868686868686604051602001610ac696959493929190612208565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b1281611200565b888714610ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b888514610c30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f610c418b8b8b8b8b8b8b8b610d18565b9050610c4d818461120d565b5f5b8a811015610d0a5780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610c8c57610c8c612291565b9050602002016020810190610ca191906122be565b8d8d86818110610cb357610cb3612291565b905060200201358c8c87818110610ccc57610ccc612291565b9050602002810190610cde91906122d7565b8c8b604051610cf296959493929190612208565b60405180910390a3610d0381612365565b9050610c4f565b505050505050505050505050565b5f8888888888888888604051602001610d38989796959493929190612447565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610d8681611200565b610d8f826109c5565b610e1b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109ae565b5f828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b5f82815260208190526040902060010154610e7081611200565b6108f08383611878565b5f80527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610ef657610ef681336113ef565b878614610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b878414611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f6110258a8a8a8a8a8a8a8a610d18565b905061103181856114a6565b5f5b8981101561110b575f8b8b8381811061104e5761104e612291565b905060200201602081019061106391906122be565b90505f8a8a8481811061107857611078612291565b905060200201359050365f8a8a8681811061109557611095612291565b90506020028101906110a791906122d7565b915091506110b7848484846115e2565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516110ee9493929190612252565b60405180910390a3505050508061110490612365565b9050611033565b50611115816116e2565b50505050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16158015906111ef57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ef919061250c565b156111f957505f90565b5060025490565b61120a81336113ef565b50565b611216826108f5565b156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109ae565b6112ab611121565b81101561133a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109ae565b611344814261252b565b5f928352600160205260409092209190915550565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107ac57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107ac565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c15761142c8161192d565b61143783602061194c565b604051602001611448929190612560565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109ae916004016125e0565b6114af826108a7565b61153b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b80158061155657505f81815260016020819052604090912054145b6109c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109ae565b5f8473ffffffffffffffffffffffffffffffffffffffff1684848460405161160b929190612630565b5f6040518083038185875af1925050503d805f8114611645576040519150601f19603f3d011682016040523d82523d5f602084013e61164a565b606091505b50509050806116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109ae565b5050505050565b6116eb816108a7565b611777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109ae565b5f90815260016020819052604090912055565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561181a3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b5f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109c1575f8281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107ac73ffffffffffffffffffffffffffffffffffffffff831660145b60605f61195a83600261263f565b61196590600261252b565b67ffffffffffffffff81111561197d5761197d611d22565b6040519080825280601f01601f1916602001820160405280156119a7576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106119dd576119dd612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a3f57611a3f612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f611a7984600261263f565b611a8490600161252b565b90505b6001811115611b20577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611ac557611ac5612291565b1a60f81b828281518110611adb57611adb612291565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060049490941c93611b1981612656565b9050611a87565b5083156108c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ae565b803573ffffffffffffffffffffffffffffffffffffffff81168114611bac575f80fd5b919050565b5f8083601f840112611bc1575f80fd5b50813567ffffffffffffffff811115611bd8575f80fd5b602083019150836020828501011115611bef575f80fd5b9250929050565b5f805f805f805f60c0888a031215611c0c575f80fd5b611c1588611b89565b965060208801359550604088013567ffffffffffffffff811115611c37575f80fd5b611c438a828b01611bb1565b989b979a50986060810135976080820135975060a09091013595509350505050565b5f60208284031215611c75575f80fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108c5575f80fd5b5f805f805f8060a08789031215611cb9575f80fd5b611cc287611b89565b955060208701359450604087013567ffffffffffffffff811115611ce4575f80fd5b611cf089828a01611bb1565b979a9699509760608101359660809091013595509350505050565b5f60208284031215611d1b575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d9657611d96611d22565b604052919050565b5f82601f830112611dad575f80fd5b813567ffffffffffffffff811115611dc757611dc7611d22565b611df860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d4f565b818152846020838601011115611e0c575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f8060808587031215611e3b575f80fd5b611e4485611b89565b9350611e5260208601611b89565b925060408501359150606085013567ffffffffffffffff811115611e74575f80fd5b611e8087828801611d9e565b91505092959194509250565b5f8060408385031215611e9d575f80fd5b82359150611ead60208401611b89565b90509250929050565b5f8083601f840112611ec6575f80fd5b50813567ffffffffffffffff811115611edd575f80fd5b6020830191508360208260051b8501011115611bef575f80fd5b5f805f805f805f805f60c08a8c031215611f0f575f80fd5b893567ffffffffffffffff80821115611f26575f80fd5b611f328d838e01611eb6565b909b50995060208c0135915080821115611f4a575f80fd5b611f568d838e01611eb6565b909950975060408c0135915080821115611f6e575f80fd5b50611f7b8c828d01611eb6565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b5f805f805f805f8060a0898b031215611fb7575f80fd5b883567ffffffffffffffff80821115611fce575f80fd5b611fda8c838d01611eb6565b909a50985060208b0135915080821115611ff2575f80fd5b611ffe8c838d01611eb6565b909850965060408b0135915080821115612016575f80fd5b506120238b828c01611eb6565b999c989b509699959896976060870135966080013595509350505050565b5f82601f830112612050575f80fd5b8135602067ffffffffffffffff82111561206c5761206c611d22565b8160051b61207b828201611d4f565b9283528481018201928281019087851115612094575f80fd5b83870192505b848310156120b35782358252918301919083019061209a565b979650505050505050565b5f805f805f60a086880312156120d2575f80fd5b6120db86611b89565b94506120e960208701611b89565b9350604086013567ffffffffffffffff80821115612105575f80fd5b61211189838a01612041565b94506060880135915080821115612126575f80fd5b61213289838a01612041565b93506080880135915080821115612147575f80fd5b5061215488828901611d9e565b9150509295509295909350565b5f805f805f60a08688031215612175575f80fd5b61217e86611b89565b945061218c60208701611b89565b93506040860135925060608601359150608086013567ffffffffffffffff8111156121b5575f80fd5b61215488828901611d9e565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a060408201525f61223d60a0830186886121c1565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201525f6122876060830184866121c1565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156122ce575f80fd5b6108c582611b89565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261230a575f80fd5b83018035915067ffffffffffffffff821115612324575f80fd5b602001915036819003821315611bef575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361239557612395612338565b5060010190565b8183525f6020808501808196508560051b81019150845f5b8781101561243a57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126123f2575f80fd5b8701858101903567ffffffffffffffff81111561240d575f80fd5b80360382131561241b575f80fd5b6124268682846121c1565b9a87019a95505050908401906001016123b4565b5091979650505050505050565b60a080825281018890525f8960c08301825b8b8110156124945773ffffffffffffffffffffffffffffffffffffffff61247f84611b89565b16825260209283019290910190600101612459565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8911156124cc575f80fd5b8860051b9150818a602083013701828103602090810160408501526124f4908201878961239c565b60608401959095525050608001529695505050505050565b5f6020828403121561251c575f80fd5b815180151581146108c5575f80fd5b808201808211156107ac576107ac612338565b5f5b83811015612558578181015183820152602001612540565b50505f910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081525f835161259781601785016020880161253e565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516125d481602884016020880161253e565b01602801949350505050565b602081525f82518060208401526125fe81604085016020870161253e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b818382375f9101908152919050565b80820281158282048414176107ac576107ac612338565b5f8161266457612664612338565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220e28ae7494480ab1c619fd775dc5ff665588c808a910d66178a982c2e7c76a1e664736f6c63430008140033", 75 | "storage": { 76 | "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000e10", 77 | "0x28810197b2f06faddfcde2125539461ed0f4ba02a950294d23e0985b163c609a": "0x0000000000000000000000000000000000000000000000000000000000000001", 78 | "0xf5e61edb9c9cc6bfbae4463e9a2b1dd6ac3b44ddef38f18016e56ba0363910d9": "0x0000000000000000000000000000000000000000000000000000000000000001", 79 | "0x64494413541ff93b31aa309254e3fed72a7456e9845988b915b4c7a7ceba8814": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", 80 | "0x1bdc4ba272fafecc0fd2ed4f5f96c7f28759f645fa374a6cb7edf8b92b8d3889": "0x0000000000000000000000000000000000000000000000000000000000000001", 81 | "0x3412d5605ac6cd444957cedb533e5dacad6378b4bc819ebe3652188a665066d6": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", 82 | "0xf33f58c8a336520ff99d853fe629f6fa275d605540360c6a502ff6103ec1ff79": "0x0000000000000000000000000000000000000000000000000000000000000001", 83 | "0xdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d706a": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", 84 | "0xd6e2f40a5b167fa43e7d14d6752bcf169787fd148c01a7fe9aebe89358b69803": "0x0000000000000000000000000000000000000000000000000000000000000001", 85 | "0xc3ad33e20b0c56a223ad5104fff154aa010f8715b9c981fd38fdc60a4d1a52fc": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" 86 | } 87 | }, 88 | { 89 | "accountName": "keyless Deployer", 90 | "balance": "0", 91 | "nonce": "1", 92 | "address": "0x694AB5383a002a4796f95530c14Cf0C25ec3EA03" 93 | }, 94 | { 95 | "accountName": "deployer", 96 | "balance": "100000000000000000000000", 97 | "nonce": "8", 98 | "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" 99 | } 100 | ] 101 | } -------------------------------------------------------------------------------- /config/node/prover.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "runExecutorServer": true, 3 | "runExecutorClient": false, 4 | "runExecutorClientMultithread": false, 5 | 6 | "runHashDBServer": true, 7 | "runHashDBTest": false, 8 | 9 | "runAggregatorServer": false, 10 | "runAggregatorClient": false, 11 | "runAggregatorClientMock": true, 12 | "aggregatorClientMockTimeout": 1, 13 | "proverName": "test-prover", 14 | 15 | "runFileGenBatchProof": false, 16 | "runFileGenAggregatedProof": false, 17 | "runFileGenFinalProof": false, 18 | "runFileProcessBatch": false, 19 | "runFileProcessBatchMultithread": false, 20 | 21 | "runKeccakScriptGenerator": false, 22 | "runKeccakTest": false, 23 | "runStorageSMTest": false, 24 | "runBinarySMTest": false, 25 | "runMemAlignSMTest": false, 26 | "runSHA256Test": false, 27 | "runBlakeTest": false, 28 | 29 | "executeInParallel": true, 30 | "useMainExecGenerated": true, 31 | "saveRequestToFile": false, 32 | "saveInputToFile": false, 33 | "saveDbReadsToFile": false, 34 | "saveDbReadsToFileOnChange": false, 35 | "saveOutputToFile": true, 36 | "saveProofToFile": true, 37 | "saveResponseToFile": false, 38 | "loadDBToMemCache": true, 39 | "opcodeTracer": false, 40 | "logRemoteDbReads": false, 41 | "logExecutorServerResponses": false, 42 | 43 | "proverServerPort": 50051, 44 | "proverServerMockPort": 50052, 45 | "proverServerMockTimeout": 10000000, 46 | "proverClientPort": 50051, 47 | "proverClientHost": "127.0.0.1", 48 | 49 | "executorServerPort": 50071, 50 | "executorROMLineTraces": false, 51 | "executorClientPort": 50071, 52 | "executorClientHost": "127.0.0.1", 53 | 54 | "hashDBServerPort": 50061, 55 | "hashDBURL": "local", 56 | 57 | "aggregatorServerPort": 50081, 58 | "aggregatorClientPort": 50081, 59 | "aggregatorClientHost": "zkevm-aggregator", 60 | 61 | "mapConstPolsFile": false, 62 | "mapConstantsTreeFile": false, 63 | 64 | "inputFile": "input_executor_0.json", 65 | "inputFile2": "input_executor_1.json", 66 | 67 | "keccakScriptFile": "config/scripts/keccak_script.json", 68 | "storageRomFile": "config/scripts/storage_sm_rom.json", 69 | 70 | "outputPath": "output", 71 | 72 | "databaseURL": "postgresql://prover_user:prover_pass@zkevm-state-db:5432/prover_db", 73 | "dbNodesTableName": "state.nodes", 74 | "dbProgramTableName": "state.program", 75 | "dbMultiWrite": true, 76 | "dbFlushInParallel": false, 77 | "dbMTCacheSize": 1024, 78 | "dbProgramCacheSize": 512, 79 | "dbNumberOfPoolConnections": 30, 80 | "dbGetTree": true, 81 | "cleanerPollingPeriod": 600, 82 | "requestsPersistence": 3600, 83 | "maxExecutorThreads": 20, 84 | "maxProverThreads": 8, 85 | "maxHashDBThreads": 8, 86 | "ECRecoverPrecalc": false, 87 | "ECRecoverPrecalcNThreads": 4, 88 | "stateManager": true, 89 | "useAssociativeCache": false 90 | } 91 | -------------------------------------------------------------------------------- /config/node/sequencer.keystore: -------------------------------------------------------------------------------- 1 | {"address":"f39fd6e51aad88f6f4ce6ab8827279cfffb92266","crypto":{"cipher":"aes-128-ctr","ciphertext":"d005030a7684f3adad2447cbb27f63039eec2224c451eaa445de0d90502b9f3d","cipherparams":{"iv":"dc07a54bc7e388efa89c34d42f2ebdb4"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"cf2ec55ecae11171de575112cfb16963570533a9c46fb774473ceb11519eb24a"},"mac":"3eb180d405a5da6e462b2adc00091c14856c91d574bf27348714506357d6e177"},"id":"035454db-6b6d-477f-8a79-ce24c10b185f","version":3} -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.5" 2 | networks: 3 | default: 4 | name: zkevm 5 | 6 | services: 7 | zkevm-sequencer: 8 | container_name: zkevm-sequencer 9 | user: root 10 | image: 0xpolygon/cdk-validium-node:0.6.4-cdk.2 11 | ports: 12 | - 9092:9091 # needed if metrics enabled 13 | - 6060:6060 14 | - 6900:6900 # Data stream server 15 | volumes: 16 | - ./config/node/config.toml:/app/config.toml 17 | - ./config/node/genesis.config.json:/app/genesis.json 18 | - ./:/datastreamer 19 | command: 20 | - "/bin/sh" 21 | - "-c" 22 | - "/app/zkevm-node run --network custom --custom-network-file /app/genesis.json --cfg /app/config.toml --components sequencer" 23 | 24 | zkevm-sequence-sender: 25 | container_name: zkevm-sequence-sender 26 | image: 0xpolygon/cdk-validium-node:0.6.4-cdk.2 27 | volumes: 28 | - ./config/node/sequencer.keystore:/pk/sequencer.keystore 29 | - ./config/node/config.toml:/app/config.toml 30 | - ./config/node/genesis.config.json:/app/genesis.json 31 | command: 32 | - "/bin/sh" 33 | - "-c" 34 | - "/app/zkevm-node run --network custom --custom-network-file /app/genesis.json --cfg /app/config.toml --components sequence-sender" 35 | 36 | zkevm-json-rpc: 37 | container_name: zkevm-json-rpc 38 | image: 0xpolygon/cdk-validium-node:0.6.4-cdk.2 39 | ports: 40 | - 8123:8123 41 | - 8133:8133 # needed if WebSockets enabled 42 | - 9091:9091 # needed if metrics enabled 43 | volumes: 44 | - ./config/node/config.toml:/app/config.toml 45 | - ./config/node/genesis.config.json:/app/genesis.json 46 | command: 47 | - "/bin/sh" 48 | - "-c" 49 | - "/app/zkevm-node run --network custom --custom-network-file /app/genesis.json --cfg /app/config.toml --components rpc" 50 | 51 | zkevm-aggregator: 52 | container_name: zkevm-aggregator 53 | image: 0xpolygon/cdk-validium-node:0.6.4-cdk.2 54 | ports: 55 | - 50081:50081 56 | - 9093:9091 # needed if metrics enabled 57 | volumes: 58 | - ./config/node/config.toml:/app/config.toml 59 | - ./config/node/genesis.config.json:/app/genesis.json 60 | command: 61 | - "/bin/sh" 62 | - "-c" 63 | - "/app/zkevm-node run --network custom --custom-network-file /app/genesis.json --cfg /app/config.toml --components aggregator" 64 | 65 | zkevm-sync: 66 | container_name: zkevm-sync 67 | image: 0xpolygon/cdk-validium-node:0.6.4-cdk.2 68 | ports: 69 | - 9095:9091 # needed if metrics enabled 70 | volumes: 71 | - ./config/node/config.toml:/app/config.toml 72 | - ./config/node/genesis.config.json:/app/genesis.json 73 | command: 74 | - "/bin/sh" 75 | - "-c" 76 | - "/app/zkevm-node run --network custom --custom-network-file /app/genesis.json --cfg /app/config.toml --components synchronizer" 77 | 78 | zkevm-eth-tx-manager: 79 | container_name: zkevm-eth-tx-manager 80 | image: 0xpolygon/cdk-validium-node:0.6.4-cdk.2 81 | ports: 82 | - 9094:9091 # needed if metrics enabled 83 | volumes: 84 | - ./config/node/sequencer.keystore:/pk/sequencer.keystore 85 | - ./config/node/aggregator.keystore:/pk/aggregator.keystore 86 | - ./config/node/config.toml:/app/config.toml 87 | - ./config/node/genesis.config.json:/app/genesis.json 88 | command: 89 | - "/bin/sh" 90 | - "-c" 91 | - "/app/zkevm-node run --network custom --custom-network-file /app/genesis.json --cfg /app/config.toml --components eth-tx-manager" 92 | 93 | zkevm-l2gaspricer: 94 | container_name: zkevm-l2gaspricer 95 | image: 0xpolygon/cdk-validium-node:0.6.4-cdk.2 96 | volumes: 97 | - ./test.keystore:/pk/keystore 98 | - ./config/node/config.toml:/app/config.toml 99 | - ./config/node/genesis.config.json:/app/genesis.json 100 | command: 101 | - "/bin/sh" 102 | - "-c" 103 | - "/app/zkevm-node run --network custom --custom-network-file /app/genesis.json --cfg /app/config.toml --components l2gaspricer" 104 | 105 | zkevm-state-db: 106 | container_name: zkevm-state-db 107 | image: postgres:15 108 | deploy: 109 | resources: 110 | limits: 111 | memory: 2G 112 | reservations: 113 | memory: 1G 114 | ports: 115 | - 5432:5432 116 | volumes: 117 | - ./config/node/db_scripts/init_prover_db.sql:/docker-entrypoint-initdb.d/init.sql 118 | - zkevm_state_db_data:/var/lib/postgresql/data 119 | environment: 120 | - POSTGRES_USER=state_user 121 | - POSTGRES_PASSWORD=state_password 122 | - POSTGRES_DB=state_db 123 | command: 124 | - "postgres" 125 | - "-N" 126 | - "500" 127 | 128 | zkevm-pool-db: 129 | container_name: zkevm-pool-db 130 | image: postgres:15 131 | deploy: 132 | resources: 133 | limits: 134 | memory: 2G 135 | reservations: 136 | memory: 1G 137 | ports: 138 | - 5433:5432 139 | volumes: 140 | - zkevm_pool_db_data:/var/lib/postgresql/data 141 | environment: 142 | - POSTGRES_USER=pool_user 143 | - POSTGRES_PASSWORD=pool_password 144 | - POSTGRES_DB=pool_db 145 | command: 146 | - "postgres" 147 | - "-N" 148 | - "500" 149 | 150 | zkevm-event-db: 151 | container_name: zkevm-event-db 152 | image: postgres:15 153 | deploy: 154 | resources: 155 | limits: 156 | memory: 2G 157 | reservations: 158 | memory: 1G 159 | ports: 160 | - 5435:5432 161 | volumes: 162 | - ./config/node/db_scripts/init_event_db.sql:/docker-entrypoint-initdb.d/init.sql 163 | - zkevm_event_db_data:/var/lib/postgresql/data 164 | environment: 165 | - POSTGRES_USER=event_user 166 | - POSTGRES_PASSWORD=event_password 167 | - POSTGRES_DB=event_db 168 | command: 169 | - "postgres" 170 | - "-N" 171 | - "500" 172 | 173 | ### Explorer related 174 | explorer-backend-l1: 175 | extends: 176 | file: ./services/docker-compose-explorer-backend.yml 177 | service: explorer-backend 178 | container_name: explorer-backend-l1 179 | image: blockscout/blockscout:${EXPLORER_DOCKER_TAG_BACKEND:-latest} 180 | ports: 181 | - 4000:4000 182 | environment: 183 | - NETWORK=ETH 184 | - SUBNETWORK=Local Ethereum 185 | - ETHEREUM_JSONRPC_HTTP_URL=${L1_RPC_URL} 186 | - ETHEREUM_JSONRPC_TRACE_URL=${L1_RPC_URL} 187 | - DATABASE_URL=postgresql://l1_explorer_user:l1_explorer_password@explorer-backend-l1-db:5432/l1_explorer_db 188 | - SECRET_KEY_BASE=${EXPLORER_L1_SECRET_KEY_BASE} 189 | - MIX_ENV=prod 190 | - INDEXER_DISABLE_INTERNAL_TRANSACTIONS_FETCHER=true 191 | - ETHEREUM_JSONRPC_DISABLE_ARCHIVE_BALANCES=true 192 | 193 | explorer-backend-l1-db: 194 | container_name: explorer-backend-l1-db 195 | image: postgres:15 196 | ports: 197 | - 5436:5432 198 | environment: 199 | - POSTGRES_USER=l1_explorer_user 200 | - POSTGRES_PASSWORD=l1_explorer_password 201 | - POSTGRES_DB=l1_explorer_db 202 | volumes: 203 | - explorer_l1_backend_db_data:/var/lib/postgresql/data 204 | command: 205 | - "postgres" 206 | - "-N" 207 | - "500" 208 | 209 | explorer-smart-contract-verifier: 210 | extends: 211 | file: ./services/docker-compose-explorer-smart-contract-verifier.yml 212 | service: explorer-smart-contract-verifier 213 | 214 | explorer-visualizer: 215 | extends: 216 | file: ./services/docker-compose-explorer-visualizer.yml 217 | service: explorer-visualizer 218 | 219 | explorer-sig-provider: 220 | extends: 221 | file: ./services/docker-compose-explorer-sig-provider.yml 222 | service: explorer-sig-provider 223 | 224 | explorer-frontend-l1: 225 | depends_on: 226 | - explorer-backend-l1 227 | extends: 228 | file: ./services/docker-compose-explorer-frontend.yml 229 | service: explorer-frontend 230 | container_name: 'explorer-frontend-l1' 231 | environment: 232 | - NEXT_PUBLIC_API_PORT=81 233 | - NEXT_PUBLIC_NETWORK_NAME=Local Ethereum 234 | - NEXT_PUBLIC_NETWORK_SHORT_NAME=Local Ethereum 235 | - NEXT_PUBLIC_NETWORK_ID=1337 236 | - NEXT_PUBLIC_NETWORK_RPC_URL=http://${COMMON_HOST}:8545 237 | - NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID=${EXPLORER_WALLET_CONNECT_PROJECT_ID} 238 | - NEXT_PUBLIC_STATS_API_HOST=http://${COMMON_HOST}:8082 239 | ports: 240 | - 3000:3000 241 | 242 | explorer-stats-db-l1: 243 | depends_on: 244 | - explorer-backend-l1 245 | extends: 246 | file: ./services/docker-compose-explorer-stats.yml 247 | service: explorer-stats-db 248 | container_name: 'explorer-stats-db-l1' 249 | ports: 250 | - 7433:5432 251 | volumes: 252 | - explorer_l1_stats_db_data:/var/lib/postgresql/data 253 | 254 | explorer-stats-l1: 255 | depends_on: 256 | - explorer-stats-db-l1 257 | extends: 258 | file: ./services/docker-compose-explorer-stats.yml 259 | service: explorer-stats 260 | container_name: 'explorer-stats-l1' 261 | ports: 262 | - 8153:8050 263 | environment: 264 | - STATS__DB_URL=postgresql://explorer_stats_user:explorer_stats_password@explorer-stats-db-l1:5432/explorer_stats_db 265 | - STATS__BLOCKSCOUT_DB_URL=postgresql://l1_explorer_user:l1_explorer_password@explorer-backend-l1-db:5432/l1_explorer_db 266 | 267 | explorer-proxy-l1: 268 | depends_on: 269 | - explorer-backend-l1 270 | - explorer-frontend-l1 271 | - explorer-stats-l1 272 | extends: 273 | file: ./services/docker-compose-explorer-nginx.yml 274 | service: explorer-proxy 275 | container_name: 'explorer-proxy-l1' 276 | environment: 277 | PROXIED_FRONT_URL: http://${COMMON_HOST}:81 278 | BACK_PROXY_PASS: http://explorer-backend-l1:4000 279 | FRONT_PROXY_PASS: http://explorer-frontend-l1:3000 280 | STATS_PROXY_PASS: http://explorer-stats-l1:8050/ 281 | ports: 282 | - 81:80 283 | - 8082:8080 284 | 285 | explorer-visualizer-proxy: 286 | extends: 287 | file: ./services/docker-compose-explorer-nginx.yml 288 | service: visualizer-proxy 289 | container_name: 'visualizer-proxy' 290 | environment: 291 | PROXIED_FRONT_URL: http://${COMMON_HOST} 292 | FRONT_PROXY_PASS: http://explorer-visualizer:8050/ 293 | ports: 294 | - 8083:8081 295 | 296 | explorer-backend-l2: 297 | extends: 298 | file: ./services/docker-compose-explorer-backend.yml 299 | service: explorer-backend 300 | container_name: explorer-backend-l2 301 | image: blockscout/blockscout-zkevm:${EXPLORER_DOCKER_TAG_BACKEND:-latest} 302 | ports: 303 | - 4001:4000 304 | environment: 305 | - NETWORK=POE 306 | - SUBNETWORK=Polygon Hermez 307 | - ETHEREUM_JSONRPC_HTTP_URL=http://zkevm-explorer-json-rpc:8124 308 | - ETHEREUM_JSONRPC_TRACE_URL=http://zkevm-explorer-json-rpc:8124 309 | - DATABASE_URL=postgresql://l2_explorer_user:l2_explorer_password@explorer-backend-l2-db:5432/l2_explorer_db 310 | - SECRET_KEY_BASE=${EXPLORER_L2_SECRET_KEY_BASE} 311 | - MIX_ENV=prod 312 | - INDEXER_ZKEVM_BATCHES_ENABLED=true 313 | - CHAIN_TYPE=polygon_zkevm 314 | - CACHE_BLOCK_COUNT_PERIOD=5s 315 | 316 | zkevm-explorer-json-rpc: 317 | container_name: zkevm-explorer-json-rpc 318 | image: 0xpolygon/cdk-validium-node:0.6.4-cdk.2 319 | ports: 320 | - 8124:8124 321 | - 8134:8134 # needed if WebSockets enabled 322 | environment: 323 | - ZKEVM_NODE_RPC_PORT=8124 324 | - ZKEVM_NODE_RPC_WEBSOCKETS_PORT=8134 325 | volumes: 326 | - ./config/node/config.toml:/app/config.toml 327 | - ./config/node/genesis.config.json:/app/genesis.json 328 | command: 329 | - "/bin/sh" 330 | - "-c" 331 | - "/app/zkevm-node run --network custom --custom-network-file /app/genesis.json --cfg /app/config.toml --components rpc --http.api eth,net,debug,zkevm,txpool,web3" 332 | 333 | explorer-backend-l2-db: 334 | container_name: explorer-backend-l2-db 335 | image: postgres:15 336 | ports: 337 | - 5437:5432 338 | environment: 339 | - POSTGRES_USER=l2_explorer_user 340 | - POSTGRES_PASSWORD=l2_explorer_password 341 | - POSTGRES_DB=l2_explorer_db 342 | volumes: 343 | - explorer_l2_backend_db_data:/var/lib/postgresql/data 344 | command: [ "postgres", "-N", "500" ] 345 | 346 | explorer-frontend-l2: 347 | depends_on: 348 | - explorer-backend-l2 349 | extends: 350 | file: ./services/docker-compose-explorer-frontend.yml 351 | service: explorer-frontend 352 | container_name: 'explorer-frontend-l2' 353 | environment: 354 | - NEXT_PUBLIC_APP_PORT=3001 355 | - NEXT_PUBLIC_NETWORK_NAME=zkEVM 356 | - NEXT_PUBLIC_NETWORK_SHORT_NAME=zkEVM 357 | - NEXT_PUBLIC_NETWORK_ID=1001 358 | - NEXT_PUBLIC_NETWORK_RPC_URL=http://${COMMON_HOST}:8123 359 | - NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID=${EXPLORER_WALLET_CONNECT_PROJECT_ID} 360 | # TODO: should not use the main branch 361 | - NEXT_PUBLIC_NETWORK_LOGO=https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/network-logos/polygon.svg 362 | - NEXT_PUBLIC_NETWORK_ICON=https://raw.githubusercontent.com/blockscout/frontend-configs/main/configs/network-icons/polygon-short.svg 363 | - NEXT_PUBLIC_HOMEPAGE_PLATE_BACKGROUND=linear-gradient(122deg, rgba(162, 41, 197, 1) 0%, rgba(123, 63, 228, 1) 100%) 364 | - NEXT_PUBLIC_HOMEPAGE_PLATE_TEXT_COLOR=rgba(255, 255, 255, 1) 365 | - NEXT_PUBLIC_STATS_API_HOST=http://${COMMON_HOST}:8084 366 | ports: 367 | - 3001:3000 368 | 369 | explorer-stats-db-l2: 370 | depends_on: 371 | - explorer-backend-l2 372 | extends: 373 | file: ./services/docker-compose-explorer-stats.yml 374 | service: explorer-stats-db 375 | container_name: 'explorer-stats-db-l2' 376 | ports: 377 | - 7434:5432 378 | volumes: 379 | - explorer_l2_stats_db_data:/var/lib/postgresql/data 380 | 381 | explorer-stats-l2: 382 | depends_on: 383 | - explorer-stats-db-l2 384 | extends: 385 | file: ./services/docker-compose-explorer-stats.yml 386 | service: explorer-stats 387 | container_name: 'explorer-stats-l2' 388 | ports: 389 | - 8154:8050 390 | environment: 391 | - STATS__DB_URL=postgresql://explorer_stats_user:explorer_stats_password@explorer-stats-db-l2:5432/explorer_stats_db 392 | - STATS__BLOCKSCOUT_DB_URL=postgresql://l2_explorer_user:l2_explorer_password@explorer-backend-l2-db:5432/l2_explorer_db 393 | 394 | explorer-proxy-l2: 395 | depends_on: 396 | - explorer-backend-l2 397 | - explorer-frontend-l2 398 | - explorer-stats-l2 399 | extends: 400 | file: ./services/docker-compose-explorer-nginx.yml 401 | service: explorer-proxy 402 | container_name: 'explorer-proxy-l2' 403 | environment: 404 | PROXIED_FRONT_URL: http://${COMMON_HOST} 405 | BACK_PROXY_PASS: http://explorer-backend-l2:4000 406 | FRONT_PROXY_PASS: http://explorer-frontend-l2:3000 407 | STATS_PROXY_PASS: http://explorer-stats-l2:8050/ 408 | ports: 409 | - 80:80 410 | - 8084:8080 411 | 412 | zkevm-mock-l1-network: 413 | container_name: zkevm-mock-l1-network 414 | image: snapchain/geth-cdk-validium-contracts:v0.0.3 415 | pull_policy: always 416 | ports: 417 | - 8545:8545 418 | - 8546:8546 419 | volumes: 420 | - deploy-output:/deploymentOutput 421 | - zkevm_mock_l1_geth_data:/geth_data 422 | command: 423 | - "--http" 424 | - "--http.api" 425 | - "admin,eth,debug,miner,net,txpool,personal,web3" 426 | - "--http.addr" 427 | - "0.0.0.0" 428 | - "--http.corsdomain" 429 | - "*" 430 | - "--http.vhosts" 431 | - "*" 432 | - "--ws" 433 | - "--ws.origins" 434 | - "*" 435 | - "--ws.addr" 436 | - "0.0.0.0" 437 | - "--dev" 438 | - "--dev.period" 439 | - "1" 440 | - "--datadir" 441 | - "/geth_data" 442 | - "--rpc.allow-unprotected-txs" 443 | 444 | # zkevm-deploy-sepolia: 445 | # container_name: zkevm-deploy-sepolia 446 | # image: snapchain/cdk-validium-contracts:v0.0.2 447 | # volumes: 448 | # - ./config/deploy_parameters.json:/cdk-validium-contracts/deployment/deploy_parameters.json 449 | # - deploy-output:/cdk-validium-contracts/deploymentOutput 450 | # environment: 451 | # - MNEMONIC= 452 | # - INFURA_PROJECT_ID= 453 | # - HARDHAT_NETWORK=sepolia 454 | # command: 455 | # - "/bin/sh" 456 | # - "-c" 457 | # - "npm run deploy:deployer:CDKValidium:sepolia && npm run deploy:testnet:CDKValidium:sepolia" 458 | 459 | zkevm-data-availability: 460 | container_name: zkevm-data-availability 461 | restart: unless-stopped 462 | depends_on: 463 | zkevm-data-node-db: 464 | condition: service_healthy 465 | image: 0xpolygon/cdk-data-availability:0.0.7 466 | deploy: 467 | resources: 468 | limits: 469 | memory: 1G 470 | reservations: 471 | memory: 512M 472 | ports: 473 | - 8444:8444 474 | volumes: 475 | - ./config/dac/config.toml:/app/config.toml 476 | - ./config/dac/dac-member.keystore:/pk/dac-member.keystore 477 | command: 478 | - "/bin/sh" 479 | - "-c" 480 | - "/app/cdk-data-availability run --cfg /app/config.toml" 481 | 482 | zkevm-prover: 483 | container_name: zkevm-prover 484 | image: hermeznetwork/zkevm-prover:v6.0.0 485 | ports: 486 | - 50061:50061 # MT 487 | - 50071:50071 # Executor 488 | volumes: 489 | - ./config/node/prover.config.json:/usr/src/app/config.json 490 | command: > 491 | zkProver -c /usr/src/app/config.json 492 | 493 | # from https://github.com/0xPolygonHermez/zkevm-bridge-service/blob/v0.3.1/docker-compose.yml 494 | zkevm-bridge-db: 495 | container_name: zkevm-bridge-db 496 | image: postgres:15 497 | deploy: 498 | resources: 499 | limits: 500 | memory: 2G 501 | reservations: 502 | memory: 1G 503 | expose: 504 | - 5438 505 | ports: 506 | - 5438:5432 507 | volumes: 508 | - zkevm_bridge_db_data:/var/lib/postgresql/data 509 | environment: 510 | - POSTGRES_USER=test_user 511 | - POSTGRES_PASSWORD=test_password 512 | - POSTGRES_DB=test_db 513 | command: ["postgres", "-N", "500"] 514 | 515 | # from https://github.com/0xPolygonHermez/zkevm-bridge-service/blob/v0.3.1/docker-compose.yml 516 | zkevm-bridge-service: 517 | container_name: zkevm-bridge-service 518 | image: hermeznetwork/zkevm-bridge-service:v0.4.2 519 | ports: 520 | - 8080:8080 521 | - 9080:9090 522 | environment: 523 | - ZKEVM_BRIDGE_DATABASE_USER=test_user 524 | - ZKEVM_BRIDGE_DATABASE_PASSWORD=test_password 525 | - ZKEVM_BRIDGE_DATABASE_NAME=test_db 526 | - ZKEVM_BRIDGE_DATABASE_HOST=zkevm-bridge-db 527 | - ZKEVM_BRIDGE_DATABASE_PORT=5432 528 | volumes: 529 | - ./config/bridge/claimtx.keystore:/pk/keystore.claimtxmanager 530 | - ./config/bridge/config.toml:/app/config.toml 531 | command: 532 | - "/bin/sh" 533 | - "-c" 534 | - "/app/zkevm-bridge run --cfg /app/config.toml" 535 | 536 | zkevm-bridge-ui: 537 | container_name: zkevm-bridge-ui 538 | image: hermeznetwork/zkevm-bridge-ui:latest 539 | ports: 540 | - 8088:80 541 | depends_on: 542 | - zkevm-bridge-service 543 | environment: 544 | - ETHEREUM_RPC_URL=http://${COMMON_HOST}:8545 545 | - ETHEREUM_EXPLORER_URL=${L1_EXPLORER_URL} 546 | - ETHEREUM_BRIDGE_CONTRACT_ADDRESS=0xFe12ABaa190Ef0c8638Ee0ba9F828BF41368Ca0E 547 | - ETHEREUM_FORCE_UPDATE_GLOBAL_EXIT_ROOT=true 548 | - ETHEREUM_PROOF_OF_EFFICIENCY_CONTRACT_ADDRESS=0x1F708C24a0D3A740cD47cC0444E9480899f3dA7D 549 | - ETHEREUM_ROLLUP_MANAGER_ADDRESS=0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0 550 | - POLYGON_ZK_EVM_RPC_URL=http://${COMMON_HOST}:8123 551 | - POLYGON_ZK_EVM_EXPLORER_URL=http://${COMMON_HOST}:80 552 | - POLYGON_ZK_EVM_BRIDGE_CONTRACT_ADDRESS=0xFe12ABaa190Ef0c8638Ee0ba9F828BF41368Ca0E 553 | - POLYGON_ZK_EVM_NETWORK_ID=1 554 | - BRIDGE_API_URL=http://${COMMON_HOST}:8080 555 | - ENABLE_FIAT_EXCHANGE_RATES=false 556 | - ENABLE_OUTDATED_NETWORK_MODAL=false 557 | - ENABLE_DEPOSIT_WARNING=true 558 | - ENABLE_REPORT_FORM=false 559 | 560 | zkevm-approve: 561 | container_name: zkevm-approve 562 | image: 0xpolygon/cdk-validium-node:0.6.4-cdk.2 563 | volumes: 564 | - ./config/node/sequencer.keystore:/pk/keystore 565 | - ./config/node/config.toml:/app/config.toml 566 | - ./config/node/genesis.config.json:/app/genesis.json 567 | command: 568 | - "/bin/sh" 569 | - "-c" 570 | - "/app/zkevm-node approve --network custom --custom-network-file /app/genesis.json --key-store-path /pk/keystore --pw testonly --am 115792089237316195423570985008687907853269984665640564039457584007913129639935 -y --cfg /app/config.toml" 571 | 572 | zkevm-metrics: 573 | image: prom/prometheus:v2.39.1 574 | container_name: zkevm-metrics 575 | restart: unless-stopped 576 | ports: 577 | - 9090:9090 578 | command: 579 | - --config.file=/etc/prometheus/prometheus.yml 580 | - --web.enable-lifecycle 581 | volumes: 582 | - ./config/metrics/prometheus:/etc/prometheus 583 | 584 | zkevm-sh: 585 | container_name: zkevm-sh 586 | image: 0xpolygon/cdk-validium-node:0.6.4-cdk.2 587 | stdin_open: true 588 | tty: true 589 | volumes: 590 | - ./config/node/config.toml:/app/config.toml 591 | - ./config/node/genesis.config.json:/app/genesis.json 592 | command: 593 | - "/bin/sh" 594 | 595 | zkevm-data-node-db: 596 | container_name: zkevm-data-node-db 597 | restart: unless-stopped 598 | image: postgres:15 599 | healthcheck: 600 | test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"] 601 | interval: 10s 602 | timeout: 5s 603 | retries: 5 604 | ports: 605 | - 5444:5432 606 | volumes: 607 | - zkevm_dac_node_db_data:/var/lib/postgresql/data 608 | environment: 609 | - POSTGRES_USER=committee_user 610 | - POSTGRES_PASSWORD=committee_password 611 | - POSTGRES_DB=committee_db 612 | command: 613 | - "postgres" 614 | - "-N" 615 | - "500" 616 | 617 | volumes: 618 | deploy-output: 619 | explorer_l1_backend_db_data: 620 | explorer_l1_stats_db_data: 621 | explorer_l2_backend_db_data: 622 | explorer_l2_stats_db_data: 623 | zkevm_bridge_db_data: 624 | zkevm_dac_node_db_data: 625 | zkevm_event_db_data: 626 | zkevm_mock_l1_geth_data: 627 | zkevm_pool_db_data: 628 | zkevm_state_db_data: -------------------------------------------------------------------------------- /envs/common-blockscout.env: -------------------------------------------------------------------------------- 1 | ETHEREUM_JSONRPC_VARIANT=geth 2 | ETHEREUM_JSONRPC_HTTP_URL= 3 | # ETHEREUM_JSONRPC_FALLBACK_HTTP_URL= 4 | ETHEREUM_JSONRPC_TRACE_URL= 5 | # ETHEREUM_JSONRPC_FALLBACK_TRACE_URL= 6 | # ETHEREUM_JSONRPC_HTTP_TIMEOUT= 7 | # CHAIN_TYPE= 8 | NETWORK= 9 | SUBNETWORK=Awesome chain 10 | LOGO=/images/blockscout_logo.svg 11 | # ETHEREUM_JSONRPC_WS_URL= 12 | ETHEREUM_JSONRPC_TRANSPORT=http 13 | ETHEREUM_JSONRPC_DISABLE_ARCHIVE_BALANCES=false 14 | #ETHEREUM_JSONRPC_ARCHIVE_BALANCES_WINDOW=200 15 | # ETHEREUM_JSONRPC_HTTP_HEADERS= 16 | # ETHEREUM_JSONRPC_WAIT_PER_TIMEOUT= 17 | IPC_PATH= 18 | NETWORK_PATH=/ 19 | BLOCKSCOUT_HOST= 20 | BLOCKSCOUT_PROTOCOL= 21 | # SECRET_KEY_BASE= 22 | # CHECK_ORIGIN= 23 | PORT=4000 24 | COIN_NAME= 25 | # METADATA_CONTRACT= 26 | # VALIDATORS_CONTRACT= 27 | # KEYS_MANAGER_CONTRACT= 28 | # REWARDS_CONTRACT= 29 | # TOKEN_BRIDGE_CONTRACT= 30 | EMISSION_FORMAT=DEFAULT 31 | # CHAIN_SPEC_PATH= 32 | # SUPPLY_MODULE= 33 | COIN=ETH 34 | EXCHANGE_RATES_COIN= 35 | # EXCHANGE_RATES_MARKET_CAP_SOURCE= 36 | # EXCHANGE_RATES_TVL_SOURCE= 37 | # EXCHANGE_RATES_PRICE_SOURCE= 38 | # EXCHANGE_RATES_COINGECKO_COIN_ID= 39 | # EXCHANGE_RATES_COINGECKO_API_KEY= 40 | # EXCHANGE_RATES_COINMARKETCAP_API_KEY= 41 | # EXCHANGE_RATES_COINMARKETCAP_COIN_ID= 42 | POOL_SIZE=80 43 | # EXCHANGE_RATES_COINGECKO_PLATFORM_ID= 44 | # TOKEN_EXCHANGE_RATE_INTERVAL= 45 | # TOKEN_EXCHANGE_RATE_REFETCH_INTERVAL= 46 | # TOKEN_EXCHANGE_RATE_MAX_BATCH_SIZE= 47 | # DISABLE_TOKEN_EXCHANGE_RATE= 48 | POOL_SIZE_API=10 49 | ECTO_USE_SSL=false 50 | # DATADOG_HOST= 51 | # DATADOG_PORT= 52 | # SPANDEX_BATCH_SIZE= 53 | # SPANDEX_SYNC_THRESHOLD= 54 | HEART_BEAT_TIMEOUT=30 55 | # HEART_COMMAND= 56 | #BLOCKSCOUT_VERSION= 57 | RELEASE_LINK= 58 | BLOCK_TRANSFORMER=base 59 | # GRAPHIQL_TRANSACTION= 60 | # BLOCK_RANGES= 61 | # FIRST_BLOCK= 62 | # LAST_BLOCK= 63 | # TRACE_FIRST_BLOCK= 64 | # TRACE_LAST_BLOCK= 65 | # FOOTER_CHAT_LINK= 66 | # FOOTER_FORUM_LINK_ENABLED= 67 | # FOOTER_FORUM_LINK= 68 | # FOOTER_TELEGRAM_LINK_ENABLED= 69 | # FOOTER_TELEGRAM_LINK= 70 | # FOOTER_GITHUB_LINK= 71 | FOOTER_LOGO=/images/blockscout_logo.svg 72 | FOOTER_LINK_TO_OTHER_EXPLORERS=false 73 | FOOTER_OTHER_EXPLORERS={} 74 | SUPPORTED_CHAINS={} 75 | CACHE_BLOCK_COUNT_PERIOD=7200 76 | CACHE_TXS_COUNT_PERIOD=7200 77 | CACHE_ADDRESS_SUM_PERIOD=3600 78 | CACHE_TOTAL_GAS_USAGE_PERIOD=3600 79 | CACHE_ADDRESS_TRANSACTIONS_GAS_USAGE_COUNTER_PERIOD=1800 80 | CACHE_TOKEN_HOLDERS_COUNTER_PERIOD=3600 81 | CACHE_TOKEN_TRANSFERS_COUNTER_PERIOD=3600 82 | CACHE_ADDRESS_WITH_BALANCES_UPDATE_INTERVAL=1800 83 | CACHE_AVERAGE_BLOCK_PERIOD=1800 84 | CACHE_MARKET_HISTORY_PERIOD=21600 85 | CACHE_ADDRESS_TRANSACTIONS_COUNTER_PERIOD=1800 86 | CACHE_ADDRESS_TOKENS_USD_SUM_PERIOD=3600 87 | CACHE_ADDRESS_TOKEN_TRANSFERS_COUNTER_PERIOD=1800 88 | TOKEN_METADATA_UPDATE_INTERVAL=172800 89 | CONTRACT_VERIFICATION_ALLOWED_SOLIDITY_EVM_VERSIONS=homestead,tangerineWhistle,spuriousDragon,byzantium,constantinople,petersburg,istanbul,berlin,london,paris,shanghai,default 90 | CONTRACT_VERIFICATION_ALLOWED_VYPER_EVM_VERSIONS=byzantium,constantinople,petersburg,istanbul,berlin,paris,shanghai,default 91 | # CONTRACT_VERIFICATION_MAX_LIBRARIES=10 92 | CONTRACT_MAX_STRING_LENGTH_WITHOUT_TRIMMING=2040 93 | # CONTRACT_DISABLE_INTERACTION= 94 | UNCLES_IN_AVERAGE_BLOCK_TIME=false 95 | DISABLE_WEBAPP=false 96 | API_V1_READ_METHODS_DISABLED=false 97 | API_V1_WRITE_METHODS_DISABLED=false 98 | DISABLE_INDEXER=false 99 | DISABLE_REALTIME_INDEXER=false 100 | INDEXER_DISABLE_TOKEN_INSTANCE_REALTIME_FETCHER=false 101 | INDEXER_DISABLE_TOKEN_INSTANCE_RETRY_FETCHER=false 102 | INDEXER_DISABLE_TOKEN_INSTANCE_SANITIZE_FETCHER=false 103 | INDEXER_DISABLE_TOKEN_INSTANCE_LEGACY_SANITIZE_FETCHER=false 104 | INDEXER_DISABLE_PENDING_TRANSACTIONS_FETCHER=false 105 | INDEXER_DISABLE_INTERNAL_TRANSACTIONS_FETCHER=false 106 | # INDEXER_CATCHUP_BLOCKS_BATCH_SIZE= 107 | # INDEXER_CATCHUP_BLOCKS_CONCURRENCY= 108 | # INDEXER_CATCHUP_BLOCK_INTERVAL= 109 | # INDEXER_EMPTY_BLOCKS_SANITIZER_INTERVAL= 110 | # INDEXER_INTERNAL_TRANSACTIONS_BATCH_SIZE= 111 | # INDEXER_INTERNAL_TRANSACTIONS_CONCURRENCY= 112 | # INDEXER_BLOCK_REWARD_BATCH_SIZE= 113 | # INDEXER_BLOCK_REWARD_CONCURRENCY= 114 | # INDEXER_TOKEN_INSTANCE_RETRY_REFETCH_INTERVAL= 115 | # INDEXER_TOKEN_INSTANCE_RETRY_CONCURRENCY= 116 | # INDEXER_TOKEN_INSTANCE_REALTIME_CONCURRENCY= 117 | # INDEXER_TOKEN_INSTANCE_SANITIZE_CONCURRENCY= 118 | # INDEXER_TOKEN_INSTANCE_LEGACY_SANITIZE_CONCURRENCY=10 119 | # INDEXER_COIN_BALANCES_BATCH_SIZE= 120 | # INDEXER_COIN_BALANCES_CONCURRENCY= 121 | # INDEXER_RECEIPTS_BATCH_SIZE= 122 | # INDEXER_RECEIPTS_CONCURRENCY= 123 | # INDEXER_TOKEN_CONCURRENCY= 124 | # INDEXER_TOKEN_BALANCES_BATCH_SIZE= 125 | # INDEXER_TOKEN_BALANCES_CONCURRENCY= 126 | # INDEXER_TX_ACTIONS_ENABLE= 127 | # INDEXER_TX_ACTIONS_MAX_TOKEN_CACHE_SIZE= 128 | # INDEXER_TX_ACTIONS_REINDEX_FIRST_BLOCK= 129 | # INDEXER_TX_ACTIONS_REINDEX_LAST_BLOCK= 130 | # INDEXER_TX_ACTIONS_REINDEX_PROTOCOLS= 131 | # INDEXER_TX_ACTIONS_AAVE_V3_POOL_CONTRACT= 132 | # INDEXER_POLYGON_EDGE_L1_RPC= 133 | # INDEXER_POLYGON_EDGE_L1_EXIT_HELPER_CONTRACT= 134 | # INDEXER_POLYGON_EDGE_L1_WITHDRAWALS_START_BLOCK= 135 | # INDEXER_POLYGON_EDGE_L1_STATE_SENDER_CONTRACT= 136 | # INDEXER_POLYGON_EDGE_L1_DEPOSITS_START_BLOCK= 137 | # INDEXER_POLYGON_EDGE_L2_STATE_SENDER_CONTRACT= 138 | # INDEXER_POLYGON_EDGE_L2_WITHDRAWALS_START_BLOCK= 139 | # INDEXER_POLYGON_EDGE_L2_STATE_RECEIVER_CONTRACT= 140 | # INDEXER_POLYGON_EDGE_L2_DEPOSITS_START_BLOCK= 141 | # INDEXER_POLYGON_EDGE_ETH_GET_LOGS_RANGE_SIZE= 142 | # INDEXER_ZKEVM_BATCHES_ENABLED= 143 | # INDEXER_ZKEVM_BATCHES_CHUNK_SIZE= 144 | # INDEXER_ZKEVM_BATCHES_RECHECK_INTERVAL= 145 | # INDEXER_REALTIME_FETCHER_MAX_GAP= 146 | # INDEXER_FETCHER_INIT_QUERY_LIMIT= 147 | # INDEXER_TOKEN_BALANCES_FETCHER_INIT_QUERY_LIMIT= 148 | # INDEXER_COIN_BALANCES_FETCHER_INIT_QUERY_LIMIT= 149 | # INDEXER_DISABLE_WITHDRAWALS_FETCHER= 150 | # WITHDRAWALS_FIRST_BLOCK= 151 | # ROOTSTOCK_REMASC_ADDRESS= 152 | # ROOTSTOCK_BRIDGE_ADDRESS= 153 | # ROOTSTOCK_LOCKED_BTC_CACHE_PERIOD= 154 | # ROOTSTOCK_LOCKING_CAP= 155 | # TOKEN_ID_MIGRATION_FIRST_BLOCK= 156 | # TOKEN_ID_MIGRATION_CONCURRENCY= 157 | # TOKEN_ID_MIGRATION_BATCH_SIZE= 158 | # INDEXER_INTERNAL_TRANSACTIONS_TRACER_TYPE= 159 | # WEBAPP_URL= 160 | # API_URL= 161 | SHOW_ADDRESS_MARKETCAP_PERCENTAGE=true 162 | CHECKSUM_ADDRESS_HASHES=true 163 | CHECKSUM_FUNCTION=eth 164 | DISABLE_EXCHANGE_RATES=true 165 | TXS_STATS_ENABLED=true 166 | SHOW_PRICE_CHART=false 167 | SHOW_PRICE_CHART_LEGEND=false 168 | SHOW_TXS_CHART=true 169 | TXS_HISTORIAN_INIT_LAG=0 170 | TXS_STATS_DAYS_TO_COMPILE_AT_INIT=10 171 | COIN_BALANCE_HISTORY_DAYS=90 172 | APPS_MENU=true 173 | EXTERNAL_APPS=[] 174 | # GAS_PRICE= 175 | # RESTRICTED_LIST= 176 | # RESTRICTED_LIST_KEY= 177 | SHOW_MAINTENANCE_ALERT=false 178 | MAINTENANCE_ALERT_MESSAGE= 179 | SOURCIFY_INTEGRATION_ENABLED=false 180 | SOURCIFY_SERVER_URL= 181 | SOURCIFY_REPO_URL= 182 | CHAIN_ID= 183 | MAX_SIZE_UNLESS_HIDE_ARRAY=50 184 | HIDE_BLOCK_MINER=false 185 | DISPLAY_TOKEN_ICONS=false 186 | SHOW_TENDERLY_LINK=false 187 | TENDERLY_CHAIN_PATH= 188 | RE_CAPTCHA_SECRET_KEY= 189 | RE_CAPTCHA_CLIENT_KEY= 190 | RE_CAPTCHA_V3_SECRET_KEY= 191 | RE_CAPTCHA_V3_CLIENT_KEY= 192 | RE_CAPTCHA_DISABLED=false 193 | JSON_RPC= 194 | #API_RATE_LIMIT_DISABLED=true 195 | API_RATE_LIMIT_TIME_INTERVAL=1s 196 | API_RATE_LIMIT_BY_IP_TIME_INTERVAL=5m 197 | API_RATE_LIMIT=50 198 | API_RATE_LIMIT_BY_KEY=50 199 | API_RATE_LIMIT_BY_WHITELISTED_IP=50 200 | API_RATE_LIMIT_WHITELISTED_IPS= 201 | API_RATE_LIMIT_STATIC_API_KEY= 202 | API_RATE_LIMIT_UI_V2_WITH_TOKEN=5 203 | API_RATE_LIMIT_BY_IP=3000 204 | # API_RATE_LIMIT_HAMMER_REDIS_URL=redis://redis_db:6379/1 205 | # API_RATE_LIMIT_IS_BLOCKSCOUT_BEHIND_PROXY=false 206 | API_RATE_LIMIT_UI_V2_TOKEN_TTL_IN_SECONDS=18000 207 | FETCH_REWARDS_WAY=trace_block 208 | MICROSERVICE_SC_VERIFIER_ENABLED=true 209 | MICROSERVICE_SC_VERIFIER_URL=http://explorer-smart-contract-verifier:8050/ 210 | MICROSERVICE_SC_VERIFIER_TYPE=sc_verifier 211 | MICROSERVICE_ETH_BYTECODE_DB_INTERVAL_BETWEEN_LOOKUPS=10m 212 | MICROSERVICE_ETH_BYTECODE_DB_MAX_LOOKUPS_CONCURRENCY=10 213 | MICROSERVICE_VISUALIZE_SOL2UML_ENABLED=true 214 | MICROSERVICE_VISUALIZE_SOL2UML_URL=http://explorer-visualizer:8050/ 215 | MICROSERVICE_SIG_PROVIDER_ENABLED=true 216 | MICROSERVICE_SIG_PROVIDER_URL=http://explorer-sig-provider:8050/ 217 | DECODE_NOT_A_CONTRACT_CALLS=true 218 | # DATABASE_READ_ONLY_API_URL= 219 | # ACCOUNT_DATABASE_URL= 220 | # ACCOUNT_POOL_SIZE= 221 | # ACCOUNT_AUTH0_DOMAIN= 222 | # ACCOUNT_AUTH0_CLIENT_ID= 223 | # ACCOUNT_AUTH0_CLIENT_SECRET= 224 | # ACCOUNT_PUBLIC_TAGS_AIRTABLE_URL= 225 | # ACCOUNT_PUBLIC_TAGS_AIRTABLE_API_KEY= 226 | # ACCOUNT_SENDGRID_API_KEY= 227 | # ACCOUNT_SENDGRID_SENDER= 228 | # ACCOUNT_SENDGRID_TEMPLATE= 229 | ACCOUNT_CLOAK_KEY= 230 | ACCOUNT_ENABLED=false 231 | ACCOUNT_REDIS_URL=redis://redis_db:6379 232 | # MIXPANEL_TOKEN= 233 | # MIXPANEL_URL= 234 | # AMPLITUDE_API_KEY= 235 | # AMPLITUDE_URL= 236 | EIP_1559_ELASTICITY_MULTIPLIER=2 237 | # API_SENSITIVE_ENDPOINTS_KEY= 238 | # ACCOUNT_VERIFICATION_EMAIL_RESEND_INTERVAL= 239 | # INDEXER_TOKEN_INSTANCE_RETRY_BATCH_SIZE=10 240 | # INDEXER_TOKEN_INSTANCE_REALTIME_BATCH_SIZE=1 241 | # INDEXER_TOKEN_INSTANCE_SANITIZE_BATCH_SIZE=10 242 | # INDEXER_TOKEN_INSTANCE_LEGACY_SANITIZE_BATCH_SIZE=10 243 | # TOKEN_INSTANCE_OWNER_MIGRATION_CONCURRENCY=5 244 | # TOKEN_INSTANCE_OWNER_MIGRATION_BATCH_SIZE=50 245 | # IPFS_GATEWAY_URL= 246 | API_V2_ENABLED=true 247 | # ADDRESSES_TABS_COUNTERS_TTL=10m 248 | # ACCOUNT_PRIVATE_TAGS_LIMIT=2000 249 | # ACCOUNT_WATCHLIST_ADDRESSES_LIMIT=15 -------------------------------------------------------------------------------- /envs/common-frontend.env: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_API_HOST=${COMMON_HOST} 2 | NEXT_PUBLIC_API_PROTOCOL=http 3 | NEXT_PUBLIC_NETWORK_CURRENCY_NAME=Ether 4 | NEXT_PUBLIC_NETWORK_CURRENCY_SYMBOL=ETH 5 | NEXT_PUBLIC_NETWORK_CURRENCY_DECIMALS=18 6 | NEXT_PUBLIC_API_BASE_PATH=/ 7 | NEXT_PUBLIC_APP_HOST=${COMMON_HOST} 8 | NEXT_PUBLIC_APP_PROTOCOL=http 9 | NEXT_PUBLIC_HOMEPAGE_CHARTS=['daily_txs'] 10 | NEXT_PUBLIC_VISUALIZE_API_HOST=http://${COMMON_HOST}:8083 11 | NEXT_PUBLIC_IS_TESTNET=true 12 | NEXT_PUBLIC_API_WEBSOCKET_PROTOCOL=ws 13 | -------------------------------------------------------------------------------- /envs/common-smart-contract-verifier.env: -------------------------------------------------------------------------------- 1 | # Those are examples of existing configuration variables and their default values. 2 | 3 | SMART_CONTRACT_VERIFIER__SERVER__HTTP__ENABLED=true 4 | SMART_CONTRACT_VERIFIER__SERVER__HTTP__ADDR=0.0.0.0:8050 5 | SMART_CONTRACT_VERIFIER__SERVER__HTTP__MAX_BODY_SIZE=2097152 6 | 7 | SMART_CONTRACT_VERIFIER__SERVER__GRPC__ENABLED=false 8 | SMART_CONTRACT_VERIFIER__SERVER__GRPC__ADDR=0.0.0.0:8051 9 | 10 | SMART_CONTRACT_VERIFIER__SOLIDITY__ENABLED=true 11 | SMART_CONTRACT_VERIFIER__SOLIDITY__COMPILERS_DIR=/tmp/solidity-compilers 12 | SMART_CONTRACT_VERIFIER__SOLIDITY__REFRESH_VERSIONS_SCHEDULE=0 0 * * * * * 13 | 14 | # It depends on the OS you are running the service on 15 | SMART_CONTRACT_VERIFIER__SOLIDITY__FETCHER__LIST__LIST_URL=https://solc-bin.ethereum.org/linux-amd64/list.json 16 | #SMART_CONTRACT_VERIFIER__SOLIDITY__FETCHER__LIST__LIST_URL=https://solc-bin.ethereum.org/macosx-amd64/list.json 17 | #SMART_CONTRACT_VERIFIER__SOLIDITY__FETCHER__LIST__LIST_URL=https://solc-bin.ethereum.org/windows-amd64/list.json 18 | 19 | SMART_CONTRACT_VERIFIER__VYPER__ENABLED=true 20 | SMART_CONTRACT_VERIFIER__VYPER__COMPILERS_DIR=/tmp/vyper-compilers 21 | SMART_CONTRACT_VERIFIER__VYPER__REFRESH_VERSIONS_SCHEDULE=0 0 * * * * * 22 | 23 | # It depends on the OS you are running the service on 24 | SMART_CONTRACT_VERIFIER__VYPER__FETCHER__LIST__LIST_URL=https://raw.githubusercontent.com/blockscout/solc-bin/main/vyper.list.json 25 | #SMART_CONTRACT_VERIFIER__VYPER__FETCHER__LIST__LIST_URL=https://raw.githubusercontent.com/blockscout/solc-bin/main/vyper.macos.list.json 26 | 27 | SMART_CONTRACT_VERIFIER__SOURCIFY__ENABLED=true 28 | SMART_CONTRACT_VERIFIER__SOURCIFY__API_URL=https://sourcify.dev/server/ 29 | SMART_CONTRACT_VERIFIER__SOURCIFY__VERIFICATION_ATTEMPTS=3 30 | SMART_CONTRACT_VERIFIER__SOURCIFY__REQUEST_TIMEOUT=10 31 | 32 | SMART_CONTRACT_VERIFIER__METRICS__ENABLED=false 33 | SMART_CONTRACT_VERIFIER__METRICS__ADDR=0.0.0.0:6060 34 | SMART_CONTRACT_VERIFIER__METRICS__ROUTE=/metrics 35 | 36 | SMART_CONTRACT_VERIFIER__JAEGER__ENABLED=false 37 | SMART_CONTRACT_VERIFIER__JAEGER__AGENT_ENDPOINT=${COMMON_HOST}:6831 38 | -------------------------------------------------------------------------------- /envs/common-stats.env: -------------------------------------------------------------------------------- 1 | # Those are examples of existing configuration variables and their default values. 2 | 3 | STATS__SERVER__HTTP__ENABLED=true 4 | STATS__SERVER__HTTP__ADDR=0.0.0.0:8050 5 | STATS__SERVER__HTTP__MAX_BODY_SIZE=2097152 6 | 7 | STATS__SERVER__GRPC__ENABLED=false 8 | STATS__SERVER__GRPC__ADDR=0.0.0.0:8051 9 | 10 | STATS__DB_URL= 11 | STATS__BLOCKSCOUT_DB_URL= 12 | STATS__CREATE_DATABASE=false 13 | STATS__RUN_MIGRATIONS=false 14 | STATS__DEFAULT_SCHEDULE=0 0 1 * * * * 15 | STATS__FORCE_UPDATE_ON_START=false 16 | 17 | STATS__METRICS__ENABLED=false 18 | STATS__METRICS__ADDR=0.0.0.0:6060 19 | STATS__METRICS__ROUTE=/metrics 20 | 21 | STATS__JAEGER__ENABLED=false 22 | STATS__JAEGER__AGENT_ENDPOINT=${COMMON_HOST}:6831 23 | 24 | STATS__TRACING__ENABLED=true 25 | STATS__TRACING__FORMAT=default 26 | -------------------------------------------------------------------------------- /envs/common-visualizer.env: -------------------------------------------------------------------------------- 1 | VISUALIZER__SERVER__GRPC__ENABLED=false 2 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "zkvalidium-quickstart", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "zkvalidium-quickstart", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "dotenv": "^16.4.5" 13 | } 14 | }, 15 | "node_modules/dotenv": { 16 | "version": "16.4.5", 17 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", 18 | "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", 19 | "engines": { 20 | "node": ">=12" 21 | }, 22 | "funding": { 23 | "url": "https://dotenvx.com" 24 | } 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "zkvalidium-quickstart", 3 | "version": "1.0.0", 4 | "description": "Please refer to https://docs.polygon.technology/cdk/get-started/quickstart-validium/ to see how to use this repo.", 5 | "main": "index.js", 6 | "scripts": { 7 | "set:keystore": "node scripts/set-keystore.js", 8 | "set:configs": "node scripts/set-configs.js", 9 | "set:compose": "node scripts/set-compose.js" 10 | }, 11 | "keywords": [], 12 | "author": "", 13 | "license": "ISC", 14 | "dependencies": { 15 | "dotenv": "^16.4.5" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /proxy/default.conf.template: -------------------------------------------------------------------------------- 1 | map $http_upgrade $connection_upgrade { 2 | 3 | default upgrade; 4 | '' close; 5 | } 6 | 7 | server { 8 | listen 80; 9 | server_name blockscout; 10 | proxy_http_version 1.1; 11 | 12 | location ~ ^/(api|socket|sitemap.xml|auth/auth0|auth/auth0/callback|auth/logout) { 13 | proxy_pass ${BACK_PROXY_PASS}; 14 | proxy_http_version 1.1; 15 | proxy_set_header Host "$host"; 16 | proxy_set_header X-Real-IP "$remote_addr"; 17 | proxy_set_header X-Forwarded-For "$proxy_add_x_forwarded_for"; 18 | proxy_set_header X-Forwarded-Proto "$scheme"; 19 | proxy_set_header Upgrade "$http_upgrade"; 20 | proxy_set_header Connection $connection_upgrade; 21 | proxy_cache_bypass $http_upgrade; 22 | } 23 | location = / { 24 | proxy_pass ${FRONT_PROXY_PASS}; 25 | proxy_http_version 1.1; 26 | proxy_set_header Host "$host"; 27 | proxy_set_header X-Real-IP "$remote_addr"; 28 | proxy_set_header X-Forwarded-For "$proxy_add_x_forwarded_for"; 29 | proxy_set_header X-Forwarded-Proto "$scheme"; 30 | proxy_set_header Upgrade "$http_upgrade"; 31 | proxy_set_header Connection $connection_upgrade; 32 | proxy_cache_bypass $http_upgrade; 33 | } 34 | location / { 35 | proxy_pass ${FRONT_PROXY_PASS}; 36 | proxy_http_version 1.1; 37 | proxy_set_header Host "$host"; 38 | proxy_set_header X-Real-IP "$remote_addr"; 39 | proxy_set_header X-Forwarded-For "$proxy_add_x_forwarded_for"; 40 | proxy_set_header X-Forwarded-Proto "$scheme"; 41 | proxy_set_header Upgrade "$http_upgrade"; 42 | proxy_set_header Connection $connection_upgrade; 43 | proxy_cache_bypass $http_upgrade; 44 | } 45 | } 46 | server { 47 | listen 8080; 48 | server_name explorer-stats; 49 | proxy_http_version 1.1; 50 | proxy_hide_header Access-Control-Allow-Origin; 51 | proxy_hide_header Access-Control-Allow-Methods; 52 | add_header 'Access-Control-Allow-Origin' '${PROXIED_FRONT_URL}' always; 53 | add_header 'Access-Control-Allow-Credentials' 'true' always; 54 | add_header 'Access-Control-Allow-Methods' 'PUT, GET, POST, OPTIONS, DELETE, PATCH' always; 55 | 56 | location / { 57 | proxy_pass ${STATS_PROXY_PASS}; 58 | proxy_http_version 1.1; 59 | proxy_set_header Host "$host"; 60 | proxy_set_header X-Real-IP "$remote_addr"; 61 | proxy_set_header X-Forwarded-For "$proxy_add_x_forwarded_for"; 62 | proxy_set_header X-Forwarded-Proto "$scheme"; 63 | proxy_set_header Upgrade "$http_upgrade"; 64 | proxy_set_header Connection $connection_upgrade; 65 | proxy_cache_bypass $http_upgrade; 66 | } 67 | } -------------------------------------------------------------------------------- /proxy/visualizer.conf.template: -------------------------------------------------------------------------------- 1 | map $http_upgrade $connection_upgrade { 2 | 3 | default upgrade; 4 | '' close; 5 | } 6 | 7 | map $http_origin $allowed_origin { 8 | ~^${PROXIED_FRONT_URL}(:[0-9]+)?$ $http_origin; 9 | # NGINX won't set empty string headers, so if no match, header is unset. 10 | default ''; 11 | } 12 | 13 | server { 14 | listen 8081; 15 | server_name explorer-visualizer; 16 | proxy_http_version 1.1; 17 | proxy_hide_header Access-Control-Allow-Origin; 18 | proxy_hide_header Access-Control-Allow-Methods; 19 | add_header 'Access-Control-Allow-Origin' $allowed_origin always; 20 | add_header 'Access-Control-Allow-Credentials' 'true' always; 21 | add_header 'Access-Control-Allow-Methods' 'PUT, GET, POST, OPTIONS, DELETE, PATCH' always; 22 | 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; 23 | 24 | location / { 25 | proxy_pass ${FRONT_PROXY_PASS}; 26 | proxy_http_version 1.1; 27 | proxy_buffering off; 28 | proxy_set_header Host "$host"; 29 | proxy_set_header X-Real-IP "$remote_addr"; 30 | proxy_connect_timeout 30m; 31 | proxy_read_timeout 30m; 32 | proxy_send_timeout 30m; 33 | proxy_set_header X-Forwarded-For "$proxy_add_x_forwarded_for"; 34 | proxy_set_header X-Forwarded-Proto "$scheme"; 35 | proxy_set_header Upgrade "$http_upgrade"; 36 | proxy_set_header Connection $connection_upgrade; 37 | proxy_cache_bypass $http_upgrade; 38 | if ($request_method = 'OPTIONS') { 39 | add_header 'Access-Control-Allow-Origin' $allowed_origin always; 40 | add_header 'Access-Control-Allow-Credentials' 'true' always; 41 | add_header 'Access-Control-Allow-Methods' 'PUT, GET, POST, OPTIONS, DELETE, PATCH' always; 42 | 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; 43 | add_header 'Access-Control-Max-Age' 1728000; 44 | add_header 'Content-Type' 'text/plain charset=UTF-8'; 45 | add_header 'Content-Length' 0; 46 | return 204; 47 | } 48 | } 49 | } -------------------------------------------------------------------------------- /scripts/set-compose.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | require('dotenv').config(); 3 | 4 | // Function to read JSON file 5 | function readJSONFile(filePath) { 6 | return JSON.parse(fs.readFileSync(filePath, 'utf8')); 7 | } 8 | 9 | function updateDockerCompose(deployOutput, genesisConfig, configTomlPath) { 10 | const deployData = readJSONFile(deployOutput); 11 | const genesisData = readJSONFile(genesisConfig); 12 | let configContent = fs.readFileSync(configTomlPath, 'utf8'); 13 | 14 | configContent = configContent.replace(/(ETHEREUM_BRIDGE_CONTRACT_ADDRESS=).*/, `$1${deployData.polygonZkEVMBridgeAddress}`); 15 | configContent = configContent.replace(/(ETHEREUM_PROOF_OF_EFFICIENCY_CONTRACT_ADDRESS=).*/, `$1${deployData.cdkValidiumAddress}`); 16 | 17 | // Find the address for "PolygonZkEVMBridge proxy" in genesis.config.json 18 | const bridgeProxy = genesisData.genesis.find(item => item.contractName === "PolygonZkEVMBridge proxy"); 19 | if (bridgeProxy) { 20 | // Update L2PolygonBridgeAddresses 21 | configContent = configContent.replace(/(POLYGON_ZK_EVM_BRIDGE_CONTRACT_ADDRESS=).*/, `$1${bridgeProxy.address}`); 22 | } 23 | 24 | fs.writeFileSync(configTomlPath, configContent, 'utf8'); 25 | } 26 | 27 | const deployOutputPath = './deploy_output.json'; 28 | const genesisConfigPath = './config/node/genesis.config.json'; 29 | const dockerComposePath = './docker-compose.yml'; 30 | 31 | // Update the config.toml file 32 | if (require.main === module) { 33 | updateDockerCompose(deployOutputPath, genesisConfigPath, dockerComposePath); 34 | } -------------------------------------------------------------------------------- /scripts/set-configs.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | require('dotenv').config(); 3 | 4 | // Function to read JSON file 5 | function readJSONFile(filePath) { 6 | return JSON.parse(fs.readFileSync(filePath, 'utf8')); 7 | } 8 | 9 | function replaceKeystorePassword(configContent) { 10 | const password = process.env.KEYSTORE_PASSWORD; 11 | if (password) { 12 | const passwordRegex = /(\s*Password\s*=\s*)"testonly"/g; 13 | configContent = configContent.replace(passwordRegex, `$1"${password}"`); 14 | } else { 15 | console.warn('Warning: KEYSTORE_PASSWORD not found in .env'); 16 | } 17 | return configContent; 18 | } 19 | 20 | function updateBridgeConfigToml(deployOutput, genesisConfig, configTomlPath) { 21 | const deployData = readJSONFile(deployOutput); 22 | const genesisData = readJSONFile(genesisConfig); 23 | let configContent = fs.readFileSync(configTomlPath, 'utf8'); 24 | 25 | configContent = configContent.replace(/(GenBlockNumber\s*=\s*)\d+/, `$1${deployData.deploymentBlockNumber}`); 26 | configContent = configContent.replace(/(PolygonBridgeAddress\s*=\s*)".*"/, `$1"${deployData.polygonZkEVMBridgeAddress}"`); 27 | configContent = configContent.replace(/(PolygonZkEVMGlobalExitRootAddress\s*=\s*)".*"/, `$1"${deployData.polygonZkEVMGlobalExitRootAddress}"`); 28 | configContent = configContent.replace(/(L1URL\s*=\s*)".*"/, `$1"${process.env.L1_RPC_URL}"`); 29 | 30 | // Find the address for "PolygonZkEVMBridge proxy" in genesis.config.json 31 | const bridgeProxy = genesisData.genesis.find(item => item.contractName === "PolygonZkEVMBridge proxy"); 32 | if (bridgeProxy) { 33 | // Update L2PolygonBridgeAddresses 34 | configContent = configContent.replace(/(L2PolygonBridgeAddresses\s*=\s*)\[".*"\]/, `$1["${bridgeProxy.address}"]`); 35 | } 36 | 37 | configContent = replaceKeystorePassword(configContent); 38 | 39 | fs.writeFileSync(configTomlPath, configContent, 'utf8'); 40 | } 41 | 42 | function updateDACConfigToml(deployOutput, configTomlPath) { 43 | const deployData = readJSONFile(deployOutput); 44 | let configContent = fs.readFileSync(configTomlPath, 'utf8'); 45 | 46 | configContent = configContent.replace(/(CDKValidiumAddress\s*=\s*)".*"/, `$1"${deployData.cdkValidiumAddress}"`); 47 | configContent = configContent.replace(/(DataCommitteeAddress\s*=\s*)".*"/, `$1"${deployData.cdkDataCommitteeContract}"`); 48 | configContent = configContent.replace(/(RpcURL\s*=\s*)".*"/, `$1"${process.env.L1_RPC_URL}"`); 49 | configContent = configContent.replace(/(WsURL\s*=\s*)".*"/, `$1"${process.env.L1_WS_RPC_URL}"`); 50 | 51 | configContent = replaceKeystorePassword(configContent); 52 | 53 | fs.writeFileSync(configTomlPath, configContent, 'utf8'); 54 | } 55 | 56 | function updateNodeConfigToml(deployOutput, configTomlPath) { 57 | const deployData = readJSONFile(deployOutput); 58 | let configContent = fs.readFileSync(configTomlPath, 'utf8'); 59 | 60 | configContent = configContent.replace(/(L2Coinbase\s*=\s*)".*"/, `$1"${deployData.trustedSequencer}"`); 61 | configContent = configContent.replace(/(SenderAddress\s*=\s*)".*"/, `$1"${deployData.trustedAggregator}"`); 62 | configContent = configContent.replace(/(URL\s*=\s*)"http:\/\/zkevm-mock-l1-network:8545"/, `$1"${process.env.L1_RPC_URL}"`); 63 | configContent = configContent.replace(/(\s*ApiKey\s*=\s*)".*"/, `$1"${process.env.ETHERSCAN_API_KEY}"`); 64 | 65 | configContent = replaceKeystorePassword(configContent); 66 | 67 | fs.writeFileSync(configTomlPath, configContent, 'utf8'); 68 | } 69 | 70 | const deployOutputPath = './deploy_output.json'; 71 | const genesisConfigPath = './config/node/genesis.config.json'; 72 | const bridgeConfigTomlPath = './config/bridge/config.toml'; 73 | const dacConfigTomlPath = './config/dac/config.toml'; 74 | const nodeConfigTomlPath = './config/node/config.toml'; 75 | 76 | // Update the config.toml file 77 | if (require.main === module) { 78 | updateBridgeConfigToml(deployOutputPath, genesisConfigPath, bridgeConfigTomlPath); 79 | updateDACConfigToml(deployOutputPath, dacConfigTomlPath); 80 | updateNodeConfigToml(deployOutputPath, nodeConfigTomlPath); 81 | } -------------------------------------------------------------------------------- /scripts/set-keystore.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Usage: npm run set:keystore wallets.txt 3 | */ 4 | 5 | const fs = require('fs'); 6 | const readline = require('readline'); 7 | 8 | // Retrieve the file path from command-line arguments 9 | const walletsFilePath = process.argv[2]; 10 | 11 | if (!walletsFilePath) { 12 | console.log("Please provide the path to the wallets.txt file as a command-line argument."); 13 | process.exit(1); 14 | } 15 | 16 | function main() { 17 | const fileStream = fs.createReadStream(walletsFilePath); 18 | const rl = readline.createInterface({ 19 | input: fileStream, 20 | crlfDelay: Infinity 21 | }); 22 | 23 | let currentSection = ''; 24 | let keystore = ''; 25 | 26 | rl.on('line', (line) => { 27 | if (line.startsWith('##')) { 28 | // When a new section starts, process the previous section 29 | if (keystore) { 30 | // Write the keystore to the appropriate file based on the previous section 31 | writeFileBasedOnSection(currentSection, keystore); 32 | keystore = ''; // Reset keystore for the next section 33 | } 34 | currentSection = line.substring(3).trim(); // Remove "## " to get the section name 35 | } else if (line.startsWith('keystore:')) { 36 | keystore = line.substring('keystore:'.length).trim(); 37 | } 38 | }).on('close', () => { 39 | // Handle the last section 40 | if (keystore) { 41 | writeFileBasedOnSection(currentSection, keystore); 42 | } 43 | }); 44 | } 45 | 46 | function writeFileBasedOnSection(section, keystoreData) { 47 | let filename; 48 | switch (section) { 49 | case 'Trusted sequencer': 50 | filename = 'config/node/sequencer.keystore'; 51 | break; 52 | case 'Trusted aggregator': 53 | filename = 'config/node/aggregator.keystore'; 54 | break; 55 | case 'DAC member': 56 | filename = 'config/dac/dac-member.keystore'; 57 | break; 58 | case 'Claim tx manager': 59 | filename = 'config/bridge/claimtx.keystore'; 60 | break; 61 | // Add more cases as needed 62 | default: 63 | console.log(`Unknown section: ${section}`); 64 | return; 65 | } 66 | fs.writeFileSync(filename, keystoreData); 67 | console.log(`Written keystore to ${filename}`); 68 | } 69 | 70 | if (require.main === module) { 71 | main(); 72 | } 73 | -------------------------------------------------------------------------------- /services/docker-compose-explorer-backend.yml: -------------------------------------------------------------------------------- 1 | version: '3.8' 2 | 3 | services: 4 | explorer-backend: 5 | pull_policy: always 6 | restart: always 7 | stop_grace_period: 5m 8 | container_name: 'explorer-backend' 9 | command: sh -c "bin/blockscout eval \"Elixir.Explorer.ReleaseTasks.create_and_migrate()\" && bin/blockscout start" 10 | env_file: 11 | - ../envs/common-blockscout.env -------------------------------------------------------------------------------- /services/docker-compose-explorer-frontend.yml: -------------------------------------------------------------------------------- 1 | version: '3.8' 2 | 3 | services: 4 | explorer-frontend: 5 | image: ghcr.io/blockscout/frontend:${EXPLORER_DOCKER_TAG_FRONTEND:-latest} 6 | pull_policy: always 7 | platform: linux/amd64 8 | restart: always 9 | container_name: 'explorer-frontend' 10 | env_file: 11 | - ../envs/common-frontend.env 12 | -------------------------------------------------------------------------------- /services/docker-compose-explorer-nginx.yml: -------------------------------------------------------------------------------- 1 | version: '3.8' 2 | 3 | services: 4 | explorer-proxy: 5 | image: nginx:1.25.3 6 | container_name: explorer-proxy 7 | volumes: 8 | - "../proxy/default.conf.template:/etc/nginx/templates/default.conf.template" 9 | 10 | visualizer-proxy: 11 | image: nginx:1.25.3 12 | container_name: visualizer-proxy 13 | volumes: 14 | - "../proxy/visualizer.conf.template:/etc/nginx/templates/default.conf.template" 15 | environment: 16 | - NGINX_CONFIG_VERSION=1 17 | -------------------------------------------------------------------------------- /services/docker-compose-explorer-sig-provider.yml: -------------------------------------------------------------------------------- 1 | version: '3.8' 2 | 3 | services: 4 | # aggregator of ethereum signatures for transactions and events. The source 5 | # code is at https://github.com/blockscout/blockscout-rs/tree/main/sig-provider. 6 | # 7 | # TLDR: method signature is used as input for the service. The decoded method 8 | # is in output. Several 3rd party services are used under the hood like 4bytes. 9 | # In the future, the service will be updated to use ETH bytecode DB as a primary source. 10 | explorer-sig-provider: 11 | image: ghcr.io/blockscout/sig-provider:${EXPLORER_DOCKER_TAG_SIG_PROVIDER:-latest} 12 | pull_policy: always 13 | platform: linux/amd64 14 | restart: always 15 | container_name: 'explorer-sig-provider' 16 | ports: 17 | - target: 8050 18 | published: 8151 19 | -------------------------------------------------------------------------------- /services/docker-compose-explorer-smart-contract-verifier.yml: -------------------------------------------------------------------------------- 1 | version: '3.8' 2 | 3 | services: 4 | explorer-smart-contract-verifier: 5 | image: ghcr.io/blockscout/smart-contract-verifier:${EXPLORER_DOCKER_TAG_SMART_CONTRACT_VERIFIER:-latest} 6 | pull_policy: always 7 | platform: linux/amd64 8 | restart: always 9 | container_name: 'explorer-smart-contract-verifier' 10 | env_file: 11 | - ../envs/common-smart-contract-verifier.env 12 | ports: 13 | - target: 8050 14 | published: 8150 15 | -------------------------------------------------------------------------------- /services/docker-compose-explorer-stats.yml: -------------------------------------------------------------------------------- 1 | version: '3.8' 2 | 3 | services: 4 | explorer-stats-db: 5 | image: postgres:15 6 | restart: always 7 | container_name: 'explorer-stats-postgres' 8 | command: postgres -c 'max_connections=200' 9 | environment: 10 | POSTGRES_USER: 'explorer_stats_user' 11 | POSTGRES_PASSWORD: 'explorer_stats_password' 12 | POSTGRES_DB: 'explorer_stats_db' 13 | 14 | explorer-stats: 15 | image: ghcr.io/blockscout/stats:${EXPLORER_DOCKER_TAG_STATS:-latest} 16 | pull_policy: always 17 | platform: linux/amd64 18 | restart: always 19 | container_name: 'explorer-stats' 20 | env_file: 21 | - ../envs/common-stats.env 22 | environment: 23 | - STATS__CREATE_DATABASE=true 24 | - STATS__RUN_MIGRATIONS=true 25 | -------------------------------------------------------------------------------- /services/docker-compose-explorer-visualizer.yml: -------------------------------------------------------------------------------- 1 | version: '3.8' 2 | 3 | services: 4 | # After the contract has been verified, there is "View UML diagram" button in 5 | # the interface which opens sol2uml diagram of the contract's functions. 6 | # 7 | # Examples: 8 | # https://eth.blockscout.com/address/0xc54B9F82C1c54E9D4d274d633c7523f2299c42A0?tab=contract 9 | # https://eth.blockscout.com/visualize/sol2uml?address=0xc54B9F82C1c54E9D4d274d633c7523f2299c42A0 10 | # 11 | # Reference: https://github.com/blockscout/blockscout-rs/blob/main/visualizer/README.md 12 | explorer-visualizer: 13 | image: ghcr.io/blockscout/visualizer:${EXPLORER_DOCKER_TAG_VISUALIZER:-latest} 14 | pull_policy: always 15 | platform: linux/amd64 16 | restart: always 17 | container_name: 'explorer-visualizer' 18 | env_file: 19 | - ../envs/common-visualizer.env 20 | ports: 21 | - target: 8050 22 | published: 8152 23 | --------------------------------------------------------------------------------