diff --git a/.github/workflows/bridge_history_api.yml b/.github/workflows/bridge_history_api.yml index b07051aec..b1fb9b024 100644 --- a/.github/workflows/bridge_history_api.yml +++ b/.github/workflows/bridge_history_api.yml @@ -32,7 +32,7 @@ jobs: - name: Install Go uses: actions/setup-go@v2 with: - go-version: 1.20.x + go-version: 1.21.x - name: Checkout code uses: actions/checkout@v2 - name: Lint @@ -46,7 +46,7 @@ jobs: - name: Install Go uses: actions/setup-go@v2 with: - go-version: 1.20.x + go-version: 1.21.x - name: Checkout code uses: actions/checkout@v2 - name: Test @@ -65,7 +65,7 @@ jobs: - name: Install Go uses: actions/setup-go@v2 with: - go-version: 1.20.x + go-version: 1.21.x - name: Checkout code uses: actions/checkout@v2 - name: Install goimports diff --git a/.github/workflows/common.yml b/.github/workflows/common.yml index 23e50dfca..b35fb842e 100644 --- a/.github/workflows/common.yml +++ b/.github/workflows/common.yml @@ -35,7 +35,7 @@ jobs: - name: Install Go uses: actions/setup-go@v2 with: - go-version: 1.20.x + go-version: 1.21.x - name: Checkout code uses: actions/checkout@v2 - name: Cache cargo @@ -54,7 +54,7 @@ jobs: - name: Install Go uses: actions/setup-go@v2 with: - go-version: 1.20.x + go-version: 1.21.x - name: Checkout code uses: actions/checkout@v2 - name: Install goimports @@ -79,15 +79,15 @@ jobs: - name: Install Go uses: actions/setup-go@v2 with: - go-version: 1.20.x + go-version: 1.21.x - name: Checkout code uses: actions/checkout@v2 - name: Install Solc uses: supplypike/setup-bin@v3 with: - uri: 'https://github.com/ethereum/solidity/releases/download/v0.8.16/solc-static-linux' + uri: 'https://github.com/ethereum/solidity/releases/download/v0.8.24/solc-static-linux' name: 'solc' - version: '0.8.16' + version: '0.8.24' - name: Install Geth Tools uses: gacts/install-geth-tools@v1 - name: Build prerequisites diff --git a/.github/workflows/contracts.yml b/.github/workflows/contracts.yml index aecf59402..0e90e1351 100644 --- a/.github/workflows/contracts.yml +++ b/.github/workflows/contracts.yml @@ -43,10 +43,10 @@ jobs: - name: Setup LCOV uses: hrishikesh-kadam/setup-lcov@v1 - - name: Install Node.js 14 + - name: Install Node.js 18 uses: actions/setup-node@v2 with: - node-version: '14' + node-version: '18' - name: Get yarn cache directory path id: yarn-cache-dir-path @@ -73,13 +73,13 @@ jobs: run: yarn install - name: Compile with foundry - run: forge build + run: forge build --evm-version cancun - name: Run foundry tests - run: forge test -vvv + run: forge test --evm-version cancun -vvv - name: Run foundry coverage - run : forge coverage --report lcov + run : forge coverage --evm-version cancun --report lcov - name : Prune coverage run : lcov --rc branch_coverage=1 --remove ./lcov.info -o ./lcov.info.pruned 'src/mocks/*' 'src/test/*' 'scripts/*' 'node_modules/*' 'lib/*' @@ -102,10 +102,10 @@ jobs: with: submodules: recursive - - name: Install Node.js 14 + - name: Install Node.js 18 uses: actions/setup-node@v2 with: - node-version: '14' + node-version: '18' - name: Get yarn cache directory path id: yarn-cache-dir-path diff --git a/.github/workflows/coordinator.yml b/.github/workflows/coordinator.yml index 92f938b2c..b441a78a9 100644 --- a/.github/workflows/coordinator.yml +++ b/.github/workflows/coordinator.yml @@ -101,9 +101,9 @@ jobs: - name: Install Solc uses: supplypike/setup-bin@v3 with: - uri: 'https://github.com/ethereum/solidity/releases/download/v0.8.16/solc-static-linux' + uri: 'https://github.com/ethereum/solidity/releases/download/v0.8.24/solc-static-linux' name: 'solc' - version: '0.8.16' + version: '0.8.24' - name: Install Geth Tools uses: gacts/install-geth-tools@v1 - name: Build prerequisites diff --git a/.github/workflows/database.yml b/.github/workflows/database.yml index 923a892f4..90b1f8b90 100644 --- a/.github/workflows/database.yml +++ b/.github/workflows/database.yml @@ -32,7 +32,7 @@ jobs: - name: Install Go uses: actions/setup-go@v2 with: - go-version: 1.20.x + go-version: 1.21.x - name: Checkout code uses: actions/checkout@v2 - name: Lint @@ -47,7 +47,7 @@ jobs: - name: Install Go uses: actions/setup-go@v2 with: - go-version: 1.20.x + go-version: 1.21.x - name: Checkout code uses: actions/checkout@v2 - name: Install goimports @@ -72,15 +72,15 @@ jobs: - name: Install Go uses: actions/setup-go@v2 with: - go-version: 1.20.x + go-version: 1.21.x - name: Checkout code uses: actions/checkout@v2 - name: Install Solc uses: supplypike/setup-bin@v3 with: - uri: 'https://github.com/ethereum/solidity/releases/download/v0.8.16/solc-static-linux' + uri: 'https://github.com/ethereum/solidity/releases/download/v0.8.24/solc-static-linux' name: 'solc' - version: '0.8.16' + version: '0.8.24' - name: Install Geth Tools uses: gacts/install-geth-tools@v1 - name: Build prerequisites diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index ebed1f7b7..b75ee4f0b 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -22,15 +22,15 @@ jobs: - name: Install Go uses: actions/setup-go@v2 with: - go-version: 1.20.x + go-version: 1.21.x - name: Checkout code uses: actions/checkout@v2 - name: Install Solc uses: supplypike/setup-bin@v3 with: - uri: 'https://github.com/ethereum/solidity/releases/download/v0.8.16/solc-static-linux' + uri: 'https://github.com/ethereum/solidity/releases/download/v0.8.24/solc-static-linux' name: 'solc' - version: '0.8.16' + version: '0.8.24' - name: Install Geth Tools uses: gacts/install-geth-tools@v1 - name: Build prerequisites diff --git a/.github/workflows/prover.yml b/.github/workflows/prover.yml index a9bdfd5b8..5cd33546f 100644 --- a/.github/workflows/prover.yml +++ b/.github/workflows/prover.yml @@ -32,7 +32,7 @@ jobs: - name: Install Go uses: actions/setup-go@v2 with: - go-version: 1.20.x + go-version: 1.21.x - name: Checkout code uses: actions/checkout@v2 - name: Test @@ -56,7 +56,7 @@ jobs: - name: Install Go uses: actions/setup-go@v2 with: - go-version: 1.20.x + go-version: 1.21.x - name: Checkout code uses: actions/checkout@v2 - name: Cache cargo @@ -73,7 +73,7 @@ jobs: - name: Install Go uses: actions/setup-go@v2 with: - go-version: 1.20.x + go-version: 1.21.x - name: Checkout code uses: actions/checkout@v2 - name: Lint @@ -87,7 +87,7 @@ jobs: - name: Install Go uses: actions/setup-go@v2 with: - go-version: 1.20.x + go-version: 1.21.x - name: Checkout code uses: actions/checkout@v2 - name: Install goimports diff --git a/.github/workflows/rollup.yml b/.github/workflows/rollup.yml index 568a6b252..279238b21 100644 --- a/.github/workflows/rollup.yml +++ b/.github/workflows/rollup.yml @@ -34,15 +34,15 @@ jobs: - name: Install Go uses: actions/setup-go@v2 with: - go-version: 1.20.x + go-version: 1.21.x - name: Checkout code uses: actions/checkout@v2 - name: Install Solc uses: supplypike/setup-bin@v3 with: - uri: 'https://github.com/ethereum/solidity/releases/download/v0.8.16/solc-static-linux' + uri: 'https://github.com/ethereum/solidity/releases/download/v0.8.24/solc-static-linux' name: 'solc' - version: '0.8.16' + version: '0.8.24' - name: Install Geth Tools uses: gacts/install-geth-tools@v1 - name: Lint @@ -58,7 +58,7 @@ jobs: - name: Install Go uses: actions/setup-go@v2 with: - go-version: 1.20.x + go-version: 1.21.x - name: Checkout code uses: actions/checkout@v2 - name: Install goimports @@ -83,15 +83,15 @@ jobs: - name: Install Go uses: actions/setup-go@v2 with: - go-version: 1.20.x + go-version: 1.21.x - name: Checkout code uses: actions/checkout@v2 - name: Install Solc uses: supplypike/setup-bin@v3 with: - uri: 'https://github.com/ethereum/solidity/releases/download/v0.8.16/solc-static-linux' + uri: 'https://github.com/ethereum/solidity/releases/download/v0.8.24/solc-static-linux' name: 'solc' - version: '0.8.16' + version: '0.8.24' - name: Install Geth Tools uses: gacts/install-geth-tools@v1 - name: Build prerequisites diff --git a/Makefile b/Makefile index 9ccd856ef..dc57ff131 100644 --- a/Makefile +++ b/Makefile @@ -43,6 +43,7 @@ fmt: ## format the code goimports -local $(PWD)/tests/integration-test/ -w . dev_docker: ## build docker images for development/testing usages + docker pull postgres docker build -t scroll_l1geth ./common/docker/l1geth/ docker build -t scroll_l2geth ./common/docker/l2geth/ @@ -50,7 +51,7 @@ build_test_docker: ## build Docker image for local testing on M1/M2 Silicon Mac docker build -t scroll_test_image -f ./build/dockerfiles/local_testing.Dockerfile $$(mktemp -d) run_test_docker: ## run Docker image for local testing on M1/M2 Silicon Mac - docker run -it --rm --name scroll_test_container --network=host -v /var/run/docker.sock:/var/run/docker.sock -v $(PWD):/go/src/app scroll_test_image + docker run -it --rm --name scroll_test_container --network=host -v /var/run/docker.sock:/var/run/docker.sock -v $(PWD):/go/src/app -e HOST_PATH=$(PWD) scroll_test_image clean: ## Empty out the bin folder @rm -rf build/bin diff --git a/README.md b/README.md index 321de4df5..ab14e6de2 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ We welcome community contributions to this repository. Before you submit any issues or PRs, please read the [Code of Conduct](CODE_OF_CONDUCT.md) and the [Contribution Guideline](CONTRIBUTING.md). ## Prerequisites -+ Go 1.20 ++ Go 1.21 + Rust (for version, see [rust-toolchain](./common/libzkp/impl/rust-toolchain)) + Hardhat / Foundry + Docker diff --git a/bridge-history-api/go.mod b/bridge-history-api/go.mod index e1ee62cee..67b0fe136 100644 --- a/bridge-history-api/go.mod +++ b/bridge-history-api/go.mod @@ -1,41 +1,49 @@ module scroll-tech/bridge-history-api -go 1.20 +go 1.21 require ( github.com/gin-contrib/cors v1.5.0 github.com/gin-gonic/gin v1.9.1 github.com/go-redis/redis/v8 v8.11.5 github.com/pressly/goose/v3 v3.16.0 - github.com/prometheus/client_golang v1.14.0 - github.com/scroll-tech/go-ethereum v1.10.14-0.20240201173512-ae7cbae19c84 - github.com/stretchr/testify v1.8.4 + github.com/prometheus/client_golang v1.16.0 + github.com/scroll-tech/go-ethereum v1.10.14-0.20240326144132-0f0cd99f7a2e + github.com/stretchr/testify v1.9.0 github.com/urfave/cli/v2 v2.25.7 - golang.org/x/sync v0.5.0 + golang.org/x/sync v0.6.0 gorm.io/gorm v1.25.5 ) require ( + dario.cat/mergo v1.0.0 // indirect github.com/VictoriaMetrics/fastcache v1.12.1 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.5.0 // indirect + github.com/bits-and-blooms/bitset v1.12.0 // indirect github.com/btcsuite/btcd v0.20.1-beta // indirect github.com/bytedance/sonic v1.10.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect github.com/chenzhuoyu/iasm v0.9.0 // indirect github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.10.0 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect + github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/deckarep/golang-set v1.8.0 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/docker/cli v25.0.1+incompatible // indirect + github.com/docker/docker v25.0.3+incompatible // indirect + github.com/docker/go-connections v0.5.0 // indirect + github.com/edsrzf/mmap-go v1.0.0 // indirect github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4 // indirect + github.com/fjl/memsize v0.0.2 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/gabriel-vasile/mimetype v1.4.2 // indirect + github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff // indirect github.com/gin-contrib/sse v0.1.0 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-kit/kit v0.9.0 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.15.5 // indirect @@ -44,40 +52,53 @@ require ( github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/go-cmp v0.6.0 // indirect - github.com/google/uuid v1.4.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect + github.com/hashicorp/go-bexpr v0.1.10 // indirect + github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect + github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/holiman/uint256 v1.2.4 // indirect github.com/huin/goupnp v1.3.0 // indirect github.com/iden3/go-iden3-crypto v0.0.15 // indirect + github.com/jackc/pgx/v5 v5.5.4 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.17.4 // indirect github.com/klauspost/cpuid/v2 v2.2.5 // indirect - github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect github.com/leodido/go-urn v1.2.4 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mitchellh/pointerstructure v1.2.0 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/onsi/gomega v1.27.1 // indirect + github.com/opencontainers/image-spec v1.1.0 // indirect github.com/pelletier/go-toml/v2 v2.1.0 // indirect + github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.39.0 // indirect + github.com/prometheus/client_model v0.4.0 // indirect + github.com/prometheus/common v0.42.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect + github.com/prometheus/tsdb v0.7.1 // indirect github.com/rivo/uniseg v0.4.4 // indirect github.com/rjeczalik/notify v0.9.1 // indirect github.com/rogpeppe/go-internal v1.10.0 // indirect + github.com/rs/cors v1.7.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/scroll-tech/zktrie v0.7.1 // indirect github.com/sethvargo/go-retry v0.2.4 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/status-im/keycard-go v0.2.0 // indirect github.com/supranational/blst v0.3.11-0.20230124161941-ca03e11a3ff2 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect @@ -85,16 +106,19 @@ require ( github.com/ugorji/go/codec v1.2.11 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect + go.opentelemetry.io/otel/trace v1.24.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/arch v0.5.0 // indirect - golang.org/x/crypto v0.16.0 // indirect + golang.org/x/crypto v0.17.0 // indirect + golang.org/x/mod v0.16.0 // indirect golang.org/x/net v0.18.0 // indirect - golang.org/x/sys v0.15.0 // indirect + golang.org/x/sys v0.17.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.3.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + gopkg.in/urfave/cli.v1 v1.20.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/bridge-history-api/go.sum b/bridge-history-api/go.sum index 881d74001..3f5baa7b9 100644 --- a/bridge-history-api/go.sum +++ b/bridge-history-api/go.sum @@ -1,17 +1,30 @@ +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/ClickHouse/ch-go v0.58.2 h1:jSm2szHbT9MCAB1rJ3WuCJqmGLi5UTjlNu+f530UTS0= +github.com/ClickHouse/ch-go v0.58.2/go.mod h1:Ap/0bEmiLa14gYjCiRkYGbXvbe8vwdrfTYWhsuQ99aw= github.com/ClickHouse/clickhouse-go/v2 v2.15.0 h1:G0hTKyO8fXXR1bGnZ0DY3vTG01xYfOGW76zgjg5tmC4= +github.com/ClickHouse/clickhouse-go/v2 v2.15.0/go.mod h1:kXt1SRq0PIRa6aKZD7TnFnY9PQKmc2b13sHtOYcK6cQ= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI= +github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.5.0 h1:NpE8frKRLGHIcEzkR+gZhiioW1+WbYV6fKwD6ZIpQT8= -github.com/bits-and-blooms/bitset v1.5.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.12.0 h1:U/q1fAF7xXRhFCrhROzIfffYnu+dlS38vCZtmFVPHmA= +github.com/bits-and-blooms/bitset v1.12.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd v0.20.1-beta h1:Ik4hyJqN8Jfyv3S4AGBOmyouMsYE3EdYODkMbQjwPGw= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= @@ -26,7 +39,10 @@ github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ github.com/bytedance/sonic v1.10.1 h1:7a1wuFXL1cMy7a3f7/VFcEtriuXQnUBhtoVfOZiaysc= github.com/bytedance/sonic v1.10.1/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= +github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= @@ -37,11 +53,12 @@ github.com/chenzhuoyu/iasm v0.9.0 h1:9fhXjVzq5hUy2gkhhgHl95zG2cEAhw9OSGs8toWWAwo github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.10.0 h1:zRh22SR7o4K35SoNqouS9J/TKHTyU2QWaj5ldehyXtA= -github.com/consensys/gnark-crypto v0.10.0/go.mod h1:Iq/P3HHl0ElSjsg2E1gsMwhAyxnxoKK5nVyZKd+/KhU= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7bEZ9Su8= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= +github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -53,23 +70,35 @@ github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsP github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -github.com/docker/cli v24.0.7+incompatible h1:wa/nIwYFW7BVTGa7SWPVyyXU9lgORqUb1xfI36MSkFg= -github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/docker/cli v25.0.1+incompatible h1:mFpqnrS6Hsm3v1k7Wa/BO23oz0k121MTbTO1lpcGSkU= +github.com/docker/cli v25.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/docker v25.0.3+incompatible h1:D5fy/lYmY7bvZa0XTZ5/UJPljor41F+vdyJG5luQLfQ= +github.com/docker/docker v25.0.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/elastic/go-sysinfo v1.11.1 h1:g9mwl05njS4r69TisC+vwHWTSKywZFYYUu3so3T/Lao= +github.com/elastic/go-sysinfo v1.11.1/go.mod h1:6KQb31j0QeWBDF88jIdWSxE8cwoOB9tO4Y4osN7Q70E= github.com/elastic/go-windows v1.0.1 h1:AlYZOldA+UJ0/2nBuqWdo90GFCgG9xuyw9SYzGUtJm0= +github.com/elastic/go-windows v1.0.1/go.mod h1:FoVvqWSun28vaDQPbj2Elfc0JahhPB7WQEGa3c814Ss= github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4 h1:B2mpK+MNqgPqk2/KNi1LbqwtZDy5F7iy0mynQiBr8VA= github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4/go.mod h1:y4GA2JbAUama1S4QwYjC2hefgGLU8Ul0GMtL/ADMF1c= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= +github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= +github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= +github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/gin-contrib/cors v1.5.0 h1:DgGKV7DDoOn36DFkNtbHrjoRiT5ExCe+PC9/xp7aKvk= github.com/gin-contrib/cors v1.5.0/go.mod h1:TvU7MAZ3EwrPLI2ztzTt3tqgvBCq+wn8WpZmfADjupI= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= @@ -77,10 +106,20 @@ github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= github.com/go-faster/city v1.0.1 h1:4WAxSZ3V2Ws4QRDrscLEDcibJY8uf41H6AhXDrNDcGw= +github.com/go-faster/city v1.0.1/go.mod h1:jKcUJId49qdW3L1qKHH/3wPeUstCVpVSXTM6vO3VcTw= github.com/go-faster/errors v0.6.1 h1:nNIPOBkprlKzkThvS/0YaX8Zs9KewLCOSFQS5BU06FI= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-faster/errors v0.6.1/go.mod h1:5MGV2/2T9yvlrbhe9pD9LO5Z/2zCSq2T8j+Jpi2LAyY= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= @@ -90,33 +129,50 @@ github.com/go-playground/validator/v10 v10.15.5/go.mod h1:9iXMNT7sEkjXb0I+enO7QX github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= +github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= +github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= +github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= @@ -124,11 +180,14 @@ github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/iden3/go-iden3-crypto v0.0.15 h1:4MJYlrot1l31Fzlo2sF56u7EVFeHHJkxGXXZCtESgK4= github.com/iden3/go-iden3-crypto v0.0.15/go.mod h1:dLpM4vEPJ3nDHzhWFXDjzkn1qHoBeOT/3UEhXsEsP3E= -github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= -github.com/jackc/pgx/v5 v5.5.0 h1:NxstgwndsTRy7eq9/kqYc/BZh5w2hHJV86wjvO+1xPw= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.5.4 h1:Xp2aQS8uXButQdnCMWNmvx6UysWQQC+u1EoizjguY+8= +github.com/jackc/pgx/v5 v5.5.4/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= +github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= @@ -137,22 +196,28 @@ github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkr github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4= +github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4= +github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= +github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= @@ -160,91 +225,126 @@ github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovk github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= +github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.27.1 h1:rfztXRbg6nv/5f+Raen9RcGoSecHIFgBBLQK3Wdj754= github.com/onsi/gomega v1.27.1/go.mod h1:aHX5xOykVYzWOV4WqQy0sy8BQptgukenXpCXfadcIAw= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= github.com/opencontainers/runc v1.1.10 h1:EaL5WeO9lv9wmS6SASjszOeQdSctvpbu0DdBQBizE40= +github.com/opencontainers/runc v1.1.10/go.mod h1:+/R6+KmDlh+hOO8NkjmgkG9Qzvypzk0yXxAPYYR65+M= github.com/ory/dockertest/v3 v3.10.0 h1:4K3z2VMe8Woe++invjaTB7VRyQXQy5UY+loujO4aNE4= +github.com/ory/dockertest/v3 v3.10.0/go.mod h1:nr57ZbRWMqfsdGdFNLHz5jjNdDb7VVFnzAeW1n5N1Lg= github.com/paulmach/orb v0.10.0 h1:guVYVqzxHE/CQ1KpfGO077TR0ATHSNjp4s6XGLn3W9s= +github.com/paulmach/orb v0.10.0/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU= github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pressly/goose/v3 v3.16.0 h1:xMJUsZdHLqSnCqESyKSqEfcYVYsUuup1nrOhaEFftQg= github.com/pressly/goose/v3 v3.16.0/go.mod h1:JwdKVnmCRhnF6XLQs2mHEQtucFD49cQBdRM4UiwkxsM= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= -github.com/prometheus/common v0.39.0/go.mod h1:6XBZ7lYdLCbkAVhwRsWTZn+IN5AB9F/NXd5w0BbEX0Y= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= +github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE= github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/scroll-tech/go-ethereum v1.10.14-0.20240201173512-ae7cbae19c84 h1:H3tMatapNGkOWnlXpp9HSjcKN00684jkutxqrJHU+qM= -github.com/scroll-tech/go-ethereum v1.10.14-0.20240201173512-ae7cbae19c84/go.mod h1:7Rz2bh9pn42rGuxjh51CG7HL9SKMG3ZugJkL3emdZx8= +github.com/scroll-tech/go-ethereum v1.10.14-0.20240326144132-0f0cd99f7a2e h1:FcoK0rykAWI+5E7cQM6ALRLd5CmjBTHRvJztRBH2xeM= +github.com/scroll-tech/go-ethereum v1.10.14-0.20240326144132-0f0cd99f7a2e/go.mod h1:7Rz2bh9pn42rGuxjh51CG7HL9SKMG3ZugJkL3emdZx8= github.com/scroll-tech/zktrie v0.7.1 h1:NrmZNjuBzsbrKePqdHDG+t2cXnimbtezPAFS0+L9ElE= github.com/scroll-tech/zktrie v0.7.1/go.mod h1:XvNo7vAk8yxNyTjBDj5WIiFzYW4bx/gJ78+NK6Zn6Uk= github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys= +github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= github.com/sethvargo/go-retry v0.2.4 h1:T+jHEQy/zKJf5s95UkguisicE0zuF9y7+/vgz08Ocec= github.com/sethvargo/go-retry v0.2.4/go.mod h1:1afjQuvh7s4gflMObvjLPaWgluLLyhA1wmVZ6KLpICw= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= +github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/supranational/blst v0.3.11-0.20230124161941-ca03e11a3ff2 h1:wh1wzwAhZBNiZO37uWS/nDaKiIwHz4mDo4pnA+fqTO0= github.com/supranational/blst v0.3.11-0.20230124161941-ca03e11a3ff2/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= @@ -258,17 +358,25 @@ github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZ github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/vertica/vertica-sql-go v1.3.3 h1:fL+FKEAEy5ONmsvya2WH5T8bhkvY27y/Ik3ReR2T+Qw= +github.com/vertica/vertica-sql-go v1.3.3/go.mod h1:jnn2GFuv+O2Jcjktb7zyc4Utlbu9YVqpHH/lx63+1M4= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/ydb-platform/ydb-go-genproto v0.0.0-20231012155159-f85a672542fd h1:dzWP1Lu+A40W883dK/Mr3xyDSM/2MggS8GtHT0qgAnE= +github.com/ydb-platform/ydb-go-genproto v0.0.0-20231012155159-f85a672542fd/go.mod h1:Er+FePu1dNUieD+XTMDduGpQuCPssK5Q4BjF+IIXJ3I= github.com/ydb-platform/ydb-go-sdk/v3 v3.54.2 h1:E0yUuuX7UmPxXm92+yQCjMveLFO3zfvYFIJVuAqsVRA= +github.com/ydb-platform/ydb-go-sdk/v3 v3.54.2/go.mod h1:fjBLQ2TdQNl4bMjuWl9adoTGBypwUTPoGC+EqYqiIcU= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.opentelemetry.io/otel v1.20.0 h1:vsb/ggIY+hUjD/zCAQHpzTmndPqv/ml2ArbsbfBYTAc= -go.opentelemetry.io/otel/trace v1.20.0 h1:+yxVAPZPbQhbC3OfAkeIVTky6iTFpcr4SiY9om7mXSQ= +go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= +go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= +go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= +go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= @@ -277,70 +385,111 @@ golang.org/x/arch v0.5.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= +golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= +golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 h1:DC7wcm+i+P1rN3Ff07vL+OndGg5OhNddHyTA+ocPqYE= google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4/go.mod h1:eJVxU6o+4G1PSczBr85xmyvSNYAKvAYgkub40YGomFM= google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/urfave/cli.v1 v1.20.0 h1:NdAVW6RYxDif9DhDHaAortIu956m2c0v+09AZBPTbE0= +gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls= gorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM= +howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= lukechampine.com/uint128 v1.3.0 h1:cDdUVfRwDUDovz610ABgFD17nXD4/uDgVHl2sC3+sbo= +lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= modernc.org/cc/v3 v3.41.0 h1:QoR1Sn3YWlmA1T4vLaKZfawdVtSiGx8H+cEojbC7v1Q= +modernc.org/cc/v3 v3.41.0/go.mod h1:Ni4zjJYJ04CDOhG7dn640WGfwBzfE0ecX8TyMB0Fv0Y= modernc.org/ccgo/v3 v3.16.15 h1:KbDR3ZAVU+wiLyMESPtbtE/Add4elztFyfsWoNTgxS0= +modernc.org/ccgo/v3 v3.16.15/go.mod h1:yT7B+/E2m43tmMOT51GMoM98/MtHIcQQSleGnddkUNI= modernc.org/libc v1.32.0 h1:yXatHTrACp3WaKNRCoZwUK7qj5V8ep1XyY0ka4oYcNc= +modernc.org/libc v1.32.0/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE= modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= +modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= modernc.org/sqlite v1.27.0 h1:MpKAHoyYB7xqcwnUwkuD+npwEa0fojF0B5QRbN+auJ8= +modernc.org/sqlite v1.27.0/go.mod h1:Qxpazz0zH8Z1xCFyi5GSL3FzbtZ3fvbjmywNogldEW0= modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= diff --git a/bridge-history-api/internal/config/config.go b/bridge-history-api/internal/config/config.go index d52a112ba..d82bf8785 100644 --- a/bridge-history-api/internal/config/config.go +++ b/bridge-history-api/internal/config/config.go @@ -23,6 +23,7 @@ type FetcherConfig struct { DAIGatewayAddr string `json:"DAIGatewayAddr"` USDCGatewayAddr string `json:"USDCGatewayAddr"` LIDOGatewayAddr string `json:"LIDOGatewayAddr"` + PufferGatewayAddr string `json:"PufferGatewayAddr"` ERC721GatewayAddr string `json:"ERC721GatewayAddr"` ERC1155GatewayAddr string `json:"ERC1155GatewayAddr"` ScrollChainAddr string `json:"ScrollChainAddr"` diff --git a/bridge-history-api/internal/logic/l1_fetcher.go b/bridge-history-api/internal/logic/l1_fetcher.go index d9e42a48d..f2436e6ad 100644 --- a/bridge-history-api/internal/logic/l1_fetcher.go +++ b/bridge-history-api/internal/logic/l1_fetcher.go @@ -93,6 +93,11 @@ func NewL1FetcherLogic(cfg *config.FetcherConfig, db *gorm.DB, client *ethclient gatewayList = append(gatewayList, common.HexToAddress(cfg.LIDOGatewayAddr)) } + if common.HexToAddress(cfg.PufferGatewayAddr) != (common.Address{}) { + addressList = append(addressList, common.HexToAddress(cfg.PufferGatewayAddr)) + gatewayList = append(gatewayList, common.HexToAddress(cfg.PufferGatewayAddr)) + } + log.Info("L1 Fetcher configured with the following address list", "addresses", addressList, "gateways", gatewayList) f := &L1FetcherLogic{ diff --git a/bridge-history-api/internal/logic/l2_fetcher.go b/bridge-history-api/internal/logic/l2_fetcher.go index ec13e70ba..24b583cb5 100644 --- a/bridge-history-api/internal/logic/l2_fetcher.go +++ b/bridge-history-api/internal/logic/l2_fetcher.go @@ -85,7 +85,12 @@ func NewL2FetcherLogic(cfg *config.FetcherConfig, db *gorm.DB, client *ethclient if common.HexToAddress(cfg.LIDOGatewayAddr) != (common.Address{}) { addressList = append(addressList, common.HexToAddress(cfg.LIDOGatewayAddr)) - gatewayList = append(gatewayList, common.HexToAddress(cfg.USDCGatewayAddr)) + gatewayList = append(gatewayList, common.HexToAddress(cfg.LIDOGatewayAddr)) + } + + if common.HexToAddress(cfg.PufferGatewayAddr) != (common.Address{}) { + addressList = append(addressList, common.HexToAddress(cfg.PufferGatewayAddr)) + gatewayList = append(gatewayList, common.HexToAddress(cfg.PufferGatewayAddr)) } log.Info("L2 Fetcher configured with the following address list", "addresses", addressList, "gateways", gatewayList) diff --git a/build/dockerfiles/local_testing.Dockerfile b/build/dockerfiles/local_testing.Dockerfile index f90032c64..f6702e872 100644 --- a/build/dockerfiles/local_testing.Dockerfile +++ b/build/dockerfiles/local_testing.Dockerfile @@ -1,8 +1,8 @@ # Start from the latest golang base image -FROM golang:1.20 +FROM golang:1.21 # Install Docker -RUN apt-get update && apt-get install -y docker.io +RUN apt-get update && apt-get install -y docker.io docker-compose # Set the working directory WORKDIR /go/src/app diff --git a/build/run_tests.sh b/build/run_tests.sh deleted file mode 100755 index f6b9ec007..000000000 --- a/build/run_tests.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash -set -uex - -profile_name=$1 - -exclude_dirs=("scroll-tech/rollup/cmd" "scroll-tech/rollup/tests" "scroll-tech/rollup/mock_bridge" "scroll-tech/coordinator/cmd" "scroll-tech/coordinator/internal/logic/verifier") - -all_packages=$(go list ./... | grep -v "^scroll-tech/${profile_name}$") -coverpkg="scroll-tech/${profile_name}" - -for pkg in $all_packages; do - exclude_pkg=false - for exclude_dir in "${exclude_dirs[@]}"; do - if [[ $pkg == $exclude_dir* ]]; then - exclude_pkg=true - break - fi - done - - if [ "$exclude_pkg" = false ]; then - coverpkg="$coverpkg,$pkg/..." - fi -done - -echo "coverage.${profile_name}.txt" -go test -v -race -gcflags="-l" -ldflags="-s=false" -coverpkg="$coverpkg" -coverprofile=../coverage.${profile_name}.txt -covermode=atomic ./... \ No newline at end of file diff --git a/common/database/db_test.go b/common/database/db_test.go index df6bcd649..fdd273722 100644 --- a/common/database/db_test.go +++ b/common/database/db_test.go @@ -1,62 +1,27 @@ -package database +package database_test import ( - "context" - "errors" - "io" - "os" "testing" - "time" - "github.com/mattn/go-colorable" - "github.com/mattn/go-isatty" - "github.com/scroll-tech/go-ethereum/log" "github.com/stretchr/testify/assert" - "scroll-tech/common/docker" + "scroll-tech/common/database" + "scroll-tech/common/testcontainers" "scroll-tech/common/version" ) -func TestGormLogger(t *testing.T) { - output := io.Writer(os.Stderr) - usecolor := (isatty.IsTerminal(os.Stderr.Fd()) || isatty.IsCygwinTerminal(os.Stderr.Fd())) && os.Getenv("TERM") != "dumb" - if usecolor { - output = colorable.NewColorableStderr() - } - ostream := log.StreamHandler(output, log.TerminalFormat(usecolor)) - glogger := log.NewGlogHandler(ostream) - // Set log level - glogger.Verbosity(log.LvlTrace) - log.Root().SetHandler(glogger) - - var gl gormLogger - gl.gethLogger = log.Root() - - gl.Error(context.Background(), "test %s error:%v", "testError", errors.New("test error")) - gl.Warn(context.Background(), "test %s warn:%v", "testWarn", errors.New("test warn")) - gl.Info(context.Background(), "test %s warn:%v", "testInfo", errors.New("test info")) - gl.Trace(context.Background(), time.Now(), func() (string, int64) { return "test trace", 1 }, nil) -} - func TestDB(t *testing.T) { version.Version = "v4.1.98-aaa-bbb-ccc" - base := docker.NewDockerApp() - base.RunDBImage(t) - dbCfg := &Config{ - DSN: base.DBConfig.DSN, - DriverName: base.DBConfig.DriverName, - MaxOpenNum: base.DBConfig.MaxOpenNum, - MaxIdleNum: base.DBConfig.MaxIdleNum, - } + testApps := testcontainers.NewTestcontainerApps() + assert.NoError(t, testApps.StartPostgresContainer()) - var err error - db, err := InitDB(dbCfg) + db, err := testApps.GetGormDBClient() assert.NoError(t, err) - sqlDB, err := Ping(db) + sqlDB, err := database.Ping(db) assert.NoError(t, err) assert.NotNil(t, sqlDB) - assert.NoError(t, CloseDB(db)) + assert.NoError(t, database.CloseDB(db)) } diff --git a/common/database/logger_test.go b/common/database/logger_test.go new file mode 100644 index 000000000..5440effc0 --- /dev/null +++ b/common/database/logger_test.go @@ -0,0 +1,35 @@ +package database + +import ( + "context" + "errors" + "io" + "os" + "testing" + "time" + + "github.com/mattn/go-colorable" + "github.com/mattn/go-isatty" + "github.com/scroll-tech/go-ethereum/log" +) + +func TestGormLogger(t *testing.T) { + output := io.Writer(os.Stderr) + usecolor := (isatty.IsTerminal(os.Stderr.Fd()) || isatty.IsCygwinTerminal(os.Stderr.Fd())) && os.Getenv("TERM") != "dumb" + if usecolor { + output = colorable.NewColorableStderr() + } + ostream := log.StreamHandler(output, log.TerminalFormat(usecolor)) + glogger := log.NewGlogHandler(ostream) + // Set log level + glogger.Verbosity(log.LvlTrace) + log.Root().SetHandler(glogger) + + var gl gormLogger + gl.gethLogger = log.Root() + + gl.Error(context.Background(), "test %s error:%v", "testError", errors.New("test error")) + gl.Warn(context.Background(), "test %s warn:%v", "testWarn", errors.New("test warn")) + gl.Info(context.Background(), "test %s warn:%v", "testInfo", errors.New("test info")) + gl.Trace(context.Background(), time.Now(), func() (string, int64) { return "test trace", 1 }, nil) +} diff --git a/common/docker-compose/l1/.gitignore b/common/docker-compose/l1/.gitignore new file mode 100644 index 000000000..a6de44076 --- /dev/null +++ b/common/docker-compose/l1/.gitignore @@ -0,0 +1,7 @@ +consensus/beacondata* +consensus/genesis.ssz +consensus/validatordata* +consensus/data* +execution/geth +execution/geth.ipc +execution/data* diff --git a/common/docker-compose/l1/clean.sh b/common/docker-compose/l1/clean.sh new file mode 100755 index 000000000..f48bafc85 --- /dev/null +++ b/common/docker-compose/l1/clean.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +# Loop until no Docker containers matching 'posl1' are found +while : ; do + containers=$(docker ps -a --format '{{.Names}}' | grep posl1) + if [[ -z "$containers" ]]; then + break + fi + echo "find the following containers, removing..." + echo "$containers" + echo "$containers" | xargs -r docker stop + echo "$containers" | xargs -r docker rm -f || echo "Warning: Failed to remove some containers." +done + +# Loop until no Docker networks matching 'posl1' are found +while : ; do + networks=$(docker network ls --format '{{.ID}} {{.Name}}' | grep posl1 | awk '{print $1}') + if [[ -z "$networks" ]]; then + break + fi + echo "find the following networks, removing..." + echo "$networks" + echo "$networks" | xargs -r docker network rm || echo "Warning: Failed to remove some networks." +done diff --git a/common/docker-compose/l1/consensus/config.yml b/common/docker-compose/l1/consensus/config.yml new file mode 100644 index 000000000..327d0ff71 --- /dev/null +++ b/common/docker-compose/l1/consensus/config.yml @@ -0,0 +1,30 @@ +CONFIG_NAME: interop +PRESET_BASE: interop + +# Genesis +GENESIS_FORK_VERSION: 0x20000089 + +# Altair +ALTAIR_FORK_EPOCH: 0 +ALTAIR_FORK_VERSION: 0x20000090 + +# Merge +BELLATRIX_FORK_EPOCH: 0 +BELLATRIX_FORK_VERSION: 0x20000091 +TERMINAL_TOTAL_DIFFICULTY: 0 + +# Capella +CAPELLA_FORK_EPOCH: 0 +CAPELLA_FORK_VERSION: 0x20000092 +MAX_WITHDRAWALS_PER_PAYLOAD: 16 + +# Deneb +DENEB_FORK_EPOCH: 0 +DENEB_FORK_VERSION: 0x20000093 + +# Time parameters +SECONDS_PER_SLOT: 2 +SLOTS_PER_EPOCH: 2 + +# Deposit contract +DEPOSIT_CONTRACT_ADDRESS: 0x4242424242424242424242424242424242424242 diff --git a/common/docker-compose/l1/docker-compose.go b/common/docker-compose/l1/docker-compose.go new file mode 100644 index 000000000..53e69b83d --- /dev/null +++ b/common/docker-compose/l1/docker-compose.go @@ -0,0 +1,127 @@ +package dockercompose + +import ( + "context" + "crypto/rand" + "fmt" + "math/big" + "os" + "path/filepath" + "time" + + "github.com/cloudflare/cfssl/log" + "github.com/scroll-tech/go-ethereum/ethclient" + tc "github.com/testcontainers/testcontainers-go/modules/compose" + "github.com/testcontainers/testcontainers-go/wait" +) + +// PoSL1TestEnv represents the config needed to test in PoS Layer 1. +type PoSL1TestEnv struct { + dockerComposeFile string + compose tc.ComposeStack + gethHTTPPort int + hostPath string +} + +// NewPoSL1TestEnv creates and initializes a new instance of PoSL1TestEnv with a random HTTP port. +func NewPoSL1TestEnv() (*PoSL1TestEnv, error) { + rootDir, err := findProjectRootDir() + if err != nil { + return nil, fmt.Errorf("failed to find project root directory: %v", err) + } + + hostPath, found := os.LookupEnv("HOST_PATH") + if !found { + hostPath = "" + } + + rnd, err := rand.Int(rand.Reader, big.NewInt(65536-1024)) + if err != nil { + return nil, fmt.Errorf("failed to generate a random: %v", err) + } + gethHTTPPort := int(rnd.Int64()) + 1024 + + if err := os.Setenv("GETH_HTTP_PORT", fmt.Sprintf("%d", gethHTTPPort)); err != nil { + return nil, fmt.Errorf("failed to set GETH_HTTP_PORT: %v", err) + } + + return &PoSL1TestEnv{ + dockerComposeFile: filepath.Join(rootDir, "common", "docker-compose", "l1", "docker-compose.yml"), + gethHTTPPort: gethHTTPPort, + hostPath: hostPath, + }, nil +} + +// Start starts the PoS L1 test environment by running the associated Docker Compose configuration. +func (e *PoSL1TestEnv) Start() error { + var err error + e.compose, err = tc.NewDockerCompose([]string{e.dockerComposeFile}...) + if err != nil { + return fmt.Errorf("failed to create docker compose: %w", err) + } + + env := map[string]string{ + "GETH_HTTP_PORT": fmt.Sprintf("%d", e.gethHTTPPort), + } + + if e.hostPath != "" { + env["HOST_PATH"] = e.hostPath + } + + if err = e.compose.WaitForService("geth", wait.NewHTTPStrategy("/").WithPort("8545/tcp").WithStartupTimeout(15*time.Second)).WithEnv(env).Up(context.Background()); err != nil { + if errStop := e.Stop(); errStop != nil { + log.Error("failed to stop PoS L1 test environment", "err", errStop) + } + return fmt.Errorf("failed to start PoS L1 test environment: %w", err) + } + return nil +} + +// Stop stops the PoS L1 test environment by stopping and removing the associated Docker Compose services. +func (e *PoSL1TestEnv) Stop() error { + if e.compose != nil { + if err := e.compose.Down(context.Background(), tc.RemoveOrphans(true), tc.RemoveVolumes(true), tc.RemoveImagesLocal); err != nil { + return fmt.Errorf("failed to stop PoS L1 test environment: %w", err) + } + } + return nil +} + +// Endpoint returns the HTTP endpoint for the PoS L1 test environment. +func (e *PoSL1TestEnv) Endpoint() string { + return fmt.Sprintf("http://127.0.0.1:%d", e.gethHTTPPort) +} + +// L1Client returns an ethclient by dialing the running PoS L1 test environment +func (e *PoSL1TestEnv) L1Client() (*ethclient.Client, error) { + if e == nil { + return nil, fmt.Errorf("PoS L1 test environment is not initialized") + } + + client, err := ethclient.Dial(e.Endpoint()) + if err != nil { + return nil, fmt.Errorf("failed to dial PoS L1 test environment: %w", err) + } + return client, nil +} + +func findProjectRootDir() (string, error) { + currentDir, err := os.Getwd() + if err != nil { + return "", fmt.Errorf("failed to get working directory: %w", err) + } + + for { + _, err := os.Stat(filepath.Join(currentDir, "go.work")) + if err == nil { + return currentDir, nil + } + + parentDir := filepath.Dir(currentDir) + if parentDir == currentDir { + return "", fmt.Errorf("go.work file not found in any parent directory") + } + + currentDir = parentDir + } +} diff --git a/common/docker-compose/l1/docker-compose.yml b/common/docker-compose/l1/docker-compose.yml new file mode 100644 index 000000000..2142fa17c --- /dev/null +++ b/common/docker-compose/l1/docker-compose.yml @@ -0,0 +1,127 @@ +version: "3.9" +services: + initialize-env: + image: "alpine:3.19.0" + command: + /bin/sh -c "mkdir -p /data/consensus && + cp -a /consensus/* /data/consensus/ && + mkdir -p /data/execution && + cp -a /execution/* /data/execution/" + volumes: + - ${HOST_PATH:-../../..}/common/docker-compose/l1/consensus:/consensus + - ${HOST_PATH:-../../..}/common/docker-compose/l1/execution:/execution + - data:/data + + # Creates a genesis state for the beacon chain using a YAML configuration file and + # a deterministic set of 64 validators. + create-beacon-chain-genesis: + image: "gcr.io/prysmaticlabs/prysm/cmd/prysmctl:latest" + command: + - testnet + - generate-genesis + - --fork=deneb + - --num-validators=64 + - --genesis-time-delay=3 + - --output-ssz=/data/consensus/genesis.ssz + - --chain-config-file=/data/consensus/config.yml + - --geth-genesis-json-in=/data/execution/genesis.json + - --geth-genesis-json-out=/data/execution/genesis.json + volumes: + - data:/data + depends_on: + initialize-env: + condition: service_completed_successfully + + # Sets up the genesis configuration for the go-ethereum client from a JSON file. + geth-genesis: + image: "ethereum/client-go:v1.13.14" + command: --datadir=/data/execution init /data/execution/genesis.json + volumes: + - data:/data + depends_on: + create-beacon-chain-genesis: + condition: service_completed_successfully + initialize-env: + condition: service_completed_successfully + + # Runs a Prysm beacon chain from a specified genesis state created in the previous step + # and connects to go-ethereum in the same network as the execution client. + # The account used in go-ethereum is set as the suggested fee recipient for transactions + # proposed via the validators attached to the beacon node. + beacon-chain: + image: "gcr.io/prysmaticlabs/prysm/beacon-chain:v5.0.0" + command: + - --datadir=/data/consensus/beacondata + # No peers to sync with in this testnet, so setting to 0 + - --min-sync-peers=0 + - --genesis-state=/data/consensus/genesis.ssz + - --bootstrap-node= + - --interop-eth1data-votes + # The chain configuration file used for setting up Prysm + - --chain-config-file=/data/consensus/config.yml + # We specify the chain id used by our execution client + - --contract-deployment-block=0 + - --chain-id=${CHAIN_ID:-32382} + - --rpc-host=0.0.0.0 + - --grpc-gateway-host=0.0.0.0 + - --execution-endpoint=http://geth:8551 + - --accept-terms-of-use + - --jwt-secret=/data/execution/jwtsecret + - --suggested-fee-recipient=0x123463a4b065722e99115d6c222f267d9cabb524 + - --minimum-peers-per-subnet=0 + - --enable-debug-rpc-endpoints + - --force-clear-db + depends_on: + create-beacon-chain-genesis: + condition: service_completed_successfully + volumes: + - data:/data + + # Runs the go-ethereum execution client with the specified, unlocked account and necessary + # APIs to allow for proof-of-stake consensus via Prysm. + geth: + image: "ethereum/client-go:v1.13.14" + command: + - --http + - --http.api=eth,net,web3 + - --http.addr=0.0.0.0 + - --http.corsdomain=* + - --authrpc.vhosts=* + - --authrpc.addr=0.0.0.0 + - --authrpc.jwtsecret=/data/execution/jwtsecret + - --datadir=/data/execution + - --allow-insecure-unlock + - --unlock=0x123463a4b065722e99115d6c222f267d9cabb524 + - --password=/data/execution/geth_password.txt + - --nodiscover + - --syncmode=full + ports: + - ${GETH_HTTP_PORT:-8545}:8545 + depends_on: + geth-genesis: + condition: service_completed_successfully + beacon-chain: + condition: service_started + volumes: + - data:/data + + # We run a validator client with 64, deterministically-generated keys that match + # The validator keys present in the beacon chain genesis state generated a few steps above. + validator: + image: "gcr.io/prysmaticlabs/prysm/validator:v5.0.0" + command: + - --beacon-rpc-provider=beacon-chain:4000 + - --datadir=/data/consensus/validatordata + - --accept-terms-of-use + - --interop-num-validators=64 + - --interop-start-index=0 + - --chain-config-file=/data/consensus/config.yml + - --force-clear-db + depends_on: + beacon-chain: + condition: service_started + volumes: + - data:/data + +volumes: + data: diff --git a/common/docker-compose/l1/execution/genesis.json b/common/docker-compose/l1/execution/genesis.json new file mode 100644 index 000000000..a2fe31294 --- /dev/null +++ b/common/docker-compose/l1/execution/genesis.json @@ -0,0 +1,57 @@ +{ + "config": { + "chainId": 32382, + "homesteadBlock": 0, + "daoForkSupport": true, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "muirGlacierBlock": 0, + "berlinBlock": 0, + "londonBlock": 0, + "arrowGlacierBlock": 0, + "grayGlacierBlock": 0, + "shanghaiTime": 1710491285, + "cancunTime": 1710491289, + "terminalTotalDifficulty": 0, + "terminalTotalDifficultyPassed": true + }, + "nonce": "0x0", + "timestamp": "0x65f40695", + "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000123463a4b065722e99115d6c222f267d9cabb5240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "gasLimit": "0x1c9c380", + "difficulty": "0x1", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "123463a4b065722e99115d6c222f267d9cabb524": { + "balance": "0x43c33c1937564800000" + }, + "1c5a77d9fa7ef466951b2f01f724bca3a5820b63": { + "balance": "0x200000000000000000000000000000000000000000000000000000000000000" + }, + "33e0f539e31b35170faaa062af703b76a8282bf7": { + "balance": "0x200000000000000000000000000000000000000000000000000000000000000" + }, + "1e32abcfe6db15c1570709e3fc02725335f50a47": { + "balance": "0x200000000000000000000000000000000000000000000000000000000000000" + }, + "03a1bba60b5aa37094cf16123add674c01589488": { + "balance": "0x200000000000000000000000000000000000000000000000000000000000000" + }, + "4242424242424242424242424242424242424242": { + "code": "0x60806040526004361061003f5760003560e01c806301ffc9a71461004457806322895118146100b6578063621fd130146101e3578063c5f2892f14610273575b600080fd5b34801561005057600080fd5b5061009c6004803603602081101561006757600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916906020019092919050505061029e565b604051808215151515815260200191505060405180910390f35b6101e1600480360360808110156100cc57600080fd5b81019080803590602001906401000000008111156100e957600080fd5b8201836020820111156100fb57600080fd5b8035906020019184600183028401116401000000008311171561011d57600080fd5b90919293919293908035906020019064010000000081111561013e57600080fd5b82018360208201111561015057600080fd5b8035906020019184600183028401116401000000008311171561017257600080fd5b90919293919293908035906020019064010000000081111561019357600080fd5b8201836020820111156101a557600080fd5b803590602001918460018302840111640100000000831117156101c757600080fd5b909192939192939080359060200190929190505050610370565b005b3480156101ef57600080fd5b506101f8610fd0565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561023857808201518184015260208101905061021d565b50505050905090810190601f1680156102655780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561027f57600080fd5b50610288610fe2565b6040518082815260200191505060405180910390f35b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061036957507f85640907000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b603087879050146103cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806116ec6026913960400191505060405180910390fd5b60208585905014610428576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806116836036913960400191505060405180910390fd5b60608383905014610484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061175f6029913960400191505060405180910390fd5b670de0b6b3a76400003410156104e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806117396026913960400191505060405180910390fd5b6000633b9aca0034816104f457fe5b061461054b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806116b96033913960400191505060405180910390fd5b6000633b9aca00348161055a57fe5b04905067ffffffffffffffff80168111156105c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806117126027913960400191505060405180910390fd5b60606105cb82611314565b90507f649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c589898989858a8a610600602054611314565b60405180806020018060200180602001806020018060200186810386528e8e82818152602001925080828437600081840152601f19601f82011690508083019250505086810385528c8c82818152602001925080828437600081840152601f19601f82011690508083019250505086810384528a818151815260200191508051906020019080838360005b838110156106a657808201518184015260208101905061068b565b50505050905090810190601f1680156106d35780820380516001836020036101000a031916815260200191505b508681038352898982818152602001925080828437600081840152601f19601f820116905080830192505050868103825287818151815260200191508051906020019080838360005b8381101561073757808201518184015260208101905061071c565b50505050905090810190601f1680156107645780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a1600060028a8a600060801b6040516020018084848082843780830192505050826fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff1916815260100193505050506040516020818303038152906040526040518082805190602001908083835b6020831061080e57805182526020820191506020810190506020830392506107eb565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015610850573d6000803e3d6000fd5b5050506040513d602081101561086557600080fd5b8101908080519060200190929190505050905060006002808888600090604092610891939291906115da565b6040516020018083838082843780830192505050925050506040516020818303038152906040526040518082805190602001908083835b602083106108eb57805182526020820191506020810190506020830392506108c8565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa15801561092d573d6000803e3d6000fd5b5050506040513d602081101561094257600080fd5b8101908080519060200190929190505050600289896040908092610968939291906115da565b6000801b604051602001808484808284378083019250505082815260200193505050506040516020818303038152906040526040518082805190602001908083835b602083106109cd57805182526020820191506020810190506020830392506109aa565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015610a0f573d6000803e3d6000fd5b5050506040513d6020811015610a2457600080fd5b810190808051906020019092919050505060405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b60208310610a8e5780518252602082019150602081019050602083039250610a6b565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015610ad0573d6000803e3d6000fd5b5050506040513d6020811015610ae557600080fd5b810190808051906020019092919050505090506000600280848c8c604051602001808481526020018383808284378083019250505093505050506040516020818303038152906040526040518082805190602001908083835b60208310610b615780518252602082019150602081019050602083039250610b3e565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015610ba3573d6000803e3d6000fd5b5050506040513d6020811015610bb857600080fd5b8101908080519060200190929190505050600286600060401b866040516020018084805190602001908083835b60208310610c085780518252602082019150602081019050602083039250610be5565b6001836020036101000a0380198251168184511680821785525050505050509050018367ffffffffffffffff191667ffffffffffffffff1916815260180182815260200193505050506040516020818303038152906040526040518082805190602001908083835b60208310610c935780518252602082019150602081019050602083039250610c70565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015610cd5573d6000803e3d6000fd5b5050506040513d6020811015610cea57600080fd5b810190808051906020019092919050505060405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b60208310610d545780518252602082019150602081019050602083039250610d31565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015610d96573d6000803e3d6000fd5b5050506040513d6020811015610dab57600080fd5b81019080805190602001909291905050509050858114610e16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252605481526020018061162f6054913960600191505060405180910390fd5b6001602060020a0360205410610e77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061160e6021913960400191505060405180910390fd5b60016020600082825401925050819055506000602054905060008090505b6020811015610fb75760018083161415610ec8578260008260208110610eb757fe5b018190555050505050505050610fc7565b600260008260208110610ed757fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b60208310610f335780518252602082019150602081019050602083039250610f10565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015610f75573d6000803e3d6000fd5b5050506040513d6020811015610f8a57600080fd5b8101908080519060200190929190505050925060028281610fa757fe5b0491508080600101915050610e95565b506000610fc057fe5b5050505050505b50505050505050565b6060610fdd602054611314565b905090565b6000806000602054905060008090505b60208110156111d057600180831614156110e05760026000826020811061101557fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b60208310611071578051825260208201915060208101905060208303925061104e565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa1580156110b3573d6000803e3d6000fd5b5050506040513d60208110156110c857600080fd5b810190808051906020019092919050505092506111b6565b600283602183602081106110f057fe5b015460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061114b5780518252602082019150602081019050602083039250611128565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa15801561118d573d6000803e3d6000fd5b5050506040513d60208110156111a257600080fd5b810190808051906020019092919050505092505b600282816111c057fe5b0491508080600101915050610ff2565b506002826111df602054611314565b600060401b6040516020018084815260200183805190602001908083835b6020831061122057805182526020820191506020810190506020830392506111fd565b6001836020036101000a0380198251168184511680821785525050505050509050018267ffffffffffffffff191667ffffffffffffffff1916815260180193505050506040516020818303038152906040526040518082805190602001908083835b602083106112a55780518252602082019150602081019050602083039250611282565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa1580156112e7573d6000803e3d6000fd5b5050506040513d60208110156112fc57600080fd5b81019080805190602001909291905050509250505090565b6060600867ffffffffffffffff8111801561132e57600080fd5b506040519080825280601f01601f1916602001820160405280156113615781602001600182028036833780820191505090505b50905060008260c01b90508060076008811061137957fe5b1a60f81b8260008151811061138a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806006600881106113c657fe5b1a60f81b826001815181106113d757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060056008811061141357fe5b1a60f81b8260028151811061142457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060046008811061146057fe5b1a60f81b8260038151811061147157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806003600881106114ad57fe5b1a60f81b826004815181106114be57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806002600881106114fa57fe5b1a60f81b8260058151811061150b57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060016008811061154757fe5b1a60f81b8260068151811061155857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060006008811061159457fe5b1a60f81b826007815181106115a557fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050919050565b600080858511156115ea57600080fd5b838611156115f757600080fd5b600185028301915084860390509450949250505056fe4465706f736974436f6e74726163743a206d65726b6c6520747265652066756c6c4465706f736974436f6e74726163743a207265636f6e7374727563746564204465706f7369744461746120646f6573206e6f74206d6174636820737570706c696564206465706f7369745f646174615f726f6f744465706f736974436f6e74726163743a20696e76616c6964207769746864726177616c5f63726564656e7469616c73206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c7565206e6f74206d756c7469706c65206f6620677765694465706f736974436f6e74726163743a20696e76616c6964207075626b6579206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f20686967684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f206c6f774465706f736974436f6e74726163743a20696e76616c6964207369676e6174757265206c656e677468a2646970667358221220230afd4b6e3551329e50f1239e08fa3ab7907b77403c4f237d9adf679e8e43cf64736f6c634300060b0033", + "balance": "0x0" + } + }, + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "baseFeePerGas": null, + "excessBlobGas": null, + "blobGasUsed": null +} diff --git a/common/docker-compose/l1/execution/geth_password.txt b/common/docker-compose/l1/execution/geth_password.txt new file mode 100644 index 000000000..e69de29bb diff --git a/common/docker-compose/l1/execution/jwtsecret b/common/docker-compose/l1/execution/jwtsecret new file mode 100644 index 000000000..9fb480ef6 --- /dev/null +++ b/common/docker-compose/l1/execution/jwtsecret @@ -0,0 +1 @@ +0xfad2709d0bb03bf0e8ba3c99bea194575d3e98863133d1af638ed056d1d59345 diff --git a/common/docker-compose/l1/execution/keystore/UTC--2022-08-19T17-38-31.257380510Z--123463a4b065722e99115d6c222f267d9cabb524 b/common/docker-compose/l1/execution/keystore/UTC--2022-08-19T17-38-31.257380510Z--123463a4b065722e99115d6c222f267d9cabb524 new file mode 100644 index 000000000..6de86c6cb --- /dev/null +++ b/common/docker-compose/l1/execution/keystore/UTC--2022-08-19T17-38-31.257380510Z--123463a4b065722e99115d6c222f267d9cabb524 @@ -0,0 +1 @@ +{"address":"123463a4b065722e99115d6c222f267d9cabb524","crypto":{"cipher":"aes-128-ctr","ciphertext":"93b90389b855889b9f91c89fd15b9bd2ae95b06fe8e2314009fc88859fc6fde9","cipherparams":{"iv":"9dc2eff7967505f0e6a40264d1511742"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"c07503bb1b66083c37527cd8f06f8c7c1443d4c724767f625743bd47ae6179a4"},"mac":"6d359be5d6c432d5bbb859484009a4bf1bd71b76e89420c380bd0593ce25a817"},"id":"622df904-0bb1-4236-b254-f1b8dfdff1ec","version":3} diff --git a/common/docker/docker_app.go b/common/docker/docker_app.go deleted file mode 100644 index 568921001..000000000 --- a/common/docker/docker_app.go +++ /dev/null @@ -1,196 +0,0 @@ -package docker - -import ( - "crypto/rand" - "database/sql" - "encoding/json" - "fmt" - "math/big" - "os" - "testing" - "time" - - "github.com/jmoiron/sqlx" - "github.com/scroll-tech/go-ethereum/ethclient" - "github.com/stretchr/testify/assert" - - "scroll-tech/database" - - "scroll-tech/common/utils" -) - -var ( - l1StartPort = 10000 - l2StartPort = 20000 - dbStartPort = 30000 -) - -// AppAPI app interface. -type AppAPI interface { - IsRunning() bool - WaitResult(t *testing.T, timeout time.Duration, keyword string) bool - RunApp(waitResult func() bool) - WaitExit() - ExpectWithTimeout(t *testing.T, parallel bool, timeout time.Duration, keyword string) -} - -// App is collection struct of runtime docker images -type App struct { - L1gethImg GethImgInstance - L2gethImg GethImgInstance - DBImg ImgInstance - - dbClient *sql.DB - DBConfig *database.DBConfig - DBConfigFile string - - // common time stamp. - Timestamp int -} - -// NewDockerApp returns new instance of dockerApp struct -func NewDockerApp() *App { - timestamp := time.Now().Nanosecond() - app := &App{ - Timestamp: timestamp, - L1gethImg: newTestL1Docker(), - L2gethImg: newTestL2Docker(), - DBImg: newTestDBDocker("postgres"), - DBConfigFile: fmt.Sprintf("/tmp/%d_db-config.json", timestamp), - } - if err := app.mockDBConfig(); err != nil { - panic(err) - } - return app -} - -// RunImages runs all images togather -func (b *App) RunImages(t *testing.T) { - b.RunDBImage(t) - b.RunL1Geth(t) - b.RunL2Geth(t) -} - -// RunDBImage starts postgres docker container. -func (b *App) RunDBImage(t *testing.T) { - if b.DBImg.IsRunning() { - return - } - assert.NoError(t, b.DBImg.Start()) - - // try 5 times until the db is ready. - ok := utils.TryTimes(10, func() bool { - db, err := sqlx.Open("postgres", b.DBImg.Endpoint()) - return err == nil && db != nil && db.Ping() == nil - }) - assert.True(t, ok) -} - -// Free clear all running images, double check and recycle docker container. -func (b *App) Free() { - if b.L1gethImg.IsRunning() { - _ = b.L1gethImg.Stop() - } - if b.L2gethImg.IsRunning() { - _ = b.L2gethImg.Stop() - } - if b.DBImg.IsRunning() { - _ = b.DBImg.Stop() - _ = os.Remove(b.DBConfigFile) - if !utils.IsNil(b.dbClient) { - _ = b.dbClient.Close() - b.dbClient = nil - } - } -} - -// RunL1Geth starts l1geth docker container. -func (b *App) RunL1Geth(t *testing.T) { - if b.L1gethImg.IsRunning() { - return - } - assert.NoError(t, b.L1gethImg.Start()) -} - -// L1Client returns a ethclient by dialing running l1geth -func (b *App) L1Client() (*ethclient.Client, error) { - if utils.IsNil(b.L1gethImg) { - return nil, fmt.Errorf("l1 geth is not running") - } - client, err := ethclient.Dial(b.L1gethImg.Endpoint()) - if err != nil { - return nil, err - } - return client, nil -} - -// RunL2Geth starts l2geth docker container. -func (b *App) RunL2Geth(t *testing.T) { - if b.L2gethImg.IsRunning() { - return - } - assert.NoError(t, b.L2gethImg.Start()) -} - -// L2Client returns a ethclient by dialing running l2geth -func (b *App) L2Client() (*ethclient.Client, error) { - if utils.IsNil(b.L2gethImg) { - return nil, fmt.Errorf("l2 geth is not running") - } - client, err := ethclient.Dial(b.L2gethImg.Endpoint()) - if err != nil { - return nil, err - } - return client, nil -} - -// DBClient create and return *sql.DB instance. -func (b *App) DBClient(t *testing.T) *sql.DB { - if !utils.IsNil(b.dbClient) { - return b.dbClient - } - var ( - cfg = b.DBConfig - err error - ) - b.dbClient, err = sql.Open(cfg.DriverName, cfg.DSN) - assert.NoError(t, err) - b.dbClient.SetMaxOpenConns(cfg.MaxOpenNum) - b.dbClient.SetMaxIdleConns(cfg.MaxIdleNum) - assert.NoError(t, b.dbClient.Ping()) - return b.dbClient -} - -func (b *App) mockDBConfig() error { - b.DBConfig = &database.DBConfig{ - DSN: "", - DriverName: "postgres", - MaxOpenNum: 200, - MaxIdleNum: 20, - } - - if b.DBImg != nil { - b.DBConfig.DSN = b.DBImg.Endpoint() - } - data, err := json.Marshal(b.DBConfig) - if err != nil { - return err - } - - return os.WriteFile(b.DBConfigFile, data, 0644) //nolint:gosec -} - -func newTestL1Docker() GethImgInstance { - id, _ := rand.Int(rand.Reader, big.NewInt(2000)) - return NewImgGeth("scroll_l1geth", "", "", 0, l1StartPort+int(id.Int64())) -} - -func newTestL2Docker() GethImgInstance { - id, _ := rand.Int(rand.Reader, big.NewInt(2000)) - return NewImgGeth("scroll_l2geth", "", "", 0, l2StartPort+int(id.Int64())) -} - -func newTestDBDocker(driverName string) ImgInstance { - id, _ := rand.Int(rand.Reader, big.NewInt(2000)) - return NewImgDB(driverName, "123456", "test_db", dbStartPort+int(id.Int64())) -} diff --git a/common/docker/docker_db.go b/common/docker/docker_db.go deleted file mode 100644 index 762013851..000000000 --- a/common/docker/docker_db.go +++ /dev/null @@ -1,132 +0,0 @@ -package docker - -import ( - "context" - "fmt" - "strings" - "time" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/container" - - "scroll-tech/common/cmd" - "scroll-tech/common/utils" -) - -// ImgDB the postgres image manager. -type ImgDB struct { - image string - name string - id string - - dbName string - port int - password string - - running bool - cmd *cmd.Cmd -} - -// NewImgDB return postgres db img instance. -func NewImgDB(image, password, dbName string, port int) ImgInstance { - img := &ImgDB{ - image: image, - name: fmt.Sprintf("%s-%s_%d", image, dbName, port), - password: password, - dbName: dbName, - port: port, - } - img.cmd = cmd.NewCmd("docker", img.prepare()...) - return img -} - -// Start postgres db container. -func (i *ImgDB) Start() error { - id := GetContainerID(i.name) - if id != "" { - return fmt.Errorf("container already exist, name: %s", i.name) - } - i.running = i.isOk() - if !i.running { - _ = i.Stop() - return fmt.Errorf("failed to start image: %s", i.image) - } - return nil -} - -// Stop the container. -func (i *ImgDB) Stop() error { - if !i.running { - return nil - } - i.running = false - - ctx := context.Background() - // stop the running container. - if i.id == "" { - i.id = GetContainerID(i.name) - } - - timeoutSec := 3 - timeout := container.StopOptions{ - Timeout: &timeoutSec, - } - if err := cli.ContainerStop(ctx, i.id, timeout); err != nil { - return err - } - // remove the stopped container. - return cli.ContainerRemove(ctx, i.id, types.ContainerRemoveOptions{}) -} - -// Endpoint return the dsn. -func (i *ImgDB) Endpoint() string { - return fmt.Sprintf("postgres://postgres:%s@localhost:%d/%s?sslmode=disable", i.password, i.port, i.dbName) -} - -// IsRunning returns docker container's running status. -func (i *ImgDB) IsRunning() bool { - return i.running -} - -func (i *ImgDB) prepare() []string { - cmd := []string{"run", "--rm", "--name", i.name, "-p", fmt.Sprintf("%d:5432", i.port)} - envs := []string{ - "-e", "POSTGRES_PASSWORD=" + i.password, - "-e", fmt.Sprintf("POSTGRES_DB=%s", i.dbName), - } - - cmd = append(cmd, envs...) - return append(cmd, i.image) -} - -func (i *ImgDB) isOk() bool { - keyword := "database system is ready to accept connections" - okCh := make(chan struct{}, 1) - i.cmd.RegistFunc(keyword, func(buf string) { - if strings.Contains(buf, keyword) { - select { - case okCh <- struct{}{}: - default: - return - } - } - }) - defer i.cmd.UnRegistFunc(keyword) - // Start cmd in parallel. - i.cmd.RunCmd(true) - - select { - case <-okCh: - utils.TryTimes(20, func() bool { - i.id = GetContainerID(i.name) - return i.id != "" - }) - case err := <-i.cmd.ErrChan: - if err != nil { - fmt.Printf("failed to start %s, err: %v\n", i.name, err) - } - case <-time.After(time.Second * 20): - return false - } - return i.id != "" -} diff --git a/common/docker/docker_geth.go b/common/docker/docker_geth.go deleted file mode 100644 index f7203e1f7..000000000 --- a/common/docker/docker_geth.go +++ /dev/null @@ -1,175 +0,0 @@ -package docker - -import ( - "context" - "fmt" - "math/big" - "strconv" - "strings" - "time" - - "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/container" - "github.com/scroll-tech/go-ethereum/ethclient" - - "scroll-tech/common/cmd" - "scroll-tech/common/utils" -) - -// ImgGeth the geth image manager include l1geth and l2geth. -type ImgGeth struct { - image string - name string - id string - - volume string - ipcPath string - httpPort int - wsPort int - chainID *big.Int - - running bool - cmd *cmd.Cmd -} - -// NewImgGeth return geth img instance. -func NewImgGeth(image, volume, ipc string, hPort, wPort int) GethImgInstance { - img := &ImgGeth{ - image: image, - name: fmt.Sprintf("%s-%d", image, time.Now().Nanosecond()), - volume: volume, - ipcPath: ipc, - httpPort: hPort, - wsPort: wPort, - } - img.cmd = cmd.NewCmd("docker", img.params()...) - return img -} - -// Start run image and check if it is running healthily. -func (i *ImgGeth) Start() error { - id := GetContainerID(i.name) - if id != "" { - return fmt.Errorf("container already exist, name: %s", i.name) - } - i.running = i.isOk() - if !i.running { - _ = i.Stop() - return fmt.Errorf("failed to start image: %s", i.image) - } - - // try 10 times to get chainID until is ok. - utils.TryTimes(10, func() bool { - client, err := ethclient.Dial(i.Endpoint()) - if err == nil && client != nil { - i.chainID, err = client.ChainID(context.Background()) - return err == nil && i.chainID != nil - } - return false - }) - - return nil -} - -// IsRunning returns docker container's running status. -func (i *ImgGeth) IsRunning() bool { - return i.running -} - -// Endpoint return the connection endpoint. -func (i *ImgGeth) Endpoint() string { - switch true { - case i.httpPort != 0: - return fmt.Sprintf("http://127.0.0.1:%d", i.httpPort) - case i.wsPort != 0: - return fmt.Sprintf("ws://127.0.0.1:%d", i.wsPort) - default: - return i.ipcPath - } -} - -// ChainID return chainID. -func (i *ImgGeth) ChainID() *big.Int { - return i.chainID -} - -func (i *ImgGeth) isOk() bool { - keyword := "WebSocket enabled" - okCh := make(chan struct{}, 1) - i.cmd.RegistFunc(keyword, func(buf string) { - if strings.Contains(buf, keyword) { - select { - case okCh <- struct{}{}: - default: - return - } - } - }) - defer i.cmd.UnRegistFunc(keyword) - // Start cmd in parallel. - i.cmd.RunCmd(true) - - select { - case <-okCh: - utils.TryTimes(20, func() bool { - i.id = GetContainerID(i.name) - return i.id != "" - }) - case err := <-i.cmd.ErrChan: - if err != nil { - fmt.Printf("failed to start %s, err: %v\n", i.name, err) - } - case <-time.After(time.Second * 10): - return false - } - return i.id != "" -} - -// Stop the docker container. -func (i *ImgGeth) Stop() error { - if !i.running { - return nil - } - i.running = false - - ctx := context.Background() - // check if container is running, stop the running container. - id := GetContainerID(i.name) - if id != "" { - timeoutSec := 3 - timeout := container.StopOptions{ - Timeout: &timeoutSec, - } - if err := cli.ContainerStop(ctx, id, timeout); err != nil { - return err - } - i.id = id - } - // remove the stopped container. - return cli.ContainerRemove(ctx, i.id, types.ContainerRemoveOptions{}) -} - -func (i *ImgGeth) params() []string { - cmds := []string{"run", "--rm", "--name", i.name} - var ports []string - if i.httpPort != 0 { - ports = append(ports, []string{"-p", strconv.Itoa(i.httpPort) + ":8545"}...) - } - if i.wsPort != 0 { - ports = append(ports, []string{"-p", strconv.Itoa(i.wsPort) + ":8546"}...) - } - - var envs []string - if i.ipcPath != "" { - envs = append(envs, []string{"-e", fmt.Sprintf("IPC_PATH=%s", i.ipcPath)}...) - } - - if i.volume != "" { - cmds = append(cmds, []string{"-v", fmt.Sprintf("%s:%s", i.volume, i.volume)}...) - } - - cmds = append(cmds, ports...) - cmds = append(cmds, envs...) - - return append(cmds, i.image) -} diff --git a/common/docker/docker_test.go b/common/docker/docker_test.go deleted file mode 100644 index f1f978fff..000000000 --- a/common/docker/docker_test.go +++ /dev/null @@ -1,54 +0,0 @@ -package docker_test - -import ( - "context" - "testing" - - "github.com/jmoiron/sqlx" - _ "github.com/lib/pq" //nolint:golint - "github.com/stretchr/testify/assert" - - "scroll-tech/common/docker" -) - -var ( - base *docker.App -) - -func TestMain(m *testing.M) { - base = docker.NewDockerApp() - - m.Run() - - base.Free() -} - -func TestDB(t *testing.T) { - base.RunDBImage(t) - - db, err := sqlx.Open("postgres", base.DBImg.Endpoint()) - assert.NoError(t, err) - assert.NoError(t, db.Ping()) -} - -func TestL1Geth(t *testing.T) { - base.RunL1Geth(t) - - client, err := base.L1Client() - assert.NoError(t, err) - - chainID, err := client.ChainID(context.Background()) - assert.NoError(t, err) - t.Logf("chainId: %s", chainID.String()) -} - -func TestL2Geth(t *testing.T) { - base.RunL2Geth(t) - - client, err := base.L2Client() - assert.NoError(t, err) - - chainID, err := client.ChainID(context.Background()) - assert.NoError(t, err) - t.Logf("chainId: %s", chainID.String()) -} diff --git a/common/docker/interface.go b/common/docker/interface.go index f1ba2c4b4..4457d715b 100644 --- a/common/docker/interface.go +++ b/common/docker/interface.go @@ -4,7 +4,7 @@ import ( "context" "math/big" - "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/filters" "github.com/docker/docker/client" ) @@ -40,7 +40,7 @@ type GethImgInstance interface { func GetContainerID(name string) string { filter := filters.NewArgs() filter.Add("name", name) - lst, _ := cli.ContainerList(context.Background(), types.ContainerListOptions{ + lst, _ := cli.ContainerList(context.Background(), container.ListOptions{ Filters: filter, }) if len(lst) > 0 { diff --git a/common/docker/l1geth/Dockerfile b/common/docker/l1geth/Dockerfile index 1cffee7cb..886227fed 100644 --- a/common/docker/l1geth/Dockerfile +++ b/common/docker/l1geth/Dockerfile @@ -1,4 +1,4 @@ -FROM ethereum/client-go +FROM ethereum/client-go:v1.13.14 COPY password /l1geth/ COPY genesis.json /l1geth/ diff --git a/common/docker/l2geth/genesis.json b/common/docker/l2geth/genesis.json index d5413cf0c..c4689c3b5 100644 --- a/common/docker/l2geth/genesis.json +++ b/common/docker/l2geth/genesis.json @@ -15,7 +15,7 @@ "archimedesBlock": 0, "shanghaiBlock": 0, "clique": { - "period": 3, + "period": 1, "epoch": 30000 }, "scroll": { diff --git a/common/forks/forks.go b/common/forks/forks.go new file mode 100644 index 000000000..ae6e165c3 --- /dev/null +++ b/common/forks/forks.go @@ -0,0 +1,89 @@ +package forks + +import ( + "math" + "math/big" + "sort" + + "github.com/scroll-tech/go-ethereum/params" +) + +// CollectSortedForkHeights returns a sorted set of block numbers that one or more forks are activated on +func CollectSortedForkHeights(config *params.ChainConfig) ([]uint64, map[uint64]bool, map[string]uint64) { + type nameFork struct { + name string + block *big.Int + } + + forkHeightNameMap := make(map[uint64]string) + + for _, fork := range []nameFork{ + {name: "homestead", block: config.HomesteadBlock}, + {name: "daoFork", block: config.DAOForkBlock}, + {name: "eip150", block: config.EIP150Block}, + {name: "eip155", block: config.EIP155Block}, + {name: "eip158", block: config.EIP158Block}, + {name: "byzantium", block: config.ByzantiumBlock}, + {name: "constantinople", block: config.ConstantinopleBlock}, + {name: "petersburg", block: config.PetersburgBlock}, + {name: "istanbul", block: config.IstanbulBlock}, + {name: "muirGlacier", block: config.MuirGlacierBlock}, + {name: "berlin", block: config.BerlinBlock}, + {name: "london", block: config.LondonBlock}, + {name: "arrowGlacier", block: config.ArrowGlacierBlock}, + {name: "archimedes", block: config.ArchimedesBlock}, + {name: "shanghai", block: config.ShanghaiBlock}, + {name: "bernoulli", block: config.BernoulliBlock}, + {name: "curie", block: config.CurieBlock}, + } { + if fork.block == nil { + continue + } + height := fork.block.Uint64() + + // only keep latest fork for at each height, discard the rest + forkHeightNameMap[height] = fork.name + } + + forkHeightsMap := make(map[uint64]bool) + forkNameHeightMap := make(map[string]uint64) + + for height, name := range forkHeightNameMap { + forkHeightsMap[height] = true + forkNameHeightMap[name] = height + } + + var forkHeights []uint64 + for height := range forkHeightsMap { + forkHeights = append(forkHeights, height) + } + sort.Slice(forkHeights, func(i, j int) bool { + return forkHeights[i] < forkHeights[j] + }) + return forkHeights, forkHeightsMap, forkNameHeightMap +} + +// BlocksUntilFork returns the number of blocks until the next fork +// returns 0 if there is no fork scheduled for the future +func BlocksUntilFork(blockHeight uint64, forkHeights []uint64) uint64 { + for _, forkHeight := range forkHeights { + if forkHeight > blockHeight { + return forkHeight - blockHeight + } + } + return 0 +} + +// BlockRange returns the block range of the hard fork +// Need ensure the forkHeights is incremental +func BlockRange(currentForkHeight uint64, forkHeights []uint64) (from, to uint64) { + to = math.MaxInt64 + for _, height := range forkHeights { + if currentForkHeight < height { + to = height + return + } + from = height + } + return +} diff --git a/common/forks/forks_test.go b/common/forks/forks_test.go new file mode 100644 index 000000000..73a75a7a0 --- /dev/null +++ b/common/forks/forks_test.go @@ -0,0 +1,142 @@ +package forks + +import ( + "math" + "math/big" + "testing" + + "github.com/scroll-tech/go-ethereum/params" + "github.com/stretchr/testify/require" +) + +func TestCollectSortedForkBlocks(t *testing.T) { + l, m, n := CollectSortedForkHeights(¶ms.ChainConfig{ + ArchimedesBlock: big.NewInt(0), + ShanghaiBlock: big.NewInt(3), + BernoulliBlock: big.NewInt(3), + CurieBlock: big.NewInt(4), + }) + require.Equal(t, l, []uint64{ + 0, + 3, + 4, + }) + require.Equal(t, map[uint64]bool{ + 3: true, + 4: true, + 0: true, + }, m) + require.Equal(t, map[string]uint64{ + "archimedes": 0, + "bernoulli": 3, + "curie": 4, + }, n) +} + +func TestBlocksUntilFork(t *testing.T) { + tests := map[string]struct { + block uint64 + forks []uint64 + expected uint64 + }{ + "NoFork": { + block: 44, + forks: []uint64{}, + expected: 0, + }, + "BeforeFork": { + block: 0, + forks: []uint64{1, 5}, + expected: 1, + }, + "OnFork": { + block: 1, + forks: []uint64{1, 5}, + expected: 4, + }, + "OnLastFork": { + block: 5, + forks: []uint64{1, 5}, + expected: 0, + }, + "AfterFork": { + block: 5, + forks: []uint64{1, 5}, + expected: 0, + }, + } + + for name, test := range tests { + t.Run(name, func(t *testing.T) { + require.Equal(t, test.expected, BlocksUntilFork(test.block, test.forks)) + }) + } +} + +func TestBlockRange(t *testing.T) { + tests := []struct { + name string + forkHeight uint64 + forkHeights []uint64 + expectedFrom uint64 + expectedTo uint64 + }{ + { + name: "ToInfinite", + forkHeight: 300, + forkHeights: []uint64{100, 200, 300}, + expectedFrom: 300, + expectedTo: math.MaxInt64, + }, + { + name: "To300", + forkHeight: 200, + forkHeights: []uint64{100, 200, 300}, + expectedFrom: 200, + expectedTo: 300, + }, + { + name: "To200", + forkHeight: 100, + forkHeights: []uint64{100, 200, 300}, + expectedFrom: 100, + expectedTo: 200, + }, + { + name: "To100", + forkHeight: 0, + forkHeights: []uint64{100, 200, 300}, + expectedFrom: 0, + expectedTo: 100, + }, + { + name: "To200-1", + forkHeight: 100, + forkHeights: []uint64{100, 200}, + expectedFrom: 100, + expectedTo: 200, + }, + { + name: "To2", + forkHeight: 1, + forkHeights: []uint64{1, 2}, + expectedFrom: 1, + expectedTo: 2, + }, + { + name: "ToInfinite-1", + forkHeight: 0, + forkHeights: []uint64{0}, + expectedFrom: 0, + expectedTo: math.MaxInt64, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + from, to := BlockRange(test.forkHeight, test.forkHeights) + require.Equal(t, test.expectedFrom, from) + require.Equal(t, test.expectedTo, to) + }) + } +} diff --git a/common/go.mod b/common/go.mod index f574f6b75..dc0985f7e 100644 --- a/common/go.mod +++ b/common/go.mod @@ -1,111 +1,266 @@ module scroll-tech/common -go 1.20 +go 1.21 require ( + github.com/Masterminds/semver/v3 v3.2.1 github.com/bits-and-blooms/bitset v1.12.0 - github.com/docker/docker v24.0.7+incompatible + github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004 + github.com/docker/docker v25.0.3+incompatible github.com/gin-contrib/pprof v1.4.0 github.com/gin-gonic/gin v1.9.1 - github.com/jmoiron/sqlx v1.3.5 - github.com/lib/pq v1.10.9 github.com/mattn/go-colorable v0.1.13 github.com/mattn/go-isatty v0.0.20 github.com/modern-go/reflect2 v1.0.2 github.com/orcaman/concurrent-map v1.0.0 - github.com/prometheus/client_golang v1.14.0 - github.com/scroll-tech/go-ethereum v1.10.14-0.20231130005111-38a3a9c9198c - github.com/stretchr/testify v1.8.4 + github.com/prometheus/client_golang v1.16.0 + github.com/scroll-tech/go-ethereum v1.10.14-0.20240326144132-0f0cd99f7a2e + github.com/stretchr/testify v1.9.0 + github.com/testcontainers/testcontainers-go v0.28.0 + github.com/testcontainers/testcontainers-go/modules/compose v0.28.0 + github.com/testcontainers/testcontainers-go/modules/postgres v0.28.0 github.com/urfave/cli/v2 v2.25.7 gorm.io/driver/postgres v1.5.0 gorm.io/gorm v1.25.5 ) require ( + dario.cat/mergo v1.0.0 // indirect + github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect + github.com/AlecAivazis/survey/v2 v2.3.7 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/Microsoft/hcsshim v0.11.4 // indirect github.com/VictoriaMetrics/fastcache v1.12.1 // indirect + github.com/aws/aws-sdk-go-v2 v1.17.6 // indirect + github.com/aws/aws-sdk-go-v2/config v1.18.16 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.13.16 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.24 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.30 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.24 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.3.31 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.24 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.12.5 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.5 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.18.6 // indirect + github.com/aws/smithy-go v1.13.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/btcsuite/btcd v0.20.1-beta // indirect + github.com/buger/goterm v1.0.4 // indirect github.com/bytedance/sonic v1.10.1 // indirect + github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect github.com/chenzhuoyu/iasm v0.9.0 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect + github.com/compose-spec/compose-go/v2 v2.0.0-rc.2 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/containerd/console v1.0.3 // indirect + github.com/containerd/containerd v1.7.12 // indirect + github.com/containerd/continuity v0.4.2 // indirect + github.com/containerd/log v0.1.0 // indirect + github.com/containerd/typeurl/v2 v2.1.1 // indirect + github.com/cpuguy83/dockercfg v0.3.1 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect + github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/deckarep/golang-set v1.8.0 // indirect - github.com/docker/distribution v2.8.2+incompatible // indirect - github.com/docker/go-connections v0.4.0 // indirect + github.com/distribution/reference v0.5.0 // indirect + github.com/docker/buildx v0.12.0-rc2.0.20231219140829-617f538cb315 // indirect + github.com/docker/cli v25.0.1+incompatible // indirect + github.com/docker/compose/v2 v2.24.3 // indirect + github.com/docker/distribution v2.8.3+incompatible // indirect + github.com/docker/docker-credential-helpers v0.8.0 // indirect + github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c // indirect + github.com/docker/go-connections v0.5.0 // indirect + github.com/docker/go-metrics v0.0.1 // indirect github.com/docker/go-units v0.5.0 // indirect + github.com/edsrzf/mmap-go v1.0.0 // indirect + github.com/emicklei/go-restful/v3 v3.10.1 // indirect + github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fjl/memsize v0.0.2 // indirect + github.com/fsnotify/fsevents v0.1.1 // indirect + github.com/fvbommel/sortorder v1.0.2 // indirect github.com/gabriel-vasile/mimetype v1.4.2 // indirect + github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff // indirect github.com/gin-contrib/sse v0.1.0 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-openapi/jsonpointer v0.19.5 // indirect + github.com/go-openapi/jsonreference v0.20.0 // indirect + github.com/go-openapi/swag v0.19.14 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.15.5 // indirect github.com/go-sql-driver/mysql v1.7.1 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/goccy/go-json v0.10.2 // indirect + github.com/gofrs/flock v0.8.1 // indirect + github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/gnostic v0.5.7-v3refs // indirect github.com/google/go-cmp v0.6.0 // indirect - github.com/google/uuid v1.4.0 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/mux v1.8.1 // indirect github.com/gorilla/websocket v1.5.0 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-bexpr v0.1.10 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-version v1.6.0 // indirect + github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect + github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/holiman/uint256 v1.2.4 // indirect github.com/huin/goupnp v1.3.0 // indirect github.com/iden3/go-iden3-crypto v0.0.15 // indirect + github.com/imdario/mergo v0.3.16 // indirect + github.com/in-toto/in-toto-golang v0.5.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect - github.com/jackc/pgx/v5 v5.5.0 // indirect + github.com/jackc/pgx/v5 v5.5.4 // indirect github.com/jackc/puddle/v2 v2.2.1 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect + github.com/jonboulle/clockwork v0.4.0 // indirect + github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect + github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect + github.com/klauspost/compress v1.17.4 // indirect github.com/klauspost/cpuid/v2 v2.2.5 // indirect - github.com/kr/pretty v0.3.1 // indirect github.com/leodido/go-urn v1.2.4 // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect - github.com/mattn/go-sqlite3 v1.14.16 // indirect + github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/mailru/easyjson v0.7.6 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/mattn/go-shellwords v1.0.12 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect + github.com/miekg/pkcs11 v1.1.1 // indirect + github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mitchellh/pointerstructure v1.2.0 // indirect + github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect + github.com/moby/buildkit v0.13.0-beta1.0.20231219135447-957cb50df991 // indirect + github.com/moby/locker v1.0.1 // indirect + github.com/moby/patternmatcher v0.6.0 // indirect + github.com/moby/spdystream v0.2.0 // indirect + github.com/moby/sys/mountinfo v0.7.1 // indirect + github.com/moby/sys/sequential v0.5.0 // indirect + github.com/moby/sys/signal v0.7.0 // indirect + github.com/moby/sys/symlink v0.2.0 // indirect + github.com/moby/sys/user v0.1.0 // indirect github.com/moby/term v0.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/morikuni/aec v1.0.0 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/onsi/ginkgo v1.16.5 // indirect + github.com/onsi/ginkgo/v2 v2.8.1 // indirect + github.com/onsi/gomega v1.27.1 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.1.0-rc5 // indirect + github.com/opencontainers/image-spec v1.1.0 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.1.0 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.39.0 // indirect + github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/prometheus/client_model v0.4.0 // indirect + github.com/prometheus/common v0.42.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect + github.com/prometheus/tsdb v0.7.1 // indirect github.com/rivo/uniseg v0.4.4 // indirect github.com/rjeczalik/notify v0.9.1 // indirect - github.com/rogpeppe/go-internal v1.10.0 // indirect + github.com/rs/cors v1.7.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/scroll-tech/zktrie v0.7.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.4.0 // indirect + github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002 // indirect + github.com/shibumi/go-pathspec v1.3.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect + github.com/shirou/gopsutil/v3 v3.23.12 // indirect + github.com/shoenig/go-m1cpu v0.1.6 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/spf13/cobra v1.8.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect github.com/status-im/keycard-go v0.2.0 // indirect + github.com/supranational/blst v0.3.11-0.20230124161941-ca03e11a3ff2 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect + github.com/theupdateframework/notary v0.7.0 // indirect + github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect + github.com/tonistiigi/fsutil v0.0.0-20230825212630-f09800878302 // indirect + github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea // indirect + github.com/tonistiigi/vt100 v0.0.0-20230623042737-f9a4f7ef6531 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/tyler-smith/go-bip39 v1.1.0 // indirect github.com/ugorji/go/codec v1.2.11 // indirect + github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect + github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect + github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.45.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.45.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0 // indirect + go.opentelemetry.io/otel v1.24.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.42.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 // indirect + go.opentelemetry.io/otel/exporters/prometheus v0.42.0 // indirect + go.opentelemetry.io/otel/metric v1.24.0 // indirect + go.opentelemetry.io/otel/sdk v1.24.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect + go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.opentelemetry.io/proto/otlp v1.0.0 // indirect + go.uber.org/mock v0.4.0 // indirect golang.org/x/arch v0.5.0 // indirect - golang.org/x/crypto v0.16.0 // indirect - golang.org/x/mod v0.14.0 // indirect + golang.org/x/crypto v0.17.0 // indirect + golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 // indirect + golang.org/x/mod v0.16.0 // indirect golang.org/x/net v0.18.0 // indirect - golang.org/x/sync v0.5.0 // indirect - golang.org/x/sys v0.15.0 // indirect + golang.org/x/oauth2 v0.11.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.17.0 // indirect + golang.org/x/term v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.15.0 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 // indirect + google.golang.org/grpc v1.59.0 // indirect google.golang.org/protobuf v1.31.0 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + gopkg.in/urfave/cli.v1 v1.20.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - gotest.tools/v3 v3.4.0 // indirect + k8s.io/api v0.26.7 // indirect + k8s.io/apimachinery v0.26.7 // indirect + k8s.io/apiserver v0.26.7 // indirect + k8s.io/client-go v0.26.7 // indirect + k8s.io/klog/v2 v2.90.1 // indirect + k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 // indirect + k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5 // indirect + rsc.io/tmplfunc v0.0.3 // indirect + sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect + sigs.k8s.io/yaml v1.3.0 // indirect + tags.cncf.io/container-device-interface v0.6.2 // indirect ) diff --git a/common/go.sum b/common/go.sum index 50a9f89dc..adb41db47 100644 --- a/common/go.sum +++ b/common/go.sum @@ -1,15 +1,79 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.110.10 h1:LXy9GEO+timppncPIAZoOj3l58LIU9k+kn48AN7IO3Y= +cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= +cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= +github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0 h1:59MxjQVfjXsBpLy+dbd2/ELV5ofnUkUZBvWSC85sheA= +github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0/go.mod h1:OahwfttHWG6eJ0clwcfBAHoDI6X/LV/15hx/wlMZSrU= +github.com/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ= +github.com/AlecAivazis/survey/v2 v2.3.7/go.mod h1:xUTIdE4KCOIjsBAE1JYsUPoCqYdZ1reCfTwbto0Fduo= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0= +github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8= +github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w= +github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s= +github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/Shopify/logrus-bugsnag v0.0.0-20170309145241-6dbc35f2c30d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/anchore/go-struct-converter v0.0.0-20221118182256-c68fdcfa2092 h1:aM1rlcoLz8y5B2r4tTLMiVTrMtpfY0O8EScKJxaSaEc= +github.com/anchore/go-struct-converter v0.0.0-20221118182256-c68fdcfa2092/go.mod h1:rYqSE9HbjzpHTI74vwPvae4ZVYZd1lue2ta6xHPdblA= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/aws/aws-sdk-go-v2 v1.17.6 h1:Y773UK7OBqhzi5VDXMi1zVGsoj+CVHs2eaC2bDsLwi0= +github.com/aws/aws-sdk-go-v2 v1.17.6/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= +github.com/aws/aws-sdk-go-v2/config v1.18.16 h1:4r7gsCu8Ekwl5iJGE/GmspA2UifqySCCkyyyPFeWs3w= +github.com/aws/aws-sdk-go-v2/config v1.18.16/go.mod h1:XjM6lVbq7UgELp9NjXBrb1DQY/ownlWsvDhEQksemJc= +github.com/aws/aws-sdk-go-v2/credentials v1.13.16 h1:GgToSxaENX/1zXIGNFfiVk4hxryYJ5Vt4Mh8XLAL7Lc= +github.com/aws/aws-sdk-go-v2/credentials v1.13.16/go.mod h1:KP7aFJhfwPFgx9aoVYL2nYHjya5WBD98CWaadpgmnpY= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.24 h1:5qyqXASrX2zy5cTnoHHa4N2c3Lc94GH7gjnBP3GwKdU= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.24/go.mod h1:neYVaeKr5eT7BzwULuG2YbLhzWZ22lpjKdCybR7AXrQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.30 h1:y+8n9AGDjikyXoMBTRaHHHSaFEB8267ykmvyPodJfys= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.30/go.mod h1:LUBAO3zNXQjoONBKn/kR1y0Q4cj/D02Ts0uHYjcCQLM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.24 h1:r+Kv+SEJquhAZXaJ7G4u44cIwXV3f8K+N482NNAzJZA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.24/go.mod h1:gAuCezX/gob6BSMbItsSlMb6WZGV7K2+fWOvk8xBSto= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.31 h1:hf+Vhp5WtTdcSdE+yEcUz8L73sAzN0R+0jQv+Z51/mI= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.31/go.mod h1:5zUjguZfG5qjhG9/wqmuyHRyUftl2B5Cp6NNxNC6kRA= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.24 h1:c5qGfdbCHav6viBwiyDns3OXqhqAbGjfIB4uVu2ayhk= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.24/go.mod h1:HMA4FZG6fyib+NDo5bpIxX1EhYjrAOveZJY2YR0xrNE= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.5 h1:bdKIX6SVF3nc3xJFw6Nf0igzS6Ff/louGq8Z6VP/3Hs= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.5/go.mod h1:vuWiaDB30M/QTC+lI3Wj6S/zb7tpUK2MSYgy3Guh2L0= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.5 h1:xLPZMyuZ4GuqRCIec/zWuIhRFPXh2UOJdLXBSi64ZWQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.5/go.mod h1:QjxpHmCwAg0ESGtPQnLIVp7SedTOBMYy+Slr3IfMKeI= +github.com/aws/aws-sdk-go-v2/service/sts v1.18.6 h1:rIFn5J3yDoeuKCE9sESXqM5POTAhOP1du3bv/qTL+tE= +github.com/aws/aws-sdk-go-v2/service/sts v1.18.6/go.mod h1:48WJ9l3dwP0GSHWGc5sFGGlCkuA82Mc2xnw+T6Q8aDw= +github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= +github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/beorn7/perks v0.0.0-20150223135152-b965b613227f/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bitly/go-hostpool v0.1.0/go.mod h1:4gOCgp6+NZnVqlKyZ/iBZFTAJKembaVENUpMkpg42fw= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= github.com/bits-and-blooms/bitset v1.12.0 h1:U/q1fAF7xXRhFCrhROzIfffYnu+dlS38vCZtmFVPHmA= github.com/bits-and-blooms/bitset v1.12.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/btcsuite/btcd v0.20.1-beta h1:Ik4hyJqN8Jfyv3S4AGBOmyouMsYE3EdYODkMbQjwPGw= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= @@ -19,11 +83,24 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/buger/goterm v1.0.4 h1:Z9YvGmOih81P0FbVtEYTFF6YsSgxSUKEhf/f9bTMXbY= +github.com/buger/goterm v1.0.4/go.mod h1:HiFWV3xnkolgrBV3mY8m0X0Pumt4zg4QhbdOzQtB8tE= +github.com/bugsnag/bugsnag-go v1.0.5-0.20150529004307-13fd6b8acda0 h1:s7+5BfS4WFJoVF9pnB8kBk03S7pZXRdKamnV0FOl5Sc= +github.com/bugsnag/bugsnag-go v1.0.5-0.20150529004307-13fd6b8acda0/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembjv71DPz3uX/V/6MMlSyD9JBQ6kQ= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM= github.com/bytedance/sonic v1.10.1 h1:7a1wuFXL1cMy7a3f7/VFcEtriuXQnUBhtoVfOZiaysc= github.com/bytedance/sonic v1.10.1/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= +github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= +github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= @@ -32,29 +109,121 @@ github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA= github.com/chenzhuoyu/iasm v0.9.0 h1:9fhXjVzq5hUy2gkhhgHl95zG2cEAhw9OSGs8toWWAwo= github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004 h1:lkAMpLVBDaj17e85keuznYcH5rqI438v41pKcBl4ZxQ= +github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004/go.mod h1:yMWuSON2oQp+43nFtAV/uvKQIFpSPerB57DCt9t8sSA= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= +github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE= +github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= +github.com/compose-spec/compose-go/v2 v2.0.0-rc.2 h1:eJ01FpliL/02KvsaPyH1bSLbM1S70yWQUojHVRbyvy4= +github.com/compose-spec/compose-go/v2 v2.0.0-rc.2/go.mod h1:IVsvFyGVhw4FASzUtlWNVaAOhYmakXAFY9IlZ7LAuD8= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= +github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= +github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= +github.com/containerd/containerd v1.7.12 h1:+KQsnv4VnzyxWcfO9mlxxELaoztsDEjOuCMPAuPqgU0= +github.com/containerd/containerd v1.7.12/go.mod h1:/5OMpE1p0ylxtEUGY8kuCYkDRzJm9NO1TFMWjUpdevk= +github.com/containerd/continuity v0.4.2 h1:v3y/4Yz5jwnvqPKJJ+7Wf93fyWoCB3F5EclWG023MDM= +github.com/containerd/continuity v0.4.2/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= +github.com/containerd/fifo v1.1.0 h1:4I2mbh5stb1u6ycIABlBw9zgtlK8viPI9QkQNRQEEmY= +github.com/containerd/fifo v1.1.0/go.mod h1:bmC4NWMbXlt2EZ0Hc7Fx7QzTFxgPID13eH0Qu+MAb2o= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/containerd/nydus-snapshotter v0.13.1 h1:5XNkCZ9ivLXCcyx3Jbbfh/fntkcls69uBg0x9VE8zlk= +github.com/containerd/nydus-snapshotter v0.13.1/go.mod h1:XWAz9ytsjBuKPVXDKP3xoMlcSKNsGnjXlEup6DuzUIo= +github.com/containerd/stargz-snapshotter v0.14.3 h1:OTUVZoPSPs8mGgmQUE1dqw3WX/3nrsmsurW7UPLWl1U= +github.com/containerd/stargz-snapshotter/estargz v0.14.3 h1:OqlDCK3ZVUO6C3B/5FSkDwbkEETK84kQgEeFwDC+62k= +github.com/containerd/stargz-snapshotter/estargz v0.14.3/go.mod h1:KY//uOCIkSuNAHhJogcZtrNHdKrA99/FCCRjE3HD36o= +github.com/containerd/ttrpc v1.2.2 h1:9vqZr0pxwOF5koz6N0N3kJ0zDHokrcPxIR/ZR2YFtOs= +github.com/containerd/ttrpc v1.2.2/go.mod h1:sIT6l32Ph/H9cvnJsfXM5drIVzTr5A2flTf1G5tYZak= +github.com/containerd/typeurl/v2 v2.1.1 h1:3Q4Pt7i8nYwy2KmQWIw2+1hTvwTE/6w9FqcttATPO/4= +github.com/containerd/typeurl/v2 v2.1.1/go.mod h1:IDp2JFvbwZ31H8dQbEIY7sDl2L3o3HZj1hsSQlywkQ0= +github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= +github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= +github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= +github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= +github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= +github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= -github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= -github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= -github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/denisenkom/go-mssqldb v0.0.0-20191128021309-1d7a30a10f73/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= +github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/buildx v0.12.0-rc2.0.20231219140829-617f538cb315 h1:UZxx9xBADdf/9UmSdEUi+pdJoPKpgcf9QUAY5gEIYmY= +github.com/docker/buildx v0.12.0-rc2.0.20231219140829-617f538cb315/go.mod h1:X8ZHhuW6ncwtoJ36TlU+gyaROTcBkTE01VHYmTStQCE= +github.com/docker/cli v25.0.1+incompatible h1:mFpqnrS6Hsm3v1k7Wa/BO23oz0k121MTbTO1lpcGSkU= +github.com/docker/cli v25.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/compose/v2 v2.24.3 h1:BVc1oDV7aQgksH64pDKTvcI95G36uJ+Mz9DGGBBoZeQ= +github.com/docker/compose/v2 v2.24.3/go.mod h1:D8Nv9+juzD7xiMyyHJ7G2J/MOYiGBmb9SvdIW5+2zKo= +github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= +github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v25.0.3+incompatible h1:D5fy/lYmY7bvZa0XTZ5/UJPljor41F+vdyJG5luQLfQ= +github.com/docker/docker v25.0.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.8.0 h1:YQFtbBQb4VrpoPxhFuzEBPQ9E16qz5SpHLS+uswaCp8= +github.com/docker/docker-credential-helpers v0.8.0/go.mod h1:UGFXcuoQ5TxPiB54nHOZ32AWRqQdECoh/Mg0AlEYb40= +github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0= +github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c/go.mod h1:CADgU4DSXK5QUlFslkQu2yW2TKzFZcXq/leZfM0UH5Q= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= +github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 h1:UhxFibDNY/bfvqU5CAUmr9zpesgbU6SWc8/B4mflAE4= +github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/dvsekhvalnov/jose2go v0.0.0-20170216131308-f21a8cedbbae/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM= github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7foRItutHYUIhlcKzcSf5vDpdhQAKTc= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emicklei/go-restful/v3 v3.10.1 h1:rc42Y5YTp7Am7CS630D7JmhRjq4UlEUuEKfrDac4bSQ= +github.com/emicklei/go-restful/v3 v3.10.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= +github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= +github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= +github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4 h1:B2mpK+MNqgPqk2/KNi1LbqwtZDy5F7iy0mynQiBr8VA= +github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4/go.mod h1:y4GA2JbAUama1S4QwYjC2hefgGLU8Ul0GMtL/ADMF1c= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= +github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/fsnotify/fsevents v0.1.1 h1:/125uxJvvoSDDBPen6yUZbil8J9ydKZnnl3TWWmvnkw= +github.com/fsnotify/fsevents v0.1.1/go.mod h1:+d+hS27T6k5J8CRaPLKFgwKYcpS7GwW3Ule9+SC2ZRc= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/fvbommel/sortorder v1.0.2 h1:mV4o8B2hKboCdkJm+a7uX/SIpZob4JzUpc5GGnM45eo= +github.com/fvbommel/sortorder v1.0.2/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= +github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/gin-contrib/pprof v1.4.0 h1:XxiBSf5jWZ5i16lNOPbMTVdgHBdhfGRD5PZ1LWazzvg= github.com/gin-contrib/pprof v1.4.0/go.mod h1:RrehPJasUVBPK6yTUwOl8/NP6i0vbUgmxtis+Z5KE90= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= @@ -62,10 +231,33 @@ github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= +github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= +github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= @@ -75,35 +267,101 @@ github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91 github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= github.com/go-playground/validator/v10 v10.15.5 h1:LEBecTWb/1j5TNY1YYG2RcOUN3R7NLylN+x8TTueE24= github.com/go-playground/validator/v10 v10.15.5/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.3.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/gogo/protobuf v1.0.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= +github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/certificate-transparency-go v1.0.10-0.20180222191210-5ab67e519c93 h1:jc2UWq7CbdszqeH6qu1ougXMIUBfSy8Pbh/anURYbGI= +github.com/google/certificate-transparency-go v1.0.10-0.20180222191210-5ab67e519c93/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= +github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= +github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= +github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= +github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= +github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= +github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog= +github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= @@ -111,36 +369,63 @@ github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/iden3/go-iden3-crypto v0.0.15 h1:4MJYlrot1l31Fzlo2sF56u7EVFeHHJkxGXXZCtESgK4= github.com/iden3/go-iden3-crypto v0.0.15/go.mod h1:dLpM4vEPJ3nDHzhWFXDjzkn1qHoBeOT/3UEhXsEsP3E= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/in-toto/in-toto-golang v0.5.0 h1:hb8bgwr0M2hGdDsLjkJ3ZqJ8JFLL/tgYdAxF/XEFBbY= +github.com/in-toto/in-toto-golang v0.5.0/go.mod h1:/Rq0IZHLV7Ku5gielPT4wPHJfH1GdHMCq8+WPxw8/BE= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= github.com/jackc/pgx/v5 v5.3.0/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8= -github.com/jackc/pgx/v5 v5.5.0 h1:NxstgwndsTRy7eq9/kqYc/BZh5w2hHJV86wjvO+1xPw= -github.com/jackc/pgx/v5 v5.5.0/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA= +github.com/jackc/pgx/v5 v5.5.4 h1:Xp2aQS8uXButQdnCMWNmvx6UysWQQC+u1EoizjguY+8= +github.com/jackc/pgx/v5 v5.5.4/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= github.com/jackc/puddle/v2 v2.2.0/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jinzhu/gorm v0.0.0-20170222002820-5409931a1bb8 h1:CZkYfurY6KGhVtlalI4QwQ6T0Cu6iuY3e0x5RLu96WE= +github.com/jinzhu/gorm v0.0.0-20170222002820-5409931a1bb8/go.mod h1:Vla75njaFJ8clLU1W44h34PjIkijhjHIYnZxMqCdxqo= +github.com/jinzhu/inflection v0.0.0-20170102125226-1c35d901db3d/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= -github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= +github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -150,64 +435,165 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v0.0.0-20150723085316-0dad96c0b94f/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/magiconair/properties v1.5.3/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= -github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= +github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mattn/go-sqlite3 v1.6.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= +github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/mapstructure v0.0.0-20150613213606-2caf8efc9366/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= +github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= +github.com/moby/buildkit v0.13.0-beta1.0.20231219135447-957cb50df991 h1:r80LLQ91uOLxU1ElAvrB1o8oBsph51lPzVnr7t2b200= +github.com/moby/buildkit v0.13.0-beta1.0.20231219135447-957cb50df991/go.mod h1:6MddWPSL5jxy+W8eMMHWDOfZzzRRKWXPZqajw72YHBc= +github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= +github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= +github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/sys/mountinfo v0.7.1 h1:/tTvQaSJRr2FshkhXiIpux6fQ2Zvc4j7tAhMTStAG2g= +github.com/moby/sys/mountinfo v0.7.1/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= +github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= +github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= +github.com/moby/sys/signal v0.7.0 h1:25RW3d5TnQEoKvRbEKUGay6DCQ46IxAVTT9CUMgmsSI= +github.com/moby/sys/signal v0.7.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= +github.com/moby/sys/symlink v0.2.0 h1:tk1rOM+Ljp0nFmfOIBtlV3rTDlWOwFRhjEeAhZB0nZc= +github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= +github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= +github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.8.1 h1:xFTEVwOFa1D/Ty24Ws1npBWkDYEV9BqZrsDxVrVkrrU= +github.com/onsi/ginkgo/v2 v2.8.1/go.mod h1:N1/NbDngAFcSLdyZ+/aYTYGSlq9qMCS/cNKGJjy+csc= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.27.1 h1:rfztXRbg6nv/5f+Raen9RcGoSecHIFgBBLQK3Wdj754= +github.com/onsi/gomega v1.27.1/go.mod h1:aHX5xOykVYzWOV4WqQy0sy8BQptgukenXpCXfadcIAw= +github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= -github.com/opencontainers/image-spec v1.1.0-rc5/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= +github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= +github.com/opencontainers/runtime-spec v1.1.0 h1:HHUyrt9mwHUjtasSbXSMvs4cyFxh+Bll4AjJ9odEGpg= +github.com/opencontainers/runtime-spec v1.1.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/selinux v1.11.0 h1:+5Zbo97w3Lbmb3PeqQtpmTkMwsW5nRI3YaLpt7tQ7oU= +github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec= +github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/orcaman/concurrent-map v1.0.0 h1:I/2A2XPCb4IuQWcQhBhSwGfiuybl/J0ev9HDbW65HOY= github.com/orcaman/concurrent-map v1.0.0/go.mod h1:Lu3tH6HLW3feq74c2GC+jIMS/K2CFcDWnWD9XkenwhI= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= -github.com/prometheus/common v0.39.0/go.mod h1:6XBZ7lYdLCbkAVhwRsWTZn+IN5AB9F/NXd5w0BbEX0Y= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_golang v0.9.0-pre1.0.20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= +github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= +github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= +github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= @@ -215,37 +601,96 @@ github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeC github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/scroll-tech/go-ethereum v1.10.14-0.20231130005111-38a3a9c9198c h1:MnAdt80steCDli4SAD0J0spBGNY+gQvbdptNjWztHcw= -github.com/scroll-tech/go-ethereum v1.10.14-0.20231130005111-38a3a9c9198c/go.mod h1:4HrFcoStbViFVy/9l/rvKl1XmizVAaPdgqI8v0U8hOc= +github.com/scroll-tech/go-ethereum v1.10.14-0.20240326144132-0f0cd99f7a2e h1:FcoK0rykAWI+5E7cQM6ALRLd5CmjBTHRvJztRBH2xeM= +github.com/scroll-tech/go-ethereum v1.10.14-0.20240326144132-0f0cd99f7a2e/go.mod h1:7Rz2bh9pn42rGuxjh51CG7HL9SKMG3ZugJkL3emdZx8= github.com/scroll-tech/zktrie v0.7.1 h1:NrmZNjuBzsbrKePqdHDG+t2cXnimbtezPAFS0+L9ElE= github.com/scroll-tech/zktrie v0.7.1/go.mod h1:XvNo7vAk8yxNyTjBDj5WIiFzYW4bx/gJ78+NK6Zn6Uk= +github.com/secure-systems-lab/go-securesystemslib v0.4.0 h1:b23VGrQhTA8cN2CbBw7/FulN9fTtqYUdS5+Oxzt+DUE= +github.com/secure-systems-lab/go-securesystemslib v0.4.0/go.mod h1:FGBZgq2tXWICsxWQW1msNf49F0Pf2Op5Htayx335Qbs= +github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002 h1:ka9QPuQg2u4LGipiZGsgkg3rJCo4iIUCy75FddM0GRQ= +github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc= +github.com/shibumi/go-pathspec v1.3.0 h1:QUyMZhFo0Md5B8zV8x2tesohbb5kfbpTi9rBnKh5dkI= +github.com/shibumi/go-pathspec v1.3.0/go.mod h1:Xutfslp817l2I1cZvgcfeMQJG5QnU2lh5tVaaMCl3jE= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil/v3 v3.23.12 h1:z90NtUkp3bMtmICZKpC4+WaknU1eXtp5vtbQ11DgpE4= +github.com/shirou/gopsutil/v3 v3.23.12/go.mod h1:1FrWgea594Jp7qmjHUUPlJDTPgcsb9mGnXDxavtikzM= +github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= +github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= +github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spdx/tools-golang v0.5.1 h1:fJg3SVOGG+eIva9ZUBm/hvyA7PIPVFjRxUKe6fdAgwE= +github.com/spdx/tools-golang v0.5.1/go.mod h1:/DRDQuBfB37HctM29YtrX1v+bXiVmT2OpQDalRmX9aU= +github.com/spf13/cast v0.0.0-20150508191742-4d07383ffe94 h1:JmfC365KywYwHB946TTiQWEb8kqPY+pybPLoGE9GgVk= +github.com/spf13/cast v0.0.0-20150508191742-4d07383ffe94/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= +github.com/spf13/cobra v0.0.1/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/jwalterweatherman v0.0.0-20141219030609-3d60171a6431 h1:XTHrT015sxHyJ5FnQ0AeemSspZWaDq7DoTRW0EVsDCE= +github.com/spf13/jwalterweatherman v0.0.0-20141219030609-3d60171a6431/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.0/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v0.0.0-20150530192845-be5ff3e4840c h1:2EejZtjFjKJGk71ANb+wtFK5EjUzUkEM3R0xnp559xg= +github.com/spf13/viper v0.0.0-20150530192845-be5ff3e4840c/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/supranational/blst v0.3.11-0.20230124161941-ca03e11a3ff2 h1:wh1wzwAhZBNiZO37uWS/nDaKiIwHz4mDo4pnA+fqTO0= +github.com/supranational/blst v0.3.11-0.20230124161941-ca03e11a3ff2/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= +github.com/testcontainers/testcontainers-go v0.28.0 h1:1HLm9qm+J5VikzFDYhOd+Zw12NtOl+8drH2E8nTY1r8= +github.com/testcontainers/testcontainers-go v0.28.0/go.mod h1:COlDpUXbwW3owtpMkEB1zo9gwb1CoKVKlyrVPejF4AU= +github.com/testcontainers/testcontainers-go/modules/compose v0.28.0 h1:QOCeTYZIYixg796Ik60MOaeMgpAKPbQd5pJOdTrftyg= +github.com/testcontainers/testcontainers-go/modules/compose v0.28.0/go.mod h1:lShXm8oldlLck3ltA5u+ShSvUnZ+wiNxwpp8wAQGZ1Y= +github.com/testcontainers/testcontainers-go/modules/postgres v0.28.0 h1:ff0s4JdYIdNAVSi/SrpN2Pdt1f+IjIw3AKjbHau8Un4= +github.com/testcontainers/testcontainers-go/modules/postgres v0.28.0/go.mod h1:fXgcYpbyrduNdiz2qRZuYkmvqLnEqsjbQiBNYH1ystI= +github.com/theupdateframework/notary v0.7.0 h1:QyagRZ7wlSpjT5N2qQAh/pN+DVqgekv4DzbAiAiEL3c= +github.com/theupdateframework/notary v0.7.0/go.mod h1:c9DRxcmhHmVLDay4/2fUYdISnHqbFDGRSlXPO0AhYWw= +github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375 h1:QB54BJwA6x8QU9nHY3xJSZR2kX9bgpZekRKGkLTmEXA= +github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375/go.mod h1:xRroudyp5iVtxKqZCrA6n2TLFRBf8bmnjr1UD4x+z7g= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tonistiigi/fsutil v0.0.0-20230825212630-f09800878302 h1:ZT8ibgassurSISJ1Pj26NsM3vY2jxFZn63Nd/TpHmRw= +github.com/tonistiigi/fsutil v0.0.0-20230825212630-f09800878302/go.mod h1:9kMVqMyQ/Sx2df5LtnGG+nbrmiZzCS7V6gjW3oGHsvI= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea h1:SXhTLE6pb6eld/v/cCndK0AMpt1wiVFb/YYmqB3/QG0= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk= +github.com/tonistiigi/vt100 v0.0.0-20230623042737-f9a4f7ef6531 h1:Y/M5lygoNPKwVNLMPXgVfsRT40CSFKXCxuU8LoHySjs= +github.com/tonistiigi/vt100 v0.0.0-20230623042737-f9a4f7ef6531/go.mod h1:ulncasL3N9uLrVann0m+CDlJKWsIAP34MPcOJF6VRvc= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= @@ -256,6 +701,15 @@ github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4d github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= +github.com/vbatts/tar-split v0.11.3 h1:hLFqsOLQ1SsppQNTMpkpPXClLDfC2A3Zgy9OUU+RVck= +github.com/vbatts/tar-split v0.11.3/go.mod h1:9QlHN18E+fEH7RdG+QAJJcuya3rqT7eXSTY7wGrAokY= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -263,34 +717,98 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.45.0 h1:RsQi0qJ2imFfCvZabqzM9cNXBG8k6gXMv1A0cXRmH6A= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.45.0/go.mod h1:vsh3ySueQCiKPxFLvjWC4Z135gIa34TQ/NSqkDTZYUM= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.45.0 h1:2ea0IkZBsWH+HA2GkD+7+hRw2u97jzdFyRtXuO14a1s= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.45.0/go.mod h1:4m3RnBBb+7dB9d21y510oO1pdB1V4J6smNf14WXcBFQ= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0 h1:x8Z78aZx8cOF0+Kkazoc7lwUNMGy0LrzEMxTm4BbTxg= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0/go.mod h1:62CPTSry9QZtOaSsE3tOzhx6LzDhHnXJ6xHeMNNiM6Q= +go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= +go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.42.0 h1:wNMDy/LVGLj2h3p6zg4d0gypKfWKSWI14E1C4smOgl8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.42.0/go.mod h1:YfbDdXAAkemWJK3H/DshvlrxqFB2rtW4rY6ky/3x/H0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 h1:3d+S281UTjM+AbF31XSOYn1qXn3BgIdWl8HNEpx08Jk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0/go.mod h1:0+KuTDyKL4gjKCF75pHOX4wuzYDUZYfAQdSu43o+Z2I= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 h1:IeMeyr1aBvBiPVYihXIaeIZba6b8E1bYp7lbdxK8CQg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU= +go.opentelemetry.io/otel/exporters/prometheus v0.42.0 h1:jwV9iQdvp38fxXi8ZC+lNpxjK16MRcZlpDYvbuO1FiA= +go.opentelemetry.io/otel/exporters/prometheus v0.42.0/go.mod h1:f3bYiqNqhoPxkvI2LrXqQVC546K7BuRDL/kKuxkujhA= +go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= +go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= +go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= +go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= +go.opentelemetry.io/otel/sdk/metric v1.19.0 h1:EJoTO5qysMsYCa+w4UghwFV/ptQgqSL/8Ni+hx+8i1k= +go.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhsJzCzV5210euduKcKY= +go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= +go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= +go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= +go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.5.0 h1:jpGode6huXQxcskEIpOCvrU+tzo81b6+oFLUYXWtH/Y= golang.org/x/arch v0.5.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 h1:MGwJjxBy0HJshjDNfLsYO8xppfqWlA5ZT9OhtUUhTNw= +golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= +golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU= +golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -298,45 +816,76 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210331175145-43e1dd70ce54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= @@ -344,24 +893,76 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f h1:Vn+VyHU5guc9KjB5KrjI2q0wCOWEOIh0OEsleqakHJg= +google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f/go.mod h1:nWSwAFPb+qfNJXsoeO3Io7zf4tMSfN8EA8RlDA04GhY= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 h1:DC7wcm+i+P1rN3Ff07vL+OndGg5OhNddHyTA+ocPqYE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4/go.mod h1:eJVxU6o+4G1PSczBr85xmyvSNYAKvAYgkub40YGomFM= +google.golang.org/grpc v1.0.5/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/cenkalti/backoff.v2 v2.2.1 h1:eJ9UAg01/HIHG987TwxvnzK2MgxXq97YY6rYDpY9aII= +gopkg.in/cenkalti/backoff.v2 v2.2.1/go.mod h1:S0QdOvT2AlerfSBkp0O+dk+bbIMaNbEmVk876gPCthU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= +gopkg.in/rethinkdb/rethinkdb-go.v6 v6.2.1 h1:d4KQkxAaAiRY2h5Zqis161Pv91A37uZyJOx73duwUwM= +gopkg.in/rethinkdb/rethinkdb-go.v6 v6.2.1/go.mod h1:WbjuEoo1oadwzQ4apSDU+JTvmllEHtsNHS6y7vFc7iw= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/urfave/cli.v1 v1.20.0 h1:NdAVW6RYxDif9DhDHaAortIu956m2c0v+09AZBPTbE0= +gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -370,7 +971,34 @@ gorm.io/driver/postgres v1.5.0/go.mod h1:FUZXzO+5Uqg5zzwzv4KK49R8lvGIyscBOqYrtI1 gorm.io/gorm v1.24.7-0.20230306060331-85eaf9eeda11/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls= gorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= -gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= -gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= +gotest.tools v1.4.0 h1:BjtEgfuw8Qyd+jPvQz8CfoxiO/UjFEidWinwEXZiWv0= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +k8s.io/api v0.26.7 h1:Lf4iEBEJb5OFNmawtBfSZV/UNi9riSJ0t1qdhyZqI40= +k8s.io/api v0.26.7/go.mod h1:Vk9bMadzA49UHPmHB//lX7VRCQSXGoVwfLd3Sc1SSXI= +k8s.io/apimachinery v0.26.7 h1:590jSBwaSHCAFCqltaEogY/zybFlhGsnLteLpuF2wig= +k8s.io/apimachinery v0.26.7/go.mod h1:qYzLkrQ9lhrZRh0jNKo2cfvf/R1/kQONnSiyB7NUJU0= +k8s.io/apiserver v0.26.7 h1:NX/zBZZn4R+Cq6shwyn8Pn8REd0yJJ16dbtv9WkEVEU= +k8s.io/apiserver v0.26.7/go.mod h1:r0wDRWHI7VL/KlQLTkJJBVGZ3KeNfv+VetlyRtr86xs= +k8s.io/client-go v0.26.7 h1:hyU9aKHlwVOykgyxzGYkrDSLCc4+mimZVyUJjPyUn1E= +k8s.io/client-go v0.26.7/go.mod h1:okYjy0jtq6sdeztALDvCh24tg4opOQS1XNvsJlERDAo= +k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw= +k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+OGxg8HsuBr/5f6tVAjDu6E= +k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= +k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5 h1:kmDqav+P+/5e1i9tFfHq1qcF3sOrDp+YEkVDAHu7Jwk= +k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +tags.cncf.io/container-device-interface v0.6.2 h1:dThE6dtp/93ZDGhqaED2Pu374SOeUkBfuvkLuiTdwzg= +tags.cncf.io/container-device-interface v0.6.2/go.mod h1:Shusyhjs1A5Na/kqPVLL0KqnHQHuunol9LFeUNkuGVE= diff --git a/common/libzkp/impl/Cargo.lock b/common/libzkp/impl/Cargo.lock index a990eafea..6bbd5ec69 100644 --- a/common/libzkp/impl/Cargo.lock +++ b/common/libzkp/impl/Cargo.lock @@ -31,17 +31,24 @@ dependencies = [ [[package]] name = "aggregator" version = "0.1.0" -source = "git+https://github.com/scroll-tech/zkevm-circuits.git?tag=v0.9.8#8f17df87ba70f5a8fcaa23f4fcb7fb112f5a815a" +source = "git+https://github.com/scroll-tech/zkevm-circuits.git?tag=v0.10.0rc3#632a7906bad9f24f254fec85fd25a4b180b8b4d7" dependencies = [ - "ark-std", + "ark-std 0.3.0", + "c-kzg", "env_logger 0.10.0", "eth-types", "ethers-core", + "halo2-base", + "halo2-ecc", "halo2_proofs", "hex", - "itertools", + "itertools 0.11.0", "log", + "num-bigint", + "once_cell", "rand", + "revm-precompile", + "revm-primitives 3.1.0", "serde", "serde_json", "snark-verifier", @@ -69,6 +76,44 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" + +[[package]] +name = "alloy-primitives" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "600d34d8de81e23b6d909c094e23b3d357e01ca36b78a8c5424c501eedbe86f0" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if 1.0.0", + "const-hex", + "derive_more", + "hex-literal 0.4.1", + "itoa", + "k256 0.13.1", + "keccak-asm", + "proptest", + "rand", + "ruint", + "serde", + "tiny-keccak", +] + +[[package]] +name = "alloy-rlp" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d58d9f5da7b40e9bfff0b7e7816700be4019db97d4b6359fe7f94a9e22e42ac" +dependencies = [ + "arrayvec", + "bytes", +] + [[package]] name = "android-tzdata" version = "0.1.1" @@ -96,6 +141,110 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" +[[package]] +name = "ark-ff" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +dependencies = [ + "ark-ff-asm 0.3.0", + "ark-ff-macros 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "derivative", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.3.3", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.4.0", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint", + "num-traits", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-serialize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +dependencies = [ + "ark-std 0.3.0", + "digest 0.9.0", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint", +] + [[package]] name = "ark-std" version = "0.3.0" @@ -106,6 +255,16 @@ dependencies = [ "rand", ] +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand", +] + [[package]] name = "array-init" version = "2.1.0" @@ -143,7 +302,7 @@ checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" dependencies = [ "futures", "pharos", - "rustc_version", + "rustc_version 0.4.0", ] [[package]] @@ -159,14 +318,13 @@ dependencies = [ [[package]] name = "auto_impl" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fee3da8ef1276b0bee5dd1c7258010d8fffd31801447323115a25560e1327b89" +checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ - "proc-macro-error", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.27", ] [[package]] @@ -235,6 +393,21 @@ dependencies = [ "serde", ] +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + [[package]] name = "bitflags" version = "1.3.2" @@ -243,9 +416,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.3.3" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "bitvec" @@ -279,16 +452,6 @@ dependencies = [ "constant_time_eq", ] -[[package]] -name = "block-buffer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a076c298b9ecdb530ed9d967e74a6027d6a7478924520acddcddc24c1c8ab3ab" -dependencies = [ - "arrayref", - "byte-tools", -] - [[package]] name = "block-buffer" version = "0.9.0" @@ -296,7 +459,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" dependencies = [ "block-padding", - "generic-array 0.14.7", + "generic-array", ] [[package]] @@ -305,7 +468,7 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "generic-array 0.14.7", + "generic-array", ] [[package]] @@ -314,13 +477,38 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" +[[package]] +name = "bls12_381" +version = "0.8.0" +source = "git+https://github.com/scroll-tech/bls12_381?branch=feat/impl_scalar_field#2c515f73a2462fef8681c8e884edf1710f52b22a" +dependencies = [ + "ff 0.13.0", + "group 0.13.0", + "pairing", + "pasta_curves", + "rand_core", + "subtle", +] + +[[package]] +name = "blst" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c94087b935a822949d3291a9989ad2b2051ea141eda0fd4e478a75f6aa3e604b" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] + [[package]] name = "bs58" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" dependencies = [ - "sha2 0.10.7", + "sha2", "tinyvec", ] @@ -333,7 +521,7 @@ checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" [[package]] name = "bus-mapping" version = "0.1.0" -source = "git+https://github.com/scroll-tech/zkevm-circuits.git?tag=v0.9.8#8f17df87ba70f5a8fcaa23f4fcb7fb112f5a815a" +source = "git+https://github.com/scroll-tech/zkevm-circuits.git?tag=v0.10.0rc3#632a7906bad9f24f254fec85fd25a4b180b8b4d7" dependencies = [ "eth-types", "ethers-core", @@ -342,21 +530,18 @@ dependencies = [ "gadgets", "halo2_proofs", "hex", - "itertools", - "keccak256", - "lazy_static", + "itertools 0.11.0", "log", "mock", "mpt-zktrie", "num", - "once_cell", "poseidon-circuit", "rand", "revm-precompile", "serde", "serde_json", - "strum", - "strum_macros", + "strum 0.25.0", + "strum_macros 0.25.3", ] [[package]] @@ -365,12 +550,6 @@ version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" -[[package]] -name = "byte-tools" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "560c32574a12a89ecd91f5e742165893f86e3ab98d21f8ea548658eb9eef5f40" - [[package]] name = "byteorder" version = "1.4.3" @@ -387,10 +566,24 @@ dependencies = [ ] [[package]] -name = "cc" -version = "1.0.79" +name = "c-kzg" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "3130f3d8717cc02e668a896af24984d5d5d4e8bf12e278e982e0f1bd88a0f9af" +dependencies = [ + "blst", + "cc", + "glob", + "hex", + "libc", + "serde", +] + +[[package]] +name = "cc" +version = "1.0.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" [[package]] name = "cfg-if" @@ -438,10 +631,10 @@ dependencies = [ "bs58", "coins-core", "digest 0.10.7", - "hmac 0.12.1", + "hmac", "k256 0.13.1", "serde", - "sha2 0.10.7", + "sha2", "thiserror", ] @@ -453,11 +646,11 @@ checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" dependencies = [ "bitvec", "coins-bip32", - "hmac 0.12.1", + "hmac", "once_cell", "pbkdf2 0.12.2", "rand", - "sha2 0.10.7", + "sha2", "thiserror", ] @@ -471,16 +664,29 @@ dependencies = [ "bech32", "bs58", "digest 0.10.7", - "generic-array 0.14.7", + "generic-array", "hex", "ripemd", "serde", "serde_derive", - "sha2 0.10.7", + "sha2", "sha3 0.10.8", "thiserror", ] +[[package]] +name = "const-hex" +version = "1.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ba00838774b4ab0233e355d26710fbfc8327a05c017f6dc4873f876d1f79f78" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "hex", + "proptest", + "serde", +] + [[package]] name = "const-oid" version = "0.9.4" @@ -593,7 +799,7 @@ version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" dependencies = [ - "generic-array 0.14.7", + "generic-array", "rand_core", "subtle", "zeroize", @@ -605,7 +811,7 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "740fe28e594155f10cfc383984cbefd529d7396050557148f79cb0f621204124" dependencies = [ - "generic-array 0.14.7", + "generic-array", "rand_core", "subtle", "zeroize", @@ -617,20 +823,10 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "generic-array 0.14.7", + "generic-array", "typenum", ] -[[package]] -name = "crypto-mac" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" -dependencies = [ - "generic-array 0.14.7", - "subtle", -] - [[package]] name = "ctr" version = "0.9.2" @@ -720,26 +916,17 @@ dependencies = [ "convert_case", "proc-macro2", "quote", - "rustc_version", + "rustc_version 0.4.0", "syn 1.0.109", ] -[[package]] -name = "digest" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03b072242a8cbaf9c145665af9d250c59af3b958f83ed6824e13533cf76d5b90" -dependencies = [ - "generic-array 0.9.1", -] - [[package]] name = "digest" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" dependencies = [ - "generic-array 0.14.7", + "generic-array", ] [[package]] @@ -760,6 +947,12 @@ version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" +[[package]] +name = "dyn-clone" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" + [[package]] name = "ecdsa" version = "0.14.8" @@ -803,7 +996,7 @@ dependencies = [ "der 0.6.1", "digest 0.10.7", "ff 0.12.1", - "generic-array 0.14.7", + "generic-array", "group 0.12.1", "rand_core", "sec1 0.3.0", @@ -821,7 +1014,7 @@ dependencies = [ "crypto-bigint 0.5.3", "digest 0.10.7", "ff 0.13.0", - "generic-array 0.14.7", + "generic-array", "group 0.13.0", "pkcs8", "rand_core", @@ -868,19 +1061,6 @@ dependencies = [ "syn 2.0.27", ] -[[package]] -name = "env_logger" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3" -dependencies = [ - "atty", - "humantime", - "log", - "regex", - "termcolor", -] - [[package]] name = "env_logger" version = "0.9.3" @@ -944,13 +1124,13 @@ dependencies = [ "ctr", "digest 0.10.7", "hex", - "hmac 0.12.1", + "hmac", "pbkdf2 0.11.0", "rand", "scrypt", "serde", "serde_json", - "sha2 0.10.7", + "sha2", "sha3 0.10.8", "thiserror", "uuid", @@ -959,26 +1139,25 @@ dependencies = [ [[package]] name = "eth-types" version = "0.1.0" -source = "git+https://github.com/scroll-tech/zkevm-circuits.git?tag=v0.9.8#8f17df87ba70f5a8fcaa23f4fcb7fb112f5a815a" +source = "git+https://github.com/scroll-tech/zkevm-circuits.git?tag=v0.10.0rc3#632a7906bad9f24f254fec85fd25a4b180b8b4d7" dependencies = [ + "base64 0.13.1", "ethers-core", "ethers-signers", + "halo2-base", "halo2_proofs", "hex", - "itertools", - "lazy_static", - "libsecp256k1", + "itertools 0.11.0", "num", "num-bigint", - "once_cell", "poseidon-circuit", "regex", "serde", "serde_json", "serde_with", "sha3 0.10.8", - "strum", - "strum_macros", + "strum 0.25.0", + "strum_macros 0.25.3", "subtle", "uint", ] @@ -1041,7 +1220,7 @@ dependencies = [ "chrono", "elliptic-curve 0.13.5", "ethabi", - "generic-array 0.14.7", + "generic-array", "hex", "k256 0.13.1", "num_enum 0.6.1", @@ -1050,7 +1229,7 @@ dependencies = [ "rlp", "serde", "serde_json", - "strum", + "strum 0.24.1", "tempfile", "thiserror", "tiny-keccak", @@ -1060,8 +1239,7 @@ dependencies = [ [[package]] name = "ethers-providers" version = "2.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56b498fd2a6c019d023e43e83488cd1fb0721f299055975aa6bac8dbf1e95f2c" +source = "git+https://github.com/scroll-tech/ethers-rs.git?branch=v2.0.7#e32dfd62e7cdec31160b91c5a646883594a586ba" dependencies = [ "async-trait", "auto_impl", @@ -1097,8 +1275,7 @@ dependencies = [ [[package]] name = "ethers-signers" version = "2.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02c4b7e15f212fa7cc2e1251868320221d4ff77a3d48068e69f47ce1c491df2d" +source = "git+https://github.com/scroll-tech/ethers-rs.git?branch=v2.0.7#e32dfd62e7cdec31160b91c5a646883594a586ba" dependencies = [ "async-trait", "coins-bip32", @@ -1108,7 +1285,7 @@ dependencies = [ "ethers-core", "hex", "rand", - "sha2 0.10.7", + "sha2", "thiserror", "tracing", ] @@ -1116,13 +1293,14 @@ dependencies = [ [[package]] name = "external-tracer" version = "0.1.0" -source = "git+https://github.com/scroll-tech/zkevm-circuits.git?tag=v0.9.8#8f17df87ba70f5a8fcaa23f4fcb7fb112f5a815a" +source = "git+https://github.com/scroll-tech/zkevm-circuits.git?tag=v0.10.0rc3#632a7906bad9f24f254fec85fd25a4b180b8b4d7" dependencies = [ "eth-types", "geth-utils", "log", "serde", "serde_json", + "serde_stacker", ] [[package]] @@ -1131,13 +1309,23 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" +[[package]] +name = "fastrlp" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + [[package]] name = "ff" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" dependencies = [ - "bitvec", "rand_core", "subtle", ] @@ -1148,6 +1336,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ + "bitvec", "rand_core", "subtle", ] @@ -1296,22 +1485,12 @@ dependencies = [ [[package]] name = "gadgets" version = "0.1.0" -source = "git+https://github.com/scroll-tech/zkevm-circuits.git?tag=v0.9.8#8f17df87ba70f5a8fcaa23f4fcb7fb112f5a815a" +source = "git+https://github.com/scroll-tech/zkevm-circuits.git?tag=v0.10.0rc3#632a7906bad9f24f254fec85fd25a4b180b8b4d7" dependencies = [ - "digest 0.7.6", "eth-types", "halo2_proofs", - "sha3 0.7.3", - "strum", -] - -[[package]] -name = "generic-array" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d00328cedcac5e81c683e5620ca6a30756fc23027ebf9bff405c0e8da1fbb7e" -dependencies = [ - "typenum", + "sha3 0.10.8", + "strum 0.25.0", ] [[package]] @@ -1328,10 +1507,10 @@ dependencies = [ [[package]] name = "geth-utils" version = "0.1.0" -source = "git+https://github.com/scroll-tech/zkevm-circuits.git?tag=v0.9.8#8f17df87ba70f5a8fcaa23f4fcb7fb112f5a815a" +source = "git+https://github.com/scroll-tech/zkevm-circuits.git?tag=v0.10.0rc3#632a7906bad9f24f254fec85fd25a4b180b8b4d7" dependencies = [ - "env_logger 0.9.3", - "gobuild 0.1.0-alpha.2 (git+https://github.com/scroll-tech/gobuild.git)", + "env_logger 0.10.0", + "gobuild", "log", ] @@ -1374,6 +1553,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + [[package]] name = "gloo-timers" version = "0.2.6" @@ -1389,16 +1574,7 @@ dependencies = [ [[package]] name = "gobuild" version = "0.1.0-alpha.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e156a4ddbf3deb5e8116946c111413bd9a5679bdc1536c78a60618a7a9ac9e" -dependencies = [ - "cc", -] - -[[package]] -name = "gobuild" -version = "0.1.0-alpha.2" -source = "git+https://github.com/scroll-tech/gobuild.git#8b84111fc3b58e2134e4794a06d1f199412cf2b0" +source = "git+https://github.com/scroll-tech/gobuild.git#24935c2b8f677841f22acd6710957621bb294e0e" dependencies = [ "cc", ] @@ -1447,11 +1623,11 @@ dependencies = [ [[package]] name = "halo2-base" version = "0.2.2" -source = "git+https://github.com/scroll-tech/halo2-lib?tag=v0.1.5#70588177930400361c731659b15b2ab3f29f7784" +source = "git+https://github.com/scroll-tech/halo2-lib?branch=develop#817cace374a9f4b2eca682b1cc36f143255ea25f" dependencies = [ - "ff 0.12.1", + "ff 0.13.0", "halo2_proofs", - "itertools", + "itertools 0.10.5", "num-bigint", "num-integer", "num-traits", @@ -1462,12 +1638,12 @@ dependencies = [ [[package]] name = "halo2-ecc" version = "0.2.2" -source = "git+https://github.com/scroll-tech/halo2-lib?tag=v0.1.5#70588177930400361c731659b15b2ab3f29f7784" +source = "git+https://github.com/scroll-tech/halo2-lib?branch=develop#817cace374a9f4b2eca682b1cc36f143255ea25f" dependencies = [ - "ff 0.12.1", - "group 0.12.1", + "ff 0.13.0", + "group 0.13.0", "halo2-base", - "itertools", + "itertools 0.10.5", "num-bigint", "num-integer", "num-traits", @@ -1481,7 +1657,7 @@ dependencies = [ [[package]] name = "halo2-gate-generator" version = "0.1.0" -source = "git+https://github.com/scroll-tech/halo2gategen.git#35b137de2f71c37dfbd236842b868013c46739d1" +source = "git+https://github.com/scroll-tech/halo2gategen?branch=scroll#2fa5c39aa67d0f97d660f37954daa9e897d0a4c1" dependencies = [ "halo2_proofs", "lazy_static", @@ -1489,50 +1665,70 @@ dependencies = [ "rand", "serde", "serde_json", - "strum", - "strum_macros", + "strum 0.24.1", + "strum_macros 0.24.3", "subtle", ] [[package]] name = "halo2-mpt-circuits" version = "0.1.0" -source = "git+https://github.com/scroll-tech/mpt-circuit.git?tag=v0.7.0#578c210ceb88d3c143ee2a013ad836d19285d9c1" +source = "git+https://github.com/scroll-tech/mpt-circuit.git?branch=v0.7#db07d50418d681893ac6b1ed1b1f9237d3b9fd15" dependencies = [ + "env_logger 0.10.0", "ethers-core", "halo2_proofs", "hex", - "itertools", + "itertools 0.10.5", "lazy_static", "log", "num-bigint", "num-traits", "poseidon-circuit", "rand", + "rand_chacha", "serde", "serde_json", - "strum", - "strum_macros", + "strum 0.24.1", + "strum_macros 0.24.3", "thiserror", ] [[package]] -name = "halo2_proofs" -version = "0.2.0" -source = "git+https://github.com/scroll-tech/halo2.git?branch=develop#e3fe25eadd714fd991f35190d17ff0b8fb031188" +name = "halo2_gadgets" +version = "1.1.0" +source = "git+https://github.com/scroll-tech/halo2.git?branch=v1.1#7179a60e4b4b1dafff084deac7b4bea235eecf5f" dependencies = [ - "ark-std", + "arrayvec", + "bitvec", + "ff 0.13.0", + "group 0.13.0", + "halo2_proofs", + "halo2curves", + "lazy_static", + "rand", + "subtle", + "uint", +] + +[[package]] +name = "halo2_proofs" +version = "1.1.0" +source = "git+https://github.com/scroll-tech/halo2.git?branch=v1.1#7179a60e4b4b1dafff084deac7b4bea235eecf5f" +dependencies = [ + "ark-std 0.3.0", "blake2b_simd", "cfg-if 0.1.10", "crossbeam", - "env_logger 0.8.4", - "ff 0.12.1", - "group 0.12.1", + "ff 0.13.0", + "group 0.13.0", "halo2curves", "log", + "maybe-rayon", "num-bigint", "num-integer", "poseidon", + "rand_chacha", "rand_core", "rayon", "sha3 0.9.1", @@ -1542,12 +1738,15 @@ dependencies = [ [[package]] name = "halo2curves" -version = "0.3.1" -source = "git+https://github.com/scroll-tech/halo2curves.git?branch=0.3.1-derive-serde#969f1e44d9713ee4cd552563bd0c762c5d53b56e" +version = "0.1.0" +source = "git+https://github.com/scroll-tech/halo2curves?branch=v0.1.0#112f5b9bf27f6b1708ba7d1c2fc14cb3c6e55604" dependencies = [ - "ff 0.12.1", - "group 0.12.1", + "blake2b_simd", + "bls12_381", + "ff 0.13.0", + "group 0.13.0", "lazy_static", + "maybe-rayon", "num-bigint", "num-traits", "pasta_curves", @@ -1555,22 +1754,11 @@ dependencies = [ "rand", "rand_core", "serde", + "serde_arrays", "static_assertions", "subtle", ] -[[package]] -name = "halo2wrong" -version = "0.1.0" -source = "git+https://github.com/scroll-tech/halo2wrong.git?branch=halo2-ecc-snark-verifier-0323#939d679cb16abf0e820bd606248661e400328afa" -dependencies = [ - "group 0.12.1", - "halo2_proofs", - "num-bigint", - "num-integer", - "num-traits", -] - [[package]] name = "hashbrown" version = "0.12.3" @@ -1591,6 +1779,10 @@ name = "hashbrown" version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +dependencies = [ + "ahash", + "allocator-api2", +] [[package]] name = "hashers" @@ -1635,14 +1827,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ebdb29d2ea9ed0083cd8cece49bbd968021bd99b0849edb4a9a7ee0fdf6a4e0" [[package]] -name = "hmac" -version = "0.8.1" +name = "hex-literal" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" -dependencies = [ - "crypto-mac", - "digest 0.9.0", -] +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" [[package]] name = "hmac" @@ -1653,17 +1841,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "hmac-drbg" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" -dependencies = [ - "digest 0.9.0", - "generic-array 0.14.7", - "hmac 0.8.1", -] - [[package]] name = "http" version = "0.2.9" @@ -1845,7 +2022,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" dependencies = [ - "generic-array 0.14.7", + "generic-array", ] [[package]] @@ -1883,6 +2060,24 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.9" @@ -1907,7 +2102,7 @@ dependencies = [ "cfg-if 1.0.0", "ecdsa 0.14.8", "elliptic-curve 0.12.3", - "sha2 0.10.7", + "sha2", "sha3 0.10.8", ] @@ -1921,7 +2116,7 @@ dependencies = [ "ecdsa 0.16.8", "elliptic-curve 0.13.5", "once_cell", - "sha2 0.10.7", + "sha2", "signature 2.1.0", ] @@ -1934,16 +2129,25 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "keccak-asm" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb8515fff80ed850aea4a1595f2e519c003e2a00a82fe168ebf5269196caf444" +dependencies = [ + "digest 0.10.7", + "sha3-asm", +] + [[package]] name = "keccak256" version = "0.1.0" -source = "git+https://github.com/scroll-tech/zkevm-circuits.git?tag=v0.9.8#8f17df87ba70f5a8fcaa23f4fcb7fb112f5a815a" +source = "git+https://github.com/scroll-tech/zkevm-circuits.git?tag=v0.10.0rc3#632a7906bad9f24f254fec85fd25a4b180b8b4d7" dependencies = [ - "env_logger 0.9.3", + "env_logger 0.10.0", "eth-types", "halo2_proofs", - "itertools", - "lazy_static", + "itertools 0.11.0", "log", "num-bigint", "num-traits", @@ -1965,52 +2169,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] -name = "libsecp256k1" -version = "0.7.1" +name = "libm" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95b09eff1b35ed3b33b877ced3a691fc7a481919c7e29c53c906226fcf55e2a1" -dependencies = [ - "arrayref", - "base64 0.13.1", - "digest 0.9.0", - "hmac-drbg", - "libsecp256k1-core", - "libsecp256k1-gen-ecmult", - "libsecp256k1-gen-genmult", - "rand", - "serde", - "sha2 0.9.9", - "typenum", -] - -[[package]] -name = "libsecp256k1-core" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be9b9bb642d8522a44d533eab56c16c738301965504753b03ad1de3425d5451" -dependencies = [ - "crunchy", - "digest 0.9.0", - "subtle", -] - -[[package]] -name = "libsecp256k1-gen-ecmult" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3038c808c55c87e8a172643a7d87187fc6c4174468159cb3090659d55bcb4809" -dependencies = [ - "libsecp256k1-core", -] - -[[package]] -name = "libsecp256k1-gen-genmult" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db8d6ba2cec9eacc40e6e8ccc98931840301f1006e95647ceb2dd5c3aa06f7c" -dependencies = [ - "libsecp256k1-core", -] +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] name = "linux-raw-sys" @@ -2061,17 +2223,13 @@ dependencies = [ ] [[package]] -name = "maingate" -version = "0.1.0" -source = "git+https://github.com/scroll-tech/halo2wrong.git?branch=halo2-ecc-snark-verifier-0323#939d679cb16abf0e820bd606248661e400328afa" +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" dependencies = [ - "group 0.12.1", - "halo2wrong", - "num-bigint", - "num-integer", - "num-traits", - "rand", - "subtle", + "cfg-if 1.0.0", + "rayon", ] [[package]] @@ -2118,31 +2276,29 @@ dependencies = [ [[package]] name = "misc-precompiled-circuit" version = "0.1.0" -source = "git+https://github.com/scroll-tech/misc-precompiled-circuit.git?tag=v0.1.0#f647341f9951f5c2399035728d4f6765564e2e02" +source = "git+https://github.com/scroll-tech/misc-precompiled-circuit.git?branch=main#dcb5018d84e8a9adec59cd33f5348a3971cec194" dependencies = [ "halo2-gate-generator", "halo2_proofs", - "lazy_static", "num-bigint", "rand", "serde", "serde_json", - "strum", - "strum_macros", + "strum 0.25.0", + "strum_macros 0.25.3", "subtle", ] [[package]] name = "mock" version = "0.1.0" -source = "git+https://github.com/scroll-tech/zkevm-circuits.git?tag=v0.9.8#8f17df87ba70f5a8fcaa23f4fcb7fb112f5a815a" +source = "git+https://github.com/scroll-tech/zkevm-circuits.git?tag=v0.10.0rc3#632a7906bad9f24f254fec85fd25a4b180b8b4d7" dependencies = [ "eth-types", "ethers-core", "ethers-signers", "external-tracer", - "itertools", - "lazy_static", + "itertools 0.11.0", "log", "rand", "rand_chacha", @@ -2151,13 +2307,12 @@ dependencies = [ [[package]] name = "mpt-zktrie" version = "0.1.0" -source = "git+https://github.com/scroll-tech/zkevm-circuits.git?tag=v0.9.8#8f17df87ba70f5a8fcaa23f4fcb7fb112f5a815a" +source = "git+https://github.com/scroll-tech/zkevm-circuits.git?tag=v0.10.0rc3#632a7906bad9f24f254fec85fd25a4b180b8b4d7" dependencies = [ "eth-types", "halo2-mpt-circuits", "halo2_proofs", "hex", - "lazy_static", "log", "num-bigint", "poseidon-circuit", @@ -2239,6 +2394,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -2304,9 +2460,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -2339,6 +2495,15 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "pairing" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" +dependencies = [ + "group 0.13.0", +] + [[package]] name = "parity-scale-codec" version = "3.6.4" @@ -2390,13 +2555,13 @@ dependencies = [ [[package]] name = "pasta_curves" -version = "0.4.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc65faf8e7313b4b1fbaa9f7ca917a0eed499a9663be71477f87993604341d8" +checksum = "d3e57598f73cc7e1b2ac63c79c517b31a0877cd7c402cdcaa311b5208de7a095" dependencies = [ "blake2b_simd", - "ff 0.12.1", - "group 0.12.1", + "ff 0.13.0", + "group 0.13.0", "lazy_static", "rand", "static_assertions", @@ -2425,7 +2590,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ "digest 0.10.7", - "hmac 0.12.1", + "hmac", ] [[package]] @@ -2434,6 +2599,17 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +[[package]] +name = "pest" +version = "2.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f8023d0fb78c8e03784ea1c7f3fa36e68a723138990b8d5a47d916b651e7a8" +dependencies = [ + "memchr", + "thiserror", + "ucd-trie", +] + [[package]] name = "pharos" version = "0.5.3" @@ -2441,7 +2617,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" dependencies = [ "futures", - "rustc_version", + "rustc_version 0.4.0", ] [[package]] @@ -2489,9 +2665,8 @@ dependencies = [ [[package]] name = "poseidon" version = "0.2.0" -source = "git+https://github.com/scroll-tech/poseidon.git?branch=scroll-dev-0220#2fb4a2385bada39b50dce12fe50cb80d2fd33476" +source = "git+https://github.com/scroll-tech/poseidon.git?branch=main#5787dd3d2ce7a9e9601a035c396ac0c03449b54d" dependencies = [ - "group 0.12.1", "halo2curves", "subtle", ] @@ -2499,9 +2674,10 @@ dependencies = [ [[package]] name = "poseidon-circuit" version = "0.1.0" -source = "git+https://github.com/scroll-tech/poseidon-circuit.git?branch=scroll-dev-0901#69524f42bdc55c581088c2fe64c2ab9a2921146b" +source = "git+https://github.com/scroll-tech/poseidon-circuit.git?branch=scroll-dev-1201#c6f058bcf3bb0c7933d1979563c414f5cc480f25" dependencies = [ "bitvec", + "ff 0.13.0", "halo2_proofs", "lazy_static", "log", @@ -2540,30 +2716,6 @@ dependencies = [ "toml_edit", ] -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - [[package]] name = "proc-macro-hack" version = "0.5.20+deprecated" @@ -2579,10 +2731,30 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "proptest" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags 2.5.0", + "lazy_static", + "num-traits", + "rand", + "rand_chacha", + "rand_xorshift", + "regex-syntax 0.8.3", + "rusty-fork", + "tempfile", + "unarray", +] + [[package]] name = "prover" version = "0.1.0" -source = "git+https://github.com/scroll-tech/zkevm-circuits.git?tag=v0.9.8#8f17df87ba70f5a8fcaa23f4fcb7fb112f5a815a" +source = "git+https://github.com/scroll-tech/zkevm-circuits.git?tag=v0.10.0rc3#632a7906bad9f24f254fec85fd25a4b180b8b4d7" dependencies = [ "aggregator", "anyhow", @@ -2596,19 +2768,18 @@ dependencies = [ "git-version", "halo2_proofs", "hex", - "itertools", + "itertools 0.11.0", "log", "log4rs", "mpt-zktrie", "num-bigint", - "once_cell", "rand", "rand_xorshift", "serde", "serde_derive", "serde_json", "serde_stacker", - "sha2 0.10.7", + "sha2", "snark-verifier", "snark-verifier-sdk", "zkevm-circuits", @@ -2623,6 +2794,12 @@ dependencies = [ "cc", ] +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + [[package]] name = "quote" version = "1.0.32" @@ -2726,7 +2903,7 @@ dependencies = [ "aho-corasick", "memchr", "regex-automata", - "regex-syntax", + "regex-syntax 0.7.4", ] [[package]] @@ -2737,7 +2914,7 @@ checksum = "b7b6d6190b7594385f61bd3911cd1be99dfddcfc365a4160cc2ab5bff4aed294" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.7.4", ] [[package]] @@ -2746,6 +2923,12 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" +[[package]] +name = "regex-syntax" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" + [[package]] name = "reqwest" version = "0.11.18" @@ -2810,10 +2993,10 @@ dependencies = [ "k256 0.11.6", "num", "once_cell", - "revm-primitives", + "revm-primitives 1.0.0", "ripemd", "secp256k1 0.26.0", - "sha2 0.10.7", + "sha2", "sha3 0.10.8", "substrate-bn", ] @@ -2830,12 +3013,33 @@ dependencies = [ "fixed-hash", "hashbrown 0.13.2", "hex", - "hex-literal", + "hex-literal 0.3.4", "rlp", "ruint", "sha3 0.10.8", ] +[[package]] +name = "revm-primitives" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "323ad597cf75ac9cb1d161be29fcc3562426f0278a1d04741697fca556e1ceea" +dependencies = [ + "alloy-primitives", + "auto_impl", + "bitflags 2.5.0", + "bitvec", + "c-kzg", + "cfg-if 1.0.0", + "derive_more", + "dyn-clone", + "enumn", + "hashbrown 0.14.0", + "hex", + "once_cell", + "serde", +] + [[package]] name = "revm_precompiles" version = "1.1.2" @@ -2849,7 +3053,7 @@ dependencies = [ "primitive-types", "ripemd", "secp256k1 0.24.3", - "sha2 0.10.7", + "sha2", "sha3 0.10.8", "substrate-bn", ] @@ -2861,7 +3065,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" dependencies = [ "crypto-bigint 0.4.9", - "hmac 0.12.1", + "hmac", "zeroize", ] @@ -2871,7 +3075,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "hmac 0.12.1", + "hmac", "subtle", ] @@ -2923,21 +3127,33 @@ dependencies = [ [[package]] name = "ruint" -version = "1.9.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77e1574d439643c8962edf612a888e7cc5581bcdf36cb64e6bc88466b03b2daa" +checksum = "8f308135fef9fc398342da5472ce7c484529df23743fb7c734e0f3d472971e62" dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "bytes", + "fastrlp", + "num-bigint", + "num-traits", + "parity-scale-codec", "primitive-types", + "proptest", + "rand", "rlp", "ruint-macro", - "thiserror", + "serde", + "valuable", + "zeroize", ] [[package]] name = "ruint-macro" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e666a5496a0b2186dbcd0ff6106e29e093c15591bde62c20d3842007c6978a09" +checksum = "f86854cf50259291520509879a5c294c3c9a4c334e9ff65071c51e42ef1e2343" [[package]] name = "rustc-demangle" @@ -2957,13 +3173,22 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" +[[package]] +name = "rustc_version" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + [[package]] name = "rustc_version" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver", + "semver 1.0.18", ] [[package]] @@ -2972,7 +3197,7 @@ version = "0.38.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" dependencies = [ - "bitflags 2.3.3", + "bitflags 2.5.0", "errno", "libc", "linux-raw-sys", @@ -3026,6 +3251,18 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + [[package]] name = "ryu" version = "1.0.15" @@ -3077,10 +3314,10 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" dependencies = [ - "hmac 0.12.1", + "hmac", "pbkdf2 0.11.0", "salsa20", - "sha2 0.10.7", + "sha2", ] [[package]] @@ -3101,7 +3338,7 @@ checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" dependencies = [ "base16ct 0.1.1", "der 0.6.1", - "generic-array 0.14.7", + "generic-array", "subtle", "zeroize", ] @@ -3114,7 +3351,7 @@ checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct 0.2.0", "der 0.7.8", - "generic-array 0.14.7", + "generic-array", "pkcs8", "subtle", "zeroize", @@ -3156,12 +3393,30 @@ dependencies = [ "cc", ] +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + [[package]] name = "semver" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" +[[package]] +name = "semver-parser" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +dependencies = [ + "pest", +] + [[package]] name = "send_wrapper" version = "0.4.0" @@ -3183,6 +3438,15 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde_arrays" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38636132857f68ec3d5f3eb121166d2af33cb55174c4d5ff645db6165cbef0fd" +dependencies = [ + "serde", +] + [[package]] name = "serde_derive" version = "1.0.178" @@ -3260,19 +3524,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - [[package]] name = "sha2" version = "0.10.7" @@ -3284,18 +3535,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "sha3" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b64dcef59ed4290b9fb562b53df07f564690d6539e8ecdd4728cf392477530bc" -dependencies = [ - "block-buffer 0.3.3", - "byte-tools", - "digest 0.7.6", - "keccak", -] - [[package]] name = "sha3" version = "0.9.1" @@ -3318,6 +3557,16 @@ dependencies = [ "keccak", ] +[[package]] +name = "sha3-asm" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bac61da6b35ad76b195eb4771210f947734321a8d81d7738e1580d953bc7a15e" +dependencies = [ + "cc", + "cfg-if 1.0.0", +] + [[package]] name = "signature" version = "1.6.4" @@ -3356,15 +3605,14 @@ checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" [[package]] name = "snark-verifier" version = "0.1.0" -source = "git+https://github.com/scroll-tech/snark-verifier?tag=v0.1.5#bc1d39ae31f3fe520c51dd150f0fefaf9653c465" +source = "git+https://github.com/scroll-tech/snark-verifier?branch=develop#114cea6cd025f7daf66b8f0038126a796653e207" dependencies = [ "bytes", "ethereum-types", "halo2-base", "halo2-ecc", "hex", - "itertools", - "lazy_static", + "itertools 0.12.1", "num-bigint", "num-integer", "num-traits", @@ -3380,15 +3628,14 @@ dependencies = [ [[package]] name = "snark-verifier-sdk" version = "0.0.1" -source = "git+https://github.com/scroll-tech/snark-verifier?tag=v0.1.5#bc1d39ae31f3fe520c51dd150f0fefaf9653c465" +source = "git+https://github.com/scroll-tech/snark-verifier?branch=develop#114cea6cd025f7daf66b8f0038126a796653e207" dependencies = [ "bincode", - "env_logger 0.10.0", "ethereum-types", + "ff 0.13.0", "halo2-base", "hex", - "itertools", - "lazy_static", + "itertools 0.12.1", "log", "num-bigint", "num-integer", @@ -3457,9 +3704,15 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" dependencies = [ - "strum_macros", + "strum_macros 0.24.3", ] +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" + [[package]] name = "strum_macros" version = "0.24.3" @@ -3473,6 +3726,19 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.27", +] + [[package]] name = "substrate-bn" version = "0.6.0" @@ -3573,6 +3839,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + [[package]] name = "time" version = "0.1.45" @@ -3761,6 +4036,12 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +[[package]] +name = "ucd-trie" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" + [[package]] name = "uint" version = "0.9.5" @@ -3773,6 +4054,12 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + [[package]] name = "unicode-bidi" version = "0.3.13" @@ -3833,12 +4120,27 @@ dependencies = [ "serde", ] +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + [[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "wait-timeout" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +dependencies = [ + "libc", +] + [[package]] name = "want" version = "0.3.1" @@ -4099,7 +4401,7 @@ dependencies = [ "js-sys", "log", "pharos", - "rustc_version", + "rustc_version 0.4.0", "send_wrapper 0.6.0", "thiserror", "wasm-bindgen", @@ -4121,36 +4423,48 @@ name = "zeroize" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.27", +] [[package]] name = "zkevm-circuits" version = "0.1.0" -source = "git+https://github.com/scroll-tech/zkevm-circuits.git?tag=v0.9.8#8f17df87ba70f5a8fcaa23f4fcb7fb112f5a815a" +source = "git+https://github.com/scroll-tech/zkevm-circuits.git?tag=v0.10.0rc3#632a7906bad9f24f254fec85fd25a4b180b8b4d7" dependencies = [ "array-init", "bus-mapping", "either", - "env_logger 0.9.3", + "env_logger 0.10.0", "eth-types", "ethers-core", "ethers-signers", + "ff 0.13.0", "gadgets", "halo2-base", "halo2-ecc", + "halo2_gadgets", "halo2_proofs", "hex", - "itertools", + "itertools 0.11.0", "keccak256", - "lazy_static", - "libsecp256k1", "log", - "maingate", "misc-precompiled-circuit", "mock", "mpt-zktrie", "num", "num-bigint", - "once_cell", "poseidon-circuit", "rand", "rand_chacha", @@ -4161,8 +4475,8 @@ dependencies = [ "sha3 0.10.8", "snark-verifier", "snark-verifier-sdk", - "strum", - "strum_macros", + "strum 0.25.0", + "strum_macros 0.25.3", "subtle", ] @@ -4185,7 +4499,7 @@ dependencies = [ [[package]] name = "zktrie" version = "0.2.0" -source = "git+https://github.com/scroll-tech/zktrie.git?branch=v0.6#83318659773604fa565e2ebeb810a6d3746f0af4" +source = "git+https://github.com/scroll-tech/zktrie.git?tag=v0.7.1#a12f2f262ad3e82301e39ecdf9bfe235befc7074" dependencies = [ - "gobuild 0.1.0-alpha.2 (registry+https://github.com/rust-lang/crates.io-index)", + "gobuild", ] diff --git a/common/libzkp/impl/Cargo.toml b/common/libzkp/impl/Cargo.toml index 1c2e28dad..bf68eb9c4 100644 --- a/common/libzkp/impl/Cargo.toml +++ b/common/libzkp/impl/Cargo.toml @@ -8,26 +8,29 @@ edition = "2021" crate-type = ["cdylib"] [patch.crates-io] +gobuild = { git = "https://github.com/scroll-tech/gobuild.git" } +halo2curves = { git = "https://github.com/scroll-tech/halo2curves", branch = "v0.1.0" } ethers-core = { git = "https://github.com/scroll-tech/ethers-rs.git", branch = "v2.0.7" } +ethers-providers = { git = "https://github.com/scroll-tech/ethers-rs.git", branch = "v2.0.7" } +ethers-signers = { git = "https://github.com/scroll-tech/ethers-rs.git", branch = "v2.0.7" } +#ethers-etherscan = { git = "https://github.com/scroll-tech/ethers-rs.git", branch = "v2.0.7" } +#ethers = { git = "https://github.com/scroll-tech/ethers-rs.git", branch = "v2.0.7" } [patch."https://github.com/privacy-scaling-explorations/halo2.git"] -halo2_proofs = { git = "https://github.com/scroll-tech/halo2.git", branch = "develop" } +halo2_proofs = { git = "https://github.com/scroll-tech/halo2.git", branch = "v1.1" } [patch."https://github.com/privacy-scaling-explorations/poseidon.git"] -poseidon = { git = "https://github.com/scroll-tech/poseidon.git", branch = "scroll-dev-0220" } -[patch."https://github.com/privacy-scaling-explorations/halo2wrong.git"] -halo2wrong = { git = "https://github.com/scroll-tech/halo2wrong.git", branch = "halo2-ecc-snark-verifier-0323" } -maingate = { git = "https://github.com/scroll-tech/halo2wrong", branch = "halo2-ecc-snark-verifier-0323" } -[patch."https://github.com/privacy-scaling-explorations/halo2curves.git"] -halo2curves = { git = "https://github.com/scroll-tech/halo2curves.git", branch = "0.3.1-derive-serde" } +poseidon = { git = "https://github.com/scroll-tech/poseidon.git", branch = "main" } +[patch."https://github.com/privacy-scaling-explorations/bls12_381"] +bls12_381 = { git = "https://github.com/scroll-tech/bls12_381", branch = "feat/impl_scalar_field" } [dependencies] -halo2_proofs = { git = "https://github.com/scroll-tech/halo2.git", branch = "develop" } -prover = { git = "https://github.com/scroll-tech/zkevm-circuits.git", tag = "v0.9.8", default-features = false, features = ["parallel_syn", "scroll", "shanghai", "strict-ccc"] } +halo2_proofs = { git = "https://github.com/scroll-tech/halo2.git", branch = "v1.1" } +prover = { git = "https://github.com/scroll-tech/zkevm-circuits.git", tag = "v0.10.0rc3", default-features = false, features = ["parallel_syn", "scroll", "shanghai"] } base64 = "0.13.0" env_logger = "0.9.0" libc = "0.2" log = "0.4" -once_cell = "1.8.0" +once_cell = "1.19" serde = "1.0" serde_derive = "1.0" serde_json = "1.0.66" diff --git a/common/libzkp/impl/rust-toolchain b/common/libzkp/impl/rust-toolchain index 44b874bfc..27c108be5 100644 --- a/common/libzkp/impl/rust-toolchain +++ b/common/libzkp/impl/rust-toolchain @@ -1 +1 @@ -nightly-2022-12-10 +nightly-2023-12-03 diff --git a/common/libzkp/impl/src/batch.rs b/common/libzkp/impl/src/batch.rs index b4512c669..059112945 100644 --- a/common/libzkp/impl/src/batch.rs +++ b/common/libzkp/impl/src/batch.rs @@ -119,7 +119,7 @@ pub unsafe extern "C" fn gen_batch_proof( let chunk_hashes_proofs = chunk_hashes .into_iter() - .zip(chunk_proofs.into_iter()) + .zip(chunk_proofs) .collect(); let proof = PROVER diff --git a/common/libzkp/impl/src/lib.rs b/common/libzkp/impl/src/lib.rs index 49af26745..674b696b9 100644 --- a/common/libzkp/impl/src/lib.rs +++ b/common/libzkp/impl/src/lib.rs @@ -1,5 +1,3 @@ -#![feature(once_cell)] - mod batch; mod chunk; mod types; diff --git a/common/testcontainers/testcontainers.go b/common/testcontainers/testcontainers.go new file mode 100644 index 000000000..3bf404db9 --- /dev/null +++ b/common/testcontainers/testcontainers.go @@ -0,0 +1,194 @@ +package testcontainers + +import ( + "context" + "fmt" + "log" + "time" + + "github.com/scroll-tech/go-ethereum/ethclient" + "github.com/testcontainers/testcontainers-go" + "github.com/testcontainers/testcontainers-go/modules/postgres" + "github.com/testcontainers/testcontainers-go/wait" + "gorm.io/gorm" + + "scroll-tech/common/database" +) + +// TestcontainerApps testcontainers struct +type TestcontainerApps struct { + postgresContainer *postgres.PostgresContainer + l1GethContainer *testcontainers.DockerContainer + l2GethContainer *testcontainers.DockerContainer + + // common time stamp in nanoseconds. + Timestamp int +} + +// NewTestcontainerApps returns new instance of TestcontainerApps struct +func NewTestcontainerApps() *TestcontainerApps { + timestamp := time.Now().Nanosecond() + return &TestcontainerApps{ + Timestamp: timestamp, + } +} + +// StartPostgresContainer starts a postgres container +func (t *TestcontainerApps) StartPostgresContainer() error { + if t.postgresContainer != nil && t.postgresContainer.IsRunning() { + return nil + } + postgresContainer, err := postgres.RunContainer(context.Background(), + testcontainers.WithImage("postgres"), + postgres.WithDatabase("test_db"), + postgres.WithPassword("123456"), + testcontainers.WithWaitStrategy( + wait.ForLog("database system is ready to accept connections").WithOccurrence(2).WithStartupTimeout(5*time.Second)), + ) + if err != nil { + log.Printf("failed to start postgres container: %s", err) + return err + } + t.postgresContainer = postgresContainer + return nil +} + +// StartL1GethContainer starts a L1Geth container +func (t *TestcontainerApps) StartL1GethContainer() error { + if t.l1GethContainer != nil && t.l1GethContainer.IsRunning() { + return nil + } + req := testcontainers.ContainerRequest{ + Image: "scroll_l1geth", + ExposedPorts: []string{"8546/tcp", "8545/tcp"}, + WaitingFor: wait.ForHTTP("/").WithPort("8545").WithStartupTimeout(100 * time.Second), + Cmd: []string{"--log.debug", "ANY"}, + } + genericContainerReq := testcontainers.GenericContainerRequest{ + ContainerRequest: req, + Started: true, + } + container, err := testcontainers.GenericContainer(context.Background(), genericContainerReq) + if err != nil { + log.Printf("failed to start scroll_l1geth container: %s", err) + return err + } + t.l1GethContainer, _ = container.(*testcontainers.DockerContainer) + return nil +} + +// StartL2GethContainer starts a L2Geth container +func (t *TestcontainerApps) StartL2GethContainer() error { + if t.l2GethContainer != nil && t.l2GethContainer.IsRunning() { + return nil + } + req := testcontainers.ContainerRequest{ + Image: "scroll_l2geth", + ExposedPorts: []string{"8546/tcp", "8545/tcp"}, + WaitingFor: wait.ForHTTP("/").WithPort("8545").WithStartupTimeout(100 * time.Second), + } + genericContainerReq := testcontainers.GenericContainerRequest{ + ContainerRequest: req, + Started: true, + } + container, err := testcontainers.GenericContainer(context.Background(), genericContainerReq) + if err != nil { + log.Printf("failed to start scroll_l2geth container: %s", err) + return err + } + t.l2GethContainer, _ = container.(*testcontainers.DockerContainer) + return nil +} + +// GetDBEndPoint returns the endpoint of the running postgres container +func (t *TestcontainerApps) GetDBEndPoint() (string, error) { + if t.postgresContainer == nil || !t.postgresContainer.IsRunning() { + return "", fmt.Errorf("postgres is not running") + } + return t.postgresContainer.ConnectionString(context.Background(), "sslmode=disable") +} + +// GetL1GethEndPoint returns the endpoint of the running L1Geth container +func (t *TestcontainerApps) GetL1GethEndPoint() (string, error) { + if t.l1GethContainer == nil || !t.l1GethContainer.IsRunning() { + return "", fmt.Errorf("l1 geth is not running") + } + endpoint, err := t.l1GethContainer.PortEndpoint(context.Background(), "8546/tcp", "ws") + if err != nil { + return "", err + } + return endpoint, nil +} + +// GetL2GethEndPoint returns the endpoint of the running L2Geth container +func (t *TestcontainerApps) GetL2GethEndPoint() (string, error) { + if t.l2GethContainer == nil || !t.l2GethContainer.IsRunning() { + return "", fmt.Errorf("l2 geth is not running") + } + endpoint, err := t.l2GethContainer.PortEndpoint(context.Background(), "8546/tcp", "ws") + if err != nil { + return "", err + } + return endpoint, nil +} + +// GetGormDBClient returns a gorm.DB by connecting to the running postgres container +func (t *TestcontainerApps) GetGormDBClient() (*gorm.DB, error) { + endpoint, err := t.GetDBEndPoint() + if err != nil { + return nil, err + } + dbCfg := &database.Config{ + DSN: endpoint, + DriverName: "postgres", + MaxOpenNum: 200, + MaxIdleNum: 20, + } + return database.InitDB(dbCfg) +} + +// GetL1GethClient returns a ethclient by dialing running L1Geth +func (t *TestcontainerApps) GetL1GethClient() (*ethclient.Client, error) { + endpoint, err := t.GetL1GethEndPoint() + if err != nil { + return nil, err + } + client, err := ethclient.Dial(endpoint) + if err != nil { + return nil, err + } + return client, nil +} + +// GetL2GethClient returns a ethclient by dialing running L2Geth +func (t *TestcontainerApps) GetL2GethClient() (*ethclient.Client, error) { + endpoint, err := t.GetL2GethEndPoint() + if err != nil { + return nil, err + } + client, err := ethclient.Dial(endpoint) + if err != nil { + return nil, err + } + return client, nil +} + +// Free stops all running containers +func (t *TestcontainerApps) Free() { + ctx := context.Background() + if t.postgresContainer != nil && t.postgresContainer.IsRunning() { + if err := t.postgresContainer.Terminate(ctx); err != nil { + log.Printf("failed to stop postgres container: %s", err) + } + } + if t.l1GethContainer != nil && t.l1GethContainer.IsRunning() { + if err := t.l1GethContainer.Terminate(ctx); err != nil { + log.Printf("failed to stop scroll_l1geth container: %s", err) + } + } + if t.l2GethContainer != nil && t.l2GethContainer.IsRunning() { + if err := t.l2GethContainer.Terminate(ctx); err != nil { + log.Printf("failed to stop scroll_l2geth container: %s", err) + } + } +} diff --git a/common/testcontainers/testcontainers_test.go b/common/testcontainers/testcontainers_test.go new file mode 100644 index 000000000..58169b00c --- /dev/null +++ b/common/testcontainers/testcontainers_test.go @@ -0,0 +1,59 @@ +package testcontainers + +import ( + "testing" + + "github.com/scroll-tech/go-ethereum/ethclient" + "github.com/stretchr/testify/assert" + "gorm.io/gorm" +) + +// TestNewTestcontainerApps tests NewTestcontainerApps +func TestNewTestcontainerApps(t *testing.T) { + var ( + err error + endpoint string + gormDBclient *gorm.DB + ethclient *ethclient.Client + ) + + // test start testcontainers + testApps := NewTestcontainerApps() + assert.NoError(t, testApps.StartPostgresContainer()) + endpoint, err = testApps.GetDBEndPoint() + assert.NoError(t, err) + assert.NotEmpty(t, endpoint) + gormDBclient, err = testApps.GetGormDBClient() + assert.NoError(t, err) + assert.NotNil(t, gormDBclient) + + assert.NoError(t, testApps.StartL1GethContainer()) + endpoint, err = testApps.GetL1GethEndPoint() + assert.NoError(t, err) + assert.NotEmpty(t, endpoint) + ethclient, err = testApps.GetL1GethClient() + assert.NoError(t, err) + assert.NotNil(t, ethclient) + + assert.NoError(t, testApps.StartL2GethContainer()) + endpoint, err = testApps.GetL2GethEndPoint() + assert.NoError(t, err) + assert.NotEmpty(t, endpoint) + ethclient, err = testApps.GetL2GethClient() + assert.NoError(t, err) + assert.NotNil(t, ethclient) + + // test free testcontainers + testApps.Free() + endpoint, err = testApps.GetDBEndPoint() + assert.EqualError(t, err, "postgres is not running") + assert.Empty(t, endpoint) + + endpoint, err = testApps.GetL1GethEndPoint() + assert.EqualError(t, err, "l1 geth is not running") + assert.Empty(t, endpoint) + + endpoint, err = testApps.GetL2GethEndPoint() + assert.EqualError(t, err, "l2 geth is not running") + assert.Empty(t, endpoint) +} diff --git a/common/testdata/blockTrace_03.json b/common/testdata/blockTrace_03.json index caec0da39..97f715d98 100644 --- a/common/testdata/blockTrace_03.json +++ b/common/testdata/blockTrace_03.json @@ -31,9 +31,11 @@ { "type": 2, "nonce": 2, - "txHash": "0x6b50040f5f14bad253f202b0775d6742131bcaee6b992f05578386f00e53b7e4", + "txHash": "0xfc4325f39825616a241d0c52d536c892e21b6df32bb75d8bdc70de54ae175318", "gas": 1152994, "gasPrice": "0x3b9b0a17", + "gasTipCap": "0x3b9b0a17", + "gasFeeCap": "0x3b9b0a17", "from": "0x1c5a77d9fa7ef466951b2f01f724bca3a5820b63", "to": null, "chainId": "0xcf55", diff --git a/common/testdata/blockTrace_delegate.json b/common/testdata/blockTrace_delegate.json deleted file mode 100644 index 4d98e998f..000000000 --- a/common/testdata/blockTrace_delegate.json +++ /dev/null @@ -1,995 +0,0 @@ -{ - "coinbase": { - "address": "0x1c5a77d9fa7ef466951b2f01f724bca3a5820b63", - "nonce": 3, - "balance": "0x1ffffffffffffffffffffffffffffffffffffffffffd5a5fa703d683461ce98", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" - }, - "header": { - "parentHash": "0xc7b6c7022c8386cdaf6fcd3d4f8d03dce257ae3664a072fdce511ecefce73ad0", - "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", - "miner": "0x0000000000000000000000000000000000000000", - "stateRoot": "0x26712be2a2a671df99555f95b601e2e907bd0276db5fb7d3cab35c061b39a91c", - "transactionsRoot": "0x6c4bdf11857e89cf8b34424d31be1db20974460a5b89dcf948adc88e743ebf3e", - "receiptsRoot": "0x3771127daa833dd70db4c01cd854543867176087a16b67154fa8b96a8549e97f", - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "difficulty": "0x2", - "number": "0x3", - "gasLimit": "0x3546c3cbb39e5", - "gasUsed": "0x1197e2", - "timestamp": "0x63807b2d", - "extraData": "0xd983010a0d846765746889676f312e31372e3133856c696e75780000000000000b5467bbc3ca30260309add44eddd3242b6bbac2456e5f65df801113f5d39ad43089a888b7755db442cd6aa2b4a869bc657b219a2daf5927fce87cf47dcad48101", - "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "nonce": "0x0000000000000000", - "baseFeePerGas": "0x1a2c", - "hash": "0x13ddd94de9c585c50c6885d4ef649292c2624ae7c8fc73781ee8785f2564b44c" - }, - "row_consumption": [ - ], - "transactions": [ - { - "type": 2, - "nonce": 2, - "txHash": "0xaaaeb971adfac989c7db5426737bc2932756091a5730ea6d5324f93e4cff9713", - "gas": 1152994, - "gasPrice": "0x3b9b0a17", - "from": "0x1c5a77d9fa7ef466951b2f01f724bca3a5820b63", - "to": null, - "chainId": "0xcf55", - "value": "0x0", - "data": "0x60806040523480156200001157600080fd5b50604051620014b2380380620014b2833981810160405260a08110156200003757600080fd5b815160208301516040808501805191519395929483019291846401000000008211156200006357600080fd5b9083019060208201858111156200007957600080fd5b82516401000000008111828201881017156200009457600080fd5b82525081516020918201929091019080838360005b83811015620000c3578181015183820152602001620000a9565b50505050905090810190601f168015620000f15780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200011557600080fd5b9083019060208201858111156200012b57600080fd5b82516401000000008111828201881017156200014657600080fd5b82525081516020918201929091019080838360005b83811015620001755781810151838201526020016200015b565b50505050905090810190601f168015620001a35780820380516001836020036101000a031916815260200191505b5060405260209081015185519093508592508491620001c8916003918501906200026b565b508051620001de9060049060208401906200026b565b50506005805461ff001960ff1990911660121716905550600680546001600160a01b038088166001600160a01b0319928316179092556007805492871692909116919091179055620002308162000255565b50506005805462010000600160b01b0319163362010000021790555062000307915050565b6005805460ff191660ff92909216919091179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002ae57805160ff1916838001178555620002de565b82800160010185558215620002de579182015b82811115620002de578251825591602001919060010190620002c1565b50620002ec929150620002f0565b5090565b5b80821115620002ec5760008155600101620002f1565b61119b80620003176000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c80635c975abb116100a257806395d89b411161007157806395d89b41146103015780639dc29fac14610309578063a457c2d714610335578063a9059cbb14610361578063dd62ed3e1461038d5761010b565b80635c975abb1461029d57806370a08231146102a55780638456cb59146102cb5780638e50817a146102d35761010b565b8063313ce567116100de578063313ce5671461021d578063395093511461023b5780633f4ba83a1461026757806340c10f19146102715761010b565b806306fdde0314610110578063095ea7b31461018d57806318160ddd146101cd57806323b872dd146101e7575b600080fd5b6101186103bb565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561015257818101518382015260200161013a565b50505050905090810190601f16801561017f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101b9600480360360408110156101a357600080fd5b506001600160a01b038135169060200135610451565b604080519115158252519081900360200190f35b6101d561046e565b60408051918252519081900360200190f35b6101b9600480360360608110156101fd57600080fd5b506001600160a01b03813581169160208101359091169060400135610474565b6102256104fb565b6040805160ff9092168252519081900360200190f35b6101b96004803603604081101561025157600080fd5b506001600160a01b038135169060200135610504565b61026f610552565b005b61026f6004803603604081101561028757600080fd5b506001600160a01b0381351690602001356105a9565b6101b9610654565b6101d5600480360360208110156102bb57600080fd5b50356001600160a01b0316610662565b61026f61067d565b61026f600480360360408110156102e957600080fd5b506001600160a01b03813581169160200135166106d2565b610118610757565b61026f6004803603604081101561031f57600080fd5b506001600160a01b0381351690602001356107b8565b6101b96004803603604081101561034b57600080fd5b506001600160a01b03813516906020013561085f565b6101b96004803603604081101561037757600080fd5b506001600160a01b0381351690602001356108c7565b6101d5600480360360408110156103a357600080fd5b506001600160a01b03813581169160200135166108db565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104475780601f1061041c57610100808354040283529160200191610447565b820191906000526020600020905b81548152906001019060200180831161042a57829003601f168201915b5050505050905090565b600061046561045e610906565b848461090a565b50600192915050565b60025490565b60006104818484846109f6565b6104f18461048d610906565b6104ec85604051806060016040528060288152602001611085602891396001600160a01b038a166000908152600160205260408120906104cb610906565b6001600160a01b031681526020810191909152604001600020549190610b51565b61090a565b5060019392505050565b60055460ff1690565b6000610465610511610906565b846104ec8560016000610522610906565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490610be8565b6007546001600160a01b0316331461059f576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b6105a7610c49565b565b600554610100900460ff16156105f9576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6006546001600160a01b03163314610646576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b6106508282610ced565b5050565b600554610100900460ff1690565b6001600160a01b031660009081526020819052604090205490565b6007546001600160a01b031633146106ca576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b6105a7610ddd565b6005546201000090046001600160a01b03163314610726576040805162461bcd60e51b815260206004820152600c60248201526b6f6e6c7920466163746f727960a01b604482015290519081900360640190fd5b600780546001600160a01b039283166001600160a01b03199182161790915560068054939092169216919091179055565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104475780601f1061041c57610100808354040283529160200191610447565b600554610100900460ff1615610808576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6006546001600160a01b03163314610855576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b6106508282610e65565b600061046561086c610906565b846104ec856040518060600160405280602581526020016111176025913960016000610896610906565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190610b51565b60006104656108d4610906565b84846109f6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3390565b6001600160a01b03831661094f5760405162461bcd60e51b81526004018080602001828103825260248152602001806110f36024913960400191505060405180910390fd5b6001600160a01b0382166109945760405162461bcd60e51b815260040180806020018281038252602281526020018061103d6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316610a3b5760405162461bcd60e51b81526004018080602001828103825260258152602001806110ce6025913960400191505060405180910390fd5b6001600160a01b038216610a805760405162461bcd60e51b8152600401808060200182810382526023815260200180610ff86023913960400191505060405180910390fd5b610a8b838383610f61565b610ac88160405180606001604052806026815260200161105f602691396001600160a01b0386166000908152602081905260409020549190610b51565b6001600160a01b038085166000908152602081905260408082209390935590841681522054610af79082610be8565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115610be05760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610ba5578181015183820152602001610b8d565b50505050905090810190601f168015610bd25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015610c42576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600554610100900460ff16610c9c576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6005805461ff00191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610cd0610906565b604080516001600160a01b039092168252519081900360200190a1565b6001600160a01b038216610d48576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b610d5460008383610f61565b600254610d619082610be8565b6002556001600160a01b038216600090815260208190526040902054610d879082610be8565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b600554610100900460ff1615610e2d576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6005805461ff0019166101001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610cd0610906565b6001600160a01b038216610eaa5760405162461bcd60e51b81526004018080602001828103825260218152602001806110ad6021913960400191505060405180910390fd5b610eb682600083610f61565b610ef38160405180606001604052806022815260200161101b602291396001600160a01b0385166000908152602081905260409020549190610b51565b6001600160a01b038316600090815260208190526040902055600254610f199082610fb5565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b610f6c838383610fb0565b610f74610654565b15610fb05760405162461bcd60e51b815260040180806020018281038252602a81526020018061113c602a913960400191505060405180910390fd5b505050565b6000610c4283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610b5156fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f45524332305061757361626c653a20746f6b656e207472616e73666572207768696c6520706175736564a2646970667358221220e96342bec8f6c2bf72815a39998973b64c3bed57770f402e9a7b7eeda0265d4c64736f6c634300060c00330000000000000000000000001c5a77d9fa7ef466951b2f01f724bca3a5820b630000000000000000000000001c5a77d9fa7ef466951b2f01f724bca3a5820b6300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000095745544820636f696e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045745544800000000000000000000000000000000000000000000000000000000", - "isCreate": true, - "v": "0x1", - "r": "0x235c1a8d40e8c347890397f1a92e6eadbd6422cf7c210e3e1737f0553c633172", - "s": "0x2f7c0384ddd06970446e74229cd96216da62196dc62395bda52095d44b8a9af7" - } - ], - "storageTrace": { - "rootBefore": "0x25b792bfd6d6456451f996e9383225e026fff469da205bb916768c0a78fd16af", - "rootAfter": "0x26712be2a2a671df99555f95b601e2e907bd0276db5fb7d3cab35c061b39a91c", - "proofs": { - "0x03F8133DD5Ed58838B20AF1296F62F44e69bAa48": [ - "0x0006e87db4b9b3a22a55eaec059b5896ca15c93c227708181cab416887090cf234133a13918f4fa1eb2bdecb129b9506dfa77feb64eadff903b28564e6e797be5b", - "0x00000000000000000000000000000000000000000000000000000000000000000002cf0e006d7e01c8f6a13d46d695bdfd24a7e1a494ad357c11b32ab05713592e", - "0x02", - "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" - ], - "0x1C5A77d9FA7eF466951B2F01F724BCa3A5820b63": [ - "0x0006e87db4b9b3a22a55eaec059b5896ca15c93c227708181cab416887090cf234133a13918f4fa1eb2bdecb129b9506dfa77feb64eadff903b28564e6e797be5b", - "0x01204920151d7e3cd9d1b5ba09d3ad6ea157c82d1cc425731f209e71a007165a9c04040000000000000000000000000000000000000000000000000000000000000000000201ffffffffffffffffffffffffffffffffffffffffffd5a5fa703d6a00d4dd70c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4700000000000000000000000000000000000000000000000000000000000000000201c5a77d9fa7ef466951b2f01f724bca3a5820b63000000000000000000000000", - "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" - ] - }, - "storageProofs": { - "0x03F8133DD5Ed58838B20AF1296F62F44e69bAa48": { - "0x0000000000000000000000000000000000000000000000000000000000000003": [ - "0x02", - "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" - ], - "0x0000000000000000000000000000000000000000000000000000000000000004": [ - "0x02", - "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" - ], - "0x0000000000000000000000000000000000000000000000000000000000000005": [ - "0x02", - "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" - ], - "0x0000000000000000000000000000000000000000000000000000000000000006": [ - "0x02", - "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" - ], - "0x0000000000000000000000000000000000000000000000000000000000000007": [ - "0x02", - "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" - ] - } - } - }, - "executionResults": [ - { - "gas": 1152994, - "failed": false, - "returnValue": "608060405234801561001057600080fd5b506004361061010b5760003560e01c80635c975abb116100a257806395d89b411161007157806395d89b41146103015780639dc29fac14610309578063a457c2d714610335578063a9059cbb14610361578063dd62ed3e1461038d5761010b565b80635c975abb1461029d57806370a08231146102a55780638456cb59146102cb5780638e50817a146102d35761010b565b8063313ce567116100de578063313ce5671461021d578063395093511461023b5780633f4ba83a1461026757806340c10f19146102715761010b565b806306fdde0314610110578063095ea7b31461018d57806318160ddd146101cd57806323b872dd146101e7575b600080fd5b6101186103bb565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561015257818101518382015260200161013a565b50505050905090810190601f16801561017f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101b9600480360360408110156101a357600080fd5b506001600160a01b038135169060200135610451565b604080519115158252519081900360200190f35b6101d561046e565b60408051918252519081900360200190f35b6101b9600480360360608110156101fd57600080fd5b506001600160a01b03813581169160208101359091169060400135610474565b6102256104fb565b6040805160ff9092168252519081900360200190f35b6101b96004803603604081101561025157600080fd5b506001600160a01b038135169060200135610504565b61026f610552565b005b61026f6004803603604081101561028757600080fd5b506001600160a01b0381351690602001356105a9565b6101b9610654565b6101d5600480360360208110156102bb57600080fd5b50356001600160a01b0316610662565b61026f61067d565b61026f600480360360408110156102e957600080fd5b506001600160a01b03813581169160200135166106d2565b610118610757565b61026f6004803603604081101561031f57600080fd5b506001600160a01b0381351690602001356107b8565b6101b96004803603604081101561034b57600080fd5b506001600160a01b03813516906020013561085f565b6101b96004803603604081101561037757600080fd5b506001600160a01b0381351690602001356108c7565b6101d5600480360360408110156103a357600080fd5b506001600160a01b03813581169160200135166108db565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104475780601f1061041c57610100808354040283529160200191610447565b820191906000526020600020905b81548152906001019060200180831161042a57829003601f168201915b5050505050905090565b600061046561045e610906565b848461090a565b50600192915050565b60025490565b60006104818484846109f6565b6104f18461048d610906565b6104ec85604051806060016040528060288152602001611085602891396001600160a01b038a166000908152600160205260408120906104cb610906565b6001600160a01b031681526020810191909152604001600020549190610b51565b61090a565b5060019392505050565b60055460ff1690565b6000610465610511610906565b846104ec8560016000610522610906565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490610be8565b6007546001600160a01b0316331461059f576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b6105a7610c49565b565b600554610100900460ff16156105f9576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6006546001600160a01b03163314610646576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b6106508282610ced565b5050565b600554610100900460ff1690565b6001600160a01b031660009081526020819052604090205490565b6007546001600160a01b031633146106ca576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b6105a7610ddd565b6005546201000090046001600160a01b03163314610726576040805162461bcd60e51b815260206004820152600c60248201526b6f6e6c7920466163746f727960a01b604482015290519081900360640190fd5b600780546001600160a01b039283166001600160a01b03199182161790915560068054939092169216919091179055565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104475780601f1061041c57610100808354040283529160200191610447565b600554610100900460ff1615610808576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6006546001600160a01b03163314610855576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b6106508282610e65565b600061046561086c610906565b846104ec856040518060600160405280602581526020016111176025913960016000610896610906565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190610b51565b60006104656108d4610906565b84846109f6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3390565b6001600160a01b03831661094f5760405162461bcd60e51b81526004018080602001828103825260248152602001806110f36024913960400191505060405180910390fd5b6001600160a01b0382166109945760405162461bcd60e51b815260040180806020018281038252602281526020018061103d6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316610a3b5760405162461bcd60e51b81526004018080602001828103825260258152602001806110ce6025913960400191505060405180910390fd5b6001600160a01b038216610a805760405162461bcd60e51b8152600401808060200182810382526023815260200180610ff86023913960400191505060405180910390fd5b610a8b838383610f61565b610ac88160405180606001604052806026815260200161105f602691396001600160a01b0386166000908152602081905260409020549190610b51565b6001600160a01b038085166000908152602081905260408082209390935590841681522054610af79082610be8565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115610be05760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610ba5578181015183820152602001610b8d565b50505050905090810190601f168015610bd25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015610c42576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600554610100900460ff16610c9c576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6005805461ff00191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610cd0610906565b604080516001600160a01b039092168252519081900360200190a1565b6001600160a01b038216610d48576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b610d5460008383610f61565b600254610d619082610be8565b6002556001600160a01b038216600090815260208190526040902054610d879082610be8565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b600554610100900460ff1615610e2d576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6005805461ff0019166101001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610cd0610906565b6001600160a01b038216610eaa5760405162461bcd60e51b81526004018080602001828103825260218152602001806110ad6021913960400191505060405180910390fd5b610eb682600083610f61565b610ef38160405180606001604052806022815260200161101b602291396001600160a01b0385166000908152602081905260409020549190610b51565b6001600160a01b038316600090815260208190526040902055600254610f199082610fb5565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b610f6c838383610fb0565b610f74610654565b15610fb05760405162461bcd60e51b815260040180806020018281038252602a81526020018061113c602a913960400191505060405180910390fd5b505050565b6000610c4283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610b5156fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f45524332305061757361626c653a20746f6b656e207472616e73666572207768696c6520706175736564a2646970667358221220e96342bec8f6c2bf72815a39998973b64c3bed57770f402e9a7b7eeda0265d4c64736f6c634300060c0033", - "from": { - "address": "0x1c5a77d9fa7ef466951b2f01f724bca3a5820b63", - "nonce": 2, - "balance": "0x1ffffffffffffffffffffffffffffffffffffffffffd5a5fa703d6a00d4dd70", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" - }, - "accountCreated": { - "address": "0x03f8133dd5ed58838b20af1296f62f44e69baa48", - "nonce": 1, - "balance": "0x0", - "codeHash": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - "accountAfter": [ - { - "address": "0x1c5a77d9fa7ef466951b2f01f724bca3a5820b63", - "nonce": 3, - "balance": "0x1ffffffffffffffffffffffffffffffffffffffffffd5a5fa703d683461ce98", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" - }, - { - "address": "0x03f8133dd5ed58838b20af1296f62f44e69baa48", - "nonce": 1, - "balance": "0x0", - "codeHash": "0x07c28a1f146e6cc6b10bf3e1b0072b4e11300b7fe80d4543dc3bc8bef3e95843" - }, - { - "address": "0x1c5a77d9fa7ef466951b2f01f724bca3a5820b63", - "nonce": 3, - "balance": "0x1ffffffffffffffffffffffffffffffffffffffffffd5a5fa703d683461ce98", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" - } - ], - "byteCode": "0x60806040523480156200001157600080fd5b50604051620014b2380380620014b2833981810160405260a08110156200003757600080fd5b815160208301516040808501805191519395929483019291846401000000008211156200006357600080fd5b9083019060208201858111156200007957600080fd5b82516401000000008111828201881017156200009457600080fd5b82525081516020918201929091019080838360005b83811015620000c3578181015183820152602001620000a9565b50505050905090810190601f168015620000f15780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200011557600080fd5b9083019060208201858111156200012b57600080fd5b82516401000000008111828201881017156200014657600080fd5b82525081516020918201929091019080838360005b83811015620001755781810151838201526020016200015b565b50505050905090810190601f168015620001a35780820380516001836020036101000a031916815260200191505b5060405260209081015185519093508592508491620001c8916003918501906200026b565b508051620001de9060049060208401906200026b565b50506005805461ff001960ff1990911660121716905550600680546001600160a01b038088166001600160a01b0319928316179092556007805492871692909116919091179055620002308162000255565b50506005805462010000600160b01b0319163362010000021790555062000307915050565b6005805460ff191660ff92909216919091179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002ae57805160ff1916838001178555620002de565b82800160010185558215620002de579182015b82811115620002de578251825591602001919060010190620002c1565b50620002ec929150620002f0565b5090565b5b80821115620002ec5760008155600101620002f1565b61119b80620003176000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c80635c975abb116100a257806395d89b411161007157806395d89b41146103015780639dc29fac14610309578063a457c2d714610335578063a9059cbb14610361578063dd62ed3e1461038d5761010b565b80635c975abb1461029d57806370a08231146102a55780638456cb59146102cb5780638e50817a146102d35761010b565b8063313ce567116100de578063313ce5671461021d578063395093511461023b5780633f4ba83a1461026757806340c10f19146102715761010b565b806306fdde0314610110578063095ea7b31461018d57806318160ddd146101cd57806323b872dd146101e7575b600080fd5b6101186103bb565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561015257818101518382015260200161013a565b50505050905090810190601f16801561017f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101b9600480360360408110156101a357600080fd5b506001600160a01b038135169060200135610451565b604080519115158252519081900360200190f35b6101d561046e565b60408051918252519081900360200190f35b6101b9600480360360608110156101fd57600080fd5b506001600160a01b03813581169160208101359091169060400135610474565b6102256104fb565b6040805160ff9092168252519081900360200190f35b6101b96004803603604081101561025157600080fd5b506001600160a01b038135169060200135610504565b61026f610552565b005b61026f6004803603604081101561028757600080fd5b506001600160a01b0381351690602001356105a9565b6101b9610654565b6101d5600480360360208110156102bb57600080fd5b50356001600160a01b0316610662565b61026f61067d565b61026f600480360360408110156102e957600080fd5b506001600160a01b03813581169160200135166106d2565b610118610757565b61026f6004803603604081101561031f57600080fd5b506001600160a01b0381351690602001356107b8565b6101b96004803603604081101561034b57600080fd5b506001600160a01b03813516906020013561085f565b6101b96004803603604081101561037757600080fd5b506001600160a01b0381351690602001356108c7565b6101d5600480360360408110156103a357600080fd5b506001600160a01b03813581169160200135166108db565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104475780601f1061041c57610100808354040283529160200191610447565b820191906000526020600020905b81548152906001019060200180831161042a57829003601f168201915b5050505050905090565b600061046561045e610906565b848461090a565b50600192915050565b60025490565b60006104818484846109f6565b6104f18461048d610906565b6104ec85604051806060016040528060288152602001611085602891396001600160a01b038a166000908152600160205260408120906104cb610906565b6001600160a01b031681526020810191909152604001600020549190610b51565b61090a565b5060019392505050565b60055460ff1690565b6000610465610511610906565b846104ec8560016000610522610906565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490610be8565b6007546001600160a01b0316331461059f576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b6105a7610c49565b565b600554610100900460ff16156105f9576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6006546001600160a01b03163314610646576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b6106508282610ced565b5050565b600554610100900460ff1690565b6001600160a01b031660009081526020819052604090205490565b6007546001600160a01b031633146106ca576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b6105a7610ddd565b6005546201000090046001600160a01b03163314610726576040805162461bcd60e51b815260206004820152600c60248201526b6f6e6c7920466163746f727960a01b604482015290519081900360640190fd5b600780546001600160a01b039283166001600160a01b03199182161790915560068054939092169216919091179055565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104475780601f1061041c57610100808354040283529160200191610447565b600554610100900460ff1615610808576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6006546001600160a01b03163314610855576040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b604482015290519081900360640190fd5b6106508282610e65565b600061046561086c610906565b846104ec856040518060600160405280602581526020016111176025913960016000610896610906565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190610b51565b60006104656108d4610906565b84846109f6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3390565b6001600160a01b03831661094f5760405162461bcd60e51b81526004018080602001828103825260248152602001806110f36024913960400191505060405180910390fd5b6001600160a01b0382166109945760405162461bcd60e51b815260040180806020018281038252602281526020018061103d6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316610a3b5760405162461bcd60e51b81526004018080602001828103825260258152602001806110ce6025913960400191505060405180910390fd5b6001600160a01b038216610a805760405162461bcd60e51b8152600401808060200182810382526023815260200180610ff86023913960400191505060405180910390fd5b610a8b838383610f61565b610ac88160405180606001604052806026815260200161105f602691396001600160a01b0386166000908152602081905260409020549190610b51565b6001600160a01b038085166000908152602081905260408082209390935590841681522054610af79082610be8565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115610be05760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610ba5578181015183820152602001610b8d565b50505050905090810190601f168015610bd25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015610c42576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600554610100900460ff16610c9c576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6005805461ff00191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610cd0610906565b604080516001600160a01b039092168252519081900360200190a1565b6001600160a01b038216610d48576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b610d5460008383610f61565b600254610d619082610be8565b6002556001600160a01b038216600090815260208190526040902054610d879082610be8565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b600554610100900460ff1615610e2d576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6005805461ff0019166101001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610cd0610906565b6001600160a01b038216610eaa5760405162461bcd60e51b81526004018080602001828103825260218152602001806110ad6021913960400191505060405180910390fd5b610eb682600083610f61565b610ef38160405180606001604052806022815260200161101b602291396001600160a01b0385166000908152602081905260409020549190610b51565b6001600160a01b038316600090815260208190526040902055600254610f199082610fb5565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b610f6c838383610fb0565b610f74610654565b15610fb05760405162461bcd60e51b815260040180806020018281038252602a81526020018061113c602a913960400191505060405180910390fd5b505050565b6000610c4283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610b5156fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f45524332305061757361626c653a20746f6b656e207472616e73666572207768696c6520706175736564a2646970667358221220e96342bec8f6c2bf72815a39998973b64c3bed57770f402e9a7b7eeda0265d4c64736f6c634300060c00330000000000000000000000001c5a77d9fa7ef466951b2f01f724bca3a5820b630000000000000000000000001c5a77d9fa7ef466951b2f01f724bca3a5820b6300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000095745544820636f696e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045745544800000000000000000000000000000000000000000000000000000000", - "structLogs": [ - { - "pc": 0, - "op": "DELEGATECALL", - "gas": 1015274, - "gasCost": 3, - "depth": 1 - } - ] - } - ], - "mptwitness": [ - { - "address": "0x03f8133dd5ed58838b20af1296f62f44e69baa48", - "accountKey": "0x357d8fb5134f3dc48eb1118c6a16ba14eee5d49fe9adaebd5879932694bf320c", - "accountPath": [ - { - "pathPart": "0x1", - "root": "0xaf16fd780a8c7616b95b20da69f4ff26e0253238e996f9516445d6d6bf92b725", - "path": [ - { - "value": "0x5bbe97e7e66485b203f9dfea64eb7fa7df06959b12cbde2beba14f8f91133a13", - "sibling": "0x34f20c09876841ab1c180877223cc915ca96589b05ecea552aa2b3b9b47de806" - }, - { - "value": "0x0000000000000000000000000000000000000000000000000000000000000000", - "sibling": "0x2e591357b02ab3117c35ad94a4e1a724fdbd95d6463da1f6c8017e6d000ecf02" - } - ] - }, - { - "pathPart": "0x1", - "root": "0x08ebb525664ab0c02c49587ec298d42388319f0c57a3018a7984f77a69b06a20", - "path": [ - { - "value": "0xf0a9432907471588a0e83aa9201193de159efe3b31e9112d6981c2be8ce45104", - "sibling": "0x34f20c09876841ab1c180877223cc915ca96589b05ecea552aa2b3b9b47de806" - }, - { - "value": "0x5c70b599f4da7e6c8271703a7677e703fa0cab9088232a1c0ee99aa3112fd51e", - "sibling": "0x2e591357b02ab3117c35ad94a4e1a724fdbd95d6463da1f6c8017e6d000ecf02" - } - ], - "leaf": { - "value": "0x33c5435c783d711eca3cb21179f8afaf6dd0be8ca0f066d0daace28b17fc281d", - "sibling": "0x357d8fb5134f3dc48eb1118c6a16ba14eee5d49fe9adaebd5879932694bf320c" - } - } - ], - "accountUpdate": [ - null, - { - "nonce": 1, - "balance": "0x0", - "codeHash": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "commonStateRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", - "statePath": [ - null, - null - ], - "stateUpdate": [ - null, - null - ] - }, - { - "address": "0x1c5a77d9fa7ef466951b2f01f724bca3a5820b63", - "accountKey": "0x9c5a1607a0719e201f7325c41c2dc857a16eadd309bab5d1d93c7e1d15204920", - "accountPath": [ - { - "pathPart": "0x0", - "root": "0x08ebb525664ab0c02c49587ec298d42388319f0c57a3018a7984f77a69b06a20", - "path": [ - { - "value": "0x34f20c09876841ab1c180877223cc915ca96589b05ecea552aa2b3b9b47de806", - "sibling": "0xf0a9432907471588a0e83aa9201193de159efe3b31e9112d6981c2be8ce45104" - } - ], - "leaf": { - "value": "0xf199fe1a085b5bb134e90d0bfdaf70579fa703ab3db986a6730b44cfd5207b15", - "sibling": "0x9c5a1607a0719e201f7325c41c2dc857a16eadd309bab5d1d93c7e1d15204920" - } - }, - { - "pathPart": "0x0", - "root": "0x5ccb01b192af8237bf448abf2c7fb6531ce162936172524eac258b40f32f0812", - "path": [ - { - "value": "0xdae1cffcb0f5fe3e341a9a514f9c06a6feaac97547b8ee2db69b239b880b9e19", - "sibling": "0xf0a9432907471588a0e83aa9201193de159efe3b31e9112d6981c2be8ce45104" - } - ], - "leaf": { - "value": "0xaa040d2c798b9c0db0484dcb8461200c9a92fa6a76c1bb58ec582d2c2d2edd22", - "sibling": "0x9c5a1607a0719e201f7325c41c2dc857a16eadd309bab5d1d93c7e1d15204920" - } - } - ], - "accountUpdate": [ - { - "nonce": 2, - "balance": "0x1ffffffffffffffffffffffffffffffffffffffffffd5a5fa703d6a00d4dd70", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" - }, - { - "nonce": 3, - "balance": "0x1ffffffffffffffffffffffffffffffffffffffffffd5a5fa703d6a00d4dd70", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" - } - ], - "commonStateRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", - "statePath": [ - null, - null - ], - "stateUpdate": [ - null, - null - ] - }, - { - "address": "0x03f8133dd5ed58838b20af1296f62f44e69baa48", - "accountKey": "0x357d8fb5134f3dc48eb1118c6a16ba14eee5d49fe9adaebd5879932694bf320c", - "accountPath": [ - { - "pathPart": "0x1", - "root": "0x5ccb01b192af8237bf448abf2c7fb6531ce162936172524eac258b40f32f0812", - "path": [ - { - "value": "0xf0a9432907471588a0e83aa9201193de159efe3b31e9112d6981c2be8ce45104", - "sibling": "0xdae1cffcb0f5fe3e341a9a514f9c06a6feaac97547b8ee2db69b239b880b9e19" - }, - { - "value": "0x5c70b599f4da7e6c8271703a7677e703fa0cab9088232a1c0ee99aa3112fd51e", - "sibling": "0x2e591357b02ab3117c35ad94a4e1a724fdbd95d6463da1f6c8017e6d000ecf02" - } - ], - "leaf": { - "value": "0x33c5435c783d711eca3cb21179f8afaf6dd0be8ca0f066d0daace28b17fc281d", - "sibling": "0x357d8fb5134f3dc48eb1118c6a16ba14eee5d49fe9adaebd5879932694bf320c" - } - }, - { - "pathPart": "0x1", - "root": "0x5ccb01b192af8237bf448abf2c7fb6531ce162936172524eac258b40f32f0812", - "path": [ - { - "value": "0xf0a9432907471588a0e83aa9201193de159efe3b31e9112d6981c2be8ce45104", - "sibling": "0xdae1cffcb0f5fe3e341a9a514f9c06a6feaac97547b8ee2db69b239b880b9e19" - }, - { - "value": "0x5c70b599f4da7e6c8271703a7677e703fa0cab9088232a1c0ee99aa3112fd51e", - "sibling": "0x2e591357b02ab3117c35ad94a4e1a724fdbd95d6463da1f6c8017e6d000ecf02" - } - ], - "leaf": { - "value": "0x33c5435c783d711eca3cb21179f8afaf6dd0be8ca0f066d0daace28b17fc281d", - "sibling": "0x357d8fb5134f3dc48eb1118c6a16ba14eee5d49fe9adaebd5879932694bf320c" - } - } - ], - "accountUpdate": [ - { - "nonce": 1, - "balance": "0x0", - "codeHash": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "nonce": 1, - "balance": "0x0", - "codeHash": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ], - "commonStateRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", - "statePath": [ - null, - null - ], - "stateUpdate": [ - null, - null - ] - }, - { - "address": "0x1c5a77d9fa7ef466951b2f01f724bca3a5820b63", - "accountKey": "0x9c5a1607a0719e201f7325c41c2dc857a16eadd309bab5d1d93c7e1d15204920", - "accountPath": [ - { - "pathPart": "0x0", - "root": "0x5ccb01b192af8237bf448abf2c7fb6531ce162936172524eac258b40f32f0812", - "path": [ - { - "value": "0xdae1cffcb0f5fe3e341a9a514f9c06a6feaac97547b8ee2db69b239b880b9e19", - "sibling": "0xf0a9432907471588a0e83aa9201193de159efe3b31e9112d6981c2be8ce45104" - } - ], - "leaf": { - "value": "0xaa040d2c798b9c0db0484dcb8461200c9a92fa6a76c1bb58ec582d2c2d2edd22", - "sibling": "0x9c5a1607a0719e201f7325c41c2dc857a16eadd309bab5d1d93c7e1d15204920" - } - }, - { - "pathPart": "0x0", - "root": "0xe1aa47a8831f65f972375542bbb23710ec9c671be8e9eafe81d1bb7136aab928", - "path": [ - { - "value": "0x549430921a06705ecd4ebf9a8635f5c735807a4d1aebcdaf6010c8241c8a7e24", - "sibling": "0xf0a9432907471588a0e83aa9201193de159efe3b31e9112d6981c2be8ce45104" - } - ], - "leaf": { - "value": "0x882042a20c02edac064ed39dbcf5350bd3399c7747a7703d7960686e3101dd02", - "sibling": "0x9c5a1607a0719e201f7325c41c2dc857a16eadd309bab5d1d93c7e1d15204920" - } - } - ], - "accountUpdate": [ - { - "nonce": 3, - "balance": "0x1ffffffffffffffffffffffffffffffffffffffffffd5a5fa703d6a00d4dd70", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" - }, - { - "nonce": 3, - "balance": "0x1ffffffffffffffffffffffffffffffffffffffffffd5a5fa703d683461ce98", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" - } - ], - "commonStateRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", - "statePath": [ - null, - null - ], - "stateUpdate": [ - null, - null - ] - }, - { - "address": "0x03f8133dd5ed58838b20af1296f62f44e69baa48", - "accountKey": "0x357d8fb5134f3dc48eb1118c6a16ba14eee5d49fe9adaebd5879932694bf320c", - "accountPath": [ - { - "pathPart": "0x1", - "root": "0xe1aa47a8831f65f972375542bbb23710ec9c671be8e9eafe81d1bb7136aab928", - "path": [ - { - "value": "0xf0a9432907471588a0e83aa9201193de159efe3b31e9112d6981c2be8ce45104", - "sibling": "0x549430921a06705ecd4ebf9a8635f5c735807a4d1aebcdaf6010c8241c8a7e24" - }, - { - "value": "0x5c70b599f4da7e6c8271703a7677e703fa0cab9088232a1c0ee99aa3112fd51e", - "sibling": "0x2e591357b02ab3117c35ad94a4e1a724fdbd95d6463da1f6c8017e6d000ecf02" - } - ], - "leaf": { - "value": "0x33c5435c783d711eca3cb21179f8afaf6dd0be8ca0f066d0daace28b17fc281d", - "sibling": "0x357d8fb5134f3dc48eb1118c6a16ba14eee5d49fe9adaebd5879932694bf320c" - } - }, - { - "pathPart": "0x1", - "root": "0xf09f669e4c99f58724043334be91d4474f70f1b893d7fd38764cec3917e65527", - "path": [ - { - "value": "0xe29200112e851398dda8f8932f2d348b9a1a13a247d81c6ad74a9102c220e62a", - "sibling": "0x549430921a06705ecd4ebf9a8635f5c735807a4d1aebcdaf6010c8241c8a7e24" - }, - { - "value": "0x2ecc09123c5664b42e67e469c75a3692135a4d24b077a20c162fadf5ffde0f0c", - "sibling": "0x2e591357b02ab3117c35ad94a4e1a724fdbd95d6463da1f6c8017e6d000ecf02" - } - ], - "leaf": { - "value": "0x4e7dad23bae2633b0173032b06fa8576108b3e9c12070849666bd3e38439a10a", - "sibling": "0x357d8fb5134f3dc48eb1118c6a16ba14eee5d49fe9adaebd5879932694bf320c" - } - } - ], - "accountUpdate": [ - { - "nonce": 1, - "balance": "0x0", - "codeHash": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "nonce": 1, - "balance": "0x0", - "codeHash": "0x07c28a1f146e6cc6b10bf3e1b0072b4e11300b7fe80d4543dc3bc8bef3e95843" - } - ], - "commonStateRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", - "statePath": [ - null, - null - ], - "stateUpdate": [ - null, - null - ] - }, - { - "address": "0x1c5a77d9fa7ef466951b2f01f724bca3a5820b63", - "accountKey": "0x9c5a1607a0719e201f7325c41c2dc857a16eadd309bab5d1d93c7e1d15204920", - "accountPath": [ - { - "pathPart": "0x0", - "root": "0xf09f669e4c99f58724043334be91d4474f70f1b893d7fd38764cec3917e65527", - "path": [ - { - "value": "0x549430921a06705ecd4ebf9a8635f5c735807a4d1aebcdaf6010c8241c8a7e24", - "sibling": "0xe29200112e851398dda8f8932f2d348b9a1a13a247d81c6ad74a9102c220e62a" - } - ], - "leaf": { - "value": "0x882042a20c02edac064ed39dbcf5350bd3399c7747a7703d7960686e3101dd02", - "sibling": "0x9c5a1607a0719e201f7325c41c2dc857a16eadd309bab5d1d93c7e1d15204920" - } - }, - { - "pathPart": "0x0", - "root": "0xf09f669e4c99f58724043334be91d4474f70f1b893d7fd38764cec3917e65527", - "path": [ - { - "value": "0x549430921a06705ecd4ebf9a8635f5c735807a4d1aebcdaf6010c8241c8a7e24", - "sibling": "0xe29200112e851398dda8f8932f2d348b9a1a13a247d81c6ad74a9102c220e62a" - } - ], - "leaf": { - "value": "0x882042a20c02edac064ed39dbcf5350bd3399c7747a7703d7960686e3101dd02", - "sibling": "0x9c5a1607a0719e201f7325c41c2dc857a16eadd309bab5d1d93c7e1d15204920" - } - } - ], - "accountUpdate": [ - { - "nonce": 3, - "balance": "0x1ffffffffffffffffffffffffffffffffffffffffffd5a5fa703d683461ce98", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" - }, - { - "nonce": 3, - "balance": "0x1ffffffffffffffffffffffffffffffffffffffffffd5a5fa703d683461ce98", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" - } - ], - "commonStateRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", - "statePath": [ - null, - null - ], - "stateUpdate": [ - null, - null - ] - }, - { - "address": "0x03f8133dd5ed58838b20af1296f62f44e69baa48", - "accountKey": "0x357d8fb5134f3dc48eb1118c6a16ba14eee5d49fe9adaebd5879932694bf320c", - "accountPath": [ - { - "pathPart": "0x1", - "root": "0xf09f669e4c99f58724043334be91d4474f70f1b893d7fd38764cec3917e65527", - "path": [ - { - "value": "0xe29200112e851398dda8f8932f2d348b9a1a13a247d81c6ad74a9102c220e62a", - "sibling": "0x549430921a06705ecd4ebf9a8635f5c735807a4d1aebcdaf6010c8241c8a7e24" - }, - { - "value": "0x2ecc09123c5664b42e67e469c75a3692135a4d24b077a20c162fadf5ffde0f0c", - "sibling": "0x2e591357b02ab3117c35ad94a4e1a724fdbd95d6463da1f6c8017e6d000ecf02" - } - ], - "leaf": { - "value": "0x4e7dad23bae2633b0173032b06fa8576108b3e9c12070849666bd3e38439a10a", - "sibling": "0x357d8fb5134f3dc48eb1118c6a16ba14eee5d49fe9adaebd5879932694bf320c" - } - }, - { - "pathPart": "0x1", - "root": "0x3ff0a2bcb6d82f6c65b9743f2167554a38c00f716d30bf176550e9bbf211de02", - "path": [ - { - "value": "0x1bfd41162e3f41ae3e58194190067b7106d4de0c16b555f8a3d962b7e75a9127", - "sibling": "0x549430921a06705ecd4ebf9a8635f5c735807a4d1aebcdaf6010c8241c8a7e24" - }, - { - "value": "0xb7a86f10915a67ec505541bdc1fe3e00ae12ff4f817c2a8ef8d8f72861531f1a", - "sibling": "0x2e591357b02ab3117c35ad94a4e1a724fdbd95d6463da1f6c8017e6d000ecf02" - } - ], - "leaf": { - "value": "0x5ae28e9db9a7b45743017db7696411292e9af5adb0ff11737a8936b69ef28403", - "sibling": "0x357d8fb5134f3dc48eb1118c6a16ba14eee5d49fe9adaebd5879932694bf320c" - } - } - ], - "accountUpdate": [ - { - "nonce": 1, - "balance": "0x0", - "codeHash": "0x07c28a1f146e6cc6b10bf3e1b0072b4e11300b7fe80d4543dc3bc8bef3e95843" - }, - { - "nonce": 1, - "balance": "0x0", - "codeHash": "0x07c28a1f146e6cc6b10bf3e1b0072b4e11300b7fe80d4543dc3bc8bef3e95843" - } - ], - "stateKey": "0x84d07ce01938a8e3278d5a7b52cf4b853666886e48d30f623413b0a36e2b8e17", - "statePath": [ - { - "pathPart": "0x0", - "root": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "pathPart": "0x0", - "root": "0x9ed40c6ac1bdb532038ee26104d46ebe84b2184716fc96410c5228e05c901017", - "leaf": { - "value": "0x5cdff6c2c2ed92a182c2eeed8a689f39d0af361f9f15ceb8ffc2309f3a746920", - "sibling": "0x84d07ce01938a8e3278d5a7b52cf4b853666886e48d30f623413b0a36e2b8e17" - } - } - ], - "stateUpdate": [ - null, - { - "key": "0x0000000000000000000000000000000000000000000000000000000000000003", - "value": "0x5745544820636f696e0000000000000000000000000000000000000000000012" - } - ] - }, - { - "address": "0x03f8133dd5ed58838b20af1296f62f44e69baa48", - "accountKey": "0x357d8fb5134f3dc48eb1118c6a16ba14eee5d49fe9adaebd5879932694bf320c", - "accountPath": [ - { - "pathPart": "0x1", - "root": "0x3ff0a2bcb6d82f6c65b9743f2167554a38c00f716d30bf176550e9bbf211de02", - "path": [ - { - "value": "0x1bfd41162e3f41ae3e58194190067b7106d4de0c16b555f8a3d962b7e75a9127", - "sibling": "0x549430921a06705ecd4ebf9a8635f5c735807a4d1aebcdaf6010c8241c8a7e24" - }, - { - "value": "0xb7a86f10915a67ec505541bdc1fe3e00ae12ff4f817c2a8ef8d8f72861531f1a", - "sibling": "0x2e591357b02ab3117c35ad94a4e1a724fdbd95d6463da1f6c8017e6d000ecf02" - } - ], - "leaf": { - "value": "0x5ae28e9db9a7b45743017db7696411292e9af5adb0ff11737a8936b69ef28403", - "sibling": "0x357d8fb5134f3dc48eb1118c6a16ba14eee5d49fe9adaebd5879932694bf320c" - } - }, - { - "pathPart": "0x1", - "root": "0x2e941dbce9c9463767e526ff1dc64448b54c4f38206985b291d08ff65f572c2b", - "path": [ - { - "value": "0x1f197a0287d09d7e4900d018a82a827087484a0df5333b12691a3cd4370ba911", - "sibling": "0x549430921a06705ecd4ebf9a8635f5c735807a4d1aebcdaf6010c8241c8a7e24" - }, - { - "value": "0x9d5e14515e7dfae33e52c8267bc216c26e0a14e70235f5e562419a156a43a305", - "sibling": "0x2e591357b02ab3117c35ad94a4e1a724fdbd95d6463da1f6c8017e6d000ecf02" - } - ], - "leaf": { - "value": "0x428cf4a59656f7c6327c6e90e01288157ce4d9e8de13c4868bbccd18d1fc112c", - "sibling": "0x357d8fb5134f3dc48eb1118c6a16ba14eee5d49fe9adaebd5879932694bf320c" - } - } - ], - "accountUpdate": [ - { - "nonce": 1, - "balance": "0x0", - "codeHash": "0x07c28a1f146e6cc6b10bf3e1b0072b4e11300b7fe80d4543dc3bc8bef3e95843" - }, - { - "nonce": 1, - "balance": "0x0", - "codeHash": "0x07c28a1f146e6cc6b10bf3e1b0072b4e11300b7fe80d4543dc3bc8bef3e95843" - } - ], - "stateKey": "0x8e1ee9fe8054b1fa6d3989af4e3ca88a801f67f4a497c85ca0fe469d89272923", - "statePath": [ - { - "pathPart": "0x0", - "root": "0x9ed40c6ac1bdb532038ee26104d46ebe84b2184716fc96410c5228e05c901017", - "leaf": { - "value": "0x5cdff6c2c2ed92a182c2eeed8a689f39d0af361f9f15ceb8ffc2309f3a746920", - "sibling": "0x84d07ce01938a8e3278d5a7b52cf4b853666886e48d30f623413b0a36e2b8e17" - } - }, - { - "pathPart": "0x2", - "root": "0x89e588c8124ca0250a33c78c46584d603e4c12cea897c47dfc6cefa83402c41e", - "path": [ - { - "value": "0x73719ac007efd4480d52c2f7803dd61d2647851dd99df6a81303d484b617e213", - "sibling": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "value": "0x37dbfd51b8cacf779ca71e9cfc9d13acc3db6cb917642dd18ca03b10bd9a2f18", - "sibling": "0x9ed40c6ac1bdb532038ee26104d46ebe84b2184716fc96410c5228e05c901017" - } - ], - "leaf": { - "value": "0xf03a062f7dac12aa4a8e1ecf3706890ce02e02be5e95d00650d1c43b6f5d0026", - "sibling": "0x8e1ee9fe8054b1fa6d3989af4e3ca88a801f67f4a497c85ca0fe469d89272923" - } - } - ], - "stateUpdate": [ - null, - { - "key": "0x0000000000000000000000000000000000000000000000000000000000000004", - "value": "0x5745544800000000000000000000000000000000000000000000000000000008" - } - ] - }, - { - "address": "0x03f8133dd5ed58838b20af1296f62f44e69baa48", - "accountKey": "0x357d8fb5134f3dc48eb1118c6a16ba14eee5d49fe9adaebd5879932694bf320c", - "accountPath": [ - { - "pathPart": "0x1", - "root": "0x2e941dbce9c9463767e526ff1dc64448b54c4f38206985b291d08ff65f572c2b", - "path": [ - { - "value": "0x1f197a0287d09d7e4900d018a82a827087484a0df5333b12691a3cd4370ba911", - "sibling": "0x549430921a06705ecd4ebf9a8635f5c735807a4d1aebcdaf6010c8241c8a7e24" - }, - { - "value": "0x9d5e14515e7dfae33e52c8267bc216c26e0a14e70235f5e562419a156a43a305", - "sibling": "0x2e591357b02ab3117c35ad94a4e1a724fdbd95d6463da1f6c8017e6d000ecf02" - } - ], - "leaf": { - "value": "0x428cf4a59656f7c6327c6e90e01288157ce4d9e8de13c4868bbccd18d1fc112c", - "sibling": "0x357d8fb5134f3dc48eb1118c6a16ba14eee5d49fe9adaebd5879932694bf320c" - } - }, - { - "pathPart": "0x1", - "root": "0xf5ebd4c93bb15cd7e6be4adc0406d735327d712d6d0e5b6dd587739baca12907", - "path": [ - { - "value": "0xcd4f19c0ea5a8b7177bcdd705074451332d09ee076b071d08ac5bceb44566d19", - "sibling": "0x549430921a06705ecd4ebf9a8635f5c735807a4d1aebcdaf6010c8241c8a7e24" - }, - { - "value": "0x088f92b5290bf701751c5bf33463ba87323c4546c0c059ce061c33fc759a9424", - "sibling": "0x2e591357b02ab3117c35ad94a4e1a724fdbd95d6463da1f6c8017e6d000ecf02" - } - ], - "leaf": { - "value": "0x120a27869531ba07c327622f2e437105062409003b859a79bdd8673c7f989b29", - "sibling": "0x357d8fb5134f3dc48eb1118c6a16ba14eee5d49fe9adaebd5879932694bf320c" - } - } - ], - "accountUpdate": [ - { - "nonce": 1, - "balance": "0x0", - "codeHash": "0x07c28a1f146e6cc6b10bf3e1b0072b4e11300b7fe80d4543dc3bc8bef3e95843" - }, - { - "nonce": 1, - "balance": "0x0", - "codeHash": "0x07c28a1f146e6cc6b10bf3e1b0072b4e11300b7fe80d4543dc3bc8bef3e95843" - } - ], - "stateKey": "0x68af6119e1c208c6d4e4a54e37e40c0ae109e97895d0970707e4b8face49940e", - "statePath": [ - { - "pathPart": "0x0", - "root": "0x89e588c8124ca0250a33c78c46584d603e4c12cea897c47dfc6cefa83402c41e", - "path": [ - { - "value": "0x73719ac007efd4480d52c2f7803dd61d2647851dd99df6a81303d484b617e213", - "sibling": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "value": "0x9ed40c6ac1bdb532038ee26104d46ebe84b2184716fc96410c5228e05c901017", - "sibling": "0x37dbfd51b8cacf779ca71e9cfc9d13acc3db6cb917642dd18ca03b10bd9a2f18" - } - ], - "leaf": { - "value": "0x5cdff6c2c2ed92a182c2eeed8a689f39d0af361f9f15ceb8ffc2309f3a746920", - "sibling": "0x84d07ce01938a8e3278d5a7b52cf4b853666886e48d30f623413b0a36e2b8e17" - } - }, - { - "pathPart": "0x0", - "root": "0xa2ca8943f203126deccf79c17dc15904e4f5c15961f7bf869cef74053802ea28", - "path": [ - { - "value": "0x6c1ec8ffe1a58a389a0e3b733d1213b88983aacab48d06d8d923fe3fc9d0422e", - "sibling": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "value": "0xfc8dcec425a54dcee11a565b2448cd4422d93b16e60ff73c484c2ce8e138b52b", - "sibling": "0x37dbfd51b8cacf779ca71e9cfc9d13acc3db6cb917642dd18ca03b10bd9a2f18" - }, - { - "value": "0x65a94cbfc1b45c9e0abd5e951a14145d5c8d10628e023b788358e5550d4a7824", - "sibling": "0x9ed40c6ac1bdb532038ee26104d46ebe84b2184716fc96410c5228e05c901017" - } - ], - "leaf": { - "value": "0xacce20d02c097a1d31fba5c0b1df801db982fc92bb9414a8587b800f52b6f61c", - "sibling": "0x68af6119e1c208c6d4e4a54e37e40c0ae109e97895d0970707e4b8face49940e" - } - } - ], - "stateUpdate": [ - null, - { - "key": "0x0000000000000000000000000000000000000000000000000000000000000005", - "value": "0x000000000000000000001c5a77d9fa7ef466951b2f01f724bca3a5820b630012" - } - ] - }, - { - "address": "0x03f8133dd5ed58838b20af1296f62f44e69baa48", - "accountKey": "0x357d8fb5134f3dc48eb1118c6a16ba14eee5d49fe9adaebd5879932694bf320c", - "accountPath": [ - { - "pathPart": "0x1", - "root": "0xf5ebd4c93bb15cd7e6be4adc0406d735327d712d6d0e5b6dd587739baca12907", - "path": [ - { - "value": "0xcd4f19c0ea5a8b7177bcdd705074451332d09ee076b071d08ac5bceb44566d19", - "sibling": "0x549430921a06705ecd4ebf9a8635f5c735807a4d1aebcdaf6010c8241c8a7e24" - }, - { - "value": "0x088f92b5290bf701751c5bf33463ba87323c4546c0c059ce061c33fc759a9424", - "sibling": "0x2e591357b02ab3117c35ad94a4e1a724fdbd95d6463da1f6c8017e6d000ecf02" - } - ], - "leaf": { - "value": "0x120a27869531ba07c327622f2e437105062409003b859a79bdd8673c7f989b29", - "sibling": "0x357d8fb5134f3dc48eb1118c6a16ba14eee5d49fe9adaebd5879932694bf320c" - } - }, - { - "pathPart": "0x1", - "root": "0xfea77ab872522019f637cb99a0a35fab9fd7584f55b818622f5d04c496d8d912", - "path": [ - { - "value": "0x8bc098f2af6fc222476a060d160298ae3f123e2ac7c601869229f369b225f40f", - "sibling": "0x549430921a06705ecd4ebf9a8635f5c735807a4d1aebcdaf6010c8241c8a7e24" - }, - { - "value": "0x7c15f1737fc59c2a1afebe163ee856733a4a6b82de66d50843ab7b46a97a9909", - "sibling": "0x2e591357b02ab3117c35ad94a4e1a724fdbd95d6463da1f6c8017e6d000ecf02" - } - ], - "leaf": { - "value": "0x000f9969c209a3805df18d1e43e7a40409553d4ff3753e4d0571a6e944b1c517", - "sibling": "0x357d8fb5134f3dc48eb1118c6a16ba14eee5d49fe9adaebd5879932694bf320c" - } - } - ], - "accountUpdate": [ - { - "nonce": 1, - "balance": "0x0", - "codeHash": "0x07c28a1f146e6cc6b10bf3e1b0072b4e11300b7fe80d4543dc3bc8bef3e95843" - }, - { - "nonce": 1, - "balance": "0x0", - "codeHash": "0x07c28a1f146e6cc6b10bf3e1b0072b4e11300b7fe80d4543dc3bc8bef3e95843" - } - ], - "stateKey": "0x046b3f7277dd2bb9226a061aa719407156457c66b932f8c7241f7b754470dc20", - "statePath": [ - { - "pathPart": "0x4", - "root": "0xa2ca8943f203126deccf79c17dc15904e4f5c15961f7bf869cef74053802ea28", - "path": [ - { - "value": "0x6c1ec8ffe1a58a389a0e3b733d1213b88983aacab48d06d8d923fe3fc9d0422e", - "sibling": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "value": "0xfc8dcec425a54dcee11a565b2448cd4422d93b16e60ff73c484c2ce8e138b52b", - "sibling": "0x37dbfd51b8cacf779ca71e9cfc9d13acc3db6cb917642dd18ca03b10bd9a2f18" - }, - { - "value": "0x9ed40c6ac1bdb532038ee26104d46ebe84b2184716fc96410c5228e05c901017", - "sibling": "0x65a94cbfc1b45c9e0abd5e951a14145d5c8d10628e023b788358e5550d4a7824" - } - ], - "leaf": { - "value": "0x5cdff6c2c2ed92a182c2eeed8a689f39d0af361f9f15ceb8ffc2309f3a746920", - "sibling": "0x84d07ce01938a8e3278d5a7b52cf4b853666886e48d30f623413b0a36e2b8e17" - } - }, - { - "pathPart": "0x4", - "root": "0x1f176cbfa5e0254f11c0146aa502cd1c84aac713c124c677b1bfafabf15f892b", - "path": [ - { - "value": "0x31a041ed93b6641f89e8295967d7cd4801aa8ca73e1f81e439122f36f3b7f710", - "sibling": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "value": "0xe5f76af6ebb792a20b480a6994b5c2264054d10c610fb8fbb75f2ab5ae9fcb01", - "sibling": "0x37dbfd51b8cacf779ca71e9cfc9d13acc3db6cb917642dd18ca03b10bd9a2f18" - }, - { - "value": "0x7d1b789f4a5411516280fd3b0104a3b5fdc5bbd6df8ea767168c373f15d8ff2d", - "sibling": "0x65a94cbfc1b45c9e0abd5e951a14145d5c8d10628e023b788358e5550d4a7824" - }, - { - "value": "0x3bdbeda9aef8d46ff022e68dff577618fe293b56e576f511353dc0345b89222d", - "sibling": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "value": "0x0b20aef3078beadd95e24db8e1c2d204637fa6ad65a7177fb374818f7c953d1f", - "sibling": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "value": "0x128c276138eb3d65b85b8c4444a6ce99c7c8f1bbf5346702ab7970a7afdc2123", - "sibling": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "value": "0x1c3730c4f23bd1e76d6c9f8a2ae1374ef08b8d19c36afef8ffed8969fcfd9529", - "sibling": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "value": "0x0658a357d896574c898607cb184a4c7f17e85191f40d1e7a0bfce95b8803f713", - "sibling": "0x9ed40c6ac1bdb532038ee26104d46ebe84b2184716fc96410c5228e05c901017" - } - ], - "leaf": { - "value": "0xa2c927e0a1f39fba117081072216e7c98a8ba79511734bb5e2ef40b12dcc2c12", - "sibling": "0x046b3f7277dd2bb9226a061aa719407156457c66b932f8c7241f7b754470dc20" - } - } - ], - "stateUpdate": [ - null, - { - "key": "0x0000000000000000000000000000000000000000000000000000000000000006", - "value": "0x0000000000000000000000001c5a77d9fa7ef466951b2f01f724bca3a5820b63" - } - ] - }, - { - "address": "0x03f8133dd5ed58838b20af1296f62f44e69baa48", - "accountKey": "0x357d8fb5134f3dc48eb1118c6a16ba14eee5d49fe9adaebd5879932694bf320c", - "accountPath": [ - { - "pathPart": "0x1", - "root": "0xfea77ab872522019f637cb99a0a35fab9fd7584f55b818622f5d04c496d8d912", - "path": [ - { - "value": "0x8bc098f2af6fc222476a060d160298ae3f123e2ac7c601869229f369b225f40f", - "sibling": "0x549430921a06705ecd4ebf9a8635f5c735807a4d1aebcdaf6010c8241c8a7e24" - }, - { - "value": "0x7c15f1737fc59c2a1afebe163ee856733a4a6b82de66d50843ab7b46a97a9909", - "sibling": "0x2e591357b02ab3117c35ad94a4e1a724fdbd95d6463da1f6c8017e6d000ecf02" - } - ], - "leaf": { - "value": "0x000f9969c209a3805df18d1e43e7a40409553d4ff3753e4d0571a6e944b1c517", - "sibling": "0x357d8fb5134f3dc48eb1118c6a16ba14eee5d49fe9adaebd5879932694bf320c" - } - }, - { - "pathPart": "0x1", - "root": "0x1ca9391b065cb3cad3b75fdb7602bd07e9e201b6955f5599df71a6a2e22b7126", - "path": [ - { - "value": "0x6c8ac076e40ea7a2bacfa1f2eb4d16228358901eaeb2ff23de2617c2d69d761a", - "sibling": "0x549430921a06705ecd4ebf9a8635f5c735807a4d1aebcdaf6010c8241c8a7e24" - }, - { - "value": "0xc57a28be62e1405f969d7c595ca68ee57ff8c1ea8c1152110958fe5c04993b02", - "sibling": "0x2e591357b02ab3117c35ad94a4e1a724fdbd95d6463da1f6c8017e6d000ecf02" - } - ], - "leaf": { - "value": "0xa4d874cdd5069fb3049ab6fa98e8a38c4147b3aee9ee81c51898a1d95fd9d805", - "sibling": "0x357d8fb5134f3dc48eb1118c6a16ba14eee5d49fe9adaebd5879932694bf320c" - } - } - ], - "accountUpdate": [ - { - "nonce": 1, - "balance": "0x0", - "codeHash": "0x07c28a1f146e6cc6b10bf3e1b0072b4e11300b7fe80d4543dc3bc8bef3e95843" - }, - { - "nonce": 1, - "balance": "0x0", - "codeHash": "0x07c28a1f146e6cc6b10bf3e1b0072b4e11300b7fe80d4543dc3bc8bef3e95843" - } - ], - "stateKey": "0x9e288b3b74343a5f7113836c1764ad0b125ea3cccfa1164bb0bf061d8f409e00", - "statePath": [ - { - "pathPart": "0x2", - "root": "0x1f176cbfa5e0254f11c0146aa502cd1c84aac713c124c677b1bfafabf15f892b", - "path": [ - { - "value": "0x31a041ed93b6641f89e8295967d7cd4801aa8ca73e1f81e439122f36f3b7f710", - "sibling": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "value": "0x37dbfd51b8cacf779ca71e9cfc9d13acc3db6cb917642dd18ca03b10bd9a2f18", - "sibling": "0xe5f76af6ebb792a20b480a6994b5c2264054d10c610fb8fbb75f2ab5ae9fcb01" - } - ], - "leaf": { - "value": "0xf03a062f7dac12aa4a8e1ecf3706890ce02e02be5e95d00650d1c43b6f5d0026", - "sibling": "0x8e1ee9fe8054b1fa6d3989af4e3ca88a801f67f4a497c85ca0fe469d89272923" - } - }, - { - "pathPart": "0x1e", - "root": "0x6415bf82698d10370b73f5729ca9744ad2c933d642c1d59db83708e2eddfab25", - "path": [ - { - "value": "0x05d10e87783ea65c9d90f440ceb8c2f147012020a7dbd6f9fd95de35720dd616", - "sibling": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "value": "0x8047642edb3ed776a59784d319750041a9721b507b98941a8c3d723039a52c1a", - "sibling": "0xe5f76af6ebb792a20b480a6994b5c2264054d10c610fb8fbb75f2ab5ae9fcb01" - }, - { - "value": "0x20b3db0acca1e9b17bb14d3990d75f2a112e1658c75a151bceb5976912a8072b", - "sibling": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "value": "0xd71ff7f2d6d380b7b5d964421c3306112edea7598b290d7c383873354ae0d31a", - "sibling": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, - { - "value": "0x82b38622562739a63a73c983080da4bf23621a5b834eed4bc96f8b60cabe7a29", - "sibling": "0x37dbfd51b8cacf779ca71e9cfc9d13acc3db6cb917642dd18ca03b10bd9a2f18" - } - ], - "leaf": { - "value": "0xa2c927e0a1f39fba117081072216e7c98a8ba79511734bb5e2ef40b12dcc2c12", - "sibling": "0x9e288b3b74343a5f7113836c1764ad0b125ea3cccfa1164bb0bf061d8f409e00" - } - } - ], - "stateUpdate": [ - null, - { - "key": "0x0000000000000000000000000000000000000000000000000000000000000007", - "value": "0x0000000000000000000000001c5a77d9fa7ef466951b2f01f724bca3a5820b63" - } - ] - } - ] -} diff --git a/common/types/batch_header.go b/common/types/batch_header.go deleted file mode 100644 index 85ebfcebd..000000000 --- a/common/types/batch_header.go +++ /dev/null @@ -1,168 +0,0 @@ -package types - -import ( - "encoding/binary" - "fmt" - "math/big" - - "github.com/scroll-tech/go-ethereum/common" - "github.com/scroll-tech/go-ethereum/core/types" - "github.com/scroll-tech/go-ethereum/crypto" -) - -// BatchMeta contains metadata of a batch. -type BatchMeta struct { - StartChunkIndex uint64 - StartChunkHash string - EndChunkIndex uint64 - EndChunkHash string - TotalL1CommitGas uint64 - TotalL1CommitCalldataSize uint32 -} - -// BatchHeader contains batch header info to be committed. -type BatchHeader struct { - // Encoded in BatchHeaderV0Codec - version uint8 - batchIndex uint64 - l1MessagePopped uint64 - totalL1MessagePopped uint64 - dataHash common.Hash - parentBatchHash common.Hash - skippedL1MessageBitmap []byte -} - -// NewBatchHeader creates a new BatchHeader -func NewBatchHeader(version uint8, batchIndex, totalL1MessagePoppedBefore uint64, parentBatchHash common.Hash, chunks []*Chunk) (*BatchHeader, error) { - // buffer for storing chunk hashes in order to compute the batch data hash - var dataBytes []byte - - // skipped L1 message bitmap, an array of 256-bit bitmaps - var skippedBitmap []*big.Int - - // the first queue index that belongs to this batch - baseIndex := totalL1MessagePoppedBefore - - // the next queue index that we need to process - nextIndex := totalL1MessagePoppedBefore - - for chunkID, chunk := range chunks { - // build data hash - totalL1MessagePoppedBeforeChunk := nextIndex - chunkHash, err := chunk.Hash(totalL1MessagePoppedBeforeChunk) - if err != nil { - return nil, err - } - dataBytes = append(dataBytes, chunkHash.Bytes()...) - - // build skip bitmap - for blockID, block := range chunk.Blocks { - for _, tx := range block.Transactions { - if tx.Type != types.L1MessageTxType { - continue - } - currentIndex := tx.Nonce - - if currentIndex < nextIndex { - return nil, fmt.Errorf("unexpected batch payload, expected queue index: %d, got: %d. Batch index: %d, chunk index in batch: %d, block index in chunk: %d, block hash: %v, transaction hash: %v", nextIndex, currentIndex, batchIndex, chunkID, blockID, block.Header.Hash(), tx.TxHash) - } - - // mark skipped messages - for skippedIndex := nextIndex; skippedIndex < currentIndex; skippedIndex++ { - quo := int((skippedIndex - baseIndex) / 256) - rem := int((skippedIndex - baseIndex) % 256) - for len(skippedBitmap) <= quo { - bitmap := big.NewInt(0) - skippedBitmap = append(skippedBitmap, bitmap) - } - skippedBitmap[quo].SetBit(skippedBitmap[quo], rem, 1) - } - - // process included message - quo := int((currentIndex - baseIndex) / 256) - for len(skippedBitmap) <= quo { - bitmap := big.NewInt(0) - skippedBitmap = append(skippedBitmap, bitmap) - } - - nextIndex = currentIndex + 1 - } - } - } - - // compute data hash - dataHash := crypto.Keccak256Hash(dataBytes) - - // compute skipped bitmap - bitmapBytes := make([]byte, len(skippedBitmap)*32) - for ii, num := range skippedBitmap { - bytes := num.Bytes() - padding := 32 - len(bytes) - copy(bitmapBytes[32*ii+padding:], bytes) - } - - return &BatchHeader{ - version: version, - batchIndex: batchIndex, - l1MessagePopped: nextIndex - totalL1MessagePoppedBefore, - totalL1MessagePopped: nextIndex, - dataHash: dataHash, - parentBatchHash: parentBatchHash, - skippedL1MessageBitmap: bitmapBytes, - }, nil -} - -// Version returns the version of the BatchHeader. -func (b *BatchHeader) Version() uint8 { - return b.version -} - -// BatchIndex returns the batch index of the BatchHeader. -func (b *BatchHeader) BatchIndex() uint64 { - return b.batchIndex -} - -// TotalL1MessagePopped returns the total number of L1 messages popped in the BatchHeader. -func (b *BatchHeader) TotalL1MessagePopped() uint64 { - return b.totalL1MessagePopped -} - -// SkippedL1MessageBitmap returns the skipped L1 message bitmap in the BatchHeader. -func (b *BatchHeader) SkippedL1MessageBitmap() []byte { - return b.skippedL1MessageBitmap -} - -// Encode encodes the BatchHeader into RollupV2 BatchHeaderV0Codec Encoding. -func (b *BatchHeader) Encode() []byte { - batchBytes := make([]byte, 89+len(b.skippedL1MessageBitmap)) - batchBytes[0] = b.version - binary.BigEndian.PutUint64(batchBytes[1:], b.batchIndex) - binary.BigEndian.PutUint64(batchBytes[9:], b.l1MessagePopped) - binary.BigEndian.PutUint64(batchBytes[17:], b.totalL1MessagePopped) - copy(batchBytes[25:], b.dataHash[:]) - copy(batchBytes[57:], b.parentBatchHash[:]) - copy(batchBytes[89:], b.skippedL1MessageBitmap[:]) - return batchBytes -} - -// Hash calculates the hash of the batch header. -func (b *BatchHeader) Hash() common.Hash { - return crypto.Keccak256Hash(b.Encode()) -} - -// DecodeBatchHeader attempts to decode the given byte slice into a BatchHeader. -func DecodeBatchHeader(data []byte) (*BatchHeader, error) { - if len(data) < 89 { - return nil, fmt.Errorf("insufficient data for BatchHeader") - } - b := &BatchHeader{ - version: data[0], - batchIndex: binary.BigEndian.Uint64(data[1:9]), - l1MessagePopped: binary.BigEndian.Uint64(data[9:17]), - totalL1MessagePopped: binary.BigEndian.Uint64(data[17:25]), - dataHash: common.BytesToHash(data[25:57]), - parentBatchHash: common.BytesToHash(data[57:89]), - skippedL1MessageBitmap: data[89:], - } - return b, nil -} diff --git a/common/types/batch_header_test.go b/common/types/batch_header_test.go deleted file mode 100644 index c0de7575b..000000000 --- a/common/types/batch_header_test.go +++ /dev/null @@ -1,251 +0,0 @@ -package types - -import ( - "encoding/json" - "os" - "testing" - - "github.com/scroll-tech/go-ethereum/common" - "github.com/stretchr/testify/assert" -) - -func TestNewBatchHeader(t *testing.T) { - // Without L1 Msg - templateBlockTrace, err := os.ReadFile("../testdata/blockTrace_02.json") - assert.NoError(t, err) - - wrappedBlock := &WrappedBlock{} - assert.NoError(t, json.Unmarshal(templateBlockTrace, wrappedBlock)) - chunk := &Chunk{ - Blocks: []*WrappedBlock{ - wrappedBlock, - }, - } - parentBatchHeader := &BatchHeader{ - version: 1, - batchIndex: 0, - l1MessagePopped: 0, - totalL1MessagePopped: 0, - dataHash: common.HexToHash("0x0"), - parentBatchHash: common.HexToHash("0x0"), - skippedL1MessageBitmap: nil, - } - batchHeader, err := NewBatchHeader(1, 1, 0, parentBatchHeader.Hash(), []*Chunk{chunk}) - assert.NoError(t, err) - assert.NotNil(t, batchHeader) - assert.Equal(t, 0, len(batchHeader.skippedL1MessageBitmap)) - - // 1 L1 Msg in 1 bitmap - templateBlockTrace2, err := os.ReadFile("../testdata/blockTrace_04.json") - assert.NoError(t, err) - - wrappedBlock2 := &WrappedBlock{} - assert.NoError(t, json.Unmarshal(templateBlockTrace2, wrappedBlock2)) - chunk = &Chunk{ - Blocks: []*WrappedBlock{ - wrappedBlock2, - }, - } - batchHeader, err = NewBatchHeader(1, 1, 0, parentBatchHeader.Hash(), []*Chunk{chunk}) - assert.NoError(t, err) - assert.NotNil(t, batchHeader) - assert.Equal(t, 32, len(batchHeader.skippedL1MessageBitmap)) - expectedBitmap := "00000000000000000000000000000000000000000000000000000000000003ff" // skip first 10 - assert.Equal(t, expectedBitmap, common.Bytes2Hex(batchHeader.skippedL1MessageBitmap)) - - // many consecutive L1 Msgs in 1 bitmap, no leading skipped msgs - templateBlockTrace3, err := os.ReadFile("../testdata/blockTrace_05.json") - assert.NoError(t, err) - - wrappedBlock3 := &WrappedBlock{} - assert.NoError(t, json.Unmarshal(templateBlockTrace3, wrappedBlock3)) - chunk = &Chunk{ - Blocks: []*WrappedBlock{ - wrappedBlock3, - }, - } - batchHeader, err = NewBatchHeader(1, 1, 37, parentBatchHeader.Hash(), []*Chunk{chunk}) - assert.NoError(t, err) - assert.NotNil(t, batchHeader) - assert.Equal(t, uint64(5), batchHeader.l1MessagePopped) - assert.Equal(t, 32, len(batchHeader.skippedL1MessageBitmap)) - expectedBitmap = "0000000000000000000000000000000000000000000000000000000000000000" // all bits are included, so none are skipped - assert.Equal(t, expectedBitmap, common.Bytes2Hex(batchHeader.skippedL1MessageBitmap)) - - // many consecutive L1 Msgs in 1 bitmap, with leading skipped msgs - chunk = &Chunk{ - Blocks: []*WrappedBlock{ - wrappedBlock3, - }, - } - batchHeader, err = NewBatchHeader(1, 1, 0, parentBatchHeader.Hash(), []*Chunk{chunk}) - assert.NoError(t, err) - assert.NotNil(t, batchHeader) - assert.Equal(t, uint64(42), batchHeader.l1MessagePopped) - assert.Equal(t, 32, len(batchHeader.skippedL1MessageBitmap)) - expectedBitmap = "0000000000000000000000000000000000000000000000000000001fffffffff" // skipped the first 37 messages - assert.Equal(t, expectedBitmap, common.Bytes2Hex(batchHeader.skippedL1MessageBitmap)) - - // many sparse L1 Msgs in 1 bitmap - templateBlockTrace4, err := os.ReadFile("../testdata/blockTrace_06.json") - assert.NoError(t, err) - - wrappedBlock4 := &WrappedBlock{} - assert.NoError(t, json.Unmarshal(templateBlockTrace4, wrappedBlock4)) - chunk = &Chunk{ - Blocks: []*WrappedBlock{ - wrappedBlock4, - }, - } - batchHeader, err = NewBatchHeader(1, 1, 0, parentBatchHeader.Hash(), []*Chunk{chunk}) - assert.NoError(t, err) - assert.NotNil(t, batchHeader) - assert.Equal(t, uint64(10), batchHeader.l1MessagePopped) - assert.Equal(t, 32, len(batchHeader.skippedL1MessageBitmap)) - expectedBitmap = "00000000000000000000000000000000000000000000000000000000000001dd" // 0111011101 - assert.Equal(t, expectedBitmap, common.Bytes2Hex(batchHeader.skippedL1MessageBitmap)) - - // many L1 Msgs in each of 2 bitmaps - templateBlockTrace5, err := os.ReadFile("../testdata/blockTrace_07.json") - assert.NoError(t, err) - - wrappedBlock5 := &WrappedBlock{} - assert.NoError(t, json.Unmarshal(templateBlockTrace5, wrappedBlock5)) - chunk = &Chunk{ - Blocks: []*WrappedBlock{ - wrappedBlock5, - }, - } - batchHeader, err = NewBatchHeader(1, 1, 0, parentBatchHeader.Hash(), []*Chunk{chunk}) - assert.NoError(t, err) - assert.NotNil(t, batchHeader) - assert.Equal(t, uint64(257), batchHeader.l1MessagePopped) - assert.Equal(t, 64, len(batchHeader.skippedL1MessageBitmap)) - expectedBitmap = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0000000000000000000000000000000000000000000000000000000000000000" - assert.Equal(t, expectedBitmap, common.Bytes2Hex(batchHeader.skippedL1MessageBitmap)) -} - -func TestBatchHeaderEncode(t *testing.T) { - // Without L1 Msg - templateBlockTrace, err := os.ReadFile("../testdata/blockTrace_02.json") - assert.NoError(t, err) - - wrappedBlock := &WrappedBlock{} - assert.NoError(t, json.Unmarshal(templateBlockTrace, wrappedBlock)) - chunk := &Chunk{ - Blocks: []*WrappedBlock{ - wrappedBlock, - }, - } - parentBatchHeader := &BatchHeader{ - version: 1, - batchIndex: 0, - l1MessagePopped: 0, - totalL1MessagePopped: 0, - dataHash: common.HexToHash("0x0"), - parentBatchHash: common.HexToHash("0x0"), - skippedL1MessageBitmap: nil, - } - batchHeader, err := NewBatchHeader(1, 1, 0, parentBatchHeader.Hash(), []*Chunk{chunk}) - assert.NoError(t, err) - assert.NotNil(t, batchHeader) - bytes := batchHeader.Encode() - assert.Equal(t, 89, len(bytes)) - assert.Equal(t, "0100000000000000010000000000000000000000000000000010a64c9bd905f8caf5d668fbda622d6558c5a42cdb4b3895709743d159c22e534136709aabc8a23aa17fbcc833da2f7857d3c2884feec9aae73429c135f94985", common.Bytes2Hex(bytes)) - - // With L1 Msg - templateBlockTrace2, err := os.ReadFile("../testdata/blockTrace_04.json") - assert.NoError(t, err) - - wrappedBlock2 := &WrappedBlock{} - assert.NoError(t, json.Unmarshal(templateBlockTrace2, wrappedBlock2)) - chunk = &Chunk{ - Blocks: []*WrappedBlock{ - wrappedBlock2, - }, - } - batchHeader, err = NewBatchHeader(1, 1, 0, parentBatchHeader.Hash(), []*Chunk{chunk}) - assert.NoError(t, err) - assert.NotNil(t, batchHeader) - bytes = batchHeader.Encode() - assert.Equal(t, 121, len(bytes)) - assert.Equal(t, "010000000000000001000000000000000b000000000000000b34f419ce7e882295bdb5aec6cce56ffa788a5fed4744d7fbd77e4acbf409f1ca4136709aabc8a23aa17fbcc833da2f7857d3c2884feec9aae73429c135f9498500000000000000000000000000000000000000000000000000000000000003ff", common.Bytes2Hex(bytes)) -} - -func TestBatchHeaderHash(t *testing.T) { - // Without L1 Msg - templateBlockTrace, err := os.ReadFile("../testdata/blockTrace_02.json") - assert.NoError(t, err) - - wrappedBlock := &WrappedBlock{} - assert.NoError(t, json.Unmarshal(templateBlockTrace, wrappedBlock)) - chunk := &Chunk{ - Blocks: []*WrappedBlock{ - wrappedBlock, - }, - } - parentBatchHeader := &BatchHeader{ - version: 1, - batchIndex: 0, - l1MessagePopped: 0, - totalL1MessagePopped: 0, - dataHash: common.HexToHash("0x0"), - parentBatchHash: common.HexToHash("0x0"), - skippedL1MessageBitmap: nil, - } - batchHeader, err := NewBatchHeader(1, 1, 0, parentBatchHeader.Hash(), []*Chunk{chunk}) - assert.NoError(t, err) - assert.NotNil(t, batchHeader) - hash := batchHeader.Hash() - assert.Equal(t, "d69da4357da0073f4093c76e49f077e21bb52f48f57ee3e1fbd9c38a2881af81", common.Bytes2Hex(hash.Bytes())) - - templateBlockTrace, err = os.ReadFile("../testdata/blockTrace_03.json") - assert.NoError(t, err) - - wrappedBlock2 := &WrappedBlock{} - assert.NoError(t, json.Unmarshal(templateBlockTrace, wrappedBlock2)) - chunk2 := &Chunk{ - Blocks: []*WrappedBlock{ - wrappedBlock2, - }, - } - batchHeader2, err := NewBatchHeader(1, 2, 0, batchHeader.Hash(), []*Chunk{chunk2}) - assert.NoError(t, err) - assert.NotNil(t, batchHeader2) - hash2 := batchHeader2.Hash() - assert.Equal(t, "34de600163aa745d4513113137a5b54960d13f0d3f2849e490c4b875028bf930", common.Bytes2Hex(hash2.Bytes())) - - // With L1 Msg - templateBlockTrace3, err := os.ReadFile("../testdata/blockTrace_04.json") - assert.NoError(t, err) - - wrappedBlock3 := &WrappedBlock{} - assert.NoError(t, json.Unmarshal(templateBlockTrace3, wrappedBlock3)) - chunk = &Chunk{ - Blocks: []*WrappedBlock{ - wrappedBlock3, - }, - } - batchHeader, err = NewBatchHeader(1, 1, 0, parentBatchHeader.Hash(), []*Chunk{chunk}) - assert.NoError(t, err) - assert.NotNil(t, batchHeader) - hash = batchHeader.Hash() - assert.Equal(t, "1c3007880f0eafe74572ede7d164ff1ee5376e9ac9bff6f7fb837b2630cddc9a", common.Bytes2Hex(hash.Bytes())) -} - -func TestBatchHeaderDecode(t *testing.T) { - header := &BatchHeader{ - version: 1, - batchIndex: 10, - l1MessagePopped: 20, - totalL1MessagePopped: 30, - dataHash: common.HexToHash("0x01"), - parentBatchHash: common.HexToHash("0x02"), - skippedL1MessageBitmap: []byte{0x01, 0x02, 0x03}, - } - - encoded := header.Encode() - decoded, err := DecodeBatchHeader(encoded) - assert.NoError(t, err) - assert.Equal(t, header, decoded) -} diff --git a/common/types/block.go b/common/types/block.go deleted file mode 100644 index 64b8c70e8..000000000 --- a/common/types/block.go +++ /dev/null @@ -1,193 +0,0 @@ -package types - -import ( - "encoding/binary" - "errors" - "fmt" - "math" - - "github.com/scroll-tech/go-ethereum/common" - "github.com/scroll-tech/go-ethereum/common/hexutil" - "github.com/scroll-tech/go-ethereum/core/types" - "github.com/scroll-tech/go-ethereum/log" -) - -// CalldataNonZeroByteGas is the gas consumption per non zero byte in calldata. -const CalldataNonZeroByteGas = 16 - -// GetKeccak256Gas calculates the gas cost for computing the keccak256 hash of a given size. -func GetKeccak256Gas(size uint64) uint64 { - return GetMemoryExpansionCost(size) + 30 + 6*((size+31)/32) -} - -// GetMemoryExpansionCost calculates the cost of memory expansion for a given memoryByteSize. -func GetMemoryExpansionCost(memoryByteSize uint64) uint64 { - memorySizeWord := (memoryByteSize + 31) / 32 - memoryCost := (memorySizeWord*memorySizeWord)/512 + (3 * memorySizeWord) - return memoryCost -} - -// WrappedBlock contains the block's Header, Transactions and WithdrawTrieRoot hash. -type WrappedBlock struct { - Header *types.Header `json:"header"` - // Transactions is only used for recover types.Transactions, the from of types.TransactionData field is missing. - Transactions []*types.TransactionData `json:"transactions"` - WithdrawRoot common.Hash `json:"withdraw_trie_root,omitempty"` - RowConsumption *types.RowConsumption `json:"row_consumption"` - txPayloadLengthCache map[string]uint64 -} - -// NumL1Messages returns the number of L1 messages in this block. -// This number is the sum of included and skipped L1 messages. -func (w *WrappedBlock) NumL1Messages(totalL1MessagePoppedBefore uint64) uint64 { - var lastQueueIndex *uint64 - for _, txData := range w.Transactions { - if txData.Type == types.L1MessageTxType { - lastQueueIndex = &txData.Nonce - } - } - if lastQueueIndex == nil { - return 0 - } - // note: last queue index included before this block is totalL1MessagePoppedBefore - 1 - // TODO: cache results - return *lastQueueIndex - totalL1MessagePoppedBefore + 1 -} - -// NumL2Transactions returns the number of L2 transactions in this block. -func (w *WrappedBlock) NumL2Transactions() uint64 { - var count uint64 - for _, txData := range w.Transactions { - if txData.Type != types.L1MessageTxType { - count++ - } - } - return count -} - -// Encode encodes the WrappedBlock into RollupV2 BlockContext Encoding. -func (w *WrappedBlock) Encode(totalL1MessagePoppedBefore uint64) ([]byte, error) { - bytes := make([]byte, 60) - - if !w.Header.Number.IsUint64() { - return nil, errors.New("block number is not uint64") - } - - // note: numL1Messages includes skipped messages - numL1Messages := w.NumL1Messages(totalL1MessagePoppedBefore) - if numL1Messages > math.MaxUint16 { - return nil, errors.New("number of L1 messages exceeds max uint16") - } - - // note: numTransactions includes skipped messages - numL2Transactions := w.NumL2Transactions() - numTransactions := numL1Messages + numL2Transactions - if numTransactions > math.MaxUint16 { - return nil, errors.New("number of transactions exceeds max uint16") - } - - binary.BigEndian.PutUint64(bytes[0:], w.Header.Number.Uint64()) - binary.BigEndian.PutUint64(bytes[8:], w.Header.Time) - // TODO: [16:47] Currently, baseFee is 0, because we disable EIP-1559. - binary.BigEndian.PutUint64(bytes[48:], w.Header.GasLimit) - binary.BigEndian.PutUint16(bytes[56:], uint16(numTransactions)) - binary.BigEndian.PutUint16(bytes[58:], uint16(numL1Messages)) - - return bytes, nil -} - -// EstimateL1CommitCalldataSize calculates the calldata size in l1 commit approximately. -// TODO: The calculation could be more accurate by using 58 + len(l2TxDataBytes) (see Chunk). -// This needs to be adjusted in the future. -func (w *WrappedBlock) EstimateL1CommitCalldataSize() uint64 { - var size uint64 - for _, txData := range w.Transactions { - if txData.Type == types.L1MessageTxType { - continue - } - size += 4 // 4 bytes payload length - size += w.getTxPayloadLength(txData) - } - size += 60 // 60 bytes BlockContext - return size -} - -// EstimateL1CommitGas calculates the total L1 commit gas for this block approximately. -func (w *WrappedBlock) EstimateL1CommitGas() uint64 { - var total uint64 - var numL1Messages uint64 - for _, txData := range w.Transactions { - if txData.Type == types.L1MessageTxType { - numL1Messages++ - continue - } - - txPayloadLength := w.getTxPayloadLength(txData) - total += CalldataNonZeroByteGas * txPayloadLength // an over-estimate: treat each byte as non-zero - total += CalldataNonZeroByteGas * 4 // 4 bytes payload length - total += GetKeccak256Gas(txPayloadLength) // l2 tx hash - } - - // 60 bytes BlockContext calldata - total += CalldataNonZeroByteGas * 60 - - // sload - total += 2100 * numL1Messages // numL1Messages times cold sload in L1MessageQueue - - // staticcall - total += 100 * numL1Messages // numL1Messages times call to L1MessageQueue - total += 100 * numL1Messages // numL1Messages times warm address access to L1MessageQueue - - total += GetMemoryExpansionCost(36) * numL1Messages // staticcall to proxy - total += 100 * numL1Messages // read admin in proxy - total += 100 * numL1Messages // read impl in proxy - total += 100 * numL1Messages // access impl - total += GetMemoryExpansionCost(36) * numL1Messages // delegatecall to impl - - return total -} - -func (w *WrappedBlock) getTxPayloadLength(txData *types.TransactionData) uint64 { - if w.txPayloadLengthCache == nil { - w.txPayloadLengthCache = make(map[string]uint64) - } - - if length, exists := w.txPayloadLengthCache[txData.TxHash]; exists { - return length - } - - rlpTxData, err := convertTxDataToRLPEncoding(txData) - if err != nil { - log.Crit("convertTxDataToRLPEncoding failed, which should not happen", "hash", txData.TxHash, "err", err) - return 0 - } - txPayloadLength := uint64(len(rlpTxData)) - w.txPayloadLengthCache[txData.TxHash] = txPayloadLength - return txPayloadLength -} - -func convertTxDataToRLPEncoding(txData *types.TransactionData) ([]byte, error) { - data, err := hexutil.Decode(txData.Data) - if err != nil { - return nil, fmt.Errorf("failed to decode txData.Data: %s, err: %w", txData.Data, err) - } - - tx := types.NewTx(&types.LegacyTx{ - Nonce: txData.Nonce, - To: txData.To, - Value: txData.Value.ToInt(), - Gas: txData.Gas, - GasPrice: txData.GasPrice.ToInt(), - Data: data, - V: txData.V.ToInt(), - R: txData.R.ToInt(), - S: txData.S.ToInt(), - }) - - rlpTxData, err := tx.MarshalBinary() - if err != nil { - return nil, fmt.Errorf("failed to marshal binary of the tx: %+v, err: %w", tx, err) - } - - return rlpTxData, nil -} diff --git a/common/types/chunk.go b/common/types/chunk.go deleted file mode 100644 index feba818de..000000000 --- a/common/types/chunk.go +++ /dev/null @@ -1,138 +0,0 @@ -package types - -import ( - "encoding/binary" - "encoding/hex" - "errors" - "fmt" - "strings" - - "github.com/scroll-tech/go-ethereum/common" - "github.com/scroll-tech/go-ethereum/core/types" - "github.com/scroll-tech/go-ethereum/crypto" -) - -// Chunk contains blocks to be encoded -type Chunk struct { - Blocks []*WrappedBlock `json:"blocks"` -} - -// NumL1Messages returns the number of L1 messages in this chunk. -// This number is the sum of included and skipped L1 messages. -func (c *Chunk) NumL1Messages(totalL1MessagePoppedBefore uint64) uint64 { - var numL1Messages uint64 - for _, block := range c.Blocks { - numL1MessagesInBlock := block.NumL1Messages(totalL1MessagePoppedBefore) - numL1Messages += numL1MessagesInBlock - totalL1MessagePoppedBefore += numL1MessagesInBlock - } - // TODO: cache results - return numL1Messages -} - -// Encode encodes the Chunk into RollupV2 Chunk Encoding. -func (c *Chunk) Encode(totalL1MessagePoppedBefore uint64) ([]byte, error) { - numBlocks := len(c.Blocks) - - if numBlocks > 255 { - return nil, errors.New("number of blocks exceeds 1 byte") - } - if numBlocks == 0 { - return nil, errors.New("number of blocks is 0") - } - - var chunkBytes []byte - chunkBytes = append(chunkBytes, byte(numBlocks)) - - var l2TxDataBytes []byte - - for _, block := range c.Blocks { - blockBytes, err := block.Encode(totalL1MessagePoppedBefore) - if err != nil { - return nil, fmt.Errorf("failed to encode block: %v", err) - } - totalL1MessagePoppedBefore += block.NumL1Messages(totalL1MessagePoppedBefore) - - if len(blockBytes) != 60 { - return nil, fmt.Errorf("block encoding is not 60 bytes long %x", len(blockBytes)) - } - - chunkBytes = append(chunkBytes, blockBytes...) - - // Append rlp-encoded l2Txs - for _, txData := range block.Transactions { - if txData.Type == types.L1MessageTxType { - continue - } - rlpTxData, err := convertTxDataToRLPEncoding(txData) - if err != nil { - return nil, err - } - var txLen [4]byte - binary.BigEndian.PutUint32(txLen[:], uint32(len(rlpTxData))) - l2TxDataBytes = append(l2TxDataBytes, txLen[:]...) - l2TxDataBytes = append(l2TxDataBytes, rlpTxData...) - } - } - - chunkBytes = append(chunkBytes, l2TxDataBytes...) - - return chunkBytes, nil -} - -// Hash hashes the Chunk into RollupV2 Chunk Hash -func (c *Chunk) Hash(totalL1MessagePoppedBefore uint64) (common.Hash, error) { - chunkBytes, err := c.Encode(totalL1MessagePoppedBefore) - if err != nil { - return common.Hash{}, err - } - numBlocks := chunkBytes[0] - - // concatenate block contexts - var dataBytes []byte - for i := 0; i < int(numBlocks); i++ { - // only the first 58 bytes of each BlockContext are needed for the hashing process - dataBytes = append(dataBytes, chunkBytes[1+60*i:60*i+59]...) - } - - // concatenate l1 and l2 tx hashes - for _, block := range c.Blocks { - var l1TxHashes []byte - var l2TxHashes []byte - for _, txData := range block.Transactions { - txHash := strings.TrimPrefix(txData.TxHash, "0x") - hashBytes, err := hex.DecodeString(txHash) - if err != nil { - return common.Hash{}, err - } - if txData.Type == types.L1MessageTxType { - l1TxHashes = append(l1TxHashes, hashBytes...) - } else { - l2TxHashes = append(l2TxHashes, hashBytes...) - } - } - dataBytes = append(dataBytes, l1TxHashes...) - dataBytes = append(dataBytes, l2TxHashes...) - } - - hash := crypto.Keccak256Hash(dataBytes) - return hash, nil -} - -// EstimateL1CommitGas calculates the total L1 commit gas for this chunk approximately -func (c *Chunk) EstimateL1CommitGas() uint64 { - var totalTxNum uint64 - var totalL1CommitGas uint64 - for _, block := range c.Blocks { - totalTxNum += uint64(len(block.Transactions)) - totalL1CommitGas += block.EstimateL1CommitGas() - } - - numBlocks := uint64(len(c.Blocks)) - totalL1CommitGas += 100 * numBlocks // numBlocks times warm sload - totalL1CommitGas += CalldataNonZeroByteGas // numBlocks field of chunk encoding in calldata - totalL1CommitGas += CalldataNonZeroByteGas * numBlocks * 60 // numBlocks of BlockContext in chunk - - totalL1CommitGas += GetKeccak256Gas(58*numBlocks + 32*totalTxNum) // chunk hash - return totalL1CommitGas -} diff --git a/common/types/chunk_test.go b/common/types/chunk_test.go deleted file mode 100644 index 8d7e27f08..000000000 --- a/common/types/chunk_test.go +++ /dev/null @@ -1,226 +0,0 @@ -package types - -import ( - "encoding/hex" - "encoding/json" - "os" - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestChunkEncode(t *testing.T) { - // Test case 1: when the chunk contains no blocks. - chunk := &Chunk{ - Blocks: []*WrappedBlock{}, - } - bytes, err := chunk.Encode(0) - assert.Nil(t, bytes) - assert.Error(t, err) - assert.Contains(t, err.Error(), "number of blocks is 0") - - // Test case 2: when the chunk contains more than 255 blocks. - chunk = &Chunk{ - Blocks: []*WrappedBlock{}, - } - for i := 0; i < 256; i++ { - chunk.Blocks = append(chunk.Blocks, &WrappedBlock{}) - } - bytes, err = chunk.Encode(0) - assert.Nil(t, bytes) - assert.Error(t, err) - assert.Contains(t, err.Error(), "number of blocks exceeds 1 byte") - - // Test case 3: when the chunk contains one block. - templateBlockTrace, err := os.ReadFile("../testdata/blockTrace_02.json") - assert.NoError(t, err) - - wrappedBlock := &WrappedBlock{} - assert.NoError(t, json.Unmarshal(templateBlockTrace, wrappedBlock)) - assert.Equal(t, uint64(0), wrappedBlock.NumL1Messages(0)) - assert.Equal(t, uint64(298), wrappedBlock.EstimateL1CommitCalldataSize()) - assert.Equal(t, uint64(2), wrappedBlock.NumL2Transactions()) - chunk = &Chunk{ - Blocks: []*WrappedBlock{ - wrappedBlock, - }, - } - assert.Equal(t, uint64(0), chunk.NumL1Messages(0)) - assert.Equal(t, uint64(6042), chunk.EstimateL1CommitGas()) - bytes, err = chunk.Encode(0) - hexString := hex.EncodeToString(bytes) - assert.NoError(t, err) - assert.Equal(t, 299, len(bytes)) - assert.Equal(t, "0100000000000000020000000063807b2a0000000000000000000000000000000000000000000000000000000000000000000355418d1e81840002000000000073f87180843b9aec2e8307a12094c0c4c8baea3f6acb49b6e1fb9e2adeceeacb0ca28a152d02c7e14af60000008083019ecea0ab07ae99c67aa78e7ba5cf6781e90cc32b219b1de102513d56548a41e86df514a034cbd19feacd73e8ce64d00c4d1996b9b5243c578fd7f51bfaec288bbaf42a8b00000073f87101843b9aec2e8307a1209401bae6bf68e9a03fb2bc0615b1bf0d69ce9411ed8a152d02c7e14af60000008083019ecea0f039985866d8256f10c1be4f7b2cace28d8f20bde27e2604393eb095b7f77316a05a3e6e81065f2b4604bcec5bd4aba684835996fc3f879380aac1c09c6eed32f1", hexString) - - // Test case 4: when the chunk contains one block with 1 L1MsgTx - templateBlockTrace2, err := os.ReadFile("../testdata/blockTrace_04.json") - assert.NoError(t, err) - - wrappedBlock2 := &WrappedBlock{} - assert.NoError(t, json.Unmarshal(templateBlockTrace2, wrappedBlock2)) - assert.Equal(t, uint64(11), wrappedBlock2.NumL1Messages(0)) // 0..=9 skipped, 10 included - assert.Equal(t, uint64(96), wrappedBlock2.EstimateL1CommitCalldataSize()) - assert.Equal(t, uint64(1), wrappedBlock2.NumL2Transactions()) - chunk = &Chunk{ - Blocks: []*WrappedBlock{ - wrappedBlock2, - }, - } - assert.Equal(t, uint64(11), chunk.NumL1Messages(0)) - assert.Equal(t, uint64(5329), chunk.EstimateL1CommitGas()) - bytes, err = chunk.Encode(0) - hexString = hex.EncodeToString(bytes) - assert.NoError(t, err) - assert.Equal(t, 97, len(bytes)) - assert.Equal(t, "01000000000000000d00000000646b6e13000000000000000000000000000000000000000000000000000000000000000000000000007a1200000c000b00000020df0b80825dc0941a258d17bf244c4df02d40343a7626a9d321e1058080808080", hexString) - - // Test case 5: when the chunk contains two blocks each with 1 L1MsgTx - // TODO: revise this test, we cannot reuse the same L1MsgTx twice - chunk = &Chunk{ - Blocks: []*WrappedBlock{ - wrappedBlock2, - wrappedBlock2, - }, - } - assert.Equal(t, uint64(11), chunk.NumL1Messages(0)) - assert.Equal(t, uint64(10612), chunk.EstimateL1CommitGas()) - bytes, err = chunk.Encode(0) - hexString = hex.EncodeToString(bytes) - assert.NoError(t, err) - assert.Equal(t, 193, len(bytes)) - assert.Equal(t, "02000000000000000d00000000646b6e13000000000000000000000000000000000000000000000000000000000000000000000000007a1200000c000b000000000000000d00000000646b6e13000000000000000000000000000000000000000000000000000000000000000000000000007a12000001000000000020df0b80825dc0941a258d17bf244c4df02d40343a7626a9d321e105808080808000000020df0b80825dc0941a258d17bf244c4df02d40343a7626a9d321e1058080808080", hexString) -} - -func TestChunkHash(t *testing.T) { - // Test case 1: when the chunk contains no blocks - chunk := &Chunk{ - Blocks: []*WrappedBlock{}, - } - hash, err := chunk.Hash(0) - assert.Error(t, err) - assert.Equal(t, "0x0000000000000000000000000000000000000000000000000000000000000000", hash.Hex()) - assert.Contains(t, err.Error(), "number of blocks is 0") - - // Test case 2: successfully hashing a chunk on one block - templateBlockTrace, err := os.ReadFile("../testdata/blockTrace_02.json") - assert.NoError(t, err) - wrappedBlock := &WrappedBlock{} - assert.NoError(t, json.Unmarshal(templateBlockTrace, wrappedBlock)) - chunk = &Chunk{ - Blocks: []*WrappedBlock{ - wrappedBlock, - }, - } - hash, err = chunk.Hash(0) - assert.NoError(t, err) - assert.Equal(t, "0x78c839dfc494396c16b40946f32b3f4c3e8c2d4bfd04aefcf235edec474482f8", hash.Hex()) - - // Test case 3: successfully hashing a chunk on two blocks - templateBlockTrace1, err := os.ReadFile("../testdata/blockTrace_03.json") - assert.NoError(t, err) - wrappedBlock1 := &WrappedBlock{} - assert.NoError(t, json.Unmarshal(templateBlockTrace1, wrappedBlock1)) - chunk = &Chunk{ - Blocks: []*WrappedBlock{ - wrappedBlock, - wrappedBlock1, - }, - } - hash, err = chunk.Hash(0) - assert.NoError(t, err) - assert.Equal(t, "0xaa9e494f72bc6965857856f0fae6916f27b2a6591c714a573b2fab46df03b8ae", hash.Hex()) - - // Test case 4: successfully hashing a chunk on two blocks each with L1 and L2 txs - templateBlockTrace2, err := os.ReadFile("../testdata/blockTrace_04.json") - assert.NoError(t, err) - wrappedBlock2 := &WrappedBlock{} - assert.NoError(t, json.Unmarshal(templateBlockTrace2, wrappedBlock2)) - chunk = &Chunk{ - Blocks: []*WrappedBlock{ - wrappedBlock2, - wrappedBlock2, - }, - } - hash, err = chunk.Hash(0) - assert.NoError(t, err) - assert.Equal(t, "0x2eb7dd63bf8fc29a0f8c10d16c2ae6f9da446907c79d50f5c164d30dc8526b60", hash.Hex()) -} - -func TestErrorPaths(t *testing.T) { - // test 1: Header.Number is not a uint64 - templateBlockTrace, err := os.ReadFile("../testdata/blockTrace_02.json") - assert.NoError(t, err) - - wrappedBlock := &WrappedBlock{} - - assert.NoError(t, json.Unmarshal(templateBlockTrace, wrappedBlock)) - wrappedBlock.Header.Number = wrappedBlock.Header.Number.Lsh(wrappedBlock.Header.Number, 64) - bytes, err := wrappedBlock.Encode(0) - assert.Nil(t, bytes) - assert.Error(t, err) - assert.Contains(t, err.Error(), "block number is not uint64") - - assert.NoError(t, json.Unmarshal(templateBlockTrace, wrappedBlock)) - for i := 0; i < 65537; i++ { - wrappedBlock.Transactions = append(wrappedBlock.Transactions, wrappedBlock.Transactions[0]) - } - - bytes, err = wrappedBlock.Encode(0) - assert.Nil(t, bytes) - assert.Error(t, err) - assert.Contains(t, err.Error(), "number of transactions exceeds max uint16") - - chunk := &Chunk{ - Blocks: []*WrappedBlock{ - wrappedBlock, - }, - } - - bytes, err = chunk.Encode(0) - assert.Nil(t, bytes) - assert.Error(t, err) - assert.Contains(t, err.Error(), "number of transactions exceeds max uint16") - - wrappedBlock.Transactions = wrappedBlock.Transactions[:1] - wrappedBlock.Transactions[0].Data = "not-a-hex" - bytes, err = chunk.Encode(0) - assert.Nil(t, bytes) - assert.Error(t, err) - assert.Contains(t, err.Error(), "hex string without 0x prefix") - - assert.NoError(t, json.Unmarshal(templateBlockTrace, wrappedBlock)) - wrappedBlock.Transactions[0].TxHash = "not-a-hex" - _, err = chunk.Hash(0) - assert.Error(t, err) - assert.Contains(t, err.Error(), "invalid byte") - - templateBlockTrace2, err := os.ReadFile("../testdata/blockTrace_04.json") - assert.NoError(t, err) - - wrappedBlock2 := &WrappedBlock{} - assert.NoError(t, json.Unmarshal(templateBlockTrace2, wrappedBlock2)) - for i := 0; i < 65535; i++ { - tx := &wrappedBlock2.Transactions[i] - txCopy := *tx - txCopy.Nonce = uint64(i + 1) - wrappedBlock2.Transactions = append(wrappedBlock2.Transactions, txCopy) - } - - bytes, err = wrappedBlock2.Encode(0) - assert.Nil(t, bytes) - assert.Error(t, err) - assert.Contains(t, err.Error(), "number of L1 messages exceeds max uint16") - - chunk = &Chunk{ - Blocks: []*WrappedBlock{ - wrappedBlock2, - }, - } - - bytes, err = chunk.Encode(0) - assert.Nil(t, bytes) - assert.Error(t, err) - assert.Contains(t, err.Error(), "number of L1 messages exceeds max uint16") - -} diff --git a/common/types/encoding/bitmap.go b/common/types/encoding/bitmap.go new file mode 100644 index 000000000..87fc31c64 --- /dev/null +++ b/common/types/encoding/bitmap.go @@ -0,0 +1,64 @@ +package encoding + +import ( + "fmt" + "math/big" + + "github.com/scroll-tech/go-ethereum/core/types" +) + +// ConstructSkippedBitmap constructs skipped L1 message bitmap of the batch. +func ConstructSkippedBitmap(batchIndex uint64, chunks []*Chunk, totalL1MessagePoppedBefore uint64) ([]byte, uint64, error) { + // skipped L1 message bitmap, an array of 256-bit bitmaps + var skippedBitmap []*big.Int + + // the first queue index that belongs to this batch + baseIndex := totalL1MessagePoppedBefore + + // the next queue index that we need to process + nextIndex := totalL1MessagePoppedBefore + + for chunkID, chunk := range chunks { + for blockID, block := range chunk.Blocks { + for _, tx := range block.Transactions { + if tx.Type != types.L1MessageTxType { + continue + } + currentIndex := tx.Nonce + + if currentIndex < nextIndex { + return nil, 0, fmt.Errorf("unexpected batch payload, expected queue index: %d, got: %d. Batch index: %d, chunk index in batch: %d, block index in chunk: %d, block hash: %v, transaction hash: %v", nextIndex, currentIndex, batchIndex, chunkID, blockID, block.Header.Hash(), tx.TxHash) + } + + // mark skipped messages + for skippedIndex := nextIndex; skippedIndex < currentIndex; skippedIndex++ { + quo := int((skippedIndex - baseIndex) / 256) + rem := int((skippedIndex - baseIndex) % 256) + for len(skippedBitmap) <= quo { + bitmap := big.NewInt(0) + skippedBitmap = append(skippedBitmap, bitmap) + } + skippedBitmap[quo].SetBit(skippedBitmap[quo], rem, 1) + } + + // process included message + quo := int((currentIndex - baseIndex) / 256) + for len(skippedBitmap) <= quo { + bitmap := big.NewInt(0) + skippedBitmap = append(skippedBitmap, bitmap) + } + + nextIndex = currentIndex + 1 + } + } + } + + bitmapBytes := make([]byte, len(skippedBitmap)*32) + for ii, num := range skippedBitmap { + bytes := num.Bytes() + padding := 32 - len(bytes) + copy(bitmapBytes[32*ii+padding:], bytes) + } + + return bitmapBytes, nextIndex, nil +} diff --git a/common/types/encoding/codecv0/codecv0.go b/common/types/encoding/codecv0/codecv0.go new file mode 100644 index 000000000..85fa4b43e --- /dev/null +++ b/common/types/encoding/codecv0/codecv0.go @@ -0,0 +1,463 @@ +package codecv0 + +import ( + "encoding/binary" + "encoding/hex" + "errors" + "fmt" + "math" + "math/big" + "strings" + + "github.com/scroll-tech/go-ethereum/common" + "github.com/scroll-tech/go-ethereum/core/types" + "github.com/scroll-tech/go-ethereum/crypto" + + "scroll-tech/common/types/encoding" +) + +// CodecV0Version denotes the version of the codec. +const CodecV0Version = 0 + +// DABlock represents a Data Availability Block. +type DABlock struct { + BlockNumber uint64 + Timestamp uint64 + BaseFee *big.Int + GasLimit uint64 + NumTransactions uint16 + NumL1Messages uint16 +} + +// DAChunk groups consecutive DABlocks with their transactions. +type DAChunk struct { + Blocks []*DABlock + Transactions [][]*types.TransactionData +} + +// DABatch contains metadata about a batch of DAChunks. +type DABatch struct { + Version uint8 + BatchIndex uint64 + L1MessagePopped uint64 + TotalL1MessagePopped uint64 + DataHash common.Hash + ParentBatchHash common.Hash + SkippedL1MessageBitmap []byte +} + +// NewDABlock creates a new DABlock from the given encoding.Block and the total number of L1 messages popped before. +func NewDABlock(block *encoding.Block, totalL1MessagePoppedBefore uint64) (*DABlock, error) { + if !block.Header.Number.IsUint64() { + return nil, errors.New("block number is not uint64") + } + + // note: numL1Messages includes skipped messages + numL1Messages := block.NumL1Messages(totalL1MessagePoppedBefore) + if numL1Messages > math.MaxUint16 { + return nil, errors.New("number of L1 messages exceeds max uint16") + } + + // note: numTransactions includes skipped messages + numL2Transactions := block.NumL2Transactions() + numTransactions := numL1Messages + numL2Transactions + if numTransactions > math.MaxUint16 { + return nil, errors.New("number of transactions exceeds max uint16") + } + + daBlock := DABlock{ + BlockNumber: block.Header.Number.Uint64(), + Timestamp: block.Header.Time, + BaseFee: block.Header.BaseFee, + GasLimit: block.Header.GasLimit, + NumTransactions: uint16(numTransactions), + NumL1Messages: uint16(numL1Messages), + } + + return &daBlock, nil +} + +// Encode serializes the DABlock into a slice of bytes. +func (b *DABlock) Encode() []byte { + bytes := make([]byte, 60) + binary.BigEndian.PutUint64(bytes[0:], b.BlockNumber) + binary.BigEndian.PutUint64(bytes[8:], b.Timestamp) + if b.BaseFee != nil { + binary.BigEndian.PutUint64(bytes[40:], b.BaseFee.Uint64()) + } + binary.BigEndian.PutUint64(bytes[48:], b.GasLimit) + binary.BigEndian.PutUint16(bytes[56:], b.NumTransactions) + binary.BigEndian.PutUint16(bytes[58:], b.NumL1Messages) + return bytes +} + +// NewDAChunk creates a new DAChunk from the given encoding.Chunk and the total number of L1 messages popped before. +func NewDAChunk(chunk *encoding.Chunk, totalL1MessagePoppedBefore uint64) (*DAChunk, error) { + var blocks []*DABlock + var txs [][]*types.TransactionData + + if chunk == nil { + return nil, errors.New("chunk is nil") + } + + if len(chunk.Blocks) == 0 { + return nil, errors.New("number of blocks is 0") + } + + if len(chunk.Blocks) > 255 { + return nil, errors.New("number of blocks exceeds 1 byte") + } + + for _, block := range chunk.Blocks { + b, err := NewDABlock(block, totalL1MessagePoppedBefore) + if err != nil { + return nil, err + } + blocks = append(blocks, b) + totalL1MessagePoppedBefore += block.NumL1Messages(totalL1MessagePoppedBefore) + txs = append(txs, block.Transactions) + } + + daChunk := DAChunk{ + Blocks: blocks, + Transactions: txs, + } + + return &daChunk, nil +} + +// Encode serializes the DAChunk into a slice of bytes. +func (c *DAChunk) Encode() ([]byte, error) { + var chunkBytes []byte + chunkBytes = append(chunkBytes, byte(len(c.Blocks))) + + var l2TxDataBytes []byte + + for _, block := range c.Blocks { + chunkBytes = append(chunkBytes, block.Encode()...) + } + + for _, blockTxs := range c.Transactions { + for _, txData := range blockTxs { + if txData.Type == types.L1MessageTxType { + continue + } + var txLen [4]byte + rlpTxData, err := encoding.ConvertTxDataToRLPEncoding(txData) + if err != nil { + return nil, err + } + binary.BigEndian.PutUint32(txLen[:], uint32(len(rlpTxData))) + l2TxDataBytes = append(l2TxDataBytes, txLen[:]...) + l2TxDataBytes = append(l2TxDataBytes, rlpTxData...) + } + } + + chunkBytes = append(chunkBytes, l2TxDataBytes...) + return chunkBytes, nil +} + +// Hash computes the hash of the DAChunk data. +func (c *DAChunk) Hash() (common.Hash, error) { + chunkBytes, err := c.Encode() + if err != nil { + return common.Hash{}, err + } + + if len(chunkBytes) == 0 { + return common.Hash{}, errors.New("chunk data is empty and cannot be processed") + } + numBlocks := chunkBytes[0] + + // concatenate block contexts + var dataBytes []byte + for i := 0; i < int(numBlocks); i++ { + // only the first 58 bytes of each BlockContext are needed for the hashing process + dataBytes = append(dataBytes, chunkBytes[1+60*i:60*i+59]...) + } + + // concatenate l1 and l2 tx hashes + for _, blockTxs := range c.Transactions { + var l1TxHashes []byte + var l2TxHashes []byte + for _, txData := range blockTxs { + txHash := strings.TrimPrefix(txData.TxHash, "0x") + hashBytes, err := hex.DecodeString(txHash) + if err != nil { + return common.Hash{}, fmt.Errorf("failed to decode tx hash from TransactionData: hash=%v, err=%w", txData.TxHash, err) + } + if txData.Type == types.L1MessageTxType { + l1TxHashes = append(l1TxHashes, hashBytes...) + } else { + l2TxHashes = append(l2TxHashes, hashBytes...) + } + } + dataBytes = append(dataBytes, l1TxHashes...) + dataBytes = append(dataBytes, l2TxHashes...) + } + + hash := crypto.Keccak256Hash(dataBytes) + return hash, nil +} + +// NewDABatch creates a DABatch from the provided encoding.Batch. +func NewDABatch(batch *encoding.Batch) (*DABatch, error) { + // compute batch data hash + var dataBytes []byte + totalL1MessagePoppedBeforeChunk := batch.TotalL1MessagePoppedBefore + + for _, chunk := range batch.Chunks { + // build data hash + daChunk, err := NewDAChunk(chunk, totalL1MessagePoppedBeforeChunk) + if err != nil { + return nil, err + } + totalL1MessagePoppedBeforeChunk += chunk.NumL1Messages(totalL1MessagePoppedBeforeChunk) + daChunkHash, err := daChunk.Hash() + if err != nil { + return nil, err + } + dataBytes = append(dataBytes, daChunkHash.Bytes()...) + } + + // compute data hash + dataHash := crypto.Keccak256Hash(dataBytes) + + // skipped L1 messages bitmap + bitmapBytes, totalL1MessagePoppedAfter, err := encoding.ConstructSkippedBitmap(batch.Index, batch.Chunks, batch.TotalL1MessagePoppedBefore) + if err != nil { + return nil, err + } + + daBatch := DABatch{ + Version: CodecV0Version, + BatchIndex: batch.Index, + L1MessagePopped: totalL1MessagePoppedAfter - batch.TotalL1MessagePoppedBefore, + TotalL1MessagePopped: totalL1MessagePoppedAfter, + DataHash: dataHash, + ParentBatchHash: batch.ParentBatchHash, + SkippedL1MessageBitmap: bitmapBytes, + } + + return &daBatch, nil +} + +// NewDABatchFromBytes attempts to decode the given byte slice into a DABatch. +func NewDABatchFromBytes(data []byte) (*DABatch, error) { + if len(data) < 89 { + return nil, fmt.Errorf("insufficient data for DABatch, expected at least 89 bytes but got %d", len(data)) + } + + b := &DABatch{ + Version: data[0], + BatchIndex: binary.BigEndian.Uint64(data[1:9]), + L1MessagePopped: binary.BigEndian.Uint64(data[9:17]), + TotalL1MessagePopped: binary.BigEndian.Uint64(data[17:25]), + DataHash: common.BytesToHash(data[25:57]), + ParentBatchHash: common.BytesToHash(data[57:89]), + SkippedL1MessageBitmap: data[89:], + } + + return b, nil +} + +// Encode serializes the DABatch into bytes. +func (b *DABatch) Encode() []byte { + batchBytes := make([]byte, 89+len(b.SkippedL1MessageBitmap)) + batchBytes[0] = b.Version + binary.BigEndian.PutUint64(batchBytes[1:], b.BatchIndex) + binary.BigEndian.PutUint64(batchBytes[9:], b.L1MessagePopped) + binary.BigEndian.PutUint64(batchBytes[17:], b.TotalL1MessagePopped) + copy(batchBytes[25:], b.DataHash[:]) + copy(batchBytes[57:], b.ParentBatchHash[:]) + copy(batchBytes[89:], b.SkippedL1MessageBitmap[:]) + return batchBytes +} + +// Hash computes the hash of the serialized DABatch. +func (b *DABatch) Hash() common.Hash { + bytes := b.Encode() + return crypto.Keccak256Hash(bytes) +} + +// DecodeFromCalldata attempts to decode a DABatch and an array of DAChunks from the provided calldata byte slice. +func DecodeFromCalldata(data []byte) (*DABatch, []*DAChunk, error) { + // TODO: implement this function. + return nil, nil, nil +} + +// CalldataNonZeroByteGas is the gas consumption per non zero byte in calldata. +const CalldataNonZeroByteGas = 16 + +// GetKeccak256Gas calculates the gas cost for computing the keccak256 hash of a given size. +func GetKeccak256Gas(size uint64) uint64 { + return GetMemoryExpansionCost(size) + 30 + 6*((size+31)/32) +} + +// GetMemoryExpansionCost calculates the cost of memory expansion for a given memoryByteSize. +func GetMemoryExpansionCost(memoryByteSize uint64) uint64 { + memorySizeWord := (memoryByteSize + 31) / 32 + memoryCost := (memorySizeWord*memorySizeWord)/512 + (3 * memorySizeWord) + return memoryCost +} + +// EstimateBlockL1CommitCalldataSize calculates the calldata size in l1 commit for this block approximately. +// TODO: The calculation could be more accurate by using 58 + len(l2TxDataBytes) (see Chunk). +// This needs to be adjusted in the future. +func EstimateBlockL1CommitCalldataSize(b *encoding.Block) (uint64, error) { + var size uint64 + for _, txData := range b.Transactions { + if txData.Type == types.L1MessageTxType { + continue + } + size += 4 // 4 bytes payload length + txPayloadLength, err := getTxPayloadLength(txData) + if err != nil { + return 0, err + } + size += txPayloadLength + } + size += 60 // 60 bytes BlockContext + return size, nil +} + +// EstimateBlockL1CommitGas calculates the total L1 commit gas for this block approximately. +func EstimateBlockL1CommitGas(b *encoding.Block) (uint64, error) { + var total uint64 + var numL1Messages uint64 + for _, txData := range b.Transactions { + if txData.Type == types.L1MessageTxType { + numL1Messages++ + continue + } + + txPayloadLength, err := getTxPayloadLength(txData) + if err != nil { + return 0, err + } + total += CalldataNonZeroByteGas * txPayloadLength // an over-estimate: treat each byte as non-zero + total += CalldataNonZeroByteGas * 4 // 4 bytes payload length + total += GetKeccak256Gas(txPayloadLength) // l2 tx hash + } + + // 60 bytes BlockContext calldata + total += CalldataNonZeroByteGas * 60 + + // sload + total += 2100 * numL1Messages // numL1Messages times cold sload in L1MessageQueue + + // staticcall + total += 100 * numL1Messages // numL1Messages times call to L1MessageQueue + total += 100 * numL1Messages // numL1Messages times warm address access to L1MessageQueue + + total += GetMemoryExpansionCost(36) * numL1Messages // staticcall to proxy + total += 100 * numL1Messages // read admin in proxy + total += 100 * numL1Messages // read impl in proxy + total += 100 * numL1Messages // access impl + total += GetMemoryExpansionCost(36) * numL1Messages // delegatecall to impl + + return total, nil +} + +// EstimateChunkL1CommitCalldataSize calculates the calldata size needed for committing a chunk to L1 approximately. +func EstimateChunkL1CommitCalldataSize(c *encoding.Chunk) (uint64, error) { + var totalL1CommitCalldataSize uint64 + for _, block := range c.Blocks { + blockL1CommitCalldataSize, err := EstimateBlockL1CommitCalldataSize(block) + if err != nil { + return 0, err + } + totalL1CommitCalldataSize += blockL1CommitCalldataSize + } + return totalL1CommitCalldataSize, nil +} + +// EstimateChunkL1CommitGas calculates the total L1 commit gas for this chunk approximately. +func EstimateChunkL1CommitGas(c *encoding.Chunk) (uint64, error) { + var totalTxNum uint64 + var totalL1CommitGas uint64 + for _, block := range c.Blocks { + totalTxNum += uint64(len(block.Transactions)) + blockL1CommitGas, err := EstimateBlockL1CommitGas(block) + if err != nil { + return 0, err + } + totalL1CommitGas += blockL1CommitGas + } + + numBlocks := uint64(len(c.Blocks)) + totalL1CommitGas += 100 * numBlocks // numBlocks times warm sload + totalL1CommitGas += CalldataNonZeroByteGas // numBlocks field of chunk encoding in calldata + totalL1CommitGas += CalldataNonZeroByteGas * numBlocks * 60 // numBlocks of BlockContext in chunk + + totalL1CommitGas += GetKeccak256Gas(58*numBlocks + 32*totalTxNum) // chunk hash + return totalL1CommitGas, nil +} + +// EstimateBatchL1CommitGas calculates the total L1 commit gas for this batch approximately. +func EstimateBatchL1CommitGas(b *encoding.Batch) (uint64, error) { + var totalL1CommitGas uint64 + + // Add extra gas costs + totalL1CommitGas += 100000 // constant to account for ops like _getAdmin, _implementation, _requireNotPaused, etc + totalL1CommitGas += 4 * 2100 // 4 one-time cold sload for commitBatch + totalL1CommitGas += 20000 // 1 time sstore + totalL1CommitGas += 21000 // base fee for tx + totalL1CommitGas += CalldataNonZeroByteGas // version in calldata + + // adjusting gas: + // add 1 time cold sload (2100 gas) for L1MessageQueue + // add 1 time cold address access (2600 gas) for L1MessageQueue + // minus 1 time warm sload (100 gas) & 1 time warm address access (100 gas) + totalL1CommitGas += (2100 + 2600 - 100 - 100) + totalL1CommitGas += GetKeccak256Gas(89 + 32) // parent batch header hash, length is estimated as 89 (constant part)+ 32 (1 skippedL1MessageBitmap) + totalL1CommitGas += CalldataNonZeroByteGas * (89 + 32) // parent batch header in calldata + + // adjust batch data hash gas cost + totalL1CommitGas += GetKeccak256Gas(uint64(32 * len(b.Chunks))) + + totalL1MessagePoppedBefore := b.TotalL1MessagePoppedBefore + + for _, chunk := range b.Chunks { + chunkL1CommitGas, err := EstimateChunkL1CommitGas(chunk) + if err != nil { + return 0, err + } + totalL1CommitGas += chunkL1CommitGas + + totalL1MessagePoppedInChunk := chunk.NumL1Messages(totalL1MessagePoppedBefore) + totalL1MessagePoppedBefore += totalL1MessagePoppedInChunk + + totalL1CommitGas += CalldataNonZeroByteGas * (32 * (totalL1MessagePoppedInChunk + 255) / 256) + totalL1CommitGas += GetKeccak256Gas(89 + 32*(totalL1MessagePoppedInChunk+255)/256) + + totalL1CommitCalldataSize, err := EstimateChunkL1CommitCalldataSize(chunk) + if err != nil { + return 0, err + } + totalL1CommitGas += GetMemoryExpansionCost(totalL1CommitCalldataSize) + } + + return totalL1CommitGas, nil +} + +// EstimateBatchL1CommitCalldataSize calculates the calldata size in l1 commit for this batch approximately. +func EstimateBatchL1CommitCalldataSize(b *encoding.Batch) (uint64, error) { + var totalL1CommitCalldataSize uint64 + for _, chunk := range b.Chunks { + chunkL1CommitCalldataSize, err := EstimateChunkL1CommitCalldataSize(chunk) + if err != nil { + return 0, err + } + totalL1CommitCalldataSize += chunkL1CommitCalldataSize + } + return totalL1CommitCalldataSize, nil +} + +func getTxPayloadLength(txData *types.TransactionData) (uint64, error) { + rlpTxData, err := encoding.ConvertTxDataToRLPEncoding(txData) + if err != nil { + return 0, err + } + return uint64(len(rlpTxData)), nil +} diff --git a/common/types/encoding/codecv0/codecv0_test.go b/common/types/encoding/codecv0/codecv0_test.go new file mode 100644 index 000000000..e70b177c9 --- /dev/null +++ b/common/types/encoding/codecv0/codecv0_test.go @@ -0,0 +1,597 @@ +package codecv0 + +import ( + "encoding/hex" + "encoding/json" + "math/big" + "os" + "testing" + + "github.com/scroll-tech/go-ethereum/common" + "github.com/scroll-tech/go-ethereum/log" + "github.com/stretchr/testify/assert" + + "scroll-tech/common/types/encoding" +) + +func TestCodecV0(t *testing.T) { + glogger := log.NewGlogHandler(log.StreamHandler(os.Stderr, log.LogfmtFormat())) + glogger.Verbosity(log.LvlInfo) + log.Root().SetHandler(glogger) + + parentDABatch, err := NewDABatch(&encoding.Batch{ + Index: 0, + TotalL1MessagePoppedBefore: 0, + ParentBatchHash: common.Hash{}, + Chunks: nil, + }) + assert.NoError(t, err) + parentBatchHash := parentDABatch.Hash() + + block1 := readBlockFromJSON(t, "../../../testdata/blockTrace_02.json") + block2 := readBlockFromJSON(t, "../../../testdata/blockTrace_03.json") + block3 := readBlockFromJSON(t, "../../../testdata/blockTrace_04.json") + block4 := readBlockFromJSON(t, "../../../testdata/blockTrace_05.json") + block5 := readBlockFromJSON(t, "../../../testdata/blockTrace_06.json") + block6 := readBlockFromJSON(t, "../../../testdata/blockTrace_07.json") + + blockL1CommitCalldataSize, err := EstimateBlockL1CommitCalldataSize(block1) + assert.NoError(t, err) + assert.Equal(t, uint64(298), blockL1CommitCalldataSize) + blockL1CommitGas, err := EstimateBlockL1CommitGas(block1) + assert.NoError(t, err) + assert.Equal(t, uint64(4900), blockL1CommitGas) + blockL1CommitCalldataSize, err = EstimateBlockL1CommitCalldataSize(block2) + assert.NoError(t, err) + assert.Equal(t, uint64(5745), blockL1CommitCalldataSize) + blockL1CommitGas, err = EstimateBlockL1CommitGas(block2) + assert.NoError(t, err) + assert.Equal(t, uint64(93613), blockL1CommitGas) + blockL1CommitCalldataSize, err = EstimateBlockL1CommitCalldataSize(block3) + assert.NoError(t, err) + assert.Equal(t, uint64(96), blockL1CommitCalldataSize) + blockL1CommitGas, err = EstimateBlockL1CommitGas(block3) + assert.NoError(t, err) + assert.Equal(t, uint64(4187), blockL1CommitGas) + blockL1CommitCalldataSize, err = EstimateBlockL1CommitCalldataSize(block4) + assert.NoError(t, err) + assert.Equal(t, uint64(60), blockL1CommitCalldataSize) + blockL1CommitGas, err = EstimateBlockL1CommitGas(block4) + assert.NoError(t, err) + assert.Equal(t, uint64(14020), blockL1CommitGas) + blockL1CommitCalldataSize, err = EstimateBlockL1CommitCalldataSize(block5) + assert.NoError(t, err) + assert.Equal(t, uint64(60), blockL1CommitCalldataSize) + blockL1CommitGas, err = EstimateBlockL1CommitGas(block5) + assert.NoError(t, err) + assert.Equal(t, uint64(8796), blockL1CommitGas) + blockL1CommitCalldataSize, err = EstimateBlockL1CommitCalldataSize(block6) + assert.NoError(t, err) + assert.Equal(t, uint64(60), blockL1CommitCalldataSize) + blockL1CommitGas, err = EstimateBlockL1CommitGas(block6) + assert.NoError(t, err) + assert.Equal(t, uint64(6184), blockL1CommitGas) + + // Test case: when the batch and chunk contains one block. + chunk := &encoding.Chunk{ + Blocks: []*encoding.Block{block1}, + } + chunkL1CommitCalldataSize, err := EstimateChunkL1CommitCalldataSize(chunk) + assert.NoError(t, err) + assert.Equal(t, uint64(298), chunkL1CommitCalldataSize) + chunkL1CommitGas, err := EstimateChunkL1CommitGas(chunk) + assert.NoError(t, err) + assert.Equal(t, uint64(6042), chunkL1CommitGas) + + daChunk, err := NewDAChunk(chunk, 0) + assert.NoError(t, err) + chunkBytes, err := daChunk.Encode() + assert.NoError(t, err) + chunkHexString := hex.EncodeToString(chunkBytes) + assert.Equal(t, 299, len(chunkBytes)) + assert.Equal(t, "0100000000000000020000000063807b2a0000000000000000000000000000000000000000000000000000000000001de9000355418d1e81840002000000000073f87180843b9aec2e8307a12094c0c4c8baea3f6acb49b6e1fb9e2adeceeacb0ca28a152d02c7e14af60000008083019ecea0ab07ae99c67aa78e7ba5cf6781e90cc32b219b1de102513d56548a41e86df514a034cbd19feacd73e8ce64d00c4d1996b9b5243c578fd7f51bfaec288bbaf42a8b00000073f87101843b9aec2e8307a1209401bae6bf68e9a03fb2bc0615b1bf0d69ce9411ed8a152d02c7e14af60000008083019ecea0f039985866d8256f10c1be4f7b2cace28d8f20bde27e2604393eb095b7f77316a05a3e6e81065f2b4604bcec5bd4aba684835996fc3f879380aac1c09c6eed32f1", chunkHexString) + daChunkHash, err := daChunk.Hash() + assert.NoError(t, err) + assert.Equal(t, common.HexToHash("0xde642c68122634b33fa1e6e4243b17be3bfd0dc6f996f204ef6d7522516bd840"), daChunkHash) + + batch := &encoding.Batch{ + Index: 1, + TotalL1MessagePoppedBefore: 0, + ParentBatchHash: parentBatchHash, + Chunks: []*encoding.Chunk{chunk}, + } + + batchL1CommitCalldataSize, err := EstimateBatchL1CommitCalldataSize(batch) + assert.NoError(t, err) + assert.Equal(t, uint64(298), batchL1CommitCalldataSize) + batchL1CommitGas, err := EstimateBatchL1CommitGas(batch) + assert.NoError(t, err) + assert.Equal(t, uint64(162591), batchL1CommitGas) + + daBatch, err := NewDABatch(batch) + assert.NoError(t, err) + batchBytes := daBatch.Encode() + batchHexString := hex.EncodeToString(batchBytes) + assert.Equal(t, 89, len(batchBytes)) + assert.Equal(t, "000000000000000001000000000000000000000000000000008fbc5eecfefc5bd9d1618ecef1fed160a7838448383595a2257d4c9bd5c5fa3eb0a62a3048a2e6efb4e56e471eb826de86f8ccaa4af27c572b68db6f687b3ab0", batchHexString) + assert.Equal(t, 0, len(daBatch.SkippedL1MessageBitmap)) + assert.Equal(t, uint64(0), daBatch.TotalL1MessagePopped) + assert.Equal(t, uint64(0), daBatch.L1MessagePopped) + assert.Equal(t, common.HexToHash("0xa906c7d2b6b68ea5fec3ff9d60d41858676e0d365e5d5ef07b2ce20fcf24ecd7"), daBatch.Hash()) + + decodedDABatch, err := NewDABatchFromBytes(batchBytes) + assert.NoError(t, err) + decodedBatchBytes := decodedDABatch.Encode() + decodedBatchHexString := hex.EncodeToString(decodedBatchBytes) + assert.Equal(t, batchHexString, decodedBatchHexString) + + // Test case: when the batch and chunk contains two block. + chunk = &encoding.Chunk{ + Blocks: []*encoding.Block{block1, block2}, + } + chunkL1CommitCalldataSize, err = EstimateChunkL1CommitCalldataSize(chunk) + assert.NoError(t, err) + assert.Equal(t, uint64(6043), chunkL1CommitCalldataSize) + chunkL1CommitGas, err = EstimateChunkL1CommitGas(chunk) + assert.NoError(t, err) + assert.Equal(t, uint64(100742), chunkL1CommitGas) + + daChunk, err = NewDAChunk(chunk, 0) + assert.NoError(t, err) + chunkBytes, err = daChunk.Encode() + assert.NoError(t, err) + assert.Equal(t, 6044, len(chunkBytes)) + daChunkHash, err = daChunk.Hash() + assert.NoError(t, err) + assert.Equal(t, common.HexToHash("0x014916a83eccdb0d01e814b4d4ab90eb9049ba9a3cb0994919b86ad873bcd028"), daChunkHash) + + batch = &encoding.Batch{ + Index: 1, + TotalL1MessagePoppedBefore: 0, + ParentBatchHash: parentBatchHash, + Chunks: []*encoding.Chunk{chunk}, + } + + batchL1CommitCalldataSize, err = EstimateBatchL1CommitCalldataSize(batch) + assert.NoError(t, err) + assert.Equal(t, uint64(6043), batchL1CommitCalldataSize) + batchL1CommitGas, err = EstimateBatchL1CommitGas(batch) + assert.NoError(t, err) + assert.Equal(t, uint64(257897), batchL1CommitGas) + + daBatch, err = NewDABatch(batch) + assert.NoError(t, err) + batchBytes = daBatch.Encode() + batchHexString = hex.EncodeToString(batchBytes) + assert.Equal(t, 89, len(batchBytes)) + assert.Equal(t, "0000000000000000010000000000000000000000000000000074dd561a36921590926bee01fd0d53747c5f3e48e48a2d5538b9ab0e1511cfd7b0a62a3048a2e6efb4e56e471eb826de86f8ccaa4af27c572b68db6f687b3ab0", batchHexString) + assert.Equal(t, 0, len(daBatch.SkippedL1MessageBitmap)) + assert.Equal(t, uint64(0), daBatch.TotalL1MessagePopped) + assert.Equal(t, uint64(0), daBatch.L1MessagePopped) + assert.Equal(t, common.HexToHash("0xb02e39b740756824d20b2cac322ac365121411ced9d6e34de98a0b247c6e23e6"), daBatch.Hash()) + + decodedDABatch, err = NewDABatchFromBytes(batchBytes) + assert.NoError(t, err) + decodedBatchBytes = decodedDABatch.Encode() + decodedBatchHexString = hex.EncodeToString(decodedBatchBytes) + assert.Equal(t, batchHexString, decodedBatchHexString) + + // Test case: when the chunk contains one block with 1 L1MsgTx. + chunk = &encoding.Chunk{ + Blocks: []*encoding.Block{block3}, + } + chunkL1CommitCalldataSize, err = EstimateChunkL1CommitCalldataSize(chunk) + assert.NoError(t, err) + assert.Equal(t, uint64(96), chunkL1CommitCalldataSize) + chunkL1CommitGas, err = EstimateChunkL1CommitGas(chunk) + assert.NoError(t, err) + assert.Equal(t, uint64(5329), chunkL1CommitGas) + + daChunk, err = NewDAChunk(chunk, 0) + assert.NoError(t, err) + chunkBytes, err = daChunk.Encode() + assert.NoError(t, err) + chunkHexString = hex.EncodeToString(chunkBytes) + assert.Equal(t, 97, len(chunkBytes)) + assert.Equal(t, "01000000000000000d00000000646b6e13000000000000000000000000000000000000000000000000000000000000000000000000007a1200000c000b00000020df0b80825dc0941a258d17bf244c4df02d40343a7626a9d321e1058080808080", chunkHexString) + daChunkHash, err = daChunk.Hash() + assert.NoError(t, err) + assert.Equal(t, common.HexToHash("0x9e643c8a9203df542e39d9bfdcb07c99575b3c3d557791329fef9d83cc4147d0"), daChunkHash) + + batch = &encoding.Batch{ + Index: 1, + TotalL1MessagePoppedBefore: 0, + ParentBatchHash: parentBatchHash, + Chunks: []*encoding.Chunk{chunk}, + } + + batchL1CommitCalldataSize, err = EstimateBatchL1CommitCalldataSize(batch) + assert.NoError(t, err) + assert.Equal(t, uint64(96), batchL1CommitCalldataSize) + batchL1CommitGas, err = EstimateBatchL1CommitGas(batch) + assert.NoError(t, err) + assert.Equal(t, uint64(161889), batchL1CommitGas) + + daBatch, err = NewDABatch(batch) + assert.NoError(t, err) + batchBytes = daBatch.Encode() + batchHexString = hex.EncodeToString(batchBytes) + assert.Equal(t, 121, len(batchBytes)) + assert.Equal(t, "000000000000000001000000000000000b000000000000000b34f419ce7e882295bdb5aec6cce56ffa788a5fed4744d7fbd77e4acbf409f1cab0a62a3048a2e6efb4e56e471eb826de86f8ccaa4af27c572b68db6f687b3ab000000000000000000000000000000000000000000000000000000000000003ff", batchHexString) + assert.Equal(t, 32, len(daBatch.SkippedL1MessageBitmap)) + expectedBitmap := "00000000000000000000000000000000000000000000000000000000000003ff" + assert.Equal(t, expectedBitmap, common.Bytes2Hex(daBatch.SkippedL1MessageBitmap)) + assert.Equal(t, uint64(11), daBatch.TotalL1MessagePopped) + assert.Equal(t, uint64(11), daBatch.L1MessagePopped) + assert.Equal(t, common.HexToHash("0xa18f07cb56ab4f2db5914d9b5699c5932bea4b5c73e71c8cec79151c11e9e986"), daBatch.Hash()) + + decodedDABatch, err = NewDABatchFromBytes(batchBytes) + assert.NoError(t, err) + decodedBatchBytes = decodedDABatch.Encode() + decodedBatchHexString = hex.EncodeToString(decodedBatchBytes) + assert.Equal(t, batchHexString, decodedBatchHexString) + + // Test case: batch contains multiple chunks, chunk contains multiple blocks. + chunk1 := &encoding.Chunk{ + Blocks: []*encoding.Block{block1, block2, block3}, + } + chunk1L1CommitCalldataSize, err := EstimateChunkL1CommitCalldataSize(chunk1) + assert.NoError(t, err) + assert.Equal(t, uint64(6139), chunk1L1CommitCalldataSize) + chunk1L1CommitGas, err := EstimateChunkL1CommitGas(chunk1) + assert.NoError(t, err) + assert.Equal(t, uint64(106025), chunk1L1CommitGas) + + daChunk1, err := NewDAChunk(chunk1, 0) + assert.NoError(t, err) + chunkBytes1, err := daChunk1.Encode() + assert.NoError(t, err) + assert.Equal(t, 6140, len(chunkBytes1)) + + chunk2 := &encoding.Chunk{ + Blocks: []*encoding.Block{block4}, + } + chunk2L1CommitCalldataSize, err := EstimateChunkL1CommitCalldataSize(chunk2) + assert.NoError(t, err) + assert.Equal(t, uint64(60), chunk2L1CommitCalldataSize) + chunk2L1CommitGas, err := EstimateChunkL1CommitGas(chunk2) + assert.NoError(t, err) + assert.Equal(t, uint64(15189), chunk2L1CommitGas) + + daChunk2, err := NewDAChunk(chunk2, 0) + assert.NoError(t, err) + chunkBytes2, err := daChunk2.Encode() + assert.NoError(t, err) + assert.Equal(t, 61, len(chunkBytes2)) + + batch = &encoding.Batch{ + Index: 1, + TotalL1MessagePoppedBefore: 0, + ParentBatchHash: parentBatchHash, + Chunks: []*encoding.Chunk{chunk1, chunk2}, + } + + batchL1CommitCalldataSize, err = EstimateBatchL1CommitCalldataSize(batch) + assert.NoError(t, err) + assert.Equal(t, uint64(6199), batchL1CommitCalldataSize) + batchL1CommitGas, err = EstimateBatchL1CommitGas(batch) + assert.NoError(t, err) + assert.Equal(t, uint64(279054), batchL1CommitGas) + + daBatch, err = NewDABatch(batch) + assert.NoError(t, err) + batchBytes = daBatch.Encode() + batchHexString = hex.EncodeToString(batchBytes) + assert.Equal(t, 121, len(batchBytes)) + assert.Equal(t, "000000000000000001000000000000002a000000000000002a1f9b3d942a6ee14e7afc52225c91fa44faa0a7ec511df9a2d9348d33bcd142fcb0a62a3048a2e6efb4e56e471eb826de86f8ccaa4af27c572b68db6f687b3ab00000000000000000000000000000000000000000000000000000001ffffffbff", batchHexString) + assert.Equal(t, 32, len(daBatch.SkippedL1MessageBitmap)) + expectedBitmap = "0000000000000000000000000000000000000000000000000000001ffffffbff" + assert.Equal(t, expectedBitmap, common.Bytes2Hex(daBatch.SkippedL1MessageBitmap)) + assert.Equal(t, uint64(42), daBatch.TotalL1MessagePopped) + assert.Equal(t, uint64(42), daBatch.L1MessagePopped) + assert.Equal(t, common.HexToHash("0xf7bd6afe02764e4e6df23a374d753182b57fa77be71aaf1cd8365e15a51872d1"), daBatch.Hash()) + + decodedDABatch, err = NewDABatchFromBytes(batchBytes) + assert.NoError(t, err) + decodedBatchBytes = decodedDABatch.Encode() + decodedBatchHexString = hex.EncodeToString(decodedBatchBytes) + assert.Equal(t, batchHexString, decodedBatchHexString) + + // Test case: many consecutive L1 Msgs in 1 bitmap, no leading skipped msgs. + chunk = &encoding.Chunk{ + Blocks: []*encoding.Block{block4}, + } + chunkL1CommitCalldataSize, err = EstimateChunkL1CommitCalldataSize(chunk) + assert.NoError(t, err) + assert.Equal(t, uint64(60), chunkL1CommitCalldataSize) + chunkL1CommitGas, err = EstimateChunkL1CommitGas(chunk) + assert.NoError(t, err) + assert.Equal(t, uint64(15189), chunkL1CommitGas) + + daChunk, err = NewDAChunk(chunk, 0) + assert.NoError(t, err) + chunkBytes, err = daChunk.Encode() + assert.NoError(t, err) + assert.Equal(t, 61, len(chunkBytes)) + daChunkHash, err = daChunk.Hash() + assert.NoError(t, err) + assert.Equal(t, common.HexToHash("0x854fc3136f47ce482ec85ee3325adfa16a1a1d60126e1c119eaaf0c3a9e90f8e"), daChunkHash) + + batch = &encoding.Batch{ + Index: 1, + TotalL1MessagePoppedBefore: 37, + ParentBatchHash: parentBatchHash, + Chunks: []*encoding.Chunk{chunk}, + } + + batchL1CommitCalldataSize, err = EstimateBatchL1CommitCalldataSize(batch) + assert.NoError(t, err) + assert.Equal(t, uint64(60), batchL1CommitCalldataSize) + batchL1CommitGas, err = EstimateBatchL1CommitGas(batch) + assert.NoError(t, err) + assert.Equal(t, uint64(171730), batchL1CommitGas) + + daBatch, err = NewDABatch(batch) + assert.NoError(t, err) + batchBytes = daBatch.Encode() + batchHexString = hex.EncodeToString(batchBytes) + assert.Equal(t, 121, len(batchBytes)) + assert.Equal(t, "0000000000000000010000000000000005000000000000002ac62fb58ec2d5393e00960f1cc23cab883b685296efa03d13ea2dd4c6de79cc55b0a62a3048a2e6efb4e56e471eb826de86f8ccaa4af27c572b68db6f687b3ab00000000000000000000000000000000000000000000000000000000000000000", batchHexString) + assert.Equal(t, 32, len(daBatch.SkippedL1MessageBitmap)) + expectedBitmap = "0000000000000000000000000000000000000000000000000000000000000000" + assert.Equal(t, expectedBitmap, common.Bytes2Hex(daBatch.SkippedL1MessageBitmap)) + assert.Equal(t, uint64(42), daBatch.TotalL1MessagePopped) + assert.Equal(t, uint64(5), daBatch.L1MessagePopped) + assert.Equal(t, common.HexToHash("0x841f4657b7eb723cae35377cf2963b51191edad6a3b182d4c8524cb928d2a413"), daBatch.Hash()) + + decodedDABatch, err = NewDABatchFromBytes(batchBytes) + assert.NoError(t, err) + decodedBatchBytes = decodedDABatch.Encode() + decodedBatchHexString = hex.EncodeToString(decodedBatchBytes) + assert.Equal(t, batchHexString, decodedBatchHexString) + + // Test case: many consecutive L1 Msgs in 1 bitmap, with leading skipped msgs. + chunk = &encoding.Chunk{ + Blocks: []*encoding.Block{block4}, + } + chunkL1CommitCalldataSize, err = EstimateChunkL1CommitCalldataSize(chunk) + assert.NoError(t, err) + assert.Equal(t, uint64(60), chunkL1CommitCalldataSize) + chunkL1CommitGas, err = EstimateChunkL1CommitGas(chunk) + assert.NoError(t, err) + assert.Equal(t, uint64(15189), chunkL1CommitGas) + + daChunk, err = NewDAChunk(chunk, 0) + assert.NoError(t, err) + chunkBytes, err = daChunk.Encode() + assert.NoError(t, err) + assert.Equal(t, 61, len(chunkBytes)) + daChunkHash, err = daChunk.Hash() + assert.NoError(t, err) + assert.Equal(t, common.HexToHash("0x854fc3136f47ce482ec85ee3325adfa16a1a1d60126e1c119eaaf0c3a9e90f8e"), daChunkHash) + + batch = &encoding.Batch{ + Index: 1, + TotalL1MessagePoppedBefore: 0, + ParentBatchHash: parentBatchHash, + Chunks: []*encoding.Chunk{chunk}, + } + + batchL1CommitCalldataSize, err = EstimateBatchL1CommitCalldataSize(batch) + assert.NoError(t, err) + assert.Equal(t, uint64(60), batchL1CommitCalldataSize) + batchL1CommitGas, err = EstimateBatchL1CommitGas(batch) + assert.NoError(t, err) + assert.Equal(t, uint64(171810), batchL1CommitGas) + + daBatch, err = NewDABatch(batch) + assert.NoError(t, err) + batchBytes = daBatch.Encode() + batchHexString = hex.EncodeToString(batchBytes) + assert.Equal(t, 121, len(batchBytes)) + assert.Equal(t, "000000000000000001000000000000002a000000000000002a93255aa24dd468c5645f1e6901b8131a7a78a0eeb2a17cbb09ba64688a8de6b4b0a62a3048a2e6efb4e56e471eb826de86f8ccaa4af27c572b68db6f687b3ab00000000000000000000000000000000000000000000000000000001fffffffff", batchHexString) + assert.Equal(t, 32, len(daBatch.SkippedL1MessageBitmap)) + expectedBitmap = "0000000000000000000000000000000000000000000000000000001fffffffff" + assert.Equal(t, expectedBitmap, common.Bytes2Hex(daBatch.SkippedL1MessageBitmap)) + assert.Equal(t, uint64(42), daBatch.TotalL1MessagePopped) + assert.Equal(t, uint64(42), daBatch.L1MessagePopped) + assert.Equal(t, common.HexToHash("0xa28766a3617cf244cc397fc4ce4c23022ec80f152b9f618807ac7e7c11486612"), daBatch.Hash()) + + decodedDABatch, err = NewDABatchFromBytes(batchBytes) + assert.NoError(t, err) + decodedBatchBytes = decodedDABatch.Encode() + decodedBatchHexString = hex.EncodeToString(decodedBatchBytes) + assert.Equal(t, batchHexString, decodedBatchHexString) + + // Test case: many sparse L1 Msgs in 1 bitmap. + chunk = &encoding.Chunk{ + Blocks: []*encoding.Block{block5}, + } + chunkL1CommitCalldataSize, err = EstimateChunkL1CommitCalldataSize(chunk) + assert.NoError(t, err) + assert.Equal(t, uint64(60), chunkL1CommitCalldataSize) + chunkL1CommitGas, err = EstimateChunkL1CommitGas(chunk) + assert.NoError(t, err) + assert.Equal(t, uint64(9947), chunkL1CommitGas) + + daChunk, err = NewDAChunk(chunk, 0) + assert.NoError(t, err) + chunkBytes, err = daChunk.Encode() + assert.NoError(t, err) + assert.Equal(t, 61, len(chunkBytes)) + daChunkHash, err = daChunk.Hash() + assert.NoError(t, err) + assert.Equal(t, common.HexToHash("0x2aa220ca7bd1368e59e8053eb3831e30854aa2ec8bd3af65cee350c1c0718ba6"), daChunkHash) + + batch = &encoding.Batch{ + Index: 1, + TotalL1MessagePoppedBefore: 0, + ParentBatchHash: parentBatchHash, + Chunks: []*encoding.Chunk{chunk}, + } + + batchL1CommitCalldataSize, err = EstimateBatchL1CommitCalldataSize(batch) + assert.NoError(t, err) + assert.Equal(t, uint64(60), batchL1CommitCalldataSize) + batchL1CommitGas, err = EstimateBatchL1CommitGas(batch) + assert.NoError(t, err) + assert.Equal(t, uint64(166504), batchL1CommitGas) + + daBatch, err = NewDABatch(batch) + assert.NoError(t, err) + batchBytes = daBatch.Encode() + batchHexString = hex.EncodeToString(batchBytes) + assert.Equal(t, 121, len(batchBytes)) + assert.Equal(t, "000000000000000001000000000000000a000000000000000ac7bcc8da943dd83404e84d9ce7e894ab97ce4829df4eb51ebbbe13c90b5a3f4db0a62a3048a2e6efb4e56e471eb826de86f8ccaa4af27c572b68db6f687b3ab000000000000000000000000000000000000000000000000000000000000001dd", batchHexString) + assert.Equal(t, 32, len(daBatch.SkippedL1MessageBitmap)) + expectedBitmap = "00000000000000000000000000000000000000000000000000000000000001dd" + assert.Equal(t, expectedBitmap, common.Bytes2Hex(daBatch.SkippedL1MessageBitmap)) + assert.Equal(t, uint64(10), daBatch.TotalL1MessagePopped) + assert.Equal(t, uint64(10), daBatch.L1MessagePopped) + assert.Equal(t, common.HexToHash("0x2fee2073639eb9795007f7e765b3318f92658822de40b2134d34a478a0e9058a"), daBatch.Hash()) + + decodedDABatch, err = NewDABatchFromBytes(batchBytes) + assert.NoError(t, err) + decodedBatchBytes = decodedDABatch.Encode() + decodedBatchHexString = hex.EncodeToString(decodedBatchBytes) + assert.Equal(t, batchHexString, decodedBatchHexString) + + // Test case: many L1 Msgs in each of 2 bitmaps. + chunk = &encoding.Chunk{ + Blocks: []*encoding.Block{block6}, + } + chunkL1CommitCalldataSize, err = EstimateChunkL1CommitCalldataSize(chunk) + assert.NoError(t, err) + assert.Equal(t, uint64(60), chunkL1CommitCalldataSize) + chunkL1CommitGas, err = EstimateChunkL1CommitGas(chunk) + assert.NoError(t, err) + assert.Equal(t, uint64(7326), chunkL1CommitGas) + + daChunk, err = NewDAChunk(chunk, 0) + assert.NoError(t, err) + chunkBytes, err = daChunk.Encode() + assert.NoError(t, err) + assert.Equal(t, 61, len(chunkBytes)) + daChunkHash, err = daChunk.Hash() + assert.NoError(t, err) + assert.Equal(t, common.HexToHash("0xb65521bea7daff75838de07951c3c055966750fb5a270fead5e0e727c32455c3"), daChunkHash) + + batch = &encoding.Batch{ + Index: 1, + TotalL1MessagePoppedBefore: 0, + ParentBatchHash: parentBatchHash, + Chunks: []*encoding.Chunk{chunk}, + } + + batchL1CommitCalldataSize, err = EstimateBatchL1CommitCalldataSize(batch) + assert.NoError(t, err) + assert.Equal(t, uint64(60), batchL1CommitCalldataSize) + batchL1CommitGas, err = EstimateBatchL1CommitGas(batch) + assert.NoError(t, err) + assert.Equal(t, uint64(164388), batchL1CommitGas) + + daBatch, err = NewDABatch(batch) + assert.NoError(t, err) + batchBytes = daBatch.Encode() + batchHexString = hex.EncodeToString(batchBytes) + assert.Equal(t, 153, len(batchBytes)) + assert.Equal(t, "00000000000000000100000000000001010000000000000101899a411a3309c6491701b7b955c7b1115ac015414bbb71b59a0ca561668d5208b0a62a3048a2e6efb4e56e471eb826de86f8ccaa4af27c572b68db6f687b3ab0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0000000000000000000000000000000000000000000000000000000000000000", batchHexString) + assert.Equal(t, 64, len(daBatch.SkippedL1MessageBitmap)) + expectedBitmap = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0000000000000000000000000000000000000000000000000000000000000000" + assert.Equal(t, expectedBitmap, common.Bytes2Hex(daBatch.SkippedL1MessageBitmap)) + assert.Equal(t, uint64(257), daBatch.TotalL1MessagePopped) + assert.Equal(t, uint64(257), daBatch.L1MessagePopped) + assert.Equal(t, common.HexToHash("0x84206bc6d0076a233fc7120a0bec4e03bf2512207437768828384dddb335ba2e"), daBatch.Hash()) + + decodedDABatch, err = NewDABatchFromBytes(batchBytes) + assert.NoError(t, err) + decodedBatchBytes = decodedDABatch.Encode() + decodedBatchHexString = hex.EncodeToString(decodedBatchBytes) + assert.Equal(t, batchHexString, decodedBatchHexString) +} + +func TestErrorPaths(t *testing.T) { + // Test case: when the chunk is nil. + _, err := NewDAChunk(nil, 100) + assert.Error(t, err) + assert.Contains(t, err.Error(), "chunk is nil") + + // Test case: when the chunk contains no blocks. + chunk := &encoding.Chunk{ + Blocks: []*encoding.Block{}, + } + _, err = NewDAChunk(chunk, 0) + assert.Error(t, err) + assert.Contains(t, err.Error(), "number of blocks is 0") + + // Test case: when the chunk contains more than 255 blocks. + chunk = &encoding.Chunk{ + Blocks: []*encoding.Block{}, + } + for i := 0; i < 256; i++ { + chunk.Blocks = append(chunk.Blocks, &encoding.Block{}) + } + _, err = NewDAChunk(chunk, 0) + assert.Error(t, err) + assert.Contains(t, err.Error(), "number of blocks exceeds 1 byte") + + // Test case: Header.Number is not a uint64. + block := readBlockFromJSON(t, "../../../testdata/blockTrace_02.json") + block.Header.Number = new(big.Int).Lsh(block.Header.Number, 64) + chunk = &encoding.Chunk{ + Blocks: []*encoding.Block{block}, + } + _, err = NewDAChunk(chunk, 0) + assert.Error(t, err) + assert.Contains(t, err.Error(), "block number is not uint64") + + // Test case: number of transactions exceeds max uint16. + block = readBlockFromJSON(t, "../../../testdata/blockTrace_02.json") + for i := 0; i < 65537; i++ { + block.Transactions = append(block.Transactions, block.Transactions[0]) + } + chunk = &encoding.Chunk{ + Blocks: []*encoding.Block{block}, + } + _, err = NewDAChunk(chunk, 0) + assert.Error(t, err) + assert.Contains(t, err.Error(), "number of transactions exceeds max uint16") + + // Test case: decode transaction with hex string without 0x prefix error. + block = readBlockFromJSON(t, "../../../testdata/blockTrace_02.json") + block.Transactions = block.Transactions[:1] + block.Transactions[0].Data = "not-a-hex" + chunk = &encoding.Chunk{ + Blocks: []*encoding.Block{block}, + } + _, err = EstimateChunkL1CommitCalldataSize(chunk) + assert.Error(t, err) + assert.Contains(t, err.Error(), "hex string without 0x prefix") + _, err = EstimateChunkL1CommitGas(chunk) + assert.Error(t, err) + assert.Contains(t, err.Error(), "hex string without 0x prefix") + + // Test case: number of L1 messages exceeds max uint16. + block = readBlockFromJSON(t, "../../../testdata/blockTrace_04.json") + for i := 0; i < 65535; i++ { + tx := &block.Transactions[i] + txCopy := *tx + txCopy.Nonce = uint64(i + 1) + block.Transactions = append(block.Transactions, txCopy) + } + chunk = &encoding.Chunk{ + Blocks: []*encoding.Block{block}, + } + _, err = NewDAChunk(chunk, 0) + assert.Error(t, err) + assert.Contains(t, err.Error(), "number of L1 messages exceeds max uint16") +} + +func readBlockFromJSON(t *testing.T, filename string) *encoding.Block { + data, err := os.ReadFile(filename) + assert.NoError(t, err) + + block := &encoding.Block{} + assert.NoError(t, json.Unmarshal(data, block)) + return block +} diff --git a/common/types/encoding/codecv1/codecv1.go b/common/types/encoding/codecv1/codecv1.go new file mode 100644 index 000000000..70c4b66c8 --- /dev/null +++ b/common/types/encoding/codecv1/codecv1.go @@ -0,0 +1,505 @@ +package codecv1 + +import ( + "crypto/sha256" + "encoding/binary" + "encoding/hex" + "errors" + "fmt" + "math" + "math/big" + "strings" + + "github.com/scroll-tech/go-ethereum/accounts/abi" + "github.com/scroll-tech/go-ethereum/common" + "github.com/scroll-tech/go-ethereum/core/types" + "github.com/scroll-tech/go-ethereum/crypto" + "github.com/scroll-tech/go-ethereum/crypto/kzg4844" + "github.com/scroll-tech/go-ethereum/log" + + "scroll-tech/common/types/encoding" +) + +var ( + // BLSModulus is the BLS modulus defined in EIP-4844. + BLSModulus *big.Int + + // BlobDataProofArgs defines the argument types for `_blobDataProof` in `finalizeBatchWithProof4844`. + BlobDataProofArgs abi.Arguments + + // MaxNumChunks is the maximum number of chunks that a batch can contain. + MaxNumChunks int = 15 +) + +func init() { + // initialize modulus + modulus, success := new(big.Int).SetString("52435875175126190479447740508185965837690552500527637822603658699938581184513", 10) + if !success { + log.Crit("BLSModulus conversion failed") + } + BLSModulus = modulus + + // initialize arguments + bytes32Type, err1 := abi.NewType("bytes32", "bytes32", nil) + bytes48Type, err2 := abi.NewType("bytes48", "bytes48", nil) + if err1 != nil || err2 != nil { + log.Crit("Failed to initialize abi types", "err1", err1, "err2", err2) + } + + BlobDataProofArgs = abi.Arguments{ + {Type: bytes32Type, Name: "z"}, + {Type: bytes32Type, Name: "y"}, + {Type: bytes48Type, Name: "commitment"}, + {Type: bytes48Type, Name: "proof"}, + } +} + +// CodecV1Version denotes the version of the codec. +const CodecV1Version = 1 + +// DABlock represents a Data Availability Block. +type DABlock struct { + BlockNumber uint64 + Timestamp uint64 + BaseFee *big.Int + GasLimit uint64 + NumTransactions uint16 + NumL1Messages uint16 +} + +// DAChunk groups consecutive DABlocks with their transactions. +type DAChunk struct { + Blocks []*DABlock + Transactions [][]*types.TransactionData +} + +// DABatch contains metadata about a batch of DAChunks. +type DABatch struct { + // header + Version uint8 + BatchIndex uint64 + L1MessagePopped uint64 + TotalL1MessagePopped uint64 + DataHash common.Hash + BlobVersionedHash common.Hash + ParentBatchHash common.Hash + SkippedL1MessageBitmap []byte + + // blob payload + blob *kzg4844.Blob + z *kzg4844.Point +} + +// NewDABlock creates a new DABlock from the given encoding.Block and the total number of L1 messages popped before. +func NewDABlock(block *encoding.Block, totalL1MessagePoppedBefore uint64) (*DABlock, error) { + if !block.Header.Number.IsUint64() { + return nil, errors.New("block number is not uint64") + } + + // note: numL1Messages includes skipped messages + numL1Messages := block.NumL1Messages(totalL1MessagePoppedBefore) + if numL1Messages > math.MaxUint16 { + return nil, errors.New("number of L1 messages exceeds max uint16") + } + + // note: numTransactions includes skipped messages + numL2Transactions := block.NumL2Transactions() + numTransactions := numL1Messages + numL2Transactions + if numTransactions > math.MaxUint16 { + return nil, errors.New("number of transactions exceeds max uint16") + } + + daBlock := DABlock{ + BlockNumber: block.Header.Number.Uint64(), + Timestamp: block.Header.Time, + BaseFee: block.Header.BaseFee, + GasLimit: block.Header.GasLimit, + NumTransactions: uint16(numTransactions), + NumL1Messages: uint16(numL1Messages), + } + + return &daBlock, nil +} + +// Encode serializes the DABlock into a slice of bytes. +func (b *DABlock) Encode() []byte { + bytes := make([]byte, 60) + binary.BigEndian.PutUint64(bytes[0:], b.BlockNumber) + binary.BigEndian.PutUint64(bytes[8:], b.Timestamp) + if b.BaseFee != nil { + binary.BigEndian.PutUint64(bytes[40:], b.BaseFee.Uint64()) + } + binary.BigEndian.PutUint64(bytes[48:], b.GasLimit) + binary.BigEndian.PutUint16(bytes[56:], b.NumTransactions) + binary.BigEndian.PutUint16(bytes[58:], b.NumL1Messages) + return bytes +} + +// NewDAChunk creates a new DAChunk from the given encoding.Chunk and the total number of L1 messages popped before. +func NewDAChunk(chunk *encoding.Chunk, totalL1MessagePoppedBefore uint64) (*DAChunk, error) { + var blocks []*DABlock + var txs [][]*types.TransactionData + + for _, block := range chunk.Blocks { + b, err := NewDABlock(block, totalL1MessagePoppedBefore) + if err != nil { + return nil, err + } + blocks = append(blocks, b) + totalL1MessagePoppedBefore += block.NumL1Messages(totalL1MessagePoppedBefore) + txs = append(txs, block.Transactions) + } + + daChunk := DAChunk{ + Blocks: blocks, + Transactions: txs, + } + + return &daChunk, nil +} + +// Encode serializes the DAChunk into a slice of bytes. +func (c *DAChunk) Encode() []byte { + var chunkBytes []byte + chunkBytes = append(chunkBytes, byte(len(c.Blocks))) + + for _, block := range c.Blocks { + blockBytes := block.Encode() + chunkBytes = append(chunkBytes, blockBytes...) + } + + return chunkBytes +} + +// Hash computes the hash of the DAChunk data. +func (c *DAChunk) Hash() (common.Hash, error) { + var dataBytes []byte + + // concatenate block contexts + for _, block := range c.Blocks { + encodedBlock := block.Encode() + // only the first 58 bytes are used in the hashing process + dataBytes = append(dataBytes, encodedBlock[:58]...) + } + + // concatenate l1 tx hashes + for _, blockTxs := range c.Transactions { + for _, txData := range blockTxs { + if txData.Type == types.L1MessageTxType { + txHash := strings.TrimPrefix(txData.TxHash, "0x") + hashBytes, err := hex.DecodeString(txHash) + if err != nil { + return common.Hash{}, err + } + if len(hashBytes) != 32 { + return common.Hash{}, fmt.Errorf("unexpected hash: %s", txData.TxHash) + } + dataBytes = append(dataBytes, hashBytes...) + } + } + } + + hash := crypto.Keccak256Hash(dataBytes) + return hash, nil +} + +// NewDABatch creates a DABatch from the provided encoding.Batch. +func NewDABatch(batch *encoding.Batch) (*DABatch, error) { + // this encoding can only support a fixed number of chunks per batch + if len(batch.Chunks) > MaxNumChunks { + return nil, fmt.Errorf("too many chunks in batch") + } + + if len(batch.Chunks) == 0 { + return nil, fmt.Errorf("too few chunks in batch") + } + + // batch data hash + dataHash, err := computeBatchDataHash(batch.Chunks, batch.TotalL1MessagePoppedBefore) + if err != nil { + return nil, err + } + + // skipped L1 messages bitmap + bitmapBytes, totalL1MessagePoppedAfter, err := encoding.ConstructSkippedBitmap(batch.Index, batch.Chunks, batch.TotalL1MessagePoppedBefore) + if err != nil { + return nil, err + } + + // blob payload + blob, z, err := constructBlobPayload(batch.Chunks) + if err != nil { + return nil, err + } + + // blob versioned hash + c, err := kzg4844.BlobToCommitment(*blob) + if err != nil { + return nil, fmt.Errorf("failed to create blob commitment") + } + blobVersionedHash := kzg4844.CalcBlobHashV1(sha256.New(), &c) + + daBatch := DABatch{ + Version: CodecV1Version, + BatchIndex: batch.Index, + L1MessagePopped: totalL1MessagePoppedAfter - batch.TotalL1MessagePoppedBefore, + TotalL1MessagePopped: totalL1MessagePoppedAfter, + DataHash: dataHash, + BlobVersionedHash: blobVersionedHash, + ParentBatchHash: batch.ParentBatchHash, + SkippedL1MessageBitmap: bitmapBytes, + blob: blob, + z: z, + } + + return &daBatch, nil +} + +// computeBatchDataHash computes the data hash of the batch. +// Note: The batch hash and batch data hash are two different hashes, +// the former is used for identifying a badge in the contracts, +// the latter is used in the public input to the provers. +func computeBatchDataHash(chunks []*encoding.Chunk, totalL1MessagePoppedBefore uint64) (common.Hash, error) { + var dataBytes []byte + totalL1MessagePoppedBeforeChunk := totalL1MessagePoppedBefore + + for _, chunk := range chunks { + daChunk, err := NewDAChunk(chunk, totalL1MessagePoppedBeforeChunk) + if err != nil { + return common.Hash{}, err + } + totalL1MessagePoppedBeforeChunk += chunk.NumL1Messages(totalL1MessagePoppedBeforeChunk) + chunkHash, err := daChunk.Hash() + if err != nil { + return common.Hash{}, err + } + dataBytes = append(dataBytes, chunkHash.Bytes()...) + } + + dataHash := crypto.Keccak256Hash(dataBytes) + return dataHash, nil +} + +// constructBlobPayload constructs the 4844 blob payload. +func constructBlobPayload(chunks []*encoding.Chunk) (*kzg4844.Blob, *kzg4844.Point, error) { + // metadata consists of num_chunks (2 bytes) and chunki_size (4 bytes per chunk) + metadataLength := 2 + MaxNumChunks*4 + + // the raw (un-padded) blob payload + blobBytes := make([]byte, metadataLength) + + // challenge digest preimage + // 1 hash for metadata and 1 for each chunk + challengePreimage := make([]byte, (1+MaxNumChunks)*32) + + // the chunk data hash used for calculating the challenge preimage + var chunkDataHash common.Hash + + // blob metadata: num_chunks + binary.BigEndian.PutUint16(blobBytes[0:], uint16(len(chunks))) + + // encode blob metadata and L2 transactions, + // and simultaneously also build challenge preimage + for chunkID, chunk := range chunks { + currentChunkStartIndex := len(blobBytes) + + for _, block := range chunk.Blocks { + for _, tx := range block.Transactions { + if tx.Type != types.L1MessageTxType { + // encode L2 txs into blob payload + rlpTxData, err := encoding.ConvertTxDataToRLPEncoding(tx) + if err != nil { + return nil, nil, err + } + blobBytes = append(blobBytes, rlpTxData...) + } + } + } + + // blob metadata: chunki_size + if chunkSize := len(blobBytes) - currentChunkStartIndex; chunkSize != 0 { + binary.BigEndian.PutUint32(blobBytes[2+4*chunkID:], uint32(chunkSize)) + } + + // challenge: compute chunk data hash + chunkDataHash = crypto.Keccak256Hash(blobBytes[currentChunkStartIndex:]) + copy(challengePreimage[32+chunkID*32:], chunkDataHash[:]) + } + + // if we have fewer than MaxNumChunks chunks, the rest + // of the blob metadata is correctly initialized to 0, + // but we need to add padding to the challenge preimage + for chunkID := len(chunks); chunkID < MaxNumChunks; chunkID++ { + // use the last chunk's data hash as padding + copy(challengePreimage[32+chunkID*32:], chunkDataHash[:]) + } + + // challenge: compute metadata hash + hash := crypto.Keccak256Hash(blobBytes[0:metadataLength]) + copy(challengePreimage[0:], hash[:]) + + // convert raw data to BLSFieldElements + blob, err := makeBlobCanonical(blobBytes) + if err != nil { + return nil, nil, err + } + + // compute z = challenge_digest % BLS_MODULUS + challengeDigest := crypto.Keccak256Hash(challengePreimage) + pointBigInt := new(big.Int).Mod(new(big.Int).SetBytes(challengeDigest[:]), BLSModulus) + pointBytes := pointBigInt.Bytes() + + // the challenge point z + var z kzg4844.Point + start := 32 - len(pointBytes) + copy(z[start:], pointBytes) + + return blob, &z, nil +} + +// makeBlobCanonical converts the raw blob data into the canonical blob representation of 4096 BLSFieldElements. +func makeBlobCanonical(blobBytes []byte) (*kzg4844.Blob, error) { + // blob contains 131072 bytes but we can only utilize 31/32 of these + if len(blobBytes) > 126976 { + return nil, fmt.Errorf("oversized batch payload") + } + + // the canonical (padded) blob payload + var blob kzg4844.Blob + + // encode blob payload by prepending every 31 bytes with 1 zero byte + index := 0 + + for from := 0; from < len(blobBytes); from += 31 { + to := from + 31 + if to > len(blobBytes) { + to = len(blobBytes) + } + copy(blob[index+1:], blobBytes[from:to]) + index += 32 + } + + return &blob, nil +} + +// NewDABatchFromBytes attempts to decode the given byte slice into a DABatch. +// Note: This function only populates the batch header, it leaves the blob-related fields empty. +func NewDABatchFromBytes(data []byte) (*DABatch, error) { + if len(data) < 121 { + return nil, fmt.Errorf("insufficient data for DABatch, expected at least 121 bytes but got %d", len(data)) + } + + b := &DABatch{ + Version: data[0], + BatchIndex: binary.BigEndian.Uint64(data[1:9]), + L1MessagePopped: binary.BigEndian.Uint64(data[9:17]), + TotalL1MessagePopped: binary.BigEndian.Uint64(data[17:25]), + DataHash: common.BytesToHash(data[25:57]), + BlobVersionedHash: common.BytesToHash(data[57:89]), + ParentBatchHash: common.BytesToHash(data[89:121]), + SkippedL1MessageBitmap: data[121:], + } + + return b, nil +} + +// Encode serializes the DABatch into bytes. +func (b *DABatch) Encode() []byte { + batchBytes := make([]byte, 121+len(b.SkippedL1MessageBitmap)) + batchBytes[0] = b.Version + binary.BigEndian.PutUint64(batchBytes[1:], b.BatchIndex) + binary.BigEndian.PutUint64(batchBytes[9:], b.L1MessagePopped) + binary.BigEndian.PutUint64(batchBytes[17:], b.TotalL1MessagePopped) + copy(batchBytes[25:], b.DataHash[:]) + copy(batchBytes[57:], b.BlobVersionedHash[:]) + copy(batchBytes[89:], b.ParentBatchHash[:]) + copy(batchBytes[121:], b.SkippedL1MessageBitmap[:]) + return batchBytes +} + +// Hash computes the hash of the serialized DABatch. +func (b *DABatch) Hash() common.Hash { + bytes := b.Encode() + return crypto.Keccak256Hash(bytes) +} + +// BlobDataProof computes the abi-encoded blob verification data. +func (b *DABatch) BlobDataProof() ([]byte, error) { + if b.blob == nil { + return nil, errors.New("called BlobDataProof with empty blob") + } + if b.z == nil { + return nil, errors.New("called BlobDataProof with empty z") + } + + commitment, err := kzg4844.BlobToCommitment(*b.blob) + if err != nil { + return nil, fmt.Errorf("failed to create blob commitment") + } + + proof, y, err := kzg4844.ComputeProof(*b.blob, *b.z) + if err != nil { + log.Crit("failed to create KZG proof at point", "err", err, "z", hex.EncodeToString(b.z[:])) + } + + // Memory layout of ``_blobDataProof``: + // | z | y | kzg_commitment | kzg_proof | + // |---------|---------|----------------|-----------| + // | bytes32 | bytes32 | bytes48 | bytes48 | + + values := []interface{}{*b.z, y, commitment, proof} + return BlobDataProofArgs.Pack(values...) +} + +// Blob returns the blob of the batch. +func (b *DABatch) Blob() *kzg4844.Blob { + return b.blob +} + +// DecodeFromCalldata attempts to decode a DABatch and an array of DAChunks from the provided calldata byte slice. +func DecodeFromCalldata(data []byte) (*DABatch, []*DAChunk, error) { + // TODO: implement this function. + return nil, nil, nil +} + +// EstimateChunkL1CommitBlobSize estimates the size of the L1 commit blob for a single chunk. +func EstimateChunkL1CommitBlobSize(c *encoding.Chunk) (uint64, error) { + metadataSize := uint64(2 + 4*MaxNumChunks) // over-estimate: adding metadata length + chunkDataSize, err := chunkL1CommitBlobDataSize(c) + if err != nil { + return 0, err + } + paddedSize := ((metadataSize + chunkDataSize + 30) / 31) * 32 + return paddedSize, nil +} + +// EstimateBatchL1CommitBlobSize estimates the total size of the L1 commit blob for a batch. +func EstimateBatchL1CommitBlobSize(b *encoding.Batch) (uint64, error) { + metadataSize := uint64(2 + 4*MaxNumChunks) + var batchDataSize uint64 + for _, c := range b.Chunks { + chunkDataSize, err := chunkL1CommitBlobDataSize(c) + if err != nil { + return 0, err + } + batchDataSize += chunkDataSize + } + paddedSize := ((metadataSize + batchDataSize + 30) / 31) * 32 + return paddedSize, nil +} + +func chunkL1CommitBlobDataSize(c *encoding.Chunk) (uint64, error) { + var dataSize uint64 + for _, block := range c.Blocks { + for _, tx := range block.Transactions { + if tx.Type != types.L1MessageTxType { + rlpTxData, err := encoding.ConvertTxDataToRLPEncoding(tx) + if err != nil { + return 0, err + } + dataSize += uint64(len(rlpTxData)) + } + } + } + return dataSize, nil +} diff --git a/common/types/encoding/codecv1/codecv1_test.go b/common/types/encoding/codecv1/codecv1_test.go new file mode 100644 index 000000000..9120d9b23 --- /dev/null +++ b/common/types/encoding/codecv1/codecv1_test.go @@ -0,0 +1,814 @@ +package codecv1 + +import ( + "encoding/hex" + "encoding/json" + "os" + "strings" + "testing" + + "scroll-tech/common/types/encoding" + "scroll-tech/common/types/encoding/codecv0" + + "github.com/scroll-tech/go-ethereum/common" + "github.com/scroll-tech/go-ethereum/core/types" + "github.com/scroll-tech/go-ethereum/crypto/kzg4844" + "github.com/stretchr/testify/assert" +) + +func TestCodecV1BlockEncode(t *testing.T) { + block := &DABlock{} + encoded := hex.EncodeToString(block.Encode()) + assert.Equal(t, "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", encoded) + + trace2 := readBlockFromJSON(t, "../../../testdata/blockTrace_02.json") + block, err := NewDABlock(trace2, 0) + assert.NoError(t, err) + encoded = hex.EncodeToString(block.Encode()) + assert.Equal(t, "00000000000000020000000063807b2a0000000000000000000000000000000000000000000000000000000000001de9000355418d1e818400020000", encoded) + + trace3 := readBlockFromJSON(t, "../../../testdata/blockTrace_03.json") + block, err = NewDABlock(trace3, 0) + assert.NoError(t, err) + encoded = hex.EncodeToString(block.Encode()) + assert.Equal(t, "00000000000000030000000063807b2d0000000000000000000000000000000000000000000000000000000000001a2c0003546c3cbb39e500010000", encoded) + + trace4 := readBlockFromJSON(t, "../../../testdata/blockTrace_04.json") + block, err = NewDABlock(trace4, 0) + assert.NoError(t, err) + encoded = hex.EncodeToString(block.Encode()) + assert.Equal(t, "000000000000000d00000000646b6e13000000000000000000000000000000000000000000000000000000000000000000000000007a1200000c000b", encoded) + + trace5 := readBlockFromJSON(t, "../../../testdata/blockTrace_05.json") + block, err = NewDABlock(trace5, 0) + assert.NoError(t, err) + encoded = hex.EncodeToString(block.Encode()) + assert.Equal(t, "000000000000001100000000646b6ed0000000000000000000000000000000000000000000000000000000000000000000000000007a1200002a002a", encoded) + + trace6 := readBlockFromJSON(t, "../../../testdata/blockTrace_06.json") + block, err = NewDABlock(trace6, 0) + assert.NoError(t, err) + encoded = hex.EncodeToString(block.Encode()) + assert.Equal(t, "000000000000001100000000646b6ed0000000000000000000000000000000000000000000000000000000000000000000000000007a1200000a000a", encoded) + + trace7 := readBlockFromJSON(t, "../../../testdata/blockTrace_07.json") + block, err = NewDABlock(trace7, 0) + assert.NoError(t, err) + encoded = hex.EncodeToString(block.Encode()) + assert.Equal(t, "000000000000001100000000646b6ed0000000000000000000000000000000000000000000000000000000000000000000000000007a120001010101", encoded) + + // sanity check: v0 and v1 block encodings are identical + for _, trace := range []*encoding.Block{trace2, trace3, trace4, trace5, trace6, trace7} { + blockv0, err := codecv0.NewDABlock(trace, 0) + assert.NoError(t, err) + encodedv0 := hex.EncodeToString(blockv0.Encode()) + + blockv1, err := NewDABlock(trace, 0) + assert.NoError(t, err) + encodedv1 := hex.EncodeToString(blockv1.Encode()) + + assert.Equal(t, encodedv0, encodedv1) + } +} + +func TestCodecV1ChunkEncode(t *testing.T) { + // chunk with a single empty block + block := DABlock{} + chunk := &DAChunk{Blocks: []*DABlock{&block}, Transactions: [][]*types.TransactionData{nil}} + encoded := hex.EncodeToString(chunk.Encode()) + assert.Equal(t, "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", encoded) + + // transactions are not part of the encoding + chunk.Transactions[0] = append(chunk.Transactions[0], &types.TransactionData{Type: types.L1MessageTxType}, &types.TransactionData{Type: types.DynamicFeeTxType}) + encoded = hex.EncodeToString(chunk.Encode()) + assert.Equal(t, "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", encoded) + + trace := readBlockFromJSON(t, "../../../testdata/blockTrace_02.json") + originalChunk := &encoding.Chunk{Blocks: []*encoding.Block{trace}} + chunk, err := NewDAChunk(originalChunk, 0) + assert.NoError(t, err) + encoded = hex.EncodeToString(chunk.Encode()) + assert.Equal(t, "0100000000000000020000000063807b2a0000000000000000000000000000000000000000000000000000000000001de9000355418d1e818400020000", encoded) + + trace = readBlockFromJSON(t, "../../../testdata/blockTrace_03.json") + originalChunk = &encoding.Chunk{Blocks: []*encoding.Block{trace}} + chunk, err = NewDAChunk(originalChunk, 0) + assert.NoError(t, err) + encoded = hex.EncodeToString(chunk.Encode()) + assert.Equal(t, "0100000000000000030000000063807b2d0000000000000000000000000000000000000000000000000000000000001a2c0003546c3cbb39e500010000", encoded) + + trace = readBlockFromJSON(t, "../../../testdata/blockTrace_04.json") + originalChunk = &encoding.Chunk{Blocks: []*encoding.Block{trace}} + chunk, err = NewDAChunk(originalChunk, 0) + assert.NoError(t, err) + encoded = hex.EncodeToString(chunk.Encode()) + assert.Equal(t, "01000000000000000d00000000646b6e13000000000000000000000000000000000000000000000000000000000000000000000000007a1200000c000b", encoded) + + trace = readBlockFromJSON(t, "../../../testdata/blockTrace_05.json") + originalChunk = &encoding.Chunk{Blocks: []*encoding.Block{trace}} + chunk, err = NewDAChunk(originalChunk, 0) + assert.NoError(t, err) + encoded = hex.EncodeToString(chunk.Encode()) + assert.Equal(t, "01000000000000001100000000646b6ed0000000000000000000000000000000000000000000000000000000000000000000000000007a1200002a002a", encoded) + + trace = readBlockFromJSON(t, "../../../testdata/blockTrace_06.json") + originalChunk = &encoding.Chunk{Blocks: []*encoding.Block{trace}} + chunk, err = NewDAChunk(originalChunk, 0) + assert.NoError(t, err) + encoded = hex.EncodeToString(chunk.Encode()) + assert.Equal(t, "01000000000000001100000000646b6ed0000000000000000000000000000000000000000000000000000000000000000000000000007a1200000a000a", encoded) + + trace = readBlockFromJSON(t, "../../../testdata/blockTrace_07.json") + originalChunk = &encoding.Chunk{Blocks: []*encoding.Block{trace}} + chunk, err = NewDAChunk(originalChunk, 0) + assert.NoError(t, err) + encoded = hex.EncodeToString(chunk.Encode()) + assert.Equal(t, "01000000000000001100000000646b6ed0000000000000000000000000000000000000000000000000000000000000000000000000007a120001010101", encoded) +} + +func TestCodecV1ChunkHash(t *testing.T) { + // chunk with a single empty block + block := DABlock{} + chunk := &DAChunk{Blocks: []*DABlock{&block}, Transactions: [][]*types.TransactionData{nil}} + hash, err := chunk.Hash() + assert.NoError(t, err) + assert.Equal(t, "0x7cdb9d7f02ea58dfeb797ed6b4f7ea68846e4f2b0e30ed1535fc98b60c4ec809", hash.Hex()) + + // L1 transactions are part of the hash + chunk.Transactions[0] = append(chunk.Transactions[0], &types.TransactionData{Type: types.L1MessageTxType, TxHash: "0x0000000000000000000000000000000000000000000000000000000000000000"}) + hash, err = chunk.Hash() + assert.NoError(t, err) + assert.Equal(t, "0xdcb42a70c54293e75a19dd1303d167822182d78b361dd7504758c35e516871b2", hash.Hex()) + + // L2 transactions are not part of the hash + chunk.Transactions[0] = append(chunk.Transactions[0], &types.TransactionData{Type: types.DynamicFeeTxType, TxHash: "0x0000000000000000000000000000000000000000000000000000000000000000"}) + hash, err = chunk.Hash() + assert.NoError(t, err) + assert.Equal(t, "0xdcb42a70c54293e75a19dd1303d167822182d78b361dd7504758c35e516871b2", hash.Hex()) + + // numL1Messages are not part of the hash + chunk.Blocks[0].NumL1Messages = 1 + hash, err = chunk.Hash() + assert.NoError(t, err) + assert.Equal(t, "0xdcb42a70c54293e75a19dd1303d167822182d78b361dd7504758c35e516871b2", hash.Hex()) + + // invalid hash + chunk.Transactions[0] = append(chunk.Transactions[0], &types.TransactionData{Type: types.L1MessageTxType, TxHash: "0xg"}) + _, err = chunk.Hash() + assert.Error(t, err) + + trace := readBlockFromJSON(t, "../../../testdata/blockTrace_02.json") + originalChunk := &encoding.Chunk{Blocks: []*encoding.Block{trace}} + chunk, err = NewDAChunk(originalChunk, 0) + assert.NoError(t, err) + hash, err = chunk.Hash() + assert.NoError(t, err) + assert.Equal(t, "0x820f25d806ddea0ccdbfa463ee480da5b6ea3906e8a658417fb5417d0f837f5c", hash.Hex()) + + trace = readBlockFromJSON(t, "../../../testdata/blockTrace_03.json") + originalChunk = &encoding.Chunk{Blocks: []*encoding.Block{trace}} + chunk, err = NewDAChunk(originalChunk, 0) + assert.NoError(t, err) + hash, err = chunk.Hash() + assert.NoError(t, err) + assert.Equal(t, "0x4620b3900e8454133448b677cbb2054c5dd61d467d7ebf752bfb12cffff90f40", hash.Hex()) + + trace = readBlockFromJSON(t, "../../../testdata/blockTrace_04.json") + originalChunk = &encoding.Chunk{Blocks: []*encoding.Block{trace}} + chunk, err = NewDAChunk(originalChunk, 0) + assert.NoError(t, err) + hash, err = chunk.Hash() + assert.NoError(t, err) + assert.Equal(t, "0x059c6451e83012b405c7e1a38818369012a4a1c87d7d699366eac946d0410d73", hash.Hex()) + + trace = readBlockFromJSON(t, "../../../testdata/blockTrace_05.json") + originalChunk = &encoding.Chunk{Blocks: []*encoding.Block{trace}} + chunk, err = NewDAChunk(originalChunk, 0) + assert.NoError(t, err) + hash, err = chunk.Hash() + assert.NoError(t, err) + assert.Equal(t, "0x854fc3136f47ce482ec85ee3325adfa16a1a1d60126e1c119eaaf0c3a9e90f8e", hash.Hex()) + + trace = readBlockFromJSON(t, "../../../testdata/blockTrace_06.json") + originalChunk = &encoding.Chunk{Blocks: []*encoding.Block{trace}} + chunk, err = NewDAChunk(originalChunk, 0) + assert.NoError(t, err) + hash, err = chunk.Hash() + assert.NoError(t, err) + assert.Equal(t, "0x2aa220ca7bd1368e59e8053eb3831e30854aa2ec8bd3af65cee350c1c0718ba6", hash.Hex()) + + trace = readBlockFromJSON(t, "../../../testdata/blockTrace_07.json") + originalChunk = &encoding.Chunk{Blocks: []*encoding.Block{trace}} + chunk, err = NewDAChunk(originalChunk, 0) + assert.NoError(t, err) + hash, err = chunk.Hash() + assert.NoError(t, err) + assert.Equal(t, "0xb65521bea7daff75838de07951c3c055966750fb5a270fead5e0e727c32455c3", hash.Hex()) +} + +func TestCodecV1BatchEncode(t *testing.T) { + // empty batch + batch := &DABatch{Version: CodecV1Version} + encoded := hex.EncodeToString(batch.Encode()) + assert.Equal(t, "01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", encoded) + + trace2 := readBlockFromJSON(t, "../../../testdata/blockTrace_02.json") + chunk2 := &encoding.Chunk{Blocks: []*encoding.Block{trace2}} + originalBatch := &encoding.Batch{Chunks: []*encoding.Chunk{chunk2}} + batch, err := NewDABatch(originalBatch) + assert.NoError(t, err) + encoded = hex.EncodeToString(batch.Encode()) + assert.Equal(t, "010000000000000000000000000000000000000000000000009f81f6879f121da5b7a37535cdb21b3d53099266de57b1fdf603ce32100ed54101af944924715b48be6ce3c35aef7500a50e909265599bd2b3e544ac59fc75530000000000000000000000000000000000000000000000000000000000000000", encoded) + + trace3 := readBlockFromJSON(t, "../../../testdata/blockTrace_03.json") + chunk3 := &encoding.Chunk{Blocks: []*encoding.Block{trace3}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk3}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + encoded = hex.EncodeToString(batch.Encode()) + assert.Equal(t, "01000000000000000000000000000000000000000000000000d46d19f6d48083dc7905a68e6a20ea6a8fbcd445d56b549b324a8485b5b574a6010c54fa675ed1b78f269827177019b0814a4ac4d269c68037e2c41cf08f94110000000000000000000000000000000000000000000000000000000000000000", encoded) + + trace4 := readBlockFromJSON(t, "../../../testdata/blockTrace_04.json") + chunk4 := &encoding.Chunk{Blocks: []*encoding.Block{trace4}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk4}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + encoded = hex.EncodeToString(batch.Encode()) + assert.Equal(t, "010000000000000000000000000000000b000000000000000bcaece1705bf2ce5e94154469d910ffe8d102419c5eb3152c0c6d237cf35c885f01ea66c4de196d36e2c3a5d7c0045100b9e46ef65be8f7a921ef20e6f2e99ebd000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003ff", encoded) + + trace5 := readBlockFromJSON(t, "../../../testdata/blockTrace_05.json") + chunk5 := &encoding.Chunk{Blocks: []*encoding.Block{trace5}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk5}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + encoded = hex.EncodeToString(batch.Encode()) + assert.Equal(t, "010000000000000000000000000000002a000000000000002a93255aa24dd468c5645f1e6901b8131a7a78a0eeb2a17cbb09ba64688a8de6b401a327088bb2b13151449d8313c281d0006d12e8453e863637b746898b6ad5a600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fffffffff", encoded) + + trace6 := readBlockFromJSON(t, "../../../testdata/blockTrace_06.json") + chunk6 := &encoding.Chunk{Blocks: []*encoding.Block{trace6}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk6}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + encoded = hex.EncodeToString(batch.Encode()) + assert.Equal(t, "010000000000000000000000000000000a000000000000000ac7bcc8da943dd83404e84d9ce7e894ab97ce4829df4eb51ebbbe13c90b5a3f4d01a327088bb2b13151449d8313c281d0006d12e8453e863637b746898b6ad5a6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001dd", encoded) + + trace7 := readBlockFromJSON(t, "../../../testdata/blockTrace_07.json") + chunk7 := &encoding.Chunk{Blocks: []*encoding.Block{trace7}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk7}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + encoded = hex.EncodeToString(batch.Encode()) + assert.Equal(t, "01000000000000000000000000000001010000000000000101899a411a3309c6491701b7b955c7b1115ac015414bbb71b59a0ca561668d520801a327088bb2b13151449d8313c281d0006d12e8453e863637b746898b6ad5a60000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0000000000000000000000000000000000000000000000000000000000000000", encoded) + + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk2, chunk3, chunk4, chunk5}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + encoded = hex.EncodeToString(batch.Encode()) + assert.Equal(t, "010000000000000000000000000000002a000000000000002ae7740182b0948139505b6b296d0c6c6f7717708323e6e687917acad823b559d8014ae5927a983081a8bcdbcce19e926c9e4c56e2dc89c91c32c034b875b8a1ca00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffbff", encoded) + + chunk8 := &encoding.Chunk{Blocks: []*encoding.Block{trace2, trace3, trace4}} + chunk9 := &encoding.Chunk{Blocks: []*encoding.Block{trace5}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk8, chunk9}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + encoded = hex.EncodeToString(batch.Encode()) + assert.Equal(t, "010000000000000000000000000000002a000000000000002a9b0f37c563d27d9717ab16d47075df996c54fe110130df6b11bfd7230e13476701b63f87bdd2caa8d43500d47ee59204f61af95339483c62ff436c6beabf47bf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffbff", encoded) +} + +func TestCodecV1BatchHash(t *testing.T) { + // empty batch + batch := &DABatch{Version: CodecV1Version} + assert.Equal(t, "0x4b6fe410f63051f6e93532087b42ece79fb7b966e2ba5845e6cd1c091f27e564", batch.Hash().Hex()) + + trace2 := readBlockFromJSON(t, "../../../testdata/blockTrace_02.json") + chunk2 := &encoding.Chunk{Blocks: []*encoding.Block{trace2}} + originalBatch := &encoding.Batch{Chunks: []*encoding.Chunk{chunk2}} + batch, err := NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "0xd557b02638c0385d5124f7fc188a025b33f8819b7f78c000751404997148ab8b", batch.Hash().Hex()) + + trace3 := readBlockFromJSON(t, "../../../testdata/blockTrace_03.json") + chunk3 := &encoding.Chunk{Blocks: []*encoding.Block{trace3}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk3}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "0xf13c7e249d00941c59fe4cd970241bbd6753eede8e043c438165674031792b3b", batch.Hash().Hex()) + + trace4 := readBlockFromJSON(t, "../../../testdata/blockTrace_04.json") + chunk4 := &encoding.Chunk{Blocks: []*encoding.Block{trace4}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk4}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "0xb64208f07fab641f7ebf831686d05ad667da0c7bfabcbd9c878cc22cbc8032fd", batch.Hash().Hex()) + + trace5 := readBlockFromJSON(t, "../../../testdata/blockTrace_05.json") + chunk5 := &encoding.Chunk{Blocks: []*encoding.Block{trace5}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk5}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "0x4f7426d164e885574a661838406083f5292b0a1bc6dc20c51129eed0723b8a27", batch.Hash().Hex()) + + trace6 := readBlockFromJSON(t, "../../../testdata/blockTrace_06.json") + chunk6 := &encoding.Chunk{Blocks: []*encoding.Block{trace6}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk6}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "0xfce89ec2aed85cebeb20eea722e3ae4ec622bff49218dbe249a2d358e2e85451", batch.Hash().Hex()) + + trace7 := readBlockFromJSON(t, "../../../testdata/blockTrace_07.json") + chunk7 := &encoding.Chunk{Blocks: []*encoding.Block{trace7}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk7}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "0x8fc063179b709bab338674278bb7b70dce2879a4e11ea857b3a202fb3313559f", batch.Hash().Hex()) + + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk2, chunk3, chunk4, chunk5}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "0xf1c94cdf45967bc60bfccd599edd8cb07fd0201f41ab068637834f86140f62bf", batch.Hash().Hex()) + + chunk8 := &encoding.Chunk{Blocks: []*encoding.Block{trace2, trace3, trace4}} + chunk9 := &encoding.Chunk{Blocks: []*encoding.Block{trace5}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk8, chunk9}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "0xfef0b56bd889529e3a1d884c88dd1c867e084fdc1369496907be8f865f43f0e0", batch.Hash().Hex()) +} + +func TestCodecV1BatchDataHash(t *testing.T) { + trace2 := readBlockFromJSON(t, "../../../testdata/blockTrace_02.json") + chunk2 := &encoding.Chunk{Blocks: []*encoding.Block{trace2}} + originalBatch := &encoding.Batch{Chunks: []*encoding.Chunk{chunk2}} + batch, err := NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "0x9f81f6879f121da5b7a37535cdb21b3d53099266de57b1fdf603ce32100ed541", batch.DataHash.Hex()) + + trace3 := readBlockFromJSON(t, "../../../testdata/blockTrace_03.json") + chunk3 := &encoding.Chunk{Blocks: []*encoding.Block{trace3}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk3}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "0xd46d19f6d48083dc7905a68e6a20ea6a8fbcd445d56b549b324a8485b5b574a6", batch.DataHash.Hex()) + + trace4 := readBlockFromJSON(t, "../../../testdata/blockTrace_04.json") + chunk4 := &encoding.Chunk{Blocks: []*encoding.Block{trace4}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk4}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "0xcaece1705bf2ce5e94154469d910ffe8d102419c5eb3152c0c6d237cf35c885f", batch.DataHash.Hex()) + + trace5 := readBlockFromJSON(t, "../../../testdata/blockTrace_05.json") + chunk5 := &encoding.Chunk{Blocks: []*encoding.Block{trace5}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk5}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "0x93255aa24dd468c5645f1e6901b8131a7a78a0eeb2a17cbb09ba64688a8de6b4", batch.DataHash.Hex()) + + trace6 := readBlockFromJSON(t, "../../../testdata/blockTrace_06.json") + chunk6 := &encoding.Chunk{Blocks: []*encoding.Block{trace6}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk6}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "0xc7bcc8da943dd83404e84d9ce7e894ab97ce4829df4eb51ebbbe13c90b5a3f4d", batch.DataHash.Hex()) + + trace7 := readBlockFromJSON(t, "../../../testdata/blockTrace_07.json") + chunk7 := &encoding.Chunk{Blocks: []*encoding.Block{trace7}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk7}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "0x899a411a3309c6491701b7b955c7b1115ac015414bbb71b59a0ca561668d5208", batch.DataHash.Hex()) + + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk2, chunk3, chunk4, chunk5}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "0xe7740182b0948139505b6b296d0c6c6f7717708323e6e687917acad823b559d8", batch.DataHash.Hex()) + + chunk8 := &encoding.Chunk{Blocks: []*encoding.Block{trace2, trace3, trace4}} + chunk9 := &encoding.Chunk{Blocks: []*encoding.Block{trace5}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk8, chunk9}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "0x9b0f37c563d27d9717ab16d47075df996c54fe110130df6b11bfd7230e134767", batch.DataHash.Hex()) +} + +func TestCodecV1BatchBlob(t *testing.T) { + trace2 := readBlockFromJSON(t, "../../../testdata/blockTrace_02.json") + chunk2 := &encoding.Chunk{Blocks: []*encoding.Block{trace2}} + originalBatch := &encoding.Batch{Chunks: []*encoding.Chunk{chunk2}} + batch, err := NewDABatch(originalBatch) + assert.NoError(t, err) + encoded := strings.TrimRight(hex.EncodeToString(batch.blob[:]), "0") + assert.Equal(t, + // metadata + "00"+"0001"+"000000e6"+"00000000"+"00000000"+"00000000"+"00000000"+"00000000"+"00000000"+"00"+"00"+"000000"+"00000000"+"00000000"+"00000000"+"00000000"+"00000000"+"00000000"+"00000000"+ + // tx payload + "00f87180843b9aec2e8307a12094c0c4c8baea3f6acb49b6e1fb9e2adeceeacb000ca28a152d02c7e14af60000008083019ecea0ab07ae99c67aa78e7ba5cf670081e90cc32b219b1de102513d56548a41e86df514a034cbd19feacd73e8ce6400d00c4d1996b9b5243c578fd7f51bfaec288bbaf42a8bf87101843b9aec2e830007a1209401bae6bf68e9a03fb2bc0615b1bf0d69ce9411ed8a152d02c7e14a00f60000008083019ecea0f039985866d8256f10c1be4f7b2cace28d8f20bde2007e2604393eb095b7f77316a05a3e6e81065f2b4604bcec5bd4aba68483599600fc3f879380aac1c09c6eed32f1", encoded) + assert.Equal(t, "0x01af944924715b48be6ce3c35aef7500a50e909265599bd2b3e544ac59fc7553", batch.BlobVersionedHash.Hex()) + + trace3 := readBlockFromJSON(t, "../../../testdata/blockTrace_03.json") + chunk3 := &encoding.Chunk{Blocks: []*encoding.Block{trace3}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk3}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + encoded = strings.TrimRight(hex.EncodeToString(batch.blob[:]), "0") + assert.Equal(t, "000001000016310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f9162d82cf5502843b9b0a17843b9b0a17831197e28080b915d26080604000523480156200001157600080fd5b50604051620014b2380380620014b283390081810160405260a08110156200003757600080fd5b8151602083015160408000850180519151939592948301929184640100000000821115620000635760000080fd5b9083019060208201858111156200007957600080fd5b8251640100000000008111828201881017156200009457600080fd5b8252508151602091820100929091019080838360005b83811015620000c357818101518382015260200100620000a9565b50505050905090810190601f168015620000f1578082038051006001836020036101000a031916815260200191505b5060405260200180516000405193929190846401000000008211156200011557600080fd5b908301906000208201858111156200012b57600080fd5b8251640100000000811182820188001017156200014657600080fd5b8252508151602091820192909101908083830060005b83811015620001755781810151838201526020016200015b565b5050005050905090810190601f168015620001a3578082038051600183602003610100000a031916815260200191505b506040526020908101518551909350859250008491620001c8916003918501906200026b565b508051620001de906004906000208401906200026b565b50506005805461ff001960ff199091166012171690005550600680546001600160a01b038088166001600160a01b031992831617900092556007805492871692909116919091179055620002308162000255565b5000506005805462010000600160b01b031916336201000002179055506200030700915050565b6005805460ff191660ff92909216919091179055565b82805460000181600116156101000203166002900490600052602060002090601f01602000900481019282601f10620002ae57805160ff1916838001178555620002de56005b82800160010185558215620002de579182015b82811115620002de57825100825591602001919060010190620002c1565b50620002ec929150620002f056005b5090565b5b80821115620002ec5760008155600101620002f1565b61119b0080620003176000396000f3fe608060405234801561001057600080fd5b50600004361061010b5760003560e01c80635c975abb116100a257806395d89b41110061007157806395d89b41146103015780639dc29fac14610309578063a457c200d714610335578063a9059cbb14610361578063dd62ed3e1461038d5761010b00565b80635c975abb1461029d57806370a08231146102a55780638456cb5914006102cb5780638e50817a146102d35761010b565b8063313ce567116100de57008063313ce5671461021d578063395093511461023b5780633f4ba83a146102006757806340c10f19146102715761010b565b806306fdde031461011057806300095ea7b31461018d57806318160ddd146101cd57806323b872dd146101e757005b600080fd5b6101186103bb565b604080516020808252835181830152835100919283929083019185019080838360005b838110156101525781810151838200015260200161013a565b50505050905090810190601f16801561017f578082000380516001836020036101000a031916815260200191505b50925050506040005180910390f35b6101b9600480360360408110156101a357600080fd5b50600001600160a01b038135169060200135610451565b60408051911515825251900081900360200190f35b6101d561046e565b6040805191825251908190036020000190f35b6101b9600480360360608110156101fd57600080fd5b50600160010060a01b03813581169160208101359091169060400135610474565b610225610004fb565b6040805160ff9092168252519081900360200190f35b6101b9600400803603604081101561025157600080fd5b506001600160a01b03813516906000200135610504565b61026f610552565b005b61026f600480360360408110150061028757600080fd5b506001600160a01b0381351690602001356105a9565b006101b9610654565b6101d5600480360360208110156102bb57600080fd5b5000356001600160a01b0316610662565b61026f61067d565b61026f60048036030060408110156102e957600080fd5b506001600160a01b0381358116916020010035166106d2565b610118610757565b61026f6004803603604081101561031f0057600080fd5b506001600160a01b0381351690602001356107b8565b6101b9006004803603604081101561034b57600080fd5b506001600160a01b0381351600906020013561085f565b6101b96004803603604081101561037757600080fd005b506001600160a01b0381351690602001356108c7565b6101d560048036030060408110156103a357600080fd5b506001600160a01b0381358116916020010035166108db565b60038054604080516020601f600260001961010060018816001502019095169490940493840181900481028201810190925282815260609300909290918301828280156104475780601f1061041c5761010080835404028300529160200191610447565b820191906000526020600020905b8154815290600001019060200180831161042a57829003601f168201915b505050505090509000565b600061046561045e610906565b848461090a565b50600192915050565b0060025490565b60006104818484846109f6565b6104f18461048d610906565b006104ec8560405180606001604052806028815260200161108560289139600100600160a01b038a166000908152600160205260408120906104cb610906565b006001600160a01b031681526020810191909152604001600020549190610b5100565b61090a565b5060019392505050565b60055460ff1690565b600061046500610511610906565b846104ec8560016000610522610906565b6001600160a0001b03908116825260208083019390935260409182016000908120918c16815200925290205490610be8565b6007546001600160a01b0316331461059f57604000805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0818005b1b1bddd95960aa1b604482015290519081900360640190fd5b6105a7610c0049565b565b600554610100900460ff16156105f9576040805162461bcd60e5001b815260206004820152601060248201526f14185d5cd8589b194e881c185d005cd95960821b604482015290519081900360640190fd5b600654600160016000a01b03163314610646576040805162461bcd60e51b81526020600482015260000b60248201526a1b9bdd08185b1b1bddd95960aa1b60448201529051908190000360640190fd5b6106508282610ced565b5050565b600554610100900460ff001690565b6001600160a01b031660009081526020819052604090205490565b006007546001600160a01b031633146106ca576040805162461bcd60e51b81520060206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b60440082015290519081900360640190fd5b6105a7610ddd565b600554620100009000046001600160a01b03163314610726576040805162461bcd60e51b81526020006004820152600c60248201526b6f6e6c7920466163746f727960a01b60448200015290519081900360640190fd5b600780546001600160a01b03928316600100600160a01b0319918216179091556006805493909216921691909117905556005b60048054604080516020601f600260001961010060018816150201909516009490940493840181900481028201810190925282815260609390929091830100828280156104475780601f1061041c5761010080835404028352916020019100610447565b600554610100900460ff1615610808576040805162461bcd60e5001b815260206004820152601060248201526f14185d5cd8589b194e881c185d005cd95960821b604482015290519081900360640190fd5b600654600160016000a01b03163314610855576040805162461bcd60e51b81526020600482015260000b60248201526a1b9bdd08185b1b1bddd95960aa1b60448201529051908190000360640190fd5b6106508282610e65565b600061046561086c610906565b84006104ec85604051806060016040528060258152602001611117602591396001006000610896610906565b6001600160a01b0390811682526020808301939093005260409182016000908120918d16815292529020549190610b51565b6000610004656108d4610906565b84846109f6565b6001600160a01b0391821660009000815260016020908152604080832093909416825291909152205490565b339000565b6001600160a01b03831661094f5760405162461bcd60e51b8152600401008080602001828103825260248152602001806110f3602491396040019150500060405180910390fd5b6001600160a01b0382166109945760405162461bcd6000e51b815260040180806020018281038252602281526020018061103d602291003960400191505060405180910390fd5b6001600160a01b038084166000818100526001602090815260408083209487168084529482529182902085905581510085815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b00200ac8c7c3b9259281900390910190a3505050565b6001600160a01b03831600610a3b5760405162461bcd60e51b8152600401808060200182810382526025008152602001806110ce6025913960400191505060405180910390fd5b600160000160a01b038216610a805760405162461bcd60e51b815260040180806020010082810382526023815260200180610ff8602391396040019150506040518091000390fd5b610a8b838383610f61565b610ac8816040518060600160405280600026815260200161105f602691396001600160a01b038616600090815260208100905260409020549190610b51565b6001600160a01b03808516600090815260002081905260408082209390935590841681522054610af79082610be8565b600001600160a01b03808416600081815260208181526040918290209490945580005185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952b00a7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000818400841115610be05760405162461bcd60e51b8152600401808060200182810382005283818151815260200191508051906020019080838360005b83811015610b00a5578181015183820152602001610b8d565b50505050905090810190601f16008015610bd25780820380516001836020036101000a03191681526020019150005b509250505060405180910390fd5b505050900390565b60008282018381100015610c42576040805162461bcd60e51b815260206004820152601b6024820100527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000000604482015290519081900360640190fd5b9392505050565b60055461000100900460ff16610c9c576040805162461bcd60e51b81526020600482015200601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b00604482015290519081900360640190fd5b6005805461ff00191690557f5db900ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61000cd0610906565b604080516001600160a01b03909216825251908190036020000190a1565b6001600160a01b038216610d48576040805162461bcd60e51b81005260206004820152601f60248201527f45524332303a206d696e7420746f2000746865207a65726f20616464726573730060448201529051908190036064010090fd5b610d5460008383610f61565b600254610d619082610be8565b600255006001600160a01b038216600090815260208190526040902054610d87908261000be8565b6001600160a01b038316600081815260208181526040808320949000945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa95002ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60055400610100900460ff1615610e2d576040805162461bcd60e51b81526020600482000152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60440082015290519081900360640190fd5b6005805461ff0019166101001790557f0062e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a20058610cd0610906565b6001600160a01b038216610eaa5760405162461bcd6000e51b81526004018080602001828103825260218152602001806110ad602191003960400191505060405180910390fd5b610eb682600083610f61565b610ef3008160405180606001604052806022815260200161101b60229139600160016000a01b0385166000908152602081905260409020549190610b51565b600160010060a01b038316600090815260208190526040902055600254610f199082610f00b5565b6002556040805182815290516000916001600160a01b038516917fdd00f252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef009181900360200190a35050565b610f6c838383610fb0565b610f7461065456005b15610fb05760405162461bcd60e51b81526004018080602001828103825200602a81526020018061113c602a913960400191505060405180910390fd5b50005050565b6000610c4283836040518060400160405280601e81526020017f53006166654d6174683a207375627472616374696f6e206f766572666c6f77000000815250610b5156fe45524332303a207472616e7366657220746f2074686520007a65726f206164647265737345524332303a206275726e20616d6f756e742000657863656564732062616c616e636545524332303a20617070726f76652074006f20746865207a65726f206164647265737345524332303a207472616e736600657220616d6f756e7420657863656564732062616c616e636545524332303a00207472616e7366657220616d6f756e74206578636565647320616c6c6f7761006e636545524332303a206275726e2066726f6d20746865207a65726f20616400647265737345524332303a207472616e736665722066726f6d20746865207a0065726f206164647265737345524332303a20617070726f76652066726f6d2000746865207a65726f206164647265737345524332303a206465637265617365006420616c6c6f77616e63652062656c6f77207a65726f4552433230506175730061626c653a20746f6b656e207472616e73666572207768696c652070617573006564a2646970667358221220e96342bec8f6c2bf72815a39998973b64c3bed0057770f402e9a7b7eeda0265d4c64736f6c634300060c0033000000000000000000000000001c5a77d9fa7ef466951b2f01f724bca3a5820b63000000000000000000000000001c5a77d9fa7ef466951b2f01f724bca3a5820b630000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000009570045544820636f696e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004574554480000000000000000000000000000000000000000000000000000000000c001a0235c1a8d40e8c347890397f1a92e6eadbd6422cf7c210e3e173700f0553c633172a02f7c0384ddd06970446e74229cd96216da62196dc62395bd00a52095d44b8a9af7", encoded) + assert.Equal(t, "0x010c54fa675ed1b78f269827177019b0814a4ac4d269c68037e2c41cf08f9411", batch.BlobVersionedHash.Hex()) + + trace4 := readBlockFromJSON(t, "../../../testdata/blockTrace_04.json") + chunk4 := &encoding.Chunk{Blocks: []*encoding.Block{trace4}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk4}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + encoded = strings.TrimRight(hex.EncodeToString(batch.blob[:]), "0") + assert.Equal(t, "0000010000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000df0b80825dc0941a258d17bf244c4df02d40343a7626a9d321e10580808080008", encoded) + assert.Equal(t, "0x01ea66c4de196d36e2c3a5d7c0045100b9e46ef65be8f7a921ef20e6f2e99ebd", batch.BlobVersionedHash.Hex()) + + // this batch only contains L1 txs + trace5 := readBlockFromJSON(t, "../../../testdata/blockTrace_05.json") + chunk5 := &encoding.Chunk{Blocks: []*encoding.Block{trace5}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk5}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + encoded = strings.TrimRight(hex.EncodeToString(batch.blob[:]), "0") + assert.Equal(t, "000001", encoded) + assert.Equal(t, "0x01a327088bb2b13151449d8313c281d0006d12e8453e863637b746898b6ad5a6", batch.BlobVersionedHash.Hex()) + + trace6 := readBlockFromJSON(t, "../../../testdata/blockTrace_06.json") + chunk6 := &encoding.Chunk{Blocks: []*encoding.Block{trace6}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk6}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + encoded = strings.TrimRight(hex.EncodeToString(batch.blob[:]), "0") + assert.Equal(t, "000001", encoded) + assert.Equal(t, "0x01a327088bb2b13151449d8313c281d0006d12e8453e863637b746898b6ad5a6", batch.BlobVersionedHash.Hex()) + + trace7 := readBlockFromJSON(t, "../../../testdata/blockTrace_07.json") + chunk7 := &encoding.Chunk{Blocks: []*encoding.Block{trace7}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk7}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + encoded = strings.TrimRight(hex.EncodeToString(batch.blob[:]), "0") + assert.Equal(t, "000001", encoded) + assert.Equal(t, "0x01a327088bb2b13151449d8313c281d0006d12e8453e863637b746898b6ad5a6", batch.BlobVersionedHash.Hex()) + + // 15 chunks + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk2, chunk2, chunk2, chunk2, chunk2, chunk2, chunk2, chunk2, chunk2, chunk2, chunk2, chunk2, chunk2, chunk2, chunk2}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + encoded = strings.TrimRight(hex.EncodeToString(batch.blob[:]), "0") + assert.Equal(t, + // metadata + "00"+"000f"+"000000e6"+"000000e6"+"000000e6"+"000000e6"+"000000e6"+"000000e6"+"000000e6"+"00"+"00"+"0000e6"+"000000e6"+"000000e6"+"000000e6"+"000000e6"+"000000e6"+"000000e6"+"000000e6"+ + // tx payload + "00f87180843b9aec2e8307a12094c0c4c8baea3f6acb49b6e1fb9e2adeceeacb000ca28a152d02c7e14af60000008083019ecea0ab07ae99c67aa78e7ba5cf670081e90cc32b219b1de102513d56548a41e86df514a034cbd19feacd73e8ce6400d00c4d1996b9b5243c578fd7f51bfaec288bbaf42a8bf87101843b9aec2e830007a1209401bae6bf68e9a03fb2bc0615b1bf0d69ce9411ed8a152d02c7e14a00f60000008083019ecea0f039985866d8256f10c1be4f7b2cace28d8f20bde2007e2604393eb095b7f77316a05a3e6e81065f2b4604bcec5bd4aba68483599600fc3f879380aac1c09c6eed32f1f87180843b9aec2e8307a12094c0c4c8baea003f6acb49b6e1fb9e2adeceeacb0ca28a152d02c7e14af60000008083019ece00a0ab07ae99c67aa78e7ba5cf6781e90cc32b219b1de102513d56548a41e86d00f514a034cbd19feacd73e8ce64d00c4d1996b9b5243c578fd7f51bfaec288b00baf42a8bf87101843b9aec2e8307a1209401bae6bf68e9a03fb2bc0615b1bf000d69ce9411ed8a152d02c7e14af60000008083019ecea0f039985866d8256f0010c1be4f7b2cace28d8f20bde27e2604393eb095b7f77316a05a3e6e81065f002b4604bcec5bd4aba684835996fc3f879380aac1c09c6eed32f1f87180843b009aec2e8307a12094c0c4c8baea3f6acb49b6e1fb9e2adeceeacb0ca28a152d0002c7e14af60000008083019ecea0ab07ae99c67aa78e7ba5cf6781e90cc32b00219b1de102513d56548a41e86df514a034cbd19feacd73e8ce64d00c4d199600b9b5243c578fd7f51bfaec288bbaf42a8bf87101843b9aec2e8307a120940100bae6bf68e9a03fb2bc0615b1bf0d69ce9411ed8a152d02c7e14af6000000800083019ecea0f039985866d8256f10c1be4f7b2cace28d8f20bde27e2604393e00b095b7f77316a05a3e6e81065f2b4604bcec5bd4aba684835996fc3f87938000aac1c09c6eed32f1f87180843b9aec2e8307a12094c0c4c8baea3f6acb49b600e1fb9e2adeceeacb0ca28a152d02c7e14af60000008083019ecea0ab07ae9900c67aa78e7ba5cf6781e90cc32b219b1de102513d56548a41e86df514a034cb00d19feacd73e8ce64d00c4d1996b9b5243c578fd7f51bfaec288bbaf42a8bf8007101843b9aec2e8307a1209401bae6bf68e9a03fb2bc0615b1bf0d69ce941100ed8a152d02c7e14af60000008083019ecea0f039985866d8256f10c1be4f7b002cace28d8f20bde27e2604393eb095b7f77316a05a3e6e81065f2b4604bcec005bd4aba684835996fc3f879380aac1c09c6eed32f1f87180843b9aec2e830700a12094c0c4c8baea3f6acb49b6e1fb9e2adeceeacb0ca28a152d02c7e14af6000000008083019ecea0ab07ae99c67aa78e7ba5cf6781e90cc32b219b1de10200513d56548a41e86df514a034cbd19feacd73e8ce64d00c4d1996b9b5243c57008fd7f51bfaec288bbaf42a8bf87101843b9aec2e8307a1209401bae6bf68e900a03fb2bc0615b1bf0d69ce9411ed8a152d02c7e14af60000008083019ecea000f039985866d8256f10c1be4f7b2cace28d8f20bde27e2604393eb095b7f7730016a05a3e6e81065f2b4604bcec5bd4aba684835996fc3f879380aac1c09c6e00ed32f1f87180843b9aec2e8307a12094c0c4c8baea3f6acb49b6e1fb9e2ade00ceeacb0ca28a152d02c7e14af60000008083019ecea0ab07ae99c67aa78e7b00a5cf6781e90cc32b219b1de102513d56548a41e86df514a034cbd19feacd7300e8ce64d00c4d1996b9b5243c578fd7f51bfaec288bbaf42a8bf87101843b9a00ec2e8307a1209401bae6bf68e9a03fb2bc0615b1bf0d69ce9411ed8a152d0200c7e14af60000008083019ecea0f039985866d8256f10c1be4f7b2cace28d8f0020bde27e2604393eb095b7f77316a05a3e6e81065f2b4604bcec5bd4aba68400835996fc3f879380aac1c09c6eed32f1f87180843b9aec2e8307a12094c0c400c8baea3f6acb49b6e1fb9e2adeceeacb0ca28a152d02c7e14af6000000808300019ecea0ab07ae99c67aa78e7ba5cf6781e90cc32b219b1de102513d56548a0041e86df514a034cbd19feacd73e8ce64d00c4d1996b9b5243c578fd7f51bfa00ec288bbaf42a8bf87101843b9aec2e8307a1209401bae6bf68e9a03fb2bc060015b1bf0d69ce9411ed8a152d02c7e14af60000008083019ecea0f03998586600d8256f10c1be4f7b2cace28d8f20bde27e2604393eb095b7f77316a05a3e6e0081065f2b4604bcec5bd4aba684835996fc3f879380aac1c09c6eed32f1f8710080843b9aec2e8307a12094c0c4c8baea3f6acb49b6e1fb9e2adeceeacb0ca2008a152d02c7e14af60000008083019ecea0ab07ae99c67aa78e7ba5cf6781e9000cc32b219b1de102513d56548a41e86df514a034cbd19feacd73e8ce64d00c004d1996b9b5243c578fd7f51bfaec288bbaf42a8bf87101843b9aec2e8307a100209401bae6bf68e9a03fb2bc0615b1bf0d69ce9411ed8a152d02c7e14af6000000008083019ecea0f039985866d8256f10c1be4f7b2cace28d8f20bde27e260004393eb095b7f77316a05a3e6e81065f2b4604bcec5bd4aba684835996fc3f00879380aac1c09c6eed32f1f87180843b9aec2e8307a12094c0c4c8baea3f6a00cb49b6e1fb9e2adeceeacb0ca28a152d02c7e14af60000008083019ecea0ab0007ae99c67aa78e7ba5cf6781e90cc32b219b1de102513d56548a41e86df51400a034cbd19feacd73e8ce64d00c4d1996b9b5243c578fd7f51bfaec288bbaf4002a8bf87101843b9aec2e8307a1209401bae6bf68e9a03fb2bc0615b1bf0d6900ce9411ed8a152d02c7e14af60000008083019ecea0f039985866d8256f10c100be4f7b2cace28d8f20bde27e2604393eb095b7f77316a05a3e6e81065f2b460004bcec5bd4aba684835996fc3f879380aac1c09c6eed32f1f87180843b9aec002e8307a12094c0c4c8baea3f6acb49b6e1fb9e2adeceeacb0ca28a152d02c700e14af60000008083019ecea0ab07ae99c67aa78e7ba5cf6781e90cc32b219b001de102513d56548a41e86df514a034cbd19feacd73e8ce64d00c4d1996b9b500243c578fd7f51bfaec288bbaf42a8bf87101843b9aec2e8307a1209401bae600bf68e9a03fb2bc0615b1bf0d69ce9411ed8a152d02c7e14af6000000808301009ecea0f039985866d8256f10c1be4f7b2cace28d8f20bde27e2604393eb09500b7f77316a05a3e6e81065f2b4604bcec5bd4aba684835996fc3f879380aac100c09c6eed32f1f87180843b9aec2e8307a12094c0c4c8baea3f6acb49b6e1fb009e2adeceeacb0ca28a152d02c7e14af60000008083019ecea0ab07ae99c67a00a78e7ba5cf6781e90cc32b219b1de102513d56548a41e86df514a034cbd19f00eacd73e8ce64d00c4d1996b9b5243c578fd7f51bfaec288bbaf42a8bf8710100843b9aec2e8307a1209401bae6bf68e9a03fb2bc0615b1bf0d69ce9411ed8a00152d02c7e14af60000008083019ecea0f039985866d8256f10c1be4f7b2cac00e28d8f20bde27e2604393eb095b7f77316a05a3e6e81065f2b4604bcec5bd400aba684835996fc3f879380aac1c09c6eed32f1f87180843b9aec2e8307a1200094c0c4c8baea3f6acb49b6e1fb9e2adeceeacb0ca28a152d02c7e14af6000000008083019ecea0ab07ae99c67aa78e7ba5cf6781e90cc32b219b1de102513d0056548a41e86df514a034cbd19feacd73e8ce64d00c4d1996b9b5243c578fd700f51bfaec288bbaf42a8bf87101843b9aec2e8307a1209401bae6bf68e9a03f00b2bc0615b1bf0d69ce9411ed8a152d02c7e14af60000008083019ecea0f03900985866d8256f10c1be4f7b2cace28d8f20bde27e2604393eb095b7f77316a0005a3e6e81065f2b4604bcec5bd4aba684835996fc3f879380aac1c09c6eed3200f1f87180843b9aec2e8307a12094c0c4c8baea3f6acb49b6e1fb9e2adeceea00cb0ca28a152d02c7e14af60000008083019ecea0ab07ae99c67aa78e7ba5cf006781e90cc32b219b1de102513d56548a41e86df514a034cbd19feacd73e8ce0064d00c4d1996b9b5243c578fd7f51bfaec288bbaf42a8bf87101843b9aec2e008307a1209401bae6bf68e9a03fb2bc0615b1bf0d69ce9411ed8a152d02c7e1004af60000008083019ecea0f039985866d8256f10c1be4f7b2cace28d8f20bd00e27e2604393eb095b7f77316a05a3e6e81065f2b4604bcec5bd4aba68483590096fc3f879380aac1c09c6eed32f1f87180843b9aec2e8307a12094c0c4c8ba00ea3f6acb49b6e1fb9e2adeceeacb0ca28a152d02c7e14af60000008083019e00cea0ab07ae99c67aa78e7ba5cf6781e90cc32b219b1de102513d56548a41e8006df514a034cbd19feacd73e8ce64d00c4d1996b9b5243c578fd7f51bfaec28008bbaf42a8bf87101843b9aec2e8307a1209401bae6bf68e9a03fb2bc0615b100bf0d69ce9411ed8a152d02c7e14af60000008083019ecea0f039985866d825006f10c1be4f7b2cace28d8f20bde27e2604393eb095b7f77316a05a3e6e8106005f2b4604bcec5bd4aba684835996fc3f879380aac1c09c6eed32f1f8718084003b9aec2e8307a12094c0c4c8baea3f6acb49b6e1fb9e2adeceeacb0ca28a15002d02c7e14af60000008083019ecea0ab07ae99c67aa78e7ba5cf6781e90cc3002b219b1de102513d56548a41e86df514a034cbd19feacd73e8ce64d00c4d190096b9b5243c578fd7f51bfaec288bbaf42a8bf87101843b9aec2e8307a120940001bae6bf68e9a03fb2bc0615b1bf0d69ce9411ed8a152d02c7e14af6000000008083019ecea0f039985866d8256f10c1be4f7b2cace28d8f20bde27e260439003eb095b7f77316a05a3e6e81065f2b4604bcec5bd4aba684835996fc3f87930080aac1c09c6eed32f1", encoded) + assert.Equal(t, "0x01521b20f341588dea5978efb00d7b077a986598a6001fc2e5859d77f3ffc284", batch.BlobVersionedHash.Hex()) + + chunk8 := &encoding.Chunk{Blocks: []*encoding.Block{trace2, trace3, trace4}} + chunk9 := &encoding.Chunk{Blocks: []*encoding.Block{trace5}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk8, chunk9}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + encoded = strings.TrimRight(hex.EncodeToString(batch.blob[:]), "0") + assert.Equal(t, "0000020000173700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f87180843b9aec2e8307a12094c0c4c8baea3f6acb49b6e1fb9e2adeceeacb000ca28a152d02c7e14af60000008083019ecea0ab07ae99c67aa78e7ba5cf670081e90cc32b219b1de102513d56548a41e86df514a034cbd19feacd73e8ce6400d00c4d1996b9b5243c578fd7f51bfaec288bbaf42a8bf87101843b9aec2e830007a1209401bae6bf68e9a03fb2bc0615b1bf0d69ce9411ed8a152d02c7e14a00f60000008083019ecea0f039985866d8256f10c1be4f7b2cace28d8f20bde2007e2604393eb095b7f77316a05a3e6e81065f2b4604bcec5bd4aba68483599600fc3f879380aac1c09c6eed32f102f9162d82cf5502843b9b0a17843b9b0a1700831197e28080b915d260806040523480156200001157600080fd5b5060405100620014b2380380620014b2833981810160405260a0811015620000375760000080fd5b81516020830151604080850180519151939592948301929184640100000000008211156200006357600080fd5b908301906020820185811115620000007957600080fd5b8251640100000000811182820188101715620000945760000080fd5b82525081516020918201929091019080838360005b8381101562000000c3578181015183820152602001620000a9565b50505050905090810190601f00168015620000f15780820380516001836020036101000a03191681526020010091505b5060405260200180516040519392919084640100000000821115620000011557600080fd5b9083019060208201858111156200012b57600080fd5b8200516401000000008111828201881017156200014657600080fd5b8252508151006020918201929091019080838360005b8381101562000175578181015183820001526020016200015b565b50505050905090810190601f168015620001a3570080820380516001836020036101000a031916815260200191505b506040526000209081015185519093508592508491620001c8916003918501906200026b56005b508051620001de9060049060208401906200026b565b50506005805461ff00001960ff1990911660121716905550600680546001600160a01b03808816600001600160a01b031992831617909255600780549287169290911691909117900055620002308162000255565b50506005805462010000600160b01b031916330062010000021790555062000307915050565b6005805460ff191660ff9290920016919091179055565b82805460018160011615610100020316600290049060000052602060002090601f016020900481019282601f10620002ae57805160ff001916838001178555620002de565b82800160010185558215620002de57918200015b82811115620002de578251825591602001919060010190620002c1565b0050620002ec929150620002f0565b5090565b5b80821115620002ec576000810055600101620002f1565b61119b80620003176000396000f3fe60806040523400801561001057600080fd5b506004361061010b5760003560e01c80635c975a00bb116100a257806395d89b411161007157806395d89b41146103015780639d00c29fac14610309578063a457c2d714610335578063a9059cbb1461036157800063dd62ed3e1461038d5761010b565b80635c975abb1461029d57806370a0820031146102a55780638456cb59146102cb5780638e50817a146102d35761010b00565b8063313ce567116100de578063313ce5671461021d57806339509351140061023b5780633f4ba83a1461026757806340c10f19146102715761010b565b00806306fdde0314610110578063095ea7b31461018d57806318160ddd14610100cd57806323b872dd146101e7575b600080fd5b6101186103bb565b604080510060208082528351818301528351919283929083019185019080838360005b830081101561015257818101518382015260200161013a565b5050505090509081000190601f16801561017f5780820380516001836020036101000a03191681520060200191505b509250505060405180910390f35b6101b960048036036040810010156101a357600080fd5b506001600160a01b03813516906020013561045100565b604080519115158252519081900360200190f35b6101d561046e565b6000408051918252519081900360200190f35b6101b960048036036060811015610001fd57600080fd5b506001600160a01b0381358116916020810135909116900060400135610474565b6102256104fb565b6040805160ff909216825251908100900360200190f35b6101b96004803603604081101561025157600080fd5b50006001600160a01b038135169060200135610504565b61026f610552565b005b0061026f6004803603604081101561028757600080fd5b506001600160a01b030081351690602001356105a9565b6101b9610654565b6101d560048036036020008110156102bb57600080fd5b50356001600160a01b0316610662565b61026f0061067d565b61026f600480360360408110156102e957600080fd5b50600160000160a01b03813581169160200135166106d2565b610118610757565b61026f006004803603604081101561031f57600080fd5b506001600160a01b038135160090602001356107b8565b6101b96004803603604081101561034b57600080fd005b506001600160a01b03813516906020013561085f565b6101b9600480360300604081101561037757600080fd5b506001600160a01b038135169060200135006108c7565b6101d5600480360360408110156103a357600080fd5b50600160000160a01b03813581169160200135166108db565b6003805460408051602060001f6002600019610100600188161502019095169490940493840181900481020082018101909252828152606093909290918301828280156104475780601f100061041c57610100808354040283529160200191610447565b82019190600052006020600020905b81548152906001019060200180831161042a57829003601f00168201915b5050505050905090565b600061046561045e610906565b84846100090a565b50600192915050565b60025490565b60006104818484846109f656005b6104f18461048d610906565b6104ec8560405180606001604052806028810052602001611085602891396001600160a01b038a16600090815260016020520060408120906104cb610906565b6001600160a01b03168152602081019190910052604001600020549190610b51565b61090a565b5060019392505050565b6000055460ff1690565b6000610465610511610906565b846104ec856001600061000522610906565b6001600160a01b0390811682526020808301939093526040009182016000908120918c168152925290205490610be8565b600754600160010060a01b0316331461059f576040805162461bcd60e51b81526020600482015200600b60248201526a1b9bdd08185b1b1bddd95960aa1b60448201529051908100900360640190fd5b6105a7610c49565b565b600554610100900460ff1615610005f9576040805162461bcd60e51b815260206004820152601060248201526f0014185d5cd8589b194e881c185d5cd95960821b60448201529051908190036000640190fd5b6006546001600160a01b03163314610646576040805162461bcd0060e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd9590060aa1b604482015290519081900360640190fd5b6106508282610ced565b500050565b600554610100900460ff1690565b6001600160a01b03166000908152006020819052604090205490565b6007546001600160a01b031633146106ca57006040805162461bcd60e51b815260206004820152600b60248201526a1b9bdd0008185b1b1bddd95960aa1b604482015290519081900360640190fd5b6105a700610ddd565b6005546201000090046001600160a01b0316331461072657604000805162461bcd60e51b815260206004820152600c60248201526b6f6e6c792000466163746f727960a01b604482015290519081900360640190fd5b60078054006001600160a01b039283166001600160a01b0319918216179091556006805400939092169216919091179055565b60048054604080516020601f600260001900610100600188161502019095169490940493840181900481028201810190920052828152606093909290918301828280156104475780601f1061041c5761010000808354040283529160200191610447565b600554610100900460ff161561000808576040805162461bcd60e51b815260206004820152601060248201526f0014185d5cd8589b194e881c185d5cd95960821b60448201529051908190036000640190fd5b6006546001600160a01b03163314610855576040805162461bcd0060e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd9590060aa1b604482015290519081900360640190fd5b6106508282610e65565b60000061046561086c610906565b846104ec85604051806060016040528060258100526020016111176025913960016000610896610906565b6001600160a01b0300908116825260208083019390935260409182016000908120918d1681529252009020549190610b51565b60006104656108d4610906565b84846109f6565b600001600160a01b0391821660009081526001602090815260408083209390941600825291909152205490565b3390565b6001600160a01b03831661094f576040005162461bcd60e51b8152600401808060200182810382526024815260200180006110f36024913960400191505060405180910390fd5b6001600160a01b038200166109945760405162461bcd60e51b81526004018080602001828103825260002281526020018061103d6022913960400191505060405180910390fd5b600100600160a01b0380841660008181526001602090815260408083209487168084005294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f7142007d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a350500050565b6001600160a01b038316610a3b5760405162461bcd60e51b8152600400018080602001828103825260258152602001806110ce602591396040019150005060405180910390fd5b6001600160a01b038216610a805760405162461bcd0060e51b8152600401808060200182810382526023815260200180610ff8602300913960400191505060405180910390fd5b610a8b838383610f61565b610ac8008160405180606001604052806026815260200161105f60269139600160016000a01b0386166000908152602081905260409020549190610b51565b600160010060a01b03808516600090815260208190526040808220939093559084168152002054610af79082610be8565b6001600160a01b03808416600081815260208100815260409182902094909455805185815290519193928716927fddf252ad1b00e2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9291829000030190a3505050565b60008184841115610be05760405162461bcd60e51b810052600401808060200182810382528381815181526020019150805190602001009080838360005b83811015610ba5578181015183820152602001610b8d565b0050505050905090810190601f168015610bd2578082038051600183602003610001000a031916815260200191505b509250505060405180910390fd5b50505000900390565b600082820183811015610c42576040805162461bcd60e51b81520060206004820152601b60248201527f536166654d6174683a20616464697469006f6e206f766572666c6f77000000000060448201529051908190036064019000fd5b9392505050565b600554610100900460ff16610c9c576040805162461b00cd60e51b815260206004820152601460248201527314185d5cd8589b194e88001b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b600005805461ff00191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a500e8aa4e537bd38aeae4b073aa610cd0610906565b604080516001600160a01b00039092168252519081900360200190a1565b6001600160a01b038216610d4800576040805162461bcd60e51b815260206004820152601f60248201527f4552004332303a206d696e7420746f20746865207a65726f20616464726573730060004482015290519081900360640190fd5b610d5460008383610f61565b60025400610d619082610be8565b6002556001600160a01b03821660009081526020810090526040902054610d879082610be8565b6001600160a01b038316600081810052602081815260408083209490945583518581529351929391927fddf252ad001be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef928190000390910190a35050565b600554610100900460ff1615610e2d57604080516200461bcd60e51b815260206004820152601060248201526f14185d5cd8589b19004e881c185d5cd95960821b604482015290519081900360640190fd5b600580005461ff0019166101001790557f62e78cea01bee320cd4e420270b5ea74000d0011b0c9f74754ebdbfc544b05a258610cd0610906565b6001600160a01b03820016610eaa5760405162461bcd60e51b8152600401808060200182810382526000218152602001806110ad6021913960400191505060405180910390fd5b610e00b682600083610f61565b610ef3816040518060600160405280602281526020000161101b602291396001600160a01b038516600090815260208190526040900020549190610b51565b6001600160a01b03831660009081526020819052604000902055600254610f199082610fb5565b600255604080518281529051600091006001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba700f163c4a11628f55a4df523b3ef9181900360200190a35050565b610f6c83830083610fb0565b610f74610654565b15610fb05760405162461bcd60e51b81520060040180806020018281038252602a81526020018061113c602a91396040010091505060405180910390fd5b505050565b6000610c428383604051806040010060405280601e81526020017f536166654d6174683a20737562747261637469006f6e206f766572666c6f770000815250610b5156fe45524332303a20747261006e7366657220746f20746865207a65726f206164647265737345524332303a00206275726e20616d6f756e7420657863656564732062616c616e63654552430032303a20617070726f766520746f20746865207a65726f20616464726573730045524332303a207472616e7366657220616d6f756e742065786365656473200062616c616e636545524332303a207472616e7366657220616d6f756e7420650078636565647320616c6c6f77616e636545524332303a206275726e2066726f006d20746865207a65726f206164647265737345524332303a207472616e73660065722066726f6d20746865207a65726f206164647265737345524332303a2000617070726f76652066726f6d20746865207a65726f20616464726573734552004332303a2064656372656173656420616c6c6f77616e63652062656c6f7720007a65726f45524332305061757361626c653a20746f6b656e207472616e7366006572207768696c6520706175736564a2646970667358221220e96342bec8f600c2bf72815a39998973b64c3bed57770f402e9a7b7eeda0265d4c64736f6c63004300060c00330000000000000000000000001c5a77d9fa7ef466951b2f01f70024bca3a5820b630000000000000000000000001c5a77d9fa7ef466951b2f0100f724bca3a5820b630000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000095745544820636f696e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004574554480000000000000000000000000000000000000000000000000000000000c001a0235c1a8d40e8c347890397f1a9002e6eadbd6422cf7c210e3e1737f0553c633172a02f7c0384ddd06970446e7400229cd96216da62196dc62395bda52095d44b8a9af7df0b80825dc0941a258d0017bf244c4df02d40343a7626a9d321e105808080808", encoded) + assert.Equal(t, "0x01b63f87bdd2caa8d43500d47ee59204f61af95339483c62ff436c6beabf47bf", batch.BlobVersionedHash.Hex()) +} + +func TestCodecV1BatchChallenge(t *testing.T) { + trace2 := readBlockFromJSON(t, "../../../testdata/blockTrace_02.json") + chunk2 := &encoding.Chunk{Blocks: []*encoding.Block{trace2}} + originalBatch := &encoding.Batch{Chunks: []*encoding.Chunk{chunk2}} + batch, err := NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "06138a688f328d13cb9caf0e2046d65bbcf766eab00196fb05e43806c7b26b36", hex.EncodeToString(batch.z[:])) + + trace3 := readBlockFromJSON(t, "../../../testdata/blockTrace_03.json") + chunk3 := &encoding.Chunk{Blocks: []*encoding.Block{trace3}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk3}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "1e3f41f46941b3d30bbc482942026b09224636ed63a160738d7ae57a00c99294", hex.EncodeToString(batch.z[:])) + + trace4 := readBlockFromJSON(t, "../../../testdata/blockTrace_04.json") + chunk4 := &encoding.Chunk{Blocks: []*encoding.Block{trace4}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk4}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "37c3ab6ad48e99fc0ce8e9de5f9b2c9be832699b293e4243b85d4e42bad0db7a", hex.EncodeToString(batch.z[:])) + + trace5 := readBlockFromJSON(t, "../../../testdata/blockTrace_05.json") + chunk5 := &encoding.Chunk{Blocks: []*encoding.Block{trace5}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk5}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "1fa77f72d924ed6efdc399cf7a3de45fd3b50538d368d80d94840d30fdb606ec", hex.EncodeToString(batch.z[:])) + + trace6 := readBlockFromJSON(t, "../../../testdata/blockTrace_06.json") + chunk6 := &encoding.Chunk{Blocks: []*encoding.Block{trace6}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk6}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "1fa77f72d924ed6efdc399cf7a3de45fd3b50538d368d80d94840d30fdb606ec", hex.EncodeToString(batch.z[:])) + + trace7 := readBlockFromJSON(t, "../../../testdata/blockTrace_07.json") + chunk7 := &encoding.Chunk{Blocks: []*encoding.Block{trace7}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk7}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "1fa77f72d924ed6efdc399cf7a3de45fd3b50538d368d80d94840d30fdb606ec", hex.EncodeToString(batch.z[:])) + + // 15 chunks + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk2, chunk2, chunk2, chunk2, chunk2, chunk2, chunk2, chunk2, chunk2, chunk2, chunk2, chunk2, chunk2, chunk2, chunk2}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "0244c987922db21694e8eb0184c4a5e6f3785fb688224822f1f826874ed5aae2", hex.EncodeToString(batch.z[:])) + + chunk8 := &encoding.Chunk{Blocks: []*encoding.Block{trace2, trace3, trace4}} + chunk9 := &encoding.Chunk{Blocks: []*encoding.Block{trace5}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk8, chunk9}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "03523cd88a7227826e093305cbe4ce237e8df38e2157566fb3742cc39dbc9c43", hex.EncodeToString(batch.z[:])) +} + +func repeat(element byte, count int) string { + result := make([]byte, 0, count) + for i := 0; i < count; i++ { + result = append(result, element) + } + return "0x" + common.Bytes2Hex(result) +} + +func TestCodecV1BatchChallengeWithStandardTestCases(t *testing.T) { + nRowsData := 126914 + + for _, tc := range []struct { + chunks [][]string + expectedz string + expectedy string + }{ + // single empty chunk + {chunks: [][]string{{}}, expectedz: "1fa77f72d924ed6efdc399cf7a3de45fd3b50538d368d80d94840d30fdb606ec", expectedy: "28bda8f1836f60a3879f4253c4f51b3e41a905449b60a83a594f9f2487e8df51"}, + // single non-empty chunk + {chunks: [][]string{{"0x010203"}}, expectedz: "30a9d6cfc2b87fb00d80e7fea28ebb9eff0bd526dbf1da32acfe8c5fd49632ff", expectedy: "723515444cb320fe437b9cea3b51293f5fbcb5913739ad35eab28b1863f7c312"}, + // multiple empty chunks + {chunks: [][]string{{}, {}}, expectedz: "17772348f946a4e4adfcaf5c1690d078933b6b090ca9a52fab6c7e545b1007ae", expectedy: "05ba9abbc81a1c97f4cdaa683a7e0c731d9dfd88feef8f7b2fcfd79e593662b5"}, + // multiple non-empty chunks + {chunks: [][]string{{"0x010203"}, {"0x070809"}}, expectedz: "60376321eea0886c29bd97d95851c7b5fbdb064c8adfdadd7678617b32b3ebf2", expectedy: "50cfbcece01cadb4eade40649e17b140b31f96088097e38f020e31dfe6551604"}, + // empty chunk followed by non-empty chunk + {chunks: [][]string{{}, {"0x010203"}}, expectedz: "054539f03564eda9462d582703cde0788e4e27c311582ddfb19835358273a7ca", expectedy: "1fba03580b5908c4c66b48e79c10e7a34e4b27ed37a1a049b3e17e017cad5245"}, + // non-empty chunk followed by empty chunk + {chunks: [][]string{{"0x070809"}, {}}, expectedz: "0b82dceaa6ca4b5d704590c921accfd991b56b5ad0212e6a4e63e54915a2053b", expectedy: "2362f3a0c87f0ea11eb898ed608c7f09a42926a058d4c5d111a0f54cad10ebbd"}, + // max number of chunks all empty + {chunks: [][]string{{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}}, expectedz: "174cd3ba9b2ae8ab789ec0b5b8e0b27ee122256ec1756c383dbf2b5b96903f1b", expectedy: "225cab9658904181671eb7abc342ffc36a6836048b64a67f0fb758439da2567b"}, + // max number of chunks all non-empty + {chunks: [][]string{{"0x0a"}, {"0x0a0b"}, {"0x0a0b0c"}, {"0x0a0b0c0d"}, {"0x0a0b0c0d0e"}, {"0x0a0b0c0d0e0f"}, {"0x0a0b0c0d0e0f10"}, {"0x0a0b0c0d0e0f1011"}, {"0x0a0b0c0d0e0f101112"}, {"0x0a0b0c0d0e0f10111213"}, {"0x0a0b0c0d0e0f1011121314"}, {"0x0a0b0c0d0e0f101112131415"}, {"0x0a0b0c0d0e0f10111213141516"}, {"0x0a0b0c0d0e0f1011121314151617"}, {"0x0a0b0c0d0e0f101112131415161718"}}, expectedz: "1e93e961cdfb4bd26a5be48f23af4f1aa8c6bebe57a089d3250f8afb1e988bf8", expectedy: "24ed4791a70b28a6bad21c22d58f82a5ea5f9f9d2bcfc07428b494e9ae93de6e"}, + // single chunk blob full + {chunks: [][]string{{repeat(123, nRowsData)}}, expectedz: "61405cb0b114dfb4d611be84bedba0fcd2e55615e193e424f1cc7b1af0df3d31", expectedy: "58609bbca10e50489b630ecb5b9347378579ed784d6a10749fd505055d35c3c0"}, + // multiple chunks blob full + {chunks: [][]string{{repeat(123, 1111)}, {repeat(231, nRowsData-1111)}}, expectedz: "22533c3ea99536b4b83a89835aa91e6f0d2fc3866c201e18d7ca4b3af92fad61", expectedy: "40d4b71492e1a06ee3c273ef9003c7cb05aed021208871e13fa33302fa0f4dcc"}, + // max number of chunks only last one non-empty not full blob + {chunks: [][]string{{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {repeat(132, nRowsData-1111)}}, expectedz: "0e6525c0dd261e8f62342b1139062bb23bc2b8b460163364598fb29e82a4eed5", expectedy: "1db984d6deb5e84bc67d0755aa2da8fe687233147603b4ecba94d0c8463c3836"}, + // max number of chunks only last one non-empty full blob + {chunks: [][]string{{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {repeat(132, nRowsData)}}, expectedz: "3a638eac98f22f817b84e3d81ccaa3de080f83dc80a5823a3f19320ef3cb6fc8", expectedy: "73ab100278822144e2ed8c9d986e92f7a2662fd18a51bdf96ec55848578b227a"}, + // max number of chunks but last is empty + {chunks: [][]string{{repeat(111, 100)}, {repeat(111, 100)}, {repeat(111, 100)}, {repeat(111, 100)}, {repeat(111, 100)}, {repeat(111, 100)}, {repeat(111, 100)}, {repeat(111, 100)}, {repeat(111, 100)}, {repeat(111, 100)}, {repeat(111, 100)}, {repeat(111, 100)}, {repeat(111, 100)}, {repeat(111, 100)}, {}}, expectedz: "02ef442d99f450559647a7823f1be0e148c75481cc5c703c02a116e8ac531fa8", expectedy: "31743538cfc3ac43d1378a5c497ebc9462c20b4cb4470e0e7a9f7342ea948333"}, + } { + chunks := []*encoding.Chunk{} + + for _, c := range tc.chunks { + block := &encoding.Block{Transactions: []*types.TransactionData{}} + + for _, data := range c { + tx := &types.TransactionData{Type: 0xff, Data: data} + block.Transactions = append(block.Transactions, tx) + } + + chunk := &encoding.Chunk{Blocks: []*encoding.Block{block}} + chunks = append(chunks, chunk) + } + + b, z, err := constructBlobPayload(chunks) + assert.NoError(t, err) + actualZ := hex.EncodeToString(z[:]) + assert.Equal(t, tc.expectedz, actualZ) + + _, y, err := kzg4844.ComputeProof(*b, *z) + assert.NoError(t, err) + actualY := hex.EncodeToString(y[:]) + assert.Equal(t, tc.expectedy, actualY) + + } +} + +func TestCodecV1BatchBlobDataProof(t *testing.T) { + trace2 := readBlockFromJSON(t, "../../../testdata/blockTrace_02.json") + chunk2 := &encoding.Chunk{Blocks: []*encoding.Block{trace2}} + originalBatch := &encoding.Batch{Chunks: []*encoding.Chunk{chunk2}} + batch, err := NewDABatch(originalBatch) + assert.NoError(t, err) + verifyData, err := batch.BlobDataProof() + assert.NoError(t, err) + assert.Equal(t, "06138a688f328d13cb9caf0e2046d65bbcf766eab00196fb05e43806c7b26b363d27683f7aab53cf071e2c8c8f3abfe750d206c048489450d120679cdc823f7db44a38af1f9a6c70cd3ccfbf71968f447aa566bbafb0bbc566fc9eeb42973484802635a1bbd8305d34a46693331bf607a30dad96431f70551dd950c1426131d73ccea6d050d38dea123aad90aa8c0b734c98e8e04bd8ea8f19b415f2d85156d8", hex.EncodeToString(verifyData)) + + trace3 := readBlockFromJSON(t, "../../../testdata/blockTrace_03.json") + chunk3 := &encoding.Chunk{Blocks: []*encoding.Block{trace3}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk3}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + verifyData, err = batch.BlobDataProof() + assert.NoError(t, err) + assert.Equal(t, "1e3f41f46941b3d30bbc482942026b09224636ed63a160738d7ae57a00c992946dc7e51a42a31f429bc1f321dcf020b9a661225259522dba186fcfe5dc012191b8aab265dc352e352807a298f7bb99d432c7cd543e63158cbdb8fbf99f3182a71af35ccbed2693c5e0bc5be38d565e86a0b3c76e33edb24eb07faeaa5d3f2b15a55df6ab99abf828b5803f5681dc634602eb7469ee0556563b2eccebf16ec822", hex.EncodeToString(verifyData)) + + trace4 := readBlockFromJSON(t, "../../../testdata/blockTrace_04.json") + chunk4 := &encoding.Chunk{Blocks: []*encoding.Block{trace4}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk4}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + verifyData, err = batch.BlobDataProof() + assert.NoError(t, err) + assert.Equal(t, "37c3ab6ad48e99fc0ce8e9de5f9b2c9be832699b293e4243b85d4e42bad0db7a24164e6ea8b7946ce5e40d2baa4f6aa0d030076f6074295288133c00e75dafa2afd4e1c55a17dbdf8390b5736158afe238d82f8b696669ba47015fcdfd4d1becd0ff7a47f8f379a4ac8d1741e2d676248f5ca4a9f0d9b7fa48f5f649dc84e928161fd99ad1bd9a9879b05d29c5f718bfb3b0a696a5f3ed50b5b8c6a9d530b3ee", hex.EncodeToString(verifyData)) + + trace5 := readBlockFromJSON(t, "../../../testdata/blockTrace_05.json") + chunk5 := &encoding.Chunk{Blocks: []*encoding.Block{trace5}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk5}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + verifyData, err = batch.BlobDataProof() + assert.NoError(t, err) + assert.Equal(t, "1fa77f72d924ed6efdc399cf7a3de45fd3b50538d368d80d94840d30fdb606ec28bda8f1836f60a3879f4253c4f51b3e41a905449b60a83a594f9f2487e8df518f26f349339c68b33ce856aa2c05b8f89e7c23db0c00817550679998efcbd8f2464f9e1ea6c3172b0b750603d1e4ea389598d958507378f8212199c51c059f8c419fd809dcc7de5750f76220c9c54cd57ad18cb3c38c127559a133df250f66b7", hex.EncodeToString(verifyData)) + + trace6 := readBlockFromJSON(t, "../../../testdata/blockTrace_06.json") + chunk6 := &encoding.Chunk{Blocks: []*encoding.Block{trace6}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk6}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + verifyData, err = batch.BlobDataProof() + assert.NoError(t, err) + assert.Equal(t, "1fa77f72d924ed6efdc399cf7a3de45fd3b50538d368d80d94840d30fdb606ec28bda8f1836f60a3879f4253c4f51b3e41a905449b60a83a594f9f2487e8df518f26f349339c68b33ce856aa2c05b8f89e7c23db0c00817550679998efcbd8f2464f9e1ea6c3172b0b750603d1e4ea389598d958507378f8212199c51c059f8c419fd809dcc7de5750f76220c9c54cd57ad18cb3c38c127559a133df250f66b7", hex.EncodeToString(verifyData)) + + trace7 := readBlockFromJSON(t, "../../../testdata/blockTrace_07.json") + chunk7 := &encoding.Chunk{Blocks: []*encoding.Block{trace7}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk7}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + verifyData, err = batch.BlobDataProof() + assert.NoError(t, err) + assert.Equal(t, "1fa77f72d924ed6efdc399cf7a3de45fd3b50538d368d80d94840d30fdb606ec28bda8f1836f60a3879f4253c4f51b3e41a905449b60a83a594f9f2487e8df518f26f349339c68b33ce856aa2c05b8f89e7c23db0c00817550679998efcbd8f2464f9e1ea6c3172b0b750603d1e4ea389598d958507378f8212199c51c059f8c419fd809dcc7de5750f76220c9c54cd57ad18cb3c38c127559a133df250f66b7", hex.EncodeToString(verifyData)) + + // 15 chunks + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk2, chunk2, chunk2, chunk2, chunk2, chunk2, chunk2, chunk2, chunk2, chunk2, chunk2, chunk2, chunk2, chunk2, chunk2}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + verifyData, err = batch.BlobDataProof() + assert.NoError(t, err) + assert.Equal(t, "0244c987922db21694e8eb0184c4a5e6f3785fb688224822f1f826874ed5aae2613ca15d051a539e3b239027f9bdbd03bd3c66c98afafb674e2a7441912cbe099743324c70e20042de6480f115b215fbba3472a8b994303a99576c1244aa4aec22fdfe6c74ec728aa28a9eb3812bc93291fbc65cfa558e4df12bcde442483d31072000c56f94fe012285bc5832eaee5fe1d47f1e8655539c4500f66207d8edc6", hex.EncodeToString(verifyData)) + + chunk8 := &encoding.Chunk{Blocks: []*encoding.Block{trace2, trace3, trace4}} + chunk9 := &encoding.Chunk{Blocks: []*encoding.Block{trace5}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk8, chunk9}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + verifyData, err = batch.BlobDataProof() + assert.NoError(t, err) + assert.Equal(t, "03523cd88a7227826e093305cbe4ce237e8df38e2157566fb3742cc39dbc9c4330b3863672052b3d6c6552d121b0b13f97659f49bbfb6d7fed6e4b7076e4a43383bee97f95fbf2d789a8e0fb365c26e141d6a31e43403b4a469d1723128f6d5de5c54e913e143feede32d0af9b6fd6fdae9cb71d402cfe8bc4d659f228c41f0b9d195c5074278a2346204cfaa336f5de2244a3d53e0effa2f49c81924720e84e", hex.EncodeToString(verifyData)) +} + +func TestCodecV1BatchSkipBitmap(t *testing.T) { + trace2 := readBlockFromJSON(t, "../../../testdata/blockTrace_02.json") + chunk2 := &encoding.Chunk{Blocks: []*encoding.Block{trace2}} + originalBatch := &encoding.Batch{Chunks: []*encoding.Chunk{chunk2}} + batch, err := NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "", hex.EncodeToString(batch.SkippedL1MessageBitmap)) + assert.Equal(t, 0, int(batch.L1MessagePopped)) + assert.Equal(t, 0, int(batch.TotalL1MessagePopped)) + + trace3 := readBlockFromJSON(t, "../../../testdata/blockTrace_03.json") + chunk3 := &encoding.Chunk{Blocks: []*encoding.Block{trace3}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk3}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "", hex.EncodeToString(batch.SkippedL1MessageBitmap)) + assert.Equal(t, 0, int(batch.L1MessagePopped)) + assert.Equal(t, 0, int(batch.TotalL1MessagePopped)) + + trace4 := readBlockFromJSON(t, "../../../testdata/blockTrace_04.json") + chunk4 := &encoding.Chunk{Blocks: []*encoding.Block{trace4}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk4}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "00000000000000000000000000000000000000000000000000000000000003ff", hex.EncodeToString(batch.SkippedL1MessageBitmap)) + assert.Equal(t, 11, int(batch.L1MessagePopped)) // skip 10, include 1 + assert.Equal(t, 11, int(batch.TotalL1MessagePopped)) + + trace5 := readBlockFromJSON(t, "../../../testdata/blockTrace_05.json") + chunk5 := &encoding.Chunk{Blocks: []*encoding.Block{trace5}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk5}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "0000000000000000000000000000000000000000000000000000001fffffffff", hex.EncodeToString(batch.SkippedL1MessageBitmap)) + assert.Equal(t, 42, int(batch.L1MessagePopped)) // skip 37, include 5 + assert.Equal(t, 42, int(batch.TotalL1MessagePopped)) + + originalBatch.TotalL1MessagePoppedBefore = 37 + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "0000000000000000000000000000000000000000000000000000000000000000", hex.EncodeToString(batch.SkippedL1MessageBitmap)) + assert.Equal(t, 5, int(batch.L1MessagePopped)) // skip 37, include 5 + assert.Equal(t, 42, int(batch.TotalL1MessagePopped)) + + trace6 := readBlockFromJSON(t, "../../../testdata/blockTrace_06.json") + chunk6 := &encoding.Chunk{Blocks: []*encoding.Block{trace6}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk6}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "00000000000000000000000000000000000000000000000000000000000001dd", hex.EncodeToString(batch.SkippedL1MessageBitmap)) + assert.Equal(t, 10, int(batch.L1MessagePopped)) // skip 7, include 3 + assert.Equal(t, 10, int(batch.TotalL1MessagePopped)) + + trace7 := readBlockFromJSON(t, "../../../testdata/blockTrace_07.json") + chunk7 := &encoding.Chunk{Blocks: []*encoding.Block{trace7}} + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk7}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd0000000000000000000000000000000000000000000000000000000000000000", hex.EncodeToString(batch.SkippedL1MessageBitmap)) + assert.Equal(t, 257, int(batch.L1MessagePopped)) // skip 255, include 2 + assert.Equal(t, 257, int(batch.TotalL1MessagePopped)) + + originalBatch.TotalL1MessagePoppedBefore = 1 + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe", hex.EncodeToString(batch.SkippedL1MessageBitmap)) + assert.Equal(t, 256, int(batch.L1MessagePopped)) // skip 254, include 2 + assert.Equal(t, 257, int(batch.TotalL1MessagePopped)) + + chunk8 := &encoding.Chunk{Blocks: []*encoding.Block{trace2, trace3, trace4}} // queue index 10 + chunk9 := &encoding.Chunk{Blocks: []*encoding.Block{trace5}} // queue index 37-41 + originalBatch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk8, chunk9}} + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "0000000000000000000000000000000000000000000000000000001ffffffbff", hex.EncodeToString(batch.SkippedL1MessageBitmap)) + assert.Equal(t, 42, int(batch.L1MessagePopped)) + assert.Equal(t, 42, int(batch.TotalL1MessagePopped)) + + originalBatch.TotalL1MessagePoppedBefore = 10 + batch, err = NewDABatch(originalBatch) + assert.NoError(t, err) + assert.Equal(t, "0000000000000000000000000000000000000000000000000000000007fffffe", hex.EncodeToString(batch.SkippedL1MessageBitmap)) + assert.Equal(t, 32, int(batch.L1MessagePopped)) + assert.Equal(t, 42, int(batch.TotalL1MessagePopped)) +} + +func TestCodecV1ChunkAndBatchBlobSizeEstimation(t *testing.T) { + trace2 := readBlockFromJSON(t, "../../../testdata/blockTrace_02.json") + chunk2 := &encoding.Chunk{Blocks: []*encoding.Block{trace2}} + chunk2BlobSize, err := EstimateChunkL1CommitBlobSize(chunk2) + assert.NoError(t, err) + assert.Equal(t, uint64(320), chunk2BlobSize) + batch2 := &encoding.Batch{Chunks: []*encoding.Chunk{chunk2}} + batch2BlobSize, err := EstimateBatchL1CommitBlobSize(batch2) + assert.NoError(t, err) + assert.Equal(t, uint64(320), batch2BlobSize) + + trace3 := readBlockFromJSON(t, "../../../testdata/blockTrace_03.json") + chunk3 := &encoding.Chunk{Blocks: []*encoding.Block{trace3}} + chunk3BlobSize, err := EstimateChunkL1CommitBlobSize(chunk3) + assert.NoError(t, err) + assert.Equal(t, uint64(5952), chunk3BlobSize) + batch3 := &encoding.Batch{Chunks: []*encoding.Chunk{chunk3}} + batch3BlobSize, err := EstimateBatchL1CommitBlobSize(batch3) + assert.NoError(t, err) + assert.Equal(t, uint64(5952), batch3BlobSize) + + trace4 := readBlockFromJSON(t, "../../../testdata/blockTrace_04.json") + chunk4 := &encoding.Chunk{Blocks: []*encoding.Block{trace4}} + chunk4BlobSize, err := EstimateChunkL1CommitBlobSize(chunk4) + assert.NoError(t, err) + assert.Equal(t, uint64(128), chunk4BlobSize) + batch4 := &encoding.Batch{Chunks: []*encoding.Chunk{chunk4}} + batch4BlobSize, err := EstimateBatchL1CommitBlobSize(batch4) + assert.NoError(t, err) + assert.Equal(t, uint64(128), batch4BlobSize) + + chunk5 := &encoding.Chunk{Blocks: []*encoding.Block{trace2, trace3}} + chunk5BlobSize, err := EstimateChunkL1CommitBlobSize(chunk5) + assert.NoError(t, err) + assert.Equal(t, uint64(6176), chunk5BlobSize) + chunk6 := &encoding.Chunk{Blocks: []*encoding.Block{trace4}} + chunk6BlobSize, err := EstimateChunkL1CommitBlobSize(chunk6) + assert.NoError(t, err) + assert.Equal(t, uint64(128), chunk6BlobSize) + batch5 := &encoding.Batch{Chunks: []*encoding.Chunk{chunk5, chunk6}} + batch5BlobSize, err := EstimateBatchL1CommitBlobSize(batch5) + assert.NoError(t, err) + assert.Equal(t, uint64(6208), batch5BlobSize) +} + +func readBlockFromJSON(t *testing.T, filename string) *encoding.Block { + data, err := os.ReadFile(filename) + assert.NoError(t, err) + + block := &encoding.Block{} + assert.NoError(t, json.Unmarshal(data, block)) + return block +} diff --git a/common/types/encoding/da.go b/common/types/encoding/da.go new file mode 100644 index 000000000..d202492fc --- /dev/null +++ b/common/types/encoding/da.go @@ -0,0 +1,237 @@ +package encoding + +import ( + "fmt" + + "github.com/scroll-tech/go-ethereum/common" + "github.com/scroll-tech/go-ethereum/common/hexutil" + "github.com/scroll-tech/go-ethereum/core/types" + "github.com/scroll-tech/go-ethereum/log" +) + +// CodecVersion defines the version of encoder and decoder. +type CodecVersion int + +const ( + // CodecV0 represents the version 0 of the encoder and decoder. + CodecV0 CodecVersion = iota + + // CodecV1 represents the version 1 of the encoder and decoder. + CodecV1 + + // txTypeTest is a special transaction type used in unit tests. + txTypeTest = 0xff +) + +func init() { + // make sure txTypeTest will not interfere with other transaction types + if txTypeTest == types.LegacyTxType || txTypeTest == types.AccessListTxType || txTypeTest == types.DynamicFeeTxType || txTypeTest == types.BlobTxType || txTypeTest == types.L1MessageTxType { + log.Crit("txTypeTest is overlapping with existing transaction types") + } +} + +// Block represents an L2 block. +type Block struct { + Header *types.Header + Transactions []*types.TransactionData + WithdrawRoot common.Hash `json:"withdraw_trie_root,omitempty"` + RowConsumption *types.RowConsumption `json:"row_consumption,omitempty"` +} + +// Chunk represents a group of blocks. +type Chunk struct { + Blocks []*Block `json:"blocks"` +} + +// Batch represents a batch of chunks. +type Batch struct { + Index uint64 + TotalL1MessagePoppedBefore uint64 + ParentBatchHash common.Hash + Chunks []*Chunk +} + +// NumL1Messages returns the number of L1 messages in this block. +// This number is the sum of included and skipped L1 messages. +func (b *Block) NumL1Messages(totalL1MessagePoppedBefore uint64) uint64 { + var lastQueueIndex *uint64 + for _, txData := range b.Transactions { + if txData.Type == types.L1MessageTxType { + lastQueueIndex = &txData.Nonce + } + } + if lastQueueIndex == nil { + return 0 + } + // note: last queue index included before this block is totalL1MessagePoppedBefore - 1 + // TODO: cache results + return *lastQueueIndex - totalL1MessagePoppedBefore + 1 +} + +// NumL2Transactions returns the number of L2 transactions in this block. +func (b *Block) NumL2Transactions() uint64 { + var count uint64 + for _, txData := range b.Transactions { + if txData.Type != types.L1MessageTxType { + count++ + } + } + return count +} + +// NumL1Messages returns the number of L1 messages in this chunk. +// This number is the sum of included and skipped L1 messages. +func (c *Chunk) NumL1Messages(totalL1MessagePoppedBefore uint64) uint64 { + var numL1Messages uint64 + for _, block := range c.Blocks { + numL1MessagesInBlock := block.NumL1Messages(totalL1MessagePoppedBefore) + numL1Messages += numL1MessagesInBlock + totalL1MessagePoppedBefore += numL1MessagesInBlock + } + // TODO: cache results + return numL1Messages +} + +// ConvertTxDataToRLPEncoding transforms []*TransactionData into []*types.Transaction. +func ConvertTxDataToRLPEncoding(txData *types.TransactionData) ([]byte, error) { + data, err := hexutil.Decode(txData.Data) + if err != nil { + return nil, fmt.Errorf("failed to decode txData.Data: data=%v, err=%w", txData.Data, err) + } + + var tx *types.Transaction + switch txData.Type { + case types.LegacyTxType: + tx = types.NewTx(&types.LegacyTx{ + Nonce: txData.Nonce, + To: txData.To, + Value: txData.Value.ToInt(), + Gas: txData.Gas, + GasPrice: txData.GasPrice.ToInt(), + Data: data, + V: txData.V.ToInt(), + R: txData.R.ToInt(), + S: txData.S.ToInt(), + }) + + case types.AccessListTxType: + tx = types.NewTx(&types.AccessListTx{ + ChainID: txData.ChainId.ToInt(), + Nonce: txData.Nonce, + To: txData.To, + Value: txData.Value.ToInt(), + Gas: txData.Gas, + GasPrice: txData.GasPrice.ToInt(), + Data: data, + AccessList: txData.AccessList, + V: txData.V.ToInt(), + R: txData.R.ToInt(), + S: txData.S.ToInt(), + }) + + case types.DynamicFeeTxType: + tx = types.NewTx(&types.DynamicFeeTx{ + ChainID: txData.ChainId.ToInt(), + Nonce: txData.Nonce, + To: txData.To, + Value: txData.Value.ToInt(), + Gas: txData.Gas, + GasTipCap: txData.GasTipCap.ToInt(), + GasFeeCap: txData.GasFeeCap.ToInt(), + Data: data, + AccessList: txData.AccessList, + V: txData.V.ToInt(), + R: txData.R.ToInt(), + S: txData.S.ToInt(), + }) + + case txTypeTest: + // in the tests, we simply use `data` as the RLP-encoded transaction + return data, nil + + case types.L1MessageTxType: // L1MessageTxType is not supported + default: + return nil, fmt.Errorf("unsupported tx type: %d", txData.Type) + } + + rlpTxData, err := tx.MarshalBinary() + if err != nil { + return nil, fmt.Errorf("failed to marshal binary of the tx: tx=%v, err=%w", tx, err) + } + + return rlpTxData, nil +} + +// CrcMax calculates the maximum row consumption of crc. +func (c *Chunk) CrcMax() (uint64, error) { + // Map sub-circuit name to row count + crc := make(map[string]uint64) + + // Iterate over blocks, accumulate row consumption + for _, block := range c.Blocks { + if block.RowConsumption == nil { + return 0, fmt.Errorf("block (%d, %v) has nil RowConsumption", block.Header.Number, block.Header.Hash().Hex()) + } + for _, subCircuit := range *block.RowConsumption { + crc[subCircuit.Name] += subCircuit.RowNumber + } + } + + // Find the maximum row consumption + var maxVal uint64 + for _, value := range crc { + if value > maxVal { + maxVal = value + } + } + + // Return the maximum row consumption + return maxVal, nil +} + +// NumTransactions calculates the total number of transactions in a Chunk. +func (c *Chunk) NumTransactions() uint64 { + var totalTxNum uint64 + for _, block := range c.Blocks { + totalTxNum += uint64(len(block.Transactions)) + } + return totalTxNum +} + +// NumL2Transactions calculates the total number of L2 transactions in a Chunk. +func (c *Chunk) NumL2Transactions() uint64 { + var totalTxNum uint64 + for _, block := range c.Blocks { + totalTxNum += block.NumL2Transactions() + } + return totalTxNum +} + +// L2GasUsed calculates the total gas of L2 transactions in a Chunk. +func (c *Chunk) L2GasUsed() uint64 { + var totalTxNum uint64 + for _, block := range c.Blocks { + totalTxNum += block.Header.GasUsed + } + return totalTxNum +} + +// StateRoot gets the state root after committing/finalizing the batch. +func (b *Batch) StateRoot() common.Hash { + numChunks := len(b.Chunks) + if len(b.Chunks) == 0 { + return common.Hash{} + } + lastChunkBlockNum := len(b.Chunks[numChunks-1].Blocks) + return b.Chunks[len(b.Chunks)-1].Blocks[lastChunkBlockNum-1].Header.Root +} + +// WithdrawRoot gets the withdraw root after committing/finalizing the batch. +func (b *Batch) WithdrawRoot() common.Hash { + numChunks := len(b.Chunks) + if len(b.Chunks) == 0 { + return common.Hash{} + } + lastChunkBlockNum := len(b.Chunks[numChunks-1].Blocks) + return b.Chunks[len(b.Chunks)-1].Blocks[lastChunkBlockNum-1].WithdrawRoot +} diff --git a/common/types/encoding/da_test.go b/common/types/encoding/da_test.go new file mode 100644 index 000000000..70524d061 --- /dev/null +++ b/common/types/encoding/da_test.go @@ -0,0 +1,121 @@ +package encoding + +import ( + "encoding/json" + "os" + "testing" + + "github.com/scroll-tech/go-ethereum/common" + "github.com/scroll-tech/go-ethereum/core/types" + "github.com/scroll-tech/go-ethereum/log" + "github.com/stretchr/testify/assert" +) + +func TestMain(m *testing.M) { + glogger := log.NewGlogHandler(log.StreamHandler(os.Stderr, log.LogfmtFormat())) + glogger.Verbosity(log.LvlInfo) + log.Root().SetHandler(glogger) + + m.Run() +} + +func TestUtilFunctions(t *testing.T) { + block1 := readBlockFromJSON(t, "../../testdata/blockTrace_02.json") + block2 := readBlockFromJSON(t, "../../testdata/blockTrace_03.json") + block3 := readBlockFromJSON(t, "../../testdata/blockTrace_04.json") + block4 := readBlockFromJSON(t, "../../testdata/blockTrace_05.json") + block5 := readBlockFromJSON(t, "../../testdata/blockTrace_06.json") + block6 := readBlockFromJSON(t, "../../testdata/blockTrace_07.json") + + chunk1 := &Chunk{Blocks: []*Block{block1, block2}} + chunk2 := &Chunk{Blocks: []*Block{block3, block4}} + chunk3 := &Chunk{Blocks: []*Block{block5, block6}} + + batch := &Batch{Chunks: []*Chunk{chunk1, chunk2, chunk3}} + + // Test Block methods + assert.Equal(t, uint64(0), block1.NumL1Messages(0)) + assert.Equal(t, uint64(2), block1.NumL2Transactions()) + assert.Equal(t, uint64(0), block2.NumL1Messages(0)) + assert.Equal(t, uint64(1), block2.NumL2Transactions()) + assert.Equal(t, uint64(11), block3.NumL1Messages(0)) + assert.Equal(t, uint64(1), block3.NumL2Transactions()) + assert.Equal(t, uint64(42), block4.NumL1Messages(0)) + assert.Equal(t, uint64(0), block4.NumL2Transactions()) + assert.Equal(t, uint64(10), block5.NumL1Messages(0)) + assert.Equal(t, uint64(0), block5.NumL2Transactions()) + assert.Equal(t, uint64(257), block6.NumL1Messages(0)) + assert.Equal(t, uint64(0), block6.NumL2Transactions()) + + // Test Chunk methods + assert.Equal(t, uint64(0), chunk1.NumL1Messages(0)) + assert.Equal(t, uint64(3), chunk1.NumL2Transactions()) + crc1Max, err := chunk1.CrcMax() + assert.NoError(t, err) + assert.Equal(t, uint64(11), crc1Max) + assert.Equal(t, uint64(3), chunk1.NumTransactions()) + assert.Equal(t, uint64(1194994), chunk1.L2GasUsed()) + + assert.Equal(t, uint64(42), chunk2.NumL1Messages(0)) + assert.Equal(t, uint64(1), chunk2.NumL2Transactions()) + crc2Max, err := chunk2.CrcMax() + assert.NoError(t, err) + assert.Equal(t, uint64(0), crc2Max) + assert.Equal(t, uint64(7), chunk2.NumTransactions()) + assert.Equal(t, uint64(144000), chunk2.L2GasUsed()) + + assert.Equal(t, uint64(257), chunk3.NumL1Messages(0)) + assert.Equal(t, uint64(0), chunk3.NumL2Transactions()) + chunk3.Blocks[0].RowConsumption = nil + crc3Max, err := chunk3.CrcMax() + assert.Error(t, err) + assert.EqualError(t, err, "block (17, 0x003fee335455c0c293dda17ea9365fe0caa94071ed7216baf61f7aeb808e8a28) has nil RowConsumption") + assert.Equal(t, uint64(0), crc3Max) + assert.Equal(t, uint64(5), chunk3.NumTransactions()) + assert.Equal(t, uint64(240000), chunk3.L2GasUsed()) + + // Test Batch methods + assert.Equal(t, block6.Header.Root, batch.StateRoot()) + assert.Equal(t, block6.WithdrawRoot, batch.WithdrawRoot()) +} + +func TestConvertTxDataToRLPEncoding(t *testing.T) { + blocks := []*Block{ + readBlockFromJSON(t, "../../testdata/blockTrace_02.json"), + readBlockFromJSON(t, "../../testdata/blockTrace_03.json"), + readBlockFromJSON(t, "../../testdata/blockTrace_04.json"), + readBlockFromJSON(t, "../../testdata/blockTrace_05.json"), + readBlockFromJSON(t, "../../testdata/blockTrace_06.json"), + readBlockFromJSON(t, "../../testdata/blockTrace_07.json"), + } + + for _, block := range blocks { + for _, txData := range block.Transactions { + if txData.Type == types.L1MessageTxType { + continue + } + + rlpTxData, err := ConvertTxDataToRLPEncoding(txData) + assert.NoError(t, err) + var tx types.Transaction + err = tx.UnmarshalBinary(rlpTxData) + assert.NoError(t, err) + assert.Equal(t, txData.TxHash, tx.Hash().Hex()) + } + } +} + +func TestEmptyBatchRoots(t *testing.T) { + emptyBatch := &Batch{Chunks: []*Chunk{}} + assert.Equal(t, common.Hash{}, emptyBatch.StateRoot()) + assert.Equal(t, common.Hash{}, emptyBatch.WithdrawRoot()) +} + +func readBlockFromJSON(t *testing.T, filename string) *Block { + data, err := os.ReadFile(filename) + assert.NoError(t, err) + + block := &Block{} + assert.NoError(t, json.Unmarshal(data, block)) + return block +} diff --git a/common/types/message/message.go b/common/types/message/message.go index b687af559..b037638da 100644 --- a/common/types/message/message.go +++ b/common/types/message/message.go @@ -259,6 +259,7 @@ type ChunkInfo struct { WithdrawRoot common.Hash `json:"withdraw_root"` DataHash common.Hash `json:"data_hash"` IsPadding bool `json:"is_padding"` + TxBytes []byte `json:"tx_bytes"` } // ChunkProof includes the proof info that are required for chunk verification and rollup. diff --git a/common/utils/flags.go b/common/utils/flags.go index 9ea244098..e6e4f6422 100644 --- a/common/utils/flags.go +++ b/common/utils/flags.go @@ -16,6 +16,7 @@ var ( &MetricsAddr, &MetricsPort, &ServicePortFlag, + &Genesis, } // RollupRelayerFlags contains flags only used in rollup-relayer RollupRelayerFlags = []cli.Flag{ @@ -83,4 +84,10 @@ var ( Usage: "Port that the service will listen on", Value: 8080, } + // Genesis is the genesis file + Genesis = cli.StringFlag{ + Name: "genesis", + Usage: "Genesis file of the network", + Value: "./conf/genesis.json", + } ) diff --git a/common/utils/utils.go b/common/utils/utils.go index 61f6ed2f5..db3552179 100644 --- a/common/utils/utils.go +++ b/common/utils/utils.go @@ -3,11 +3,16 @@ package utils import ( "context" "crypto/rand" + "encoding/json" + "errors" "fmt" "math/big" + "os" + "path/filepath" "time" "github.com/modern-go/reflect2" + "github.com/scroll-tech/go-ethereum/core" ) // TryTimes try run several times until the function return true. @@ -59,3 +64,17 @@ func RandomURL() string { id, _ := rand.Int(rand.Reader, big.NewInt(5000-1)) return fmt.Sprintf("localhost:%d", 10000+2000+id.Int64()) } + +// ReadGenesis parses and returns the genesis file at the given path +func ReadGenesis(genesisPath string) (*core.Genesis, error) { + file, err := os.Open(filepath.Clean(genesisPath)) + if err != nil { + return nil, err + } + + genesis := new(core.Genesis) + if err := json.NewDecoder(file).Decode(genesis); err != nil { + return nil, errors.Join(err, file.Close()) + } + return genesis, file.Close() +} diff --git a/common/version/prover_version.go b/common/version/prover_version.go index 2bc72322f..9bedfa7dc 100644 --- a/common/version/prover_version.go +++ b/common/version/prover_version.go @@ -2,6 +2,9 @@ package version import ( "strings" + + "github.com/Masterminds/semver/v3" + "github.com/scroll-tech/go-ethereum/log" ) // CheckScrollProverVersion check the "scroll-prover" version, if it's different from the local one, return false @@ -19,3 +22,20 @@ func CheckScrollProverVersion(proverVersion string) bool { // compare the `scroll_prover` version return remote[2] == local[2] } + +// CheckScrollRepoVersion checks if the proverVersion is at least the minimum required version. +func CheckScrollRepoVersion(proverVersion, minVersion string) bool { + c, err := semver.NewConstraint(">= " + minVersion + "-0") + if err != nil { + log.Error("failed to initialize constraint", "minVersion", minVersion, "error", err) + return false + } + + v, err := semver.NewVersion(proverVersion + "-z") + if err != nil { + log.Error("failed to parse version", "proverVersion", proverVersion, "error", err) + return false + } + + return c.Check(v) +} diff --git a/common/version/prover_version_test.go b/common/version/prover_version_test.go new file mode 100644 index 000000000..3852f1e97 --- /dev/null +++ b/common/version/prover_version_test.go @@ -0,0 +1,59 @@ +package version + +import ( + "os" + "testing" + + "github.com/scroll-tech/go-ethereum/log" +) + +func TestMain(m *testing.M) { + glogger := log.NewGlogHandler(log.StreamHandler(os.Stderr, log.LogfmtFormat())) + glogger.Verbosity(log.LvlInfo) + log.Root().SetHandler(glogger) + + m.Run() +} + +func TestCheckScrollProverVersion(t *testing.T) { + tests := []struct { + proverVersion string + want bool + }{ + {Version, true}, + {"tag-commit-111111-000000", false}, + {"incorrect-format", false}, + {"tag-commit-222222-111111", false}, + } + + for _, tt := range tests { + if got := CheckScrollProverVersion(tt.proverVersion); got != tt.want { + t.Errorf("CheckScrollProverVersion(%q) = %v, want %v", tt.proverVersion, got, tt.want) + } + } +} + +func TestCheckScrollRepoVersion(t *testing.T) { + tests := []struct { + proverVersion string + minVersion string + want bool + }{ + {"v1.2.3-commit-111111-000000", "v1.2.3-alpha", true}, + {"v1.2.3-patch-commit-111111-000000", "v1.2.2", true}, + {"v1.0.0", "v1.0.0-alpha", true}, + {"v1.2.2", "v1.2.3", false}, + {"v2.0.0", "v1.9.9", true}, + {"v0.9.0", "v1.0.0", false}, + {"v9.9.9", "v10.0.0-alpha", false}, + {"v4.1.98-aaa-bbb-ccc", "v999.0.0", false}, + {"v1.0.0", "v1.0.0", true}, + {"v1.0.0-alpha", "v1.0.0-alpha", true}, + } + + for _, tt := range tests { + if got := CheckScrollRepoVersion(tt.proverVersion, tt.minVersion); got != tt.want { + t.Errorf("CheckScrollRepoVersion(%q, %q) = %v, want %v", tt.proverVersion, tt.minVersion, got, tt.want) + } + } +} diff --git a/common/version/version.go b/common/version/version.go index fa767bcd0..50509e29e 100644 --- a/common/version/version.go +++ b/common/version/version.go @@ -5,7 +5,7 @@ import ( "runtime/debug" ) -var tag = "v4.3.67" +var tag = "v4.3.85" var commit = func() string { if info, ok := debug.ReadBuildInfo(); ok { diff --git a/contracts/.nvmrc b/contracts/.nvmrc new file mode 100644 index 000000000..e048c8ca1 --- /dev/null +++ b/contracts/.nvmrc @@ -0,0 +1 @@ +v18.15.0 diff --git a/contracts/docs/apis/L1ERC1155Gateway.md b/contracts/docs/apis/L1ERC1155Gateway.md index b58d84986..e410f029a 100644 --- a/contracts/docs/apis/L1ERC1155Gateway.md +++ b/contracts/docs/apis/L1ERC1155Gateway.md @@ -162,7 +162,7 @@ Initialize the storage of L1ERC1155Gateway. | Name | Type | Description | |---|---|---| | _counterpart | address | The address of L2ERC1155Gateway in L2. | -| _messenger | address | The address of L1ScrollMessenger. | +| _messenger | address | The address of L1ScrollMessenger in L1. | ### messenger @@ -389,12 +389,12 @@ Emitted when the ERC1155 NFT is batch deposited to gateway on layer 1. | Name | Type | Description | |---|---|---| -| _l1Token `indexed` | address | undefined | -| _l2Token `indexed` | address | undefined | -| _from `indexed` | address | undefined | -| _to | address | undefined | -| _tokenIds | uint256[] | undefined | -| _amounts | uint256[] | undefined | +| _l1Token `indexed` | address | The address of ERC1155 NFT on layer 1. | +| _l2Token `indexed` | address | The address of ERC1155 NFT on layer 2. | +| _from `indexed` | address | The address of sender on layer 1. | +| _to | address | The address of recipient on layer 2. | +| _tokenIds | uint256[] | The list of token ids of the ERC1155 NFT to deposit on layer 1. | +| _amounts | uint256[] | The list of corresponding number of token to deposit on layer 1. | ### BatchRefundERC1155 @@ -410,10 +410,10 @@ Emitted when some ERC1155 token is refunded. | Name | Type | Description | |---|---|---| -| token `indexed` | address | undefined | -| recipient `indexed` | address | undefined | -| tokenIds | uint256[] | undefined | -| amounts | uint256[] | undefined | +| token `indexed` | address | The address of the token in L1. | +| recipient `indexed` | address | The address of receiver in L1. | +| tokenIds | uint256[] | The list of ids of token refunded. | +| amounts | uint256[] | The list of amount of token refunded. | ### DepositERC1155 @@ -429,12 +429,12 @@ Emitted when the ERC1155 NFT is deposited to gateway on layer 1. | Name | Type | Description | |---|---|---| -| _l1Token `indexed` | address | undefined | -| _l2Token `indexed` | address | undefined | -| _from `indexed` | address | undefined | -| _to | address | undefined | -| _tokenId | uint256 | undefined | -| _amount | uint256 | undefined | +| _l1Token `indexed` | address | The address of ERC1155 NFT on layer 1. | +| _l2Token `indexed` | address | The address of ERC1155 NFT on layer 2. | +| _from `indexed` | address | The address of sender on layer 1. | +| _to | address | The address of recipient on layer 2. | +| _tokenId | uint256 | The token id of the ERC1155 NFT to deposit on layer 1. | +| _amount | uint256 | The number of token to deposit on layer 1. | ### FinalizeBatchWithdrawERC1155 @@ -450,12 +450,12 @@ Emitted when the ERC1155 NFT is batch transferred to recipient on layer 1. | Name | Type | Description | |---|---|---| -| _l1Token `indexed` | address | undefined | -| _l2Token `indexed` | address | undefined | -| _from `indexed` | address | undefined | -| _to | address | undefined | -| _tokenIds | uint256[] | undefined | -| _amounts | uint256[] | undefined | +| _l1Token `indexed` | address | The address of ERC1155 NFT on layer 1. | +| _l2Token `indexed` | address | The address of ERC1155 NFT on layer 2. | +| _from `indexed` | address | The address of sender on layer 2. | +| _to | address | The address of recipient on layer 1. | +| _tokenIds | uint256[] | The list of token ids of the ERC1155 NFT to withdraw from layer 2. | +| _amounts | uint256[] | The list of corresponding number of token to withdraw from layer 2. | ### FinalizeWithdrawERC1155 @@ -471,12 +471,12 @@ Emitted when the ERC1155 NFT is transferred to recipient on layer 1. | Name | Type | Description | |---|---|---| -| _l1Token `indexed` | address | undefined | -| _l2Token `indexed` | address | undefined | -| _from `indexed` | address | undefined | -| _to | address | undefined | -| _tokenId | uint256 | undefined | -| _amount | uint256 | undefined | +| _l1Token `indexed` | address | The address of ERC1155 NFT on layer 1. | +| _l2Token `indexed` | address | The address of ERC1155 NFT on layer 2. | +| _from `indexed` | address | The address of sender on layer 2. | +| _to | address | The address of recipient on layer 1. | +| _tokenId | uint256 | The token id of the ERC1155 NFT to withdraw from layer 2. | +| _amount | uint256 | The number of token to withdraw from layer 2. | ### Initialized @@ -486,7 +486,7 @@ event Initialized(uint8 version) - +*Triggered when the contract has been initialized or reinitialized.* #### Parameters @@ -525,10 +525,10 @@ Emitted when some ERC1155 token is refunded. | Name | Type | Description | |---|---|---| -| token `indexed` | address | undefined | -| recipient `indexed` | address | undefined | -| tokenId | uint256 | undefined | -| amount | uint256 | undefined | +| token `indexed` | address | The address of the token in L1. | +| recipient `indexed` | address | The address of receiver in L1. | +| tokenId | uint256 | The id of token refunded. | +| amount | uint256 | The amount of token refunded. | ### UpdateTokenMapping diff --git a/contracts/docs/apis/L1ERC721Gateway.md b/contracts/docs/apis/L1ERC721Gateway.md index f45893cfc..17f54006a 100644 --- a/contracts/docs/apis/L1ERC721Gateway.md +++ b/contracts/docs/apis/L1ERC721Gateway.md @@ -156,7 +156,7 @@ Initialize the storage of L1ERC721Gateway. | Name | Type | Description | |---|---|---| | _counterpart | address | The address of L2ERC721Gateway in L2. | -| _messenger | address | The address of L1ScrollMessenger. | +| _messenger | address | The address of L1ScrollMessenger in L1. | ### messenger @@ -334,11 +334,11 @@ Emitted when the ERC721 NFT is batch deposited to gateway on layer 1. | Name | Type | Description | |---|---|---| -| _l1Token `indexed` | address | undefined | -| _l2Token `indexed` | address | undefined | -| _from `indexed` | address | undefined | -| _to | address | undefined | -| _tokenIds | uint256[] | undefined | +| _l1Token `indexed` | address | The address of ERC721 NFT on layer 1. | +| _l2Token `indexed` | address | The address of ERC721 NFT on layer 2. | +| _from `indexed` | address | The address of sender on layer 1. | +| _to | address | The address of recipient on layer 2. | +| _tokenIds | uint256[] | The list of token ids of the ERC721 NFT to deposit on layer 1. | ### BatchRefundERC721 @@ -354,9 +354,9 @@ Emitted when a batch of ERC721 tokens are refunded. | Name | Type | Description | |---|---|---| -| token `indexed` | address | undefined | -| recipient `indexed` | address | undefined | -| tokenIds | uint256[] | undefined | +| token `indexed` | address | The address of the token in L1. | +| recipient `indexed` | address | The address of receiver in L1. | +| tokenIds | uint256[] | The list of token ids of the ERC721 NFT refunded. | ### DepositERC721 @@ -372,11 +372,11 @@ Emitted when the ERC721 NFT is deposited to gateway on layer 1. | Name | Type | Description | |---|---|---| -| _l1Token `indexed` | address | undefined | -| _l2Token `indexed` | address | undefined | -| _from `indexed` | address | undefined | -| _to | address | undefined | -| _tokenId | uint256 | undefined | +| _l1Token `indexed` | address | The address of ERC721 NFT on layer 1. | +| _l2Token `indexed` | address | The address of ERC721 NFT on layer 2. | +| _from `indexed` | address | The address of sender on layer 1. | +| _to | address | The address of recipient on layer 2. | +| _tokenId | uint256 | The token id of the ERC721 NFT to deposit on layer 1. | ### FinalizeBatchWithdrawERC721 @@ -392,11 +392,11 @@ Emitted when the ERC721 NFT is batch transferred to recipient on layer 1. | Name | Type | Description | |---|---|---| -| _l1Token `indexed` | address | undefined | -| _l2Token `indexed` | address | undefined | -| _from `indexed` | address | undefined | -| _to | address | undefined | -| _tokenIds | uint256[] | undefined | +| _l1Token `indexed` | address | The address of ERC721 NFT on layer 1. | +| _l2Token `indexed` | address | The address of ERC721 NFT on layer 2. | +| _from `indexed` | address | The address of sender on layer 2. | +| _to | address | The address of recipient on layer 1. | +| _tokenIds | uint256[] | The list of token ids of the ERC721 NFT to withdraw from layer 2. | ### FinalizeWithdrawERC721 @@ -412,11 +412,11 @@ Emitted when the ERC721 NFT is transferred to recipient on layer 1. | Name | Type | Description | |---|---|---| -| _l1Token `indexed` | address | undefined | -| _l2Token `indexed` | address | undefined | -| _from `indexed` | address | undefined | -| _to | address | undefined | -| _tokenId | uint256 | undefined | +| _l1Token `indexed` | address | The address of ERC721 NFT on layer 1. | +| _l2Token `indexed` | address | The address of ERC721 NFT on layer 2. | +| _from `indexed` | address | The address of sender on layer 2. | +| _to | address | The address of recipient on layer 1. | +| _tokenId | uint256 | The token id of the ERC721 NFT to withdraw from layer 2. | ### Initialized @@ -426,7 +426,7 @@ event Initialized(uint8 version) - +*Triggered when the contract has been initialized or reinitialized.* #### Parameters @@ -465,9 +465,9 @@ Emitted when some ERC721 token is refunded. | Name | Type | Description | |---|---|---| -| token `indexed` | address | undefined | -| recipient `indexed` | address | undefined | -| tokenId | uint256 | undefined | +| token `indexed` | address | The address of the token in L1. | +| recipient `indexed` | address | The address of receiver in L1. | +| tokenId | uint256 | The id of token refunded. | ### UpdateTokenMapping diff --git a/contracts/docs/apis/L1GatewayRouter.md b/contracts/docs/apis/L1GatewayRouter.md index a46b2e2fb..a4a84f197 100644 --- a/contracts/docs/apis/L1GatewayRouter.md +++ b/contracts/docs/apis/L1GatewayRouter.md @@ -168,7 +168,7 @@ function ethGateway() external view returns (address) The address of L1ETHGateway. -*This variable is no longer used.* + #### Returns @@ -286,7 +286,7 @@ function initialize(address _ethGateway, address _defaultERC20Gateway) external Initialize the storage of L1GatewayRouter. -*The parameters `_ethGateway` is no longer used.* + #### Parameters @@ -295,23 +295,6 @@ Initialize the storage of L1GatewayRouter. | _ethGateway | address | The address of L1ETHGateway contract. | | _defaultERC20Gateway | address | The address of default ERC20 Gateway contract. | -### messenger - -```solidity -function messenger() external view returns (address) -``` - -The address of `L1ScrollMessenger`. - - - - -#### Returns - -| Name | Type | Description | -|---|---|---| -| _0 | address | undefined | - ### owner ```solidity @@ -447,12 +430,12 @@ Emitted when someone deposit ERC20 token from L1 to L2. | Name | Type | Description | |---|---|---| -| l1Token `indexed` | address | undefined | -| l2Token `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to | address | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | +| l1Token `indexed` | address | The address of the token in L1. | +| l2Token `indexed` | address | The address of the token in L2. | +| from `indexed` | address | The address of sender in L1. | +| to | address | The address of recipient in L2. | +| amount | uint256 | The amount of token will be deposited from L1 to L2. | +| data | bytes | The optional calldata passed to recipient in L2. | ### DepositETH @@ -468,10 +451,10 @@ Emitted when someone deposit ETH from L1 to L2. | Name | Type | Description | |---|---|---| -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | +| from `indexed` | address | The address of sender in L1. | +| to `indexed` | address | The address of recipient in L2. | +| amount | uint256 | The amount of ETH will be deposited from L1 to L2. | +| data | bytes | The optional calldata passed to recipient in L2. | ### FinalizeWithdrawERC20 @@ -487,12 +470,12 @@ Emitted when ERC20 token is withdrawn from L2 to L1 and transfer to recipient. | Name | Type | Description | |---|---|---| -| l1Token `indexed` | address | undefined | -| l2Token `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to | address | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | +| l1Token `indexed` | address | The address of the token in L1. | +| l2Token `indexed` | address | The address of the token in L2. | +| from `indexed` | address | The address of sender in L2. | +| to | address | The address of recipient in L1. | +| amount | uint256 | The amount of token withdrawn from L2 to L1. | +| data | bytes | The optional calldata passed to recipient in L1. | ### FinalizeWithdrawETH @@ -508,10 +491,10 @@ Emitted when ETH is withdrawn from L2 to L1 and transfer to recipient. | Name | Type | Description | |---|---|---| -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | +| from `indexed` | address | The address of sender in L2. | +| to `indexed` | address | The address of recipient in L1. | +| amount | uint256 | The amount of ETH withdrawn from L2 to L1. | +| data | bytes | The optional calldata passed to recipient in L1. | ### Initialized @@ -521,7 +504,7 @@ event Initialized(uint8 version) - +*Triggered when the contract has been initialized or reinitialized.* #### Parameters @@ -560,9 +543,9 @@ Emitted when some ERC20 token is refunded. | Name | Type | Description | |---|---|---| -| token `indexed` | address | undefined | -| recipient `indexed` | address | undefined | -| amount | uint256 | undefined | +| token `indexed` | address | The address of the token in L1. | +| recipient `indexed` | address | The address of receiver in L1. | +| amount | uint256 | The amount of token refunded to receiver. | ### RefundETH @@ -578,8 +561,8 @@ Emitted when some ETH is refunded. | Name | Type | Description | |---|---|---| -| recipient `indexed` | address | undefined | -| amount | uint256 | undefined | +| recipient `indexed` | address | The address of receiver in L1. | +| amount | uint256 | The amount of ETH refunded to receiver. | ### SetDefaultERC20Gateway @@ -595,8 +578,8 @@ Emitted when the address of default ERC20 Gateway is updated. | Name | Type | Description | |---|---|---| -| oldDefaultERC20Gateway `indexed` | address | undefined | -| newDefaultERC20Gateway `indexed` | address | undefined | +| oldDefaultERC20Gateway `indexed` | address | The address of the old default ERC20 Gateway. | +| newDefaultERC20Gateway `indexed` | address | The address of the new default ERC20 Gateway. | ### SetERC20Gateway @@ -612,9 +595,9 @@ Emitted when the `gateway` for `token` is updated. | Name | Type | Description | |---|---|---| -| token `indexed` | address | undefined | -| oldGateway `indexed` | address | undefined | -| newGateway `indexed` | address | undefined | +| token `indexed` | address | The address of token updated. | +| oldGateway `indexed` | address | The corresponding address of the old gateway. | +| newGateway `indexed` | address | The corresponding address of the new gateway. | ### SetETHGateway @@ -630,22 +613,8 @@ Emitted when the address of ETH Gateway is updated. | Name | Type | Description | |---|---|---| -| oldETHGateway `indexed` | address | undefined | -| newEthGateway `indexed` | address | undefined | - - - -## Errors - -### ErrorZeroAddress - -```solidity -error ErrorZeroAddress() -``` - - - -*Thrown when the given address is `address(0)`.* +| oldETHGateway `indexed` | address | The address of the old ETH Gateway. | +| newEthGateway `indexed` | address | The address of the new ETH Gateway. | diff --git a/contracts/docs/apis/L1ScrollMessenger.md b/contracts/docs/apis/L1ScrollMessenger.md index e331f234e..d31959b59 100644 --- a/contracts/docs/apis/L1ScrollMessenger.md +++ b/contracts/docs/apis/L1ScrollMessenger.md @@ -471,7 +471,7 @@ Emitted when a cross domain message is failed to relay. | Name | Type | Description | |---|---|---| -| messageHash `indexed` | bytes32 | undefined | +| messageHash `indexed` | bytes32 | The hash of the message. | ### Initialized @@ -481,7 +481,7 @@ event Initialized(uint8 version) - +*Triggered when the contract has been initialized or reinitialized.* #### Parameters @@ -514,7 +514,7 @@ event Paused(address account) - +*Emitted when the pause is triggered by `account`.* #### Parameters @@ -536,7 +536,7 @@ Emitted when a cross domain message is relayed successfully. | Name | Type | Description | |---|---|---| -| messageHash `indexed` | bytes32 | undefined | +| messageHash `indexed` | bytes32 | The hash of the message. | ### SentMessage @@ -552,12 +552,12 @@ Emitted when a cross domain message is sent. | Name | Type | Description | |---|---|---| -| sender `indexed` | address | undefined | -| target `indexed` | address | undefined | -| value | uint256 | undefined | -| messageNonce | uint256 | undefined | -| gasLimit | uint256 | undefined | -| message | bytes | undefined | +| sender `indexed` | address | The address of the sender who initiates the message. | +| target `indexed` | address | The address of target contract to call. | +| value | uint256 | The amount of value passed to the target contract. | +| messageNonce | uint256 | The nonce of the message. | +| gasLimit | uint256 | The optional gas limit passed to L1 or L2. | +| message | bytes | The calldata passed to the target contract. | ### Unpaused @@ -567,7 +567,7 @@ event Unpaused(address account) - +*Emitted when the pause is lifted by `account`.* #### Parameters @@ -589,8 +589,8 @@ Emitted when owner updates fee vault contract. | Name | Type | Description | |---|---|---| -| _oldFeeVault | address | undefined | -| _newFeeVault | address | undefined | +| _oldFeeVault | address | The address of old fee vault contract. | +| _newFeeVault | address | The address of new fee vault contract. | ### UpdateMaxReplayTimes @@ -606,8 +606,8 @@ Emitted when the maximum number of times each message can be replayed is updated | Name | Type | Description | |---|---|---| -| oldMaxReplayTimes | uint256 | undefined | -| newMaxReplayTimes | uint256 | undefined | +| oldMaxReplayTimes | uint256 | The old maximum number of times each message can be replayed. | +| newMaxReplayTimes | uint256 | The new maximum number of times each message can be replayed. | diff --git a/contracts/docs/apis/L1StandardERC20Gateway.md b/contracts/docs/apis/L1StandardERC20Gateway.md index b67fa77a4..3cf8ade86 100644 --- a/contracts/docs/apis/L1StandardERC20Gateway.md +++ b/contracts/docs/apis/L1StandardERC20Gateway.md @@ -130,7 +130,7 @@ Return the corresponding l2 token address given l1 token address. ### initialize ```solidity -function initialize(address _counterpart, address _router, address _messenger, address _l2TokenImplementation, address _l2TokenFactory) external nonpayable +function initialize(address _counterpart, address _router, address _messenger, address, address) external nonpayable ``` Initialize the storage of L1StandardERC20Gateway. @@ -142,10 +142,10 @@ Initialize the storage of L1StandardERC20Gateway. | Name | Type | Description | |---|---|---| | _counterpart | address | The address of L2StandardERC20Gateway in L2. | -| _router | address | The address of L1GatewayRouter. | -| _messenger | address | The address of L1ScrollMessenger. | -| _l2TokenImplementation | address | The address of ScrollStandardERC20 implementation in L2. | -| _l2TokenFactory | address | The address of ScrollStandardERC20Factory contract in L2. | +| _router | address | The address of L1GatewayRouter in L1. | +| _messenger | address | The address of L1ScrollMessenger in L1. | +| _3 | address | undefined | +| _4 | address | undefined | ### l2TokenFactory @@ -293,12 +293,12 @@ Emitted when someone deposit ERC20 token from L1 to L2. | Name | Type | Description | |---|---|---| -| l1Token `indexed` | address | undefined | -| l2Token `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to | address | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | +| l1Token `indexed` | address | The address of the token in L1. | +| l2Token `indexed` | address | The address of the token in L2. | +| from `indexed` | address | The address of sender in L1. | +| to | address | The address of recipient in L2. | +| amount | uint256 | The amount of token will be deposited from L1 to L2. | +| data | bytes | The optional calldata passed to recipient in L2. | ### FinalizeWithdrawERC20 @@ -314,12 +314,12 @@ Emitted when ERC20 token is withdrawn from L2 to L1 and transfer to recipient. | Name | Type | Description | |---|---|---| -| l1Token `indexed` | address | undefined | -| l2Token `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to | address | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | +| l1Token `indexed` | address | The address of the token in L1. | +| l2Token `indexed` | address | The address of the token in L2. | +| from `indexed` | address | The address of sender in L2. | +| to | address | The address of recipient in L1. | +| amount | uint256 | The amount of token withdrawn from L2 to L1. | +| data | bytes | The optional calldata passed to recipient in L1. | ### Initialized @@ -329,7 +329,7 @@ event Initialized(uint8 version) - +*Triggered when the contract has been initialized or reinitialized.* #### Parameters @@ -368,9 +368,9 @@ Emitted when some ERC20 token is refunded. | Name | Type | Description | |---|---|---| -| token `indexed` | address | undefined | -| recipient `indexed` | address | undefined | -| amount | uint256 | undefined | +| token `indexed` | address | The address of the token in L1. | +| recipient `indexed` | address | The address of receiver in L1. | +| amount | uint256 | The amount of token refunded to receiver. | diff --git a/contracts/docs/apis/L1WETHGateway.md b/contracts/docs/apis/L1WETHGateway.md index d7231992a..141a2e9ef 100644 --- a/contracts/docs/apis/L1WETHGateway.md +++ b/contracts/docs/apis/L1WETHGateway.md @@ -152,15 +152,15 @@ function initialize(address _counterpart, address _router, address _messenger) e Initialize the storage of L1WETHGateway. - +*The parameters `_counterpart`, `_router` and `_messenger` are no longer used.* #### Parameters | Name | Type | Description | |---|---|---| | _counterpart | address | The address of L2ETHGateway in L2. | -| _router | address | The address of L1GatewayRouter. | -| _messenger | address | The address of L1ScrollMessenger. | +| _router | address | The address of L1GatewayRouter in L1. | +| _messenger | address | The address of L1ScrollMessenger in L1. | ### l2WETH @@ -291,12 +291,12 @@ Emitted when someone deposit ERC20 token from L1 to L2. | Name | Type | Description | |---|---|---| -| l1Token `indexed` | address | undefined | -| l2Token `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to | address | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | +| l1Token `indexed` | address | The address of the token in L1. | +| l2Token `indexed` | address | The address of the token in L2. | +| from `indexed` | address | The address of sender in L1. | +| to | address | The address of recipient in L2. | +| amount | uint256 | The amount of token will be deposited from L1 to L2. | +| data | bytes | The optional calldata passed to recipient in L2. | ### FinalizeWithdrawERC20 @@ -312,12 +312,12 @@ Emitted when ERC20 token is withdrawn from L2 to L1 and transfer to recipient. | Name | Type | Description | |---|---|---| -| l1Token `indexed` | address | undefined | -| l2Token `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to | address | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | +| l1Token `indexed` | address | The address of the token in L1. | +| l2Token `indexed` | address | The address of the token in L2. | +| from `indexed` | address | The address of sender in L2. | +| to | address | The address of recipient in L1. | +| amount | uint256 | The amount of token withdrawn from L2 to L1. | +| data | bytes | The optional calldata passed to recipient in L1. | ### Initialized @@ -327,7 +327,7 @@ event Initialized(uint8 version) - +*Triggered when the contract has been initialized or reinitialized.* #### Parameters @@ -366,9 +366,9 @@ Emitted when some ERC20 token is refunded. | Name | Type | Description | |---|---|---| -| token `indexed` | address | undefined | -| recipient `indexed` | address | undefined | -| amount | uint256 | undefined | +| token `indexed` | address | The address of the token in L1. | +| recipient `indexed` | address | The address of receiver in L1. | +| amount | uint256 | The amount of token refunded to receiver. | diff --git a/contracts/docs/apis/L2ERC1155Gateway.md b/contracts/docs/apis/L2ERC1155Gateway.md index df62081ea..d4565aad0 100644 --- a/contracts/docs/apis/L2ERC1155Gateway.md +++ b/contracts/docs/apis/L2ERC1155Gateway.md @@ -373,12 +373,12 @@ Emitted when the ERC1155 NFT is batch transferred to gateway on layer 2. | Name | Type | Description | |---|---|---| -| l1Token `indexed` | address | undefined | -| l2Token `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to | address | undefined | -| tokenIds | uint256[] | undefined | -| amounts | uint256[] | undefined | +| l1Token `indexed` | address | The address of ERC1155 NFT on layer 1. | +| l2Token `indexed` | address | The address of ERC1155 NFT on layer 2. | +| from `indexed` | address | The address of sender on layer 2. | +| to | address | The address of recipient on layer 1. | +| tokenIds | uint256[] | The list of token ids of the ERC1155 NFT to withdraw on layer 2. | +| amounts | uint256[] | The list of corresponding amounts to withdraw. | ### FinalizeBatchDepositERC1155 @@ -394,12 +394,12 @@ Emitted when the ERC1155 NFT is batch transferred to recipient on layer 2. | Name | Type | Description | |---|---|---| -| l1Token `indexed` | address | undefined | -| l2Token `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to | address | undefined | -| tokenIds | uint256[] | undefined | -| amounts | uint256[] | undefined | +| l1Token `indexed` | address | The address of ERC1155 NFT on layer 1. | +| l2Token `indexed` | address | The address of ERC1155 NFT on layer 2. | +| from `indexed` | address | The address of sender on layer 1. | +| to | address | The address of recipient on layer 2. | +| tokenIds | uint256[] | The list of token ids of the ERC1155 NFT deposited on layer 1. | +| amounts | uint256[] | The list of corresponding amounts deposited. | ### FinalizeDepositERC1155 @@ -415,12 +415,12 @@ Emitted when the ERC1155 NFT is transferred to recipient on layer 2. | Name | Type | Description | |---|---|---| -| l1Token `indexed` | address | undefined | -| l2Token `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to | address | undefined | -| tokenId | uint256 | undefined | -| amount | uint256 | undefined | +| l1Token `indexed` | address | The address of ERC1155 NFT on layer 1. | +| l2Token `indexed` | address | The address of ERC1155 NFT on layer 2. | +| from `indexed` | address | The address of sender on layer 1. | +| to | address | The address of recipient on layer 2. | +| tokenId | uint256 | The token id of the ERC1155 NFT deposited on layer 1. | +| amount | uint256 | The amount of token deposited. | ### Initialized @@ -430,7 +430,7 @@ event Initialized(uint8 version) - +*Triggered when the contract has been initialized or reinitialized.* #### Parameters @@ -487,12 +487,12 @@ Emitted when the ERC1155 NFT is transferred to gateway on layer 2. | Name | Type | Description | |---|---|---| -| l1Token `indexed` | address | undefined | -| l2Token `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to | address | undefined | -| tokenId | uint256 | undefined | -| amount | uint256 | undefined | +| l1Token `indexed` | address | The address of ERC1155 NFT on layer 1. | +| l2Token `indexed` | address | The address of ERC1155 NFT on layer 2. | +| from `indexed` | address | The address of sender on layer 2. | +| to | address | The address of recipient on layer 1. | +| tokenId | uint256 | The token id of the ERC1155 NFT to withdraw on layer 2. | +| amount | uint256 | The amount of token to withdraw. | diff --git a/contracts/docs/apis/L2ERC721Gateway.md b/contracts/docs/apis/L2ERC721Gateway.md index 1dcff7e43..d615a16a4 100644 --- a/contracts/docs/apis/L2ERC721Gateway.md +++ b/contracts/docs/apis/L2ERC721Gateway.md @@ -318,11 +318,11 @@ Emitted when the ERC721 NFT is batch transferred to gateway on layer 2. | Name | Type | Description | |---|---|---| -| l1Token `indexed` | address | undefined | -| l2Token `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to | address | undefined | -| tokenIds | uint256[] | undefined | +| l1Token `indexed` | address | The address of ERC721 NFT on layer 1. | +| l2Token `indexed` | address | The address of ERC721 NFT on layer 2. | +| from `indexed` | address | The address of sender on layer 2. | +| to | address | The address of recipient on layer 1. | +| tokenIds | uint256[] | The list of token ids of the ERC721 NFT to withdraw on layer 2. | ### FinalizeBatchDepositERC721 @@ -338,11 +338,11 @@ Emitted when the ERC721 NFT is batch transferred to recipient on layer 2. | Name | Type | Description | |---|---|---| -| l1Token `indexed` | address | undefined | -| l2Token `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to | address | undefined | -| tokenIds | uint256[] | undefined | +| l1Token `indexed` | address | The address of ERC721 NFT on layer 1. | +| l2Token `indexed` | address | The address of ERC721 NFT on layer 2. | +| from `indexed` | address | The address of sender on layer 1. | +| to | address | The address of recipient on layer 2. | +| tokenIds | uint256[] | The list of token ids of the ERC721 NFT deposited on layer 1. | ### FinalizeDepositERC721 @@ -358,11 +358,11 @@ Emitted when the ERC721 NFT is transferred to recipient on layer 2. | Name | Type | Description | |---|---|---| -| l1Token `indexed` | address | undefined | -| l2Token `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to | address | undefined | -| tokenId | uint256 | undefined | +| l1Token `indexed` | address | The address of ERC721 NFT on layer 1. | +| l2Token `indexed` | address | The address of ERC721 NFT on layer 2. | +| from `indexed` | address | The address of sender on layer 1. | +| to | address | The address of recipient on layer 2. | +| tokenId | uint256 | The token id of the ERC721 NFT deposited on layer 1. | ### Initialized @@ -372,7 +372,7 @@ event Initialized(uint8 version) - +*Triggered when the contract has been initialized or reinitialized.* #### Parameters @@ -429,11 +429,11 @@ Emitted when the ERC721 NFT is transferred to gateway on layer 2. | Name | Type | Description | |---|---|---| -| l1Token `indexed` | address | undefined | -| l2Token `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to | address | undefined | -| tokenId | uint256 | undefined | +| l1Token `indexed` | address | The address of ERC721 NFT on layer 1. | +| l2Token `indexed` | address | The address of ERC721 NFT on layer 2. | +| from `indexed` | address | The address of sender on layer 2. | +| to | address | The address of recipient on layer 1. | +| tokenId | uint256 | The token id of the ERC721 NFT to withdraw on layer 2. | diff --git a/contracts/docs/apis/L2GatewayRouter.md b/contracts/docs/apis/L2GatewayRouter.md index 3f2960ccc..7b6d55154 100644 --- a/contracts/docs/apis/L2GatewayRouter.md +++ b/contracts/docs/apis/L2GatewayRouter.md @@ -189,23 +189,6 @@ function initialize(address _ethGateway, address _defaultERC20Gateway) external | _ethGateway | address | undefined | | _defaultERC20Gateway | address | undefined | -### messenger - -```solidity -function messenger() external view returns (address) -``` - -The address of `L2ScrollMessenger`. - - - - -#### Returns - -| Name | Type | Description | -|---|---|---| -| _0 | address | undefined | - ### owner ```solidity @@ -428,12 +411,12 @@ Emitted when ERC20 token is deposited from L1 to L2 and transfer to recipient. | Name | Type | Description | |---|---|---| -| l1Token `indexed` | address | undefined | -| l2Token `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to | address | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | +| l1Token `indexed` | address | The address of the token in L1. | +| l2Token `indexed` | address | The address of the token in L2. | +| from `indexed` | address | The address of sender in L1. | +| to | address | The address of recipient in L2. | +| amount | uint256 | The amount of token withdrawn from L1 to L2. | +| data | bytes | The optional calldata passed to recipient in L2. | ### FinalizeDepositETH @@ -449,10 +432,10 @@ Emitted when ETH is deposited from L1 to L2 and transfer to recipient. | Name | Type | Description | |---|---|---| -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | +| from `indexed` | address | The address of sender in L1. | +| to `indexed` | address | The address of recipient in L2. | +| amount | uint256 | The amount of ETH deposited from L1 to L2. | +| data | bytes | The optional calldata passed to recipient in L2. | ### Initialized @@ -462,7 +445,7 @@ event Initialized(uint8 version) - +*Triggered when the contract has been initialized or reinitialized.* #### Parameters @@ -501,8 +484,8 @@ Emitted when the address of default ERC20 Gateway is updated. | Name | Type | Description | |---|---|---| -| oldDefaultERC20Gateway `indexed` | address | undefined | -| newDefaultERC20Gateway `indexed` | address | undefined | +| oldDefaultERC20Gateway `indexed` | address | The address of the old default ERC20 Gateway. | +| newDefaultERC20Gateway `indexed` | address | The address of the new default ERC20 Gateway. | ### SetERC20Gateway @@ -518,9 +501,9 @@ Emitted when the `gateway` for `token` is updated. | Name | Type | Description | |---|---|---| -| token `indexed` | address | undefined | -| oldGateway `indexed` | address | undefined | -| newGateway `indexed` | address | undefined | +| token `indexed` | address | The address of token updated. | +| oldGateway `indexed` | address | The corresponding address of the old gateway. | +| newGateway `indexed` | address | The corresponding address of the new gateway. | ### SetETHGateway @@ -536,8 +519,8 @@ Emitted when the address of ETH Gateway is updated. | Name | Type | Description | |---|---|---| -| oldETHGateway `indexed` | address | undefined | -| newEthGateway `indexed` | address | undefined | +| oldETHGateway `indexed` | address | The address of the old ETH Gateway. | +| newEthGateway `indexed` | address | The address of the new ETH Gateway. | ### WithdrawERC20 @@ -553,12 +536,12 @@ Emitted when someone withdraw ERC20 token from L2 to L1. | Name | Type | Description | |---|---|---| -| l1Token `indexed` | address | undefined | -| l2Token `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to | address | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | +| l1Token `indexed` | address | The address of the token in L1. | +| l2Token `indexed` | address | The address of the token in L2. | +| from `indexed` | address | The address of sender in L2. | +| to | address | The address of recipient in L1. | +| amount | uint256 | The amount of token will be deposited from L2 to L1. | +| data | bytes | The optional calldata passed to recipient in L1. | ### WithdrawETH @@ -574,24 +557,10 @@ Emitted when someone withdraw ETH from L2 to L1. | Name | Type | Description | |---|---|---| -| from `indexed` | address | undefined | -| to `indexed` | address | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | - - - -## Errors - -### ErrorZeroAddress - -```solidity -error ErrorZeroAddress() -``` - - - -*Thrown when the given address is `address(0)`.* +| from `indexed` | address | The address of sender in L2. | +| to `indexed` | address | The address of recipient in L1. | +| amount | uint256 | The amount of ETH will be deposited from L2 to L1. | +| data | bytes | The optional calldata passed to recipient in L1. | diff --git a/contracts/docs/apis/L2ScrollMessenger.md b/contracts/docs/apis/L2ScrollMessenger.md index 0992a2a36..170bb4a80 100644 --- a/contracts/docs/apis/L2ScrollMessenger.md +++ b/contracts/docs/apis/L2ScrollMessenger.md @@ -308,7 +308,7 @@ Emitted when a cross domain message is failed to relay. | Name | Type | Description | |---|---|---| -| messageHash `indexed` | bytes32 | undefined | +| messageHash `indexed` | bytes32 | The hash of the message. | ### Initialized @@ -318,7 +318,7 @@ event Initialized(uint8 version) - +*Triggered when the contract has been initialized or reinitialized.* #### Parameters @@ -351,7 +351,7 @@ event Paused(address account) - +*Emitted when the pause is triggered by `account`.* #### Parameters @@ -373,7 +373,7 @@ Emitted when a cross domain message is relayed successfully. | Name | Type | Description | |---|---|---| -| messageHash `indexed` | bytes32 | undefined | +| messageHash `indexed` | bytes32 | The hash of the message. | ### SentMessage @@ -389,12 +389,12 @@ Emitted when a cross domain message is sent. | Name | Type | Description | |---|---|---| -| sender `indexed` | address | undefined | -| target `indexed` | address | undefined | -| value | uint256 | undefined | -| messageNonce | uint256 | undefined | -| gasLimit | uint256 | undefined | -| message | bytes | undefined | +| sender `indexed` | address | The address of the sender who initiates the message. | +| target `indexed` | address | The address of target contract to call. | +| value | uint256 | The amount of value passed to the target contract. | +| messageNonce | uint256 | The nonce of the message. | +| gasLimit | uint256 | The optional gas limit passed to L1 or L2. | +| message | bytes | The calldata passed to the target contract. | ### Unpaused @@ -404,7 +404,7 @@ event Unpaused(address account) - +*Emitted when the pause is lifted by `account`.* #### Parameters @@ -426,8 +426,8 @@ Emitted when owner updates fee vault contract. | Name | Type | Description | |---|---|---| -| _oldFeeVault | address | undefined | -| _newFeeVault | address | undefined | +| _oldFeeVault | address | The address of old fee vault contract. | +| _newFeeVault | address | The address of new fee vault contract. | ### UpdateMaxFailedExecutionTimes @@ -443,8 +443,8 @@ Emitted when the maximum number of times each message can fail in L2 is updated. | Name | Type | Description | |---|---|---| -| oldMaxFailedExecutionTimes | uint256 | undefined | -| newMaxFailedExecutionTimes | uint256 | undefined | +| oldMaxFailedExecutionTimes | uint256 | The old maximum number of times each message can fail in L2. | +| newMaxFailedExecutionTimes | uint256 | The new maximum number of times each message can fail in L2. | diff --git a/contracts/docs/apis/L2StandardERC20Gateway.md b/contracts/docs/apis/L2StandardERC20Gateway.md index 7b1cc23bc..05dd24aa1 100644 --- a/contracts/docs/apis/L2StandardERC20Gateway.md +++ b/contracts/docs/apis/L2StandardERC20Gateway.md @@ -95,7 +95,7 @@ Return the corresponding l2 token address given l1 token address. ### initialize ```solidity -function initialize(address _counterpart, address _router, address _messenger, address _tokenFactory) external nonpayable +function initialize(address _counterpart, address _router, address _messenger, address) external nonpayable ``` Initialize the storage of L2StandardERC20Gateway. @@ -106,10 +106,10 @@ Initialize the storage of L2StandardERC20Gateway. | Name | Type | Description | |---|---|---| -| _counterpart | address | The address of L1ETHGateway in L1. | -| _router | address | The address of L2GatewayRouter. | -| _messenger | address | The address of L2ScrollMessenger. | -| _tokenFactory | address | The address of ScrollStandardERC20Factory. | +| _counterpart | address | The address of `L1StandardERC20Gateway` contract in L1. | +| _router | address | The address of `L2GatewayRouter` contract in L2. | +| _messenger | address | The address of `L2ScrollMessenger` contract in L2. | +| _3 | address | undefined | ### messenger @@ -281,12 +281,12 @@ Emitted when ERC20 token is deposited from L1 to L2 and transfer to recipient. | Name | Type | Description | |---|---|---| -| l1Token `indexed` | address | undefined | -| l2Token `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to | address | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | +| l1Token `indexed` | address | The address of the token in L1. | +| l2Token `indexed` | address | The address of the token in L2. | +| from `indexed` | address | The address of sender in L1. | +| to | address | The address of recipient in L2. | +| amount | uint256 | The amount of token withdrawn from L1 to L2. | +| data | bytes | The optional calldata passed to recipient in L2. | ### Initialized @@ -296,7 +296,7 @@ event Initialized(uint8 version) - +*Triggered when the contract has been initialized or reinitialized.* #### Parameters @@ -335,12 +335,12 @@ Emitted when someone withdraw ERC20 token from L2 to L1. | Name | Type | Description | |---|---|---| -| l1Token `indexed` | address | undefined | -| l2Token `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to | address | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | +| l1Token `indexed` | address | The address of the token in L1. | +| l2Token `indexed` | address | The address of the token in L2. | +| from `indexed` | address | The address of sender in L2. | +| to | address | The address of recipient in L1. | +| amount | uint256 | The amount of token will be deposited from L2 to L1. | +| data | bytes | The optional calldata passed to recipient in L1. | diff --git a/contracts/docs/apis/L2WETHGateway.md b/contracts/docs/apis/L2WETHGateway.md index 37fcc6465..129addae6 100644 --- a/contracts/docs/apis/L2WETHGateway.md +++ b/contracts/docs/apis/L2WETHGateway.md @@ -297,12 +297,12 @@ Emitted when ERC20 token is deposited from L1 to L2 and transfer to recipient. | Name | Type | Description | |---|---|---| -| l1Token `indexed` | address | undefined | -| l2Token `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to | address | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | +| l1Token `indexed` | address | The address of the token in L1. | +| l2Token `indexed` | address | The address of the token in L2. | +| from `indexed` | address | The address of sender in L1. | +| to | address | The address of recipient in L2. | +| amount | uint256 | The amount of token withdrawn from L1 to L2. | +| data | bytes | The optional calldata passed to recipient in L2. | ### Initialized @@ -312,7 +312,7 @@ event Initialized(uint8 version) - +*Triggered when the contract has been initialized or reinitialized.* #### Parameters @@ -351,12 +351,12 @@ Emitted when someone withdraw ERC20 token from L2 to L1. | Name | Type | Description | |---|---|---| -| l1Token `indexed` | address | undefined | -| l2Token `indexed` | address | undefined | -| from `indexed` | address | undefined | -| to | address | undefined | -| amount | uint256 | undefined | -| data | bytes | undefined | +| l1Token `indexed` | address | The address of the token in L1. | +| l2Token `indexed` | address | The address of the token in L2. | +| from `indexed` | address | The address of sender in L2. | +| to | address | The address of recipient in L1. | +| amount | uint256 | The amount of token will be deposited from L2 to L1. | +| data | bytes | The optional calldata passed to recipient in L1. | diff --git a/contracts/docs/apis/ScrollChain.md b/contracts/docs/apis/ScrollChain.md index 1a1ad2110..d38202d9c 100644 --- a/contracts/docs/apis/ScrollChain.md +++ b/contracts/docs/apis/ScrollChain.md @@ -110,7 +110,7 @@ function finalizeBatchWithProof(bytes _batchHeader, bytes32 _prevStateRoot, byte Finalize a committed batch on layer 1. - +*We keep this function to upgrade to 4844 more smoothly.* #### Parameters @@ -122,6 +122,27 @@ Finalize a committed batch on layer 1. | _withdrawRoot | bytes32 | undefined | | _aggrProof | bytes | undefined | +### finalizeBatchWithProof4844 + +```solidity +function finalizeBatchWithProof4844(bytes _batchHeader, bytes32 _prevStateRoot, bytes32 _postStateRoot, bytes32 _withdrawRoot, bytes _blobDataProof, bytes _aggrProof) external nonpayable +``` + +Finalize a committed batch (with blob) on layer 1. + +*Memory layout of `_blobDataProof`: ```text | z | y | kzg_commitment | kzg_proof | |---------|---------|----------------|-----------| | bytes32 | bytes32 | bytes48 | bytes48 | ```* + +#### Parameters + +| Name | Type | Description | +|---|---|---| +| _batchHeader | bytes | undefined | +| _prevStateRoot | bytes32 | undefined | +| _postStateRoot | bytes32 | undefined | +| _withdrawRoot | bytes32 | undefined | +| _blobDataProof | bytes | undefined | +| _aggrProof | bytes | undefined | + ### finalizedStateRoots ```solidity @@ -512,8 +533,8 @@ Emitted when a new batch is committed. | Name | Type | Description | |---|---|---| -| batchIndex `indexed` | uint256 | undefined | -| batchHash `indexed` | bytes32 | undefined | +| batchIndex `indexed` | uint256 | The index of the batch. | +| batchHash `indexed` | bytes32 | The hash of the batch. | ### FinalizeBatch @@ -529,10 +550,10 @@ Emitted when a batch is finalized. | Name | Type | Description | |---|---|---| -| batchIndex `indexed` | uint256 | undefined | -| batchHash `indexed` | bytes32 | undefined | -| stateRoot | bytes32 | undefined | -| withdrawRoot | bytes32 | undefined | +| batchIndex `indexed` | uint256 | The index of the batch. | +| batchHash `indexed` | bytes32 | The hash of the batch | +| stateRoot | bytes32 | The state root on layer 2 after this batch. | +| withdrawRoot | bytes32 | The merkle root on layer2 after this batch. | ### Initialized @@ -542,7 +563,7 @@ event Initialized(uint8 version) - +*Triggered when the contract has been initialized or reinitialized.* #### Parameters @@ -575,7 +596,7 @@ event Paused(address account) - +*Emitted when the pause is triggered by `account`.* #### Parameters @@ -597,8 +618,8 @@ revert a pending batch. | Name | Type | Description | |---|---|---| -| batchIndex `indexed` | uint256 | undefined | -| batchHash `indexed` | bytes32 | undefined | +| batchIndex `indexed` | uint256 | The index of the batch. | +| batchHash `indexed` | bytes32 | The hash of the batch | ### Unpaused @@ -608,7 +629,7 @@ event Unpaused(address account) - +*Emitted when the pause is lifted by `account`.* #### Parameters @@ -671,6 +692,347 @@ Emitted when owner updates the status of sequencer. ## Errors +### ErrorAccountIsNotEOA + +```solidity +error ErrorAccountIsNotEOA() +``` + + + +*Thrown when the given account is not EOA account.* + + +### ErrorBatchHeaderLengthTooSmall + +```solidity +error ErrorBatchHeaderLengthTooSmall() +``` + + + +*Thrown when the length of batch header is smaller than 89* + + +### ErrorBatchIsAlreadyCommitted + +```solidity +error ErrorBatchIsAlreadyCommitted() +``` + + + +*Thrown when committing a committed batch.* + + +### ErrorBatchIsAlreadyVerified + +```solidity +error ErrorBatchIsAlreadyVerified() +``` + + + +*Thrown when finalizing a verified batch.* + + +### ErrorBatchIsEmpty + +```solidity +error ErrorBatchIsEmpty() +``` + + + +*Thrown when committing empty batch (batch without chunks)* + + +### ErrorCallPointEvaluationPrecompileFailed + +```solidity +error ErrorCallPointEvaluationPrecompileFailed() +``` + + + +*Thrown when call precompile failed.* + + +### ErrorCallerIsNotProver + +```solidity +error ErrorCallerIsNotProver() +``` + + + +*Thrown when the caller is not prover.* + + +### ErrorCallerIsNotSequencer + +```solidity +error ErrorCallerIsNotSequencer() +``` + + + +*Thrown when the caller is not sequencer.* + + +### ErrorFoundMultipleBlob + +```solidity +error ErrorFoundMultipleBlob() +``` + + + +*Thrown when the transaction has multiple blobs.* + + +### ErrorGenesisBatchHasNonZeroField + +```solidity +error ErrorGenesisBatchHasNonZeroField() +``` + + + +*Thrown when some fields are not zero in genesis batch.* + + +### ErrorGenesisBatchImported + +```solidity +error ErrorGenesisBatchImported() +``` + + + +*Thrown when importing genesis batch twice.* + + +### ErrorGenesisDataHashIsZero + +```solidity +error ErrorGenesisDataHashIsZero() +``` + + + +*Thrown when data hash in genesis batch is zero.* + + +### ErrorGenesisParentBatchHashIsNonZero + +```solidity +error ErrorGenesisParentBatchHashIsNonZero() +``` + + + +*Thrown when the parent batch hash in genesis batch is zero.* + + +### ErrorIncompleteL2TransactionData + +```solidity +error ErrorIncompleteL2TransactionData() +``` + + + +*Thrown when the l2 transaction is incomplete.* + + +### ErrorIncorrectBatchHash + +```solidity +error ErrorIncorrectBatchHash() +``` + + + +*Thrown when the batch hash is incorrect.* + + +### ErrorIncorrectBatchIndex + +```solidity +error ErrorIncorrectBatchIndex() +``` + + + +*Thrown when the batch index is incorrect.* + + +### ErrorIncorrectBitmapLength + +```solidity +error ErrorIncorrectBitmapLength() +``` + + + +*Thrown when the bitmap length is incorrect.* + + +### ErrorIncorrectChunkLength + +```solidity +error ErrorIncorrectChunkLength() +``` + + + +*Thrown when the length of chunk is incorrect.* + + +### ErrorIncorrectPreviousStateRoot + +```solidity +error ErrorIncorrectPreviousStateRoot() +``` + + + +*Thrown when the previous state root doesn't match stored one.* + + +### ErrorInvalidBatchHeaderVersion + +```solidity +error ErrorInvalidBatchHeaderVersion() +``` + + + +*Thrown when the batch header version is invalid.* + + +### ErrorLastL1MessageSkipped + +```solidity +error ErrorLastL1MessageSkipped() +``` + + + +*Thrown when the last message is skipped.* + + +### ErrorNoBlobFound + +```solidity +error ErrorNoBlobFound() +``` + + + +*Thrown when no blob found in the transaction.* + + +### ErrorNoBlockInChunk + +```solidity +error ErrorNoBlockInChunk() +``` + + + +*Thrown when no blocks in chunk.* + + +### ErrorNumTxsLessThanNumL1Msgs + +```solidity +error ErrorNumTxsLessThanNumL1Msgs() +``` + + + +*Thrown when the number of transactions is less than number of L1 message in one block.* + + +### ErrorPreviousStateRootIsZero + +```solidity +error ErrorPreviousStateRootIsZero() +``` + + + +*Thrown when the given previous state is zero.* + + +### ErrorRevertFinalizedBatch + +```solidity +error ErrorRevertFinalizedBatch() +``` + + + +*Thrown when reverting a finialized batch.* + + +### ErrorRevertNotStartFromEnd + +```solidity +error ErrorRevertNotStartFromEnd() +``` + + + +*Thrown when the reverted batches are not in the ending of commited batch chain.* + + +### ErrorRevertZeroBatches + +```solidity +error ErrorRevertZeroBatches() +``` + + + +*Thrown when the number of batches to revert is zero.* + + +### ErrorStateRootIsZero + +```solidity +error ErrorStateRootIsZero() +``` + + + +*Thrown when the given state root is zero.* + + +### ErrorTooManyTxsInOneChunk + +```solidity +error ErrorTooManyTxsInOneChunk() +``` + + + +*Thrown when a chunk contains too many transactions.* + + +### ErrorUnexpectedPointEvaluationPrecompileOutput + +```solidity +error ErrorUnexpectedPointEvaluationPrecompileOutput() +``` + + + +*Thrown when the precompile output is incorrect.* + + ### ErrorZeroAddress ```solidity diff --git a/contracts/docs/apis/ScrollStandardERC20Factory.md b/contracts/docs/apis/ScrollStandardERC20Factory.md index 3a8c0e409..68609ca69 100644 --- a/contracts/docs/apis/ScrollStandardERC20Factory.md +++ b/contracts/docs/apis/ScrollStandardERC20Factory.md @@ -135,8 +135,8 @@ Emitted when a l2 token is deployed. | Name | Type | Description | |---|---|---| -| _l1Token `indexed` | address | undefined | -| _l2Token `indexed` | address | undefined | +| _l1Token `indexed` | address | The address of the l1 token. | +| _l2Token `indexed` | address | The address of the l2 token. | ### OwnershipTransferred diff --git a/contracts/foundry.toml b/contracts/foundry.toml index bff45c75e..3ea34d7a4 100644 --- a/contracts/foundry.toml +++ b/contracts/foundry.toml @@ -8,8 +8,8 @@ remappings = [] # a list of remapp libraries = [] # a list of deployed libraries to link against cache = true # whether to cache builds or not force = true # whether to ignore the cache (clean build) -evm_version = 'london' # the evm version (by hardfork name) -solc_version = '0.8.16' # override for the solc version (setting this ignores `auto_detect_solc`) +# evm_version = 'london' # the evm version (by hardfork name) +solc_version = '0.8.24' # override for the solc version (setting this ignores `auto_detect_solc`) optimizer = true # enable or disable the solc optimizer optimizer_runs = 200 # the number of optimizer runs verbosity = 2 # the verbosity of tests diff --git a/contracts/hardhat.config.ts b/contracts/hardhat.config.ts index 7fb93c7c2..07a5afe17 100644 --- a/contracts/hardhat.config.ts +++ b/contracts/hardhat.config.ts @@ -2,8 +2,9 @@ import * as dotenv from "dotenv"; import { HardhatUserConfig, subtask } from "hardhat/config"; import * as toml from "toml"; -import "@nomiclabs/hardhat-etherscan"; -import "@nomiclabs/hardhat-waffle"; +import "@nomicfoundation/hardhat-verify"; +import "@nomicfoundation/hardhat-ethers"; +import "@nomicfoundation/hardhat-chai-matchers"; import "@typechain/hardhat"; import "@primitivefi/hardhat-dodoc"; import "hardhat-gas-reporter"; @@ -13,16 +14,10 @@ import { TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS } from "hardhat/builtin-tasks/ta dotenv.config(); -// default values here to avoid failures when running hardhat -const RINKEBY_RPC = process.env.RINKEBY_RPC || "1".repeat(32); -const SCROLL_L1_RPC = process.env.SCROLL_L1_RPC || "1".repeat(32); -const SCROLL_L2_RPC = process.env.SCROLL_L2_RPC || "1".repeat(32); - -const RINKEBY_PRIVATE_KEY = process.env.RINKEBY_PRIVATE_KEY || "1".repeat(64); const L1_DEPLOYER_PRIVATE_KEY = process.env.L1_DEPLOYER_PRIVATE_KEY || "1".repeat(64); const L2_DEPLOYER_PRIVATE_KEY = process.env.L2_DEPLOYER_PRIVATE_KEY || "1".repeat(64); -const SOLC_DEFAULT = "0.8.16"; +const SOLC_DEFAULT = "0.8.24"; // try use forge config let foundry: any; @@ -45,29 +40,30 @@ subtask(TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS).setAction(async (_, __, runSuper const config: HardhatUserConfig = { solidity: { - version: foundry.default?.solc || SOLC_DEFAULT, + version: foundry.default?.solc_version || SOLC_DEFAULT, settings: { optimizer: { enabled: foundry.default?.optimizer || true, runs: foundry.default?.optimizer_runs || 200, }, + evmVersion: "cancun", }, }, networks: { - rinkeby: { - url: RINKEBY_RPC, - accounts: [RINKEBY_PRIVATE_KEY], - }, - l1geth: { - url: SCROLL_L1_RPC, - gasPrice: 20000000000, - gasMultiplier: 1.1, + ethereum: { + url: "https://1rpc.io/eth", accounts: [L1_DEPLOYER_PRIVATE_KEY], }, - l2geth: { - url: SCROLL_L2_RPC, - gasPrice: 20000000000, - gasMultiplier: 1.1, + sepolia: { + url: "https://1rpc.io/sepolia", + accounts: [L1_DEPLOYER_PRIVATE_KEY], + }, + scroll: { + url: "https://rpc.scroll.io", + accounts: [L2_DEPLOYER_PRIVATE_KEY], + }, + scroll_sepolia: { + url: "https://sepolia-rpc.scroll.io", accounts: [L2_DEPLOYER_PRIVATE_KEY], }, }, @@ -76,13 +72,40 @@ const config: HardhatUserConfig = { sources: "./src", tests: "./integration-test", }, + typechain: { + outDir: "./typechain", + target: "ethers-v6", + }, gasReporter: { enabled: process.env.REPORT_GAS !== undefined, excludeContracts: ["src/test"], currency: "USD", }, etherscan: { - apiKey: process.env.ETHERSCAN_API_KEY, + apiKey: { + ethereum: process.env.ETHERSCAN_API_KEY || "", + sepolia: process.env.ETHERSCAN_API_KEY || "", + scroll: process.env.SCROLLSCAN_API_KEY || "", + scroll_sepolia: process.env.SCROLLSCAN_API_KEY || "", + }, + customChains: [ + { + network: "scroll", + chainId: 534352, + urls: { + apiURL: "https://api.scrollscan.com/api", + browserURL: "https://www.scrollscan.com/", + }, + }, + { + network: "scroll_sepolia", + chainId: 534351, + urls: { + apiURL: "https://api-sepolia.scrollscan.com/api", + browserURL: "https://sepolia.scrollscan.com/", + }, + }, + ], }, mocha: { timeout: 10000000, diff --git a/contracts/integration-test/EnforcedTxGateway.spec.ts b/contracts/integration-test/EnforcedTxGateway.spec.ts index da137e72a..4dbd76baf 100644 --- a/contracts/integration-test/EnforcedTxGateway.spec.ts +++ b/contracts/integration-test/EnforcedTxGateway.spec.ts @@ -1,16 +1,16 @@ /* eslint-disable node/no-unpublished-import */ /* eslint-disable node/no-missing-import */ +import { HardhatEthersSigner, SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; -import { BigNumberish, BytesLike, constants } from "ethers"; +import { BigNumberish, BytesLike, MaxUint256, ZeroAddress, getBytes } from "ethers"; import { ethers } from "hardhat"; + import { EnforcedTxGateway, L1MessageQueue, L2GasPriceOracle, MockCaller } from "../typechain"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; -import { arrayify } from "ethers/lib/utils"; describe("EnforcedTxGateway.spec", async () => { - let deployer: SignerWithAddress; - let feeVault: SignerWithAddress; - let signer: SignerWithAddress; + let deployer: HardhatEthersSigner; + let feeVault: HardhatEthersSigner; + let signer: HardhatEthersSigner; let caller: MockCaller; let gateway: EnforcedTxGateway; @@ -21,10 +21,8 @@ describe("EnforcedTxGateway.spec", async () => { const TransparentUpgradeableProxy = await ethers.getContractFactory("TransparentUpgradeableProxy", deployer); const Factory = await ethers.getContractFactory(name, deployer); const impl = args.length > 0 ? await Factory.deploy(...args) : await Factory.deploy(); - await impl.deployed(); - const proxy = await TransparentUpgradeableProxy.deploy(impl.address, admin, "0x"); - await proxy.deployed(); - return proxy.address; + const proxy = await TransparentUpgradeableProxy.deploy(impl.getAddress(), admin, "0x"); + return proxy.getAddress(); }; beforeEach(async () => { @@ -32,66 +30,61 @@ describe("EnforcedTxGateway.spec", async () => { const ProxyAdmin = await ethers.getContractFactory("ProxyAdmin", deployer); const admin = await ProxyAdmin.deploy(); - await admin.deployed(); gateway = await ethers.getContractAt( "EnforcedTxGateway", - await deployProxy("EnforcedTxGateway", admin.address, []), + await deployProxy("EnforcedTxGateway", await admin.getAddress(), []), deployer ); queue = await ethers.getContractAt( "L1MessageQueue", - await deployProxy("L1MessageQueue", admin.address, [deployer.address, deployer.address, gateway.address]), + await deployProxy("L1MessageQueue", await admin.getAddress(), [ + deployer.address, + deployer.address, + await gateway.getAddress(), + ]), deployer ); oracle = await ethers.getContractAt( "L2GasPriceOracle", - await deployProxy("L2GasPriceOracle", admin.address, []), + await deployProxy("L2GasPriceOracle", await admin.getAddress(), []), deployer ); const MockCaller = await ethers.getContractFactory("MockCaller", deployer); caller = await MockCaller.deploy(); - await caller.deployed(); - await queue.initialize( - constants.AddressZero, - constants.AddressZero, - constants.AddressZero, - oracle.address, - 10000000 - ); - await gateway.initialize(queue.address, feeVault.address); + await queue.initialize(ZeroAddress, ZeroAddress, ZeroAddress, oracle.getAddress(), 10000000); + await gateway.initialize(queue.getAddress(), feeVault.address); await oracle.initialize(21000, 51000, 8, 16); const Whitelist = await ethers.getContractFactory("Whitelist", deployer); const whitelist = await Whitelist.deploy(deployer.address); - await whitelist.deployed(); await whitelist.updateWhitelistStatus([deployer.address], true); - await oracle.updateWhitelist(whitelist.address); + await oracle.updateWhitelist(whitelist.getAddress()); await oracle.setL2BaseFee(1); }); context("auth", async () => { it("should initialize correctly", async () => { expect(await gateway.owner()).to.eq(deployer.address); - expect(await gateway.messageQueue()).to.eq(queue.address); + expect(await gateway.messageQueue()).to.eq(await queue.getAddress()); expect(await gateway.feeVault()).to.eq(feeVault.address); expect(await gateway.paused()).to.eq(false); }); it("should revert, when initialize again", async () => { - await expect(gateway.initialize(constants.AddressZero, constants.AddressZero)).to.revertedWith( + await expect(gateway.initialize(ZeroAddress, ZeroAddress)).to.revertedWith( "Initializable: contract is already initialized" ); }); context("#updateFeeVault", async () => { it("should revert, when non-owner call", async () => { - await expect(gateway.connect(signer).updateFeeVault(constants.AddressZero)).to.revertedWith( + await expect(gateway.connect(signer).updateFeeVault(ZeroAddress)).to.revertedWith( "Ownable: caller is not the owner" ); }); @@ -129,13 +122,13 @@ describe("EnforcedTxGateway.spec", async () => { }); it("should revert, when call is not EOA", async () => { - const tx = await gateway.populateTransaction["sendTransaction(address,uint256,uint256,bytes)"]( + const calldata = gateway.interface.encodeFunctionData("sendTransaction(address,uint256,uint256,bytes)", [ signer.address, 0, 0, - "0x" - ); - await expect(caller.callTarget(gateway.address, tx.data!)).to.revertedWith( + "0x", + ]); + await expect(caller.callTarget(gateway.getAddress(), calldata)).to.revertedWith( "Only EOA senders are allowed to send enforced transaction" ); }); @@ -145,12 +138,12 @@ describe("EnforcedTxGateway.spec", async () => { await expect( gateway .connect(signer) - ["sendTransaction(address,uint256,uint256,bytes)"](signer.address, 0, 1000000, "0x", { value: fee.sub(1) }) + ["sendTransaction(address,uint256,uint256,bytes)"](signer.address, 0, 1000000, "0x", { value: fee - 1n }) ).to.revertedWith("Insufficient value for fee"); }); it("should revert, when failed to deduct the fee", async () => { - await gateway.updateFeeVault(gateway.address); + await gateway.updateFeeVault(gateway.getAddress()); const fee = await queue.estimateCrossDomainMessageFee(1000000); await expect( gateway @@ -170,7 +163,7 @@ describe("EnforcedTxGateway.spec", async () => { .to.emit(queue, "QueueTransaction") .withArgs(signer.address, deployer.address, 0, 0, 1000000, "0x"); const feeVaultBalanceAfter = await ethers.provider.getBalance(feeVault.address); - expect(feeVaultBalanceAfter.sub(feeVaultBalanceBefore)).to.eq(fee); + expect(feeVaultBalanceAfter - feeVaultBalanceBefore).to.eq(fee); }); it("should succeed, with refund", async () => { @@ -179,17 +172,15 @@ describe("EnforcedTxGateway.spec", async () => { const signerBalanceBefore = await ethers.provider.getBalance(signer.address); const tx = await gateway .connect(signer) - ["sendTransaction(address,uint256,uint256,bytes)"](deployer.address, 0, 1000000, "0x", { value: fee.add(100) }); + ["sendTransaction(address,uint256,uint256,bytes)"](deployer.address, 0, 1000000, "0x", { value: fee + 100n }); await expect(tx) .to.emit(queue, "QueueTransaction") .withArgs(signer.address, deployer.address, 0, 0, 1000000, "0x"); const receipt = await tx.wait(); const feeVaultBalanceAfter = await ethers.provider.getBalance(feeVault.address); const signerBalanceAfter = await ethers.provider.getBalance(signer.address); - expect(feeVaultBalanceAfter.sub(feeVaultBalanceBefore)).to.eq(fee); - expect(signerBalanceBefore.sub(signerBalanceAfter)).to.eq( - receipt.gasUsed.mul(receipt.effectiveGasPrice).add(fee) - ); + expect(feeVaultBalanceAfter - feeVaultBalanceBefore).to.eq(fee); + expect(signerBalanceBefore - signerBalanceAfter).to.eq(receipt!.gasUsed * receipt!.gasPrice + fee); }); }); @@ -203,19 +194,19 @@ describe("EnforcedTxGateway.spec", async () => { ) => { const enforcedTx = { sender: signer.address, - target: target, - value: value, - gasLimit: gasLimit, - data: arrayify(data), + target, + value, + gasLimit, + data: getBytes(data), nonce: await gateway.nonces(signer.address), - deadline: constants.MaxUint256, + deadline: MaxUint256, }; const domain = { name: "EnforcedTxGateway", version: "1", chainId: (await ethers.provider.getNetwork()).chainId, - verifyingContract: gateway.address, + verifyingContract: await gateway.getAddress(), }; const types = { @@ -251,7 +242,7 @@ describe("EnforcedTxGateway.spec", async () => { ], }; - const signature = await signer._signTypedData(domain, types, enforcedTx); + const signature = await signer.signTypedData(domain, types, enforcedTx); return signature; }; @@ -266,15 +257,15 @@ describe("EnforcedTxGateway.spec", async () => { 0, 0, "0x", - constants.MaxUint256, + MaxUint256, "0x", - constants.AddressZero + ZeroAddress ) ).to.revertedWith("Pausable: paused"); }); it("should revert, when signature expired", async () => { - const timestamp = (await ethers.provider.getBlock("latest")).timestamp; + const timestamp = (await ethers.provider.getBlock("latest"))!.timestamp; await expect( gateway .connect(deployer) @@ -286,7 +277,7 @@ describe("EnforcedTxGateway.spec", async () => { "0x", timestamp - 1, "0x", - constants.AddressZero + ZeroAddress ) ).to.revertedWith("signature expired"); }); @@ -302,9 +293,9 @@ describe("EnforcedTxGateway.spec", async () => { 0, 0, "0x", - constants.MaxUint256, + MaxUint256, signature, - constants.AddressZero + ZeroAddress ) ).to.revertedWith("Incorrect signature"); }); @@ -321,16 +312,16 @@ describe("EnforcedTxGateway.spec", async () => { 0, 1000000, "0x", - constants.MaxUint256, + MaxUint256, signature, signer.address, - { value: fee.sub(1) } + { value: fee - 1n } ) ).to.revertedWith("Insufficient value for fee"); }); it("should revert, when failed to deduct the fee", async () => { - await gateway.updateFeeVault(gateway.address); + await gateway.updateFeeVault(gateway.getAddress()); const signature = await getSignature(signer, signer.address, 0, 1000000, "0x"); const fee = await queue.estimateCrossDomainMessageFee(1000000); await expect( @@ -342,7 +333,7 @@ describe("EnforcedTxGateway.spec", async () => { 0, 1000000, "0x", - constants.MaxUint256, + MaxUint256, signature, signer.address, { value: fee } @@ -364,7 +355,7 @@ describe("EnforcedTxGateway.spec", async () => { 0, 1000000, "0x", - constants.MaxUint256, + MaxUint256, signature, signer.address, { value: fee } @@ -374,7 +365,7 @@ describe("EnforcedTxGateway.spec", async () => { .withArgs(signer.address, deployer.address, 0, 0, 1000000, "0x"); expect(await gateway.nonces(signer.address)).to.eq(1); const feeVaultBalanceAfter = await ethers.provider.getBalance(feeVault.address); - expect(feeVaultBalanceAfter.sub(feeVaultBalanceBefore)).to.eq(fee); + expect(feeVaultBalanceAfter - feeVaultBalanceBefore).to.eq(fee); // use the same nonce to sign should fail await expect( @@ -386,7 +377,7 @@ describe("EnforcedTxGateway.spec", async () => { 0, 1000000, "0x", - constants.MaxUint256, + MaxUint256, signature, signer.address, { value: fee } @@ -409,10 +400,10 @@ describe("EnforcedTxGateway.spec", async () => { 0, 1000000, "0x", - constants.MaxUint256, + MaxUint256, signature, signer.address, - { value: fee.add(100) } + { value: fee + 100n } ) ) .to.emit(queue, "QueueTransaction") @@ -420,8 +411,8 @@ describe("EnforcedTxGateway.spec", async () => { expect(await gateway.nonces(signer.address)).to.eq(1); const feeVaultBalanceAfter = await ethers.provider.getBalance(feeVault.address); const signerBalanceAfter = await ethers.provider.getBalance(signer.address); - expect(feeVaultBalanceAfter.sub(feeVaultBalanceBefore)).to.eq(fee); - expect(signerBalanceAfter.sub(signerBalanceBefore)).to.eq(100); + expect(feeVaultBalanceAfter - feeVaultBalanceBefore).to.eq(fee); + expect(signerBalanceAfter - signerBalanceBefore).to.eq(100n); // use the same nonce to sign should fail await expect( @@ -433,10 +424,10 @@ describe("EnforcedTxGateway.spec", async () => { 0, 1000000, "0x", - constants.MaxUint256, + MaxUint256, signature, signer.address, - { value: fee.add(100) } + { value: fee + 100n } ) ).to.revertedWith("Incorrect signature"); }); @@ -453,10 +444,10 @@ describe("EnforcedTxGateway.spec", async () => { 0, 1000000, "0x1234", - constants.MaxUint256, + MaxUint256, signature, - gateway.address, - { value: fee.add(100) } + gateway.getAddress(), + { value: fee + 100n } ) ).to.revertedWith("Failed to refund the fee"); }); diff --git a/contracts/integration-test/GasOptimizationUpgrade.spec.ts b/contracts/integration-test/GasOptimizationUpgrade.spec.ts index c8def1326..b641bb2ec 100644 --- a/contracts/integration-test/GasOptimizationUpgrade.spec.ts +++ b/contracts/integration-test/GasOptimizationUpgrade.spec.ts @@ -1,9 +1,8 @@ /* eslint-disable node/no-missing-import */ /* eslint-disable node/no-unpublished-import */ -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; +import { HardhatEthersSigner } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; -import { BigNumber, BigNumberish, ContractTransaction, constants } from "ethers"; -import { keccak256 } from "ethers/lib/utils"; +import { BigNumberish, ContractTransactionResponse, MaxUint256, keccak256, toQuantity } from "ethers"; import { ethers, network } from "hardhat"; import { @@ -24,31 +23,27 @@ describe("GasOptimizationUpgrade.spec", async () => { const L2_MESSAGE_QUEUE = "0x5300000000000000000000000000000000000000"; const SCROLL_CHAIN = "0xa13BAF47339d63B743e7Da8741db5456DAc1E556"; - let deployer: SignerWithAddress; + let deployer: HardhatEthersSigner; let proxyAdmin: ProxyAdmin; - const mockERC20Balance = async (tokenAddress: string, balance: BigNumber, slot: BigNumberish) => { + const mockERC20Balance = async (tokenAddress: string, balance: bigint, slot: BigNumberish) => { const storageSlot = keccak256( - ethers.utils.defaultAbiCoder.encode(["address", "uint256"], [deployer.address, slot]) + ethers.AbiCoder.defaultAbiCoder().encode(["address", "uint256"], [deployer.address, slot]) ); - await ethers.provider.send("hardhat_setStorageAt", [ - tokenAddress, - storageSlot, - ethers.utils.hexlify(ethers.utils.zeroPad(balance.toHexString(), 32)), - ]); + await ethers.provider.send("hardhat_setStorageAt", [tokenAddress, storageSlot, toQuantity(balance)]); const token = await ethers.getContractAt("MockERC20", tokenAddress, deployer); expect(await token.balanceOf(deployer.address)).to.eq(balance); }; - const mockETHBalance = async (balance: BigNumber) => { - await network.provider.send("hardhat_setBalance", [deployer.address, balance.toHexString()]); - expect(await deployer.getBalance()).to.eq(balance); + const mockETHBalance = async (balance: bigint) => { + await network.provider.send("hardhat_setBalance", [deployer.address, toQuantity(balance)]); + expect(await ethers.provider.getBalance(deployer.address)).to.eq(balance); }; - const showGasUsage = async (tx: ContractTransaction, desc: string) => { + const showGasUsage = async (tx: ContractTransactionResponse, desc: string) => { const receipt = await tx.wait(); - console.log(`${desc}: GasUsed[${receipt.gasUsed}]`); + console.log(`${desc}: GasUsed[${receipt!.gasUsed}]`); }; context("L1 upgrade", async () => { @@ -59,7 +54,7 @@ describe("GasOptimizationUpgrade.spec", async () => { beforeEach(async () => { // fork network - const provider = new ethers.providers.JsonRpcProvider("https://rpc.ankr.com/eth"); + const provider = new ethers.JsonRpcProvider("https://rpc.ankr.com/eth"); if (!forkBlock) { forkBlock = (await provider.getBlockNumber()) - 10; } @@ -81,14 +76,14 @@ describe("GasOptimizationUpgrade.spec", async () => { // mock eth balance deployer = await ethers.getSigner("0x1100000000000000000000000000000000000011"); - await mockETHBalance(ethers.utils.parseEther("1000")); + await mockETHBalance(ethers.parseEther("1000")); // mock owner of proxy admin proxyAdmin = await ethers.getContractAt("ProxyAdmin", "0xEB803eb3F501998126bf37bB823646Ed3D59d072", deployer); await ethers.provider.send("hardhat_setStorageAt", [ - proxyAdmin.address, + await proxyAdmin.getAddress(), "0x0", - ethers.utils.hexlify(ethers.utils.zeroPad(deployer.address, 32)), + ethers.AbiCoder.defaultAbiCoder().encode(["address"], [deployer.address]), ]); expect(await proxyAdmin.owner()).to.eq(deployer.address); @@ -107,9 +102,7 @@ describe("GasOptimizationUpgrade.spec", async () => { const ScrollChain = await ethers.getContractFactory("ScrollChain", deployer); await proxyAdmin.upgrade( L1_MESSENGER, - ( - await L1ScrollMessenger.deploy(L2_MESSENGER, SCROLL_CHAIN, L1_MESSAGE_QUEUE) - ).address + (await L1ScrollMessenger.deploy(L2_MESSENGER, SCROLL_CHAIN, L1_MESSAGE_QUEUE)).getAddress() ); await proxyAdmin.upgrade( L1_MESSAGE_QUEUE, @@ -119,14 +112,12 @@ describe("GasOptimizationUpgrade.spec", async () => { SCROLL_CHAIN, "0x72CAcBcfDe2d1e19122F8A36a4d6676cd39d7A5d" ) - ).address + ).getAddress() ); await queue.initializeV2(); await proxyAdmin.upgrade( SCROLL_CHAIN, - ( - await ScrollChain.deploy(534352, L1_MESSAGE_QUEUE, "0xA2Ab526e5C5491F10FC05A55F064BF9F7CEf32a0") - ).address + (await ScrollChain.deploy(534352, L1_MESSAGE_QUEUE, "0xA2Ab526e5C5491F10FC05A55F064BF9F7CEf32a0")).getAddress() ); }; @@ -136,40 +127,40 @@ describe("GasOptimizationUpgrade.spec", async () => { const L1ETHGateway = await ethers.getContractFactory("L1ETHGateway", deployer); const impl = await L1ETHGateway.deploy(L2_GATEWAY, L1_ROUTER, L1_MESSENGER); const gateway = await ethers.getContractAt("L1ETHGateway", L1_GATEWAY, deployer); - const amountIn = ethers.utils.parseEther("1"); + const amountIn = ethers.parseEther("1"); const fee = await queue.estimateCrossDomainMessageFee(1e6); // before upgrade await showGasUsage( - await gateway["depositETH(uint256,uint256)"](amountIn, 1e6, { value: amountIn.add(fee) }), + await gateway["depositETH(uint256,uint256)"](amountIn, 1e6, { value: amountIn + fee }), "L1ETHGateway.depositETH before upgrade" ); await showGasUsage( - await router["depositETH(uint256,uint256)"](amountIn, 1e6, { value: amountIn.add(fee) }), + await router["depositETH(uint256,uint256)"](amountIn, 1e6, { value: amountIn + fee }), "L1GatewayRouter.depositETH before upgrade" ); await showGasUsage( await messenger["sendMessage(address,uint256,bytes,uint256)"](deployer.address, amountIn, "0x", 1e6, { - value: amountIn.add(fee), + value: amountIn + fee, }), "L1ScrollMessenger.sendMessage before upgrade" ); // do upgrade - await upgradeL1(L1_GATEWAY, impl.address); + await upgradeL1(L1_GATEWAY, await impl.getAddress()); // after upgrade await showGasUsage( - await gateway["depositETH(uint256,uint256)"](amountIn, 1e6, { value: amountIn.add(fee) }), + await gateway["depositETH(uint256,uint256)"](amountIn, 1e6, { value: amountIn + fee }), "L1ETHGateway.depositETH after upgrade" ); await showGasUsage( - await router["depositETH(uint256,uint256)"](amountIn, 1e6, { value: amountIn.add(fee) }), + await router["depositETH(uint256,uint256)"](amountIn, 1e6, { value: amountIn + fee }), "L1GatewayRouter.depositETH after upgrade" ); await showGasUsage( await messenger["sendMessage(address,uint256,bytes,uint256)"](deployer.address, amountIn, "0x", 1e6, { - value: amountIn.add(fee), + value: amountIn + fee, }), "L1ScrollMessenger.sendMessage after upgrade" ); @@ -183,12 +174,12 @@ describe("GasOptimizationUpgrade.spec", async () => { const L1WETHGateway = await ethers.getContractFactory("L1WETHGateway", deployer); const impl = await L1WETHGateway.deploy(L1_WETH, L2_WETH, L2_GATEWAY, L1_ROUTER, L1_MESSENGER); const gateway = await ethers.getContractAt("L1WETHGateway", L1_GATEWAY, deployer); - const amountIn = ethers.utils.parseEther("1"); + const amountIn = ethers.parseEther("1"); const fee = await queue.estimateCrossDomainMessageFee(1e6); const token = await ethers.getContractAt("MockERC20", L1_WETH, deployer); - await mockERC20Balance(token.address, amountIn.mul(10), 3); - await token.approve(L1_GATEWAY, constants.MaxUint256); - await token.approve(L1_ROUTER, constants.MaxUint256); + await mockERC20Balance(await token.getAddress(), amountIn * 10n, 3); + await token.approve(L1_GATEWAY, MaxUint256); + await token.approve(L1_ROUTER, MaxUint256); // before upgrade await showGasUsage( @@ -201,7 +192,7 @@ describe("GasOptimizationUpgrade.spec", async () => { ); // do upgrade - await upgradeL1(L1_GATEWAY, impl.address); + await upgradeL1(L1_GATEWAY, await impl.getAddress()); // after upgrade await showGasUsage( @@ -227,12 +218,12 @@ describe("GasOptimizationUpgrade.spec", async () => { "0x66e5312EDeEAef6e80759A0F789e7914Fb401484" ); const gateway = await ethers.getContractAt("L1StandardERC20Gateway", L1_GATEWAY, deployer); - const amountIn = ethers.utils.parseUnits("1", 6); + const amountIn = ethers.parseUnits("1", 6); const fee = await queue.estimateCrossDomainMessageFee(1e6); const token = await ethers.getContractAt("MockERC20", L1_USDT, deployer); - await mockERC20Balance(token.address, amountIn.mul(10), 2); - await token.approve(L1_GATEWAY, constants.MaxUint256); - await token.approve(L1_ROUTER, constants.MaxUint256); + await mockERC20Balance(await token.getAddress(), amountIn * 10n, 2); + await token.approve(L1_GATEWAY, MaxUint256); + await token.approve(L1_ROUTER, MaxUint256); // before upgrade await showGasUsage( @@ -245,7 +236,7 @@ describe("GasOptimizationUpgrade.spec", async () => { ); // do upgrade - await upgradeL1(L1_GATEWAY, impl.address); + await upgradeL1(L1_GATEWAY, await impl.getAddress()); // after upgrade await showGasUsage( @@ -265,12 +256,12 @@ describe("GasOptimizationUpgrade.spec", async () => { const L1CustomERC20Gateway = await ethers.getContractFactory("L1CustomERC20Gateway", deployer); const impl = await L1CustomERC20Gateway.deploy(L2_GATEWAY, L1_ROUTER, L1_MESSENGER); const gateway = await ethers.getContractAt("L1CustomERC20Gateway", L1_GATEWAY, deployer); - const amountIn = ethers.utils.parseUnits("1", 18); + const amountIn = ethers.parseUnits("1", 18); const fee = await queue.estimateCrossDomainMessageFee(1e6); const token = await ethers.getContractAt("MockERC20", L1_DAI, deployer); - await mockERC20Balance(token.address, amountIn.mul(10), 2); - await token.approve(L1_GATEWAY, constants.MaxUint256); - await token.approve(L1_ROUTER, constants.MaxUint256); + await mockERC20Balance(await token.getAddress(), amountIn * 10n, 2); + await token.approve(L1_GATEWAY, MaxUint256); + await token.approve(L1_ROUTER, MaxUint256); // before upgrade await showGasUsage( @@ -283,7 +274,7 @@ describe("GasOptimizationUpgrade.spec", async () => { ); // do upgrade - await upgradeL1(L1_GATEWAY, impl.address); + await upgradeL1(L1_GATEWAY, await impl.getAddress()); // after upgrade await showGasUsage( @@ -304,12 +295,12 @@ describe("GasOptimizationUpgrade.spec", async () => { const L1USDCGateway = await ethers.getContractFactory("L1USDCGateway", deployer); const impl = await L1USDCGateway.deploy(L1_USDC, L2_USDC, L2_GATEWAY, L1_ROUTER, L1_MESSENGER); const gateway = await ethers.getContractAt("L1USDCGateway", L1_GATEWAY, deployer); - const amountIn = ethers.utils.parseUnits("1", 6); + const amountIn = ethers.parseUnits("1", 6); const fee = await queue.estimateCrossDomainMessageFee(1e6); const token = await ethers.getContractAt("MockERC20", L1_USDC, deployer); - await mockERC20Balance(token.address, amountIn.mul(10), 9); - await token.approve(L1_GATEWAY, constants.MaxUint256); - await token.approve(L1_ROUTER, constants.MaxUint256); + await mockERC20Balance(await token.getAddress(), amountIn * 10n, 9); + await token.approve(L1_GATEWAY, MaxUint256); + await token.approve(L1_ROUTER, MaxUint256); // before upgrade await showGasUsage( @@ -322,7 +313,7 @@ describe("GasOptimizationUpgrade.spec", async () => { ); // do upgrade - await upgradeL1(L1_GATEWAY, impl.address); + await upgradeL1(L1_GATEWAY, await impl.getAddress()); // after upgrade await showGasUsage( @@ -343,12 +334,12 @@ describe("GasOptimizationUpgrade.spec", async () => { const L1LidoGateway = await ethers.getContractFactory("L1LidoGateway", deployer); const impl = await L1LidoGateway.deploy(L1_WSTETH, L2_WSTETH, L2_GATEWAY, L1_ROUTER, L1_MESSENGER); const gateway = await ethers.getContractAt("L1LidoGateway", L1_GATEWAY, deployer); - const amountIn = ethers.utils.parseUnits("1", 6); + const amountIn = ethers.parseUnits("1", 6); const fee = await queue.estimateCrossDomainMessageFee(1e6); const token = await ethers.getContractAt("MockERC20", L1_WSTETH, deployer); - await mockERC20Balance(token.address, amountIn.mul(10), 0); - await token.approve(L1_GATEWAY, constants.MaxUint256); - await token.approve(L1_ROUTER, constants.MaxUint256); + await mockERC20Balance(await token.getAddress(), amountIn * 10n, 0); + await token.approve(L1_GATEWAY, MaxUint256); + await token.approve(L1_ROUTER, MaxUint256); // before upgrade await showGasUsage( @@ -361,7 +352,7 @@ describe("GasOptimizationUpgrade.spec", async () => { ); // do upgrade - await upgradeL1(L1_GATEWAY, impl.address); + await upgradeL1(L1_GATEWAY, await impl.getAddress()); await gateway.initializeV2(deployer.address, deployer.address, deployer.address, deployer.address); // after upgrade @@ -383,7 +374,7 @@ describe("GasOptimizationUpgrade.spec", async () => { beforeEach(async () => { // fork network - const provider = new ethers.providers.JsonRpcProvider("https://rpc.scroll.io"); + const provider = new ethers.JsonRpcProvider("https://rpc.scroll.io"); if (!forkBlock) { forkBlock = (await provider.getBlockNumber()) - 31; } @@ -405,14 +396,14 @@ describe("GasOptimizationUpgrade.spec", async () => { // mock eth balance deployer = await ethers.getSigner("0x1100000000000000000000000000000000000011"); - await mockETHBalance(ethers.utils.parseEther("1000")); + await mockETHBalance(ethers.parseEther("1000")); // mock owner of proxy admin proxyAdmin = await ethers.getContractAt("ProxyAdmin", "0xA76acF000C890b0DD7AEEf57627d9899F955d026", deployer); await ethers.provider.send("hardhat_setStorageAt", [ - proxyAdmin.address, + await proxyAdmin.getAddress(), "0x0", - ethers.utils.hexlify(ethers.utils.zeroPad(deployer.address, 32)), + ethers.AbiCoder.defaultAbiCoder().encode(["address"], [deployer.address]), ]); expect(await proxyAdmin.owner()).to.eq(deployer.address); @@ -423,7 +414,10 @@ describe("GasOptimizationUpgrade.spec", async () => { const upgradeL2 = async (proxy: string, impl: string) => { await proxyAdmin.upgrade(proxy, impl); const L2ScrollMessenger = await ethers.getContractFactory("L2ScrollMessenger", deployer); - await proxyAdmin.upgrade(L2_MESSENGER, (await L2ScrollMessenger.deploy(L1_MESSENGER, L2_MESSAGE_QUEUE)).address); + await proxyAdmin.upgrade( + L2_MESSENGER, + (await L2ScrollMessenger.deploy(L1_MESSENGER, L2_MESSAGE_QUEUE)).getAddress() + ); }; it.skip("should succeed on L2ETHGateway", async () => { @@ -432,7 +426,7 @@ describe("GasOptimizationUpgrade.spec", async () => { const L2ETHGateway = await ethers.getContractFactory("L2ETHGateway", deployer); const impl = await L2ETHGateway.deploy(L1_GATEWAY, L2_ROUTER, L2_MESSENGER); const gateway = await ethers.getContractAt("L2ETHGateway", L2_GATEWAY, deployer); - const amountIn = ethers.utils.parseEther("1"); + const amountIn = ethers.parseEther("1"); // before upgrade await showGasUsage( @@ -451,7 +445,7 @@ describe("GasOptimizationUpgrade.spec", async () => { ); // do upgrade - await upgradeL2(L2_GATEWAY, impl.address); + await upgradeL2(L2_GATEWAY, await impl.getAddress()); // after upgrade await showGasUsage( @@ -478,11 +472,11 @@ describe("GasOptimizationUpgrade.spec", async () => { const L2WETHGateway = await ethers.getContractFactory("L2WETHGateway", deployer); const impl = await L2WETHGateway.deploy(L2_WETH, L1_WETH, L1_GATEWAY, L2_ROUTER, L2_MESSENGER); const gateway = await ethers.getContractAt("L2WETHGateway", L2_GATEWAY, deployer); - const amountIn = ethers.utils.parseEther("1"); + const amountIn = ethers.parseEther("1"); const token = await ethers.getContractAt("MockERC20", L2_WETH, deployer); - await mockERC20Balance(token.address, amountIn.mul(10), 0); - await token.approve(L2_GATEWAY, constants.MaxUint256); - await token.approve(L2_ROUTER, constants.MaxUint256); + await mockERC20Balance(await token.getAddress(), amountIn * 10n, 0); + await token.approve(L2_GATEWAY, MaxUint256); + await token.approve(L2_ROUTER, MaxUint256); // before upgrade await showGasUsage( @@ -495,7 +489,7 @@ describe("GasOptimizationUpgrade.spec", async () => { ); // do upgrade - await upgradeL2(L2_GATEWAY, impl.address); + await upgradeL2(L2_GATEWAY, await impl.getAddress()); // after upgrade await showGasUsage( @@ -520,11 +514,11 @@ describe("GasOptimizationUpgrade.spec", async () => { "0x66e5312EDeEAef6e80759A0F789e7914Fb401484" ); const gateway = await ethers.getContractAt("L2StandardERC20Gateway", L2_GATEWAY, deployer); - const amountIn = ethers.utils.parseUnits("1", 6); + const amountIn = ethers.parseUnits("1", 6); const token = await ethers.getContractAt("MockERC20", L2_USDT, deployer); - await mockERC20Balance(token.address, amountIn.mul(10), 51); - await token.approve(L2_GATEWAY, constants.MaxUint256); - await token.approve(L2_ROUTER, constants.MaxUint256); + await mockERC20Balance(await token.getAddress(), amountIn * 10n, 51); + await token.approve(L2_GATEWAY, MaxUint256); + await token.approve(L2_ROUTER, MaxUint256); // before upgrade await showGasUsage( @@ -537,7 +531,7 @@ describe("GasOptimizationUpgrade.spec", async () => { ); // do upgrade - await upgradeL2(L2_GATEWAY, impl.address); + await upgradeL2(L2_GATEWAY, await impl.getAddress()); // after upgrade await showGasUsage( @@ -557,11 +551,11 @@ describe("GasOptimizationUpgrade.spec", async () => { const L2CustomERC20Gateway = await ethers.getContractFactory("L2CustomERC20Gateway", deployer); const impl = await L2CustomERC20Gateway.deploy(L1_GATEWAY, L2_ROUTER, L2_MESSENGER); const gateway = await ethers.getContractAt("L2CustomERC20Gateway", L2_GATEWAY, deployer); - const amountIn = ethers.utils.parseUnits("1", 18); + const amountIn = ethers.parseUnits("1", 18); const token = await ethers.getContractAt("MockERC20", L2_DAI, deployer); - await mockERC20Balance(token.address, amountIn.mul(10), 51); - await token.approve(L1_GATEWAY, constants.MaxUint256); - await token.approve(L1_ROUTER, constants.MaxUint256); + await mockERC20Balance(await token.getAddress(), amountIn * 10n, 51); + await token.approve(L1_GATEWAY, MaxUint256); + await token.approve(L1_ROUTER, MaxUint256); // before upgrade await showGasUsage( @@ -574,7 +568,7 @@ describe("GasOptimizationUpgrade.spec", async () => { ); // do upgrade - await upgradeL2(L2_GATEWAY, impl.address); + await upgradeL2(L2_GATEWAY, await impl.getAddress()); // after upgrade await showGasUsage( @@ -595,11 +589,11 @@ describe("GasOptimizationUpgrade.spec", async () => { const L2USDCGateway = await ethers.getContractFactory("L2USDCGateway", deployer); const impl = await L2USDCGateway.deploy(L1_USDC, L2_USDC, L1_GATEWAY, L2_ROUTER, L2_MESSENGER); const gateway = await ethers.getContractAt("L2USDCGateway", L2_GATEWAY, deployer); - const amountIn = ethers.utils.parseUnits("1", 6); + const amountIn = ethers.parseUnits("1", 6); const token = await ethers.getContractAt("MockERC20", L2_USDC, deployer); - await mockERC20Balance(token.address, amountIn.mul(10), 9); - await token.approve(L2_GATEWAY, constants.MaxUint256); - await token.approve(L2_ROUTER, constants.MaxUint256); + await mockERC20Balance(await token.getAddress(), amountIn * 10n, 9); + await token.approve(L2_GATEWAY, MaxUint256); + await token.approve(L2_ROUTER, MaxUint256); // before upgrade await showGasUsage( @@ -612,7 +606,7 @@ describe("GasOptimizationUpgrade.spec", async () => { ); // do upgrade - await upgradeL2(L2_GATEWAY, impl.address); + await upgradeL2(L2_GATEWAY, await impl.getAddress()); // after upgrade await showGasUsage( @@ -633,11 +627,11 @@ describe("GasOptimizationUpgrade.spec", async () => { const L2LidoGateway = await ethers.getContractFactory("L2LidoGateway", deployer); const impl = await L2LidoGateway.deploy(L1_WSTETH, L2_WSTETH, L1_GATEWAY, L2_ROUTER, L2_MESSENGER); const gateway = await ethers.getContractAt("L2LidoGateway", L2_GATEWAY, deployer); - const amountIn = ethers.utils.parseUnits("1", 6); + const amountIn = ethers.parseUnits("1", 6); const token = await ethers.getContractAt("MockERC20", L2_WSTETH, deployer); - await mockERC20Balance(token.address, amountIn.mul(10), 51); - await token.approve(L2_GATEWAY, constants.MaxUint256); - await token.approve(L2_ROUTER, constants.MaxUint256); + await mockERC20Balance(await token.getAddress(), amountIn * 10n, 51); + await token.approve(L2_GATEWAY, MaxUint256); + await token.approve(L2_ROUTER, MaxUint256); // before upgrade await showGasUsage( @@ -650,7 +644,7 @@ describe("GasOptimizationUpgrade.spec", async () => { ); // do upgrade - await upgradeL2(L2_GATEWAY, impl.address); + await upgradeL2(L2_GATEWAY, await impl.getAddress()); await gateway.initializeV2(deployer.address, deployer.address, deployer.address, deployer.address); // after upgrade diff --git a/contracts/integration-test/GasSwap.spec.ts b/contracts/integration-test/GasSwap.spec.ts index 49c3b33d3..4c98ab4ab 100644 --- a/contracts/integration-test/GasSwap.spec.ts +++ b/contracts/integration-test/GasSwap.spec.ts @@ -1,15 +1,15 @@ /* eslint-disable node/no-unpublished-import */ /* eslint-disable node/no-missing-import */ -import { ethers } from "hardhat"; -import { GasSwap, ERC2771Forwarder, MockERC20, MockGasSwapTarget } from "../typechain"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; +import { HardhatEthersSigner } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; -import { BigNumber, constants } from "ethers"; -import { splitSignature } from "ethers/lib/utils"; +import { MaxUint256, Signature, ZeroAddress, ZeroHash, toBigInt } from "ethers"; +import { ethers } from "hardhat"; + +import { GasSwap, ERC2771Forwarder, MockERC20, MockGasSwapTarget } from "../typechain"; describe("GasSwap.spec", async () => { - let deployer: SignerWithAddress; - let signer: SignerWithAddress; + let deployer: HardhatEthersSigner; + let signer: HardhatEthersSigner; let forwarder: ERC2771Forwarder; let swap: GasSwap; @@ -21,19 +21,15 @@ describe("GasSwap.spec", async () => { const ERC2771Forwarder = await ethers.getContractFactory("ERC2771Forwarder", deployer); forwarder = await ERC2771Forwarder.deploy("ERC2771Forwarder"); - await forwarder.deployed(); const GasSwap = await ethers.getContractFactory("GasSwap", deployer); - swap = await GasSwap.deploy(forwarder.address); - await swap.deployed(); + swap = await GasSwap.deploy(forwarder.getAddress()); const MockGasSwapTarget = await ethers.getContractFactory("MockGasSwapTarget", deployer); target = await MockGasSwapTarget.deploy(); - await target.deployed(); const MockERC20 = await ethers.getContractFactory("MockERC20", deployer); token = await MockERC20.deploy("x", "y", 18); - await token.deployed(); }); context("auth", async () => { @@ -43,11 +39,11 @@ describe("GasSwap.spec", async () => { context("#updateFeeRatio", async () => { it("should revert, when non-owner call", async () => { - await expect(swap.connect(signer).updateFeeRatio(1)).to.revertedWith("caller is not the owner"); + await expect(swap.connect(signer).updateFeeRatio(1)).to.revertedWith("Ownable: caller is not the owner"); }); it("should succeed", async () => { - expect(await swap.feeRatio()).to.eq(constants.AddressZero); + expect(await swap.feeRatio()).to.eq(ZeroAddress); await expect(swap.updateFeeRatio(100)).to.emit(swap, "UpdateFeeRatio").withArgs(100); expect(await swap.feeRatio()).to.eq(100); }); @@ -55,66 +51,62 @@ describe("GasSwap.spec", async () => { context("#updateApprovedTarget", async () => { it("should revert, when non-owner call", async () => { - await expect(swap.connect(signer).updateApprovedTarget(target.address, false)).to.revertedWith( - "caller is not the owner" + await expect(swap.connect(signer).updateApprovedTarget(target.getAddress(), false)).to.revertedWith( + "Ownable: caller is not the owner" ); }); it("should succeed", async () => { - expect(await swap.approvedTargets(target.address)).to.eq(false); - await expect(swap.updateApprovedTarget(target.address, true)) + expect(await swap.approvedTargets(target.getAddress())).to.eq(false); + await expect(swap.updateApprovedTarget(target.getAddress(), true)) .to.emit(swap, "UpdateApprovedTarget") - .withArgs(target.address, true); - expect(await swap.approvedTargets(target.address)).to.eq(true); - await expect(swap.updateApprovedTarget(target.address, false)) + .withArgs(await target.getAddress(), true); + expect(await swap.approvedTargets(target.getAddress())).to.eq(true); + await expect(swap.updateApprovedTarget(target.getAddress(), false)) .to.emit(swap, "UpdateApprovedTarget") - .withArgs(target.address, false); - expect(await swap.approvedTargets(target.address)).to.eq(false); + .withArgs(await target.getAddress(), false); + expect(await swap.approvedTargets(target.getAddress())).to.eq(false); }); }); context("#withdraw", async () => { it("should revert, when non-owner call", async () => { - await expect(swap.connect(signer).withdraw(constants.AddressZero, 0)).to.revertedWith( - "caller is not the owner" - ); + await expect(swap.connect(signer).withdraw(ZeroAddress, 0)).to.revertedWith("Ownable: caller is not the owner"); }); it("should succeed, when withdraw ETH", async () => { - await deployer.sendTransaction({ to: swap.address, value: ethers.utils.parseEther("1") }); - const balanceBefore = await deployer.getBalance(); - const tx = await swap.withdraw(constants.AddressZero, ethers.utils.parseEther("1")); + await deployer.sendTransaction({ to: swap.getAddress(), value: ethers.parseEther("1") }); + const balanceBefore = await ethers.provider.getBalance(deployer.address); + const tx = await swap.withdraw(ZeroAddress, ethers.parseEther("1")); const receipt = await tx.wait(); - const balanceAfter = await deployer.getBalance(); - expect(balanceAfter.sub(balanceBefore)).to.eq( - ethers.utils.parseEther("1").sub(receipt.gasUsed.mul(receipt.effectiveGasPrice)) - ); + const balanceAfter = await ethers.provider.getBalance(deployer.address); + expect(balanceAfter - balanceBefore).to.eq(ethers.parseEther("1") - receipt!.gasUsed * receipt!.gasPrice); }); it("should succeed, when withdraw token", async () => { - await token.mint(swap.address, ethers.utils.parseEther("1")); + await token.mint(swap.getAddress(), ethers.parseEther("1")); const balanceBefore = await token.balanceOf(deployer.address); - await swap.withdraw(token.address, ethers.utils.parseEther("1")); + await swap.withdraw(token.getAddress(), ethers.parseEther("1")); const balanceAfter = await token.balanceOf(deployer.address); - expect(balanceAfter.sub(balanceBefore)).to.eq(ethers.utils.parseEther("1")); + expect(balanceAfter - balanceBefore).to.eq(ethers.parseEther("1")); }); }); }); - const permit = async (amount: BigNumber) => { + const permit = async (amount: bigint) => { const value = { owner: signer.address, - spender: swap.address, + spender: await swap.getAddress(), value: amount, nonce: await token.nonces(signer.address), - deadline: constants.MaxUint256, + deadline: MaxUint256, }; const domain = { name: await token.name(), version: "1", chainId: (await ethers.provider.getNetwork()).chainId, - verifyingContract: token.address, + verifyingContract: await token.getAddress(), }; const types = { @@ -142,7 +134,7 @@ describe("GasSwap.spec", async () => { ], }; - const signature = splitSignature(await signer._signTypedData(domain, types, value)); + const signature = Signature.from(await signer.signTypedData(domain, types, value)); return signature; }; @@ -151,15 +143,15 @@ describe("GasSwap.spec", async () => { await expect( swap.swap( { - token: token.address, + token: token.getAddress(), value: 0, deadline: 0, - r: constants.HashZero, - s: constants.HashZero, + r: ZeroHash, + s: ZeroHash, v: 0, }, { - target: target.address, + target: target.getAddress(), data: "0x", minOutput: 0, } @@ -168,121 +160,119 @@ describe("GasSwap.spec", async () => { }); it("should revert, when insufficient output amount", async () => { - const amountIn = ethers.utils.parseEther("1"); - const amountOut = ethers.utils.parseEther("2"); + const amountIn = ethers.parseEther("1"); + const amountOut = ethers.parseEther("2"); await token.mint(signer.address, amountIn); - await deployer.sendTransaction({ to: target.address, value: amountOut }); + await deployer.sendTransaction({ to: target.getAddress(), value: amountOut }); const signature = await permit(amountIn); - await target.setToken(token.address); + await target.setToken(token.getAddress()); await target.setAmountIn(amountIn); - await swap.updateApprovedTarget(target.address, true); + await swap.updateApprovedTarget(target.getAddress(), true); await expect( swap.connect(signer).swap( { - token: token.address, + token: await token.getAddress(), value: amountIn, - deadline: constants.MaxUint256, + deadline: MaxUint256, r: signature.r, s: signature.s, v: signature.v, }, { - target: target.address, + target: target.getAddress(), data: "0x8119c065", - minOutput: amountOut.add(1), + minOutput: amountOut + 1n, } ) ).to.revertedWith("insufficient output amount"); }); - for (const refundRatio of ["0", "1", "5"]) { + for (const refundRatio of [0n, 1n, 5n]) { for (const feeRatio of ["0", "5", "50"]) { it(`should succeed, when swap by signer directly, with feeRatio[${feeRatio}%] refundRatio[${refundRatio}%]`, async () => { - const amountIn = ethers.utils.parseEther("1"); - const amountOut = ethers.utils.parseEther("2"); + const amountIn = ethers.parseEther("1"); + const amountOut = ethers.parseEther("2"); await token.mint(signer.address, amountIn); - await deployer.sendTransaction({ to: target.address, value: amountOut }); + await deployer.sendTransaction({ to: target.getAddress(), value: amountOut }); const signature = await permit(amountIn); - await target.setToken(token.address); + await target.setToken(token.getAddress()); await target.setAmountIn(amountIn); - await target.setRefund(amountIn.mul(refundRatio).div(100)); + await target.setRefund((amountIn * refundRatio) / 100n); - await swap.updateApprovedTarget(target.address, true); - await swap.updateFeeRatio(ethers.utils.parseEther(feeRatio).div(100)); - const fee = amountOut.mul(feeRatio).div(100); + await swap.updateApprovedTarget(target.getAddress(), true); + await swap.updateFeeRatio(ethers.parseEther(feeRatio) / 100n); + const fee = (amountOut * toBigInt(feeRatio)) / 100n; - const balanceBefore = await signer.getBalance(); + const balanceBefore = await ethers.provider.getBalance(signer.address); const tx = await swap.connect(signer).swap( { - token: token.address, + token: await token.getAddress(), value: amountIn, - deadline: constants.MaxUint256, + deadline: MaxUint256, r: signature.r, s: signature.s, v: signature.v, }, { - target: target.address, + target: target.getAddress(), data: "0x8119c065", - minOutput: amountOut.sub(fee), + minOutput: amountOut - fee, } ); const receipt = await tx.wait(); - const balanceAfter = await signer.getBalance(); - expect(balanceAfter.sub(balanceBefore)).to.eq( - amountOut.sub(fee).sub(receipt.gasUsed.mul(receipt.effectiveGasPrice)) - ); - expect(await token.balanceOf(signer.address)).to.eq(amountIn.mul(refundRatio).div(100)); + const balanceAfter = await ethers.provider.getBalance(signer.address); + expect(balanceAfter - balanceBefore).to.eq(amountOut - fee - receipt!.gasUsed * receipt!.gasPrice); + expect(await token.balanceOf(signer.address)).to.eq((amountIn * refundRatio) / 100n); }); it(`should succeed, when swap by signer with forwarder, with feeRatio[${feeRatio}%] refundRatio[${refundRatio}%]`, async () => { - const amountIn = ethers.utils.parseEther("1"); - const amountOut = ethers.utils.parseEther("2"); + const amountIn = ethers.parseEther("1"); + const amountOut = ethers.parseEther("2"); await token.mint(signer.address, amountIn); - await deployer.sendTransaction({ to: target.address, value: amountOut }); + await deployer.sendTransaction({ to: await target.getAddress(), value: amountOut }); const permitSignature = await permit(amountIn); - await target.setToken(token.address); + await target.setToken(token.getAddress()); await target.setAmountIn(amountIn); - await target.setRefund(amountIn.mul(refundRatio).div(100)); + await target.setRefund((amountIn * refundRatio) / 100n); - await swap.updateApprovedTarget(target.address, true); - await swap.updateFeeRatio(ethers.utils.parseEther(feeRatio).div(100)); - const fee = amountOut.mul(feeRatio).div(100); + await swap.updateApprovedTarget(target.getAddress(), true); + await swap.updateFeeRatio(ethers.parseEther(feeRatio) / 100n); + const fee = (amountOut * toBigInt(feeRatio)) / 100n; const reqWithoutSignature = { from: signer.address, - to: swap.address, - value: constants.Zero, + to: await swap.getAddress(), + value: 0n, gas: 1000000, nonce: await forwarder.nonces(signer.address), deadline: 2000000000, data: swap.interface.encodeFunctionData("swap", [ { - token: token.address, + token: await token.getAddress(), value: amountIn, - deadline: constants.MaxUint256, + deadline: MaxUint256, r: permitSignature.r, s: permitSignature.s, v: permitSignature.v, }, { - target: target.address, + target: await target.getAddress(), data: "0x8119c065", - minOutput: amountOut.sub(fee), + minOutput: amountOut - fee, }, ]), }; - const signature = await signer._signTypedData( + const signature = await signer.signTypedData( { name: "ERC2771Forwarder", version: "1", chainId: (await ethers.provider.getNetwork()).chainId, - verifyingContract: forwarder.address, + verifyingContract: await forwarder.getAddress(), }, { ForwardRequest: [ @@ -319,7 +309,7 @@ describe("GasSwap.spec", async () => { reqWithoutSignature ); - const balanceBefore = await signer.getBalance(); + const balanceBefore = await ethers.provider.getBalance(signer.address); await forwarder.execute({ from: reqWithoutSignature.from, to: reqWithoutSignature.to, @@ -329,9 +319,9 @@ describe("GasSwap.spec", async () => { data: reqWithoutSignature.data, signature, }); - const balanceAfter = await signer.getBalance(); - expect(balanceAfter.sub(balanceBefore)).to.eq(amountOut.sub(fee)); - expect(await token.balanceOf(signer.address)).to.eq(amountIn.mul(refundRatio).div(100)); + const balanceAfter = await ethers.provider.getBalance(signer.address); + expect(balanceAfter - balanceBefore).to.eq(amountOut - fee); + expect(await token.balanceOf(signer.address)).to.eq((amountIn * refundRatio) / 100n); }); } } diff --git a/contracts/integration-test/L1BlockContainer.spec.ts b/contracts/integration-test/L1BlockContainer.spec.ts index 409773f8d..257a7a850 100644 --- a/contracts/integration-test/L1BlockContainer.spec.ts +++ b/contracts/integration-test/L1BlockContainer.spec.ts @@ -1,9 +1,9 @@ /* eslint-disable node/no-unpublished-import */ /* eslint-disable node/no-missing-import */ import { expect } from "chai"; -import { BigNumber, BigNumberish, constants } from "ethers"; -import { concat, RLP } from "ethers/lib/utils"; +import { BigNumberish, ZeroHash, concat, encodeRlp, toBeHex, toBigInt } from "ethers"; import { ethers } from "hardhat"; + import { L1BlockContainer } from "../typechain"; interface IImportTestConfig { @@ -90,7 +90,7 @@ const testcases: Array = [ ]; function encodeHeader(test: IImportTestConfig): string { - return RLP.encode([ + return encodeRlp([ test.parentHash, test.uncleHash, test.coinbase, @@ -98,15 +98,15 @@ function encodeHeader(test: IImportTestConfig): string { test.transactionsRoot, test.receiptsRoot, test.logsBloom, - BigNumber.from(test.difficulty).isZero() ? "0x" : BigNumber.from(test.difficulty).toHexString(), - BigNumber.from(test.blockHeight).toHexString(), - BigNumber.from(test.gasLimit).toHexString(), - BigNumber.from(test.gasUsed).toHexString(), - BigNumber.from(test.blockTimestamp).toHexString(), + toBigInt(test.difficulty) === 0n ? "0x" : toBeHex(test.difficulty), + toBeHex(test.blockHeight), + toBeHex(test.gasLimit), + toBeHex(test.gasUsed), + toBeHex(test.blockTimestamp), test.extraData, test.mixHash, test.blockNonce, - BigNumber.from(test.baseFee).toHexString(), + toBeHex(test.baseFee), ]); } @@ -124,7 +124,7 @@ describe("L1BlockContainer", async () => { const whitelist = await Whitelist.deploy(deployer.address); await whitelist.updateWhitelistStatus([deployer.address], true); - await container.updateWhitelist(whitelist.address); + await container.updateWhitelist(whitelist.getAddress()); }); it("should revert, when sender not allowed", async () => { @@ -137,7 +137,7 @@ describe("L1BlockContainer", async () => { test.stateRoot ); - await expect(container.connect(signer).importBlockHeader(constants.HashZero, [], false)).to.revertedWith( + await expect(container.connect(signer).importBlockHeader(ZeroHash, "0x", false)).to.revertedWith( "Not whitelisted sender" ); }); @@ -172,7 +172,7 @@ describe("L1BlockContainer", async () => { it("should revert, when parent not imported", async () => { await container.initialize( - constants.HashZero, + ZeroHash, test.blockHeight - 1, test.blockTimestamp - 1, test.baseFee, diff --git a/contracts/integration-test/L1MessageQueue.spec.ts b/contracts/integration-test/L1MessageQueue.spec.ts index c363ce0ea..33109a2d0 100644 --- a/contracts/integration-test/L1MessageQueue.spec.ts +++ b/contracts/integration-test/L1MessageQueue.spec.ts @@ -1,18 +1,29 @@ /* eslint-disable node/no-unpublished-import */ /* eslint-disable node/no-missing-import */ +import { HardhatEthersSigner } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; -import { BigNumber, constants } from "ethers"; -import { concat, getAddress, hexlify, keccak256, randomBytes, RLP, stripZeros } from "ethers/lib/utils"; import { ethers } from "hardhat"; + import { L1MessageQueue, L2GasPriceOracle } from "../typechain"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; +import { + MaxUint256, + ZeroAddress, + concat, + encodeRlp, + getAddress, + hexlify, + keccak256, + randomBytes, + toBeHex, + toBigInt, +} from "ethers"; describe("L1MessageQueue", async () => { - let deployer: SignerWithAddress; - let scrollChain: SignerWithAddress; - let messenger: SignerWithAddress; - let gateway: SignerWithAddress; - let signer: SignerWithAddress; + let deployer: HardhatEthersSigner; + let scrollChain: HardhatEthersSigner; + let messenger: HardhatEthersSigner; + let gateway: HardhatEthersSigner; + let signer: HardhatEthersSigner; let oracle: L2GasPriceOracle; let queue: L1MessageQueue; @@ -21,10 +32,8 @@ describe("L1MessageQueue", async () => { const TransparentUpgradeableProxy = await ethers.getContractFactory("TransparentUpgradeableProxy", deployer); const Factory = await ethers.getContractFactory(name, deployer); const impl = args.length > 0 ? await Factory.deploy(...args) : await Factory.deploy(); - await impl.deployed(); - const proxy = await TransparentUpgradeableProxy.deploy(impl.address, admin, "0x"); - await proxy.deployed(); - return proxy.address; + const proxy = await TransparentUpgradeableProxy.deploy(impl.getAddress(), admin, "0x"); + return proxy.getAddress(); }; beforeEach(async () => { @@ -32,22 +41,25 @@ describe("L1MessageQueue", async () => { const ProxyAdmin = await ethers.getContractFactory("ProxyAdmin", deployer); const admin = await ProxyAdmin.deploy(); - await admin.deployed(); queue = await ethers.getContractAt( "L1MessageQueue", - await deployProxy("L1MessageQueue", admin.address, [messenger.address, scrollChain.address, gateway.address]), + await deployProxy("L1MessageQueue", await admin.getAddress(), [ + messenger.address, + scrollChain.address, + gateway.address, + ]), deployer ); oracle = await ethers.getContractAt( "L2GasPriceOracle", - await deployProxy("L2GasPriceOracle", admin.address, []), + await deployProxy("L2GasPriceOracle", await admin.getAddress(), []), deployer ); await oracle.initialize(21000, 50000, 8, 16); - await queue.initialize(messenger.address, scrollChain.address, constants.AddressZero, oracle.address, 10000000); + await queue.initialize(messenger.address, scrollChain.address, ZeroAddress, oracle.getAddress(), 10000000); }); context("auth", async () => { @@ -56,28 +68,28 @@ describe("L1MessageQueue", async () => { expect(await queue.messenger()).to.eq(messenger.address); expect(await queue.scrollChain()).to.eq(scrollChain.address); expect(await queue.enforcedTxGateway()).to.eq(gateway.address); - expect(await queue.gasOracle()).to.eq(oracle.address); + expect(await queue.gasOracle()).to.eq(await oracle.getAddress()); expect(await queue.maxGasLimit()).to.eq(10000000); }); it("should revert, when initialize again", async () => { - await expect( - queue.initialize(constants.AddressZero, constants.AddressZero, constants.AddressZero, constants.AddressZero, 0) - ).to.revertedWith("Initializable: contract is already initialized"); + await expect(queue.initialize(ZeroAddress, ZeroAddress, ZeroAddress, ZeroAddress, 0)).to.revertedWith( + "Initializable: contract is already initialized" + ); }); context("#updateGasOracle", async () => { it("should revert, when non-owner call", async () => { - await expect(queue.connect(signer).updateGasOracle(constants.AddressZero)).to.revertedWith( + await expect(queue.connect(signer).updateGasOracle(ZeroAddress)).to.revertedWith( "Ownable: caller is not the owner" ); }); it("should succeed", async () => { - expect(await queue.gasOracle()).to.eq(oracle.address); + expect(await queue.gasOracle()).to.eq(await oracle.getAddress()); await expect(queue.updateGasOracle(deployer.address)) .to.emit(queue, "UpdateGasOracle") - .withArgs(oracle.address, deployer.address); + .withArgs(await oracle.getAddress(), deployer.address); expect(await queue.gasOracle()).to.eq(deployer.address); }); }); @@ -101,30 +113,9 @@ describe("L1MessageQueue", async () => { const target = "0xcb18150e4efefb6786130e289a5f61a82a5b86d7"; const transactionType = "0x7E"; - for (const nonce of [ - BigNumber.from(0), - BigNumber.from(1), - BigNumber.from(127), - BigNumber.from(128), - BigNumber.from(22334455), - constants.MaxUint256, - ]) { - for (const value of [ - BigNumber.from(0), - BigNumber.from(1), - BigNumber.from(127), - BigNumber.from(128), - BigNumber.from(22334455), - constants.MaxUint256, - ]) { - for (const gasLimit of [ - BigNumber.from(0), - BigNumber.from(1), - BigNumber.from(127), - BigNumber.from(128), - BigNumber.from(22334455), - constants.MaxUint256, - ]) { + for (const nonce of [0n, 1n, 127n, 128n, 22334455n, MaxUint256]) { + for (const value of [0n, 1n, 127n, 128n, 22334455n, MaxUint256]) { + for (const gasLimit of [0n, 1n, 127n, 128n, 22334455n, MaxUint256]) { for (const dataLen of [0, 1, 2, 3, 4, 55, 56, 100]) { const tests = [randomBytes(dataLen)]; if (dataLen === 1) { @@ -133,11 +124,11 @@ describe("L1MessageQueue", async () => { } } for (const data of tests) { - const transactionPayload = RLP.encode([ - stripZeros(nonce.toHexString()), - stripZeros(gasLimit.toHexString()), + const transactionPayload = encodeRlp([ + nonce === 0n ? "0x" : toBeHex(nonce), + gasLimit === 0n ? "0x" : toBeHex(gasLimit), target, - stripZeros(value.toHexString()), + value === 0n ? "0x" : toBeHex(value), data, sender, ]); @@ -159,30 +150,27 @@ describe("L1MessageQueue", async () => { context("#appendCrossDomainMessage", async () => { it("should revert, when non-messenger call", async () => { - await expect(queue.connect(signer).appendCrossDomainMessage(constants.AddressZero, 0, "0x")).to.revertedWith( + await expect(queue.connect(signer).appendCrossDomainMessage(ZeroAddress, 0, "0x")).to.revertedWith( "Only callable by the L1ScrollMessenger" ); }); it("should revert, when exceed maxGasLimit", async () => { - await expect( - queue.connect(messenger).appendCrossDomainMessage(constants.AddressZero, 10000001, "0x") - ).to.revertedWith("Gas limit must not exceed maxGasLimit"); + await expect(queue.connect(messenger).appendCrossDomainMessage(ZeroAddress, 10000001, "0x")).to.revertedWith( + "Gas limit must not exceed maxGasLimit" + ); }); it("should revert, when below intrinsic gas", async () => { - await expect(queue.connect(messenger).appendCrossDomainMessage(constants.AddressZero, 0, "0x")).to.revertedWith( + await expect(queue.connect(messenger).appendCrossDomainMessage(ZeroAddress, 0, "0x")).to.revertedWith( "Insufficient gas limit, must be above intrinsic gas" ); }); it("should succeed", async () => { - expect(await queue.nextCrossDomainMessageIndex()).to.eq(constants.Zero); + expect(await queue.nextCrossDomainMessageIndex()).to.eq(0n); const sender = getAddress( - BigNumber.from(messenger.address) - .add("0x1111000000000000000000000000000000001111") - .mod(BigNumber.from(2).pow(160)) - .toHexString() + toBeHex((toBigInt(messenger.address) + toBigInt("0x1111000000000000000000000000000000001111")) % 2n ** 160n) .slice(2) .padStart(40, "0") ); @@ -190,7 +178,7 @@ describe("L1MessageQueue", async () => { await expect(queue.connect(messenger).appendCrossDomainMessage(signer.address, 100000, "0x01")) .to.emit(queue, "QueueTransaction") .withArgs(sender, signer.address, 0, 0, 100000, "0x01"); - expect(await queue.nextCrossDomainMessageIndex()).to.eq(constants.One); + expect(await queue.nextCrossDomainMessageIndex()).to.eq(1n); expect(await queue.getCrossDomainMessage(0)).to.eq(hash); }); }); @@ -198,30 +186,30 @@ describe("L1MessageQueue", async () => { context("#appendEnforcedTransaction", async () => { it("should revert, when non-gateway call", async () => { await expect( - queue.connect(signer).appendEnforcedTransaction(signer.address, constants.AddressZero, 0, 0, "0x") + queue.connect(signer).appendEnforcedTransaction(signer.address, ZeroAddress, 0, 0, "0x") ).to.revertedWith("Only callable by the EnforcedTxGateway"); }); it("should revert, when sender is not EOA", async () => { await expect( - queue.connect(gateway).appendEnforcedTransaction(queue.address, constants.AddressZero, 0, 0, "0x") + queue.connect(gateway).appendEnforcedTransaction(queue.getAddress(), ZeroAddress, 0, 0, "0x") ).to.revertedWith("only EOA"); }); it("should revert, when exceed maxGasLimit", async () => { await expect( - queue.connect(gateway).appendEnforcedTransaction(signer.address, constants.AddressZero, 0, 10000001, "0x") + queue.connect(gateway).appendEnforcedTransaction(signer.address, ZeroAddress, 0, 10000001, "0x") ).to.revertedWith("Gas limit must not exceed maxGasLimit"); }); it("should revert, when below intrinsic gas", async () => { await expect( - queue.connect(gateway).appendEnforcedTransaction(signer.address, constants.AddressZero, 0, 0, "0x") + queue.connect(gateway).appendEnforcedTransaction(signer.address, ZeroAddress, 0, 0, "0x") ).to.revertedWith("Insufficient gas limit, must be above intrinsic gas"); }); it("should succeed", async () => { - expect(await queue.nextCrossDomainMessageIndex()).to.eq(constants.Zero); + expect(await queue.nextCrossDomainMessageIndex()).to.eq(0n); const sender = signer.address; const hash = await queue.computeTransactionHash(sender, 0, 200, signer.address, 100000, "0x01"); await expect( @@ -229,7 +217,7 @@ describe("L1MessageQueue", async () => { ) .to.emit(queue, "QueueTransaction") .withArgs(sender, signer.address, 200, 0, 100000, "0x01"); - expect(await queue.nextCrossDomainMessageIndex()).to.eq(constants.One); + expect(await queue.nextCrossDomainMessageIndex()).to.eq(1n); expect(await queue.getCrossDomainMessage(0)).to.eq(hash); }); }); @@ -254,7 +242,7 @@ describe("L1MessageQueue", async () => { it("should succeed", async () => { // append 512 messages for (let i = 0; i < 256 * 2; i++) { - await queue.connect(messenger).appendCrossDomainMessage(constants.AddressZero, 1000000, "0x"); + await queue.connect(messenger).appendCrossDomainMessage(ZeroAddress, 1000000, "0x"); } // pop 50 messages with no skip @@ -292,17 +280,12 @@ describe("L1MessageQueue", async () => { } // pop 256 messages with random skip - const bitmap = BigNumber.from("0x496525059c3f33758d17030403e45afe067b8a0ae1317cda0487fd2932cbea1a"); + const bitmap = toBigInt("0x496525059c3f33758d17030403e45afe067b8a0ae1317cda0487fd2932cbea1a"); const tx = await queue.connect(scrollChain).popCrossDomainMessage(80, 256, bitmap); await expect(tx).to.emit(queue, "DequeueTransaction").withArgs(80, 256, bitmap); - console.log("gas used:", (await tx.wait()).gasUsed.toString()); + console.log("gas used:", (await tx.wait())!.gasUsed.toString()); for (let i = 80; i < 80 + 256; i++) { - expect(await queue.isMessageSkipped(i)).to.eq( - bitmap - .shr(i - 80) - .and(1) - .eq(1) - ); + expect(await queue.isMessageSkipped(i)).to.eq(((bitmap >> toBigInt(i - 80)) & 1n) === 1n); expect(await queue.isMessageDropped(i)).to.eq(false); } }); @@ -314,39 +297,39 @@ describe("L1MessageQueue", async () => { it.skip(`should succeed on random tests, pop three times each with ${count1} ${count2} ${count3} msgs`, async () => { // append count1 + count2 + count3 messages for (let i = 0; i < count1 + count2 + count3; i++) { - await queue.connect(messenger).appendCrossDomainMessage(constants.AddressZero, 1000000, "0x"); + await queue.connect(messenger).appendCrossDomainMessage(ZeroAddress, 1000000, "0x"); } // first pop `count1` messages - const bitmap1 = BigNumber.from(randomBytes(32)); + const bitmap1 = toBigInt(randomBytes(32)); let tx = await queue.connect(scrollChain).popCrossDomainMessage(0, count1, bitmap1); await expect(tx) .to.emit(queue, "DequeueTransaction") - .withArgs(0, count1, bitmap1.and(constants.One.shl(count1).sub(1))); + .withArgs(0, count1, bitmap1 & ((1n << toBigInt(count1)) - 1n)); for (let i = 0; i < count1; i++) { - expect(await queue.isMessageSkipped(i)).to.eq(bitmap1.shr(i).and(1).eq(1)); + expect(await queue.isMessageSkipped(i)).to.eq(((bitmap1 >> toBigInt(i)) & 1n) === 1n); expect(await queue.isMessageDropped(i)).to.eq(false); } // then pop `count2` messages - const bitmap2 = BigNumber.from(randomBytes(32)); + const bitmap2 = toBigInt(randomBytes(32)); tx = await queue.connect(scrollChain).popCrossDomainMessage(count1, count2, bitmap2); await expect(tx) .to.emit(queue, "DequeueTransaction") - .withArgs(count1, count2, bitmap2.and(constants.One.shl(count2).sub(1))); + .withArgs(count1, count2, bitmap2 & ((1n << toBigInt(count2)) - 1n)); for (let i = 0; i < count2; i++) { - expect(await queue.isMessageSkipped(i + count1)).to.eq(bitmap2.shr(i).and(1).eq(1)); + expect(await queue.isMessageSkipped(i + count1)).to.eq(((bitmap2 >> toBigInt(i)) & 1n) === 1n); expect(await queue.isMessageDropped(i + count1)).to.eq(false); } // last pop `count3` messages - const bitmap3 = BigNumber.from(randomBytes(32)); + const bitmap3 = toBigInt(randomBytes(32)); tx = await queue.connect(scrollChain).popCrossDomainMessage(count1 + count2, count3, bitmap3); await expect(tx) .to.emit(queue, "DequeueTransaction") - .withArgs(count1 + count2, count3, bitmap3.and(constants.One.shl(count3).sub(1))); + .withArgs(count1 + count2, count3, bitmap3 & ((1n << toBigInt(count3)) - 1n)); for (let i = 0; i < count3; i++) { - expect(await queue.isMessageSkipped(i + count1 + count2)).to.eq(bitmap3.shr(i).and(1).eq(1)); + expect(await queue.isMessageSkipped(i + count1 + count2)).to.eq(((bitmap3 >> toBigInt(i)) & 1n) === 1n); expect(await queue.isMessageDropped(i + count1 + count2)).to.eq(false); } }); @@ -365,7 +348,7 @@ describe("L1MessageQueue", async () => { it("should revert, when drop non-skipped message", async () => { // append 10 messages for (let i = 0; i < 10; i++) { - await queue.connect(messenger).appendCrossDomainMessage(constants.AddressZero, 1000000, "0x"); + await queue.connect(messenger).appendCrossDomainMessage(ZeroAddress, 1000000, "0x"); } // pop 5 messages with no skip await expect(queue.connect(scrollChain).popCrossDomainMessage(0, 5, 0)) @@ -390,7 +373,7 @@ describe("L1MessageQueue", async () => { it("should succeed", async () => { // append 10 messages for (let i = 0; i < 10; i++) { - await queue.connect(messenger).appendCrossDomainMessage(constants.AddressZero, 1000000, "0x"); + await queue.connect(messenger).appendCrossDomainMessage(ZeroAddress, 1000000, "0x"); } // pop 10 messages, all skipped await expect(queue.connect(scrollChain).popCrossDomainMessage(0, 10, 0x3ff)) diff --git a/contracts/integration-test/PatriciaMerkleTrieVerifier.spec.ts b/contracts/integration-test/PatriciaMerkleTrieVerifier.spec.ts index 5e3c37a77..10750cd1f 100644 --- a/contracts/integration-test/PatriciaMerkleTrieVerifier.spec.ts +++ b/contracts/integration-test/PatriciaMerkleTrieVerifier.spec.ts @@ -1,8 +1,9 @@ /* eslint-disable node/no-unpublished-import */ /* eslint-disable node/no-missing-import */ import { expect } from "chai"; -import { concat } from "ethers/lib/utils"; +import { concat } from "ethers"; import { ethers } from "hardhat"; + import { MockPatriciaMerkleTrieVerifier } from "../typechain"; interface ITestConfig { @@ -121,7 +122,6 @@ describe("PatriciaMerkleTrieVerifier", async () => { const MockPatriciaMerkleTrieVerifier = await ethers.getContractFactory("MockPatriciaMerkleTrieVerifier", deployer); verifier = await MockPatriciaMerkleTrieVerifier.deploy(); - await verifier.deployed(); }); for (const test of testcases) { diff --git a/contracts/integration-test/PoseidonHash.spec.ts b/contracts/integration-test/PoseidonHash.spec.ts index 5746cb3f2..21382580d 100644 --- a/contracts/integration-test/PoseidonHash.spec.ts +++ b/contracts/integration-test/PoseidonHash.spec.ts @@ -2,9 +2,9 @@ /* eslint-disable node/no-unpublished-import */ import { expect } from "chai"; import { randomBytes } from "crypto"; -import { BigNumber, Contract } from "ethers"; -import { ethers } from "hardhat"; +import { Contract, toBigInt } from "ethers"; import fs from "fs"; +import { ethers } from "hardhat"; import PoseidonWithoutDomain from "circomlib/src/poseidon_gencontract"; import { generateABI, createCode } from "../scripts/poseidon"; @@ -23,12 +23,10 @@ describe("PoseidonHash.spec", async () => { PoseidonWithoutDomain.createCode(2), deployer ); - poseidonCircom = await PoseidonWithoutDomainFactory.deploy(); - await poseidonCircom.deployed(); + poseidonCircom = (await PoseidonWithoutDomainFactory.deploy()) as Contract; const PoseidonWithDomainFactory = new ethers.ContractFactory(generateABI(2), createCode(2), deployer); - poseidon = await PoseidonWithDomainFactory.deploy(); - await poseidon.deployed(); + poseidon = (await PoseidonWithDomainFactory.deploy()) as Contract; }); it("should succeed on zero inputs", async () => { @@ -40,8 +38,8 @@ describe("PoseidonHash.spec", async () => { it("should succeed on random inputs", async () => { for (let bytes = 1; bytes <= 32; ++bytes) { for (let i = 0; i < 5; ++i) { - const a = randomBytes(bytes); - const b = randomBytes(bytes); + const a = toBigInt(randomBytes(bytes)); + const b = toBigInt(randomBytes(bytes)); expect(await poseidonCircom["poseidon(uint256[2])"]([a, b])).to.eq( await poseidon["poseidon(uint256[2],uint256)"]([a, b], 0) ); @@ -58,31 +56,20 @@ describe("PoseidonHash.spec", async () => { // test against with scroll's go implementation. context("domain = nonzero", async () => { - let poseidonCircom: Contract; let poseidon: Contract; beforeEach(async () => { const [deployer] = await ethers.getSigners(); - - const PoseidonWithoutDomainFactory = new ethers.ContractFactory( - PoseidonWithoutDomain.generateABI(2), - PoseidonWithoutDomain.createCode(2), - deployer - ); - poseidonCircom = await PoseidonWithoutDomainFactory.deploy(); - await poseidonCircom.deployed(); - const PoseidonWithDomainFactory = new ethers.ContractFactory(generateABI(2), createCode(2), deployer); - poseidon = await PoseidonWithDomainFactory.deploy(); - await poseidon.deployed(); + poseidon = (await PoseidonWithDomainFactory.deploy()) as Contract; }); it("should succeed on zero inputs", async () => { expect(await poseidon["poseidon(uint256[2],uint256)"]([0, 0], 6)).to.eq( - BigNumber.from("17848312925884193353134534408113064827548730776291701343555436351962284922129") + toBigInt("17848312925884193353134534408113064827548730776291701343555436351962284922129") ); expect(await poseidon["poseidon(uint256[2],uint256)"]([0, 0], 7)).to.eq( - BigNumber.from("20994231331856095272861976502721128670019193481895476667943874333621461724676") + toBigInt("20994231331856095272861976502721128670019193481895476667943874333621461724676") ); }); @@ -90,7 +77,7 @@ describe("PoseidonHash.spec", async () => { const lines = String(fs.readFileSync("./integration-test/testdata/poseidon_hash_with_domain.data")).split("\n"); for (const line of lines) { const [domain, a, b, hash] = line.split(" "); - expect(await poseidon["poseidon(uint256[2],uint256)"]([a, b], domain)).to.eq(BigNumber.from(hash)); + expect(await poseidon["poseidon(uint256[2],uint256)"]([a, b], domain)).to.eq(toBigInt(hash)); } }); }); diff --git a/contracts/integration-test/ScrollChain.blob.spec.ts b/contracts/integration-test/ScrollChain.blob.spec.ts new file mode 100644 index 000000000..b30ed82f9 --- /dev/null +++ b/contracts/integration-test/ScrollChain.blob.spec.ts @@ -0,0 +1,162 @@ +/* eslint-disable node/no-unpublished-import */ +/* eslint-disable node/no-missing-import */ +import { ZeroAddress } from "ethers"; +import { ethers } from "hardhat"; + +import { ScrollChain, L1MessageQueue } from "../typechain"; +import { HardhatEthersSigner } from "@nomicfoundation/hardhat-ethers/signers"; +import { randomBytes } from "crypto"; +import { expect } from "chai"; + +describe("ScrollChain.blob", async () => { + let deployer: HardhatEthersSigner; + let signer: HardhatEthersSigner; + + let queue: L1MessageQueue; + let chain: ScrollChain; + + beforeEach(async () => { + [deployer, signer] = await ethers.getSigners(); + + const EmptyContract = await ethers.getContractFactory("EmptyContract", deployer); + const empty = await EmptyContract.deploy(); + + const ProxyAdmin = await ethers.getContractFactory("ProxyAdmin", deployer); + const admin = await ProxyAdmin.deploy(); + + const TransparentUpgradeableProxy = await ethers.getContractFactory("TransparentUpgradeableProxy", deployer); + const queueProxy = await TransparentUpgradeableProxy.deploy(empty.getAddress(), admin.getAddress(), "0x"); + const chainProxy = await TransparentUpgradeableProxy.deploy(empty.getAddress(), admin.getAddress(), "0x"); + + const L1MessageQueue = await ethers.getContractFactory("L1MessageQueue", deployer); + const queueImpl = await L1MessageQueue.deploy(deployer.address, chainProxy.getAddress(), deployer.address); + await admin.upgrade(queueProxy.getAddress(), queueImpl.getAddress()); + + const ScrollChain = await ethers.getContractFactory("ScrollChain", deployer); + const chainImpl = await ScrollChain.deploy(0, queueProxy.getAddress(), deployer.address); + await admin.upgrade(chainProxy.getAddress(), chainImpl.getAddress()); + + queue = await ethers.getContractAt("L1MessageQueue", await queueProxy.getAddress(), deployer); + chain = await ethers.getContractAt("ScrollChain", await chainProxy.getAddress(), deployer); + + await chain.initialize(queue.getAddress(), ZeroAddress, 100); + await chain.addSequencer(deployer.address); + await chain.addProver(deployer.address); + await queue.initialize(deployer.address, chain.getAddress(), deployer.address, deployer.address, 10000000); + }); + + context("commit batch", async () => { + let batchHeader0: Uint8Array; + + beforeEach(async () => { + // import 10 L1 messages + for (let i = 0; i < 10; i++) { + queue.appendCrossDomainMessage(deployer.address, 1000000, "0x"); + } + + // import genesis batch first + batchHeader0 = new Uint8Array(89); + batchHeader0[25] = 1; + await chain.importGenesisBatch(batchHeader0, randomBytes(32)); + }); + + it("should revert when caller is not sequencer", async () => { + await expect(chain.connect(signer).commitBatch(1, batchHeader0, [], "0x")).to.revertedWithCustomError( + chain, + "ErrorCallerIsNotSequencer" + ); + }); + + it("should revert when batch is empty", async () => { + await expect(chain.commitBatch(1, batchHeader0, [], "0x")).to.revertedWithCustomError(chain, "ErrorBatchIsEmpty"); + }); + + it("should revert when batch header length too small", async () => { + const header = new Uint8Array(120); + header[0] = 1; + await expect(chain.commitBatch(1, header, ["0x"], "0x")).to.revertedWithCustomError( + chain, + "ErrorBatchHeaderLengthTooSmall" + ); + }); + + it("should revert when wrong bitmap length", async () => { + const header = new Uint8Array(122); + header[0] = 1; + await expect(chain.commitBatch(1, header, ["0x"], "0x")).to.revertedWithCustomError( + chain, + "ErrorIncorrectBitmapLength" + ); + }); + + it("should revert when incorrect parent batch hash", async () => { + batchHeader0[25] = 2; + await expect(chain.commitBatch(1, batchHeader0, ["0x"], "0x")).to.revertedWithCustomError( + chain, + "ErrorIncorrectBatchHash" + ); + batchHeader0[25] = 1; + }); + + it("should revert when ErrorInvalidBatchHeaderVersion", async () => { + const header = new Uint8Array(121); + header[0] = 2; + await expect(chain.commitBatch(1, header, ["0x"], "0x")).to.revertedWithCustomError( + chain, + "ErrorInvalidBatchHeaderVersion" + ); + await expect(chain.commitBatch(2, batchHeader0, ["0x"], "0x")).to.revertedWithCustomError( + chain, + "ErrorInvalidBatchHeaderVersion" + ); + }); + + it("should revert when ErrorNoBlobFound", async () => { + await expect(chain.commitBatch(1, batchHeader0, ["0x"], "0x")).to.revertedWithCustomError( + chain, + "ErrorNoBlobFound" + ); + }); + + /* Hardhat doesn't have support for EIP4844 yet. + const makeTransaction = async (data: string, value: bigint, blobVersionedHashes: Array) => { + const tx = new Transaction(); + tx.type = 3; + tx.to = await chain.getAddress(); + tx.data = data; + tx.nonce = await deployer.getNonce(); + tx.gasLimit = 1000000; + tx.maxPriorityFeePerGas = (await ethers.provider.getFeeData()).maxPriorityFeePerGas; + tx.maxFeePerGas = (await ethers.provider.getFeeData()).maxFeePerGas; + tx.value = value; + tx.chainId = (await ethers.provider.getNetwork()).chainId; + tx.maxFeePerBlobGas = ethers.parseUnits("1", "gwei"); + tx.blobVersionedHashes = blobVersionedHashes; + return tx; + }; + + it("should revert when ErrorFoundMultipleBlob", async () => { + const data = chain.interface.encodeFunctionData("commitBatch", [1, batchHeader0, ["0x"], "0x"]); + const tx = await makeTransaction(data, 0n, [ZeroHash, ZeroHash]); + const signature = await deployer.signMessage(tx.unsignedHash); + tx.signature = Signature.from(signature); + const r = await ethers.provider.broadcastTransaction(tx.serialized); + await expect(r).to.revertedWithCustomError(chain, "ErrorFoundMultipleBlob"); + }); + + it("should revert when ErrorNoBlockInChunk", async () => {}); + + it("should revert when ErrorIncorrectChunkLength", async () => {}); + + it("should revert when ErrorLastL1MessageSkipped", async () => {}); + + it("should revert when ErrorNumTxsLessThanNumL1Msgs", async () => {}); + + it("should revert when ErrorTooManyTxsInOneChunk", async () => {}); + + it("should revert when ErrorIncorrectBitmapLength", async () => {}); + + it("should succeed", async () => {}); + */ + }); +}); diff --git a/contracts/integration-test/ScrollChain.spec.ts b/contracts/integration-test/ScrollChain.spec.ts index 5ecf2268f..256a41017 100644 --- a/contracts/integration-test/ScrollChain.spec.ts +++ b/contracts/integration-test/ScrollChain.spec.ts @@ -1,8 +1,8 @@ /* eslint-disable node/no-unpublished-import */ /* eslint-disable node/no-missing-import */ -import { concat } from "ethers/lib/utils"; -import { constants } from "ethers"; +import { ZeroAddress, concat, getBytes } from "ethers"; import { ethers } from "hardhat"; + import { ScrollChain, L1MessageQueue } from "../typechain"; describe("ScrollChain", async () => { @@ -14,40 +14,28 @@ describe("ScrollChain", async () => { const EmptyContract = await ethers.getContractFactory("EmptyContract", deployer); const empty = await EmptyContract.deploy(); - await empty.deployed(); const ProxyAdmin = await ethers.getContractFactory("ProxyAdmin", deployer); const admin = await ProxyAdmin.deploy(); - await admin.deployed(); const TransparentUpgradeableProxy = await ethers.getContractFactory("TransparentUpgradeableProxy", deployer); - const queueProxy = await TransparentUpgradeableProxy.deploy(empty.address, admin.address, "0x"); - await queueProxy.deployed(); - const chainProxy = await TransparentUpgradeableProxy.deploy(empty.address, admin.address, "0x"); - await chainProxy.deployed(); + const queueProxy = await TransparentUpgradeableProxy.deploy(empty.getAddress(), admin.getAddress(), "0x"); + const chainProxy = await TransparentUpgradeableProxy.deploy(empty.getAddress(), admin.getAddress(), "0x"); const L1MessageQueue = await ethers.getContractFactory("L1MessageQueue", deployer); - const queueImpl = await L1MessageQueue.deploy(constants.AddressZero, chainProxy.address, deployer.address); - await queueImpl.deployed(); - await admin.upgrade(queueProxy.address, queueImpl.address); + const queueImpl = await L1MessageQueue.deploy(ZeroAddress, chainProxy.getAddress(), deployer.address); + await admin.upgrade(queueProxy.getAddress(), queueImpl.getAddress()); const ScrollChain = await ethers.getContractFactory("ScrollChain", deployer); - const chainImpl = await ScrollChain.deploy(0, queueProxy.address, deployer.address); - await chainImpl.deployed(); - await admin.upgrade(chainProxy.address, chainImpl.address); + const chainImpl = await ScrollChain.deploy(0, queueProxy.getAddress(), deployer.address); + await admin.upgrade(chainProxy.getAddress(), chainImpl.getAddress()); - queue = await ethers.getContractAt("L1MessageQueue", queueProxy.address, deployer); - chain = await ethers.getContractAt("ScrollChain", chainProxy.address, deployer); + queue = await ethers.getContractAt("L1MessageQueue", await queueProxy.getAddress(), deployer); + chain = await ethers.getContractAt("ScrollChain", await chainProxy.getAddress(), deployer); - await chain.initialize(queue.address, constants.AddressZero, 100); + await chain.initialize(queue.getAddress(), ZeroAddress, 100); await chain.addSequencer(deployer.address); - await queue.initialize( - constants.AddressZero, - chain.address, - constants.AddressZero, - constants.AddressZero, - 10000000 - ); + await queue.initialize(ZeroAddress, chain.getAddress(), ZeroAddress, ZeroAddress, 10000000); }); // @note skip this benchmark tests @@ -82,12 +70,12 @@ describe("ScrollChain", async () => { for (let i = 0; i < numChunks; i++) { const txsInChunk: Array = []; for (let j = 0; j < numBlocks; j++) { - txsInChunk.push(concat(txs)); + txsInChunk.push(getBytes(concat(txs))); } - chunks.push(concat([chunk, concat(txsInChunk)])); + chunks.push(getBytes(concat([chunk, concat(txsInChunk)]))); } - const estimateGas = await chain.estimateGas.commitBatch(0, batchHeader0, chunks, "0x"); + const estimateGas = await chain.commitBatch.estimateGas(0, batchHeader0, chunks, "0x"); console.log( `${numChunks}`, `${numBlocks}`, diff --git a/contracts/integration-test/ZkEvmVerifierV1.spec.ts b/contracts/integration-test/ZkEvmVerifierV1.spec.ts index d070b62e6..f20ffa85a 100644 --- a/contracts/integration-test/ZkEvmVerifierV1.spec.ts +++ b/contracts/integration-test/ZkEvmVerifierV1.spec.ts @@ -1,14 +1,15 @@ /* eslint-disable node/no-unpublished-import */ /* eslint-disable node/no-missing-import */ +import { HardhatEthersSigner } from "@nomicfoundation/hardhat-ethers/signers"; import { expect } from "chai"; -import { hexlify } from "ethers/lib/utils"; -import { ethers } from "hardhat"; -import { ZkEvmVerifierV1 } from "../typechain"; -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; +import { hexlify } from "ethers"; import fs from "fs"; +import { ethers } from "hardhat"; + +import { ZkEvmVerifierV1 } from "../typechain"; describe("ZkEvmVerifierV1", async () => { - let deployer: SignerWithAddress; + let deployer: HardhatEthersSigner; let zkEvmVerifier: ZkEvmVerifierV1; @@ -20,8 +21,7 @@ describe("ZkEvmVerifierV1", async () => { const receipt = await tx.wait(); const ZkEvmVerifierV1 = await ethers.getContractFactory("ZkEvmVerifierV1", deployer); - zkEvmVerifier = await ZkEvmVerifierV1.deploy(receipt.contractAddress); - await zkEvmVerifier.deployed(); + zkEvmVerifier = await ZkEvmVerifierV1.deploy(receipt!.contractAddress!); }); it("should succeed", async () => { @@ -37,7 +37,7 @@ describe("ZkEvmVerifierV1", async () => { // verify ok await zkEvmVerifier.verify(proof, publicInputHash); - console.log("Gas Usage:", (await zkEvmVerifier.estimateGas.verify(proof, publicInputHash)).toString()); + console.log("Gas Usage:", (await zkEvmVerifier.verify.estimateGas(proof, publicInputHash)).toString()); // verify failed await expect(zkEvmVerifier.verify(proof, publicInputHash.reverse())).to.reverted; diff --git a/contracts/integration-test/ZkTrieVerifier.spec.ts b/contracts/integration-test/ZkTrieVerifier.spec.ts index f04242ab5..c76724af0 100644 --- a/contracts/integration-test/ZkTrieVerifier.spec.ts +++ b/contracts/integration-test/ZkTrieVerifier.spec.ts @@ -1,11 +1,11 @@ /* eslint-disable node/no-unpublished-import */ /* eslint-disable node/no-missing-import */ import { expect } from "chai"; -import { concat } from "ethers/lib/utils"; import { ethers } from "hardhat"; -import { MockZkTrieVerifier } from "../typechain"; import { generateABI, createCode } from "../scripts/poseidon"; +import { MockZkTrieVerifier } from "../typechain"; +import { concat } from "ethers"; const chars = "0123456789abcdef"; @@ -273,13 +273,10 @@ describe("ZkTrieVerifier", async () => { const [deployer] = await ethers.getSigners(); const PoseidonHashWithDomainFactory = new ethers.ContractFactory(generateABI(2), createCode(2), deployer); - const poseidon = await PoseidonHashWithDomainFactory.deploy(); - await poseidon.deployed(); const MockZkTrieVerifier = await ethers.getContractFactory("MockZkTrieVerifier", deployer); - verifier = await MockZkTrieVerifier.deploy(poseidon.address); - await verifier.deployed(); + verifier = await MockZkTrieVerifier.deploy(poseidon.getAddress()); }); const shouldRevert = async (test: ITestConfig, reason: string, extra?: string) => { @@ -308,6 +305,28 @@ describe("ZkTrieVerifier", async () => { }); } + it("should revert, when InvalidNodeDepth", async () => { + const test = testcases[0]; + { + const proof = concat([ + `0xfa`, + ...test.accountProof, + `0x${test.storageProof.length.toString(16).padStart(2, "0")}`, + ...test.storageProof, + ]); + await expect(verifier.verifyZkTrieProof(test.account, test.storage, proof)).to.revertedWith("InvalidNodeDepth"); + } + { + const proof = concat([ + `0x${test.accountProof.length.toString(16).padStart(2, "0")}`, + ...test.accountProof, + `0xfa`, + ...test.storageProof, + ]); + await expect(verifier.verifyZkTrieProof(test.account, test.storage, proof)).to.revertedWith("InvalidNodeDepth"); + } + }); + it("should revert, when InvalidBranchNodeType", async () => { const test = testcases[0]; for (const i of [0, 1, test.accountProof.length - 3]) { @@ -434,7 +453,7 @@ describe("ZkTrieVerifier", async () => { it("should revert, when InvalidAccountKeyPreimage", async () => { const test = testcases[0]; const index = test.accountProof.length - 2; - const correct = test.accountProof[index]; + const correct = test.accountProof[index].slice(); for (const p of [398, 438]) { const v = correct[p]; for (let b = 0; b < 3; ++b) { @@ -449,7 +468,7 @@ describe("ZkTrieVerifier", async () => { it("should revert, when InvalidProofMagicBytes", async () => { const test = testcases[0]; let index = test.accountProof.length - 1; - let correct = test.accountProof[index]; + let correct = test.accountProof[index].slice(); for (const p of [2, 32, 91]) { const v = correct[p]; for (let b = 0; b < 3; ++b) { @@ -461,7 +480,7 @@ describe("ZkTrieVerifier", async () => { } index = test.storageProof.length - 1; - correct = test.storageProof[index]; + correct = test.storageProof[index].slice(); for (const p of [2, 32, 91]) { const v = correct[p]; for (let b = 0; b < 3; ++b) { @@ -475,13 +494,14 @@ describe("ZkTrieVerifier", async () => { it("should revert, when InvalidAccountLeafNodeHash", async () => { const test = testcases[0]; - const correct = test.storageProof.slice(); - test.storageProof = [ - "0x05", - "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449", - ]; + const correct = test.accountProof[test.accountProof.length - 2]; + // change nonce + test.accountProof[test.accountProof.length - 2] = correct.replace( + "0x0420e9fb498ff9c35246d527da24aa1710d2cc9b055ecf9a95a8a2a11d3d836cdf050800000", + "0x0420e9fb498ff9c35246d527da24aa1710d2cc9b055ecf9a95a8a2a11d3d836cdf050800001" + ); await shouldRevert(test, "InvalidAccountLeafNodeHash"); - test.storageProof = correct; + test.accountProof[test.accountProof.length - 2] = correct; }); it("should revert, when InvalidStorageLeafNodeType", async () => { diff --git a/contracts/package.json b/contracts/package.json index 4f0209651..f506802ea 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -16,44 +16,47 @@ "prepare": "cd .. && husky install contracts/.husky" }, "devDependencies": { - "@nomiclabs/hardhat-ethers": "^2.0.0", - "@nomiclabs/hardhat-etherscan": "^3.0.0", - "@nomiclabs/hardhat-waffle": "^2.0.0", + "@nomicfoundation/hardhat-chai-matchers": "^2.0.6", + "@nomicfoundation/hardhat-ethers": "^3.0.5", + "@nomicfoundation/hardhat-verify": "^2.0.5", "@primitivefi/hardhat-dodoc": "^0.2.3", - "@typechain/ethers-v5": "^7.0.1", - "@typechain/hardhat": "^2.3.0", + "@typechain/ethers-v6": "^0.5.1", + "@typechain/hardhat": "^9.1.0", "@types/chai": "^4.2.21", "@types/edit-json-file": "^1.7.0", "@types/mocha": "^9.0.0", - "@types/node": "^12.0.0", - "@typescript-eslint/eslint-plugin": "^4.29.1", - "@typescript-eslint/parser": "^4.29.1", + "@types/node": "^20.11.27", + "@typescript-eslint/eslint-plugin": "^7.2.0", + "@typescript-eslint/parser": "^7.2.0", "chai": "^4.2.0", "circom": "^0.5.46", "circomlib": "^0.5.0", "dotenv": "^10.0.0", "edit-json-file": "^1.7.0", - "eslint": "^7.29.0", + "eslint": "^8.57.0", "eslint-config-prettier": "^8.3.0", - "eslint-config-standard": "^16.0.3", + "eslint-config-standard": "^17.1.0", "eslint-plugin-import": "^2.23.4", + "eslint-plugin-n": "^16.6.2", "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "^3.4.0", - "eslint-plugin-promise": "^5.1.0", + "eslint-plugin-promise": "^6.1.1", "ethereum-waffle": "^3.0.0", - "ethers": "^5.0.0", - "hardhat": "^2.9.3", + "ethers": "^6.11.1", + "hardhat": "^2.22.0", "hardhat-gas-reporter": "^1.0.4", "husky": "^8.0.1", "lint-staged": "^13.0.3", + "lodash": "^4.17.21", "prettier": "^2.3.2", "prettier-plugin-solidity": "^1.0.0-beta.13", "solhint": "^3.3.6", - "solidity-coverage": "^0.7.16", + "solidity-coverage": "^0.8.11", + "squirrelly": "8.0.8", "toml": "^3.0.0", "ts-node": "^10.1.0", - "typechain": "^5.1.2", - "typescript": "^4.5.2" + "typechain": "^8.3.2", + "typescript": "^5.4.2" }, "dependencies": { "@openzeppelin/contracts": "^v4.9.3", @@ -63,5 +66,8 @@ "*.{js,ts}": "npx eslint --cache --fix", "!(docs/apis/*).md": "prettier --ignore-unknown --write", "*.sol": "prettier --ignore-unknown --write" + }, + "engines": { + "node": ">=10.4.0" } } diff --git a/contracts/scripts/foundry/DeployFallbackContracts.s.sol b/contracts/scripts/foundry/DeployFallbackContracts.s.sol index 8f5099b4a..ac0f226e6 100644 --- a/contracts/scripts/foundry/DeployFallbackContracts.s.sol +++ b/contracts/scripts/foundry/DeployFallbackContracts.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity =0.8.16; +pragma solidity =0.8.24; // solhint-disable no-console diff --git a/contracts/scripts/foundry/DeployL1BridgeContracts.s.sol b/contracts/scripts/foundry/DeployL1BridgeContracts.s.sol index 511b8b6f0..2733f4767 100644 --- a/contracts/scripts/foundry/DeployL1BridgeContracts.s.sol +++ b/contracts/scripts/foundry/DeployL1BridgeContracts.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity =0.8.16; +pragma solidity =0.8.24; // solhint-disable no-console @@ -92,7 +92,11 @@ contract DeployL1BridgeContracts is Script { } function deployMultipleVersionRollupVerifier() internal { - rollupVerifier = new MultipleVersionRollupVerifier(address(zkEvmVerifierV1)); + uint256[] memory _versions = new uint256[](1); + address[] memory _verifiers = new address[](1); + _versions[0] = 0; + _verifiers[0] = address(zkEvmVerifierV1); + rollupVerifier = new MultipleVersionRollupVerifier(L1_SCROLL_CHAIN_PROXY_ADDR, _versions, _verifiers); logAddress("L1_MULTIPLE_VERSION_ROLLUP_VERIFIER_ADDR", address(rollupVerifier)); } diff --git a/contracts/scripts/foundry/DeployL1BridgeProxyPlaceholder.s.sol b/contracts/scripts/foundry/DeployL1BridgeProxyPlaceholder.s.sol index 3a441390a..2d9afe4ea 100644 --- a/contracts/scripts/foundry/DeployL1BridgeProxyPlaceholder.s.sol +++ b/contracts/scripts/foundry/DeployL1BridgeProxyPlaceholder.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity =0.8.16; +pragma solidity =0.8.24; // solhint-disable no-console diff --git a/contracts/scripts/foundry/DeployL1ScrollOwner.s.sol b/contracts/scripts/foundry/DeployL1ScrollOwner.s.sol index b8b6c12f5..3eda44644 100644 --- a/contracts/scripts/foundry/DeployL1ScrollOwner.s.sol +++ b/contracts/scripts/foundry/DeployL1ScrollOwner.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; diff --git a/contracts/scripts/foundry/DeployL2BridgeContracts.s.sol b/contracts/scripts/foundry/DeployL2BridgeContracts.s.sol index 061d5da04..5ea907707 100644 --- a/contracts/scripts/foundry/DeployL2BridgeContracts.s.sol +++ b/contracts/scripts/foundry/DeployL2BridgeContracts.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity =0.8.16; +pragma solidity =0.8.24; // solhint-disable no-console diff --git a/contracts/scripts/foundry/DeployL2BridgeProxyPlaceholder.s.sol b/contracts/scripts/foundry/DeployL2BridgeProxyPlaceholder.s.sol index 8f4432a24..94c214b99 100644 --- a/contracts/scripts/foundry/DeployL2BridgeProxyPlaceholder.s.sol +++ b/contracts/scripts/foundry/DeployL2BridgeProxyPlaceholder.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity =0.8.16; +pragma solidity =0.8.24; // solhint-disable no-console diff --git a/contracts/scripts/foundry/DeployL2ScrollOwner.s.sol b/contracts/scripts/foundry/DeployL2ScrollOwner.s.sol index bf8558d1d..fe20dac0a 100644 --- a/contracts/scripts/foundry/DeployL2ScrollOwner.s.sol +++ b/contracts/scripts/foundry/DeployL2ScrollOwner.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; diff --git a/contracts/scripts/foundry/DeployScrollChainCommitmentVerifier.s.sol b/contracts/scripts/foundry/DeployScrollChainCommitmentVerifier.s.sol index 121c86faa..1347b0173 100644 --- a/contracts/scripts/foundry/DeployScrollChainCommitmentVerifier.s.sol +++ b/contracts/scripts/foundry/DeployScrollChainCommitmentVerifier.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; diff --git a/contracts/scripts/foundry/DeployWeth.s.sol b/contracts/scripts/foundry/DeployWeth.s.sol index f1837c8b4..3b1976d71 100644 --- a/contracts/scripts/foundry/DeployWeth.s.sol +++ b/contracts/scripts/foundry/DeployWeth.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {Script} from "forge-std/Script.sol"; import {console} from "forge-std/console.sol"; diff --git a/contracts/scripts/foundry/InitializeL1BridgeContracts.s.sol b/contracts/scripts/foundry/InitializeL1BridgeContracts.s.sol index da4201e52..790cea353 100644 --- a/contracts/scripts/foundry/InitializeL1BridgeContracts.s.sol +++ b/contracts/scripts/foundry/InitializeL1BridgeContracts.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {Script} from "forge-std/Script.sol"; @@ -96,9 +96,6 @@ contract InitializeL1BridgeContracts is Script { ScrollChain(L1_SCROLL_CHAIN_PROXY_ADDR).addSequencer(L1_COMMIT_SENDER_ADDRESS); ScrollChain(L1_SCROLL_CHAIN_PROXY_ADDR).addProver(L1_FINALIZE_SENDER_ADDRESS); - // initialize MultipleVersionRollupVerifier - MultipleVersionRollupVerifier(L1_MULTIPLE_VERSION_ROLLUP_VERIFIER_ADDR).initialize(L1_SCROLL_CHAIN_PROXY_ADDR); - // initialize L2GasPriceOracle L2GasPriceOracle(L2_GAS_PRICE_ORACLE_PROXY_ADDR).initialize( 21000, // _txGas diff --git a/contracts/scripts/foundry/InitializeL1ScrollOwner.s.sol b/contracts/scripts/foundry/InitializeL1ScrollOwner.s.sol index 5629ff1f3..b2af8e9d4 100644 --- a/contracts/scripts/foundry/InitializeL1ScrollOwner.s.sol +++ b/contracts/scripts/foundry/InitializeL1ScrollOwner.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {Script} from "forge-std/Script.sol"; diff --git a/contracts/scripts/foundry/InitializeL2BridgeContracts.s.sol b/contracts/scripts/foundry/InitializeL2BridgeContracts.s.sol index ec1ba712c..da522335f 100644 --- a/contracts/scripts/foundry/InitializeL2BridgeContracts.s.sol +++ b/contracts/scripts/foundry/InitializeL2BridgeContracts.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {Script} from "forge-std/Script.sol"; diff --git a/contracts/scripts/foundry/InitializeL2ScrollOwner.s.sol b/contracts/scripts/foundry/InitializeL2ScrollOwner.s.sol index 7ff2b8342..f01e8cbfd 100644 --- a/contracts/scripts/foundry/InitializeL2ScrollOwner.s.sol +++ b/contracts/scripts/foundry/InitializeL2ScrollOwner.s.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {Script} from "forge-std/Script.sol"; diff --git a/contracts/scripts/poseidon.ts b/contracts/scripts/poseidon.ts index 00883987a..274746ba4 100644 --- a/contracts/scripts/poseidon.ts +++ b/contracts/scripts/poseidon.ts @@ -1,5 +1,5 @@ /* eslint-disable node/no-missing-import */ -import { ethers } from "ethers"; +import { ethers, keccak256 } from "ethers"; import Contract from "circomlib/src/evmasm"; import * as constants from "circomlib/src/poseidon_constants"; @@ -90,10 +90,10 @@ export function createCode(nInputs: number) { C.calldataload(); C.div(); C.dup(0); - C.push(ethers.utils.keccak256(ethers.utils.toUtf8Bytes(`poseidon(uint256[${nInputs}],uint256)`)).slice(0, 10)); // poseidon(uint256[n],uint256) + C.push(keccak256(ethers.toUtf8Bytes(`poseidon(uint256[${nInputs}],uint256)`)).slice(0, 10)); // poseidon(uint256[n],uint256) C.eq(); C.swap(1); - C.push(ethers.utils.keccak256(ethers.utils.toUtf8Bytes(`poseidon(bytes32[${nInputs}],bytes32)`)).slice(0, 10)); // poseidon(bytes32[n],bytes32) + C.push(keccak256(ethers.toUtf8Bytes(`poseidon(bytes32[${nInputs}],bytes32)`)).slice(0, 10)); // poseidon(bytes32[n],bytes32) C.eq(); C.or(); C.jmpi("start"); diff --git a/contracts/src/External.sol b/contracts/src/External.sol index c21b3831d..5201e8c11 100644 --- a/contracts/src/External.sol +++ b/contracts/src/External.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {TimelockController} from "@openzeppelin/contracts/governance/TimelockController.sol"; import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; diff --git a/contracts/src/L1/IL1ScrollMessenger.sol b/contracts/src/L1/IL1ScrollMessenger.sol index e08aaa25c..4a8f2b9f8 100644 --- a/contracts/src/L1/IL1ScrollMessenger.sol +++ b/contracts/src/L1/IL1ScrollMessenger.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; import {IScrollMessenger} from "../libraries/IScrollMessenger.sol"; diff --git a/contracts/src/L1/L1ScrollMessenger.sol b/contracts/src/L1/L1ScrollMessenger.sol index c36e8580a..544beb2b9 100644 --- a/contracts/src/L1/L1ScrollMessenger.sol +++ b/contracts/src/L1/L1ScrollMessenger.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {IScrollChain} from "./rollup/IScrollChain.sol"; import {IL1MessageQueue} from "./rollup/IL1MessageQueue.sol"; diff --git a/contracts/src/L1/gateways/EnforcedTxGateway.sol b/contracts/src/L1/gateways/EnforcedTxGateway.sol index 873bbab2f..14b718e96 100644 --- a/contracts/src/L1/gateways/EnforcedTxGateway.sol +++ b/contracts/src/L1/gateways/EnforcedTxGateway.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import {ECDSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol"; diff --git a/contracts/src/L1/gateways/IL1ERC1155Gateway.sol b/contracts/src/L1/gateways/IL1ERC1155Gateway.sol index 93f422995..4a16b3a80 100644 --- a/contracts/src/L1/gateways/IL1ERC1155Gateway.sol +++ b/contracts/src/L1/gateways/IL1ERC1155Gateway.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; /// @title The interface for the ERC1155 cross chain gateway on layer 1. interface IL1ERC1155Gateway { diff --git a/contracts/src/L1/gateways/IL1ERC20Gateway.sol b/contracts/src/L1/gateways/IL1ERC20Gateway.sol index d1266de18..6b551b70f 100644 --- a/contracts/src/L1/gateways/IL1ERC20Gateway.sol +++ b/contracts/src/L1/gateways/IL1ERC20Gateway.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; interface IL1ERC20Gateway { /********** diff --git a/contracts/src/L1/gateways/IL1ERC721Gateway.sol b/contracts/src/L1/gateways/IL1ERC721Gateway.sol index b030348bd..e6a027aa2 100644 --- a/contracts/src/L1/gateways/IL1ERC721Gateway.sol +++ b/contracts/src/L1/gateways/IL1ERC721Gateway.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; /// @title The interface for the ERC721 cross chain gateway on layer 1. interface IL1ERC721Gateway { diff --git a/contracts/src/L1/gateways/IL1ETHGateway.sol b/contracts/src/L1/gateways/IL1ETHGateway.sol index b991bbf1c..16721996c 100644 --- a/contracts/src/L1/gateways/IL1ETHGateway.sol +++ b/contracts/src/L1/gateways/IL1ETHGateway.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; interface IL1ETHGateway { /********** diff --git a/contracts/src/L1/gateways/IL1GatewayRouter.sol b/contracts/src/L1/gateways/IL1GatewayRouter.sol index 08381600a..fd0aef9e6 100644 --- a/contracts/src/L1/gateways/IL1GatewayRouter.sol +++ b/contracts/src/L1/gateways/IL1GatewayRouter.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; import {IL1ETHGateway} from "./IL1ETHGateway.sol"; import {IL1ERC20Gateway} from "./IL1ERC20Gateway.sol"; diff --git a/contracts/src/L1/gateways/L1CustomERC20Gateway.sol b/contracts/src/L1/gateways/L1CustomERC20Gateway.sol index ab95fdaa9..e3af654a9 100644 --- a/contracts/src/L1/gateways/L1CustomERC20Gateway.sol +++ b/contracts/src/L1/gateways/L1CustomERC20Gateway.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {IERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; import {SafeERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; diff --git a/contracts/src/L1/gateways/L1ERC1155Gateway.sol b/contracts/src/L1/gateways/L1ERC1155Gateway.sol index 6e25f7c95..794d43ce5 100644 --- a/contracts/src/L1/gateways/L1ERC1155Gateway.sol +++ b/contracts/src/L1/gateways/L1ERC1155Gateway.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {IERC1155Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155Upgradeable.sol"; import {ERC1155HolderUpgradeable, ERC1155ReceiverUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC1155/utils/ERC1155HolderUpgradeable.sol"; diff --git a/contracts/src/L1/gateways/L1ERC20Gateway.sol b/contracts/src/L1/gateways/L1ERC20Gateway.sol index d50a0fc86..42c51144d 100644 --- a/contracts/src/L1/gateways/L1ERC20Gateway.sol +++ b/contracts/src/L1/gateways/L1ERC20Gateway.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; import {IERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; import {SafeERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; diff --git a/contracts/src/L1/gateways/L1ERC721Gateway.sol b/contracts/src/L1/gateways/L1ERC721Gateway.sol index a306a3ed0..f8ee61131 100644 --- a/contracts/src/L1/gateways/L1ERC721Gateway.sol +++ b/contracts/src/L1/gateways/L1ERC721Gateway.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {IERC721Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol"; import {ERC721HolderUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/utils/ERC721HolderUpgradeable.sol"; diff --git a/contracts/src/L1/gateways/L1ETHGateway.sol b/contracts/src/L1/gateways/L1ETHGateway.sol index 28346e956..c268a1ba0 100644 --- a/contracts/src/L1/gateways/L1ETHGateway.sol +++ b/contracts/src/L1/gateways/L1ETHGateway.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {IL2ETHGateway} from "../../L2/gateways/IL2ETHGateway.sol"; import {IL1ScrollMessenger} from "../IL1ScrollMessenger.sol"; diff --git a/contracts/src/L1/gateways/L1GatewayRouter.sol b/contracts/src/L1/gateways/L1GatewayRouter.sol index c9bbf1960..25bf1aa7d 100644 --- a/contracts/src/L1/gateways/L1GatewayRouter.sol +++ b/contracts/src/L1/gateways/L1GatewayRouter.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import {IERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; diff --git a/contracts/src/L1/gateways/L1StandardERC20Gateway.sol b/contracts/src/L1/gateways/L1StandardERC20Gateway.sol index 833ad4f90..ac31c37e1 100644 --- a/contracts/src/L1/gateways/L1StandardERC20Gateway.sol +++ b/contracts/src/L1/gateways/L1StandardERC20Gateway.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {ClonesUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/ClonesUpgradeable.sol"; import {IERC20MetadataUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol"; diff --git a/contracts/src/L1/gateways/L1WETHGateway.sol b/contracts/src/L1/gateways/L1WETHGateway.sol index c8d5ae81a..9adfd7af7 100644 --- a/contracts/src/L1/gateways/L1WETHGateway.sol +++ b/contracts/src/L1/gateways/L1WETHGateway.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {IWETH} from "../../interfaces/IWETH.sol"; import {IL2ERC20Gateway} from "../../L2/gateways/IL2ERC20Gateway.sol"; diff --git a/contracts/src/L1/gateways/usdc/L1USDCGateway.sol b/contracts/src/L1/gateways/usdc/L1USDCGateway.sol index 0ba117fb4..bae81de37 100644 --- a/contracts/src/L1/gateways/usdc/L1USDCGateway.sol +++ b/contracts/src/L1/gateways/usdc/L1USDCGateway.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {IFiatToken} from "../../../interfaces/IFiatToken.sol"; import {IUSDCBurnableSourceBridge} from "../../../interfaces/IUSDCBurnableSourceBridge.sol"; diff --git a/contracts/src/L1/gateways/usdc/draft-L1USDCGatewayCCTP.sol b/contracts/src/L1/gateways/usdc/draft-L1USDCGatewayCCTP.sol index 9306ce594..35d101a9b 100644 --- a/contracts/src/L1/gateways/usdc/draft-L1USDCGatewayCCTP.sol +++ b/contracts/src/L1/gateways/usdc/draft-L1USDCGatewayCCTP.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; diff --git a/contracts/src/L1/rollup/IL1MessageQueue.sol b/contracts/src/L1/rollup/IL1MessageQueue.sol index e28e99fee..210f2c8d9 100644 --- a/contracts/src/L1/rollup/IL1MessageQueue.sol +++ b/contracts/src/L1/rollup/IL1MessageQueue.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; interface IL1MessageQueue { /********** diff --git a/contracts/src/L1/rollup/IL1MessageQueueWithGasPriceOracle.sol b/contracts/src/L1/rollup/IL1MessageQueueWithGasPriceOracle.sol index dac5ecfed..610104431 100644 --- a/contracts/src/L1/rollup/IL1MessageQueueWithGasPriceOracle.sol +++ b/contracts/src/L1/rollup/IL1MessageQueueWithGasPriceOracle.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; import {IL1MessageQueue} from "./IL1MessageQueue.sol"; diff --git a/contracts/src/L1/rollup/IL2GasPriceOracle.sol b/contracts/src/L1/rollup/IL2GasPriceOracle.sol index 695e556c4..773c1c956 100644 --- a/contracts/src/L1/rollup/IL2GasPriceOracle.sol +++ b/contracts/src/L1/rollup/IL2GasPriceOracle.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; interface IL2GasPriceOracle { /// @notice Return the latest known l2 base fee. diff --git a/contracts/src/L1/rollup/IScrollChain.sol b/contracts/src/L1/rollup/IScrollChain.sol index 1a98a0447..9a2d683e8 100644 --- a/contracts/src/L1/rollup/IScrollChain.sol +++ b/contracts/src/L1/rollup/IScrollChain.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; interface IScrollChain { /********** @@ -24,12 +24,20 @@ interface IScrollChain { /// @param withdrawRoot The merkle root on layer2 after this batch. event FinalizeBatch(uint256 indexed batchIndex, bytes32 indexed batchHash, bytes32 stateRoot, bytes32 withdrawRoot); - /********** - * Errors * - **********/ + /// @notice Emitted when owner updates the status of sequencer. + /// @param account The address of account updated. + /// @param status The status of the account updated. + event UpdateSequencer(address indexed account, bool status); - /// @dev Thrown when the given address is `address(0)`. - error ErrorZeroAddress(); + /// @notice Emitted when owner updates the status of prover. + /// @param account The address of account updated. + /// @param status The status of the account updated. + event UpdateProver(address indexed account, bool status); + + /// @notice Emitted when the value of `maxNumTxInChunk` is updated. + /// @param oldMaxNumTxInChunk The old value of `maxNumTxInChunk`. + /// @param newMaxNumTxInChunk The new value of `maxNumTxInChunk`. + event UpdateMaxNumTxInChunk(uint256 oldMaxNumTxInChunk, uint256 newMaxNumTxInChunk); /************************* * Public View Functions * @@ -102,4 +110,46 @@ interface IScrollChain { bytes32 postStateRoot, bytes32 withdrawRoot ) external; + + /// @notice Finalize a committed batch (with blob) on layer 1. + /// + /// @dev Memory layout of `blobDataProof`: + /// | z | y | kzg_commitment | kzg_proof | + /// |---------|---------|----------------|-----------| + /// | bytes32 | bytes32 | bytes48 | bytes48 | + /// + /// @param batchHeader The header of current batch, see the encoding in comments of `commitBatch. + /// @param prevStateRoot The state root of parent batch. + /// @param postStateRoot The state root of current batch. + /// @param withdrawRoot The withdraw trie root of current batch. + /// @param blobDataProof The proof for blob data. + /// @param aggrProof The aggregation proof for current batch. + function finalizeBatchWithProof4844( + bytes calldata batchHeader, + bytes32 prevStateRoot, + bytes32 postStateRoot, + bytes32 withdrawRoot, + bytes calldata blobDataProof, + bytes calldata aggrProof + ) external; + + /// @notice Finalize a committed batch (with blob) on layer 1 without providing proof. + /// + /// @dev Memory layout of `blobDataProof`: + /// | z | y | kzg_commitment | kzg_proof | + /// |---------|---------|----------------|-----------| + /// | bytes32 | bytes32 | bytes48 | bytes48 | + /// + /// @param batchHeader The header of current batch, see the encoding in comments of `commitBatch. + /// @param prevStateRoot The state root of parent batch. + /// @param postStateRoot The state root of current batch. + /// @param withdrawRoot The withdraw trie root of current batch. + /// @param blobDataProof The proof for blob data. + function finalizeBatch4844( + bytes calldata batchHeader, + bytes32 prevStateRoot, + bytes32 postStateRoot, + bytes32 withdrawRoot, + bytes calldata blobDataProof + ) external; } diff --git a/contracts/src/L1/rollup/L1MessageQueue.sol b/contracts/src/L1/rollup/L1MessageQueue.sol index 29c236b9d..6ffee522e 100644 --- a/contracts/src/L1/rollup/L1MessageQueue.sol +++ b/contracts/src/L1/rollup/L1MessageQueue.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import {BitMapsUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/structs/BitMapsUpgradeable.sol"; diff --git a/contracts/src/L1/rollup/L1MessageQueueWithGasPriceOracle.sol b/contracts/src/L1/rollup/L1MessageQueueWithGasPriceOracle.sol index 172f3ea1f..0be3acffc 100644 --- a/contracts/src/L1/rollup/L1MessageQueueWithGasPriceOracle.sol +++ b/contracts/src/L1/rollup/L1MessageQueueWithGasPriceOracle.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {IWhitelist} from "../../libraries/common/IWhitelist.sol"; import {IL1MessageQueue} from "./IL1MessageQueue.sol"; diff --git a/contracts/src/L1/rollup/L2GasPriceOracle.sol b/contracts/src/L1/rollup/L2GasPriceOracle.sol index 14549b282..4585621a0 100644 --- a/contracts/src/L1/rollup/L2GasPriceOracle.sol +++ b/contracts/src/L1/rollup/L2GasPriceOracle.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; diff --git a/contracts/src/L1/rollup/MultipleVersionRollupVerifier.sol b/contracts/src/L1/rollup/MultipleVersionRollupVerifier.sol index 3eda7b86e..ebfccb1e3 100644 --- a/contracts/src/L1/rollup/MultipleVersionRollupVerifier.sol +++ b/contracts/src/L1/rollup/MultipleVersionRollupVerifier.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; @@ -14,9 +14,30 @@ contract MultipleVersionRollupVerifier is IRollupVerifier, Ownable { **********/ /// @notice Emitted when the address of verifier is updated. + /// @param version The version of the verifier. /// @param startBatchIndex The start batch index when the verifier will be used. /// @param verifier The address of new verifier. - event UpdateVerifier(uint256 startBatchIndex, address verifier); + event UpdateVerifier(uint256 version, uint256 startBatchIndex, address verifier); + + /********** + * Errors * + **********/ + + /// @dev Thrown when the given address is `address(0)`. + error ErrorZeroAddress(); + + /// @dev Thrown when the given start batch index is finalized. + error ErrorStartBatchIndexFinalized(); + + /// @dev Thrown when the given start batch index is smaller than `latestVerifier.startBatchIndex`. + error ErrorStartBatchIndexTooSmall(); + + /************* + * Constants * + *************/ + + /// @notice The address of ScrollChain contract. + address immutable scrollChain; /*********** * Structs * @@ -33,29 +54,31 @@ contract MultipleVersionRollupVerifier is IRollupVerifier, Ownable { * Variables * *************/ - /// @notice The list of legacy zkevm verifier, sorted by batchIndex in increasing order. - Verifier[] public legacyVerifiers; + /// @notice Mapping from verifier version to the list of legacy zkevm verifiers. + /// The verifiers are sorted by batchIndex in increasing order. + mapping(uint256 => Verifier[]) public legacyVerifiers; - /// @notice The lastest used zkevm verifier. - Verifier public latestVerifier; - - /// @notice The address of ScrollChain contract. - address public scrollChain; + /// @notice Mapping from verifier version to the lastest used zkevm verifier. + mapping(uint256 => Verifier) public latestVerifier; /*************** * Constructor * ***************/ - constructor(address _verifier) { - require(_verifier != address(0), "zero verifier address"); - - latestVerifier.verifier = _verifier; - } - - function initialize(address _scrollChain) external onlyOwner { - require(scrollChain == address(0), "initialized"); - + constructor( + address _scrollChain, + uint256[] memory _versions, + address[] memory _verifiers + ) { + if (_scrollChain == address(0)) revert ErrorZeroAddress(); scrollChain = _scrollChain; + + for (uint256 i = 0; i < _versions.length; i++) { + if (_verifiers[i] == address(0)) revert ErrorZeroAddress(); + latestVerifier[_versions[i]].verifier = _verifiers[i]; + + emit UpdateVerifier(_versions[i], 0, _verifiers[i]); + } } /************************* @@ -63,23 +86,24 @@ contract MultipleVersionRollupVerifier is IRollupVerifier, Ownable { *************************/ /// @notice Return the number of legacy verifiers. - function legacyVerifiersLength() external view returns (uint256) { - return legacyVerifiers.length; + function legacyVerifiersLength(uint256 _version) external view returns (uint256) { + return legacyVerifiers[_version].length; } /// @notice Compute the verifier should be used for specific batch. + /// @param _version The version of verifier to query. /// @param _batchIndex The batch index to query. - function getVerifier(uint256 _batchIndex) public view returns (address) { + function getVerifier(uint256 _version, uint256 _batchIndex) public view returns (address) { // Normally, we will use the latest verifier. - Verifier memory _verifier = latestVerifier; + Verifier memory _verifier = latestVerifier[_version]; if (_verifier.startBatchIndex > _batchIndex) { - uint256 _length = legacyVerifiers.length; + uint256 _length = legacyVerifiers[_version].length; // In most case, only last few verifier will be used by `ScrollChain`. // So, we use linear search instead of binary search. unchecked { for (uint256 i = _length; i > 0; --i) { - _verifier = legacyVerifiers[i - 1]; + _verifier = legacyVerifiers[_version][i - 1]; if (_verifier.startBatchIndex <= _batchIndex) break; } } @@ -98,7 +122,19 @@ contract MultipleVersionRollupVerifier is IRollupVerifier, Ownable { bytes calldata _aggrProof, bytes32 _publicInputHash ) external view override { - address _verifier = getVerifier(_batchIndex); + address _verifier = getVerifier(0, _batchIndex); + + IZkEvmVerifier(_verifier).verify(_aggrProof, _publicInputHash); + } + + /// @inheritdoc IRollupVerifier + function verifyAggregateProof( + uint256 _version, + uint256 _batchIndex, + bytes calldata _aggrProof, + bytes32 _publicInputHash + ) external view override { + address _verifier = getVerifier(_version, _batchIndex); IZkEvmVerifier(_verifier).verify(_aggrProof, _publicInputHash); } @@ -110,21 +146,29 @@ contract MultipleVersionRollupVerifier is IRollupVerifier, Ownable { /// @notice Update the address of zkevm verifier. /// @param _startBatchIndex The start batch index when the verifier will be used. /// @param _verifier The address of new verifier. - function updateVerifier(uint64 _startBatchIndex, address _verifier) external onlyOwner { - require(_startBatchIndex > IScrollChain(scrollChain).lastFinalizedBatchIndex(), "start batch index finalized"); + function updateVerifier( + uint256 _version, + uint64 _startBatchIndex, + address _verifier + ) external onlyOwner { + if (_startBatchIndex <= IScrollChain(scrollChain).lastFinalizedBatchIndex()) + revert ErrorStartBatchIndexFinalized(); - Verifier memory _latestVerifier = latestVerifier; - require(_startBatchIndex >= _latestVerifier.startBatchIndex, "start batch index too small"); - require(_verifier != address(0), "zero verifier address"); + Verifier memory _latestVerifier = latestVerifier[_version]; + if (_startBatchIndex < _latestVerifier.startBatchIndex) revert ErrorStartBatchIndexTooSmall(); + if (_verifier == address(0)) revert ErrorZeroAddress(); if (_latestVerifier.startBatchIndex < _startBatchIndex) { - legacyVerifiers.push(_latestVerifier); + // don't push when it is the first update of the version. + if (_latestVerifier.verifier != address(0)) { + legacyVerifiers[_version].push(_latestVerifier); + } _latestVerifier.startBatchIndex = _startBatchIndex; } _latestVerifier.verifier = _verifier; - latestVerifier = _latestVerifier; + latestVerifier[_version] = _latestVerifier; - emit UpdateVerifier(_startBatchIndex, _verifier); + emit UpdateVerifier(_version, _startBatchIndex, _verifier); } } diff --git a/contracts/src/L1/rollup/ScrollChain.sol b/contracts/src/L1/rollup/ScrollChain.sol index 8a14205f7..62299f720 100644 --- a/contracts/src/L1/rollup/ScrollChain.sol +++ b/contracts/src/L1/rollup/ScrollChain.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; @@ -8,7 +8,9 @@ import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/security/ import {IL1MessageQueue} from "./IL1MessageQueue.sol"; import {IScrollChain} from "./IScrollChain.sol"; import {BatchHeaderV0Codec} from "../../libraries/codec/BatchHeaderV0Codec.sol"; -import {ChunkCodec} from "../../libraries/codec/ChunkCodec.sol"; +import {BatchHeaderV1Codec} from "../../libraries/codec/BatchHeaderV1Codec.sol"; +import {ChunkCodecV0} from "../../libraries/codec/ChunkCodecV0.sol"; +import {ChunkCodecV1} from "../../libraries/codec/ChunkCodecV1.sol"; import {IRollupVerifier} from "../../libraries/verifier/IRollupVerifier.sol"; // solhint-disable no-inline-assembly @@ -18,28 +20,107 @@ import {IRollupVerifier} from "../../libraries/verifier/IRollupVerifier.sol"; /// @notice This contract maintains data for the Scroll rollup. contract ScrollChain is OwnableUpgradeable, PausableUpgradeable, IScrollChain { /********** - * Events * + * Errors * **********/ - /// @notice Emitted when owner updates the status of sequencer. - /// @param account The address of account updated. - /// @param status The status of the account updated. - event UpdateSequencer(address indexed account, bool status); + /// @dev Thrown when the given account is not EOA account. + error ErrorAccountIsNotEOA(); - /// @notice Emitted when owner updates the status of prover. - /// @param account The address of account updated. - /// @param status The status of the account updated. - event UpdateProver(address indexed account, bool status); + /// @dev Thrown when committing a committed batch. + error ErrorBatchIsAlreadyCommitted(); - /// @notice Emitted when the value of `maxNumTxInChunk` is updated. - /// @param oldMaxNumTxInChunk The old value of `maxNumTxInChunk`. - /// @param newMaxNumTxInChunk The new value of `maxNumTxInChunk`. - event UpdateMaxNumTxInChunk(uint256 oldMaxNumTxInChunk, uint256 newMaxNumTxInChunk); + /// @dev Thrown when finalizing a verified batch. + error ErrorBatchIsAlreadyVerified(); + + /// @dev Thrown when committing empty batch (batch without chunks) + error ErrorBatchIsEmpty(); + + /// @dev Thrown when call precompile failed. + error ErrorCallPointEvaluationPrecompileFailed(); + + /// @dev Thrown when the caller is not prover. + error ErrorCallerIsNotProver(); + + /// @dev Thrown when the caller is not sequencer. + error ErrorCallerIsNotSequencer(); + + /// @dev Thrown when the transaction has multiple blobs. + error ErrorFoundMultipleBlob(); + + /// @dev Thrown when some fields are not zero in genesis batch. + error ErrorGenesisBatchHasNonZeroField(); + + /// @dev Thrown when importing genesis batch twice. + error ErrorGenesisBatchImported(); + + /// @dev Thrown when data hash in genesis batch is zero. + error ErrorGenesisDataHashIsZero(); + + /// @dev Thrown when the parent batch hash in genesis batch is zero. + error ErrorGenesisParentBatchHashIsNonZero(); + + /// @dev Thrown when the l2 transaction is incomplete. + error ErrorIncompleteL2TransactionData(); + + /// @dev Thrown when the batch hash is incorrect. + error ErrorIncorrectBatchHash(); + + /// @dev Thrown when the batch index is incorrect. + error ErrorIncorrectBatchIndex(); + + /// @dev Thrown when the bitmap length is incorrect. + error ErrorIncorrectBitmapLength(); + + /// @dev Thrown when the previous state root doesn't match stored one. + error ErrorIncorrectPreviousStateRoot(); + + /// @dev Thrown when the batch header version is invalid. + error ErrorInvalidBatchHeaderVersion(); + + /// @dev Thrown when the last message is skipped. + error ErrorLastL1MessageSkipped(); + + /// @dev Thrown when no blob found in the transaction. + error ErrorNoBlobFound(); + + /// @dev Thrown when the number of transactions is less than number of L1 message in one block. + error ErrorNumTxsLessThanNumL1Msgs(); + + /// @dev Thrown when the given previous state is zero. + error ErrorPreviousStateRootIsZero(); + + /// @dev Thrown when the number of batches to revert is zero. + error ErrorRevertZeroBatches(); + + /// @dev Thrown when the reverted batches are not in the ending of commited batch chain. + error ErrorRevertNotStartFromEnd(); + + /// @dev Thrown when reverting a finialized batch. + error ErrorRevertFinalizedBatch(); + + /// @dev Thrown when the given state root is zero. + error ErrorStateRootIsZero(); + + /// @dev Thrown when a chunk contains too many transactions. + error ErrorTooManyTxsInOneChunk(); + + /// @dev Thrown when the precompile output is incorrect. + error ErrorUnexpectedPointEvaluationPrecompileOutput(); + + /// @dev Thrown when the given address is `address(0)`. + error ErrorZeroAddress(); /************* * Constants * *************/ + /// @dev Address of the point evaluation precompile used for EIP-4844 blob verification. + address constant POINT_EVALUATION_PRECOMPILE_ADDR = address(0x0A); + + /// @dev BLS Modulus value defined in EIP-4844 and the magic value returned from a successful call to the + /// point evaluation precompile + uint256 constant BLS_MODULUS = 52435875175126190479447740508185965837690552500527637822603658699938581184513; + /// @notice The chain id of the corresponding layer 2 chain. uint64 public immutable layer2ChainId; @@ -86,12 +167,12 @@ contract ScrollChain is OwnableUpgradeable, PausableUpgradeable, IScrollChain { modifier OnlySequencer() { // @note In the decentralized mode, it should be only called by a list of validator. - require(isSequencer[_msgSender()], "caller not sequencer"); + if (!isSequencer[_msgSender()]) revert ErrorCallerIsNotSequencer(); _; } modifier OnlyProver() { - require(isProver[_msgSender()], "caller not prover"); + if (!isProver[_msgSender()]) revert ErrorCallerIsNotProver(); _; } @@ -157,23 +238,23 @@ contract ScrollChain is OwnableUpgradeable, PausableUpgradeable, IScrollChain { /// @notice Import layer 2 genesis block function importGenesisBatch(bytes calldata _batchHeader, bytes32 _stateRoot) external { // check genesis batch header length - require(_stateRoot != bytes32(0), "zero state root"); + if (_stateRoot == bytes32(0)) revert ErrorStateRootIsZero(); // check whether the genesis batch is imported - require(finalizedStateRoots[0] == bytes32(0), "Genesis batch imported"); + if (finalizedStateRoots[0] != bytes32(0)) revert ErrorGenesisBatchImported(); - (uint256 memPtr, bytes32 _batchHash) = _loadBatchHeader(_batchHeader); + (uint256 memPtr, bytes32 _batchHash, , ) = _loadBatchHeader(_batchHeader); // check all fields except `dataHash` and `lastBlockHash` are zero unchecked { - uint256 sum = BatchHeaderV0Codec.version(memPtr) + - BatchHeaderV0Codec.batchIndex(memPtr) + - BatchHeaderV0Codec.l1MessagePopped(memPtr) + - BatchHeaderV0Codec.totalL1MessagePopped(memPtr); - require(sum == 0, "not all fields are zero"); + uint256 sum = BatchHeaderV0Codec.getVersion(memPtr) + + BatchHeaderV0Codec.getBatchIndex(memPtr) + + BatchHeaderV0Codec.getL1MessagePopped(memPtr) + + BatchHeaderV0Codec.getTotalL1MessagePopped(memPtr); + if (sum != 0) revert ErrorGenesisBatchHasNonZeroField(); } - require(BatchHeaderV0Codec.dataHash(memPtr) != bytes32(0), "zero data hash"); - require(BatchHeaderV0Codec.parentBatchHash(memPtr) == bytes32(0), "nonzero parent batch hash"); + if (BatchHeaderV0Codec.getDataHash(memPtr) == bytes32(0)) revert ErrorGenesisDataHashIsZero(); + if (BatchHeaderV0Codec.getParentBatchHash(memPtr) != bytes32(0)) revert ErrorGenesisParentBatchHashIsNonZero(); committedBatches[0] = _batchHash; finalizedStateRoots[0] = _stateRoot; @@ -189,89 +270,80 @@ contract ScrollChain is OwnableUpgradeable, PausableUpgradeable, IScrollChain { bytes[] memory _chunks, bytes calldata _skippedL1MessageBitmap ) external override OnlySequencer whenNotPaused { - require(_version == 0, "invalid version"); - // check whether the batch is empty - uint256 _chunksLength = _chunks.length; - require(_chunksLength > 0, "batch is empty"); + if (_chunks.length == 0) revert ErrorBatchIsEmpty(); - // The overall memory layout in this function is organized as follows - // +---------------------+-------------------+------------------+ - // | parent batch header | chunk data hashes | new batch header | - // +---------------------+-------------------+------------------+ - // ^ ^ ^ - // batchPtr dataPtr newBatchPtr (re-use var batchPtr) - // - // 1. We copy the parent batch header from calldata to memory starting at batchPtr - // 2. We store `_chunksLength` number of Keccak hashes starting at `dataPtr`. Each Keccak - // hash corresponds to the data hash of a chunk. So we reserve the memory region from - // `dataPtr` to `dataPtr + _chunkLength * 32` for the chunk data hashes. - // 3. The memory starting at `newBatchPtr` is used to store the new batch header and compute - // the batch hash. - - // the variable `batchPtr` will be reused later for the current batch - (uint256 batchPtr, bytes32 _parentBatchHash) = _loadBatchHeader(_parentBatchHeader); - - uint256 _batchIndex = BatchHeaderV0Codec.batchIndex(batchPtr); - uint256 _totalL1MessagesPoppedOverall = BatchHeaderV0Codec.totalL1MessagePopped(batchPtr); - require(committedBatches[_batchIndex] == _parentBatchHash, "incorrect parent batch hash"); - require(committedBatches[_batchIndex + 1] == 0, "batch already committed"); - - // load `dataPtr` and reserve the memory region for chunk data hashes - uint256 dataPtr; - assembly { - dataPtr := mload(0x40) - mstore(0x40, add(dataPtr, mul(_chunksLength, 32))) + (, bytes32 _parentBatchHash, uint256 _batchIndex, uint256 _totalL1MessagesPoppedOverall) = _loadBatchHeader( + _parentBatchHeader + ); + unchecked { + _batchIndex += 1; } + if (committedBatches[_batchIndex] != 0) revert ErrorBatchIsAlreadyCommitted(); - // compute the data hash for each chunk + bytes32 _batchHash; + uint256 batchPtr; + bytes32 _dataHash; uint256 _totalL1MessagesPoppedInBatch; - for (uint256 i = 0; i < _chunksLength; i++) { - uint256 _totalNumL1MessagesInChunk = _commitChunk( - dataPtr, - _chunks[i], - _totalL1MessagesPoppedInBatch, + if (_version == 0) { + (_dataHash, _totalL1MessagesPoppedInBatch) = _commitChunksV0( _totalL1MessagesPoppedOverall, + _chunks, _skippedL1MessageBitmap ); - - unchecked { - _totalL1MessagesPoppedInBatch += _totalNumL1MessagesInChunk; - _totalL1MessagesPoppedOverall += _totalNumL1MessagesInChunk; - dataPtr += 32; + assembly { + batchPtr := mload(0x40) + _totalL1MessagesPoppedOverall := add(_totalL1MessagesPoppedOverall, _totalL1MessagesPoppedInBatch) } + // store entries, the order matters + BatchHeaderV0Codec.storeVersion(batchPtr, 0); + BatchHeaderV0Codec.storeBatchIndex(batchPtr, _batchIndex); + BatchHeaderV0Codec.storeL1MessagePopped(batchPtr, _totalL1MessagesPoppedInBatch); + BatchHeaderV0Codec.storeTotalL1MessagePopped(batchPtr, _totalL1MessagesPoppedOverall); + BatchHeaderV0Codec.storeDataHash(batchPtr, _dataHash); + BatchHeaderV0Codec.storeParentBatchHash(batchPtr, _parentBatchHash); + BatchHeaderV0Codec.storeSkippedBitmap(batchPtr, _skippedL1MessageBitmap); + // compute batch hash + _batchHash = BatchHeaderV0Codec.computeBatchHash( + batchPtr, + BatchHeaderV0Codec.BATCH_HEADER_FIXED_LENGTH + _skippedL1MessageBitmap.length + ); + } else if (_version == 1) { + bytes32 blobVersionedHash; + (blobVersionedHash, _dataHash, _totalL1MessagesPoppedInBatch) = _commitChunksV1( + _totalL1MessagesPoppedOverall, + _chunks, + _skippedL1MessageBitmap + ); + assembly { + batchPtr := mload(0x40) + _totalL1MessagesPoppedOverall := add(_totalL1MessagesPoppedOverall, _totalL1MessagesPoppedInBatch) + } + // store entries, the order matters + BatchHeaderV1Codec.storeVersion(batchPtr, 1); + BatchHeaderV1Codec.storeBatchIndex(batchPtr, _batchIndex); + BatchHeaderV1Codec.storeL1MessagePopped(batchPtr, _totalL1MessagesPoppedInBatch); + BatchHeaderV1Codec.storeTotalL1MessagePopped(batchPtr, _totalL1MessagesPoppedOverall); + BatchHeaderV1Codec.storeDataHash(batchPtr, _dataHash); + BatchHeaderV1Codec.storeBlobVersionedHash(batchPtr, blobVersionedHash); + BatchHeaderV1Codec.storeParentBatchHash(batchPtr, _parentBatchHash); + BatchHeaderV1Codec.storeSkippedBitmap(batchPtr, _skippedL1MessageBitmap); + // compute batch hash + _batchHash = BatchHeaderV1Codec.computeBatchHash( + batchPtr, + BatchHeaderV1Codec.BATCH_HEADER_FIXED_LENGTH + _skippedL1MessageBitmap.length + ); + } else { + revert ErrorInvalidBatchHeaderVersion(); } // check the length of bitmap unchecked { - require( - ((_totalL1MessagesPoppedInBatch + 255) / 256) * 32 == _skippedL1MessageBitmap.length, - "wrong bitmap length" - ); + if (((_totalL1MessagesPoppedInBatch + 255) / 256) * 32 != _skippedL1MessageBitmap.length) { + revert ErrorIncorrectBitmapLength(); + } } - // compute the data hash for current batch - bytes32 _dataHash; - assembly { - let dataLen := mul(_chunksLength, 0x20) - _dataHash := keccak256(sub(dataPtr, dataLen), dataLen) - - batchPtr := mload(0x40) // reset batchPtr - _batchIndex := add(_batchIndex, 1) // increase batch index - } - - // store entries, the order matters - BatchHeaderV0Codec.storeVersion(batchPtr, _version); - BatchHeaderV0Codec.storeBatchIndex(batchPtr, _batchIndex); - BatchHeaderV0Codec.storeL1MessagePopped(batchPtr, _totalL1MessagesPoppedInBatch); - BatchHeaderV0Codec.storeTotalL1MessagePopped(batchPtr, _totalL1MessagesPoppedOverall); - BatchHeaderV0Codec.storeDataHash(batchPtr, _dataHash); - BatchHeaderV0Codec.storeParentBatchHash(batchPtr, _parentBatchHash); - BatchHeaderV0Codec.storeSkippedBitmap(batchPtr, _skippedL1MessageBitmap); - - // compute batch hash - bytes32 _batchHash = BatchHeaderV0Codec.computeBatchHash(batchPtr, 89 + _skippedL1MessageBitmap.length); - committedBatches[_batchIndex] = _batchHash; emit CommitBatch(_batchIndex, _batchHash); } @@ -280,18 +352,14 @@ contract ScrollChain is OwnableUpgradeable, PausableUpgradeable, IScrollChain { /// @dev If the owner want to revert a sequence of batches by sending multiple transactions, /// make sure to revert recent batches first. function revertBatch(bytes calldata _batchHeader, uint256 _count) external onlyOwner { - require(_count > 0, "count must be nonzero"); + if (_count == 0) revert ErrorRevertZeroBatches(); - (uint256 memPtr, bytes32 _batchHash) = _loadBatchHeader(_batchHeader); - - // check batch hash - uint256 _batchIndex = BatchHeaderV0Codec.batchIndex(memPtr); - require(committedBatches[_batchIndex] == _batchHash, "incorrect batch hash"); + (, bytes32 _batchHash, uint256 _batchIndex, ) = _loadBatchHeader(_batchHeader); // make sure no gap is left when reverting from the ending to the beginning. - require(committedBatches[_batchIndex + _count] == bytes32(0), "reverting must start from the ending"); + if (committedBatches[_batchIndex + _count] != bytes32(0)) revert ErrorRevertNotStartFromEnd(); // check finalization - require(_batchIndex > lastFinalizedBatchIndex, "can only revert unfinalized batch"); + if (_batchIndex <= lastFinalizedBatchIndex) revert ErrorRevertFinalizedBatch(); while (_count > 0) { committedBatches[_batchIndex] = bytes32(0); @@ -309,6 +377,7 @@ contract ScrollChain is OwnableUpgradeable, PausableUpgradeable, IScrollChain { } /// @inheritdoc IScrollChain + /// @dev We keep this function to upgrade to 4844 more smoothly. function finalizeBatchWithProof( bytes calldata _batchHeader, bytes32 _prevStateRoot, @@ -316,21 +385,18 @@ contract ScrollChain is OwnableUpgradeable, PausableUpgradeable, IScrollChain { bytes32 _withdrawRoot, bytes calldata _aggrProof ) external override OnlyProver whenNotPaused { - require(_prevStateRoot != bytes32(0), "previous state root is zero"); - require(_postStateRoot != bytes32(0), "new state root is zero"); + if (_prevStateRoot == bytes32(0)) revert ErrorPreviousStateRootIsZero(); + if (_postStateRoot == bytes32(0)) revert ErrorStateRootIsZero(); // compute batch hash and verify - (uint256 memPtr, bytes32 _batchHash) = _loadBatchHeader(_batchHeader); - - bytes32 _dataHash = BatchHeaderV0Codec.dataHash(memPtr); - uint256 _batchIndex = BatchHeaderV0Codec.batchIndex(memPtr); - require(committedBatches[_batchIndex] == _batchHash, "incorrect batch hash"); + (uint256 memPtr, bytes32 _batchHash, uint256 _batchIndex, ) = _loadBatchHeader(_batchHeader); + bytes32 _dataHash = BatchHeaderV0Codec.getDataHash(memPtr); // verify previous state root. - require(finalizedStateRoots[_batchIndex - 1] == _prevStateRoot, "incorrect previous state root"); + if (finalizedStateRoots[_batchIndex - 1] != _prevStateRoot) revert ErrorIncorrectPreviousStateRoot(); // avoid duplicated verification - require(finalizedStateRoots[_batchIndex] == bytes32(0), "batch already verified"); + if (finalizedStateRoots[_batchIndex] != bytes32(0)) revert ErrorBatchIsAlreadyVerified(); // compute public input hash bytes32 _publicInputHash = keccak256( @@ -338,11 +404,11 @@ contract ScrollChain is OwnableUpgradeable, PausableUpgradeable, IScrollChain { ); // verify batch - IRollupVerifier(verifier).verifyAggregateProof(_batchIndex, _aggrProof, _publicInputHash); + IRollupVerifier(verifier).verifyAggregateProof(0, _batchIndex, _aggrProof, _publicInputHash); // check and update lastFinalizedBatchIndex unchecked { - require(lastFinalizedBatchIndex + 1 == _batchIndex, "incorrect batch index"); + if (lastFinalizedBatchIndex + 1 != _batchIndex) revert ErrorIncorrectBatchIndex(); lastFinalizedBatchIndex = _batchIndex; } @@ -351,27 +417,93 @@ contract ScrollChain is OwnableUpgradeable, PausableUpgradeable, IScrollChain { withdrawRoots[_batchIndex] = _withdrawRoot; // Pop finalized and non-skipped message from L1MessageQueue. - uint256 _l1MessagePopped = BatchHeaderV0Codec.l1MessagePopped(memPtr); - if (_l1MessagePopped > 0) { - IL1MessageQueue _queue = IL1MessageQueue(messageQueue); + _popL1Messages( + BatchHeaderV0Codec.getSkippedBitmapPtr(memPtr), + BatchHeaderV0Codec.getTotalL1MessagePopped(memPtr), + BatchHeaderV0Codec.getL1MessagePopped(memPtr) + ); - unchecked { - uint256 _startIndex = BatchHeaderV0Codec.totalL1MessagePopped(memPtr) - _l1MessagePopped; + emit FinalizeBatch(_batchIndex, _batchHash, _postStateRoot, _withdrawRoot); + } - for (uint256 i = 0; i < _l1MessagePopped; i += 256) { - uint256 _count = 256; - if (_l1MessagePopped - i < _count) { - _count = _l1MessagePopped - i; - } - uint256 _skippedBitmap = BatchHeaderV0Codec.skippedBitmap(memPtr, i / 256); + /// @inheritdoc IScrollChain + /// @dev Memory layout of `_blobDataProof`: + /// ```text + /// | z | y | kzg_commitment | kzg_proof | + /// |---------|---------|----------------|-----------| + /// | bytes32 | bytes32 | bytes48 | bytes48 | + /// ``` + function finalizeBatchWithProof4844( + bytes calldata _batchHeader, + bytes32 _prevStateRoot, + bytes32 _postStateRoot, + bytes32 _withdrawRoot, + bytes calldata _blobDataProof, + bytes calldata _aggrProof + ) external override OnlyProver whenNotPaused { + if (_prevStateRoot == bytes32(0)) revert ErrorPreviousStateRootIsZero(); + if (_postStateRoot == bytes32(0)) revert ErrorStateRootIsZero(); - _queue.popCrossDomainMessage(_startIndex, _count, _skippedBitmap); + // compute batch hash and verify + (uint256 memPtr, bytes32 _batchHash, uint256 _batchIndex, ) = _loadBatchHeader(_batchHeader); + bytes32 _dataHash = BatchHeaderV1Codec.getDataHash(memPtr); + bytes32 _blobVersionedHash = BatchHeaderV1Codec.getBlobVersionedHash(memPtr); - _startIndex += 256; - } - } + // Calls the point evaluation precompile and verifies the output + { + (bool success, bytes memory data) = POINT_EVALUATION_PRECOMPILE_ADDR.staticcall( + abi.encodePacked(_blobVersionedHash, _blobDataProof) + ); + // We verify that the point evaluation precompile call was successful by testing the latter 32 bytes of the + // response is equal to BLS_MODULUS as defined in https://eips.ethereum.org/EIPS/eip-4844#point-evaluation-precompile + if (!success) revert ErrorCallPointEvaluationPrecompileFailed(); + (, uint256 result) = abi.decode(data, (uint256, uint256)); + if (result != BLS_MODULUS) revert ErrorUnexpectedPointEvaluationPrecompileOutput(); } + // verify previous state root. + if (finalizedStateRoots[_batchIndex - 1] != _prevStateRoot) revert ErrorIncorrectPreviousStateRoot(); + + // avoid duplicated verification + if (finalizedStateRoots[_batchIndex] != bytes32(0)) revert ErrorBatchIsAlreadyVerified(); + + // compute public input hash + bytes32 _publicInputHash = keccak256( + abi.encodePacked( + layer2ChainId, + _prevStateRoot, + _postStateRoot, + _withdrawRoot, + _dataHash, + _blobDataProof[0:64] + ) + ); + + // load version from batch header, it is always the first byte. + uint256 batchVersion; + assembly { + batchVersion := shr(248, calldataload(_batchHeader.offset)) + } + // verify batch + IRollupVerifier(verifier).verifyAggregateProof(batchVersion, _batchIndex, _aggrProof, _publicInputHash); + + // check and update lastFinalizedBatchIndex + unchecked { + if (lastFinalizedBatchIndex + 1 != _batchIndex) revert ErrorIncorrectBatchIndex(); + lastFinalizedBatchIndex = _batchIndex; + } + + // record state root and withdraw root + finalizedStateRoots[_batchIndex] = _postStateRoot; + withdrawRoots[_batchIndex] = _withdrawRoot; + + // Pop finalized and non-skipped message from L1MessageQueue. + _popL1Messages( + BatchHeaderV1Codec.getSkippedBitmapPtr(memPtr), + BatchHeaderV1Codec.getTotalL1MessagePopped(memPtr), + BatchHeaderV1Codec.getL1MessagePopped(memPtr) + ); + emit FinalizeBatch(_batchIndex, _batchHash, _postStateRoot, _withdrawRoot); } @@ -386,10 +518,7 @@ contract ScrollChain is OwnableUpgradeable, PausableUpgradeable, IScrollChain { require(_postStateRoot != bytes32(0), "new state root is zero"); // compute batch hash and verify - (uint256 memPtr, bytes32 _batchHash) = _loadBatchHeader(_batchHeader); - - uint256 _batchIndex = BatchHeaderV0Codec.batchIndex(memPtr); - require(committedBatches[_batchIndex] == _batchHash, "incorrect batch hash"); + (uint256 memPtr, bytes32 _batchHash, uint256 _batchIndex, ) = _loadBatchHeader(_batchHeader); // verify previous state root. require(finalizedStateRoots[_batchIndex - 1] == _prevStateRoot, "incorrect previous state root"); @@ -408,27 +537,71 @@ contract ScrollChain is OwnableUpgradeable, PausableUpgradeable, IScrollChain { withdrawRoots[_batchIndex] = _withdrawRoot; // Pop finalized and non-skipped message from L1MessageQueue. - uint256 _l1MessagePopped = BatchHeaderV0Codec.l1MessagePopped(memPtr); - if (_l1MessagePopped > 0) { - IL1MessageQueue _queue = IL1MessageQueue(messageQueue); + _popL1Messages( + BatchHeaderV0Codec.getSkippedBitmapPtr(memPtr), + BatchHeaderV0Codec.getTotalL1MessagePopped(memPtr), + BatchHeaderV0Codec.getL1MessagePopped(memPtr) + ); - unchecked { - uint256 _startIndex = BatchHeaderV0Codec.totalL1MessagePopped(memPtr) - _l1MessagePopped; + emit FinalizeBatch(_batchIndex, _batchHash, _postStateRoot, _withdrawRoot); + } - for (uint256 i = 0; i < _l1MessagePopped; i += 256) { - uint256 _count = 256; - if (_l1MessagePopped - i < _count) { - _count = _l1MessagePopped - i; - } - uint256 _skippedBitmap = BatchHeaderV0Codec.skippedBitmap(memPtr, i / 256); + /// @inheritdoc IScrollChain + /// @dev Memory layout of `_blobDataProof`: + /// ```text + /// | z | y | kzg_commitment | kzg_proof | + /// |---------|---------|----------------|-----------| + /// | bytes32 | bytes32 | bytes48 | bytes48 | + /// ``` + function finalizeBatch4844( + bytes calldata _batchHeader, + bytes32 _prevStateRoot, + bytes32 _postStateRoot, + bytes32 _withdrawRoot, + bytes calldata _blobDataProof + ) external override OnlyProver whenNotPaused { + if (_prevStateRoot == bytes32(0)) revert ErrorPreviousStateRootIsZero(); + if (_postStateRoot == bytes32(0)) revert ErrorStateRootIsZero(); - _queue.popCrossDomainMessage(_startIndex, _count, _skippedBitmap); + // compute batch hash and verify + (uint256 memPtr, bytes32 _batchHash, uint256 _batchIndex, ) = _loadBatchHeader(_batchHeader); + bytes32 _blobVersionedHash = BatchHeaderV1Codec.getBlobVersionedHash(memPtr); - _startIndex += 256; - } - } + // Calls the point evaluation precompile and verifies the output + { + (bool success, bytes memory data) = POINT_EVALUATION_PRECOMPILE_ADDR.staticcall( + abi.encodePacked(_blobVersionedHash, _blobDataProof) + ); + // We verify that the point evaluation precompile call was successful by testing the latter 32 bytes of the + // response is equal to BLS_MODULUS as defined in https://eips.ethereum.org/EIPS/eip-4844#point-evaluation-precompile + if (!success) revert ErrorCallPointEvaluationPrecompileFailed(); + (, uint256 result) = abi.decode(data, (uint256, uint256)); + if (result != BLS_MODULUS) revert ErrorUnexpectedPointEvaluationPrecompileOutput(); } + // verify previous state root. + if (finalizedStateRoots[_batchIndex - 1] != _prevStateRoot) revert ErrorIncorrectPreviousStateRoot(); + + // avoid duplicated verification + if (finalizedStateRoots[_batchIndex] != bytes32(0)) revert ErrorBatchIsAlreadyVerified(); + + // check and update lastFinalizedBatchIndex + unchecked { + if (lastFinalizedBatchIndex + 1 != _batchIndex) revert ErrorIncorrectBatchIndex(); + lastFinalizedBatchIndex = _batchIndex; + } + + // record state root and withdraw root + finalizedStateRoots[_batchIndex] = _postStateRoot; + withdrawRoots[_batchIndex] = _withdrawRoot; + + // Pop finalized and non-skipped message from L1MessageQueue. + _popL1Messages( + BatchHeaderV1Codec.getSkippedBitmapPtr(memPtr), + BatchHeaderV1Codec.getTotalL1MessagePopped(memPtr), + BatchHeaderV1Codec.getL1MessagePopped(memPtr) + ); + emit FinalizeBatch(_batchIndex, _batchHash, _postStateRoot, _withdrawRoot); } @@ -441,7 +614,7 @@ contract ScrollChain is OwnableUpgradeable, PausableUpgradeable, IScrollChain { function addSequencer(address _account) external onlyOwner { // @note Currently many external services rely on EOA sequencer to decode metadata directly from tx.calldata. // So we explicitly make sure the account is EOA. - require(_account.code.length == 0, "not EOA"); + if (_account.code.length > 0) revert ErrorAccountIsNotEOA(); isSequencer[_account] = true; @@ -461,7 +634,7 @@ contract ScrollChain is OwnableUpgradeable, PausableUpgradeable, IScrollChain { function addProver(address _account) external onlyOwner { // @note Currently many external services rely on EOA prover to decode metadata directly from tx.calldata. // So we explicitly make sure the account is EOA. - require(_account.code.length == 0, "not EOA"); + if (_account.code.length > 0) revert ErrorAccountIsNotEOA(); isProver[_account] = true; emit UpdateProver(_account, true); @@ -498,56 +671,195 @@ contract ScrollChain is OwnableUpgradeable, PausableUpgradeable, IScrollChain { * Internal Functions * **********************/ - /// @dev Internal function to load batch header from calldata to memory. - /// @param _batchHeader The batch header in calldata. - /// @return memPtr The start memory offset of loaded batch header. - /// @return _batchHash The hash of the loaded batch header. - function _loadBatchHeader(bytes calldata _batchHeader) internal pure returns (uint256 memPtr, bytes32 _batchHash) { - // load to memory - uint256 _length; - (memPtr, _length) = BatchHeaderV0Codec.loadAndValidate(_batchHeader); + /// @dev Internal function to commit chunks with version 0 + /// @param _totalL1MessagesPoppedOverall The number of L1 messages popped before the list of chunks. + /// @param _chunks The list of chunks to commit. + /// @param _skippedL1MessageBitmap The bitmap indicates whether each L1 message is skipped or not. + /// @return _batchDataHash The computed data hash for the list of chunks. + /// @return _totalL1MessagesPoppedInBatch The total number of L1 messages poped in this batch, including skipped one. + function _commitChunksV0( + uint256 _totalL1MessagesPoppedOverall, + bytes[] memory _chunks, + bytes calldata _skippedL1MessageBitmap + ) internal view returns (bytes32 _batchDataHash, uint256 _totalL1MessagesPoppedInBatch) { + uint256 _chunksLength = _chunks.length; - // compute batch hash - _batchHash = BatchHeaderV0Codec.computeBatchHash(memPtr, _length); + // load `batchDataHashPtr` and reserve the memory region for chunk data hashes + uint256 batchDataHashPtr; + assembly { + batchDataHashPtr := mload(0x40) + mstore(0x40, add(batchDataHashPtr, mul(_chunksLength, 32))) + } + + // compute the data hash for each chunk + for (uint256 i = 0; i < _chunksLength; i++) { + uint256 _totalNumL1MessagesInChunk; + bytes32 _chunkDataHash; + (_chunkDataHash, _totalNumL1MessagesInChunk) = _commitChunkV0( + _chunks[i], + _totalL1MessagesPoppedInBatch, + _totalL1MessagesPoppedOverall, + _skippedL1MessageBitmap + ); + unchecked { + _totalL1MessagesPoppedInBatch += _totalNumL1MessagesInChunk; + _totalL1MessagesPoppedOverall += _totalNumL1MessagesInChunk; + } + assembly { + mstore(batchDataHashPtr, _chunkDataHash) + batchDataHashPtr := add(batchDataHashPtr, 0x20) + } + } + + assembly { + let dataLen := mul(_chunksLength, 0x20) + _batchDataHash := keccak256(sub(batchDataHashPtr, dataLen), dataLen) + } } - /// @dev Internal function to commit a chunk. - /// @param memPtr The start memory offset to store list of `dataHash`. - /// @param _chunk The encoded chunk to commit. - /// @param _totalL1MessagesPoppedInBatch The total number of L1 messages popped in current batch. - /// @param _totalL1MessagesPoppedOverall The total number of L1 messages popped in all batches including current batch. + /// @dev Internal function to commit chunks with version 1 + /// @param _totalL1MessagesPoppedOverall The number of L1 messages popped before the list of chunks. + /// @param _chunks The list of chunks to commit. /// @param _skippedL1MessageBitmap The bitmap indicates whether each L1 message is skipped or not. + /// @return _blobVersionedHash The blob versioned hash for the blob carried in this transaction. + /// @return _batchDataHash The computed data hash for the list of chunks. + /// @return _totalL1MessagesPoppedInBatch The total number of L1 messages poped in this batch, including skipped one. + function _commitChunksV1( + uint256 _totalL1MessagesPoppedOverall, + bytes[] memory _chunks, + bytes calldata _skippedL1MessageBitmap + ) + internal + view + returns ( + bytes32 _blobVersionedHash, + bytes32 _batchDataHash, + uint256 _totalL1MessagesPoppedInBatch + ) + { + { + bytes32 _secondBlob; + // Get blob's versioned hash + assembly { + _blobVersionedHash := blobhash(0) + _secondBlob := blobhash(1) + } + if (_blobVersionedHash == bytes32(0)) revert ErrorNoBlobFound(); + if (_secondBlob != bytes32(0)) revert ErrorFoundMultipleBlob(); + } + + uint256 _chunksLength = _chunks.length; + + // load `batchDataHashPtr` and reserve the memory region for chunk data hashes + uint256 batchDataHashPtr; + assembly { + batchDataHashPtr := mload(0x40) + mstore(0x40, add(batchDataHashPtr, mul(_chunksLength, 32))) + } + + // compute the data hash for each chunk + for (uint256 i = 0; i < _chunksLength; i++) { + uint256 _totalNumL1MessagesInChunk; + bytes32 _chunkDataHash; + (_chunkDataHash, _totalNumL1MessagesInChunk) = _commitChunkV1( + _chunks[i], + _totalL1MessagesPoppedInBatch, + _totalL1MessagesPoppedOverall, + _skippedL1MessageBitmap + ); + unchecked { + _totalL1MessagesPoppedInBatch += _totalNumL1MessagesInChunk; + _totalL1MessagesPoppedOverall += _totalNumL1MessagesInChunk; + } + assembly { + mstore(batchDataHashPtr, _chunkDataHash) + batchDataHashPtr := add(batchDataHashPtr, 0x20) + } + } + + // compute the data hash for current batch + assembly { + let dataLen := mul(_chunksLength, 0x20) + _batchDataHash := keccak256(sub(batchDataHashPtr, dataLen), dataLen) + } + } + + /// @dev Internal function to load batch header from calldata to memory. + /// @param _batchHeader The batch header in calldata. + /// @return batchPtr The start memory offset of loaded batch header. + /// @return _batchHash The hash of the loaded batch header. + /// @return _batchIndex The index of this batch. + /// @param _totalL1MessagesPoppedOverall The number of L1 messages popped after this batch. + function _loadBatchHeader(bytes calldata _batchHeader) + internal + view + returns ( + uint256 batchPtr, + bytes32 _batchHash, + uint256 _batchIndex, + uint256 _totalL1MessagesPoppedOverall + ) + { + // load version from batch header, it is always the first byte. + uint256 version; + assembly { + version := shr(248, calldataload(_batchHeader.offset)) + } + + // version should be always 0 or 1 in current code + uint256 _length; + if (version == 0) { + (batchPtr, _length) = BatchHeaderV0Codec.loadAndValidate(_batchHeader); + _batchHash = BatchHeaderV0Codec.computeBatchHash(batchPtr, _length); + _batchIndex = BatchHeaderV0Codec.getBatchIndex(batchPtr); + } else if (version == 1) { + (batchPtr, _length) = BatchHeaderV1Codec.loadAndValidate(_batchHeader); + _batchHash = BatchHeaderV1Codec.computeBatchHash(batchPtr, _length); + _batchIndex = BatchHeaderV1Codec.getBatchIndex(batchPtr); + } else { + revert ErrorInvalidBatchHeaderVersion(); + } + // only check when genesis is imported + if (committedBatches[_batchIndex] != _batchHash && finalizedStateRoots[0] != bytes32(0)) { + revert ErrorIncorrectBatchHash(); + } + _totalL1MessagesPoppedOverall = BatchHeaderV0Codec.getTotalL1MessagePopped(batchPtr); + } + + /// @dev Internal function to commit a chunk with version 0. + /// @param _chunk The encoded chunk to commit. + /// @param _totalL1MessagesPoppedInBatch The total number of L1 messages popped in the current batch before this chunk. + /// @param _totalL1MessagesPoppedOverall The total number of L1 messages popped in all batches including the current batch, before this chunk. + /// @param _skippedL1MessageBitmap The bitmap indicates whether each L1 message is skipped or not. + /// @return _dataHash The computed data hash for this chunk. /// @return _totalNumL1MessagesInChunk The total number of L1 message popped in current chunk - function _commitChunk( - uint256 memPtr, + function _commitChunkV0( bytes memory _chunk, uint256 _totalL1MessagesPoppedInBatch, uint256 _totalL1MessagesPoppedOverall, bytes calldata _skippedL1MessageBitmap - ) internal view returns (uint256 _totalNumL1MessagesInChunk) { + ) internal view returns (bytes32 _dataHash, uint256 _totalNumL1MessagesInChunk) { uint256 chunkPtr; uint256 startDataPtr; uint256 dataPtr; - uint256 blockPtr; assembly { dataPtr := mload(0x40) startDataPtr := dataPtr chunkPtr := add(_chunk, 0x20) // skip chunkLength - blockPtr := add(chunkPtr, 1) // skip numBlocks } - uint256 _numBlocks = ChunkCodec.validateChunkLength(chunkPtr, _chunk.length); + uint256 _numBlocks = ChunkCodecV0.validateChunkLength(chunkPtr, _chunk.length); // concatenate block contexts, use scope to avoid stack too deep { uint256 _totalTransactionsInChunk; for (uint256 i = 0; i < _numBlocks; i++) { - dataPtr = ChunkCodec.copyBlockContext(chunkPtr, dataPtr, i); - uint256 _numTransactionsInBlock = ChunkCodec.numTransactions(blockPtr); + dataPtr = ChunkCodecV0.copyBlockContext(chunkPtr, dataPtr, i); + uint256 blockPtr = chunkPtr + 1 + i * ChunkCodecV0.BLOCK_CONTEXT_LENGTH; + uint256 _numTransactionsInBlock = ChunkCodecV0.getNumTransactions(blockPtr); unchecked { _totalTransactionsInChunk += _numTransactionsInBlock; - blockPtr += ChunkCodec.BLOCK_CONTEXT_LENGTH; } } assembly { @@ -556,17 +868,13 @@ contract ScrollChain is OwnableUpgradeable, PausableUpgradeable, IScrollChain { } // It is used to compute the actual number of transactions in chunk. - uint256 txHashStartDataPtr; - assembly { - txHashStartDataPtr := dataPtr - blockPtr := add(chunkPtr, 1) // reset block ptr - } - + uint256 txHashStartDataPtr = dataPtr; // concatenate tx hashes - uint256 l2TxPtr = ChunkCodec.l2TxPtr(chunkPtr, _numBlocks); + uint256 l2TxPtr = ChunkCodecV0.getL2TxPtr(chunkPtr, _numBlocks); + chunkPtr += 1; while (_numBlocks > 0) { // concatenate l1 message hashes - uint256 _numL1MessagesInBlock = ChunkCodec.numL1Messages(blockPtr); + uint256 _numL1MessagesInBlock = ChunkCodecV0.getNumL1Messages(chunkPtr); dataPtr = _loadL1MessageHashes( dataPtr, _numL1MessagesInBlock, @@ -576,11 +884,11 @@ contract ScrollChain is OwnableUpgradeable, PausableUpgradeable, IScrollChain { ); // concatenate l2 transaction hashes - uint256 _numTransactionsInBlock = ChunkCodec.numTransactions(blockPtr); - require(_numTransactionsInBlock >= _numL1MessagesInBlock, "num txs less than num L1 msgs"); + uint256 _numTransactionsInBlock = ChunkCodecV0.getNumTransactions(chunkPtr); + if (_numTransactionsInBlock < _numL1MessagesInBlock) revert ErrorNumTxsLessThanNumL1Msgs(); for (uint256 j = _numL1MessagesInBlock; j < _numTransactionsInBlock; j++) { bytes32 txHash; - (txHash, l2TxPtr) = ChunkCodec.loadL2TxHash(l2TxPtr); + (txHash, l2TxPtr) = ChunkCodecV0.loadL2TxHash(l2TxPtr); assembly { mstore(dataPtr, txHash) dataPtr := add(dataPtr, 0x20) @@ -593,23 +901,99 @@ contract ScrollChain is OwnableUpgradeable, PausableUpgradeable, IScrollChain { _totalL1MessagesPoppedOverall += _numL1MessagesInBlock; _numBlocks -= 1; - blockPtr += ChunkCodec.BLOCK_CONTEXT_LENGTH; + chunkPtr += ChunkCodecV0.BLOCK_CONTEXT_LENGTH; } } // check the actual number of transactions in the chunk - require((dataPtr - txHashStartDataPtr) / 32 <= maxNumTxInChunk, "too many txs in one chunk"); + if ((dataPtr - txHashStartDataPtr) / 32 > maxNumTxInChunk) revert ErrorTooManyTxsInOneChunk(); + assembly { + chunkPtr := add(_chunk, 0x20) + } // check chunk has correct length - require(l2TxPtr - chunkPtr == _chunk.length, "incomplete l2 transaction data"); + if (l2TxPtr - chunkPtr != _chunk.length) revert ErrorIncompleteL2TransactionData(); // compute data hash and store to memory assembly { - let dataHash := keccak256(startDataPtr, sub(dataPtr, startDataPtr)) - mstore(memPtr, dataHash) + _dataHash := keccak256(startDataPtr, sub(dataPtr, startDataPtr)) + } + } + + /// @dev Internal function to commit a chunk with version 1. + /// @param _chunk The encoded chunk to commit. + /// @param _totalL1MessagesPoppedInBatch The total number of L1 messages popped in current batch. + /// @param _totalL1MessagesPoppedOverall The total number of L1 messages popped in all batches including current batch. + /// @param _skippedL1MessageBitmap The bitmap indicates whether each L1 message is skipped or not. + /// @return _dataHash The computed data hash for this chunk. + /// @return _totalNumL1MessagesInChunk The total number of L1 message popped in current chunk + function _commitChunkV1( + bytes memory _chunk, + uint256 _totalL1MessagesPoppedInBatch, + uint256 _totalL1MessagesPoppedOverall, + bytes calldata _skippedL1MessageBitmap + ) internal view returns (bytes32 _dataHash, uint256 _totalNumL1MessagesInChunk) { + uint256 chunkPtr; + uint256 startDataPtr; + uint256 dataPtr; + + assembly { + dataPtr := mload(0x40) + startDataPtr := dataPtr + chunkPtr := add(_chunk, 0x20) // skip chunkLength } - return _totalNumL1MessagesInChunk; + uint256 _numBlocks = ChunkCodecV1.validateChunkLength(chunkPtr, _chunk.length); + // concatenate block contexts, use scope to avoid stack too deep + for (uint256 i = 0; i < _numBlocks; i++) { + dataPtr = ChunkCodecV1.copyBlockContext(chunkPtr, dataPtr, i); + uint256 blockPtr = chunkPtr + 1 + i * ChunkCodecV1.BLOCK_CONTEXT_LENGTH; + uint256 _numL1MessagesInBlock = ChunkCodecV1.getNumL1Messages(blockPtr); + unchecked { + _totalNumL1MessagesInChunk += _numL1MessagesInBlock; + } + } + assembly { + mstore(0x40, add(dataPtr, mul(_totalNumL1MessagesInChunk, 0x20))) // reserve memory for l1 message hashes + chunkPtr := add(chunkPtr, 1) + } + + // the number of actual transactions in one chunk: non-skipped l1 messages + l2 txs + uint256 _totalTransactionsInChunk; + // concatenate tx hashes + while (_numBlocks > 0) { + // concatenate l1 message hashes + uint256 _numL1MessagesInBlock = ChunkCodecV1.getNumL1Messages(chunkPtr); + uint256 startPtr = dataPtr; + dataPtr = _loadL1MessageHashes( + dataPtr, + _numL1MessagesInBlock, + _totalL1MessagesPoppedInBatch, + _totalL1MessagesPoppedOverall, + _skippedL1MessageBitmap + ); + uint256 _numTransactionsInBlock = ChunkCodecV1.getNumTransactions(chunkPtr); + if (_numTransactionsInBlock < _numL1MessagesInBlock) revert ErrorNumTxsLessThanNumL1Msgs(); + unchecked { + _totalTransactionsInChunk += (dataPtr - startPtr) / 32; // number of non-skipped l1 messages + _totalTransactionsInChunk += _numTransactionsInBlock - _numL1MessagesInBlock; // number of l2 txs + _totalL1MessagesPoppedInBatch += _numL1MessagesInBlock; + _totalL1MessagesPoppedOverall += _numL1MessagesInBlock; + + _numBlocks -= 1; + chunkPtr += ChunkCodecV1.BLOCK_CONTEXT_LENGTH; + } + } + + // check the actual number of transactions in the chunk + if (_totalTransactionsInChunk > maxNumTxInChunk) { + revert ErrorTooManyTxsInOneChunk(); + } + + // compute data hash and store to memory + assembly { + _dataHash := keccak256(startDataPtr, sub(dataPtr, startDataPtr)) + } } /// @dev Internal function to load L1 message hashes from the message queue. @@ -657,9 +1041,39 @@ contract ScrollChain is OwnableUpgradeable, PausableUpgradeable, IScrollChain { // check last L1 message is not skipped, _totalL1MessagesPoppedInBatch must > 0 rem = (_totalL1MessagesPoppedInBatch - 1) & 0xff; - require(((_bitmap >> rem) & 1) == 0, "cannot skip last L1 message"); + if (((_bitmap >> rem) & 1) > 0) revert ErrorLastL1MessageSkipped(); } return _ptr; } + + /// @dev Internal function to pop finalized l1 messages. + /// @param bitmapPtr The memory offset of `skippedL1MessageBitmap`. + /// @param totalL1MessagePopped The total number of L1 messages poped in all batches including current batch. + /// @param l1MessagePopped The number of L1 messages popped in current batch. + function _popL1Messages( + uint256 bitmapPtr, + uint256 totalL1MessagePopped, + uint256 l1MessagePopped + ) internal { + if (l1MessagePopped == 0) return; + + unchecked { + uint256 startIndex = totalL1MessagePopped - l1MessagePopped; + uint256 bitmap; + + for (uint256 i = 0; i < l1MessagePopped; i += 256) { + uint256 _count = 256; + if (l1MessagePopped - i < _count) { + _count = l1MessagePopped - i; + } + assembly { + bitmap := mload(bitmapPtr) + bitmapPtr := add(bitmapPtr, 0x20) + } + IL1MessageQueue(messageQueue).popCrossDomainMessage(startIndex, _count, bitmap); + startIndex += 256; + } + } + } } diff --git a/contracts/src/L1/rollup/ScrollChainCommitmentVerifier.sol b/contracts/src/L1/rollup/ScrollChainCommitmentVerifier.sol index df6d13dc9..3d5674f5c 100644 --- a/contracts/src/L1/rollup/ScrollChainCommitmentVerifier.sol +++ b/contracts/src/L1/rollup/ScrollChainCommitmentVerifier.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {IScrollChain} from "./IScrollChain.sol"; import {ZkTrieVerifier} from "../../libraries/verifier/ZkTrieVerifier.sol"; @@ -52,7 +52,7 @@ contract ScrollChainCommitmentVerifier { require(IScrollChain(rollup).isBatchFinalized(batchIndex), "Batch not finalized"); bytes32 computedStateRoot; - (computedStateRoot, storageValue) = ZkTrieVerifier.verifyZkTrieProof(poseidon, account, storageKey, proof); + (computedStateRoot, storageValue) = verifyZkTrieProof(account, storageKey, proof); bytes32 expectedStateRoot = IScrollChain(rollup).finalizedStateRoots(batchIndex); require(computedStateRoot == expectedStateRoot, "Invalid inclusion proof"); } diff --git a/contracts/src/L2/IL2ScrollMessenger.sol b/contracts/src/L2/IL2ScrollMessenger.sol index 700a28a38..44e60b16f 100644 --- a/contracts/src/L2/IL2ScrollMessenger.sol +++ b/contracts/src/L2/IL2ScrollMessenger.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; import {IScrollMessenger} from "../libraries/IScrollMessenger.sol"; diff --git a/contracts/src/L2/L2ScrollMessenger.sol b/contracts/src/L2/L2ScrollMessenger.sol index 8b070ccaa..3d01b40e8 100644 --- a/contracts/src/L2/L2ScrollMessenger.sol +++ b/contracts/src/L2/L2ScrollMessenger.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {IL2ScrollMessenger} from "./IL2ScrollMessenger.sol"; import {L2MessageQueue} from "./predeploys/L2MessageQueue.sol"; diff --git a/contracts/src/L2/gateways/IL2ERC1155Gateway.sol b/contracts/src/L2/gateways/IL2ERC1155Gateway.sol index a9e743f52..2a0d6182b 100644 --- a/contracts/src/L2/gateways/IL2ERC1155Gateway.sol +++ b/contracts/src/L2/gateways/IL2ERC1155Gateway.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; /// @title The interface for the ERC1155 cross chain gateway on layer 2. interface IL2ERC1155Gateway { diff --git a/contracts/src/L2/gateways/IL2ERC20Gateway.sol b/contracts/src/L2/gateways/IL2ERC20Gateway.sol index 98463a4ad..39740cbd3 100644 --- a/contracts/src/L2/gateways/IL2ERC20Gateway.sol +++ b/contracts/src/L2/gateways/IL2ERC20Gateway.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; interface IL2ERC20Gateway { /********** diff --git a/contracts/src/L2/gateways/IL2ERC721Gateway.sol b/contracts/src/L2/gateways/IL2ERC721Gateway.sol index 470d9ec6d..d92b55702 100644 --- a/contracts/src/L2/gateways/IL2ERC721Gateway.sol +++ b/contracts/src/L2/gateways/IL2ERC721Gateway.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; /// @title The interface for the ERC721 cross chain gateway on layer 2. interface IL2ERC721Gateway { diff --git a/contracts/src/L2/gateways/IL2ETHGateway.sol b/contracts/src/L2/gateways/IL2ETHGateway.sol index 86f07c1ea..80407b10e 100644 --- a/contracts/src/L2/gateways/IL2ETHGateway.sol +++ b/contracts/src/L2/gateways/IL2ETHGateway.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; interface IL2ETHGateway { /********** diff --git a/contracts/src/L2/gateways/IL2GatewayRouter.sol b/contracts/src/L2/gateways/IL2GatewayRouter.sol index 3cab528b6..f2a6facc8 100644 --- a/contracts/src/L2/gateways/IL2GatewayRouter.sol +++ b/contracts/src/L2/gateways/IL2GatewayRouter.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; import {IL2ETHGateway} from "./IL2ETHGateway.sol"; import {IL2ERC20Gateway} from "./IL2ERC20Gateway.sol"; diff --git a/contracts/src/L2/gateways/L2CustomERC20Gateway.sol b/contracts/src/L2/gateways/L2CustomERC20Gateway.sol index 24b0089b2..5e4d7c4cc 100644 --- a/contracts/src/L2/gateways/L2CustomERC20Gateway.sol +++ b/contracts/src/L2/gateways/L2CustomERC20Gateway.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {IL2ERC20Gateway, L2ERC20Gateway} from "./L2ERC20Gateway.sol"; import {IL2ScrollMessenger} from "../IL2ScrollMessenger.sol"; diff --git a/contracts/src/L2/gateways/L2ERC1155Gateway.sol b/contracts/src/L2/gateways/L2ERC1155Gateway.sol index 2babc075e..d85f685a6 100644 --- a/contracts/src/L2/gateways/L2ERC1155Gateway.sol +++ b/contracts/src/L2/gateways/L2ERC1155Gateway.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {ERC1155HolderUpgradeable, ERC1155ReceiverUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC1155/utils/ERC1155HolderUpgradeable.sol"; diff --git a/contracts/src/L2/gateways/L2ERC20Gateway.sol b/contracts/src/L2/gateways/L2ERC20Gateway.sol index 106cbeff0..7479a9398 100644 --- a/contracts/src/L2/gateways/L2ERC20Gateway.sol +++ b/contracts/src/L2/gateways/L2ERC20Gateway.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; import {IL2ERC20Gateway} from "./IL2ERC20Gateway.sol"; diff --git a/contracts/src/L2/gateways/L2ERC721Gateway.sol b/contracts/src/L2/gateways/L2ERC721Gateway.sol index b18426606..72c408535 100644 --- a/contracts/src/L2/gateways/L2ERC721Gateway.sol +++ b/contracts/src/L2/gateways/L2ERC721Gateway.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {ERC721HolderUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/utils/ERC721HolderUpgradeable.sol"; diff --git a/contracts/src/L2/gateways/L2ETHGateway.sol b/contracts/src/L2/gateways/L2ETHGateway.sol index dcadc1ed9..ae9c42ffb 100644 --- a/contracts/src/L2/gateways/L2ETHGateway.sol +++ b/contracts/src/L2/gateways/L2ETHGateway.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {IL1ETHGateway} from "../../L1/gateways/IL1ETHGateway.sol"; import {IL2ScrollMessenger} from "../IL2ScrollMessenger.sol"; diff --git a/contracts/src/L2/gateways/L2GatewayRouter.sol b/contracts/src/L2/gateways/L2GatewayRouter.sol index 04d39cbff..3c982b380 100644 --- a/contracts/src/L2/gateways/L2GatewayRouter.sol +++ b/contracts/src/L2/gateways/L2GatewayRouter.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; diff --git a/contracts/src/L2/gateways/L2StandardERC20Gateway.sol b/contracts/src/L2/gateways/L2StandardERC20Gateway.sol index d608d997c..3b3455ffd 100644 --- a/contracts/src/L2/gateways/L2StandardERC20Gateway.sol +++ b/contracts/src/L2/gateways/L2StandardERC20Gateway.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {AddressUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; diff --git a/contracts/src/L2/gateways/L2WETHGateway.sol b/contracts/src/L2/gateways/L2WETHGateway.sol index f8ebc013e..a50a7b35b 100644 --- a/contracts/src/L2/gateways/L2WETHGateway.sol +++ b/contracts/src/L2/gateways/L2WETHGateway.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {IERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; import {SafeERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; diff --git a/contracts/src/L2/gateways/usdc/L2USDCGateway.sol b/contracts/src/L2/gateways/usdc/L2USDCGateway.sol index 95e7ab8d9..d3408c837 100644 --- a/contracts/src/L2/gateways/usdc/L2USDCGateway.sol +++ b/contracts/src/L2/gateways/usdc/L2USDCGateway.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import {IERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; diff --git a/contracts/src/L2/gateways/usdc/draft-L2USDCGatewayCCTP.sol b/contracts/src/L2/gateways/usdc/draft-L2USDCGatewayCCTP.sol index bcec3b7c0..002f7bf20 100644 --- a/contracts/src/L2/gateways/usdc/draft-L2USDCGatewayCCTP.sol +++ b/contracts/src/L2/gateways/usdc/draft-L2USDCGatewayCCTP.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import {IERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; diff --git a/contracts/src/L2/predeploys/IL1BlockContainer.sol b/contracts/src/L2/predeploys/IL1BlockContainer.sol index 80b7ecaa9..aafee8cd5 100644 --- a/contracts/src/L2/predeploys/IL1BlockContainer.sol +++ b/contracts/src/L2/predeploys/IL1BlockContainer.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; interface IL1BlockContainer { /********** diff --git a/contracts/src/L2/predeploys/IL1GasPriceOracle.sol b/contracts/src/L2/predeploys/IL1GasPriceOracle.sol index 1fc8d0722..9d67595d9 100644 --- a/contracts/src/L2/predeploys/IL1GasPriceOracle.sol +++ b/contracts/src/L2/predeploys/IL1GasPriceOracle.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; interface IL1GasPriceOracle { /********** diff --git a/contracts/src/L2/predeploys/L1BlockContainer.sol b/contracts/src/L2/predeploys/L1BlockContainer.sol index ff5b31c5f..6c163379d 100644 --- a/contracts/src/L2/predeploys/L1BlockContainer.sol +++ b/contracts/src/L2/predeploys/L1BlockContainer.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {IL1BlockContainer} from "./IL1BlockContainer.sol"; import {IL1GasPriceOracle} from "./IL1GasPriceOracle.sol"; diff --git a/contracts/src/L2/predeploys/L1GasPriceOracle.sol b/contracts/src/L2/predeploys/L1GasPriceOracle.sol index cd4bab72e..8e8086130 100644 --- a/contracts/src/L2/predeploys/L1GasPriceOracle.sol +++ b/contracts/src/L2/predeploys/L1GasPriceOracle.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {OwnableBase} from "../../libraries/common/OwnableBase.sol"; import {IWhitelist} from "../../libraries/common/IWhitelist.sol"; diff --git a/contracts/src/L2/predeploys/L2MessageQueue.sol b/contracts/src/L2/predeploys/L2MessageQueue.sol index cc5039a79..997ff446a 100644 --- a/contracts/src/L2/predeploys/L2MessageQueue.sol +++ b/contracts/src/L2/predeploys/L2MessageQueue.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {AppendOnlyMerkleTree} from "../../libraries/common/AppendOnlyMerkleTree.sol"; import {OwnableBase} from "../../libraries/common/OwnableBase.sol"; diff --git a/contracts/src/L2/predeploys/L2TxFeeVault.sol b/contracts/src/L2/predeploys/L2TxFeeVault.sol index 550a79bec..20248eb76 100644 --- a/contracts/src/L2/predeploys/L2TxFeeVault.sol +++ b/contracts/src/L2/predeploys/L2TxFeeVault.sol @@ -23,7 +23,7 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {IL2ScrollMessenger} from "../IL2ScrollMessenger.sol"; import {OwnableBase} from "../../libraries/common/OwnableBase.sol"; diff --git a/contracts/src/L2/predeploys/Whitelist.sol b/contracts/src/L2/predeploys/Whitelist.sol index 62f95df75..712700cf1 100644 --- a/contracts/src/L2/predeploys/Whitelist.sol +++ b/contracts/src/L2/predeploys/Whitelist.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {OwnableBase} from "../../libraries/common/OwnableBase.sol"; import {IWhitelist} from "../../libraries/common/IWhitelist.sol"; diff --git a/contracts/src/gas-swap/GasSwap.sol b/contracts/src/gas-swap/GasSwap.sol index 7b3800f41..61bea33c4 100644 --- a/contracts/src/gas-swap/GasSwap.sol +++ b/contracts/src/gas-swap/GasSwap.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {ERC2771Context} from "@openzeppelin/contracts/metatx/ERC2771Context.sol"; diff --git a/contracts/src/interfaces/IFiatToken.sol b/contracts/src/interfaces/IFiatToken.sol index 9c6e8104a..ce1b43d7b 100644 --- a/contracts/src/interfaces/IFiatToken.sol +++ b/contracts/src/interfaces/IFiatToken.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; interface IFiatToken { /** diff --git a/contracts/src/interfaces/IMessageTransmitter.sol b/contracts/src/interfaces/IMessageTransmitter.sol index 5e20f14ee..f579f79b9 100644 --- a/contracts/src/interfaces/IMessageTransmitter.sol +++ b/contracts/src/interfaces/IMessageTransmitter.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; /// @title IMessageTransmitter /// @notice The interface of `MessageTransmitter` of Circle's Cross-Chain Transfer Protocol (CCTP). diff --git a/contracts/src/interfaces/ITokenMessenger.sol b/contracts/src/interfaces/ITokenMessenger.sol index f5de9dee8..95de16dd2 100644 --- a/contracts/src/interfaces/ITokenMessenger.sol +++ b/contracts/src/interfaces/ITokenMessenger.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; /// @title ITokenMessenger /// @notice The interface of `TokenMessenger` of Circle's Cross-Chain Transfer Protocol (CCTP). diff --git a/contracts/src/interfaces/IUSDCBurnableSourceBridge.sol b/contracts/src/interfaces/IUSDCBurnableSourceBridge.sol index b16afff11..081bacfb4 100644 --- a/contracts/src/interfaces/IUSDCBurnableSourceBridge.sol +++ b/contracts/src/interfaces/IUSDCBurnableSourceBridge.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; /// @title IUSDCBurnableSourceBridge /// @notice The interface of `USDCBurnableSourceBridge` of Circle's upgrader in L1 (Ethereum). diff --git a/contracts/src/interfaces/IUSDCDestinationBridge.sol b/contracts/src/interfaces/IUSDCDestinationBridge.sol index 35397dd49..9ea664814 100644 --- a/contracts/src/interfaces/IUSDCDestinationBridge.sol +++ b/contracts/src/interfaces/IUSDCDestinationBridge.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; /// @title IUSDCDestinationBridge /// @notice The interface required for USDC bridge in the destination chain (Scroll). diff --git a/contracts/src/interfaces/IWETH.sol b/contracts/src/interfaces/IWETH.sol index c8097b7cc..bf10aacd3 100644 --- a/contracts/src/interfaces/IWETH.sol +++ b/contracts/src/interfaces/IWETH.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; interface IWETH { function deposit() external payable; diff --git a/contracts/src/libraries/IScrollMessenger.sol b/contracts/src/libraries/IScrollMessenger.sol index 82ce7a7ae..b5d0f46b8 100644 --- a/contracts/src/libraries/IScrollMessenger.sol +++ b/contracts/src/libraries/IScrollMessenger.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; interface IScrollMessenger { /********** diff --git a/contracts/src/libraries/ScrollMessengerBase.sol b/contracts/src/libraries/ScrollMessengerBase.sol index b984caa8f..9d34ae1cc 100644 --- a/contracts/src/libraries/ScrollMessengerBase.sol +++ b/contracts/src/libraries/ScrollMessengerBase.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; diff --git a/contracts/src/libraries/callbacks/IERC677Receiver.sol b/contracts/src/libraries/callbacks/IERC677Receiver.sol index 560e6ee04..53e98d0f8 100644 --- a/contracts/src/libraries/callbacks/IERC677Receiver.sol +++ b/contracts/src/libraries/callbacks/IERC677Receiver.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; interface IERC677Receiver { function onTokenTransfer( diff --git a/contracts/src/libraries/callbacks/IMessageDropCallback.sol b/contracts/src/libraries/callbacks/IMessageDropCallback.sol index 8a7397451..e23f3cda7 100644 --- a/contracts/src/libraries/callbacks/IMessageDropCallback.sol +++ b/contracts/src/libraries/callbacks/IMessageDropCallback.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; interface IMessageDropCallback { function onDropMessage(bytes memory message) external payable; diff --git a/contracts/src/libraries/callbacks/IScrollGatewayCallback.sol b/contracts/src/libraries/callbacks/IScrollGatewayCallback.sol index ad025e942..9d0d29629 100644 --- a/contracts/src/libraries/callbacks/IScrollGatewayCallback.sol +++ b/contracts/src/libraries/callbacks/IScrollGatewayCallback.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; interface IScrollGatewayCallback { function onScrollGatewayCallback(bytes memory data) external; diff --git a/contracts/src/libraries/codec/BatchHeaderV0Codec.sol b/contracts/src/libraries/codec/BatchHeaderV0Codec.sol index 93004b40c..d6bd8fe86 100644 --- a/contracts/src/libraries/codec/BatchHeaderV0Codec.sol +++ b/contracts/src/libraries/codec/BatchHeaderV0Codec.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; // solhint-disable no-inline-assembly @@ -10,19 +10,28 @@ pragma solidity ^0.8.16; /// * version 1 uint8 0 The batch version /// * batchIndex 8 uint64 1 The index of the batch /// * l1MessagePopped 8 uint64 9 Number of L1 messages popped in the batch -/// * totalL1MessagePopped 8 uint64 17 Number of total L1 message popped after the batch +/// * totalL1MessagePopped 8 uint64 17 Number of total L1 messages popped after the batch /// * dataHash 32 bytes32 25 The data hash of the batch /// * parentBatchHash 32 bytes32 57 The parent batch hash /// * skippedL1MessageBitmap dynamic uint256[] 89 A bitmap to indicate which L1 messages are skipped in the batch /// ``` library BatchHeaderV0Codec { + /// @dev Thrown when the length of batch header is smaller than 89 + error ErrorBatchHeaderLengthTooSmall(); + + /// @dev Thrown when the length of skippedL1MessageBitmap is incorrect. + error ErrorIncorrectBitmapLength(); + + /// @dev The length of fixed parts of the batch header. + uint256 internal constant BATCH_HEADER_FIXED_LENGTH = 89; + /// @notice Load batch header in calldata to memory. /// @param _batchHeader The encoded batch header bytes in calldata. /// @return batchPtr The start memory offset of the batch header in memory. /// @return length The length in bytes of the batch header. function loadAndValidate(bytes calldata _batchHeader) internal pure returns (uint256 batchPtr, uint256 length) { length = _batchHeader.length; - require(length >= 89, "batch header length too small"); + if (length < BATCH_HEADER_FIXED_LENGTH) revert ErrorBatchHeaderLengthTooSmall(); // copy batch header to memory. assembly { @@ -32,17 +41,19 @@ library BatchHeaderV0Codec { } // check batch header length - uint256 _l1MessagePopped = BatchHeaderV0Codec.l1MessagePopped(batchPtr); + uint256 _l1MessagePopped = getL1MessagePopped(batchPtr); unchecked { - require(length == 89 + ((_l1MessagePopped + 255) / 256) * 32, "wrong bitmap length"); + if (length != BATCH_HEADER_FIXED_LENGTH + ((_l1MessagePopped + 255) / 256) * 32) { + revert ErrorIncorrectBitmapLength(); + } } } /// @notice Get the version of the batch header. /// @param batchPtr The start memory offset of the batch header in memory. /// @return _version The version of the batch header. - function version(uint256 batchPtr) internal pure returns (uint256 _version) { + function getVersion(uint256 batchPtr) internal pure returns (uint256 _version) { assembly { _version := shr(248, mload(batchPtr)) } @@ -51,7 +62,7 @@ library BatchHeaderV0Codec { /// @notice Get the batch index of the batch. /// @param batchPtr The start memory offset of the batch header in memory. /// @return _batchIndex The batch index of the batch. - function batchIndex(uint256 batchPtr) internal pure returns (uint256 _batchIndex) { + function getBatchIndex(uint256 batchPtr) internal pure returns (uint256 _batchIndex) { assembly { _batchIndex := shr(192, mload(add(batchPtr, 1))) } @@ -60,7 +71,7 @@ library BatchHeaderV0Codec { /// @notice Get the number of L1 messages of the batch. /// @param batchPtr The start memory offset of the batch header in memory. /// @return _l1MessagePopped The number of L1 messages of the batch. - function l1MessagePopped(uint256 batchPtr) internal pure returns (uint256 _l1MessagePopped) { + function getL1MessagePopped(uint256 batchPtr) internal pure returns (uint256 _l1MessagePopped) { assembly { _l1MessagePopped := shr(192, mload(add(batchPtr, 9))) } @@ -69,7 +80,7 @@ library BatchHeaderV0Codec { /// @notice Get the number of L1 messages popped before this batch. /// @param batchPtr The start memory offset of the batch header in memory. /// @return _totalL1MessagePopped The the number of L1 messages popped before this batch. - function totalL1MessagePopped(uint256 batchPtr) internal pure returns (uint256 _totalL1MessagePopped) { + function getTotalL1MessagePopped(uint256 batchPtr) internal pure returns (uint256 _totalL1MessagePopped) { assembly { _totalL1MessagePopped := shr(192, mload(add(batchPtr, 17))) } @@ -78,7 +89,7 @@ library BatchHeaderV0Codec { /// @notice Get the data hash of the batch header. /// @param batchPtr The start memory offset of the batch header in memory. /// @return _dataHash The data hash of the batch header. - function dataHash(uint256 batchPtr) internal pure returns (bytes32 _dataHash) { + function getDataHash(uint256 batchPtr) internal pure returns (bytes32 _dataHash) { assembly { _dataHash := mload(add(batchPtr, 25)) } @@ -87,19 +98,28 @@ library BatchHeaderV0Codec { /// @notice Get the parent batch hash of the batch header. /// @param batchPtr The start memory offset of the batch header in memory. /// @return _parentBatchHash The parent batch hash of the batch header. - function parentBatchHash(uint256 batchPtr) internal pure returns (bytes32 _parentBatchHash) { + function getParentBatchHash(uint256 batchPtr) internal pure returns (bytes32 _parentBatchHash) { assembly { _parentBatchHash := mload(add(batchPtr, 57)) } } + /// @notice Get the start memory offset for skipped L1 messages bitmap. + /// @param batchPtr The start memory offset of the batch header in memory. + /// @return _bitmapPtr the start memory offset for skipped L1 messages bitmap. + function getSkippedBitmapPtr(uint256 batchPtr) internal pure returns (uint256 _bitmapPtr) { + assembly { + _bitmapPtr := add(batchPtr, BATCH_HEADER_FIXED_LENGTH) + } + } + /// @notice Get the skipped L1 messages bitmap. /// @param batchPtr The start memory offset of the batch header in memory. /// @param index The index of bitmap to load. /// @return _bitmap The bitmap from bits `index * 256` to `index * 256 + 255`. - function skippedBitmap(uint256 batchPtr, uint256 index) internal pure returns (uint256 _bitmap) { + function getSkippedBitmap(uint256 batchPtr, uint256 index) internal pure returns (uint256 _bitmap) { assembly { - batchPtr := add(batchPtr, 89) + batchPtr := add(batchPtr, BATCH_HEADER_FIXED_LENGTH) _bitmap := mload(add(batchPtr, mul(index, 32))) } } @@ -169,14 +189,18 @@ library BatchHeaderV0Codec { /// @param _skippedL1MessageBitmap The skipped L1 message bitmap. function storeSkippedBitmap(uint256 batchPtr, bytes calldata _skippedL1MessageBitmap) internal pure { assembly { - calldatacopy(add(batchPtr, 89), _skippedL1MessageBitmap.offset, _skippedL1MessageBitmap.length) + calldatacopy( + add(batchPtr, BATCH_HEADER_FIXED_LENGTH), + _skippedL1MessageBitmap.offset, + _skippedL1MessageBitmap.length + ) } } /// @notice Compute the batch hash. /// @dev Caller should make sure that the encoded batch header is correct. /// - /// @param batchPtr The memory offset of the encoded batch header. + /// @param batchPtr The start memory offset of the batch header in memory. /// @param length The length of the batch. /// @return _batchHash The hash of the corresponding batch. function computeBatchHash(uint256 batchPtr, uint256 length) internal pure returns (bytes32 _batchHash) { diff --git a/contracts/src/libraries/codec/BatchHeaderV1Codec.sol b/contracts/src/libraries/codec/BatchHeaderV1Codec.sol new file mode 100644 index 000000000..28a5fd513 --- /dev/null +++ b/contracts/src/libraries/codec/BatchHeaderV1Codec.sol @@ -0,0 +1,230 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.24; + +// solhint-disable no-inline-assembly + +/// @dev Below is the encoding for `BatchHeader` V1, total 121 + ceil(l1MessagePopped / 256) * 32 bytes. +/// ```text +/// * Field Bytes Type Index Comments +/// * version 1 uint8 0 The batch version +/// * batchIndex 8 uint64 1 The index of the batch +/// * l1MessagePopped 8 uint64 9 Number of L1 messages popped in the batch +/// * totalL1MessagePopped 8 uint64 17 Number of total L1 messages popped after the batch +/// * dataHash 32 bytes32 25 The data hash of the batch +/// * blobVersionedHash 32 bytes32 57 The versioned hash of the blob with this batch’s data +/// * parentBatchHash 32 bytes32 89 The parent batch hash +/// * skippedL1MessageBitmap dynamic uint256[] 121 A bitmap to indicate which L1 messages are skipped in the batch +/// ``` +library BatchHeaderV1Codec { + /// @dev Thrown when the length of batch header is smaller than 121. + error ErrorBatchHeaderLengthTooSmall(); + + /// @dev Thrown when the length of skippedL1MessageBitmap is incorrect. + error ErrorIncorrectBitmapLength(); + + /// @dev The length of fixed parts of the batch header. + uint256 internal constant BATCH_HEADER_FIXED_LENGTH = 121; + + /// @notice Load batch header in calldata to memory. + /// @param _batchHeader The encoded batch header bytes in calldata. + /// @return batchPtr The start memory offset of the batch header in memory. + /// @return length The length in bytes of the batch header. + function loadAndValidate(bytes calldata _batchHeader) internal pure returns (uint256 batchPtr, uint256 length) { + length = _batchHeader.length; + if (length < BATCH_HEADER_FIXED_LENGTH) revert ErrorBatchHeaderLengthTooSmall(); + + // copy batch header to memory. + assembly { + batchPtr := mload(0x40) + calldatacopy(batchPtr, _batchHeader.offset, length) + mstore(0x40, add(batchPtr, length)) + } + + // check batch header length + uint256 _l1MessagePopped = getL1MessagePopped(batchPtr); + + unchecked { + if (length != BATCH_HEADER_FIXED_LENGTH + ((_l1MessagePopped + 255) / 256) * 32) + revert ErrorIncorrectBitmapLength(); + } + } + + /// @notice Get the version of the batch header. + /// @param batchPtr The start memory offset of the batch header in memory. + /// @return _version The version of the batch header. + function getVersion(uint256 batchPtr) internal pure returns (uint256 _version) { + assembly { + _version := shr(248, mload(batchPtr)) + } + } + + /// @notice Get the batch index of the batch. + /// @param batchPtr The start memory offset of the batch header in memory. + /// @return _batchIndex The batch index of the batch. + function getBatchIndex(uint256 batchPtr) internal pure returns (uint256 _batchIndex) { + assembly { + _batchIndex := shr(192, mload(add(batchPtr, 1))) + } + } + + /// @notice Get the number of L1 messages of the batch. + /// @param batchPtr The start memory offset of the batch header in memory. + /// @return _l1MessagePopped The number of L1 messages of the batch. + function getL1MessagePopped(uint256 batchPtr) internal pure returns (uint256 _l1MessagePopped) { + assembly { + _l1MessagePopped := shr(192, mload(add(batchPtr, 9))) + } + } + + /// @notice Get the number of L1 messages popped before this batch. + /// @param batchPtr The start memory offset of the batch header in memory. + /// @return _totalL1MessagePopped The the number of L1 messages popped before this batch. + function getTotalL1MessagePopped(uint256 batchPtr) internal pure returns (uint256 _totalL1MessagePopped) { + assembly { + _totalL1MessagePopped := shr(192, mload(add(batchPtr, 17))) + } + } + + /// @notice Get the data hash of the batch header. + /// @param batchPtr The start memory offset of the batch header in memory. + /// @return _dataHash The data hash of the batch header. + function getDataHash(uint256 batchPtr) internal pure returns (bytes32 _dataHash) { + assembly { + _dataHash := mload(add(batchPtr, 25)) + } + } + + /// @notice Get the blob versioned hash of the batch header. + /// @param batchPtr The start memory offset of the batch header in memory. + /// @return _blobVersionedHash The blob versioned hash of the batch header. + function getBlobVersionedHash(uint256 batchPtr) internal pure returns (bytes32 _blobVersionedHash) { + assembly { + _blobVersionedHash := mload(add(batchPtr, 57)) + } + } + + /// @notice Get the parent batch hash of the batch header. + /// @param batchPtr The start memory offset of the batch header in memory. + /// @return _parentBatchHash The parent batch hash of the batch header. + function getParentBatchHash(uint256 batchPtr) internal pure returns (bytes32 _parentBatchHash) { + assembly { + _parentBatchHash := mload(add(batchPtr, 89)) + } + } + + /// @notice Get the start memory offset for skipped L1 messages bitmap. + /// @param batchPtr The start memory offset of the batch header in memory. + /// @return _bitmapPtr the start memory offset for skipped L1 messages bitmap. + function getSkippedBitmapPtr(uint256 batchPtr) internal pure returns (uint256 _bitmapPtr) { + assembly { + _bitmapPtr := add(batchPtr, BATCH_HEADER_FIXED_LENGTH) + } + } + + /// @notice Get the skipped L1 messages bitmap. + /// @param batchPtr The start memory offset of the batch header in memory. + /// @param index The index of bitmap to load. + /// @return _bitmap The bitmap from bits `index * 256` to `index * 256 + 255`. + function getSkippedBitmap(uint256 batchPtr, uint256 index) internal pure returns (uint256 _bitmap) { + assembly { + batchPtr := add(batchPtr, BATCH_HEADER_FIXED_LENGTH) + _bitmap := mload(add(batchPtr, mul(index, 32))) + } + } + + /// @notice Store the version of batch header. + /// @param batchPtr The start memory offset of the batch header in memory. + /// @param _version The version of batch header. + function storeVersion(uint256 batchPtr, uint256 _version) internal pure { + assembly { + mstore8(batchPtr, _version) + } + } + + /// @notice Store the batch index of batch header. + /// @dev Because this function can overwrite the subsequent fields, it must be called before + /// `storeL1MessagePopped`, `storeTotalL1MessagePopped`, and `storeDataHash`. + /// @param batchPtr The start memory offset of the batch header in memory. + /// @param _batchIndex The batch index. + function storeBatchIndex(uint256 batchPtr, uint256 _batchIndex) internal pure { + assembly { + mstore(add(batchPtr, 1), shl(192, _batchIndex)) + } + } + + /// @notice Store the number of L1 messages popped in current batch to batch header. + /// @dev Because this function can overwrite the subsequent fields, it must be called before + /// `storeTotalL1MessagePopped` and `storeDataHash`. + /// @param batchPtr The start memory offset of the batch header in memory. + /// @param _l1MessagePopped The number of L1 messages popped in current batch. + function storeL1MessagePopped(uint256 batchPtr, uint256 _l1MessagePopped) internal pure { + assembly { + mstore(add(batchPtr, 9), shl(192, _l1MessagePopped)) + } + } + + /// @notice Store the total number of L1 messages popped after current batch to batch header. + /// @dev Because this function can overwrite the subsequent fields, it must be called before + /// `storeDataHash`. + /// @param batchPtr The start memory offset of the batch header in memory. + /// @param _totalL1MessagePopped The total number of L1 messages popped after current batch. + function storeTotalL1MessagePopped(uint256 batchPtr, uint256 _totalL1MessagePopped) internal pure { + assembly { + mstore(add(batchPtr, 17), shl(192, _totalL1MessagePopped)) + } + } + + /// @notice Store the data hash of batch header. + /// @param batchPtr The start memory offset of the batch header in memory. + /// @param _dataHash The data hash. + function storeDataHash(uint256 batchPtr, bytes32 _dataHash) internal pure { + assembly { + mstore(add(batchPtr, 25), _dataHash) + } + } + + /// @notice Store the parent batch hash of batch header. + /// @param batchPtr The start memory offset of the batch header in memory. + /// @param _blobVersionedHash The versioned hash of the blob with this batch’s data. + function storeBlobVersionedHash(uint256 batchPtr, bytes32 _blobVersionedHash) internal pure { + assembly { + mstore(add(batchPtr, 57), _blobVersionedHash) + } + } + + /// @notice Store the parent batch hash of batch header. + /// @param batchPtr The start memory offset of the batch header in memory. + /// @param _parentBatchHash The parent batch hash. + function storeParentBatchHash(uint256 batchPtr, bytes32 _parentBatchHash) internal pure { + assembly { + mstore(add(batchPtr, 89), _parentBatchHash) + } + } + + /// @notice Store the skipped L1 message bitmap of batch header. + /// @param batchPtr The start memory offset of the batch header in memory. + /// @param _skippedL1MessageBitmap The skipped L1 message bitmap. + function storeSkippedBitmap(uint256 batchPtr, bytes calldata _skippedL1MessageBitmap) internal pure { + assembly { + calldatacopy( + add(batchPtr, BATCH_HEADER_FIXED_LENGTH), + _skippedL1MessageBitmap.offset, + _skippedL1MessageBitmap.length + ) + } + } + + /// @notice Compute the batch hash. + /// @dev Caller should make sure that the encoded batch header is correct. + /// + /// @param batchPtr The start memory offset of the batch header in memory. + /// @param length The length of the batch. + /// @return _batchHash The hash of the corresponding batch. + function computeBatchHash(uint256 batchPtr, uint256 length) internal pure returns (bytes32 _batchHash) { + // in the current version, the hash is: keccak(BatchHeader without timestamp) + assembly { + _batchHash := keccak256(batchPtr, length) + } + } +} diff --git a/contracts/src/libraries/codec/ChunkCodec.sol b/contracts/src/libraries/codec/ChunkCodecV0.sol similarity index 84% rename from contracts/src/libraries/codec/ChunkCodec.sol rename to contracts/src/libraries/codec/ChunkCodecV0.sol index 0da4d9525..1d4751c75 100644 --- a/contracts/src/libraries/codec/ChunkCodec.sol +++ b/contracts/src/libraries/codec/ChunkCodecV0.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; /// @dev Below is the encoding for `Chunk`, total 60*n+1+m bytes. /// ```text @@ -19,12 +19,19 @@ pragma solidity ^0.8.16; /// * Field Bytes Type Index Comments /// * blockNumber 8 uint64 0 The height of this block. /// * timestamp 8 uint64 8 The timestamp of this block. -/// * baseFee 32 uint256 16 The base fee of this block. Currently, it is always 0, because we disable EIP-1559. +/// * baseFee 32 uint256 16 The base fee of this block. /// * gasLimit 8 uint64 48 The gas limit of this block. /// * numTransactions 2 uint16 56 The number of transactions in this block, both L1 & L2 txs. /// * numL1Messages 2 uint16 58 The number of l1 messages in this block. /// ``` -library ChunkCodec { +library ChunkCodecV0 { + /// @dev Thrown when no blocks in chunk. + error ErrorNoBlockInChunk(); + + /// @dev Thrown when the length of chunk is incorrect. + error ErrorIncorrectChunkLength(); + + /// @dev The length of one block context. uint256 internal constant BLOCK_CONTEXT_LENGTH = 60; /// @notice Validate the length of chunk. @@ -32,13 +39,13 @@ library ChunkCodec { /// @param _length The length of the chunk. /// @return _numBlocks The number of blocks in current chunk. function validateChunkLength(uint256 chunkPtr, uint256 _length) internal pure returns (uint256 _numBlocks) { - _numBlocks = numBlocks(chunkPtr); + _numBlocks = getNumBlocks(chunkPtr); // should contain at least one block - require(_numBlocks > 0, "no block in chunk"); + if (_numBlocks == 0) revert ErrorNoBlockInChunk(); // should contain at least the number of the blocks and block contexts - require(_length >= 1 + _numBlocks * BLOCK_CONTEXT_LENGTH, "invalid chunk length"); + if (_length < 1 + _numBlocks * BLOCK_CONTEXT_LENGTH) revert ErrorIncorrectChunkLength(); } /// @notice Return the start memory offset of `l2Transactions`. @@ -46,7 +53,7 @@ library ChunkCodec { /// @param chunkPtr The start memory offset of the chunk in memory. /// @param _numBlocks The number of blocks in current chunk. /// @return _l2TxPtr the start memory offset of `l2Transactions`. - function l2TxPtr(uint256 chunkPtr, uint256 _numBlocks) internal pure returns (uint256 _l2TxPtr) { + function getL2TxPtr(uint256 chunkPtr, uint256 _numBlocks) internal pure returns (uint256 _l2TxPtr) { unchecked { _l2TxPtr = chunkPtr + 1 + _numBlocks * BLOCK_CONTEXT_LENGTH; } @@ -55,7 +62,7 @@ library ChunkCodec { /// @notice Return the number of blocks in current chunk. /// @param chunkPtr The start memory offset of the chunk in memory. /// @return _numBlocks The number of blocks in current chunk. - function numBlocks(uint256 chunkPtr) internal pure returns (uint256 _numBlocks) { + function getNumBlocks(uint256 chunkPtr) internal pure returns (uint256 _numBlocks) { assembly { _numBlocks := shr(248, mload(chunkPtr)) } @@ -89,7 +96,7 @@ library ChunkCodec { /// @notice Return the number of transactions in current block. /// @param blockPtr The start memory offset of the block context in memory. /// @return _numTransactions The number of transactions in current block. - function numTransactions(uint256 blockPtr) internal pure returns (uint256 _numTransactions) { + function getNumTransactions(uint256 blockPtr) internal pure returns (uint256 _numTransactions) { assembly { _numTransactions := shr(240, mload(add(blockPtr, 56))) } @@ -98,7 +105,7 @@ library ChunkCodec { /// @notice Return the number of L1 messages in current block. /// @param blockPtr The start memory offset of the block context in memory. /// @return _numL1Messages The number of L1 messages in current block. - function numL1Messages(uint256 blockPtr) internal pure returns (uint256 _numL1Messages) { + function getNumL1Messages(uint256 blockPtr) internal pure returns (uint256 _numL1Messages) { assembly { _numL1Messages := shr(240, mload(add(blockPtr, 58))) } diff --git a/contracts/src/libraries/codec/ChunkCodecV1.sol b/contracts/src/libraries/codec/ChunkCodecV1.sol new file mode 100644 index 000000000..51f099308 --- /dev/null +++ b/contracts/src/libraries/codec/ChunkCodecV1.sol @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.24; + +import {ChunkCodecV0} from "./ChunkCodecV0.sol"; + +/// @dev Below is the encoding for `Chunk`, total 60*n+1 bytes. +/// The only difference between `ChunkCodecV0` is we remove `l2Transactions` from chunk encoding. +/// ```text +/// * Field Bytes Type Index Comments +/// * numBlocks 1 uint8 0 The number of blocks in this chunk +/// * block[0] 60 BlockContext 1 The first block in this chunk +/// * ...... +/// * block[i] 60 BlockContext 60*i+1 The (i+1)'th block in this chunk +/// * ...... +/// * block[n-1] 60 BlockContext 60*n-59 The last block in this chunk +/// ``` +/// +/// @dev Below is the encoding for `BlockContext`, total 60 bytes. +/// ```text +/// * Field Bytes Type Index Comments +/// * blockNumber 8 uint64 0 The height of this block. +/// * timestamp 8 uint64 8 The timestamp of this block. +/// * baseFee 32 uint256 16 The base fee of this block. +/// * gasLimit 8 uint64 48 The gas limit of this block. +/// * numTransactions 2 uint16 56 The number of transactions in this block, both L1 & L2 txs. +/// * numL1Messages 2 uint16 58 The number of l1 messages in this block. +/// ``` +library ChunkCodecV1 { + /// @dev Thrown when no blocks in chunk. + error ErrorNoBlockInChunk(); + + /// @dev Thrown when the length of chunk is incorrect. + error ErrorIncorrectChunkLength(); + + /// @dev The length of one block context. + uint256 internal constant BLOCK_CONTEXT_LENGTH = 60; + + /// @notice Validate the length of chunk. + /// @param chunkPtr The start memory offset of the chunk in memory. + /// @param _length The length of the chunk. + /// @return _numBlocks The number of blocks in current chunk. + function validateChunkLength(uint256 chunkPtr, uint256 _length) internal pure returns (uint256 _numBlocks) { + _numBlocks = getNumBlocks(chunkPtr); + + // should contain at least one block + if (_numBlocks == 0) revert ErrorNoBlockInChunk(); + + // should contain the number of the blocks and block contexts + if (_length != 1 + _numBlocks * BLOCK_CONTEXT_LENGTH) revert ErrorIncorrectChunkLength(); + } + + /// @notice Return the number of blocks in current chunk. + /// @param chunkPtr The start memory offset of the chunk in memory. + /// @return _numBlocks The number of blocks in current chunk. + function getNumBlocks(uint256 chunkPtr) internal pure returns (uint256 _numBlocks) { + return ChunkCodecV0.getNumBlocks(chunkPtr); + } + + /// @notice Copy the block context to another memory. + /// @param chunkPtr The start memory offset of the chunk in memory. + /// @param dstPtr The destination memory offset to store the block context. + /// @param index The index of block context to copy. + /// @return uint256 The new destination memory offset after copy. + function copyBlockContext( + uint256 chunkPtr, + uint256 dstPtr, + uint256 index + ) internal pure returns (uint256) { + return ChunkCodecV0.copyBlockContext(chunkPtr, dstPtr, index); + } + + /// @notice Return the number of transactions in current block. + /// @param blockPtr The start memory offset of the block context in memory. + /// @return _numTransactions The number of transactions in current block. + function getNumTransactions(uint256 blockPtr) internal pure returns (uint256 _numTransactions) { + return ChunkCodecV0.getNumTransactions(blockPtr); + } + + /// @notice Return the number of L1 messages in current block. + /// @param blockPtr The start memory offset of the block context in memory. + /// @return _numL1Messages The number of L1 messages in current block. + function getNumL1Messages(uint256 blockPtr) internal pure returns (uint256 _numL1Messages) { + return ChunkCodecV0.getNumL1Messages(blockPtr); + } +} diff --git a/contracts/src/libraries/common/AddressAliasHelper.sol b/contracts/src/libraries/common/AddressAliasHelper.sol index 6edad8890..b618f5869 100644 --- a/contracts/src/libraries/common/AddressAliasHelper.sol +++ b/contracts/src/libraries/common/AddressAliasHelper.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; library AddressAliasHelper { /// @dev The offset added to the address in L1. diff --git a/contracts/src/libraries/common/AppendOnlyMerkleTree.sol b/contracts/src/libraries/common/AppendOnlyMerkleTree.sol index 466b5c9a6..23337bb3a 100644 --- a/contracts/src/libraries/common/AppendOnlyMerkleTree.sol +++ b/contracts/src/libraries/common/AppendOnlyMerkleTree.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; abstract contract AppendOnlyMerkleTree { /// @dev The maximum height of the withdraw merkle tree. diff --git a/contracts/src/libraries/common/IWhitelist.sol b/contracts/src/libraries/common/IWhitelist.sol index cac950788..a5187e365 100644 --- a/contracts/src/libraries/common/IWhitelist.sol +++ b/contracts/src/libraries/common/IWhitelist.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; interface IWhitelist { /// @notice Check whether the sender is allowed to do something. diff --git a/contracts/src/libraries/common/OwnableBase.sol b/contracts/src/libraries/common/OwnableBase.sol index ae901024b..71b5aefab 100644 --- a/contracts/src/libraries/common/OwnableBase.sol +++ b/contracts/src/libraries/common/OwnableBase.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; abstract contract OwnableBase { /********** diff --git a/contracts/src/libraries/constants/ScrollConstants.sol b/contracts/src/libraries/constants/ScrollConstants.sol index ff80b141f..db9489b57 100644 --- a/contracts/src/libraries/constants/ScrollConstants.sol +++ b/contracts/src/libraries/constants/ScrollConstants.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; library ScrollConstants { /// @notice The address of default cross chain message sender. diff --git a/contracts/src/libraries/constants/ScrollPredeploy.sol b/contracts/src/libraries/constants/ScrollPredeploy.sol index fcb6e7b3f..93fbeb320 100644 --- a/contracts/src/libraries/constants/ScrollPredeploy.sol +++ b/contracts/src/libraries/constants/ScrollPredeploy.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; library ScrollPredeploy { address internal constant L1_MESSAGE_QUEUE = 0x5300000000000000000000000000000000000000; diff --git a/contracts/src/libraries/gateway/IScrollGateway.sol b/contracts/src/libraries/gateway/IScrollGateway.sol index 819ae625c..955253d41 100644 --- a/contracts/src/libraries/gateway/IScrollGateway.sol +++ b/contracts/src/libraries/gateway/IScrollGateway.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; interface IScrollGateway { /********** diff --git a/contracts/src/libraries/gateway/ScrollGatewayBase.sol b/contracts/src/libraries/gateway/ScrollGatewayBase.sol index a45e89fd1..4bc49ebc8 100644 --- a/contracts/src/libraries/gateway/ScrollGatewayBase.sol +++ b/contracts/src/libraries/gateway/ScrollGatewayBase.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; diff --git a/contracts/src/libraries/token/IScrollERC1155.sol b/contracts/src/libraries/token/IScrollERC1155.sol index 3a3381622..bbc92c075 100644 --- a/contracts/src/libraries/token/IScrollERC1155.sol +++ b/contracts/src/libraries/token/IScrollERC1155.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; import {IERC1155} from "@openzeppelin/contracts/token/ERC1155/IERC1155.sol"; import {IScrollERC1155Extension} from "./IScrollERC1155Extension.sol"; diff --git a/contracts/src/libraries/token/IScrollERC20.sol b/contracts/src/libraries/token/IScrollERC20.sol index f62639076..6904e647c 100644 --- a/contracts/src/libraries/token/IScrollERC20.sol +++ b/contracts/src/libraries/token/IScrollERC20.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {IERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol"; diff --git a/contracts/src/libraries/token/IScrollERC20Upgradeable.sol b/contracts/src/libraries/token/IScrollERC20Upgradeable.sol index d4c9093a7..1358623bf 100644 --- a/contracts/src/libraries/token/IScrollERC20Upgradeable.sol +++ b/contracts/src/libraries/token/IScrollERC20Upgradeable.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; import {IERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; import {IERC20PermitUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/draft-IERC20PermitUpgradeable.sol"; diff --git a/contracts/src/libraries/token/IScrollERC721.sol b/contracts/src/libraries/token/IScrollERC721.sol index 775f8be4f..502bcb767 100644 --- a/contracts/src/libraries/token/IScrollERC721.sol +++ b/contracts/src/libraries/token/IScrollERC721.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import {IScrollERC721Extension} from "./IScrollERC721Extension.sol"; diff --git a/contracts/src/libraries/token/IScrollStandardERC20Factory.sol b/contracts/src/libraries/token/IScrollStandardERC20Factory.sol index 9747bc0ea..6262ce08e 100644 --- a/contracts/src/libraries/token/IScrollStandardERC20Factory.sol +++ b/contracts/src/libraries/token/IScrollStandardERC20Factory.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; interface IScrollStandardERC20Factory { /// @notice Emitted when a l2 token is deployed. diff --git a/contracts/src/libraries/token/ScrollStandardERC20.sol b/contracts/src/libraries/token/ScrollStandardERC20.sol index 3b42fd679..05157d5fe 100644 --- a/contracts/src/libraries/token/ScrollStandardERC20.sol +++ b/contracts/src/libraries/token/ScrollStandardERC20.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol"; import {ERC20PermitUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/draft-ERC20PermitUpgradeable.sol"; diff --git a/contracts/src/libraries/token/ScrollStandardERC20Factory.sol b/contracts/src/libraries/token/ScrollStandardERC20Factory.sol index 2c288bba4..67767a08f 100644 --- a/contracts/src/libraries/token/ScrollStandardERC20Factory.sol +++ b/contracts/src/libraries/token/ScrollStandardERC20Factory.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; diff --git a/contracts/src/libraries/verifier/IRollupVerifier.sol b/contracts/src/libraries/verifier/IRollupVerifier.sol index 8a43127f9..72217d5d0 100644 --- a/contracts/src/libraries/verifier/IRollupVerifier.sol +++ b/contracts/src/libraries/verifier/IRollupVerifier.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; interface IRollupVerifier { /// @notice Verify aggregate zk proof. @@ -12,4 +12,16 @@ interface IRollupVerifier { bytes calldata aggrProof, bytes32 publicInputHash ) external view; + + /// @notice Verify aggregate zk proof. + /// @param version The version of verifier to use. + /// @param batchIndex The batch index to verify. + /// @param aggrProof The aggregated proof. + /// @param publicInputHash The public input hash. + function verifyAggregateProof( + uint256 version, + uint256 batchIndex, + bytes calldata aggrProof, + bytes32 publicInputHash + ) external view; } diff --git a/contracts/src/libraries/verifier/IZkEvmVerifier.sol b/contracts/src/libraries/verifier/IZkEvmVerifier.sol index 708e1c63d..853aca159 100644 --- a/contracts/src/libraries/verifier/IZkEvmVerifier.sol +++ b/contracts/src/libraries/verifier/IZkEvmVerifier.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; interface IZkEvmVerifier { /// @notice Verify aggregate zk proof. diff --git a/contracts/src/libraries/verifier/PatriciaMerkleTrieVerifier.sol b/contracts/src/libraries/verifier/PatriciaMerkleTrieVerifier.sol index f51856492..9ef65109d 100644 --- a/contracts/src/libraries/verifier/PatriciaMerkleTrieVerifier.sol +++ b/contracts/src/libraries/verifier/PatriciaMerkleTrieVerifier.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; library PatriciaMerkleTrieVerifier { /// @notice Internal function to validates a proof from eth_getProof. diff --git a/contracts/src/libraries/verifier/RollupVerifier.sol b/contracts/src/libraries/verifier/RollupVerifier.sol index 86c0ccfcb..ba1a26551 100644 --- a/contracts/src/libraries/verifier/RollupVerifier.sol +++ b/contracts/src/libraries/verifier/RollupVerifier.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-3.0 -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; library RollupVerifier { function pairing(G1Point[] memory p1, G2Point[] memory p2) internal view returns (bool) { diff --git a/contracts/src/libraries/verifier/WithdrawTrieVerifier.sol b/contracts/src/libraries/verifier/WithdrawTrieVerifier.sol index 4efe3a954..c54092545 100644 --- a/contracts/src/libraries/verifier/WithdrawTrieVerifier.sol +++ b/contracts/src/libraries/verifier/WithdrawTrieVerifier.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; // solhint-disable no-inline-assembly diff --git a/contracts/src/libraries/verifier/ZkEvmVerifierV1.sol b/contracts/src/libraries/verifier/ZkEvmVerifierV1.sol index 5d325f0fc..45bfe909d 100644 --- a/contracts/src/libraries/verifier/ZkEvmVerifierV1.sol +++ b/contracts/src/libraries/verifier/ZkEvmVerifierV1.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {IZkEvmVerifier} from "./IZkEvmVerifier.sol"; diff --git a/contracts/src/libraries/verifier/ZkTrieVerifier.sol b/contracts/src/libraries/verifier/ZkTrieVerifier.sol index 16444c8b4..803a35dd8 100644 --- a/contracts/src/libraries/verifier/ZkTrieVerifier.sol +++ b/contracts/src/libraries/verifier/ZkTrieVerifier.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; // solhint-disable no-inline-assembly @@ -22,6 +22,16 @@ library ZkTrieVerifier { /// | 1 byte | ... | 1 byte | ... | /// | account proof length | account proof | storage proof length | storage proof | /// ``` + /// + /// Possible attack vector: + /// + Malicious users can influence how many levels the proof must go through by predicting addresses + /// (or storage slots) that would branch the Trie until a certain depth. Even though artificially + /// increasing the proof's depth of a certain account or storage will not cause a DoS scenario, since + /// the depth can still reach the maximum depth size in the worst-case scenario, artificially increasing + /// the proof's depth will increase the number of iterations the `walkTree` method has to perform in order + /// to reach the respective leaf. If protocols that use this verifier limit the gas used on-chain to perform + /// such a verification (to a reasonable value), then a malicious user might be able to increase it for a + /// particular transaction by reaching a similar hashed key to a certain depth in the Trie. function verifyZkTrieProof( address poseidon, address account, @@ -56,7 +66,7 @@ library ZkTrieVerifier { } } // compute poseidon hash of two uint256 - function poseidon_hash(hasher, v0, v1, domain) -> r { + function poseidonHash(hasher, v0, v1, domain) -> r { let x := mload(0x40) // keccack256("poseidon(uint256[2],uint256)") mstore(x, 0xa717016c00000000000000000000000000000000000000000000000000000000) @@ -68,8 +78,8 @@ library ZkTrieVerifier { r := mload(0x20) } // compute poseidon hash of 1 uint256 - function hash_uint256(hasher, v) -> r { - r := poseidon_hash(hasher, shr(128, v), and(v, 0xffffffffffffffffffffffffffffffff), 512) + function hashUint256(hasher, v) -> r { + r := poseidonHash(hasher, shr(128, v), and(v, 0xffffffffffffffffffffffffffffffff), 512) } // traverses the tree from the root to the node before the leaf. @@ -79,7 +89,8 @@ library ZkTrieVerifier { // the first byte is the number of nodes + 1 let nodes := sub(byte(0, calldataload(ptr)), 1) - ptr := add(ptr, 1) + require(lt(nodes, 249), "InvalidNodeDepth") + ptr := add(ptr, 0x01) // treat the leaf node with different logic for { @@ -91,14 +102,14 @@ library ZkTrieVerifier { let nodeType := byte(0, calldataload(ptr)) // 6 <= nodeType && nodeType < 10 require(lt(sub(nodeType, 6), 4), "InvalidBranchNodeType") - ptr := add(ptr, 1) + ptr := add(ptr, 0x01) // load left/right child hash let childHashL := calldataload(ptr) ptr := add(ptr, 0x20) let childHashR := calldataload(ptr) ptr := add(ptr, 0x20) - let hash := poseidon_hash(hasher, childHashL, childHashR, nodeType) + let hash := poseidonHash(hasher, childHashL, childHashR, nodeType) // first item is considered the root node. // Otherwise verifies that the hash of the current node @@ -139,7 +150,7 @@ library ZkTrieVerifier { ptr := _ptr let leafHash - let key := hash_uint256(hasher, shl(96, _account)) + let key := hashUint256(hasher, shl(96, _account)) // `stateRoot` is a return value and must be checked by the caller ptr, _stateRoot, leafHash := walkTree(hasher, key, ptr) @@ -158,18 +169,18 @@ library ZkTrieVerifier { // [nonce||codesize||0, balance, storage_root, keccak codehash, poseidon codehash] mstore(0x00, calldataload(ptr)) ptr := add(ptr, 0x20) // skip nonce||codesize||0 - mstore(0x00, poseidon_hash(hasher, mload(0x00), calldataload(ptr), 1280)) + mstore(0x00, poseidonHash(hasher, mload(0x00), calldataload(ptr), 1280)) ptr := add(ptr, 0x20) // skip balance storageRootHash := calldataload(ptr) ptr := add(ptr, 0x20) // skip StorageRoot - let tmpHash := hash_uint256(hasher, calldataload(ptr)) + let tmpHash := hashUint256(hasher, calldataload(ptr)) ptr := add(ptr, 0x20) // skip KeccakCodeHash - tmpHash := poseidon_hash(hasher, storageRootHash, tmpHash, 1280) - tmpHash := poseidon_hash(hasher, mload(0x00), tmpHash, 1280) - tmpHash := poseidon_hash(hasher, tmpHash, calldataload(ptr), 1280) + tmpHash := poseidonHash(hasher, storageRootHash, tmpHash, 1280) + tmpHash := poseidonHash(hasher, mload(0x00), tmpHash, 1280) + tmpHash := poseidonHash(hasher, tmpHash, calldataload(ptr), 1280) ptr := add(ptr, 0x20) // skip PoseidonCodeHash - tmpHash := poseidon_hash(hasher, key, tmpHash, 4) + tmpHash := poseidonHash(hasher, key, tmpHash, 4) require(eq(leafHash, tmpHash), "InvalidAccountLeafNodeHash") require(eq(0x20, byte(0, calldataload(ptr))), "InvalidAccountKeyPreimageLength") @@ -192,7 +203,7 @@ library ZkTrieVerifier { ptr := _ptr let leafHash - let key := hash_uint256(hasher, _storageKey) + let key := hashUint256(hasher, _storageKey) let rootHash ptr, rootHash, leafHash := walkTree(hasher, key, ptr) @@ -220,8 +231,8 @@ library ZkTrieVerifier { // compute leaf node hash and compare, details can be found in // https://github.com/scroll-tech/mpt-circuit/blob/v0.7/spec/mpt-proof.md#storage-segmenttypes - mstore(0x00, hash_uint256(hasher, _storageValue)) - mstore(0x00, poseidon_hash(hasher, key, mload(0x00), 4)) + mstore(0x00, hashUint256(hasher, _storageValue)) + mstore(0x00, poseidonHash(hasher, key, mload(0x00), 4)) require(eq(leafHash, mload(0x00)), "InvalidStorageLeafNodeHash") require(eq(0x20, byte(0, calldataload(ptr))), "InvalidStorageKeyPreimageLength") diff --git a/contracts/src/lido/L1LidoGateway.sol b/contracts/src/lido/L1LidoGateway.sol index 416064fd9..c3b87e91f 100644 --- a/contracts/src/lido/L1LidoGateway.sol +++ b/contracts/src/lido/L1LidoGateway.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {IL1ERC20Gateway} from "../L1/gateways/IL1ERC20Gateway.sol"; import {L1ERC20Gateway} from "../L1/gateways/L1ERC20Gateway.sol"; diff --git a/contracts/src/lido/L2LidoGateway.sol b/contracts/src/lido/L2LidoGateway.sol index 991ea0062..310b44ced 100644 --- a/contracts/src/lido/L2LidoGateway.sol +++ b/contracts/src/lido/L2LidoGateway.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {IL1ERC20Gateway} from "../L1/gateways/IL1ERC20Gateway.sol"; import {IL2ERC20Gateway} from "../L2/gateways/IL2ERC20Gateway.sol"; diff --git a/contracts/src/lido/L2WstETHToken.sol b/contracts/src/lido/L2WstETHToken.sol index 9b53e69fb..63e90c0c8 100644 --- a/contracts/src/lido/L2WstETHToken.sol +++ b/contracts/src/lido/L2WstETHToken.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {IERC20PermitUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20PermitUpgradeable.sol"; import {ERC20PermitUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PermitUpgradeable.sol"; diff --git a/contracts/src/lido/LidoBridgeableTokens.sol b/contracts/src/lido/LidoBridgeableTokens.sol index 57bade1dc..2da95ba1b 100644 --- a/contracts/src/lido/LidoBridgeableTokens.sol +++ b/contracts/src/lido/LidoBridgeableTokens.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; abstract contract LidoBridgeableTokens { /************* diff --git a/contracts/src/lido/LidoGatewayManager.sol b/contracts/src/lido/LidoGatewayManager.sol index 08ccb2135..dd4d80984 100644 --- a/contracts/src/lido/LidoGatewayManager.sol +++ b/contracts/src/lido/LidoGatewayManager.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {EnumerableSetUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol"; diff --git a/contracts/src/misc/ERC2771Forwarder.sol b/contracts/src/misc/ERC2771Forwarder.sol index 59708326f..8e1b4d690 100644 --- a/contracts/src/misc/ERC2771Forwarder.sol +++ b/contracts/src/misc/ERC2771Forwarder.sol @@ -4,7 +4,7 @@ // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/metatx/ERC2771Forwarder.sol // Modifications are made to make it compatible with solidity 0.8.16. -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {ERC2771Context} from "@openzeppelin/contracts/metatx/ERC2771Context.sol"; import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; diff --git a/contracts/src/misc/EmptyContract.sol b/contracts/src/misc/EmptyContract.sol index cf7c66610..635e8565d 100644 --- a/contracts/src/misc/EmptyContract.sol +++ b/contracts/src/misc/EmptyContract.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; // solhint-disable no-empty-blocks diff --git a/contracts/src/misc/Fallback.sol b/contracts/src/misc/Fallback.sol index 57472dec0..ba12f3d68 100644 --- a/contracts/src/misc/Fallback.sol +++ b/contracts/src/misc/Fallback.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; diff --git a/contracts/src/misc/Nonces.sol b/contracts/src/misc/Nonces.sol index 3871ea61a..7c761498b 100644 --- a/contracts/src/misc/Nonces.sol +++ b/contracts/src/misc/Nonces.sol @@ -4,7 +4,7 @@ // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Nonces.sol // Modifications are made to make it compatible with solidity 0.8.16. -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; /** * @dev Provides tracking nonces for addresses. Nonces will only increment. diff --git a/contracts/src/misc/ScrollOwner.sol b/contracts/src/misc/ScrollOwner.sol index 0da16cde4..bb3bace7c 100644 --- a/contracts/src/misc/ScrollOwner.sol +++ b/contracts/src/misc/ScrollOwner.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {AccessControlEnumerable} from "@openzeppelin/contracts/access/AccessControlEnumerable.sol"; import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; diff --git a/contracts/src/mocks/MockCaller.sol b/contracts/src/mocks/MockCaller.sol index 5d0341cec..9c253c2c7 100644 --- a/contracts/src/mocks/MockCaller.sol +++ b/contracts/src/mocks/MockCaller.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; contract MockCaller { function callTarget(address to, bytes calldata data) external payable { diff --git a/contracts/src/mocks/MockERC20.sol b/contracts/src/mocks/MockERC20.sol index 2cb1d4403..3e3e4997a 100644 --- a/contracts/src/mocks/MockERC20.sol +++ b/contracts/src/mocks/MockERC20.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol"; diff --git a/contracts/src/mocks/MockGasSwapTarget.sol b/contracts/src/mocks/MockGasSwapTarget.sol index d4ce857db..919315f54 100644 --- a/contracts/src/mocks/MockGasSwapTarget.sol +++ b/contracts/src/mocks/MockGasSwapTarget.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; diff --git a/contracts/src/mocks/MockPatriciaMerkleTrieVerifier.sol b/contracts/src/mocks/MockPatriciaMerkleTrieVerifier.sol index d90e962df..98d541c6a 100644 --- a/contracts/src/mocks/MockPatriciaMerkleTrieVerifier.sol +++ b/contracts/src/mocks/MockPatriciaMerkleTrieVerifier.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {PatriciaMerkleTrieVerifier} from "../libraries/verifier/PatriciaMerkleTrieVerifier.sol"; diff --git a/contracts/src/mocks/MockZkTrieVerifier.sol b/contracts/src/mocks/MockZkTrieVerifier.sol index 61983c2af..fe863678d 100644 --- a/contracts/src/mocks/MockZkTrieVerifier.sol +++ b/contracts/src/mocks/MockZkTrieVerifier.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {ZkTrieVerifier} from "../libraries/verifier/ZkTrieVerifier.sol"; diff --git a/contracts/src/rate-limiter/ETHRateLimiter.sol b/contracts/src/rate-limiter/ETHRateLimiter.sol index c2a641ace..31ba904c7 100644 --- a/contracts/src/rate-limiter/ETHRateLimiter.sol +++ b/contracts/src/rate-limiter/ETHRateLimiter.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; diff --git a/contracts/src/rate-limiter/IETHRateLimiter.sol b/contracts/src/rate-limiter/IETHRateLimiter.sol index 79fae96b6..43db682e5 100644 --- a/contracts/src/rate-limiter/IETHRateLimiter.sol +++ b/contracts/src/rate-limiter/IETHRateLimiter.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; interface IETHRateLimiter { /********** diff --git a/contracts/src/rate-limiter/ITokenRateLimiter.sol b/contracts/src/rate-limiter/ITokenRateLimiter.sol index ad44fa875..050680efc 100644 --- a/contracts/src/rate-limiter/ITokenRateLimiter.sol +++ b/contracts/src/rate-limiter/ITokenRateLimiter.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity ^0.8.24; interface ITokenRateLimiter { /********** diff --git a/contracts/src/rate-limiter/TokenRateLimiter.sol b/contracts/src/rate-limiter/TokenRateLimiter.sol index 5d25f4b3b..dab08e8a2 100644 --- a/contracts/src/rate-limiter/TokenRateLimiter.sol +++ b/contracts/src/rate-limiter/TokenRateLimiter.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {AccessControlEnumerable} from "@openzeppelin/contracts/access/AccessControlEnumerable.sol"; import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; diff --git a/contracts/src/test/ETHRateLimiter.t.sol b/contracts/src/test/ETHRateLimiter.t.sol index eecd35f9e..31c537253 100644 --- a/contracts/src/test/ETHRateLimiter.t.sol +++ b/contracts/src/test/ETHRateLimiter.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {DSTestPlus} from "solmate/test/utils/DSTestPlus.sol"; diff --git a/contracts/src/test/L1CustomERC20Gateway.t.sol b/contracts/src/test/L1CustomERC20Gateway.t.sol index 936b129a5..a1b667d26 100644 --- a/contracts/src/test/L1CustomERC20Gateway.t.sol +++ b/contracts/src/test/L1CustomERC20Gateway.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {MockERC20} from "solmate/test/utils/mocks/MockERC20.sol"; diff --git a/contracts/src/test/L1ERC1155Gateway.t.sol b/contracts/src/test/L1ERC1155Gateway.t.sol index 13dd7f6ee..c9c7836c1 100644 --- a/contracts/src/test/L1ERC1155Gateway.t.sol +++ b/contracts/src/test/L1ERC1155Gateway.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {DSTestPlus} from "solmate/test/utils/DSTestPlus.sol"; import {MockERC1155} from "solmate/test/utils/mocks/MockERC1155.sol"; diff --git a/contracts/src/test/L1ERC721Gateway.t.sol b/contracts/src/test/L1ERC721Gateway.t.sol index d7c28f3c1..b76163d83 100644 --- a/contracts/src/test/L1ERC721Gateway.t.sol +++ b/contracts/src/test/L1ERC721Gateway.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {MockERC721} from "solmate/test/utils/mocks/MockERC721.sol"; import {ERC721TokenReceiver} from "solmate/tokens/ERC721.sol"; diff --git a/contracts/src/test/L1ETHGateway.t.sol b/contracts/src/test/L1ETHGateway.t.sol index d8a3f670f..d03dee7ad 100644 --- a/contracts/src/test/L1ETHGateway.t.sol +++ b/contracts/src/test/L1ETHGateway.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {ITransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; diff --git a/contracts/src/test/L1GasPriceOracle.t.sol b/contracts/src/test/L1GasPriceOracle.t.sol index ce6d5abfe..5c77ce6c7 100644 --- a/contracts/src/test/L1GasPriceOracle.t.sol +++ b/contracts/src/test/L1GasPriceOracle.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {DSTestPlus} from "solmate/test/utils/DSTestPlus.sol"; diff --git a/contracts/src/test/L1GatewayRouter.t.sol b/contracts/src/test/L1GatewayRouter.t.sol index 977ef5390..cb2460ade 100644 --- a/contracts/src/test/L1GatewayRouter.t.sol +++ b/contracts/src/test/L1GatewayRouter.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {MockERC20} from "solmate/test/utils/mocks/MockERC20.sol"; diff --git a/contracts/src/test/L1GatewayTestBase.t.sol b/contracts/src/test/L1GatewayTestBase.t.sol index 53346277c..a47b59459 100644 --- a/contracts/src/test/L1GatewayTestBase.t.sol +++ b/contracts/src/test/L1GatewayTestBase.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {DSTestPlus} from "solmate/test/utils/DSTestPlus.sol"; diff --git a/contracts/src/test/L1MessageQueueWithGasPriceOracle.t.sol b/contracts/src/test/L1MessageQueueWithGasPriceOracle.t.sol index 6ac51affe..536d85ea9 100644 --- a/contracts/src/test/L1MessageQueueWithGasPriceOracle.t.sol +++ b/contracts/src/test/L1MessageQueueWithGasPriceOracle.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {DSTestPlus} from "solmate/test/utils/DSTestPlus.sol"; diff --git a/contracts/src/test/L1ScrollMessengerTest.t.sol b/contracts/src/test/L1ScrollMessengerTest.t.sol index c2eb62659..bd804e21f 100644 --- a/contracts/src/test/L1ScrollMessengerTest.t.sol +++ b/contracts/src/test/L1ScrollMessengerTest.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {DSTestPlus} from "solmate/test/utils/DSTestPlus.sol"; diff --git a/contracts/src/test/L1StandardERC20Gateway.t.sol b/contracts/src/test/L1StandardERC20Gateway.t.sol index 589ae3c5c..576c557d8 100644 --- a/contracts/src/test/L1StandardERC20Gateway.t.sol +++ b/contracts/src/test/L1StandardERC20Gateway.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {MockERC20} from "solmate/test/utils/mocks/MockERC20.sol"; diff --git a/contracts/src/test/L1WETHGateway.t.sol b/contracts/src/test/L1WETHGateway.t.sol index e839d4db2..f2a14425d 100644 --- a/contracts/src/test/L1WETHGateway.t.sol +++ b/contracts/src/test/L1WETHGateway.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {WETH} from "solmate/tokens/WETH.sol"; diff --git a/contracts/src/test/L2CustomERC20Gateway.t.sol b/contracts/src/test/L2CustomERC20Gateway.t.sol index bc3494400..5a0838f2f 100644 --- a/contracts/src/test/L2CustomERC20Gateway.t.sol +++ b/contracts/src/test/L2CustomERC20Gateway.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {MockERC20} from "solmate/test/utils/mocks/MockERC20.sol"; diff --git a/contracts/src/test/L2ERC1155Gateway.t.sol b/contracts/src/test/L2ERC1155Gateway.t.sol index 5a3ab622d..b436306fd 100644 --- a/contracts/src/test/L2ERC1155Gateway.t.sol +++ b/contracts/src/test/L2ERC1155Gateway.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {DSTestPlus} from "solmate/test/utils/DSTestPlus.sol"; import {MockERC1155} from "solmate/test/utils/mocks/MockERC1155.sol"; diff --git a/contracts/src/test/L2ERC721Gateway.t.sol b/contracts/src/test/L2ERC721Gateway.t.sol index b4ef1caeb..2534f0fa8 100644 --- a/contracts/src/test/L2ERC721Gateway.t.sol +++ b/contracts/src/test/L2ERC721Gateway.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {DSTestPlus} from "solmate/test/utils/DSTestPlus.sol"; import {MockERC721} from "solmate/test/utils/mocks/MockERC721.sol"; diff --git a/contracts/src/test/L2ETHGateway.t.sol b/contracts/src/test/L2ETHGateway.t.sol index 004b254fc..324d5335f 100644 --- a/contracts/src/test/L2ETHGateway.t.sol +++ b/contracts/src/test/L2ETHGateway.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {ITransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; diff --git a/contracts/src/test/L2GasPriceOracle.t.sol b/contracts/src/test/L2GasPriceOracle.t.sol index c7f4b0002..dd5a583d4 100644 --- a/contracts/src/test/L2GasPriceOracle.t.sol +++ b/contracts/src/test/L2GasPriceOracle.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {DSTestPlus} from "solmate/test/utils/DSTestPlus.sol"; diff --git a/contracts/src/test/L2GatewayRouter.t.sol b/contracts/src/test/L2GatewayRouter.t.sol index c5aa25133..edf090411 100644 --- a/contracts/src/test/L2GatewayRouter.t.sol +++ b/contracts/src/test/L2GatewayRouter.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {MockERC20} from "solmate/test/utils/mocks/MockERC20.sol"; diff --git a/contracts/src/test/L2GatewayTestBase.t.sol b/contracts/src/test/L2GatewayTestBase.t.sol index 007dc8309..180fba2b8 100644 --- a/contracts/src/test/L2GatewayTestBase.t.sol +++ b/contracts/src/test/L2GatewayTestBase.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {DSTestPlus} from "solmate/test/utils/DSTestPlus.sol"; diff --git a/contracts/src/test/L2MessageQueue.t.sol b/contracts/src/test/L2MessageQueue.t.sol index 9b29ea77f..d0068c1d6 100644 --- a/contracts/src/test/L2MessageQueue.t.sol +++ b/contracts/src/test/L2MessageQueue.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {DSTestPlus} from "solmate/test/utils/DSTestPlus.sol"; diff --git a/contracts/src/test/L2ScrollMessenger.t.sol b/contracts/src/test/L2ScrollMessenger.t.sol index 8be708d37..6dea30edc 100644 --- a/contracts/src/test/L2ScrollMessenger.t.sol +++ b/contracts/src/test/L2ScrollMessenger.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {DSTestPlus} from "solmate/test/utils/DSTestPlus.sol"; diff --git a/contracts/src/test/L2StandardERC20Gateway.t.sol b/contracts/src/test/L2StandardERC20Gateway.t.sol index b057d8e3e..a1fb335a1 100644 --- a/contracts/src/test/L2StandardERC20Gateway.t.sol +++ b/contracts/src/test/L2StandardERC20Gateway.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {MockERC20} from "solmate/test/utils/mocks/MockERC20.sol"; diff --git a/contracts/src/test/L2TxFeeVault.t.sol b/contracts/src/test/L2TxFeeVault.t.sol index 4d53f986c..04f3d89e9 100644 --- a/contracts/src/test/L2TxFeeVault.t.sol +++ b/contracts/src/test/L2TxFeeVault.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {DSTestPlus} from "solmate/test/utils/DSTestPlus.sol"; diff --git a/contracts/src/test/L2USDCGateway.t.sol b/contracts/src/test/L2USDCGateway.t.sol index 2762caa59..316f25815 100644 --- a/contracts/src/test/L2USDCGateway.t.sol +++ b/contracts/src/test/L2USDCGateway.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {ITransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; diff --git a/contracts/src/test/L2WETHGateway.t.sol b/contracts/src/test/L2WETHGateway.t.sol index 8ed22be2c..2d36ce5c7 100644 --- a/contracts/src/test/L2WETHGateway.t.sol +++ b/contracts/src/test/L2WETHGateway.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {WETH} from "solmate/tokens/WETH.sol"; diff --git a/contracts/src/test/MultipleVersionRollupVerifier.t.sol b/contracts/src/test/MultipleVersionRollupVerifier.t.sol index 9da14344e..cd9a168be 100644 --- a/contracts/src/test/MultipleVersionRollupVerifier.t.sol +++ b/contracts/src/test/MultipleVersionRollupVerifier.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {DSTestPlus} from "solmate/test/utils/DSTestPlus.sol"; @@ -24,95 +24,143 @@ contract MultipleVersionRollupVerifierTest is DSTestPlus { v0 = new MockZkEvmVerifier(); v1 = new MockZkEvmVerifier(); v2 = new MockZkEvmVerifier(); - verifier = new MultipleVersionRollupVerifier(address(v0)); - chain = new MockScrollChain(address(1), address(verifier)); + + chain = new MockScrollChain(address(1), address(1)); + uint256[] memory _versions = new uint256[](1); + address[] memory _verifiers = new address[](1); + _versions[0] = 0; + _verifiers[0] = address(v0); + verifier = new MultipleVersionRollupVerifier(address(chain), _versions, _verifiers); } - function testInitialize(address _chain) external { - hevm.assume(_chain != address(0)); - - // set by non-owner, should revert - hevm.startPrank(address(1)); - hevm.expectRevert("Ownable: caller is not the owner"); - verifier.initialize(_chain); - hevm.stopPrank(); - - // succeed - assertEq(verifier.scrollChain(), address(0)); - verifier.initialize(_chain); - assertEq(verifier.scrollChain(), _chain); - - // initialized, revert - hevm.expectRevert("initialized"); - verifier.initialize(_chain); - } - - function testUpdateVerifier(address _newVerifier) external { + function testUpdateVerifierVersion0(address _newVerifier) external { hevm.assume(_newVerifier != address(0)); - verifier.initialize(address(chain)); - // set by non-owner, should revert hevm.startPrank(address(1)); hevm.expectRevert("Ownable: caller is not the owner"); - verifier.updateVerifier(0, address(0)); + verifier.updateVerifier(0, 0, address(0)); hevm.stopPrank(); // start batch index finalized, revert - hevm.expectRevert("start batch index finalized"); - verifier.updateVerifier(0, address(1)); + hevm.expectRevert(MultipleVersionRollupVerifier.ErrorStartBatchIndexFinalized.selector); + verifier.updateVerifier(0, 0, address(1)); // zero verifier address, revert - hevm.expectRevert("zero verifier address"); - verifier.updateVerifier(1, address(0)); + hevm.expectRevert(MultipleVersionRollupVerifier.ErrorZeroAddress.selector); + verifier.updateVerifier(0, 1, address(0)); // change to random operator - assertEq(verifier.legacyVerifiersLength(), 0); - verifier.updateVerifier(uint64(100), _newVerifier); - assertEq(verifier.legacyVerifiersLength(), 1); - (uint64 _startBatchIndex, address _verifier) = verifier.latestVerifier(); + assertEq(verifier.legacyVerifiersLength(0), 0); + verifier.updateVerifier(0, uint64(100), _newVerifier); + assertEq(verifier.legacyVerifiersLength(0), 1); + (uint64 _startBatchIndex, address _verifier) = verifier.latestVerifier(0); assertEq(_startBatchIndex, uint64(100)); assertEq(_verifier, _newVerifier); - (_startBatchIndex, _verifier) = verifier.legacyVerifiers(0); + (_startBatchIndex, _verifier) = verifier.legacyVerifiers(0, 0); assertEq(_startBatchIndex, uint64(0)); assertEq(_verifier, address(v0)); // change to same batch index - verifier.updateVerifier(uint64(100), address(v1)); - (_startBatchIndex, _verifier) = verifier.latestVerifier(); + verifier.updateVerifier(0, uint64(100), address(v1)); + (_startBatchIndex, _verifier) = verifier.latestVerifier(0); assertEq(_startBatchIndex, uint64(100)); assertEq(_verifier, address(v1)); - (_startBatchIndex, _verifier) = verifier.legacyVerifiers(0); + (_startBatchIndex, _verifier) = verifier.legacyVerifiers(0, 0); assertEq(_startBatchIndex, uint64(0)); assertEq(_verifier, address(v0)); // start batch index too small, revert - hevm.expectRevert("start batch index too small"); - verifier.updateVerifier(99, _newVerifier); + hevm.expectRevert(MultipleVersionRollupVerifier.ErrorStartBatchIndexTooSmall.selector); + verifier.updateVerifier(0, 99, _newVerifier); } - function testGetVerifier() external { - verifier.initialize(address(chain)); + function testUpdateVerifierVersion(uint256 version, address _newVerifier) external { + hevm.assume(version != 0); + hevm.assume(_newVerifier != address(0)); - verifier.updateVerifier(100, address(v1)); - verifier.updateVerifier(300, address(v2)); + // set v0 + assertEq(verifier.legacyVerifiersLength(version), 0); + verifier.updateVerifier(version, 1, address(v0)); + assertEq(verifier.legacyVerifiersLength(version), 0); + (uint64 _startBatchIndex, address _verifier) = verifier.latestVerifier(version); + assertEq(_startBatchIndex, 1); + assertEq(_verifier, address(v0)); - assertEq(verifier.getVerifier(0), address(v0)); - assertEq(verifier.getVerifier(1), address(v0)); - assertEq(verifier.getVerifier(99), address(v0)); - assertEq(verifier.getVerifier(100), address(v1)); - assertEq(verifier.getVerifier(101), address(v1)); - assertEq(verifier.getVerifier(299), address(v1)); - assertEq(verifier.getVerifier(300), address(v2)); - assertEq(verifier.getVerifier(301), address(v2)); - assertEq(verifier.getVerifier(10000), address(v2)); + // set by non-owner, should revert + hevm.startPrank(address(1)); + hevm.expectRevert("Ownable: caller is not the owner"); + verifier.updateVerifier(version, 0, address(0)); + hevm.stopPrank(); + + // start batch index finalized, revert + hevm.expectRevert(MultipleVersionRollupVerifier.ErrorStartBatchIndexFinalized.selector); + verifier.updateVerifier(version, 0, address(1)); + + // zero verifier address, revert + hevm.expectRevert(MultipleVersionRollupVerifier.ErrorZeroAddress.selector); + verifier.updateVerifier(version, 1, address(0)); + + // change to random operator + assertEq(verifier.legacyVerifiersLength(version), 0); + verifier.updateVerifier(version, uint64(100), _newVerifier); + assertEq(verifier.legacyVerifiersLength(version), 1); + (_startBatchIndex, _verifier) = verifier.latestVerifier(version); + assertEq(_startBatchIndex, uint64(100)); + assertEq(_verifier, _newVerifier); + (_startBatchIndex, _verifier) = verifier.legacyVerifiers(version, 0); + assertEq(_startBatchIndex, uint64(1)); + assertEq(_verifier, address(v0)); + + // change to same batch index + verifier.updateVerifier(version, uint64(100), address(v1)); + (_startBatchIndex, _verifier) = verifier.latestVerifier(version); + assertEq(_startBatchIndex, uint64(100)); + assertEq(_verifier, address(v1)); + (_startBatchIndex, _verifier) = verifier.legacyVerifiers(version, 0); + assertEq(_startBatchIndex, uint64(1)); + assertEq(_verifier, address(v0)); + + // start batch index too small, revert + hevm.expectRevert(MultipleVersionRollupVerifier.ErrorStartBatchIndexTooSmall.selector); + verifier.updateVerifier(version, 99, _newVerifier); } - function testVerifyAggregateProof() external { - verifier.initialize(address(chain)); + function testGetVerifierV0() external { + verifier.updateVerifier(0, 100, address(v1)); + verifier.updateVerifier(0, 300, address(v2)); - verifier.updateVerifier(100, address(v1)); - verifier.updateVerifier(300, address(v2)); + assertEq(verifier.getVerifier(0, 0), address(v0)); + assertEq(verifier.getVerifier(0, 1), address(v0)); + assertEq(verifier.getVerifier(0, 99), address(v0)); + assertEq(verifier.getVerifier(0, 100), address(v1)); + assertEq(verifier.getVerifier(0, 101), address(v1)); + assertEq(verifier.getVerifier(0, 299), address(v1)); + assertEq(verifier.getVerifier(0, 300), address(v2)); + assertEq(verifier.getVerifier(0, 301), address(v2)); + assertEq(verifier.getVerifier(0, 10000), address(v2)); + } + + function testGetVerifier(uint256 version) external { + hevm.assume(version != 0); + + verifier.updateVerifier(version, 1, address(v0)); + verifier.updateVerifier(version, 100, address(v1)); + verifier.updateVerifier(version, 300, address(v2)); + + assertEq(verifier.getVerifier(version, 1), address(v0)); + assertEq(verifier.getVerifier(version, 99), address(v0)); + assertEq(verifier.getVerifier(version, 100), address(v1)); + assertEq(verifier.getVerifier(version, 101), address(v1)); + assertEq(verifier.getVerifier(version, 299), address(v1)); + assertEq(verifier.getVerifier(version, 300), address(v2)); + assertEq(verifier.getVerifier(version, 301), address(v2)); + assertEq(verifier.getVerifier(version, 10000), address(v2)); + } + + function testVerifyAggregateProofV0() external { + verifier.updateVerifier(0, 100, address(v1)); + verifier.updateVerifier(0, 300, address(v2)); hevm.expectRevert(abi.encode(address(v0))); verifier.verifyAggregateProof(0, new bytes(0), bytes32(0)); @@ -133,4 +181,29 @@ contract MultipleVersionRollupVerifierTest is DSTestPlus { hevm.expectRevert(abi.encode(address(v2))); verifier.verifyAggregateProof(10000, new bytes(0), bytes32(0)); } + + function testVerifyAggregateProof(uint256 version) external { + hevm.assume(version != 0); + + verifier.updateVerifier(version, 1, address(v0)); + verifier.updateVerifier(version, 100, address(v1)); + verifier.updateVerifier(version, 300, address(v2)); + + hevm.expectRevert(abi.encode(address(v0))); + verifier.verifyAggregateProof(version, 1, new bytes(0), bytes32(0)); + hevm.expectRevert(abi.encode(address(v0))); + verifier.verifyAggregateProof(version, 99, new bytes(0), bytes32(0)); + hevm.expectRevert(abi.encode(address(v1))); + verifier.verifyAggregateProof(version, 100, new bytes(0), bytes32(0)); + hevm.expectRevert(abi.encode(address(v1))); + verifier.verifyAggregateProof(version, 101, new bytes(0), bytes32(0)); + hevm.expectRevert(abi.encode(address(v1))); + verifier.verifyAggregateProof(version, 299, new bytes(0), bytes32(0)); + hevm.expectRevert(abi.encode(address(v2))); + verifier.verifyAggregateProof(version, 300, new bytes(0), bytes32(0)); + hevm.expectRevert(abi.encode(address(v2))); + verifier.verifyAggregateProof(version, 301, new bytes(0), bytes32(0)); + hevm.expectRevert(abi.encode(address(v2))); + verifier.verifyAggregateProof(version, 10000, new bytes(0), bytes32(0)); + } } diff --git a/contracts/src/test/ScrollChain.t.sol b/contracts/src/test/ScrollChain.t.sol index 763f58fbf..d24862f5c 100644 --- a/contracts/src/test/ScrollChain.t.sol +++ b/contracts/src/test/ScrollChain.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {DSTestPlus} from "solmate/test/utils/DSTestPlus.sol"; @@ -9,6 +9,8 @@ import {ITransparentUpgradeableProxy, TransparentUpgradeableProxy} from "@openze import {L1MessageQueue} from "../L1/rollup/L1MessageQueue.sol"; import {ScrollChain, IScrollChain} from "../L1/rollup/ScrollChain.sol"; +import {BatchHeaderV0Codec} from "../libraries/codec/BatchHeaderV0Codec.sol"; +import {ChunkCodecV0} from "../libraries/codec/ChunkCodecV0.sol"; import {EmptyContract} from "../misc/EmptyContract.sol"; import {MockRollupVerifier} from "./mocks/MockRollupVerifier.sol"; @@ -53,7 +55,7 @@ contract ScrollChainTest is DSTestPlus { rollup.initialize(address(messageQueue), address(verifier), 100); } - function testInitialized() public { + function testInitialized() external { assertEq(address(this), rollup.owner()); assertEq(rollup.layer2ChainId(), 233); @@ -61,7 +63,7 @@ contract ScrollChainTest is DSTestPlus { rollup.initialize(address(messageQueue), address(0), 100); } - function testCommitBatch() public { + function testCommitBatchV0() external { bytes memory batchHeader0 = new bytes(89); // import 10 L1 messages @@ -76,32 +78,32 @@ contract ScrollChainTest is DSTestPlus { rollup.importGenesisBatch(batchHeader0, bytes32(uint256(1))); // caller not sequencer, revert - hevm.expectRevert("caller not sequencer"); + hevm.expectRevert(ScrollChain.ErrorCallerIsNotSequencer.selector); rollup.commitBatch(0, batchHeader0, new bytes[](0), new bytes(0)); rollup.addSequencer(address(0)); - // invalid version, revert - hevm.startPrank(address(0)); - hevm.expectRevert("invalid version"); - rollup.commitBatch(1, batchHeader0, new bytes[](0), new bytes(0)); - hevm.stopPrank(); - // batch is empty, revert hevm.startPrank(address(0)); - hevm.expectRevert("batch is empty"); + hevm.expectRevert(ScrollChain.ErrorBatchIsEmpty.selector); rollup.commitBatch(0, batchHeader0, new bytes[](0), new bytes(0)); hevm.stopPrank(); + // invalid version, revert + hevm.startPrank(address(0)); + hevm.expectRevert(ScrollChain.ErrorInvalidBatchHeaderVersion.selector); + rollup.commitBatch(2, batchHeader0, new bytes[](1), new bytes(0)); + hevm.stopPrank(); + // batch header length too small, revert hevm.startPrank(address(0)); - hevm.expectRevert("batch header length too small"); + hevm.expectRevert(BatchHeaderV0Codec.ErrorBatchHeaderLengthTooSmall.selector); rollup.commitBatch(0, new bytes(88), new bytes[](1), new bytes(0)); hevm.stopPrank(); // wrong bitmap length, revert hevm.startPrank(address(0)); - hevm.expectRevert("wrong bitmap length"); + hevm.expectRevert(BatchHeaderV0Codec.ErrorIncorrectBitmapLength.selector); rollup.commitBatch(0, new bytes(90), new bytes[](1), new bytes(0)); hevm.stopPrank(); @@ -110,7 +112,7 @@ contract ScrollChainTest is DSTestPlus { mstore(add(batchHeader0, add(0x20, 25)), 2) // change data hash for batch0 } hevm.startPrank(address(0)); - hevm.expectRevert("incorrect parent batch hash"); + hevm.expectRevert(ScrollChain.ErrorIncorrectBatchHash.selector); rollup.commitBatch(0, batchHeader0, new bytes[](1), new bytes(0)); hevm.stopPrank(); assembly { @@ -124,7 +126,7 @@ contract ScrollChainTest is DSTestPlus { chunk0 = new bytes(1); chunks[0] = chunk0; hevm.startPrank(address(0)); - hevm.expectRevert("no block in chunk"); + hevm.expectRevert(ChunkCodecV0.ErrorNoBlockInChunk.selector); rollup.commitBatch(0, batchHeader0, chunks, new bytes(0)); hevm.stopPrank(); @@ -133,7 +135,7 @@ contract ScrollChainTest is DSTestPlus { chunk0[0] = bytes1(uint8(1)); // one block in this chunk chunks[0] = chunk0; hevm.startPrank(address(0)); - hevm.expectRevert("invalid chunk length"); + hevm.expectRevert(ChunkCodecV0.ErrorIncorrectChunkLength.selector); rollup.commitBatch(0, batchHeader0, chunks, new bytes(0)); hevm.stopPrank(); @@ -146,7 +148,7 @@ contract ScrollChainTest is DSTestPlus { bitmap[31] = bytes1(uint8(1)); chunks[0] = chunk0; hevm.startPrank(address(0)); - hevm.expectRevert("cannot skip last L1 message"); + hevm.expectRevert(ScrollChain.ErrorLastL1MessageSkipped.selector); rollup.commitBatch(0, batchHeader0, chunks, bitmap); hevm.stopPrank(); @@ -159,7 +161,7 @@ contract ScrollChainTest is DSTestPlus { bitmap[31] = bytes1(uint8(3)); chunks[0] = chunk0; hevm.startPrank(address(0)); - hevm.expectRevert("num txs less than num L1 msgs"); + hevm.expectRevert(ScrollChain.ErrorNumTxsLessThanNumL1Msgs.selector); rollup.commitBatch(0, batchHeader0, chunks, bitmap); hevm.stopPrank(); @@ -168,7 +170,7 @@ contract ScrollChainTest is DSTestPlus { chunk0[0] = bytes1(uint8(1)); // one block in this chunk chunks[0] = chunk0; hevm.startPrank(address(0)); - hevm.expectRevert("incomplete l2 transaction data"); + hevm.expectRevert(ScrollChain.ErrorIncompleteL2TransactionData.selector); rollup.commitBatch(0, batchHeader0, chunks, new bytes(0)); hevm.stopPrank(); @@ -183,14 +185,14 @@ contract ScrollChainTest is DSTestPlus { // batch is already committed, revert hevm.startPrank(address(0)); - hevm.expectRevert("batch already committed"); + hevm.expectRevert(ScrollChain.ErrorBatchIsAlreadyCommitted.selector); rollup.commitBatch(0, batchHeader0, chunks, new bytes(0)); hevm.stopPrank(); } - function testFinalizeBatchWithProof() public { + function testFinalizeBatchWithProofV0() external { // caller not prover, revert - hevm.expectRevert("caller not prover"); + hevm.expectRevert(ScrollChain.ErrorCallerIsNotProver.selector); rollup.finalizeBatchWithProof(new bytes(0), bytes32(0), bytes32(0), bytes32(0), new bytes(0)); rollup.addProver(address(0)); @@ -228,16 +230,16 @@ contract ScrollChainTest is DSTestPlus { } // incorrect batch hash, revert - batchHeader1[0] = bytes1(uint8(1)); // change version to 1 + batchHeader1[1] = bytes1(uint8(1)); // change random byte hevm.startPrank(address(0)); - hevm.expectRevert("incorrect batch hash"); + hevm.expectRevert(ScrollChain.ErrorIncorrectBatchHash.selector); rollup.finalizeBatchWithProof(batchHeader1, bytes32(uint256(1)), bytes32(uint256(2)), bytes32(0), new bytes(0)); hevm.stopPrank(); - batchHeader1[0] = bytes1(uint8(0)); // change back + batchHeader1[1] = bytes1(uint8(0)); // change back // batch header length too small, revert hevm.startPrank(address(0)); - hevm.expectRevert("batch header length too small"); + hevm.expectRevert(BatchHeaderV0Codec.ErrorBatchHeaderLengthTooSmall.selector); rollup.finalizeBatchWithProof( new bytes(88), bytes32(uint256(1)), @@ -249,7 +251,7 @@ contract ScrollChainTest is DSTestPlus { // wrong bitmap length, revert hevm.startPrank(address(0)); - hevm.expectRevert("wrong bitmap length"); + hevm.expectRevert(BatchHeaderV0Codec.ErrorIncorrectBitmapLength.selector); rollup.finalizeBatchWithProof( new bytes(90), bytes32(uint256(1)), @@ -261,7 +263,7 @@ contract ScrollChainTest is DSTestPlus { // incorrect previous state root, revert hevm.startPrank(address(0)); - hevm.expectRevert("incorrect previous state root"); + hevm.expectRevert(ScrollChain.ErrorIncorrectPreviousStateRoot.selector); rollup.finalizeBatchWithProof(batchHeader1, bytes32(uint256(2)), bytes32(uint256(2)), bytes32(0), new bytes(0)); hevm.stopPrank(); @@ -283,7 +285,7 @@ contract ScrollChainTest is DSTestPlus { // batch already verified, revert hevm.startPrank(address(0)); - hevm.expectRevert("batch already verified"); + hevm.expectRevert(ScrollChain.ErrorBatchIsAlreadyVerified.selector); rollup.finalizeBatchWithProof( batchHeader1, bytes32(uint256(1)), @@ -294,7 +296,7 @@ contract ScrollChainTest is DSTestPlus { hevm.stopPrank(); } - function testCommitAndFinalizeWithL1Messages() public { + function testCommitAndFinalizeWithL1MessagesV0() external { rollup.addSequencer(address(0)); rollup.addProver(address(0)); @@ -486,12 +488,12 @@ contract ScrollChainTest is DSTestPlus { // too many txs in one chunk, revert rollup.updateMaxNumTxInChunk(2); // 3 - 1 hevm.startPrank(address(0)); - hevm.expectRevert("too many txs in one chunk"); + hevm.expectRevert(ScrollChain.ErrorTooManyTxsInOneChunk.selector); rollup.commitBatch(0, batchHeader1, chunks, bitmap); // first chunk with too many txs hevm.stopPrank(); rollup.updateMaxNumTxInChunk(185); // 5+10+300 - 2 - 127 hevm.startPrank(address(0)); - hevm.expectRevert("too many txs in one chunk"); + hevm.expectRevert(ScrollChain.ErrorTooManyTxsInOneChunk.selector); rollup.commitBatch(0, batchHeader1, chunks, bitmap); // second chunk with too many txs hevm.stopPrank(); @@ -544,7 +546,7 @@ contract ScrollChainTest is DSTestPlus { } } - function testRevertBatch() public { + function testRevertBatch() external { // caller not owner, revert hevm.startPrank(address(1)); hevm.expectRevert("Ownable: caller is not the owner"); @@ -589,21 +591,21 @@ contract ScrollChainTest is DSTestPlus { hevm.stopPrank(); // count must be nonzero, revert - hevm.expectRevert("count must be nonzero"); + hevm.expectRevert(ScrollChain.ErrorRevertZeroBatches.selector); rollup.revertBatch(batchHeader0, 0); // incorrect batch hash, revert - hevm.expectRevert("incorrect batch hash"); - batchHeader1[0] = bytes1(uint8(1)); // change version to 1 + hevm.expectRevert(ScrollChain.ErrorIncorrectBatchHash.selector); + batchHeader1[1] = bytes1(uint8(1)); // change random byte rollup.revertBatch(batchHeader1, 1); - batchHeader1[0] = bytes1(uint8(0)); // change back + batchHeader1[1] = bytes1(uint8(0)); // change back // revert middle batch, revert - hevm.expectRevert("reverting must start from the ending"); + hevm.expectRevert(ScrollChain.ErrorRevertNotStartFromEnd.selector); rollup.revertBatch(batchHeader1, 1); // can only revert unfinalized batch, revert - hevm.expectRevert("can only revert unfinalized batch"); + hevm.expectRevert(ScrollChain.ErrorRevertFinalizedBatch.selector); rollup.revertBatch(batchHeader0, 3); // succeed to revert next two pending batches. @@ -620,7 +622,7 @@ contract ScrollChainTest is DSTestPlus { assertEq(uint256(rollup.committedBatches(2)), 0); } - function testAddAndRemoveSequencer(address _sequencer) public { + function testAddAndRemoveSequencer(address _sequencer) external { // set by non-owner, should revert hevm.startPrank(address(1)); hevm.expectRevert("Ownable: caller is not the owner"); @@ -629,7 +631,7 @@ contract ScrollChainTest is DSTestPlus { rollup.removeSequencer(_sequencer); hevm.stopPrank(); - hevm.expectRevert("not EOA"); + hevm.expectRevert(ScrollChain.ErrorAccountIsNotEOA.selector); rollup.addSequencer(address(this)); hevm.assume(_sequencer.code.length == 0); @@ -647,7 +649,7 @@ contract ScrollChainTest is DSTestPlus { assertBoolEq(rollup.isSequencer(_sequencer), false); } - function testAddAndRemoveProver(address _prover) public { + function testAddAndRemoveProver(address _prover) external { // set by non-owner, should revert hevm.startPrank(address(1)); hevm.expectRevert("Ownable: caller is not the owner"); @@ -656,7 +658,7 @@ contract ScrollChainTest is DSTestPlus { rollup.removeProver(_prover); hevm.stopPrank(); - hevm.expectRevert("not EOA"); + hevm.expectRevert(ScrollChain.ErrorAccountIsNotEOA.selector); rollup.addProver(address(this)); hevm.assume(_prover.code.length == 0); @@ -700,7 +702,7 @@ contract ScrollChainTest is DSTestPlus { assertBoolEq(false, rollup.paused()); } - function testUpdateMaxNumTxInChunk(uint256 _maxNumTxInChunk) public { + function testUpdateMaxNumTxInChunk(uint256 _maxNumTxInChunk) external { // set by non-owner, should revert hevm.startPrank(address(1)); hevm.expectRevert("Ownable: caller is not the owner"); @@ -716,57 +718,57 @@ contract ScrollChainTest is DSTestPlus { assertEq(rollup.maxNumTxInChunk(), _maxNumTxInChunk); } - function testImportGenesisBlock() public { + function testImportGenesisBlock() external { bytes memory batchHeader; // zero state root, revert batchHeader = new bytes(89); - hevm.expectRevert("zero state root"); + hevm.expectRevert(ScrollChain.ErrorStateRootIsZero.selector); rollup.importGenesisBatch(batchHeader, bytes32(0)); // batch header length too small, revert batchHeader = new bytes(88); - hevm.expectRevert("batch header length too small"); + hevm.expectRevert(BatchHeaderV0Codec.ErrorBatchHeaderLengthTooSmall.selector); rollup.importGenesisBatch(batchHeader, bytes32(uint256(1))); // wrong bitmap length, revert batchHeader = new bytes(90); - hevm.expectRevert("wrong bitmap length"); + hevm.expectRevert(BatchHeaderV0Codec.ErrorIncorrectBitmapLength.selector); rollup.importGenesisBatch(batchHeader, bytes32(uint256(1))); // not all fields are zero, revert - batchHeader = new bytes(89); + batchHeader = new bytes(121); batchHeader[0] = bytes1(uint8(1)); // version not zero - hevm.expectRevert("not all fields are zero"); + hevm.expectRevert(ScrollChain.ErrorGenesisBatchHasNonZeroField.selector); rollup.importGenesisBatch(batchHeader, bytes32(uint256(1))); batchHeader = new bytes(89); batchHeader[1] = bytes1(uint8(1)); // batchIndex not zero - hevm.expectRevert("not all fields are zero"); + hevm.expectRevert(ScrollChain.ErrorGenesisBatchHasNonZeroField.selector); rollup.importGenesisBatch(batchHeader, bytes32(uint256(1))); batchHeader = new bytes(89 + 32); assembly { mstore(add(batchHeader, add(0x20, 9)), shl(192, 1)) // l1MessagePopped not zero } - hevm.expectRevert("not all fields are zero"); + hevm.expectRevert(ScrollChain.ErrorGenesisBatchHasNonZeroField.selector); rollup.importGenesisBatch(batchHeader, bytes32(uint256(1))); batchHeader = new bytes(89); batchHeader[17] = bytes1(uint8(1)); // totalL1MessagePopped not zero - hevm.expectRevert("not all fields are zero"); + hevm.expectRevert(ScrollChain.ErrorGenesisBatchHasNonZeroField.selector); rollup.importGenesisBatch(batchHeader, bytes32(uint256(1))); // zero data hash, revert batchHeader = new bytes(89); - hevm.expectRevert("zero data hash"); + hevm.expectRevert(ScrollChain.ErrorGenesisDataHashIsZero.selector); rollup.importGenesisBatch(batchHeader, bytes32(uint256(1))); // nonzero parent batch hash, revert batchHeader = new bytes(89); batchHeader[25] = bytes1(uint8(1)); // dataHash not zero batchHeader[57] = bytes1(uint8(1)); // parentBatchHash not zero - hevm.expectRevert("nonzero parent batch hash"); + hevm.expectRevert(ScrollChain.ErrorGenesisParentBatchHashIsNonZero.selector); rollup.importGenesisBatch(batchHeader, bytes32(uint256(1))); // import correctly @@ -781,7 +783,7 @@ contract ScrollChainTest is DSTestPlus { assertGt(uint256(rollup.committedBatches(0)), 0); // Genesis batch imported, revert - hevm.expectRevert("Genesis batch imported"); + hevm.expectRevert(ScrollChain.ErrorGenesisBatchImported.selector); rollup.importGenesisBatch(batchHeader, bytes32(uint256(1))); } diff --git a/contracts/src/test/ScrollStandardERC20Factory.t.sol b/contracts/src/test/ScrollStandardERC20Factory.t.sol index 2c1d4ea6c..9059f45f2 100644 --- a/contracts/src/test/ScrollStandardERC20Factory.t.sol +++ b/contracts/src/test/ScrollStandardERC20Factory.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {DSTestPlus} from "solmate/test/utils/DSTestPlus.sol"; import {WETH} from "solmate/tokens/WETH.sol"; diff --git a/contracts/src/test/ScrollTestBase.t.sol b/contracts/src/test/ScrollTestBase.t.sol index 41d40a536..19a66f39d 100644 --- a/contracts/src/test/ScrollTestBase.t.sol +++ b/contracts/src/test/ScrollTestBase.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {DSTestPlus} from "solmate/test/utils/DSTestPlus.sol"; diff --git a/contracts/src/test/TokenRateLimiter.t.sol b/contracts/src/test/TokenRateLimiter.t.sol index 29127ce45..5eb44b14c 100644 --- a/contracts/src/test/TokenRateLimiter.t.sol +++ b/contracts/src/test/TokenRateLimiter.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {DSTestPlus} from "solmate/test/utils/DSTestPlus.sol"; diff --git a/contracts/src/test/Whitelist.t.sol b/contracts/src/test/Whitelist.t.sol index c82dd5654..5c4a4a3e7 100644 --- a/contracts/src/test/Whitelist.t.sol +++ b/contracts/src/test/Whitelist.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {DSTestPlus} from "solmate/test/utils/DSTestPlus.sol"; import {WETH} from "solmate/tokens/WETH.sol"; diff --git a/contracts/src/test/WithdrawTrieVerifier.t.sol b/contracts/src/test/WithdrawTrieVerifier.t.sol index 7a677c9b4..ddef16df2 100644 --- a/contracts/src/test/WithdrawTrieVerifier.t.sol +++ b/contracts/src/test/WithdrawTrieVerifier.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {DSTestPlus} from "solmate/test/utils/DSTestPlus.sol"; diff --git a/contracts/src/test/integration/GatewayIntegrationBase.t.sol b/contracts/src/test/integration/GatewayIntegrationBase.t.sol index 6ef694952..41fa99f76 100644 --- a/contracts/src/test/integration/GatewayIntegrationBase.t.sol +++ b/contracts/src/test/integration/GatewayIntegrationBase.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {Test} from "forge-std/Test.sol"; import {Vm} from "forge-std/Vm.sol"; diff --git a/contracts/src/test/integration/LidoGatewayIntegration.t.sol b/contracts/src/test/integration/LidoGatewayIntegration.t.sol index 6d65b8e35..7710f2874 100644 --- a/contracts/src/test/integration/LidoGatewayIntegration.t.sol +++ b/contracts/src/test/integration/LidoGatewayIntegration.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {MockERC20} from "solmate/test/utils/mocks/MockERC20.sol"; @@ -56,11 +56,11 @@ contract LidoGatewayIntegrationTest is GatewayIntegrationBase { L2LidoGateway(L2_LIDO_GATEWAY).initializeV2(address(0), address(0), address(0), address(0)); } - function testWithoutRouter() public { + function testWithoutRouter() private { depositAndWithdraw(false); } - function testWithRouter() public { + function testWithRouter() private { depositAndWithdraw(true); } diff --git a/contracts/src/test/lido/L1LidoGateway.t.sol b/contracts/src/test/lido/L1LidoGateway.t.sol index 541d96e10..533ba0f1d 100644 --- a/contracts/src/test/lido/L1LidoGateway.t.sol +++ b/contracts/src/test/lido/L1LidoGateway.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {MockERC20} from "solmate/test/utils/mocks/MockERC20.sol"; diff --git a/contracts/src/test/lido/L2LidoGateway.t.sol b/contracts/src/test/lido/L2LidoGateway.t.sol index d3127a84e..c69c246c6 100644 --- a/contracts/src/test/lido/L2LidoGateway.t.sol +++ b/contracts/src/test/lido/L2LidoGateway.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {MockERC20} from "solmate/test/utils/mocks/MockERC20.sol"; diff --git a/contracts/src/test/lido/L2WstETHToken.t.sol b/contracts/src/test/lido/L2WstETHToken.t.sol index 612d42ee0..0fa302f86 100644 --- a/contracts/src/test/lido/L2WstETHToken.t.sol +++ b/contracts/src/test/lido/L2WstETHToken.t.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {DSTestPlus} from "solmate/test/utils/DSTestPlus.sol"; diff --git a/contracts/src/test/mocks/MockERC1155Recipient.sol b/contracts/src/test/mocks/MockERC1155Recipient.sol index c161dfd2b..489b0ebe5 100644 --- a/contracts/src/test/mocks/MockERC1155Recipient.sol +++ b/contracts/src/test/mocks/MockERC1155Recipient.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {ERC1155TokenReceiver} from "solmate/tokens/ERC1155.sol"; diff --git a/contracts/src/test/mocks/MockERC721Recipient.sol b/contracts/src/test/mocks/MockERC721Recipient.sol index f8dcc14bc..2b56527cc 100644 --- a/contracts/src/test/mocks/MockERC721Recipient.sol +++ b/contracts/src/test/mocks/MockERC721Recipient.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {ERC721TokenReceiver} from "solmate/tokens/ERC721.sol"; diff --git a/contracts/src/test/mocks/MockGatewayRecipient.sol b/contracts/src/test/mocks/MockGatewayRecipient.sol index 13d213f2a..53b4a560d 100644 --- a/contracts/src/test/mocks/MockGatewayRecipient.sol +++ b/contracts/src/test/mocks/MockGatewayRecipient.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {IScrollGatewayCallback} from "../../libraries/callbacks/IScrollGatewayCallback.sol"; diff --git a/contracts/src/test/mocks/MockL1LidoGateway.sol b/contracts/src/test/mocks/MockL1LidoGateway.sol index cb1d30f7d..76a21346b 100644 --- a/contracts/src/test/mocks/MockL1LidoGateway.sol +++ b/contracts/src/test/mocks/MockL1LidoGateway.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {L1LidoGateway} from "../../lido/L1LidoGateway.sol"; diff --git a/contracts/src/test/mocks/MockL2LidoGateway.sol b/contracts/src/test/mocks/MockL2LidoGateway.sol index 0b2fdd4c9..77a696a5d 100644 --- a/contracts/src/test/mocks/MockL2LidoGateway.sol +++ b/contracts/src/test/mocks/MockL2LidoGateway.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {L2LidoGateway} from "../../lido/L2LidoGateway.sol"; diff --git a/contracts/src/test/mocks/MockRollupVerifier.sol b/contracts/src/test/mocks/MockRollupVerifier.sol index 1b601a47a..783b7ce8d 100644 --- a/contracts/src/test/mocks/MockRollupVerifier.sol +++ b/contracts/src/test/mocks/MockRollupVerifier.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {IRollupVerifier} from "../../libraries/verifier/IRollupVerifier.sol"; @@ -11,4 +11,12 @@ contract MockRollupVerifier is IRollupVerifier { bytes calldata, bytes32 ) external view {} + + /// @inheritdoc IRollupVerifier + function verifyAggregateProof( + uint256, + uint256, + bytes calldata, + bytes32 + ) external view {} } diff --git a/contracts/src/test/mocks/MockScrollChain.sol b/contracts/src/test/mocks/MockScrollChain.sol index e79d11c16..da6efa627 100644 --- a/contracts/src/test/mocks/MockScrollChain.sol +++ b/contracts/src/test/mocks/MockScrollChain.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {ScrollChain} from "../../L1/rollup/ScrollChain.sol"; diff --git a/contracts/src/test/mocks/MockScrollMessenger.sol b/contracts/src/test/mocks/MockScrollMessenger.sol index d9107ee7d..bd558eaa2 100644 --- a/contracts/src/test/mocks/MockScrollMessenger.sol +++ b/contracts/src/test/mocks/MockScrollMessenger.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {IScrollMessenger} from "../../libraries/IScrollMessenger.sol"; diff --git a/contracts/src/test/mocks/MockZkEvmVerifier.sol b/contracts/src/test/mocks/MockZkEvmVerifier.sol index 84f3b4ae1..33cbd2aaa 100644 --- a/contracts/src/test/mocks/MockZkEvmVerifier.sol +++ b/contracts/src/test/mocks/MockZkEvmVerifier.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {IZkEvmVerifier} from "../../libraries/verifier/IZkEvmVerifier.sol"; diff --git a/contracts/src/test/mocks/tokens/FeeOnTransferToken.sol b/contracts/src/test/mocks/tokens/FeeOnTransferToken.sol index 1e063c389..1e0db22ba 100644 --- a/contracts/src/test/mocks/tokens/FeeOnTransferToken.sol +++ b/contracts/src/test/mocks/tokens/FeeOnTransferToken.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {MockERC20} from "solmate/test/utils/mocks/MockERC20.sol"; diff --git a/contracts/src/test/mocks/tokens/TransferReentrantToken.sol b/contracts/src/test/mocks/tokens/TransferReentrantToken.sol index 0b3a5e9a6..9001dda54 100644 --- a/contracts/src/test/mocks/tokens/TransferReentrantToken.sol +++ b/contracts/src/test/mocks/tokens/TransferReentrantToken.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity =0.8.16; +pragma solidity =0.8.24; import {MockERC20} from "solmate/test/utils/mocks/MockERC20.sol"; diff --git a/contracts/tsconfig.json b/contracts/tsconfig.json index 5130a78e2..d77c214cd 100644 --- a/contracts/tsconfig.json +++ b/contracts/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es2018", + "target": "es2020", "module": "commonjs", "strict": true, "esModuleInterop": true, diff --git a/contracts/yarn.lock b/contracts/yarn.lock index bd6521578..8373cc0b3 100644 --- a/contracts/yarn.lock +++ b/contracts/yarn.lock @@ -2,12 +2,15 @@ # yarn lockfile v1 -"@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== - dependencies: - "@babel/highlight" "^7.10.4" +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@adraffy/ens-normalize@1.10.1": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz#63430d04bd8c5e74f8d7d049338f1cd9d4f02069" + integrity sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw== "@babel/code-frame@^7.0.0": version "7.16.7" @@ -21,7 +24,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== -"@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7": +"@babel/highlight@^7.16.7": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.9.tgz#61b2ee7f32ea0454612def4fccdae0de232b73e3" integrity sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg== @@ -58,21 +61,38 @@ resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89" integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA== -"@eslint/eslintrc@^0.4.3": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" - integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== +"@eslint-community/eslint-utils@^4.1.2", "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.0", "@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== dependencies: ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" - globals "^13.9.0" - ignore "^4.0.6" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" import-fresh "^3.2.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" + js-yaml "^4.1.0" + minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== + "@ethereum-waffle/chai@^3.4.4": version "3.4.4" resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-3.4.4.tgz#16c4cc877df31b035d6d92486dfdf983df9138ff" @@ -126,74 +146,19 @@ patch-package "^6.2.2" postinstall-postinstall "^2.1.0" -"@ethereumjs/block@^3.5.0", "@ethereumjs/block@^3.6.0", "@ethereumjs/block@^3.6.2": - version "3.6.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.6.2.tgz#63d1e26d0b7a7a3684fce920de6ebabec1e5b674" - integrity sha512-mOqYWwMlAZpYUEOEqt7EfMFuVL2eyLqWWIzcf4odn6QgXY8jBI2NhVuJncrMCKeMZrsJAe7/auaRRB6YcdH+Qw== - dependencies: - "@ethereumjs/common" "^2.6.3" - "@ethereumjs/tx" "^3.5.1" - ethereumjs-util "^7.1.4" - merkle-patricia-tree "^4.2.4" +"@ethereumjs/rlp@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-4.0.1.tgz#626fabfd9081baab3d0a3074b0c7ecaf674aaa41" + integrity sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw== -"@ethereumjs/blockchain@^5.5.0", "@ethereumjs/blockchain@^5.5.2": - version "5.5.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.5.2.tgz#1848abd9dc1ee56acf8cec4c84304d7f4667d027" - integrity sha512-Jz26iJmmsQtngerW6r5BDFaew/f2mObLrRZo3rskLOx1lmtMZ8+TX/vJexmivrnWgmAsTdNWhlKUYY4thPhPig== +"@ethereumjs/util@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-8.1.0.tgz#299df97fb6b034e0577ce9f94c7d9d1004409ed4" + integrity sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA== dependencies: - "@ethereumjs/block" "^3.6.2" - "@ethereumjs/common" "^2.6.3" - "@ethereumjs/ethash" "^1.1.0" - debug "^4.3.3" - ethereumjs-util "^7.1.4" - level-mem "^5.0.1" - lru-cache "^5.1.1" - semaphore-async-await "^1.5.1" - -"@ethereumjs/common@^2.3.0", "@ethereumjs/common@^2.4.0", "@ethereumjs/common@^2.6.0", "@ethereumjs/common@^2.6.3", "@ethereumjs/common@^2.6.4": - version "2.6.4" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.4.tgz#1b3cdd3aa4ee3b0ca366756fc35e4a03022a01cc" - integrity sha512-RDJh/R/EAr+B7ZRg5LfJ0BIpf/1LydFgYdvZEuTraojCbVypO2sQ+QnpP5u2wJf9DASyooKqu8O4FJEWUV6NXw== - dependencies: - crc-32 "^1.2.0" - ethereumjs-util "^7.1.4" - -"@ethereumjs/ethash@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-1.1.0.tgz#7c5918ffcaa9cb9c1dc7d12f77ef038c11fb83fb" - integrity sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA== - dependencies: - "@ethereumjs/block" "^3.5.0" - "@types/levelup" "^4.3.0" - buffer-xor "^2.0.1" - ethereumjs-util "^7.1.1" - miller-rabin "^4.0.0" - -"@ethereumjs/tx@^3.2.1", "@ethereumjs/tx@^3.4.0", "@ethereumjs/tx@^3.5.1": - version "3.5.1" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.1.tgz#8d941b83a602b4a89949c879615f7ea9a90e6671" - integrity sha512-xzDrTiu4sqZXUcaBxJ4n4W5FrppwxLxZB4ZDGVLtxSQR4lVuOnFR6RcUHdg1mpUhAPVrmnzLJpxaeXnPxIyhWA== - dependencies: - "@ethereumjs/common" "^2.6.3" - ethereumjs-util "^7.1.4" - -"@ethereumjs/vm@^5.6.0": - version "5.9.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.9.0.tgz#54e485097c6dbb42554d541ef8d84d06b7ddf12f" - integrity sha512-0IRsj4IuF8lFDWVVLc4mFOImaSX8VWF8CGm3mXHG/LLlQ/Tryy/kKXMw/bU9D+Zw03CdteW+wCGqNFS6+mPjpg== - dependencies: - "@ethereumjs/block" "^3.6.2" - "@ethereumjs/blockchain" "^5.5.2" - "@ethereumjs/common" "^2.6.4" - "@ethereumjs/tx" "^3.5.1" - async-eventemitter "^0.2.4" - core-js-pure "^3.0.1" - debug "^4.3.3" - ethereumjs-util "^7.1.4" - functional-red-black-tree "^1.0.1" - mcl-wasm "^0.7.1" - merkle-patricia-tree "^4.2.4" - rustbn.js "~0.2.0" + "@ethereumjs/rlp" "^4.0.1" + ethereum-cryptography "^2.0.0" + micro-ftch "^0.3.1" "@ethersproject/abi@5.0.0-beta.153": version "5.0.0-beta.153" @@ -210,21 +175,6 @@ "@ethersproject/properties" ">=5.0.0-beta.131" "@ethersproject/strings" ">=5.0.0-beta.130" -"@ethersproject/abi@5.0.7": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.7.tgz#79e52452bd3ca2956d0e1c964207a58ad1a0ee7b" - integrity sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw== - dependencies: - "@ethersproject/address" "^5.0.4" - "@ethersproject/bignumber" "^5.0.7" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/constants" "^5.0.4" - "@ethersproject/hash" "^5.0.4" - "@ethersproject/keccak256" "^5.0.3" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/properties" "^5.0.3" - "@ethersproject/strings" "^5.0.4" - "@ethersproject/abi@5.6.1", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.5.0", "@ethersproject/abi@^5.6.0": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.6.1.tgz#f7de888edeb56b0a657b672bdd1b3a1135cd14f7" @@ -240,6 +190,21 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/strings" "^5.6.0" +"@ethersproject/abi@^5.0.9": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/abstract-provider@5.6.0", "@ethersproject/abstract-provider@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.6.0.tgz#0c4ac7054650dbd9c476cf5907f588bbb6ef3061" @@ -253,6 +218,19 @@ "@ethersproject/transactions" "^5.6.0" "@ethersproject/web" "^5.6.0" +"@ethersproject/abstract-provider@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + "@ethersproject/abstract-signer@5.6.0", "@ethersproject/abstract-signer@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.6.0.tgz#9cd7ae9211c2b123a3b29bf47aab17d4d016e3e7" @@ -264,7 +242,18 @@ "@ethersproject/logger" "^5.6.0" "@ethersproject/properties" "^5.6.0" -"@ethersproject/address@5.6.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.0.4", "@ethersproject/address@^5.6.0": +"@ethersproject/abstract-signer@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/address@5.6.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.6.0.tgz#13c49836d73e7885fc148ad633afad729da25012" integrity sha512-6nvhYXjbXsHPS+30sHZ+U4VMagFC/9zAk6Gd/h3S21YW4+yfb0WfRtaAIZ4kfM4rrVwqiy284LP0GtL5HXGLxQ== @@ -275,6 +264,17 @@ "@ethersproject/logger" "^5.6.0" "@ethersproject/rlp" "^5.6.0" +"@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/base64@5.6.0", "@ethersproject/base64@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.6.0.tgz#a12c4da2a6fb86d88563216b0282308fc15907c9" @@ -282,6 +282,13 @@ dependencies: "@ethersproject/bytes" "^5.6.0" +"@ethersproject/base64@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/basex@5.6.0", "@ethersproject/basex@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.6.0.tgz#9ea7209bf0a1c3ddc2a90f180c3a7f0d7d2e8a69" @@ -290,7 +297,7 @@ "@ethersproject/bytes" "^5.6.0" "@ethersproject/properties" "^5.6.0" -"@ethersproject/bignumber@5.6.0", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.0.7", "@ethersproject/bignumber@^5.6.0": +"@ethersproject/bignumber@5.6.0", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.6.0.tgz#116c81b075c57fa765a8f3822648cf718a8a0e26" integrity sha512-VziMaXIUHQlHJmkv1dlcd6GY2PmT0khtAqaMctCIDogxkrarMzA9L94KN1NeXqqOfFD6r0sJT3vCTOFSmZ07DA== @@ -299,20 +306,43 @@ "@ethersproject/logger" "^5.6.0" bn.js "^4.11.9" -"@ethersproject/bytes@5.6.1", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.4", "@ethersproject/bytes@^5.6.0": +"@ethersproject/bignumber@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + bn.js "^5.2.1" + +"@ethersproject/bytes@5.6.1", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.6.0": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.6.1.tgz#24f916e411f82a8a60412344bf4a813b917eefe7" integrity sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g== dependencies: "@ethersproject/logger" "^5.6.0" -"@ethersproject/constants@5.6.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.0.4", "@ethersproject/constants@^5.6.0": +"@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/constants@5.6.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.6.0.tgz#55e3eb0918584d3acc0688e9958b0cedef297088" integrity sha512-SrdaJx2bK0WQl23nSpV/b1aq293Lh0sUaZT/yYKPDKn4tlAbkH96SPJwIhwSwTsoQQZxuh1jnqsKwyymoiBdWA== dependencies: "@ethersproject/bignumber" "^5.6.0" +"@ethersproject/constants@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/contracts@5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.6.0.tgz#60f2cfc7addd99a865c6c8cfbbcec76297386067" @@ -329,7 +359,7 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/transactions" "^5.6.0" -"@ethersproject/hash@5.6.0", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.0.4", "@ethersproject/hash@^5.6.0": +"@ethersproject/hash@5.6.0", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.6.0.tgz#d24446a5263e02492f9808baa99b6e2b4c3429a2" integrity sha512-fFd+k9gtczqlr0/BruWLAu7UAOas1uRRJvOR84uDf4lNZ+bTkGl366qvniUZHKtlqxBRU65MkOobkmvmpHU+jA== @@ -343,6 +373,21 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/strings" "^5.6.0" +"@ethersproject/hash@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/hdnode@5.6.0", "@ethersproject/hdnode@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.6.0.tgz#9dcbe8d629bbbcf144f2cae476337fe92d320998" @@ -380,7 +425,7 @@ aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/keccak256@5.6.0", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.0.3", "@ethersproject/keccak256@^5.6.0": +"@ethersproject/keccak256@5.6.0", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.6.0.tgz#fea4bb47dbf8f131c2e1774a1cecbfeb9d606459" integrity sha512-tk56BJ96mdj/ksi7HWZVWGjCq0WVl/QvfhFQNeL8fxhBlGoP+L80uDCiQcpJPd+2XxkivS3lwRm3E0CXTfol0w== @@ -388,11 +433,24 @@ "@ethersproject/bytes" "^5.6.0" js-sha3 "0.8.0" -"@ethersproject/logger@5.6.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.0.5", "@ethersproject/logger@^5.6.0": +"@ethersproject/keccak256@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + js-sha3 "0.8.0" + +"@ethersproject/logger@5.6.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.6.0.tgz#d7db1bfcc22fd2e4ab574cba0bb6ad779a9a3e7a" integrity sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg== +"@ethersproject/logger@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== + "@ethersproject/networks@5.6.2", "@ethersproject/networks@^5.6.0": version "5.6.2" resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.6.2.tgz#2bacda62102c0b1fcee408315f2bed4f6fbdf336" @@ -400,6 +458,13 @@ dependencies: "@ethersproject/logger" "^5.6.0" +"@ethersproject/networks@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== + dependencies: + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2@5.6.0", "@ethersproject/pbkdf2@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.6.0.tgz#04fcc2d7c6bff88393f5b4237d906a192426685a" @@ -408,13 +473,20 @@ "@ethersproject/bytes" "^5.6.0" "@ethersproject/sha2" "^5.6.0" -"@ethersproject/properties@5.6.0", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.0.3", "@ethersproject/properties@^5.6.0": +"@ethersproject/properties@5.6.0", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.6.0.tgz#38904651713bc6bdd5bdd1b0a4287ecda920fa04" integrity sha512-szoOkHskajKePTJSZ46uHUWWkbv7TzP2ypdEK6jGMqJaEt2sb0jCgfBo0gH0m2HBpRixMuJ6TBRaQCF7a9DoCg== dependencies: "@ethersproject/logger" "^5.6.0" +"@ethersproject/properties@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== + dependencies: + "@ethersproject/logger" "^5.7.0" + "@ethersproject/providers@5.6.4": version "5.6.4" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.6.4.tgz#1a49c211b57b0b2703c320819abbbfa35c83dff7" @@ -456,6 +528,14 @@ "@ethersproject/bytes" "^5.6.0" "@ethersproject/logger" "^5.6.0" +"@ethersproject/rlp@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/sha2@5.6.0", "@ethersproject/sha2@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.6.0.tgz#364c4c11cc753bda36f31f001628706ebadb64d9" @@ -477,6 +557,18 @@ elliptic "6.5.4" hash.js "1.1.7" +"@ethersproject/signing-key@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" + integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + bn.js "^5.2.1" + elliptic "6.5.4" + hash.js "1.1.7" + "@ethersproject/solidity@5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.6.0.tgz#64657362a596bf7f5630bdc921c07dd78df06dc3" @@ -489,7 +581,7 @@ "@ethersproject/sha2" "^5.6.0" "@ethersproject/strings" "^5.6.0" -"@ethersproject/strings@5.6.0", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.0.4", "@ethersproject/strings@^5.6.0": +"@ethersproject/strings@5.6.0", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.6.0.tgz#9891b26709153d996bf1303d39a7f4bc047878fd" integrity sha512-uv10vTtLTZqrJuqBZR862ZQjTIa724wGPWQqZrofaPI/kUsf53TBG0I0D+hQ1qyNtllbNzaW+PDPHHUI6/65Mg== @@ -498,6 +590,15 @@ "@ethersproject/constants" "^5.6.0" "@ethersproject/logger" "^5.6.0" +"@ethersproject/strings@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/transactions@5.6.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.6.0.tgz#4b594d73a868ef6e1529a2f8f94a785e6791ae4e" @@ -513,6 +614,21 @@ "@ethersproject/rlp" "^5.6.0" "@ethersproject/signing-key" "^5.6.0" +"@ethersproject/transactions@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/units@5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.6.0.tgz#e5cbb1906988f5740254a21b9ded6bd51e826d9c" @@ -554,6 +670,17 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/strings" "^5.6.0" +"@ethersproject/web@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== + dependencies: + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/wordlists@5.6.0", "@ethersproject/wordlists@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.6.0.tgz#79e62c5276e091d8575f6930ba01a29218ded032" @@ -565,19 +692,29 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/strings" "^5.6.0" -"@humanwhocodes/config-array@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" - integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== - dependencies: - "@humanwhocodes/object-schema" "^1.2.0" - debug "^4.1.1" - minimatch "^3.0.4" +"@fastify/busboy@^2.0.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" + integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== -"@humanwhocodes/object-schema@^1.2.0": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== + dependencies: + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" + integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== "@iden3/bigarray@0.0.2": version "0.0.2" @@ -595,11 +732,35 @@ tweetnacl "^1.0.3" tweetnacl-util "^0.15.1" +"@noble/curves@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" + integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw== + dependencies: + "@noble/hashes" "1.3.2" + +"@noble/curves@1.3.0", "@noble/curves@~1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.3.0.tgz#01be46da4fd195822dab821e72f71bf4aeec635e" + integrity sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA== + dependencies: + "@noble/hashes" "1.3.3" + "@noble/hashes@1.0.0", "@noble/hashes@~1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.0.0.tgz#d5e38bfbdaba174805a4e649f13be9a9ed3351ae" integrity sha512-DZVbtY62kc3kkBtMHqwCOfXrT/hnoORy5BJ4+HU1IR59X0KWAOqsfzQPcUl/lQLlG7qXbe/fZ3r/emxtAl+sqg== +"@noble/hashes@1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" + integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== + +"@noble/hashes@1.3.3", "@noble/hashes@~1.3.2": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" + integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== + "@noble/secp256k1@1.5.5", "@noble/secp256k1@~1.5.2": version "1.5.5" resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.5.5.tgz#315ab5745509d1a8c8e90d0bdf59823ccf9bcfc3" @@ -618,7 +779,7 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.walk@^1.2.3": +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -626,31 +787,194 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@nomiclabs/hardhat-ethers@^2.0.0": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.5.tgz#131b0da1b71680d5a01569f916ae878229d326d3" - integrity sha512-A2gZAGB6kUvLx+kzM92HKuUF33F1FSe90L0TmkXkT2Hh0OKRpvWZURUSU2nghD2yC4DzfEZ3DftfeHGvZ2JTUw== +"@nomicfoundation/edr-darwin-arm64@0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.3.1.tgz#386cbb7dd8ba70659d76d6ce5e8b06242fac6c8c" + integrity sha512-qsdGS1Kfp6bVH4fk4hUzbsEm0fH7hGurraKk+IWby7Ecv+u7BuNaLVqeoYauYRFLYnGg8XZmcKOJ9BW35Y96Jg== -"@nomiclabs/hardhat-etherscan@^3.0.0": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.0.3.tgz#ca54a03351f3de41f9f5240e37bea9d64fa24e64" - integrity sha512-OfNtUKc/ZwzivmZnnpwWREfaYncXteKHskn3yDnz+fPBZ6wfM4GR+d5RwjREzYFWE+o5iR9ruXhWw/8fejWM9g== +"@nomicfoundation/edr-darwin-x64@0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.3.1.tgz#809ebd68127fb7b4219c5ddc8ef65b38bc88312b" + integrity sha512-vtS2yuXIgjte42KEg/Aw/xmLRneVrIaDFhFMk578zg3m1UjNP+a29Lirw5fRXaqaL8aPyhRFmUy+1/V4MGaH+g== + +"@nomicfoundation/edr-linux-arm64-gnu@0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.3.1.tgz#897bf524e88d6a07a2b39c5a9c5d94eaeee6ec20" + integrity sha512-GrbQcrVjTFLm/x8HdUzmJ1F8Juau9UEZM/YNr4sAxxTGvBHJlq73VaDZfArxj9Anq/u6aImPbs1ksu28D6XC3A== + +"@nomicfoundation/edr-linux-arm64-musl@0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.3.1.tgz#726d57edee1adcd4844aaf31ec80063f1c44616b" + integrity sha512-wOqugcbugmbZkh58PcIC5naT0ilwkZ0/qH86AniENxsviOaPSrL4aMYhtfypQ3MNxlfrlgLZFCC+D5eJTsNsgQ== + +"@nomicfoundation/edr-linux-x64-gnu@0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.3.1.tgz#d45ca451a30d429ed4ea97982879bf65842385f8" + integrity sha512-V+kyUVqbt52dQRgaZK+EWuPWJ5h/PsCYZmiK18A+DQynZvird7jrTsDppcTvlv1Dvny8UAAP0q/ue7G67OoLJQ== + +"@nomicfoundation/edr-linux-x64-musl@0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.3.1.tgz#ee1d01135654124c0f22ae0c3e7d62388a41e595" + integrity sha512-vwrzLW40jQBDZVYmoJUBMwl36i7muB9AfT4F2fMRsb1JoOMgoeOBp8R+IAxbA6mjIJGwAClkRz5W5hCb3zMtMQ== + +"@nomicfoundation/edr-win32-arm64-msvc@0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-arm64-msvc/-/edr-win32-arm64-msvc-0.3.1.tgz#e89c6e2c7a4458a6fd1de3ef3f57f915b771579e" + integrity sha512-7G29vUGrkwfbJqxo1V+QTxD976gVHx3Z0P5kwb1bErLmlP89cRNX3UN3/dzXpbKH9mp8ZcAjIcIbRUd4C+vH/A== + +"@nomicfoundation/edr-win32-ia32-msvc@0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-ia32-msvc/-/edr-win32-ia32-msvc-0.3.1.tgz#8f05be496c18eff37e3a95628ed8265a03824df0" + integrity sha512-Q39eAkk/j1ZlvHcxQRTAzdY9qlckDNfiuJDgLYTlxdubpmX6KZucuUin/1A5NVhhCToTxw7aFwSglUROY3ejJw== + +"@nomicfoundation/edr-win32-x64-msvc@0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.3.1.tgz#942c2b1490194d70d67c38b702a56e5603db19c7" + integrity sha512-8WzEzWUshw28xowVBhEyu4EQpx0TqNmDa70C3L1MWl5waym4U/VwbijFrI0Sb6Y1kdoNCdBTMvfr8OJNF2qJ/A== + +"@nomicfoundation/edr@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.3.1.tgz#2a7d4de8d70f63f872f9e86a8487f946cc3d2dcc" + integrity sha512-uPg1/CvIJpsCe7Ipe80bYnC/Q2Bt/O55KB2ssLx7Z0os4jwDvWBZas8tLMopT+hpOQnv8cZkHJap1iNDTwAfQg== + optionalDependencies: + "@nomicfoundation/edr-darwin-arm64" "0.3.1" + "@nomicfoundation/edr-darwin-x64" "0.3.1" + "@nomicfoundation/edr-linux-arm64-gnu" "0.3.1" + "@nomicfoundation/edr-linux-arm64-musl" "0.3.1" + "@nomicfoundation/edr-linux-x64-gnu" "0.3.1" + "@nomicfoundation/edr-linux-x64-musl" "0.3.1" + "@nomicfoundation/edr-win32-arm64-msvc" "0.3.1" + "@nomicfoundation/edr-win32-ia32-msvc" "0.3.1" + "@nomicfoundation/edr-win32-x64-msvc" "0.3.1" + +"@nomicfoundation/ethereumjs-common@4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz#9901f513af2d4802da87c66d6f255b510bef5acb" + integrity sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg== + dependencies: + "@nomicfoundation/ethereumjs-util" "9.0.4" + +"@nomicfoundation/ethereumjs-rlp@5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz#66c95256fc3c909f6fb18f6a586475fc9762fa30" + integrity sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw== + +"@nomicfoundation/ethereumjs-tx@5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.4.tgz#b0ceb58c98cc34367d40a30d255d6315b2f456da" + integrity sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw== + dependencies: + "@nomicfoundation/ethereumjs-common" "4.0.4" + "@nomicfoundation/ethereumjs-rlp" "5.0.4" + "@nomicfoundation/ethereumjs-util" "9.0.4" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-util@9.0.4": + version "9.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.4.tgz#84c5274e82018b154244c877b76bc049a4ed7b38" + integrity sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q== + dependencies: + "@nomicfoundation/ethereumjs-rlp" "5.0.4" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/hardhat-chai-matchers@^2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.6.tgz#ef88be3bd666adf29c06ac7882e96c8dbaaa32ba" + integrity sha512-Te1Uyo9oJcTCF0Jy9dztaLpshmlpjLf2yPtWXlXuLjMt3RRSmJLm/+rKVTW6gfadAEs12U/it6D0ZRnnRGiICQ== + dependencies: + "@types/chai-as-promised" "^7.1.3" + chai-as-promised "^7.1.1" + deep-eql "^4.0.1" + ordinal "^1.0.3" + +"@nomicfoundation/hardhat-ethers@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.5.tgz#0422c2123dec7c42e7fb2be8e1691f1d9708db56" + integrity sha512-RNFe8OtbZK6Ila9kIlHp0+S80/0Bu/3p41HUpaRIoHLm6X3WekTd83vob3rE54Duufu1edCiBDxspBzi2rxHHw== + dependencies: + debug "^4.1.1" + lodash.isequal "^4.5.0" + +"@nomicfoundation/hardhat-verify@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.5.tgz#dcc2cb5e5c55a39704c7d492436f80f05a4ca5a3" + integrity sha512-Tg4zu8RkWpyADSFIgF4FlJIUEI4VkxcvELsmbJn2OokbvH2SnUrqKmw0BBfDrtvP0hhmx8wsnrRKP5DV/oTyTA== dependencies: "@ethersproject/abi" "^5.1.2" "@ethersproject/address" "^5.0.2" - cbor "^5.0.2" + cbor "^8.1.0" + chalk "^2.4.2" debug "^4.1.1" - fs-extra "^7.0.1" + lodash.clonedeep "^4.5.0" semver "^6.3.0" - undici "^4.14.1" + table "^6.8.0" + undici "^5.14.0" -"@nomiclabs/hardhat-waffle@^2.0.0": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.3.tgz#9c538a09c5ed89f68f5fd2dc3f78f16ed1d6e0b1" - integrity sha512-049PHSnI1CZq6+XTbrMbMv5NaL7cednTfPenx02k3cEh8wBMLa6ys++dBETJa6JjfwgA9nBhhHQ173LJv6k2Pg== - dependencies: - "@types/sinon-chai" "^3.2.3" - "@types/web3" "1.0.19" +"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz#4c858096b1c17fe58a474fe81b46815f93645c15" + integrity sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w== + +"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz#6e25ccdf6e2d22389c35553b64fe6f3fdaec432c" + integrity sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA== + +"@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz#0a224ea50317139caeebcdedd435c28a039d169c" + integrity sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA== + +"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz#dfa085d9ffab9efb2e7b383aed3f557f7687ac2b" + integrity sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg== + +"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz#c9e06b5d513dd3ab02a7ac069c160051675889a4" + integrity sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w== + +"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz#8d328d16839e52571f72f2998c81e46bf320f893" + integrity sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA== + +"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz#9b49d0634b5976bb5ed1604a1e1b736f390959bb" + integrity sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w== + +"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz#e2867af7264ebbcc3131ef837878955dd6a3676f" + integrity sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg== + +"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz#0685f78608dd516c8cdfb4896ed451317e559585" + integrity sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ== + +"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz#c9a44f7108646f083b82e851486e0f6aeb785836" + integrity sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw== + +"@nomicfoundation/solidity-analyzer@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz#f5f4d36d3f66752f59a57e7208cd856f3ddf6f2d" + integrity sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg== + optionalDependencies: + "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.1" + "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.1" + "@nomicfoundation/solidity-analyzer-freebsd-x64" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.1" + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc" "0.1.1" + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.1" + "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.1" "@openzeppelin/contracts-upgradeable@^v4.9.3": version "4.9.3" @@ -711,6 +1035,11 @@ resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.0.0.tgz#109fb595021de285f05a7db6806f2f48296fcee7" integrity sha512-gIVaYhUsy+9s58m/ETjSJVKHhKTBMmcRb9cEV5/5dwvfDlfORjKrFsDeDHWRrm6RjcPvCLZFwGJjAjLj1gg4HA== +"@scure/base@~1.1.4": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.5.tgz#1d85d17269fe97694b9c592552dd9e5e33552157" + integrity sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ== + "@scure/bip32@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.0.1.tgz#1409bdf9f07f0aec99006bb0d5827693418d3aa5" @@ -720,6 +1049,15 @@ "@noble/secp256k1" "~1.5.2" "@scure/base" "~1.0.0" +"@scure/bip32@1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.3.tgz#a9624991dc8767087c57999a5d79488f48eae6c8" + integrity sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ== + dependencies: + "@noble/curves" "~1.3.0" + "@noble/hashes" "~1.3.2" + "@scure/base" "~1.1.4" + "@scure/bip39@1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.0.0.tgz#47504e58de9a56a4bbed95159d2d6829fa491bb0" @@ -728,6 +1066,14 @@ "@noble/hashes" "~1.0.0" "@scure/base" "~1.0.0" +"@scure/bip39@1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.2.tgz#f3426813f4ced11a47489cbcf7294aa963966527" + integrity sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA== + dependencies: + "@noble/hashes" "~1.3.2" + "@scure/base" "~1.1.4" + "@sentry/core@5.30.0": version "5.30.0" resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" @@ -808,6 +1154,11 @@ dependencies: antlr4ts "^0.5.0-alpha.4" +"@solidity-parser/parser@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.18.0.tgz#8e77a02a09ecce957255a2f48c9a7178ec191908" + integrity sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA== + "@szmarczak/http-timer@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" @@ -815,29 +1166,6 @@ dependencies: defer-to-connect "^1.0.1" -"@truffle/error@^0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.1.0.tgz#5e9fed79e6cda624c926d314b280a576f8b22a36" - integrity sha512-RbUfp5VreNhsa2Q4YbBjz18rOQI909pG32bghl1hulO7IpvcqTS+C3Ge5cNbiWQ1WGzy1wIeKLW0tmQtHFB7qg== - -"@truffle/interface-adapter@^0.5.14": - version "0.5.14" - resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.5.14.tgz#ca4ffebdd6b7720f08c197280083ea82cb5d4374" - integrity sha512-bUM2W5cNgDlxBLEiE3Rg47A0cqL4fNw7a2DgjtxMxCayZLXUA5gf1orLjcYq54a0kOLGh7B7sfgfP3TQINlylw== - dependencies: - bn.js "^5.1.3" - ethers "^4.0.32" - web3 "1.5.3" - -"@truffle/provider@^0.2.24": - version "0.2.52" - resolved "https://registry.yarnpkg.com/@truffle/provider/-/provider-0.2.52.tgz#5aee3bdec2ffd38bbfcb03fcf45246fdd935714c" - integrity sha512-3V0w+2EEMaXLKKrRjT0NN2vy8Yd9DfcenFeFPx4b4VWYmeuG8asSBBe9Gj4VF8mpgf6Iky0LevF5NFwf2hHwsg== - dependencies: - "@truffle/error" "^0.1.0" - "@truffle/interface-adapter" "^0.5.14" - web3 "1.5.3" - "@tsconfig/node10@^1.0.7": version "1.0.8" resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" @@ -865,33 +1193,21 @@ dependencies: ethers "^5.0.2" -"@typechain/ethers-v5@^7.0.1": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-7.2.0.tgz#d559cffe0efe6bdbc20e644b817f6fa8add5e8f8" - integrity sha512-jfcmlTvaaJjng63QsT49MT6R1HFhtO/TBMWbyzPFSzMmVIqb2tL6prnKBs4ZJrSvmgIXWy+ttSjpaxCTq8D/Tw== +"@typechain/ethers-v6@^0.5.1": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@typechain/ethers-v6/-/ethers-v6-0.5.1.tgz#42fe214a19a8b687086c93189b301e2b878797ea" + integrity sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA== dependencies: lodash "^4.17.15" ts-essentials "^7.0.1" -"@typechain/hardhat@^2.3.0": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-2.3.1.tgz#1e8a6e3795e115a5d5348526282b5c597fab0b78" - integrity sha512-BQV8OKQi0KAzLXCdsPO0pZBNQQ6ra8A2ucC26uFX/kquRBtJu1yEyWnVSmtr07b5hyRoJRpzUeINLnyqz4/MAw== +"@typechain/hardhat@^9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-9.1.0.tgz#6985015f01dfb37ef2ca8a29c742d05890351ddc" + integrity sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA== dependencies: fs-extra "^9.1.0" -"@types/abstract-leveldown@*": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz#f055979a99f7654e84d6b8e6267419e9c4cfff87" - integrity sha512-q5veSX6zjUy/DlDhR4Y4cU0k2Ar+DT2LUraP00T19WLmTO6Se1djepCCaqU6nQrwcJ5Hyo/CWqxTzrrFg8eqbQ== - -"@types/bn.js@*", "@types/bn.js@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" - integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA== - dependencies: - "@types/node" "*" - "@types/bn.js@^4.11.3", "@types/bn.js@^4.11.5": version "4.11.6" resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" @@ -899,7 +1215,26 @@ dependencies: "@types/node" "*" -"@types/chai@*", "@types/chai@^4.2.21": +"@types/bn.js@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" + integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA== + dependencies: + "@types/node" "*" + +"@types/chai-as-promised@^7.1.3": + version "7.1.8" + resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz#f2b3d82d53c59626b5d6bbc087667ccb4b677fe9" + integrity sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw== + dependencies: + "@types/chai" "*" + +"@types/chai@*": + version "4.3.12" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.12.tgz#b192fe1c553b54f45d20543adc2ab88455a07d5e" + integrity sha512-zNKDHG/1yxm8Il6uCCVsm+dRdEsJlFoDu73X17y09bId6UwoYww+vFBsAcRzl8knM1sab3Dp1VRikFQwDOtDDw== + +"@types/chai@^4.2.21": version "4.3.1" resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.1.tgz#e2c6e73e0bdeb2521d00756d099218e9f5d90a04" integrity sha512-/zPMqDkzSZ8t3VtxOa4KPq7uzzW978M9Tvh+j7GHKuo6k6GTLxPJ4J5gE5cjfJ26pnXst0N5Hax8Sr0T2Mi9zQ== @@ -934,30 +1269,16 @@ "@types/minimatch" "*" "@types/node" "*" -"@types/json-schema@^7.0.7": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== +"@types/json-schema@^7.0.12": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -"@types/level-errors@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/level-errors/-/level-errors-3.0.0.tgz#15c1f4915a5ef763b51651b15e90f6dc081b96a8" - integrity sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ== - -"@types/levelup@^4.3.0": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@types/levelup/-/levelup-4.3.3.tgz#4dc2b77db079b1cf855562ad52321aa4241b8ef4" - integrity sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA== - dependencies: - "@types/abstract-leveldown" "*" - "@types/level-errors" "*" - "@types/node" "*" - "@types/lru-cache@^5.1.0": version "5.1.1" resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" @@ -993,16 +1314,28 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.24.tgz#20ba1bf69c1b4ab405c7a01e950c4f446b05029f" integrity sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g== +"@types/node@18.15.13": + version "18.15.13" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.13.tgz#f64277c341150c979e42b00e4ac289290c9df469" + integrity sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q== + "@types/node@^10.0.3": version "10.17.60" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== -"@types/node@^12.0.0", "@types/node@^12.12.6": +"@types/node@^12.12.6": version "12.20.48" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.48.tgz#55f70bd432b6515828c0298689776861b90ca4fa" integrity sha512-4kxzqkrpwYtn6okJUcb2lfUu9ilnb3yhUOH6qX3nug8D2DupZ2drIkff2yJzYcNJVl3begnlcaBJ7tqiTTzjnQ== +"@types/node@^20.11.27": + version "20.11.27" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.27.tgz#debe5cfc8a507dd60fe2a3b4875b1604f215c2ac" + integrity sha512-qyUZfMnCg1KEz57r7pzFtSGt49f6RPkPBis3Vo4PbS7roQEDn22hiHzl/Lo1q4i4hDEgBJmBF/NTNg2XR0HbFg== + dependencies: + undici-types "~5.26.4" + "@types/node@^8.0.0": version "8.10.66" resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.66.tgz#dd035d409df322acc83dff62a602f12a5783bbb3" @@ -1039,119 +1372,112 @@ dependencies: "@types/node" "*" +"@types/semver@^7.5.0": + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + "@types/set-value@*": version "4.0.1" resolved "https://registry.yarnpkg.com/@types/set-value/-/set-value-4.0.1.tgz#7caf185556a67c2d9051080931853047423c93bd" integrity sha512-mP/CLy6pdrhsDVrz1+Yp5Ly6Tcel2IAEejhyI5NxY6WnBUdWN+AAfGa0HHsdgCdsPWWcd/4D5J2X2TrRYcYRag== -"@types/sinon-chai@^3.2.3": - version "3.2.8" - resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-3.2.8.tgz#5871d09ab50d671d8e6dd72e9073f8e738ac61dc" - integrity sha512-d4ImIQbT/rKMG8+AXpmcan5T2/PNeSjrYhvkwet6z0p8kzYtfgA32xzOBlbU0yqJfq+/0Ml805iFoODO0LP5/g== +"@typescript-eslint/eslint-plugin@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.2.0.tgz#5a5fcad1a7baed85c10080d71ad901f98c38d5b7" + integrity sha512-mdekAHOqS9UjlmyF/LSs6AIEvfceV749GFxoBAjwAv0nkevfKHWQFDMcBZWUiIC5ft6ePWivXoS36aKQ0Cy3sw== dependencies: - "@types/chai" "*" - "@types/sinon" "*" + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "7.2.0" + "@typescript-eslint/type-utils" "7.2.0" + "@typescript-eslint/utils" "7.2.0" + "@typescript-eslint/visitor-keys" "7.2.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" -"@types/sinon@*": - version "10.0.11" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.11.tgz#8245827b05d3fc57a6601bd35aee1f7ad330fc42" - integrity sha512-dmZsHlBsKUtBpHriNjlK0ndlvEh8dcb9uV9Afsbt89QIyydpC7NcR+nWlAhASfy3GHnxTl4FX/aKE7XZUt/B4g== +"@typescript-eslint/parser@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.2.0.tgz#44356312aea8852a3a82deebdacd52ba614ec07a" + integrity sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg== dependencies: - "@types/sinonjs__fake-timers" "*" + "@typescript-eslint/scope-manager" "7.2.0" + "@typescript-eslint/types" "7.2.0" + "@typescript-eslint/typescript-estree" "7.2.0" + "@typescript-eslint/visitor-keys" "7.2.0" + debug "^4.3.4" -"@types/sinonjs__fake-timers@*": - version "8.1.2" - resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz#bf2e02a3dbd4aecaf95942ecd99b7402e03fad5e" - integrity sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA== - -"@types/underscore@*": - version "1.11.4" - resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.11.4.tgz#62e393f8bc4bd8a06154d110c7d042a93751def3" - integrity sha512-uO4CD2ELOjw8tasUrAhvnn2W4A0ZECOvMjCivJr4gA9pGgjv+qxKWY9GLTMVEK8ej85BxQOocUyE7hImmSQYcg== - -"@types/web3@1.0.19": - version "1.0.19" - resolved "https://registry.yarnpkg.com/@types/web3/-/web3-1.0.19.tgz#46b85d91d398ded9ab7c85a5dd57cb33ac558924" - integrity sha512-fhZ9DyvDYDwHZUp5/STa9XW2re0E8GxoioYJ4pEUZ13YHpApSagixj7IAdoYH5uAK+UalGq6Ml8LYzmgRA/q+A== +"@typescript-eslint/scope-manager@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz#cfb437b09a84f95a0930a76b066e89e35d94e3da" + integrity sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg== dependencies: - "@types/bn.js" "*" - "@types/underscore" "*" + "@typescript-eslint/types" "7.2.0" + "@typescript-eslint/visitor-keys" "7.2.0" -"@typescript-eslint/eslint-plugin@^4.29.1": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276" - integrity sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg== +"@typescript-eslint/type-utils@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.2.0.tgz#7be5c30e9b4d49971b79095a1181324ef6089a19" + integrity sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA== dependencies: - "@typescript-eslint/experimental-utils" "4.33.0" - "@typescript-eslint/scope-manager" "4.33.0" - debug "^4.3.1" - functional-red-black-tree "^1.0.1" - ignore "^5.1.8" - regexpp "^3.1.0" - semver "^7.3.5" - tsutils "^3.21.0" + "@typescript-eslint/typescript-estree" "7.2.0" + "@typescript-eslint/utils" "7.2.0" + debug "^4.3.4" + ts-api-utils "^1.0.1" -"@typescript-eslint/experimental-utils@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd" - integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q== +"@typescript-eslint/types@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.2.0.tgz#0feb685f16de320e8520f13cca30779c8b7c403f" + integrity sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA== + +"@typescript-eslint/typescript-estree@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz#5beda2876c4137f8440c5a84b4f0370828682556" + integrity sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA== dependencies: - "@types/json-schema" "^7.0.7" - "@typescript-eslint/scope-manager" "4.33.0" - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/typescript-estree" "4.33.0" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" + "@typescript-eslint/types" "7.2.0" + "@typescript-eslint/visitor-keys" "7.2.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" -"@typescript-eslint/parser@^4.29.1": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899" - integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA== +"@typescript-eslint/utils@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.2.0.tgz#fc8164be2f2a7068debb4556881acddbf0b7ce2a" + integrity sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA== dependencies: - "@typescript-eslint/scope-manager" "4.33.0" - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/typescript-estree" "4.33.0" - debug "^4.3.1" + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "7.2.0" + "@typescript-eslint/types" "7.2.0" + "@typescript-eslint/typescript-estree" "7.2.0" + semver "^7.5.4" -"@typescript-eslint/scope-manager@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3" - integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ== +"@typescript-eslint/visitor-keys@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz#5035f177752538a5750cca1af6044b633610bf9e" + integrity sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A== dependencies: - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/visitor-keys" "4.33.0" - -"@typescript-eslint/types@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" - integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== - -"@typescript-eslint/typescript-estree@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609" - integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA== - dependencies: - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/visitor-keys" "4.33.0" - debug "^4.3.1" - globby "^11.0.3" - is-glob "^4.0.1" - semver "^7.3.5" - tsutils "^3.21.0" - -"@typescript-eslint/visitor-keys@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd" - integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg== - dependencies: - "@typescript-eslint/types" "4.33.0" - eslint-visitor-keys "^2.0.0" + "@typescript-eslint/types" "7.2.0" + eslint-visitor-keys "^3.4.1" "@ungap/promise-all-settled@1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + "@yarnpkg/lockfile@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" @@ -1167,13 +1493,6 @@ abbrev@1.0.x: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU= -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - abstract-leveldown@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz#5cb89f958a44f526779d740d1440e743e0c30a57" @@ -1195,17 +1514,6 @@ abstract-leveldown@^5.0.0, abstract-leveldown@~5.0.0: dependencies: xtend "~4.0.0" -abstract-leveldown@^6.2.1: - version "6.3.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a" - integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ== - dependencies: - buffer "^5.5.0" - immediate "^3.2.3" - level-concat-iterator "~2.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - abstract-leveldown@~2.6.0: version "2.6.3" resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8" @@ -1213,17 +1521,6 @@ abstract-leveldown@~2.6.0: dependencies: xtend "~4.0.0" -abstract-leveldown@~6.2.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb" - integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ== - dependencies: - buffer "^5.5.0" - immediate "^3.2.3" - level-concat-iterator "~2.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -1232,7 +1529,7 @@ accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" -acorn-jsx@^5.0.0, acorn-jsx@^5.3.1: +acorn-jsx@^5.0.0, acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== @@ -1247,20 +1544,15 @@ acorn@^6.0.7: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -acorn@^7.4.0: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - acorn@^8.4.1: version "8.7.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== -address@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" - integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== +acorn@^8.9.0: + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== adm-zip@^0.4.16: version "0.4.16" @@ -1272,6 +1564,11 @@ aes-js@3.0.0: resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0= +aes-js@4.0.0-beta.5: + version "4.0.0-beta.5" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-4.0.0-beta.5.tgz#8d2452c52adedebc3a3e28465d858c11ca315873" + integrity sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q== + aes-js@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a" @@ -1292,7 +1589,7 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.6.1, ajv@^6.9.1: +ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.6.1, ajv@^6.9.1: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1317,6 +1614,13 @@ amdefine@>=0.0.4: resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= +ansi-align@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + ansi-colors@3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" @@ -1452,6 +1756,16 @@ array-back@^2.0.0: dependencies: typical "^2.6.1" +array-back@^3.0.1, array-back@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" + integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== + +array-back@^4.0.1, array-back@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" + integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -1545,7 +1859,7 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -async-eventemitter@^0.2.2, async-eventemitter@^0.2.4: +async-eventemitter@^0.2.2: version "0.2.4" resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== @@ -1596,11 +1910,6 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -2189,7 +2498,7 @@ big-integer@^1.6.42, big-integer@^1.6.48: resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== -bignumber.js@^9.0.0, bignumber.js@^9.0.1: +bignumber.js@^9.0.0: version "9.0.2" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.2.tgz#71c6c6bed38de64e24a65ebe16cfcf23ae693673" integrity sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw== @@ -2262,11 +2571,16 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.6, bn.js@^ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.1.3, bn.js@^5.2.0: +bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== +bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + body-parser@1.19.2: version "1.19.2" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e" @@ -2301,6 +2615,20 @@ body-parser@^1.16.0: type-is "~1.6.18" unpipe "1.0.0" +boxen@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -2464,6 +2792,18 @@ bufferutil@^4.0.1: dependencies: node-gyp-build "^4.3.0" +builtin-modules@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + +builtins@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" + integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== + dependencies: + semver "^7.0.0" + bytes@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" @@ -2562,7 +2902,7 @@ camelcase@^5.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.0.0: +camelcase@^6.0.0, camelcase@^6.2.0: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== @@ -2577,13 +2917,19 @@ caseless@^0.12.0, caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -cbor@^5.0.2: - version "5.2.0" - resolved "https://registry.yarnpkg.com/cbor/-/cbor-5.2.0.tgz#4cca67783ccd6de7b50ab4ed62636712f287a67c" - integrity sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A== +cbor@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/cbor/-/cbor-8.1.0.tgz#cfc56437e770b73417a2ecbfc9caf6b771af60d5" + integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg== dependencies: - bignumber.js "^9.0.1" - nofilter "^1.0.4" + nofilter "^3.1.0" + +chai-as-promised@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" + integrity sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA== + dependencies: + check-error "^1.0.2" chai@^4.2.0: version "4.3.6" @@ -2801,6 +3147,11 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" @@ -2962,6 +3313,26 @@ command-line-args@^4.0.7: find-replace "^1.0.3" typical "^2.6.1" +command-line-args@^5.1.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e" + integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== + dependencies: + array-back "^3.1.0" + find-replace "^3.0.0" + lodash.camelcase "^4.3.0" + typical "^4.0.0" + +command-line-usage@^6.1.0: + version "6.1.3" + resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.3.tgz#428fa5acde6a838779dfa30e44686f4b6761d957" + integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw== + dependencies: + array-back "^4.0.2" + chalk "^2.4.2" + table-layout "^1.0.2" + typical "^5.2.0" + commander@2.18.0: version "2.18.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.18.0.tgz#2bf063ddee7c7891176981a2cc798e5754bc6970" @@ -3083,11 +3454,6 @@ cosmiconfig@^5.0.7: js-yaml "^3.13.1" parse-json "^4.0.0" -crc-32@^1.2.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" - integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== - create-ecdh@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" @@ -3194,7 +3560,7 @@ death@^1.1.0: resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" integrity sha1-AaqcQB7dknUFFEcLgmY5DGbGcxg= -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8, debug@^2.6.9: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -3208,7 +3574,7 @@ debug@3.2.6: dependencies: ms "^2.1.1" -debug@4, debug@^4.0.1, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3, debug@^4.3.4: +debug@4, debug@4.3.4, debug@^4.0.1, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -3222,13 +3588,6 @@ debug@4.3.1: dependencies: ms "2.1.2" -debug@4.3.3: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== - dependencies: - ms "2.1.2" - debug@^3.1.0, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" @@ -3265,6 +3624,13 @@ deep-eql@^3.0.1: dependencies: type-detect "^4.0.0" +deep-eql@^4.0.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" + integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== + dependencies: + type-detect "^4.0.0" + deep-equal@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" @@ -3277,6 +3643,11 @@ deep-equal@~1.1.1: object-keys "^1.1.1" regexp.prototype.flags "^1.2.0" +deep-extend@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -3302,14 +3673,6 @@ deferred-leveldown@~4.0.0: abstract-leveldown "~5.0.0" inherits "^2.0.3" -deferred-leveldown@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" - integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw== - dependencies: - abstract-leveldown "~6.2.1" - inherits "^2.0.3" - define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.4" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" @@ -3385,14 +3748,6 @@ detect-indent@^4.0.0: dependencies: repeating "^2.0.0" -detect-port@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.3.0.tgz#d9c40e9accadd4df5cac6a782aefd014d573d1f1" - integrity sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ== - dependencies: - address "^1.0.1" - debug "^2.6.0" - diff@3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" @@ -3417,6 +3772,13 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +difflib@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/difflib/-/difflib-0.2.4.tgz#b5e30361a6db023176d562892db85940a718f47e" + integrity sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w== + dependencies: + heap ">= 0.2.0" + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -3550,16 +3912,6 @@ encoding-down@5.0.4, encoding-down@~5.0.0: level-errors "^2.0.0" xtend "^4.0.1" -encoding-down@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b" - integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw== - dependencies: - abstract-leveldown "^6.2.1" - inherits "^2.0.3" - level-codec "^9.0.0" - level-errors "^2.0.0" - encoding@^0.1.11: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" @@ -3574,7 +3926,7 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enquirer@^2.3.0, enquirer@^2.3.5: +enquirer@^2.3.0: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== @@ -3600,7 +3952,7 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.18.5, es-abstract@^1.19.1, es-abstract@^1.19.2: +es-abstract@^1.19.1, es-abstract@^1.19.2: version "1.19.5" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.5.tgz#a2cb01eb87f724e815b278b0dd0d00f36ca9a7f1" integrity sha512-Aa2G2+Rd3b6kxEUKTF4TaW67czBLyAv3z7VOhYRU50YBx+bbsYZ9xQP4lMNazePuFlybXI0V4MruPos7qUo5fA== @@ -3700,15 +4052,20 @@ escodegen@1.8.x: optionalDependencies: source-map "~0.2.0" +eslint-compat-utils@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz#f45e3b5ced4c746c127cf724fb074cd4e730d653" + integrity sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg== + eslint-config-prettier@^8.3.0: version "8.5.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== -eslint-config-standard@^16.0.3: - version "16.0.3" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz#6c8761e544e96c531ff92642eeb87842b8488516" - integrity sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg== +eslint-config-standard@^17.1.0: + version "17.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz#40ffb8595d47a6b242e07cbfd49dc211ed128975" + integrity sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q== eslint-import-resolver-node@^0.3.6: version "0.3.6" @@ -3726,6 +4083,15 @@ eslint-module-utils@^2.7.3: debug "^3.2.7" find-up "^2.1.0" +eslint-plugin-es-x@^7.5.0: + version "7.5.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-es-x/-/eslint-plugin-es-x-7.5.0.tgz#d08d9cd155383e35156c48f736eb06561d07ba92" + integrity sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ== + dependencies: + "@eslint-community/eslint-utils" "^4.1.2" + "@eslint-community/regexpp" "^4.6.0" + eslint-compat-utils "^0.1.2" + eslint-plugin-es@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz#75a7cdfdccddc0589934aeeb384175f221c57893" @@ -3753,6 +4119,23 @@ eslint-plugin-import@^2.23.4: resolve "^1.22.0" tsconfig-paths "^3.14.1" +eslint-plugin-n@^16.6.2: + version "16.6.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz#6a60a1a376870064c906742272074d5d0b412b0b" + integrity sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + builtins "^5.0.1" + eslint-plugin-es-x "^7.5.0" + get-tsconfig "^4.7.0" + globals "^13.24.0" + ignore "^5.2.4" + is-builtin-module "^3.2.1" + is-core-module "^2.12.1" + minimatch "^3.1.2" + resolve "^1.22.2" + semver "^7.5.3" + eslint-plugin-node@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz#c95544416ee4ada26740a30474eefc5402dc671d" @@ -3772,10 +4155,10 @@ eslint-plugin-prettier@^3.4.0: dependencies: prettier-linter-helpers "^1.0.0" -eslint-plugin-promise@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-5.2.0.tgz#a596acc32981627eb36d9d75f9666ac1a4564971" - integrity sha512-SftLb1pUG01QYq2A/hGAWfDRXqYD82zE7j7TopDOyNdU+7SvvoXREls/+PRTY17vUXzXnZA/zfnyKgRH6x4JJw== +eslint-plugin-promise@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz#269a3e2772f62875661220631bd4dafcb4083816" + integrity sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig== eslint-scope@^4.0.3: version "4.0.3" @@ -3785,13 +4168,13 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" - estraverse "^4.1.1" + estraverse "^5.2.0" eslint-utils@^1.3.1: version "1.4.3" @@ -3800,29 +4183,22 @@ eslint-utils@^1.3.1: dependencies: eslint-visitor-keys "^1.1.0" -eslint-utils@^2.0.0, eslint-utils@^2.1.0: +eslint-utils@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== dependencies: eslint-visitor-keys "^1.1.0" -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^5.6.0: version "5.16.0" @@ -3866,51 +4242,49 @@ eslint@^5.6.0: table "^5.2.3" text-table "^0.2.0" -eslint@^7.29.0: - version "7.32.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" - integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== +eslint@^8.57.0: + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== dependencies: - "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.3" - "@humanwhocodes/config-array" "^0.5.0" - ajv "^6.10.0" + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" - debug "^4.0.1" + debug "^4.3.2" doctrine "^3.0.0" - enquirer "^2.3.5" escape-string-regexp "^4.0.0" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.1" - esquery "^1.4.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.1.2" - globals "^13.6.0" - ignore "^4.0.6" - import-fresh "^3.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" imurmurhash "^0.1.4" is-glob "^4.0.0" - js-yaml "^3.13.1" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" lodash.merge "^4.6.2" - minimatch "^3.0.4" + minimatch "^3.1.2" natural-compare "^1.4.0" - optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" - strip-json-comments "^3.1.0" - table "^6.0.9" + optionator "^0.9.3" + strip-ansi "^6.0.1" text-table "^0.2.0" - v8-compile-cache "^2.0.3" espree@^5.0.1: version "5.0.1" @@ -3921,14 +4295,14 @@ espree@^5.0.1: acorn-jsx "^5.0.0" eslint-visitor-keys "^1.0.0" -espree@^7.3.0, espree@^7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: - acorn "^7.4.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" esprima@2.7.x, esprima@^2.7.1: version "2.7.3" @@ -3940,13 +4314,20 @@ esprima@^4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.1, esquery@^1.4.0: +esquery@^1.0.1: version "1.4.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: estraverse "^5.1.0" +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + esrecurse@^4.1.0, esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" @@ -4142,7 +4523,7 @@ ethereum-common@^0.0.18: resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f" integrity sha1-L9w1dvIykDNYl26znaeDIT/5Uj8= -ethereum-cryptography@^0.1.2, ethereum-cryptography@^0.1.3: +ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== @@ -4173,6 +4554,16 @@ ethereum-cryptography@^1.0.3: "@scure/bip32" "1.0.1" "@scure/bip39" "1.0.0" +ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.1.3.tgz#1352270ed3b339fe25af5ceeadcf1b9c8e30768a" + integrity sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA== + dependencies: + "@noble/curves" "1.3.0" + "@noble/hashes" "1.3.3" + "@scure/bip32" "1.3.3" + "@scure/bip39" "1.2.2" + ethereum-waffle@^3.0.0: version "3.4.4" resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-3.4.4.tgz#1378b72040697857b7f5e8f473ca8f97a37b5840" @@ -4326,7 +4717,7 @@ ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereum rlp "^2.0.0" safe-buffer "^5.1.1" -ethereumjs-util@^7.0.10, ethereumjs-util@^7.0.2, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.3, ethereumjs-util@^7.1.4: +ethereumjs-util@^7.0.2, ethereumjs-util@^7.1.0: version "7.1.4" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.4.tgz#a6885bcdd92045b06f596c7626c3e89ab3312458" integrity sha512-p6KmuPCX4mZIqsQzXfmSx9Y0l2hqf+VkAiwSisW3UKUFdk8ZkAt+AYaor83z2nSi6CU2zSsXMlD80hAbNEGM0A== @@ -4390,7 +4781,7 @@ ethereumjs-wallet@0.6.5: utf8 "^3.0.0" uuid "^3.3.2" -ethers@^4.0.32, ethers@^4.0.40: +ethers@^4.0.40: version "4.0.49" resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.49.tgz#0eb0e9161a0c8b4761be547396bbe2fb121a8894" integrity sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg== @@ -4405,7 +4796,7 @@ ethers@^4.0.32, ethers@^4.0.40: uuid "2.0.1" xmlhttprequest "1.8.0" -ethers@^5.0.0, ethers@^5.0.1, ethers@^5.0.2, ethers@^5.5.2: +ethers@^5.0.1, ethers@^5.0.2, ethers@^5.5.2: version "5.6.4" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.6.4.tgz#23629e9a7d4bc5802dfb53d4da420d738744b53c" integrity sha512-62UIfxAQXdf67TeeOaoOoPctm5hUlYgfd0iW3wxfj7qRYKDcvvy0f+sJ3W2/Pyx77R8dblvejA8jokj+lS+ATQ== @@ -4441,6 +4832,19 @@ ethers@^5.0.0, ethers@^5.0.1, ethers@^5.0.2, ethers@^5.5.2: "@ethersproject/web" "5.6.0" "@ethersproject/wordlists" "5.6.0" +ethers@^6.11.1: + version "6.11.1" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.11.1.tgz#96aae00b627c2e35f9b0a4d65c7ab658259ee6af" + integrity sha512-mxTAE6wqJQAbp5QAe/+o+rXOID7Nw91OZXvgpjDa1r4fAbq2Nu314oEZSbjoRLacuCzs7kUC3clEvkCQowffGg== + dependencies: + "@adraffy/ens-normalize" "1.10.1" + "@noble/curves" "1.2.0" + "@noble/hashes" "1.3.2" + "@types/node" "18.15.13" + aes-js "4.0.0-beta.5" + tslib "2.4.0" + ws "8.5.0" + ethjs-unit@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" @@ -4457,11 +4861,6 @@ ethjs-util@0.1.6, ethjs-util@^0.1.3, ethjs-util@^0.1.6: is-hex-prefixed "1.0.0" strip-hex-prefix "1.0.0" -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - eventemitter3@4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" @@ -4786,6 +5185,13 @@ find-replace@^1.0.3: array-back "^1.0.4" test-value "^2.1.0" +find-replace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" + integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== + dependencies: + array-back "^3.0.1" + find-up@3.0.0, find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -4793,7 +5199,7 @@ find-up@3.0.0, find-up@^3.0.0: dependencies: locate-path "^3.0.0" -find-up@5.0.0: +find-up@5.0.0, find-up@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== @@ -4910,11 +5316,6 @@ for-in@^1.0.2: resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= - forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -5054,6 +5455,11 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" @@ -5162,6 +5568,13 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" +get-tsconfig@^4.7.0: + version "4.7.3" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.3.tgz#0498163d98f7b58484dd4906999c0c9d5f103f83" + integrity sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg== + dependencies: + resolve-pkg-maps "^1.0.0" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -5189,6 +5602,13 @@ glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + glob@7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" @@ -5213,7 +5633,19 @@ glob@7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.2.0, glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.6, glob@~7.2.0: +glob@7.1.7: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@7.2.0, glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@~7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== @@ -5225,6 +5657,17 @@ glob@7.2.0, glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.6, glob@~7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" +glob@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + glob@^5.0.15: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" @@ -5265,10 +5708,10 @@ globals@^11.7.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^13.6.0, globals@^13.9.0: - version "13.13.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.13.0.tgz#ac32261060d8070e2719dd6998406e27d2b5727b" - integrity sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A== +globals@^13.19.0, globals@^13.24.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: type-fest "^0.20.2" @@ -5291,7 +5734,7 @@ globby@^10.0.1: merge2 "^1.2.3" slash "^3.0.0" -globby@^11.0.3: +globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -5345,6 +5788,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + growl@1.10.5: version "1.10.5" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" @@ -5384,57 +5832,52 @@ hardhat-gas-reporter@^1.0.4: eth-gas-reporter "^0.2.24" sha1 "^1.1.1" -hardhat@^2.9.3: - version "2.9.3" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.9.3.tgz#4759dc3c468c7d15f34334ca1be7d59b04e47b1e" - integrity sha512-7Vw99RbYbMZ15UzegOR/nqIYIqddZXvLwJGaX5sX4G5bydILnbjmDU6g3jMKJSiArEixS3vHAEaOs5CW1JQ3hg== +hardhat@^2.22.0: + version "2.22.0" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.22.0.tgz#ccb03fbacc2a3c5902a70e0e4df4acd92ee533f0" + integrity sha512-t1J+ThxNYANL6ub6yM5XC84RY38vhfG7ODBtVRNQFQozdALo3qZUjxDzyGQU0U0eswe6orK49hq9UpdB7nPXNQ== dependencies: - "@ethereumjs/block" "^3.6.0" - "@ethereumjs/blockchain" "^5.5.0" - "@ethereumjs/common" "^2.6.0" - "@ethereumjs/tx" "^3.4.0" - "@ethereumjs/vm" "^5.6.0" "@ethersproject/abi" "^5.1.2" "@metamask/eth-sig-util" "^4.0.0" + "@nomicfoundation/edr" "^0.3.0" + "@nomicfoundation/ethereumjs-common" "4.0.4" + "@nomicfoundation/ethereumjs-tx" "5.0.4" + "@nomicfoundation/ethereumjs-util" "9.0.4" + "@nomicfoundation/solidity-analyzer" "^0.1.0" "@sentry/node" "^5.18.1" - "@solidity-parser/parser" "^0.14.1" "@types/bn.js" "^5.1.0" "@types/lru-cache" "^5.1.0" - abort-controller "^3.0.0" adm-zip "^0.4.16" aggregate-error "^3.0.0" ansi-escapes "^4.3.0" + boxen "^5.1.2" chalk "^2.4.2" chokidar "^3.4.0" ci-info "^2.0.0" debug "^4.1.1" enquirer "^2.3.0" env-paths "^2.2.0" - ethereum-cryptography "^0.1.2" + ethereum-cryptography "^1.0.3" ethereumjs-abi "^0.6.8" - ethereumjs-util "^7.1.3" find-up "^2.1.0" fp-ts "1.19.3" fs-extra "^7.0.1" - glob "^7.1.3" + glob "7.2.0" immutable "^4.0.0-rc.12" io-ts "1.10.4" + keccak "^3.0.2" lodash "^4.17.11" - merkle-patricia-tree "^4.2.2" mnemonist "^0.38.0" - mocha "^9.2.0" + mocha "^10.0.0" p-map "^4.0.0" - qs "^6.7.0" raw-body "^2.4.1" resolve "1.17.0" semver "^6.3.0" - slash "^3.0.0" solc "0.7.3" source-map-support "^0.5.13" stacktrace-parser "^0.1.10" - "true-case-path" "^2.2.1" tsort "0.0.1" - undici "^4.14.1" + undici "^5.14.0" uuid "^8.3.2" ws "^7.4.6" @@ -5559,6 +6002,13 @@ hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hasown@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + he@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -5569,6 +6019,11 @@ heap@0.2.6: resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac" integrity sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw= +"heap@>= 0.2.0": + version "0.2.7" + resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" + integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== + hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -5698,11 +6153,16 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.1.1, ignore@^5.1.8, ignore@^5.2.0: +ignore@^5.1.1, ignore@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== +ignore@^5.2.4: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + immediate@^3.2.3: version "3.3.0" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" @@ -5878,6 +6338,13 @@ is-buffer@~2.0.3: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== +is-builtin-module@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" + integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A== + dependencies: + builtin-modules "^3.3.0" + is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" @@ -5890,6 +6357,13 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" +is-core-module@^2.12.1, is-core-module@^2.13.0: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + is-core-module@^2.8.1: version "2.8.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" @@ -6000,13 +6474,6 @@ is-function@^1.0.1: resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== -is-generator-function@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -6048,6 +6515,11 @@ is-object@^1.0.1: resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" @@ -6114,17 +6586,6 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.3, is-typed-array@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.8.tgz#cbaa6585dc7db43318bc5b89523ea384a6f65e79" - integrity sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-abstract "^1.18.5" - foreach "^2.0.5" - has-tostringtag "^1.0.0" - is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -6262,7 +6723,7 @@ js-yaml@4.0.0: dependencies: argparse "^2.0.1" -js-yaml@4.1.0: +js-yaml@4.1.0, js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== @@ -6422,6 +6883,15 @@ keccak@^3.0.0: node-gyp-build "^4.2.0" readable-stream "^3.6.0" +keccak@^3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d" + integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" + keyv@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" @@ -6486,11 +6956,6 @@ level-codec@~7.0.0: resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-7.0.1.tgz#341f22f907ce0f16763f24bddd681e395a0fb8a7" integrity sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ== -level-concat-iterator@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263" - integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw== - level-errors@^1.0.3: version "1.1.2" resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.1.2.tgz#4399c2f3d3ab87d0625f7e3676e2d807deff404d" @@ -6540,15 +7005,6 @@ level-iterator-stream@~3.0.0: readable-stream "^2.3.6" xtend "^4.0.0" -level-iterator-stream@~4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c" - integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q== - dependencies: - inherits "^2.0.4" - readable-stream "^3.4.0" - xtend "^4.0.2" - level-mem@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-3.0.1.tgz#7ce8cf256eac40f716eb6489654726247f5a89e5" @@ -6557,22 +7013,6 @@ level-mem@^3.0.1: level-packager "~4.0.0" memdown "~3.0.0" -level-mem@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-5.0.1.tgz#c345126b74f5b8aa376dc77d36813a177ef8251d" - integrity sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg== - dependencies: - level-packager "^5.0.3" - memdown "^5.0.0" - -level-packager@^5.0.3: - version "5.1.1" - resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939" - integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ== - dependencies: - encoding-down "^6.3.0" - levelup "^4.3.2" - level-packager@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-4.0.1.tgz#7e7d3016af005be0869bc5fa8de93d2a7f56ffe6" @@ -6604,13 +7044,6 @@ level-sublevel@6.6.4: typewiselite "~1.0.0" xtend "~4.0.0" -level-supports@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d" - integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg== - dependencies: - xtend "^4.0.2" - level-ws@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b" @@ -6628,15 +7061,6 @@ level-ws@^1.0.0: readable-stream "^2.2.8" xtend "^4.0.1" -level-ws@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-2.0.0.tgz#207a07bcd0164a0ec5d62c304b4615c54436d339" - integrity sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA== - dependencies: - inherits "^2.0.3" - readable-stream "^3.1.0" - xtend "^4.0.1" - levelup@3.1.1, levelup@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/levelup/-/levelup-3.1.1.tgz#c2c0b3be2b4dc316647c53b42e2f559e232d2189" @@ -6660,17 +7084,6 @@ levelup@^1.2.1: semver "~5.4.1" xtend "~4.0.0" -levelup@^4.3.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6" - integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ== - dependencies: - deferred-leveldown "~5.3.0" - level-errors "~2.0.0" - level-iterator-stream "~4.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" - levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -6771,6 +7184,21 @@ lodash.assign@^4.0.3, lodash.assign@^4.0.6: resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" @@ -6915,11 +7343,6 @@ markdown-table@^1.1.3: resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== -mcl-wasm@^0.7.1: - version "0.7.9" - resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.9.tgz#c1588ce90042a8700c3b60e40efb339fc07ab87f" - integrity sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ== - md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -6946,18 +7369,6 @@ memdown@^1.0.0: ltgt "~2.2.0" safe-buffer "~5.1.1" -memdown@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb" - integrity sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw== - dependencies: - abstract-leveldown "~6.2.1" - functional-red-black-tree "~1.0.1" - immediate "~3.2.3" - inherits "~2.0.1" - ltgt "~2.2.0" - safe-buffer "~5.2.0" - memdown@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/memdown/-/memdown-3.0.0.tgz#93aca055d743b20efc37492e9e399784f2958309" @@ -7017,23 +7428,16 @@ merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: rlp "^2.0.0" semaphore ">=1.0.1" -merkle-patricia-tree@^4.2.2, merkle-patricia-tree@^4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz#ff988d045e2bf3dfa2239f7fabe2d59618d57413" - integrity sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w== - dependencies: - "@types/levelup" "^4.3.0" - ethereumjs-util "^7.1.4" - level-mem "^5.0.1" - level-ws "^2.0.0" - readable-stream "^3.6.0" - semaphore-async-await "^1.5.1" - methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= +micro-ftch@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/micro-ftch/-/micro-ftch-0.3.1.tgz#6cb83388de4c1f279a034fb0cf96dfc050853c5f" + integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== + micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -7123,7 +7527,7 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.1.2: +"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -7137,12 +7541,19 @@ minimatch@3.0.4: dependencies: brace-expansion "^1.1.7" -minimatch@4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.1.tgz#40d9d511a46bdc4e563c22c3080cde9c0d8299b4" - integrity sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g== +minimatch@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== dependencies: - brace-expansion "^1.1.7" + brace-expansion "^2.0.1" + +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" minimatch@^5.0.1: version "5.1.6" @@ -7212,6 +7623,32 @@ mnemonist@^0.38.0: dependencies: obliterator "^2.0.0" +mocha@^10.0.0, mocha@^10.2.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.3.0.tgz#0e185c49e6dccf582035c05fa91084a4ff6e3fe9" + integrity sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg== + dependencies: + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.4" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "8.1.0" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "5.0.1" + ms "2.1.3" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + workerpool "6.2.1" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + mocha@^7.1.1: version "7.2.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604" @@ -7273,36 +7710,6 @@ mocha@^8.2.1: yargs-parser "20.2.4" yargs-unparser "2.0.0" -mocha@^9.2.0: - version "9.2.2" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.2.tgz#d70db46bdb93ca57402c809333e5a84977a88fb9" - integrity sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g== - dependencies: - "@ungap/promise-all-settled" "1.1.2" - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.3" - debug "4.3.3" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "7.2.0" - growl "1.10.5" - he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "4.2.1" - ms "2.1.3" - nanoid "3.3.1" - serialize-javascript "6.0.0" - strip-json-comments "3.1.1" - supports-color "8.1.1" - which "2.0.2" - workerpool "6.2.0" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" - mock-fs@^4.1.0: version "4.14.0" resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18" @@ -7393,11 +7800,6 @@ nanoid@3.1.20: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== -nanoid@3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" - integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== - nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -7480,10 +7882,10 @@ node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4" integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ== -nofilter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-1.0.4.tgz#78d6f4b6a613e7ced8b015cec534625f7667006e" - integrity sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA== +nofilter@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" + integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== nopt@3.x: version "3.0.6" @@ -7643,13 +8045,6 @@ oboe@2.1.4: dependencies: http-https "^1.0.0" -oboe@2.1.5: - version "2.1.5" - resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd" - integrity sha1-VVQoTFQ6ImbXo48X4HOCH73jk80= - dependencies: - http-https "^1.0.0" - on-finished@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" @@ -7712,17 +8107,22 @@ optionator@^0.8.1, optionator@^0.8.2: type-check "~0.3.2" word-wrap "~1.2.3" -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" - word-wrap "^1.2.3" + +ordinal@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ordinal/-/ordinal-1.0.3.tgz#1a3c7726a61728112f50944ad7c35c06ae3a0d4d" + integrity sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ== os-homedir@^1.0.0: version "1.0.2" @@ -8107,6 +8507,11 @@ prettier@^2.1.2, prettier@^2.3.2: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032" integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew== +prettier@^2.3.1: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + private@^0.1.6, private@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -8248,7 +8653,7 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -qs@6.10.3, qs@^6.4.0, qs@^6.7.0: +qs@6.10.3, qs@^6.4.0: version "6.10.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== @@ -8378,7 +8783,7 @@ readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.2.2, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6, readable-stream@^3.1.0, readable-stream@^3.4.0, readable-stream@^3.6.0: +readable-stream@^3.0.6, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -8432,6 +8837,11 @@ recursive-readdir@^2.2.2: dependencies: minimatch "3.0.4" +reduce-flatten@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" + integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== + regenerate@^1.2.1: version "1.4.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" @@ -8473,7 +8883,7 @@ regexpp@^2.0.1: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== -regexpp@^3.0.0, regexpp@^3.1.0: +regexpp@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== @@ -8607,6 +9017,11 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -8624,7 +9039,7 @@ resolve@1.17.0: dependencies: path-parse "^1.0.6" -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.8.1, resolve@~1.22.0: +resolve@^1.1.6, resolve@^1.10.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.8.1, resolve@~1.22.0: version "1.22.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== @@ -8633,6 +9048,15 @@ resolve@^1.1.6, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.20.0, resolve@^1.22 path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^1.10.1, resolve@^1.22.2: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" @@ -8825,11 +9249,6 @@ seedrandom@3.0.1: resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.1.tgz#eb3dde015bcf55df05a233514e5df44ef9dce083" integrity sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg== -semaphore-async-await@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa" - integrity sha1-hXvvXjZEYBykuVcLh+nfXKEpdPo= - semaphore@>=1.0.1, semaphore@^1.0.3, semaphore@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa" @@ -8840,12 +9259,24 @@ semaphore@>=1.0.1, semaphore@^1.0.3, semaphore@^1.1.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.1.0, semver@^6.3.0: +semver@^6.1.0: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1, semver@^7.3.4, semver@^7.3.5: +semver@^7.0.0, semver@^7.5.3, semver@^7.5.4: + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.4, semver@^7.3.5: version "7.3.7" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== @@ -9178,29 +9609,30 @@ solidity-comments-extractor@^0.0.7: resolved "https://registry.yarnpkg.com/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz#99d8f1361438f84019795d928b931f4e5c39ca19" integrity sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw== -solidity-coverage@^0.7.16: - version "0.7.20" - resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.7.20.tgz#246e9b0dd62f698bb8ddeecdcc46cab26c48b637" - integrity sha512-edOXTugUYdqxrtEnIn4vgrGjLPxdexcL0WD8LzAvVA3d1dwgcfRO3k8xQR02ZQnOnWMBi8Cqs0F+kAQQp3JW8g== +solidity-coverage@^0.8.11: + version "0.8.11" + resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.11.tgz#c95798f2c3e885c49dcfc9c43ee570d112214785" + integrity sha512-yy0Yk+olovBbXn0Me8BWULmmv7A69ZKkP5aTOJGOO8u61Tu2zS989erfjtFlUjDnfWtxRAVkd8BsQD704yLWHw== dependencies: - "@solidity-parser/parser" "^0.14.0" - "@truffle/provider" "^0.2.24" + "@ethersproject/abi" "^5.0.9" + "@solidity-parser/parser" "^0.18.0" chalk "^2.4.2" death "^1.1.0" - detect-port "^1.3.0" + difflib "^0.2.4" fs-extra "^8.1.0" ghost-testrpc "^0.0.2" global-modules "^2.0.0" globby "^10.0.1" jsonschema "^1.2.4" lodash "^4.17.15" + mocha "^10.2.0" node-emoji "^1.10.0" pify "^4.0.1" recursive-readdir "^2.2.2" sc-istanbul "^0.4.5" semver "^7.3.4" shelljs "^0.8.3" - web3-utils "^1.3.0" + web3-utils "^1.3.6" source-map-resolve@^0.5.0: version "0.5.3" @@ -9296,7 +9728,7 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -squirrelly@^8.0.8: +squirrelly@8.0.8, squirrelly@^8.0.8: version "8.0.8" resolved "https://registry.yarnpkg.com/squirrelly/-/squirrelly-8.0.8.tgz#d6704650b2170b8040d5de5bff9fa69cb62b5e0f" integrity sha512-7dyZJ9Gw86MmH0dYLiESsjGOTj6KG8IWToTaqBuB6LwPI+hyNb6mbQaZwrfnAQ4cMDnSWMUvX/zAYDLTSWLk/w== @@ -9364,6 +9796,11 @@ string-argv@^0.3.1: resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== +string-format@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" + integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== + string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -9390,7 +9827,7 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -9516,7 +9953,7 @@ strip-json-comments@2.0.1, strip-json-comments@^2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@3.1.1, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -9599,6 +10036,16 @@ sync-rpc@^1.2.1: dependencies: get-port "^3.1.0" +table-layout@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" + integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== + dependencies: + array-back "^4.0.1" + deep-extend "~0.6.0" + typical "^5.2.0" + wordwrapjs "^4.0.0" + table@^5.2.3: version "5.4.6" resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" @@ -9609,10 +10056,10 @@ table@^5.2.3: slice-ansi "^2.1.0" string-width "^3.0.0" -table@^6.0.9: - version "6.8.0" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" - integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== +table@^6.8.0: + version "6.8.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" + integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== dependencies: ajv "^8.0.1" lodash.truncate "^4.4.2" @@ -9798,10 +10245,20 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= -"true-case-path@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf" - integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q== +ts-api-utils@^1.0.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + +ts-command-line-args@^2.2.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz#e64456b580d1d4f6d948824c274cf6fa5f45f7f0" + integrity sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw== + dependencies: + chalk "^4.1.0" + command-line-args "^5.1.1" + command-line-usage "^6.1.0" + string-format "^2.0.0" ts-essentials@^1.0.0: version "1.0.4" @@ -9862,28 +10319,21 @@ tsconfig-paths@^3.14.1: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.1.0: +tslib@2.4.0, tslib@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== +tslib@^1.9.0, tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + tsort@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" integrity sha1-4igPXoF/i/QnVlf9D5rr1E9aJ4Y= -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -9971,20 +10421,20 @@ typechain@^3.0.0: ts-essentials "^6.0.3" ts-generator "^0.1.1" -typechain@^5.1.2: - version "5.2.0" - resolved "https://registry.yarnpkg.com/typechain/-/typechain-5.2.0.tgz#10525a44773a34547eb2eed8978cb72c0a39a0f4" - integrity sha512-0INirvQ+P+MwJOeMct+WLkUE4zov06QxC96D+i3uGFEHoiSkZN70MKDQsaj8zkL86wQwByJReI2e7fOUwECFuw== +typechain@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.3.2.tgz#1090dd8d9c57b6ef2aed3640a516bdbf01b00d73" + integrity sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q== dependencies: "@types/prettier" "^2.1.1" - command-line-args "^4.0.7" - debug "^4.1.1" + debug "^4.3.1" fs-extra "^7.0.0" - glob "^7.1.6" + glob "7.1.7" js-sha3 "^0.8.0" lodash "^4.17.15" mkdirp "^1.0.4" - prettier "^2.1.2" + prettier "^2.3.1" + ts-command-line-args "^2.2.0" ts-essentials "^7.0.1" typedarray-to-buffer@^3.1.5: @@ -9999,10 +10449,10 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^4.5.2: - version "4.6.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c" - integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw== +typescript@^5.4.2: + version "5.4.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.2.tgz#0ae9cebcfae970718474fe0da2c090cad6577372" + integrity sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ== typewise-core@^1.2, typewise-core@^1.2.0: version "1.2.0" @@ -10026,6 +10476,16 @@ typical@^2.6.0, typical@^2.6.1: resolved "https://registry.yarnpkg.com/typical/-/typical-2.6.1.tgz#5c080e5d661cbbe38259d2e70a3c7253e873881d" integrity sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0= +typical@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" + integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== + +typical@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" + integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== + uglify-js@^3.1.4: version "3.15.4" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.15.4.tgz#fa95c257e88f85614915b906204b9623d4fa340d" @@ -10051,10 +10511,17 @@ underscore@1.9.1: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== -undici@^4.14.1: - version "4.16.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-4.16.0.tgz#469bb87b3b918818d3d7843d91a1d08da357d5ff" - integrity sha512-tkZSECUYi+/T1i4u+4+lwZmQgLXd4BLGlrc7KZPcLIW7Jpq99+Xpc30ONv7nS6F5UNOxp/HBZSSL9MafUrvJbw== +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +undici@^5.14.0: + version "5.28.3" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.3.tgz#a731e0eff2c3fcfd41c1169a869062be222d1e5b" + integrity sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA== + dependencies: + "@fastify/busboy" "^2.0.0" union-value@^1.0.0: version "1.0.1" @@ -10171,18 +10638,6 @@ util.promisify@^1.0.0: has-symbols "^1.0.1" object.getownpropertydescriptors "^2.1.1" -util@^0.12.0: - version "0.12.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" - integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - safe-buffer "^5.1.2" - which-typed-array "^1.1.2" - utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -10213,11 +10668,6 @@ v8-compile-cache-lib@^3.0.0: resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== -v8-compile-cache@^2.0.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -10296,15 +10746,6 @@ web3-bzz@1.2.11: swarm-js "^0.1.40" underscore "1.9.1" -web3-bzz@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.5.3.tgz#e36456905ce051138f9c3ce3623cbc73da088c2b" - integrity sha512-SlIkAqG0eS6cBS9Q2eBOTI1XFzqh83RqGJWnyrNZMDxUwsTVHL+zNnaPShVPvrWQA1Ub5b0bx1Kc5+qJVxsTJg== - dependencies: - "@types/node" "^12.12.6" - got "9.6.0" - swarm-js "^0.1.40" - web3-core-helpers@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.11.tgz#84c681ed0b942c0203f3b324a245a127e8c67a99" @@ -10314,14 +10755,6 @@ web3-core-helpers@1.2.11: web3-eth-iban "1.2.11" web3-utils "1.2.11" -web3-core-helpers@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.5.3.tgz#099030235c477aadf39a94199ef40092151d563c" - integrity sha512-Ip1IjB3S8vN7Kf1PPjK41U5gskmMk6IJQlxIVuS8/1U7n/o0jC8krqtpRwiMfAgYyw3TXwBFtxSRTvJtnLyXZw== - dependencies: - web3-eth-iban "1.5.3" - web3-utils "1.5.3" - web3-core-method@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.11.tgz#f880137d1507a0124912bf052534f168b8d8fbb6" @@ -10334,18 +10767,6 @@ web3-core-method@1.2.11: web3-core-subscriptions "1.2.11" web3-utils "1.2.11" -web3-core-method@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.5.3.tgz#6cff97ed19fe4ea2e9183d6f703823a079f5132c" - integrity sha512-8wJrwQ2qD9ibWieF9oHXwrJsUGrv3XAtEkNeyvyNMpktNTIjxJ2jaFGQUuLiyUrMubD18XXgLk4JS6PJU4Loeg== - dependencies: - "@ethereumjs/common" "^2.4.0" - "@ethersproject/transactions" "^5.0.0-beta.135" - web3-core-helpers "1.5.3" - web3-core-promievent "1.5.3" - web3-core-subscriptions "1.5.3" - web3-utils "1.5.3" - web3-core-promievent@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.11.tgz#51fe97ca0ddec2f99bf8c3306a7a8e4b094ea3cf" @@ -10353,13 +10774,6 @@ web3-core-promievent@1.2.11: dependencies: eventemitter3 "4.0.4" -web3-core-promievent@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.5.3.tgz#3f11833c3dc6495577c274350b61144e0a4dba01" - integrity sha512-CFfgqvk3Vk6PIAxtLLuX+pOMozxkKCY+/GdGr7weMh033mDXEPvwyVjoSRO1PqIKj668/hMGQsVoIgbyxkJ9Mg== - dependencies: - eventemitter3 "4.0.4" - web3-core-requestmanager@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.11.tgz#fe6eb603fbaee18530293a91f8cf26d8ae28c45a" @@ -10371,17 +10785,6 @@ web3-core-requestmanager@1.2.11: web3-providers-ipc "1.2.11" web3-providers-ws "1.2.11" -web3-core-requestmanager@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.5.3.tgz#b339525815fd40e3a2a81813c864ddc413f7b6f7" - integrity sha512-9k/Bze2rs8ONix5IZR+hYdMNQv+ark2Ek2kVcrFgWO+LdLgZui/rn8FikPunjE+ub7x7pJaKCgVRbYFXjo3ZWg== - dependencies: - util "^0.12.0" - web3-core-helpers "1.5.3" - web3-providers-http "1.5.3" - web3-providers-ipc "1.5.3" - web3-providers-ws "1.5.3" - web3-core-subscriptions@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.11.tgz#beca908fbfcb050c16f45f3f0f4c205e8505accd" @@ -10391,14 +10794,6 @@ web3-core-subscriptions@1.2.11: underscore "1.9.1" web3-core-helpers "1.2.11" -web3-core-subscriptions@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.5.3.tgz#d7d69c4caad65074212028656e9dc56ca5c2159d" - integrity sha512-L2m9vG1iRN6thvmv/HQwO2YLhOQlmZU8dpLG6GSo9FBN14Uch868Swk0dYVr3rFSYjZ/GETevSXU+O+vhCummA== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.5.3" - web3-core@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.11.tgz#1043cacc1becb80638453cc5b2a14be9050288a7" @@ -10412,19 +10807,6 @@ web3-core@1.2.11: web3-core-requestmanager "1.2.11" web3-utils "1.2.11" -web3-core@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.5.3.tgz#59f8728b27c8305b349051326aa262b9b7e907bf" - integrity sha512-ACTbu8COCu+0eUNmd9pG7Q9EVsNkAg2w3Y7SqhDr+zjTgbSHZV01jXKlapm9z+G3AN/BziV3zGwudClJ4u4xXQ== - dependencies: - "@types/bn.js" "^4.11.5" - "@types/node" "^12.12.6" - bignumber.js "^9.0.0" - web3-core-helpers "1.5.3" - web3-core-method "1.5.3" - web3-core-requestmanager "1.5.3" - web3-utils "1.5.3" - web3-eth-abi@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.11.tgz#a887494e5d447c2926d557a3834edd66e17af9b0" @@ -10434,14 +10816,6 @@ web3-eth-abi@1.2.11: underscore "1.9.1" web3-utils "1.2.11" -web3-eth-abi@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.5.3.tgz#5aea9394d797f99ca0d9bd40c3417eb07241c96c" - integrity sha512-i/qhuFsoNrnV130CSRYX/z4SlCfSQ4mHntti5yTmmQpt70xZKYZ57BsU0R29ueSQ9/P+aQrL2t2rqkQkAloUxg== - dependencies: - "@ethersproject/abi" "5.0.7" - web3-utils "1.5.3" - web3-eth-accounts@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.11.tgz#a9e3044da442d31903a7ce035a86d8fa33f90520" @@ -10459,23 +10833,6 @@ web3-eth-accounts@1.2.11: web3-core-method "1.2.11" web3-utils "1.2.11" -web3-eth-accounts@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.5.3.tgz#076c816ff4d68c9dffebdc7fd2bfaddcfc163d77" - integrity sha512-pdGhXgeBaEJENMvRT6W9cmji3Zz/46ugFSvmnLLw79qi5EH7XJhKISNVb41eWCrs4am5GhI67GLx5d2s2a72iw== - dependencies: - "@ethereumjs/common" "^2.3.0" - "@ethereumjs/tx" "^3.2.1" - crypto-browserify "3.12.0" - eth-lib "0.2.8" - ethereumjs-util "^7.0.10" - scrypt-js "^3.0.1" - uuid "3.3.2" - web3-core "1.5.3" - web3-core-helpers "1.5.3" - web3-core-method "1.5.3" - web3-utils "1.5.3" - web3-eth-contract@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.11.tgz#917065902bc27ce89da9a1da26e62ef663663b90" @@ -10491,20 +10848,6 @@ web3-eth-contract@1.2.11: web3-eth-abi "1.2.11" web3-utils "1.2.11" -web3-eth-contract@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.5.3.tgz#12b03a4a16ce583a945f874bea2ff2fb4c5b81ad" - integrity sha512-Gdlt1L6cdHe83k7SdV6xhqCytVtOZkjD0kY/15x441AuuJ4JLubCHuqu69k2Dr3tWifHYVys/vG8QE/W16syGg== - dependencies: - "@types/bn.js" "^4.11.5" - web3-core "1.5.3" - web3-core-helpers "1.5.3" - web3-core-method "1.5.3" - web3-core-promievent "1.5.3" - web3-core-subscriptions "1.5.3" - web3-eth-abi "1.5.3" - web3-utils "1.5.3" - web3-eth-ens@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.11.tgz#26d4d7f16d6cbcfff918e39832b939edc3162532" @@ -10520,20 +10863,6 @@ web3-eth-ens@1.2.11: web3-eth-contract "1.2.11" web3-utils "1.2.11" -web3-eth-ens@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.5.3.tgz#ef6eee1ddf32b1ff9536fc7c599a74f2656bafe1" - integrity sha512-QmGFFtTGElg0E+3xfCIFhiUF+1imFi9eg/cdsRMUZU4F1+MZCC/ee+IAelYLfNTGsEslCqfAusliKOT9DdGGnw== - dependencies: - content-hash "^2.5.2" - eth-ens-namehash "2.0.8" - web3-core "1.5.3" - web3-core-helpers "1.5.3" - web3-core-promievent "1.5.3" - web3-eth-abi "1.5.3" - web3-eth-contract "1.5.3" - web3-utils "1.5.3" - web3-eth-iban@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.11.tgz#f5f73298305bc7392e2f188bf38a7362b42144ef" @@ -10542,14 +10871,6 @@ web3-eth-iban@1.2.11: bn.js "^4.11.9" web3-utils "1.2.11" -web3-eth-iban@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.5.3.tgz#91b1475893a877b10eac1de5cce6eb379fb81b5d" - integrity sha512-vMzmGqolYZvRHwP9P4Nf6G8uYM5aTLlQu2a34vz78p0KlDC+eV1th3+90Qeaupa28EG7OO0IT1F0BejiIauOPw== - dependencies: - bn.js "^4.11.9" - web3-utils "1.5.3" - web3-eth-personal@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.11.tgz#a38b3942a1d87a62070ce0622a941553c3d5aa70" @@ -10562,18 +10883,6 @@ web3-eth-personal@1.2.11: web3-net "1.2.11" web3-utils "1.2.11" -web3-eth-personal@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.5.3.tgz#4ebe09e9a77dd49d23d93b36b36cfbf4a6dae713" - integrity sha512-JzibJafR7ak/Icas8uvos3BmUNrZw1vShuNR5Cxjo+vteOC8XMqz1Vr7RH65B4bmlfb3bm9xLxetUHO894+Sew== - dependencies: - "@types/node" "^12.12.6" - web3-core "1.5.3" - web3-core-helpers "1.5.3" - web3-core-method "1.5.3" - web3-net "1.5.3" - web3-utils "1.5.3" - web3-eth@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.11.tgz#4c81fcb6285b8caf544058fba3ae802968fdc793" @@ -10593,24 +10902,6 @@ web3-eth@1.2.11: web3-net "1.2.11" web3-utils "1.2.11" -web3-eth@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.5.3.tgz#d7d1ac7198f816ab8a2088c01e0bf1eda45862fe" - integrity sha512-saFurA1L23Bd7MEf7cBli6/jRdMhD4X/NaMiO2mdMMCXlPujoudlIJf+VWpRWJpsbDFdu7XJ2WHkmBYT5R3p1Q== - dependencies: - web3-core "1.5.3" - web3-core-helpers "1.5.3" - web3-core-method "1.5.3" - web3-core-subscriptions "1.5.3" - web3-eth-abi "1.5.3" - web3-eth-accounts "1.5.3" - web3-eth-contract "1.5.3" - web3-eth-ens "1.5.3" - web3-eth-iban "1.5.3" - web3-eth-personal "1.5.3" - web3-net "1.5.3" - web3-utils "1.5.3" - web3-net@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.11.tgz#eda68ef25e5cdb64c96c39085cdb74669aabbe1b" @@ -10620,15 +10911,6 @@ web3-net@1.2.11: web3-core-method "1.2.11" web3-utils "1.2.11" -web3-net@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.5.3.tgz#545fee49b8e213b0c55cbe74ffd0295766057463" - integrity sha512-0W/xHIPvgVXPSdLu0iZYnpcrgNnhzHMC888uMlGP5+qMCt8VuflUZHy7tYXae9Mzsg1kxaJAS5lHVNyeNw4CoQ== - dependencies: - web3-core "1.5.3" - web3-core-method "1.5.3" - web3-utils "1.5.3" - web3-provider-engine@14.2.1: version "14.2.1" resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-14.2.1.tgz#ef351578797bf170e08d529cb5b02f8751329b95" @@ -10663,14 +10945,6 @@ web3-providers-http@1.2.11: web3-core-helpers "1.2.11" xhr2-cookies "1.1.0" -web3-providers-http@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.5.3.tgz#74f170fc3d79eb7941d9fbc34e2a067d61ced0b2" - integrity sha512-5DpUyWGHtDAr2RYmBu34Fu+4gJuBAuNx2POeiJIooUtJ+Mu6pIx4XkONWH6V+Ez87tZAVAsFOkJRTYuzMr3rPw== - dependencies: - web3-core-helpers "1.5.3" - xhr2-cookies "1.1.0" - web3-providers-ipc@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.11.tgz#d16d6c9be1be6e0b4f4536c4acc16b0f4f27ef21" @@ -10680,14 +10954,6 @@ web3-providers-ipc@1.2.11: underscore "1.9.1" web3-core-helpers "1.2.11" -web3-providers-ipc@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.5.3.tgz#4bd7f5e445c2f3c2595fce0929c72bb879320a3f" - integrity sha512-JmeAptugVpmXI39LGxUSAymx0NOFdgpuI1hGQfIhbEAcd4sv7fhfd5D+ZU4oLHbRI8IFr4qfGU0uhR8BXhDzlg== - dependencies: - oboe "2.1.5" - web3-core-helpers "1.5.3" - web3-providers-ws@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.11.tgz#a1dfd6d9778d840561d9ec13dd453046451a96bb" @@ -10698,15 +10964,6 @@ web3-providers-ws@1.2.11: web3-core-helpers "1.2.11" websocket "^1.0.31" -web3-providers-ws@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.5.3.tgz#eec6cfb32bb928a4106de506f13a49070a21eabf" - integrity sha512-6DhTw4Q7nm5CFYEUHOJM0gAb3xFx+9gWpVveg3YxJ/ybR1BUvEWo3bLgIJJtX56cYX0WyY6DS35a7f0LOI1kVg== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.5.3" - websocket "^1.0.32" - web3-shh@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.11.tgz#f5d086f9621c9a47e98d438010385b5f059fd88f" @@ -10717,16 +10974,6 @@ web3-shh@1.2.11: web3-core-subscriptions "1.2.11" web3-net "1.2.11" -web3-shh@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.5.3.tgz#3c04aa4cda9ba0b746d7225262401160f8e38b13" - integrity sha512-COfEXfsqoV/BkcsNLRxQqnWc1Teb8/9GxdGag5GtPC5gQC/vsN+7hYVJUwNxY9LtJPKYTij2DHHnx6UkITng+Q== - dependencies: - web3-core "1.5.3" - web3-core-method "1.5.3" - web3-core-subscriptions "1.5.3" - web3-net "1.5.3" - web3-utils@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.11.tgz#af1942aead3fb166ae851a985bed8ef2c2d95a82" @@ -10741,19 +10988,6 @@ web3-utils@1.2.11: underscore "1.9.1" utf8 "3.0.0" -web3-utils@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.5.3.tgz#e914c9320cd663b2a09a5cb920ede574043eb437" - integrity sha512-56nRgA+Ad9SEyCv39g36rTcr5fpsd4L9LgV3FK0aB66nAMazLAA6Qz4lH5XrUKPDyBIPGJIR+kJsyRtwcu2q1Q== - dependencies: - bn.js "^4.11.9" - eth-lib "0.2.8" - ethereum-bloom-filters "^1.0.6" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - utf8 "3.0.0" - web3-utils@^1.0.0-beta.31, web3-utils@^1.3.0: version "1.7.3" resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.7.3.tgz#b214d05f124530d8694ad364509ac454d05f207c" @@ -10767,6 +11001,20 @@ web3-utils@^1.0.0-beta.31, web3-utils@^1.3.0: randombytes "^2.1.0" utf8 "3.0.0" +web3-utils@^1.3.6: + version "1.10.4" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.4.tgz#0daee7d6841641655d8b3726baf33b08eda1cbec" + integrity sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A== + dependencies: + "@ethereumjs/util" "^8.1.0" + bn.js "^5.2.1" + ethereum-bloom-filters "^1.0.6" + ethereum-cryptography "^2.1.2" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + utf8 "3.0.0" + web3@1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.11.tgz#50f458b2e8b11aa37302071c170ed61cff332975" @@ -10780,19 +11028,6 @@ web3@1.2.11: web3-shh "1.2.11" web3-utils "1.2.11" -web3@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.5.3.tgz#11882679453c645bf33620fbc255a243343075aa" - integrity sha512-eyBg/1K44flfv0hPjXfKvNwcUfIVDI4NX48qHQe6wd7C8nPSdbWqo9vLy6ksZIt9NLa90HjI8HsGYgnMSUxn6w== - dependencies: - web3-bzz "1.5.3" - web3-core "1.5.3" - web3-eth "1.5.3" - web3-eth-personal "1.5.3" - web3-net "1.5.3" - web3-shh "1.5.3" - web3-utils "1.5.3" - webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -10810,7 +11045,7 @@ websocket@1.0.32: utf-8-validate "^5.0.2" yaeti "^0.0.6" -websocket@^1.0.31, websocket@^1.0.32: +websocket@^1.0.31: version "1.0.34" resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111" integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ== @@ -10856,18 +11091,6 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which-typed-array@^1.1.2: - version "1.1.7" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.7.tgz#2761799b9a22d4b8660b3c1b40abaa7739691793" - integrity sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-abstract "^1.18.5" - foreach "^2.0.5" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.7" - which@1.3.1, which@^1.1.1, which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -10889,12 +11112,19 @@ wide-align@1.1.3: dependencies: string-width "^1.0.2 || 2" +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + window-size@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" integrity sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU= -word-wrap@^1.2.3, word-wrap@~1.2.3: +word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== @@ -10904,6 +11134,14 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= +wordwrapjs@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-4.0.1.tgz#d9790bccfb110a0fc7836b5ebce0937b37a8b98f" + integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA== + dependencies: + reduce-flatten "^2.0.0" + typical "^5.2.0" + worker-threads@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/worker-threads/-/worker-threads-1.0.0.tgz#2b49ea7c9692ba737d9148f2c9b2be65e14e3470" @@ -10914,10 +11152,10 @@ workerpool@6.1.0: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b" integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg== -workerpool@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" - integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== +workerpool@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" + integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== wrap-ansi@^2.0.0: version "2.1.0" @@ -10971,6 +11209,11 @@ ws@7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== +ws@8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" + integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== + ws@^3.0.0: version "3.3.3" resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" @@ -11034,7 +11277,7 @@ xmlhttprequest@1.8.0: resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw= -xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== diff --git a/coordinator/cmd/api/app/app.go b/coordinator/cmd/api/app/app.go index 10c6c46c8..452352c42 100644 --- a/coordinator/cmd/api/app/app.go +++ b/coordinator/cmd/api/app/app.go @@ -12,6 +12,7 @@ import ( "github.com/gin-gonic/gin" "github.com/prometheus/client_golang/prometheus" "github.com/scroll-tech/go-ethereum/log" + "github.com/scroll-tech/go-ethereum/params" "github.com/urfave/cli/v2" "gorm.io/gorm" @@ -49,7 +50,6 @@ func action(ctx *cli.Context) error { if err != nil { log.Crit("failed to load config file", "config file", cfgFile, "error", err) } - db, err := database.InitDB(cfg.DB) if err != nil { log.Crit("failed to init db connection", "err", err) @@ -60,10 +60,16 @@ func action(ctx *cli.Context) error { } }() + genesisPath := ctx.String(utils.Genesis.Name) + genesis, err := utils.ReadGenesis(genesisPath) + if err != nil { + log.Crit("failed to read genesis", "genesis file", genesisPath, "error", err) + } + registry := prometheus.DefaultRegisterer observability.Server(ctx, db) - apiSrv := apiServer(ctx, cfg, db, registry) + apiSrv := apiServer(ctx, cfg, genesis.Config, db, registry) log.Info( "Start coordinator api successfully.", @@ -90,9 +96,9 @@ func action(ctx *cli.Context) error { return nil } -func apiServer(ctx *cli.Context, cfg *config.Config, db *gorm.DB, reg prometheus.Registerer) *http.Server { +func apiServer(ctx *cli.Context, cfg *config.Config, chainCfg *params.ChainConfig, db *gorm.DB, reg prometheus.Registerer) *http.Server { router := gin.New() - api.InitController(cfg, db, reg) + api.InitController(cfg, chainCfg, db, reg) route.Route(router, cfg, reg) port := ctx.String(httpPortFlag.Name) srv := &http.Server{ diff --git a/coordinator/cmd/api/app/mock_app.go b/coordinator/cmd/api/app/mock_app.go index dafaeba25..e7ad3c900 100644 --- a/coordinator/cmd/api/app/mock_app.go +++ b/coordinator/cmd/api/app/mock_app.go @@ -10,11 +10,13 @@ import ( "testing" "time" - coordinatorConfig "scroll-tech/coordinator/internal/config" + "github.com/scroll-tech/go-ethereum/params" "scroll-tech/common/cmd" - "scroll-tech/common/docker" + "scroll-tech/common/testcontainers" "scroll-tech/common/utils" + + coordinatorConfig "scroll-tech/coordinator/internal/config" ) var ( @@ -23,29 +25,35 @@ var ( // CoordinatorApp coordinator-test client manager. type CoordinatorApp struct { - Config *coordinatorConfig.Config + Config *coordinatorConfig.Config + ChainConfig *params.ChainConfig - base *docker.App + testApps *testcontainers.TestcontainerApps - originFile string - coordinatorFile string - HTTPPort int64 + configOriginFile string + chainConfigOriginFile string + coordinatorFile string + genesisFile string + HTTPPort int64 args []string - docker.AppAPI + *cmd.Cmd } // NewCoordinatorApp return a new coordinatorApp manager. -func NewCoordinatorApp(base *docker.App, file string) *CoordinatorApp { - coordinatorFile := fmt.Sprintf("/tmp/%d_coordinator-config.json", base.Timestamp) +func NewCoordinatorApp(testApps *testcontainers.TestcontainerApps, configFile string, chainConfigFile string) *CoordinatorApp { + coordinatorFile := fmt.Sprintf("/tmp/%d_coordinator-config.json", testApps.Timestamp) + genesisFile := fmt.Sprintf("/tmp/%d_genesis.json", testApps.Timestamp) port, _ := rand.Int(rand.Reader, big.NewInt(2000)) httpPort := port.Int64() + httpStartPort coordinatorApp := &CoordinatorApp{ - base: base, - originFile: file, - coordinatorFile: coordinatorFile, - HTTPPort: httpPort, - args: []string{"--log.debug", "--config", coordinatorFile, "--http", "--http.port", strconv.Itoa(int(httpPort))}, + testApps: testApps, + configOriginFile: configFile, + chainConfigOriginFile: chainConfigFile, + coordinatorFile: coordinatorFile, + genesisFile: genesisFile, + HTTPPort: httpPort, + args: []string{"--log.debug", "--config", coordinatorFile, "--genesis", genesisFile, "--http", "--http.port", strconv.Itoa(int(httpPort))}, } if err := coordinatorApp.MockConfig(true); err != nil { panic(err) @@ -55,14 +63,14 @@ func NewCoordinatorApp(base *docker.App, file string) *CoordinatorApp { // RunApp run coordinator-test child process by multi parameters. func (c *CoordinatorApp) RunApp(t *testing.T, args ...string) { - c.AppAPI = cmd.NewCmd(string(utils.CoordinatorAPIApp), append(c.args, args...)...) - c.AppAPI.RunApp(func() bool { return c.AppAPI.WaitResult(t, time.Second*20, "Start coordinator api successfully") }) + c.Cmd = cmd.NewCmd(string(utils.CoordinatorAPIApp), append(c.args, args...)...) + c.Cmd.RunApp(func() bool { return c.Cmd.WaitResult(t, time.Second*20, "Start coordinator api successfully") }) } // Free stop and release coordinator-test. func (c *CoordinatorApp) Free() { - if !utils.IsNil(c.AppAPI) { - c.AppAPI.WaitExit() + if !utils.IsNil(c.Cmd) { + c.Cmd.WaitExit() } _ = os.Remove(c.coordinatorFile) } @@ -74,8 +82,7 @@ func (c *CoordinatorApp) HTTPEndpoint() string { // MockConfig creates a new coordinator config. func (c *CoordinatorApp) MockConfig(store bool) error { - base := c.base - cfg, err := coordinatorConfig.NewConfig(c.originFile) + cfg, err := coordinatorConfig.NewConfig(c.configOriginFile) if err != nil { return err } @@ -87,21 +94,42 @@ func (c *CoordinatorApp) MockConfig(store bool) error { ChunkCollectionTimeSec: 60, SessionAttempts: 10, MaxVerifierWorkers: 4, + MinProverVersion: "v1.0.0", } - cfg.DB.DSN = base.DBImg.Endpoint() + endpoint, err := c.testApps.GetDBEndPoint() + if err != nil { + return err + } + cfg.DB.DSN = endpoint cfg.L2.ChainID = 111 cfg.Auth.ChallengeExpireDurationSec = 1 cfg.Auth.LoginExpireDurationSec = 1 c.Config = cfg + genesis, err := utils.ReadGenesis(c.chainConfigOriginFile) + if err != nil { + return err + } + c.ChainConfig = genesis.Config + if !store { return nil } - data, err := json.Marshal(c.Config) + coordinatorConfigData, err := json.Marshal(c.Config) + if err != nil { + return err + } + genesisConfigData, err := json.Marshal(genesis) if err != nil { return err } - return os.WriteFile(c.coordinatorFile, data, 0600) + if writeErr := os.WriteFile(c.coordinatorFile, coordinatorConfigData, 0600); writeErr != nil { + return writeErr + } + if writeErr := os.WriteFile(c.genesisFile, genesisConfigData, 0600); writeErr != nil { + return writeErr + } + return nil } diff --git a/coordinator/conf/config.json b/coordinator/conf/config.json index 6cbeaca0d..b143a702f 100644 --- a/coordinator/conf/config.json +++ b/coordinator/conf/config.json @@ -9,7 +9,8 @@ "params_path": "", "assets_path": "" }, - "max_verifier_workers": 4 + "max_verifier_workers": 4, + "min_prover_version": "v1.0.0" }, "db": { "driver_name": "postgres", diff --git a/coordinator/go.mod b/coordinator/go.mod index ab2c62b48..64c415dbf 100644 --- a/coordinator/go.mod +++ b/coordinator/go.mod @@ -7,9 +7,9 @@ require ( github.com/gin-gonic/gin v1.9.1 github.com/go-resty/resty/v2 v2.7.0 github.com/mitchellh/mapstructure v1.5.0 - github.com/scroll-tech/go-ethereum v1.10.14-0.20231130005111-38a3a9c9198c + github.com/scroll-tech/go-ethereum v1.10.14-0.20240326144132-0f0cd99f7a2e github.com/shopspring/decimal v1.3.1 - github.com/stretchr/testify v1.8.4 + github.com/stretchr/testify v1.9.0 github.com/urfave/cli/v2 v2.25.7 golang.org/x/arch v0.5.0 // indirect gorm.io/gorm v1.25.5 @@ -26,15 +26,13 @@ require ( github.com/go-playground/validator/v10 v10.15.5 // indirect github.com/goccy/go-json v0.10.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect - github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/cpuid/v2 v2.2.5 // indirect - github.com/kr/pretty v0.3.1 // indirect github.com/leodido/go-urn v1.2.4 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pelletier/go-toml/v2 v2.1.0 // indirect @@ -48,33 +46,45 @@ require ( ) require ( - github.com/google/uuid v1.4.0 - github.com/prometheus/client_golang v1.14.0 + github.com/google/uuid v1.6.0 + github.com/prometheus/client_golang v1.16.0 ) require ( github.com/VictoriaMetrics/fastcache v1.12.1 // indirect github.com/beorn7/perks v1.0.1 // indirect + github.com/bits-and-blooms/bitset v1.12.0 // indirect github.com/btcsuite/btcd v0.20.1-beta // indirect github.com/chenzhuoyu/iasm v0.9.0 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect + github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/go-cmp v0.6.0 // indirect + github.com/holiman/uint256 v1.2.4 // indirect github.com/iden3/go-iden3-crypto v0.0.15 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.39.0 // indirect + github.com/prometheus/client_model v0.4.0 // indirect + github.com/prometheus/common v0.42.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/scroll-tech/zktrie v0.7.1 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect + github.com/supranational/blst v0.3.11-0.20230124161941-ca03e11a3ff2 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect - golang.org/x/crypto v0.16.0 // indirect - golang.org/x/sys v0.15.0 // indirect + golang.org/x/crypto v0.17.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.17.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/coordinator/go.sum b/coordinator/go.sum index 334c0a99e..508a95e43 100644 --- a/coordinator/go.sum +++ b/coordinator/go.sum @@ -8,6 +8,8 @@ github.com/appleboy/gofight/v2 v2.1.2 h1:VOy3jow4vIK8BRQJoC/I9muxyYlJ2yb9ht2hZoS github.com/appleboy/gofight/v2 v2.1.2/go.mod h1:frW+U1QZEdDgixycTj4CygQ48yLTUhplt43+Wczp3rw= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bits-and-blooms/bitset v1.12.0 h1:U/q1fAF7xXRhFCrhROzIfffYnu+dlS38vCZtmFVPHmA= +github.com/bits-and-blooms/bitset v1.12.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd v0.20.1-beta h1:Ik4hyJqN8Jfyv3S4AGBOmyouMsYE3EdYODkMbQjwPGw= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= @@ -29,13 +31,21 @@ github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA= github.com/chenzhuoyu/iasm v0.9.0 h1:9fhXjVzq5hUy2gkhhgHl95zG2cEAhw9OSGs8toWWAwo= github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= +github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4 h1:B2mpK+MNqgPqk2/KNi1LbqwtZDy5F7iy0mynQiBr8VA= +github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4/go.mod h1:y4GA2JbAUama1S4QwYjC2hefgGLU8Ul0GMtL/ADMF1c= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= @@ -44,8 +54,9 @@ github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= @@ -70,7 +81,6 @@ github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= @@ -81,9 +91,12 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/iden3/go-iden3-crypto v0.0.15 h1:4MJYlrot1l31Fzlo2sF56u7EVFeHHJkxGXXZCtESgK4= github.com/iden3/go-iden3-crypto v0.0.15/go.mod h1:dLpM4vEPJ3nDHzhWFXDjzkn1qHoBeOT/3UEhXsEsP3E= @@ -104,7 +117,6 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -117,12 +129,15 @@ github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27k github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -140,12 +155,12 @@ github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsK github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= -github.com/prometheus/common v0.39.0/go.mod h1:6XBZ7lYdLCbkAVhwRsWTZn+IN5AB9F/NXd5w0BbEX0Y= +github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= +github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= @@ -154,13 +169,12 @@ github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/scroll-tech/go-ethereum v1.10.14-0.20231130005111-38a3a9c9198c h1:MnAdt80steCDli4SAD0J0spBGNY+gQvbdptNjWztHcw= -github.com/scroll-tech/go-ethereum v1.10.14-0.20231130005111-38a3a9c9198c/go.mod h1:4HrFcoStbViFVy/9l/rvKl1XmizVAaPdgqI8v0U8hOc= +github.com/scroll-tech/go-ethereum v1.10.14-0.20240326144132-0f0cd99f7a2e h1:FcoK0rykAWI+5E7cQM6ALRLd5CmjBTHRvJztRBH2xeM= +github.com/scroll-tech/go-ethereum v1.10.14-0.20240326144132-0f0cd99f7a2e/go.mod h1:7Rz2bh9pn42rGuxjh51CG7HL9SKMG3ZugJkL3emdZx8= github.com/scroll-tech/zktrie v0.7.1 h1:NrmZNjuBzsbrKePqdHDG+t2cXnimbtezPAFS0+L9ElE= github.com/scroll-tech/zktrie v0.7.1/go.mod h1:XvNo7vAk8yxNyTjBDj5WIiFzYW4bx/gJ78+NK6Zn6Uk= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= @@ -177,8 +191,11 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/supranational/blst v0.3.11-0.20230124161941-ca03e11a3ff2 h1:wh1wzwAhZBNiZO37uWS/nDaKiIwHz4mDo4pnA+fqTO0= +github.com/supranational/blst v0.3.11-0.20230124161941-ca03e11a3ff2/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/tidwall/gjson v1.14.3 h1:9jvXn7olKEHU1S9vwoMGliaT8jq1vJ7IH/n9zD9Dnlw= github.com/tidwall/gjson v1.14.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= @@ -212,8 +229,8 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= -golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -229,6 +246,8 @@ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -240,13 +259,14 @@ golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= @@ -276,6 +296,7 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -285,3 +306,5 @@ gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls= gorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/coordinator/internal/config/config.go b/coordinator/internal/config/config.go index 273869c98..33142b113 100644 --- a/coordinator/internal/config/config.go +++ b/coordinator/internal/config/config.go @@ -23,6 +23,8 @@ type ProverManager struct { ChunkCollectionTimeSec int `json:"chunk_collection_time_sec"` // Max number of workers in verifier worker pool MaxVerifierWorkers int `json:"max_verifier_workers"` + // MinProverVersion is the minimum version of the prover that is required. + MinProverVersion string `json:"min_prover_version"` } // L2 loads l2geth configuration items. diff --git a/coordinator/internal/config/config_test.go b/coordinator/internal/config/config_test.go index 482f8ec11..748fe9c2a 100644 --- a/coordinator/internal/config/config_test.go +++ b/coordinator/internal/config/config_test.go @@ -22,7 +22,8 @@ func TestConfig(t *testing.T) { "params_path": "", "agg_vk_path": "" }, - "max_verifier_workers": 4 + "max_verifier_workers": 4, + "min_prover_version": "v1.0.0" }, "db": { "driver_name": "postgres", diff --git a/coordinator/internal/controller/api/controller.go b/coordinator/internal/controller/api/controller.go index 0ad4ff2d0..0ec8dd846 100644 --- a/coordinator/internal/controller/api/controller.go +++ b/coordinator/internal/controller/api/controller.go @@ -1,9 +1,8 @@ package api import ( - "sync" - "github.com/prometheus/client_golang/prometheus" + "github.com/scroll-tech/go-ethereum/params" "gorm.io/gorm" "scroll-tech/coordinator/internal/config" @@ -17,20 +16,16 @@ var ( SubmitProof *SubmitProofController // Auth the auth controller Auth *AuthController - - initControllerOnce sync.Once ) // InitController inits Controller with database -func InitController(cfg *config.Config, db *gorm.DB, reg prometheus.Registerer) { - initControllerOnce.Do(func() { - vf, err := verifier.NewVerifier(cfg.ProverManager.Verifier) - if err != nil { - panic("proof receiver new verifier failure") - } +func InitController(cfg *config.Config, chainCfg *params.ChainConfig, db *gorm.DB, reg prometheus.Registerer) { + vf, err := verifier.NewVerifier(cfg.ProverManager.Verifier) + if err != nil { + panic("proof receiver new verifier failure") + } - Auth = NewAuthController(db) - GetTask = NewGetTaskController(cfg, db, vf, reg) - SubmitProof = NewSubmitProofController(cfg, db, vf, reg) - }) + Auth = NewAuthController(db) + GetTask = NewGetTaskController(cfg, chainCfg, db, vf, reg) + SubmitProof = NewSubmitProofController(cfg, db, vf, reg) } diff --git a/coordinator/internal/controller/api/get_task.go b/coordinator/internal/controller/api/get_task.go index 91d100898..8cb849fbf 100644 --- a/coordinator/internal/controller/api/get_task.go +++ b/coordinator/internal/controller/api/get_task.go @@ -6,6 +6,7 @@ import ( "github.com/gin-gonic/gin" "github.com/prometheus/client_golang/prometheus" + "github.com/scroll-tech/go-ethereum/params" "gorm.io/gorm" "scroll-tech/common/types" @@ -23,9 +24,9 @@ type GetTaskController struct { } // NewGetTaskController create a get prover task controller -func NewGetTaskController(cfg *config.Config, db *gorm.DB, vf *verifier.Verifier, reg prometheus.Registerer) *GetTaskController { - chunkProverTask := provertask.NewChunkProverTask(cfg, db, vf.ChunkVK, reg) - batchProverTask := provertask.NewBatchProverTask(cfg, db, vf.BatchVK, reg) +func NewGetTaskController(cfg *config.Config, chainCfg *params.ChainConfig, db *gorm.DB, vf *verifier.Verifier, reg prometheus.Registerer) *GetTaskController { + chunkProverTask := provertask.NewChunkProverTask(cfg, chainCfg, db, vf.ChunkVK, reg) + batchProverTask := provertask.NewBatchProverTask(cfg, chainCfg, db, vf.BatchVK, reg) ptc := &GetTaskController{ proverTasks: make(map[message.ProofType]provertask.ProverTask), diff --git a/coordinator/internal/logic/provertask/batch_prover_task.go b/coordinator/internal/logic/provertask/batch_prover_task.go index b043cd29d..4c9c2e967 100644 --- a/coordinator/internal/logic/provertask/batch_prover_task.go +++ b/coordinator/internal/logic/provertask/batch_prover_task.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "math" "time" "github.com/gin-gonic/gin" @@ -11,8 +12,10 @@ import ( "github.com/prometheus/client_golang/prometheus/promauto" "github.com/scroll-tech/go-ethereum/common" "github.com/scroll-tech/go-ethereum/log" + "github.com/scroll-tech/go-ethereum/params" "gorm.io/gorm" + "scroll-tech/common/forks" "scroll-tech/common/types" "scroll-tech/common/types/message" "scroll-tech/common/utils" @@ -27,28 +30,34 @@ type BatchProverTask struct { BaseProverTask batchAttemptsExceedTotal prometheus.Counter - batchTaskGetTaskTotal prometheus.Counter + batchTaskGetTaskTotal *prometheus.CounterVec } // NewBatchProverTask new a batch collector -func NewBatchProverTask(cfg *config.Config, db *gorm.DB, vk string, reg prometheus.Registerer) *BatchProverTask { +func NewBatchProverTask(cfg *config.Config, chainCfg *params.ChainConfig, db *gorm.DB, vk string, reg prometheus.Registerer) *BatchProverTask { + forkHeights, _, nameForkMap := forks.CollectSortedForkHeights(chainCfg) + log.Info("new batch prover task", "forkHeights", forkHeights, "nameForks", nameForkMap) + bp := &BatchProverTask{ BaseProverTask: BaseProverTask{ - vk: vk, - db: db, - cfg: cfg, - chunkOrm: orm.NewChunk(db), - batchOrm: orm.NewBatch(db), - proverTaskOrm: orm.NewProverTask(db), + vk: vk, + db: db, + cfg: cfg, + nameForkMap: nameForkMap, + forkHeights: forkHeights, + chunkOrm: orm.NewChunk(db), + batchOrm: orm.NewBatch(db), + proverTaskOrm: orm.NewProverTask(db), + proverBlockListOrm: orm.NewProverBlockList(db), }, batchAttemptsExceedTotal: promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "coordinator_batch_attempts_exceed_total", Help: "Total number of batch attempts exceed.", }), - batchTaskGetTaskTotal: promauto.With(reg).NewCounter(prometheus.CounterOpts{ + batchTaskGetTaskTotal: promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ Name: "coordinator_batch_get_task_total", Help: "Total number of batch get task.", - }), + }, []string{"fork_name"}), } return bp } @@ -60,13 +69,48 @@ func (bp *BatchProverTask) Assign(ctx *gin.Context, getTaskParameter *coordinato return nil, fmt.Errorf("check prover task parameter failed, error:%w", err) } + hardForkNumber, err := bp.getHardForkNumberByName(getTaskParameter.HardForkName) + if err != nil { + log.Error("batch assign failure because of the hard fork name don't exist", "fork name", getTaskParameter.HardForkName) + return nil, err + } + + // if the hard fork number set, rollup relayer must generate the chunk from hard fork number, + // so the hard fork chunk's start_block_number must be ForkBlockNumber + var startChunkIndex uint64 = 0 + var endChunkIndex uint64 = math.MaxInt64 + fromBlockNum, toBlockNum := forks.BlockRange(hardForkNumber, bp.forkHeights) + if fromBlockNum != 0 { + startChunk, chunkErr := bp.chunkOrm.GetChunkByStartBlockNumber(ctx, fromBlockNum) + if chunkErr != nil { + log.Error("failed to get fork start chunk index", "forkName", getTaskParameter.HardForkName, "fromBlockNumber", fromBlockNum, "err", chunkErr) + return nil, ErrCoordinatorInternalFailure + } + if startChunk == nil { + return nil, nil + } + startChunkIndex = startChunk.Index + } + if toBlockNum != math.MaxInt64 { + toChunk, chunkErr := bp.chunkOrm.GetChunkByStartBlockNumber(ctx, toBlockNum) + if err != nil { + log.Error("failed to get fork end chunk index", "forkName", getTaskParameter.HardForkName, "toBlockNumber", toBlockNum, "err", chunkErr) + return nil, ErrCoordinatorInternalFailure + } + if toChunk != nil { + // toChunk being nil only indicates that we haven't yet reached the fork boundary + // don't need change the endChunkIndex of math.MaxInt64 + endChunkIndex = toChunk.Index + } + } + maxActiveAttempts := bp.cfg.ProverManager.ProversPerSession maxTotalAttempts := bp.cfg.ProverManager.SessionAttempts var batchTask *orm.Batch for i := 0; i < 5; i++ { var getTaskError error var tmpBatchTask *orm.Batch - tmpBatchTask, getTaskError = bp.batchOrm.GetAssignedBatch(ctx, maxActiveAttempts, maxTotalAttempts) + tmpBatchTask, getTaskError = bp.batchOrm.GetAssignedBatch(ctx, startChunkIndex, endChunkIndex, maxActiveAttempts, maxTotalAttempts) if getTaskError != nil { log.Error("failed to get assigned batch proving tasks", "height", getTaskParameter.ProverHeight, "err", getTaskError) return nil, ErrCoordinatorInternalFailure @@ -75,7 +119,7 @@ func (bp *BatchProverTask) Assign(ctx *gin.Context, getTaskParameter *coordinato // Why here need get again? In order to support a task can assign to multiple prover, need also assign `ProvingTaskAssigned` // batch to prover. But use `proving_status in (1, 2)` will not use the postgres index. So need split the sql. if tmpBatchTask == nil { - tmpBatchTask, getTaskError = bp.batchOrm.GetUnassignedBatch(ctx, maxActiveAttempts, maxTotalAttempts) + tmpBatchTask, getTaskError = bp.batchOrm.GetUnassignedBatch(ctx, startChunkIndex, endChunkIndex, maxActiveAttempts, maxTotalAttempts) if getTaskError != nil { log.Error("failed to get unassigned batch proving tasks", "height", getTaskParameter.ProverHeight, "err", getTaskError) return nil, ErrCoordinatorInternalFailure @@ -135,7 +179,7 @@ func (bp *BatchProverTask) Assign(ctx *gin.Context, getTaskParameter *coordinato return nil, ErrCoordinatorInternalFailure } - bp.batchTaskGetTaskTotal.Inc() + bp.batchTaskGetTaskTotal.WithLabelValues(getTaskParameter.HardForkName).Inc() return taskMsg, nil } @@ -165,6 +209,9 @@ func (bp *BatchProverTask) formatProverTask(ctx context.Context, task *orm.Prove DataHash: common.HexToHash(chunk.Hash), IsPadding: false, } + if proof.ChunkInfo != nil { + chunkInfo.TxBytes = proof.ChunkInfo.TxBytes + } chunkInfos = append(chunkInfos, &chunkInfo) } diff --git a/coordinator/internal/logic/provertask/chunk_prover_task.go b/coordinator/internal/logic/provertask/chunk_prover_task.go index 84b108e0e..d65726336 100644 --- a/coordinator/internal/logic/provertask/chunk_prover_task.go +++ b/coordinator/internal/logic/provertask/chunk_prover_task.go @@ -9,10 +9,11 @@ import ( "github.com/gin-gonic/gin" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" - "github.com/scroll-tech/go-ethereum/common" "github.com/scroll-tech/go-ethereum/log" + "github.com/scroll-tech/go-ethereum/params" "gorm.io/gorm" + "scroll-tech/common/forks" "scroll-tech/common/types" "scroll-tech/common/types/message" "scroll-tech/common/utils" @@ -22,36 +23,38 @@ import ( coordinatorType "scroll-tech/coordinator/internal/types" ) -// ErrCoordinatorInternalFailure coordinator internal db failure -var ErrCoordinatorInternalFailure = fmt.Errorf("coordinator internal error") - // ChunkProverTask the chunk prover task type ChunkProverTask struct { BaseProverTask chunkAttemptsExceedTotal prometheus.Counter - chunkTaskGetTaskTotal prometheus.Counter + chunkTaskGetTaskTotal *prometheus.CounterVec } // NewChunkProverTask new a chunk prover task -func NewChunkProverTask(cfg *config.Config, db *gorm.DB, vk string, reg prometheus.Registerer) *ChunkProverTask { +func NewChunkProverTask(cfg *config.Config, chainCfg *params.ChainConfig, db *gorm.DB, vk string, reg prometheus.Registerer) *ChunkProverTask { + forkHeights, _, nameForkMap := forks.CollectSortedForkHeights(chainCfg) + log.Info("new chunk prover task", "forkHeights", forkHeights, "nameForks", nameForkMap) cp := &ChunkProverTask{ BaseProverTask: BaseProverTask{ - vk: vk, - db: db, - cfg: cfg, - chunkOrm: orm.NewChunk(db), - blockOrm: orm.NewL2Block(db), - proverTaskOrm: orm.NewProverTask(db), + vk: vk, + db: db, + cfg: cfg, + nameForkMap: nameForkMap, + forkHeights: forkHeights, + chunkOrm: orm.NewChunk(db), + blockOrm: orm.NewL2Block(db), + proverTaskOrm: orm.NewProverTask(db), + proverBlockListOrm: orm.NewProverBlockList(db), }, chunkAttemptsExceedTotal: promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "coordinator_chunk_attempts_exceed_total", Help: "Total number of chunk attempts exceed.", }), - chunkTaskGetTaskTotal: promauto.With(reg).NewCounter(prometheus.CounterOpts{ + chunkTaskGetTaskTotal: promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ Name: "coordinator_chunk_get_task_total", Help: "Total number of chunk get task.", - }), + }, []string{"fork_name"}), } return cp } @@ -63,13 +66,24 @@ func (cp *ChunkProverTask) Assign(ctx *gin.Context, getTaskParameter *coordinato return nil, fmt.Errorf("check prover task parameter failed, error:%w", err) } + hardForkNumber, err := cp.getHardForkNumberByName(getTaskParameter.HardForkName) + if err != nil { + log.Error("chunk assign failure because of the hard fork name don't exist", "fork name", getTaskParameter.HardForkName) + return nil, err + } + + fromBlockNum, toBlockNum := forks.BlockRange(hardForkNumber, cp.forkHeights) + if toBlockNum > getTaskParameter.ProverHeight { + toBlockNum = getTaskParameter.ProverHeight + 1 + } + maxActiveAttempts := cp.cfg.ProverManager.ProversPerSession maxTotalAttempts := cp.cfg.ProverManager.SessionAttempts var chunkTask *orm.Chunk for i := 0; i < 5; i++ { var getTaskError error var tmpChunkTask *orm.Chunk - tmpChunkTask, getTaskError = cp.chunkOrm.GetAssignedChunk(ctx, getTaskParameter.ProverHeight, maxActiveAttempts, maxTotalAttempts) + tmpChunkTask, getTaskError = cp.chunkOrm.GetAssignedChunk(ctx, fromBlockNum, toBlockNum, maxActiveAttempts, maxTotalAttempts) if getTaskError != nil { log.Error("failed to get assigned chunk proving tasks", "height", getTaskParameter.ProverHeight, "err", getTaskError) return nil, ErrCoordinatorInternalFailure @@ -78,7 +92,7 @@ func (cp *ChunkProverTask) Assign(ctx *gin.Context, getTaskParameter *coordinato // Why here need get again? In order to support a task can assign to multiple prover, need also assign `ProvingTaskAssigned` // chunk to prover. But use `proving_status in (1, 2)` will not use the postgres index. So need split the sql. if tmpChunkTask == nil { - tmpChunkTask, getTaskError = cp.chunkOrm.GetUnassignedChunk(ctx, getTaskParameter.ProverHeight, maxActiveAttempts, maxTotalAttempts) + tmpChunkTask, getTaskError = cp.chunkOrm.GetUnassignedChunk(ctx, fromBlockNum, toBlockNum, maxActiveAttempts, maxTotalAttempts) if getTaskError != nil { log.Error("failed to get unassigned chunk proving tasks", "height", getTaskParameter.ProverHeight, "err", getTaskError) return nil, ErrCoordinatorInternalFailure @@ -137,21 +151,16 @@ func (cp *ChunkProverTask) Assign(ctx *gin.Context, getTaskParameter *coordinato return nil, ErrCoordinatorInternalFailure } - cp.chunkTaskGetTaskTotal.Inc() + cp.chunkTaskGetTaskTotal.WithLabelValues(getTaskParameter.HardForkName).Inc() return taskMsg, nil } func (cp *ChunkProverTask) formatProverTask(ctx context.Context, task *orm.ProverTask) (*coordinatorType.GetTaskSchema, error) { // Get block hashes. - wrappedBlocks, wrappedErr := cp.blockOrm.GetL2BlocksByChunkHash(ctx, task.TaskID) - if wrappedErr != nil || len(wrappedBlocks) == 0 { - return nil, fmt.Errorf("failed to fetch wrapped blocks, chunk hash:%s err:%w", task.TaskID, wrappedErr) - } - - blockHashes := make([]common.Hash, len(wrappedBlocks)) - for i, wrappedBlock := range wrappedBlocks { - blockHashes[i] = wrappedBlock.Header.Hash() + blockHashes, dbErr := cp.blockOrm.GetL2BlockHashesByChunkHash(ctx, task.TaskID) + if dbErr != nil || len(blockHashes) == 0 { + return nil, fmt.Errorf("failed to fetch block hashes of a chunk, chunk hash:%s err:%w", task.TaskID, dbErr) } taskDetail := message.ChunkTaskDetail{ diff --git a/coordinator/internal/logic/provertask/prover_task.go b/coordinator/internal/logic/provertask/prover_task.go index 012006dfa..74a176c7e 100644 --- a/coordinator/internal/logic/provertask/prover_task.go +++ b/coordinator/internal/logic/provertask/prover_task.go @@ -13,6 +13,12 @@ import ( coordinatorType "scroll-tech/coordinator/internal/types" ) +// ErrCoordinatorInternalFailure coordinator internal db failure +var ErrCoordinatorInternalFailure = fmt.Errorf("coordinator internal error") + +// ErrHardForkName indicates client request with the wrong hard fork name +var ErrHardForkName = fmt.Errorf("wrong hard fork name") + // ProverTask the interface of a collector who send data to prover type ProverTask interface { Assign(ctx *gin.Context, getTaskParameter *coordinatorType.GetTaskParameter) (*coordinatorType.GetTaskSchema, error) @@ -24,10 +30,14 @@ type BaseProverTask struct { db *gorm.DB vk string - batchOrm *orm.Batch - chunkOrm *orm.Chunk - blockOrm *orm.L2Block - proverTaskOrm *orm.ProverTask + nameForkMap map[string]uint64 + forkHeights []uint64 + + batchOrm *orm.Batch + chunkOrm *orm.Chunk + blockOrm *orm.L2Block + proverTaskOrm *orm.ProverTask + proverBlockListOrm *orm.ProverBlockList } type proverTaskContext struct { @@ -58,6 +68,10 @@ func (b *BaseProverTask) checkParameter(ctx *gin.Context, getTaskParameter *coor } ptc.ProverVersion = proverVersion.(string) + if !version.CheckScrollRepoVersion(proverVersion.(string), b.cfg.ProverManager.MinProverVersion) { + return nil, fmt.Errorf("incompatible prover version. please upgrade your prover, minimum allowed version: %s, actual version: %s", b.cfg.ProverManager.MinProverVersion, proverVersion.(string)) + } + // if the prover has a different vk if getTaskParameter.VK != b.vk { // if the prover reports a different prover version @@ -68,13 +82,36 @@ func (b *BaseProverTask) checkParameter(ctx *gin.Context, getTaskParameter *coor return nil, fmt.Errorf("incompatible vk. please check your params files or config files") } + isBlocked, err := b.proverBlockListOrm.IsPublicKeyBlocked(ctx, publicKey.(string)) + if err != nil { + return nil, fmt.Errorf("failed to check whether the public key %s is blocked before assigning a chunk task, err: %w, proverName: %s, proverVersion: %s", publicKey, err, proverName, proverVersion) + } + if isBlocked { + return nil, fmt.Errorf("public key %s is blocked from fetching tasks. ProverName: %s, ProverVersion: %s", publicKey, proverName, proverVersion) + } + isAssigned, err := b.proverTaskOrm.IsProverAssigned(ctx, publicKey.(string)) if err != nil { - return nil, fmt.Errorf("failed to check if prover is assigned a task: %w", err) + return nil, fmt.Errorf("failed to check if prover %s is assigned a task, err: %w", publicKey.(string), err) } if isAssigned { - return nil, fmt.Errorf("prover with publicKey %s is already assigned a task", publicKey) + return nil, fmt.Errorf("prover with publicKey %s is already assigned a task. ProverName: %s, ProverVersion: %s", publicKey, proverName, proverVersion) } return &ptc, nil } + +func (b *BaseProverTask) getHardForkNumberByName(forkName string) (uint64, error) { + // when the first hard fork upgrade, the prover don't pass the fork_name to coordinator. + // so coordinator need to be compatible. + if forkName == "" { + return 0, nil + } + + hardForkNumber, exist := b.nameForkMap[forkName] + if !exist { + return 0, ErrHardForkName + } + + return hardForkNumber, nil +} diff --git a/coordinator/internal/logic/submitproof/proof_receiver.go b/coordinator/internal/logic/submitproof/proof_receiver.go index b4eb48a0d..bcc61b6d0 100644 --- a/coordinator/internal/logic/submitproof/proof_receiver.go +++ b/coordinator/internal/logic/submitproof/proof_receiver.go @@ -203,17 +203,17 @@ func (m *ProofReceiverLogic) HandleZkProof(ctx *gin.Context, proofMsg *message.P } func (m *ProofReceiverLogic) checkAreAllChunkProofsReady(ctx context.Context, chunkHash string) error { - batchHash, err := m.chunkOrm.GetChunkBatchHash(ctx, chunkHash) + batch, err := m.chunkOrm.GetChunkByHash(ctx, chunkHash) if err != nil { return err } - allReady, err := m.chunkOrm.CheckIfBatchChunkProofsAreReady(ctx, batchHash) + allReady, err := m.chunkOrm.CheckIfBatchChunkProofsAreReady(ctx, batch.BatchHash) if err != nil { return err } if allReady { - err := m.batchOrm.UpdateChunkProofsStatusByBatchHash(ctx, batchHash, types.ChunkProofsStatusReady) + err := m.batchOrm.UpdateChunkProofsStatusByBatchHash(ctx, batch.BatchHash, types.ChunkProofsStatusReady) if err != nil { return err } diff --git a/coordinator/internal/logic/verifier/verifier_test.go b/coordinator/internal/logic/verifier/verifier_test.go index 4edd00822..0745b9015 100644 --- a/coordinator/internal/logic/verifier/verifier_test.go +++ b/coordinator/internal/logic/verifier/verifier_test.go @@ -14,7 +14,6 @@ import ( "scroll-tech/common/types/message" "scroll-tech/coordinator/internal/config" - "scroll-tech/coordinator/internal/logic/verifier" ) var ( @@ -34,7 +33,7 @@ func TestFFI(t *testing.T) { AssetsPath: *assetsPath, } - v, err := verifier.NewVerifier(cfg) + v, err := NewVerifier(cfg) as.NoError(err) chunkProof1 := readChunkProof(*chunkProofPath1, as) diff --git a/coordinator/internal/orm/batch.go b/coordinator/internal/orm/batch.go index fd31d66d8..cf636b77a 100644 --- a/coordinator/internal/orm/batch.go +++ b/coordinator/internal/orm/batch.go @@ -7,17 +7,16 @@ import ( "fmt" "time" - "github.com/scroll-tech/go-ethereum/common" "github.com/scroll-tech/go-ethereum/log" "gorm.io/gorm" "scroll-tech/common/types" + "scroll-tech/common/types/encoding" + "scroll-tech/common/types/encoding/codecv0" "scroll-tech/common/types/message" "scroll-tech/common/utils" ) -const defaultBatchHeaderVersion = 0 - // Batch represents a batch of chunks. type Batch struct { db *gorm.DB `gorm:"column:-"` @@ -73,42 +72,34 @@ func (*Batch) TableName() string { // GetUnassignedBatch retrieves unassigned batch based on the specified limit. // The returned batch are sorted in ascending order by their index. -func (o *Batch) GetUnassignedBatch(ctx context.Context, maxActiveAttempts, maxTotalAttempts uint8) (*Batch, error) { - db := o.db.WithContext(ctx) - db = db.Where("proving_status = ?", int(types.ProvingTaskUnassigned)) - db = db.Where("total_attempts < ?", maxTotalAttempts) - db = db.Where("active_attempts < ?", maxActiveAttempts) - db = db.Where("chunk_proofs_status = ?", int(types.ChunkProofsStatusReady)) - +func (o *Batch) GetUnassignedBatch(ctx context.Context, startChunkIndex, endChunkIndex uint64, maxActiveAttempts, maxTotalAttempts uint8) (*Batch, error) { var batch Batch - err := db.First(&batch).Error - if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { - return nil, nil - } - + db := o.db.WithContext(ctx) + sql := fmt.Sprintf("SELECT * FROM batch WHERE proving_status = %d AND total_attempts < %d AND active_attempts < %d AND chunk_proofs_status = %d AND start_chunk_index >= %d AND end_chunk_index < %d AND batch.deleted_at IS NULL ORDER BY batch.index LIMIT 1;", + int(types.ProvingTaskUnassigned), maxTotalAttempts, maxActiveAttempts, int(types.ChunkProofsStatusReady), startChunkIndex, endChunkIndex) + err := db.Raw(sql).Scan(&batch).Error if err != nil { - return nil, fmt.Errorf("Batch.GetUnassignedBatches error: %w", err) + return nil, fmt.Errorf("Batch.GetUnassignedBatch error: %w", err) + } + if batch.Hash == "" { + return nil, nil } return &batch, nil } // GetAssignedBatch retrieves assigned batch based on the specified limit. // The returned batch are sorted in ascending order by their index. -func (o *Batch) GetAssignedBatch(ctx context.Context, maxActiveAttempts, maxTotalAttempts uint8) (*Batch, error) { - db := o.db.WithContext(ctx) - db = db.Where("proving_status = ?", int(types.ProvingTaskAssigned)) - db = db.Where("total_attempts < ?", maxTotalAttempts) - db = db.Where("active_attempts < ?", maxActiveAttempts) - db = db.Where("chunk_proofs_status = ?", int(types.ChunkProofsStatusReady)) - +func (o *Batch) GetAssignedBatch(ctx context.Context, startChunkIndex, endChunkIndex uint64, maxActiveAttempts, maxTotalAttempts uint8) (*Batch, error) { var batch Batch - err := db.First(&batch).Error - if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { - return nil, nil - } - + db := o.db.WithContext(ctx) + sql := fmt.Sprintf("SELECT * FROM batch WHERE proving_status = %d AND total_attempts < %d AND active_attempts < %d AND chunk_proofs_status = %d AND start_chunk_index >= %d AND end_chunk_index < %d AND batch.deleted_at IS NULL ORDER BY batch.index LIMIT 1;", + int(types.ProvingTaskAssigned), maxTotalAttempts, maxActiveAttempts, int(types.ChunkProofsStatusReady), startChunkIndex, endChunkIndex) + err := db.Raw(sql).Scan(&batch).Error if err != nil { - return nil, fmt.Errorf("Batch.GetAssignedBatches error: %w", err) + return nil, fmt.Errorf("Batch.GetAssignedBatch error: %w", err) + } + if batch.Hash == "" { + return nil, nil } return &batch, nil } @@ -168,6 +159,9 @@ func (o *Batch) GetLatestBatch(ctx context.Context) (*Batch, error) { var latestBatch Batch if err := db.First(&latestBatch).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, nil + } return nil, fmt.Errorf("Batch.GetLatestBatch error: %w", err) } return &latestBatch, nil @@ -186,63 +180,82 @@ func (o *Batch) GetAttemptsByHash(ctx context.Context, hash string) (int16, int1 } // InsertBatch inserts a new batch into the database. -// for unit test -func (o *Batch) InsertBatch(ctx context.Context, startChunkIndex, endChunkIndex uint64, startChunkHash, endChunkHash string, chunks []*types.Chunk, dbTX ...*gorm.DB) (*Batch, error) { - if len(chunks) == 0 { - return nil, errors.New("invalid args") +func (o *Batch) InsertBatch(ctx context.Context, batch *encoding.Batch, dbTX ...*gorm.DB) (*Batch, error) { + if batch == nil { + return nil, errors.New("invalid args: batch is nil") } - parentBatch, err := o.GetLatestBatch(ctx) - if err != nil && !errors.Is(errors.Unwrap(err), gorm.ErrRecordNotFound) { - log.Error("failed to get the latest batch", "err", err) + numChunks := uint64(len(batch.Chunks)) + if numChunks == 0 { + return nil, errors.New("invalid args: batch contains 0 chunk") + } + + daBatch, err := codecv0.NewDABatch(batch) + if err != nil { + log.Error("failed to create new DA batch", + "index", batch.Index, "total l1 message popped before", batch.TotalL1MessagePoppedBefore, + "parent hash", batch.ParentBatchHash, "number of chunks", numChunks, "err", err) return nil, err } - var batchIndex uint64 - var parentBatchHash common.Hash - var totalL1MessagePoppedBefore uint64 - var version uint8 = defaultBatchHeaderVersion + var startChunkIndex uint64 + parentBatch, err := o.GetLatestBatch(ctx) + if err != nil { + log.Error("failed to get latest batch", "index", batch.Index, "total l1 message popped before", batch.TotalL1MessagePoppedBefore, + "parent hash", batch.ParentBatchHash, "number of chunks", numChunks, "err", err) + return nil, fmt.Errorf("Batch.InsertBatch error: %w", err) + } // if parentBatch==nil then err==gorm.ErrRecordNotFound, which means there's - // not batch record in the db, we then use default empty values for the creating batch; - // if parentBatch!=nil then err=nil, then we fill the parentBatch-related data into the creating batch + // no batch record in the db, we then use default empty values for the creating batch; + // if parentBatch!=nil then err==nil, then we fill the parentBatch-related data into the creating batch if parentBatch != nil { - batchIndex = parentBatch.Index + 1 - parentBatchHash = common.HexToHash(parentBatch.Hash) - - var parentBatchHeader *types.BatchHeader - parentBatchHeader, err = types.DecodeBatchHeader(parentBatch.BatchHeader) - if err != nil { - log.Error("failed to decode parent batch header", "index", parentBatch.Index, "hash", parentBatch.Hash, "err", err) - return nil, err - } - - totalL1MessagePoppedBefore = parentBatchHeader.TotalL1MessagePopped() - version = parentBatchHeader.Version() + startChunkIndex = parentBatch.EndChunkIndex + 1 } - batchHeader, err := types.NewBatchHeader(version, batchIndex, totalL1MessagePoppedBefore, parentBatchHash, chunks) + startDAChunk, err := codecv0.NewDAChunk(batch.Chunks[0], batch.TotalL1MessagePoppedBefore) if err != nil { - log.Error("failed to create batch header", - "index", batchIndex, "total l1 message popped before", totalL1MessagePoppedBefore, - "parent hash", parentBatchHash, "number of chunks", len(chunks), "err", err) - return nil, err + log.Error("failed to create start DA chunk", "index", batch.Index, "total l1 message popped before", batch.TotalL1MessagePoppedBefore, + "parent hash", batch.ParentBatchHash, "number of chunks", numChunks, "err", err) + return nil, fmt.Errorf("Batch.InsertBatch error: %w", err) } - numChunks := len(chunks) - lastChunkBlockNum := len(chunks[numChunks-1].Blocks) + startDAChunkHash, err := startDAChunk.Hash() + if err != nil { + log.Error("failed to get start DA chunk hash", "index", batch.Index, "total l1 message popped before", batch.TotalL1MessagePoppedBefore, + "parent hash", batch.ParentBatchHash, "number of chunks", numChunks, "err", err) + return nil, fmt.Errorf("Batch.InsertBatch error: %w", err) + } + + totalL1MessagePoppedBeforeEndDAChunk := batch.TotalL1MessagePoppedBefore + for i := uint64(0); i < numChunks-1; i++ { + totalL1MessagePoppedBeforeEndDAChunk += batch.Chunks[i].NumL1Messages(totalL1MessagePoppedBeforeEndDAChunk) + } + endDAChunk, err := codecv0.NewDAChunk(batch.Chunks[numChunks-1], totalL1MessagePoppedBeforeEndDAChunk) + if err != nil { + log.Error("failed to create end DA chunk", "index", batch.Index, "total l1 message popped before", totalL1MessagePoppedBeforeEndDAChunk, + "parent hash", batch.ParentBatchHash, "number of chunks", numChunks, "err", err) + return nil, fmt.Errorf("Batch.InsertBatch error: %w", err) + } + + endDAChunkHash, err := endDAChunk.Hash() + if err != nil { + log.Error("failed to get end DA chunk hash", "index", batch.Index, "total l1 message popped before", totalL1MessagePoppedBeforeEndDAChunk, + "parent hash", batch.ParentBatchHash, "number of chunks", numChunks, "err", err) + return nil, fmt.Errorf("Batch.InsertBatch error: %w", err) + } newBatch := Batch{ - Index: batchIndex, - Hash: batchHeader.Hash().Hex(), - StartChunkHash: startChunkHash, + Index: batch.Index, + Hash: daBatch.Hash().Hex(), + StartChunkHash: startDAChunkHash.Hex(), StartChunkIndex: startChunkIndex, - EndChunkHash: endChunkHash, - EndChunkIndex: endChunkIndex, - StateRoot: chunks[numChunks-1].Blocks[lastChunkBlockNum-1].Header.Root.Hex(), - WithdrawRoot: chunks[numChunks-1].Blocks[lastChunkBlockNum-1].WithdrawRoot.Hex(), - ParentBatchHash: parentBatchHash.Hex(), - BatchHeader: batchHeader.Encode(), + EndChunkHash: endDAChunkHash.Hex(), + EndChunkIndex: startChunkIndex + numChunks - 1, + StateRoot: batch.StateRoot().Hex(), + WithdrawRoot: batch.WithdrawRoot().Hex(), + ParentBatchHash: batch.ParentBatchHash.Hex(), + BatchHeader: daBatch.Encode(), ChunkProofsStatus: int16(types.ChunkProofsStatusPending), ProvingStatus: int16(types.ProvingTaskUnassigned), TotalAttempts: 0, diff --git a/coordinator/internal/orm/chunk.go b/coordinator/internal/orm/chunk.go index 965157a3b..ed84ec268 100644 --- a/coordinator/internal/orm/chunk.go +++ b/coordinator/internal/orm/chunk.go @@ -11,6 +11,8 @@ import ( "gorm.io/gorm" "scroll-tech/common/types" + "scroll-tech/common/types/encoding" + "scroll-tech/common/types/encoding/codecv0" "scroll-tech/common/types/message" "scroll-tech/common/utils" ) @@ -28,7 +30,7 @@ type Chunk struct { EndBlockHash string `json:"end_block_hash" gorm:"column:end_block_hash"` StartBlockTime uint64 `json:"start_block_time" gorm:"column:start_block_time"` TotalL1MessagesPoppedBefore uint64 `json:"total_l1_messages_popped_before" gorm:"column:total_l1_messages_popped_before"` - TotalL1MessagesPoppedInChunk uint32 `json:"total_l1_messages_popped_in_chunk" gorm:"column:total_l1_messages_popped_in_chunk"` + TotalL1MessagesPoppedInChunk uint64 `json:"total_l1_messages_popped_in_chunk" gorm:"column:total_l1_messages_popped_in_chunk"` ParentChunkHash string `json:"parent_chunk_hash" gorm:"column:parent_chunk_hash"` StateRoot string `json:"state_root" gorm:"column:state_root"` ParentChunkStateRoot string `json:"parent_chunk_state_root" gorm:"column:parent_chunk_state_root"` @@ -48,8 +50,8 @@ type Chunk struct { // metadata TotalL2TxGas uint64 `json:"total_l2_tx_gas" gorm:"column:total_l2_tx_gas"` - TotalL2TxNum uint32 `json:"total_l2_tx_num" gorm:"column:total_l2_tx_num"` - TotalL1CommitCalldataSize uint32 `json:"total_l1_commit_calldata_size" gorm:"column:total_l1_commit_calldata_size"` + TotalL2TxNum uint64 `json:"total_l2_tx_num" gorm:"column:total_l2_tx_num"` + TotalL1CommitCalldataSize uint64 `json:"total_l1_commit_calldata_size" gorm:"column:total_l1_commit_calldata_size"` TotalL1CommitGas uint64 `json:"total_l1_commit_gas" gorm:"column:total_l1_commit_gas"` CreatedAt time.Time `json:"created_at" gorm:"column:created_at"` UpdatedAt time.Time `json:"updated_at" gorm:"column:updated_at"` @@ -68,44 +70,34 @@ func (*Chunk) TableName() string { // GetUnassignedChunk retrieves unassigned chunk based on the specified limit. // The returned chunks are sorted in ascending order by their index. -func (o *Chunk) GetUnassignedChunk(ctx context.Context, height int, maxActiveAttempts, maxTotalAttempts uint8) (*Chunk, error) { - db := o.db.WithContext(ctx) - db = db.Model(&Chunk{}) - db = db.Where("proving_status = ?", int(types.ProvingTaskUnassigned)) - db = db.Where("total_attempts < ?", maxTotalAttempts) - db = db.Where("active_attempts < ?", maxActiveAttempts) - db = db.Where("end_block_number <= ?", height) - +func (o *Chunk) GetUnassignedChunk(ctx context.Context, fromBlockNum, toBlockNum uint64, maxActiveAttempts, maxTotalAttempts uint8) (*Chunk, error) { var chunk Chunk - err := db.First(&chunk).Error - if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { - return nil, nil - } - + db := o.db.WithContext(ctx) + sql := fmt.Sprintf("SELECT * FROM chunk WHERE proving_status = %d AND total_attempts < %d AND active_attempts < %d AND start_block_number >= %d AND end_block_number < %d AND chunk.deleted_at IS NULL ORDER BY chunk.index LIMIT 1;", + int(types.ProvingTaskUnassigned), maxTotalAttempts, maxActiveAttempts, fromBlockNum, toBlockNum) + err := db.Raw(sql).Scan(&chunk).Error if err != nil { - return nil, fmt.Errorf("Chunk.GetUnassignedChunks error: %w", err) + return nil, fmt.Errorf("Chunk.GetUnassignedChunk error: %w", err) + } + if chunk.Hash == "" { + return nil, nil } return &chunk, nil } // GetAssignedChunk retrieves assigned chunk based on the specified limit. // The returned chunks are sorted in ascending order by their index. -func (o *Chunk) GetAssignedChunk(ctx context.Context, height int, maxActiveAttempts, maxTotalAttempts uint8) (*Chunk, error) { - db := o.db.WithContext(ctx) - db = db.Model(&Chunk{}) - db = db.Where("proving_status = ?", int(types.ProvingTaskAssigned)) - db = db.Where("total_attempts < ?", maxTotalAttempts) - db = db.Where("active_attempts < ?", maxActiveAttempts) - db = db.Where("end_block_number <= ?", height) - +func (o *Chunk) GetAssignedChunk(ctx context.Context, fromBlockNum, toBlockNum uint64, maxActiveAttempts, maxTotalAttempts uint8) (*Chunk, error) { var chunk Chunk - err := db.First(&chunk).Error - if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { - return nil, nil - } - + db := o.db.WithContext(ctx) + sql := fmt.Sprintf("SELECT * FROM chunk WHERE proving_status = %d AND total_attempts < %d AND active_attempts < %d AND start_block_number >= %d AND end_block_number < %d AND chunk.deleted_at IS NULL ORDER BY chunk.index LIMIT 1;", + int(types.ProvingTaskAssigned), maxTotalAttempts, maxActiveAttempts, fromBlockNum, toBlockNum) + err := db.Raw(sql).Scan(&chunk).Error if err != nil { - return nil, fmt.Errorf("Chunk.GetAssignedChunks error: %w", err) + return nil, fmt.Errorf("Chunk.GetAssignedChunk error: %w", err) + } + if chunk.Hash == "" { + return nil, nil } return &chunk, nil } @@ -151,15 +143,18 @@ func (o *Chunk) GetProofsByBatchHash(ctx context.Context, batchHash string) ([]* return proofs, nil } -// GetLatestChunk retrieves the latest chunk from the database. -func (o *Chunk) GetLatestChunk(ctx context.Context) (*Chunk, error) { +// getLatestChunk retrieves the latest chunk from the database. +func (o *Chunk) getLatestChunk(ctx context.Context) (*Chunk, error) { db := o.db.WithContext(ctx) db = db.Model(&Chunk{}) db = db.Order("index desc") var latestChunk Chunk if err := db.First(&latestChunk).Error; err != nil { - return nil, fmt.Errorf("Chunk.GetLatestChunk error: %w", err) + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, nil + } + return nil, fmt.Errorf("Chunk.getLatestChunk error: %w", err) } return &latestChunk, nil } @@ -191,18 +186,33 @@ func (o *Chunk) CheckIfBatchChunkProofsAreReady(ctx context.Context, batchHash s return count == 0, nil } -// GetChunkBatchHash retrieves the batchHash of a given chunk. -func (o *Chunk) GetChunkBatchHash(ctx context.Context, chunkHash string) (string, error) { +// GetChunkByHash retrieves the given chunk. +func (o *Chunk) GetChunkByHash(ctx context.Context, chunkHash string) (*Chunk, error) { db := o.db.WithContext(ctx) db = db.Model(&Chunk{}) db = db.Where("hash = ?", chunkHash) - db = db.Select("batch_hash") var chunk Chunk if err := db.First(&chunk).Error; err != nil { - return "", fmt.Errorf("Chunk.GetChunkBatchHash error: %w, chunk hash: %v", err, chunkHash) + return nil, fmt.Errorf("Chunk.GetChunkByHash error: %w, chunk hash: %v", err, chunkHash) } - return chunk.BatchHash, nil + return &chunk, nil +} + +// GetChunkByStartBlockNumber retrieves the given chunk. +func (o *Chunk) GetChunkByStartBlockNumber(ctx context.Context, startBlockNumber uint64) (*Chunk, error) { + db := o.db.WithContext(ctx) + db = db.Model(&Chunk{}) + db = db.Where("start_block_number = ?", startBlockNumber) + + var chunk Chunk + if err := db.First(&chunk).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, nil + } + return nil, fmt.Errorf("Chunk.GetChunkByStartBlockNumber error: %w, chunk start block number: %v", err, startBlockNumber) + } + return &chunk, nil } // GetAttemptsByHash get chunk attempts by hash. Used by unit test @@ -219,7 +229,7 @@ func (o *Chunk) GetAttemptsByHash(ctx context.Context, hash string) (int16, int1 // InsertChunk inserts a new chunk into the database. // for unit test -func (o *Chunk) InsertChunk(ctx context.Context, chunk *types.Chunk, dbTX ...*gorm.DB) (*Chunk, error) { +func (o *Chunk) InsertChunk(ctx context.Context, chunk *encoding.Chunk, dbTX ...*gorm.DB) (*Chunk, error) { if chunk == nil || len(chunk.Blocks) == 0 { return nil, errors.New("invalid args") } @@ -228,54 +238,61 @@ func (o *Chunk) InsertChunk(ctx context.Context, chunk *types.Chunk, dbTX ...*go var totalL1MessagePoppedBefore uint64 var parentChunkHash string var parentChunkStateRoot string - parentChunk, err := o.GetLatestChunk(ctx) - if err != nil && !errors.Is(errors.Unwrap(err), gorm.ErrRecordNotFound) { + parentChunk, err := o.getLatestChunk(ctx) + if err != nil { log.Error("failed to get latest chunk", "err", err) return nil, fmt.Errorf("Chunk.InsertChunk error: %w", err) } // if parentChunk==nil then err==gorm.ErrRecordNotFound, which means there's - // not chunk record in the db, we then use default empty values for the creating chunk; - // if parentChunk!=nil then err=nil, then we fill the parentChunk-related data into the creating chunk + // no chunk record in the db, we then use default empty values for the creating chunk; + // if parentChunk!=nil then err==nil, then we fill the parentChunk-related data into the creating chunk if parentChunk != nil { chunkIndex = parentChunk.Index + 1 - totalL1MessagePoppedBefore = parentChunk.TotalL1MessagesPoppedBefore + uint64(parentChunk.TotalL1MessagesPoppedInChunk) + totalL1MessagePoppedBefore = parentChunk.TotalL1MessagesPoppedBefore + parentChunk.TotalL1MessagesPoppedInChunk parentChunkHash = parentChunk.Hash parentChunkStateRoot = parentChunk.StateRoot } - hash, err := chunk.Hash(totalL1MessagePoppedBefore) + daChunk, err := codecv0.NewDAChunk(chunk, totalL1MessagePoppedBefore) if err != nil { - log.Error("failed to get chunk hash", "err", err) + log.Error("failed to initialize new DA chunk", "err", err) return nil, fmt.Errorf("Chunk.InsertChunk error: %w", err) } - var totalL2TxGas uint64 - var totalL2TxNum uint64 - var totalL1CommitCalldataSize uint64 - var totalL1CommitGas uint64 - for _, block := range chunk.Blocks { - totalL2TxGas += block.Header.GasUsed - totalL2TxNum += block.NumL2Transactions() - totalL1CommitCalldataSize += block.EstimateL1CommitCalldataSize() - totalL1CommitGas += block.EstimateL1CommitGas() + daChunkHash, err := daChunk.Hash() + if err != nil { + log.Error("failed to get DA chunk hash", "err", err) + return nil, fmt.Errorf("Chunk.InsertChunk error: %w", err) + } + + totalL1CommitCalldataSize, err := codecv0.EstimateChunkL1CommitCalldataSize(chunk) + if err != nil { + log.Error("failed to estimate chunk L1 commit calldata size", "err", err) + return nil, fmt.Errorf("Chunk.InsertChunk error: %w", err) + } + + totalL1CommitGas, err := codecv0.EstimateChunkL1CommitGas(chunk) + if err != nil { + log.Error("failed to estimate chunk L1 commit gas", "err", err) + return nil, fmt.Errorf("Chunk.InsertChunk error: %w", err) } numBlocks := len(chunk.Blocks) newChunk := Chunk{ Index: chunkIndex, - Hash: hash.Hex(), + Hash: daChunkHash.Hex(), StartBlockNumber: chunk.Blocks[0].Header.Number.Uint64(), StartBlockHash: chunk.Blocks[0].Header.Hash().Hex(), EndBlockNumber: chunk.Blocks[numBlocks-1].Header.Number.Uint64(), EndBlockHash: chunk.Blocks[numBlocks-1].Header.Hash().Hex(), - TotalL2TxGas: totalL2TxGas, - TotalL2TxNum: uint32(totalL2TxNum), - TotalL1CommitCalldataSize: uint32(totalL1CommitCalldataSize), + TotalL2TxGas: chunk.L2GasUsed(), + TotalL2TxNum: chunk.NumL2Transactions(), + TotalL1CommitCalldataSize: totalL1CommitCalldataSize, TotalL1CommitGas: totalL1CommitGas, StartBlockTime: chunk.Blocks[0].Header.Time, TotalL1MessagesPoppedBefore: totalL1MessagePoppedBefore, - TotalL1MessagesPoppedInChunk: uint32(chunk.NumL1Messages(totalL1MessagePoppedBefore)), + TotalL1MessagesPoppedInChunk: chunk.NumL1Messages(totalL1MessagePoppedBefore), ParentChunkHash: parentChunkHash, StateRoot: chunk.Blocks[numBlocks-1].Header.Root.Hex(), ParentChunkStateRoot: parentChunkStateRoot, diff --git a/coordinator/internal/orm/l2_block.go b/coordinator/internal/orm/l2_block.go index 38728dea8..4f8f12200 100644 --- a/coordinator/internal/orm/l2_block.go +++ b/coordinator/internal/orm/l2_block.go @@ -11,7 +11,7 @@ import ( "github.com/scroll-tech/go-ethereum/log" "gorm.io/gorm" - "scroll-tech/common/types" + "scroll-tech/common/types/encoding" ) // L2Block represents a l2 block in the database. @@ -50,47 +50,34 @@ func (*L2Block) TableName() string { return "l2_block" } -// GetL2BlocksByChunkHash retrieves the L2 blocks associated with the specified chunk hash. -// The returned blocks are sorted in ascending order by their block number. -func (o *L2Block) GetL2BlocksByChunkHash(ctx context.Context, chunkHash string) ([]*types.WrappedBlock, error) { +// GetL2BlockHashesByChunkHash retrieves the L2 block hashes associated with the specified chunk hash. +// The returned block hashes are sorted in ascending order by their block number. +func (o *L2Block) GetL2BlockHashesByChunkHash(ctx context.Context, chunkHash string) ([]common.Hash, error) { db := o.db.WithContext(ctx) db = db.Model(&L2Block{}) - db = db.Select("header, transactions, withdraw_root, row_consumption") + db = db.Select("header") db = db.Where("chunk_hash = ?", chunkHash) db = db.Order("number ASC") var l2Blocks []L2Block if err := db.Find(&l2Blocks).Error; err != nil { - return nil, fmt.Errorf("L2Block.GetL2BlocksByChunkHash error: %w, chunk hash: %v", err, chunkHash) + return nil, fmt.Errorf("L2Block.GetL2BlockHashesByChunkHash error: %w, chunk hash: %v", err, chunkHash) } - var wrappedBlocks []*types.WrappedBlock + var blockHashes []common.Hash for _, v := range l2Blocks { - var wrappedBlock types.WrappedBlock - - if err := json.Unmarshal([]byte(v.Transactions), &wrappedBlock.Transactions); err != nil { - return nil, fmt.Errorf("L2Block.GetL2BlocksByChunkHash error: %w, chunk hash: %v", err, chunkHash) + var header gethTypes.Header + if err := json.Unmarshal([]byte(v.Header), &header); err != nil { + return nil, fmt.Errorf("L2Block.GetL2BlockHashesByChunkHash error: %w, chunk hash: %v", err, chunkHash) } - - wrappedBlock.Header = &gethTypes.Header{} - if err := json.Unmarshal([]byte(v.Header), wrappedBlock.Header); err != nil { - return nil, fmt.Errorf("L2Block.GetL2BlocksByChunkHash error: %w, chunk hash: %v", err, chunkHash) - } - - wrappedBlock.WithdrawRoot = common.HexToHash(v.WithdrawRoot) - if err := json.Unmarshal([]byte(v.RowConsumption), &wrappedBlock.RowConsumption); err != nil { - return nil, fmt.Errorf("L2Block.GetL2BlocksByChunkHash error: %w, chunk hash: %v", err, chunkHash) - } - - wrappedBlocks = append(wrappedBlocks, &wrappedBlock) + blockHashes = append(blockHashes, header.Hash()) } - - return wrappedBlocks, nil + return blockHashes, nil } // InsertL2Blocks inserts l2 blocks into the "l2_block" table. // for unit test -func (o *L2Block) InsertL2Blocks(ctx context.Context, blocks []*types.WrappedBlock) error { +func (o *L2Block) InsertL2Blocks(ctx context.Context, blocks []*encoding.Block) error { var l2Blocks []L2Block for _, block := range blocks { header, err := json.Marshal(block.Header) diff --git a/coordinator/internal/orm/orm_test.go b/coordinator/internal/orm/orm_test.go index ed6f719b7..0fcc84a2f 100644 --- a/coordinator/internal/orm/orm_test.go +++ b/coordinator/internal/orm/orm_test.go @@ -9,41 +9,36 @@ import ( "github.com/stretchr/testify/assert" "gorm.io/gorm" - "scroll-tech/common/database" - "scroll-tech/common/docker" + "scroll-tech/common/testcontainers" "scroll-tech/common/types" "scroll-tech/common/types/message" "scroll-tech/common/utils" - "scroll-tech/database/migrate" ) var ( - base *docker.App - + testApps *testcontainers.TestcontainerApps db *gorm.DB proverTaskOrm *ProverTask ) func TestMain(m *testing.M) { t := &testing.T{} - setupEnv(t) - defer tearDownEnv(t) + defer func() { + if testApps != nil { + testApps.Free() + } + tearDownEnv(t) + }() m.Run() } func setupEnv(t *testing.T) { - base = docker.NewDockerApp() - base.RunDBImage(t) + testApps = testcontainers.NewTestcontainerApps() + assert.NoError(t, testApps.StartPostgresContainer()) + var err error - db, err = database.InitDB( - &database.Config{ - DSN: base.DBConfig.DSN, - DriverName: base.DBConfig.DriverName, - MaxOpenNum: base.DBConfig.MaxOpenNum, - MaxIdleNum: base.DBConfig.MaxIdleNum, - }, - ) + db, err = testApps.GetGormDBClient() assert.NoError(t, err) sqlDB, err := db.DB() assert.NoError(t, err) @@ -56,10 +51,11 @@ func tearDownEnv(t *testing.T) { sqlDB, err := db.DB() assert.NoError(t, err) sqlDB.Close() - base.Free() } func TestProverTaskOrm(t *testing.T) { + setupEnv(t) + sqlDB, err := db.DB() assert.NoError(t, err) assert.NoError(t, migrate.ResetDB(sqlDB)) diff --git a/coordinator/internal/orm/prover_block_list.go b/coordinator/internal/orm/prover_block_list.go new file mode 100644 index 000000000..0a6d82cae --- /dev/null +++ b/coordinator/internal/orm/prover_block_list.go @@ -0,0 +1,75 @@ +package orm + +import ( + "context" + "fmt" + "time" + + "gorm.io/gorm" +) + +// ProverBlockList represents the prover's block entry in the database. +type ProverBlockList struct { + db *gorm.DB `gorm:"-"` + + ID uint `json:"id" gorm:"column:id;primaryKey"` + ProverName string `json:"prover_name" gorm:"column:prover_name"` + PublicKey string `json:"public_key" gorm:"column:public_key"` + + // metadata + CreatedAt time.Time `json:"created_at" gorm:"column:created_at"` + UpdatedAt time.Time `json:"updated_at" gorm:"column:updated_at"` + DeletedAt gorm.DeletedAt `json:"deleted_at" gorm:"column:deleted_at;default:NULL"` +} + +// NewProverBlockList creates a new ProverBlockList instance. +func NewProverBlockList(db *gorm.DB) *ProverBlockList { + return &ProverBlockList{db: db} +} + +// TableName returns the name of the "prover_block_list" table. +func (*ProverBlockList) TableName() string { + return "prover_block_list" +} + +// InsertProverPublicKey adds a new Prover public key to the block list. +// for unit test only. +func (p *ProverBlockList) InsertProverPublicKey(ctx context.Context, proverName, publicKey string) error { + prover := ProverBlockList{ + ProverName: proverName, + PublicKey: publicKey, + } + + db := p.db.WithContext(ctx) + db = db.Model(&ProverBlockList{}) + if err := db.Create(&prover).Error; err != nil { + return fmt.Errorf("ProverBlockList.InsertProverPublicKey error: %w, prover name: %v, public key: %v", err, proverName, publicKey) + } + return nil +} + +// DeleteProverPublicKey marks a Prover public key as deleted in the block list. +// for unit test only. +func (p *ProverBlockList) DeleteProverPublicKey(ctx context.Context, publicKey string) error { + db := p.db.WithContext(ctx) + db = db.Where("public_key = ?", publicKey) + if err := db.Delete(&ProverBlockList{}).Error; err != nil { + return fmt.Errorf("ProverBlockList.DeleteProverPublicKey error: %w, public key: %v", err, publicKey) + } + return nil +} + +// IsPublicKeyBlocked checks if the given public key is blocked. +func (p *ProverBlockList) IsPublicKeyBlocked(ctx context.Context, publicKey string) (bool, error) { + db := p.db.WithContext(ctx) + db = db.Model(&ProverBlockList{}) + db = db.Where("public_key = ?", publicKey) + if err := db.First(&ProverBlockList{}).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return false, nil // Public key not found, hence it's not blocked. + } + return true, fmt.Errorf("ProverBlockList.IsPublicKeyBlocked error: %w, public key: %v", err, publicKey) + } + + return true, nil +} diff --git a/coordinator/internal/types/block.go b/coordinator/internal/types/block.go index 43bf9709b..8dbde12eb 100644 --- a/coordinator/internal/types/block.go +++ b/coordinator/internal/types/block.go @@ -1,18 +1,5 @@ package types -import ( - "github.com/scroll-tech/go-ethereum/common" - "github.com/scroll-tech/go-ethereum/core/types" -) - -// WrappedBlock contains the block's Header, Transactions and WithdrawTrieRoot hash. -type WrappedBlock struct { - Header *types.Header `json:"header"` - // Transactions is only used for recover types.Transactions, the from of types.TransactionData field is missing. - Transactions []*types.TransactionData `json:"transactions"` - WithdrawRoot common.Hash `json:"withdraw_trie_root,omitempty"` -} - // BatchInfo contains the BlockBatch's main info type BatchInfo struct { Index uint64 `json:"index"` diff --git a/coordinator/internal/types/get_task.go b/coordinator/internal/types/get_task.go index 2c1f8bd23..c92f4524f 100644 --- a/coordinator/internal/types/get_task.go +++ b/coordinator/internal/types/get_task.go @@ -2,7 +2,8 @@ package types // GetTaskParameter for ProverTasks request parameter type GetTaskParameter struct { - ProverHeight int `form:"prover_height" json:"prover_height"` + HardForkName string `form:"hard_fork_name" json:"hard_fork_name"` + ProverHeight uint64 `form:"prover_height" json:"prover_height"` TaskType int `form:"task_type" json:"task_type"` VK string `form:"vk" json:"vk"` } diff --git a/coordinator/test/api_test.go b/coordinator/test/api_test.go index 260d9034f..e1006fc56 100644 --- a/coordinator/test/api_test.go +++ b/coordinator/test/api_test.go @@ -14,14 +14,16 @@ import ( "time" "github.com/gin-gonic/gin" + "github.com/scroll-tech/go-ethereum/log" + "github.com/scroll-tech/go-ethereum/params" "github.com/stretchr/testify/assert" "gorm.io/gorm" "scroll-tech/database/migrate" - "scroll-tech/common/database" - "scroll-tech/common/docker" + "scroll-tech/common/testcontainers" "scroll-tech/common/types" + "scroll-tech/common/types/encoding" "scroll-tech/common/types/message" "scroll-tech/common/version" @@ -32,29 +34,46 @@ import ( "scroll-tech/coordinator/internal/route" ) +const ( + forkNumberFour = 4 + forkNumberThree = 3 + forkNumberTwo = 2 + forkNumberOne = 1 +) + var ( - dbCfg *database.Config - conf *config.Config + conf *config.Config - base *docker.App + testApps *testcontainers.TestcontainerApps - db *gorm.DB - l2BlockOrm *orm.L2Block - chunkOrm *orm.Chunk - batchOrm *orm.Batch - proverTaskOrm *orm.ProverTask + db *gorm.DB + l2BlockOrm *orm.L2Block + chunkOrm *orm.Chunk + batchOrm *orm.Batch + proverTaskOrm *orm.ProverTask + proverBlockListOrm *orm.ProverBlockList - wrappedBlock1 *types.WrappedBlock - wrappedBlock2 *types.WrappedBlock - chunk *types.Chunk + block1 *encoding.Block + block2 *encoding.Block + + chunk *encoding.Chunk + hardForkChunk1 *encoding.Chunk + hardForkChunk2 *encoding.Chunk + + batch *encoding.Batch + hardForkBatch1 *encoding.Batch + hardForkBatch2 *encoding.Batch tokenTimeout int ) func TestMain(m *testing.M) { - base = docker.NewDockerApp() + defer func() { + if testApps != nil { + testApps.Free() + } + }() m.Run() - base.Free() } func randomURL() string { @@ -62,9 +81,10 @@ func randomURL() string { return fmt.Sprintf("localhost:%d", 10000+2000+id.Int64()) } -func setupCoordinator(t *testing.T, proversPerSession uint8, coordinatorURL string) (*cron.Collector, *http.Server) { +func setupCoordinator(t *testing.T, proversPerSession uint8, coordinatorURL string, nameForkMap map[string]int64) (*cron.Collector, *http.Server) { var err error - db, err = database.InitDB(dbCfg) + db, err = testApps.GetGormDBClient() + assert.NoError(t, err) sqlDB, err := db.DB() assert.NoError(t, err) @@ -82,6 +102,7 @@ func setupCoordinator(t *testing.T, proversPerSession uint8, coordinatorURL stri ChunkCollectionTimeSec: 10, MaxVerifierWorkers: 10, SessionAttempts: 5, + MinProverVersion: version.Version, }, Auth: &config.Auth{ ChallengeExpireDurationSec: tokenTimeout, @@ -89,10 +110,26 @@ func setupCoordinator(t *testing.T, proversPerSession uint8, coordinatorURL stri }, } + var chainConf params.ChainConfig + for forkName, forkNumber := range nameForkMap { + switch forkName { + case "bernoulli": + chainConf.BernoulliBlock = big.NewInt(forkNumber) + case "london": + chainConf.LondonBlock = big.NewInt(forkNumber) + case "istanbul": + chainConf.IstanbulBlock = big.NewInt(forkNumber) + case "homestead": + chainConf.HomesteadBlock = big.NewInt(forkNumber) + case "eip155": + chainConf.EIP155Block = big.NewInt(forkNumber) + } + } + proofCollector := cron.NewCollector(context.Background(), db, conf, nil) router := gin.New() - api.InitController(conf, db, nil) + api.InitController(conf, &chainConf, db, nil) route.Route(router, conf, nil) srv := &http.Server{ Addr: coordinatorURL, @@ -110,20 +147,18 @@ func setupCoordinator(t *testing.T, proversPerSession uint8, coordinatorURL stri } func setEnv(t *testing.T) { - version.Version = "v4.1.98-aaa-bbb-ccc" - - base = docker.NewDockerApp() - base.RunDBImage(t) - - dbCfg = &database.Config{ - DSN: base.DBConfig.DSN, - DriverName: base.DBConfig.DriverName, - MaxOpenNum: base.DBConfig.MaxOpenNum, - MaxIdleNum: base.DBConfig.MaxIdleNum, - } - var err error - db, err = database.InitDB(dbCfg) + + version.Version = "v4.1.98" + + glogger := log.NewGlogHandler(log.StreamHandler(os.Stderr, log.LogfmtFormat())) + glogger.Verbosity(log.LvlInfo) + log.Root().SetHandler(glogger) + + testApps = testcontainers.NewTestcontainerApps() + assert.NoError(t, testApps.StartPostgresContainer()) + + db, err = testApps.GetGormDBClient() assert.NoError(t, err) sqlDB, err := db.DB() assert.NoError(t, err) @@ -133,88 +168,394 @@ func setEnv(t *testing.T) { chunkOrm = orm.NewChunk(db) l2BlockOrm = orm.NewL2Block(db) proverTaskOrm = orm.NewProverTask(db) + proverBlockListOrm = orm.NewProverBlockList(db) templateBlockTrace, err := os.ReadFile("../../common/testdata/blockTrace_02.json") assert.NoError(t, err) - wrappedBlock1 = &types.WrappedBlock{} - err = json.Unmarshal(templateBlockTrace, wrappedBlock1) + block1 = &encoding.Block{} + err = json.Unmarshal(templateBlockTrace, block1) assert.NoError(t, err) templateBlockTrace, err = os.ReadFile("../../common/testdata/blockTrace_03.json") assert.NoError(t, err) - wrappedBlock2 = &types.WrappedBlock{} - err = json.Unmarshal(templateBlockTrace, wrappedBlock2) + block2 = &encoding.Block{} + err = json.Unmarshal(templateBlockTrace, block2) assert.NoError(t, err) - chunk = &types.Chunk{Blocks: []*types.WrappedBlock{wrappedBlock1, wrappedBlock2}} + chunk = &encoding.Chunk{Blocks: []*encoding.Block{block1, block2}} + hardForkChunk1 = &encoding.Chunk{Blocks: []*encoding.Block{block1}} + hardForkChunk2 = &encoding.Chunk{Blocks: []*encoding.Block{block2}} + assert.NoError(t, err) + + batch = &encoding.Batch{Chunks: []*encoding.Chunk{chunk}} + hardForkBatch1 = &encoding.Batch{Index: 1, Chunks: []*encoding.Chunk{hardForkChunk1}} + hardForkBatch2 = &encoding.Batch{Index: 2, Chunks: []*encoding.Chunk{hardForkChunk2}} } func TestApis(t *testing.T) { // Set up the test environment. - base = docker.NewDockerApp() setEnv(t) t.Run("TestHandshake", testHandshake) t.Run("TestFailedHandshake", testFailedHandshake) + t.Run("TestGetTaskBlocked", testGetTaskBlocked) + t.Run("TestOutdatedProverVersion", testOutdatedProverVersion) t.Run("TestValidProof", testValidProof) t.Run("TestInvalidProof", testInvalidProof) t.Run("TestProofGeneratedFailed", testProofGeneratedFailed) t.Run("TestTimeoutProof", testTimeoutProof) - - // Teardown - t.Cleanup(func() { - base.Free() - }) + t.Run("TestHardFork", testHardForkAssignTask) } func testHandshake(t *testing.T) { // Setup coordinator and http server. coordinatorURL := randomURL() - proofCollector, httpHandler := setupCoordinator(t, 1, coordinatorURL) + proofCollector, httpHandler := setupCoordinator(t, 1, coordinatorURL, map[string]int64{"homestead": forkNumberOne}) defer func() { proofCollector.Stop() assert.NoError(t, httpHandler.Shutdown(context.Background())) }() - chunkProver := newMockProver(t, "prover_chunk_test", coordinatorURL, message.ProofTypeChunk) + chunkProver := newMockProver(t, "prover_chunk_test", coordinatorURL, message.ProofTypeChunk, version.Version) assert.True(t, chunkProver.healthCheckSuccess(t)) } func testFailedHandshake(t *testing.T) { // Setup coordinator and http server. coordinatorURL := randomURL() - proofCollector, httpHandler := setupCoordinator(t, 1, coordinatorURL) + proofCollector, httpHandler := setupCoordinator(t, 1, coordinatorURL, map[string]int64{"homestead": forkNumberOne}) defer func() { proofCollector.Stop() }() // Try to perform handshake without token - chunkProver := newMockProver(t, "prover_chunk_test", coordinatorURL, message.ProofTypeChunk) + chunkProver := newMockProver(t, "prover_chunk_test", coordinatorURL, message.ProofTypeChunk, version.Version) assert.True(t, chunkProver.healthCheckSuccess(t)) // Try to perform handshake with server shutdown assert.NoError(t, httpHandler.Shutdown(context.Background())) time.Sleep(time.Second) - batchProver := newMockProver(t, "prover_batch_test", coordinatorURL, message.ProofTypeBatch) + batchProver := newMockProver(t, "prover_batch_test", coordinatorURL, message.ProofTypeBatch, version.Version) assert.True(t, batchProver.healthCheckFailure(t)) } -func testValidProof(t *testing.T) { +func testGetTaskBlocked(t *testing.T) { coordinatorURL := randomURL() - collector, httpHandler := setupCoordinator(t, 3, coordinatorURL) + collector, httpHandler := setupCoordinator(t, 3, coordinatorURL, map[string]int64{"homestead": forkNumberOne}) defer func() { collector.Stop() assert.NoError(t, httpHandler.Shutdown(context.Background())) }() - err := l2BlockOrm.InsertL2Blocks(context.Background(), []*types.WrappedBlock{wrappedBlock1, wrappedBlock2}) + chunkProver := newMockProver(t, "prover_chunk_test", coordinatorURL, message.ProofTypeChunk, version.Version) + assert.True(t, chunkProver.healthCheckSuccess(t)) + + batchProver := newMockProver(t, "prover_batch_test", coordinatorURL, message.ProofTypeBatch, version.Version) + assert.True(t, batchProver.healthCheckSuccess(t)) + + err := proverBlockListOrm.InsertProverPublicKey(context.Background(), chunkProver.proverName, chunkProver.publicKey()) + assert.NoError(t, err) + + expectedErr := fmt.Errorf("return prover task err:check prover task parameter failed, error:public key %s is blocked from fetching tasks. ProverName: %s, ProverVersion: %s", chunkProver.publicKey(), chunkProver.proverName, chunkProver.proverVersion) + code, errMsg := chunkProver.tryGetProverTask(t, message.ProofTypeChunk) + assert.Equal(t, types.ErrCoordinatorGetTaskFailure, code) + assert.Equal(t, expectedErr, fmt.Errorf(errMsg)) + + expectedErr = fmt.Errorf("get empty prover task") + code, errMsg = batchProver.tryGetProverTask(t, message.ProofTypeBatch) + assert.Equal(t, types.ErrCoordinatorEmptyProofData, code) + assert.Equal(t, expectedErr, fmt.Errorf(errMsg)) + + err = proverBlockListOrm.InsertProverPublicKey(context.Background(), batchProver.proverName, batchProver.publicKey()) + assert.NoError(t, err) + + err = proverBlockListOrm.DeleteProverPublicKey(context.Background(), chunkProver.publicKey()) + assert.NoError(t, err) + + expectedErr = fmt.Errorf("get empty prover task") + code, errMsg = chunkProver.tryGetProverTask(t, message.ProofTypeChunk) + assert.Equal(t, types.ErrCoordinatorEmptyProofData, code) + assert.Equal(t, expectedErr, fmt.Errorf(errMsg)) + + expectedErr = fmt.Errorf("return prover task err:check prover task parameter failed, error:public key %s is blocked from fetching tasks. ProverName: %s, ProverVersion: %s", batchProver.publicKey(), batchProver.proverName, batchProver.proverVersion) + code, errMsg = batchProver.tryGetProverTask(t, message.ProofTypeBatch) + assert.Equal(t, types.ErrCoordinatorGetTaskFailure, code) + assert.Equal(t, expectedErr, fmt.Errorf(errMsg)) +} + +func testOutdatedProverVersion(t *testing.T) { + coordinatorURL := randomURL() + collector, httpHandler := setupCoordinator(t, 3, coordinatorURL, map[string]int64{"homestead": forkNumberOne}) + defer func() { + collector.Stop() + assert.NoError(t, httpHandler.Shutdown(context.Background())) + }() + + chunkProver := newMockProver(t, "prover_chunk_test", coordinatorURL, message.ProofTypeChunk, "v1.0.0") + assert.True(t, chunkProver.healthCheckSuccess(t)) + + batchProver := newMockProver(t, "prover_batch_test", coordinatorURL, message.ProofTypeBatch, "v1.999.999") + assert.True(t, chunkProver.healthCheckSuccess(t)) + + expectedErr := fmt.Errorf("return prover task err:check prover task parameter failed, error:incompatible prover version. please upgrade your prover, minimum allowed version: %s, actual version: %s", version.Version, chunkProver.proverVersion) + code, errMsg := chunkProver.tryGetProverTask(t, message.ProofTypeChunk) + assert.Equal(t, types.ErrCoordinatorGetTaskFailure, code) + assert.Equal(t, expectedErr, fmt.Errorf(errMsg)) + + expectedErr = fmt.Errorf("return prover task err:check prover task parameter failed, error:incompatible prover version. please upgrade your prover, minimum allowed version: %s, actual version: %s", version.Version, batchProver.proverVersion) + code, errMsg = batchProver.tryGetProverTask(t, message.ProofTypeBatch) + assert.Equal(t, types.ErrCoordinatorGetTaskFailure, code) + assert.Equal(t, expectedErr, fmt.Errorf(errMsg)) +} + +func testHardForkAssignTask(t *testing.T) { + tests := []struct { + name string + proofType message.ProofType + forkNumbers map[string]int64 + proverForkNames []string + exceptTaskNumber int + exceptGetTaskErrCodes []int + exceptGetTaskErrMsgs []string + }{ + { // hard fork 4, prover 4 block [2-3] + name: "noTaskForkChunkProverVersionLargeOrEqualThanHardFork", + proofType: message.ProofTypeChunk, + forkNumbers: map[string]int64{"bernoulli": forkNumberFour}, + exceptTaskNumber: 0, + proverForkNames: []string{"bernoulli", "bernoulli"}, + exceptGetTaskErrCodes: []int{types.ErrCoordinatorEmptyProofData, types.ErrCoordinatorEmptyProofData}, + exceptGetTaskErrMsgs: []string{"get empty prover task", "get empty prover task"}, + }, + { + name: "noTaskForkBatchProverVersionLargeOrEqualThanHardFork", + proofType: message.ProofTypeBatch, + forkNumbers: map[string]int64{"bernoulli": forkNumberFour}, + exceptTaskNumber: 0, + proverForkNames: []string{"bernoulli", "bernoulli"}, + exceptGetTaskErrCodes: []int{types.ErrCoordinatorEmptyProofData, types.ErrCoordinatorEmptyProofData}, + exceptGetTaskErrMsgs: []string{"get empty prover task", "get empty prover task"}, + }, + { // hard fork 1, prover 1 block [2-3] + name: "noTaskForkChunkProverVersionLessThanHardFork", + proofType: message.ProofTypeChunk, + forkNumbers: map[string]int64{"istanbul": forkNumberTwo, "homestead": forkNumberOne}, + exceptTaskNumber: 0, + proverForkNames: []string{"homestead", "homestead"}, + exceptGetTaskErrCodes: []int{types.ErrCoordinatorEmptyProofData, types.ErrCoordinatorEmptyProofData}, + exceptGetTaskErrMsgs: []string{"get empty prover task", "get empty prover task"}, + }, + { + name: "noTaskForkBatchProverVersionLessThanHardFork", + proofType: message.ProofTypeBatch, + forkNumbers: map[string]int64{"istanbul": forkNumberTwo, "homestead": forkNumberOne}, + exceptTaskNumber: 0, + proverForkNames: []string{"homestead", "homestead"}, + exceptGetTaskErrCodes: []int{types.ErrCoordinatorEmptyProofData, types.ErrCoordinatorEmptyProofData}, + exceptGetTaskErrMsgs: []string{"get empty prover task", "get empty prover task"}, + }, + { + name: "noTaskForkBatchProverVersionLessThanHardForkProverNumberEqual0", + proofType: message.ProofTypeBatch, + forkNumbers: map[string]int64{"istanbul": forkNumberTwo, "london": forkNumberThree}, + exceptTaskNumber: 0, + proverForkNames: []string{"", ""}, + exceptGetTaskErrCodes: []int{types.ErrCoordinatorEmptyProofData, types.ErrCoordinatorEmptyProofData}, + exceptGetTaskErrMsgs: []string{"get empty prover task", "get empty prover task"}, + }, + { // hard fork 3, prover 3 block [2-3] + name: "oneTaskForkChunkProverVersionLargeOrEqualThanHardFork", + proofType: message.ProofTypeChunk, + forkNumbers: map[string]int64{"london": forkNumberThree}, + exceptTaskNumber: 1, + proverForkNames: []string{"london", "london"}, + exceptGetTaskErrCodes: []int{types.Success, types.ErrCoordinatorEmptyProofData}, + exceptGetTaskErrMsgs: []string{"", "get empty prover task"}, + }, + { + name: "oneTaskForkBatchProverVersionLargeOrEqualThanHardFork", + proofType: message.ProofTypeBatch, + forkNumbers: map[string]int64{"london": forkNumberThree}, + exceptTaskNumber: 1, + proverForkNames: []string{"london", "london"}, + exceptGetTaskErrCodes: []int{types.Success, types.ErrCoordinatorEmptyProofData}, + exceptGetTaskErrMsgs: []string{"", "get empty prover task"}, + }, + { // hard fork 2, prover 2 block [2-3] + name: "oneTaskForkChunkProverVersionLessThanHardFork", + proofType: message.ProofTypeChunk, + forkNumbers: map[string]int64{"istanbul": forkNumberTwo, "london": forkNumberThree}, + exceptTaskNumber: 1, + proverForkNames: []string{"istanbul", "istanbul"}, + exceptGetTaskErrCodes: []int{types.Success, types.ErrCoordinatorEmptyProofData}, + exceptGetTaskErrMsgs: []string{"", "get empty prover task"}, + }, + { + name: "oneTaskForkBatchProverVersionLessThanHardFork", + proofType: message.ProofTypeBatch, + forkNumbers: map[string]int64{"istanbul": forkNumberTwo, "london": forkNumberThree}, + exceptTaskNumber: 1, + proverForkNames: []string{"istanbul", "istanbul"}, + exceptGetTaskErrCodes: []int{types.Success, types.ErrCoordinatorEmptyProofData}, + exceptGetTaskErrMsgs: []string{"", "get empty prover task"}, + }, + { // hard fork 2, prover 2 block [2-3] + name: "twoTaskForkChunkProverVersionLargeOrEqualThanHardFork", + proofType: message.ProofTypeChunk, + forkNumbers: map[string]int64{"istanbul": forkNumberTwo}, + exceptTaskNumber: 2, + proverForkNames: []string{"istanbul", "istanbul"}, + exceptGetTaskErrCodes: []int{types.Success, types.Success}, + exceptGetTaskErrMsgs: []string{"", ""}, + }, + { + name: "twoTaskForkBatchProverVersionLargeOrEqualThanHardFork", + proofType: message.ProofTypeBatch, + forkNumbers: map[string]int64{"istanbul": forkNumberTwo}, + exceptTaskNumber: 2, + proverForkNames: []string{"istanbul", "istanbul"}, + exceptGetTaskErrCodes: []int{types.Success, types.Success}, + exceptGetTaskErrMsgs: []string{"", ""}, + }, + { // hard fork 4, prover 3 block [2-3] + name: "twoTaskForkChunkProverVersionLessThanHardFork", + proofType: message.ProofTypeChunk, + forkNumbers: map[string]int64{"bernoulli": forkNumberFour, "istanbul": forkNumberTwo}, + exceptTaskNumber: 2, + proverForkNames: []string{"istanbul", "istanbul"}, + exceptGetTaskErrCodes: []int{types.Success, types.Success}, + exceptGetTaskErrMsgs: []string{"", ""}, + }, + { // hard fork 3, prover1:2 prover2:3 block [2-3] + name: "twoTaskForkChunkProverVersionMiddleHardFork", + proofType: message.ProofTypeChunk, + forkNumbers: map[string]int64{"istanbul": forkNumberTwo, "london": forkNumberThree}, + exceptTaskNumber: 2, + proverForkNames: []string{"istanbul", "london"}, + exceptGetTaskErrCodes: []int{types.Success, types.Success}, + exceptGetTaskErrMsgs: []string{"", ""}, + }, + { + name: "twoTaskForkBatchProverVersionMiddleHardFork", + proofType: message.ProofTypeBatch, + forkNumbers: map[string]int64{"istanbul": forkNumberTwo, "london": forkNumberThree}, + exceptTaskNumber: 2, + proverForkNames: []string{"istanbul", "london"}, + exceptGetTaskErrCodes: []int{types.Success, types.Success}, + exceptGetTaskErrMsgs: []string{"", ""}, + }, + { // hard fork 3, prover1:2 prover2:3 block [2-3] + name: "twoTaskForkChunkProverVersionMiddleHardForkProverNumberEqual0", + proofType: message.ProofTypeChunk, + forkNumbers: map[string]int64{"london": forkNumberThree}, + exceptTaskNumber: 2, + proverForkNames: []string{"", "london"}, + exceptGetTaskErrCodes: []int{types.Success, types.Success}, + exceptGetTaskErrMsgs: []string{"", ""}, + }, + { + name: "twoTaskForkBatchProverVersionMiddleHardForkProverNumberEqual0", + proofType: message.ProofTypeBatch, + forkNumbers: map[string]int64{"london": forkNumberThree}, + exceptTaskNumber: 2, + proverForkNames: []string{"", "london"}, + exceptGetTaskErrCodes: []int{types.Success, types.Success}, + exceptGetTaskErrMsgs: []string{"", ""}, + }, + { // hard fork 2, prover 2 block [2-3] + name: "oneTaskForkChunkProverVersionLessThanHardForkProverNumberEqual0", + proofType: message.ProofTypeChunk, + forkNumbers: map[string]int64{"london": forkNumberThree}, + exceptTaskNumber: 1, + proverForkNames: []string{"", ""}, + exceptGetTaskErrCodes: []int{types.Success, types.ErrCoordinatorEmptyProofData}, + exceptGetTaskErrMsgs: []string{"", "get empty prover task"}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + coordinatorURL := randomURL() + collector, httpHandler := setupCoordinator(t, 3, coordinatorURL, tt.forkNumbers) + defer func() { + collector.Stop() + assert.NoError(t, httpHandler.Shutdown(context.Background())) + }() + + chunkProof := &message.ChunkProof{ + StorageTrace: []byte("testStorageTrace"), + Protocol: []byte("testProtocol"), + Proof: []byte("testProof"), + Instances: []byte("testInstance"), + Vk: []byte("testVk"), + ChunkInfo: nil, + } + + // the insert block number is 2 and 3 + // chunk1 batch1 contains block number 2 + // chunk2 batch2 contains block number 3 + err := l2BlockOrm.InsertL2Blocks(context.Background(), []*encoding.Block{block1, block2}) + assert.NoError(t, err) + + dbHardForkChunk1, err := chunkOrm.InsertChunk(context.Background(), hardForkChunk1) + assert.NoError(t, err) + err = l2BlockOrm.UpdateChunkHashInRange(context.Background(), 0, 2, dbHardForkChunk1.Hash) + assert.NoError(t, err) + err = chunkOrm.UpdateProofAndProvingStatusByHash(context.Background(), dbHardForkChunk1.Hash, chunkProof, types.ProvingTaskUnassigned, 1) + assert.NoError(t, err) + dbHardForkBatch1, err := batchOrm.InsertBatch(context.Background(), hardForkBatch1) + assert.NoError(t, err) + err = chunkOrm.UpdateBatchHashInRange(context.Background(), 0, 0, dbHardForkBatch1.Hash) + assert.NoError(t, err) + err = batchOrm.UpdateChunkProofsStatusByBatchHash(context.Background(), dbHardForkBatch1.Hash, types.ChunkProofsStatusReady) + assert.NoError(t, err) + + dbHardForkChunk2, err := chunkOrm.InsertChunk(context.Background(), hardForkChunk2) + assert.NoError(t, err) + err = l2BlockOrm.UpdateChunkHashInRange(context.Background(), 3, 100, dbHardForkChunk2.Hash) + assert.NoError(t, err) + err = chunkOrm.UpdateProofAndProvingStatusByHash(context.Background(), dbHardForkChunk2.Hash, chunkProof, types.ProvingTaskUnassigned, 1) + assert.NoError(t, err) + dbHardForkBatch2, err := batchOrm.InsertBatch(context.Background(), hardForkBatch2) + assert.NoError(t, err) + err = chunkOrm.UpdateBatchHashInRange(context.Background(), 1, 1, dbHardForkBatch2.Hash) + assert.NoError(t, err) + err = batchOrm.UpdateChunkProofsStatusByBatchHash(context.Background(), dbHardForkBatch2.Hash, types.ChunkProofsStatusReady) + assert.NoError(t, err) + + getTaskNumber := 0 + for i := 0; i < 2; i++ { + mockProver := newMockProver(t, fmt.Sprintf("mock_prover_%d", i), coordinatorURL, tt.proofType, version.Version) + proverTask, errCode, errMsg := mockProver.getProverTask(t, tt.proofType, tt.proverForkNames[i]) + assert.Equal(t, tt.exceptGetTaskErrCodes[i], errCode) + assert.Equal(t, tt.exceptGetTaskErrMsgs[i], errMsg) + if errCode != types.Success { + continue + } + getTaskNumber++ + mockProver.submitProof(t, proverTask, verifiedSuccess, types.Success) + } + assert.Equal(t, getTaskNumber, tt.exceptTaskNumber) + }) + } +} + +func testValidProof(t *testing.T) { + coordinatorURL := randomURL() + collector, httpHandler := setupCoordinator(t, 3, coordinatorURL, map[string]int64{"istanbul": forkNumberTwo}) + defer func() { + collector.Stop() + assert.NoError(t, httpHandler.Shutdown(context.Background())) + }() + + err := l2BlockOrm.InsertL2Blocks(context.Background(), []*encoding.Block{block1, block2}) assert.NoError(t, err) dbChunk, err := chunkOrm.InsertChunk(context.Background(), chunk) assert.NoError(t, err) err = l2BlockOrm.UpdateChunkHashInRange(context.Background(), 0, 100, dbChunk.Hash) assert.NoError(t, err) - batch, err := batchOrm.InsertBatch(context.Background(), 0, 0, dbChunk.Hash, dbChunk.Hash, []*types.Chunk{chunk}) + batch, err := batchOrm.InsertBatch(context.Background(), batch) assert.NoError(t, err) err = chunkOrm.UpdateBatchHashInRange(context.Background(), 0, 0, batch.Hash) assert.NoError(t, err) @@ -228,14 +569,13 @@ func testValidProof(t *testing.T) { } else { proofType = message.ProofTypeBatch } - provers[i] = newMockProver(t, "prover_test"+strconv.Itoa(i), coordinatorURL, proofType) - // only prover 0 & 1 submit valid proofs. - proofStatus := generatedFailed - if i <= 1 { - proofStatus = verifiedSuccess - } - proverTask := provers[i].getProverTask(t, proofType) + provers[i] = newMockProver(t, "prover_test"+strconv.Itoa(i), coordinatorURL, proofType, version.Version) + + proofStatus := verifiedSuccess + proverTask, errCode, errMsg := provers[i].getProverTask(t, proofType, "istanbul") + assert.Equal(t, errCode, types.Success) + assert.Equal(t, errMsg, "") assert.NotNil(t, proverTask) provers[i].submitProof(t, proverTask, proofStatus, types.Success) } @@ -286,19 +626,19 @@ func testValidProof(t *testing.T) { func testInvalidProof(t *testing.T) { // Setup coordinator and ws server. coordinatorURL := randomURL() - collector, httpHandler := setupCoordinator(t, 3, coordinatorURL) + collector, httpHandler := setupCoordinator(t, 3, coordinatorURL, map[string]int64{"istanbul": forkNumberTwo}) defer func() { collector.Stop() assert.NoError(t, httpHandler.Shutdown(context.Background())) }() - err := l2BlockOrm.InsertL2Blocks(context.Background(), []*types.WrappedBlock{wrappedBlock1, wrappedBlock2}) + err := l2BlockOrm.InsertL2Blocks(context.Background(), []*encoding.Block{block1, block2}) assert.NoError(t, err) dbChunk, err := chunkOrm.InsertChunk(context.Background(), chunk) assert.NoError(t, err) err = l2BlockOrm.UpdateChunkHashInRange(context.Background(), 0, 100, dbChunk.Hash) assert.NoError(t, err) - batch, err := batchOrm.InsertBatch(context.Background(), 0, 0, dbChunk.Hash, dbChunk.Hash, []*types.Chunk{chunk}) + batch, err := batchOrm.InsertBatch(context.Background(), batch) assert.NoError(t, err) err = batchOrm.UpdateChunkProofsStatusByBatchHash(context.Background(), batch.Hash, types.ChunkProofsStatusReady) assert.NoError(t, err) @@ -312,9 +652,11 @@ func testInvalidProof(t *testing.T) { } else { proofType = message.ProofTypeBatch } - provers[i] = newMockProver(t, "prover_test"+strconv.Itoa(i), coordinatorURL, proofType) - proverTask := provers[i].getProverTask(t, proofType) + provers[i] = newMockProver(t, "prover_test"+strconv.Itoa(i), coordinatorURL, proofType, version.Version) + proverTask, errCode, errMsg := provers[i].getProverTask(t, proofType, "istanbul") assert.NotNil(t, proverTask) + assert.Equal(t, errCode, types.Success) + assert.Equal(t, errMsg, "") provers[i].submitProof(t, proverTask, verifiedFailed, types.ErrCoordinatorHandleZkProofFailure) } @@ -362,19 +704,19 @@ func testInvalidProof(t *testing.T) { func testProofGeneratedFailed(t *testing.T) { // Setup coordinator and ws server. coordinatorURL := randomURL() - collector, httpHandler := setupCoordinator(t, 3, coordinatorURL) + collector, httpHandler := setupCoordinator(t, 3, coordinatorURL, map[string]int64{"istanbul": forkNumberTwo}) defer func() { collector.Stop() assert.NoError(t, httpHandler.Shutdown(context.Background())) }() - err := l2BlockOrm.InsertL2Blocks(context.Background(), []*types.WrappedBlock{wrappedBlock1, wrappedBlock2}) + err := l2BlockOrm.InsertL2Blocks(context.Background(), []*encoding.Block{block1, block2}) assert.NoError(t, err) dbChunk, err := chunkOrm.InsertChunk(context.Background(), chunk) assert.NoError(t, err) err = l2BlockOrm.UpdateChunkHashInRange(context.Background(), 0, 100, dbChunk.Hash) assert.NoError(t, err) - batch, err := batchOrm.InsertBatch(context.Background(), 0, 0, dbChunk.Hash, dbChunk.Hash, []*types.Chunk{chunk}) + batch, err := batchOrm.InsertBatch(context.Background(), batch) assert.NoError(t, err) err = batchOrm.UpdateChunkProofsStatusByBatchHash(context.Background(), batch.Hash, types.ChunkProofsStatusReady) assert.NoError(t, err) @@ -388,9 +730,11 @@ func testProofGeneratedFailed(t *testing.T) { } else { proofType = message.ProofTypeBatch } - provers[i] = newMockProver(t, "prover_test"+strconv.Itoa(i), coordinatorURL, proofType) - proverTask := provers[i].getProverTask(t, proofType) + provers[i] = newMockProver(t, "prover_test"+strconv.Itoa(i), coordinatorURL, proofType, version.Version) + proverTask, errCode, errMsg := provers[i].getProverTask(t, proofType, "istanbul") assert.NotNil(t, proverTask) + assert.Equal(t, errCode, types.Success) + assert.Equal(t, errMsg, "") provers[i].submitProof(t, proverTask, generatedFailed, types.ErrCoordinatorHandleZkProofFailure) } @@ -449,7 +793,7 @@ func testProofGeneratedFailed(t *testing.T) { func testTimeoutProof(t *testing.T) { // Setup coordinator and ws server. coordinatorURL := randomURL() - collector, httpHandler := setupCoordinator(t, 1, coordinatorURL) + collector, httpHandler := setupCoordinator(t, 1, coordinatorURL, map[string]int64{"istanbul": forkNumberTwo}) defer func() { collector.Stop() assert.NoError(t, httpHandler.Shutdown(context.Background())) @@ -462,25 +806,29 @@ func testTimeoutProof(t *testing.T) { batchMaxAttempts int16 ) - err := l2BlockOrm.InsertL2Blocks(context.Background(), []*types.WrappedBlock{wrappedBlock1, wrappedBlock2}) + err := l2BlockOrm.InsertL2Blocks(context.Background(), []*encoding.Block{block1, block2}) assert.NoError(t, err) dbChunk, err := chunkOrm.InsertChunk(context.Background(), chunk) assert.NoError(t, err) err = l2BlockOrm.UpdateChunkHashInRange(context.Background(), 0, 100, dbChunk.Hash) assert.NoError(t, err) - batch, err := batchOrm.InsertBatch(context.Background(), 0, 0, dbChunk.Hash, dbChunk.Hash, []*types.Chunk{chunk}) + batch, err := batchOrm.InsertBatch(context.Background(), batch) assert.NoError(t, err) err = batchOrm.UpdateChunkProofsStatusByBatchHash(context.Background(), batch.Hash, types.ChunkProofsStatusReady) assert.NoError(t, err) // create first chunk & batch mock prover, that will not send any proof. - chunkProver1 := newMockProver(t, "prover_test"+strconv.Itoa(0), coordinatorURL, message.ProofTypeChunk) - proverChunkTask := chunkProver1.getProverTask(t, message.ProofTypeChunk) + chunkProver1 := newMockProver(t, "prover_test"+strconv.Itoa(0), coordinatorURL, message.ProofTypeChunk, version.Version) + proverChunkTask, errChunkCode, errChunkMsg := chunkProver1.getProverTask(t, message.ProofTypeChunk, "istanbul") assert.NotNil(t, proverChunkTask) + assert.Equal(t, errChunkCode, types.Success) + assert.Equal(t, errChunkMsg, "") - batchProver1 := newMockProver(t, "prover_test"+strconv.Itoa(1), coordinatorURL, message.ProofTypeBatch) - proverBatchTask := batchProver1.getProverTask(t, message.ProofTypeBatch) + batchProver1 := newMockProver(t, "prover_test"+strconv.Itoa(1), coordinatorURL, message.ProofTypeBatch, version.Version) + proverBatchTask, errBatchCode, errBatchMsg := batchProver1.getProverTask(t, message.ProofTypeBatch, "istanbul") assert.NotNil(t, proverBatchTask) + assert.Equal(t, errBatchCode, types.Success) + assert.Equal(t, errBatchMsg, "") // verify proof status, it should be assigned, because prover didn't send any proof chunkProofStatus, err := chunkOrm.GetProvingStatusByHash(context.Background(), dbChunk.Hash) @@ -505,14 +853,18 @@ func testTimeoutProof(t *testing.T) { time.Sleep(time.Duration(conf.ProverManager.BatchCollectionTimeSec*2) * time.Second) // create second mock prover, that will send valid proof. - chunkProver2 := newMockProver(t, "prover_test"+strconv.Itoa(2), coordinatorURL, message.ProofTypeChunk) - proverChunkTask2 := chunkProver2.getProverTask(t, message.ProofTypeChunk) + chunkProver2 := newMockProver(t, "prover_test"+strconv.Itoa(2), coordinatorURL, message.ProofTypeChunk, version.Version) + proverChunkTask2, chunkTask2ErrCode, chunkTask2ErrMsg := chunkProver2.getProverTask(t, message.ProofTypeChunk, "istanbul") assert.NotNil(t, proverChunkTask2) + assert.Equal(t, chunkTask2ErrCode, types.Success) + assert.Equal(t, chunkTask2ErrMsg, "") chunkProver2.submitProof(t, proverChunkTask2, verifiedSuccess, types.Success) - batchProver2 := newMockProver(t, "prover_test"+strconv.Itoa(3), coordinatorURL, message.ProofTypeBatch) - proverBatchTask2 := batchProver2.getProverTask(t, message.ProofTypeBatch) + batchProver2 := newMockProver(t, "prover_test"+strconv.Itoa(3), coordinatorURL, message.ProofTypeBatch, version.Version) + proverBatchTask2, batchTask2ErrCode, batchTask2ErrMsg := batchProver2.getProverTask(t, message.ProofTypeBatch, "istanbul") assert.NotNil(t, proverBatchTask2) + assert.Equal(t, batchTask2ErrCode, types.Success) + assert.Equal(t, batchTask2ErrMsg, "") batchProver2.submitProof(t, proverBatchTask2, verifiedSuccess, types.Success) // verify proof status, it should be verified now, because second prover sent valid proof diff --git a/coordinator/test/mock_prover.go b/coordinator/test/mock_prover.go index 804c16397..e09efd705 100644 --- a/coordinator/test/mock_prover.go +++ b/coordinator/test/mock_prover.go @@ -9,12 +9,12 @@ import ( "github.com/go-resty/resty/v2" "github.com/mitchellh/mapstructure" + "github.com/scroll-tech/go-ethereum/common" "github.com/scroll-tech/go-ethereum/crypto" "github.com/stretchr/testify/assert" ctypes "scroll-tech/common/types" "scroll-tech/common/types/message" - "scroll-tech/common/version" "scroll-tech/coordinator/internal/logic/verifier" "scroll-tech/coordinator/internal/types" @@ -30,17 +30,19 @@ const ( type mockProver struct { proverName string + proverVersion string privKey *ecdsa.PrivateKey proofType message.ProofType coordinatorURL string } -func newMockProver(t *testing.T, proverName string, coordinatorURL string, proofType message.ProofType) *mockProver { +func newMockProver(t *testing.T, proverName string, coordinatorURL string, proofType message.ProofType, version string) *mockProver { privKey, err := crypto.GenerateKey() assert.NoError(t, err) prover := &mockProver{ proverName: proverName, + proverVersion: version, privKey: privKey, proofType: proofType, coordinatorURL: coordinatorURL, @@ -78,8 +80,8 @@ func (r *mockProver) login(t *testing.T, challengeString string) string { authMsg := message.AuthMsg{ Identity: &message.Identity{ Challenge: challengeString, - ProverName: "test", - ProverVersion: version.Version, + ProverName: r.proverName, + ProverVersion: r.proverVersion, }, } assert.NoError(t, authMsg.SignWithKey(r.privKey)) @@ -133,7 +135,32 @@ func (r *mockProver) healthCheckFailure(t *testing.T) bool { return true } -func (r *mockProver) getProverTask(t *testing.T, proofType message.ProofType) *types.GetTaskSchema { +func (r *mockProver) getProverTask(t *testing.T, proofType message.ProofType, forkName string) (*types.GetTaskSchema, int, string) { + // get task from coordinator + token := r.connectToCoordinator(t) + assert.NotEmpty(t, token) + + type response struct { + ErrCode int `json:"errcode"` + ErrMsg string `json:"errmsg"` + Data types.GetTaskSchema `json:"data"` + } + + var result response + client := resty.New() + resp, err := client.R(). + SetHeader("Content-Type", "application/json"). + SetHeader("Authorization", fmt.Sprintf("Bearer %s", token)). + SetBody(map[string]interface{}{"prover_height": 100, "task_type": int(proofType), "hard_fork_name": forkName}). + SetResult(&result). + Post("http://" + r.coordinatorURL + "/coordinator/v1/get_task") + assert.NoError(t, err) + assert.Equal(t, http.StatusOK, resp.StatusCode()) + return &result.Data, result.ErrCode, result.ErrMsg +} + +// Testing expected errors returned by coordinator. +func (r *mockProver) tryGetProverTask(t *testing.T, proofType message.ProofType) (int, string) { // get task from coordinator token := r.connectToCoordinator(t) assert.NotEmpty(t, token) @@ -154,12 +181,8 @@ func (r *mockProver) getProverTask(t *testing.T, proofType message.ProofType) *t Post("http://" + r.coordinatorURL + "/coordinator/v1/get_task") assert.NoError(t, err) assert.Equal(t, http.StatusOK, resp.StatusCode()) - assert.Equal(t, ctypes.Success, result.ErrCode) - assert.NotEmpty(t, result.Data.TaskID) - assert.NotEmpty(t, result.Data.TaskType) - assert.NotEmpty(t, result.Data.TaskData) - return &result.Data + return result.ErrCode, result.ErrMsg } func (r *mockProver) submitProof(t *testing.T, proverTaskSchema *types.GetTaskSchema, proofStatus proofStatus, errCode int) { @@ -224,3 +247,7 @@ func (r *mockProver) submitProof(t *testing.T, proverTaskSchema *types.GetTaskSc assert.Equal(t, http.StatusOK, resp.StatusCode()) assert.Equal(t, errCode, result.ErrCode) } + +func (r *mockProver) publicKey() string { + return common.Bytes2Hex(crypto.CompressPubkey(&r.privKey.PublicKey)) +} diff --git a/database/go.mod b/database/go.mod index e794bfc7f..e5cfe6ee0 100644 --- a/database/go.mod +++ b/database/go.mod @@ -1,31 +1,40 @@ module scroll-tech/database -go 1.20 +go 1.21 require ( github.com/jmoiron/sqlx v1.3.5 github.com/lib/pq v1.10.9 github.com/pressly/goose/v3 v3.16.0 - github.com/scroll-tech/go-ethereum v1.10.14-0.20231130005111-38a3a9c9198c - github.com/stretchr/testify v1.8.4 + github.com/scroll-tech/go-ethereum v1.10.14-0.20240326144132-0f0cd99f7a2e + github.com/stretchr/testify v1.9.0 github.com/urfave/cli/v2 v2.25.7 ) require ( - github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect + dario.cat/mergo v1.0.0 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/docker/cli v25.0.1+incompatible // indirect + github.com/docker/docker v25.0.3+incompatible // indirect + github.com/docker/go-connections v0.5.0 // indirect github.com/go-stack/stack v1.8.1 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/jackc/pgx/v5 v5.5.4 // indirect + github.com/klauspost/compress v1.17.4 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/mattn/go-sqlite3 v1.14.16 // indirect + github.com/opencontainers/image-spec v1.1.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rogpeppe/go-internal v1.10.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/sethvargo/go-retry v0.2.4 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect + go.opentelemetry.io/otel/trace v1.24.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.16.0 // indirect - golang.org/x/sync v0.5.0 // indirect - golang.org/x/sys v0.15.0 // indirect + golang.org/x/mod v0.16.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.17.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/database/go.sum b/database/go.sum index fd3a65cfa..fc151d772 100644 --- a/database/go.sum +++ b/database/go.sum @@ -1,45 +1,77 @@ +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/ClickHouse/ch-go v0.58.2 h1:jSm2szHbT9MCAB1rJ3WuCJqmGLi5UTjlNu+f530UTS0= +github.com/ClickHouse/ch-go v0.58.2/go.mod h1:Ap/0bEmiLa14gYjCiRkYGbXvbe8vwdrfTYWhsuQ99aw= github.com/ClickHouse/clickhouse-go/v2 v2.15.0 h1:G0hTKyO8fXXR1bGnZ0DY3vTG01xYfOGW76zgjg5tmC4= +github.com/ClickHouse/clickhouse-go/v2 v2.15.0/go.mod h1:kXt1SRq0PIRa6aKZD7TnFnY9PQKmc2b13sHtOYcK6cQ= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI= +github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7bEZ9Su8= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= +github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/docker/cli v24.0.7+incompatible h1:wa/nIwYFW7BVTGa7SWPVyyXU9lgORqUb1xfI36MSkFg= -github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/cli v25.0.1+incompatible h1:mFpqnrS6Hsm3v1k7Wa/BO23oz0k121MTbTO1lpcGSkU= +github.com/docker/cli v25.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/docker v25.0.3+incompatible h1:D5fy/lYmY7bvZa0XTZ5/UJPljor41F+vdyJG5luQLfQ= +github.com/docker/docker v25.0.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/elastic/go-sysinfo v1.11.1 h1:g9mwl05njS4r69TisC+vwHWTSKywZFYYUu3so3T/Lao= +github.com/elastic/go-sysinfo v1.11.1/go.mod h1:6KQb31j0QeWBDF88jIdWSxE8cwoOB9tO4Y4osN7Q70E= github.com/elastic/go-windows v1.0.1 h1:AlYZOldA+UJ0/2nBuqWdo90GFCgG9xuyw9SYzGUtJm0= +github.com/elastic/go-windows v1.0.1/go.mod h1:FoVvqWSun28vaDQPbj2Elfc0JahhPB7WQEGa3c814Ss= github.com/go-faster/city v1.0.1 h1:4WAxSZ3V2Ws4QRDrscLEDcibJY8uf41H6AhXDrNDcGw= +github.com/go-faster/city v1.0.1/go.mod h1:jKcUJId49qdW3L1qKHH/3wPeUstCVpVSXTM6vO3VcTw= github.com/go-faster/errors v0.6.1 h1:nNIPOBkprlKzkThvS/0YaX8Zs9KewLCOSFQS5BU06FI= +github.com/go-faster/errors v0.6.1/go.mod h1:5MGV2/2T9yvlrbhe9pD9LO5Z/2zCSq2T8j+Jpi2LAyY= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= +github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= -github.com/jackc/pgx/v5 v5.5.0 h1:NxstgwndsTRy7eq9/kqYc/BZh5w2hHJV86wjvO+1xPw= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.5.4 h1:Xp2aQS8uXButQdnCMWNmvx6UysWQQC+u1EoizjguY+8= +github.com/jackc/pgx/v5 v5.5.4/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= +github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4= +github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= -github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/klauspost/compress v1.17.4 h1:Ej5ixsIri7BrIjBkRZLTo6ghwrEtHFk7ijlczPW4fZ4= +github.com/klauspost/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -51,81 +83,122 @@ github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= github.com/opencontainers/runc v1.1.10 h1:EaL5WeO9lv9wmS6SASjszOeQdSctvpbu0DdBQBizE40= +github.com/opencontainers/runc v1.1.10/go.mod h1:+/R6+KmDlh+hOO8NkjmgkG9Qzvypzk0yXxAPYYR65+M= github.com/ory/dockertest/v3 v3.10.0 h1:4K3z2VMe8Woe++invjaTB7VRyQXQy5UY+loujO4aNE4= +github.com/ory/dockertest/v3 v3.10.0/go.mod h1:nr57ZbRWMqfsdGdFNLHz5jjNdDb7VVFnzAeW1n5N1Lg= github.com/paulmach/orb v0.10.0 h1:guVYVqzxHE/CQ1KpfGO077TR0ATHSNjp4s6XGLn3W9s= +github.com/paulmach/orb v0.10.0/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU= github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ= +github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pressly/goose/v3 v3.16.0 h1:xMJUsZdHLqSnCqESyKSqEfcYVYsUuup1nrOhaEFftQg= github.com/pressly/goose/v3 v3.16.0/go.mod h1:JwdKVnmCRhnF6XLQs2mHEQtucFD49cQBdRM4UiwkxsM= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/scroll-tech/go-ethereum v1.10.14-0.20231130005111-38a3a9c9198c h1:MnAdt80steCDli4SAD0J0spBGNY+gQvbdptNjWztHcw= -github.com/scroll-tech/go-ethereum v1.10.14-0.20231130005111-38a3a9c9198c/go.mod h1:4HrFcoStbViFVy/9l/rvKl1XmizVAaPdgqI8v0U8hOc= +github.com/scroll-tech/go-ethereum v1.10.14-0.20240326144132-0f0cd99f7a2e h1:FcoK0rykAWI+5E7cQM6ALRLd5CmjBTHRvJztRBH2xeM= +github.com/scroll-tech/go-ethereum v1.10.14-0.20240326144132-0f0cd99f7a2e/go.mod h1:7Rz2bh9pn42rGuxjh51CG7HL9SKMG3ZugJkL3emdZx8= github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys= +github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= github.com/sethvargo/go-retry v0.2.4 h1:T+jHEQy/zKJf5s95UkguisicE0zuF9y7+/vgz08Ocec= github.com/sethvargo/go-retry v0.2.4/go.mod h1:1afjQuvh7s4gflMObvjLPaWgluLLyhA1wmVZ6KLpICw= github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= +github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/vertica/vertica-sql-go v1.3.3 h1:fL+FKEAEy5ONmsvya2WH5T8bhkvY27y/Ik3ReR2T+Qw= +github.com/vertica/vertica-sql-go v1.3.3/go.mod h1:jnn2GFuv+O2Jcjktb7zyc4Utlbu9YVqpHH/lx63+1M4= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/ydb-platform/ydb-go-genproto v0.0.0-20231012155159-f85a672542fd h1:dzWP1Lu+A40W883dK/Mr3xyDSM/2MggS8GtHT0qgAnE= +github.com/ydb-platform/ydb-go-genproto v0.0.0-20231012155159-f85a672542fd/go.mod h1:Er+FePu1dNUieD+XTMDduGpQuCPssK5Q4BjF+IIXJ3I= github.com/ydb-platform/ydb-go-sdk/v3 v3.54.2 h1:E0yUuuX7UmPxXm92+yQCjMveLFO3zfvYFIJVuAqsVRA= -go.opentelemetry.io/otel v1.20.0 h1:vsb/ggIY+hUjD/zCAQHpzTmndPqv/ml2ArbsbfBYTAc= -go.opentelemetry.io/otel/trace v1.20.0 h1:+yxVAPZPbQhbC3OfAkeIVTky6iTFpcr4SiY9om7mXSQ= +github.com/ydb-platform/ydb-go-sdk/v3 v3.54.2/go.mod h1:fjBLQ2TdQNl4bMjuWl9adoTGBypwUTPoGC+EqYqiIcU= +go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= +go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= +go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= +go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= +golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= +golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 h1:DC7wcm+i+P1rN3Ff07vL+OndGg5OhNddHyTA+ocPqYE= google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4/go.mod h1:eJVxU6o+4G1PSczBr85xmyvSNYAKvAYgkub40YGomFM= google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM= +howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= lukechampine.com/uint128 v1.3.0 h1:cDdUVfRwDUDovz610ABgFD17nXD4/uDgVHl2sC3+sbo= +lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= modernc.org/cc/v3 v3.41.0 h1:QoR1Sn3YWlmA1T4vLaKZfawdVtSiGx8H+cEojbC7v1Q= +modernc.org/cc/v3 v3.41.0/go.mod h1:Ni4zjJYJ04CDOhG7dn640WGfwBzfE0ecX8TyMB0Fv0Y= modernc.org/ccgo/v3 v3.16.15 h1:KbDR3ZAVU+wiLyMESPtbtE/Add4elztFyfsWoNTgxS0= +modernc.org/ccgo/v3 v3.16.15/go.mod h1:yT7B+/E2m43tmMOT51GMoM98/MtHIcQQSleGnddkUNI= modernc.org/libc v1.32.0 h1:yXatHTrACp3WaKNRCoZwUK7qj5V8ep1XyY0ka4oYcNc= +modernc.org/libc v1.32.0/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE= modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= +modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= modernc.org/sqlite v1.27.0 h1:MpKAHoyYB7xqcwnUwkuD+npwEa0fojF0B5QRbN+auJ8= +modernc.org/sqlite v1.27.0/go.mod h1:Qxpazz0zH8Z1xCFyi5GSL3FzbtZ3fvbjmywNogldEW0= modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= diff --git a/database/migrate/migrate_test.go b/database/migrate/migrate_test.go index 08b7bd66b..b44be6fa3 100644 --- a/database/migrate/migrate_test.go +++ b/database/migrate/migrate_test.go @@ -1,86 +1,89 @@ package migrate import ( + "database/sql" "testing" - "github.com/jmoiron/sqlx" _ "github.com/lib/pq" "github.com/stretchr/testify/assert" - "scroll-tech/common/docker" - - "scroll-tech/database" + "scroll-tech/common/testcontainers" ) var ( - base *docker.App - pgDB *sqlx.DB + testApps *testcontainers.TestcontainerApps + pgDB *sql.DB ) -func initEnv(t *testing.T) error { +func setupEnv(t *testing.T) { // Start db container. - base.RunDBImage(t) + testApps = testcontainers.NewTestcontainerApps() + assert.NoError(t, testApps.StartPostgresContainer()) + gormClient, err := testApps.GetGormDBClient() + assert.NoError(t, err) + pgDB, err = gormClient.DB() + assert.NoError(t, err) +} - // Create db orm handler. - factory, err := database.NewOrmFactory(base.DBConfig) - if err != nil { - return err - } - pgDB = factory.GetDB() - return nil +func TestMain(m *testing.M) { + defer func() { + if testApps != nil { + testApps.Free() + } + }() + m.Run() } func TestMigrate(t *testing.T) { - base = docker.NewDockerApp() - if err := initEnv(t); err != nil { - t.Fatal(err) - } - + setupEnv(t) t.Run("testCurrent", testCurrent) t.Run("testStatus", testStatus) t.Run("testResetDB", testResetDB) t.Run("testMigrate", testMigrate) t.Run("testRollback", testRollback) - - t.Cleanup(func() { - base.Free() - }) } func testCurrent(t *testing.T) { - cur, err := Current(pgDB.DB) + cur, err := Current(pgDB) assert.NoError(t, err) - assert.Equal(t, 0, int(cur)) + assert.Equal(t, int64(0), cur) } func testStatus(t *testing.T) { - status := Status(pgDB.DB) + status := Status(pgDB) assert.NoError(t, status) } func testResetDB(t *testing.T) { - assert.NoError(t, ResetDB(pgDB.DB)) - cur, err := Current(pgDB.DB) + assert.NoError(t, ResetDB(pgDB)) + cur, err := Current(pgDB) assert.NoError(t, err) // total number of tables. - assert.Equal(t, 15, int(cur)) + assert.Equal(t, int64(16), cur) } func testMigrate(t *testing.T) { - assert.NoError(t, Migrate(pgDB.DB)) - cur, err := Current(pgDB.DB) + assert.NoError(t, Migrate(pgDB)) + cur, err := Current(pgDB) assert.NoError(t, err) - assert.Equal(t, true, cur > 0) + assert.Equal(t, int64(16), cur) } func testRollback(t *testing.T) { - version, err := Current(pgDB.DB) + version, err := Current(pgDB) assert.NoError(t, err) - assert.Equal(t, true, version > 0) + assert.Equal(t, int64(16), version) - assert.NoError(t, Rollback(pgDB.DB, nil)) + assert.NoError(t, Rollback(pgDB, nil)) - cur, err := Current(pgDB.DB) + cur, err := Current(pgDB) assert.NoError(t, err) - assert.Equal(t, true, cur+1 == version) + assert.Equal(t, version, cur+1) + + targetVersion := int64(0) + assert.NoError(t, Rollback(pgDB, &targetVersion)) + + cur, err = Current(pgDB) + assert.NoError(t, err) + assert.Equal(t, int64(0), cur) } diff --git a/database/migrate/migrations/00016_prover_block_list.sql b/database/migrate/migrations/00016_prover_block_list.sql new file mode 100644 index 000000000..97e3b930d --- /dev/null +++ b/database/migrate/migrations/00016_prover_block_list.sql @@ -0,0 +1,26 @@ +-- +goose Up +-- +goose StatementBegin + +CREATE TABLE prover_block_list +( + id BIGSERIAL PRIMARY KEY, + + public_key VARCHAR NOT NULL, + +-- debug info + prover_name VARCHAR NOT NULL, + + created_at TIMESTAMP(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted_at TIMESTAMP(0) DEFAULT NULL +); + +CREATE INDEX idx_prover_block_list_on_public_key ON prover_block_list(public_key); +CREATE INDEX idx_prover_block_list_on_prover_name ON prover_block_list(prover_name); + +-- +goose StatementEnd + +-- +goose Down +-- +goose StatementBegin +DROP TABLE IF EXISTS prover_block_list; +-- +goose StatementEnd diff --git a/go.work b/go.work index 66ea27a1d..98edfc7b8 100644 --- a/go.work +++ b/go.work @@ -1,4 +1,4 @@ -go 1.20 +go 1.21 use ( ./bridge-history-api diff --git a/go.work.sum b/go.work.sum index 5693c09b3..880b19a02 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,5 +1,4 @@ cloud.google.com/go v0.26.0 h1:e0WKqKTd5BnrG8aKH3J3h+QvEIQtSUcf2n5UZ5ZgLtQ= -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= @@ -18,6 +17,41 @@ cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZ cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0 h1:Dg9iHVQfrhq82rUNu9ZxUDrJLaxFUe/HlCVaLyRruq8= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= +cloud.google.com/go v0.110.8/go.mod h1:Iz8AkXJf1qmxC3Oxoep8R1T36w8B92yU29PcBhHO5fk= +cloud.google.com/go v0.110.10/go.mod h1:v1OoFqYxiBkUrruItNM3eT4lLByNjxmJSV/xDKJNnic= +cloud.google.com/go/accessapproval v1.7.4 h1:ZvLvJ952zK8pFHINjpMBY5k7LTAp/6pBf50RDMRgBUI= +cloud.google.com/go/accessapproval v1.7.4/go.mod h1:/aTEh45LzplQgFYdQdwPMR9YdX0UlhBmvB84uAmQKUc= +cloud.google.com/go/accesscontextmanager v1.8.4 h1:Yo4g2XrBETBCqyWIibN3NHNPQKUfQqti0lI+70rubeE= +cloud.google.com/go/accesscontextmanager v1.8.4/go.mod h1:ParU+WbMpD34s5JFEnGAnPBYAgUHozaTmDJU7aCU9+M= +cloud.google.com/go/aiplatform v1.54.0 h1:wH7OYl9Vq/5tupok0BPTFY9xaTLb0GxkReHtB5PF7cI= +cloud.google.com/go/aiplatform v1.54.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= +cloud.google.com/go/analytics v0.21.6 h1:fnV7B8lqyEYxCU0LKk+vUL7mTlqRAq4uFlIthIdr/iA= +cloud.google.com/go/analytics v0.21.6/go.mod h1:eiROFQKosh4hMaNhF85Oc9WO97Cpa7RggD40e/RBy8w= +cloud.google.com/go/apigateway v1.6.4 h1:VVIxCtVerchHienSlaGzV6XJGtEM9828Erzyr3miUGs= +cloud.google.com/go/apigateway v1.6.4/go.mod h1:0EpJlVGH5HwAN4VF4Iec8TAzGN1aQgbxAWGJsnPCGGY= +cloud.google.com/go/apigeeconnect v1.6.4 h1:jSoGITWKgAj/ssVogNE9SdsTqcXnryPzsulENSRlusI= +cloud.google.com/go/apigeeconnect v1.6.4/go.mod h1:CapQCWZ8TCjnU0d7PobxhpOdVz/OVJ2Hr/Zcuu1xFx0= +cloud.google.com/go/apigeeregistry v0.8.2 h1:DSaD1iiqvELag+lV4VnnqUUFd8GXELu01tKVdWZrviE= +cloud.google.com/go/apigeeregistry v0.8.2/go.mod h1:h4v11TDGdeXJDJvImtgK2AFVvMIgGWjSb0HRnBSjcX8= +cloud.google.com/go/appengine v1.8.4 h1:Qub3fqR7iA1daJWdzjp/Q0Jz0fUG0JbMc7Ui4E9IX/E= +cloud.google.com/go/appengine v1.8.4/go.mod h1:TZ24v+wXBujtkK77CXCpjZbnuTvsFNT41MUaZ28D6vg= +cloud.google.com/go/area120 v0.8.4 h1:YnSO8m02pOIo6AEOgiOoUDVbw4pf+bg2KLHi4rky320= +cloud.google.com/go/area120 v0.8.4/go.mod h1:jfawXjxf29wyBXr48+W+GyX/f8fflxp642D/bb9v68M= +cloud.google.com/go/artifactregistry v1.14.6 h1:/hQaadYytMdA5zBh+RciIrXZQBWK4vN7EUsrQHG+/t8= +cloud.google.com/go/artifactregistry v1.14.6/go.mod h1:np9LSFotNWHcjnOgh8UVK0RFPCTUGbO0ve3384xyHfE= +cloud.google.com/go/asset v1.15.3 h1:uI8Bdm81s0esVWbWrTHcjFDFKNOa9aB7rI1vud1hO84= +cloud.google.com/go/asset v1.15.3/go.mod h1:yYLfUD4wL4X589A9tYrv4rFrba0QlDeag0CMcM5ggXU= +cloud.google.com/go/assuredworkloads v1.11.4 h1:FsLSkmYYeNuzDm8L4YPfLWV+lQaUrJmH5OuD37t1k20= +cloud.google.com/go/assuredworkloads v1.11.4/go.mod h1:4pwwGNwy1RP0m+y12ef3Q/8PaiWrIDQ6nD2E8kvWI9U= +cloud.google.com/go/automl v1.13.4 h1:i9tOKXX+1gE7+rHpWKjiuPfGBVIYoWvLNIGpWgPtF58= +cloud.google.com/go/automl v1.13.4/go.mod h1:ULqwX/OLZ4hBVfKQaMtxMSTlPx0GqGbWN8uA/1EqCP8= +cloud.google.com/go/baremetalsolution v1.2.3 h1:oQiFYYCe0vwp7J8ZmF6siVKEumWtiPFJMJcGuyDVRUk= +cloud.google.com/go/baremetalsolution v1.2.3/go.mod h1:/UAQ5xG3faDdy180rCUv47e0jvpp3BFxT+Cl0PFjw5g= +cloud.google.com/go/batch v1.6.3 h1:mPiIH20a5NU02rucbAmLeO4sLPO9hrTK0BLjdHyW8xw= +cloud.google.com/go/batch v1.6.3/go.mod h1:J64gD4vsNSA2O5TtDB5AAux3nJ9iV8U3ilg3JDBYejU= +cloud.google.com/go/beyondcorp v1.0.3 h1:VXf9SnrnSmj2BF2cHkoTHvOUp8gjsz1KJFOMW7czdsY= +cloud.google.com/go/beyondcorp v1.0.3/go.mod h1:HcBvnEd7eYr+HGDd5ZbuVmBYX019C6CEXBonXbCVwJo= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0 h1:sAbMqjY1PEQKZBWfbu6Y6bsupJ9c4QdHnzg/VvYTLcE= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= @@ -26,20 +60,194 @@ cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUM cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0 h1:PQcPefKFdaIzjQFbiyOgAqyx8q5djaE7x9Sqe712DPA= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/bigquery v1.57.1 h1:FiULdbbzUxWD0Y4ZGPSVCDLvqRSyCIO6zKV7E2nf5uA= +cloud.google.com/go/bigquery v1.57.1/go.mod h1:iYzC0tGVWt1jqSzBHqCr3lrRn0u13E8e+AqowBsDgug= cloud.google.com/go/bigtable v1.2.0 h1:F4cCmA4nuV84V5zYQ3MKY+M1Cw1avHDuf3S/LcZPA9c= cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= +cloud.google.com/go/billing v1.17.4 h1:77/4kCqzH6Ou5CCDzNmqmboE+WvbwFBJmw1QZQz19AI= +cloud.google.com/go/billing v1.17.4/go.mod h1:5DOYQStCxquGprqfuid/7haD7th74kyMBHkjO/OvDtk= +cloud.google.com/go/binaryauthorization v1.7.3 h1:3R6WYn1JKIaVicBmo18jXubu7xh4mMkmbIgsTXk0cBA= +cloud.google.com/go/binaryauthorization v1.7.3/go.mod h1:VQ/nUGRKhrStlGr+8GMS8f6/vznYLkdK5vaKfdCIpvU= +cloud.google.com/go/certificatemanager v1.7.4 h1:5YMQ3Q+dqGpwUZ9X5sipsOQ1fLPsxod9HNq0+nrqc6I= +cloud.google.com/go/certificatemanager v1.7.4/go.mod h1:FHAylPe/6IIKuaRmHbjbdLhGhVQ+CWHSD5Jq0k4+cCE= +cloud.google.com/go/channel v1.17.3 h1:Rd4+fBrjiN6tZ4TR8R/38elkyEkz6oogGDr7jDyjmMY= +cloud.google.com/go/channel v1.17.3/go.mod h1:QcEBuZLGGrUMm7kNj9IbU1ZfmJq2apotsV83hbxX7eE= +cloud.google.com/go/cloudbuild v1.15.0 h1:9IHfEMWdCklJ1cwouoiQrnxmP0q3pH7JUt8Hqx4Qbck= +cloud.google.com/go/cloudbuild v1.15.0/go.mod h1:eIXYWmRt3UtggLnFGx4JvXcMj4kShhVzGndL1LwleEM= +cloud.google.com/go/clouddms v1.7.3 h1:xe/wJKz55VO1+L891a1EG9lVUgfHr9Ju/I3xh1nwF84= +cloud.google.com/go/clouddms v1.7.3/go.mod h1:fkN2HQQNUYInAU3NQ3vRLkV2iWs8lIdmBKOx4nrL6Hc= +cloud.google.com/go/cloudtasks v1.12.4 h1:5xXuFfAjg0Z5Wb81j2GAbB3e0bwroCeSF+5jBn/L650= +cloud.google.com/go/cloudtasks v1.12.4/go.mod h1:BEPu0Gtt2dU6FxZHNqqNdGqIG86qyWKBPGnsb7udGY0= +cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= +cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.1/go.mod h1:CqB3xpmPKKt3OJpW2ndFIXnA9A4xAy/F3Xp1ixncW78= cloud.google.com/go/compute/metadata v0.2.0 h1:nBbNSZyDpkNlo3DepaaLKVuO7ClyifSAmNloSCZrHnQ= cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/contactcenterinsights v1.12.0 h1:wP41IUA4ucMVooj/TP53jd7vbNjWrDkAPOeulVJGT5U= +cloud.google.com/go/contactcenterinsights v1.12.0/go.mod h1:HHX5wrz5LHVAwfI2smIotQG9x8Qd6gYilaHcLLLmNis= +cloud.google.com/go/container v1.28.0 h1:/o82CFWXIYnT9p/07SnRgybqL3Pmmu86jYIlzlJVUBY= +cloud.google.com/go/container v1.28.0/go.mod h1:b1A1gJeTBXVLQ6GGw9/9M4FG94BEGsqJ5+t4d/3N7O4= +cloud.google.com/go/containeranalysis v0.11.3 h1:5rhYLX+3a01drpREqBZVXR9YmWH45RnML++8NsCtuD8= +cloud.google.com/go/containeranalysis v0.11.3/go.mod h1:kMeST7yWFQMGjiG9K7Eov+fPNQcGhb8mXj/UcTiWw9U= +cloud.google.com/go/datacatalog v1.19.0 h1:rbYNmHwvAOOwnW2FPXYkaK3Mf1MmGqRzK0mMiIEyLdo= +cloud.google.com/go/datacatalog v1.19.0/go.mod h1:5FR6ZIF8RZrtml0VUao22FxhdjkoG+a0866rEnObryM= +cloud.google.com/go/dataflow v0.9.4 h1:7VmCNWcPJBS/srN2QnStTB6nu4Eb5TMcpkmtaPVhRt4= +cloud.google.com/go/dataflow v0.9.4/go.mod h1:4G8vAkHYCSzU8b/kmsoR2lWyHJD85oMJPHMtan40K8w= +cloud.google.com/go/dataform v0.9.1 h1:jV+EsDamGX6cE127+QAcCR/lergVeeZdEQ6DdrxW3sQ= +cloud.google.com/go/dataform v0.9.1/go.mod h1:pWTg+zGQ7i16pyn0bS1ruqIE91SdL2FDMvEYu/8oQxs= +cloud.google.com/go/datafusion v1.7.4 h1:Q90alBEYlMi66zL5gMSGQHfbZLB55mOAg03DhwTTfsk= +cloud.google.com/go/datafusion v1.7.4/go.mod h1:BBs78WTOLYkT4GVZIXQCZT3GFpkpDN4aBY4NDX/jVlM= +cloud.google.com/go/datalabeling v0.8.4 h1:zrq4uMmunf2KFDl/7dS6iCDBBAxBnKVDyw6+ajz3yu0= +cloud.google.com/go/datalabeling v0.8.4/go.mod h1:Z1z3E6LHtffBGrNUkKwbwbDxTiXEApLzIgmymj8A3S8= +cloud.google.com/go/dataplex v1.11.2 h1:AfFFR15Ifh4U+Me1IBztrSd5CrasTODzy3x8KtDyHdc= +cloud.google.com/go/dataplex v1.11.2/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= +cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= +cloud.google.com/go/dataproc/v2 v2.3.0 h1:tTVP9tTxmc8fixxOd/8s6Q6Pz/+yzn7r7XdZHretQH0= +cloud.google.com/go/dataproc/v2 v2.3.0/go.mod h1:G5R6GBc9r36SXv/RtZIVfB8SipI+xVn0bX5SxUzVYbY= +cloud.google.com/go/dataqna v0.8.4 h1:NJnu1kAPamZDs/if3bJ3+Wb6tjADHKL83NUWsaIp2zg= +cloud.google.com/go/dataqna v0.8.4/go.mod h1:mySRKjKg5Lz784P6sCov3p1QD+RZQONRMRjzGNcFd0c= cloud.google.com/go/datastore v1.0.0 h1:Kt+gOPPp2LEPWp8CSfxhsM8ik9CcyE/gYu+0r+RnZvM= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0 h1:/May9ojXjRkPBNVrq+oWLqmWCkr4OU5uRY29bu0mRyQ= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/datastore v1.15.0 h1:0P9WcsQeTWjuD1H14JIY7XQscIPQ4Laje8ti96IC5vg= +cloud.google.com/go/datastore v1.15.0/go.mod h1:GAeStMBIt9bPS7jMJA85kgkpsMkvseWWXiaHya9Jes8= +cloud.google.com/go/datastream v1.10.3 h1:Z2sKPIB7bT2kMW5Uhxy44ZgdJzxzE5uKjavoW+EuHEE= +cloud.google.com/go/datastream v1.10.3/go.mod h1:YR0USzgjhqA/Id0Ycu1VvZe8hEWwrkjuXrGbzeDOSEA= +cloud.google.com/go/deploy v1.15.0 h1:ZdmYzRMTGkVyP1nXEUat9FpbJGJemDcNcx82RSSOElc= +cloud.google.com/go/deploy v1.15.0/go.mod h1:e5XOUI5D+YGldyLNZ21wbp9S8otJbBE4i88PtO9x/2g= +cloud.google.com/go/dialogflow v1.44.3 h1:cK/f88KX+YVR4tLH4clMQlvrLWD2qmKJQziusjGPjmc= +cloud.google.com/go/dialogflow v1.44.3/go.mod h1:mHly4vU7cPXVweuB5R0zsYKPMzy240aQdAu06SqBbAQ= +cloud.google.com/go/dlp v1.11.1 h1:OFlXedmPP/5//X1hBEeq3D9kUVm9fb6ywYANlpv/EsQ= +cloud.google.com/go/dlp v1.11.1/go.mod h1:/PA2EnioBeXTL/0hInwgj0rfsQb3lpE3R8XUJxqUNKI= +cloud.google.com/go/documentai v1.23.5 h1:KAlzT+q8qvRxAmhsJUvLtfFHH0PNvz3M79H6CgVBKL8= +cloud.google.com/go/documentai v1.23.5/go.mod h1:ghzBsyVTiVdkfKaUCum/9bGBEyBjDO4GfooEcYKhN+g= +cloud.google.com/go/domains v0.9.4 h1:ua4GvsDztZ5F3xqjeLKVRDeOvJshf5QFgWGg1CKti3A= +cloud.google.com/go/domains v0.9.4/go.mod h1:27jmJGShuXYdUNjyDG0SodTfT5RwLi7xmH334Gvi3fY= +cloud.google.com/go/edgecontainer v1.1.4 h1:Szy3Q/N6bqgQGyxqjI+6xJZbmvPvnFHp3UZr95DKcQ0= +cloud.google.com/go/edgecontainer v1.1.4/go.mod h1:AvFdVuZuVGdgaE5YvlL1faAoa1ndRR/5XhXZvPBHbsE= +cloud.google.com/go/errorreporting v0.3.0 h1:kj1XEWMu8P0qlLhm3FwcaFsUvXChV/OraZwA70trRR0= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.6.5 h1:S2if6wkjR4JCEAfDtIiYtD+sTz/oXjh2NUG4cgT1y/Q= +cloud.google.com/go/essentialcontacts v1.6.5/go.mod h1:jjYbPzw0x+yglXC890l6ECJWdYeZ5dlYACTFL0U/VuM= +cloud.google.com/go/eventarc v1.13.3 h1:+pFmO4eu4dOVipSaFBLkmqrRYG94Xl/TQZFOeohkuqU= +cloud.google.com/go/eventarc v1.13.3/go.mod h1:RWH10IAZIRcj1s/vClXkBgMHwh59ts7hSWcqD3kaclg= +cloud.google.com/go/filestore v1.8.0 h1:/+wUEGwk3x3Kxomi2cP5dsR8+SIXxo7M0THDjreFSYo= +cloud.google.com/go/filestore v1.8.0/go.mod h1:S5JCxIbFjeBhWMTfIYH2Jx24J6BqjwpkkPl+nBA5DlI= +cloud.google.com/go/firestore v1.14.0 h1:8aLcKnMPoldYU3YHgu4t2exrKhLQkqaXAGqT0ljrFVw= +cloud.google.com/go/firestore v1.14.0/go.mod h1:96MVaHLsEhbvkBEdZgfN+AS/GIkco1LRpH9Xp9YZfzQ= +cloud.google.com/go/functions v1.15.4 h1:ZjdiV3MyumRM6++1Ixu6N0VV9LAGlCX4AhW6Yjr1t+U= +cloud.google.com/go/functions v1.15.4/go.mod h1:CAsTc3VlRMVvx+XqXxKqVevguqJpnVip4DdonFsX28I= +cloud.google.com/go/gkebackup v1.3.4 h1:KhnOrr9A1tXYIYeXKqCKbCI8TL2ZNGiD3dm+d7BDUBg= +cloud.google.com/go/gkebackup v1.3.4/go.mod h1:gLVlbM8h/nHIs09ns1qx3q3eaXcGSELgNu1DWXYz1HI= +cloud.google.com/go/gkeconnect v0.8.4 h1:1JLpZl31YhQDQeJ98tK6QiwTpgHFYRJwpntggpQQWis= +cloud.google.com/go/gkeconnect v0.8.4/go.mod h1:84hZz4UMlDCKl8ifVW8layK4WHlMAFeq8vbzjU0yJkw= +cloud.google.com/go/gkehub v0.14.4 h1:J5tYUtb3r0cl2mM7+YHvV32eL+uZQ7lONyUZnPikCEo= +cloud.google.com/go/gkehub v0.14.4/go.mod h1:Xispfu2MqnnFt8rV/2/3o73SK1snL8s9dYJ9G2oQMfc= +cloud.google.com/go/gkemulticloud v1.0.3 h1:NmJsNX9uQ2CT78957xnjXZb26TDIMvv+d5W2vVUt0Pg= +cloud.google.com/go/gkemulticloud v1.0.3/go.mod h1:7NpJBN94U6DY1xHIbsDqB2+TFZUfjLUKLjUX8NGLor0= +cloud.google.com/go/grafeas v0.3.0/go.mod h1:P7hgN24EyONOTMyeJH6DxG4zD7fwiYa5Q6GUgyFSOU8= +cloud.google.com/go/gsuiteaddons v1.6.4 h1:uuw2Xd37yHftViSI8J2hUcCS8S7SH3ZWH09sUDLW30Q= +cloud.google.com/go/gsuiteaddons v1.6.4/go.mod h1:rxtstw7Fx22uLOXBpsvb9DUbC+fiXs7rF4U29KHM/pE= +cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= +cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= +cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= +cloud.google.com/go/iap v1.9.3 h1:M4vDbQ4TLXdaljXVZSwW7XtxpwXUUarY2lIs66m0aCM= +cloud.google.com/go/iap v1.9.3/go.mod h1:DTdutSZBqkkOm2HEOTBzhZxh2mwwxshfD/h3yofAiCw= +cloud.google.com/go/ids v1.4.4 h1:VuFqv2ctf/A7AyKlNxVvlHTzjrEvumWaZflUzBPz/M4= +cloud.google.com/go/ids v1.4.4/go.mod h1:z+WUc2eEl6S/1aZWzwtVNWoSZslgzPxAboS0lZX0HjI= +cloud.google.com/go/iot v1.7.4 h1:m1WljtkZnvLTIRYW1YTOv5A6H1yKgLHR6nU7O8yf27w= +cloud.google.com/go/iot v1.7.4/go.mod h1:3TWqDVvsddYBG++nHSZmluoCAVGr1hAcabbWZNKEZLk= +cloud.google.com/go/kms v1.15.5 h1:pj1sRfut2eRbD9pFRjNnPNg/CzJPuQAzUujMIM1vVeM= +cloud.google.com/go/kms v1.15.5/go.mod h1:cU2H5jnp6G2TDpUGZyqTCoy1n16fbubHZjmVXSMtwDI= +cloud.google.com/go/language v1.12.2 h1:zg9uq2yS9PGIOdc0Kz/l+zMtOlxKWonZjjo5w5YPG2A= +cloud.google.com/go/language v1.12.2/go.mod h1:9idWapzr/JKXBBQ4lWqVX/hcadxB194ry20m/bTrhWc= +cloud.google.com/go/lifesciences v0.9.4 h1:rZEI/UxcxVKEzyoRS/kdJ1VoolNItRWjNN0Uk9tfexg= +cloud.google.com/go/lifesciences v0.9.4/go.mod h1:bhm64duKhMi7s9jR9WYJYvjAFJwRqNj+Nia7hF0Z7JA= +cloud.google.com/go/logging v1.8.1 h1:26skQWPeYhvIasWKm48+Eq7oUqdcdbwsCVwz5Ys0FvU= +cloud.google.com/go/logging v1.8.1/go.mod h1:TJjR+SimHwuC8MZ9cjByQulAMgni+RkXeI3wwctHJEI= +cloud.google.com/go/longrunning v0.5.2/go.mod h1:nqo6DQbNV2pXhGDbDMoN2bWz68MjZUzqv2YttZiveCs= +cloud.google.com/go/longrunning v0.5.4 h1:w8xEcbZodnA2BbW6sVirkkoC+1gP8wS57EUUgGS0GVg= +cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI= +cloud.google.com/go/managedidentities v1.6.4 h1:SF/u1IJduMqQQdJA4MDyivlIQ4SrV5qAawkr/ZEREkY= +cloud.google.com/go/managedidentities v1.6.4/go.mod h1:WgyaECfHmF00t/1Uk8Oun3CQ2PGUtjc3e9Alh79wyiM= +cloud.google.com/go/maps v1.6.1 h1:2+eMp/1MvMPp5qrSOd3vtnLKa/pylt+krVRqET3jWsM= +cloud.google.com/go/maps v1.6.1/go.mod h1:4+buOHhYXFBp58Zj/K+Lc1rCmJssxxF4pJ5CJnhdz18= +cloud.google.com/go/mediatranslation v0.8.4 h1:VRCQfZB4s6jN0CSy7+cO3m4ewNwgVnaePanVCQh/9Z4= +cloud.google.com/go/mediatranslation v0.8.4/go.mod h1:9WstgtNVAdN53m6TQa5GjIjLqKQPXe74hwSCxUP6nj4= +cloud.google.com/go/memcache v1.10.4 h1:cdex/ayDd294XBj2cGeMe6Y+H1JvhN8y78B9UW7pxuQ= +cloud.google.com/go/memcache v1.10.4/go.mod h1:v/d8PuC8d1gD6Yn5+I3INzLR01IDn0N4Ym56RgikSI0= +cloud.google.com/go/metastore v1.13.3 h1:94l/Yxg9oBZjin2bzI79oK05feYefieDq0o5fjLSkC8= +cloud.google.com/go/metastore v1.13.3/go.mod h1:K+wdjXdtkdk7AQg4+sXS8bRrQa9gcOr+foOMF2tqINE= +cloud.google.com/go/monitoring v1.16.3 h1:mf2SN9qSoBtIgiMA4R/y4VADPWZA7VCNJA079qLaZQ8= +cloud.google.com/go/monitoring v1.16.3/go.mod h1:KwSsX5+8PnXv5NJnICZzW2R8pWTis8ypC4zmdRD63Tw= +cloud.google.com/go/networkconnectivity v1.14.3 h1:e9lUkCe2BexsqsUc2bjV8+gFBpQa54J+/F3qKVtW+wA= +cloud.google.com/go/networkconnectivity v1.14.3/go.mod h1:4aoeFdrJpYEXNvrnfyD5kIzs8YtHg945Og4koAjHQek= +cloud.google.com/go/networkmanagement v1.9.3 h1:HsQk4FNKJUX04k3OI6gUsoveiHMGvDRqlaFM2xGyvqU= +cloud.google.com/go/networkmanagement v1.9.3/go.mod h1:y7WMO1bRLaP5h3Obm4tey+NquUvB93Co1oh4wpL+XcU= +cloud.google.com/go/networksecurity v0.9.4 h1:947tNIPnj1bMGTIEBo3fc4QrrFKS5hh0bFVsHmFm4Vo= +cloud.google.com/go/networksecurity v0.9.4/go.mod h1:E9CeMZ2zDsNBkr8axKSYm8XyTqNhiCHf1JO/Vb8mD1w= +cloud.google.com/go/notebooks v1.11.2 h1:eTOTfNL1yM6L/PCtquJwjWg7ZZGR0URFaFgbs8kllbM= +cloud.google.com/go/notebooks v1.11.2/go.mod h1:z0tlHI/lREXC8BS2mIsUeR3agM1AkgLiS+Isov3SS70= +cloud.google.com/go/optimization v1.6.2 h1:iFsoexcp13cGT3k/Hv8PA5aK+FP7FnbhwDO9llnruas= +cloud.google.com/go/optimization v1.6.2/go.mod h1:mWNZ7B9/EyMCcwNl1frUGEuY6CPijSkz88Fz2vwKPOY= +cloud.google.com/go/orchestration v1.8.4 h1:kgwZ2f6qMMYIVBtUGGoU8yjYWwMTHDanLwM/CQCFaoQ= +cloud.google.com/go/orchestration v1.8.4/go.mod h1:d0lywZSVYtIoSZXb0iFjv9SaL13PGyVOKDxqGxEf/qI= +cloud.google.com/go/orgpolicy v1.11.4 h1:RWuXQDr9GDYhjmrredQJC7aY7cbyqP9ZuLbq5GJGves= +cloud.google.com/go/orgpolicy v1.11.4/go.mod h1:0+aNV/nrfoTQ4Mytv+Aw+stBDBjNf4d8fYRA9herfJI= +cloud.google.com/go/osconfig v1.12.4 h1:OrRCIYEAbrbXdhm13/JINn9pQchvTTIzgmOCA7uJw8I= +cloud.google.com/go/osconfig v1.12.4/go.mod h1:B1qEwJ/jzqSRslvdOCI8Kdnp0gSng0xW4LOnIebQomA= +cloud.google.com/go/oslogin v1.12.2 h1:NP/KgsD9+0r9hmHC5wKye0vJXVwdciv219DtYKYjgqE= +cloud.google.com/go/oslogin v1.12.2/go.mod h1:CQ3V8Jvw4Qo4WRhNPF0o+HAM4DiLuE27Ul9CX9g2QdY= +cloud.google.com/go/phishingprotection v0.8.4 h1:sPLUQkHq6b4AL0czSJZ0jd6vL55GSTHz2B3Md+TCZI0= +cloud.google.com/go/phishingprotection v0.8.4/go.mod h1:6b3kNPAc2AQ6jZfFHioZKg9MQNybDg4ixFd4RPZZ2nE= +cloud.google.com/go/policytroubleshooter v1.10.2 h1:sq+ScLP83d7GJy9+wpwYJVnY+q6xNTXwOdRIuYjvHT4= +cloud.google.com/go/policytroubleshooter v1.10.2/go.mod h1:m4uF3f6LseVEnMV6nknlN2vYGRb+75ylQwJdnOXfnv0= +cloud.google.com/go/privatecatalog v0.9.4 h1:Vo10IpWKbNvc/z/QZPVXgCiwfjpWoZ/wbgful4Uh/4E= +cloud.google.com/go/privatecatalog v0.9.4/go.mod h1:SOjm93f+5hp/U3PqMZAHTtBtluqLygrDrVO8X8tYtG0= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0 h1:9/vpR43S4aJaROxqQHQ3nH9lfyKKV0dC3vOmnw8ebQQ= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1 h1:ukjixP1wl0LpnZ6LWtZJ0mX5tBmjp1f8Sqer8Z2OMUU= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/pubsub v1.33.0 h1:6SPCPvWav64tj0sVX/+npCBKhUi/UjJehy9op/V3p2g= +cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= +cloud.google.com/go/pubsublite v1.8.1 h1:pX+idpWMIH30/K7c0epN6V703xpIcMXWRjKJsz0tYGY= +cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= +cloud.google.com/go/recaptchaenterprise/v2 v2.8.4 h1:KOlLHLv3h3HwcZAkx91ubM3Oztz3JtT3ZacAJhWDorQ= +cloud.google.com/go/recaptchaenterprise/v2 v2.8.4/go.mod h1:Dak54rw6lC2gBY8FBznpOCAR58wKf+R+ZSJRoeJok4w= +cloud.google.com/go/recommendationengine v0.8.4 h1:JRiwe4hvu3auuh2hujiTc2qNgPPfVp+Q8KOpsXlEzKQ= +cloud.google.com/go/recommendationengine v0.8.4/go.mod h1:GEteCf1PATl5v5ZsQ60sTClUE0phbWmo3rQ1Js8louU= +cloud.google.com/go/recommender v1.11.3 h1:VndmgyS/J3+izR8V8BHa7HV/uun8//ivQ3k5eVKKyyM= +cloud.google.com/go/recommender v1.11.3/go.mod h1:+FJosKKJSId1MBFeJ/TTyoGQZiEelQQIZMKYYD8ruK4= +cloud.google.com/go/redis v1.14.1 h1:J9cEHxG9YLmA9o4jTSvWt/RuVEn6MTrPlYSCRHujxDQ= +cloud.google.com/go/redis v1.14.1/go.mod h1:MbmBxN8bEnQI4doZPC1BzADU4HGocHBk2de3SbgOkqs= +cloud.google.com/go/resourcemanager v1.9.4 h1:JwZ7Ggle54XQ/FVYSBrMLOQIKoIT/uer8mmNvNLK51k= +cloud.google.com/go/resourcemanager v1.9.4/go.mod h1:N1dhP9RFvo3lUfwtfLWVxfUWq8+KUQ+XLlHLH3BoFJ0= +cloud.google.com/go/resourcesettings v1.6.4 h1:yTIL2CsZswmMfFyx2Ic77oLVzfBFoWBYgpkgiSPnC4Y= +cloud.google.com/go/resourcesettings v1.6.4/go.mod h1:pYTTkWdv2lmQcjsthbZLNBP4QW140cs7wqA3DuqErVI= +cloud.google.com/go/retail v1.14.4 h1:geqdX1FNqqL2p0ADXjPpw8lq986iv5GrVcieTYafuJQ= +cloud.google.com/go/retail v1.14.4/go.mod h1:l/N7cMtY78yRnJqp5JW8emy7MB1nz8E4t2yfOmklYfg= +cloud.google.com/go/run v1.3.3 h1:qdfZteAm+vgzN1iXzILo3nJFQbzziudkJrvd9wCf3FQ= +cloud.google.com/go/run v1.3.3/go.mod h1:WSM5pGyJ7cfYyYbONVQBN4buz42zFqwG67Q3ch07iK4= +cloud.google.com/go/scheduler v1.10.5 h1:eMEettHlFhG5pXsoHouIM5nRT+k+zU4+GUvRtnxhuVI= +cloud.google.com/go/scheduler v1.10.5/go.mod h1:MTuXcrJC9tqOHhixdbHDFSIuh7xZF2IysiINDuiq6NI= +cloud.google.com/go/secretmanager v1.11.4 h1:krnX9qpG2kR2fJ+u+uNyNo+ACVhplIAS4Pu7u+4gd+k= +cloud.google.com/go/secretmanager v1.11.4/go.mod h1:wreJlbS9Zdq21lMzWmJ0XhWW2ZxgPeahsqeV/vZoJ3w= +cloud.google.com/go/security v1.15.4 h1:sdnh4Islb1ljaNhpIXlIPgb3eYj70QWgPVDKOUYvzJc= +cloud.google.com/go/security v1.15.4/go.mod h1:oN7C2uIZKhxCLiAAijKUCuHLZbIt/ghYEo8MqwD/Ty4= +cloud.google.com/go/securitycenter v1.24.2 h1:qCEyXoJoxNKKA1bDywBjjqCB7ODXazzHnVWnG5Uqd1M= +cloud.google.com/go/securitycenter v1.24.2/go.mod h1:l1XejOngggzqwr4Fa2Cn+iWZGf+aBLTXtB/vXjy5vXM= +cloud.google.com/go/servicedirectory v1.11.3 h1:5niCMfkw+jifmFtbBrtRedbXkJm3fubSR/KHbxSJZVM= +cloud.google.com/go/servicedirectory v1.11.3/go.mod h1:LV+cHkomRLr67YoQy3Xq2tUXBGOs5z5bPofdq7qtiAw= +cloud.google.com/go/shell v1.7.4 h1:nurhlJcSVFZneoRZgkBEHumTYf/kFJptCK2eBUq/88M= +cloud.google.com/go/shell v1.7.4/go.mod h1:yLeXB8eKLxw0dpEmXQ/FjriYrBijNsONpwnWsdPqlKM= +cloud.google.com/go/spanner v1.53.0 h1:/NzWQJ1MEhdRcffiutRKbW/AIGVKhcTeivWTDjEyCCo= +cloud.google.com/go/spanner v1.53.0/go.mod h1:liG4iCeLqm5L3fFLU5whFITqP0e0orsAW1uUSrd4rws= +cloud.google.com/go/speech v1.21.0 h1:qkxNao58oF8ghAHE1Eghen7XepawYEN5zuZXYWaUTA4= +cloud.google.com/go/speech v1.21.0/go.mod h1:wwolycgONvfz2EDU8rKuHRW3+wc9ILPsAWoikBEWavY= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0 h1:RPUcBvDeYgQFMfQu1eBMq6piD1SXmLH+vK3qjewZPus= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= @@ -47,25 +255,62 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0 h1:STgFzyU5/8miMl0//zKh2aQeTyeaUH3WN9bSUiJ09bA= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= +cloud.google.com/go/storagetransfer v1.10.3 h1:YM1dnj5gLjfL6aDldO2s4GeU8JoAvH1xyIwXre63KmI= +cloud.google.com/go/storagetransfer v1.10.3/go.mod h1:Up8LY2p6X68SZ+WToswpQbQHnJpOty/ACcMafuey8gc= +cloud.google.com/go/talent v1.6.5 h1:LnRJhhYkODDBoTwf6BeYkiJHFw9k+1mAFNyArwZUZAs= +cloud.google.com/go/talent v1.6.5/go.mod h1:Mf5cma696HmE+P2BWJ/ZwYqeJXEeU0UqjHFXVLadEDI= +cloud.google.com/go/texttospeech v1.7.4 h1:ahrzTgr7uAbvebuhkBAAVU6kRwVD0HWsmDsvMhtad5Q= +cloud.google.com/go/texttospeech v1.7.4/go.mod h1:vgv0002WvR4liGuSd5BJbWy4nDn5Ozco0uJymY5+U74= +cloud.google.com/go/tpu v1.6.4 h1:XIEH5c0WeYGaVy9H+UueiTaf3NI6XNdB4/v6TFQJxtE= +cloud.google.com/go/tpu v1.6.4/go.mod h1:NAm9q3Rq2wIlGnOhpYICNI7+bpBebMJbh0yyp3aNw1Y= +cloud.google.com/go/trace v1.10.4 h1:2qOAuAzNezwW3QN+t41BtkDJOG42HywL73q8x/f6fnM= +cloud.google.com/go/trace v1.10.4/go.mod h1:Nso99EDIK8Mj5/zmB+iGr9dosS/bzWCJ8wGmE6TXNWY= +cloud.google.com/go/translate v1.9.3 h1:t5WXTqlrk8VVJu/i3WrYQACjzYJiff5szARHiyqqPzI= +cloud.google.com/go/translate v1.9.3/go.mod h1:Kbq9RggWsbqZ9W5YpM94Q1Xv4dshw/gr/SHfsl5yCZ0= +cloud.google.com/go/video v1.20.3 h1:Xrpbm2S9UFQ1pZEeJt9Vqm5t2T/z9y/M3rNXhFoo8Is= +cloud.google.com/go/video v1.20.3/go.mod h1:TnH/mNZKVHeNtpamsSPygSR0iHtvrR/cW1/GDjN5+GU= +cloud.google.com/go/videointelligence v1.11.4 h1:YS4j7lY0zxYyneTFXjBJUj2r4CFe/UoIi/PJG0Zt/Rg= +cloud.google.com/go/videointelligence v1.11.4/go.mod h1:kPBMAYsTPFiQxMLmmjpcZUMklJp3nC9+ipJJtprccD8= +cloud.google.com/go/vision/v2 v2.7.5 h1:T/ujUghvEaTb+YnFY/jiYwVAkMbIC8EieK0CJo6B4vg= +cloud.google.com/go/vision/v2 v2.7.5/go.mod h1:GcviprJLFfK9OLf0z8Gm6lQb6ZFUulvpZws+mm6yPLM= +cloud.google.com/go/vmmigration v1.7.4 h1:qPNdab4aGgtaRX+51jCOtJxlJp6P26qua4o1xxUDjpc= +cloud.google.com/go/vmmigration v1.7.4/go.mod h1:yBXCmiLaB99hEl/G9ZooNx2GyzgsjKnw5fWcINRgD70= +cloud.google.com/go/vmwareengine v1.0.3 h1:WY526PqM6QNmFHSqe2sRfK6gRpzWjmL98UFkql2+JDM= +cloud.google.com/go/vmwareengine v1.0.3/go.mod h1:QSpdZ1stlbfKtyt6Iu19M6XRxjmXO+vb5a/R6Fvy2y4= +cloud.google.com/go/vpcaccess v1.7.4 h1:zbs3V+9ux45KYq8lxxn/wgXole6SlBHHKKyZhNJoS+8= +cloud.google.com/go/vpcaccess v1.7.4/go.mod h1:lA0KTvhtEOb/VOdnH/gwPuOzGgM+CWsmGu6bb4IoMKk= +cloud.google.com/go/webrisk v1.9.4 h1:iceR3k0BCRZgf2D/NiKviVMFfuNC9LmeNLtxUFRB/wI= +cloud.google.com/go/webrisk v1.9.4/go.mod h1:w7m4Ib4C+OseSr2GL66m0zMBywdrVNTDKsdEsfMl7X0= +cloud.google.com/go/websecurityscanner v1.6.4 h1:5Gp7h5j7jywxLUp6NTpjNPkgZb3ngl0tUSw6ICWvtJQ= +cloud.google.com/go/websecurityscanner v1.6.4/go.mod h1:mUiyMQ+dGpPPRkHgknIZeCzSHJ45+fY4F52nZFDHm2o= +cloud.google.com/go/workflows v1.12.3 h1:qocsqETmLAl34mSa01hKZjcqAvt699gaoFbooGGMvaM= +cloud.google.com/go/workflows v1.12.3/go.mod h1:fmOUeeqEwPzIU81foMjTRQIdwQHADi/vEr1cx9R1m5g= collectd.org v0.3.0 h1:iNBHGw1VvPJxH2B6RiFWFZ+vsjo1lCdRszBeOuwGi00= collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9 h1:HD8gA2tkByhMAwYaFAX9w2l7vxvBQ5NMoxDrkhqhtn4= +github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= github.com/Azure/azure-pipeline-go v0.2.2 h1:6oiIS9yaG6XCCzhgAgKFfIWyo4LLCiDhZot6ltoThhY= github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 h1:qoVeMsc9/fh/yhxVaA0obYjVH/oI/ihrOoMwsLS9KSA= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.1.0 h1:Ut0ZGdOwJDw0npYEg+TLlPls3Pq6JiZaP2/aGKir7Zw= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.1.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.1.2/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0 h1:8q4SaHjFsClSvuVne0ID/5Ka8u3fcIHyqkLjcFpNRHQ= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.1.0 h1:QkAcEIAKbNL4KoFr4SathZPhDhF4mVwpBMFlYjyAqy8= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.1.0/go.mod h1:bhXu1AjYL+wutSL/kpSq6s7733q2Rb0yuot9Zgfqa/0= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.2.1/go.mod h1:gLa1CL2RNE4s7M3yopJ/p0iq5DdY6Yv5ZUt9MTRZOQM= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 h1:vcYCAze6p19qBW7MhZybIsqD8sMV8js0NyQM8JDnVtg= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 h1:E+m3SkZCN0Bf5q7YdTs5lSm2CYY3CK4spn5OmUIiQtk= github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0 h1:jp0dGvZ7ZK0mgqnTSClMxa5xuRL7NZgHameVYF6BurY= github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY= github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= @@ -73,6 +318,8 @@ github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0 github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 h1:Px2UA+2RvSSvv+RvJNuUB6n7rs5Wsel4dXLe90Um2n4= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.4.1 h1:QSdcrd/UFJv6Bp/CfoVf2SrENpFn9P6Yh8yb+xNhYMM= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.4.1/go.mod h1:eZ4g6GUvXiGulfIbbhh1Xr4XwUYaYaWMqzGD/284wCA= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.0 h1:gggzg0SUMs6SQbEw+3LoSsYf9YMjkupeAnHMX8O9mmY= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.0/go.mod h1:+6KLcKIVgxoBDMqMO/Nvy7bZ9a0nbU3I1DtFQK3YvB4= github.com/Azure/azure-storage-blob-go v0.7.0 h1:MuueVOYkufCxJw5YZzF842DY2MBsp+hLuh2apKY0mck= @@ -105,23 +352,21 @@ github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VY github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/AzureAD/microsoft-authentication-library-for-go v0.6.0 h1:XMEdVDFxgulDDl0lQmAZS6j8gRQ/0pJ+ZpXH2FHVtDc= +github.com/AzureAD/microsoft-authentication-library-for-go v0.6.0/go.mod h1:BDJ5qMFKx9DugEg3+uQSDCdbYPr5s9vBTrL9P8TpqOU= github.com/AzureAD/microsoft-authentication-library-for-go v0.8.1/go.mod h1:4qFor3D/HDsvBME35Xy9rwW9DecL+M2sNw1ybjPtwA0= github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 h1:OBhqkivkhkMqLPymWEppkm7vgPQY2XsHoEkaMQ0AdZY= github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I= github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/ClickHouse/ch-go v0.55.0/go.mod h1:kQT2f+yp2p+sagQA/7kS6G3ukym+GQ5KAu1kuFAFDiU= -github.com/ClickHouse/ch-go v0.58.2/go.mod h1:Ap/0bEmiLa14gYjCiRkYGbXvbe8vwdrfTYWhsuQ99aw= github.com/ClickHouse/clickhouse-go/v2 v2.2.0 h1:dj00TDKY+xwuTJdbpspCSmTLFyWzRJerTHwaBxut1C0= github.com/ClickHouse/clickhouse-go/v2 v2.2.0/go.mod h1:8f2XZUi7XoeU+uPIytSi1cvx8fmJxi7vIgqpvYTF1+o= github.com/ClickHouse/clickhouse-go/v2 v2.9.1/go.mod h1:teXfZNM90iQ99Jnuht+dxQXCuhDZ8nvvMoTJOFrcmcg= -github.com/ClickHouse/clickhouse-go/v2 v2.15.0/go.mod h1:kXt1SRq0PIRa6aKZD7TnFnY9PQKmc2b13sHtOYcK6cQ= +github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a h1:3SgJcK9l5uPdBC/X17wanyJAMxM33+4ZhEIV96MIH8U= github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 h1:sR+/8Yb4slttB4vD+b9btVEnWgL3Q00OBTzVT8B9C0c= github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible h1:rZgFj+Gtf3NMi/U5FvCvhzaxzW/TaPYgUYx3bAPz9DE= @@ -131,19 +376,25 @@ github.com/CloudyKit/jet/v6 v6.1.0 h1:hvO96X345XagdH1fAoBjpBYG4a1ghhL/QzalkduPuX github.com/CloudyKit/jet/v6 v6.1.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= github.com/DATA-DOG/go-sqlmock v1.3.3 h1:CWUqKXe0s8A2z6qCgkP4Kru7wC11YoAnoupUKFDnH08= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/Joker/hpp v1.0.0 h1:65+iuJYdRXv/XyN62C1uEmmOx3432rNG/rKlX6V7Kkc= +github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7 h1:mreN1m/5VJ/Zc3b4pzj9qU6D9SRQ6Vm+3KfI328t3S8= github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= -github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= +github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= +github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= +github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398 h1:WDC6ySpJzbxGWFh4aMxFFC28wwGp5pEuoTtvA4q/qQ4= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06 h1:KkH3I3sJuOLP3TjA/dfr4NAY8bghDwnXiU7cTKxQqo0= github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= @@ -155,28 +406,49 @@ github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNu github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794 h1:xlwdaKcTNVW4PtpQb8aKA4Pjy0CdJHEqvFbAnvR5m2g= github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794/go.mod h1:7e+I0LQFUI9AXWxOfsQROs9xPhoJtbsyWcjJqDd4KPY= github.com/aead/siphash v1.0.1 h1:FwHfE/T45KPKYuuSAKyyvE+oPWcaQ+CUmFW0bPlM+kg= +github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= +github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= +github.com/agnivade/levenshtein v1.0.1 h1:3oJU7J3FGFmyhn8KHjmVaZCN5hxTr7GxgRue+sxIXdQ= +github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU= +github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af h1:wVe6/Ea46ZMeNkQjjBW6xcqyQA/j5e0D6GytH95g0gQ= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/akavel/rsrc v0.10.2 h1:Zxm8V5eI1hW4gGaYsJQUhxpjkENuG91ki8B4zCrvEsw= +github.com/akavel/rsrc v0.10.2/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= +github.com/alecthomas/kingpin/v2 v2.3.1 h1:ANLJcKmQm4nIaog7xdr/id6FM6zm5hHnfZrvtKPxqGg= +github.com/alecthomas/kingpin/v2 v2.3.1/go.mod h1:oYL5vtsvEHZGHxU7DMp32Dvx+qL+ptGn6lWaot2vCNE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc h1:cAKDfWh5VpdgMhJosfJnn5/FoN2SRZ4p7fJNX58YPaU= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf h1:qet1QNfXsQxTZqLG4oE62mJzwPIB8+Tee4RNCL9ulrY= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d h1:UQZhZ2O0vMHr2cI+DC1Mbh0TJxzA3RcLoMsFw+aXw7E= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/antlr/antlr4/runtime/Go/antlr v1.4.10 h1:yL7+Jz0jTC6yykIK/Wh74gnTJnrGr5AyrNMXuA0gves= +github.com/antlr/antlr4/runtime/Go/antlr v1.4.10/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db h1:nxAtV4VajJDhKysp2kdcJZsq8Ss1xSA0vZTkVHHJd0E= github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= +github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg= +github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= +github.com/apparentlymart/go-cidr v1.0.1 h1:NmIwLZ/KdsjIUlhf+/Np40atNXm/+lZ5txfTJ/SpF+U= +github.com/apparentlymart/go-cidr v1.0.1/go.mod h1:EBcsNrHc3zQeuaeCeCtQruQm+n9/YjEn/vI25Lg7Gwc= +github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= +github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= +github.com/armon/circbuf v0.0.0-20190214190532-5111143e8da2 h1:7Ip0wMmLHLRJdrloDxZfhMm0xrLXZS8+COSu2bXmEQs= +github.com/armon/circbuf v0.0.0-20190214190532-5111143e8da2/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 h1:G1bPvciwNyF7IUmKXNt9Ak3m6u9DE1rF+RmtIkBpVdA= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/avast/retry-go/v4 v4.1.0 h1:CwudD9anYv6JMVnDuTRlK6kLo4dBamiL+F3U8YDiyfg= github.com/avast/retry-go/v4 v4.1.0/go.mod h1:HqmLvS2VLdStPCGDFjSuZ9pzlTqVRldCI4w2dO4m1Ms= github.com/aws/aws-sdk-go-v2 v1.2.0 h1:BS+UYpbsElC82gB+2E2jiCBg36i8HlubTB/dO/moQ9c= @@ -184,6 +456,8 @@ github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJ github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= github.com/aws/aws-sdk-go-v2 v1.21.2 h1:+LXZ0sgo8quN9UOKXXzAWRT3FWd4NxeXWOZom9pE7GA= github.com/aws/aws-sdk-go-v2 v1.21.2/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10 h1:dK82zF6kkPeCo8J1e+tGx4JdvDIQzj7ygIoLg8WMuGs= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10/go.mod h1:VeTZetY5KRJLuD/7fkQXMU6Mw7H5m/KP2J5Iy9osMno= github.com/aws/aws-sdk-go-v2/config v1.1.1 h1:ZAoq32boMzcaTW9bcUacBswAmHTbvlvDJICgHFZuECo= github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= github.com/aws/aws-sdk-go-v2/config v1.18.45 h1:Aka9bI7n8ysuwPeFdm77nfbyHCAKQ3z9ghB3S/38zes= @@ -196,20 +470,32 @@ github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2 h1:EtEU7WRaWliitZh2nmuxEXrN github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13 h1:PIktER+hwIG286DqXyvVENjgLTAwGgoeriLDD5C+YlQ= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13/go.mod h1:f/Ib/qYjhV2/qdsf79H3QP/eRE4AkVyEf6sk7XfZ1tg= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.56 h1:kFDCPqqVvb9vYcW82L7xYfrBGpuxXQ/8A/zYVayRQK4= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.56/go.mod h1:FoSBuessadgy8Cqp9gQF8U5rzi1XVQhiEJ6su2/kBEE= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43 h1:nFBQlGtkbPzp/NjZLuFxRqmT91rLJkgvsEQs68h962Y= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43/go.mod h1:auo+PiyLl0n1l8A0e8RIeR8tOzYPfZZH/JNlrJ8igTQ= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37 h1:JRVhO25+r3ar2mKGP7E0LDl8K9/G36gjlqca5iQbaqc= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37/go.mod h1:Qe+2KtKml+FEsQF/DHmDV+xjtche/hwoF75EG4UlHW8= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45 h1:hze8YsjSh8Wl1rYa1CJpRmXP21BvOBuc76YhW0HsuQ4= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45/go.mod h1:lD5M20o09/LCuQ2mE62Mb/iSdSlCNuj6H5ci7tW7OsE= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.22 h1:lTqBRUuy8oLhBsnnVZf14uRbIHPHCrGqg4Plc8gU/1U= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.22/go.mod h1:YsOa3tFriwWNvBPYHXM5ARiU2yqBNWPWeUiq+4i7Na0= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11 h1:y2+VQzC6Zh2ojtV2LoC0MNwHWc6qXv/j2vrQtlftkdA= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11/go.mod h1:iV4q2hsqtNECrfmlXyord9u4zyuFEJX9eLgLpSPzWA8= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.25 h1:B/hO3jfWRm7hP00UeieNlI5O2xP5WJ27tyJG5lzc7AM= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.25/go.mod h1:54K1zgxK/lai3a4HosE4IKBwZsP/5YAJ6dzJfwsjJ0U= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2 h1:4AH9fFjUlVktQMznF+YN33aWNXaR4VgDXyP28qokJC0= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37 h1:WWZA/I2K4ptBS1kg0kV1JbBtG/umed0vwHRrmcr9z7k= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37/go.mod h1:vBmDnwWXWxNPFRMmG2m/3MKOe+xEcMDo1tanpaWCcck= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.24 h1:i4RH8DLv/BHY0fCrXYQDr+DGnWzaxB3Ee/esxUaSavk= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.24/go.mod h1:N8X45/o2cngvjCYi2ZnvI0P4mU4ZRJfEYC3maCSsPyw= github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1 h1:cKr6St+CtC3/dl/rEBJvlk7A/IN5D5F02GNkGzfbtVU= github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1/go.mod h1:rLiOUrPLW/Er5kRcQ7NkwbjlijluLsrIbu/iyl35RO4= github.com/aws/aws-sdk-go-v2/service/route53 v1.30.2 h1:/RPQNjh1sDIezpXaFIkZb7MlXnSyAqjVdAwcJuGYTqg= github.com/aws/aws-sdk-go-v2/service/route53 v1.30.2/go.mod h1:TQZBt/WaQy+zTHoW++rnl8JBrmZ0VO6EUbVua1+foCA= +github.com/aws/aws-sdk-go-v2/service/s3 v1.30.6 h1:zzTm99krKsFcF4N7pu2z17yCcAZpQYZ7jnJZPIgEMXE= +github.com/aws/aws-sdk-go-v2/service/s3 v1.30.6/go.mod h1:PudwVKUTApfm0nYaPutOXaKdPKTlZYClGBQpVIRdcbs= github.com/aws/aws-sdk-go-v2/service/sso v1.1.1 h1:37QubsarExl5ZuCBlnRP+7l1tNwZPBSTqpTBrPH98RU= github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= github.com/aws/aws-sdk-go-v2/service/sso v1.15.2 h1:JuPGc7IkOP4AaqcZSIcyqLpFSqBWK32rM9+a1g6u73k= @@ -228,12 +514,17 @@ github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible h1:Ppm0npCCsmuR9oQaBtRuZcmILVE74aXE+AmrJj8L2ns= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/bitly/go-hostpool v0.1.0 h1:XKmsF6k5el6xHG3WPJ8U0Ku/ye7njX7W81Ng7O2ioR0= +github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y= github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.5.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40 h1:y4B3+GPxKlrigF1ha5FFErxK+sr6sWxQovRMzwMhejo= github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= github.com/boltdb/bolt v1.3.1 h1:JQmyP4ZBrce+ZQu0dY660FMfatumYDLun9hBCUVIkF4= @@ -257,12 +548,10 @@ github.com/c-bata/go-prompt v0.2.2 h1:uyKRz6Z6DUyj49QVijyM339UJV9yhbr70gESwbNU3e github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1 h1:glEXhBS5PSLLv4IXzLA5yPRVX4bilULVyxxbrfOtDAk= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= +github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927 h1:SKI1/fuSdodxmNNyVBR8d7X/HuLnRpvvFO0AgyQk764= @@ -279,59 +568,117 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWs github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/chzyer/test v0.0.0-20210722231415-061457976a23 h1:dZ0/VyGgQdVGAss6Ju0dt5P0QltE0SFY5Woh6hbIfiQ= github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cilium/ebpf v0.9.1 h1:64sn2K3UKw8NbP/blsixRpF3nXuyhz/VjRlRzvlBRu4= +github.com/cilium/ebpf v0.9.1/go.mod h1:+OhNOIXx/Fnu1IE8bJz2dzOA+VSfyTfdNUVdlQnxUFY= github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudflare/cloudflare-go v0.14.0 h1:gFqGlGl/5f9UGXAaKapCGUfaTCgRKKnzu2VvzMZlOFA= github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= github.com/cloudflare/cloudflare-go v0.79.0 h1:ErwCYDjFCYppDJlDJ/5WhsSmzegAUe2+K9qgFyQDg3M= github.com/cloudflare/cloudflare-go v0.79.0/go.mod h1:gkHQf9xEubaQPEuerBuoinR9P8bf8a05Lq0X6WKy1Oc= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f h1:WBZRG4aNOuI15bLRrCgN8fCq8E5Xuty6jGbmSNEvSsU= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403 h1:cqQfy1jclcSy/FwLjemeg3SR1yaINm74aQyupQ0Bl8M= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v1.0.0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4= github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHyXGitRJoDqM= +github.com/cockroachdb/errors v1.8.1 h1:A5+txlVZfOqFBDa4mGz2bUWSp0aHElvHX2bKkdbQu+Y= github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= +github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 h1:aPEJyR4rPBvDmeyi+l/FS/VtA00IWvjeFvjen1m1l1A= github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593/go.mod h1:6hk1eMY/u5t+Cf18q5lFMUA1Rc+Sm5I6Ra1QuPyxXCo= +github.com/cockroachdb/redact v1.0.8 h1:8QG/764wK+vmEYoOlfobpe12EQcS81ukx/a4hdVMxNw= github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 h1:sDMmm+q/3+BukdIpxwO365v/Rbspp2Nt5XntgQRXq8Q= +github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= +github.com/compose-spec/compose-go v1.20.0 h1:h4ZKOst1EF/DwZp7dWkb+wbTVE4nEyT9Lc89to84Ol4= +github.com/compose-spec/compose-go v1.20.0/go.mod h1:+MdqXV4RA7wdFsahh/Kb8U0pAJqkg7mr4PM9tFKU8RM= github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572 h1:+R8G1+Ftumd0DaveLgMIjrFPcAS4G8MsVXWXiyZL5BY= github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f h1:C43yEtQ6NIf4ftFXD/V55gnGFgPbMQobd//YlnLjUJ8= github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q= github.com/consensys/gnark-crypto v0.9.1-0.20230105202408-1a7a29904a7c h1:llSLg4o9EgH3SrXky+Q5BqEYqV76NGKo07K5Ps2pIKo= github.com/consensys/gnark-crypto v0.9.1-0.20230105202408-1a7a29904a7c/go.mod h1:CkbdF9hbRidRJYMRzmfX8TMOr95I2pYXRHF18MzRrvA= +github.com/consensys/gnark-crypto v0.10.0/go.mod h1:Iq/P3HHl0ElSjsg2E1gsMwhAyxnxoKK5nVyZKd+/KhU= +github.com/container-orchestrated-devices/container-device-interface v0.6.1 h1:mz77uJoP8im/4Zins+mPqt677ZMaflhoGaYrRAl5jvA= +github.com/container-orchestrated-devices/container-device-interface v0.6.1/go.mod h1:40T6oW59rFrL/ksiSs7q45GzjGlbvxnA4xaK6cyq+kA= +github.com/containerd/aufs v1.0.0 h1:2oeJiwX5HstO7shSrPZjrohJZLzK36wvpdmzDRkL/LY= +github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/btrfs/v2 v2.0.0 h1:FN4wsx7KQrYoLXN7uLP0vBV4oVWHOIKDRQ1G2Z0oL5M= +github.com/containerd/btrfs/v2 v2.0.0/go.mod h1:swkD/7j9HApWpzl8OHfrHNxppPd9l44DFZdF94BUj9k= +github.com/containerd/cgroups/v3 v3.0.2 h1:f5WFqIVSgo5IZmtTT3qVBo6TzI1ON6sycSBKkymb9L0= +github.com/containerd/cgroups/v3 v3.0.2/go.mod h1:JUgITrzdFqp42uI2ryGA+ge0ap/nxzYgkGmIcetmErE= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= -github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= +github.com/containerd/fuse-overlayfs-snapshotter v1.0.2 h1:Xy9Tkx0tk/SsMfLDFc69wzqSrxQHYEFELHBO/Z8XO3M= +github.com/containerd/fuse-overlayfs-snapshotter v1.0.2/go.mod h1:nRZceC8a7dRm3Ao6cJAwuJWPFiBPaibHiFntRUnzhwU= +github.com/containerd/go-cni v1.1.9 h1:ORi7P1dYzCwVM6XPN4n3CbkuOx/NZ2DOqy+SHRdo9rU= +github.com/containerd/go-cni v1.1.9/go.mod h1:XYrZJ1d5W6E2VOvjffL3IZq0Dz6bsVlERHbekNK90PM= +github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/go-runc v1.1.0 h1:OX4f+/i2y5sUT7LhmcJH7GYrjjhHa1QI4e8yO0gGleA= +github.com/containerd/go-runc v1.1.0/go.mod h1:xJv2hFF7GvHtTJd9JqTS2UVxMkULUYw4JN5XAUZqH5U= +github.com/containerd/imgcrypt v1.1.7 h1:WSf9o9EQ0KGHiUx2ESFZ+PKf4nxK9BcvV/nJDX8RkB4= +github.com/containerd/imgcrypt v1.1.7/go.mod h1:FD8gqIcX5aTotCtOmjeCsi3A1dHmTZpnMISGKSczt4k= +github.com/containerd/nri v0.4.0 h1:PjgIBm0RtUiFyEO6JqPBQZRQicbsIz41Fz/5VSC0zgw= +github.com/containerd/nri v0.4.0/go.mod h1:Zw9q2lP16sdg0zYybemZ9yTDy8g7fPCIB3KXOGlggXI= +github.com/containerd/stargz-snapshotter v0.14.3/go.mod h1:j2Ya4JeA5gMZJr8BchSkPjlcCEh++auAxp4nidPI6N0= +github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY= +github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= +github.com/containerd/zfs v1.1.0 h1:n7OZ7jZumLIqNJqXrEc/paBM840mORnmGdJDmAmJZHM= +github.com/containerd/zfs v1.1.0/go.mod h1:oZF9wBnrnQjpWLaPKEinrx3TQ9a+W/RJO7Zb41d8YLE= +github.com/containernetworking/cni v1.1.2 h1:wtRGZVv7olUHMOqouPpn3cXJWpJgM6+EUl31EQbXALQ= +github.com/containernetworking/cni v1.1.2/go.mod h1:sDpYKmGVENF3s6uvMvGgldDWeG8dMxakj/u+i9ht9vw= +github.com/containernetworking/plugins v1.2.0 h1:SWgg3dQG1yzUo4d9iD8cwSVh1VqI+bP7mkPDoSfP9VU= +github.com/containernetworking/plugins v1.2.0/go.mod h1:/VjX4uHecW5vVimFa1wkG4s+r/s9qIfPdqlLF4TW8c4= +github.com/containers/ocicrypt v1.1.6 h1:uoG52u2e91RE4UqmBICZY8dNshgfvkdl3BW6jnxiFaI= +github.com/containers/ocicrypt v1.1.6/go.mod h1:WgjxPWdTJMqYMjf3M6cuIFFA1/MpyyhIM99YInA+Rvc= github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible h1:bXhRBIXoTm9BYHS3gE0TtQuyNZyeEMux2sDi4oo5YOo= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-oidc v2.1.0+incompatible h1:sdJrfw8akMnCuUlaZU3tE/uYXFgfqom8DBE9so9EBsM= +github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/crate-crypto/go-ipa v0.0.0-20220523130400-f11357ae11c7 h1:6IrxszG5G+O7zhtkWxq6+unVvnrm1fqV2Pe+T95DUzw= github.com/crate-crypto/go-ipa v0.0.0-20220523130400-f11357ae11c7/go.mod h1:gFnFS95y8HstDP6P9pPwzrxOOC5TRDkwbM+ao15ChAI= github.com/crate-crypto/go-ipa v0.0.0-20230601170251-1830d0757c80 h1:DuBDHVjgGMPki7bAyh91+3cF1Vh34sAEdH8JQgbc2R0= github.com/crate-crypto/go-ipa v0.0.0-20230601170251-1830d0757c80/go.mod h1:gzbVz57IDJgQ9rLQwfSk696JGWof8ftznEL9GoAv3NI= +github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= +github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= -github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= -github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c h1:/ovYnF02fwL0kvspmy9AuyKg1JhdTRUgPw4nUxd9oZM= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= +github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE= +github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec= github.com/dave/jennifer v1.2.0 h1:S15ZkFMRoJ36mGAQgWL1tnr0NQJh9rZ8qatseX/VbBc= github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= github.com/dchest/blake512 v1.0.0 h1:oDFEQFIqFSeuA34xLtXZ/rWxCXdSjirjzPhey5EUvmA= github.com/dchest/blake512 v1.0.0/go.mod h1:FV1x7xPPLWukZlpDpWQ88rF/SFwZ5qbskrzhLMB92JI= github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= -github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= +github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= +github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= @@ -340,9 +687,11 @@ github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0 github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/deepmap/oapi-codegen v1.8.2 h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbzjuhfU= github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= +github.com/denisenkom/go-mssqldb v0.0.0-20191128021309-1d7a30a10f73 h1:OGNva6WhsKst5OZf7eZOklDztV3hwtTHovdrLHV+MsA= github.com/denisenkom/go-mssqldb v0.12.2 h1:1OcPn5GBIobjWNd+8yjfHNIaFX14B1pWI3F9HZy5KXw= github.com/denisenkom/go-mssqldb v0.12.2/go.mod h1:lnIw1mZukFRZDJYQ0Pb833QS2IaC3l5HkEfra2LJ+sk= github.com/dgraph-io/badger v1.6.0 h1:DshxFxZWXUcO0xX476VJC07Xsr6ZCBVRHKZ93Oh7Evo= +github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de h1:t0UHb5vdojIDUqktM6+xJAfScFBsVpXZmqC9dsgJmeA= @@ -352,8 +701,10 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8 h1:akOQj8IVgoeFfBTzGOEQakCYshWD6RNo1M5pivFXt70= github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954 h1:RMLoZVzv4GliuWafOuPuQDKSm1SJph7uCRnnS61JAn4= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= +github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= github.com/djherbis/atime v1.1.0 h1:rgwVbP/5by8BvvjBNrbh64Qz33idKT3pSnMSJsxhi0g= github.com/djherbis/atime v1.1.0/go.mod h1:28OF6Y8s3NQWwacXc5eZTsEsiMzp7LF8MbXE+XJPdBE= github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91 h1:Izz0+t1Z5nI16/II7vuEo/nHjodOg0p7+OiDpjX5t1E= @@ -367,8 +718,13 @@ github.com/docker/cli v20.10.17+incompatible h1:eO2KS7ZFeov5UJeaDmIs1NFEDRf32Paq github.com/docker/cli v20.10.17+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/cli v23.0.6+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/cli v24.0.7+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli-docs-tool v0.6.0 h1:Z9x10SaZgFaB6jHgz3OWooynhSa40CsWkpe5hEnG/qA= +github.com/docker/cli-docs-tool v0.6.0/go.mod h1:zMjqTFCU361PRh8apiXzeAZ1Q/xupbIwTusYpzCXS/o= +github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v1.6.2/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.7.0/go.mod h1:rETQfLdHNT3foU5kuNkFR1R1V12OJRRO5lzt2D1b5X0= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 h1:bWDMxwH3px2JBh6AyO7hdCn/PkvCZXii8TGj7sbtEbQ= github.com/dop251/goja v0.0.0-20211011172007-d99e4b8cbf48 h1:iZOop7pqsg+56twTopWgwCGxdB5SI2yDO8Ti7eTRliQ= github.com/dop251/goja v0.0.0-20211011172007-d99e4b8cbf48/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= github.com/dop251/goja v0.0.0-20211022113120-dc8c55024d06/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= @@ -385,37 +741,47 @@ github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA github.com/dop251/goja_nodejs v0.0.0-20211022123610-8dd9abb0616d h1:W1n4DvpzZGOISgp7wWNtraLcHtnmnTwBlJidqtMIuwQ= github.com/dop251/goja_nodejs v0.0.0-20211022123610-8dd9abb0616d/go.mod h1:DngW8aVqWbuLRMHItjPUyqdj+HWPvnQe8V8y1nDpIbM= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dvsekhvalnov/jose2go v0.0.0-20170216131308-f21a8cedbbae h1:UTOyRlLeWJrZx+ynml6q6qzZ1uDkJe/0Z5CMZRbEIJg= github.com/eclipse/paho.mqtt.golang v1.2.0 h1:1F8mhG9+aO5/xpdtFkW4SxOJB67ukuDC3t2y2qayIX0= github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaIu9ajZQe4kcEY9j0NsnDDBZ3o= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/elastic/go-sysinfo v1.8.1/go.mod h1:JfllUnzoQV/JRYymbH3dO1yggI3mV2oTKSXsDHM+uIM= github.com/elastic/go-sysinfo v1.10.1/go.mod h1:QElTrQ6akcnAVCRwdkZtoAkwuTv8UVM4+qe0hPxT4NU= -github.com/elastic/go-sysinfo v1.11.1/go.mod h1:6KQb31j0QeWBDF88jIdWSxE8cwoOB9tO4Y4osN7Q70E= github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= -github.com/elastic/go-windows v1.0.1/go.mod h1:FoVvqWSun28vaDQPbj2Elfc0JahhPB7WQEGa3c814Ss= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473 h1:4cmBvAEBNJaGARUEs3/suWRyfyBfhf7I60WBZq+bv2w= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.4 h1:rEvIZUSZ3fx39WIi3JkQqQBitGwpELBIYWeBVh6wn+E= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d h1:QyzYnTnPE15SQyUeqU6qLbWxMkwyAyu+vGksa0b7j00= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.11.1 h1:wSUXTlLfiAQRWs2F+p+EKOY9rUyis1MyGqJ2DIk5HpM= +github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= github.com/envoyproxy/protoc-gen-validate v0.1.0 h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y= github.com/etcd-io/bbolt v1.3.3 h1:gSJmxrs37LgTqR/oyJBWok6k6SvXEUerFTbltIhXkBM= +github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= +github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.10.13/go.mod h1:W3yfrFyL9C1pHcwY5hmRHVDaorTiQxhYBkKyu5mEDHw= github.com/ethereum/go-ethereum v1.10.26 h1:i/7d9RBBwiXCEuyduBQzJw/mKmnvzsN14jqBmytw72s= github.com/ethereum/go-ethereum v1.10.26/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= github.com/ethereum/go-ethereum v1.11.1/go.mod h1:DuefStAgaxoaYGLR0FueVcVbehmn5n9QUcVrMCuOvuc= github.com/ethereum/go-ethereum v1.11.4/go.mod h1:it7x0DWnTDMfVFdXcU6Ti4KEFQynLHVRarcSlPr0HBo= +github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= +github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072 h1:DddqAaWDpywytcG8w/qoQ5sAN8X12d3Z3koB0C3Rxsc= +github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/ferranbt/fastssz v0.1.2 h1:Dky6dXlngF6Qjc+EfDipAkE83N5I5DE68bY6O0VLNPk= +github.com/ferranbt/fastssz v0.1.2/go.mod h1:X5UPrE2u1UJjxHA8X54u04SBwdAQjG2sFtWs39YxyWs= github.com/fjl/gencodec v0.0.0-20220412091415-8bb9e558978c h1:CndMRAH4JIwxbW8KYq6Q+cGWcGHz0FjGR3QqcInWcW0= github.com/fjl/gencodec v0.0.0-20220412091415-8bb9e558978c/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e h1:bBLctRc7kr01YGvaDfgLbTwjFNW5jdp5y5rj8XXBHfY= @@ -427,16 +793,21 @@ github.com/flosch/pongo2/v4 v4.0.2 h1:gv+5Pe3vaSVmiJvh/BZa82b7/00YUGm0PIyVVLop0H github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90 h1:WXb3TSNmHp2vHoCroCIB1foO/yQ36swABL8aOVeDpgg= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/form3tech-oss/jwt-go v3.2.3+incompatible h1:7ZaBxOI7TMoYBfyA3cQHErNNyAWIKUMIwqxEtgHOs5c= +github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fxamacker/cbor/v2 v2.4.0 h1:ri0ArlOR+5XunOP8CRUowT0pSJOwhW098ZCUyskZD88= +github.com/fxamacker/cbor/v2 v2.4.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61 h1:IZqZOB2fydHte3kUgxrzK5E1fW7RQGeDwE8F/ZZnUYc= github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8= github.com/gavv/httpexpect v2.0.0+incompatible h1:1X9kcRshkSKEjNJJxX9Y9mQ5BRfbxU5kORdjhlA1yX8= github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= -github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/gballet/go-verkle v0.0.0-20220902153445-097bd83b7732 h1:AB7YjNrzlVHsYz06zCULVV2zYCEft82P86dSmtwxKL0= github.com/gballet/go-verkle v0.0.0-20220902153445-097bd83b7732/go.mod h1:o/XfIXWi4/GqbQirfRm5uTbXMG5NpqxkxblnbZ+QM9I= github.com/gballet/go-verkle v0.0.0-20230607174250-df487255f46b h1:vMT47RYsrftsHSTQhqXwC3BYflo38OLC3Y4LtXtLyU0= github.com/gballet/go-verkle v0.0.0-20230607174250-df487255f46b/go.mod h1:CDncRYVRSDqwakm282WEkjfaAj1hxU/v5RXxk5nXOiI= +github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= +github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getkin/kin-openapi v0.61.0 h1:6awGqF5nG5zkVpMsAih1QH4VgzS8phTxECUWIFo7zko= github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= @@ -445,6 +816,7 @@ github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgoo github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/gzip v0.0.6/go.mod h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk= +github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= github.com/gin-gonic/gin v1.7.4/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= @@ -453,40 +825,32 @@ github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31 h1:gclg6gY70GLy3PbkQ1AERPfmLMMagS60DKF78eWwLn8= github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/go-check/check v0.0.0-20180628173108-788fd7840127 h1:0gkP6mzaMqkmpcJYCFOLkIBwI7xFExG03bbkOkCvUPI= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-chi/chi/v5 v5.0.0 h1:DBPx88FjZJH3FsICfDAfIfnb7XxKIYVGG6lOPlhENAg= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= +github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= +github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-faster/city v1.0.1/go.mod h1:jKcUJId49qdW3L1qKHH/3wPeUstCVpVSXTM6vO3VcTw= -github.com/go-faster/errors v0.6.1/go.mod h1:5MGV2/2T9yvlrbhe9pD9LO5Z/2zCSq2T8j+Jpi2LAyY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72 h1:b+9H1GAsx5RsjvDFLoS5zkNBzIQMuVKUYQDmxU3N5XE= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 h1:WtGNWLvXpe6ZudgnXrq0barxBImvnnJoMEhXAzcbM0I= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab h1:xveKWz2iaueeTaUgdetzel+U7exyigDYBryyVfV/rZk= +github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= @@ -497,29 +861,35 @@ github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QX github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/gobwas/ws v1.1.0 h1:7RFti/xnNkMJnrK7D1yQ/iCIB5OrrY/54/H930kIbHA= github.com/gobwas/ws v1.1.0/go.mod h1:nzvNcVha5eUziGrbxFCo6qFIojQHjJV5cLYIbezhfL0= github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk= github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= +github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v3.3.0+incompatible h1:8K4tyRfvU1CYPgJsveYFQMhpFd/wXNM7iK6rR7UHz84= github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a h1:dR8+Q0uO5S2ZBcs2IH6VBKYwSxPo2vYCYq0ot0mu7xA= +github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/status v1.1.0 h1:+eIkrewn5q6b30y+g/BJINVVdi2xH7je5MPJ3ZPK3JA= +github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= @@ -529,14 +899,12 @@ github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGw github.com/golang/geo v0.0.0-20190916061304-5b978397cfec h1:lJwO/92dFXWeXOZdoGXgptLmNLwynMSHUmU6besqtiw= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7 h1:5ZkaAPbicIKTF2I64qf5Fh8Aa83Q/dnOafMYV0OMwjA= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1 h1:G5FRp8JnTd7RQH5kemVNlMeyXQAztQ3mOWV95KxsXH8= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -545,32 +913,36 @@ github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219 h1:utua3L2IbQJmauC5IXdEA547bcoU5dozgQAfc8Onsg4= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38 h1:y0Wmhvml7cGnzPa9nocn/fMraMH/lMDdeG+rkx4VgYY= +github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/cel-go v0.12.6 h1:kjeKudqV0OygrAqA9fX6J55S8gj+Jre2tckIm5RoG4M= +github.com/google/cel-go v0.12.6/go.mod h1:Jk7ljRzLBhkmiAwBoUxB1sZSCVBAzkqPF25olK/iRDw= github.com/google/flatbuffers v1.11.0 h1:O7CEyB8Cb3/DmtxODGtLHcEvpr81Jm5qLg/hsHnxA2A= github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-containerregistry v0.14.0 h1:z58vMqHxuwvAsVwvKEkmVBz2TlgBgH5k6koEXBtlYkw= +github.com/google/go-containerregistry v0.14.0/go.mod h1:aiJ2fp/SXvkWgmYHioXnbMdlgB8eXiiYOY55gfN91Wk= +github.com/google/go-pkcs11 v0.2.1-0.20230907215043-c6f79328ddf9/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= @@ -581,6 +953,7 @@ github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPg github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0 h1:pMen7vLs8nvgEYhywH3KDWJIJTeEr2ULsVWHWYHQyBs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc h1:DLpL8pWq0v4JYoRpEhDfsJhhJyGKCcQM2WPW2TJs31c= @@ -590,19 +963,30 @@ github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99 h1:Ak8CrdlwwXwAZxzS66vgPt4U8yUZX7JwLvVR58FN5jM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20230207041349-798e818bf904 h1:4/hN5RUoecvl+RmJRE2YxKWtnnQls6rQjjW5oV7qg2U= github.com/google/pprof v0.0.0-20230207041349-798e818bf904/go.mod h1:uglQLonpP8qtYCYyzA+8c/9qtqgA3qsXGYqCPKARAFg= github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/subcommands v1.2.0 h1:vWQspBTo2nEqTUFita5/KeEWlUL8kQObDFbub/EN9oE= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.5/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.4/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= @@ -612,33 +996,47 @@ github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyC github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gotestyourself/gotestyourself v1.4.0 h1:CDSlSIuRL/Fsc72Ln5lMybtrCvSRDddsHsDRG/nP7Rg= github.com/gotestyourself/gotestyourself v1.4.0/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29 h1:sezaKhEfPFg8W0Enm61B9Gs911H8iesGY5R8NDPtd1M= github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/graph-gophers/graphql-go v1.3.0 h1:Eb9x/q6MFpCLz7jBCiP/WTxjSDrYLR1QY41SORZyNJ0= github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/guptarohit/asciigraph v0.5.5 h1:ccFnUF8xYIOUPPY3tmdvRyHqmn1MYI9iv1pLKX+/ZkQ= github.com/guptarohit/asciigraph v0.5.5/go.mod h1:dYl5wwK4gNsnFf9Zp+l06rFiDZ5YtXM6x7SRWZ3KGag= -github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= -github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hanwen/go-fuse/v2 v2.2.0 h1:jo5QZYmBLNcl9ovypWaQ5yXMSSV+Ch68xoC3rtZvvBM= +github.com/hanwen/go-fuse/v2 v2.2.0/go.mod h1:B1nGE/6RBFyBRC1RRnf23UpwCdyJ31eukw34oAKukAc= +github.com/hashicorp/go-cty-funcs v0.0.0-20230405223818-a090f58aa992 h1:fYOrSfO5C9PmFGtmRWSYGqq52SOoE2dXMtAn2Xzh1LQ= +github.com/hashicorp/go-cty-funcs v0.0.0-20230405223818-a090f58aa992/go.mod h1:Abjk0jbRkDaNCzsRhOv2iDCofYpX1eVsjozoiK63qLA= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v1.2.0 h1:La19f8d7WIlm4ogzNHB0JGqs5AUDAZ2UfCY4sJXcJdM= github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-retryablehttp v0.7.2 h1:AcYqCvkpalPnPF2pn0KamgwamS42TqUDDYFRKq/RAd0= +github.com/hashicorp/go-retryablehttp v0.7.2/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= github.com/hashicorp/go-retryablehttp v0.7.4 h1:ZQgVdpTdAL7WpMIwLzCfbalOcSUdkDZnpUv3/+BxzFA= github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.0 h1:3vNe/fWF5CBgRIguda1meWhsZHy3m8gCJ5wx+dIzX/E= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/hcl/v2 v2.19.1 h1://i05Jqznmb2EXqa39Nsvyan2o5XyMowW5fnCKW5RPI= +github.com/hashicorp/hcl/v2 v2.19.1/go.mod h1:ThLC89FV4p9MPW804KVbe/cEXoQ8NZEh+JtMeeGErHE= github.com/holiman/big v0.0.0-20221017200358-a027dc42d04e h1:pIYdhNkDh+YENVNi3gto8n9hAmRxKxoar0iE6BLucjw= github.com/holiman/big v0.0.0-20221017200358-a027dc42d04e/go.mod h1:j9cQbcqHQujT0oKJ38PylVfqohClLr3CvDC+Qcg+lhU= github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= -github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/holiman/uint256 v1.2.3/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= @@ -647,8 +1045,10 @@ github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSa github.com/huin/goupnp v1.0.3/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150 h1:vlNjIqmUZ9CMAWsbURYl3a6wZbw7q5RHVvlXTNS/Bs8= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= +github.com/hydrogen18/memlistener v0.0.0-20141126152155-54553eb933fb h1:EPRgaDqXpLFUJLXZdGLnBTy1l6CLiNAPnvn2l+kHit0= github.com/hydrogen18/memlistener v0.0.0-20141126152155-54553eb933fb/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91 h1:KyZDvZ/GGn+r+Y3DKZ7UOQ/TP4xV6HNkrwiVMB1GnNY= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6 h1:UDMh68UUwekSh5iP2OMhRRZJiiBccgV7axzUG8vi56c= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2 h1:rcanfLhLDA8nozr/K289V1zcntHr3V+SHlXwzz1ZI2g= @@ -658,10 +1058,9 @@ github.com/iden3/go-iden3-crypto v0.0.14/go.mod h1:dLpM4vEPJ3nDHzhWFXDjzkn1qHoBe github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/imdario/mergo v0.3.15/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= -github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk= +github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/flux v0.65.1 h1:77BcVUCzvN5HMm8+j9PRBQ4iZcu98Dl4Y9rf+J5vhnc= github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= github.com/influxdata/influxdb v1.8.3 h1:WEypI1BQFTT4teLM+1qkEcvUi0dAvopAI/ir0vAiBg8= @@ -684,8 +1083,12 @@ github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9 h1:MHTrDWmQpHq/ github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368 h1:+TUUmaFa4YD1Q+7bH9o5NCHQGPMqZCYJiNW6lIIS9z4= github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= +github.com/intel/goresctrl v0.3.0 h1:K2D3GOzihV7xSBedGxONSlaw/un1LZgWsc9IfqipN4c= +github.com/intel/goresctrl v0.3.0/go.mod h1:fdz3mD85cmP9sHD8JUlrNWAxvwM86CrbmVXltEKd7zk= github.com/iris-contrib/blackfriday v2.0.0+incompatible h1:o5sHQHHm0ToHUlAJSTjW9UWicjJSDDauOOQ2AHuIVp4= +github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= github.com/iris-contrib/go.uuid v2.0.0+incompatible h1:XZubAYg61/JwnJNbZilGjf3b3pB80+OQg2qf6c8BfWE= +github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= github.com/iris-contrib/httpexpect/v2 v2.3.1 h1:A69ilxKGW1jDRKK5UAhjTL4uJYh3RjD4qzt9vNZ7fpY= github.com/iris-contrib/httpexpect/v2 v2.3.1/go.mod h1:ICTf89VBKSD3KB0fsyyHviKF8G8hyepP0dOXJPWz3T0= github.com/iris-contrib/httpexpect/v2 v2.12.1/go.mod h1:7+RB6W5oNClX7PTwJgJnsQP3ZuUUYB3u61KCqeSgZ88= @@ -694,6 +1097,8 @@ github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62 github.com/iris-contrib/jade v1.1.4 h1:WoYdfyJFfZIUgqNAeOyRfTNQZOksSlZ6+FnXR3AEpX0= github.com/iris-contrib/jade v1.1.4/go.mod h1:EDqR+ur9piDl6DUgs6qRrlfzmlx/D5UybogqrXvJTBE= github.com/iris-contrib/pongo2 v0.0.1 h1:zGP7pW51oi5eQZMIlGA3I+FHY9/HOQWDB+572yin0to= +github.com/iris-contrib/schema v0.0.1 h1:10g/WnoRR+U+XXHWKBHeNy/+tZmM2kcAVGLOsz+yaDA= +github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/iris-contrib/schema v0.0.6 h1:CPSBLyx2e91H2yJzPuhGuifVRnZBBJ3pCOMbOvPZaTw= github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= @@ -726,18 +1131,13 @@ github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267/go.mod h1:h1n github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89 h1:12K8AlpT0/6QUXSfV0yi4Q0jkbq8NDtIKFtF61AoqV0= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= -github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/josephspurrier/goversioninfo v1.4.0 h1:Puhl12NSHUSALHSuzYwPYQkqa2E1+7SrtAPJorKK0C8= +github.com/josephspurrier/goversioninfo v1.4.0/go.mod h1:JWzv5rKQr+MmW+LvM412ToT/IkYDZjaclF2pKDss8IY= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/jrick/logrotate v1.0.0 h1:lQ1bL/n9mBNeIXoTUoYRlK4dHuNJVofX9oWqBtPnSzI= github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -750,9 +1150,9 @@ github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5 h1:rhqTjzJlm7EbkELJDKM github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= github.com/juju/loggo v0.0.0-20180524022052-584905176618 h1:MK144iBQF9hTSwBW/9eJm034bVoG30IshVm688T2hi8= github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= +github.com/juju/loggo v0.0.0-20190526231331-6e530bcce5d8 h1:UUHMLvzt/31azWTN/ifGWef4WUqvXk0iRqdhdy/2uzI= github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073 h1:WQM1NildKThwdP7qWrNAFGzp4ijNLw8RlgENkaI4MJs= github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5 h1:PJr+ZMXIecYc1Ey2zucXdR73SMBtgjPgwa31099IMv0= @@ -760,6 +1160,7 @@ github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef h1:2jNeR4YUziVtswNP9sEFAI913cVrzH85T+8Q6LpYbT0= github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/karalabe/usb v0.0.0-20211005121534-4c5740d64559 h1:0VWDXPNE0brOek1Q8bLfzKkvOzwbQE/snjGojlCr8CY= github.com/karalabe/usb v0.0.0-20211005121534-4c5740d64559/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/karalabe/usb v0.0.2 h1:M6QQBNxF+CQ8OFvxrT90BA0qBOXymndZnk5q235mFc4= @@ -768,18 +1169,22 @@ github.com/karalabe/usb v0.0.3-0.20230711191512-61db3e06439c h1:AqsttAyEyIEsNz5W github.com/karalabe/usb v0.0.3-0.20230711191512-61db3e06439c/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/kataras/blocks v0.0.7 h1:cF3RDY/vxnSRezc7vLFlQFTYXG/yAr1o7WImJuZbzC4= github.com/kataras/blocks v0.0.7/go.mod h1:UJIU97CluDo0f+zEjbnbkeMRlvYORtmc1304EeyXf4I= +github.com/kataras/golog v0.0.9 h1:J7Dl82843nbKQDrQM/abbNJZvQjS6PfmkkffhOTXEpM= github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk= github.com/kataras/golog v0.1.7 h1:0TY5tHn5L5DlRIikepcaRR/6oInIr9AiWsxzt0vvlBE= github.com/kataras/golog v0.1.7/go.mod h1:jOSQ+C5fUqsNSwurB/oAHq1IFSb0KI3l6GMa7xB6dZA= +github.com/kataras/iris/v12 v12.0.1 h1:Wo5S7GMWv5OAzJmvFTvss/C4TS1W0uo6LkDlSymT4rM= github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U= github.com/kataras/iris/v12 v12.2.0-beta5 h1:grB/oCf5baZhmYIeDMfgN3LYrtEcmK8pbxlRvEZ2pgw= github.com/kataras/iris/v12 v12.2.0-beta5/go.mod h1:q26aoWJ0Knx/00iPKg5iizDK7oQQSPjbD8np0XDh6dc= github.com/kataras/jwt v0.1.8 h1:u71baOsYD22HWeSOg32tCHbczPjdCk7V4MMeJqTtmGk= github.com/kataras/jwt v0.1.8/go.mod h1:Q5j2IkcIHnfwy+oNY3TVWuEBJNw0ADgCcXK9CaZwV4o= +github.com/kataras/neffos v0.0.10 h1:O06dvQlxjdWvzWbm2Bq+Si6psUhvSmEctAMk9Xujqms= github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw= github.com/kataras/neffos v0.0.14 h1:pdJaTvUG3NQfeMbbVCI8JT2T5goPldyyfUB2PJfh1Bs= github.com/kataras/neffos v0.0.20 h1:swTzKZ3Mo2sIQ8ATKSKf0xDG1tuhr6w4tZmmRsvCYlg= github.com/kataras/neffos v0.0.20/go.mod h1:srdvC/Uo8mgrApWW0AYtiiLgMbyNPf69qPsd2FhE6MQ= +github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d h1:V5Rs9ztEWdp58oayPq/ulmlqJJZeJP6pP79uP3qjcao= github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= github.com/kataras/pio v0.0.10/go.mod h1:gS3ui9xSD+lAUpbYnjOGiQyY7sUMJO+EHpiRzhtZ5no= github.com/kataras/pio v0.0.11 h1:kqreJ5KOEXGMwHAWHDwIl+mjfNCPhAwZPa8gK7MKlyw= @@ -788,13 +1193,13 @@ github.com/kataras/sitemap v0.0.6 h1:w71CRMMKYMJh6LR2wTgnk5hSgjVNB9KL60n5e2KHvLY github.com/kataras/sitemap v0.0.6/go.mod h1:dW4dOCNs896OR1HmG+dMLdT7JjDk7mYBzoIRwuj5jA4= github.com/kataras/tunnel v0.0.4 h1:sCAqWuJV7nPzGrlb0os3j49lk2JhILT0rID38NHNLpA= github.com/kataras/tunnel v0.0.4/go.mod h1:9FkU4LaeifdMWqZu7o20ojmW4B7hdhv2CMLwfnHGpYw= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kilic/bls12-381 v0.1.0 h1:encrdjqKMEvabVQ7qYOKu1OvhqpK4s47wDYtNiPtlp4= github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY= github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 h1:FOOIBWrEkLgmlgGfMuZT83xIwfPDxEI2OHu6xUmJMFE= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.4.0 h1:8nsMz3tWa9SWWPL60G1V6CUsf4lLjWLTNEtibhe8gh8= github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= @@ -812,6 +1217,7 @@ github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5 h1:2U0HzY8BJ8hVwDK github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid v1.2.1 h1:vJi+O/nMdFt0vqm8NZBI6wzALWdA2X+egi0ogNyrC/w= github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6 h1:KAZ1BW2TCmT6PRihDPpocIy1QTtsAsrx6TneU/4+CMg= github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= @@ -819,11 +1225,10 @@ github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada h1:3L+neHp83cTje github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/knz/go-libedit v1.10.1 h1:0pHpWtx9vcvC0xGZqEQlQdfSQs7WRlAjuPvk3fOZDCo= github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= @@ -836,18 +1241,29 @@ github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0 github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/labstack/gommon v0.3.1 h1:OomWaJXm7xR6L1HmEtGyQf26TEn7V6X88mktX9kee9o= github.com/labstack/gommon v0.3.1/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= -github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= +github.com/lestrrat-go/backoff/v2 v2.0.8 h1:oNb5E5isby2kiro9AgdHLv5N5tint1AnDVVf2E2un5A= +github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= +github.com/lestrrat-go/blackmagic v1.0.0 h1:XzdxDbuQTz0RZZEmdU7cnQxUtFUzgCSPq8RCz4BxIi4= +github.com/lestrrat-go/blackmagic v1.0.0/go.mod h1:TNgH//0vYSs8VXDCfkZLgIrVTTXQELZffUV0tz3MtdQ= +github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE= +github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= +github.com/lestrrat-go/iter v1.0.1 h1:q8faalr2dY6o8bV45uwrxq12bRa1ezKrB6oM9FUgN4A= +github.com/lestrrat-go/iter v1.0.1/go.mod h1:zIdgO1mRKhn8l9vrZJZz9TUMMFbQbLeTsbqPDrJ/OJc= +github.com/lestrrat-go/jwx v1.2.25 h1:tAx93jN2SdPvFn08fHNAhqFJazn5mBBOB8Zli0g0otA= +github.com/lestrrat-go/jwx v1.2.25/go.mod h1:zoNuZymNl5lgdcu6P7K6ie2QRll5HVfF4xwxBBK1NxY= +github.com/lestrrat-go/option v1.0.0 h1:WqAWL8kh8VcSoD6xjSH34/1m8yxluXQbDeKNfvFeEO4= +github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3 h1:jUp75lepDg0phMUJBCmvaeFDldD2N3S1lBuPwUTszio= +github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= +github.com/lyft/protoc-gen-star/v2 v2.0.3/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailgun/raymond/v2 v2.0.46 h1:aOYHhvTpF5USySJ0o7cpPno/Uh2I5qg2115K25A+Ft4= github.com/mailgun/raymond/v2 v2.0.46/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd h1:HvFwW+cm9bCbZ/+vuGNq7CRWXql8c0y8nGeYpqmpvmk= @@ -855,7 +1271,6 @@ github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIG github.com/matryer/try v0.0.0-20161228173917-9ac251b645a2 h1:JAEbJn3j/FrhdWA9jW8B5ajsLIjeuEHLi8xE4fk997o= github.com/matryer/try v0.0.0-20161228173917-9ac251b645a2/go.mod h1:0KeJpeMD6o+O4hW7qJOT7vyQPKrWmj26uf5wMc/IiIs= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -866,14 +1281,12 @@ github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d h1:oNAwILwmgWKFpu github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104 h1:d8RFOZ2IiFtFWBcKEHAFYJcPTf0wY5q0exFNJZVWa1U= @@ -881,32 +1294,42 @@ github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4f github.com/mattn/goveralls v0.0.2 h1:7eJB6EqsPhRVxvwEXGnqdO2sJI0PTsrWoTMXEk9/OQc= github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed h1:3dQJqqDouawQgl3gBE1PNHKFkJYGEuFb1DbSlaxdosE= github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg= +github.com/mediocregopher/radix/v3 v3.3.0 h1:oacPXPKHJg0hcngVVrdtTnfGJiS+PtwoQwTBZGFlV4k= github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ= github.com/mediocregopher/radix/v3 v3.4.2 h1:galbPBjIwmyREgwGCfQEN4X8lxbJnKBYurgz+VfcStA= github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= github.com/mediocregopher/radix/v3 v3.8.0 h1:HI8EgkaM7WzsrFpYAkOXIgUKbjNonb2Ne7K6Le61Pmg= github.com/mediocregopher/radix/v3 v3.8.0/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= +github.com/microcosm-cc/bluemonday v1.0.2 h1:5lPfLTTAvAbtS0VqT+94yOtFnGfUWYyx0+iToC3Os3s= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/microcosm-cc/bluemonday v1.0.21 h1:dNH3e4PSyE4vNX+KlRGHT5KrSvjeUkoNPwEORjffHJg= github.com/microcosm-cc/bluemonday v1.0.21/go.mod h1:ytNkv4RrDrLJ2pqlsSI46O6IVXmZOBBD4SaJyDwwTkM= github.com/microsoft/go-mssqldb v0.21.0/go.mod h1:+4wZTUnz/SV6nffv+RRRB/ss8jPng5Sho2SmM1l2ts4= github.com/microsoft/go-mssqldb v1.6.0 h1:mM3gYdVwEPFrlg/Dvr2DNVEgYFG7L42l+dGc67NNNpc= github.com/microsoft/go-mssqldb v1.6.0/go.mod h1:00mDtPbeQCRGC1HwOOR5K/gr30P1NcEG0vx6Kbv2aJU= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= +github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mistifyio/go-zfs/v3 v3.0.1 h1:YaoXgBePoMA12+S1u/ddkv+QqxcfiZK4prI6HPnkFiU= +github.com/mistifyio/go-zfs/v3 v3.0.1/go.mod h1:CzVgeB0RvF2EGzQnytKVvVSDwmKJXxkOTUGbNrTja/k= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= +github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4= +github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/mmcloughlin/profile v0.1.1 h1:jhDmAqPyebOsVDOCICJoINoLb/AnLBaUw58nFzxWS2w= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/moby/sys/mount v0.3.3 h1:fX1SVkXFJ47XWDoeFW4Sq7PdQJnV2QIDZAqjNqgEjUs= +github.com/moby/sys/mount v0.3.3/go.mod h1:PBaEorSNTLG5t/+4EgukEQVlAvVEc6ZjTySwKdqp5K0= +github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5 h1:8Q0qkMVC/MmWkpIdlvZgcv2o2jrlF6zqVOh7W5YHdMA= github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= @@ -916,9 +1339,10 @@ github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOA github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae h1:VeRdUYdCw49yizlSbMEn2SZ+gT+3IUKx8BqxyQdz+BY= github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223 h1:F9x/1yl3T2AeKLr2AMdilSD8+f9bvMnNN8VS5iDtovc= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hzifhks= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 h1:shk/vn9oCoOTmwcouEdwIeOtOGA/ELRUw/GwvxwfT+0= @@ -928,11 +1352,13 @@ github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5Vgl github.com/nats-io/jwt/v2 v2.3.0 h1:z2mA1a7tIf5ShggOFlR1oBPgd6hGqcDYsISxZByUzdI= github.com/nats-io/jwt/v2 v2.3.0/go.mod h1:0tqz9Hlu6bCBFLWAASKhE5vUA4c24L9KPUUgvwumE/k= github.com/nats-io/nats-server/v2 v2.9.11/go.mod h1:b0oVuxSlkvS3ZjMkncFeACGyZohbO4XhSqW1Lt7iRRY= +github.com/nats-io/nats.go v1.8.1 h1:6lF/f1/NN6kzUDBz6pyvQDEXO39jqXcWRLu/tKjtOUQ= github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= github.com/nats-io/nats.go v1.9.1 h1:ik3HbLhZ0YABLto7iX80pZLPw/6dx3T+++MZJwLnMrQ= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= github.com/nats-io/nats.go v1.16.0 h1:zvLE7fGBQYW6MWaFaRdsgm9qT39PJDQoju+DS8KsO1g= github.com/nats-io/nats.go v1.16.0/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= +github.com/nats-io/nkeys v0.0.2 h1:+qM7QpgXnvDDixitZtQUBDY9w/s9mu1ghS+JIbsrx6M= github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= github.com/nats-io/nkeys v0.1.0 h1:qMd4+pRHgdr1nAClu+2h/2a5F2TmKcCzjCDazVgRoX4= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= @@ -945,36 +1371,32 @@ github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJE github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c h1:bY6ktFuJkt+ZXkX0RChQch2FtHpWQLVS8Qo1YasiIVk= github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.10.3 h1:OoxbjfXVZyod1fmWYhI7SEyaD8B00ynP3T+D5GiyHOY= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.7.0 h1:/XxtEV3I3Eif/HobnVx9YmJgk8ENdRsuUmM+fLCFNow= -github.com/onsi/ginkgo/v2 v2.8.1 h1:xFTEVwOFa1D/Ty24Ws1npBWkDYEV9BqZrsDxVrVkrrU= -github.com/onsi/ginkgo/v2 v2.8.1/go.mod h1:N1/NbDngAFcSLdyZ+/aYTYGSlq9qMCS/cNKGJjy+csc= github.com/onsi/gomega v1.7.1 h1:K0jcRCwNQM3vFGh1ppMtDh/+7ApJrjldlX8fA0jDTLQ= +github.com/open-policy-agent/opa v0.42.2 h1:qocVAKyjrqMjCqsU02S/gHyLr4AQQ9xMtuV1kKnnyhM= +github.com/open-policy-agent/opa v0.42.2/go.mod h1:MrmoTi/BsKWT58kXlVayBb+rYVeaMwuBm3nYAN3923s= github.com/opencontainers/runc v1.1.3 h1:vIXrkId+0/J2Ymu2m7VjGvbSlAId9XNRPhn2p4b+d8w= github.com/opencontainers/runc v1.1.3/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= github.com/opencontainers/runc v1.1.7/go.mod h1:CbUumNnWCuTGFukNXahoo/RFBZvDAgRh/smNYNOhA50= -github.com/opencontainers/runc v1.1.10/go.mod h1:+/R6+KmDlh+hOO8NkjmgkG9Qzvypzk0yXxAPYYR65+M= +github.com/opencontainers/runtime-tools v0.9.1-0.20221107090550-2e043c6bd626 h1:DmNGcqH3WDbV5k8OJ+esPWbqUOX5rMLR2PMvziDMJi0= +github.com/opencontainers/runtime-tools v0.9.1-0.20221107090550-2e043c6bd626/go.mod h1:BRHJJd0E+cx42OybVYSgUvZmU0B8P9gZuRXlZUP7TKI= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/ory/dockertest/v3 v3.9.1 h1:v4dkG+dlu76goxMiTT2j8zV7s4oPPEppKT8K8p2f1kY= github.com/ory/dockertest/v3 v3.9.1/go.mod h1:42Ir9hmvaAPm0Mgibk6mBPi7SFvTXxEcnztDYOJ//uM= -github.com/ory/dockertest/v3 v3.10.0/go.mod h1:nr57ZbRWMqfsdGdFNLHz5jjNdDb7VVFnzAeW1n5N1Lg= +github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU= +github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w= +github.com/package-url/packageurl-go v0.1.1-0.20220428063043-89078438f170 h1:DiLBVp4DAcZlBVBEtJpNWZpZVq0AEeCY7Hqk8URVs4o= +github.com/package-url/packageurl-go v0.1.1-0.20220428063043-89078438f170/go.mod h1:uQd4a7Rh3ZsVg5j0lNyAfyxIeGde9yrlhjF78GzeW0c= github.com/paulbellamy/ratecounter v0.2.0 h1:2L/RhJq+HA8gBQImDXtLPrDXK5qAj6ozWVK/zFXVJGs= github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= github.com/paulmach/orb v0.7.1 h1:Zha++Z5OX/l168sqHK3k4z18LDvr+YAO/VjK0ReQ9rU= github.com/paulmach/orb v0.7.1/go.mod h1:FWRlTgl88VI1RBx/MkrwWDRhQ96ctqMCh8boXhmqB/A= github.com/paulmach/orb v0.9.2/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU= -github.com/paulmach/orb v0.10.0/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU= github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= @@ -982,6 +1404,8 @@ github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwb github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/penglongli/gin-metrics v0.1.10/go.mod h1:wxGsGUwpVGv3hmYSxQn2GZgRL3YuCgiRFq2d0X6+EOU= +github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 h1:oYW+YCJ1pachXTQmzR3rNLYGGz4g/UgFcjb28p/viDM= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= @@ -992,63 +1416,59 @@ github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi github.com/pierrec/lz4/v4 v4.1.15 h1:MO0/ucJhngq7299dKLwIMtgTfbkoSPF6AoMYDd8Q4q0= github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.17/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4 h1:Qj1ukM4GlMWXNdMBuXcXfz/Kw9s1qm0CLY32QxuSImI= github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.5.0 h1:042Buzk+NhDI+DeSAA62RwJL8VAuZUMQZUjCsRz1Mug= +github.com/pkg/profile v1.5.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18= github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5 h1:tFwafIEMf0B7NlcxV/zJ6leBIa81D3hgGSgsE5hCkOQ= github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8cTqKc= +github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI= github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= github.com/pressly/goose/v3 v3.11.2 h1:QgTP45FhBBHdmf7hWKlbWFHtwPtxo0phSDkwDKGUrYs= github.com/pressly/goose/v3 v3.11.2/go.mod h1:LWQzSc4vwfHA/3B8getTp8g3J5Z8tFBxgxinmGlMlJk= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x7enabFceM= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.0/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.6.0 h1:kRhiuYSXR3+uv2IbVbZhUxK5zVD/2pp3Gd2PpvPkpEo= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/common v0.39.0/go.mod h1:6XBZ7lYdLCbkAVhwRsWTZn+IN5AB9F/NXd5w0BbEX0Y= github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2 h1:6LJUbpNm42llc4HRCuvApCSWB/WfhuNo9K98Q9sNGfs= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7 h1:cZC+usqsYgHtlBaGulVnZ1hfKAi8iWtujBnRLQE698c= github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7/go.mod h1:IToEjHuttnUzwZI5KBSM/LOOW3qLbbrHOEfp3SbECGY= +github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48 h1:cSo6/vk8YpvkLbk9v3FO97cakNmUoxwi2KMP8hd5WIw= +github.com/prysmaticlabs/gohashtree v0.0.1-alpha.0.20220714111606-acbb2962fb48/go.mod h1:4pWaT30XoEx1j8KNJf3TV+E3mQkaufn7mf+jRNb/Fuk= +github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0 h1:MkV+77GLUNo5oJ0jf870itWm3D0Sjh7+Za9gazKc5LQ= +github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52 h1:RnWNS9Hlm8BIkjr6wx8li5abe0fr73jljLycdfemTp0= github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= +github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= @@ -1071,12 +1491,12 @@ github.com/scroll-tech/go-ethereum v1.10.14-0.20230321020420-127af384ed04/go.mod github.com/scroll-tech/go-ethereum v1.10.14-0.20230802095950-4b2bbf6225e7/go.mod h1:DiN3p2inoXOxGffxSswDKqWjQ7bU+Mp0c9v0XQXKmaA= github.com/scroll-tech/go-ethereum v1.10.14-0.20230829000527-f883dcdc21fc/go.mod h1:DiN3p2inoXOxGffxSswDKqWjQ7bU+Mp0c9v0XQXKmaA= github.com/scroll-tech/zktrie v0.6.0/go.mod h1:XvNo7vAk8yxNyTjBDj5WIiFzYW4bx/gJ78+NK6Zn6Uk= -github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/segmentio/kafka-go v0.2.0 h1:HtCSf6B4gN/87yc5qTl7WsxPKQIIGXLPPM1bMCPOsoY= github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= @@ -1091,17 +1511,17 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5I github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546 h1:pXY9qYc/MP5zdvqWEUH6SjNiu7VhSjuVFTFiTcphaLU= github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= +github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= @@ -1113,26 +1533,35 @@ github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJ github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2 h1:VUFqw5KcqRf7i70GOzW7N+Q7+gxVBkSSqiXB12+JQ4M= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spiffe/go-spiffe/v2 v2.1.1 h1:RT9kM8MZLZIsPTH+HKQEP5yaAk3yd/VBzlINaRjXs8k= +github.com/spiffe/go-spiffe/v2 v2.1.1/go.mod h1:5qg6rpqlwIub0JAiF1UK9IMD6BpPTmvG6yfSgDBs5lg= github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980 h1:lIOOHPEbXzO3vnmx2gok1Tfs31Q8GQqKLc8vVqyQq/I= +github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= +github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/tchap/go-patricia/v2 v2.3.1 h1:6rQp39lgIYZ+MHmdEq4xzuk1t7OdC35z/xm0BGhTkes= +github.com/tchap/go-patricia/v2 v2.3.1/go.mod h1:VZRHKAb53DLaG+nA9EaYYiaEx6YztwDlLElMsnSHD4k= github.com/tdewolff/minify/v2 v2.12.4 h1:kejsHQMM17n6/gwdw53qsi6lg0TGddZADVyQOz1KMdE= github.com/tdewolff/minify/v2 v2.12.4/go.mod h1:h+SRvSIX3kwgwTFOpSckvSxgax3uy8kZTSF1Ojrr3bk= github.com/tdewolff/parse/v2 v2.6.4 h1:KCkDvNUMof10e3QExio9OPZJT8SbdKojLBumw8YZycQ= github.com/tdewolff/parse/v2 v2.6.4/go.mod h1:woz0cgbLwFdtbjJu8PIKxhW05KplTFQkOdX78o+Jgrs= github.com/tdewolff/test v1.0.7 h1:8Vs0142DmPFW/bQeHRP3MV19m1gvndjUb1sn8yy74LM= github.com/tdewolff/test v1.0.7/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= +github.com/testcontainers/testcontainers-go v0.28.0/go.mod h1:COlDpUXbwW3owtpMkEB1zo9gwb1CoKVKlyrVPejF4AU= +github.com/testcontainers/testcontainers-go/modules/compose v0.28.0/go.mod h1:lShXm8oldlLck3ltA5u+ShSvUnZ+wiNxwpp8wAQGZ1Y= +github.com/testcontainers/testcontainers-go/modules/postgres v0.28.0/go.mod h1:fXgcYpbyrduNdiz2qRZuYkmvqLnEqsjbQiBNYH1ystI= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tinylib/msgp v1.0.2 h1:DfdQrzQa7Yh2es9SuLkixqxuXS2SxsdYn0KbdrOGWD8= github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= @@ -1140,6 +1569,12 @@ github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITn github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= +github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 h1:uruHq4dN7GR16kFc5fp3d1RIYzJW5onx8Ybykw2YQFA= +github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tonistiigi/go-actions-cache v0.0.0-20220404170428-0bdeb6e1eac7 h1:8eY6m1mjgyB8XySUR7WvebTM8D/Vs86jLJzD/Tw7zkc= +github.com/tonistiigi/go-actions-cache v0.0.0-20220404170428-0bdeb6e1eac7/go.mod h1:qqvyZqkfwkoJuPU/bw61bItaoO0SJ8YSW0vSVRRvsRg= +github.com/tonistiigi/go-archvariant v1.0.0 h1:5LC1eDWiBNflnTF1prCiX09yfNHIxDC/aukdhCdTyb0= +github.com/tonistiigi/go-archvariant v1.0.0/go.mod h1:TxFmO5VS6vMq2kvs3ht04iPXtu2rUT/erOnGFYfk5Ho= github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= @@ -1147,12 +1582,15 @@ github.com/ugorji/go v1.2.7 h1:qYhyWUUd6WbiM+C6JZAUkIJt/1WrjzNHY9+KCIjVqTo= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= +github.com/urfave/cli v1.22.12 h1:igJgVw1JdKH+trcLWLeLwZjU9fEfPesQ+9/e4MQ44S8= +github.com/urfave/cli v1.22.12/go.mod h1:sSBEIC79qR6OvcmsD4U3KABeOTxDqQtdDnaFuUN30b8= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/urfave/cli/v2 v2.17.2-0.20221006022127-8f469abc00aa/go.mod h1:1CNUng3PtjQMtRzJO4FMXBQvkGtuYRxxiR9xMa7jMwI= github.com/urfave/negroni v1.0.0 h1:kIimOitoypq34K7TG7DUaJ9kq/N4Ofuwi1sjz0KipXc= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.6.0 h1:uWF8lgKmeaIewWVPwi4GRq2P6+R46IgYZdxWtM+GtEY= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= github.com/valyala/fasthttp v1.40.0 h1:CRq/00MfruPGFLTQKY8b+8SfdK60TxNztjRMnH0t1Yc= github.com/valyala/fasthttp v1.40.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I= @@ -1163,28 +1601,38 @@ github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a h1:0R4NLDRDZX6Jc github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -github.com/vertica/vertica-sql-go v1.3.3/go.mod h1:jnn2GFuv+O2Jcjktb7zyc4Utlbu9YVqpHH/lx63+1M4= +github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= +github.com/vektah/gqlparser/v2 v2.4.5 h1:C02NsyEsL4TXJB7ndonqTfuQOL4XPIu0aAWugdmTgmc= +github.com/vektah/gqlparser/v2 v2.4.5/go.mod h1:flJWIR04IMQPGz+BXLrORkrARBxv/rtyIAFvd/MceW0= +github.com/veraison/go-cose v1.0.0-rc.1 h1:4qA7dbFJGvt7gcqv5MCIyCQvN+NpHFPkW7do3EeDLb8= +github.com/veraison/go-cose v1.0.0-rc.1/go.mod h1:7ziE85vSq4ScFTg6wyoMXjucIGOf4JkFEZi/an96Ct4= +github.com/vishvananda/netlink v1.2.1-beta.2 h1:Llsql0lnQEbHj0I1OuKyp8otXp0r3q0mPkuhwHfStVs= +github.com/vishvananda/netlink v1.2.1-beta.2/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvVn1ZaTIVp+3vuYAXFe3OJEvjbUYJLaA= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU= github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= github.com/willf/bitset v1.1.3 h1:ekJIKh6+YbUIVt9DfNbkR5d6aFcFTLDRyJNAACURBg8= github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xhit/go-str2duration v1.2.0 h1:BcV5u025cITWxEQKGWr1URRzrcXtu7uk8+luz3Yuhwc= +github.com/xhit/go-str2duration v1.2.0/go.mod h1:3cPSlfZlUHVlneIVfePFWcJZsuwf+P1v2SRTV4cUmp4= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6 h1:YdYsPAZ2pC6Tow/nPZOPQ96O3hm/ToAkGsPLzedXERk= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/ydb-platform/ydb-go-genproto v0.0.0-20231012155159-f85a672542fd/go.mod h1:Er+FePu1dNUieD+XTMDduGpQuCPssK5Q4BjF+IIXJ3I= -github.com/ydb-platform/ydb-go-sdk/v3 v3.54.2/go.mod h1:fjBLQ2TdQNl4bMjuWl9adoTGBypwUTPoGC+EqYqiIcU= +github.com/yashtewari/glob-intersection v0.1.0 h1:6gJvMYQlTDOL3dMsPF6J0+26vwX9MB8/1q3uAdhmTrg= +github.com/yashtewari/glob-intersection v0.1.0/go.mod h1:LK7pIC3piUjovexikBbJ26Yml7g8xa5bsjfx2v1fwok= github.com/yosssi/ace v0.0.5 h1:tUkIP/BLdKqrlrPwcmH0shwEEhTRHoGnc1wFIWmaBUA= github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= @@ -1198,11 +1646,32 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= +github.com/zclconf/go-cty v1.14.1 h1:t9fyA35fwjjUMcmL5hLER+e/rEPqrbCK1/OSE4SI9KA= +github.com/zclconf/go-cty v1.14.1/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= +github.com/zeebo/errs v1.2.2 h1:5NFypMTuSdoySVTqlNs1dEoU21QVamMQJxW/Fii5O7g= +github.com/zeebo/errs v1.2.2/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs= github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= +go.etcd.io/etcd/api/v3 v3.5.5 h1:BX4JIbQ7hl7+jL+g+2j5UAr0o1bctCm6/Ct+ArBGkf0= +go.etcd.io/etcd/api/v3 v3.5.5/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= +go.etcd.io/etcd/client/pkg/v3 v3.5.5 h1:9S0JUVvmrVl7wCF39iTQthdaaNIiAaQbmK75ogO6GU8= +go.etcd.io/etcd/client/pkg/v3 v3.5.5/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ= +go.etcd.io/etcd/client/v2 v2.305.5 h1:DktRP60//JJpnPC0VBymAN/7V71GHMdjDCBt4ZPXDjI= +go.etcd.io/etcd/client/v2 v2.305.5/go.mod h1:zQjKllfqfBVyVStbt4FaosoX2iYd8fV/GRy/PbowgP4= +go.etcd.io/etcd/client/v3 v3.5.5 h1:q++2WTJbUgpQu4B6hCuT7VkdwaTP7Qz6Daak3WzbrlI= +go.etcd.io/etcd/client/v3 v3.5.5/go.mod h1:aApjR4WGlSumpnJ2kloS75h6aHUmAyaPLjHMxpc7E7c= +go.etcd.io/etcd/pkg/v3 v3.5.5 h1:Ablg7T7OkR+AeeeU32kdVhw/AGDsitkKPl7aW73ssjU= +go.etcd.io/etcd/pkg/v3 v3.5.5/go.mod h1:6ksYFxttiUGzC2uxyqiyOEvhAiD0tuIqSZkX3TyPdaE= +go.etcd.io/etcd/raft/v3 v3.5.5 h1:Ibz6XyZ60OYyRopu73lLM/P+qco3YtlZMOhnXNS051I= +go.etcd.io/etcd/raft/v3 v3.5.5/go.mod h1:76TA48q03g1y1VpTue92jZLr9lIHKUNcYdZOOGyx8rI= +go.etcd.io/etcd/server/v3 v3.5.5 h1:jNjYm/9s+f9A9r6+SC4RvNaz6AqixpOvhrFdT0PvIj0= +go.etcd.io/etcd/server/v3 v3.5.5/go.mod h1:rZ95vDw/jrvsbj9XpTqPrTAB9/kzchVdhRirySPkUBc= go.etcd.io/gofail v0.1.0 h1:XItAMIhOojXFQMgrxjnd2EIIHun/d5qL0Pf7FzVTkFg= go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1 h1:A/5uWzF44DlIgdm/PQFwfMkW0JX+cIcQi/SwLAmZP5M= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2 h1:75k/FF0Q2YM8QYo07VPddOLBslDt1MZOdEslOHvmzAs= @@ -1212,21 +1681,25 @@ go.opencensus.io v0.22.4 h1:LYy1Hy3MJdrCdMwwzxA/dRok4ejH+RwNGbuoD9fCjto= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opentelemetry.io/otel v1.9.0 h1:8WZNQFIB2a71LnANS9JeyidJKKGOOremcUtb/OtHISw= go.opentelemetry.io/otel v1.9.0/go.mod h1:np4EoPGzoPs3O67xUVNoPPcmSvsfOxNlNA4F4AC+0Eo= -go.opentelemetry.io/otel v1.20.0/go.mod h1:oUIGj3D77RwJdM6PPZImDpSZGDvkD9fhesHny69JFrs= +go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4= +go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.10.0 h1:TaB+1rQhddO1sF71MpZOZAuSPW1klK2M8XxfrBMfK7Y= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.10.0/go.mod h1:78XhIg8Ht9vR4tbLNUhXsiOnE2HOuSeKAiAcoVQEpOY= go.opentelemetry.io/otel/trace v1.9.0 h1:oZaCNJUjWcg60VXWee8lJKlqhPbXAPB51URuR47pQYc= go.opentelemetry.io/otel/trace v1.9.0/go.mod h1:2737Q0MuG8q1uILYm2YYVkAyLtOofiTNGg6VODnOiPo= -go.opentelemetry.io/otel/trace v1.20.0/go.mod h1:HJSK7F/hA5RlzpZ0zKDCHCDHm556LCDtKaAo6JmBFUU= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2 h1:2Oa65PReHzfn29GpvgsYwloV9AVFHPDk8tYxt2c2tr4= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/automaxprocs v1.5.2 h1:2LxUOGiR3O6tw8ui5sZa2LAaHnsviZdVOUZw4fvbnME= go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v1.9.1 h1:XCJQEf3W6eZaVwhRBof6ImoYGJSITeKWsyeh3HFu/5o= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.19.0 h1:mZQZefskPPCMIBCSEH0v2/iUqqLrYtaeqwD6FUGUnFE= +go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -1239,6 +1712,7 @@ golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= @@ -1246,11 +1720,12 @@ golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1265,20 +1740,21 @@ golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMk golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5 h1:rxKZ2gOnYxjfmakvUUqh9Gyb6KXfrj7JWTxORTYqb0E= golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3 h1:XQyxROzUlZH+WIQwySDgnISgOivlhjIEwaQaJEJrrN0= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f h1:J5lckAjkw6qYlOZNj90mLYNTEKDvWeuc1yieZ8qUzUE= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= @@ -1292,17 +1768,13 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1320,6 +1792,7 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= @@ -1331,11 +1804,13 @@ golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1344,23 +1819,22 @@ golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8= golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= +golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= +golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= +golang.org/x/oauth2 v0.13.0 h1:jDDenyj+WgFtmV3zYVoi8aE2BwtXFLWOA67ZfNWftiY= +golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5 h1:ObuXPmIgI4ZMyQLIz48cJYgSyWdjUXc2SZAdyJMwEAU= golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5/go.mod h1:UBKtEnL8aqnd+0JHqZ+2qoMDwtuy6cYhhKNoHLBiTQc= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1370,7 +1844,6 @@ golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1392,7 +1865,6 @@ golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1410,9 +1882,7 @@ golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1421,23 +1891,20 @@ golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= -golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1448,16 +1915,12 @@ golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= @@ -1490,11 +1953,14 @@ golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df h1:5Pf6pFKu98ODmgnpvkJ3kFUOQGGLIzLIkbzUHp47618= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.6.0 h1:DJy6UzXbahnGUf1ujUNkh/NEtK14qMo2nvlBPs4U5yw= @@ -1522,23 +1988,20 @@ google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0 h1:yfrXXP61wVuLb0vBcG6qaOoIoqYEzOQS8jum51jkv2w= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= +google.golang.org/api v0.128.0/go.mod h1:Y611qgqaE92On/7g65MQgxYul3c0rEB894kniWLY750= +google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= @@ -1558,47 +2021,52 @@ google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84 h1:R1r5J0u6Cx+RNl/6mezTw6oA14cmKC96FeUwL6A9bd4= google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f h1:Vn+VyHU5guc9KjB5KrjI2q0wCOWEOIh0OEsleqakHJg= -google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f/go.mod h1:nWSwAFPb+qfNJXsoeO3Io7zf4tMSfN8EA8RlDA04GhY= +google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= +google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= +google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:CgAqfJo+Xmu0GwA0411Ht3OU3OntXwsGmrmjI8ioGXI= +google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405/go.mod h1:3WDQMjmJk36UQhjQ89emUzb1mdaHcPeeAh4SCBKznB4= +google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20231030173426-d783a09b4405/go.mod h1:GRUCuLdzVqZte8+Dl/D4N25yLzcGqqWaYkeVOwulFqw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE= google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= +google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/airbrake/gobrake.v2 v2.0.9 h1:7z2uVWwn7oVeeugY1DtlPAy5H+KYgB1KeKTnqjNatLo= gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 h1:OAj3g0cR6Dx/R07QgQe8wkA9RNjB2u4i700xBkIT4e0= gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2 h1:lFB4DoMU6B626w8ny76MV7VX6W2VHct2GVOI3xgiMrQ= @@ -1608,23 +2076,22 @@ gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce h1:xcEWjVhvbDy+nHP67nPDDpbYrY+ILlfndk4bRioVHaU= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6 h1:a6cXbcDDUkSBlpnkWV1bJ+vv3mOgQEltEJ2rPxroVu0= gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= -gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= +gopkg.in/square/go-jose.v2 v2.5.1 h1:7odma5RETjNHWJnR32wx8t+Io4djHE1PqxCFx3iiZ2w= +gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools v1.4.0 h1:BjtEgfuw8Qyd+jPvQz8CfoxiO/UjFEidWinwEXZiWv0= gotest.tools v1.4.0/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= +gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc h1:/hemPrYIhOhy8zYrNj+069zDB68us2sMGsfkFJO0iZs= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= @@ -1633,26 +2100,32 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.1.3 h1:qTakTkI6ni6LFD5sBwwsdSO+AQqbSIxOauHTTQKZ/7o= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= -howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= +k8s.io/api v0.26.2/go.mod h1:1kjMQsFE+QHPfskEcVNgL3+Hp88B80uj0QtSOlj8itU= +k8s.io/apimachinery v0.26.2/go.mod h1:ats7nN1LExKHvJ9TmwootT00Yz05MuYqPXEXaVeOy5I= +k8s.io/apiserver v0.26.2/go.mod h1:GHcozwXgXsPuOJ28EnQ/jXEM9QeG6HT22YxSNmpYNh8= +k8s.io/client-go v0.26.2/go.mod h1:u5EjOuSyBa09yqqyY7m3abZeovO/7D/WehVVlZ2qcqU= +k8s.io/component-base v0.26.2/go.mod h1:DxbuIe9M3IZPRxPIzhch2m1eT7uFrSBJUBuVCQEBivs= +k8s.io/component-base v0.26.7 h1:uqsOyZh0Zqoaup8tmHa491D/CvgFdGUs+X2H/inNUKM= +k8s.io/component-base v0.26.7/go.mod h1:CZe1HTmX/DQdeBrb9XYOXzs96jXth8ZbFvhLMsoJLUg= +k8s.io/cri-api v0.27.1 h1:KWO+U8MfI9drXB/P4oU9VchaWYOlwDglJZVHWMpTT3Q= +k8s.io/cri-api v0.27.1/go.mod h1:+Ts/AVYbIo04S86XbTD73UPp/DkTiYxtsFeOFEu32L0= +k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c h1:GohjlNKauSai7gN4wsJkeZ3WAJx4Sh+oT/b5IYn5suA= +k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/kms v0.26.7 h1:vruEJNh2IyFnPHbCH8CpUjekHy1HFJtHd/lE2K0lU78= +k8s.io/kms v0.26.7/go.mod h1:AYuV9ZebRhr6cb1eT9L6kZVxvgIUxmE1Fe6kPhqYvuc= +kernel.org/pub/linux/libs/security/libcap/cap v1.2.67 h1:sPQ9qlSNR26fToTKbxe/HDWJlXvBLqGmt84LGCQkOy0= +kernel.org/pub/linux/libs/security/libcap/cap v1.2.67/go.mod h1:GkntoBuwffz19qtdFVB+k2NtWNN+yCKnC/Ykv/hMiTU= +kernel.org/pub/linux/libs/security/libcap/psx v1.2.67 h1:NxbXJ7pDVq0FKBsqjieT92QDXI2XaqH2HAi4QcCOHt8= +kernel.org/pub/linux/libs/security/libcap/psx v1.2.67/go.mod h1:+l6Ee2F59XiJ2I6WR5ObpC1utCQJZ/VLsEbQCD8RG24= lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= modernc.org/cc/v3 v3.36.1/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.41.0/go.mod h1:Ni4zjJYJ04CDOhG7dn640WGfwBzfE0ecX8TyMB0Fv0Y= modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= -modernc.org/ccgo/v3 v3.16.15/go.mod h1:yT7B+/E2m43tmMOT51GMoM98/MtHIcQQSleGnddkUNI= modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.32.0/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE= modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= -modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= -modernc.org/sqlite v1.27.0/go.mod h1:Qxpazz0zH8Z1xCFyi5GSL3FzbtZ3fvbjmywNogldEW0= modernc.org/strutil v1.1.2/go.mod h1:OYajnUAcI/MX+XD/Wx7v1bbdvcQSvxgtb0gC+u3d3eg= -modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= moul.io/http2curl v1.0.0 h1:6XwpyZOYsgZJrU8exnG87ncVkU1FVCcTRpwzOkTDUi8= moul.io/http2curl v1.0.0/go.mod h1:f6cULg+e4Md/oW1cYmwW4IWQOVl2lGbmCNGOHvzX2kE= nullprogram.com/x/optparse v1.0.0 h1:xGFgVi5ZaWOnYdac2foDT3vg0ZZC9ErXFV57mr4OHrI= @@ -1663,5 +2136,7 @@ rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.37 h1:fAPTNEpzQMOLMGwOHNbUkR2xXTQwMJOZYNx+/mLlOh0= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.37/go.mod h1:vfnxT4FXNT8eGvO+xi/DsyC/qHmdujqwrUa1WSspCsk= +tags.cncf.io/container-device-interface/specs-go v0.6.0 h1:V+tJJN6dqu8Vym6p+Ru+K5mJ49WL6Aoc5SJFSY0RLsQ= +tags.cncf.io/container-device-interface/specs-go v0.6.0/go.mod h1:hMAwAbMZyBLdmYqWgYcKH0F/yctNpV3P35f+/088A80= diff --git a/prover/client/types.go b/prover/client/types.go index bc2b41b47..fafdec236 100644 --- a/prover/client/types.go +++ b/prover/client/types.go @@ -41,6 +41,7 @@ type LoginResponse struct { // GetTaskRequest defines the request structure for GetTask API type GetTaskRequest struct { + HardForkName string `json:"hard_fork_name"` TaskType message.ProofType `json:"task_type"` ProverHeight uint64 `json:"prover_height,omitempty"` VK string `json:"vk"` diff --git a/prover/cmd/app/mock_app.go b/prover/cmd/app/mock_app.go index a9760be90..8d4681545 100644 --- a/prover/cmd/app/mock_app.go +++ b/prover/cmd/app/mock_app.go @@ -12,7 +12,7 @@ import ( "scroll-tech/prover/config" "scroll-tech/common/cmd" - "scroll-tech/common/docker" + "scroll-tech/common/testcontainers" "scroll-tech/common/types/message" "scroll-tech/common/utils" ) @@ -30,7 +30,7 @@ func getIndex() int { type ProverApp struct { Config *config.Config - base *docker.App + testApps *testcontainers.TestcontainerApps originFile string proverFile string @@ -39,11 +39,11 @@ type ProverApp struct { index int name string args []string - docker.AppAPI + *cmd.Cmd } // NewProverApp return a new proverApp manager. -func NewProverApp(base *docker.App, mockName utils.MockAppName, file string, httpURL string) *ProverApp { +func NewProverApp(testApps *testcontainers.TestcontainerApps, mockName utils.MockAppName, file string, httpURL string) *ProverApp { var proofType message.ProofType switch mockName { case utils.ChunkProverApp: @@ -54,17 +54,17 @@ func NewProverApp(base *docker.App, mockName utils.MockAppName, file string, htt return nil } name := string(mockName) - proverFile := fmt.Sprintf("/tmp/%d_%s-config.json", base.Timestamp, name) + proverFile := fmt.Sprintf("/tmp/%d_%s-config.json", testApps.Timestamp, name) proverApp := &ProverApp{ - base: base, + testApps: testApps, originFile: file, proverFile: proverFile, - bboltDB: fmt.Sprintf("/tmp/%d_%s_bbolt_db", base.Timestamp, name), + bboltDB: fmt.Sprintf("/tmp/%d_%s_bbolt_db", testApps.Timestamp, name), index: getIndex(), name: name, args: []string{"--log.debug", "--config", proverFile}, } - proverApp.AppAPI = cmd.NewCmd(proverApp.name, proverApp.args...) + proverApp.Cmd = cmd.NewCmd(proverApp.name, proverApp.args...) if err := proverApp.MockConfig(true, httpURL, proofType); err != nil { panic(err) } @@ -73,13 +73,13 @@ func NewProverApp(base *docker.App, mockName utils.MockAppName, file string, htt // RunApp run prover-test child process by multi parameters. func (r *ProverApp) RunApp(t *testing.T) { - r.AppAPI.RunApp(func() bool { return r.AppAPI.WaitResult(t, time.Second*40, "prover start successfully") }) + r.Cmd.RunApp(func() bool { return r.Cmd.WaitResult(t, time.Second*40, "prover start successfully") }) } // Free stop and release prover-test. func (r *ProverApp) Free() { - if !utils.IsNil(r.AppAPI) { - r.AppAPI.WaitExit() + if !utils.IsNil(r.Cmd) { + r.Cmd.WaitExit() } _ = os.Remove(r.proverFile) _ = os.Remove(r.Config.KeystorePath) @@ -93,8 +93,13 @@ func (r *ProverApp) MockConfig(store bool, httpURL string, proofType message.Pro return err } cfg.ProverName = fmt.Sprintf("%s_%d", r.name, r.index) - cfg.KeystorePath = fmt.Sprintf("/tmp/%d_%s.json", r.base.Timestamp, cfg.ProverName) - cfg.L2Geth.Endpoint = r.base.L2gethImg.Endpoint() + cfg.KeystorePath = fmt.Sprintf("/tmp/%d_%s.json", r.testApps.Timestamp, cfg.ProverName) + + endpoint, err := r.testApps.GetL2GethEndPoint() + if err != nil { + return err + } + cfg.L2Geth.Endpoint = endpoint cfg.L2Geth.Confirmations = rpc.LatestBlockNumber // Reuse l1geth's keystore file cfg.KeystorePassword = "scrolltest" diff --git a/prover/config.json b/prover/config.json index 7b4d2d6ba..b752e1951 100644 --- a/prover/config.json +++ b/prover/config.json @@ -1,5 +1,6 @@ { "prover_name": "prover-1", + "hard_fork_name": "homestead", "keystore_path": "keystore.json", "keystore_password": "prover-pwd", "db_path": "unique-db-path-for-prover-1", diff --git a/prover/config/config.go b/prover/config/config.go index b621314b1..9207949cd 100644 --- a/prover/config/config.go +++ b/prover/config/config.go @@ -14,6 +14,7 @@ import ( // Config loads prover configuration items. type Config struct { ProverName string `json:"prover_name"` + HardForkName string `json:"hard_fork_name"` KeystorePath string `json:"keystore_path"` KeystorePassword string `json:"keystore_password"` Core *ProverCoreConfig `json:"core"` diff --git a/prover/core/prover_test.go b/prover/core/prover_test.go index 264339138..92e06814f 100644 --- a/prover/core/prover_test.go +++ b/prover/core/prover_test.go @@ -7,8 +7,11 @@ import ( "encoding/base64" "encoding/json" "flag" + "fmt" "io" "os" + "path/filepath" + "sort" "testing" "github.com/scroll-tech/go-ethereum/core/types" @@ -24,8 +27,7 @@ var ( paramsPath = flag.String("params", "/assets/test_params", "params dir") assetsPath = flag.String("assets", "/assets/test_assets", "assets dir") proofDumpPath = flag.String("dump", "/assets/proof_data", "the path proofs dump to") - tracePath1 = flag.String("trace1", "/assets/traces/1_transfer.json", "chunk trace 1") - tracePath2 = flag.String("trace2", "/assets/traces/10_transfer.json", "chunk trace 2") + batchDirPath = flag.String("batch-dir", "/assets/traces/batch_24", "batch directory") batchVkPath = flag.String("batch-vk", "/assets/test_assets/agg_vk.vkey", "batch vk") chunkVkPath = flag.String("chunk-vk", "/assets/test_assets/chunk_vk.vkey", "chunk vk") ) @@ -46,23 +48,34 @@ func TestFFI(t *testing.T) { as.Equal(chunkProverCore.VK, readVk(*chunkVkPath, as)) t.Log("Chunk VK must be available when init") - chunkTrace1 := readChunkTrace(*tracePath1, as) - chunkTrace2 := readChunkTrace(*tracePath2, as) - t.Log("Loaded chunk traces") + // Get the list of subdirectories (chunks) + chunkDirs, err := os.ReadDir(*batchDirPath) + as.NoError(err) + sort.Slice(chunkDirs, func(i, j int) bool { + return chunkDirs[i].Name() < chunkDirs[j].Name() + }) - chunkInfo1, err := chunkProverCore.TracesToChunkInfo(chunkTrace1) - as.NoError(err) - chunkInfo2, err := chunkProverCore.TracesToChunkInfo(chunkTrace2) - as.NoError(err) - t.Log("Converted to chunk infos") + chunkInfos := make([]*message.ChunkInfo, 0, len(chunkDirs)) + chunkProofs := make([]*message.ChunkProof, 0, len(chunkDirs)) - chunkProof1, err := chunkProverCore.ProveChunk("chunk_proof1", chunkTrace1) - as.NoError(err) - t.Log("Generated and dumped chunk proof 1") + for i, dir := range chunkDirs { + if dir.IsDir() { + chunkPath := filepath.Join(*batchDirPath, dir.Name()) - chunkProof2, err := chunkProverCore.ProveChunk("chunk_proof2", chunkTrace2) - as.NoError(err) - t.Log("Generated and dumped chunk proof 2") + chunkTrace := readChunkTrace(chunkPath, as) + t.Logf("Loaded chunk trace %d", i+1) + + chunkInfo, err := chunkProverCore.TracesToChunkInfo(chunkTrace) + as.NoError(err) + chunkInfos = append(chunkInfos, chunkInfo) + t.Logf("Converted to chunk info %d", i+1) + + chunkProof, err := chunkProverCore.ProveChunk(fmt.Sprintf("chunk_proof%d", i+1), chunkTrace) + as.NoError(err) + chunkProofs = append(chunkProofs, chunkProof) + t.Logf("Generated and dumped chunk proof %d", i+1) + } + } as.Equal(chunkProverCore.VK, readVk(*chunkVkPath, as)) t.Log("Chunk VKs must be equal after proving") @@ -79,8 +92,6 @@ func TestFFI(t *testing.T) { as.Equal(batchProverCore.VK, readVk(*batchVkPath, as)) t.Log("Batch VK must be available when init") - chunkInfos := []*message.ChunkInfo{chunkInfo1, chunkInfo2} - chunkProofs := []*message.ChunkProof{chunkProof1, chunkProof2} _, err = batchProverCore.ProveBatch("batch_proof", chunkInfos, chunkProofs) as.NoError(err) t.Log("Generated and dumped batch proof") @@ -88,20 +99,46 @@ func TestFFI(t *testing.T) { as.Equal(batchProverCore.VK, readVk(*batchVkPath, as)) t.Log("Batch VKs must be equal after proving") } - func readChunkTrace(filePat string, as *assert.Assertions) []*types.BlockTrace { - f, err := os.Open(filePat) - as.NoError(err) - defer func() { - as.NoError(f.Close()) - }() - byt, err := io.ReadAll(f) + fileInfo, err := os.Stat(filePat) as.NoError(err) - trace := &types.BlockTrace{} - as.NoError(json.Unmarshal(byt, trace)) + var traces []*types.BlockTrace - return []*types.BlockTrace{trace} + readFile := func(path string) { + f, err := os.Open(path) + as.NoError(err) + defer func() { + as.NoError(f.Close()) + }() + byt, err := io.ReadAll(f) + as.NoError(err) + + trace := &types.BlockTrace{} + as.NoError(json.Unmarshal(byt, trace)) + + traces = append(traces, trace) + } + + if fileInfo.IsDir() { + files, err := os.ReadDir(filePat) + as.NoError(err) + + // Sort files alphabetically + sort.Slice(files, func(i, j int) bool { + return files[i].Name() < files[j].Name() + }) + + for _, file := range files { + if !file.IsDir() { + readFile(filepath.Join(filePat, file.Name())) + } + } + } else { + readFile(filePat) + } + + return traces } func readVk(filePat string, as *assert.Assertions) string { diff --git a/prover/go.mod b/prover/go.mod index 7614ee6a5..e954eddb9 100644 --- a/prover/go.mod +++ b/prover/go.mod @@ -1,53 +1,82 @@ module scroll-tech/prover -go 1.20 +go 1.21 require ( github.com/go-resty/resty/v2 v2.7.0 - github.com/google/uuid v1.4.0 - github.com/scroll-tech/go-ethereum v1.10.14-0.20231130005111-38a3a9c9198c - github.com/stretchr/testify v1.8.4 + github.com/google/uuid v1.6.0 + github.com/scroll-tech/go-ethereum v1.10.14-0.20240326144132-0f0cd99f7a2e + github.com/stretchr/testify v1.9.0 github.com/urfave/cli/v2 v2.25.7 go.etcd.io/bbolt v1.3.7 ) require ( github.com/VictoriaMetrics/fastcache v1.12.1 // indirect + github.com/bits-and-blooms/bitset v1.12.0 // indirect github.com/btcsuite/btcd v0.20.1-beta // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect + github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/deckarep/golang-set v1.8.0 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect + github.com/edsrzf/mmap-go v1.0.0 // indirect + github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4 // indirect + github.com/fjl/memsize v0.0.2 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff // indirect + github.com/go-kit/kit v0.9.0 // indirect + github.com/go-logfmt/logfmt v0.5.1 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect + github.com/hashicorp/go-bexpr v0.1.10 // indirect + github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect + github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/holiman/uint256 v1.2.4 // indirect github.com/huin/goupnp v1.3.0 // indirect github.com/iden3/go-iden3-crypto v0.0.15 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect - github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mitchellh/pointerstructure v1.2.0 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/onsi/ginkgo v1.16.5 // indirect + github.com/onsi/gomega v1.27.1 // indirect + github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/prometheus/tsdb v0.7.1 // indirect github.com/rivo/uniseg v0.4.4 // indirect + github.com/rjeczalik/notify v0.9.1 // indirect github.com/rogpeppe/go-internal v1.10.0 // indirect + github.com/rs/cors v1.7.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/scroll-tech/zktrie v0.7.1 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/status-im/keycard-go v0.2.0 // indirect + github.com/supranational/blst v0.3.11-0.20230124161941-ca03e11a3ff2 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/tyler-smith/go-bip39 v1.1.0 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect - golang.org/x/crypto v0.16.0 // indirect + golang.org/x/crypto v0.17.0 // indirect golang.org/x/net v0.18.0 // indirect - golang.org/x/sync v0.5.0 // indirect - golang.org/x/sys v0.15.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.17.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.3.0 // indirect - gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + gopkg.in/urfave/cli.v1 v1.20.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/prover/go.sum b/prover/go.sum index 966bec872..e662be34a 100644 --- a/prover/go.sum +++ b/prover/go.sum @@ -1,7 +1,14 @@ +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/bits-and-blooms/bitset v1.12.0 h1:U/q1fAF7xXRhFCrhROzIfffYnu+dlS38vCZtmFVPHmA= +github.com/bits-and-blooms/bitset v1.12.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd v0.20.1-beta h1:Ik4hyJqN8Jfyv3S4AGBOmyouMsYE3EdYODkMbQjwPGw= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= @@ -11,10 +18,19 @@ github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVa github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= +github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= +github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -22,27 +38,61 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4 h1:B2mpK+MNqgPqk2/KNi1LbqwtZDy5F7iy0mynQiBr8VA= +github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4/go.mod h1:y4GA2JbAUama1S4QwYjC2hefgGLU8Ul0GMtL/ADMF1c= +github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= +github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY= github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= +github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= +github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= @@ -55,56 +105,89 @@ github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+ github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= +github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.27.1 h1:rfztXRbg6nv/5f+Raen9RcGoSecHIFgBBLQK3Wdj754= +github.com/onsi/gomega v1.27.1/go.mod h1:aHX5xOykVYzWOV4WqQy0sy8BQptgukenXpCXfadcIAw= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/scroll-tech/go-ethereum v1.10.14-0.20231130005111-38a3a9c9198c h1:MnAdt80steCDli4SAD0J0spBGNY+gQvbdptNjWztHcw= -github.com/scroll-tech/go-ethereum v1.10.14-0.20231130005111-38a3a9c9198c/go.mod h1:4HrFcoStbViFVy/9l/rvKl1XmizVAaPdgqI8v0U8hOc= +github.com/scroll-tech/go-ethereum v1.10.14-0.20240326144132-0f0cd99f7a2e h1:FcoK0rykAWI+5E7cQM6ALRLd5CmjBTHRvJztRBH2xeM= +github.com/scroll-tech/go-ethereum v1.10.14-0.20240326144132-0f0cd99f7a2e/go.mod h1:7Rz2bh9pn42rGuxjh51CG7HL9SKMG3ZugJkL3emdZx8= github.com/scroll-tech/zktrie v0.7.1 h1:NrmZNjuBzsbrKePqdHDG+t2cXnimbtezPAFS0+L9ElE= github.com/scroll-tech/zktrie v0.7.1/go.mod h1:XvNo7vAk8yxNyTjBDj5WIiFzYW4bx/gJ78+NK6Zn6Uk= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/supranational/blst v0.3.11-0.20230124161941-ca03e11a3ff2 h1:wh1wzwAhZBNiZO37uWS/nDaKiIwHz4mDo4pnA+fqTO0= +github.com/supranational/blst v0.3.11-0.20230124161941-ca03e11a3ff2/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= @@ -115,52 +198,99 @@ github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ= go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/urfave/cli.v1 v1.20.0 h1:NdAVW6RYxDif9DhDHaAortIu956m2c0v+09AZBPTbE0= +gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/prover/prover.go b/prover/prover.go index 43d7d1d89..41277d10c 100644 --- a/prover/prover.go +++ b/prover/prover.go @@ -178,7 +178,8 @@ func (r *Prover) proveAndSubmit() error { func (r *Prover) fetchTaskFromCoordinator() (*store.ProvingTask, error) { // prepare the request req := &client.GetTaskRequest{ - TaskType: r.Type(), + HardForkName: r.cfg.HardForkName, + TaskType: r.Type(), // we may not be able to get the vk at the first time, so we should pass vk to the coordinator every time we getTask // instead of passing vk when we login VK: r.proverCore.VK, diff --git a/rollup/Makefile b/rollup/Makefile index e01f60891..c41a4ea4c 100644 --- a/rollup/Makefile +++ b/rollup/Makefile @@ -4,8 +4,8 @@ IMAGE_VERSION=latest REPO_ROOT_DIR=./.. mock_abi: - cd .. && go run github.com/scroll-tech/go-ethereum/cmd/abigen --sol ./rollup/mock_bridge/MockBridgeL1.sol --pkg mock_bridge --out ./rollup/mock_bridge/MockBridgeL1.go - cd .. && go run github.com/scroll-tech/go-ethereum/cmd/abigen --sol ./rollup/mock_bridge/MockBridgeL2.sol --pkg mock_bridge --out ./rollup/mock_bridge/MockBridgeL2.go + cd .. && solc --evm-version cancun --bin --abi --optimize --overwrite -o ./build/bin ./rollup/mock_bridge/MockBridge.sol + cd .. && go run github.com/scroll-tech/go-ethereum/cmd/abigen --bin=./build/bin/MockBridge.bin --abi=./build/bin/MockBridge.abi --pkg=mock_bridge --out=./rollup/mock_bridge/MockBridge.go rollup_bins: ## Builds the Rollup bins. go build -o $(PWD)/build/bin/event_watcher ./cmd/event_watcher/ diff --git a/rollup/abi/bridge_abi.go b/rollup/abi/bridge_abi.go index fe0947cea..3a97f0e3c 100644 --- a/rollup/abi/bridge_abi.go +++ b/rollup/abi/bridge_abi.go @@ -66,7 +66,7 @@ func init() { // ScrollChainMetaData contains all meta data concerning the ScrollChain contract. var ScrollChainMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_chainId\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"name\":\"CommitBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"withdrawRoot\",\"type\":\"bytes32\"}],\"name\":\"FinalizeBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"name\":\"RevertBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldMaxNumTxInChunk\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newMaxNumTxInChunk\",\"type\":\"uint256\"}],\"name\":\"UpdateMaxNumTxInChunk\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"}],\"name\":\"UpdateProver\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"}],\"name\":\"UpdateSequencer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldVerifier\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newVerifier\",\"type\":\"address\"}],\"name\":\"UpdateVerifier\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"addProver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"addSequencer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"_version\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"_parentBatchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"_chunks\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"_skippedL1MessageBitmap\",\"type\":\"bytes\"}],\"name\":\"commitBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"committedBatches\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"_prevStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_postStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_withdrawRoot\",\"type\":\"bytes32\"}],\"name\":\"finalizeBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"_prevStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_postStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_withdrawRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_aggrProof\",\"type\":\"bytes\"}],\"name\":\"finalizeBatchWithProof\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"finalizedStateRoots\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"_stateRoot\",\"type\":\"bytes32\"}],\"name\":\"importGenesisBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_messageQueue\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxNumTxInChunk\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"}],\"name\":\"isBatchFinalized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isProver\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isSequencer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastFinalizedBatchIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"layer2ChainId\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxNumTxInChunk\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageQueue\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"removeProver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"removeSequencer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_count\",\"type\":\"uint256\"}],\"name\":\"revertBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_status\",\"type\":\"bool\"}],\"name\":\"setPause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_maxNumTxInChunk\",\"type\":\"uint256\"}],\"name\":\"updateMaxNumTxInChunk\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newVerifier\",\"type\":\"address\"}],\"name\":\"updateVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifier\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"withdrawRoots\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"name\":\"CommitBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"withdrawRoot\",\"type\":\"bytes32\"}],\"name\":\"FinalizeBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"name\":\"RevertBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldMaxNumTxInChunk\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newMaxNumTxInChunk\",\"type\":\"uint256\"}],\"name\":\"UpdateMaxNumTxInChunk\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"}],\"name\":\"UpdateProver\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"}],\"name\":\"UpdateSequencer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"parentBatchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"chunks\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"skippedL1MessageBitmap\",\"type\":\"bytes\"}],\"name\":\"commitBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"committedBatches\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"prevStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"postStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"withdrawRoot\",\"type\":\"bytes32\"}],\"name\":\"finalizeBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"prevStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"postStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"withdrawRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"blobDataProof\",\"type\":\"bytes\"}],\"name\":\"finalizeBatch4844\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"prevStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"postStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"withdrawRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"aggrProof\",\"type\":\"bytes\"}],\"name\":\"finalizeBatchWithProof\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"prevStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"postStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"withdrawRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"blobDataProof\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"aggrProof\",\"type\":\"bytes\"}],\"name\":\"finalizeBatchWithProof4844\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"finalizedStateRoots\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"_stateRoot\",\"type\":\"bytes32\"}],\"name\":\"importGenesisBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"isBatchFinalized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastFinalizedBatchIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"}],\"name\":\"revertBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"withdrawRoots\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", } // L1ScrollMessengerMetaData contains all meta data concerning the L1ScrollMessenger contract. diff --git a/rollup/cmd/gas_oracle/app/app.go b/rollup/cmd/gas_oracle/app/app.go index e045c3382..f3cbee894 100644 --- a/rollup/cmd/gas_oracle/app/app.go +++ b/rollup/cmd/gas_oracle/app/app.go @@ -10,6 +10,7 @@ import ( "github.com/prometheus/client_golang/prometheus" "github.com/scroll-tech/go-ethereum/ethclient" "github.com/scroll-tech/go-ethereum/log" + "github.com/scroll-tech/go-ethereum/params" "github.com/scroll-tech/go-ethereum/rpc" "github.com/urfave/cli/v2" @@ -83,7 +84,7 @@ func action(ctx *cli.Context) error { if err != nil { log.Crit("failed to create new l1 relayer", "config file", cfgFile, "error", err) } - l2relayer, err := relayer.NewLayer2Relayer(ctx.Context, l2client, db, cfg.L2Config.RelayerConfig, false /* initGenesis */, relayer.ServiceTypeL2GasOracle, registry) + l2relayer, err := relayer.NewLayer2Relayer(ctx.Context, l2client, db, cfg.L2Config.RelayerConfig, ¶ms.ChainConfig{}, false /* initGenesis */, relayer.ServiceTypeL2GasOracle, registry) if err != nil { log.Crit("failed to create new l2 relayer", "config file", cfgFile, "error", err) } diff --git a/rollup/cmd/mock_app.go b/rollup/cmd/mock_app.go index aaa26ceba..b57f5def8 100644 --- a/rollup/cmd/mock_app.go +++ b/rollup/cmd/mock_app.go @@ -7,19 +7,19 @@ import ( "testing" "time" - "scroll-tech/common/cmd" - "scroll-tech/common/docker" - "scroll-tech/common/utils" - "scroll-tech/rollup/internal/config" + + "scroll-tech/common/cmd" + "scroll-tech/common/testcontainers" + "scroll-tech/common/utils" ) // MockApp mockApp-test client manager. type MockApp struct { - Config *config.Config - base *docker.App + Config *config.Config + testApps *testcontainers.TestcontainerApps - mockApps map[utils.MockAppName]docker.AppAPI + mockApps map[utils.MockAppName]*cmd.Cmd originFile string rollupFile string @@ -27,13 +27,12 @@ type MockApp struct { args []string } -// NewRollupApp return a new rollupApp manager, name mush be one them. -func NewRollupApp(base *docker.App, file string) *MockApp { - - rollupFile := fmt.Sprintf("/tmp/%d_rollup-config.json", base.Timestamp) +// NewRollupApp return a new rollupApp manager. +func NewRollupApp(testApps *testcontainers.TestcontainerApps, file string) *MockApp { + rollupFile := fmt.Sprintf("/tmp/%d_rollup-config.json", testApps.Timestamp) rollupApp := &MockApp{ - base: base, - mockApps: make(map[utils.MockAppName]docker.AppAPI), + testApps: testApps, + mockApps: make(map[utils.MockAppName]*cmd.Cmd), originFile: file, rollupFile: rollupFile, args: []string{"--log.debug", "--config", rollupFile}, @@ -69,7 +68,7 @@ func (b *MockApp) WaitExit() { for _, app := range b.mockApps { app.WaitExit() } - b.mockApps = make(map[utils.MockAppName]docker.AppAPI) + b.mockApps = make(map[utils.MockAppName]*cmd.Cmd) } // Free stop and release rollup mocked apps. @@ -80,18 +79,29 @@ func (b *MockApp) Free() { // MockConfig creates a new rollup config. func (b *MockApp) MockConfig(store bool) error { - base := b.base // Load origin rollup config file. cfg, err := config.NewConfig(b.originFile) if err != nil { return err } - cfg.L1Config.Endpoint = base.L1gethImg.Endpoint() - cfg.L1Config.RelayerConfig.SenderConfig.Endpoint = base.L2gethImg.Endpoint() - cfg.L2Config.Endpoint = base.L2gethImg.Endpoint() - cfg.L2Config.RelayerConfig.SenderConfig.Endpoint = base.L1gethImg.Endpoint() - cfg.DBConfig.DSN = base.DBImg.Endpoint() + l1GethEndpoint, err := b.testApps.GetL1GethEndPoint() + if err != nil { + return err + } + l2GethEndpoint, err := b.testApps.GetL2GethEndPoint() + if err != nil { + return err + } + dbEndpoint, err := b.testApps.GetDBEndPoint() + if err != nil { + return err + } + cfg.L1Config.Endpoint = l1GethEndpoint + cfg.L1Config.RelayerConfig.SenderConfig.Endpoint = l2GethEndpoint + cfg.L2Config.Endpoint = l2GethEndpoint + cfg.L2Config.RelayerConfig.SenderConfig.Endpoint = l1GethEndpoint + cfg.DBConfig.DSN = dbEndpoint b.Config = cfg if !store { diff --git a/rollup/cmd/rollup_relayer/app/app.go b/rollup/cmd/rollup_relayer/app/app.go index b41461157..a70baa8f5 100644 --- a/rollup/cmd/rollup_relayer/app/app.go +++ b/rollup/cmd/rollup_relayer/app/app.go @@ -72,18 +72,24 @@ func action(ctx *cli.Context) error { log.Crit("failed to connect l2 geth", "config file", cfgFile, "error", err) } + genesisPath := ctx.String(utils.Genesis.Name) + genesis, err := utils.ReadGenesis(genesisPath) + if err != nil { + log.Crit("failed to read genesis", "genesis file", genesisPath, "error", err) + } + initGenesis := ctx.Bool(utils.ImportGenesisFlag.Name) - l2relayer, err := relayer.NewLayer2Relayer(ctx.Context, l2client, db, cfg.L2Config.RelayerConfig, initGenesis, relayer.ServiceTypeL2RollupRelayer, registry) + l2relayer, err := relayer.NewLayer2Relayer(ctx.Context, l2client, db, cfg.L2Config.RelayerConfig, genesis.Config, initGenesis, relayer.ServiceTypeL2RollupRelayer, registry) if err != nil { log.Crit("failed to create l2 relayer", "config file", cfgFile, "error", err) } - chunkProposer := watcher.NewChunkProposer(subCtx, cfg.L2Config.ChunkProposerConfig, db, registry) + chunkProposer := watcher.NewChunkProposer(subCtx, cfg.L2Config.ChunkProposerConfig, genesis.Config, db, registry) if err != nil { log.Crit("failed to create chunkProposer", "config file", cfgFile, "error", err) } - batchProposer := watcher.NewBatchProposer(subCtx, cfg.L2Config.BatchProposerConfig, db, registry) + batchProposer := watcher.NewBatchProposer(subCtx, cfg.L2Config.BatchProposerConfig, genesis.Config, db, registry) if err != nil { log.Crit("failed to create batchProposer", "config file", cfgFile, "error", err) } diff --git a/rollup/conf/config.json b/rollup/conf/config.json index feca4a84c..d2d74551a 100644 --- a/rollup/conf/config.json +++ b/rollup/conf/config.json @@ -9,13 +9,13 @@ "gas_price_oracle_address": "0x0000000000000000000000000000000000000000", "sender_config": { "endpoint": "https://rpc.scroll.io", - "escalate_blocks": 100, - "confirmations": "0x1", - "escalate_multiple_num": 11, - "escalate_multiple_den": 10, - "max_gas_price": 10000000000, + "escalate_blocks": 1, + "confirmations": "0x0", + "escalate_multiple_num": 2, + "escalate_multiple_den": 1, + "max_gas_price": 1000000000000, "tx_type": "LegacyTx", - "check_pending_time": 3 + "check_pending_time": 1 }, "gas_oracle_config": { "min_gas_price": 0, @@ -33,13 +33,14 @@ "gas_price_oracle_address": "0x0000000000000000000000000000000000000000", "sender_config": { "endpoint": "https://rpc.ankr.com/eth", - "escalate_blocks": 100, - "confirmations": "0x6", - "escalate_multiple_num": 11, - "escalate_multiple_den": 10, - "max_gas_price": 10000000000, + "escalate_blocks": 1, + "confirmations": "0x0", + "escalate_multiple_num": 2, + "escalate_multiple_den": 1, + "max_gas_price": 1000000000000, + "max_blob_gas_price": 10000000000000, "tx_type": "DynamicFeeTx", - "check_pending_time": 12 + "check_pending_time": 1 }, "gas_oracle_config": { "min_gas_price": 0, diff --git a/rollup/conf/genesis.json b/rollup/conf/genesis.json new file mode 100644 index 000000000..373d960a8 --- /dev/null +++ b/rollup/conf/genesis.json @@ -0,0 +1,16 @@ +{ + "config": { + "chainId": 33, + "homesteadBlock": 0, + "eip155Block": 0, + "eip158Block": 0 + }, + "nonce": "0x0000000000000033", + "timestamp": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "gasLimit": "0x8000000", + "difficulty": "0x100", + "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "0x3333333333333333333333333333333333333333", + "alloc": {} +} diff --git a/rollup/go.mod b/rollup/go.mod index 4e910be37..498c70162 100644 --- a/rollup/go.mod +++ b/rollup/go.mod @@ -1,15 +1,18 @@ module scroll-tech/rollup -go 1.20 +go 1.21 require ( github.com/agiledragon/gomonkey/v2 v2.9.0 + github.com/consensys/gnark-crypto v0.12.1 + github.com/crate-crypto/go-kzg-4844 v0.7.0 github.com/gin-gonic/gin v1.9.1 github.com/go-resty/resty/v2 v2.7.0 - github.com/prometheus/client_golang v1.14.0 - github.com/scroll-tech/go-ethereum v1.10.14-0.20231130005111-38a3a9c9198c + github.com/holiman/uint256 v1.2.4 + github.com/prometheus/client_golang v1.16.0 + github.com/scroll-tech/go-ethereum v1.10.14-0.20240326144132-0f0cd99f7a2e github.com/smartystreets/goconvey v1.8.0 - github.com/stretchr/testify v1.8.4 + github.com/stretchr/testify v1.9.0 github.com/urfave/cli/v2 v2.25.7 gorm.io/gorm v1.25.5 ) @@ -17,17 +20,25 @@ require ( require ( github.com/VictoriaMetrics/fastcache v1.12.1 // indirect github.com/beorn7/perks v1.0.1 // indirect + github.com/bits-and-blooms/bitset v1.12.0 // indirect github.com/btcsuite/btcd v0.20.1-beta // indirect github.com/bytedance/sonic v1.10.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect github.com/chenzhuoyu/iasm v0.9.0 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/deckarep/golang-set v1.8.0 // indirect + github.com/edsrzf/mmap-go v1.0.0 // indirect + github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4 // indirect + github.com/fjl/memsize v0.0.2 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/gabriel-vasile/mimetype v1.4.2 // indirect + github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff // indirect github.com/gin-contrib/sse v0.1.0 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-kit/kit v0.9.0 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.15.5 // indirect @@ -36,11 +47,12 @@ require ( github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/go-cmp v0.6.0 // indirect - github.com/google/uuid v1.4.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gopherjs/gopherjs v1.17.2 // indirect github.com/gorilla/websocket v1.5.0 // indirect + github.com/hashicorp/go-bexpr v0.1.10 // indirect github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect - github.com/holiman/uint256 v1.2.4 // indirect + github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/huin/goupnp v1.3.0 // indirect github.com/iden3/go-iden3-crypto v0.0.15 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect @@ -49,28 +61,37 @@ require ( github.com/json-iterator/go v1.1.12 // indirect github.com/jtolds/gls v4.20.0+incompatible // indirect github.com/klauspost/cpuid/v2 v2.2.5 // indirect - github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect github.com/leodido/go-urn v1.2.4 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mitchellh/pointerstructure v1.2.0 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/onsi/ginkgo v1.16.5 // indirect + github.com/onsi/gomega v1.27.1 // indirect github.com/pelletier/go-toml/v2 v2.1.0 // indirect + github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.39.0 // indirect + github.com/prometheus/client_model v0.4.0 // indirect + github.com/prometheus/common v0.42.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect + github.com/prometheus/tsdb v0.7.1 // indirect github.com/rivo/uniseg v0.4.4 // indirect github.com/rjeczalik/notify v0.9.1 // indirect github.com/rogpeppe/go-internal v1.10.0 // indirect + github.com/rs/cors v1.7.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/scroll-tech/zktrie v0.7.1 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/smartystreets/assertions v1.13.1 // indirect github.com/status-im/keycard-go v0.2.0 // indirect + github.com/supranational/blst v0.3.11-0.20230124161941-ca03e11a3ff2 // indirect github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect @@ -80,13 +101,15 @@ require ( github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect golang.org/x/arch v0.5.0 // indirect - golang.org/x/crypto v0.16.0 // indirect + golang.org/x/crypto v0.17.0 // indirect golang.org/x/net v0.18.0 // indirect - golang.org/x/sync v0.5.0 // indirect - golang.org/x/sys v0.15.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.17.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.3.0 // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + gopkg.in/urfave/cli.v1 v1.20.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/rollup/go.sum b/rollup/go.sum index d3a1877c8..e10c2bac9 100644 --- a/rollup/go.sum +++ b/rollup/go.sum @@ -1,11 +1,18 @@ +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/agiledragon/gomonkey/v2 v2.9.0 h1:PDiKKybR596O6FHW+RVSG0Z7uGCBNbmbUXh3uCNQ7Hc= github.com/agiledragon/gomonkey/v2 v2.9.0/go.mod h1:ap1AmDzcVOAz1YpeJ3TCzIgstoaWLA6jbbgxfB4w2iY= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bits-and-blooms/bitset v1.12.0 h1:U/q1fAF7xXRhFCrhROzIfffYnu+dlS38vCZtmFVPHmA= +github.com/bits-and-blooms/bitset v1.12.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd v0.20.1-beta h1:Ik4hyJqN8Jfyv3S4AGBOmyouMsYE3EdYODkMbQjwPGw= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= @@ -20,6 +27,8 @@ github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ github.com/bytedance/sonic v1.10.1 h1:7a1wuFXL1cMy7a3f7/VFcEtriuXQnUBhtoVfOZiaysc= github.com/bytedance/sonic v1.10.1/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= +github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= @@ -28,8 +37,14 @@ github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA= github.com/chenzhuoyu/iasm v0.9.0 h1:9fhXjVzq5hUy2gkhhgHl95zG2cEAhw9OSGs8toWWAwo= github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= +github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -37,21 +52,36 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4 h1:B2mpK+MNqgPqk2/KNi1LbqwtZDy5F7iy0mynQiBr8VA= +github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4/go.mod h1:y4GA2JbAUama1S4QwYjC2hefgGLU8Ul0GMtL/ADMF1c= +github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= +github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= +github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= @@ -60,12 +90,14 @@ github.com/go-playground/validator/v10 v10.15.5 h1:LEBecTWb/1j5TNY1YYG2RcOUN3R7N github.com/go-playground/validator/v10 v10.15.5/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY= github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= @@ -85,17 +117,20 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= +github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= @@ -120,11 +155,13 @@ github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa02 github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= @@ -132,58 +169,76 @@ github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovk github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= +github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.27.1 h1:rfztXRbg6nv/5f+Raen9RcGoSecHIFgBBLQK3Wdj754= +github.com/onsi/gomega v1.27.1/go.mod h1:aHX5xOykVYzWOV4WqQy0sy8BQptgukenXpCXfadcIAw= github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= -github.com/prometheus/common v0.39.0/go.mod h1:6XBZ7lYdLCbkAVhwRsWTZn+IN5AB9F/NXd5w0BbEX0Y= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= +github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE= github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/scroll-tech/go-ethereum v1.10.14-0.20231130005111-38a3a9c9198c h1:MnAdt80steCDli4SAD0J0spBGNY+gQvbdptNjWztHcw= -github.com/scroll-tech/go-ethereum v1.10.14-0.20231130005111-38a3a9c9198c/go.mod h1:4HrFcoStbViFVy/9l/rvKl1XmizVAaPdgqI8v0U8hOc= +github.com/scroll-tech/go-ethereum v1.10.14-0.20240326144132-0f0cd99f7a2e h1:FcoK0rykAWI+5E7cQM6ALRLd5CmjBTHRvJztRBH2xeM= +github.com/scroll-tech/go-ethereum v1.10.14-0.20240326144132-0f0cd99f7a2e/go.mod h1:7Rz2bh9pn42rGuxjh51CG7HL9SKMG3ZugJkL3emdZx8= github.com/scroll-tech/zktrie v0.7.1 h1:NrmZNjuBzsbrKePqdHDG+t2cXnimbtezPAFS0+L9ElE= github.com/scroll-tech/zktrie v0.7.1/go.mod h1:XvNo7vAk8yxNyTjBDj5WIiFzYW4bx/gJ78+NK6Zn6Uk= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= @@ -194,19 +249,25 @@ github.com/smartystreets/assertions v1.13.1/go.mod h1:cXr/IwVfSo/RbCSPhoAPv73p3h github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.8.0 h1:Oi49ha/2MURE0WexF052Z0m+BNSGirfjg5RL+JXWq3w= github.com/smartystreets/goconvey v1.8.0/go.mod h1:EdX8jtrTIj26jmjCOVNMVSIYAtgexqXKHOXW2Dx9JLg= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/supranational/blst v0.3.11-0.20230124161941-ca03e11a3ff2 h1:wh1wzwAhZBNiZO37uWS/nDaKiIwHz4mDo4pnA+fqTO0= +github.com/supranational/blst v0.3.11-0.20230124161941-ca03e11a3ff2/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= @@ -223,6 +284,7 @@ github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= @@ -230,23 +292,31 @@ golang.org/x/arch v0.5.0 h1:jpGode6huXQxcskEIpOCvrU+tzo81b6+oFLUYXWtH/Y= golang.org/x/arch v0.5.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -256,15 +326,19 @@ golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= @@ -276,8 +350,11 @@ golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -289,18 +366,23 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/urfave/cli.v1 v1.20.0 h1:NdAVW6RYxDif9DhDHaAortIu956m2c0v+09AZBPTbE0= +gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -308,3 +390,5 @@ gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls= gorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/rollup/internal/config/l2.go b/rollup/internal/config/l2.go index b78c2b162..07912619a 100644 --- a/rollup/internal/config/l2.go +++ b/rollup/internal/config/l2.go @@ -39,7 +39,7 @@ type ChunkProposerConfig struct { type BatchProposerConfig struct { MaxChunkNumPerBatch uint64 `json:"max_chunk_num_per_batch"` MaxL1CommitGasPerBatch uint64 `json:"max_l1_commit_gas_per_batch"` - MaxL1CommitCalldataSizePerBatch uint32 `json:"max_l1_commit_calldata_size_per_batch"` + MaxL1CommitCalldataSizePerBatch uint64 `json:"max_l1_commit_calldata_size_per_batch"` BatchTimeoutSec uint64 `json:"batch_timeout_sec"` GasCostIncreaseMultiplier float64 `json:"gas_cost_increase_multiplier"` } diff --git a/rollup/internal/config/relayer.go b/rollup/internal/config/relayer.go index c05221680..1a823baf5 100644 --- a/rollup/internal/config/relayer.go +++ b/rollup/internal/config/relayer.go @@ -26,7 +26,9 @@ type SenderConfig struct { EscalateMultipleDen uint64 `json:"escalate_multiple_den"` // The maximum gas price can be used to send transaction. MaxGasPrice uint64 `json:"max_gas_price"` - // The transaction type to use: LegacyTx, AccessListTx, DynamicFeeTx + // The maximum blob gas price can be used to send transaction. + MaxBlobGasPrice uint64 `json:"max_blob_gas_price"` + // The transaction type to use: LegacyTx, DynamicFeeTx, BlobTx TxType string `json:"tx_type"` } diff --git a/rollup/internal/controller/relayer/l1_relayer.go b/rollup/internal/controller/relayer/l1_relayer.go index 82bc1d43b..6e093eed1 100644 --- a/rollup/internal/controller/relayer/l1_relayer.go +++ b/rollup/internal/controller/relayer/l1_relayer.go @@ -132,7 +132,7 @@ func (r *Layer1Relayer) ProcessGasPriceOracle() { return } - hash, err := r.gasOracleSender.SendTransaction(block.Hash, &r.cfg.GasPriceOracleContractAddress, big.NewInt(0), data, 0) + hash, err := r.gasOracleSender.SendTransaction(block.Hash, &r.cfg.GasPriceOracleContractAddress, data, nil, 0) if err != nil { log.Error("Failed to send setL1BaseFee tx to layer2 ", "block.Hash", block.Hash, "block.Height", block.Number, "err", err) return @@ -185,3 +185,11 @@ func (r *Layer1Relayer) handleL1GasOracleConfirmLoop(ctx context.Context) { } } } + +// StopSenders stops the senders of the rollup-relayer to prevent querying the removed pending_transaction table in unit tests. +// for unit test +func (r *Layer1Relayer) StopSenders() { + if r.gasOracleSender != nil { + r.gasOracleSender.Stop() + } +} diff --git a/rollup/internal/controller/relayer/l1_relayer_test.go b/rollup/internal/controller/relayer/l1_relayer_test.go index ea460791b..70768055e 100644 --- a/rollup/internal/controller/relayer/l1_relayer_test.go +++ b/rollup/internal/controller/relayer/l1_relayer_test.go @@ -3,11 +3,11 @@ package relayer import ( "context" "errors" - "math/big" "testing" "github.com/agiledragon/gomonkey/v2" "github.com/scroll-tech/go-ethereum/common" + "github.com/scroll-tech/go-ethereum/crypto/kzg4844" "github.com/smartystreets/goconvey/convey" "github.com/stretchr/testify/assert" "gorm.io/gorm" @@ -38,6 +38,7 @@ func testCreateNewL1Relayer(t *testing.T) { relayer, err := NewLayer1Relayer(context.Background(), db, cfg.L2Config.RelayerConfig, ServiceTypeL1GasOracle, nil) assert.NoError(t, err) assert.NotNil(t, relayer) + defer relayer.StopSenders() } func testL1RelayerGasOracleConfirm(t *testing.T) { @@ -58,6 +59,7 @@ func testL1RelayerGasOracleConfirm(t *testing.T) { defer cancel() l1Relayer, err := NewLayer1Relayer(ctx, db, l1Cfg.RelayerConfig, ServiceTypeL1GasOracle, nil) assert.NoError(t, err) + defer l1Relayer.StopSenders() // Simulate message confirmations. l1Relayer.gasOracleSender.SendConfirmation(&sender.Confirmation{ @@ -91,6 +93,7 @@ func testL1RelayerProcessGasPriceOracle(t *testing.T) { l1Relayer, err := NewLayer1Relayer(ctx, db, l1Cfg.RelayerConfig, ServiceTypeL1GasOracle, nil) assert.NoError(t, err) assert.NotNil(t, l1Relayer) + defer l1Relayer.StopSenders() var l1BlockOrm *orm.L1Block convey.Convey("GetLatestL1BlockHeight failure", t, func() { @@ -151,13 +154,13 @@ func testL1RelayerProcessGasPriceOracle(t *testing.T) { convey.Convey("send transaction failure", t, func() { targetErr := errors.New("send transaction failure") - patchGuard.ApplyMethodFunc(l1Relayer.gasOracleSender, "SendTransaction", func(string, *common.Address, *big.Int, []byte, uint64) (hash common.Hash, err error) { + patchGuard.ApplyMethodFunc(l1Relayer.gasOracleSender, "SendTransaction", func(string, *common.Address, []byte, *kzg4844.Blob, uint64) (hash common.Hash, err error) { return common.Hash{}, targetErr }) l1Relayer.ProcessGasPriceOracle() }) - patchGuard.ApplyMethodFunc(l1Relayer.gasOracleSender, "SendTransaction", func(string, *common.Address, *big.Int, []byte, uint64) (hash common.Hash, err error) { + patchGuard.ApplyMethodFunc(l1Relayer.gasOracleSender, "SendTransaction", func(string, *common.Address, []byte, *kzg4844.Blob, uint64) (hash common.Hash, err error) { return common.Hash{}, nil }) diff --git a/rollup/internal/controller/relayer/l2_relayer.go b/rollup/internal/controller/relayer/l2_relayer.go index 3d560c800..023cb8e53 100644 --- a/rollup/internal/controller/relayer/l2_relayer.go +++ b/rollup/internal/controller/relayer/l2_relayer.go @@ -13,11 +13,17 @@ import ( "github.com/scroll-tech/go-ethereum/common" gethTypes "github.com/scroll-tech/go-ethereum/core/types" "github.com/scroll-tech/go-ethereum/crypto" + "github.com/scroll-tech/go-ethereum/crypto/kzg4844" "github.com/scroll-tech/go-ethereum/ethclient" "github.com/scroll-tech/go-ethereum/log" + "github.com/scroll-tech/go-ethereum/params" "gorm.io/gorm" "scroll-tech/common/types" + "scroll-tech/common/types/encoding" + "scroll-tech/common/types/encoding/codecv0" + "scroll-tech/common/types/encoding/codecv1" + "scroll-tech/common/types/message" "scroll-tech/common/utils" bridgeAbi "scroll-tech/rollup/abi" @@ -59,10 +65,12 @@ type Layer2Relayer struct { chainMonitorClient *resty.Client metrics *l2RelayerMetrics + + chainCfg *params.ChainConfig } // NewLayer2Relayer will return a new instance of Layer2RelayerClient -func NewLayer2Relayer(ctx context.Context, l2Client *ethclient.Client, db *gorm.DB, cfg *config.RelayerConfig, initGenesis bool, serviceType ServiceType, reg prometheus.Registerer) (*Layer2Relayer, error) { +func NewLayer2Relayer(ctx context.Context, l2Client *ethclient.Client, db *gorm.DB, cfg *config.RelayerConfig, chainCfg *params.ChainConfig, initGenesis bool, serviceType ServiceType, reg prometheus.Registerer) (*Layer2Relayer, error) { var gasOracleSender, commitSender, finalizeSender *sender.Sender var err error @@ -131,7 +139,8 @@ func NewLayer2Relayer(ctx context.Context, l2Client *ethclient.Client, db *gorm. minGasPrice: minGasPrice, gasPriceDiff: gasPriceDiff, - cfg: cfg, + cfg: cfg, + chainCfg: chainCfg, } // chain_monitor client @@ -176,8 +185,8 @@ func (r *Layer2Relayer) initializeGenesis() error { log.Info("retrieved L2 genesis header", "hash", genesis.Hash().String()) - chunk := &types.Chunk{ - Blocks: []*types.WrappedBlock{{ + chunk := &encoding.Chunk{ + Blocks: []*encoding.Block{{ Header: genesis, Transactions: nil, WithdrawRoot: common.Hash{}, @@ -187,7 +196,7 @@ func (r *Layer2Relayer) initializeGenesis() error { err = r.db.Transaction(func(dbTX *gorm.DB) error { var dbChunk *orm.Chunk - dbChunk, err = r.chunkOrm.InsertChunk(r.ctx, chunk, dbTX) + dbChunk, err = r.chunkOrm.InsertChunk(r.ctx, chunk, encoding.CodecV0, dbTX) if err != nil { return fmt.Errorf("failed to insert chunk: %v", err) } @@ -196,33 +205,34 @@ func (r *Layer2Relayer) initializeGenesis() error { return fmt.Errorf("failed to update genesis chunk proving status: %v", err) } - batchMeta := &types.BatchMeta{ - StartChunkIndex: 0, - StartChunkHash: dbChunk.Hash, - EndChunkIndex: 0, - EndChunkHash: dbChunk.Hash, + batch := &encoding.Batch{ + Index: 0, + TotalL1MessagePoppedBefore: 0, + ParentBatchHash: common.Hash{}, + Chunks: []*encoding.Chunk{chunk}, } - var batch *orm.Batch - batch, err = r.batchOrm.InsertBatch(r.ctx, []*types.Chunk{chunk}, batchMeta, dbTX) + + var dbBatch *orm.Batch + dbBatch, err = r.batchOrm.InsertBatch(r.ctx, batch, encoding.CodecV0, dbTX) if err != nil { return fmt.Errorf("failed to insert batch: %v", err) } - if err = r.chunkOrm.UpdateBatchHashInRange(r.ctx, 0, 0, batch.Hash, dbTX); err != nil { + if err = r.chunkOrm.UpdateBatchHashInRange(r.ctx, 0, 0, dbBatch.Hash, dbTX); err != nil { return fmt.Errorf("failed to update batch hash for chunks: %v", err) } - if err = r.batchOrm.UpdateProvingStatus(r.ctx, batch.Hash, types.ProvingTaskVerified, dbTX); err != nil { + if err = r.batchOrm.UpdateProvingStatus(r.ctx, dbBatch.Hash, types.ProvingTaskVerified, dbTX); err != nil { return fmt.Errorf("failed to update genesis batch proving status: %v", err) } - if err = r.batchOrm.UpdateRollupStatus(r.ctx, batch.Hash, types.RollupFinalized, dbTX); err != nil { + if err = r.batchOrm.UpdateRollupStatus(r.ctx, dbBatch.Hash, types.RollupFinalized, dbTX); err != nil { return fmt.Errorf("failed to update genesis batch rollup status: %v", err) } // commit genesis batch on L1 // note: we do this inside the DB transaction so that we can revert all DB changes if this step fails - return r.commitGenesisBatch(batch.Hash, batch.BatchHeader, common.HexToHash(batch.StateRoot)) + return r.commitGenesisBatch(dbBatch.Hash, dbBatch.BatchHeader, common.HexToHash(dbBatch.StateRoot)) }) if err != nil { @@ -236,13 +246,13 @@ func (r *Layer2Relayer) initializeGenesis() error { func (r *Layer2Relayer) commitGenesisBatch(batchHash string, batchHeader []byte, stateRoot common.Hash) error { // encode "importGenesisBatch" transaction calldata - calldata, err := r.l1RollupABI.Pack("importGenesisBatch", batchHeader, stateRoot) - if err != nil { - return fmt.Errorf("failed to pack importGenesisBatch with batch header: %v and state root: %v. error: %v", common.Bytes2Hex(batchHeader), stateRoot, err) + calldata, packErr := r.l1RollupABI.Pack("importGenesisBatch", batchHeader, stateRoot) + if packErr != nil { + return fmt.Errorf("failed to pack importGenesisBatch with batch header: %v and state root: %v. error: %v", common.Bytes2Hex(batchHeader), stateRoot, packErr) } // submit genesis batch to L1 rollup contract - txHash, err := r.commitSender.SendTransaction(batchHash, &r.cfg.RollupContractAddress, big.NewInt(0), calldata, 0) + txHash, err := r.commitSender.SendTransaction(batchHash, &r.cfg.RollupContractAddress, calldata, nil, 0) if err != nil { return fmt.Errorf("failed to send import genesis batch tx to L1, error: %v", err) } @@ -281,8 +291,8 @@ func (r *Layer2Relayer) commitGenesisBatch(batchHash string, batchHeader []byte, func (r *Layer2Relayer) ProcessGasPriceOracle() { r.metrics.rollupL2RelayerGasPriceOraclerRunTotal.Inc() batch, err := r.batchOrm.GetLatestBatch(r.ctx) - if batch == nil || err != nil { - log.Error("Failed to GetLatestBatch", "batch", batch, "err", err) + if err != nil { + log.Error("Failed to GetLatestBatch", "err", err) return } @@ -306,7 +316,7 @@ func (r *Layer2Relayer) ProcessGasPriceOracle() { return } - hash, err := r.gasOracleSender.SendTransaction(batch.Hash, &r.cfg.GasPriceOracleContractAddress, big.NewInt(0), data, 0) + hash, err := r.gasOracleSender.SendTransaction(batch.Hash, &r.cfg.GasPriceOracleContractAddress, data, nil, 0) if err != nil { log.Error("Failed to send setL2BaseFee tx to layer2 ", "batch.Hash", batch.Hash, "err", err) return @@ -327,93 +337,78 @@ func (r *Layer2Relayer) ProcessGasPriceOracle() { // ProcessPendingBatches processes the pending batches by sending commitBatch transactions to layer 1. func (r *Layer2Relayer) ProcessPendingBatches() { // get pending batches from database in ascending order by their index. - batches, err := r.batchOrm.GetFailedAndPendingBatches(r.ctx, 5) + dbBatches, err := r.batchOrm.GetFailedAndPendingBatches(r.ctx, 5) if err != nil { log.Error("Failed to fetch pending L2 batches", "err", err) return } - for _, batch := range batches { + for _, dbBatch := range dbBatches { r.metrics.rollupL2RelayerProcessPendingBatchTotal.Inc() - // get current header and parent header. - currentBatchHeader, err := types.DecodeBatchHeader(batch.BatchHeader) - if err != nil { - log.Error("Failed to decode batch header", "index", batch.Index, "error", err) - return - } - parentBatch := &orm.Batch{} - if batch.Index > 0 { - parentBatch, err = r.batchOrm.GetBatchByIndex(r.ctx, batch.Index-1) - if err != nil { - log.Error("Failed to get parent batch header", "index", batch.Index-1, "error", err) - return - } - if types.RollupStatus(parentBatch.RollupStatus) == types.RollupCommitFailed { - log.Error("Previous batch commit failed, halting further committing", - "index", parentBatch.Index, "tx hash", parentBatch.CommitTxHash) - return - } - } - - // get the chunks for the batch - startChunkIndex := batch.StartChunkIndex - endChunkIndex := batch.EndChunkIndex - dbChunks, err := r.chunkOrm.GetChunksInRange(r.ctx, startChunkIndex, endChunkIndex) + dbChunks, err := r.chunkOrm.GetChunksInRange(r.ctx, dbBatch.StartChunkIndex, dbBatch.EndChunkIndex) if err != nil { - log.Error("Failed to fetch chunks", - "start index", startChunkIndex, - "end index", endChunkIndex, "error", err) + log.Error("failed to get chunks in range", "err", err) return } - encodedChunks := make([][]byte, len(dbChunks)) + chunks := make([]*encoding.Chunk, len(dbChunks)) for i, c := range dbChunks { - var wrappedBlocks []*types.WrappedBlock - wrappedBlocks, err = r.l2BlockOrm.GetL2BlocksInRange(r.ctx, c.StartBlockNumber, c.EndBlockNumber) - if err != nil { - log.Error("Failed to fetch wrapped blocks", - "start number", c.StartBlockNumber, - "end number", c.EndBlockNumber, "error", err) + blocks, getErr := r.l2BlockOrm.GetL2BlocksInRange(r.ctx, c.StartBlockNumber, c.EndBlockNumber) + if getErr != nil { + log.Error("failed to get blocks in range", "err", getErr) return } - chunk := &types.Chunk{ - Blocks: wrappedBlocks, - } - var chunkBytes []byte - chunkBytes, err = chunk.Encode(c.TotalL1MessagesPoppedBefore) - if err != nil { - log.Error("Failed to encode chunk", "error", err) - return - } - encodedChunks[i] = chunkBytes + chunks[i] = &encoding.Chunk{Blocks: blocks} } - calldata, err := r.l1RollupABI.Pack("commitBatch", currentBatchHeader.Version(), parentBatch.BatchHeader, encodedChunks, currentBatchHeader.SkippedL1MessageBitmap()) - if err != nil { - log.Error("Failed to pack commitBatch", "index", batch.Index, "error", err) + if dbBatch.Index == 0 { + log.Error("invalid args: batch index is 0, should only happen in committing genesis batch") return } - // send transaction - fallbackGasLimit := uint64(float64(batch.TotalL1CommitGas) * r.cfg.L1CommitGasLimitMultiplier) - if types.RollupStatus(batch.RollupStatus) == types.RollupCommitFailed { - // use eth_estimateGas if this batch has been committed failed. - fallbackGasLimit = 0 - log.Warn("Batch commit previously failed, using eth_estimateGas for the re-submission", "hash", batch.Hash) + dbParentBatch, getErr := r.batchOrm.GetBatchByIndex(r.ctx, dbBatch.Index-1) + if getErr != nil { + log.Error("failed to get parent batch header", "err", getErr) + return } - txHash, err := r.commitSender.SendTransaction(batch.Hash, &r.cfg.RollupContractAddress, big.NewInt(0), calldata, fallbackGasLimit) + + var calldata []byte + var blob *kzg4844.Blob + if !r.chainCfg.IsBernoulli(new(big.Int).SetUint64(dbChunks[0].StartBlockNumber)) { // codecv0 + calldata, err = r.constructCommitBatchPayloadCodecV0(dbBatch, dbParentBatch, dbChunks, chunks) + if err != nil { + log.Error("failed to construct commitBatch payload codecv0", "index", dbBatch.Index, "err", err) + return + } + } else { // codecv1 + calldata, blob, err = r.constructCommitBatchPayloadCodecV1(dbBatch, dbParentBatch, dbChunks, chunks) + if err != nil { + log.Error("failed to construct commitBatch payload codecv1", "index", dbBatch.Index, "err", err) + return + } + } + + // fallbackGasLimit is non-zero only in sending non-blob transactions. + fallbackGasLimit := uint64(float64(dbBatch.TotalL1CommitGas) * r.cfg.L1CommitGasLimitMultiplier) + if types.RollupStatus(dbBatch.RollupStatus) == types.RollupCommitFailed { + // use eth_estimateGas if this batch has been committed and failed at least once. + fallbackGasLimit = 0 + log.Warn("Batch commit previously failed, using eth_estimateGas for the re-submission", "hash", dbBatch.Hash) + } + + txHash, err := r.commitSender.SendTransaction(dbBatch.Hash, &r.cfg.RollupContractAddress, calldata, blob, fallbackGasLimit) if err != nil { log.Error( "Failed to send commitBatch tx to layer1", - "index", batch.Index, - "hash", batch.Hash, + "index", dbBatch.Index, + "hash", dbBatch.Hash, "RollupContractAddress", r.cfg.RollupContractAddress, "err", err, ) log.Debug( "Failed to send commitBatch tx to layer1", - "index", batch.Index, - "hash", batch.Hash, + "index", dbBatch.Index, + "hash", dbBatch.Hash, "RollupContractAddress", r.cfg.RollupContractAddress, "calldata", common.Bytes2Hex(calldata), "err", err, @@ -421,13 +416,13 @@ func (r *Layer2Relayer) ProcessPendingBatches() { return } - err = r.batchOrm.UpdateCommitTxHashAndRollupStatus(r.ctx, batch.Hash, txHash.String(), types.RollupCommitting) + err = r.batchOrm.UpdateCommitTxHashAndRollupStatus(r.ctx, dbBatch.Hash, txHash.String(), types.RollupCommitting) if err != nil { - log.Error("UpdateCommitTxHashAndRollupStatus failed", "hash", batch.Hash, "index", batch.Index, "err", err) + log.Error("UpdateCommitTxHashAndRollupStatus failed", "hash", dbBatch.Hash, "index", dbBatch.Index, "err", err) return } r.metrics.rollupL2RelayerProcessPendingBatchSuccessTotal.Inc() - log.Info("Sent the commitBatch tx to layer1", "batch index", batch.Index, "batch hash", batch.Hash, "tx hash", txHash.Hex()) + log.Info("Sent the commitBatch tx to layer1", "batch index", dbBatch.Index, "batch hash", dbBatch.Hash, "tx hash", txHash.String()) } } @@ -496,103 +491,98 @@ func (r *Layer2Relayer) ProcessCommittedBatches() { } } -func (r *Layer2Relayer) finalizeBatch(batch *orm.Batch, withProof bool) error { +func (r *Layer2Relayer) finalizeBatch(dbBatch *orm.Batch, withProof bool) error { // Check batch status before send `finalizeBatch` tx. if r.cfg.ChainMonitor.Enabled { var batchStatus bool - batchStatus, err := r.getBatchStatusByIndex(batch) + batchStatus, err := r.getBatchStatusByIndex(dbBatch) if err != nil { r.metrics.rollupL2ChainMonitorLatestFailedCall.Inc() - log.Warn("failed to get batch status, please check chain_monitor api server", "batch_index", batch.Index, "err", err) + log.Warn("failed to get batch status, please check chain_monitor api server", "batch_index", dbBatch.Index, "err", err) return err } if !batchStatus { r.metrics.rollupL2ChainMonitorLatestFailedBatchStatus.Inc() - log.Error("the batch status is not right, stop finalize batch and check the reason", "batch_index", batch.Index) + log.Error("the batch status is not right, stop finalize batch and check the reason", "batch_index", dbBatch.Index) return err } } - var parentBatchStateRoot string - if batch.Index > 0 { - var parentBatch *orm.Batch - parentBatch, err := r.batchOrm.GetBatchByIndex(r.ctx, batch.Index-1) - // handle unexpected db error - if err != nil { - log.Error("Failed to get batch", "index", batch.Index-1, "err", err) - return err - } - parentBatchStateRoot = parentBatch.StateRoot + if dbBatch.Index == 0 { + return fmt.Errorf("invalid args: batch index is 0, should only happen in finalizing genesis batch") } - var txCalldata []byte + dbParentBatch, getErr := r.batchOrm.GetBatchByIndex(r.ctx, dbBatch.Index-1) + if getErr != nil { + return fmt.Errorf("failed to get batch, index: %d, err: %w", dbBatch.Index-1, getErr) + } + + dbChunks, err := r.chunkOrm.GetChunksInRange(r.ctx, dbBatch.StartChunkIndex, dbBatch.EndChunkIndex) + if err != nil { + return fmt.Errorf("failed to fetch chunks: %w", err) + } + + var aggProof *message.BatchProof if withProof { - aggProof, err := r.batchOrm.GetVerifiedProofByHash(r.ctx, batch.Hash) - if err != nil { - log.Error("get verified proof by hash failed", "hash", batch.Hash, "err", err) - return err + aggProof, getErr = r.batchOrm.GetVerifiedProofByHash(r.ctx, dbBatch.Hash) + if getErr != nil { + return fmt.Errorf("failed to get verified proof by hash, index: %d, err: %w", dbBatch.Index, getErr) } if err = aggProof.SanityCheck(); err != nil { - log.Error("agg_proof sanity check fails", "hash", batch.Hash, "error", err) - return err - } - - txCalldata, err = r.l1RollupABI.Pack( - "finalizeBatchWithProof", - batch.BatchHeader, - common.HexToHash(parentBatchStateRoot), - common.HexToHash(batch.StateRoot), - common.HexToHash(batch.WithdrawRoot), - aggProof.Proof, - ) - if err != nil { - log.Error("Pack finalizeBatchWithProof failed", "err", err) - return err - } - } else { - var err error - txCalldata, err = r.l1RollupABI.Pack( - "finalizeBatch", - batch.BatchHeader, - common.HexToHash(parentBatchStateRoot), - common.HexToHash(batch.StateRoot), - common.HexToHash(batch.WithdrawRoot), - ) - if err != nil { - log.Error("Pack finalizeBatch failed", "err", err) - return err + return fmt.Errorf("failed to check agg_proof sanity, index: %d, err: %w", dbBatch.Index, err) } } - // add suffix `-finalize` to avoid duplication with commit tx in unit tests - txHash, err := r.finalizeSender.SendTransaction(batch.Hash, &r.cfg.RollupContractAddress, big.NewInt(0), txCalldata, 0) - finalizeTxHash := &txHash + var calldata []byte + if !r.chainCfg.IsBernoulli(new(big.Int).SetUint64(dbChunks[0].StartBlockNumber)) { // codecv0 + calldata, err = r.constructFinalizeBatchPayloadCodecV0(dbBatch, dbParentBatch, aggProof) + if err != nil { + return fmt.Errorf("failed to construct commitBatch payload codecv0, index: %v, err: %w", dbBatch.Index, err) + } + } else { // codecv1 + chunks := make([]*encoding.Chunk, len(dbChunks)) + for i, c := range dbChunks { + blocks, dbErr := r.l2BlockOrm.GetL2BlocksInRange(r.ctx, c.StartBlockNumber, c.EndBlockNumber) + if dbErr != nil { + return fmt.Errorf("failed to fetch blocks: %w", dbErr) + } + chunks[i] = &encoding.Chunk{Blocks: blocks} + } + + calldata, err = r.constructFinalizeBatchPayloadCodecV1(dbBatch, dbParentBatch, dbChunks, chunks, aggProof) + if err != nil { + return fmt.Errorf("failed to construct commitBatch payload codecv1, index: %v, err: %w", dbBatch.Index, err) + } + } + + txHash, err := r.finalizeSender.SendTransaction(dbBatch.Hash, &r.cfg.RollupContractAddress, calldata, nil, 0) if err != nil { log.Error( "finalizeBatch in layer1 failed", "with proof", withProof, - "index", batch.Index, - "hash", batch.Hash, + "index", dbBatch.Index, + "hash", dbBatch.Hash, "RollupContractAddress", r.cfg.RollupContractAddress, "err", err, ) log.Debug( "finalizeBatch in layer1 failed", "with proof", withProof, - "index", batch.Index, - "hash", batch.Hash, + "index", dbBatch.Index, + "hash", dbBatch.Hash, "RollupContractAddress", r.cfg.RollupContractAddress, - "calldata", common.Bytes2Hex(txCalldata), + "calldata", common.Bytes2Hex(calldata), "err", err, ) return err } - log.Info("finalizeBatch in layer1", "with proof", withProof, "index", batch.Index, "batch hash", batch.Hash, "tx hash", batch.Hash) + + log.Info("finalizeBatch in layer1", "with proof", withProof, "index", dbBatch.Index, "batch hash", dbBatch.Hash, "tx hash", txHash) // record and sync with db, @todo handle db error - if err := r.batchOrm.UpdateFinalizeTxHashAndRollupStatus(r.ctx, batch.Hash, finalizeTxHash.String(), types.RollupFinalizing); err != nil { - log.Error("UpdateFinalizeTxHashAndRollupStatus failed", "index", batch.Index, "batch hash", batch.Hash, "tx hash", finalizeTxHash.String(), "err", err) + if err := r.batchOrm.UpdateFinalizeTxHashAndRollupStatus(r.ctx, dbBatch.Hash, txHash.String(), types.RollupFinalizing); err != nil { + log.Error("UpdateFinalizeTxHashAndRollupStatus failed", "index", dbBatch.Index, "batch hash", dbBatch.Hash, "tx hash", txHash.String(), "err", err) return err } r.metrics.rollupL2RelayerProcessCommittedBatchesFinalizedSuccessTotal.Inc() @@ -723,3 +713,153 @@ func (r *Layer2Relayer) handleL2RollupRelayerConfirmLoop(ctx context.Context) { } } } + +func (r *Layer2Relayer) constructCommitBatchPayloadCodecV0(dbBatch *orm.Batch, dbParentBatch *orm.Batch, dbChunks []*orm.Chunk, chunks []*encoding.Chunk) ([]byte, error) { + daBatch, err := codecv0.NewDABatchFromBytes(dbBatch.BatchHeader) + if err != nil { + return nil, fmt.Errorf("failed to create DA batch from bytes: %w", err) + } + + encodedChunks := make([][]byte, len(dbChunks)) + for i, c := range dbChunks { + daChunk, createErr := codecv0.NewDAChunk(chunks[i], c.TotalL1MessagesPoppedBefore) + if createErr != nil { + return nil, fmt.Errorf("failed to create DA chunk: %w", createErr) + } + daChunkBytes, encodeErr := daChunk.Encode() + if encodeErr != nil { + return nil, fmt.Errorf("failed to encode DA chunk: %w", encodeErr) + } + encodedChunks[i] = daChunkBytes + } + + calldata, packErr := r.l1RollupABI.Pack("commitBatch", daBatch.Version, dbParentBatch.BatchHeader, encodedChunks, daBatch.SkippedL1MessageBitmap) + if packErr != nil { + return nil, fmt.Errorf("failed to pack commitBatch: %w", packErr) + } + return calldata, nil +} + +func (r *Layer2Relayer) constructCommitBatchPayloadCodecV1(dbBatch *orm.Batch, dbParentBatch *orm.Batch, dbChunks []*orm.Chunk, chunks []*encoding.Chunk) ([]byte, *kzg4844.Blob, error) { + batch := &encoding.Batch{ + Index: dbBatch.Index, + TotalL1MessagePoppedBefore: dbChunks[0].TotalL1MessagesPoppedBefore, + ParentBatchHash: common.HexToHash(dbParentBatch.Hash), + Chunks: chunks, + } + + daBatch, createErr := codecv1.NewDABatch(batch) + if createErr != nil { + return nil, nil, fmt.Errorf("failed to create DA batch: %w", createErr) + } + + encodedChunks := make([][]byte, len(dbChunks)) + for i, c := range dbChunks { + daChunk, createErr := codecv1.NewDAChunk(chunks[i], c.TotalL1MessagesPoppedBefore) + if createErr != nil { + return nil, nil, fmt.Errorf("failed to create DA chunk: %w", createErr) + } + encodedChunks[i] = daChunk.Encode() + } + + calldata, packErr := r.l1RollupABI.Pack("commitBatch", daBatch.Version, dbParentBatch.BatchHeader, encodedChunks, daBatch.SkippedL1MessageBitmap) + if packErr != nil { + return nil, nil, fmt.Errorf("failed to pack commitBatch: %w", packErr) + } + return calldata, daBatch.Blob(), nil +} + +func (r *Layer2Relayer) constructFinalizeBatchPayloadCodecV0(dbBatch *orm.Batch, dbParentBatch *orm.Batch, aggProof *message.BatchProof) ([]byte, error) { + if aggProof != nil { // finalizeBatch with proof. + calldata, packErr := r.l1RollupABI.Pack( + "finalizeBatchWithProof", + dbBatch.BatchHeader, + common.HexToHash(dbParentBatch.StateRoot), + common.HexToHash(dbBatch.StateRoot), + common.HexToHash(dbBatch.WithdrawRoot), + aggProof.Proof, + ) + if packErr != nil { + return nil, fmt.Errorf("failed to pack finalizeBatchWithProof: %w", packErr) + } + return calldata, nil + } + + // finalizeBatch without proof. + calldata, packErr := r.l1RollupABI.Pack( + "finalizeBatch", + dbBatch.BatchHeader, + common.HexToHash(dbParentBatch.StateRoot), + common.HexToHash(dbBatch.StateRoot), + common.HexToHash(dbBatch.WithdrawRoot), + ) + if packErr != nil { + return nil, fmt.Errorf("failed to pack finalizeBatch: %w", packErr) + } + return calldata, nil +} + +func (r *Layer2Relayer) constructFinalizeBatchPayloadCodecV1(dbBatch *orm.Batch, dbParentBatch *orm.Batch, dbChunks []*orm.Chunk, chunks []*encoding.Chunk, aggProof *message.BatchProof) ([]byte, error) { + batch := &encoding.Batch{ + Index: dbBatch.Index, + TotalL1MessagePoppedBefore: dbChunks[0].TotalL1MessagesPoppedBefore, + ParentBatchHash: common.HexToHash(dbParentBatch.Hash), + Chunks: chunks, + } + + daBatch, createErr := codecv1.NewDABatch(batch) + if createErr != nil { + return nil, fmt.Errorf("failed to create DA batch: %w", createErr) + } + + blobDataProof, getErr := daBatch.BlobDataProof() + if getErr != nil { + return nil, fmt.Errorf("failed to get blob data proof: %w", getErr) + } + + if aggProof != nil { // finalizeBatch4844 with proof. + calldata, packErr := r.l1RollupABI.Pack( + "finalizeBatchWithProof4844", + dbBatch.BatchHeader, + common.HexToHash(dbParentBatch.StateRoot), + common.HexToHash(dbBatch.StateRoot), + common.HexToHash(dbBatch.WithdrawRoot), + blobDataProof, + aggProof.Proof, + ) + if packErr != nil { + return nil, fmt.Errorf("failed to pack finalizeBatchWithProof4844: %w", packErr) + } + return calldata, nil + } + + // finalizeBatch4844 without proof. + calldata, packErr := r.l1RollupABI.Pack( + "finalizeBatch4844", + dbBatch.BatchHeader, + common.HexToHash(dbParentBatch.StateRoot), + common.HexToHash(dbBatch.StateRoot), + common.HexToHash(dbBatch.WithdrawRoot), + blobDataProof, + ) + if packErr != nil { + return nil, fmt.Errorf("failed to pack finalizeBatch4844: %w", packErr) + } + return calldata, nil +} + +// StopSenders stops the senders of the rollup-relayer to prevent querying the removed pending_transaction table in unit tests. +// for unit test +func (r *Layer2Relayer) StopSenders() { + if r.gasOracleSender != nil { + r.gasOracleSender.Stop() + } + + if r.commitSender != nil { + r.commitSender.Stop() + } + + if r.finalizeSender != nil { + r.finalizeSender.Stop() + } +} diff --git a/rollup/internal/controller/relayer/l2_relayer_test.go b/rollup/internal/controller/relayer/l2_relayer_test.go index 1c0fe7fd8..1a9b9988a 100644 --- a/rollup/internal/controller/relayer/l2_relayer_test.go +++ b/rollup/internal/controller/relayer/l2_relayer_test.go @@ -11,12 +11,16 @@ import ( "github.com/agiledragon/gomonkey/v2" "github.com/gin-gonic/gin" "github.com/scroll-tech/go-ethereum/common" + gethTypes "github.com/scroll-tech/go-ethereum/core/types" + "github.com/scroll-tech/go-ethereum/crypto/kzg4844" + "github.com/scroll-tech/go-ethereum/params" "github.com/smartystreets/goconvey/convey" "github.com/stretchr/testify/assert" "gorm.io/gorm" "scroll-tech/common/database" "scroll-tech/common/types" + "scroll-tech/common/types/encoding" "scroll-tech/common/types/message" "scroll-tech/common/utils" @@ -38,118 +42,173 @@ func setupL2RelayerDB(t *testing.T) *gorm.DB { func testCreateNewRelayer(t *testing.T) { db := setupL2RelayerDB(t) defer database.CloseDB(db) - relayer, err := NewLayer2Relayer(context.Background(), l2Cli, db, cfg.L2Config.RelayerConfig, false, ServiceTypeL2RollupRelayer, nil) + relayer, err := NewLayer2Relayer(context.Background(), l2Cli, db, cfg.L2Config.RelayerConfig, ¶ms.ChainConfig{}, true, ServiceTypeL2RollupRelayer, nil) assert.NoError(t, err) assert.NotNil(t, relayer) + defer relayer.StopSenders() } func testL2RelayerProcessPendingBatches(t *testing.T) { - db := setupL2RelayerDB(t) - defer database.CloseDB(db) + codecVersions := []encoding.CodecVersion{encoding.CodecV0, encoding.CodecV1} + for _, codecVersion := range codecVersions { + db := setupL2RelayerDB(t) + defer database.CloseDB(db) - l2Cfg := cfg.L2Config - relayer, err := NewLayer2Relayer(context.Background(), l2Cli, db, l2Cfg.RelayerConfig, false, ServiceTypeL2RollupRelayer, nil) - assert.NoError(t, err) + l2Cfg := cfg.L2Config + chainConfig := ¶ms.ChainConfig{} + if codecVersion == encoding.CodecV0 { + chainConfig.BernoulliBlock = big.NewInt(0) + } - l2BlockOrm := orm.NewL2Block(db) - err = l2BlockOrm.InsertL2Blocks(context.Background(), []*types.WrappedBlock{wrappedBlock1, wrappedBlock2}) - assert.NoError(t, err) - chunkOrm := orm.NewChunk(db) - dbChunk1, err := chunkOrm.InsertChunk(context.Background(), chunk1) - assert.NoError(t, err) - dbChunk2, err := chunkOrm.InsertChunk(context.Background(), chunk2) - assert.NoError(t, err) - batchMeta := &types.BatchMeta{ - StartChunkIndex: 0, - StartChunkHash: dbChunk1.Hash, - EndChunkIndex: 1, - EndChunkHash: dbChunk2.Hash, + relayer, err := NewLayer2Relayer(context.Background(), l2Cli, db, l2Cfg.RelayerConfig, chainConfig, true, ServiceTypeL2RollupRelayer, nil) + assert.NoError(t, err) + + patchGuard := gomonkey.ApplyMethodFunc(l2Cli, "SendTransaction", func(_ context.Context, _ *gethTypes.Transaction) error { + return nil + }) + + l2BlockOrm := orm.NewL2Block(db) + err = l2BlockOrm.InsertL2Blocks(context.Background(), []*encoding.Block{block1, block2}) + assert.NoError(t, err) + chunkOrm := orm.NewChunk(db) + _, err = chunkOrm.InsertChunk(context.Background(), chunk1, codecVersion) + assert.NoError(t, err) + _, err = chunkOrm.InsertChunk(context.Background(), chunk2, codecVersion) + assert.NoError(t, err) + + batch := &encoding.Batch{ + Index: 1, + TotalL1MessagePoppedBefore: 0, + ParentBatchHash: common.Hash{}, + Chunks: []*encoding.Chunk{chunk1, chunk2}, + } + + batchOrm := orm.NewBatch(db) + dbBatch, err := batchOrm.InsertBatch(context.Background(), batch, codecVersion) + assert.NoError(t, err) + + relayer.ProcessPendingBatches() + + statuses, err := batchOrm.GetRollupStatusByHashList(context.Background(), []string{dbBatch.Hash}) + assert.NoError(t, err) + assert.Equal(t, 1, len(statuses)) + assert.Equal(t, types.RollupCommitting, statuses[0]) + relayer.StopSenders() + patchGuard.Reset() } - batchOrm := orm.NewBatch(db) - batch, err := batchOrm.InsertBatch(context.Background(), []*types.Chunk{chunk1, chunk2}, batchMeta) - assert.NoError(t, err) - - relayer.ProcessPendingBatches() - - statuses, err := batchOrm.GetRollupStatusByHashList(context.Background(), []string{batch.Hash}) - assert.NoError(t, err) - assert.Equal(t, 1, len(statuses)) - assert.Equal(t, types.RollupCommitting, statuses[0]) } func testL2RelayerProcessCommittedBatches(t *testing.T) { - db := setupL2RelayerDB(t) - defer database.CloseDB(db) + codecVersions := []encoding.CodecVersion{encoding.CodecV0, encoding.CodecV1} + for _, codecVersion := range codecVersions { + db := setupL2RelayerDB(t) + defer database.CloseDB(db) - l2Cfg := cfg.L2Config - relayer, err := NewLayer2Relayer(context.Background(), l2Cli, db, l2Cfg.RelayerConfig, false, ServiceTypeL2RollupRelayer, nil) - assert.NoError(t, err) - batchMeta := &types.BatchMeta{ - StartChunkIndex: 0, - StartChunkHash: chunkHash1.Hex(), - EndChunkIndex: 1, - EndChunkHash: chunkHash2.Hex(), + l2Cfg := cfg.L2Config + chainConfig := ¶ms.ChainConfig{} + if codecVersion == encoding.CodecV0 { + chainConfig.BernoulliBlock = big.NewInt(0) + } + relayer, err := NewLayer2Relayer(context.Background(), l2Cli, db, l2Cfg.RelayerConfig, chainConfig, true, ServiceTypeL2RollupRelayer, nil) + assert.NoError(t, err) + + l2BlockOrm := orm.NewL2Block(db) + err = l2BlockOrm.InsertL2Blocks(context.Background(), []*encoding.Block{block1, block2}) + assert.NoError(t, err) + chunkOrm := orm.NewChunk(db) + _, err = chunkOrm.InsertChunk(context.Background(), chunk1, codecVersion) + assert.NoError(t, err) + _, err = chunkOrm.InsertChunk(context.Background(), chunk2, codecVersion) + assert.NoError(t, err) + + batch := &encoding.Batch{ + Index: 1, + TotalL1MessagePoppedBefore: 0, + ParentBatchHash: common.Hash{}, + Chunks: []*encoding.Chunk{chunk1, chunk2}, + } + + batchOrm := orm.NewBatch(db) + dbBatch, err := batchOrm.InsertBatch(context.Background(), batch, codecVersion) + assert.NoError(t, err) + + err = batchOrm.UpdateRollupStatus(context.Background(), dbBatch.Hash, types.RollupCommitted) + assert.NoError(t, err) + + err = batchOrm.UpdateProvingStatus(context.Background(), dbBatch.Hash, types.ProvingTaskVerified) + assert.NoError(t, err) + + relayer.ProcessCommittedBatches() + + statuses, err := batchOrm.GetRollupStatusByHashList(context.Background(), []string{dbBatch.Hash}) + assert.NoError(t, err) + assert.Equal(t, 1, len(statuses)) + // no valid proof, rollup status remains the same + assert.Equal(t, types.RollupCommitted, statuses[0]) + + proof := &message.BatchProof{ + Proof: []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}, + } + err = batchOrm.UpdateProofByHash(context.Background(), dbBatch.Hash, proof, 100) + assert.NoError(t, err) + + relayer.ProcessCommittedBatches() + statuses, err = batchOrm.GetRollupStatusByHashList(context.Background(), []string{dbBatch.Hash}) + assert.NoError(t, err) + assert.Equal(t, 1, len(statuses)) + assert.Equal(t, types.RollupFinalizing, statuses[0]) + relayer.StopSenders() } - batchOrm := orm.NewBatch(db) - batch, err := batchOrm.InsertBatch(context.Background(), []*types.Chunk{chunk1, chunk2}, batchMeta) - assert.NoError(t, err) - - err = batchOrm.UpdateRollupStatus(context.Background(), batch.Hash, types.RollupCommitted) - assert.NoError(t, err) - - err = batchOrm.UpdateProvingStatus(context.Background(), batch.Hash, types.ProvingTaskVerified) - assert.NoError(t, err) - - relayer.ProcessCommittedBatches() - - statuses, err := batchOrm.GetRollupStatusByHashList(context.Background(), []string{batch.Hash}) - assert.NoError(t, err) - assert.Equal(t, 1, len(statuses)) - // no valid proof, rollup status remains the same - assert.Equal(t, types.RollupCommitted, statuses[0]) - - proof := &message.BatchProof{ - Proof: []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}, - } - err = batchOrm.UpdateProofByHash(context.Background(), batch.Hash, proof, 100) - assert.NoError(t, err) - - relayer.ProcessCommittedBatches() - statuses, err = batchOrm.GetRollupStatusByHashList(context.Background(), []string{batch.Hash}) - assert.NoError(t, err) - assert.Equal(t, 1, len(statuses)) - assert.Equal(t, types.RollupFinalizing, statuses[0]) } func testL2RelayerFinalizeTimeoutBatches(t *testing.T) { - db := setupL2RelayerDB(t) - defer database.CloseDB(db) + codecVersions := []encoding.CodecVersion{encoding.CodecV0, encoding.CodecV1} + for _, codecVersion := range codecVersions { + db := setupL2RelayerDB(t) + defer database.CloseDB(db) - l2Cfg := cfg.L2Config - l2Cfg.RelayerConfig.EnableTestEnvBypassFeatures = true - l2Cfg.RelayerConfig.FinalizeBatchWithoutProofTimeoutSec = 0 - relayer, err := NewLayer2Relayer(context.Background(), l2Cli, db, l2Cfg.RelayerConfig, false, ServiceTypeL2RollupRelayer, nil) - assert.NoError(t, err) - batchMeta := &types.BatchMeta{ - StartChunkIndex: 0, - StartChunkHash: chunkHash1.Hex(), - EndChunkIndex: 1, - EndChunkHash: chunkHash2.Hex(), + l2Cfg := cfg.L2Config + l2Cfg.RelayerConfig.EnableTestEnvBypassFeatures = true + l2Cfg.RelayerConfig.FinalizeBatchWithoutProofTimeoutSec = 0 + chainConfig := ¶ms.ChainConfig{} + if codecVersion == encoding.CodecV0 { + chainConfig.BernoulliBlock = big.NewInt(0) + } + relayer, err := NewLayer2Relayer(context.Background(), l2Cli, db, l2Cfg.RelayerConfig, chainConfig, true, ServiceTypeL2RollupRelayer, nil) + assert.NoError(t, err) + + l2BlockOrm := orm.NewL2Block(db) + err = l2BlockOrm.InsertL2Blocks(context.Background(), []*encoding.Block{block1, block2}) + assert.NoError(t, err) + chunkOrm := orm.NewChunk(db) + _, err = chunkOrm.InsertChunk(context.Background(), chunk1, codecVersion) + assert.NoError(t, err) + _, err = chunkOrm.InsertChunk(context.Background(), chunk2, codecVersion) + assert.NoError(t, err) + + batch := &encoding.Batch{ + Index: 1, + TotalL1MessagePoppedBefore: 0, + ParentBatchHash: common.Hash{}, + Chunks: []*encoding.Chunk{chunk1, chunk2}, + } + + batchOrm := orm.NewBatch(db) + dbBatch, err := batchOrm.InsertBatch(context.Background(), batch, codecVersion) + assert.NoError(t, err) + + err = batchOrm.UpdateRollupStatus(context.Background(), dbBatch.Hash, types.RollupCommitted) + assert.NoError(t, err) + + // Check the database for the updated status using TryTimes. + ok := utils.TryTimes(5, func() bool { + relayer.ProcessCommittedBatches() + statuses, err := batchOrm.GetRollupStatusByHashList(context.Background(), []string{dbBatch.Hash}) + return err == nil && len(statuses) == 1 && statuses[0] == types.RollupFinalizing + }) + assert.True(t, ok) + relayer.StopSenders() } - batchOrm := orm.NewBatch(db) - batch, err := batchOrm.InsertBatch(context.Background(), []*types.Chunk{chunk1, chunk2}, batchMeta) - assert.NoError(t, err) - - err = batchOrm.UpdateRollupStatus(context.Background(), batch.Hash, types.RollupCommitted) - assert.NoError(t, err) - - // Check the database for the updated status using TryTimes. - ok := utils.TryTimes(5, func() bool { - relayer.ProcessCommittedBatches() - statuses, err := batchOrm.GetRollupStatusByHashList(context.Background(), []string{batch.Hash}) - return err == nil && len(statuses) == 1 && statuses[0] == types.RollupFinalizing - }) - assert.True(t, ok) } func testL2RelayerCommitConfirm(t *testing.T) { @@ -160,23 +219,25 @@ func testL2RelayerCommitConfirm(t *testing.T) { l2Cfg := cfg.L2Config ctx, cancel := context.WithCancel(context.Background()) defer cancel() - l2Relayer, err := NewLayer2Relayer(ctx, l2Cli, db, l2Cfg.RelayerConfig, false, ServiceTypeL2RollupRelayer, nil) + l2Relayer, err := NewLayer2Relayer(ctx, l2Cli, db, l2Cfg.RelayerConfig, ¶ms.ChainConfig{}, true, ServiceTypeL2RollupRelayer, nil) assert.NoError(t, err) + defer l2Relayer.StopSenders() // Simulate message confirmations. isSuccessful := []bool{true, false} batchOrm := orm.NewBatch(db) batchHashes := make([]string, len(isSuccessful)) for i := range batchHashes { - batchMeta := &types.BatchMeta{ - StartChunkIndex: 0, - StartChunkHash: chunkHash1.Hex(), - EndChunkIndex: 1, - EndChunkHash: chunkHash2.Hex(), + batch := &encoding.Batch{ + Index: uint64(i + 1), + TotalL1MessagePoppedBefore: 0, + ParentBatchHash: common.Hash{}, + Chunks: []*encoding.Chunk{chunk1, chunk2}, } - batch, err := batchOrm.InsertBatch(context.Background(), []*types.Chunk{chunk1, chunk2}, batchMeta) + + dbBatch, err := batchOrm.InsertBatch(context.Background(), batch, encoding.CodecV0) assert.NoError(t, err) - batchHashes[i] = batch.Hash + batchHashes[i] = dbBatch.Hash } for i, batchHash := range batchHashes { @@ -214,23 +275,25 @@ func testL2RelayerFinalizeConfirm(t *testing.T) { l2Cfg := cfg.L2Config ctx, cancel := context.WithCancel(context.Background()) defer cancel() - l2Relayer, err := NewLayer2Relayer(ctx, l2Cli, db, l2Cfg.RelayerConfig, false, ServiceTypeL2RollupRelayer, nil) + l2Relayer, err := NewLayer2Relayer(ctx, l2Cli, db, l2Cfg.RelayerConfig, ¶ms.ChainConfig{}, true, ServiceTypeL2RollupRelayer, nil) assert.NoError(t, err) + defer l2Relayer.StopSenders() // Simulate message confirmations. isSuccessful := []bool{true, false} batchOrm := orm.NewBatch(db) batchHashes := make([]string, len(isSuccessful)) for i := range batchHashes { - batchMeta := &types.BatchMeta{ - StartChunkIndex: 0, - StartChunkHash: chunkHash1.Hex(), - EndChunkIndex: 1, - EndChunkHash: chunkHash2.Hex(), + batch := &encoding.Batch{ + Index: uint64(i + 1), + TotalL1MessagePoppedBefore: 0, + ParentBatchHash: common.Hash{}, + Chunks: []*encoding.Chunk{chunk1, chunk2}, } - batch, err := batchOrm.InsertBatch(context.Background(), []*types.Chunk{chunk1, chunk2}, batchMeta) + + dbBatch, err := batchOrm.InsertBatch(context.Background(), batch, encoding.CodecV0) assert.NoError(t, err) - batchHashes[i] = batch.Hash + batchHashes[i] = dbBatch.Hash } for i, batchHash := range batchHashes { @@ -264,31 +327,34 @@ func testL2RelayerGasOracleConfirm(t *testing.T) { db := setupL2RelayerDB(t) defer database.CloseDB(db) - batchMeta1 := &types.BatchMeta{ - StartChunkIndex: 0, - StartChunkHash: chunkHash1.Hex(), - EndChunkIndex: 0, - EndChunkHash: chunkHash1.Hex(), + batch1 := &encoding.Batch{ + Index: 0, + TotalL1MessagePoppedBefore: 0, + ParentBatchHash: common.Hash{}, + Chunks: []*encoding.Chunk{chunk1}, } + batchOrm := orm.NewBatch(db) - batch1, err := batchOrm.InsertBatch(context.Background(), []*types.Chunk{chunk1}, batchMeta1) + dbBatch1, err := batchOrm.InsertBatch(context.Background(), batch1, encoding.CodecV0) assert.NoError(t, err) - batchMeta2 := &types.BatchMeta{ - StartChunkIndex: 1, - StartChunkHash: chunkHash2.Hex(), - EndChunkIndex: 1, - EndChunkHash: chunkHash2.Hex(), + batch2 := &encoding.Batch{ + Index: batch1.Index + 1, + TotalL1MessagePoppedBefore: batch1.TotalL1MessagePoppedBefore, + ParentBatchHash: common.HexToHash(dbBatch1.Hash), + Chunks: []*encoding.Chunk{chunk2}, } - batch2, err := batchOrm.InsertBatch(context.Background(), []*types.Chunk{chunk2}, batchMeta2) + + dbBatch2, err := batchOrm.InsertBatch(context.Background(), batch2, encoding.CodecV0) assert.NoError(t, err) // Create and set up the Layer2 Relayer. l2Cfg := cfg.L2Config ctx, cancel := context.WithCancel(context.Background()) defer cancel() - l2Relayer, err := NewLayer2Relayer(ctx, l2Cli, db, l2Cfg.RelayerConfig, false, ServiceTypeL2GasOracle, nil) + l2Relayer, err := NewLayer2Relayer(ctx, l2Cli, db, l2Cfg.RelayerConfig, ¶ms.ChainConfig{}, false, ServiceTypeL2GasOracle, nil) assert.NoError(t, err) + defer l2Relayer.StopSenders() // Simulate message confirmations. type BatchConfirmation struct { @@ -297,8 +363,8 @@ func testL2RelayerGasOracleConfirm(t *testing.T) { } confirmations := []BatchConfirmation{ - {batchHash: batch1.Hash, isSuccessful: true}, - {batchHash: batch2.Hash, isSuccessful: false}, + {batchHash: dbBatch1.Hash, isSuccessful: true}, + {batchHash: dbBatch2.Hash, isSuccessful: false}, } for _, confirmation := range confirmations { @@ -326,9 +392,10 @@ func testLayer2RelayerProcessGasPriceOracle(t *testing.T) { db := setupL2RelayerDB(t) defer database.CloseDB(db) - relayer, err := NewLayer2Relayer(context.Background(), l2Cli, db, cfg.L2Config.RelayerConfig, false, ServiceTypeL2GasOracle, nil) + relayer, err := NewLayer2Relayer(context.Background(), l2Cli, db, cfg.L2Config.RelayerConfig, ¶ms.ChainConfig{}, false, ServiceTypeL2GasOracle, nil) assert.NoError(t, err) assert.NotNil(t, relayer) + defer relayer.StopSenders() var batchOrm *orm.Batch convey.Convey("Failed to GetLatestBatch", t, func() { @@ -375,13 +442,13 @@ func testLayer2RelayerProcessGasPriceOracle(t *testing.T) { convey.Convey("Failed to send setL2BaseFee tx to layer2", t, func() { targetErr := errors.New("failed to send setL2BaseFee tx to layer2 error") - patchGuard.ApplyMethodFunc(relayer.gasOracleSender, "SendTransaction", func(ContextID string, target *common.Address, value *big.Int, data []byte, fallbackGasLimit uint64) (hash common.Hash, err error) { + patchGuard.ApplyMethodFunc(relayer.gasOracleSender, "SendTransaction", func(ContextID string, target *common.Address, data []byte, blob *kzg4844.Blob, fallbackGasLimit uint64) (hash common.Hash, err error) { return common.Hash{}, targetErr }) relayer.ProcessGasPriceOracle() }) - patchGuard.ApplyMethodFunc(relayer.gasOracleSender, "SendTransaction", func(ContextID string, target *common.Address, value *big.Int, data []byte, fallbackGasLimit uint64) (hash common.Hash, err error) { + patchGuard.ApplyMethodFunc(relayer.gasOracleSender, "SendTransaction", func(ContextID string, target *common.Address, data []byte, blob *kzg4844.Blob, fallbackGasLimit uint64) (hash common.Hash, err error) { return common.HexToHash("0x56789abcdef1234"), nil }) @@ -420,30 +487,33 @@ func testGetBatchStatusByIndex(t *testing.T) { db := setupL2RelayerDB(t) defer database.CloseDB(db) - l2BlockOrm := orm.NewL2Block(db) - err := l2BlockOrm.InsertL2Blocks(context.Background(), []*types.WrappedBlock{wrappedBlock1, wrappedBlock2}) - assert.NoError(t, err) - chunkOrm := orm.NewChunk(db) - dbChunk1, err := chunkOrm.InsertChunk(context.Background(), chunk1) - assert.NoError(t, err) - dbChunk2, err := chunkOrm.InsertChunk(context.Background(), chunk2) - assert.NoError(t, err) - batchMeta := &types.BatchMeta{ - StartChunkIndex: 0, - StartChunkHash: dbChunk1.Hash, - EndChunkIndex: 1, - EndChunkHash: dbChunk2.Hash, - } - batchOrm := orm.NewBatch(db) - batch, err := batchOrm.InsertBatch(context.Background(), []*types.Chunk{chunk1, chunk2}, batchMeta) - assert.NoError(t, err) - cfg.L2Config.RelayerConfig.ChainMonitor.Enabled = true - relayer, err := NewLayer2Relayer(context.Background(), l2Cli, db, cfg.L2Config.RelayerConfig, false, ServiceTypeL2RollupRelayer, nil) + relayer, err := NewLayer2Relayer(context.Background(), l2Cli, db, cfg.L2Config.RelayerConfig, ¶ms.ChainConfig{}, true, ServiceTypeL2RollupRelayer, nil) assert.NoError(t, err) assert.NotNil(t, relayer) + defer relayer.StopSenders() - status, err := relayer.getBatchStatusByIndex(batch) + l2BlockOrm := orm.NewL2Block(db) + err = l2BlockOrm.InsertL2Blocks(context.Background(), []*encoding.Block{block1, block2}) + assert.NoError(t, err) + chunkOrm := orm.NewChunk(db) + _, err = chunkOrm.InsertChunk(context.Background(), chunk1, encoding.CodecV0) + assert.NoError(t, err) + _, err = chunkOrm.InsertChunk(context.Background(), chunk2, encoding.CodecV0) + assert.NoError(t, err) + + batch := &encoding.Batch{ + Index: 1, + TotalL1MessagePoppedBefore: 0, + ParentBatchHash: common.Hash{}, + Chunks: []*encoding.Chunk{chunk1, chunk2}, + } + + batchOrm := orm.NewBatch(db) + dbBatch, err := batchOrm.InsertBatch(context.Background(), batch, encoding.CodecV0) + assert.NoError(t, err) + + status, err := relayer.getBatchStatusByIndex(dbBatch) assert.NoError(t, err) assert.Equal(t, true, status) } diff --git a/rollup/internal/controller/relayer/relayer_test.go b/rollup/internal/controller/relayer/relayer_test.go index d2ddb1250..c3ee3e9f7 100644 --- a/rollup/internal/controller/relayer/relayer_test.go +++ b/rollup/internal/controller/relayer/relayer_test.go @@ -14,8 +14,10 @@ import ( "github.com/stretchr/testify/assert" "scroll-tech/common/database" - "scroll-tech/common/docker" - "scroll-tech/common/types" + dockercompose "scroll-tech/common/docker-compose/l1" + "scroll-tech/common/testcontainers" + "scroll-tech/common/types/encoding" + "scroll-tech/common/types/encoding/codecv0" "scroll-tech/rollup/internal/config" ) @@ -24,18 +26,19 @@ var ( // config cfg *config.Config - base *docker.App + testApps *testcontainers.TestcontainerApps + posL1TestEnv *dockercompose.PoSL1TestEnv // l2geth client l2Cli *ethclient.Client // l2 block - wrappedBlock1 *types.WrappedBlock - wrappedBlock2 *types.WrappedBlock + block1 *encoding.Block + block2 *encoding.Block // chunk - chunk1 *types.Chunk - chunk2 *types.Chunk + chunk1 *encoding.Chunk + chunk2 *encoding.Chunk chunkHash1 common.Hash chunkHash2 common.Hash ) @@ -50,15 +53,25 @@ func setupEnv(t *testing.T) { cfg, err = config.NewConfig("../../../conf/config.json") assert.NoError(t, err) - base.RunImages(t) + posL1TestEnv, err = dockercompose.NewPoSL1TestEnv() + assert.NoError(t, err, "failed to create PoS L1 test environment") + assert.NoError(t, posL1TestEnv.Start(), "failed to start PoS L1 test environment") - cfg.L2Config.RelayerConfig.SenderConfig.Endpoint = base.L1gethImg.Endpoint() - cfg.L1Config.RelayerConfig.SenderConfig.Endpoint = base.L2gethImg.Endpoint() + testApps = testcontainers.NewTestcontainerApps() + assert.NoError(t, testApps.StartPostgresContainer()) + assert.NoError(t, testApps.StartL2GethContainer()) + + cfg.L2Config.RelayerConfig.SenderConfig.Endpoint = posL1TestEnv.Endpoint() + cfg.L1Config.RelayerConfig.SenderConfig.Endpoint, err = testApps.GetL2GethEndPoint() + assert.NoError(t, err) + + dsn, err := testApps.GetDBEndPoint() + assert.NoError(t, err) cfg.DBConfig = &database.Config{ - DSN: base.DBConfig.DSN, - DriverName: base.DBConfig.DriverName, - MaxOpenNum: base.DBConfig.MaxOpenNum, - MaxIdleNum: base.DBConfig.MaxIdleNum, + DSN: dsn, + DriverName: "postgres", + MaxOpenNum: 200, + MaxIdleNum: 20, } port, err := rand.Int(rand.Reader, big.NewInt(10000)) assert.NoError(t, err) @@ -66,34 +79,42 @@ func setupEnv(t *testing.T) { cfg.L2Config.RelayerConfig.ChainMonitor.BaseURL = "http://localhost:" + svrPort // Create l2geth client. - l2Cli, err = base.L2Client() + l2Cli, err = testApps.GetL2GethClient() assert.NoError(t, err) templateBlockTrace1, err := os.ReadFile("../../../testdata/blockTrace_02.json") assert.NoError(t, err) - wrappedBlock1 = &types.WrappedBlock{} - err = json.Unmarshal(templateBlockTrace1, wrappedBlock1) + block1 = &encoding.Block{} + err = json.Unmarshal(templateBlockTrace1, block1) assert.NoError(t, err) - chunk1 = &types.Chunk{Blocks: []*types.WrappedBlock{wrappedBlock1}} - chunkHash1, err = chunk1.Hash(0) + chunk1 = &encoding.Chunk{Blocks: []*encoding.Block{block1}} + daChunk1, err := codecv0.NewDAChunk(chunk1, 0) + assert.NoError(t, err) + chunkHash1, err = daChunk1.Hash() assert.NoError(t, err) templateBlockTrace2, err := os.ReadFile("../../../testdata/blockTrace_03.json") assert.NoError(t, err) - wrappedBlock2 = &types.WrappedBlock{} - err = json.Unmarshal(templateBlockTrace2, wrappedBlock2) + block2 = &encoding.Block{} + err = json.Unmarshal(templateBlockTrace2, block2) assert.NoError(t, err) - chunk2 = &types.Chunk{Blocks: []*types.WrappedBlock{wrappedBlock2}} - chunkHash2, err = chunk2.Hash(chunk1.NumL1Messages(0)) + chunk2 = &encoding.Chunk{Blocks: []*encoding.Block{block2}} + daChunk2, err := codecv0.NewDAChunk(chunk2, chunk1.NumL1Messages(0)) + assert.NoError(t, err) + chunkHash2, err = daChunk2.Hash() assert.NoError(t, err) } func TestMain(m *testing.M) { - base = docker.NewDockerApp() - + defer func() { + if testApps != nil { + testApps.Free() + } + if posL1TestEnv != nil { + posL1TestEnv.Stop() + } + }() m.Run() - - base.Free() } func TestFunctions(t *testing.T) { diff --git a/rollup/internal/controller/sender/estimategas.go b/rollup/internal/controller/sender/estimategas.go index 846638d33..ce9ddf222 100644 --- a/rollup/internal/controller/sender/estimategas.go +++ b/rollup/internal/controller/sender/estimategas.go @@ -7,16 +7,17 @@ import ( "github.com/scroll-tech/go-ethereum" "github.com/scroll-tech/go-ethereum/common" "github.com/scroll-tech/go-ethereum/core/types" + gethTypes "github.com/scroll-tech/go-ethereum/core/types" "github.com/scroll-tech/go-ethereum/log" ) -func (s *Sender) estimateLegacyGas(to *common.Address, value *big.Int, data []byte, fallbackGasLimit uint64) (*FeeData, error) { +func (s *Sender) estimateLegacyGas(to *common.Address, data []byte, fallbackGasLimit uint64) (*FeeData, error) { gasPrice, err := s.client.SuggestGasPrice(s.ctx) if err != nil { log.Error("estimateLegacyGas SuggestGasPrice failure", "error", err) return nil, err } - gasLimit, _, err := s.estimateGasLimit(to, data, gasPrice, nil, nil, value, false) + gasLimit, _, err := s.estimateGasLimit(to, data, nil, gasPrice, nil, nil, nil) if err != nil { log.Error("estimateLegacyGas estimateGasLimit failure", "gas price", gasPrice, "from", s.auth.From.String(), "nonce", s.auth.Nonce.Uint64(), "to address", to.String(), "fallback gas limit", fallbackGasLimit, "error", err) @@ -33,15 +34,15 @@ func (s *Sender) estimateLegacyGas(to *common.Address, value *big.Int, data []by }, nil } -func (s *Sender) estimateDynamicGas(to *common.Address, value *big.Int, data []byte, fallbackGasLimit uint64, baseFee uint64) (*FeeData, error) { +func (s *Sender) estimateDynamicGas(to *common.Address, data []byte, baseFee uint64, fallbackGasLimit uint64) (*FeeData, error) { gasTipCap, err := s.client.SuggestGasTipCap(s.ctx) if err != nil { log.Error("estimateDynamicGas SuggestGasTipCap failure", "error", err) return nil, err } - gasFeeCap := new(big.Int).Add(gasTipCap, new(big.Int).Mul(new(big.Int).SetUint64(baseFee), big.NewInt(2))) - gasLimit, accessList, err := s.estimateGasLimit(to, data, nil, gasTipCap, gasFeeCap, value, true) + gasFeeCap := getGasFeeCap(new(big.Int).SetUint64(baseFee), gasTipCap) + gasLimit, accessList, err := s.estimateGasLimit(to, data, nil, nil, gasTipCap, gasFeeCap, nil) if err != nil { log.Error("estimateDynamicGas estimateGasLimit failure", "from", s.auth.From.String(), "nonce", s.auth.Nonce.Uint64(), "to address", to.String(), @@ -64,23 +65,62 @@ func (s *Sender) estimateDynamicGas(to *common.Address, value *big.Int, data []b return feeData, nil } -func (s *Sender) estimateGasLimit(to *common.Address, data []byte, gasPrice, gasTipCap, gasFeeCap, value *big.Int, useAccessList bool) (uint64, *types.AccessList, error) { +func (s *Sender) estimateBlobGas(to *common.Address, data []byte, sidecar *gethTypes.BlobTxSidecar, baseFee, blobBaseFee uint64, fallbackGasLimit uint64) (*FeeData, error) { + gasTipCap, err := s.client.SuggestGasTipCap(s.ctx) + if err != nil { + log.Error("estimateBlobGas SuggestGasTipCap failure", "error", err) + return nil, err + } + + gasFeeCap := getGasFeeCap(new(big.Int).SetUint64(baseFee), gasTipCap) + blobGasFeeCap := getBlobGasFeeCap(new(big.Int).SetUint64(blobBaseFee)) + gasLimit, accessList, err := s.estimateGasLimit(to, data, sidecar, nil, gasTipCap, gasFeeCap, blobGasFeeCap) + if err != nil { + log.Error("estimateBlobGas estimateGasLimit failure", + "from", s.auth.From.String(), "nonce", s.auth.Nonce.Uint64(), "to address", to.String(), + "fallback gas limit", fallbackGasLimit, "error", err) + if fallbackGasLimit == 0 { + return nil, err + } + gasLimit = fallbackGasLimit + } else { + gasLimit = gasLimit * 12 / 10 // 20% extra gas to avoid out of gas error + } + feeData := &FeeData{ + gasLimit: gasLimit, + gasTipCap: gasTipCap, + gasFeeCap: gasFeeCap, + blobGasFeeCap: blobGasFeeCap, + } + + if accessList != nil { + feeData.accessList = *accessList + } + return feeData, nil +} + +func (s *Sender) estimateGasLimit(to *common.Address, data []byte, sidecar *gethTypes.BlobTxSidecar, gasPrice, gasTipCap, gasFeeCap, blobGasFeeCap *big.Int) (uint64, *types.AccessList, error) { msg := ethereum.CallMsg{ From: s.auth.From, To: to, GasPrice: gasPrice, GasTipCap: gasTipCap, GasFeeCap: gasFeeCap, - Value: value, Data: data, } + + if sidecar != nil { + msg.BlobHashes = sidecar.BlobHashes() + msg.BlobGasFeeCap = blobGasFeeCap + } + gasLimitWithoutAccessList, err := s.client.EstimateGas(s.ctx, msg) if err != nil { log.Error("estimateGasLimit EstimateGas failure without access list", "error", err) return 0, nil, err } - if !useAccessList { + if s.config.TxType == LegacyTxType { return gasLimitWithoutAccessList, nil, nil } @@ -130,3 +170,16 @@ func finetuneAccessList(accessList *types.AccessList, gasLimitWithAccessList uin } return &newAccessList, gasLimitWithAccessList } + +func getGasFeeCap(baseFee, gasTipCap *big.Int) *big.Int { + // gasFeeCap = baseFee * 2 + gasTipCap + gasFeeCap := new(big.Int).Mul(baseFee, big.NewInt(2)) + gasFeeCap = new(big.Int).Add(gasFeeCap, gasTipCap) + return gasFeeCap +} + +func getBlobGasFeeCap(blobBaseFee *big.Int) *big.Int { + // blobGasFeeCap = blobBaseFee * 2 + blobGasFeeCap := new(big.Int).Mul(blobBaseFee, big.NewInt(2)) + return blobGasFeeCap +} diff --git a/rollup/internal/controller/sender/sender.go b/rollup/internal/controller/sender/sender.go index 196e58e62..8e4f35a51 100644 --- a/rollup/internal/controller/sender/sender.go +++ b/rollup/internal/controller/sender/sender.go @@ -10,10 +10,13 @@ import ( "strings" "time" + "github.com/holiman/uint256" "github.com/prometheus/client_golang/prometheus" "github.com/scroll-tech/go-ethereum/accounts/abi/bind" "github.com/scroll-tech/go-ethereum/common" + "github.com/scroll-tech/go-ethereum/consensus/misc" gethTypes "github.com/scroll-tech/go-ethereum/core/types" + "github.com/scroll-tech/go-ethereum/crypto/kzg4844" "github.com/scroll-tech/go-ethereum/ethclient" "github.com/scroll-tech/go-ethereum/ethclient/gethclient" "github.com/scroll-tech/go-ethereum/log" @@ -29,14 +32,11 @@ import ( ) const ( - // AccessListTxType type for AccessListTx - AccessListTxType = "AccessListTx" + // LegacyTxType type for LegacyTx + LegacyTxType = "LegacyTx" // DynamicFeeTxType type for DynamicFeeTx DynamicFeeTxType = "DynamicFeeTx" - - // LegacyTxType type for LegacyTx - LegacyTxType = "LegacyTx" ) // Confirmation struct used to indicate transaction confirmation details @@ -53,6 +53,8 @@ type FeeData struct { gasTipCap *big.Int gasPrice *big.Int + blobGasFeeCap *big.Int + accessList gethTypes.AccessList gasLimit uint64 @@ -153,35 +155,51 @@ func (s *Sender) SendConfirmation(cfm *Confirmation) { s.confirmCh <- cfm } -func (s *Sender) getFeeData(target *common.Address, value *big.Int, data []byte, fallbackGasLimit uint64, baseFee uint64) (*FeeData, error) { - if s.config.TxType == DynamicFeeTxType { - return s.estimateDynamicGas(target, value, data, fallbackGasLimit, baseFee) +func (s *Sender) getFeeData(target *common.Address, data []byte, sidecar *gethTypes.BlobTxSidecar, baseFee, blobBaseFee uint64, fallbackGasLimit uint64) (*FeeData, error) { + switch s.config.TxType { + case LegacyTxType: + return s.estimateLegacyGas(target, data, fallbackGasLimit) + case DynamicFeeTxType: + if sidecar == nil { + return s.estimateDynamicGas(target, data, baseFee, fallbackGasLimit) + } + return s.estimateBlobGas(target, data, sidecar, baseFee, blobBaseFee, fallbackGasLimit) + default: + return nil, fmt.Errorf("unsupported transaction type: %s", s.config.TxType) } - return s.estimateLegacyGas(target, value, data, fallbackGasLimit) } // SendTransaction send a signed L2tL1 transaction. -func (s *Sender) SendTransaction(contextID string, target *common.Address, value *big.Int, data []byte, fallbackGasLimit uint64) (common.Hash, error) { +func (s *Sender) SendTransaction(contextID string, target *common.Address, data []byte, blob *kzg4844.Blob, fallbackGasLimit uint64) (common.Hash, error) { s.metrics.sendTransactionTotal.WithLabelValues(s.service, s.name).Inc() var ( feeData *FeeData tx *gethTypes.Transaction + sidecar *gethTypes.BlobTxSidecar err error ) - blockNumber, baseFee, err := s.getBlockNumberAndBaseFee(s.ctx) + if blob != nil { + sidecar, err = makeSidecar(blob) + if err != nil { + log.Error("failed to make sidecar for blob transaction", "error", err) + return common.Hash{}, fmt.Errorf("failed to make sidecar for blob transaction, err: %w", err) + } + } + + blockNumber, baseFee, blobBaseFee, err := s.getBlockNumberAndBaseFeeAndBlobFee(s.ctx) if err != nil { log.Error("failed to get block number and base fee", "error", err) return common.Hash{}, fmt.Errorf("failed to get block number and base fee, err: %w", err) } - if feeData, err = s.getFeeData(target, value, data, fallbackGasLimit, baseFee); err != nil { + if feeData, err = s.getFeeData(target, data, sidecar, baseFee, blobBaseFee, fallbackGasLimit); err != nil { s.metrics.sendTransactionFailureGetFee.WithLabelValues(s.service, s.name).Inc() log.Error("failed to get fee data", "from", s.auth.From.String(), "nonce", s.auth.Nonce.Uint64(), "fallback gas limit", fallbackGasLimit, "err", err) return common.Hash{}, fmt.Errorf("failed to get fee data, err: %w", err) } - if tx, err = s.createAndSendTx(feeData, target, value, data, nil); err != nil { + if tx, err = s.createAndSendTx(feeData, target, data, sidecar, nil); err != nil { s.metrics.sendTransactionFailureSendTx.WithLabelValues(s.service, s.name).Inc() log.Error("failed to create and send tx (non-resubmit case)", "from", s.auth.From.String(), "nonce", s.auth.Nonce.Uint64(), "err", err) return common.Hash{}, fmt.Errorf("failed to create and send transaction, err: %w", err) @@ -194,7 +212,7 @@ func (s *Sender) SendTransaction(contextID string, target *common.Address, value return tx.Hash(), nil } -func (s *Sender) createAndSendTx(feeData *FeeData, target *common.Address, value *big.Int, data []byte, overrideNonce *uint64) (*gethTypes.Transaction, error) { +func (s *Sender) createAndSendTx(feeData *FeeData, target *common.Address, data []byte, sidecar *gethTypes.BlobTxSidecar, overrideNonce *uint64) (*gethTypes.Transaction, error) { var ( nonce = s.auth.Nonce.Uint64() txData gethTypes.TxData @@ -207,58 +225,56 @@ func (s *Sender) createAndSendTx(feeData *FeeData, target *common.Address, value switch s.config.TxType { case LegacyTxType: - // for ganache mock node txData = &gethTypes.LegacyTx{ Nonce: nonce, GasPrice: feeData.gasPrice, Gas: feeData.gasLimit, To: target, - Value: new(big.Int).Set(value), - Data: common.CopyBytes(data), - V: new(big.Int), - R: new(big.Int), - S: new(big.Int), + Data: data, } - case AccessListTxType: - txData = &gethTypes.AccessListTx{ - ChainID: s.chainID, - Nonce: nonce, - GasPrice: feeData.gasPrice, - Gas: feeData.gasLimit, - To: target, - Value: new(big.Int).Set(value), - Data: common.CopyBytes(data), - AccessList: feeData.accessList, - V: new(big.Int), - R: new(big.Int), - S: new(big.Int), - } - default: - txData = &gethTypes.DynamicFeeTx{ - Nonce: nonce, - To: target, - Data: common.CopyBytes(data), - Gas: feeData.gasLimit, - AccessList: feeData.accessList, - Value: new(big.Int).Set(value), - ChainID: s.chainID, - GasTipCap: feeData.gasTipCap, - GasFeeCap: feeData.gasFeeCap, - V: new(big.Int), - R: new(big.Int), - S: new(big.Int), + case DynamicFeeTxType: + if sidecar == nil { + txData = &gethTypes.DynamicFeeTx{ + Nonce: nonce, + To: target, + Data: data, + Gas: feeData.gasLimit, + AccessList: feeData.accessList, + ChainID: s.chainID, + GasTipCap: feeData.gasTipCap, + GasFeeCap: feeData.gasFeeCap, + } + } else { + if target == nil { + log.Error("blob transaction to address cannot be nil", "address", s.auth.From.String(), "chainID", s.chainID.Uint64(), "nonce", s.auth.Nonce.Uint64()) + return nil, errors.New("blob transaction to address cannot be nil") + } + + txData = &gethTypes.BlobTx{ + ChainID: uint256.MustFromBig(s.chainID), + Nonce: nonce, + GasTipCap: uint256.MustFromBig(feeData.gasTipCap), + GasFeeCap: uint256.MustFromBig(feeData.gasFeeCap), + Gas: feeData.gasLimit, + To: *target, + Data: data, + AccessList: feeData.accessList, + BlobFeeCap: uint256.MustFromBig(feeData.blobGasFeeCap), + BlobHashes: sidecar.BlobHashes(), + Sidecar: sidecar, + } } } // sign and send - tx, err := s.auth.Signer(s.auth.From, gethTypes.NewTx(txData)) + signedTx, err := s.auth.Signer(s.auth.From, gethTypes.NewTx(txData)) if err != nil { log.Error("failed to sign tx", "address", s.auth.From.String(), "err", err) return nil, err } - if err = s.client.SendTransaction(s.ctx, tx); err != nil { - log.Error("failed to send tx", "tx hash", tx.Hash().String(), "from", s.auth.From.String(), "nonce", tx.Nonce(), "err", err) + if err = s.client.SendTransaction(s.ctx, signedTx); err != nil { + log.Error("failed to send tx", "tx hash", signedTx.Hash().String(), "from", s.auth.From.String(), "nonce", signedTx.Nonce(), "err", err) // Check if contain nonce, and reset nonce // only reset nonce when it is not from resubmit if strings.Contains(err.Error(), "nonce") && overrideNonce == nil { @@ -279,13 +295,17 @@ func (s *Sender) createAndSendTx(feeData *FeeData, target *common.Address, value s.metrics.currentGasPrice.WithLabelValues(s.service, s.name).Set(float64(feeData.gasPrice.Uint64())) } + if feeData.blobGasFeeCap != nil { + s.metrics.currentBlobGasFeeCap.WithLabelValues(s.service, s.name).Set(float64(feeData.blobGasFeeCap.Uint64())) + } + s.metrics.currentGasLimit.WithLabelValues(s.service, s.name).Set(float64(feeData.gasLimit)) // update nonce when it is not from resubmit if overrideNonce == nil { s.auth.Nonce = big.NewInt(int64(nonce + 1)) } - return tx, nil + return signedTx, nil } // resetNonce reset nonce if send signed tx failed. @@ -298,10 +318,11 @@ func (s *Sender) resetNonce(ctx context.Context) { s.auth.Nonce = big.NewInt(int64(nonce)) } -func (s *Sender) resubmitTransaction(tx *gethTypes.Transaction, baseFee uint64) (*gethTypes.Transaction, error) { +func (s *Sender) resubmitTransaction(tx *gethTypes.Transaction, baseFee, blobBaseFee uint64) (*gethTypes.Transaction, error) { escalateMultipleNum := new(big.Int).SetUint64(s.config.EscalateMultipleNum) escalateMultipleDen := new(big.Int).SetUint64(s.config.EscalateMultipleDen) maxGasPrice := new(big.Int).SetUint64(s.config.MaxGasPrice) + maxBlobGasPrice := new(big.Int).SetUint64(s.config.MaxBlobGasPrice) txInfo := map[string]interface{}{ "tx_hash": tx.Hash().String(), @@ -313,10 +334,10 @@ func (s *Sender) resubmitTransaction(tx *gethTypes.Transaction, baseFee uint64) var feeData FeeData feeData.gasLimit = tx.Gas() switch s.config.TxType { - case LegacyTxType, AccessListTxType: // `LegacyTxType`is for ganache mock node + case LegacyTxType: originalGasPrice := tx.GasPrice() - gasPrice := new(big.Int).Mul(escalateMultipleNum, originalGasPrice) - gasPrice = gasPrice.Div(gasPrice, escalateMultipleDen) + gasPrice := new(big.Int).Mul(originalGasPrice, escalateMultipleNum) + gasPrice = new(big.Int).Div(gasPrice, escalateMultipleDen) if gasPrice.Cmp(maxGasPrice) > 0 { gasPrice = maxGasPrice } @@ -329,57 +350,106 @@ func (s *Sender) resubmitTransaction(tx *gethTypes.Transaction, baseFee uint64) feeData.gasPrice = gasPrice txInfo["original_gas_price"] = originalGasPrice.Uint64() txInfo["adjusted_gas_price"] = gasPrice.Uint64() + + case DynamicFeeTxType: + if tx.BlobTxSidecar() == nil { + originalGasTipCap := tx.GasTipCap() + originalGasFeeCap := tx.GasFeeCap() + + gasTipCap := new(big.Int).Mul(originalGasTipCap, escalateMultipleNum) + gasTipCap = new(big.Int).Div(gasTipCap, escalateMultipleDen) + gasFeeCap := new(big.Int).Mul(originalGasFeeCap, escalateMultipleNum) + gasFeeCap = new(big.Int).Div(gasFeeCap, escalateMultipleDen) + + // adjust for rising basefee + currentGasFeeCap := getGasFeeCap(new(big.Int).SetUint64(baseFee), gasTipCap) + if gasFeeCap.Cmp(currentGasFeeCap) < 0 { + gasFeeCap = currentGasFeeCap + } + + // but don't exceed maxGasPrice + if gasFeeCap.Cmp(maxGasPrice) > 0 { + gasFeeCap = maxGasPrice + } + + // gasTipCap <= gasFeeCap + if gasTipCap.Cmp(gasFeeCap) > 0 { + gasTipCap = gasFeeCap + } + + if originalGasTipCap.Cmp(gasTipCap) == 0 { + log.Warn("gas tip cap bump corner case, add 1 wei", "original", originalGasTipCap.Uint64(), "adjusted", gasTipCap.Uint64()) + gasTipCap = new(big.Int).Add(gasTipCap, big.NewInt(1)) + } + + if originalGasFeeCap.Cmp(gasFeeCap) == 0 { + log.Warn("gas fee cap bump corner case, add 1 wei", "original", originalGasFeeCap.Uint64(), "adjusted", gasFeeCap.Uint64()) + gasFeeCap = new(big.Int).Add(gasFeeCap, big.NewInt(1)) + } + + feeData.gasFeeCap = gasFeeCap + feeData.gasTipCap = gasTipCap + txInfo["original_gas_tip_cap"] = originalGasTipCap.Uint64() + txInfo["adjusted_gas_tip_cap"] = gasTipCap.Uint64() + txInfo["original_gas_fee_cap"] = originalGasFeeCap.Uint64() + txInfo["adjusted_gas_fee_cap"] = gasFeeCap.Uint64() + } else { + originalGasTipCap := tx.GasTipCap() + originalGasFeeCap := tx.GasFeeCap() + originalBlobGasFeeCap := tx.BlobGasFeeCap() + + // bumping at least 100% + gasTipCap := new(big.Int).Mul(originalGasTipCap, big.NewInt(2)) + gasFeeCap := new(big.Int).Mul(originalGasFeeCap, big.NewInt(2)) + blobGasFeeCap := new(big.Int).Mul(originalBlobGasFeeCap, big.NewInt(2)) + + // adjust for rising basefee + currentGasFeeCap := getGasFeeCap(new(big.Int).SetUint64(baseFee), gasTipCap) + if gasFeeCap.Cmp(currentGasFeeCap) < 0 { + gasFeeCap = currentGasFeeCap + } + + // but don't exceed maxGasPrice + if gasFeeCap.Cmp(maxGasPrice) > 0 { + gasFeeCap = maxGasPrice + } + + // gasTipCap <= gasFeeCap + if gasTipCap.Cmp(gasFeeCap) > 0 { + gasTipCap = gasFeeCap + } + + // adjust for rising blobbasefee + currentBlobGasFeeCap := getBlobGasFeeCap(new(big.Int).SetUint64(blobBaseFee)) + if blobGasFeeCap.Cmp(currentBlobGasFeeCap) < 0 { + blobGasFeeCap = currentBlobGasFeeCap + } + + // but don't exceed maxBlobGasPrice + if blobGasFeeCap.Cmp(maxBlobGasPrice) > 0 { + blobGasFeeCap = maxBlobGasPrice + } + + feeData.gasFeeCap = gasFeeCap + feeData.gasTipCap = gasTipCap + feeData.blobGasFeeCap = blobGasFeeCap + txInfo["original_gas_tip_cap"] = originalGasTipCap.Uint64() + txInfo["adjusted_gas_tip_cap"] = gasTipCap.Uint64() + txInfo["original_gas_fee_cap"] = originalGasFeeCap.Uint64() + txInfo["adjusted_gas_fee_cap"] = gasFeeCap.Uint64() + txInfo["original_blob_gas_fee_cap"] = originalBlobGasFeeCap.Uint64() + txInfo["adjusted_blob_gas_fee_cap"] = blobGasFeeCap.Uint64() + } + default: - originalGasTipCap := tx.GasTipCap() - originalGasFeeCap := tx.GasFeeCap() - - gasTipCap := new(big.Int).Mul(originalGasTipCap, escalateMultipleNum) - gasTipCap = gasTipCap.Div(gasTipCap, escalateMultipleDen) - gasFeeCap := new(big.Int).Mul(originalGasFeeCap, escalateMultipleNum) - gasFeeCap = gasFeeCap.Div(gasFeeCap, escalateMultipleDen) - - // adjust for rising basefee - adjBaseFee := new(big.Int).SetUint64(baseFee) - adjBaseFee = adjBaseFee.Mul(adjBaseFee, escalateMultipleNum) - adjBaseFee = adjBaseFee.Div(adjBaseFee, escalateMultipleDen) - currentGasFeeCap := new(big.Int).Add(gasTipCap, adjBaseFee) - if gasFeeCap.Cmp(currentGasFeeCap) < 0 { - gasFeeCap = currentGasFeeCap - } - - // but don't exceed maxGasPrice - if gasFeeCap.Cmp(maxGasPrice) > 0 { - gasFeeCap = maxGasPrice - } - - // gasTipCap <= gasFeeCap - if gasTipCap.Cmp(gasFeeCap) > 0 { - gasTipCap = gasFeeCap - } - - if originalGasTipCap.Cmp(gasTipCap) == 0 { - log.Warn("gas tip cap bump corner case, add 1 wei", "original", originalGasTipCap.Uint64(), "adjusted", gasTipCap.Uint64()) - gasTipCap = new(big.Int).Add(gasTipCap, big.NewInt(1)) - } - - if originalGasFeeCap.Cmp(gasFeeCap) == 0 { - log.Warn("gas fee cap bump corner case, add 1 wei", "original", originalGasFeeCap.Uint64(), "adjusted", gasFeeCap.Uint64()) - gasFeeCap = new(big.Int).Add(gasFeeCap, big.NewInt(1)) - } - - feeData.gasFeeCap = gasFeeCap - feeData.gasTipCap = gasTipCap - txInfo["original_gas_tip_cap"] = originalGasTipCap.Uint64() - txInfo["adjusted_gas_tip_cap"] = gasTipCap.Uint64() - txInfo["original_gas_fee_cap"] = originalGasFeeCap.Uint64() - txInfo["adjusted_gas_fee_cap"] = gasFeeCap.Uint64() + return nil, fmt.Errorf("unsupported transaction type: %s", s.config.TxType) } log.Info("Transaction gas adjustment details", "service", s.service, "name", s.name, "txInfo", txInfo) nonce := tx.Nonce() s.metrics.resubmitTransactionTotal.WithLabelValues(s.service, s.name).Inc() - tx, err := s.createAndSendTx(&feeData, tx.To(), tx.Value(), tx.Data(), &nonce) + tx, err := s.createAndSendTx(&feeData, tx.To(), tx.Data(), tx.BlobTxSidecar(), &nonce) if err != nil { log.Error("failed to create and send tx (resubmit case)", "from", s.auth.From.String(), "nonce", nonce, "err", err) return nil, err @@ -392,7 +462,7 @@ func (s *Sender) resubmitTransaction(tx *gethTypes.Transaction, baseFee uint64) func (s *Sender) checkPendingTransaction() { s.metrics.senderCheckPendingTransactionTotal.WithLabelValues(s.service, s.name).Inc() - blockNumber, baseFee, err := s.getBlockNumberAndBaseFee(s.ctx) + blockNumber, baseFee, blobBaseFee, err := s.getBlockNumberAndBaseFeeAndBlobFee(s.ctx) if err != nil { log.Error("failed to get block number and base fee", "error", err) return @@ -418,7 +488,7 @@ func (s *Sender) checkPendingTransaction() { } receipt, err := s.client.TransactionReceipt(s.ctx, tx.Hash()) - if (err == nil) && (receipt != nil) { // tx confirmed. + if err == nil { // tx confirmed. if receipt.BlockNumber.Uint64() <= confirmed { err := s.db.Transaction(func(dbTX *gorm.DB) error { // Update the status of the transaction to TxStatusConfirmed. @@ -470,7 +540,7 @@ func (s *Sender) checkPendingTransaction() { "currentBlockNumber", blockNumber, "escalateBlocks", s.config.EscalateBlocks) - if newTx, err := s.resubmitTransaction(tx, baseFee); err != nil { + if newTx, err := s.resubmitTransaction(tx, baseFee, blobBaseFee); err != nil { s.metrics.resubmitTransactionFailedTotal.WithLabelValues(s.service, s.name).Inc() log.Error("failed to resubmit transaction", "context ID", txnToCheck.ContextID, "sender meta", s.getSenderMeta(), "from", s.auth.From.String(), "nonce", tx.Nonce(), "err", err) } else { @@ -520,19 +590,52 @@ func (s *Sender) getSenderMeta() *orm.SenderMeta { } } -func (s *Sender) getBlockNumberAndBaseFee(ctx context.Context) (uint64, uint64, error) { +func (s *Sender) getBlockNumberAndBaseFeeAndBlobFee(ctx context.Context) (uint64, uint64, uint64, error) { header, err := s.client.HeaderByNumber(ctx, nil) if err != nil { - return 0, 0, fmt.Errorf("failed to get header by number, err: %w", err) + return 0, 0, 0, fmt.Errorf("failed to get header by number, err: %w", err) } - var baseFeePerGas uint64 - if s.config.TxType == DynamicFeeTxType { - if header.BaseFee != nil { - baseFeePerGas = header.BaseFee.Uint64() - } else { - return 0, 0, errors.New("dynamic fee tx type not supported: header.BaseFee is nil") - } + var baseFee uint64 + if header.BaseFee != nil { + baseFee = header.BaseFee.Uint64() } - return header.Number.Uint64(), baseFeePerGas, nil + + var blobBaseFee uint64 + if header.ExcessBlobGas != nil && header.BlobGasUsed != nil { + parentExcessBlobGas := misc.CalcExcessBlobGas(*header.ExcessBlobGas, *header.BlobGasUsed) + blobBaseFee = misc.CalcBlobFee(parentExcessBlobGas).Uint64() + } + return header.Number.Uint64(), baseFee, blobBaseFee, nil +} + +func makeSidecar(blob *kzg4844.Blob) (*gethTypes.BlobTxSidecar, error) { + if blob == nil { + return nil, errors.New("blob cannot be nil") + } + + blobs := []kzg4844.Blob{*blob} + var commitments []kzg4844.Commitment + var proofs []kzg4844.Proof + + for _, b := range blobs { + c, err := kzg4844.BlobToCommitment(b) + if err != nil { + return nil, fmt.Errorf("failed to get blob commitment, err: %w", err) + } + + p, err := kzg4844.ComputeBlobProof(b, c) + if err != nil { + return nil, fmt.Errorf("failed to compute blob proof, err: %w", err) + } + + commitments = append(commitments, c) + proofs = append(proofs, p) + } + + return &gethTypes.BlobTxSidecar{ + Blobs: blobs, + Commitments: commitments, + Proofs: proofs, + }, nil } diff --git a/rollup/internal/controller/sender/sender_metrics.go b/rollup/internal/controller/sender/sender_metrics.go index a23935dd9..7220aeb0f 100644 --- a/rollup/internal/controller/sender/sender_metrics.go +++ b/rollup/internal/controller/sender/sender_metrics.go @@ -17,6 +17,7 @@ type senderMetrics struct { currentGasFeeCap *prometheus.GaugeVec currentGasTipCap *prometheus.GaugeVec currentGasPrice *prometheus.GaugeVec + currentBlobGasFeeCap *prometheus.GaugeVec currentGasLimit *prometheus.GaugeVec } @@ -60,6 +61,10 @@ func initSenderMetrics(reg prometheus.Registerer) *senderMetrics { Name: "rollup_sender_gas_price_cap", Help: "The gas price of current transaction.", }, []string{"service", "name"}), + currentBlobGasFeeCap: promauto.With(reg).NewGaugeVec(prometheus.GaugeOpts{ + Name: "rollup_sender_blob_gas_fee_cap", + Help: "The blob gas fee cap of current transaction.", + }, []string{"service", "name"}), currentGasLimit: promauto.With(reg).NewGaugeVec(prometheus.GaugeOpts{ Name: "rollup_sender_gas_limit", Help: "The gas limit of current transaction.", diff --git a/rollup/internal/controller/sender/sender_test.go b/rollup/internal/controller/sender/sender_test.go index 145cc1a85..579becf46 100644 --- a/rollup/internal/controller/sender/sender_test.go +++ b/rollup/internal/controller/sender/sender_test.go @@ -3,50 +3,62 @@ package sender import ( "context" "crypto/ecdsa" + "crypto/rand" "errors" "fmt" "math/big" "os" "testing" + "time" "github.com/agiledragon/gomonkey/v2" + "github.com/consensys/gnark-crypto/ecc/bls12-381/fr" + gokzg4844 "github.com/crate-crypto/go-kzg-4844" + "github.com/holiman/uint256" "github.com/scroll-tech/go-ethereum/accounts/abi/bind" "github.com/scroll-tech/go-ethereum/common" gethTypes "github.com/scroll-tech/go-ethereum/core/types" "github.com/scroll-tech/go-ethereum/crypto" + "github.com/scroll-tech/go-ethereum/crypto/kzg4844" "github.com/scroll-tech/go-ethereum/ethclient" "github.com/scroll-tech/go-ethereum/log" "github.com/scroll-tech/go-ethereum/rpc" "github.com/stretchr/testify/assert" "gorm.io/gorm" - "scroll-tech/common/database" - "scroll-tech/common/docker" + dockercompose "scroll-tech/common/docker-compose/l1" + "scroll-tech/common/testcontainers" "scroll-tech/common/types" "scroll-tech/database/migrate" bridgeAbi "scroll-tech/rollup/abi" "scroll-tech/rollup/internal/config" + "scroll-tech/rollup/internal/orm" "scroll-tech/rollup/mock_bridge" ) -const TXBatch = 50 - var ( - privateKey *ecdsa.PrivateKey - cfg *config.Config - base *docker.App - txTypes = []string{"LegacyTx", "AccessListTx", "DynamicFeeTx"} - db *gorm.DB - mockL1ContractsAddress common.Address + privateKey *ecdsa.PrivateKey + cfg *config.Config + testApps *testcontainers.TestcontainerApps + posL1TestEnv *dockercompose.PoSL1TestEnv + txTypes = []string{"LegacyTx", "DynamicFeeTx", "DynamicFeeTx"} + txBlob = []*kzg4844.Blob{nil, nil, randBlob()} + txUint8Types = []uint8{0, 2, 3} + db *gorm.DB + testContractsAddress common.Address ) func TestMain(m *testing.M) { - base = docker.NewDockerApp() - + defer func() { + if testApps != nil { + testApps.Free() + } + if posL1TestEnv != nil { + posL1TestEnv.Stop() + } + }() m.Run() - - base.Free() } func setupEnv(t *testing.T) { @@ -61,52 +73,76 @@ func setupEnv(t *testing.T) { assert.NoError(t, err) privateKey = priv - base.RunL1Geth(t) - cfg.L1Config.RelayerConfig.SenderConfig.Endpoint = base.L1gethImg.Endpoint() + posL1TestEnv, err = dockercompose.NewPoSL1TestEnv() + assert.NoError(t, err, "failed to create PoS L1 test environment") + assert.NoError(t, posL1TestEnv.Start(), "failed to start PoS L1 test environment") - base.RunDBImage(t) - db, err = database.InitDB( - &database.Config{ - DSN: base.DBConfig.DSN, - DriverName: base.DBConfig.DriverName, - MaxOpenNum: base.DBConfig.MaxOpenNum, - MaxIdleNum: base.DBConfig.MaxIdleNum, - }, - ) + testApps = testcontainers.NewTestcontainerApps() + assert.NoError(t, testApps.StartPostgresContainer()) + assert.NoError(t, testApps.StartL1GethContainer()) + assert.NoError(t, testApps.StartL2GethContainer()) + + cfg.L2Config.RelayerConfig.SenderConfig.Endpoint = posL1TestEnv.Endpoint() + + db, err = testApps.GetGormDBClient() assert.NoError(t, err) sqlDB, err := db.DB() assert.NoError(t, err) assert.NoError(t, migrate.ResetDB(sqlDB)) - auth, err := bind.NewKeyedTransactorWithChainID(privateKey, base.L1gethImg.ChainID()) + l1Client, err := posL1TestEnv.L1Client() assert.NoError(t, err) - l1Client, err := base.L1Client() + chainID, err := l1Client.ChainID(context.Background()) assert.NoError(t, err) - _, tx, _, err := mock_bridge.DeployMockBridgeL1(auth, l1Client) + auth, err := bind.NewKeyedTransactorWithChainID(privateKey, chainID) assert.NoError(t, err) - mockL1ContractsAddress, err = bind.WaitDeployed(context.Background(), l1Client, tx) + nonce, err := l1Client.PendingNonceAt(context.Background(), auth.From) assert.NoError(t, err) + + testContractsAddress = crypto.CreateAddress(auth.From, nonce) + + tx := gethTypes.NewContractCreation(nonce, big.NewInt(0), 10000000, big.NewInt(10000000000), common.FromHex(mock_bridge.MockBridgeMetaData.Bin)) + signedTx, err := auth.Signer(auth.From, tx) + assert.NoError(t, err) + err = l1Client.SendTransaction(context.Background(), signedTx) + assert.NoError(t, err) + + assert.Eventually(t, func() bool { + _, isPending, err := l1Client.TransactionByHash(context.Background(), signedTx.Hash()) + return err == nil && !isPending + }, 30*time.Second, time.Second) + + assert.Eventually(t, func() bool { + receipt, err := l1Client.TransactionReceipt(context.Background(), signedTx.Hash()) + return err == nil && receipt.Status == gethTypes.ReceiptStatusSuccessful + }, 30*time.Second, time.Second) + + assert.Eventually(t, func() bool { + code, err := l1Client.CodeAt(context.Background(), testContractsAddress, nil) + return err == nil && len(code) > 0 + }, 30*time.Second, time.Second) } func TestSender(t *testing.T) { - // Setup setupEnv(t) t.Run("test new sender", testNewSender) - t.Run("test fallback gas limit", testFallbackGasLimit) t.Run("test send and retrieve transaction", testSendAndRetrieveTransaction) + t.Run("test fallback gas limit", testFallbackGasLimit) t.Run("test access list transaction gas limit", testAccessListTransactionGasLimit) t.Run("test resubmit zero gas price transaction", testResubmitZeroGasPriceTransaction) t.Run("test resubmit non-zero gas price transaction", testResubmitNonZeroGasPriceTransaction) t.Run("test resubmit under priced transaction", testResubmitUnderpricedTransaction) - t.Run("test resubmit transaction with rising base fee", testResubmitTransactionWithRisingBaseFee) + t.Run("test resubmit dynamic fee transaction with rising base fee", testResubmitDynamicFeeTransactionWithRisingBaseFee) + t.Run("test resubmit blob transaction with rising base fee and blob base fee", testResubmitBlobTransactionWithRisingBaseFeeAndBlobBaseFee) t.Run("test check pending transaction tx confirmed", testCheckPendingTransactionTxConfirmed) t.Run("test check pending transaction resubmit tx confirmed", testCheckPendingTransactionResubmitTxConfirmed) t.Run("test check pending transaction replaced tx confirmed", testCheckPendingTransactionReplacedTxConfirmed) t.Run("test check pending transaction multiple times with only one transaction pending", testCheckPendingTransactionTxMultipleTimesWithOnlyOneTxPending) + t.Run("test blob transaction with blobhash op contract call", testBlobTransactionWithBlobhashOpContractCall) } func testNewSender(t *testing.T) { @@ -116,14 +152,14 @@ func testNewSender(t *testing.T) { assert.NoError(t, migrate.ResetDB(sqlDB)) // exit by Stop() - cfgCopy1 := *cfg.L1Config.RelayerConfig.SenderConfig + cfgCopy1 := *cfg.L2Config.RelayerConfig.SenderConfig cfgCopy1.TxType = txType newSender1, err := NewSender(context.Background(), &cfgCopy1, privateKey, "test", "test", types.SenderTypeUnknown, db, nil) assert.NoError(t, err) newSender1.Stop() // exit by ctx.Done() - cfgCopy2 := *cfg.L1Config.RelayerConfig.SenderConfig + cfgCopy2 := *cfg.L2Config.RelayerConfig.SenderConfig cfgCopy2.TxType = txType subCtx, cancel := context.WithCancel(context.Background()) _, err = NewSender(subCtx, &cfgCopy2, privateKey, "test", "test", types.SenderTypeUnknown, db, nil) @@ -138,35 +174,42 @@ func testSendAndRetrieveTransaction(t *testing.T) { assert.NoError(t, err) assert.NoError(t, migrate.ResetDB(sqlDB)) - cfgCopy := *cfg.L1Config.RelayerConfig.SenderConfig + cfgCopy := *cfg.L2Config.RelayerConfig.SenderConfig cfgCopy.TxType = txType s, err := NewSender(context.Background(), &cfgCopy, privateKey, "test", "test", types.SenderTypeUnknown, db, nil) assert.NoError(t, err) - hash, err := s.SendTransaction("0", &common.Address{}, big.NewInt(0), nil, 0) + hash, err := s.SendTransaction("0", &common.Address{}, nil, txBlob[i], 0) assert.NoError(t, err) txs, err := s.pendingTransactionOrm.GetPendingOrReplacedTransactionsBySenderType(context.Background(), s.senderType, 1) assert.NoError(t, err) assert.Len(t, txs, 1) assert.Equal(t, "0", txs[0].ContextID) assert.Equal(t, hash.String(), txs[0].Hash) - assert.Equal(t, uint8(i), txs[0].Type) + assert.Equal(t, txUint8Types[i], txs[0].Type) assert.Equal(t, types.TxStatusPending, txs[0].Status) assert.Equal(t, "0x1C5A77d9FA7eF466951B2F01F724BCa3A5820b63", txs[0].SenderAddress) assert.Equal(t, types.SenderTypeUnknown, txs[0].SenderType) assert.Equal(t, "test", txs[0].SenderService) assert.Equal(t, "test", txs[0].SenderName) + + assert.Eventually(t, func() bool { + txs, err = s.pendingTransactionOrm.GetPendingOrReplacedTransactionsBySenderType(context.Background(), s.senderType, 100) + assert.NoError(t, err) + return len(txs) == 0 + }, 30*time.Second, time.Second) + s.Stop() } } func testFallbackGasLimit(t *testing.T) { - for _, txType := range txTypes { + for i, txType := range txTypes { sqlDB, err := db.DB() assert.NoError(t, err) assert.NoError(t, migrate.ResetDB(sqlDB)) - cfgCopy := *cfg.L1Config.RelayerConfig.SenderConfig + cfgCopy := *cfg.L2Config.RelayerConfig.SenderConfig cfgCopy.TxType = txType cfgCopy.Confirmations = rpc.LatestBlockNumber s, err := NewSender(context.Background(), &cfgCopy, privateKey, "test", "test", types.SenderTypeUnknown, db, nil) @@ -176,37 +219,54 @@ func testFallbackGasLimit(t *testing.T) { assert.NoError(t, err) // FallbackGasLimit = 0 - txHash0, err := s.SendTransaction("0", &common.Address{}, big.NewInt(0), nil, 0) + txHash0, err := s.SendTransaction("0", &common.Address{}, nil, txBlob[i], 0) assert.NoError(t, err) tx0, _, err := client.TransactionByHash(context.Background(), txHash0) assert.NoError(t, err) assert.Greater(t, tx0.Gas(), uint64(0)) + assert.Eventually(t, func() bool { + var txs []orm.PendingTransaction + txs, err = s.pendingTransactionOrm.GetPendingOrReplacedTransactionsBySenderType(context.Background(), s.senderType, 100) + assert.NoError(t, err) + return len(txs) == 0 + }, 30*time.Second, time.Second) + // FallbackGasLimit = 100000 patchGuard := gomonkey.ApplyPrivateMethod(s, "estimateGasLimit", - func(contract *common.Address, data []byte, gasPrice, gasTipCap, gasFeeCap, value *big.Int) (uint64, *gethTypes.AccessList, error) { + func(contract *common.Address, data []byte, sidecar *gethTypes.BlobTxSidecar, gasPrice, gasTipCap, gasFeeCap, blobGasFeeCap *big.Int) (uint64, *gethTypes.AccessList, error) { return 0, nil, errors.New("estimateGasLimit error") }, ) - txHash1, err := s.SendTransaction("1", &common.Address{}, big.NewInt(0), nil, 100000) + txHash1, err := s.SendTransaction("1", &common.Address{}, nil, txBlob[i], 100000) assert.NoError(t, err) tx1, _, err := client.TransactionByHash(context.Background(), txHash1) assert.NoError(t, err) assert.Equal(t, uint64(100000), tx1.Gas()) + assert.Eventually(t, func() bool { + txs, err := s.pendingTransactionOrm.GetPendingOrReplacedTransactionsBySenderType(context.Background(), s.senderType, 100) + assert.NoError(t, err) + return len(txs) == 0 + }, 30*time.Second, time.Second) + s.Stop() patchGuard.Reset() } } func testResubmitZeroGasPriceTransaction(t *testing.T) { - for _, txType := range txTypes { + for i, txType := range txTypes { + if txBlob[i] != nil { + continue + } + sqlDB, err := db.DB() assert.NoError(t, err) assert.NoError(t, migrate.ResetDB(sqlDB)) - cfgCopy := *cfg.L1Config.RelayerConfig.SenderConfig + cfgCopy := *cfg.L2Config.RelayerConfig.SenderConfig cfgCopy.TxType = txType s, err := NewSender(context.Background(), &cfgCopy, privateKey, "test", "test", types.SenderTypeUnknown, db, nil) assert.NoError(t, err) @@ -216,23 +276,37 @@ func testResubmitZeroGasPriceTransaction(t *testing.T) { gasFeeCap: big.NewInt(0), gasLimit: 50000, } - tx, err := s.createAndSendTx(feeData, &common.Address{}, big.NewInt(0), nil, nil) + tx, err := s.createAndSendTx(feeData, &common.Address{}, nil, nil, nil) assert.NoError(t, err) assert.NotNil(t, tx) // Increase at least 1 wei in gas price, gas tip cap and gas fee cap. - _, err = s.resubmitTransaction(tx, 0) - assert.NoError(t, err) + // Bumping the fees enough times to let the transaction be included in a block. + for i := 0; i < 30; i++ { + tx, err = s.resubmitTransaction(tx, 0, 0) + assert.NoError(t, err) + } + + assert.Eventually(t, func() bool { + _, isPending, err := s.client.TransactionByHash(context.Background(), tx.Hash()) + return err == nil && !isPending + }, 30*time.Second, time.Second) + + assert.Eventually(t, func() bool { + receipt, err := s.client.TransactionReceipt(context.Background(), tx.Hash()) + return err == nil && receipt != nil + }, 30*time.Second, time.Second) + s.Stop() } } func testAccessListTransactionGasLimit(t *testing.T) { - for _, txType := range txTypes { + for i, txType := range txTypes { sqlDB, err := db.DB() assert.NoError(t, err) assert.NoError(t, migrate.ResetDB(sqlDB)) - cfgCopy := *cfg.L1Config.RelayerConfig.SenderConfig + cfgCopy := *cfg.L2Config.RelayerConfig.SenderConfig cfgCopy.TxType = txType s, err := NewSender(context.Background(), &cfgCopy, privateKey, "test", "test", types.SenderTypeUnknown, db, nil) assert.NoError(t, err) @@ -240,30 +314,37 @@ func testAccessListTransactionGasLimit(t *testing.T) { l2GasOracleABI, err := bridgeAbi.L2GasPriceOracleMetaData.GetAbi() assert.NoError(t, err) - data, err := l2GasOracleABI.Pack("setL2BaseFee", big.NewInt(2333)) + data, err := l2GasOracleABI.Pack("setL2BaseFee", big.NewInt(int64(i+1))) assert.NoError(t, err) - gasLimit, accessList, err := s.estimateGasLimit(&mockL1ContractsAddress, data, big.NewInt(100000000000), big.NewInt(100000000000), big.NewInt(100000000000), big.NewInt(0), true) - assert.NoError(t, err) - assert.Equal(t, uint64(43472), gasLimit) - assert.NotNil(t, accessList) + var sidecar *gethTypes.BlobTxSidecar + if txBlob[i] != nil { + sidecar, err = makeSidecar(txBlob[i]) + assert.NoError(t, err) + } - gasLimit, accessList, err = s.estimateGasLimit(&mockL1ContractsAddress, data, big.NewInt(100000000000), big.NewInt(100000000000), big.NewInt(100000000000), big.NewInt(0), false) + gasLimit, accessList, err := s.estimateGasLimit(&testContractsAddress, data, sidecar, nil, big.NewInt(1000000000), big.NewInt(1000000000), big.NewInt(1000000000)) assert.NoError(t, err) - assert.Equal(t, uint64(43949), gasLimit) - assert.Nil(t, accessList) + + if txType == LegacyTxType { // Legacy transactions can not have an access list. + assert.Equal(t, uint64(43956), gasLimit) + assert.Nil(t, accessList) + } else { // Dynamic fee and blob transactions can have an access list. + assert.Equal(t, uint64(43479), gasLimit) + assert.NotNil(t, accessList) + } s.Stop() } } func testResubmitNonZeroGasPriceTransaction(t *testing.T) { - for _, txType := range txTypes { + for i, txType := range txTypes { sqlDB, err := db.DB() assert.NoError(t, err) assert.NoError(t, migrate.ResetDB(sqlDB)) - cfgCopy := *cfg.L1Config.RelayerConfig.SenderConfig + cfgCopy := *cfg.L2Config.RelayerConfig.SenderConfig // Bump gas price, gas tip cap and gas fee cap just touch the minimum threshold of 10% (default config of geth). cfgCopy.EscalateMultipleNum = 110 cfgCopy.EscalateMultipleDen = 100 @@ -271,27 +352,48 @@ func testResubmitNonZeroGasPriceTransaction(t *testing.T) { s, err := NewSender(context.Background(), &cfgCopy, privateKey, "test", "test", types.SenderTypeUnknown, db, nil) assert.NoError(t, err) feeData := &FeeData{ - gasPrice: big.NewInt(100000), - gasTipCap: big.NewInt(100000), - gasFeeCap: big.NewInt(100000), - gasLimit: 50000, + gasPrice: big.NewInt(1000000000), + gasTipCap: big.NewInt(1000000000), + gasFeeCap: big.NewInt(1000000000), + blobGasFeeCap: big.NewInt(1000000000), + gasLimit: 50000, } - tx, err := s.createAndSendTx(feeData, &common.Address{}, big.NewInt(0), nil, nil) + var sidecar *gethTypes.BlobTxSidecar + if txBlob[i] != nil { + sidecar, err = makeSidecar(txBlob[i]) + assert.NoError(t, err) + } + tx, err := s.createAndSendTx(feeData, &common.Address{}, nil, sidecar, nil) assert.NoError(t, err) assert.NotNil(t, tx) - _, err = s.resubmitTransaction(tx, 0) + resubmittedTx, err := s.resubmitTransaction(tx, 0, 0) assert.NoError(t, err) + + assert.Eventually(t, func() bool { + _, isPending, err := s.client.TransactionByHash(context.Background(), resubmittedTx.Hash()) + return err == nil && !isPending + }, 30*time.Second, time.Second) + + assert.Eventually(t, func() bool { + receipt, err := s.client.TransactionReceipt(context.Background(), resubmittedTx.Hash()) + return err == nil && receipt != nil + }, 30*time.Second, time.Second) + s.Stop() } } func testResubmitUnderpricedTransaction(t *testing.T) { - for _, txType := range txTypes { + for i, txType := range txTypes { + if txBlob[i] != nil { + continue + } + sqlDB, err := db.DB() assert.NoError(t, err) assert.NoError(t, migrate.ResetDB(sqlDB)) - cfgCopy := *cfg.L1Config.RelayerConfig.SenderConfig + cfgCopy := *cfg.L2Config.RelayerConfig.SenderConfig // Bump gas price, gas tip cap and gas fee cap less than 10% (default config of geth). cfgCopy.EscalateMultipleNum = 109 cfgCopy.EscalateMultipleDen = 100 @@ -299,54 +401,127 @@ func testResubmitUnderpricedTransaction(t *testing.T) { s, err := NewSender(context.Background(), &cfgCopy, privateKey, "test", "test", types.SenderTypeUnknown, db, nil) assert.NoError(t, err) feeData := &FeeData{ - gasPrice: big.NewInt(100000), - gasTipCap: big.NewInt(100000), - gasFeeCap: big.NewInt(100000), + gasPrice: big.NewInt(1000000000), + gasTipCap: big.NewInt(1000000000), + gasFeeCap: big.NewInt(1000000000), gasLimit: 50000, } - tx, err := s.createAndSendTx(feeData, &common.Address{}, big.NewInt(0), nil, nil) + tx, err := s.createAndSendTx(feeData, &common.Address{}, nil, nil, nil) assert.NoError(t, err) assert.NotNil(t, tx) - _, err = s.resubmitTransaction(tx, 0) + _, err = s.resubmitTransaction(tx, 0, 0) assert.Error(t, err, "replacement transaction underpriced") + + assert.Eventually(t, func() bool { + _, isPending, err := s.client.TransactionByHash(context.Background(), tx.Hash()) + return err == nil && !isPending + }, 30*time.Second, time.Second) + + assert.Eventually(t, func() bool { + receipt, err := s.client.TransactionReceipt(context.Background(), tx.Hash()) + return err == nil && receipt != nil + }, 30*time.Second, time.Second) + s.Stop() } } -func testResubmitTransactionWithRisingBaseFee(t *testing.T) { +func testResubmitDynamicFeeTransactionWithRisingBaseFee(t *testing.T) { sqlDB, err := db.DB() assert.NoError(t, err) assert.NoError(t, migrate.ResetDB(sqlDB)) txType := "DynamicFeeTx" - cfgCopy := *cfg.L1Config.RelayerConfig.SenderConfig + cfgCopy := *cfg.L2Config.RelayerConfig.SenderConfig cfgCopy.TxType = txType s, err := NewSender(context.Background(), &cfgCopy, privateKey, "test", "test", types.SenderTypeUnknown, db, nil) assert.NoError(t, err) - tx := gethTypes.NewTransaction(s.auth.Nonce.Uint64(), common.Address{}, big.NewInt(0), 21000, big.NewInt(0), nil) + + patchGuard := gomonkey.ApplyMethodFunc(s.client, "SendTransaction", func(_ context.Context, _ *gethTypes.Transaction) error { + return nil + }) + defer patchGuard.Reset() + + tx := gethTypes.NewTx(&gethTypes.DynamicFeeTx{ + Nonce: s.auth.Nonce.Uint64(), + To: &common.Address{}, + Data: nil, + Gas: 21000, + ChainID: s.chainID, + GasTipCap: big.NewInt(0), + GasFeeCap: big.NewInt(0), + }) baseFeePerGas := uint64(1000) // bump the basefee by 10x baseFeePerGas *= 10 // resubmit and check that the gas fee has been adjusted accordingly - newTx, err := s.resubmitTransaction(tx, baseFeePerGas) + newTx, err := s.resubmitTransaction(tx, baseFeePerGas, 0) assert.NoError(t, err) - escalateMultipleNum := new(big.Int).SetUint64(s.config.EscalateMultipleNum) - escalateMultipleDen := new(big.Int).SetUint64(s.config.EscalateMultipleDen) maxGasPrice := new(big.Int).SetUint64(s.config.MaxGasPrice) - - adjBaseFee := new(big.Int) - adjBaseFee.SetUint64(baseFeePerGas) - adjBaseFee = adjBaseFee.Mul(adjBaseFee, escalateMultipleNum) - adjBaseFee = adjBaseFee.Div(adjBaseFee, escalateMultipleDen) - - expectedGasFeeCap := new(big.Int).Add(tx.GasTipCap(), adjBaseFee) + expectedGasFeeCap := getGasFeeCap(new(big.Int).SetUint64(baseFeePerGas), tx.GasTipCap()) if expectedGasFeeCap.Cmp(maxGasPrice) > 0 { expectedGasFeeCap = maxGasPrice } - assert.Equal(t, expectedGasFeeCap.Int64(), newTx.GasFeeCap().Int64()) + assert.Equal(t, expectedGasFeeCap.Uint64(), newTx.GasFeeCap().Uint64()) + s.Stop() +} + +func testResubmitBlobTransactionWithRisingBaseFeeAndBlobBaseFee(t *testing.T) { + sqlDB, err := db.DB() + assert.NoError(t, err) + assert.NoError(t, migrate.ResetDB(sqlDB)) + + cfgCopy := *cfg.L2Config.RelayerConfig.SenderConfig + cfgCopy.TxType = DynamicFeeTxType + + s, err := NewSender(context.Background(), &cfgCopy, privateKey, "test", "test", types.SenderTypeUnknown, db, nil) + assert.NoError(t, err) + + patchGuard := gomonkey.ApplyMethodFunc(s.client, "SendTransaction", func(_ context.Context, _ *gethTypes.Transaction) error { + return nil + }) + defer patchGuard.Reset() + + sidecar, err := makeSidecar(randBlob()) + assert.NoError(t, err) + tx := gethTypes.NewTx(&gethTypes.BlobTx{ + ChainID: uint256.MustFromBig(s.chainID), + Nonce: s.auth.Nonce.Uint64(), + GasTipCap: uint256.MustFromBig(big.NewInt(0)), + GasFeeCap: uint256.MustFromBig(big.NewInt(0)), + Gas: 21000, + To: common.Address{}, + Data: nil, + BlobFeeCap: uint256.MustFromBig(big.NewInt(1)), + BlobHashes: sidecar.BlobHashes(), + Sidecar: sidecar, + }) + baseFeePerGas := uint64(1000) + blobBaseFeePerGas := uint64(10000000000000) // bounded by max blob base fee. + // bump the basefee and blobbasefee by 10x + baseFeePerGas *= 10 + blobBaseFeePerGas *= 10 + // resubmit and check that the gas fee has been adjusted accordingly + newTx, err := s.resubmitTransaction(tx, baseFeePerGas, blobBaseFeePerGas) + assert.NoError(t, err) + + maxGasPrice := new(big.Int).SetUint64(s.config.MaxGasPrice) + expectedGasFeeCap := getGasFeeCap(new(big.Int).SetUint64(baseFeePerGas), tx.GasTipCap()) + if expectedGasFeeCap.Cmp(maxGasPrice) > 0 { + expectedGasFeeCap = maxGasPrice + } + + maxBlobGasPrice := new(big.Int).SetUint64(s.config.MaxBlobGasPrice) + expectedBlobGasFeeCap := getBlobGasFeeCap(new(big.Int).SetUint64(blobBaseFeePerGas)) + if expectedBlobGasFeeCap.Cmp(maxBlobGasPrice) > 0 { + expectedBlobGasFeeCap = maxBlobGasPrice + } + + assert.Equal(t, expectedGasFeeCap.Uint64(), newTx.GasFeeCap().Uint64()) + assert.Equal(t, expectedBlobGasFeeCap.Uint64(), newTx.BlobGasFeeCap().Uint64()) s.Stop() } @@ -356,12 +531,16 @@ func testCheckPendingTransactionTxConfirmed(t *testing.T) { assert.NoError(t, err) assert.NoError(t, migrate.ResetDB(sqlDB)) - cfgCopy := *cfg.L1Config.RelayerConfig.SenderConfig + cfgCopy := *cfg.L2Config.RelayerConfig.SenderConfig cfgCopy.TxType = txType s, err := NewSender(context.Background(), &cfgCopy, privateKey, "test", "test", types.SenderTypeCommitBatch, db, nil) assert.NoError(t, err) - _, err = s.SendTransaction("test", &common.Address{}, big.NewInt(0), nil, 0) + patchGuard1 := gomonkey.ApplyMethodFunc(s.client, "SendTransaction", func(_ context.Context, _ *gethTypes.Transaction) error { + return nil + }) + + _, err = s.SendTransaction("test", &common.Address{}, nil, randBlob(), 0) assert.NoError(t, err) txs, err := s.pendingTransactionOrm.GetPendingOrReplacedTransactionsBySenderType(context.Background(), s.senderType, 1) @@ -370,7 +549,7 @@ func testCheckPendingTransactionTxConfirmed(t *testing.T) { assert.Equal(t, types.TxStatusPending, txs[0].Status) assert.Equal(t, types.SenderTypeCommitBatch, txs[0].SenderType) - patchGuard := gomonkey.ApplyMethodFunc(s.client, "TransactionReceipt", func(_ context.Context, hash common.Hash) (*gethTypes.Receipt, error) { + patchGuard2 := gomonkey.ApplyMethodFunc(s.client, "TransactionReceipt", func(_ context.Context, hash common.Hash) (*gethTypes.Receipt, error) { return &gethTypes.Receipt{TxHash: hash, BlockNumber: big.NewInt(0), Status: gethTypes.ReceiptStatusSuccessful}, nil }) @@ -382,7 +561,8 @@ func testCheckPendingTransactionTxConfirmed(t *testing.T) { assert.Len(t, txs, 0) s.Stop() - patchGuard.Reset() + patchGuard1.Reset() + patchGuard2.Reset() } } @@ -392,13 +572,17 @@ func testCheckPendingTransactionResubmitTxConfirmed(t *testing.T) { assert.NoError(t, err) assert.NoError(t, migrate.ResetDB(sqlDB)) - cfgCopy := *cfg.L1Config.RelayerConfig.SenderConfig + cfgCopy := *cfg.L2Config.RelayerConfig.SenderConfig cfgCopy.TxType = txType cfgCopy.EscalateBlocks = 0 s, err := NewSender(context.Background(), &cfgCopy, privateKey, "test", "test", types.SenderTypeFinalizeBatch, db, nil) assert.NoError(t, err) - originTxHash, err := s.SendTransaction("test", &common.Address{}, big.NewInt(0), nil, 0) + patchGuard1 := gomonkey.ApplyMethodFunc(s.client, "SendTransaction", func(_ context.Context, _ *gethTypes.Transaction) error { + return nil + }) + + originTxHash, err := s.SendTransaction("test", &common.Address{}, nil, randBlob(), 0) assert.NoError(t, err) txs, err := s.pendingTransactionOrm.GetPendingOrReplacedTransactionsBySenderType(context.Background(), s.senderType, 1) @@ -407,7 +591,7 @@ func testCheckPendingTransactionResubmitTxConfirmed(t *testing.T) { assert.Equal(t, types.TxStatusPending, txs[0].Status) assert.Equal(t, types.SenderTypeFinalizeBatch, txs[0].SenderType) - patchGuard := gomonkey.ApplyMethodFunc(s.client, "TransactionReceipt", func(_ context.Context, hash common.Hash) (*gethTypes.Receipt, error) { + patchGuard2 := gomonkey.ApplyMethodFunc(s.client, "TransactionReceipt", func(_ context.Context, hash common.Hash) (*gethTypes.Receipt, error) { if hash == originTxHash { return nil, fmt.Errorf("simulated transaction receipt error") } @@ -437,7 +621,8 @@ func testCheckPendingTransactionResubmitTxConfirmed(t *testing.T) { assert.Len(t, txs, 0) s.Stop() - patchGuard.Reset() + patchGuard1.Reset() + patchGuard2.Reset() } } @@ -447,13 +632,17 @@ func testCheckPendingTransactionReplacedTxConfirmed(t *testing.T) { assert.NoError(t, err) assert.NoError(t, migrate.ResetDB(sqlDB)) - cfgCopy := *cfg.L1Config.RelayerConfig.SenderConfig + cfgCopy := *cfg.L2Config.RelayerConfig.SenderConfig cfgCopy.TxType = txType cfgCopy.EscalateBlocks = 0 s, err := NewSender(context.Background(), &cfgCopy, privateKey, "test", "test", types.SenderTypeL1GasOracle, db, nil) assert.NoError(t, err) - txHash, err := s.SendTransaction("test", &common.Address{}, big.NewInt(0), nil, 0) + patchGuard1 := gomonkey.ApplyMethodFunc(s.client, "SendTransaction", func(_ context.Context, _ *gethTypes.Transaction) error { + return nil + }) + + txHash, err := s.SendTransaction("test", &common.Address{}, nil, randBlob(), 0) assert.NoError(t, err) txs, err := s.pendingTransactionOrm.GetPendingOrReplacedTransactionsBySenderType(context.Background(), s.senderType, 1) @@ -462,7 +651,7 @@ func testCheckPendingTransactionReplacedTxConfirmed(t *testing.T) { assert.Equal(t, types.TxStatusPending, txs[0].Status) assert.Equal(t, types.SenderTypeL1GasOracle, txs[0].SenderType) - patchGuard := gomonkey.ApplyMethodFunc(s.client, "TransactionReceipt", func(_ context.Context, hash common.Hash) (*gethTypes.Receipt, error) { + patchGuard2 := gomonkey.ApplyMethodFunc(s.client, "TransactionReceipt", func(_ context.Context, hash common.Hash) (*gethTypes.Receipt, error) { var status types.TxStatus status, err = s.pendingTransactionOrm.GetTxStatusByTxHash(context.Background(), hash) if err != nil { @@ -502,7 +691,8 @@ func testCheckPendingTransactionReplacedTxConfirmed(t *testing.T) { assert.Len(t, txs, 0) s.Stop() - patchGuard.Reset() + patchGuard1.Reset() + patchGuard2.Reset() } } @@ -512,13 +702,17 @@ func testCheckPendingTransactionTxMultipleTimesWithOnlyOneTxPending(t *testing.T assert.NoError(t, err) assert.NoError(t, migrate.ResetDB(sqlDB)) - cfgCopy := *cfg.L1Config.RelayerConfig.SenderConfig + cfgCopy := *cfg.L2Config.RelayerConfig.SenderConfig cfgCopy.TxType = txType cfgCopy.EscalateBlocks = 0 s, err := NewSender(context.Background(), &cfgCopy, privateKey, "test", "test", types.SenderTypeCommitBatch, db, nil) assert.NoError(t, err) - _, err = s.SendTransaction("test", &common.Address{}, big.NewInt(0), nil, 0) + patchGuard1 := gomonkey.ApplyMethodFunc(s.client, "SendTransaction", func(_ context.Context, _ *gethTypes.Transaction) error { + return nil + }) + + _, err = s.SendTransaction("test", &common.Address{}, nil, randBlob(), 0) assert.NoError(t, err) txs, err := s.pendingTransactionOrm.GetPendingOrReplacedTransactionsBySenderType(context.Background(), s.senderType, 1) @@ -527,7 +721,7 @@ func testCheckPendingTransactionTxMultipleTimesWithOnlyOneTxPending(t *testing.T assert.Equal(t, types.TxStatusPending, txs[0].Status) assert.Equal(t, types.SenderTypeCommitBatch, txs[0].SenderType) - patchGuard := gomonkey.ApplyMethodFunc(s.client, "TransactionReceipt", func(_ context.Context, hash common.Hash) (*gethTypes.Receipt, error) { + patchGuard2 := gomonkey.ApplyMethodFunc(s.client, "TransactionReceipt", func(_ context.Context, hash common.Hash) (*gethTypes.Receipt, error) { return nil, fmt.Errorf("simulated transaction receipt error") }) @@ -545,6 +739,87 @@ func testCheckPendingTransactionTxMultipleTimesWithOnlyOneTxPending(t *testing.T } s.Stop() - patchGuard.Reset() + patchGuard1.Reset() + patchGuard2.Reset() } } + +func testBlobTransactionWithBlobhashOpContractCall(t *testing.T) { + sqlDB, err := db.DB() + assert.NoError(t, err) + assert.NoError(t, migrate.ResetDB(sqlDB)) + + blob := randBlob() + sideCar, err := makeSidecar(blob) + assert.NoError(t, err) + versionedHash := sideCar.BlobHashes()[0] + blsModulo, ok := new(big.Int).SetString("52435875175126190479447740508185965837690552500527637822603658699938581184513", 10) + assert.True(t, ok) + pointHash := crypto.Keccak256Hash(versionedHash.Bytes()) + pointBigInt := new(big.Int).SetBytes(pointHash.Bytes()) + point := kzg4844.Point(new(big.Int).Mod(pointBigInt, blsModulo).Bytes()) + commitment := sideCar.Commitments[0] + proof, claim, err := kzg4844.ComputeProof(*blob, point) + assert.NoError(t, err) + + var claimArray [32]byte + copy(claimArray[:], claim[:]) + + demoContractMetaData := &bind.MetaData{ABI: "[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"claim\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"commitment\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"}],\"name\":\"verifyProof\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]"} + demoContractABI, err := demoContractMetaData.GetAbi() + assert.NoError(t, err) + + data, err := demoContractABI.Pack( + "verifyProof", + claimArray, + commitment[:], + proof[:], + ) + assert.NoError(t, err) + + cfgCopy := *cfg.L2Config.RelayerConfig.SenderConfig + cfgCopy.TxType = DynamicFeeTxType + s, err := NewSender(context.Background(), &cfgCopy, privateKey, "test", "test", types.SenderTypeL1GasOracle, db, nil) + assert.NoError(t, err) + defer s.Stop() + + _, err = s.SendTransaction("0", &testContractsAddress, data, blob, 0) + assert.NoError(t, err) + + var txHash common.Hash + assert.Eventually(t, func() bool { + txs, err := s.pendingTransactionOrm.GetConfirmedTransactionsBySenderType(context.Background(), s.senderType, 100) + assert.NoError(t, err) + if len(txs) == 1 { + txHash = common.HexToHash(txs[0].Hash) + return true + } + return false + }, 30*time.Second, time.Second) + + assert.Eventually(t, func() bool { + receipt, err := s.client.TransactionReceipt(context.Background(), txHash) + return err == nil && receipt.Status == gethTypes.ReceiptStatusSuccessful + }, 30*time.Second, time.Second) +} + +func randBlob() *kzg4844.Blob { + var blob kzg4844.Blob + for i := 0; i < len(blob); i += gokzg4844.SerializedScalarSize { + fieldElementBytes := randFieldElement() + copy(blob[i:i+gokzg4844.SerializedScalarSize], fieldElementBytes[:]) + } + return &blob +} + +func randFieldElement() [32]byte { + bytes := make([]byte, 32) + _, err := rand.Read(bytes) + if err != nil { + panic("failed to get random field element") + } + var r fr.Element + r.SetBytes(bytes) + + return gokzg4844.SerializeScalar(r) +} diff --git a/rollup/internal/controller/watcher/batch_proposer.go b/rollup/internal/controller/watcher/batch_proposer.go index 0c3b0ba1d..2909092fd 100644 --- a/rollup/internal/controller/watcher/batch_proposer.go +++ b/rollup/internal/controller/watcher/batch_proposer.go @@ -3,17 +3,22 @@ package watcher import ( "context" "fmt" + "math/big" "time" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" + "github.com/scroll-tech/go-ethereum/common" "github.com/scroll-tech/go-ethereum/log" + "github.com/scroll-tech/go-ethereum/params" "gorm.io/gorm" - "scroll-tech/common/types" + "scroll-tech/common/forks" + "scroll-tech/common/types/encoding" "scroll-tech/rollup/internal/config" "scroll-tech/rollup/internal/orm" + "scroll-tech/rollup/internal/utils" ) // BatchProposer proposes batches based on available unbatched chunks. @@ -27,9 +32,12 @@ type BatchProposer struct { maxChunkNumPerBatch uint64 maxL1CommitGasPerBatch uint64 - maxL1CommitCalldataSizePerBatch uint32 + maxL1CommitCalldataSizePerBatch uint64 batchTimeoutSec uint64 gasCostIncreaseMultiplier float64 + forkMap map[uint64]bool + + chainCfg *params.ChainConfig batchProposerCircleTotal prometheus.Counter proposeBatchFailureTotal prometheus.Counter @@ -37,21 +45,24 @@ type BatchProposer struct { proposeBatchUpdateInfoFailureTotal prometheus.Counter totalL1CommitGas prometheus.Gauge totalL1CommitCalldataSize prometheus.Gauge + totalL1CommitBlobSize prometheus.Gauge batchChunksNum prometheus.Gauge batchFirstBlockTimeoutReached prometheus.Counter batchChunksProposeNotEnoughTotal prometheus.Counter } // NewBatchProposer creates a new BatchProposer instance. -func NewBatchProposer(ctx context.Context, cfg *config.BatchProposerConfig, db *gorm.DB, reg prometheus.Registerer) *BatchProposer { +func NewBatchProposer(ctx context.Context, cfg *config.BatchProposerConfig, chainCfg *params.ChainConfig, db *gorm.DB, reg prometheus.Registerer) *BatchProposer { + forkHeights, forkMap, _ := forks.CollectSortedForkHeights(chainCfg) log.Debug("new batch proposer", "maxChunkNumPerBatch", cfg.MaxChunkNumPerBatch, "maxL1CommitGasPerBatch", cfg.MaxL1CommitGasPerBatch, "maxL1CommitCalldataSizePerBatch", cfg.MaxL1CommitCalldataSizePerBatch, "batchTimeoutSec", cfg.BatchTimeoutSec, - "gasCostIncreaseMultiplier", cfg.GasCostIncreaseMultiplier) + "gasCostIncreaseMultiplier", cfg.GasCostIncreaseMultiplier, + "forkHeights", forkHeights) - return &BatchProposer{ + p := &BatchProposer{ ctx: ctx, db: db, batchOrm: orm.NewBatch(db), @@ -62,6 +73,8 @@ func NewBatchProposer(ctx context.Context, cfg *config.BatchProposerConfig, db * maxL1CommitCalldataSizePerBatch: cfg.MaxL1CommitCalldataSizePerBatch, batchTimeoutSec: cfg.BatchTimeoutSec, gasCostIncreaseMultiplier: cfg.GasCostIncreaseMultiplier, + forkMap: forkMap, + chainCfg: chainCfg, batchProposerCircleTotal: promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "rollup_propose_batch_circle_total", @@ -87,6 +100,10 @@ func NewBatchProposer(ctx context.Context, cfg *config.BatchProposerConfig, db * Name: "rollup_propose_batch_total_l1_call_data_size", Help: "The total l1 call data size", }), + totalL1CommitBlobSize: promauto.With(reg).NewGauge(prometheus.GaugeOpts{ + Name: "rollup_propose_batch_total_l1_commit_blob_size", + Help: "The total l1 commit blob size", + }), batchChunksNum: promauto.With(reg).NewGauge(prometheus.GaugeOpts{ Name: "rollup_propose_batch_chunks_number", Help: "The number of chunks in the batch", @@ -100,198 +117,173 @@ func NewBatchProposer(ctx context.Context, cfg *config.BatchProposerConfig, db * Help: "Total number of batch chunk propose not enough", }), } + + return p } // TryProposeBatch tries to propose a new batches. func (p *BatchProposer) TryProposeBatch() { p.batchProposerCircleTotal.Inc() - dbChunks, batchMeta, err := p.proposeBatchChunks() - if err != nil { + if err := p.proposeBatch(); err != nil { p.proposeBatchFailureTotal.Inc() log.Error("proposeBatchChunks failed", "err", err) return } - if err := p.updateBatchInfoInDB(dbChunks, batchMeta); err != nil { - p.proposeBatchUpdateInfoFailureTotal.Inc() - log.Error("update batch info in db failed", "err", err) - } } -func (p *BatchProposer) updateBatchInfoInDB(dbChunks []*orm.Chunk, batchMeta *types.BatchMeta) error { - p.proposeBatchUpdateInfoTotal.Inc() - numChunks := len(dbChunks) - if numChunks <= 0 { - return nil - } - chunks, err := p.dbChunksToRollupChunks(dbChunks) - if err != nil { - return err - } - - batchMeta.StartChunkIndex = dbChunks[0].Index - batchMeta.StartChunkHash = dbChunks[0].Hash - batchMeta.EndChunkIndex = dbChunks[numChunks-1].Index - batchMeta.EndChunkHash = dbChunks[numChunks-1].Hash - err = p.db.Transaction(func(dbTX *gorm.DB) error { - batch, dbErr := p.batchOrm.InsertBatch(p.ctx, chunks, batchMeta, dbTX) +func (p *BatchProposer) updateDBBatchInfo(batch *encoding.Batch, codecVersion encoding.CodecVersion) error { + err := p.db.Transaction(func(dbTX *gorm.DB) error { + batch, dbErr := p.batchOrm.InsertBatch(p.ctx, batch, codecVersion, dbTX) if dbErr != nil { log.Warn("BatchProposer.updateBatchInfoInDB insert batch failure", - "start chunk index", batchMeta.StartChunkIndex, "end chunk index", batchMeta.EndChunkIndex, "error", dbErr) + "start chunk index", batch.StartChunkIndex, "end chunk index", batch.EndChunkIndex, "error", dbErr) return dbErr } - dbErr = p.chunkOrm.UpdateBatchHashInRange(p.ctx, batchMeta.StartChunkIndex, batchMeta.EndChunkIndex, batch.Hash, dbTX) + dbErr = p.chunkOrm.UpdateBatchHashInRange(p.ctx, batch.StartChunkIndex, batch.EndChunkIndex, batch.Hash, dbTX) if dbErr != nil { log.Warn("BatchProposer.UpdateBatchHashInRange update the chunk's batch hash failure", "hash", batch.Hash, "error", dbErr) return dbErr } return nil }) - return err + if err != nil { + p.proposeBatchUpdateInfoFailureTotal.Inc() + log.Error("update batch info in db failed", "err", err) + } + return nil } -func (p *BatchProposer) proposeBatchChunks() ([]*orm.Chunk, *types.BatchMeta, error) { +func (p *BatchProposer) proposeBatch() error { unbatchedChunkIndex, err := p.batchOrm.GetFirstUnbatchedChunkIndex(p.ctx) if err != nil { - return nil, nil, err + return err } // select at most p.maxChunkNumPerBatch chunks dbChunks, err := p.chunkOrm.GetChunksGEIndex(p.ctx, unbatchedChunkIndex, int(p.maxChunkNumPerBatch)) if err != nil { - return nil, nil, err + return err } if len(dbChunks) == 0 { - return nil, nil, nil - } - - var totalL1CommitCalldataSize uint32 - var totalL1CommitGas uint64 - var totalChunks uint64 - var totalL1MessagePopped uint64 - var batchMeta types.BatchMeta - - parentBatch, err := p.batchOrm.GetLatestBatch(p.ctx) - if err != nil { - return nil, nil, err - } - - // Add extra gas costs - totalL1CommitGas += 100000 // constant to account for ops like _getAdmin, _implementation, _requireNotPaused, etc - totalL1CommitGas += 4 * 2100 // 4 one-time cold sload for commitBatch - totalL1CommitGas += 20000 // 1 time sstore - totalL1CommitGas += 21000 // base fee for tx - totalL1CommitGas += types.CalldataNonZeroByteGas // version in calldata - - // adjusting gas: - // add 1 time cold sload (2100 gas) for L1MessageQueue - // add 1 time cold address access (2600 gas) for L1MessageQueue - // minus 1 time warm sload (100 gas) & 1 time warm address access (100 gas) - totalL1CommitGas += (2100 + 2600 - 100 - 100) - if parentBatch != nil { - totalL1CommitGas += types.GetKeccak256Gas(uint64(len(parentBatch.BatchHeader))) // parent batch header hash - totalL1CommitGas += types.CalldataNonZeroByteGas * uint64(len(parentBatch.BatchHeader)) // parent batch header in calldata + return nil } + maxChunksThisBatch := p.maxChunkNumPerBatch for i, chunk := range dbChunks { - // metric values - batchMeta.TotalL1CommitGas = totalL1CommitGas - batchMeta.TotalL1CommitCalldataSize = totalL1CommitCalldataSize + // if a chunk is starting at a fork boundary, only consider earlier chunks + if i != 0 && p.forkMap[chunk.StartBlockNumber] { + dbChunks = dbChunks[:i] + if uint64(len(dbChunks)) < maxChunksThisBatch { + maxChunksThisBatch = uint64(len(dbChunks)) + } + break + } + } - totalL1CommitCalldataSize += chunk.TotalL1CommitCalldataSize - totalL1CommitGas += chunk.TotalL1CommitGas - // adjust batch data hash gas cost - totalL1CommitGas -= types.GetKeccak256Gas(32 * totalChunks) - totalChunks++ - totalL1CommitGas += types.GetKeccak256Gas(32 * totalChunks) - // adjust batch header hash gas cost, batch header size: 89 + 32 * ceil(l1MessagePopped / 256) - totalL1CommitGas -= types.GetKeccak256Gas(89 + 32*(totalL1MessagePopped+255)/256) - totalL1CommitGas -= types.CalldataNonZeroByteGas * (32 * (totalL1MessagePopped + 255) / 256) - totalL1CommitGas -= types.GetMemoryExpansionCost(uint64(totalL1CommitCalldataSize)) - totalL1MessagePopped += uint64(chunk.TotalL1MessagesPoppedInChunk) - totalL1CommitGas += types.CalldataNonZeroByteGas * (32 * (totalL1MessagePopped + 255) / 256) - totalL1CommitGas += types.GetKeccak256Gas(89 + 32*(totalL1MessagePopped+255)/256) - totalL1CommitGas += types.GetMemoryExpansionCost(uint64(totalL1CommitCalldataSize)) - totalOverEstimateL1CommitGas := uint64(p.gasCostIncreaseMultiplier * float64(totalL1CommitGas)) - if totalL1CommitCalldataSize > p.maxL1CommitCalldataSizePerBatch || - totalOverEstimateL1CommitGas > p.maxL1CommitGasPerBatch { - // Check if the first chunk breaks hard limits. - // If so, it indicates there are bugs in chunk-proposer, manual fix is needed. + codecVersion := encoding.CodecV0 + if p.chainCfg.IsBernoulli(new(big.Int).SetUint64(dbChunks[0].StartBlockNumber)) { + codecVersion = encoding.CodecV1 + } + + daChunks, err := p.getDAChunks(dbChunks) + if err != nil { + return err + } + + dbParentBatch, err := p.batchOrm.GetLatestBatch(p.ctx) + if err != nil { + return err + } + + var batch encoding.Batch + batch.Index = dbParentBatch.Index + 1 + batch.ParentBatchHash = common.HexToHash(dbParentBatch.Hash) + parentBatchEndBlockNumber := daChunks[0].Blocks[0].Header.Number.Uint64() - 1 + parentBatchCodecVersion := encoding.CodecV0 + // Genesis batch uses codecv0 encoding, otherwise using bernoulli fork to choose codec version. + if dbParentBatch.Index > 0 && p.chainCfg.IsBernoulli(new(big.Int).SetUint64(parentBatchEndBlockNumber)) { + parentBatchCodecVersion = encoding.CodecV1 + } + batch.TotalL1MessagePoppedBefore, err = utils.GetTotalL1MessagePoppedBeforeBatch(dbParentBatch.BatchHeader, parentBatchCodecVersion) + if err != nil { + return err + } + + for i, chunk := range daChunks { + batch.Chunks = append(batch.Chunks, chunk) + metrics, calcErr := utils.CalculateBatchMetrics(&batch, codecVersion) + if calcErr != nil { + return fmt.Errorf("failed to calculate batch metrics: %w", calcErr) + } + totalOverEstimateL1CommitGas := uint64(p.gasCostIncreaseMultiplier * float64(metrics.L1CommitGas)) + if metrics.L1CommitCalldataSize > p.maxL1CommitCalldataSizePerBatch || + totalOverEstimateL1CommitGas > p.maxL1CommitGasPerBatch || + metrics.L1CommitBlobSize > maxBlobSize { if i == 0 { - if totalOverEstimateL1CommitGas > p.maxL1CommitGasPerBatch { - return nil, nil, fmt.Errorf( - "the first chunk exceeds l1 commit gas limit; start block number: %v, end block number: %v, commit gas: %v, max commit gas limit: %v", - dbChunks[0].StartBlockNumber, - dbChunks[0].EndBlockNumber, - totalL1CommitGas, - p.maxL1CommitGasPerBatch, - ) - } - if totalL1CommitCalldataSize > p.maxL1CommitCalldataSizePerBatch { - return nil, nil, fmt.Errorf( - "the first chunk exceeds l1 commit calldata size limit; start block number: %v, end block number %v, calldata size: %v, max calldata size limit: %v", - dbChunks[0].StartBlockNumber, - dbChunks[0].EndBlockNumber, - totalL1CommitCalldataSize, - p.maxL1CommitCalldataSizePerBatch, - ) - } + // The first chunk exceeds hard limits, which indicates a bug in the chunk-proposer, manual fix is needed. + return fmt.Errorf("the first chunk exceeds limits; start block number: %v, end block number: %v, limits: %+v, maxChunkNum: %v, maxL1CommitCalldataSize: %v, maxL1CommitGas: %v, maxBlobSize: %v", + dbChunks[0].StartBlockNumber, dbChunks[0].EndBlockNumber, metrics, p.maxChunkNumPerBatch, p.maxL1CommitCalldataSizePerBatch, p.maxL1CommitGasPerBatch, maxBlobSize) } log.Debug("breaking limit condition in batching", - "currentL1CommitCalldataSize", totalL1CommitCalldataSize, + "currentL1CommitCalldataSize", metrics.L1CommitCalldataSize, "maxL1CommitCalldataSizePerBatch", p.maxL1CommitCalldataSizePerBatch, "currentOverEstimateL1CommitGas", totalOverEstimateL1CommitGas, "maxL1CommitGasPerBatch", p.maxL1CommitGasPerBatch) - p.totalL1CommitGas.Set(float64(batchMeta.TotalL1CommitGas)) - p.totalL1CommitCalldataSize.Set(float64(batchMeta.TotalL1CommitCalldataSize)) - p.batchChunksNum.Set(float64(i)) - return dbChunks[:i], &batchMeta, nil + batch.Chunks = batch.Chunks[:len(batch.Chunks)-1] + + metrics, err := utils.CalculateBatchMetrics(&batch, codecVersion) + if err != nil { + return fmt.Errorf("failed to calculate batch metrics: %w", err) + } + + p.recordBatchMetrics(metrics) + return p.updateDBBatchInfo(&batch, codecVersion) } } + metrics, calcErr := utils.CalculateBatchMetrics(&batch, codecVersion) + if calcErr != nil { + return fmt.Errorf("failed to calculate batch metrics: %w", calcErr) + } currentTimeSec := uint64(time.Now().Unix()) - if dbChunks[0].StartBlockTime+p.batchTimeoutSec < currentTimeSec || - totalChunks == p.maxChunkNumPerBatch { - if dbChunks[0].StartBlockTime+p.batchTimeoutSec < currentTimeSec { - log.Warn("first block timeout", - "start block number", dbChunks[0].StartBlockNumber, - "start block timestamp", dbChunks[0].StartBlockTime, - "current time", currentTimeSec, - ) - } else { - log.Info("reached maximum number of chunks in batch", - "chunk count", totalChunks, - ) - } + if metrics.FirstBlockTimestamp+p.batchTimeoutSec < currentTimeSec || metrics.NumChunks == maxChunksThisBatch { + log.Info("reached maximum number of chunks in batch or first block timeout", + "chunk count", metrics.NumChunks, + "start block number", dbChunks[0].StartBlockNumber, + "start block timestamp", dbChunks[0].StartBlockTime, + "current time", currentTimeSec) - batchMeta.TotalL1CommitGas = totalL1CommitGas - batchMeta.TotalL1CommitCalldataSize = totalL1CommitCalldataSize p.batchFirstBlockTimeoutReached.Inc() - p.totalL1CommitGas.Set(float64(batchMeta.TotalL1CommitGas)) - p.totalL1CommitCalldataSize.Set(float64(batchMeta.TotalL1CommitCalldataSize)) - p.batchChunksNum.Set(float64(len(dbChunks))) - return dbChunks, &batchMeta, nil + p.recordBatchMetrics(metrics) + return p.updateDBBatchInfo(&batch, codecVersion) } log.Debug("pending chunks do not reach one of the constraints or contain a timeout block") p.batchChunksProposeNotEnoughTotal.Inc() - return nil, nil, nil + return nil } -func (p *BatchProposer) dbChunksToRollupChunks(dbChunks []*orm.Chunk) ([]*types.Chunk, error) { - chunks := make([]*types.Chunk, len(dbChunks)) +func (p *BatchProposer) getDAChunks(dbChunks []*orm.Chunk) ([]*encoding.Chunk, error) { + chunks := make([]*encoding.Chunk, len(dbChunks)) for i, c := range dbChunks { - wrappedBlocks, err := p.l2BlockOrm.GetL2BlocksInRange(p.ctx, c.StartBlockNumber, c.EndBlockNumber) + blocks, err := p.l2BlockOrm.GetL2BlocksInRange(p.ctx, c.StartBlockNumber, c.EndBlockNumber) if err != nil { - log.Error("Failed to fetch wrapped blocks", - "start number", c.StartBlockNumber, "end number", c.EndBlockNumber, "error", err) + log.Error("Failed to fetch blocks", "start number", c.StartBlockNumber, "end number", c.EndBlockNumber, "error", err) return nil, err } - chunks[i] = &types.Chunk{ - Blocks: wrappedBlocks, + chunks[i] = &encoding.Chunk{ + Blocks: blocks, } } return chunks, nil } + +func (p *BatchProposer) recordBatchMetrics(metrics *utils.BatchMetrics) { + p.totalL1CommitGas.Set(float64(metrics.L1CommitGas)) + p.totalL1CommitCalldataSize.Set(float64(metrics.L1CommitCalldataSize)) + p.batchChunksNum.Set(float64(metrics.NumChunks)) + p.totalL1CommitBlobSize.Set(float64(metrics.L1CommitBlobSize)) +} diff --git a/rollup/internal/controller/watcher/batch_proposer_test.go b/rollup/internal/controller/watcher/batch_proposer_test.go index 580d1bdc3..5e8a9fa7c 100644 --- a/rollup/internal/controller/watcher/batch_proposer_test.go +++ b/rollup/internal/controller/watcher/batch_proposer_test.go @@ -2,24 +2,31 @@ package watcher import ( "context" + "math" + "math/big" "testing" + "github.com/scroll-tech/go-ethereum/common" + gethTypes "github.com/scroll-tech/go-ethereum/core/types" + "github.com/scroll-tech/go-ethereum/params" "github.com/stretchr/testify/assert" "scroll-tech/common/database" "scroll-tech/common/types" + "scroll-tech/common/types/encoding" "scroll-tech/rollup/internal/config" "scroll-tech/rollup/internal/orm" ) -func testBatchProposerLimits(t *testing.T) { +func testBatchProposerCodecv0Limits(t *testing.T) { tests := []struct { name string maxChunkNum uint64 maxL1CommitGas uint64 - maxL1CommitCalldataSize uint32 + maxL1CommitCalldataSize uint64 batchTimeoutSec uint64 + forkBlock *big.Int expectedBatchesLen int expectedChunksInFirstBatch uint64 // only be checked when expectedBatchesLen > 0 }{ @@ -83,6 +90,16 @@ func testBatchProposerLimits(t *testing.T) { expectedBatchesLen: 1, expectedChunksInFirstBatch: 1, }, + { + name: "ForkBlockReached", + maxChunkNum: 10, + maxL1CommitGas: 50000000000, + maxL1CommitCalldataSize: 1000000, + batchTimeoutSec: 1000000000000, + expectedBatchesLen: 1, + expectedChunksInFirstBatch: 1, + forkBlock: big.NewInt(3), + }, } for _, tt := range tests { @@ -90,8 +107,31 @@ func testBatchProposerLimits(t *testing.T) { db := setupDB(t) defer database.CloseDB(db) + // Add genesis batch. + block := &encoding.Block{ + Header: &gethTypes.Header{ + Number: big.NewInt(0), + }, + RowConsumption: &gethTypes.RowConsumption{}, + } + chunk := &encoding.Chunk{ + Blocks: []*encoding.Block{block}, + } + chunkOrm := orm.NewChunk(db) + _, err := chunkOrm.InsertChunk(context.Background(), chunk, encoding.CodecV0) + assert.NoError(t, err) + batch := &encoding.Batch{ + Index: 0, + TotalL1MessagePoppedBefore: 0, + ParentBatchHash: common.Hash{}, + Chunks: []*encoding.Chunk{chunk}, + } + batchOrm := orm.NewBatch(db) + _, err = batchOrm.InsertBatch(context.Background(), batch, encoding.CodecV0) + assert.NoError(t, err) + l2BlockOrm := orm.NewL2Block(db) - err := l2BlockOrm.InsertL2Blocks(context.Background(), []*types.WrappedBlock{wrappedBlock1, wrappedBlock2}) + err = l2BlockOrm.InsertL2Blocks(context.Background(), []*encoding.Block{block1, block2}) assert.NoError(t, err) cp := NewChunkProposer(context.Background(), &config.ChunkProposerConfig{ @@ -102,17 +142,18 @@ func testBatchProposerLimits(t *testing.T) { MaxRowConsumptionPerChunk: 1000000, ChunkTimeoutSec: 300, GasCostIncreaseMultiplier: 1.2, + }, ¶ms.ChainConfig{ + HomesteadBlock: tt.forkBlock, }, db, nil) cp.TryProposeChunk() // chunk1 contains block1 cp.TryProposeChunk() // chunk2 contains block2 - chunkOrm := orm.NewChunk(db) - chunks, err := chunkOrm.GetChunksInRange(context.Background(), 0, 1) + chunks, err := chunkOrm.GetChunksInRange(context.Background(), 1, 2) assert.NoError(t, err) assert.Equal(t, uint64(6042), chunks[0].TotalL1CommitGas) - assert.Equal(t, uint32(298), chunks[0].TotalL1CommitCalldataSize) - assert.Equal(t, uint64(94586), chunks[1].TotalL1CommitGas) - assert.Equal(t, uint32(5735), chunks[1].TotalL1CommitCalldataSize) + assert.Equal(t, uint64(298), chunks[0].TotalL1CommitCalldataSize) + assert.Equal(t, uint64(94618), chunks[1].TotalL1CommitGas) + assert.Equal(t, uint64(5737), chunks[1].TotalL1CommitCalldataSize) bp := NewBatchProposer(context.Background(), &config.BatchProposerConfig{ MaxChunkNumPerBatch: tt.maxChunkNum, @@ -120,20 +161,147 @@ func testBatchProposerLimits(t *testing.T) { MaxL1CommitCalldataSizePerBatch: tt.maxL1CommitCalldataSize, BatchTimeoutSec: tt.batchTimeoutSec, GasCostIncreaseMultiplier: 1.2, + }, ¶ms.ChainConfig{ + HomesteadBlock: tt.forkBlock, }, db, nil) bp.TryProposeBatch() - batchOrm := orm.NewBatch(db) batches, err := batchOrm.GetBatches(context.Background(), map[string]interface{}{}, []string{}, 0) assert.NoError(t, err) - assert.Len(t, batches, tt.expectedBatchesLen) + assert.Len(t, batches, tt.expectedBatchesLen+1) + batches = batches[1:] if tt.expectedBatchesLen > 0 { - assert.Equal(t, uint64(0), batches[0].StartChunkIndex) - assert.Equal(t, tt.expectedChunksInFirstBatch-1, batches[0].EndChunkIndex) + assert.Equal(t, uint64(1), batches[0].StartChunkIndex) + assert.Equal(t, tt.expectedChunksInFirstBatch, batches[0].EndChunkIndex) assert.Equal(t, types.RollupPending, types.RollupStatus(batches[0].RollupStatus)) assert.Equal(t, types.ProvingTaskUnassigned, types.ProvingStatus(batches[0].ProvingStatus)) - dbChunks, err := chunkOrm.GetChunksInRange(context.Background(), 0, tt.expectedChunksInFirstBatch-1) + dbChunks, err := chunkOrm.GetChunksInRange(context.Background(), 1, tt.expectedChunksInFirstBatch) + assert.NoError(t, err) + assert.Len(t, dbChunks, int(tt.expectedChunksInFirstBatch)) + for _, chunk := range dbChunks { + assert.Equal(t, batches[0].Hash, chunk.BatchHash) + assert.Equal(t, types.ProvingTaskUnassigned, types.ProvingStatus(chunk.ProvingStatus)) + } + } + }) + } +} + +func testBatchProposerCodecv1Limits(t *testing.T) { + tests := []struct { + name string + maxChunkNum uint64 + batchTimeoutSec uint64 + forkBlock *big.Int + expectedBatchesLen int + expectedChunksInFirstBatch uint64 // only be checked when expectedBatchesLen > 0 + }{ + { + name: "NoLimitReached", + maxChunkNum: 10, + batchTimeoutSec: 1000000000000, + expectedBatchesLen: 0, + }, + { + name: "Timeout", + maxChunkNum: 10, + batchTimeoutSec: 0, + expectedBatchesLen: 1, + expectedChunksInFirstBatch: 2, + }, + { + name: "MaxChunkNumPerBatchIs1", + maxChunkNum: 1, + batchTimeoutSec: 1000000000000, + expectedBatchesLen: 1, + expectedChunksInFirstBatch: 1, + }, + { + name: "ForkBlockReached", + maxChunkNum: 10, + batchTimeoutSec: 1000000000000, + expectedBatchesLen: 1, + expectedChunksInFirstBatch: 1, + forkBlock: big.NewInt(3), + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + db := setupDB(t) + defer database.CloseDB(db) + + // Add genesis batch. + block := &encoding.Block{ + Header: &gethTypes.Header{ + Number: big.NewInt(0), + }, + RowConsumption: &gethTypes.RowConsumption{}, + } + chunk := &encoding.Chunk{ + Blocks: []*encoding.Block{block}, + } + chunkOrm := orm.NewChunk(db) + _, err := chunkOrm.InsertChunk(context.Background(), chunk, encoding.CodecV1) + assert.NoError(t, err) + batch := &encoding.Batch{ + Index: 0, + TotalL1MessagePoppedBefore: 0, + ParentBatchHash: common.Hash{}, + Chunks: []*encoding.Chunk{chunk}, + } + batchOrm := orm.NewBatch(db) + _, err = batchOrm.InsertBatch(context.Background(), batch, encoding.CodecV1) + assert.NoError(t, err) + + l2BlockOrm := orm.NewL2Block(db) + err = l2BlockOrm.InsertL2Blocks(context.Background(), []*encoding.Block{block1, block2}) + assert.NoError(t, err) + + cp := NewChunkProposer(context.Background(), &config.ChunkProposerConfig{ + MaxBlockNumPerChunk: 1, + MaxTxNumPerChunk: 10000, + MaxL1CommitGasPerChunk: 1, + MaxL1CommitCalldataSizePerChunk: 1, + MaxRowConsumptionPerChunk: 1000000, + ChunkTimeoutSec: 300, + GasCostIncreaseMultiplier: 1.2, + }, ¶ms.ChainConfig{ + BernoulliBlock: big.NewInt(0), HomesteadBlock: tt.forkBlock, + }, db, nil) + cp.TryProposeChunk() // chunk1 contains block1 + cp.TryProposeChunk() // chunk2 contains block2 + + chunks, err := chunkOrm.GetChunksInRange(context.Background(), 1, 2) + assert.NoError(t, err) + assert.Equal(t, uint64(0), chunks[0].TotalL1CommitGas) + assert.Equal(t, uint64(0), chunks[0].TotalL1CommitCalldataSize) + assert.Equal(t, uint64(0), chunks[1].TotalL1CommitGas) + assert.Equal(t, uint64(0), chunks[1].TotalL1CommitCalldataSize) + + bp := NewBatchProposer(context.Background(), &config.BatchProposerConfig{ + MaxChunkNumPerBatch: tt.maxChunkNum, + MaxL1CommitGasPerBatch: 1, + MaxL1CommitCalldataSizePerBatch: 1, + BatchTimeoutSec: tt.batchTimeoutSec, + GasCostIncreaseMultiplier: 1.2, + }, ¶ms.ChainConfig{ + BernoulliBlock: big.NewInt(0), HomesteadBlock: tt.forkBlock, + }, db, nil) + bp.TryProposeBatch() + + batches, err := batchOrm.GetBatches(context.Background(), map[string]interface{}{}, []string{}, 0) + assert.NoError(t, err) + assert.Len(t, batches, tt.expectedBatchesLen+1) + batches = batches[1:] + if tt.expectedBatchesLen > 0 { + assert.Equal(t, uint64(1), batches[0].StartChunkIndex) + assert.Equal(t, tt.expectedChunksInFirstBatch, batches[0].EndChunkIndex) + assert.Equal(t, types.RollupPending, types.RollupStatus(batches[0].RollupStatus)) + assert.Equal(t, types.ProvingTaskUnassigned, types.ProvingStatus(batches[0].ProvingStatus)) + + dbChunks, err := chunkOrm.GetChunksInRange(context.Background(), 1, tt.expectedChunksInFirstBatch) assert.NoError(t, err) assert.Len(t, dbChunks, int(tt.expectedChunksInFirstBatch)) for _, chunk := range dbChunks { @@ -149,8 +317,31 @@ func testBatchCommitGasAndCalldataSizeEstimation(t *testing.T) { db := setupDB(t) defer database.CloseDB(db) + // Add genesis batch. + block := &encoding.Block{ + Header: &gethTypes.Header{ + Number: big.NewInt(0), + }, + RowConsumption: &gethTypes.RowConsumption{}, + } + chunk := &encoding.Chunk{ + Blocks: []*encoding.Block{block}, + } + chunkOrm := orm.NewChunk(db) + _, err := chunkOrm.InsertChunk(context.Background(), chunk, encoding.CodecV0) + assert.NoError(t, err) + batch := &encoding.Batch{ + Index: 0, + TotalL1MessagePoppedBefore: 0, + ParentBatchHash: common.Hash{}, + Chunks: []*encoding.Chunk{chunk}, + } + batchOrm := orm.NewBatch(db) + _, err = batchOrm.InsertBatch(context.Background(), batch, encoding.CodecV0) + assert.NoError(t, err) + l2BlockOrm := orm.NewL2Block(db) - err := l2BlockOrm.InsertL2Blocks(context.Background(), []*types.WrappedBlock{wrappedBlock1, wrappedBlock2}) + err = l2BlockOrm.InsertL2Blocks(context.Background(), []*encoding.Block{block1, block2}) assert.NoError(t, err) cp := NewChunkProposer(context.Background(), &config.ChunkProposerConfig{ @@ -161,17 +352,16 @@ func testBatchCommitGasAndCalldataSizeEstimation(t *testing.T) { MaxRowConsumptionPerChunk: 1000000, ChunkTimeoutSec: 300, GasCostIncreaseMultiplier: 1.2, - }, db, nil) + }, ¶ms.ChainConfig{}, db, nil) cp.TryProposeChunk() // chunk1 contains block1 cp.TryProposeChunk() // chunk2 contains block2 - chunkOrm := orm.NewChunk(db) - chunks, err := chunkOrm.GetChunksInRange(context.Background(), 0, 1) + chunks, err := chunkOrm.GetChunksInRange(context.Background(), 1, 2) assert.NoError(t, err) assert.Equal(t, uint64(6042), chunks[0].TotalL1CommitGas) - assert.Equal(t, uint32(298), chunks[0].TotalL1CommitCalldataSize) - assert.Equal(t, uint64(94586), chunks[1].TotalL1CommitGas) - assert.Equal(t, uint32(5735), chunks[1].TotalL1CommitCalldataSize) + assert.Equal(t, uint64(298), chunks[0].TotalL1CommitCalldataSize) + assert.Equal(t, uint64(94618), chunks[1].TotalL1CommitGas) + assert.Equal(t, uint64(5737), chunks[1].TotalL1CommitCalldataSize) bp := NewBatchProposer(context.Background(), &config.BatchProposerConfig{ MaxChunkNumPerBatch: 10, @@ -179,19 +369,19 @@ func testBatchCommitGasAndCalldataSizeEstimation(t *testing.T) { MaxL1CommitCalldataSizePerBatch: 1000000, BatchTimeoutSec: 0, GasCostIncreaseMultiplier: 1.2, - }, db, nil) + }, ¶ms.ChainConfig{}, db, nil) bp.TryProposeBatch() - batchOrm := orm.NewBatch(db) batches, err := batchOrm.GetBatches(context.Background(), map[string]interface{}{}, []string{}, 0) assert.NoError(t, err) - assert.Len(t, batches, 1) - assert.Equal(t, uint64(0), batches[0].StartChunkIndex) - assert.Equal(t, uint64(1), batches[0].EndChunkIndex) + assert.Len(t, batches, 2) + batches = batches[1:] + assert.Equal(t, uint64(1), batches[0].StartChunkIndex) + assert.Equal(t, uint64(2), batches[0].EndChunkIndex) assert.Equal(t, types.RollupPending, types.RollupStatus(batches[0].RollupStatus)) assert.Equal(t, types.ProvingTaskUnassigned, types.ProvingStatus(batches[0].ProvingStatus)) - dbChunks, err := chunkOrm.GetChunksInRange(context.Background(), 0, 1) + dbChunks, err := chunkOrm.GetChunksInRange(context.Background(), 1, 2) assert.NoError(t, err) assert.Len(t, dbChunks, 2) for _, chunk := range dbChunks { @@ -199,6 +389,79 @@ func testBatchCommitGasAndCalldataSizeEstimation(t *testing.T) { assert.Equal(t, types.ProvingTaskUnassigned, types.ProvingStatus(chunk.ProvingStatus)) } - assert.Equal(t, uint64(254562), batches[0].TotalL1CommitGas) - assert.Equal(t, uint32(6033), batches[0].TotalL1CommitCalldataSize) + assert.Equal(t, uint64(258383), batches[0].TotalL1CommitGas) + assert.Equal(t, uint64(6035), batches[0].TotalL1CommitCalldataSize) +} + +func testBatchProposerBlobSizeLimit(t *testing.T) { + db := setupDB(t) + defer database.CloseDB(db) + + // Add genesis batch. + block := &encoding.Block{ + Header: &gethTypes.Header{ + Number: big.NewInt(0), + }, + RowConsumption: &gethTypes.RowConsumption{}, + } + chunk := &encoding.Chunk{ + Blocks: []*encoding.Block{block}, + } + chunkOrm := orm.NewChunk(db) + _, err := chunkOrm.InsertChunk(context.Background(), chunk, encoding.CodecV1) + assert.NoError(t, err) + batch := &encoding.Batch{ + Index: 0, + TotalL1MessagePoppedBefore: 0, + ParentBatchHash: common.Hash{}, + Chunks: []*encoding.Chunk{chunk}, + } + batchOrm := orm.NewBatch(db) + _, err = batchOrm.InsertBatch(context.Background(), batch, encoding.CodecV1) + assert.NoError(t, err) + + cp := NewChunkProposer(context.Background(), &config.ChunkProposerConfig{ + MaxBlockNumPerChunk: math.MaxUint64, + MaxTxNumPerChunk: math.MaxUint64, + MaxL1CommitGasPerChunk: 1, + MaxL1CommitCalldataSizePerChunk: 1, + MaxRowConsumptionPerChunk: math.MaxUint64, + ChunkTimeoutSec: math.MaxUint64, + GasCostIncreaseMultiplier: 1, + }, ¶ms.ChainConfig{BernoulliBlock: big.NewInt(0)}, db, nil) + + block = readBlockFromJSON(t, "../../../testdata/blockTrace_03.json") + for total := int64(0); total < 7; total++ { + for i := int64(0); i < 10; i++ { + l2BlockOrm := orm.NewL2Block(db) + block.Header.Number = big.NewInt(total*10 + i + 1) + err = l2BlockOrm.InsertL2Blocks(context.Background(), []*encoding.Block{block}) + assert.NoError(t, err) + } + cp.TryProposeChunk() + } + + bp := NewBatchProposer(context.Background(), &config.BatchProposerConfig{ + MaxChunkNumPerBatch: math.MaxUint64, + MaxL1CommitGasPerBatch: 1, + MaxL1CommitCalldataSizePerBatch: 1, + BatchTimeoutSec: math.MaxUint64, + GasCostIncreaseMultiplier: 1, + }, ¶ms.ChainConfig{BernoulliBlock: big.NewInt(0)}, db, nil) + + for i := 0; i < 10; i++ { + bp.TryProposeBatch() + } + + batches, err := batchOrm.GetBatches(context.Background(), map[string]interface{}{}, []string{}, 0) + batches = batches[1:] + assert.NoError(t, err) + assert.Len(t, batches, 4) + for i, batch := range batches { + expected := uint64(2 * (i + 1)) + if expected > 7 { + expected = 7 + } + assert.Equal(t, expected, batch.EndChunkIndex) + } } diff --git a/rollup/internal/controller/watcher/chunk_proposer.go b/rollup/internal/controller/watcher/chunk_proposer.go index 92d707c8b..06802f057 100644 --- a/rollup/internal/controller/watcher/chunk_proposer.go +++ b/rollup/internal/controller/watcher/chunk_proposer.go @@ -2,46 +2,24 @@ package watcher import ( "context" - "errors" "fmt" "time" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" - gethTypes "github.com/scroll-tech/go-ethereum/core/types" "github.com/scroll-tech/go-ethereum/log" + "github.com/scroll-tech/go-ethereum/params" "gorm.io/gorm" - "scroll-tech/common/types" + "scroll-tech/common/forks" + "scroll-tech/common/types/encoding" "scroll-tech/rollup/internal/config" "scroll-tech/rollup/internal/orm" + "scroll-tech/rollup/internal/utils" ) -// chunkRowConsumption is map(sub-circuit name => sub-circuit row count) -type chunkRowConsumption map[string]uint64 - -// add accumulates row consumption per sub-circuit -func (crc *chunkRowConsumption) add(rowConsumption *gethTypes.RowConsumption) error { - if rowConsumption == nil { - return errors.New("rowConsumption is ") - } - for _, subCircuit := range *rowConsumption { - (*crc)[subCircuit.Name] += subCircuit.RowNumber - } - return nil -} - -// max finds the maximum row consumption among all sub-circuits -func (crc *chunkRowConsumption) max() uint64 { - var max uint64 - for _, value := range *crc { - if value > max { - max = value - } - } - return max -} +const maxBlobSize = uint64(131072) // ChunkProposer proposes chunks based on available unchunked blocks. type ChunkProposer struct { @@ -58,6 +36,9 @@ type ChunkProposer struct { maxRowConsumptionPerChunk uint64 chunkTimeoutSec uint64 gasCostIncreaseMultiplier float64 + forkHeights []uint64 + + chainCfg *params.ChainConfig chunkProposerCircleTotal prometheus.Counter proposeChunkFailureTotal prometheus.Counter @@ -66,7 +47,7 @@ type ChunkProposer struct { chunkTxNum prometheus.Gauge chunkEstimateL1CommitGas prometheus.Gauge totalL1CommitCalldataSize prometheus.Gauge - totalTxGasUsed prometheus.Gauge + totalL1CommitBlobSize prometheus.Gauge maxTxConsumption prometheus.Gauge chunkBlocksNum prometheus.Gauge chunkFirstBlockTimeoutReached prometheus.Counter @@ -74,16 +55,18 @@ type ChunkProposer struct { } // NewChunkProposer creates a new ChunkProposer instance. -func NewChunkProposer(ctx context.Context, cfg *config.ChunkProposerConfig, db *gorm.DB, reg prometheus.Registerer) *ChunkProposer { +func NewChunkProposer(ctx context.Context, cfg *config.ChunkProposerConfig, chainCfg *params.ChainConfig, db *gorm.DB, reg prometheus.Registerer) *ChunkProposer { + forkHeights, _, _ := forks.CollectSortedForkHeights(chainCfg) log.Debug("new chunk proposer", "maxTxNumPerChunk", cfg.MaxTxNumPerChunk, "maxL1CommitGasPerChunk", cfg.MaxL1CommitGasPerChunk, "maxL1CommitCalldataSizePerChunk", cfg.MaxL1CommitCalldataSizePerChunk, "maxRowConsumptionPerChunk", cfg.MaxRowConsumptionPerChunk, "chunkTimeoutSec", cfg.ChunkTimeoutSec, - "gasCostIncreaseMultiplier", cfg.GasCostIncreaseMultiplier) + "gasCostIncreaseMultiplier", cfg.GasCostIncreaseMultiplier, + "forkHeights", forkHeights) - return &ChunkProposer{ + p := &ChunkProposer{ ctx: ctx, db: db, chunkOrm: orm.NewChunk(db), @@ -95,6 +78,8 @@ func NewChunkProposer(ctx context.Context, cfg *config.ChunkProposerConfig, db * maxRowConsumptionPerChunk: cfg.MaxRowConsumptionPerChunk, chunkTimeoutSec: cfg.ChunkTimeoutSec, gasCostIncreaseMultiplier: cfg.GasCostIncreaseMultiplier, + forkHeights: forkHeights, + chainCfg: chainCfg, chunkProposerCircleTotal: promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "rollup_propose_chunk_circle_total", @@ -124,9 +109,9 @@ func NewChunkProposer(ctx context.Context, cfg *config.ChunkProposerConfig, db * Name: "rollup_propose_chunk_total_l1_commit_call_data_size", Help: "The total l1 commit call data size", }), - totalTxGasUsed: promauto.With(reg).NewGauge(prometheus.GaugeOpts{ - Name: "rollup_propose_chunk_total_tx_gas_used", - Help: "The total tx gas used", + totalL1CommitBlobSize: promauto.With(reg).NewGauge(prometheus.GaugeOpts{ + Name: "rollup_propose_chunk_total_l1_commit_blob_size", + Help: "The total l1 commit blob size", }), maxTxConsumption: promauto.With(reg).NewGauge(prometheus.GaugeOpts{ Name: "rollup_propose_chunk_max_tx_consumption", @@ -145,180 +130,146 @@ func NewChunkProposer(ctx context.Context, cfg *config.ChunkProposerConfig, db * Help: "Total number of chunk block propose not enough", }), } + + return p } // TryProposeChunk tries to propose a new chunk. func (p *ChunkProposer) TryProposeChunk() { p.chunkProposerCircleTotal.Inc() - proposedChunk, err := p.proposeChunk() - if err != nil { + if err := p.proposeChunk(); err != nil { p.proposeChunkFailureTotal.Inc() log.Error("propose new chunk failed", "err", err) return } - - if err := p.updateChunkInfoInDB(proposedChunk); err != nil { - p.proposeChunkUpdateInfoFailureTotal.Inc() - log.Error("update chunk info in orm failed", "err", err) - } } -func (p *ChunkProposer) updateChunkInfoInDB(chunk *types.Chunk) error { +func (p *ChunkProposer) updateDBChunkInfo(chunk *encoding.Chunk, codecVersion encoding.CodecVersion) error { if chunk == nil { return nil } p.proposeChunkUpdateInfoTotal.Inc() err := p.db.Transaction(func(dbTX *gorm.DB) error { - dbChunk, err := p.chunkOrm.InsertChunk(p.ctx, chunk, dbTX) + dbChunk, err := p.chunkOrm.InsertChunk(p.ctx, chunk, codecVersion, dbTX) if err != nil { - log.Warn("ChunkProposer.InsertChunk failed", "chunk hash", chunk.Hash) + log.Warn("ChunkProposer.InsertChunk failed", "err", err) return err } if err := p.l2BlockOrm.UpdateChunkHashInRange(p.ctx, dbChunk.StartBlockNumber, dbChunk.EndBlockNumber, dbChunk.Hash, dbTX); err != nil { - log.Error("failed to update chunk_hash for l2_blocks", "chunk hash", chunk.Hash, "start block", 0, "end block", 0, "err", err) + log.Error("failed to update chunk_hash for l2_blocks", "chunk hash", dbChunk.Hash, "start block", dbChunk.StartBlockNumber, "end block", dbChunk.EndBlockNumber, "err", err) return err } return nil }) - return err + if err != nil { + p.proposeChunkUpdateInfoFailureTotal.Inc() + log.Error("update chunk info in orm failed", "err", err) + return err + } + return nil } -func (p *ChunkProposer) proposeChunk() (*types.Chunk, error) { +func (p *ChunkProposer) proposeChunk() error { unchunkedBlockHeight, err := p.chunkOrm.GetUnchunkedBlockHeight(p.ctx) if err != nil { - return nil, err + return err } - // select at most p.maxBlockNumPerChunk blocks - blocks, err := p.l2BlockOrm.GetL2WrappedBlocksGEHeight(p.ctx, unchunkedBlockHeight, int(p.maxBlockNumPerChunk)) + maxBlocksThisChunk := p.maxBlockNumPerChunk + blocksUntilFork := forks.BlocksUntilFork(unchunkedBlockHeight, p.forkHeights) + if blocksUntilFork != 0 && blocksUntilFork < maxBlocksThisChunk { + maxBlocksThisChunk = blocksUntilFork + } + + // select at most maxBlocksThisChunk blocks + blocks, err := p.l2BlockOrm.GetL2BlocksGEHeight(p.ctx, unchunkedBlockHeight, int(maxBlocksThisChunk)) if err != nil { - return nil, err + return err } if len(blocks) == 0 { - return nil, nil + return nil } - var chunk types.Chunk - var totalTxGasUsed uint64 - var totalTxNum uint64 - var totalL1CommitCalldataSize uint64 - var totalL1CommitGas uint64 - crc := chunkRowConsumption{} + codecVersion := encoding.CodecV0 + if p.chainCfg.IsBernoulli(blocks[0].Header.Number) { + codecVersion = encoding.CodecV1 + } + var chunk encoding.Chunk for i, block := range blocks { - // metric values - lastTotalTxNum := totalTxNum - lastTotalL1CommitGas := totalL1CommitGas - lastCrcMax := crc.max() - lastTotalL1CommitCalldataSize := totalL1CommitCalldataSize - lastTotalTxGasUsed := totalTxGasUsed + chunk.Blocks = append(chunk.Blocks, block) - totalTxGasUsed += block.Header.GasUsed - totalTxNum += uint64(len(block.Transactions)) - totalL1CommitCalldataSize += block.EstimateL1CommitCalldataSize() - totalL1CommitGas = chunk.EstimateL1CommitGas() - totalOverEstimateL1CommitGas := uint64(p.gasCostIncreaseMultiplier * float64(totalL1CommitGas)) - if err := crc.add(block.RowConsumption); err != nil { - return nil, fmt.Errorf("chunk-proposer failed to update chunk row consumption: %v", err) + metrics, calcErr := utils.CalculateChunkMetrics(&chunk, codecVersion) + if calcErr != nil { + return fmt.Errorf("failed to calculate chunk metrics: %w", calcErr) } - crcMax := crc.max() - if totalTxNum > p.maxTxNumPerChunk || - totalL1CommitCalldataSize > p.maxL1CommitCalldataSizePerChunk || - totalOverEstimateL1CommitGas > p.maxL1CommitGasPerChunk || - crcMax > p.maxRowConsumptionPerChunk { - // Check if the first block breaks hard limits. - // If so, it indicates there are bugs in sequencer, manual fix is needed. + overEstimatedL1CommitGas := uint64(p.gasCostIncreaseMultiplier * float64(metrics.L1CommitGas)) + if metrics.TxNum > p.maxTxNumPerChunk || + metrics.L1CommitCalldataSize > p.maxL1CommitCalldataSizePerChunk || + overEstimatedL1CommitGas > p.maxL1CommitGasPerChunk || + metrics.CrcMax > p.maxRowConsumptionPerChunk || + metrics.L1CommitBlobSize > maxBlobSize { if i == 0 { - if totalTxNum > p.maxTxNumPerChunk { - return nil, fmt.Errorf( - "the first block exceeds l2 tx number limit; block number: %v, number of transactions: %v, max transaction number limit: %v", - block.Header.Number, - totalTxNum, - p.maxTxNumPerChunk, - ) - } - - if totalOverEstimateL1CommitGas > p.maxL1CommitGasPerChunk { - return nil, fmt.Errorf( - "the first block exceeds l1 commit gas limit; block number: %v, commit gas: %v, max commit gas limit: %v", - block.Header.Number, - totalL1CommitGas, - p.maxL1CommitGasPerChunk, - ) - } - - if totalL1CommitCalldataSize > p.maxL1CommitCalldataSizePerChunk { - return nil, fmt.Errorf( - "the first block exceeds l1 commit calldata size limit; block number: %v, calldata size: %v, max calldata size limit: %v", - block.Header.Number, - totalL1CommitCalldataSize, - p.maxL1CommitCalldataSizePerChunk, - ) - } - - if crcMax > p.maxRowConsumptionPerChunk { - return nil, fmt.Errorf( - "the first block exceeds row consumption limit; block number: %v, row consumption: %v, max: %v, limit: %v", - block.Header.Number, - crc, - crcMax, - p.maxRowConsumptionPerChunk, - ) - } + // The first block exceeds hard limits, which indicates a bug in the sequencer, manual fix is needed. + return fmt.Errorf("the first block exceeds limits; block number: %v, limits: %+v, maxTxNum: %v, maxL1CommitCalldataSize: %v, maxL1CommitGas: %v, maxRowConsumption: %v, maxBlobSize: %v", + block.Header.Number, metrics, p.maxTxNumPerChunk, p.maxL1CommitCalldataSizePerChunk, p.maxL1CommitGasPerChunk, p.maxRowConsumptionPerChunk, maxBlobSize) } log.Debug("breaking limit condition in chunking", - "totalTxNum", totalTxNum, - "maxTxNumPerChunk", p.maxTxNumPerChunk, - "currentL1CommitCalldataSize", totalL1CommitCalldataSize, - "maxL1CommitCalldataSizePerChunk", p.maxL1CommitCalldataSizePerChunk, - "currentOverEstimateL1CommitGas", totalOverEstimateL1CommitGas, - "maxL1CommitGasPerChunk", p.maxL1CommitGasPerChunk, - "chunkRowConsumptionMax", crcMax, - "chunkRowConsumption", crc, - "p.maxRowConsumptionPerChunk", p.maxRowConsumptionPerChunk) + "txNum", metrics.TxNum, + "maxTxNum", p.maxTxNumPerChunk, + "l1CommitCalldataSize", metrics.L1CommitCalldataSize, + "maxL1CommitCalldataSize", p.maxL1CommitCalldataSizePerChunk, + "overEstimatedL1CommitGas", overEstimatedL1CommitGas, + "maxL1CommitGas", p.maxL1CommitGasPerChunk, + "rowConsumption", metrics.CrcMax, + "maxRowConsumption", p.maxRowConsumptionPerChunk, + "maxBlobSize", maxBlobSize) - p.chunkTxNum.Set(float64(lastTotalTxNum)) - p.chunkEstimateL1CommitGas.Set(float64(lastTotalL1CommitGas)) - p.totalL1CommitCalldataSize.Set(float64(lastTotalL1CommitCalldataSize)) - p.maxTxConsumption.Set(float64(lastCrcMax)) - p.totalTxGasUsed.Set(float64(lastTotalTxGasUsed)) - p.chunkBlocksNum.Set(float64(len(chunk.Blocks))) - return &chunk, nil + chunk.Blocks = chunk.Blocks[:len(chunk.Blocks)-1] + + metrics, calcErr := utils.CalculateChunkMetrics(&chunk, codecVersion) + if calcErr != nil { + return fmt.Errorf("failed to calculate chunk metrics: %w", calcErr) + } + + p.recordChunkMetrics(metrics) + return p.updateDBChunkInfo(&chunk, codecVersion) } - chunk.Blocks = append(chunk.Blocks, block) + } + + metrics, calcErr := utils.CalculateChunkMetrics(&chunk, codecVersion) + if calcErr != nil { + return fmt.Errorf("failed to calculate chunk metrics: %w", calcErr) } currentTimeSec := uint64(time.Now().Unix()) - if chunk.Blocks[0].Header.Time+p.chunkTimeoutSec < currentTimeSec || - uint64(len(chunk.Blocks)) == p.maxBlockNumPerChunk { - if chunk.Blocks[0].Header.Time+p.chunkTimeoutSec < currentTimeSec { - log.Warn("first block timeout", - "block number", chunk.Blocks[0].Header.Number, - "block timestamp", chunk.Blocks[0].Header.Time, - "current time", currentTimeSec, - ) - } else { - log.Info("reached maximum number of blocks in chunk", - "start block number", chunk.Blocks[0].Header.Number, - "block count", len(chunk.Blocks), - ) - } + if metrics.FirstBlockTimestamp+p.chunkTimeoutSec < currentTimeSec || metrics.NumBlocks == maxBlocksThisChunk { + log.Info("reached maximum number of blocks in chunk or first block timeout", + "start block number", chunk.Blocks[0].Header.Number, + "block count", len(chunk.Blocks), + "block number", chunk.Blocks[0].Header.Number, + "block timestamp", metrics.FirstBlockTimestamp, + "current time", currentTimeSec) p.chunkFirstBlockTimeoutReached.Inc() - p.chunkTxNum.Set(float64(totalTxNum)) - p.chunkEstimateL1CommitGas.Set(float64(totalL1CommitGas)) - p.totalL1CommitCalldataSize.Set(float64(totalL1CommitCalldataSize)) - p.maxTxConsumption.Set(float64(crc.max())) - p.totalTxGasUsed.Set(float64(totalTxGasUsed)) - p.chunkBlocksNum.Set(float64(len(chunk.Blocks))) - return &chunk, nil + p.recordChunkMetrics(metrics) + return p.updateDBChunkInfo(&chunk, codecVersion) } log.Debug("pending blocks do not reach one of the constraints or contain a timeout block") p.chunkBlocksProposeNotEnoughTotal.Inc() - return nil, nil + return nil +} + +func (p *ChunkProposer) recordChunkMetrics(metrics *utils.ChunkMetrics) { + p.chunkTxNum.Set(float64(metrics.TxNum)) + p.maxTxConsumption.Set(float64(metrics.CrcMax)) + p.chunkBlocksNum.Set(float64(metrics.NumBlocks)) + p.totalL1CommitCalldataSize.Set(float64(metrics.L1CommitCalldataSize)) + p.chunkEstimateL1CommitGas.Set(float64(metrics.L1CommitGas)) + p.totalL1CommitBlobSize.Set(float64(metrics.L1CommitBlobSize)) } diff --git a/rollup/internal/controller/watcher/chunk_proposer_test.go b/rollup/internal/controller/watcher/chunk_proposer_test.go index bef35323b..287cdb4d0 100644 --- a/rollup/internal/controller/watcher/chunk_proposer_test.go +++ b/rollup/internal/controller/watcher/chunk_proposer_test.go @@ -2,18 +2,21 @@ package watcher import ( "context" + "math/big" "testing" + "github.com/scroll-tech/go-ethereum/common/math" + "github.com/scroll-tech/go-ethereum/params" "github.com/stretchr/testify/assert" "scroll-tech/common/database" - "scroll-tech/common/types" + "scroll-tech/common/types/encoding" "scroll-tech/rollup/internal/config" "scroll-tech/rollup/internal/orm" ) -func testChunkProposerLimits(t *testing.T) { +func testChunkProposerCodecv0Limits(t *testing.T) { tests := []struct { name string maxBlockNum uint64 @@ -22,6 +25,7 @@ func testChunkProposerLimits(t *testing.T) { maxL1CommitCalldataSize uint64 maxRowConsumption uint64 chunkTimeoutSec uint64 + forkBlock *big.Int expectedChunksLen int expectedBlocksInFirstChunk int // only be checked when expectedChunksLen > 0 }{ @@ -112,7 +116,7 @@ func testChunkProposerLimits(t *testing.T) { name: "MaxL1CommitGasPerChunkIsFirstBlock", maxBlockNum: 10, maxTxNum: 10000, - maxL1CommitGas: 60, + maxL1CommitGas: 7250, maxL1CommitCalldataSize: 1000000, maxRowConsumption: 1000000, chunkTimeoutSec: 1000000000000, @@ -141,6 +145,18 @@ func testChunkProposerLimits(t *testing.T) { expectedChunksLen: 1, expectedBlocksInFirstChunk: 1, }, + { + name: "ForkBlockReached", + maxBlockNum: 100, + maxTxNum: 10000, + maxL1CommitGas: 50000000000, + maxL1CommitCalldataSize: 1000000, + maxRowConsumption: 1000000, + chunkTimeoutSec: 1000000000000, + expectedChunksLen: 1, + expectedBlocksInFirstChunk: 1, + forkBlock: big.NewInt(2), + }, } for _, tt := range tests { @@ -149,7 +165,7 @@ func testChunkProposerLimits(t *testing.T) { defer database.CloseDB(db) l2BlockOrm := orm.NewL2Block(db) - err := l2BlockOrm.InsertL2Blocks(context.Background(), []*types.WrappedBlock{wrappedBlock1, wrappedBlock2}) + err := l2BlockOrm.InsertL2Blocks(context.Background(), []*encoding.Block{block1, block2}) assert.NoError(t, err) cp := NewChunkProposer(context.Background(), &config.ChunkProposerConfig{ @@ -160,6 +176,8 @@ func testChunkProposerLimits(t *testing.T) { MaxRowConsumptionPerChunk: tt.maxRowConsumption, ChunkTimeoutSec: tt.chunkTimeoutSec, GasCostIncreaseMultiplier: 1.2, + }, ¶ms.ChainConfig{ + HomesteadBlock: tt.forkBlock, }, db, nil) cp.TryProposeChunk() @@ -170,13 +188,175 @@ func testChunkProposerLimits(t *testing.T) { if len(chunks) > 0 { blockOrm := orm.NewL2Block(db) - blocks, err := blockOrm.GetL2Blocks(context.Background(), map[string]interface{}{}, []string{"number ASC"}, tt.expectedBlocksInFirstChunk) + chunkHashes, err := blockOrm.GetChunkHashes(context.Background(), tt.expectedBlocksInFirstChunk) assert.NoError(t, err) - assert.Len(t, blocks, tt.expectedBlocksInFirstChunk) - for _, block := range blocks { - assert.Equal(t, chunks[0].Hash, block.ChunkHash) + assert.Len(t, chunkHashes, tt.expectedBlocksInFirstChunk) + firstChunkHash := chunks[0].Hash + for _, chunkHash := range chunkHashes { + assert.Equal(t, firstChunkHash, chunkHash) } } }) } } + +func testChunkProposerCodecv1Limits(t *testing.T) { + tests := []struct { + name string + maxBlockNum uint64 + maxTxNum uint64 + maxRowConsumption uint64 + chunkTimeoutSec uint64 + forkBlock *big.Int + expectedChunksLen int + expectedBlocksInFirstChunk int // only be checked when expectedChunksLen > 0 + }{ + { + name: "NoLimitReached", + maxBlockNum: 100, + maxTxNum: 10000, + maxRowConsumption: 1000000, + chunkTimeoutSec: 1000000000000, + expectedChunksLen: 0, + }, + { + name: "Timeout", + maxBlockNum: 100, + maxTxNum: 10000, + maxRowConsumption: 1000000, + chunkTimeoutSec: 0, + expectedChunksLen: 1, + expectedBlocksInFirstChunk: 2, + }, + { + name: "MaxTxNumPerChunkIs0", + maxBlockNum: 10, + maxTxNum: 0, + maxRowConsumption: 1000000, + chunkTimeoutSec: 1000000000000, + expectedChunksLen: 0, + }, + { + name: "MaxRowConsumptionPerChunkIs0", + maxBlockNum: 100, + maxTxNum: 10000, + maxRowConsumption: 0, + chunkTimeoutSec: 1000000000000, + expectedChunksLen: 0, + }, + { + name: "MaxBlockNumPerChunkIs1", + maxBlockNum: 1, + maxTxNum: 10000, + maxRowConsumption: 1000000, + chunkTimeoutSec: 1000000000000, + expectedChunksLen: 1, + expectedBlocksInFirstChunk: 1, + }, + { + name: "MaxTxNumPerChunkIsFirstBlock", + maxBlockNum: 10, + maxTxNum: 2, + maxRowConsumption: 1000000, + chunkTimeoutSec: 1000000000000, + expectedChunksLen: 1, + expectedBlocksInFirstChunk: 1, + }, + { + name: "MaxRowConsumptionPerChunkIs1", + maxBlockNum: 10, + maxTxNum: 10000, + maxRowConsumption: 1, + chunkTimeoutSec: 1000000000000, + expectedChunksLen: 1, + expectedBlocksInFirstChunk: 1, + }, + { + name: "ForkBlockReached", + maxBlockNum: 100, + maxTxNum: 10000, + maxRowConsumption: 1000000, + chunkTimeoutSec: 1000000000000, + expectedChunksLen: 1, + expectedBlocksInFirstChunk: 1, + forkBlock: big.NewInt(2), + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + db := setupDB(t) + defer database.CloseDB(db) + + l2BlockOrm := orm.NewL2Block(db) + err := l2BlockOrm.InsertL2Blocks(context.Background(), []*encoding.Block{block1, block2}) + assert.NoError(t, err) + + cp := NewChunkProposer(context.Background(), &config.ChunkProposerConfig{ + MaxBlockNumPerChunk: tt.maxBlockNum, + MaxTxNumPerChunk: tt.maxTxNum, + MaxL1CommitGasPerChunk: 1, + MaxL1CommitCalldataSizePerChunk: 1, + MaxRowConsumptionPerChunk: tt.maxRowConsumption, + ChunkTimeoutSec: tt.chunkTimeoutSec, + GasCostIncreaseMultiplier: 1.2, + }, ¶ms.ChainConfig{BernoulliBlock: big.NewInt(0), HomesteadBlock: tt.forkBlock}, db, nil) + cp.TryProposeChunk() + + chunkOrm := orm.NewChunk(db) + chunks, err := chunkOrm.GetChunksGEIndex(context.Background(), 0, 0) + assert.NoError(t, err) + assert.Len(t, chunks, tt.expectedChunksLen) + + if len(chunks) > 0 { + blockOrm := orm.NewL2Block(db) + chunkHashes, err := blockOrm.GetChunkHashes(context.Background(), tt.expectedBlocksInFirstChunk) + assert.NoError(t, err) + assert.Len(t, chunkHashes, tt.expectedBlocksInFirstChunk) + firstChunkHash := chunks[0].Hash + for _, chunkHash := range chunkHashes { + assert.Equal(t, firstChunkHash, chunkHash) + } + } + }) + } +} + +func testChunkProposerCodecv1BlobSizeLimit(t *testing.T) { + db := setupDB(t) + defer database.CloseDB(db) + + block := readBlockFromJSON(t, "../../../testdata/blockTrace_02.json") + for i := int64(0); i < 2000; i++ { + l2BlockOrm := orm.NewL2Block(db) + block.Header.Number = big.NewInt(i + 1) + err := l2BlockOrm.InsertL2Blocks(context.Background(), []*encoding.Block{block}) + assert.NoError(t, err) + } + + cp := NewChunkProposer(context.Background(), &config.ChunkProposerConfig{ + MaxBlockNumPerChunk: math.MaxUint64, + MaxTxNumPerChunk: math.MaxUint64, + MaxL1CommitGasPerChunk: 1, + MaxL1CommitCalldataSizePerChunk: 1, + MaxRowConsumptionPerChunk: math.MaxUint64, + ChunkTimeoutSec: math.MaxUint64, + GasCostIncreaseMultiplier: 1, + }, ¶ms.ChainConfig{BernoulliBlock: big.NewInt(0)}, db, nil) + + for i := 0; i < 10; i++ { + cp.TryProposeChunk() + } + + chunkOrm := orm.NewChunk(db) + chunks, err := chunkOrm.GetChunksGEIndex(context.Background(), 0, 0) + assert.NoError(t, err) + assert.Len(t, chunks, 4) + for i, chunk := range chunks { + expected := uint64(551 * (i + 1)) + if expected > 2000 { + expected = 2000 + } + assert.Equal(t, expected, chunk.EndBlockNumber) + } +} diff --git a/rollup/internal/controller/watcher/l1_watcher_test.go b/rollup/internal/controller/watcher/l1_watcher_test.go index ffeb18faa..1ba338bdc 100644 --- a/rollup/internal/controller/watcher/l1_watcher_test.go +++ b/rollup/internal/controller/watcher/l1_watcher_test.go @@ -27,7 +27,7 @@ import ( func setupL1Watcher(t *testing.T) (*L1WatcherClient, *gorm.DB) { db := setupDB(t) - client, err := ethclient.Dial(base.L1gethImg.Endpoint()) + client, err := testApps.GetL1GethClient() assert.NoError(t, err) l1Cfg := cfg.L1Config watcher := NewL1WatcherClient(context.Background(), client, l1Cfg.StartHeight, l1Cfg.Confirmations, l1Cfg.L1MessageQueueAddress, l1Cfg.RelayerConfig.RollupContractAddress, db, nil) diff --git a/rollup/internal/controller/watcher/l2_watcher.go b/rollup/internal/controller/watcher/l2_watcher.go index 3a6a832aa..6e4029f19 100644 --- a/rollup/internal/controller/watcher/l2_watcher.go +++ b/rollup/internal/controller/watcher/l2_watcher.go @@ -16,7 +16,8 @@ import ( "github.com/scroll-tech/go-ethereum/rpc" "gorm.io/gorm" - "scroll-tech/common/types" + "scroll-tech/common/types/encoding" + "scroll-tech/common/types/encoding/codecv0" bridgeAbi "scroll-tech/rollup/abi" "scroll-tech/rollup/internal/orm" @@ -58,7 +59,7 @@ func NewL2WatcherClient(ctx context.Context, client *ethclient.Client, confirmat } } -const blockTracesFetchLimit = uint64(10) +const blocksFetchLimit = uint64(10) // TryFetchRunningMissingBlocks attempts to fetch and store block traces for any missing blocks. func (w *L2WatcherClient) TryFetchRunningMissingBlocks(blockHeight uint64) { @@ -70,14 +71,14 @@ func (w *L2WatcherClient) TryFetchRunningMissingBlocks(blockHeight uint64) { } // Fetch and store block traces for missing blocks - for from := heightInDB + 1; from <= blockHeight; from += blockTracesFetchLimit { - to := from + blockTracesFetchLimit - 1 + for from := heightInDB + 1; from <= blockHeight; from += blocksFetchLimit { + to := from + blocksFetchLimit - 1 if to > blockHeight { to = blockHeight } - if err = w.getAndStoreBlockTraces(w.ctx, from, to); err != nil { + if err = w.getAndStoreBlocks(w.ctx, from, to); err != nil { log.Error("fail to getAndStoreBlockTraces", "from", from, "to", to, "err", err) return } @@ -101,26 +102,29 @@ func txsToTxsData(txs gethTypes.Transactions) []*gethTypes.TransactionData { } txsData[i] = &gethTypes.TransactionData{ - Type: tx.Type(), - TxHash: tx.Hash().String(), - Nonce: nonce, - ChainId: (*hexutil.Big)(tx.ChainId()), - Gas: tx.Gas(), - GasPrice: (*hexutil.Big)(tx.GasPrice()), - To: tx.To(), - Value: (*hexutil.Big)(tx.Value()), - Data: hexutil.Encode(tx.Data()), - IsCreate: tx.To() == nil, - V: (*hexutil.Big)(v), - R: (*hexutil.Big)(r), - S: (*hexutil.Big)(s), + Type: tx.Type(), + TxHash: tx.Hash().String(), + Nonce: nonce, + ChainId: (*hexutil.Big)(tx.ChainId()), + Gas: tx.Gas(), + GasPrice: (*hexutil.Big)(tx.GasPrice()), + GasTipCap: (*hexutil.Big)(tx.GasTipCap()), + GasFeeCap: (*hexutil.Big)(tx.GasFeeCap()), + To: tx.To(), + Value: (*hexutil.Big)(tx.Value()), + Data: hexutil.Encode(tx.Data()), + IsCreate: tx.To() == nil, + AccessList: tx.AccessList(), + V: (*hexutil.Big)(v), + R: (*hexutil.Big)(r), + S: (*hexutil.Big)(s), } } return txsData } -func (w *L2WatcherClient) getAndStoreBlockTraces(ctx context.Context, from, to uint64) error { - var blocks []*types.WrappedBlock +func (w *L2WatcherClient) getAndStoreBlocks(ctx context.Context, from, to uint64) error { + var blocks []*encoding.Block for number := from; number <= to; number++ { log.Debug("retrieving block", "height", number) block, err := w.GetBlockByNumberOrHash(ctx, rpc.BlockNumberOrHashWithNumber(rpc.BlockNumber(number))) @@ -137,7 +141,7 @@ func (w *L2WatcherClient) getAndStoreBlockTraces(ctx context.Context, from, to u if err3 != nil { return fmt.Errorf("failed to get withdrawRoot: %v. number: %v", err3, number) } - blocks = append(blocks, &types.WrappedBlock{ + blocks = append(blocks, &encoding.Block{ Header: block.Header(), Transactions: txsToTxsData(block.Transactions()), WithdrawRoot: common.BytesToHash(withdrawRoot), @@ -147,7 +151,11 @@ func (w *L2WatcherClient) getAndStoreBlockTraces(ctx context.Context, from, to u if len(blocks) > 0 { for _, block := range blocks { - w.metrics.rollupL2BlockL1CommitCalldataSize.Set(float64(block.EstimateL1CommitCalldataSize())) + blockL1CommitCalldataSize, err := codecv0.EstimateBlockL1CommitCalldataSize(block) + if err != nil { + return fmt.Errorf("failed to estimate block L1 commit calldata size: %v", err) + } + w.metrics.rollupL2BlockL1CommitCalldataSize.Set(float64(blockL1CommitCalldataSize)) } if err := w.l2BlockOrm.InsertL2Blocks(w.ctx, blocks); err != nil { return fmt.Errorf("failed to batch insert BlockTraces: %v", err) diff --git a/rollup/internal/controller/watcher/l2_watcher_test.go b/rollup/internal/controller/watcher/l2_watcher_test.go index 29f523efd..ed0d96df7 100644 --- a/rollup/internal/controller/watcher/l2_watcher_test.go +++ b/rollup/internal/controller/watcher/l2_watcher_test.go @@ -2,13 +2,10 @@ package watcher import ( "context" - "crypto/ecdsa" - "math/big" "testing" "gorm.io/gorm" - "github.com/scroll-tech/go-ethereum/accounts/abi/bind" "github.com/scroll-tech/go-ethereum/common" "github.com/scroll-tech/go-ethereum/ethclient" "github.com/scroll-tech/go-ethereum/rpc" @@ -18,7 +15,6 @@ import ( cutils "scroll-tech/common/utils" "scroll-tech/rollup/internal/orm" - "scroll-tech/rollup/mock_bridge" ) func setupL2Watcher(t *testing.T) (*L2WatcherClient, *gorm.DB) { @@ -32,21 +28,13 @@ func testFetchRunningMissingBlocks(t *testing.T) { _, db := setupL2Watcher(t) defer database.CloseDB(db) - auth := prepareAuth(t, l2Cli, cfg.L2Config.RelayerConfig.GasOracleSenderPrivateKey) - - // deploy mock bridge - _, tx, _, err := mock_bridge.DeployMockBridgeL2(auth, l2Cli) - assert.NoError(t, err) - address, err := bind.WaitDeployed(context.Background(), l2Cli, tx) - assert.NoError(t, err) - l2BlockOrm := orm.NewL2Block(db) ok := cutils.TryTimes(10, func() bool { latestHeight, err := l2Cli.BlockNumber(context.Background()) if err != nil { return false } - wc := prepareWatcherClient(l2Cli, db, address) + wc := prepareWatcherClient(l2Cli, db) wc.TryFetchRunningMissingBlocks(latestHeight) fetchedHeight, err := l2BlockOrm.GetL2BlocksLatestHeight(context.Background()) return err == nil && fetchedHeight == latestHeight @@ -54,18 +42,7 @@ func testFetchRunningMissingBlocks(t *testing.T) { assert.True(t, ok) } -func prepareWatcherClient(l2Cli *ethclient.Client, db *gorm.DB, contractAddr common.Address) *L2WatcherClient { +func prepareWatcherClient(l2Cli *ethclient.Client, db *gorm.DB) *L2WatcherClient { confirmations := rpc.LatestBlockNumber - return NewL2WatcherClient(context.Background(), l2Cli, confirmations, contractAddr, common.Hash{}, db, nil) -} - -func prepareAuth(t *testing.T, l2Cli *ethclient.Client, privateKey *ecdsa.PrivateKey) *bind.TransactOpts { - auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(53077)) - assert.NoError(t, err) - auth.Value = big.NewInt(0) // in wei - assert.NoError(t, err) - auth.GasPrice, err = l2Cli.SuggestGasPrice(context.Background()) - assert.NoError(t, err) - auth.GasLimit = 500000 - return auth + return NewL2WatcherClient(context.Background(), l2Cli, confirmations, common.Address{}, common.Hash{}, db, nil) } diff --git a/rollup/internal/controller/watcher/watcher_test.go b/rollup/internal/controller/watcher/watcher_test.go index 68af7c3fb..78bf754db 100644 --- a/rollup/internal/controller/watcher/watcher_test.go +++ b/rollup/internal/controller/watcher/watcher_test.go @@ -11,9 +11,8 @@ import ( "gorm.io/gorm" "scroll-tech/common/database" - "scroll-tech/common/docker" - "scroll-tech/common/types" - + "scroll-tech/common/testcontainers" + "scroll-tech/common/types/encoding" "scroll-tech/database/migrate" "scroll-tech/rollup/internal/config" @@ -23,14 +22,14 @@ var ( // config cfg *config.Config - base *docker.App + testApps *testcontainers.TestcontainerApps // l2geth client l2Cli *ethclient.Client // block trace - wrappedBlock1 *types.WrappedBlock - wrappedBlock2 *types.WrappedBlock + block1 *encoding.Block + block2 *encoding.Block ) func setupEnv(t *testing.T) (err error) { @@ -42,40 +41,32 @@ func setupEnv(t *testing.T) (err error) { cfg, err = config.NewConfig("../../../conf/config.json") assert.NoError(t, err) - base.RunImages(t) + testApps = testcontainers.NewTestcontainerApps() + assert.NoError(t, testApps.StartPostgresContainer()) + assert.NoError(t, testApps.StartL1GethContainer()) + assert.NoError(t, testApps.StartL2GethContainer()) - cfg.L2Config.RelayerConfig.SenderConfig.Endpoint = base.L1gethImg.Endpoint() - cfg.L1Config.RelayerConfig.SenderConfig.Endpoint = base.L2gethImg.Endpoint() + cfg.L2Config.RelayerConfig.SenderConfig.Endpoint, err = testApps.GetL1GethEndPoint() + assert.NoError(t, err) + cfg.L1Config.RelayerConfig.SenderConfig.Endpoint, err = testApps.GetL2GethEndPoint() + assert.NoError(t, err) + + dsn, err := testApps.GetDBEndPoint() + assert.NoError(t, err) cfg.DBConfig = &database.Config{ - DSN: base.DBConfig.DSN, - DriverName: base.DBConfig.DriverName, - MaxOpenNum: base.DBConfig.MaxOpenNum, - MaxIdleNum: base.DBConfig.MaxIdleNum, + DSN: dsn, + DriverName: "postgres", + MaxOpenNum: 200, + MaxIdleNum: 20, } // Create l2geth client. - l2Cli, err = base.L2Client() + l2Cli, err = testApps.GetL2GethClient() assert.NoError(t, err) - templateBlockTrace1, err := os.ReadFile("../../../testdata/blockTrace_02.json") - if err != nil { - return err - } - // unmarshal blockTrace - wrappedBlock1 = &types.WrappedBlock{} - if err = json.Unmarshal(templateBlockTrace1, wrappedBlock1); err != nil { - return err - } + block1 = readBlockFromJSON(t, "../../../testdata/blockTrace_02.json") + block2 = readBlockFromJSON(t, "../../../testdata/blockTrace_03.json") - templateBlockTrace2, err := os.ReadFile("../../../testdata/blockTrace_03.json") - if err != nil { - return err - } - // unmarshal blockTrace - wrappedBlock2 = &types.WrappedBlock{} - if err = json.Unmarshal(templateBlockTrace2, wrappedBlock2); err != nil { - return err - } return err } @@ -89,11 +80,12 @@ func setupDB(t *testing.T) *gorm.DB { } func TestMain(m *testing.M) { - base = docker.NewDockerApp() - + defer func() { + if testApps != nil { + testApps.Free() + } + }() m.Run() - - base.Free() } func TestFunction(t *testing.T) { @@ -113,9 +105,22 @@ func TestFunction(t *testing.T) { t.Run("TestFetchRunningMissingBlocks", testFetchRunningMissingBlocks) // Run chunk proposer test cases. - t.Run("TestChunkProposerLimits", testChunkProposerLimits) + t.Run("TestChunkProposerCodecv0Limits", testChunkProposerCodecv0Limits) + t.Run("TestChunkProposerCodecv1Limits", testChunkProposerCodecv1Limits) + t.Run("TestChunkProposerCodecv1BlobSizeLimit", testChunkProposerCodecv1BlobSizeLimit) // Run chunk proposer test cases. - t.Run("TestBatchProposerLimits", testBatchProposerLimits) + t.Run("TestBatchProposerCodecv0Limits", testBatchProposerCodecv0Limits) + t.Run("TestBatchProposerCodecv1Limits", testBatchProposerCodecv1Limits) t.Run("TestBatchCommitGasAndCalldataSizeEstimation", testBatchCommitGasAndCalldataSizeEstimation) + t.Run("TestBatchProposerBlobSizeLimit", testBatchProposerBlobSizeLimit) +} + +func readBlockFromJSON(t *testing.T, filename string) *encoding.Block { + data, err := os.ReadFile(filename) + assert.NoError(t, err) + + block := &encoding.Block{} + assert.NoError(t, json.Unmarshal(data, block)) + return block } diff --git a/rollup/internal/orm/batch.go b/rollup/internal/orm/batch.go index ccd5873b8..91624470b 100644 --- a/rollup/internal/orm/batch.go +++ b/rollup/internal/orm/batch.go @@ -7,17 +7,17 @@ import ( "fmt" "time" + "github.com/scroll-tech/go-ethereum/log" + "gorm.io/gorm" + "scroll-tech/common/types" + "scroll-tech/common/types/encoding" "scroll-tech/common/types/message" "scroll-tech/common/utils" - "github.com/scroll-tech/go-ethereum/common" - "github.com/scroll-tech/go-ethereum/log" - "gorm.io/gorm" + rutils "scroll-tech/rollup/internal/utils" ) -const defaultBatchHeaderVersion = 0 - // Batch represents a batch of chunks. type Batch struct { db *gorm.DB `gorm:"column:-"` @@ -55,7 +55,7 @@ type Batch struct { // metadata TotalL1CommitGas uint64 `json:"total_l1_commit_gas" gorm:"column:total_l1_commit_gas;default:0"` - TotalL1CommitCalldataSize uint32 `json:"total_l1_commit_calldata_size" gorm:"column:total_l1_commit_calldata_size;default:0"` + TotalL1CommitCalldataSize uint64 `json:"total_l1_commit_calldata_size" gorm:"column:total_l1_commit_calldata_size;default:0"` CreatedAt time.Time `json:"created_at" gorm:"column:created_at"` UpdatedAt time.Time `json:"updated_at" gorm:"column:updated_at"` DeletedAt gorm.DeletedAt `json:"deleted_at" gorm:"column:deleted_at;default:NULL"` @@ -137,9 +137,6 @@ func (o *Batch) GetLatestBatch(ctx context.Context) (*Batch, error) { var latestBatch Batch if err := db.First(&latestBatch).Error; err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil, nil - } return nil, fmt.Errorf("Batch.GetLatestBatch error: %w", err) } return &latestBatch, nil @@ -150,12 +147,7 @@ func (o *Batch) GetFirstUnbatchedChunkIndex(ctx context.Context) (uint64, error) // Get the latest batch latestBatch, err := o.GetLatestBatch(ctx) if err != nil { - return 0, fmt.Errorf("Chunk.GetChunkedBlockHeight error: %w", err) - } - // if parentBatch==nil then err==gorm.ErrRecordNotFound, - // which means there is not batched chunk yet, thus returns 0 - if latestBatch == nil { - return 0, nil + return 0, fmt.Errorf("Batch.GetFirstUnbatchedChunkIndex error: %w", err) } return latestBatch.EndChunkIndex + 1, nil } @@ -227,68 +219,58 @@ func (o *Batch) GetBatchByIndex(ctx context.Context, index uint64) (*Batch, erro } // InsertBatch inserts a new batch into the database. -func (o *Batch) InsertBatch(ctx context.Context, chunks []*types.Chunk, batchMeta *types.BatchMeta, dbTX ...*gorm.DB) (*Batch, error) { - if len(chunks) == 0 { - return nil, errors.New("invalid args") +func (o *Batch) InsertBatch(ctx context.Context, batch *encoding.Batch, codecVersion encoding.CodecVersion, dbTX ...*gorm.DB) (*Batch, error) { + if batch == nil { + return nil, errors.New("invalid args: batch is nil") } - parentBatch, err := o.GetLatestBatch(ctx) + numChunks := uint64(len(batch.Chunks)) + if numChunks == 0 { + return nil, errors.New("invalid args: batch contains 0 chunk") + } + + metrics, err := rutils.CalculateBatchMetrics(batch, codecVersion) if err != nil { - log.Error("failed to get the latest batch", "err", err) - return nil, err + log.Error("failed to calculate batch metrics", + "index", batch.Index, "total l1 message popped before", batch.TotalL1MessagePoppedBefore, + "parent hash", batch.ParentBatchHash, "number of chunks", numChunks, "err", err) } - var batchIndex uint64 - var parentBatchHash common.Hash - var totalL1MessagePoppedBefore uint64 - var version uint8 = defaultBatchHeaderVersion - - // if parentBatch==nil then err==gorm.ErrRecordNotFound, which means there's - // not batch record in the db, we then use default empty values for the creating batch; - // if parentBatch!=nil then err=nil, then we fill the parentBatch-related data into the creating batch - if parentBatch != nil { - batchIndex = parentBatch.Index + 1 - parentBatchHash = common.HexToHash(parentBatch.Hash) - - var parentBatchHeader *types.BatchHeader - parentBatchHeader, err = types.DecodeBatchHeader(parentBatch.BatchHeader) - if err != nil { - log.Error("failed to decode parent batch header", "index", parentBatch.Index, "hash", parentBatch.Hash, "err", err) - return nil, err + var startChunkIndex uint64 + if batch.Index > 0 { + parentBatch, getErr := o.GetBatchByIndex(ctx, batch.Index-1) + if getErr != nil { + log.Error("failed to get batch by index", "index", batch.Index, "total l1 message popped before", batch.TotalL1MessagePoppedBefore, + "parent hash", batch.ParentBatchHash, "number of chunks", numChunks, "err", getErr) + return nil, fmt.Errorf("Batch.InsertBatch error: %w", getErr) } - - totalL1MessagePoppedBefore = parentBatchHeader.TotalL1MessagePopped() - version = parentBatchHeader.Version() + startChunkIndex = parentBatch.EndChunkIndex + 1 } - batchHeader, err := types.NewBatchHeader(version, batchIndex, totalL1MessagePoppedBefore, parentBatchHash, chunks) + batchMeta, err := rutils.GetBatchMetadata(batch, codecVersion) if err != nil { - log.Error("failed to create batch header", - "index", batchIndex, "total l1 message popped before", totalL1MessagePoppedBefore, - "parent hash", parentBatchHash, "number of chunks", len(chunks), "err", err) - return nil, err + log.Error("failed to get batch metadata", "index", batch.Index, "total l1 message popped before", batch.TotalL1MessagePoppedBefore, + "parent hash", batch.ParentBatchHash, "number of chunks", numChunks, "err", err) + return nil, fmt.Errorf("Batch.InsertBatch error: %w", err) } - numChunks := len(chunks) - lastChunkBlockNum := len(chunks[numChunks-1].Blocks) - newBatch := Batch{ - Index: batchIndex, - Hash: batchHeader.Hash().Hex(), - StartChunkHash: batchMeta.StartChunkHash, - StartChunkIndex: batchMeta.StartChunkIndex, - EndChunkHash: batchMeta.EndChunkHash, - EndChunkIndex: batchMeta.EndChunkIndex, - StateRoot: chunks[numChunks-1].Blocks[lastChunkBlockNum-1].Header.Root.Hex(), - WithdrawRoot: chunks[numChunks-1].Blocks[lastChunkBlockNum-1].WithdrawRoot.Hex(), - ParentBatchHash: parentBatchHash.Hex(), - BatchHeader: batchHeader.Encode(), + Index: batch.Index, + Hash: batchMeta.BatchHash.Hex(), + StartChunkHash: batchMeta.StartChunkHash.Hex(), + StartChunkIndex: startChunkIndex, + EndChunkHash: batchMeta.EndChunkHash.Hex(), + EndChunkIndex: startChunkIndex + numChunks - 1, + StateRoot: batch.StateRoot().Hex(), + WithdrawRoot: batch.WithdrawRoot().Hex(), + ParentBatchHash: batch.ParentBatchHash.Hex(), + BatchHeader: batchMeta.BatchBytes, ChunkProofsStatus: int16(types.ChunkProofsStatusPending), ProvingStatus: int16(types.ProvingTaskUnassigned), RollupStatus: int16(types.RollupPending), OracleStatus: int16(types.GasOraclePending), - TotalL1CommitGas: batchMeta.TotalL1CommitGas, - TotalL1CommitCalldataSize: batchMeta.TotalL1CommitCalldataSize, + TotalL1CommitGas: metrics.L1CommitGas, + TotalL1CommitCalldataSize: metrics.L1CommitCalldataSize, } db := o.db diff --git a/rollup/internal/orm/chunk.go b/rollup/internal/orm/chunk.go index 49778fdf1..e348c0c67 100644 --- a/rollup/internal/orm/chunk.go +++ b/rollup/internal/orm/chunk.go @@ -7,6 +7,9 @@ import ( "time" "scroll-tech/common/types" + "scroll-tech/common/types/encoding" + + "scroll-tech/rollup/internal/utils" "github.com/scroll-tech/go-ethereum/log" "gorm.io/gorm" @@ -25,7 +28,7 @@ type Chunk struct { EndBlockHash string `json:"end_block_hash" gorm:"column:end_block_hash"` StartBlockTime uint64 `json:"start_block_time" gorm:"column:start_block_time"` TotalL1MessagesPoppedBefore uint64 `json:"total_l1_messages_popped_before" gorm:"column:total_l1_messages_popped_before"` - TotalL1MessagesPoppedInChunk uint32 `json:"total_l1_messages_popped_in_chunk" gorm:"column:total_l1_messages_popped_in_chunk"` + TotalL1MessagesPoppedInChunk uint64 `json:"total_l1_messages_popped_in_chunk" gorm:"column:total_l1_messages_popped_in_chunk"` ParentChunkHash string `json:"parent_chunk_hash" gorm:"column:parent_chunk_hash"` StateRoot string `json:"state_root" gorm:"column:state_root"` ParentChunkStateRoot string `json:"parent_chunk_state_root" gorm:"column:parent_chunk_state_root"` @@ -43,8 +46,8 @@ type Chunk struct { // metadata TotalL2TxGas uint64 `json:"total_l2_tx_gas" gorm:"column:total_l2_tx_gas"` - TotalL2TxNum uint32 `json:"total_l2_tx_num" gorm:"column:total_l2_tx_num"` - TotalL1CommitCalldataSize uint32 `json:"total_l1_commit_calldata_size" gorm:"column:total_l1_commit_calldata_size"` + TotalL2TxNum uint64 `json:"total_l2_tx_num" gorm:"column:total_l2_tx_num"` + TotalL1CommitCalldataSize uint64 `json:"total_l1_commit_calldata_size" gorm:"column:total_l1_commit_calldata_size"` TotalL1CommitGas uint64 `json:"total_l1_commit_gas" gorm:"column:total_l1_commit_gas"` CreatedAt time.Time `json:"created_at" gorm:"column:created_at"` UpdatedAt time.Time `json:"updated_at" gorm:"column:updated_at"` @@ -87,15 +90,18 @@ func (o *Chunk) GetChunksInRange(ctx context.Context, startIndex uint64, endInde return chunks, nil } -// GetLatestChunk retrieves the latest chunk from the database. -func (o *Chunk) GetLatestChunk(ctx context.Context) (*Chunk, error) { +// getLatestChunk retrieves the latest chunk from the database. +func (o *Chunk) getLatestChunk(ctx context.Context) (*Chunk, error) { db := o.db.WithContext(ctx) db = db.Model(&Chunk{}) db = db.Order("index desc") var latestChunk Chunk if err := db.First(&latestChunk).Error; err != nil { - return nil, fmt.Errorf("Chunk.GetLatestChunk error: %w", err) + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, nil + } + return nil, fmt.Errorf("Chunk.getLatestChunk error: %w", err) } return &latestChunk, nil } @@ -103,14 +109,14 @@ func (o *Chunk) GetLatestChunk(ctx context.Context) (*Chunk, error) { // GetUnchunkedBlockHeight retrieves the first unchunked block number. func (o *Chunk) GetUnchunkedBlockHeight(ctx context.Context) (uint64, error) { // Get the latest chunk - latestChunk, err := o.GetLatestChunk(ctx) + latestChunk, err := o.getLatestChunk(ctx) if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - // if there is no chunk, return block number 1, - // because no need to chunk genesis block number - return 1, nil - } - return 0, fmt.Errorf("Chunk.GetChunkedBlockHeight error: %w", err) + return 0, fmt.Errorf("Chunk.GetUnchunkedBlockHeight error: %w", err) + } + if latestChunk == nil { + // if there is no chunk, return block number 1, + // because no need to chunk genesis block number + return 1, nil } return latestChunk.EndBlockNumber + 1, nil } @@ -135,7 +141,7 @@ func (o *Chunk) GetChunksGEIndex(ctx context.Context, index uint64, limit int) ( } // InsertChunk inserts a new chunk into the database. -func (o *Chunk) InsertChunk(ctx context.Context, chunk *types.Chunk, dbTX ...*gorm.DB) (*Chunk, error) { +func (o *Chunk) InsertChunk(ctx context.Context, chunk *encoding.Chunk, codecVersion encoding.CodecVersion, dbTX ...*gorm.DB) (*Chunk, error) { if chunk == nil || len(chunk.Blocks) == 0 { return nil, errors.New("invalid args") } @@ -144,52 +150,49 @@ func (o *Chunk) InsertChunk(ctx context.Context, chunk *types.Chunk, dbTX ...*go var totalL1MessagePoppedBefore uint64 var parentChunkHash string var parentChunkStateRoot string - parentChunk, err := o.GetLatestChunk(ctx) - if err != nil && !errors.Is(errors.Unwrap(err), gorm.ErrRecordNotFound) { + parentChunk, err := o.getLatestChunk(ctx) + if err != nil { log.Error("failed to get latest chunk", "err", err) return nil, fmt.Errorf("Chunk.InsertChunk error: %w", err) } // if parentChunk==nil then err==gorm.ErrRecordNotFound, which means there's - // not chunk record in the db, we then use default empty values for the creating chunk; - // if parentChunk!=nil then err=nil, then we fill the parentChunk-related data into the creating chunk + // no chunk record in the db, we then use default empty values for the creating chunk; + // if parentChunk!=nil then err==nil, then we fill the parentChunk-related data into the creating chunk if parentChunk != nil { chunkIndex = parentChunk.Index + 1 - totalL1MessagePoppedBefore = parentChunk.TotalL1MessagesPoppedBefore + uint64(parentChunk.TotalL1MessagesPoppedInChunk) + totalL1MessagePoppedBefore = parentChunk.TotalL1MessagesPoppedBefore + parentChunk.TotalL1MessagesPoppedInChunk parentChunkHash = parentChunk.Hash parentChunkStateRoot = parentChunk.StateRoot } - hash, err := chunk.Hash(totalL1MessagePoppedBefore) + metrics, err := utils.CalculateChunkMetrics(chunk, codecVersion) + if err != nil { + log.Error("failed to calculate chunk metrics", "err", err) + return nil, fmt.Errorf("Chunk.InsertChunk error: %w", err) + } + + chunkHash, err := utils.GetChunkHash(chunk, totalL1MessagePoppedBefore, codecVersion) if err != nil { log.Error("failed to get chunk hash", "err", err) return nil, fmt.Errorf("Chunk.InsertChunk error: %w", err) } - var totalL2TxGas uint64 - var totalL2TxNum uint64 - var totalL1CommitCalldataSize uint64 - for _, block := range chunk.Blocks { - totalL2TxGas += block.Header.GasUsed - totalL2TxNum += block.NumL2Transactions() - totalL1CommitCalldataSize += block.EstimateL1CommitCalldataSize() - } - numBlocks := len(chunk.Blocks) newChunk := Chunk{ Index: chunkIndex, - Hash: hash.Hex(), + Hash: chunkHash.Hex(), StartBlockNumber: chunk.Blocks[0].Header.Number.Uint64(), StartBlockHash: chunk.Blocks[0].Header.Hash().Hex(), EndBlockNumber: chunk.Blocks[numBlocks-1].Header.Number.Uint64(), EndBlockHash: chunk.Blocks[numBlocks-1].Header.Hash().Hex(), - TotalL2TxGas: totalL2TxGas, - TotalL2TxNum: uint32(totalL2TxNum), - TotalL1CommitCalldataSize: uint32(totalL1CommitCalldataSize), - TotalL1CommitGas: chunk.EstimateL1CommitGas(), + TotalL2TxGas: chunk.L2GasUsed(), + TotalL2TxNum: chunk.NumL2Transactions(), + TotalL1CommitCalldataSize: metrics.L1CommitCalldataSize, + TotalL1CommitGas: metrics.L1CommitGas, StartBlockTime: chunk.Blocks[0].Header.Time, TotalL1MessagesPoppedBefore: totalL1MessagePoppedBefore, - TotalL1MessagesPoppedInChunk: uint32(chunk.NumL1Messages(totalL1MessagePoppedBefore)), + TotalL1MessagesPoppedInChunk: chunk.NumL1Messages(totalL1MessagePoppedBefore), ParentChunkHash: parentChunkHash, StateRoot: chunk.Blocks[numBlocks-1].Header.Root.Hex(), ParentChunkStateRoot: parentChunkStateRoot, diff --git a/rollup/internal/orm/l2_block.go b/rollup/internal/orm/l2_block.go index 6f1e019e3..1fa8bd220 100644 --- a/rollup/internal/orm/l2_block.go +++ b/rollup/internal/orm/l2_block.go @@ -11,7 +11,7 @@ import ( "github.com/scroll-tech/go-ethereum/log" "gorm.io/gorm" - "scroll-tech/common/types" + "scroll-tech/common/types/encoding" ) // L2Block represents a l2 block in the database. @@ -64,10 +64,10 @@ func (o *L2Block) GetL2BlocksLatestHeight(ctx context.Context) (uint64, error) { return maxNumber, nil } -// GetL2WrappedBlocksGEHeight retrieves L2 blocks that have a block number greater than or equal to the given height. -// The blocks are converted into WrappedBlock format for output. +// GetL2BlocksGEHeight retrieves L2 blocks that have a block number greater than or equal to the given height. +// The blocks are converted into encoding.Block format for output. // The returned blocks are sorted in ascending order by their block number. -func (o *L2Block) GetL2WrappedBlocksGEHeight(ctx context.Context, height uint64, limit int) ([]*types.WrappedBlock, error) { +func (o *L2Block) GetL2BlocksGEHeight(ctx context.Context, height uint64, limit int) ([]*encoding.Block, error) { db := o.db.WithContext(ctx) db = db.Model(&L2Block{}) db = db.Select("header, transactions, withdraw_root, row_consumption") @@ -80,65 +80,64 @@ func (o *L2Block) GetL2WrappedBlocksGEHeight(ctx context.Context, height uint64, var l2Blocks []L2Block if err := db.Find(&l2Blocks).Error; err != nil { - return nil, fmt.Errorf("L2Block.GetL2WrappedBlocksGEHeight error: %w", err) + return nil, fmt.Errorf("L2Block.GetL2BlocksGEHeight error: %w", err) } - var wrappedBlocks []*types.WrappedBlock + var blocks []*encoding.Block for _, v := range l2Blocks { - var wrappedBlock types.WrappedBlock + var block encoding.Block - if err := json.Unmarshal([]byte(v.Transactions), &wrappedBlock.Transactions); err != nil { - return nil, fmt.Errorf("L2Block.GetL2WrappedBlocksGEHeight error: %w", err) + if err := json.Unmarshal([]byte(v.Transactions), &block.Transactions); err != nil { + return nil, fmt.Errorf("L2Block.GetL2BlocksGEHeight error: %w", err) } - wrappedBlock.Header = &gethTypes.Header{} - if err := json.Unmarshal([]byte(v.Header), wrappedBlock.Header); err != nil { - return nil, fmt.Errorf("L2Block.GetL2WrappedBlocksGEHeight error: %w", err) + block.Header = &gethTypes.Header{} + if err := json.Unmarshal([]byte(v.Header), block.Header); err != nil { + return nil, fmt.Errorf("L2Block.GetL2BlocksGEHeight error: %w", err) } - wrappedBlock.WithdrawRoot = common.HexToHash(v.WithdrawRoot) + block.WithdrawRoot = common.HexToHash(v.WithdrawRoot) - if err := json.Unmarshal([]byte(v.RowConsumption), &wrappedBlock.RowConsumption); err != nil { - return nil, fmt.Errorf("L2Block.GetL2WrappedBlocksGEHeight error: %w", err) + if err := json.Unmarshal([]byte(v.RowConsumption), &block.RowConsumption); err != nil { + return nil, fmt.Errorf("L2Block.GetL2BlocksGEHeight error: %w", err) } - wrappedBlocks = append(wrappedBlocks, &wrappedBlock) + blocks = append(blocks, &block) } - return wrappedBlocks, nil + return blocks, nil } -// GetL2Blocks retrieves selected L2Blocks from the database. -// The returned L2Blocks are sorted in ascending order by their block number. -func (o *L2Block) GetL2Blocks(ctx context.Context, fields map[string]interface{}, orderByList []string, limit int) ([]*L2Block, error) { +// GetChunkHashes retrieves selected chunk hashes from the database. +// The returned chunk hashes are sorted in ascending order by their block number. +// For unit test +func (o *L2Block) GetChunkHashes(ctx context.Context, limit int) ([]string, error) { db := o.db.WithContext(ctx) db = db.Model(&L2Block{}) - - for key, value := range fields { - db = db.Where(key, value) - } - - for _, orderBy := range orderByList { - db = db.Order(orderBy) - } + db = db.Select("chunk_hash") + db = db.Order("number ASC") if limit > 0 { db = db.Limit(limit) } - db = db.Order("number ASC") - - var l2Blocks []*L2Block + var l2Blocks []L2Block if err := db.Find(&l2Blocks).Error; err != nil { - return nil, fmt.Errorf("L2Block.GetL2Blocks error: %w, fields: %v, orderByList: %v", err, fields, orderByList) + return nil, fmt.Errorf("L2Block.GetChunkHashes error: %w, limit: %v", err, limit) } - return l2Blocks, nil + + chunkHashes := make([]string, len(l2Blocks)) + for i, block := range l2Blocks { + chunkHashes[i] = block.ChunkHash + } + + return chunkHashes, nil } // GetL2BlocksInRange retrieves the L2 blocks within the specified range (inclusive). // The range is closed, i.e., it includes both start and end block numbers. // The returned blocks are sorted in ascending order by their block number. -func (o *L2Block) GetL2BlocksInRange(ctx context.Context, startBlockNumber uint64, endBlockNumber uint64) ([]*types.WrappedBlock, error) { +func (o *L2Block) GetL2BlocksInRange(ctx context.Context, startBlockNumber uint64, endBlockNumber uint64) ([]*encoding.Block, error) { if startBlockNumber > endBlockNumber { return nil, fmt.Errorf("L2Block.GetL2BlocksInRange: start block number should be less than or equal to end block number, start block: %v, end block: %v", startBlockNumber, endBlockNumber) } @@ -159,33 +158,33 @@ func (o *L2Block) GetL2BlocksInRange(ctx context.Context, startBlockNumber uint6 return nil, fmt.Errorf("L2Block.GetL2BlocksInRange: unexpected number of results, expected: %v, got: %v", endBlockNumber-startBlockNumber+1, len(l2Blocks)) } - var wrappedBlocks []*types.WrappedBlock + var blocks []*encoding.Block for _, v := range l2Blocks { - var wrappedBlock types.WrappedBlock + var block encoding.Block - if err := json.Unmarshal([]byte(v.Transactions), &wrappedBlock.Transactions); err != nil { + if err := json.Unmarshal([]byte(v.Transactions), &block.Transactions); err != nil { return nil, fmt.Errorf("L2Block.GetL2BlocksInRange error: %w, start block: %v, end block: %v", err, startBlockNumber, endBlockNumber) } - wrappedBlock.Header = &gethTypes.Header{} - if err := json.Unmarshal([]byte(v.Header), wrappedBlock.Header); err != nil { + block.Header = &gethTypes.Header{} + if err := json.Unmarshal([]byte(v.Header), block.Header); err != nil { return nil, fmt.Errorf("L2Block.GetL2BlocksInRange error: %w, start block: %v, end block: %v", err, startBlockNumber, endBlockNumber) } - wrappedBlock.WithdrawRoot = common.HexToHash(v.WithdrawRoot) + block.WithdrawRoot = common.HexToHash(v.WithdrawRoot) - if err := json.Unmarshal([]byte(v.RowConsumption), &wrappedBlock.RowConsumption); err != nil { + if err := json.Unmarshal([]byte(v.RowConsumption), &block.RowConsumption); err != nil { return nil, fmt.Errorf("L2Block.GetL2BlocksInRange error: %w, start block: %v, end block: %v", err, startBlockNumber, endBlockNumber) } - wrappedBlocks = append(wrappedBlocks, &wrappedBlock) + blocks = append(blocks, &block) } - return wrappedBlocks, nil + return blocks, nil } // InsertL2Blocks inserts l2 blocks into the "l2_block" table. -func (o *L2Block) InsertL2Blocks(ctx context.Context, blocks []*types.WrappedBlock) error { +func (o *L2Block) InsertL2Blocks(ctx context.Context, blocks []*encoding.Block) error { var l2Blocks []L2Block for _, block := range blocks { header, err := json.Marshal(block.Header) diff --git a/rollup/internal/orm/orm_test.go b/rollup/internal/orm/orm_test.go index 12ae84cba..39a850a30 100644 --- a/rollup/internal/orm/orm_test.go +++ b/rollup/internal/orm/orm_test.go @@ -12,14 +12,17 @@ import ( "github.com/stretchr/testify/assert" "gorm.io/gorm" - "scroll-tech/common/database" - "scroll-tech/common/docker" - "scroll-tech/common/types" "scroll-tech/database/migrate" + + "scroll-tech/common/testcontainers" + "scroll-tech/common/types" + "scroll-tech/common/types/encoding" + "scroll-tech/common/types/encoding/codecv0" + "scroll-tech/common/types/encoding/codecv1" ) var ( - base *docker.App + testApps *testcontainers.TestcontainerApps db *gorm.DB l2BlockOrm *L2Block @@ -27,33 +30,29 @@ var ( batchOrm *Batch pendingTransactionOrm *PendingTransaction - wrappedBlock1 *types.WrappedBlock - wrappedBlock2 *types.WrappedBlock - chunk1 *types.Chunk - chunk2 *types.Chunk - chunkHash1 common.Hash - chunkHash2 common.Hash + block1 *encoding.Block + block2 *encoding.Block ) func TestMain(m *testing.M) { t := &testing.T{} + defer func() { + if testApps != nil { + testApps.Free() + } + tearDownEnv(t) + }() setupEnv(t) - defer tearDownEnv(t) m.Run() } func setupEnv(t *testing.T) { - base = docker.NewDockerApp() - base.RunDBImage(t) var err error - db, err = database.InitDB( - &database.Config{ - DSN: base.DBConfig.DSN, - DriverName: base.DBConfig.DriverName, - MaxOpenNum: base.DBConfig.MaxOpenNum, - MaxIdleNum: base.DBConfig.MaxIdleNum, - }, - ) + + testApps = testcontainers.NewTestcontainerApps() + assert.NoError(t, testApps.StartPostgresContainer()) + + db, err = testApps.GetGormDBClient() assert.NoError(t, err) sqlDB, err := db.DB() assert.NoError(t, err) @@ -66,22 +65,14 @@ func setupEnv(t *testing.T) { templateBlockTrace, err := os.ReadFile("../../../common/testdata/blockTrace_02.json") assert.NoError(t, err) - wrappedBlock1 = &types.WrappedBlock{} - err = json.Unmarshal(templateBlockTrace, wrappedBlock1) + block1 = &encoding.Block{} + err = json.Unmarshal(templateBlockTrace, block1) assert.NoError(t, err) templateBlockTrace, err = os.ReadFile("../../../common/testdata/blockTrace_03.json") assert.NoError(t, err) - wrappedBlock2 = &types.WrappedBlock{} - err = json.Unmarshal(templateBlockTrace, wrappedBlock2) - assert.NoError(t, err) - - chunk1 = &types.Chunk{Blocks: []*types.WrappedBlock{wrappedBlock1}} - chunkHash1, err = chunk1.Hash(0) - assert.NoError(t, err) - - chunk2 = &types.Chunk{Blocks: []*types.WrappedBlock{wrappedBlock2}} - chunkHash2, err = chunk2.Hash(chunk1.NumL1Messages(0)) + block2 = &encoding.Block{} + err = json.Unmarshal(templateBlockTrace, block2) assert.NoError(t, err) } @@ -89,7 +80,6 @@ func tearDownEnv(t *testing.T) { sqlDB, err := db.DB() assert.NoError(t, err) sqlDB.Close() - base.Free() } func TestL1BlockOrm(t *testing.T) { @@ -144,177 +134,226 @@ func TestL2BlockOrm(t *testing.T) { assert.NoError(t, err) assert.NoError(t, migrate.ResetDB(sqlDB)) - err = l2BlockOrm.InsertL2Blocks(context.Background(), []*types.WrappedBlock{wrappedBlock1, wrappedBlock2}) + err = l2BlockOrm.InsertL2Blocks(context.Background(), []*encoding.Block{block1, block2}) assert.NoError(t, err) height, err := l2BlockOrm.GetL2BlocksLatestHeight(context.Background()) assert.NoError(t, err) assert.Equal(t, uint64(3), height) - blocks, err := l2BlockOrm.GetL2Blocks(context.Background(), map[string]interface{}{}, []string{}, 0) + chunkHashes, err := l2BlockOrm.GetChunkHashes(context.Background(), 0) assert.NoError(t, err) - assert.Len(t, blocks, 2) - assert.Equal(t, "", blocks[0].ChunkHash) - assert.Equal(t, "", blocks[1].ChunkHash) + assert.Len(t, chunkHashes, 2) + assert.Equal(t, "", chunkHashes[0]) + assert.Equal(t, "", chunkHashes[1]) - wrappedBlocks, err := l2BlockOrm.GetL2BlocksInRange(context.Background(), 2, 3) + blocks, err := l2BlockOrm.GetL2BlocksInRange(context.Background(), 2, 3) assert.NoError(t, err) assert.Len(t, blocks, 2) - assert.Equal(t, wrappedBlock1, wrappedBlocks[0]) - assert.Equal(t, wrappedBlock2, wrappedBlocks[1]) + assert.Equal(t, block1, blocks[0]) + assert.Equal(t, block2, blocks[1]) err = l2BlockOrm.UpdateChunkHashInRange(context.Background(), 2, 2, "test hash") assert.NoError(t, err) - blocks, err = l2BlockOrm.GetL2Blocks(context.Background(), map[string]interface{}{}, []string{}, 0) + chunkHashes, err = l2BlockOrm.GetChunkHashes(context.Background(), 0) assert.NoError(t, err) - assert.Len(t, blocks, 2) - assert.Equal(t, "test hash", blocks[0].ChunkHash) - assert.Equal(t, "", blocks[1].ChunkHash) + assert.Len(t, chunkHashes, 2) + assert.Equal(t, "test hash", chunkHashes[0]) + assert.Equal(t, "", chunkHashes[1]) } func TestChunkOrm(t *testing.T) { - sqlDB, err := db.DB() - assert.NoError(t, err) - assert.NoError(t, migrate.ResetDB(sqlDB)) + codecVersions := []encoding.CodecVersion{encoding.CodecV0, encoding.CodecV1} + chunk1 := &encoding.Chunk{Blocks: []*encoding.Block{block1}} + chunk2 := &encoding.Chunk{Blocks: []*encoding.Block{block2}} + for _, codecVersion := range codecVersions { + sqlDB, err := db.DB() + assert.NoError(t, err) + assert.NoError(t, migrate.ResetDB(sqlDB)) + var chunkHash1 common.Hash + var chunkHash2 common.Hash + if codecVersion == encoding.CodecV0 { + daChunk1, createErr := codecv0.NewDAChunk(chunk1, 0) + assert.NoError(t, createErr) + chunkHash1, err = daChunk1.Hash() + assert.NoError(t, err) - dbChunk1, err := chunkOrm.InsertChunk(context.Background(), chunk1) - assert.NoError(t, err) - assert.Equal(t, dbChunk1.Hash, chunkHash1.Hex()) + daChunk2, createErr := codecv0.NewDAChunk(chunk2, chunk1.NumL1Messages(0)) + assert.NoError(t, createErr) + chunkHash2, err = daChunk2.Hash() + assert.NoError(t, err) + } else { + daChunk1, createErr := codecv1.NewDAChunk(chunk1, 0) + assert.NoError(t, createErr) + chunkHash1, err = daChunk1.Hash() + assert.NoError(t, err) - dbChunk2, err := chunkOrm.InsertChunk(context.Background(), chunk2) - assert.NoError(t, err) - assert.Equal(t, dbChunk2.Hash, chunkHash2.Hex()) + daChunk2, createErr := codecv1.NewDAChunk(chunk2, chunk1.NumL1Messages(0)) + assert.NoError(t, createErr) + chunkHash2, err = daChunk2.Hash() + assert.NoError(t, err) + } - chunks, err := chunkOrm.GetChunksGEIndex(context.Background(), 0, 0) - assert.NoError(t, err) - assert.Len(t, chunks, 2) - assert.Equal(t, chunkHash1.Hex(), chunks[0].Hash) - assert.Equal(t, chunkHash2.Hex(), chunks[1].Hash) - assert.Equal(t, "", chunks[0].BatchHash) - assert.Equal(t, "", chunks[1].BatchHash) + dbChunk1, err := chunkOrm.InsertChunk(context.Background(), chunk1, codecVersion) + assert.NoError(t, err) + assert.Equal(t, dbChunk1.Hash, chunkHash1.Hex()) - err = chunkOrm.UpdateProvingStatus(context.Background(), chunkHash1.Hex(), types.ProvingTaskVerified) - assert.NoError(t, err) - err = chunkOrm.UpdateProvingStatus(context.Background(), chunkHash2.Hex(), types.ProvingTaskAssigned) - assert.NoError(t, err) + dbChunk2, err := chunkOrm.InsertChunk(context.Background(), chunk2, codecVersion) + assert.NoError(t, err) + assert.Equal(t, dbChunk2.Hash, chunkHash2.Hex()) - chunks, err = chunkOrm.GetChunksInRange(context.Background(), 0, 1) - assert.NoError(t, err) - assert.Len(t, chunks, 2) - assert.Equal(t, chunkHash1.Hex(), chunks[0].Hash) - assert.Equal(t, chunkHash2.Hex(), chunks[1].Hash) - assert.Equal(t, types.ProvingTaskVerified, types.ProvingStatus(chunks[0].ProvingStatus)) - assert.Equal(t, types.ProvingTaskAssigned, types.ProvingStatus(chunks[1].ProvingStatus)) + chunks, err := chunkOrm.GetChunksGEIndex(context.Background(), 0, 0) + assert.NoError(t, err) + assert.Len(t, chunks, 2) + assert.Equal(t, chunkHash1.Hex(), chunks[0].Hash) + assert.Equal(t, chunkHash2.Hex(), chunks[1].Hash) + assert.Equal(t, "", chunks[0].BatchHash) + assert.Equal(t, "", chunks[1].BatchHash) - err = chunkOrm.UpdateBatchHashInRange(context.Background(), 0, 0, "test hash") - assert.NoError(t, err) - chunks, err = chunkOrm.GetChunksGEIndex(context.Background(), 0, 0) - assert.NoError(t, err) - assert.Len(t, chunks, 2) - assert.Equal(t, chunkHash1.Hex(), chunks[0].Hash) - assert.Equal(t, chunkHash2.Hex(), chunks[1].Hash) - assert.Equal(t, "test hash", chunks[0].BatchHash) - assert.Equal(t, "", chunks[1].BatchHash) + err = chunkOrm.UpdateProvingStatus(context.Background(), chunkHash1.Hex(), types.ProvingTaskVerified) + assert.NoError(t, err) + err = chunkOrm.UpdateProvingStatus(context.Background(), chunkHash2.Hex(), types.ProvingTaskAssigned) + assert.NoError(t, err) + + chunks, err = chunkOrm.GetChunksInRange(context.Background(), 0, 1) + assert.NoError(t, err) + assert.Len(t, chunks, 2) + assert.Equal(t, chunkHash1.Hex(), chunks[0].Hash) + assert.Equal(t, chunkHash2.Hex(), chunks[1].Hash) + assert.Equal(t, types.ProvingTaskVerified, types.ProvingStatus(chunks[0].ProvingStatus)) + assert.Equal(t, types.ProvingTaskAssigned, types.ProvingStatus(chunks[1].ProvingStatus)) + + err = chunkOrm.UpdateBatchHashInRange(context.Background(), 0, 0, "test hash") + assert.NoError(t, err) + chunks, err = chunkOrm.GetChunksGEIndex(context.Background(), 0, 0) + assert.NoError(t, err) + assert.Len(t, chunks, 2) + assert.Equal(t, chunkHash1.Hex(), chunks[0].Hash) + assert.Equal(t, chunkHash2.Hex(), chunks[1].Hash) + assert.Equal(t, "test hash", chunks[0].BatchHash) + assert.Equal(t, "", chunks[1].BatchHash) + } } func TestBatchOrm(t *testing.T) { - sqlDB, err := db.DB() - assert.NoError(t, err) - assert.NoError(t, migrate.ResetDB(sqlDB)) + codecVersions := []encoding.CodecVersion{encoding.CodecV0, encoding.CodecV1} + chunk1 := &encoding.Chunk{Blocks: []*encoding.Block{block1}} + chunk2 := &encoding.Chunk{Blocks: []*encoding.Block{block2}} + for _, codecVersion := range codecVersions { + sqlDB, err := db.DB() + assert.NoError(t, err) + assert.NoError(t, migrate.ResetDB(sqlDB)) - batchMeta1 := &types.BatchMeta{ - StartChunkIndex: 0, - StartChunkHash: chunkHash1.Hex(), - EndChunkIndex: 0, - EndChunkHash: chunkHash1.Hex(), + batch := &encoding.Batch{ + Index: 0, + TotalL1MessagePoppedBefore: 0, + ParentBatchHash: common.Hash{}, + Chunks: []*encoding.Chunk{chunk1}, + } + batch1, err := batchOrm.InsertBatch(context.Background(), batch, codecVersion) + assert.NoError(t, err) + hash1 := batch1.Hash + + batch1, err = batchOrm.GetBatchByIndex(context.Background(), 0) + assert.NoError(t, err) + + var batchHash1 string + if codecVersion == encoding.CodecV0 { + daBatch1, createErr := codecv0.NewDABatchFromBytes(batch1.BatchHeader) + assert.NoError(t, createErr) + batchHash1 = daBatch1.Hash().Hex() + } else { + daBatch1, createErr := codecv1.NewDABatchFromBytes(batch1.BatchHeader) + assert.NoError(t, createErr) + batchHash1 = daBatch1.Hash().Hex() + } + assert.Equal(t, hash1, batchHash1) + + batch = &encoding.Batch{ + Index: 1, + TotalL1MessagePoppedBefore: 0, + ParentBatchHash: common.Hash{}, + Chunks: []*encoding.Chunk{chunk2}, + } + batch2, err := batchOrm.InsertBatch(context.Background(), batch, codecVersion) + assert.NoError(t, err) + hash2 := batch2.Hash + + batch2, err = batchOrm.GetBatchByIndex(context.Background(), 1) + assert.NoError(t, err) + + var batchHash2 string + if codecVersion == encoding.CodecV0 { + daBatch2, createErr := codecv0.NewDABatchFromBytes(batch2.BatchHeader) + assert.NoError(t, createErr) + batchHash2 = daBatch2.Hash().Hex() + } else { + daBatch2, createErr := codecv1.NewDABatchFromBytes(batch2.BatchHeader) + assert.NoError(t, createErr) + batchHash2 = daBatch2.Hash().Hex() + } + assert.Equal(t, hash2, batchHash2) + + count, err := batchOrm.GetBatchCount(context.Background()) + assert.NoError(t, err) + assert.Equal(t, uint64(2), count) + + err = batchOrm.UpdateRollupStatus(context.Background(), batchHash1, types.RollupCommitFailed) + assert.NoError(t, err) + + pendingBatches, err := batchOrm.GetFailedAndPendingBatches(context.Background(), 100) + assert.NoError(t, err) + assert.Equal(t, 2, len(pendingBatches)) + + rollupStatus, err := batchOrm.GetRollupStatusByHashList(context.Background(), []string{batchHash1, batchHash2}) + assert.NoError(t, err) + assert.Equal(t, 2, len(rollupStatus)) + assert.Equal(t, types.RollupCommitFailed, rollupStatus[0]) + assert.Equal(t, types.RollupPending, rollupStatus[1]) + + err = batchOrm.UpdateProvingStatus(context.Background(), batchHash2, types.ProvingTaskVerified) + assert.NoError(t, err) + + dbProof, err := batchOrm.GetVerifiedProofByHash(context.Background(), batchHash1) + assert.Error(t, err) + assert.Nil(t, dbProof) + + err = batchOrm.UpdateProvingStatus(context.Background(), batchHash2, types.ProvingTaskVerified) + assert.NoError(t, err) + err = batchOrm.UpdateRollupStatus(context.Background(), batchHash2, types.RollupFinalized) + assert.NoError(t, err) + err = batchOrm.UpdateL2GasOracleStatusAndOracleTxHash(context.Background(), batchHash2, types.GasOracleImported, "oracleTxHash") + assert.NoError(t, err) + + updatedBatch, err := batchOrm.GetLatestBatch(context.Background()) + assert.NoError(t, err) + assert.NotNil(t, updatedBatch) + assert.Equal(t, types.ProvingTaskVerified, types.ProvingStatus(updatedBatch.ProvingStatus)) + assert.Equal(t, types.RollupFinalized, types.RollupStatus(updatedBatch.RollupStatus)) + assert.Equal(t, types.GasOracleImported, types.GasOracleStatus(updatedBatch.OracleStatus)) + assert.Equal(t, "oracleTxHash", updatedBatch.OracleTxHash) + + err = batchOrm.UpdateCommitTxHashAndRollupStatus(context.Background(), batchHash2, "commitTxHash", types.RollupCommitted) + assert.NoError(t, err) + updatedBatch, err = batchOrm.GetLatestBatch(context.Background()) + assert.NoError(t, err) + assert.NotNil(t, updatedBatch) + assert.Equal(t, "commitTxHash", updatedBatch.CommitTxHash) + assert.Equal(t, types.RollupCommitted, types.RollupStatus(updatedBatch.RollupStatus)) + + err = batchOrm.UpdateFinalizeTxHashAndRollupStatus(context.Background(), batchHash2, "finalizeTxHash", types.RollupFinalizeFailed) + assert.NoError(t, err) + + updatedBatch, err = batchOrm.GetLatestBatch(context.Background()) + assert.NoError(t, err) + assert.NotNil(t, updatedBatch) + assert.Equal(t, "finalizeTxHash", updatedBatch.FinalizeTxHash) + assert.Equal(t, types.RollupFinalizeFailed, types.RollupStatus(updatedBatch.RollupStatus)) } - batch1, err := batchOrm.InsertBatch(context.Background(), []*types.Chunk{chunk1}, batchMeta1) - assert.NoError(t, err) - hash1 := batch1.Hash - - batch1, err = batchOrm.GetBatchByIndex(context.Background(), 0) - assert.NoError(t, err) - batchHeader1, err := types.DecodeBatchHeader(batch1.BatchHeader) - assert.NoError(t, err) - batchHash1 := batchHeader1.Hash().Hex() - assert.Equal(t, hash1, batchHash1) - - batchMeta2 := &types.BatchMeta{ - StartChunkIndex: 1, - StartChunkHash: chunkHash2.Hex(), - EndChunkIndex: 1, - EndChunkHash: chunkHash2.Hex(), - } - batch2, err := batchOrm.InsertBatch(context.Background(), []*types.Chunk{chunk2}, batchMeta2) - assert.NoError(t, err) - hash2 := batch2.Hash - - batch2, err = batchOrm.GetBatchByIndex(context.Background(), 1) - assert.NoError(t, err) - batchHeader2, err := types.DecodeBatchHeader(batch2.BatchHeader) - assert.NoError(t, err) - batchHash2 := batchHeader2.Hash().Hex() - assert.Equal(t, hash2, batchHash2) - - count, err := batchOrm.GetBatchCount(context.Background()) - assert.NoError(t, err) - assert.Equal(t, uint64(2), count) - - err = batchOrm.UpdateRollupStatus(context.Background(), batchHash1, types.RollupCommitFailed) - assert.NoError(t, err) - - pendingBatches, err := batchOrm.GetFailedAndPendingBatches(context.Background(), 100) - assert.NoError(t, err) - assert.Equal(t, 2, len(pendingBatches)) - - rollupStatus, err := batchOrm.GetRollupStatusByHashList(context.Background(), []string{batchHash1, batchHash2}) - assert.NoError(t, err) - assert.Equal(t, 2, len(rollupStatus)) - assert.Equal(t, types.RollupCommitFailed, rollupStatus[0]) - assert.Equal(t, types.RollupPending, rollupStatus[1]) - - err = batchOrm.UpdateProvingStatus(context.Background(), batchHash2, types.ProvingTaskVerified) - assert.NoError(t, err) - - dbProof, err := batchOrm.GetVerifiedProofByHash(context.Background(), batchHash1) - assert.Error(t, err) - assert.Nil(t, dbProof) - - err = batchOrm.UpdateProvingStatus(context.Background(), batchHash2, types.ProvingTaskVerified) - assert.NoError(t, err) - err = batchOrm.UpdateRollupStatus(context.Background(), batchHash2, types.RollupFinalized) - assert.NoError(t, err) - err = batchOrm.UpdateL2GasOracleStatusAndOracleTxHash(context.Background(), batchHash2, types.GasOracleImported, "oracleTxHash") - assert.NoError(t, err) - - updatedBatch, err := batchOrm.GetLatestBatch(context.Background()) - assert.NoError(t, err) - assert.NotNil(t, updatedBatch) - assert.Equal(t, types.ProvingTaskVerified, types.ProvingStatus(updatedBatch.ProvingStatus)) - assert.Equal(t, types.RollupFinalized, types.RollupStatus(updatedBatch.RollupStatus)) - assert.Equal(t, types.GasOracleImported, types.GasOracleStatus(updatedBatch.OracleStatus)) - assert.Equal(t, "oracleTxHash", updatedBatch.OracleTxHash) - - err = batchOrm.UpdateCommitTxHashAndRollupStatus(context.Background(), batchHash2, "commitTxHash", types.RollupCommitted) - assert.NoError(t, err) - updatedBatch, err = batchOrm.GetLatestBatch(context.Background()) - assert.NoError(t, err) - assert.NotNil(t, updatedBatch) - assert.Equal(t, "commitTxHash", updatedBatch.CommitTxHash) - assert.Equal(t, types.RollupCommitted, types.RollupStatus(updatedBatch.RollupStatus)) - - err = batchOrm.UpdateFinalizeTxHashAndRollupStatus(context.Background(), batchHash2, "finalizeTxHash", types.RollupFinalizeFailed) - assert.NoError(t, err) - - updatedBatch, err = batchOrm.GetLatestBatch(context.Background()) - assert.NoError(t, err) - assert.NotNil(t, updatedBatch) - assert.Equal(t, "finalizeTxHash", updatedBatch.FinalizeTxHash) - assert.Equal(t, types.RollupFinalizeFailed, types.RollupStatus(updatedBatch.RollupStatus)) } -func TestTransactionOrm(t *testing.T) { +func TestPendingTransactionOrm(t *testing.T) { sqlDB, err := db.DB() assert.NoError(t, err) assert.NoError(t, migrate.ResetDB(sqlDB)) diff --git a/rollup/internal/orm/pending_transaction.go b/rollup/internal/orm/pending_transaction.go index d6ba88c53..8b148ce74 100644 --- a/rollup/internal/orm/pending_transaction.go +++ b/rollup/internal/orm/pending_transaction.go @@ -85,6 +85,21 @@ func (o *PendingTransaction) GetPendingOrReplacedTransactionsBySenderType(ctx co return transactions, nil } +// GetConfirmedTransactionsBySenderType retrieves confirmed transactions filtered by sender type, limited to a specified count. +// for unit test +func (o *PendingTransaction) GetConfirmedTransactionsBySenderType(ctx context.Context, senderType types.SenderType, limit int) ([]PendingTransaction, error) { + var transactions []PendingTransaction + db := o.db.WithContext(ctx) + db = db.Model(&PendingTransaction{}) + db = db.Where("sender_type = ?", senderType) + db = db.Where("status = ?", types.TxStatusConfirmed) + db = db.Limit(limit) + if err := db.Find(&transactions).Error; err != nil { + return nil, fmt.Errorf("failed to get confirmed transactions by sender type, error: %w", err) + } + return transactions, nil +} + // InsertPendingTransaction creates a new pending transaction record and stores it in the database. func (o *PendingTransaction) InsertPendingTransaction(ctx context.Context, contextID string, senderMeta *SenderMeta, tx *gethTypes.Transaction, submitBlockNumber uint64, dbTX ...*gorm.DB) error { rlp := new(bytes.Buffer) diff --git a/rollup/internal/utils/utils.go b/rollup/internal/utils/utils.go index 2728ccb10..4b152daeb 100644 --- a/rollup/internal/utils/utils.go +++ b/rollup/internal/utils/utils.go @@ -9,6 +9,10 @@ import ( "github.com/scroll-tech/go-ethereum/core/types" "github.com/scroll-tech/go-ethereum/crypto" + "scroll-tech/common/types/encoding" + "scroll-tech/common/types/encoding/codecv0" + "scroll-tech/common/types/encoding/codecv1" + bridgeAbi "scroll-tech/rollup/abi" ) @@ -63,3 +67,228 @@ func UnpackLog(c *abi.ABI, out interface{}, event string, log types.Log) error { } return abi.ParseTopics(out, indexed, log.Topics[1:]) } + +// ChunkMetrics indicates the metrics for proposing a chunk. +type ChunkMetrics struct { + // common metrics + NumBlocks uint64 + TxNum uint64 + CrcMax uint64 + FirstBlockTimestamp uint64 + + // codecv0 metrics, default 0 for codecv1 + L1CommitCalldataSize uint64 + L1CommitGas uint64 + + // codecv1 metrics, default 0 for codecv0 + L1CommitBlobSize uint64 +} + +// CalculateChunkMetrics calculates chunk metrics. +func CalculateChunkMetrics(chunk *encoding.Chunk, codecVersion encoding.CodecVersion) (*ChunkMetrics, error) { + var err error + metrics := &ChunkMetrics{ + TxNum: chunk.NumTransactions(), + NumBlocks: uint64(len(chunk.Blocks)), + FirstBlockTimestamp: chunk.Blocks[0].Header.Time, + } + metrics.CrcMax, err = chunk.CrcMax() + if err != nil { + return nil, fmt.Errorf("failed to get crc max: %w", err) + } + switch codecVersion { + case encoding.CodecV0: + metrics.L1CommitCalldataSize, err = codecv0.EstimateChunkL1CommitCalldataSize(chunk) + if err != nil { + return nil, fmt.Errorf("failed to estimate chunk L1 commit calldata size: %w", err) + } + metrics.L1CommitGas, err = codecv0.EstimateChunkL1CommitGas(chunk) + if err != nil { + return nil, fmt.Errorf("failed to estimate chunk L1 commit gas: %w", err) + } + return metrics, nil + case encoding.CodecV1: + metrics.L1CommitBlobSize, err = codecv1.EstimateChunkL1CommitBlobSize(chunk) + if err != nil { + return nil, fmt.Errorf("failed to estimate chunk L1 commit blob size: %w", err) + } + return metrics, nil + default: + return nil, fmt.Errorf("unsupported codec version: %v", codecVersion) + } +} + +// BatchMetrics indicates the metrics for proposing a batch. +type BatchMetrics struct { + // common metrics + NumChunks uint64 + FirstBlockTimestamp uint64 + + // codecv0 metrics, default 0 for codecv1 + L1CommitCalldataSize uint64 + L1CommitGas uint64 + + // codecv1 metrics, default 0 for codecv0 + L1CommitBlobSize uint64 +} + +// CalculateBatchMetrics calculates batch metrics. +func CalculateBatchMetrics(batch *encoding.Batch, codecVersion encoding.CodecVersion) (*BatchMetrics, error) { + var err error + metrics := &BatchMetrics{ + NumChunks: uint64(len(batch.Chunks)), + FirstBlockTimestamp: batch.Chunks[0].Blocks[0].Header.Time, + } + switch codecVersion { + case encoding.CodecV0: + metrics.L1CommitGas, err = codecv0.EstimateBatchL1CommitGas(batch) + if err != nil { + return nil, fmt.Errorf("failed to estimate batch L1 commit gas: %w", err) + } + metrics.L1CommitCalldataSize, err = codecv0.EstimateBatchL1CommitCalldataSize(batch) + if err != nil { + return nil, fmt.Errorf("failed to estimate batch L1 commit calldata size: %w", err) + } + return metrics, nil + case encoding.CodecV1: + metrics.L1CommitBlobSize, err = codecv1.EstimateBatchL1CommitBlobSize(batch) + if err != nil { + return nil, fmt.Errorf("failed to estimate chunk L1 commit blob size: %w", err) + } + return metrics, nil + default: + return nil, fmt.Errorf("unsupported codec version: %v", codecVersion) + } +} + +// GetChunkHash retrieves the hash of a chunk. +func GetChunkHash(chunk *encoding.Chunk, totalL1MessagePoppedBefore uint64, codecVersion encoding.CodecVersion) (common.Hash, error) { + switch codecVersion { + case encoding.CodecV0: + daChunk, err := codecv0.NewDAChunk(chunk, totalL1MessagePoppedBefore) + if err != nil { + return common.Hash{}, fmt.Errorf("failed to create codecv0 DA chunk: %w", err) + } + chunkHash, err := daChunk.Hash() + if err != nil { + return common.Hash{}, fmt.Errorf("failed to get codecv0 DA chunk hash: %w", err) + } + return chunkHash, nil + case encoding.CodecV1: + daChunk, err := codecv1.NewDAChunk(chunk, totalL1MessagePoppedBefore) + if err != nil { + return common.Hash{}, fmt.Errorf("failed to create codecv1 DA chunk: %w", err) + } + chunkHash, err := daChunk.Hash() + if err != nil { + return common.Hash{}, fmt.Errorf("failed to get codecv1 DA chunk hash: %w", err) + } + return chunkHash, nil + default: + return common.Hash{}, fmt.Errorf("unsupported codec version: %v", codecVersion) + } +} + +// BatchMetadata represents the metadata of a batch. +type BatchMetadata struct { + BatchHash common.Hash + BatchBytes []byte + StartChunkHash common.Hash + EndChunkHash common.Hash +} + +// GetBatchMetadata retrieves the metadata of a batch. +func GetBatchMetadata(batch *encoding.Batch, codecVersion encoding.CodecVersion) (*BatchMetadata, error) { + numChunks := len(batch.Chunks) + totalL1MessagePoppedBeforeEndDAChunk := batch.TotalL1MessagePoppedBefore + for i := 0; i < numChunks-1; i++ { + totalL1MessagePoppedBeforeEndDAChunk += batch.Chunks[i].NumL1Messages(totalL1MessagePoppedBeforeEndDAChunk) + } + + switch codecVersion { + case encoding.CodecV0: + daBatch, err := codecv0.NewDABatch(batch) + if err != nil { + return nil, fmt.Errorf("failed to create codecv0 DA batch: %w", err) + } + + batchMeta := &BatchMetadata{ + BatchHash: daBatch.Hash(), + BatchBytes: daBatch.Encode(), + } + + startDAChunk, err := codecv0.NewDAChunk(batch.Chunks[0], batch.TotalL1MessagePoppedBefore) + if err != nil { + return nil, fmt.Errorf("failed to create codecv0 start DA chunk: %w", err) + } + + batchMeta.StartChunkHash, err = startDAChunk.Hash() + if err != nil { + return nil, fmt.Errorf("failed to get codecv0 start DA chunk hash: %w", err) + } + + endDAChunk, err := codecv0.NewDAChunk(batch.Chunks[numChunks-1], totalL1MessagePoppedBeforeEndDAChunk) + if err != nil { + return nil, fmt.Errorf("failed to create codecv0 end DA chunk: %w", err) + } + + batchMeta.EndChunkHash, err = endDAChunk.Hash() + if err != nil { + return nil, fmt.Errorf("failed to get codecv0 end DA chunk hash: %w", err) + } + return batchMeta, nil + case encoding.CodecV1: + daBatch, err := codecv1.NewDABatch(batch) + if err != nil { + return nil, fmt.Errorf("failed to create codecv1 DA batch: %w", err) + } + + batchMeta := &BatchMetadata{ + BatchHash: daBatch.Hash(), + BatchBytes: daBatch.Encode(), + } + + startDAChunk, err := codecv1.NewDAChunk(batch.Chunks[0], batch.TotalL1MessagePoppedBefore) + if err != nil { + return nil, fmt.Errorf("failed to create codecv1 start DA chunk: %w", err) + } + + batchMeta.StartChunkHash, err = startDAChunk.Hash() + if err != nil { + return nil, fmt.Errorf("failed to get codecv1 start DA chunk hash: %w", err) + } + + endDAChunk, err := codecv1.NewDAChunk(batch.Chunks[numChunks-1], totalL1MessagePoppedBeforeEndDAChunk) + if err != nil { + return nil, fmt.Errorf("failed to create codecv1 end DA chunk: %w", err) + } + + batchMeta.EndChunkHash, err = endDAChunk.Hash() + if err != nil { + return nil, fmt.Errorf("failed to get codecv1 end DA chunk hash: %w", err) + } + return batchMeta, nil + default: + return nil, fmt.Errorf("unsupported codec version: %v", codecVersion) + } +} + +// GetTotalL1MessagePoppedBeforeBatch retrieves the total L1 messages popped before the batch. +func GetTotalL1MessagePoppedBeforeBatch(parentBatchBytes []byte, codecVersion encoding.CodecVersion) (uint64, error) { + switch codecVersion { + case encoding.CodecV0: + parentDABatch, err := codecv0.NewDABatchFromBytes(parentBatchBytes) + if err != nil { + return 0, fmt.Errorf("failed to create parent DA batch from bytes using codecv0, err: %w", err) + } + return parentDABatch.TotalL1MessagePopped, nil + case encoding.CodecV1: + parentDABatch, err := codecv1.NewDABatchFromBytes(parentBatchBytes) + if err != nil { + return 0, fmt.Errorf("failed to create parent DA batch from bytes using codecv1, err: %w", err) + } + return parentDABatch.TotalL1MessagePopped, nil + default: + return 0, fmt.Errorf("unsupported codec version: %v", codecVersion) + } +} diff --git a/rollup/mock_bridge/MockBridge.sol b/rollup/mock_bridge/MockBridge.sol new file mode 100644 index 000000000..0279fab38 --- /dev/null +++ b/rollup/mock_bridge/MockBridge.sol @@ -0,0 +1,607 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity =0.8.24; + +import {BatchHeaderV0Codec} from "../../../contracts/src/libraries/codec/BatchHeaderV0Codec.sol"; +import {BatchHeaderV1Codec} from "../../../contracts/src/libraries/codec/BatchHeaderV1Codec.sol"; +import {ChunkCodecV0} from "../../../contracts/src/libraries/codec/ChunkCodecV0.sol"; +import {ChunkCodecV1} from "../../../contracts/src/libraries/codec/ChunkCodecV1.sol"; + +contract MockBridge { + /// @dev Thrown when committing a committed batch. + error ErrorBatchIsAlreadyCommitted(); + + /// @dev Thrown when finalizing a verified batch. + error ErrorBatchIsAlreadyVerified(); + + /// @dev Thrown when committing empty batch (batch without chunks) + error ErrorBatchIsEmpty(); + + /// @dev Thrown when call precompile failed. + error ErrorCallPointEvaluationPrecompileFailed(); + + /// @dev Thrown when the transaction has multiple blobs. + error ErrorFoundMultipleBlob(); + + /// @dev Thrown when some fields are not zero in genesis batch. + error ErrorGenesisBatchHasNonZeroField(); + + /// @dev Thrown when importing genesis batch twice. + error ErrorGenesisBatchImported(); + + /// @dev Thrown when data hash in genesis batch is zero. + error ErrorGenesisDataHashIsZero(); + + /// @dev Thrown when the parent batch hash in genesis batch is zero. + error ErrorGenesisParentBatchHashIsNonZero(); + + /// @dev Thrown when the l2 transaction is incomplete. + error ErrorIncompleteL2TransactionData(); + + /// @dev Thrown when the batch hash is incorrect. + error ErrorIncorrectBatchHash(); + + /// @dev Thrown when the batch index is incorrect. + error ErrorIncorrectBatchIndex(); + + /// @dev Thrown when the previous state root doesn't match stored one. + error ErrorIncorrectPreviousStateRoot(); + + /// @dev Thrown when the batch header version is invalid. + error ErrorInvalidBatchHeaderVersion(); + + /// @dev Thrown when no blob found in the transaction. + error ErrorNoBlobFound(); + + /// @dev Thrown when the number of transactions is less than number of L1 message in one block. + error ErrorNumTxsLessThanNumL1Msgs(); + + /// @dev Thrown when the given previous state is zero. + error ErrorPreviousStateRootIsZero(); + + /// @dev Thrown when the given state root is zero. + error ErrorStateRootIsZero(); + + /// @dev Thrown when a chunk contains too many transactions. + error ErrorTooManyTxsInOneChunk(); + + /// @dev Thrown when the precompile output is incorrect. + error ErrorUnexpectedPointEvaluationPrecompileOutput(); + + event CommitBatch(uint256 indexed batchIndex, bytes32 indexed batchHash); + event FinalizeBatch(uint256 indexed batchIndex, bytes32 indexed batchHash, bytes32 stateRoot, bytes32 withdrawRoot); + + struct L2MessageProof { + uint256 batchIndex; + bytes merkleProof; + } + + /// @dev Address of the point evaluation precompile used for EIP-4844 blob verification. + address constant POINT_EVALUATION_PRECOMPILE_ADDR = address(0x0A); + + /// @dev BLS Modulus value defined in EIP-4844 and the magic value returned from a successful call to the + /// point evaluation precompile + uint256 constant BLS_MODULUS = 52435875175126190479447740508185965837690552500527637822603658699938581184513; + + uint256 public l2BaseFee; + uint256 public lastFinalizedBatchIndex; + mapping(uint256 => bytes32) public committedBatches; + mapping(uint256 => bytes32) public finalizedStateRoots; + mapping(uint256 => bytes32) public withdrawRoots; + + function setL2BaseFee(uint256 _newL2BaseFee) external { + l2BaseFee = _newL2BaseFee; + } + + /***************************** + * Public Mutating Functions * + *****************************/ + + /// @notice Import layer 2 genesis block + function importGenesisBatch(bytes calldata _batchHeader, bytes32 _stateRoot) external { + // check genesis batch header length + if (_stateRoot == bytes32(0)) revert ErrorStateRootIsZero(); + + // check whether the genesis batch is imported + if (finalizedStateRoots[0] != bytes32(0)) revert ErrorGenesisBatchImported(); + + (uint256 memPtr, bytes32 _batchHash, , ) = _loadBatchHeader(_batchHeader); + + // check all fields except `dataHash` and `lastBlockHash` are zero + unchecked { + uint256 sum = BatchHeaderV0Codec.getVersion(memPtr) + + BatchHeaderV0Codec.getBatchIndex(memPtr) + + BatchHeaderV0Codec.getL1MessagePopped(memPtr) + + BatchHeaderV0Codec.getTotalL1MessagePopped(memPtr); + if (sum != 0) revert ErrorGenesisBatchHasNonZeroField(); + } + if (BatchHeaderV0Codec.getDataHash(memPtr) == bytes32(0)) revert ErrorGenesisDataHashIsZero(); + if (BatchHeaderV0Codec.getParentBatchHash(memPtr) != bytes32(0)) revert ErrorGenesisParentBatchHashIsNonZero(); + + committedBatches[0] = _batchHash; + finalizedStateRoots[0] = _stateRoot; + + emit CommitBatch(0, _batchHash); + emit FinalizeBatch(0, _batchHash, _stateRoot, bytes32(0)); + } + + function commitBatch( + uint8 _version, + bytes calldata _parentBatchHeader, + bytes[] memory _chunks, + bytes calldata + ) external { + // check whether the batch is empty + if (_chunks.length == 0) revert ErrorBatchIsEmpty(); + + (, bytes32 _parentBatchHash, uint256 _batchIndex, uint256 _totalL1MessagesPoppedOverall) = _loadBatchHeader( + _parentBatchHeader + ); + unchecked { + _batchIndex += 1; + } + if (committedBatches[_batchIndex] != 0) revert ErrorBatchIsAlreadyCommitted(); + + bytes32 _batchHash; + uint256 batchPtr; + bytes32 _dataHash; + uint256 _totalL1MessagesPoppedInBatch; + if (_version == 0) { + (_dataHash, _totalL1MessagesPoppedInBatch) = _commitChunksV0( + _totalL1MessagesPoppedOverall, + _chunks + ); + assembly { + batchPtr := mload(0x40) + _totalL1MessagesPoppedOverall := add(_totalL1MessagesPoppedOverall, _totalL1MessagesPoppedInBatch) + } + // store entries, the order matters + BatchHeaderV0Codec.storeVersion(batchPtr, 0); + BatchHeaderV0Codec.storeBatchIndex(batchPtr, _batchIndex); + BatchHeaderV0Codec.storeL1MessagePopped(batchPtr, _totalL1MessagesPoppedInBatch); + BatchHeaderV0Codec.storeTotalL1MessagePopped(batchPtr, _totalL1MessagesPoppedOverall); + BatchHeaderV0Codec.storeDataHash(batchPtr, _dataHash); + BatchHeaderV0Codec.storeParentBatchHash(batchPtr, _parentBatchHash); + // compute batch hash + _batchHash = BatchHeaderV0Codec.computeBatchHash( + batchPtr, + BatchHeaderV0Codec.BATCH_HEADER_FIXED_LENGTH + ); + } else if (_version == 1) { + bytes32 blobVersionedHash; + (blobVersionedHash, _dataHash, _totalL1MessagesPoppedInBatch) = _commitChunksV1( + _totalL1MessagesPoppedOverall, + _chunks + ); + assembly { + batchPtr := mload(0x40) + _totalL1MessagesPoppedOverall := add(_totalL1MessagesPoppedOverall, _totalL1MessagesPoppedInBatch) + } + // store entries, the order matters + BatchHeaderV1Codec.storeVersion(batchPtr, 1); + BatchHeaderV1Codec.storeBatchIndex(batchPtr, _batchIndex); + BatchHeaderV1Codec.storeL1MessagePopped(batchPtr, _totalL1MessagesPoppedInBatch); + BatchHeaderV1Codec.storeTotalL1MessagePopped(batchPtr, _totalL1MessagesPoppedOverall); + BatchHeaderV1Codec.storeDataHash(batchPtr, _dataHash); + BatchHeaderV1Codec.storeBlobVersionedHash(batchPtr, blobVersionedHash); + BatchHeaderV1Codec.storeParentBatchHash(batchPtr, _parentBatchHash); + // compute batch hash + _batchHash = BatchHeaderV1Codec.computeBatchHash( + batchPtr, + BatchHeaderV1Codec.BATCH_HEADER_FIXED_LENGTH + ); + } else { + revert ErrorInvalidBatchHeaderVersion(); + } + + committedBatches[_batchIndex] = _batchHash; + emit CommitBatch(_batchIndex, _batchHash); + } + + /// @dev We keep this function to upgrade to 4844 more smoothly. + function finalizeBatchWithProof( + bytes calldata _batchHeader, + bytes32 _prevStateRoot, + bytes32 _postStateRoot, + bytes32 _withdrawRoot, + bytes calldata + ) external { + if (_prevStateRoot == bytes32(0)) revert ErrorPreviousStateRootIsZero(); + if (_postStateRoot == bytes32(0)) revert ErrorStateRootIsZero(); + + // compute batch hash and verify + (, bytes32 _batchHash, uint256 _batchIndex, ) = _loadBatchHeader(_batchHeader); + + // verify previous state root. + if (finalizedStateRoots[_batchIndex - 1] != _prevStateRoot) revert ErrorIncorrectPreviousStateRoot(); + + // avoid duplicated verification + if (finalizedStateRoots[_batchIndex] != bytes32(0)) revert ErrorBatchIsAlreadyVerified(); + + // check and update lastFinalizedBatchIndex + unchecked { + if (lastFinalizedBatchIndex + 1 != _batchIndex) revert ErrorIncorrectBatchIndex(); + lastFinalizedBatchIndex = _batchIndex; + } + + // record state root and withdraw root + finalizedStateRoots[_batchIndex] = _postStateRoot; + withdrawRoots[_batchIndex] = _withdrawRoot; + + emit FinalizeBatch(_batchIndex, _batchHash, _postStateRoot, _withdrawRoot); + } + + /// @dev Memory layout of `_blobDataProof`: + /// ```text + /// | z | y | kzg_commitment | kzg_proof | + /// |---------|---------|----------------|-----------| + /// | bytes32 | bytes32 | bytes48 | bytes48 | + /// ``` + function finalizeBatchWithProof4844( + bytes calldata _batchHeader, + bytes32 _prevStateRoot, + bytes32 _postStateRoot, + bytes32 _withdrawRoot, + bytes calldata _blobDataProof, + bytes calldata + ) external { + if (_prevStateRoot == bytes32(0)) revert ErrorPreviousStateRootIsZero(); + if (_postStateRoot == bytes32(0)) revert ErrorStateRootIsZero(); + + // compute batch hash and verify + (uint256 memPtr, bytes32 _batchHash, uint256 _batchIndex, ) = _loadBatchHeader(_batchHeader); + bytes32 _blobVersionedHash = BatchHeaderV1Codec.getBlobVersionedHash(memPtr); + + // Calls the point evaluation precompile and verifies the output + { + (bool success, bytes memory data) = POINT_EVALUATION_PRECOMPILE_ADDR.staticcall( + abi.encodePacked(_blobVersionedHash, _blobDataProof) + ); + // We verify that the point evaluation precompile call was successful by testing the latter 32 bytes of the + // response is equal to BLS_MODULUS as defined in https://eips.ethereum.org/EIPS/eip-4844#point-evaluation-precompile + if (!success) revert ErrorCallPointEvaluationPrecompileFailed(); + (, uint256 result) = abi.decode(data, (uint256, uint256)); + if (result != BLS_MODULUS) revert ErrorUnexpectedPointEvaluationPrecompileOutput(); + } + + // verify previous state root. + if (finalizedStateRoots[_batchIndex - 1] != _prevStateRoot) revert ErrorIncorrectPreviousStateRoot(); + + // avoid duplicated verification + if (finalizedStateRoots[_batchIndex] != bytes32(0)) revert ErrorBatchIsAlreadyVerified(); + + // check and update lastFinalizedBatchIndex + unchecked { + if (lastFinalizedBatchIndex + 1 != _batchIndex) revert ErrorIncorrectBatchIndex(); + lastFinalizedBatchIndex = _batchIndex; + } + + // record state root and withdraw root + finalizedStateRoots[_batchIndex] = _postStateRoot; + withdrawRoots[_batchIndex] = _withdrawRoot; + + emit FinalizeBatch(_batchIndex, _batchHash, _postStateRoot, _withdrawRoot); + } + + /********************** + * Internal Functions * + **********************/ + + /// @dev Internal function to commit chunks with version 0 + /// @param _totalL1MessagesPoppedOverall The number of L1 messages popped before the list of chunks. + /// @param _chunks The list of chunks to commit. + /// @return _batchDataHash The computed data hash for the list of chunks. + /// @return _totalL1MessagesPoppedInBatch The total number of L1 messages poped in this batch, including skipped one. + function _commitChunksV0( + uint256 _totalL1MessagesPoppedOverall, + bytes[] memory _chunks + ) internal pure returns (bytes32 _batchDataHash, uint256 _totalL1MessagesPoppedInBatch) { + uint256 _chunksLength = _chunks.length; + + // load `batchDataHashPtr` and reserve the memory region for chunk data hashes + uint256 batchDataHashPtr; + assembly { + batchDataHashPtr := mload(0x40) + mstore(0x40, add(batchDataHashPtr, mul(_chunksLength, 32))) + } + + // compute the data hash for each chunk + for (uint256 i = 0; i < _chunksLength; i++) { + uint256 _totalNumL1MessagesInChunk; + bytes32 _chunkDataHash; + (_chunkDataHash, _totalNumL1MessagesInChunk) = _commitChunkV0( + _chunks[i], + _totalL1MessagesPoppedInBatch, + _totalL1MessagesPoppedOverall + ); + unchecked { + _totalL1MessagesPoppedInBatch += _totalNumL1MessagesInChunk; + _totalL1MessagesPoppedOverall += _totalNumL1MessagesInChunk; + } + assembly { + mstore(batchDataHashPtr, _chunkDataHash) + batchDataHashPtr := add(batchDataHashPtr, 0x20) + } + } + + assembly { + let dataLen := mul(_chunksLength, 0x20) + _batchDataHash := keccak256(sub(batchDataHashPtr, dataLen), dataLen) + } + } + + /// @dev Internal function to commit chunks with version 1 + /// @param _totalL1MessagesPoppedOverall The number of L1 messages popped before the list of chunks. + /// @param _chunks The list of chunks to commit. + /// @return _blobVersionedHash The blob versioned hash for the blob carried in this transaction. + /// @return _batchDataHash The computed data hash for the list of chunks. + /// @return _totalL1MessagesPoppedInBatch The total number of L1 messages poped in this batch, including skipped one. + function _commitChunksV1( + uint256 _totalL1MessagesPoppedOverall, + bytes[] memory _chunks + ) + internal + view + returns ( + bytes32 _blobVersionedHash, + bytes32 _batchDataHash, + uint256 _totalL1MessagesPoppedInBatch + ) + { + { + bytes32 _secondBlob; + // Get blob's versioned hash + assembly { + _blobVersionedHash := blobhash(0) + _secondBlob := blobhash(1) + } + if (_blobVersionedHash == bytes32(0)) revert ErrorNoBlobFound(); + if (_secondBlob != bytes32(0)) revert ErrorFoundMultipleBlob(); + } + + uint256 _chunksLength = _chunks.length; + + // load `batchDataHashPtr` and reserve the memory region for chunk data hashes + uint256 batchDataHashPtr; + assembly { + batchDataHashPtr := mload(0x40) + mstore(0x40, add(batchDataHashPtr, mul(_chunksLength, 32))) + } + + // compute the data hash for each chunk + for (uint256 i = 0; i < _chunksLength; i++) { + uint256 _totalNumL1MessagesInChunk; + bytes32 _chunkDataHash; + (_chunkDataHash, _totalNumL1MessagesInChunk) = _commitChunkV1( + _chunks[i], + _totalL1MessagesPoppedInBatch, + _totalL1MessagesPoppedOverall + ); + unchecked { + _totalL1MessagesPoppedInBatch += _totalNumL1MessagesInChunk; + _totalL1MessagesPoppedOverall += _totalNumL1MessagesInChunk; + } + assembly { + mstore(batchDataHashPtr, _chunkDataHash) + batchDataHashPtr := add(batchDataHashPtr, 0x20) + } + } + + // compute the data hash for current batch + assembly { + let dataLen := mul(_chunksLength, 0x20) + _batchDataHash := keccak256(sub(batchDataHashPtr, dataLen), dataLen) + } + } + + /// @dev Internal function to load batch header from calldata to memory. + /// @param _batchHeader The batch header in calldata. + /// @return batchPtr The start memory offset of loaded batch header. + /// @return _batchHash The hash of the loaded batch header. + /// @return _batchIndex The index of this batch. + /// @param _totalL1MessagesPoppedOverall The number of L1 messages popped after this batch. + function _loadBatchHeader(bytes calldata _batchHeader) + internal + view + returns ( + uint256 batchPtr, + bytes32 _batchHash, + uint256 _batchIndex, + uint256 _totalL1MessagesPoppedOverall + ) + { + // load version from batch header, it is always the first byte. + uint256 version; + assembly { + version := shr(248, calldataload(_batchHeader.offset)) + } + + // version should be always 0 or 1 in current code + uint256 _length; + if (version == 0) { + (batchPtr, _length) = BatchHeaderV0Codec.loadAndValidate(_batchHeader); + _batchHash = BatchHeaderV0Codec.computeBatchHash(batchPtr, _length); + _batchIndex = BatchHeaderV0Codec.getBatchIndex(batchPtr); + } else if (version == 1) { + (batchPtr, _length) = BatchHeaderV1Codec.loadAndValidate(_batchHeader); + _batchHash = BatchHeaderV1Codec.computeBatchHash(batchPtr, _length); + _batchIndex = BatchHeaderV1Codec.getBatchIndex(batchPtr); + } else { + revert ErrorInvalidBatchHeaderVersion(); + } + // only check when genesis is imported + if (committedBatches[_batchIndex] != _batchHash && finalizedStateRoots[0] != bytes32(0)) { + revert ErrorIncorrectBatchHash(); + } + _totalL1MessagesPoppedOverall = BatchHeaderV0Codec.getTotalL1MessagePopped(batchPtr); + } + + /// @dev Internal function to commit a chunk with version 0. + /// @param _chunk The encoded chunk to commit. + /// @param _totalL1MessagesPoppedInBatch The total number of L1 messages popped in the current batch before this chunk. + /// @param _totalL1MessagesPoppedOverall The total number of L1 messages popped in all batches including the current batch, before this chunk. + /// @return _dataHash The computed data hash for this chunk. + /// @return _totalNumL1MessagesInChunk The total number of L1 message popped in current chunk + function _commitChunkV0( + bytes memory _chunk, + uint256 _totalL1MessagesPoppedInBatch, + uint256 _totalL1MessagesPoppedOverall + ) internal pure returns (bytes32 _dataHash, uint256 _totalNumL1MessagesInChunk) { + uint256 chunkPtr; + uint256 startDataPtr; + uint256 dataPtr; + + assembly { + dataPtr := mload(0x40) + startDataPtr := dataPtr + chunkPtr := add(_chunk, 0x20) // skip chunkLength + } + + uint256 _numBlocks = ChunkCodecV0.validateChunkLength(chunkPtr, _chunk.length); + + // concatenate block contexts, use scope to avoid stack too deep + { + uint256 _totalTransactionsInChunk; + for (uint256 i = 0; i < _numBlocks; i++) { + dataPtr = ChunkCodecV0.copyBlockContext(chunkPtr, dataPtr, i); + uint256 blockPtr = chunkPtr + 1 + i * ChunkCodecV0.BLOCK_CONTEXT_LENGTH; + uint256 _numTransactionsInBlock = ChunkCodecV0.getNumTransactions(blockPtr); + unchecked { + _totalTransactionsInChunk += _numTransactionsInBlock; + } + } + assembly { + mstore(0x40, add(dataPtr, mul(_totalTransactionsInChunk, 0x20))) // reserve memory for tx hashes + } + } + + // concatenate tx hashes + uint256 l2TxPtr = ChunkCodecV0.getL2TxPtr(chunkPtr, _numBlocks); + chunkPtr += 1; + while (_numBlocks > 0) { + // concatenate l1 message hashes + uint256 _numL1MessagesInBlock = ChunkCodecV0.getNumL1Messages(chunkPtr); + + // concatenate l2 transaction hashes + uint256 _numTransactionsInBlock = ChunkCodecV0.getNumTransactions(chunkPtr); + if (_numTransactionsInBlock < _numL1MessagesInBlock) revert ErrorNumTxsLessThanNumL1Msgs(); + for (uint256 j = _numL1MessagesInBlock; j < _numTransactionsInBlock; j++) { + bytes32 txHash; + (txHash, l2TxPtr) = ChunkCodecV0.loadL2TxHash(l2TxPtr); + assembly { + mstore(dataPtr, txHash) + dataPtr := add(dataPtr, 0x20) + } + } + + unchecked { + _totalNumL1MessagesInChunk += _numL1MessagesInBlock; + _totalL1MessagesPoppedInBatch += _numL1MessagesInBlock; + _totalL1MessagesPoppedOverall += _numL1MessagesInBlock; + + _numBlocks -= 1; + chunkPtr += ChunkCodecV0.BLOCK_CONTEXT_LENGTH; + } + } + + assembly { + chunkPtr := add(_chunk, 0x20) + } + // check chunk has correct length + if (l2TxPtr - chunkPtr != _chunk.length) revert ErrorIncompleteL2TransactionData(); + + // compute data hash and store to memory + assembly { + _dataHash := keccak256(startDataPtr, sub(dataPtr, startDataPtr)) + } + } + + /// @dev Internal function to commit a chunk with version 1. + /// @param _chunk The encoded chunk to commit. + /// @param _totalL1MessagesPoppedInBatch The total number of L1 messages popped in current batch. + /// @param _totalL1MessagesPoppedOverall The total number of L1 messages popped in all batches including current batch. + /// @return _dataHash The computed data hash for this chunk. + /// @return _totalNumL1MessagesInChunk The total number of L1 message popped in current chunk + function _commitChunkV1( + bytes memory _chunk, + uint256 _totalL1MessagesPoppedInBatch, + uint256 _totalL1MessagesPoppedOverall + ) internal pure returns (bytes32 _dataHash, uint256 _totalNumL1MessagesInChunk) { + uint256 chunkPtr; + uint256 startDataPtr; + uint256 dataPtr; + + assembly { + dataPtr := mload(0x40) + startDataPtr := dataPtr + chunkPtr := add(_chunk, 0x20) // skip chunkLength + } + + uint256 _numBlocks = ChunkCodecV1.validateChunkLength(chunkPtr, _chunk.length); + // concatenate block contexts, use scope to avoid stack too deep + for (uint256 i = 0; i < _numBlocks; i++) { + dataPtr = ChunkCodecV1.copyBlockContext(chunkPtr, dataPtr, i); + uint256 blockPtr = chunkPtr + 1 + i * ChunkCodecV1.BLOCK_CONTEXT_LENGTH; + uint256 _numL1MessagesInBlock = ChunkCodecV1.getNumL1Messages(blockPtr); + unchecked { + _totalNumL1MessagesInChunk += _numL1MessagesInBlock; + } + } + assembly { + mstore(0x40, add(dataPtr, mul(_totalNumL1MessagesInChunk, 0x20))) // reserve memory for l1 message hashes + chunkPtr := add(chunkPtr, 1) + } + + // the number of actual transactions in one chunk: non-skipped l1 messages + l2 txs + uint256 _totalTransactionsInChunk; + // concatenate tx hashes + while (_numBlocks > 0) { + // concatenate l1 message hashes + uint256 _numL1MessagesInBlock = ChunkCodecV1.getNumL1Messages(chunkPtr); + uint256 startPtr = dataPtr; + uint256 _numTransactionsInBlock = ChunkCodecV1.getNumTransactions(chunkPtr); + if (_numTransactionsInBlock < _numL1MessagesInBlock) revert ErrorNumTxsLessThanNumL1Msgs(); + unchecked { + _totalTransactionsInChunk += dataPtr - startPtr; // number of non-skipped l1 messages + _totalTransactionsInChunk += _numTransactionsInBlock - _numL1MessagesInBlock; // number of l2 txs + _totalL1MessagesPoppedInBatch += _numL1MessagesInBlock; + _totalL1MessagesPoppedOverall += _numL1MessagesInBlock; + + _numBlocks -= 1; + chunkPtr += ChunkCodecV1.BLOCK_CONTEXT_LENGTH; + } + } + + // compute data hash and store to memory + assembly { + _dataHash := keccak256(startDataPtr, sub(dataPtr, startDataPtr)) + } + } + + function verifyProof( + bytes32 claim, + bytes memory commitment, + bytes memory proof + ) external view { + require(commitment.length == 48, "Commitment must be 48 bytes"); + require(proof.length == 48, "Proof must be 48 bytes"); + + bytes32 versionedHash = blobhash(0); + + // Compute random challenge point. + uint256 point = uint256(keccak256(abi.encodePacked(versionedHash))) % BLS_MODULUS; + + bytes memory pointEvaluationCalldata = abi.encodePacked( + versionedHash, + point, + claim, + commitment, + proof + ); + + (bool success,) = POINT_EVALUATION_PRECOMPILE_ADDR.staticcall(pointEvaluationCalldata); + + if (!success) { + revert("Proof verification failed"); + } + } +} diff --git a/rollup/mock_bridge/MockBridgeL1.sol b/rollup/mock_bridge/MockBridgeL1.sol deleted file mode 100644 index a18ba6083..000000000 --- a/rollup/mock_bridge/MockBridgeL1.sol +++ /dev/null @@ -1,315 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; - -import {BatchHeaderV0Codec} from "../../contracts/src/libraries/codec/BatchHeaderV0Codec.sol"; -import {ChunkCodec} from "../../contracts/src/libraries/codec/ChunkCodec.sol"; -import {IL1MessageQueue} from "../../contracts/src/L1/rollup/IL1MessageQueue.sol"; - -contract MockBridgeL1 { - /****************************** - * Events from L1MessageQueue * - ******************************/ - - /// @notice Emitted when a new L1 => L2 transaction is appended to the queue. - /// @param sender The address of account who initiates the transaction. - /// @param target The address of account who will recieve the transaction. - /// @param value The value passed with the transaction. - /// @param queueIndex The index of this transaction in the queue. - /// @param gasLimit Gas limit required to complete the message relay on L2. - /// @param data The calldata of the transaction. - event QueueTransaction( - address indexed sender, - address indexed target, - uint256 value, - uint64 queueIndex, - uint256 gasLimit, - bytes data - ); - - /********************************* - * Events from L1ScrollMessenger * - *********************************/ - - /// @notice Emitted when a cross domain message is sent. - /// @param sender The address of the sender who initiates the message. - /// @param target The address of target contract to call. - /// @param value The amount of value passed to the target contract. - /// @param messageNonce The nonce of the message. - /// @param gasLimit The optional gas limit passed to L1 or L2. - /// @param message The calldata passed to the target contract. - event SentMessage( - address indexed sender, - address indexed target, - uint256 value, - uint256 messageNonce, - uint256 gasLimit, - bytes message - ); - - /// @notice Emitted when a cross domain message is relayed successfully. - /// @param messageHash The hash of the message. - event RelayedMessage(bytes32 indexed messageHash); - - /*************************** - * Events from ScrollChain * - ***************************/ - - /// @notice Emitted when a new batch is committed. - /// @param batchHash The hash of the batch. - event CommitBatch(uint256 indexed batchIndex, bytes32 indexed batchHash); - - /// @notice Emitted when a batch is finalized. - /// @param batchHash The hash of the batch - /// @param stateRoot The state root on layer 2 after this batch. - /// @param withdrawRoot The merkle root on layer2 after this batch. - event FinalizeBatch(uint256 indexed batchIndex, bytes32 indexed batchHash, bytes32 stateRoot, bytes32 withdrawRoot); - - /*********** - * Structs * - ***********/ - - struct L2MessageProof { - // The index of the batch where the message belongs to. - uint256 batchIndex; - // Concatenation of merkle proof for withdraw merkle trie. - bytes merkleProof; - } - - /************* - * Variables * - *************/ - - uint256 public messageNonce; - mapping(uint256 => bytes32) public committedBatches; - uint256 public l2BaseFee; - - /*********************************** - * Functions from L2GasPriceOracle * - ***********************************/ - - function setL2BaseFee(uint256 _newL2BaseFee) external { - l2BaseFee = _newL2BaseFee; - } - - /************************************ - * Functions from L1ScrollMessenger * - ************************************/ - - function sendMessage( - address target, - uint256 value, - bytes calldata message, - uint256 gasLimit - ) external payable { - bytes memory _xDomainCalldata = _encodeXDomainCalldata(msg.sender, target, value, messageNonce, message); - { - address _sender = applyL1ToL2Alias(address(this)); - emit QueueTransaction(_sender, target, 0, uint64(messageNonce), gasLimit, _xDomainCalldata); - } - - emit SentMessage(msg.sender, target, value, messageNonce, gasLimit, message); - messageNonce += 1; - } - - function relayMessageWithProof( - address _from, - address _to, - uint256 _value, - uint256 _nonce, - bytes memory _message, - L2MessageProof memory - ) external { - bytes memory _xDomainCalldata = _encodeXDomainCalldata(_from, _to, _value, _nonce, _message); - bytes32 _xDomainCalldataHash = keccak256(_xDomainCalldata); - emit RelayedMessage(_xDomainCalldataHash); - } - - /****************************** - * Functions from ScrollChain * - ******************************/ - - /// @notice Import layer 2 genesis block - function importGenesisBatch(bytes calldata _batchHeader, bytes32 _stateRoot) external { - } - - function commitBatch( - uint8 /*version*/, - bytes calldata _parentBatchHeader, - bytes[] memory chunks, - bytes calldata /*skippedL1MessageBitmap*/ - ) external { - // check whether the batch is empty - uint256 _chunksLength = chunks.length; - require(_chunksLength > 0, "batch is empty"); - - // decode batch index - uint256 headerLength = _parentBatchHeader.length; - uint256 parentBatchPtr; - uint256 parentBatchIndex; - assembly { - parentBatchPtr := mload(0x40) - calldatacopy(parentBatchPtr, _parentBatchHeader.offset, headerLength) - mstore(0x40, add(parentBatchPtr, headerLength)) - parentBatchIndex := shr(192, mload(add(parentBatchPtr, 1))) - } - - uint256 dataPtr; - assembly { - dataPtr := mload(0x40) - mstore(0x40, add(dataPtr, mul(_chunksLength, 32))) - } - - for (uint256 i = 0; i < _chunksLength; i++) { - _commitChunk(dataPtr, chunks[i]); - - unchecked { - dataPtr += 32; - } - } - - bytes32 _dataHash; - assembly { - let dataLen := mul(_chunksLength, 0x20) - _dataHash := keccak256(sub(dataPtr, dataLen), dataLen) - } - - bytes memory paddedData = new bytes(89); - assembly { - mstore(add(paddedData, 57), _dataHash) - } - - uint256 batchPtr; - assembly { - batchPtr := add(paddedData, 32) - } - bytes32 _batchHash = BatchHeaderV0Codec.computeBatchHash(batchPtr, 89); - committedBatches[0] = _batchHash; - emit CommitBatch(parentBatchIndex + 1, _batchHash); - } - - function finalizeBatchWithProof( - bytes calldata batchHeader, - bytes32 /*prevStateRoot*/, - bytes32 postStateRoot, - bytes32 withdrawRoot, - bytes calldata /*aggrProof*/ - ) external { - // decode batch index - uint256 headerLength = batchHeader.length; - uint256 batchPtr; - uint256 batchIndex; - assembly { - batchPtr := mload(0x40) - calldatacopy(batchPtr, batchHeader.offset, headerLength) - mstore(0x40, add(batchPtr, headerLength)) - batchIndex := shr(192, mload(add(batchPtr, 1))) - } - - bytes32 _batchHash = committedBatches[0]; - emit FinalizeBatch(batchIndex, _batchHash, postStateRoot, withdrawRoot); - } - - /********************** - * Internal Functions * - **********************/ - - /// @dev Internal function to generate the correct cross domain calldata for a message. - /// @param _sender Message sender address. - /// @param _target Target contract address. - /// @param _value The amount of ETH pass to the target. - /// @param _messageNonce Nonce for the provided message. - /// @param _message Message to send to the target. - /// @return ABI encoded cross domain calldata. - function _encodeXDomainCalldata( - address _sender, - address _target, - uint256 _value, - uint256 _messageNonce, - bytes memory _message - ) internal pure returns (bytes memory) { - return - abi.encodeWithSignature( - "relayMessage(address,address,uint256,uint256,bytes)", - _sender, - _target, - _value, - _messageNonce, - _message - ); - } - - /// @notice Utility function that converts the address in the L1 that submitted a tx to - /// the inbox to the msg.sender viewed in the L2 - /// @param l1Address the address in the L1 that triggered the tx to L2 - /// @return l2Address L2 address as viewed in msg.sender - function applyL1ToL2Alias(address l1Address) internal pure returns (address l2Address) { - uint160 offset = uint160(0x1111000000000000000000000000000000001111); - unchecked { - l2Address = address(uint160(l1Address) + offset); - } - } - - function _commitChunk( - uint256 memPtr, - bytes memory _chunk - ) internal pure { - uint256 chunkPtr; - uint256 startDataPtr; - uint256 dataPtr; - uint256 blockPtr; - - assembly { - dataPtr := mload(0x40) - startDataPtr := dataPtr - chunkPtr := add(_chunk, 0x20) // skip chunkLength - blockPtr := add(chunkPtr, 1) // skip numBlocks - } - - uint256 _numBlocks = ChunkCodec.validateChunkLength(chunkPtr, _chunk.length); - - // concatenate block contexts - uint256 _totalTransactionsInChunk; - for (uint256 i = 0; i < _numBlocks; i++) { - dataPtr = ChunkCodec.copyBlockContext(chunkPtr, dataPtr, i); - uint256 _numTransactionsInBlock = ChunkCodec.numTransactions(blockPtr); - unchecked { - _totalTransactionsInChunk += _numTransactionsInBlock; - blockPtr += ChunkCodec.BLOCK_CONTEXT_LENGTH; - } - } - - assembly { - mstore(0x40, add(dataPtr, mul(_totalTransactionsInChunk, 0x20))) // reserve memory for tx hashes - blockPtr := add(chunkPtr, 1) // reset block ptr - } - - // concatenate tx hashes - uint256 l2TxPtr = ChunkCodec.l2TxPtr(chunkPtr, _numBlocks); - while (_numBlocks > 0) { - // concatenate l2 transaction hashes - uint256 _numTransactionsInBlock = ChunkCodec.numTransactions(blockPtr); - for (uint256 j = 0; j < _numTransactionsInBlock; j++) { - bytes32 txHash; - (txHash, l2TxPtr) = ChunkCodec.loadL2TxHash(l2TxPtr); - assembly { - mstore(dataPtr, txHash) - dataPtr := add(dataPtr, 0x20) - } - } - - unchecked { - _numBlocks -= 1; - blockPtr += ChunkCodec.BLOCK_CONTEXT_LENGTH; - } - } - - // check chunk has correct length - require(l2TxPtr - chunkPtr == _chunk.length, "incomplete l2 transaction data"); - - // compute data hash and store to memory - assembly { - let dataHash := keccak256(startDataPtr, sub(dataPtr, startDataPtr)) - mstore(memPtr, dataHash) - } - } -} diff --git a/rollup/mock_bridge/MockBridgeL2.sol b/rollup/mock_bridge/MockBridgeL2.sol deleted file mode 100644 index e79e45676..000000000 --- a/rollup/mock_bridge/MockBridgeL2.sol +++ /dev/null @@ -1,111 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; - -contract MockBridgeL2 { - /****************************** - * Events from L2MessageQueue * - ******************************/ - - /// @notice Emitted when a new message is added to the merkle tree. - /// @param index The index of the corresponding message. - /// @param messageHash The hash of the corresponding message. - event AppendMessage(uint256 index, bytes32 messageHash); - - /********************************* - * Events from L2ScrollMessenger * - *********************************/ - - /// @notice Emitted when a cross domain message is sent. - /// @param sender The address of the sender who initiates the message. - /// @param target The address of target contract to call. - /// @param value The amount of value passed to the target contract. - /// @param messageNonce The nonce of the message. - /// @param gasLimit The optional gas limit passed to L1 or L2. - /// @param message The calldata passed to the target contract. - event SentMessage( - address indexed sender, - address indexed target, - uint256 value, - uint256 messageNonce, - uint256 gasLimit, - bytes message - ); - - /// @notice Emitted when a cross domain message is relayed successfully. - /// @param messageHash The hash of the message. - event RelayedMessage(bytes32 indexed messageHash); - - /************* - * Variables * - *************/ - - /// @notice Message nonce, used to avoid relay attack. - uint256 public messageNonce; - - /*********************************** - * Functions from L1GasPriceOracle * - ***********************************/ - - function setL1BaseFee(uint256) external { - } - - /************************************ - * Functions from L2ScrollMessenger * - ************************************/ - - function sendMessage( - address _to, - uint256 _value, - bytes memory _message, - uint256 _gasLimit - ) external payable { - bytes memory _xDomainCalldata = _encodeXDomainCalldata(msg.sender, _to, _value, messageNonce, _message); - bytes32 _xDomainCalldataHash = keccak256(_xDomainCalldata); - - emit AppendMessage(messageNonce, _xDomainCalldataHash); - emit SentMessage(msg.sender, _to, _value, messageNonce, _gasLimit, _message); - - messageNonce += 1; - } - - function relayMessage( - address _from, - address _to, - uint256 _value, - uint256 _nonce, - bytes calldata _message - ) external { - bytes memory _xDomainCalldata = _encodeXDomainCalldata(_from, _to, _value, _nonce, _message); - bytes32 _xDomainCalldataHash = keccak256(_xDomainCalldata); - emit RelayedMessage(_xDomainCalldataHash); - } - - /********************** - * Internal Functions * - **********************/ - - /// @dev Internal function to generate the correct cross domain calldata for a message. - /// @param _sender Message sender address. - /// @param _target Target contract address. - /// @param _value The amount of ETH pass to the target. - /// @param _messageNonce Nonce for the provided message. - /// @param _message Message to send to the target. - /// @return ABI encoded cross domain calldata. - function _encodeXDomainCalldata( - address _sender, - address _target, - uint256 _value, - uint256 _messageNonce, - bytes memory _message - ) internal pure returns (bytes memory) { - return - abi.encodeWithSignature( - "relayMessage(address,address,uint256,uint256,bytes)", - _sender, - _target, - _value, - _messageNonce, - _message - ); - } -} diff --git a/rollup/tests/bridge_test.go b/rollup/tests/bridge_test.go index eae810be6..c1e766457 100644 --- a/rollup/tests/bridge_test.go +++ b/rollup/tests/bridge_test.go @@ -9,49 +9,52 @@ import ( "strconv" "strings" "testing" + "time" + + "scroll-tech/database/migrate" + + "scroll-tech/common/database" + dockercompose "scroll-tech/common/docker-compose/l1" + tc "scroll-tech/common/testcontainers" + "scroll-tech/common/utils" "github.com/gin-gonic/gin" "github.com/scroll-tech/go-ethereum/accounts/abi/bind" "github.com/scroll-tech/go-ethereum/common" "github.com/scroll-tech/go-ethereum/core/types" + gethTypes "github.com/scroll-tech/go-ethereum/core/types" + "github.com/scroll-tech/go-ethereum/crypto" "github.com/scroll-tech/go-ethereum/ethclient" "github.com/scroll-tech/go-ethereum/log" "github.com/stretchr/testify/assert" "gorm.io/gorm" - "scroll-tech/common/database" - "scroll-tech/common/docker" - "scroll-tech/common/utils" - - "scroll-tech/database/migrate" - bcmd "scroll-tech/rollup/cmd" "scroll-tech/rollup/mock_bridge" ) var ( - base *docker.App - rollupApp *bcmd.MockApp + testApps *tc.TestcontainerApps + rollupApp *bcmd.MockApp + posL1TestEnv *dockercompose.PoSL1TestEnv // clients l1Client *ethclient.Client l2Client *ethclient.Client - // auth + // l1Auth l1Auth *bind.TransactOpts - l2Auth *bind.TransactOpts - - // l1 rollup contract - scrollChainInstance *mock_bridge.MockBridgeL1 - scrollChainAddress common.Address ) func setupDB(t *testing.T) *gorm.DB { + dsn, err := testApps.GetDBEndPoint() + assert.NoError(t, err) + cfg := &database.Config{ - DSN: base.DBConfig.DSN, - DriverName: base.DBConfig.DriverName, - MaxOpenNum: base.DBConfig.MaxOpenNum, - MaxIdleNum: base.DBConfig.MaxIdleNum, + DSN: dsn, + DriverName: "postgres", + MaxOpenNum: 200, + MaxIdleNum: 20, } db, err := database.InitDB(cfg) assert.NoError(t, err) @@ -62,10 +65,17 @@ func setupDB(t *testing.T) *gorm.DB { } func TestMain(m *testing.M) { - base = docker.NewDockerApp() - rollupApp = bcmd.NewRollupApp(base, "../conf/config.json") - defer rollupApp.Free() - defer base.Free() + defer func() { + if testApps != nil { + testApps.Free() + } + if rollupApp != nil { + rollupApp.Free() + } + if posL1TestEnv != nil { + posL1TestEnv.Stop() + } + }() m.Run() } @@ -74,12 +84,26 @@ func setupEnv(t *testing.T) { glogger.Verbosity(log.LvlInfo) log.Root().SetHandler(glogger) - base.RunImages(t) + var ( + err error + l1GethChainID *big.Int + ) - var err error - l1Client, err = base.L1Client() + posL1TestEnv, err = dockercompose.NewPoSL1TestEnv() + assert.NoError(t, err, "failed to create PoS L1 test environment") + assert.NoError(t, posL1TestEnv.Start(), "failed to start PoS L1 test environment") + + testApps = tc.NewTestcontainerApps() + assert.NoError(t, testApps.StartPostgresContainer()) + assert.NoError(t, testApps.StartL1GethContainer()) + assert.NoError(t, testApps.StartL2GethContainer()) + rollupApp = bcmd.NewRollupApp(testApps, "../conf/config.json") + + l1Client, err = posL1TestEnv.L1Client() assert.NoError(t, err) - l2Client, err = base.L2Client() + l2Client, err = testApps.GetL2GethClient() + assert.NoError(t, err) + l1GethChainID, err = l1Client.ChainID(context.Background()) assert.NoError(t, err) l1Cfg, l2Cfg := rollupApp.Config.L1Config, rollupApp.Config.L2Config @@ -88,11 +112,10 @@ func setupEnv(t *testing.T) { l2Cfg.Confirmations = 0 l2Cfg.RelayerConfig.SenderConfig.Confirmations = 0 - l1Auth, err = bind.NewKeyedTransactorWithChainID(rollupApp.Config.L2Config.RelayerConfig.CommitSenderPrivateKey, base.L1gethImg.ChainID()) - assert.NoError(t, err) - - l2Auth, err = bind.NewKeyedTransactorWithChainID(rollupApp.Config.L1Config.RelayerConfig.GasOracleSenderPrivateKey, base.L2gethImg.ChainID()) + l1Auth, err = bind.NewKeyedTransactorWithChainID(rollupApp.Config.L2Config.RelayerConfig.CommitSenderPrivateKey, l1GethChainID) assert.NoError(t, err) + rollupApp.Config.L1Config.Endpoint = posL1TestEnv.Endpoint() + rollupApp.Config.L2Config.RelayerConfig.SenderConfig.Endpoint = posL1TestEnv.Endpoint() port, err := rand.Int(rand.Reader, big.NewInt(10000)) assert.NoError(t, err) @@ -118,18 +141,33 @@ func mockChainMonitorServer(baseURL string) (*http.Server, error) { } func prepareContracts(t *testing.T) { - var err error - var tx *types.Transaction - // L1 ScrolChain contract - _, tx, scrollChainInstance, err = mock_bridge.DeployMockBridgeL1(l1Auth, l1Client) + nonce, err := l1Client.PendingNonceAt(context.Background(), l1Auth.From) assert.NoError(t, err) - scrollChainAddress, err = bind.WaitDeployed(context.Background(), l1Client, tx) + scrollChainAddress := crypto.CreateAddress(l1Auth.From, nonce) + tx := types.NewContractCreation(nonce, big.NewInt(0), 10000000, big.NewInt(1000000000), common.FromHex(mock_bridge.MockBridgeMetaData.Bin)) + signedTx, err := l1Auth.Signer(l1Auth.From, tx) assert.NoError(t, err) + err = l1Client.SendTransaction(context.Background(), signedTx) + assert.NoError(t, err) + + assert.Eventually(t, func() bool { + _, isPending, err := l1Client.TransactionByHash(context.Background(), signedTx.Hash()) + return err == nil && !isPending + }, 30*time.Second, time.Second) + + assert.Eventually(t, func() bool { + receipt, err := l1Client.TransactionReceipt(context.Background(), signedTx.Hash()) + return err == nil && receipt.Status == gethTypes.ReceiptStatusSuccessful + }, 30*time.Second, time.Second) + + assert.Eventually(t, func() bool { + code, err := l1Client.CodeAt(context.Background(), scrollChainAddress, nil) + return err == nil && len(code) > 0 + }, 30*time.Second, time.Second) l1Config, l2Config := rollupApp.Config.L1Config, rollupApp.Config.L2Config l1Config.ScrollChainContractAddress = scrollChainAddress - l2Config.RelayerConfig.RollupContractAddress = scrollChainAddress } @@ -146,6 +184,8 @@ func TestFunction(t *testing.T) { // l1 rollup and watch rollup events t.Run("TestCommitAndFinalizeGenesisBatch", testCommitAndFinalizeGenesisBatch) t.Run("TestCommitBatchAndFinalizeBatch", testCommitBatchAndFinalizeBatch) + t.Run("TestCommitBatchAndFinalizeBatch4844", testCommitBatchAndFinalizeBatch4844) + t.Run("TestCommitBatchAndFinalizeBatchBeforeAndPost4844", testCommitBatchAndFinalizeBatchBeforeAndPost4844) // l1/l2 gas oracle t.Run("TestImportL1GasPrice", testImportL1GasPrice) diff --git a/rollup/tests/gas_oracle_test.go b/rollup/tests/gas_oracle_test.go index ad49d0fbc..def0303f9 100644 --- a/rollup/tests/gas_oracle_test.go +++ b/rollup/tests/gas_oracle_test.go @@ -7,10 +7,12 @@ import ( "github.com/scroll-tech/go-ethereum/common" gethTypes "github.com/scroll-tech/go-ethereum/core/types" + "github.com/scroll-tech/go-ethereum/params" "github.com/stretchr/testify/assert" "scroll-tech/common/database" "scroll-tech/common/types" + "scroll-tech/common/types/encoding" "scroll-tech/rollup/internal/controller/relayer" "scroll-tech/rollup/internal/controller/watcher" @@ -28,6 +30,7 @@ func testImportL1GasPrice(t *testing.T) { // Create L1Relayer l1Relayer, err := relayer.NewLayer1Relayer(context.Background(), db, l1Cfg.RelayerConfig, relayer.ServiceTypeL1GasOracle, nil) assert.NoError(t, err) + defer l1Relayer.StopSenders() // Create L1Watcher startHeight, err := l1Client.BlockNumber(context.Background()) @@ -67,12 +70,13 @@ func testImportL2GasPrice(t *testing.T) { prepareContracts(t) l2Cfg := rollupApp.Config.L2Config - l2Relayer, err := relayer.NewLayer2Relayer(context.Background(), l2Client, db, l2Cfg.RelayerConfig, false, relayer.ServiceTypeL2GasOracle, nil) + l2Relayer, err := relayer.NewLayer2Relayer(context.Background(), l2Client, db, l2Cfg.RelayerConfig, ¶ms.ChainConfig{}, false, relayer.ServiceTypeL2GasOracle, nil) assert.NoError(t, err) + defer l2Relayer.StopSenders() // add fake chunk - chunk := &types.Chunk{ - Blocks: []*types.WrappedBlock{ + chunk := &encoding.Chunk{ + Blocks: []*encoding.Block{ { Header: &gethTypes.Header{ Number: big.NewInt(1), @@ -86,31 +90,29 @@ func testImportL2GasPrice(t *testing.T) { }, }, } - chunkHash, err := chunk.Hash(0) - assert.NoError(t, err) - - batchMeta := &types.BatchMeta{ - StartChunkIndex: 0, - StartChunkHash: chunkHash.Hex(), - EndChunkIndex: 0, - EndChunkHash: chunkHash.Hex(), + batch := &encoding.Batch{ + Index: 0, + TotalL1MessagePoppedBefore: 0, + ParentBatchHash: common.Hash{}, + Chunks: []*encoding.Chunk{chunk}, } + batchOrm := orm.NewBatch(db) - _, err = batchOrm.InsertBatch(context.Background(), []*types.Chunk{chunk}, batchMeta) + _, err = batchOrm.InsertBatch(context.Background(), batch, encoding.CodecV0) assert.NoError(t, err) // check db status - batch, err := batchOrm.GetLatestBatch(context.Background()) + dbBatch, err := batchOrm.GetLatestBatch(context.Background()) assert.NoError(t, err) assert.NotNil(t, batch) - assert.Empty(t, batch.OracleTxHash) - assert.Equal(t, types.GasOracleStatus(batch.OracleStatus), types.GasOraclePending) + assert.Empty(t, dbBatch.OracleTxHash) + assert.Equal(t, types.GasOracleStatus(dbBatch.OracleStatus), types.GasOraclePending) // relay gas price l2Relayer.ProcessGasPriceOracle() - batch, err = batchOrm.GetLatestBatch(context.Background()) + dbBatch, err = batchOrm.GetLatestBatch(context.Background()) assert.NoError(t, err) assert.NotNil(t, batch) - assert.NotEmpty(t, batch.OracleTxHash) - assert.Equal(t, types.GasOracleStatus(batch.OracleStatus), types.GasOracleImporting) + assert.NotEmpty(t, dbBatch.OracleTxHash) + assert.Equal(t, types.GasOracleStatus(dbBatch.OracleStatus), types.GasOracleImporting) } diff --git a/rollup/tests/process_start_test.go b/rollup/tests/process_start_test.go index 83189cb97..f866e3ea2 100644 --- a/rollup/tests/process_start_test.go +++ b/rollup/tests/process_start_test.go @@ -22,7 +22,7 @@ func testProcessStart(t *testing.T) { rollupApp.RunApp(t, cutils.EventWatcherApp) rollupApp.RunApp(t, cutils.GasOracleApp) - rollupApp.RunApp(t, cutils.RollupRelayerApp) + rollupApp.RunApp(t, cutils.RollupRelayerApp, "--genesis", "../conf/genesis.json") rollupApp.WaitExit() } @@ -44,7 +44,7 @@ func testProcessStartEnableMetrics(t *testing.T) { port, err = rand.Int(rand.Reader, big.NewInt(10000)) assert.NoError(t, err) svrPort = strconv.FormatInt(port.Int64()+30000, 10) - rollupApp.RunApp(t, cutils.RollupRelayerApp, "--metrics", "--metrics.addr", "localhost", "--metrics.port", svrPort) + rollupApp.RunApp(t, cutils.RollupRelayerApp, "--metrics", "--metrics.addr", "localhost", "--metrics.port", svrPort, "--genesis", "../conf/genesis.json") rollupApp.WaitExit() } diff --git a/rollup/tests/rollup_test.go b/rollup/tests/rollup_test.go index 4095e8fba..08f05b61b 100644 --- a/rollup/tests/rollup_test.go +++ b/rollup/tests/rollup_test.go @@ -4,15 +4,17 @@ import ( "context" "math/big" "testing" + "time" "github.com/scroll-tech/go-ethereum/common" gethTypes "github.com/scroll-tech/go-ethereum/core/types" + "github.com/scroll-tech/go-ethereum/params" "github.com/stretchr/testify/assert" "scroll-tech/common/database" "scroll-tech/common/types" + "scroll-tech/common/types/encoding" "scroll-tech/common/types/message" - "scroll-tech/common/utils" "scroll-tech/rollup/internal/config" "scroll-tech/rollup/internal/controller/relayer" @@ -27,9 +29,10 @@ func testCommitAndFinalizeGenesisBatch(t *testing.T) { prepareContracts(t) l2Cfg := rollupApp.Config.L2Config - l2Relayer, err := relayer.NewLayer2Relayer(context.Background(), l2Client, db, l2Cfg.RelayerConfig, true, relayer.ServiceTypeL2RollupRelayer, nil) + l2Relayer, err := relayer.NewLayer2Relayer(context.Background(), l2Client, db, l2Cfg.RelayerConfig, ¶ms.ChainConfig{}, true, relayer.ServiceTypeL2RollupRelayer, nil) assert.NoError(t, err) assert.NotNil(t, l2Relayer) + defer l2Relayer.StopSenders() genesisChunkHash := common.HexToHash("0x00e076380b00a3749816fcc9a2a576b529952ef463222a54544d21b7d434dfe1") chunkOrm := orm.NewChunk(db) @@ -56,32 +59,34 @@ func testCommitBatchAndFinalizeBatch(t *testing.T) { // Create L2Relayer l2Cfg := rollupApp.Config.L2Config - l2Relayer, err := relayer.NewLayer2Relayer(context.Background(), l2Client, db, l2Cfg.RelayerConfig, false, relayer.ServiceTypeL2RollupRelayer, nil) + l2Relayer, err := relayer.NewLayer2Relayer(context.Background(), l2Client, db, l2Cfg.RelayerConfig, ¶ms.ChainConfig{}, true, relayer.ServiceTypeL2RollupRelayer, nil) assert.NoError(t, err) + defer l2Relayer.StopSenders() // Create L1Watcher l1Cfg := rollupApp.Config.L1Config l1Watcher := watcher.NewL1WatcherClient(context.Background(), l1Client, 0, l1Cfg.Confirmations, l1Cfg.L1MessageQueueAddress, l1Cfg.ScrollChainContractAddress, db, nil) // add some blocks to db - var wrappedBlocks []*types.WrappedBlock - for i := 0; i < 10; i++ { + var blocks []*encoding.Block + for i := int64(0); i < 10; i++ { header := gethTypes.Header{ - Number: big.NewInt(int64(i)), + Number: big.NewInt(i + 1), ParentHash: common.Hash{}, Difficulty: big.NewInt(0), BaseFee: big.NewInt(0), + Root: common.HexToHash("0x1"), } - wrappedBlocks = append(wrappedBlocks, &types.WrappedBlock{ + blocks = append(blocks, &encoding.Block{ Header: &header, Transactions: nil, - WithdrawRoot: common.Hash{}, + WithdrawRoot: common.HexToHash("0x2"), RowConsumption: &gethTypes.RowConsumption{}, }) } l2BlockOrm := orm.NewL2Block(db) - err = l2BlockOrm.InsertL2Blocks(context.Background(), wrappedBlocks) + err = l2BlockOrm.InsertL2Blocks(context.Background(), blocks) assert.NoError(t, err) cp := watcher.NewChunkProposer(context.Background(), &config.ChunkProposerConfig{ @@ -91,7 +96,15 @@ func testCommitBatchAndFinalizeBatch(t *testing.T) { MaxL1CommitCalldataSizePerChunk: 1000000, MaxRowConsumptionPerChunk: 1048319, ChunkTimeoutSec: 300, - }, db, nil) + }, ¶ms.ChainConfig{}, db, nil) + + bp := watcher.NewBatchProposer(context.Background(), &config.BatchProposerConfig{ + MaxChunkNumPerBatch: 10, + MaxL1CommitGasPerBatch: 50000000000, + MaxL1CommitCalldataSizePerBatch: 1000000, + BatchTimeoutSec: 300, + }, ¶ms.ChainConfig{}, db, nil) + cp.TryProposeChunk() batchOrm := orm.NewBatch(db) @@ -103,76 +116,318 @@ func testCommitBatchAndFinalizeBatch(t *testing.T) { assert.NoError(t, err) assert.Len(t, chunks, 1) - bp := watcher.NewBatchProposer(context.Background(), &config.BatchProposerConfig{ - MaxChunkNumPerBatch: 10, - MaxL1CommitGasPerBatch: 50000000000, - MaxL1CommitCalldataSizePerBatch: 1000000, - BatchTimeoutSec: 300, - }, db, nil) bp.TryProposeBatch() l2Relayer.ProcessPendingBatches() - batch, err := batchOrm.GetLatestBatch(context.Background()) assert.NoError(t, err) assert.NotNil(t, batch) - batchHash := batch.Hash - assert.NotEmpty(t, batch.CommitTxHash) - assert.Equal(t, types.RollupCommitting, types.RollupStatus(batch.RollupStatus)) - - success := utils.TryTimes(30, func() bool { - var receipt *gethTypes.Receipt - receipt, err = l1Client.TransactionReceipt(context.Background(), common.HexToHash(batch.CommitTxHash)) - return err == nil && receipt.Status == 1 - }) - assert.True(t, success) // fetch rollup events - success = utils.TryTimes(30, func() bool { + assert.Eventually(t, func() bool { err = l1Watcher.FetchContractEvent() assert.NoError(t, err) var statuses []types.RollupStatus - statuses, err = batchOrm.GetRollupStatusByHashList(context.Background(), []string{batchHash}) + statuses, err = batchOrm.GetRollupStatusByHashList(context.Background(), []string{batch.Hash}) return err == nil && len(statuses) == 1 && types.RollupCommitted == statuses[0] - }) - assert.True(t, success) + }, 30*time.Second, time.Second) + + assert.Eventually(t, func() bool { + batch, err = batchOrm.GetLatestBatch(context.Background()) + assert.NoError(t, err) + assert.NotNil(t, batch) + assert.NotEmpty(t, batch.CommitTxHash) + var receipt *gethTypes.Receipt + receipt, err = l1Client.TransactionReceipt(context.Background(), common.HexToHash(batch.CommitTxHash)) + return err == nil && receipt.Status == gethTypes.ReceiptStatusSuccessful + }, 30*time.Second, time.Second) // add dummy proof proof := &message.BatchProof{ Proof: []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}, } - err = batchOrm.UpdateProofByHash(context.Background(), batchHash, proof, 100) + err = batchOrm.UpdateProofByHash(context.Background(), batch.Hash, proof, 100) assert.NoError(t, err) - err = batchOrm.UpdateProvingStatus(context.Background(), batchHash, types.ProvingTaskVerified) + err = batchOrm.UpdateProvingStatus(context.Background(), batch.Hash, types.ProvingTaskVerified) assert.NoError(t, err) // process committed batch and check status l2Relayer.ProcessCommittedBatches() - statuses, err := batchOrm.GetRollupStatusByHashList(context.Background(), []string{batchHash}) + statuses, err := batchOrm.GetRollupStatusByHashList(context.Background(), []string{batch.Hash}) assert.NoError(t, err) assert.Equal(t, 1, len(statuses)) assert.Equal(t, types.RollupFinalizing, statuses[0]) - batch, err = batchOrm.GetLatestBatch(context.Background()) - assert.NoError(t, err) - assert.NotNil(t, batch) - assert.NotEmpty(t, batch.FinalizeTxHash) - - success = utils.TryTimes(30, func() bool { - var receipt *gethTypes.Receipt - receipt, err = l1Client.TransactionReceipt(context.Background(), common.HexToHash(batch.FinalizeTxHash)) - return err == nil && receipt.Status == 1 - }) - assert.True(t, success) - // fetch rollup events - success = utils.TryTimes(30, func() bool { + assert.Eventually(t, func() bool { err = l1Watcher.FetchContractEvent() assert.NoError(t, err) var statuses []types.RollupStatus - statuses, err = batchOrm.GetRollupStatusByHashList(context.Background(), []string{batchHash}) + statuses, err = batchOrm.GetRollupStatusByHashList(context.Background(), []string{batch.Hash}) return err == nil && len(statuses) == 1 && types.RollupFinalized == statuses[0] - }) - assert.True(t, success) + }, 30*time.Second, time.Second) + + assert.Eventually(t, func() bool { + batch, err = batchOrm.GetLatestBatch(context.Background()) + assert.NoError(t, err) + assert.NotNil(t, batch) + assert.NotEmpty(t, batch.FinalizeTxHash) + var receipt *gethTypes.Receipt + receipt, err = l1Client.TransactionReceipt(context.Background(), common.HexToHash(batch.FinalizeTxHash)) + return err == nil && receipt.Status == gethTypes.ReceiptStatusSuccessful + }, 30*time.Second, time.Second) +} + +func testCommitBatchAndFinalizeBatch4844(t *testing.T) { + db := setupDB(t) + defer database.CloseDB(db) + + prepareContracts(t) + + // Create L2Relayer + l2Cfg := rollupApp.Config.L2Config + chainConfig := ¶ms.ChainConfig{BernoulliBlock: big.NewInt(0)} + l2Relayer, err := relayer.NewLayer2Relayer(context.Background(), l2Client, db, l2Cfg.RelayerConfig, chainConfig, true, relayer.ServiceTypeL2RollupRelayer, nil) + assert.NoError(t, err) + defer l2Relayer.StopSenders() + + // Create L1Watcher + l1Cfg := rollupApp.Config.L1Config + l1Watcher := watcher.NewL1WatcherClient(context.Background(), l1Client, 0, l1Cfg.Confirmations, l1Cfg.L1MessageQueueAddress, l1Cfg.ScrollChainContractAddress, db, nil) + + // add some blocks to db + var blocks []*encoding.Block + for i := int64(0); i < 10; i++ { + header := gethTypes.Header{ + Number: big.NewInt(i + 1), + ParentHash: common.Hash{}, + Difficulty: big.NewInt(0), + BaseFee: big.NewInt(0), + Root: common.HexToHash("0x1"), + } + blocks = append(blocks, &encoding.Block{ + Header: &header, + Transactions: nil, + WithdrawRoot: common.HexToHash("0x2"), + RowConsumption: &gethTypes.RowConsumption{}, + }) + } + + l2BlockOrm := orm.NewL2Block(db) + err = l2BlockOrm.InsertL2Blocks(context.Background(), blocks) + assert.NoError(t, err) + + cp := watcher.NewChunkProposer(context.Background(), &config.ChunkProposerConfig{ + MaxBlockNumPerChunk: 100, + MaxTxNumPerChunk: 10000, + MaxL1CommitGasPerChunk: 1, + MaxL1CommitCalldataSizePerChunk: 1, + MaxRowConsumptionPerChunk: 1048319, + ChunkTimeoutSec: 300, + }, chainConfig, db, nil) + + bp := watcher.NewBatchProposer(context.Background(), &config.BatchProposerConfig{ + MaxChunkNumPerBatch: 10, + MaxL1CommitGasPerBatch: 1, + MaxL1CommitCalldataSizePerBatch: 1, + BatchTimeoutSec: 300, + }, chainConfig, db, nil) + + cp.TryProposeChunk() + + batchOrm := orm.NewBatch(db) + unbatchedChunkIndex, err := batchOrm.GetFirstUnbatchedChunkIndex(context.Background()) + assert.NoError(t, err) + + chunkOrm := orm.NewChunk(db) + chunks, err := chunkOrm.GetChunksGEIndex(context.Background(), unbatchedChunkIndex, 0) + assert.NoError(t, err) + assert.Len(t, chunks, 1) + + bp.TryProposeBatch() + + l2Relayer.ProcessPendingBatches() + batch, err := batchOrm.GetLatestBatch(context.Background()) + assert.NoError(t, err) + assert.NotNil(t, batch) + + // fetch rollup events + assert.Eventually(t, func() bool { + err = l1Watcher.FetchContractEvent() + assert.NoError(t, err) + var statuses []types.RollupStatus + statuses, err = batchOrm.GetRollupStatusByHashList(context.Background(), []string{batch.Hash}) + return err == nil && len(statuses) == 1 && types.RollupCommitted == statuses[0] + }, 30*time.Second, time.Second) + + assert.Eventually(t, func() bool { + batch, err = batchOrm.GetLatestBatch(context.Background()) + assert.NoError(t, err) + assert.NotNil(t, batch) + assert.NotEmpty(t, batch.CommitTxHash) + var receipt *gethTypes.Receipt + receipt, err = l1Client.TransactionReceipt(context.Background(), common.HexToHash(batch.CommitTxHash)) + return err == nil && receipt.Status == gethTypes.ReceiptStatusSuccessful + }, 30*time.Second, time.Second) + + // add dummy proof + proof := &message.BatchProof{ + Proof: []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}, + } + err = batchOrm.UpdateProofByHash(context.Background(), batch.Hash, proof, 100) + assert.NoError(t, err) + err = batchOrm.UpdateProvingStatus(context.Background(), batch.Hash, types.ProvingTaskVerified) + assert.NoError(t, err) + + // process committed batch and check status + l2Relayer.ProcessCommittedBatches() + + statuses, err := batchOrm.GetRollupStatusByHashList(context.Background(), []string{batch.Hash}) + assert.NoError(t, err) + assert.Equal(t, 1, len(statuses)) + assert.Equal(t, types.RollupFinalizing, statuses[0]) + + // fetch rollup events + assert.Eventually(t, func() bool { + err = l1Watcher.FetchContractEvent() + assert.NoError(t, err) + var statuses []types.RollupStatus + statuses, err = batchOrm.GetRollupStatusByHashList(context.Background(), []string{batch.Hash}) + return err == nil && len(statuses) == 1 && types.RollupFinalized == statuses[0] + }, 30*time.Second, time.Second) + + assert.Eventually(t, func() bool { + batch, err = batchOrm.GetLatestBatch(context.Background()) + assert.NoError(t, err) + assert.NotNil(t, batch) + assert.NotEmpty(t, batch.FinalizeTxHash) + var receipt *gethTypes.Receipt + receipt, err = l1Client.TransactionReceipt(context.Background(), common.HexToHash(batch.FinalizeTxHash)) + return err == nil && receipt.Status == gethTypes.ReceiptStatusSuccessful + }, 30*time.Second, time.Second) +} + +func testCommitBatchAndFinalizeBatchBeforeAndPost4844(t *testing.T) { + db := setupDB(t) + defer database.CloseDB(db) + + prepareContracts(t) + + // Create L2Relayer + l2Cfg := rollupApp.Config.L2Config + chainConfig := ¶ms.ChainConfig{BernoulliBlock: big.NewInt(5)} + l2Relayer, err := relayer.NewLayer2Relayer(context.Background(), l2Client, db, l2Cfg.RelayerConfig, chainConfig, true, relayer.ServiceTypeL2RollupRelayer, nil) + assert.NoError(t, err) + defer l2Relayer.StopSenders() + + // Create L1Watcher + l1Cfg := rollupApp.Config.L1Config + l1Watcher := watcher.NewL1WatcherClient(context.Background(), l1Client, 0, l1Cfg.Confirmations, l1Cfg.L1MessageQueueAddress, l1Cfg.ScrollChainContractAddress, db, nil) + + // add some blocks to db + var blocks []*encoding.Block + for i := int64(0); i < 10; i++ { + header := gethTypes.Header{ + Number: big.NewInt(i + 1), + ParentHash: common.Hash{}, + Difficulty: big.NewInt(0), + BaseFee: big.NewInt(0), + Root: common.HexToHash("0x1"), + } + blocks = append(blocks, &encoding.Block{ + Header: &header, + Transactions: nil, + WithdrawRoot: common.HexToHash("0x2"), + RowConsumption: &gethTypes.RowConsumption{}, + }) + } + + l2BlockOrm := orm.NewL2Block(db) + err = l2BlockOrm.InsertL2Blocks(context.Background(), blocks) + assert.NoError(t, err) + + cp := watcher.NewChunkProposer(context.Background(), &config.ChunkProposerConfig{ + MaxBlockNumPerChunk: 100, + MaxTxNumPerChunk: 10000, + MaxL1CommitGasPerChunk: 50000000000, + MaxL1CommitCalldataSizePerChunk: 1000000, + MaxRowConsumptionPerChunk: 1048319, + ChunkTimeoutSec: 300, + }, chainConfig, db, nil) + + bp := watcher.NewBatchProposer(context.Background(), &config.BatchProposerConfig{ + MaxChunkNumPerBatch: 10, + MaxL1CommitGasPerBatch: 50000000000, + MaxL1CommitCalldataSizePerBatch: 1000000, + BatchTimeoutSec: 300, + }, chainConfig, db, nil) + + cp.TryProposeChunk() + cp.TryProposeChunk() + bp.TryProposeBatch() + bp.TryProposeBatch() + + for i := uint64(0); i < 2; i++ { + l2Relayer.ProcessPendingBatches() + batchOrm := orm.NewBatch(db) + batch, err := batchOrm.GetBatchByIndex(context.Background(), i+1) + assert.NoError(t, err) + assert.NotNil(t, batch) + + // fetch rollup events + assert.Eventually(t, func() bool { + err = l1Watcher.FetchContractEvent() + assert.NoError(t, err) + var statuses []types.RollupStatus + statuses, err = batchOrm.GetRollupStatusByHashList(context.Background(), []string{batch.Hash}) + return err == nil && len(statuses) == 1 && types.RollupCommitted == statuses[0] + }, 30*time.Second, time.Second) + + assert.Eventually(t, func() bool { + batch, err = batchOrm.GetBatchByIndex(context.Background(), i+1) + assert.NoError(t, err) + assert.NotNil(t, batch) + assert.NotEmpty(t, batch.CommitTxHash) + var receipt *gethTypes.Receipt + receipt, err = l1Client.TransactionReceipt(context.Background(), common.HexToHash(batch.CommitTxHash)) + return err == nil && receipt.Status == gethTypes.ReceiptStatusSuccessful + }, 30*time.Second, time.Second) + + // add dummy proof + proof := &message.BatchProof{ + Proof: []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}, + } + err = batchOrm.UpdateProofByHash(context.Background(), batch.Hash, proof, 100) + assert.NoError(t, err) + err = batchOrm.UpdateProvingStatus(context.Background(), batch.Hash, types.ProvingTaskVerified) + assert.NoError(t, err) + + // process committed batch and check status + l2Relayer.ProcessCommittedBatches() + + statuses, err := batchOrm.GetRollupStatusByHashList(context.Background(), []string{batch.Hash}) + assert.NoError(t, err) + assert.Equal(t, 1, len(statuses)) + assert.Equal(t, types.RollupFinalizing, statuses[0]) + + // fetch rollup events + assert.Eventually(t, func() bool { + err = l1Watcher.FetchContractEvent() + assert.NoError(t, err) + var statuses []types.RollupStatus + statuses, err = batchOrm.GetRollupStatusByHashList(context.Background(), []string{batch.Hash}) + return err == nil && len(statuses) == 1 && types.RollupFinalized == statuses[0] + }, 30*time.Second, time.Second) + + assert.Eventually(t, func() bool { + batch, err = batchOrm.GetBatchByIndex(context.Background(), i+1) + assert.NoError(t, err) + assert.NotNil(t, batch) + assert.NotEmpty(t, batch.FinalizeTxHash) + var receipt *gethTypes.Receipt + receipt, err = l1Client.TransactionReceipt(context.Background(), common.HexToHash(batch.FinalizeTxHash)) + return err == nil && receipt.Status == gethTypes.ReceiptStatusSuccessful + }, 30*time.Second, time.Second) + } } diff --git a/tests/integration-test/contracts_test.go b/tests/integration-test/contracts_test.go index 3d1be7d4f..40fbbaa55 100644 --- a/tests/integration-test/contracts_test.go +++ b/tests/integration-test/contracts_test.go @@ -20,11 +20,11 @@ var ( greeterAddress = common.HexToAddress("0x7363726f6c6c6c20000000000000000000000015") ) -func TestERC20(t *testing.T) { - base.RunL2Geth(t) +func testERC20(t *testing.T) { + assert.NoError(t, testApps.StartL2GethContainer()) time.Sleep(time.Second * 3) - l2Cli, err := base.L2Client() + l2Cli, err := testApps.GetL2GethClient() assert.Nil(t, err) token, err := erc20.NewERC20Mock(erc20Address, l2Cli) @@ -32,7 +32,9 @@ func TestERC20(t *testing.T) { privKey, err := crypto.ToECDSA(common.FromHex("1212121212121212121212121212121212121212121212121212121212121212")) assert.NoError(t, err) - auth, err := bind.NewKeyedTransactorWithChainID(privKey, base.L2gethImg.ChainID()) + chainID, err := l2Cli.ChainID(context.Background()) + assert.NoError(t, err) + auth, err := bind.NewKeyedTransactorWithChainID(privKey, chainID) assert.NoError(t, err) authBls0, err := token.BalanceOf(nil, auth.From) @@ -45,7 +47,8 @@ func TestERC20(t *testing.T) { value := big.NewInt(1000) tx, err := token.Transfer(auth, erc20Address, value) assert.NoError(t, err) - bind.WaitMined(context.Background(), l2Cli, tx) + _, err = bind.WaitMined(context.Background(), l2Cli, tx) + assert.NoError(t, err) authBls1, err := token.BalanceOf(nil, auth.From) assert.NoError(t, err) @@ -58,12 +61,14 @@ func TestERC20(t *testing.T) { assert.Equal(t, tokenBls1.Int64(), tokenBls0.Add(tokenBls0, value).Int64()) } -func TestGreeter(t *testing.T) { - base.RunL2Geth(t) - l2Cli, err := base.L2Client() +func testGreeter(t *testing.T) { + assert.NoError(t, testApps.StartL2GethContainer()) + l2Cli, err := testApps.GetL2GethClient() assert.Nil(t, err) - auth, err := bind.NewKeyedTransactorWithChainID(rollupApp.Config.L2Config.RelayerConfig.CommitSenderPrivateKey, base.L2gethImg.ChainID()) + chainID, err := l2Cli.ChainID(context.Background()) + assert.NoError(t, err) + auth, err := bind.NewKeyedTransactorWithChainID(rollupApp.Config.L2Config.RelayerConfig.CommitSenderPrivateKey, chainID) assert.NoError(t, err) token, err := greeter.NewGreeter(greeterAddress, l2Cli) diff --git a/tests/integration-test/genesis.json b/tests/integration-test/genesis.json new file mode 100644 index 000000000..b1887cb07 --- /dev/null +++ b/tests/integration-test/genesis.json @@ -0,0 +1,69 @@ +{ + "config": { + "chainId": 53077, + "homesteadBlock": 1, + "eip150Block": 0, + "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 2, + "berlinBlock": 0, + "londonBlock": 0, + "archimedesBlock": 0, + "shanghaiBlock": 0, + "clique": { + "period": 3, + "epoch": 30000 + }, + "scroll": { + "useZktrie": true, + "maxTxPerBlock": 44, + "maxTxPayloadBytesPerBlock": 122880, + "feeVaultAddress": "0x5300000000000000000000000000000000000005", + "enableEIP2718": false, + "enableEIP1559": false + } + }, + "nonce": "0x0", + "timestamp": "0x61bc34a0", + "extraData": "0x00000000000000000000000000000000000000000000000000000000000000001c5a77d9fa7ef466951b2f01f724bca3a5820b630000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "gasLimit": "8000000", + "difficulty": "0x1", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "coinbase": "0x0000000000000000000000000000000000000000", + "alloc": { + "03a1bba60b5aa37094cf16123add674c01589488": { + "balance": "0x200000000000000000000000000000000000000000000000000000000000000" + }, + "1c5a77d9fa7ef466951b2f01f724bca3a5820b63": { + "balance": "0x200000000000000000000000000000000000000000000000000000000000000" + }, + "1e32abcfe6db15c1570709e3fc02725335f50a47": { + "balance": "0x200000000000000000000000000000000000000000000000000000000000000" + }, + "7363726f6c6c6c20000000000000000000000014": { + "code": "0x608060405234801561001057600080fd5b50600436106100f55760003560e01c806340c10f19116100975780639dc29fac116100665780639dc29fac14610286578063a457c2d7146102a2578063a9059cbb146102d2578063dd62ed3e14610302576100f5565b806340c10f191461020057806356189cb41461021c57806370a082311461023857806395d89b4114610268576100f5565b8063222f5be0116100d3578063222f5be01461016657806323b872dd14610182578063313ce567146101b257806339509351146101d0576100f5565b806306fdde03146100fa578063095ea7b31461011857806318160ddd14610148575b600080fd5b610102610332565b60405161010f9190610f27565b60405180910390f35b610132600480360381019061012d9190610fe2565b6103c4565b60405161013f919061103d565b60405180910390f35b6101506103e7565b60405161015d9190611067565b60405180910390f35b610180600480360381019061017b9190611082565b6103f1565b005b61019c60048036038101906101979190611082565b610401565b6040516101a9919061103d565b60405180910390f35b6101ba610430565b6040516101c791906110f1565b60405180910390f35b6101ea60048036038101906101e59190610fe2565b610439565b6040516101f7919061103d565b60405180910390f35b61021a60048036038101906102159190610fe2565b610470565b005b61023660048036038101906102319190611082565b61047e565b005b610252600480360381019061024d919061110c565b61048e565b60405161025f9190611067565b60405180910390f35b6102706104d6565b60405161027d9190610f27565b60405180910390f35b6102a0600480360381019061029b9190610fe2565b610568565b005b6102bc60048036038101906102b79190610fe2565b610576565b6040516102c9919061103d565b60405180910390f35b6102ec60048036038101906102e79190610fe2565b6105ed565b6040516102f9919061103d565b60405180910390f35b61031c60048036038101906103179190611139565b610610565b6040516103299190611067565b60405180910390f35b606060038054610341906111a8565b80601f016020809104026020016040519081016040528092919081815260200182805461036d906111a8565b80156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b5050505050905090565b6000806103cf610697565b90506103dc81858561069f565b600191505092915050565b6000600254905090565b6103fc838383610868565b505050565b60008061040c610697565b9050610419858285610ade565b610424858585610868565b60019150509392505050565b60006012905090565b600080610444610697565b90506104658185856104568589610610565b6104609190611208565b61069f565b600191505092915050565b61047a8282610b6a565b5050565b61048983838361069f565b505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600480546104e5906111a8565b80601f0160208091040260200160405190810160405280929190818152602001828054610511906111a8565b801561055e5780601f106105335761010080835404028352916020019161055e565b820191906000526020600020905b81548152906001019060200180831161054157829003601f168201915b5050505050905090565b6105728282610cc0565b5050565b600080610581610697565b9050600061058f8286610610565b9050838110156105d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105cb906112ae565b60405180910390fd5b6105e1828686840361069f565b60019250505092915050565b6000806105f8610697565b9050610605818585610868565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361070e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070590611340565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361077d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610774906113d2565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161085b9190611067565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ce90611464565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093d906114f6565b60405180910390fd5b610951838383610e8d565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156109d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ce90611588565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610ac59190611067565b60405180910390a3610ad8848484610e92565b50505050565b6000610aea8484610610565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610b645781811015610b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4d906115f4565b60405180910390fd5b610b63848484840361069f565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd090611660565b60405180910390fd5b610be560008383610e8d565b8060026000828254610bf79190611208565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610ca89190611067565b60405180910390a3610cbc60008383610e92565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d26906116f2565b60405180910390fd5b610d3b82600083610e8d565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db890611784565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e749190611067565b60405180910390a3610e8883600084610e92565b505050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610ed1578082015181840152602081019050610eb6565b60008484015250505050565b6000601f19601f8301169050919050565b6000610ef982610e97565b610f038185610ea2565b9350610f13818560208601610eb3565b610f1c81610edd565b840191505092915050565b60006020820190508181036000830152610f418184610eee565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610f7982610f4e565b9050919050565b610f8981610f6e565b8114610f9457600080fd5b50565b600081359050610fa681610f80565b92915050565b6000819050919050565b610fbf81610fac565b8114610fca57600080fd5b50565b600081359050610fdc81610fb6565b92915050565b60008060408385031215610ff957610ff8610f49565b5b600061100785828601610f97565b925050602061101885828601610fcd565b9150509250929050565b60008115159050919050565b61103781611022565b82525050565b6000602082019050611052600083018461102e565b92915050565b61106181610fac565b82525050565b600060208201905061107c6000830184611058565b92915050565b60008060006060848603121561109b5761109a610f49565b5b60006110a986828701610f97565b93505060206110ba86828701610f97565b92505060406110cb86828701610fcd565b9150509250925092565b600060ff82169050919050565b6110eb816110d5565b82525050565b600060208201905061110660008301846110e2565b92915050565b60006020828403121561112257611121610f49565b5b600061113084828501610f97565b91505092915050565b600080604083850312156111505761114f610f49565b5b600061115e85828601610f97565b925050602061116f85828601610f97565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806111c057607f821691505b6020821081036111d3576111d2611179565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061121382610fac565b915061121e83610fac565b9250828201905080821115611236576112356111d9565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000611298602583610ea2565b91506112a38261123c565b604082019050919050565b600060208201905081810360008301526112c78161128b565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061132a602483610ea2565b9150611335826112ce565b604082019050919050565b600060208201905081810360008301526113598161131d565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006113bc602283610ea2565b91506113c782611360565b604082019050919050565b600060208201905081810360008301526113eb816113af565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061144e602583610ea2565b9150611459826113f2565b604082019050919050565b6000602082019050818103600083015261147d81611441565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006114e0602383610ea2565b91506114eb82611484565b604082019050919050565b6000602082019050818103600083015261150f816114d3565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000611572602683610ea2565b915061157d82611516565b604082019050919050565b600060208201905081810360008301526115a181611565565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006115de601d83610ea2565b91506115e9826115a8565b602082019050919050565b6000602082019050818103600083015261160d816115d1565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600061164a601f83610ea2565b915061165582611614565b602082019050919050565b600060208201905081810360008301526116798161163d565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006116dc602183610ea2565b91506116e782611680565b604082019050919050565b6000602082019050818103600083015261170b816116cf565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061176e602283610ea2565b915061177982611712565b604082019050919050565b6000602082019050818103600083015261179d81611761565b905091905056fea26469706673582212206a0466cc8279c36801cc7618e809890da047e4518cddd96836b2e2250be5535764736f6c63430008100033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000204fce5e3e25020000000000", + "0x0000000000000000000000000000000000000000000000000000000000000003": "0x4554480000000000000000000000000000000000000000000000000000000006", + "0x0000000000000000000000000000000000000000000000000000000000000004": "0x45544820636f696e000000000000000000000000000000000000000000000010", + "0x62a9a27ba8ad7d7d9c6567de722ea497f95a95e67f937096a94d55dbefc0109b": "0x0000000000000000000000000000000000000000204fce5e3e25020000000000" + }, + "balance": "0x0" + }, + "7363726f6c6c6c20000000000000000000000015": { + "code": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806321848c46146100515780632e64cec11461006d578063b0f2b72a1461008b578063f3417673146100a7575b600080fd5b61006b6004803603810190610066919061013c565b6100c5565b005b6100756100da565b6040516100829190610178565b60405180910390f35b6100a560048036038101906100a0919061013c565b6100e3565b005b6100af6100ed565b6040516100bc9190610178565b60405180910390f35b8060008190555060006100d757600080fd5b50565b60008054905090565b8060008190555050565b6000806100f957600080fd5b600054905090565b600080fd5b6000819050919050565b61011981610106565b811461012457600080fd5b50565b60008135905061013681610110565b92915050565b60006020828403121561015257610151610101565b5b600061016084828501610127565b91505092915050565b61017281610106565b82525050565b600060208201905061018d6000830184610169565b9291505056fea2646970667358221220413877599bcbec5f450129f8e1933af2bd0fcc9934b4647a75fe0079cde3c55764736f6c63430008100033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000000000000000000000000000000000000010000" + }, + "balance": "0x0" + } + }, + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "baseFeePerGas": null +} diff --git a/tests/integration-test/go.mod b/tests/integration-test/go.mod index be8083f43..09cd14f4b 100644 --- a/tests/integration-test/go.mod +++ b/tests/integration-test/go.mod @@ -1,41 +1,49 @@ module scroll-tech/integration-test -go 1.20 +go 1.21 require ( - github.com/scroll-tech/go-ethereum v1.10.14-0.20231130005111-38a3a9c9198c - github.com/stretchr/testify v1.8.4 + github.com/scroll-tech/go-ethereum v1.10.14-0.20240326144132-0f0cd99f7a2e + github.com/stretchr/testify v1.9.0 gorm.io/gorm v1.25.5 ) require ( github.com/VictoriaMetrics/fastcache v1.12.1 // indirect + github.com/bits-and-blooms/bitset v1.12.0 // indirect github.com/btcsuite/btcd v0.20.1-beta // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/crate-crypto/go-kzg-4844 v0.7.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/deckarep/golang-set v1.8.0 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect + github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/google/uuid v1.4.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/holiman/uint256 v1.2.4 // indirect github.com/iden3/go-iden3-crypto v0.0.15 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect - github.com/kr/pretty v0.3.1 // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rivo/uniseg v0.4.4 // indirect github.com/rjeczalik/notify v0.9.1 // indirect github.com/rogpeppe/go-internal v1.10.0 // indirect github.com/scroll-tech/zktrie v0.7.1 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect + github.com/supranational/blst v0.3.11-0.20230124161941-ca03e11a3ff2 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect - golang.org/x/crypto v0.16.0 // indirect - golang.org/x/sys v0.15.0 // indirect - gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect + golang.org/x/crypto v0.17.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.17.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/tests/integration-test/go.sum b/tests/integration-test/go.sum index 817ddd9ef..93e731e56 100644 --- a/tests/integration-test/go.sum +++ b/tests/integration-test/go.sum @@ -2,6 +2,8 @@ github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bw github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/bits-and-blooms/bitset v1.12.0 h1:U/q1fAF7xXRhFCrhROzIfffYnu+dlS38vCZtmFVPHmA= +github.com/bits-and-blooms/bitset v1.12.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd v0.20.1-beta h1:Ik4hyJqN8Jfyv3S4AGBOmyouMsYE3EdYODkMbQjwPGw= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= @@ -12,8 +14,15 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= +github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= +github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA= +github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -22,21 +31,28 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4 h1:B2mpK+MNqgPqk2/KNi1LbqwtZDy5F7iy0mynQiBr8VA= +github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4/go.mod h1:y4GA2JbAUama1S4QwYjC2hefgGLU8Ul0GMtL/ADMF1c= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= +github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= @@ -49,44 +65,49 @@ github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE= github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/scroll-tech/go-ethereum v1.10.14-0.20231130005111-38a3a9c9198c h1:MnAdt80steCDli4SAD0J0spBGNY+gQvbdptNjWztHcw= -github.com/scroll-tech/go-ethereum v1.10.14-0.20231130005111-38a3a9c9198c/go.mod h1:4HrFcoStbViFVy/9l/rvKl1XmizVAaPdgqI8v0U8hOc= +github.com/scroll-tech/go-ethereum v1.10.14-0.20240326144132-0f0cd99f7a2e h1:FcoK0rykAWI+5E7cQM6ALRLd5CmjBTHRvJztRBH2xeM= +github.com/scroll-tech/go-ethereum v1.10.14-0.20240326144132-0f0cd99f7a2e/go.mod h1:7Rz2bh9pn42rGuxjh51CG7HL9SKMG3ZugJkL3emdZx8= github.com/scroll-tech/zktrie v0.7.1 h1:NrmZNjuBzsbrKePqdHDG+t2cXnimbtezPAFS0+L9ElE= github.com/scroll-tech/zktrie v0.7.1/go.mod h1:XvNo7vAk8yxNyTjBDj5WIiFzYW4bx/gJ78+NK6Zn6Uk= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/supranational/blst v0.3.11-0.20230124161941-ca03e11a3ff2 h1:wh1wzwAhZBNiZO37uWS/nDaKiIwHz4mDo4pnA+fqTO0= +github.com/supranational/blst v0.3.11-0.20230124161941-ca03e11a3ff2/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= +github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= @@ -94,17 +115,20 @@ github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9f github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= @@ -114,7 +138,11 @@ gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7 gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls= gorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/tests/integration-test/integration_test.go b/tests/integration-test/integration_test.go index e15a5cccb..a62749934 100644 --- a/tests/integration-test/integration_test.go +++ b/tests/integration-test/integration_test.go @@ -10,52 +10,63 @@ import ( "github.com/scroll-tech/go-ethereum/common" gethTypes "github.com/scroll-tech/go-ethereum/core/types" "github.com/stretchr/testify/assert" + "gorm.io/gorm" - "scroll-tech/integration-test/orm" - - rapp "scroll-tech/prover/cmd/app" - - "scroll-tech/database/migrate" - - capp "scroll-tech/coordinator/cmd/api/app" - - "scroll-tech/common/database" - "scroll-tech/common/docker" - "scroll-tech/common/types" + "scroll-tech/common/testcontainers" + "scroll-tech/common/types/encoding" "scroll-tech/common/utils" "scroll-tech/common/version" - + capp "scroll-tech/coordinator/cmd/api/app" + "scroll-tech/database/migrate" + "scroll-tech/integration-test/orm" + rapp "scroll-tech/prover/cmd/app" bcmd "scroll-tech/rollup/cmd" ) var ( - base *docker.App + testApps *testcontainers.TestcontainerApps rollupApp *bcmd.MockApp ) func TestMain(m *testing.M) { - base = docker.NewDockerApp() - rollupApp = bcmd.NewRollupApp(base, "../../rollup/conf/config.json") + defer func() { + if testApps != nil { + testApps.Free() + } + if rollupApp != nil { + rollupApp.Free() + } + }() m.Run() - rollupApp.Free() - base.Free() } -func TestCoordinatorProverInteraction(t *testing.T) { - // Start postgres docker containers - base.RunL2Geth(t) - base.RunDBImage(t) +func setupEnv(t *testing.T) { + testApps = testcontainers.NewTestcontainerApps() + assert.NoError(t, testApps.StartPostgresContainer()) + assert.NoError(t, testApps.StartL1GethContainer()) + assert.NoError(t, testApps.StartL2GethContainer()) + rollupApp = bcmd.NewRollupApp(testApps, "../../rollup/conf/config.json") +} - // Init data - dbCfg := &database.Config{ - DSN: base.DBConfig.DSN, - DriverName: base.DBConfig.DriverName, - MaxOpenNum: base.DBConfig.MaxOpenNum, - MaxIdleNum: base.DBConfig.MaxIdleNum, - } +func TestFunction(t *testing.T) { + setupEnv(t) + t.Run("TestCoordinatorProverInteraction", testCoordinatorProverInteraction) + t.Run("TestProverReLogin", testProverReLogin) + t.Run("TestERC20", testERC20) + t.Run("TestGreeter", testGreeter) +} - db, err := database.InitDB(dbCfg) +func setupDB(t *testing.T) *gorm.DB { + db, err := testApps.GetGormDBClient() assert.NoError(t, err) + sqlDB, err := db.DB() + assert.NoError(t, err) + assert.NoError(t, migrate.ResetDB(sqlDB)) + return db +} + +func testCoordinatorProverInteraction(t *testing.T) { + db := setupDB(t) sqlDB, err := db.DB() assert.NoError(t, err) @@ -66,7 +77,7 @@ func TestCoordinatorProverInteraction(t *testing.T) { l2BlockOrm := orm.NewL2Block(db) // Connect to l2geth client - l2Client, err := base.L2Client() + l2Client, err := testApps.GetL2GethClient() if err != nil { log.Fatalf("Failed to connect to the l2geth client: %v", err) } @@ -85,30 +96,35 @@ func TestCoordinatorProverInteraction(t *testing.T) { log.Fatalf("Failed to retrieve L2 genesis header after multiple attempts: %v", err) } - wrappedBlock := &types.WrappedBlock{ + block := &encoding.Block{ Header: header, Transactions: nil, WithdrawRoot: common.Hash{}, RowConsumption: &gethTypes.RowConsumption{}, } - chunk := &types.Chunk{Blocks: []*types.WrappedBlock{wrappedBlock}} + chunk := &encoding.Chunk{Blocks: []*encoding.Block{block}} + batch := &encoding.Batch{ + Index: 0, + TotalL1MessagePoppedBefore: 0, + ParentBatchHash: common.Hash{}, + Chunks: []*encoding.Chunk{chunk}, + } - err = l2BlockOrm.InsertL2Blocks(context.Background(), []*types.WrappedBlock{wrappedBlock}) + err = l2BlockOrm.InsertL2Blocks(context.Background(), []*encoding.Block{block}) assert.NoError(t, err) dbChunk, err := chunkOrm.InsertChunk(context.Background(), chunk) assert.NoError(t, err) err = l2BlockOrm.UpdateChunkHashInRange(context.Background(), 0, 100, dbChunk.Hash) assert.NoError(t, err) - batch, err := batchOrm.InsertBatch(context.Background(), 0, 0, dbChunk.Hash, dbChunk.Hash, []*types.Chunk{chunk}) + dbBatch, err := batchOrm.InsertBatch(context.Background(), batch) assert.NoError(t, err) - err = chunkOrm.UpdateBatchHashInRange(context.Background(), 0, 0, batch.Hash) + err = chunkOrm.UpdateBatchHashInRange(context.Background(), 0, 0, dbBatch.Hash) assert.NoError(t, err) t.Log(version.Version) - base.Timestamp = time.Now().Nanosecond() - coordinatorApp := capp.NewCoordinatorApp(base, "../../coordinator/conf/config.json") - chunkProverApp := rapp.NewProverApp(base, utils.ChunkProverApp, "../../prover/config.json", coordinatorApp.HTTPEndpoint()) - batchProverApp := rapp.NewProverApp(base, utils.BatchProverApp, "../../prover/config.json", coordinatorApp.HTTPEndpoint()) + coordinatorApp := capp.NewCoordinatorApp(testApps, "../../coordinator/conf/config.json", "./genesis.json") + chunkProverApp := rapp.NewProverApp(testApps, utils.ChunkProverApp, "../../prover/config.json", coordinatorApp.HTTPEndpoint()) + batchProverApp := rapp.NewProverApp(testApps, utils.BatchProverApp, "../../prover/config.json", coordinatorApp.HTTPEndpoint()) defer coordinatorApp.Free() defer chunkProverApp.Free() defer batchProverApp.Free() @@ -133,17 +149,16 @@ func TestCoordinatorProverInteraction(t *testing.T) { coordinatorApp.WaitExit() } -func TestProverReLogin(t *testing.T) { - // Start postgres docker containers. - base.RunL2Geth(t) - base.RunDBImage(t) +func testProverReLogin(t *testing.T) { + client, err := testApps.GetGormDBClient() + assert.NoError(t, err) + db, err := client.DB() + assert.NoError(t, err) + assert.NoError(t, migrate.ResetDB(db)) - assert.NoError(t, migrate.ResetDB(base.DBClient(t))) - - base.Timestamp = time.Now().Nanosecond() - coordinatorApp := capp.NewCoordinatorApp(base, "../../coordinator/conf/config.json") - chunkProverApp := rapp.NewProverApp(base, utils.ChunkProverApp, "../../prover/config.json", coordinatorApp.HTTPEndpoint()) - batchProverApp := rapp.NewProverApp(base, utils.BatchProverApp, "../../prover/config.json", coordinatorApp.HTTPEndpoint()) + coordinatorApp := capp.NewCoordinatorApp(testApps, "../../coordinator/conf/config.json", "./genesis.json") + chunkProverApp := rapp.NewProverApp(testApps, utils.ChunkProverApp, "../../prover/config.json", coordinatorApp.HTTPEndpoint()) + batchProverApp := rapp.NewProverApp(testApps, utils.BatchProverApp, "../../prover/config.json", coordinatorApp.HTTPEndpoint()) defer coordinatorApp.Free() defer chunkProverApp.Free() defer batchProverApp.Free() diff --git a/tests/integration-test/orm/batch.go b/tests/integration-test/orm/batch.go index 5bc6175df..e173e3a11 100644 --- a/tests/integration-test/orm/batch.go +++ b/tests/integration-test/orm/batch.go @@ -6,15 +6,14 @@ import ( "fmt" "time" - "github.com/scroll-tech/go-ethereum/common" "github.com/scroll-tech/go-ethereum/log" "gorm.io/gorm" "scroll-tech/common/types" + "scroll-tech/common/types/encoding" + "scroll-tech/common/types/encoding/codecv0" ) -const defaultBatchHeaderVersion = 0 - // Batch represents a batch of chunks. type Batch struct { db *gorm.DB `gorm:"column:-"` @@ -74,69 +73,92 @@ func (o *Batch) GetLatestBatch(ctx context.Context) (*Batch, error) { var latestBatch Batch if err := db.First(&latestBatch).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, nil + } return nil, fmt.Errorf("Batch.GetLatestBatch error: %w", err) } return &latestBatch, nil } // InsertBatch inserts a new batch into the database. -// for init data -func (o *Batch) InsertBatch(ctx context.Context, startChunkIndex, endChunkIndex uint64, startChunkHash, endChunkHash string, chunks []*types.Chunk, dbTX ...*gorm.DB) (*Batch, error) { - if len(chunks) == 0 { - return nil, errors.New("invalid args") +// for unit test +func (o *Batch) InsertBatch(ctx context.Context, batch *encoding.Batch, dbTX ...*gorm.DB) (*Batch, error) { + if batch == nil { + return nil, errors.New("invalid args: batch is nil") } - parentBatch, err := o.GetLatestBatch(ctx) - if err != nil && !errors.Is(errors.Unwrap(err), gorm.ErrRecordNotFound) { - log.Error("failed to get the latest batch", "err", err) + numChunks := uint64(len(batch.Chunks)) + if numChunks == 0 { + return nil, errors.New("invalid args: batch contains 0 chunk") + } + + daBatch, err := codecv0.NewDABatch(batch) + if err != nil { + log.Error("failed to create new DA batch", + "index", batch.Index, "total l1 message popped before", batch.TotalL1MessagePoppedBefore, + "parent hash", batch.ParentBatchHash, "number of chunks", numChunks, "err", err) return nil, err } - var batchIndex uint64 - var parentBatchHash common.Hash - var totalL1MessagePoppedBefore uint64 - var version uint8 = defaultBatchHeaderVersion + var startChunkIndex uint64 + parentBatch, err := o.GetLatestBatch(ctx) + if err != nil { + log.Error("failed to get latest batch", "index", batch.Index, "total l1 message popped before", batch.TotalL1MessagePoppedBefore, + "parent hash", batch.ParentBatchHash, "number of chunks", numChunks, "err", err) + return nil, fmt.Errorf("Batch.InsertBatch error: %w", err) + } // if parentBatch==nil then err==gorm.ErrRecordNotFound, which means there's - // not batch record in the db, we then use default empty values for the creating batch; - // if parentBatch!=nil then err=nil, then we fill the parentBatch-related data into the creating batch + // no batch record in the db, we then use default empty values for the creating batch; + // if parentBatch!=nil then err==nil, then we fill the parentBatch-related data into the creating batch if parentBatch != nil { - batchIndex = parentBatch.Index + 1 - parentBatchHash = common.HexToHash(parentBatch.Hash) - - var parentBatchHeader *types.BatchHeader - parentBatchHeader, err = types.DecodeBatchHeader(parentBatch.BatchHeader) - if err != nil { - log.Error("failed to decode parent batch header", "index", parentBatch.Index, "hash", parentBatch.Hash, "err", err) - return nil, err - } - - totalL1MessagePoppedBefore = parentBatchHeader.TotalL1MessagePopped() - version = parentBatchHeader.Version() + startChunkIndex = parentBatch.EndChunkIndex + 1 } - batchHeader, err := types.NewBatchHeader(version, batchIndex, totalL1MessagePoppedBefore, parentBatchHash, chunks) + startDAChunk, err := codecv0.NewDAChunk(batch.Chunks[0], batch.TotalL1MessagePoppedBefore) if err != nil { - log.Error("failed to create batch header", - "index", batchIndex, "total l1 message popped before", totalL1MessagePoppedBefore, - "parent hash", parentBatchHash, "number of chunks", len(chunks), "err", err) - return nil, err + log.Error("failed to create start DA chunk", "index", batch.Index, "total l1 message popped before", batch.TotalL1MessagePoppedBefore, + "parent hash", batch.ParentBatchHash, "number of chunks", numChunks, "err", err) + return nil, fmt.Errorf("Batch.InsertBatch error: %w", err) } - numChunks := len(chunks) - lastChunkBlockNum := len(chunks[numChunks-1].Blocks) + startDAChunkHash, err := startDAChunk.Hash() + if err != nil { + log.Error("failed to get start DA chunk hash", "index", batch.Index, "total l1 message popped before", batch.TotalL1MessagePoppedBefore, + "parent hash", batch.ParentBatchHash, "number of chunks", numChunks, "err", err) + return nil, fmt.Errorf("Batch.InsertBatch error: %w", err) + } + + totalL1MessagePoppedBeforeEndDAChunk := batch.TotalL1MessagePoppedBefore + for i := uint64(0); i < numChunks-1; i++ { + totalL1MessagePoppedBeforeEndDAChunk += batch.Chunks[i].NumL1Messages(totalL1MessagePoppedBeforeEndDAChunk) + } + endDAChunk, err := codecv0.NewDAChunk(batch.Chunks[numChunks-1], totalL1MessagePoppedBeforeEndDAChunk) + if err != nil { + log.Error("failed to create end DA chunk", "index", batch.Index, "total l1 message popped before", totalL1MessagePoppedBeforeEndDAChunk, + "parent hash", batch.ParentBatchHash, "number of chunks", numChunks, "err", err) + return nil, fmt.Errorf("Batch.InsertBatch error: %w", err) + } + + endDAChunkHash, err := endDAChunk.Hash() + if err != nil { + log.Error("failed to get end DA chunk hash", "index", batch.Index, "total l1 message popped before", totalL1MessagePoppedBeforeEndDAChunk, + "parent hash", batch.ParentBatchHash, "number of chunks", numChunks, "err", err) + return nil, fmt.Errorf("Batch.InsertBatch error: %w", err) + } newBatch := Batch{ - Index: batchIndex, - Hash: batchHeader.Hash().Hex(), - StartChunkHash: startChunkHash, + Index: batch.Index, + Hash: daBatch.Hash().Hex(), + StartChunkHash: startDAChunkHash.Hex(), StartChunkIndex: startChunkIndex, - EndChunkHash: endChunkHash, - EndChunkIndex: endChunkIndex, - StateRoot: chunks[numChunks-1].Blocks[lastChunkBlockNum-1].Header.Root.Hex(), - WithdrawRoot: chunks[numChunks-1].Blocks[lastChunkBlockNum-1].WithdrawRoot.Hex(), - ParentBatchHash: parentBatchHash.Hex(), - BatchHeader: batchHeader.Encode(), + EndChunkHash: endDAChunkHash.Hex(), + EndChunkIndex: startChunkIndex + numChunks - 1, + StateRoot: batch.StateRoot().Hex(), + WithdrawRoot: batch.WithdrawRoot().Hex(), + ParentBatchHash: batch.ParentBatchHash.Hex(), + BatchHeader: daBatch.Encode(), ChunkProofsStatus: int16(types.ChunkProofsStatusPending), ProvingStatus: int16(types.ProvingTaskUnassigned), RollupStatus: int16(types.RollupPending), diff --git a/tests/integration-test/orm/chunk.go b/tests/integration-test/orm/chunk.go index da65774d6..eee6b267d 100644 --- a/tests/integration-test/orm/chunk.go +++ b/tests/integration-test/orm/chunk.go @@ -10,6 +10,8 @@ import ( "gorm.io/gorm" "scroll-tech/common/types" + "scroll-tech/common/types/encoding" + "scroll-tech/common/types/encoding/codecv0" ) // Chunk represents a chunk of blocks in the database. @@ -25,7 +27,7 @@ type Chunk struct { EndBlockHash string `json:"end_block_hash" gorm:"column:end_block_hash"` StartBlockTime uint64 `json:"start_block_time" gorm:"column:start_block_time"` TotalL1MessagesPoppedBefore uint64 `json:"total_l1_messages_popped_before" gorm:"column:total_l1_messages_popped_before"` - TotalL1MessagesPoppedInChunk uint32 `json:"total_l1_messages_popped_in_chunk" gorm:"column:total_l1_messages_popped_in_chunk"` + TotalL1MessagesPoppedInChunk uint64 `json:"total_l1_messages_popped_in_chunk" gorm:"column:total_l1_messages_popped_in_chunk"` ParentChunkHash string `json:"parent_chunk_hash" gorm:"column:parent_chunk_hash"` StateRoot string `json:"state_root" gorm:"column:state_root"` ParentChunkStateRoot string `json:"parent_chunk_state_root" gorm:"column:parent_chunk_state_root"` @@ -43,8 +45,8 @@ type Chunk struct { // metadata TotalL2TxGas uint64 `json:"total_l2_tx_gas" gorm:"column:total_l2_tx_gas"` - TotalL2TxNum uint32 `json:"total_l2_tx_num" gorm:"column:total_l2_tx_num"` - TotalL1CommitCalldataSize uint32 `json:"total_l1_commit_calldata_size" gorm:"column:total_l1_commit_calldata_size"` + TotalL2TxNum uint64 `json:"total_l2_tx_num" gorm:"column:total_l2_tx_num"` + TotalL1CommitCalldataSize uint64 `json:"total_l1_commit_calldata_size" gorm:"column:total_l1_commit_calldata_size"` TotalL1CommitGas uint64 `json:"total_l1_commit_gas" gorm:"column:total_l1_commit_gas"` CreatedAt time.Time `json:"created_at" gorm:"column:created_at"` UpdatedAt time.Time `json:"updated_at" gorm:"column:updated_at"` @@ -61,22 +63,25 @@ func (*Chunk) TableName() string { return "chunk" } -// GetLatestChunk retrieves the latest chunk from the database. -func (o *Chunk) GetLatestChunk(ctx context.Context) (*Chunk, error) { +// getLatestChunk retrieves the latest chunk from the database. +func (o *Chunk) getLatestChunk(ctx context.Context) (*Chunk, error) { db := o.db.WithContext(ctx) db = db.Model(&Chunk{}) db = db.Order("index desc") var latestChunk Chunk if err := db.First(&latestChunk).Error; err != nil { - return nil, fmt.Errorf("Chunk.GetLatestChunk error: %w", err) + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, nil + } + return nil, fmt.Errorf("Chunk.getLatestChunk error: %w", err) } return &latestChunk, nil } // InsertChunk inserts a new chunk into the database. -// for init data -func (o *Chunk) InsertChunk(ctx context.Context, chunk *types.Chunk, dbTX ...*gorm.DB) (*Chunk, error) { +// for unit test +func (o *Chunk) InsertChunk(ctx context.Context, chunk *encoding.Chunk, dbTX ...*gorm.DB) (*Chunk, error) { if chunk == nil || len(chunk.Blocks) == 0 { return nil, errors.New("invalid args") } @@ -85,54 +90,61 @@ func (o *Chunk) InsertChunk(ctx context.Context, chunk *types.Chunk, dbTX ...*go var totalL1MessagePoppedBefore uint64 var parentChunkHash string var parentChunkStateRoot string - parentChunk, err := o.GetLatestChunk(ctx) - if err != nil && !errors.Is(errors.Unwrap(err), gorm.ErrRecordNotFound) { + parentChunk, err := o.getLatestChunk(ctx) + if err != nil { log.Error("failed to get latest chunk", "err", err) return nil, fmt.Errorf("Chunk.InsertChunk error: %w", err) } // if parentChunk==nil then err==gorm.ErrRecordNotFound, which means there's - // not chunk record in the db, we then use default empty values for the creating chunk; - // if parentChunk!=nil then err=nil, then we fill the parentChunk-related data into the creating chunk + // no chunk record in the db, we then use default empty values for the creating chunk; + // if parentChunk!=nil then err==nil, then we fill the parentChunk-related data into the creating chunk if parentChunk != nil { chunkIndex = parentChunk.Index + 1 - totalL1MessagePoppedBefore = parentChunk.TotalL1MessagesPoppedBefore + uint64(parentChunk.TotalL1MessagesPoppedInChunk) + totalL1MessagePoppedBefore = parentChunk.TotalL1MessagesPoppedBefore + parentChunk.TotalL1MessagesPoppedInChunk parentChunkHash = parentChunk.Hash parentChunkStateRoot = parentChunk.StateRoot } - hash, err := chunk.Hash(totalL1MessagePoppedBefore) + daChunk, err := codecv0.NewDAChunk(chunk, totalL1MessagePoppedBefore) if err != nil { - log.Error("failed to get chunk hash", "err", err) + log.Error("failed to initialize new DA chunk", "err", err) return nil, fmt.Errorf("Chunk.InsertChunk error: %w", err) } - var totalL2TxGas uint64 - var totalL2TxNum uint64 - var totalL1CommitCalldataSize uint64 - var totalL1CommitGas uint64 - for _, block := range chunk.Blocks { - totalL2TxGas += block.Header.GasUsed - totalL2TxNum += block.NumL2Transactions() - totalL1CommitCalldataSize += block.EstimateL1CommitCalldataSize() - totalL1CommitGas += block.EstimateL1CommitGas() + daChunkHash, err := daChunk.Hash() + if err != nil { + log.Error("failed to get DA chunk hash", "err", err) + return nil, fmt.Errorf("Chunk.InsertChunk error: %w", err) + } + + totalL1CommitCalldataSize, err := codecv0.EstimateChunkL1CommitCalldataSize(chunk) + if err != nil { + log.Error("failed to estimate chunk L1 commit calldata size", "err", err) + return nil, fmt.Errorf("Chunk.InsertChunk error: %w", err) + } + + totalL1CommitGas, err := codecv0.EstimateChunkL1CommitGas(chunk) + if err != nil { + log.Error("failed to estimate chunk L1 commit gas", "err", err) + return nil, fmt.Errorf("Chunk.InsertChunk error: %w", err) } numBlocks := len(chunk.Blocks) newChunk := Chunk{ Index: chunkIndex, - Hash: hash.Hex(), + Hash: daChunkHash.Hex(), StartBlockNumber: chunk.Blocks[0].Header.Number.Uint64(), StartBlockHash: chunk.Blocks[0].Header.Hash().Hex(), EndBlockNumber: chunk.Blocks[numBlocks-1].Header.Number.Uint64(), EndBlockHash: chunk.Blocks[numBlocks-1].Header.Hash().Hex(), - TotalL2TxGas: totalL2TxGas, - TotalL2TxNum: uint32(totalL2TxNum), - TotalL1CommitCalldataSize: uint32(totalL1CommitCalldataSize), + TotalL2TxGas: chunk.L2GasUsed(), + TotalL2TxNum: chunk.NumL2Transactions(), + TotalL1CommitCalldataSize: totalL1CommitCalldataSize, TotalL1CommitGas: totalL1CommitGas, StartBlockTime: chunk.Blocks[0].Header.Time, TotalL1MessagesPoppedBefore: totalL1MessagePoppedBefore, - TotalL1MessagesPoppedInChunk: uint32(chunk.NumL1Messages(totalL1MessagePoppedBefore)), + TotalL1MessagesPoppedInChunk: chunk.NumL1Messages(totalL1MessagePoppedBefore), ParentChunkHash: parentChunkHash, StateRoot: chunk.Blocks[numBlocks-1].Header.Root.Hex(), ParentChunkStateRoot: parentChunkStateRoot, diff --git a/tests/integration-test/orm/l2_block.go b/tests/integration-test/orm/l2_block.go index e29d4df76..50f355fc2 100644 --- a/tests/integration-test/orm/l2_block.go +++ b/tests/integration-test/orm/l2_block.go @@ -6,10 +6,10 @@ import ( "fmt" "time" + "scroll-tech/common/types/encoding" + "github.com/scroll-tech/go-ethereum/log" "gorm.io/gorm" - - "scroll-tech/common/types" ) // L2Block represents a l2 block in the database. @@ -50,7 +50,7 @@ func (*L2Block) TableName() string { // InsertL2Blocks inserts l2 blocks into the "l2_block" table. // for unit test -func (o *L2Block) InsertL2Blocks(ctx context.Context, blocks []*types.WrappedBlock) error { +func (o *L2Block) InsertL2Blocks(ctx context.Context, blocks []*encoding.Block) error { var l2Blocks []L2Block for _, block := range blocks { header, err := json.Marshal(block.Header)