diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index cbdf4b11bd..13e0dd793e 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -12,6 +12,7 @@ - [ ] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) - [ ] This change requires a documentation update +- [ ] Refactor (no updates to logic) ### Contents diff --git a/.github/testoolScripts/cleanup.sh b/.github/testoolScripts/cleanup.sh index a503363652..6129bb8d76 100755 --- a/.github/testoolScripts/cleanup.sh +++ b/.github/testoolScripts/cleanup.sh @@ -6,7 +6,7 @@ runner_vpc_id="vpc-05dedcb650bd24f8d" # Get runner status runner=$(aws ec2 describe-instances --profile $profile --filters Name=tag:Name,Values=[testool] Name=network-interface.vpc-id,Values=[$runner_vpc_id] --query "Reservations[*].Instances[*][InstanceId]" --output text | xargs) -echo "Reports: http://testool-public.s3-website.eu-central-1.amazonaws.com" +echo "Reports: https://testool.pse.dev" echo "Shuting down instance..." aws ec2 stop-instances --profile $profile --instance-ids $runner diff --git a/.github/workflows/mpt-witness-generator.yml b/.github/workflows/geth-utils.yml similarity index 76% rename from .github/workflows/mpt-witness-generator.yml rename to .github/workflows/geth-utils.yml index 77da2fa9c8..2ac5fe0c61 100644 --- a/.github/workflows/mpt-witness-generator.yml +++ b/.github/workflows/geth-utils.yml @@ -1,4 +1,4 @@ -name: MPT Witness Generator Checks +name: Geth-utils Checks on: merge_group: @@ -19,7 +19,7 @@ jobs: with: cancel_others: 'true' concurrent_skipping: 'same_content_newer' - paths: '["mpt-witness-generator/**"]' + paths: '["geth-utils/**"]' build: @@ -30,20 +30,20 @@ jobs: - name: Set up Go uses: actions/setup-go@v4 with: - go-version: '1.20' + go-version: '1.21' - name: Format uses: Jerome1337/gofmt-action@v1.0.5 with: - gofmt-path: './mpt-witness-generator' + gofmt-path: './geth-utils' gofmt-flags: '-l -d' - name: Build - working-directory: ./mpt-witness-generator + working-directory: ./geth-utils run: go build -v ./... - name: Test - working-directory: ./mpt-witness-generator + working-directory: ./geth-utils env: NO_GETH: true run: go test -v ./... diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index bdfb6b546f..1c027235f3 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -70,19 +70,9 @@ jobs: with: override: false - name: Setup golang - uses: actions/setup-go@v3 + uses: actions/setup-go@v4 with: - go-version: ~1.19 - # Go cache for building geth-utils - - name: Go cache - uses: actions/cache@v3 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- + go-version: ~1.21 - name: Cargo cache uses: actions/cache@v3 with: diff --git a/.github/workflows/lints.yml b/.github/workflows/lints.yml index ad1f9c938d..3f83a0bc5f 100644 --- a/.github/workflows/lints.yml +++ b/.github/workflows/lints.yml @@ -38,16 +38,10 @@ jobs: with: components: rustfmt, clippy override: false - # Go cache for building geth-utils - - name: Go cache - uses: actions/cache@v3 + - name: Setup golang + uses: actions/setup-go@v4 with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: lint-${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- + go-version: ~1.21 - name: Cargo cache uses: actions/cache@v3 with: diff --git a/.github/workflows/main-tests.yml b/.github/workflows/main-tests.yml index 5a4826347a..2801dc8c9f 100644 --- a/.github/workflows/main-tests.yml +++ b/.github/workflows/main-tests.yml @@ -46,19 +46,9 @@ jobs: with: override: false - name: Setup golang - uses: actions/setup-go@v3 + uses: actions/setup-go@v4 with: - go-version: ~1.19 - # Go cache for building geth-utils - - name: Go cache - uses: actions/cache@v3 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- + go-version: ~1.21 - name: Cargo cache uses: actions/cache@v3 with: @@ -79,7 +69,7 @@ jobs: uses: actions-rs/cargo@v1 with: command: test - args: --verbose --release --all --all-features --exclude integration-tests --exclude circuit-benchmarks + args: --verbose --release --all --all-features --exclude integration-tests --exclude circuit-benchmarks -- --test-threads 24 - name: Run testool internal tests uses: actions-rs/cargo@v1 with: @@ -104,19 +94,9 @@ jobs: with: override: false - name: Setup golang - uses: actions/setup-go@v3 - with: - go-version: ~1.19 - # Go cache for building geth-utils - - name: Go cache - uses: actions/cache@v3 + uses: actions/setup-go@v4 with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- + go-version: ~1.21 - name: Cargo cache uses: actions/cache@v3 with: @@ -155,16 +135,10 @@ jobs: override: false - name: Add target run: rustup target add x86_64-unknown-linux-gnu - # Go cache for building geth-utils - - name: Go cache - uses: actions/cache@v3 + - name: Setup golang + uses: actions/setup-go@v4 with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- + go-version: ~1.21 - name: Cargo cache uses: actions/cache@v3 with: diff --git a/.github/workflows/test-features.yml b/.github/workflows/test-features.yml index 8e98681661..f04075e447 100644 --- a/.github/workflows/test-features.yml +++ b/.github/workflows/test-features.yml @@ -36,16 +36,10 @@ jobs: - uses: actions-rs/toolchain@v1 with: override: false - - # Go cache for building geth-utils - - name: Go cache - uses: actions/cache@v3 + - name: Setup golang + uses: actions/setup-go@v4 with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ github.workflow }}-${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - + go-version: ~1.21 - name: Cargo cache uses: actions/cache@v3 with: diff --git a/Cargo.lock b/Cargo.lock index f8eaffb421..a99cb46ac0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -29,9 +29,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aes" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if", "cipher", @@ -40,12 +40,11 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" +checksum = "42cd52102d3df161c77a887b608d7a4897d7cc112886a9537b738a887a03aaff" dependencies = [ "cfg-if", - "getrandom", "once_cell", "version_check", "zerocopy", @@ -183,14 +182,13 @@ dependencies = [ [[package]] name = "auto_impl" -version = "1.1.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fee3da8ef1276b0bee5dd1c7258010d8fffd31801447323115a25560e1327b89" +checksum = "823b8bb275161044e2ac7a25879cb3e2480cb403e3943022c7c769c599b756aa" dependencies = [ - "proc-macro-error", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.48", ] [[package]] @@ -359,7 +357,9 @@ dependencies = [ "lazy_static", "log", "mock", + "num", "pretty_assertions", + "rand", "revm-precompile", "serde", "serde_json", @@ -428,9 +428,9 @@ dependencies = [ [[package]] name = "cargo-platform" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ceed8ef69d8518a5dda55c07425450b58a4e1946f4951eab6d7191ee86c2443d" +checksum = "694c8807f2ae16faecc43dc17d74b3eb042482789fd0eb64b39a2e04e087053f" dependencies = [ "serde", ] @@ -467,9 +467,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.32" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41daef31d7a747c5c847246f36de49ced6f7403b4cdabc807a97b5cc184cda7a" +checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" dependencies = [ "num-traits", ] @@ -630,9 +630,9 @@ dependencies = [ [[package]] name = "const-hex" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5104de16b218eddf8e34ffe2f86f74bfa4e61e95a1b89732fccf6325efd0557" +checksum = "18d59688ad0945eaf6b84cb44fedbe93484c81b48970e98f09db8a22832d7961" dependencies = [ "cfg-if", "cpufeatures", @@ -692,9 +692,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" dependencies = [ "cfg-if", ] @@ -1001,9 +1001,9 @@ dependencies = [ [[package]] name = "either" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" [[package]] name = "elliptic-curve" @@ -1466,9 +1466,9 @@ dependencies = [ [[package]] name = "eyre" -version = "0.6.11" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6267a1fa6f59179ea4afc8e50fd8612a3cc60bc858f786ff877a4a8cb042799" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" dependencies = [ "indenter", "once_cell", @@ -1525,21 +1525,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - [[package]] name = "form_urlencoded" version = "1.2.1" @@ -1721,7 +1706,10 @@ name = "geth-utils" version = "0.1.0" dependencies = [ "eth-types", + "ethers", + "glob", "gobuild", + "num_enum 0.7.2", "serde", "serde_json", ] @@ -1795,13 +1783,47 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 2.1.0", + "indexmap 2.2.3", "slab", "tokio", "tokio-util", "tracing", ] +[[package]] +name = "halo2-base" +version = "0.2.2" +source = "git+https://github.com/scroll-tech/halo2-lib?branch=develop#40ba7e3bbf013b55c59283534c9489701f9212d0" +dependencies = [ + "ff", + "halo2_proofs", + "itertools 0.10.5", + "num-bigint", + "num-integer", + "num-traits", + "rand_chacha", + "rustc-hash", +] + +[[package]] +name = "halo2-ecc" +version = "0.2.2" +source = "git+https://github.com/scroll-tech/halo2-lib?branch=develop#40ba7e3bbf013b55c59283534c9489701f9212d0" +dependencies = [ + "ff", + "group", + "halo2-base", + "itertools 0.10.5", + "num-bigint", + "num-integer", + "num-traits", + "rand", + "rand_chacha", + "rand_core", + "serde", + "serde_json", +] + [[package]] name = "halo2_proofs" version = "0.3.0" @@ -1820,9 +1842,9 @@ dependencies = [ [[package]] name = "halo2curves" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3675880dc0cc7cd468943266297198a28f88210ba60ca5e0e04d121edf86b46" +checksum = "db81d01d0bbfec9f624d7590fc6929ee2537a64ec1e080d8f8c9e2d2da291405" dependencies = [ "blake2b_simd", "ff", @@ -1907,9 +1929,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.4" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f" +checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" [[package]] name = "hex" @@ -2038,24 +2060,13 @@ dependencies = [ "futures-util", "http", "hyper", + "log", "rustls", + "rustls-native-certs", "tokio", "tokio-rustls", ] -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper", - "native-tls", - "tokio", - "tokio-native-tls", -] - [[package]] name = "ident_case" version = "1.0.1" @@ -2128,9 +2139,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.1.0" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" dependencies = [ "equivalent", "hashbrown 0.14.3", @@ -2204,12 +2215,12 @@ checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "is-terminal" -version = "0.4.10" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" dependencies = [ - "hermit-abi 0.3.4", - "rustix", + "hermit-abi 0.3.6", + "libc", "windows-sys 0.52.0", ] @@ -2239,18 +2250,18 @@ checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "jobserver" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" +checksum = "ab46a6e9526ddef3ae7f787c06f0f2600639ba80ea3eade3d8e670a2230f51d6" dependencies = [ "libc", ] [[package]] name = "js-sys" -version = "0.3.67" +version = "0.3.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a1d36f1235bc969acba30b7f5990b864423a6068a10f7c90ae8f0112e3a59d1" +checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" dependencies = [ "wasm-bindgen", ] @@ -2331,9 +2342,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.152" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libm" @@ -2400,30 +2411,6 @@ dependencies = [ "libsecp256k1-core", ] -[[package]] -name = "light-client-poc" -version = "0.1.0" -dependencies = [ - "ahash", - "ctor", - "env_logger", - "eth-types", - "ethers", - "eyre", - "gadgets", - "halo2_proofs", - "hex", - "mpt-witness-generator", - "num_enum 0.6.1", - "rand", - "rand_chacha", - "reqwest", - "serde", - "serde_json", - "tokio", - "zkevm-circuits", -] - [[package]] name = "linked-hash-map" version = "0.5.6" @@ -2489,9 +2476,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" dependencies = [ "adler", ] @@ -2522,38 +2509,28 @@ dependencies = [ ] [[package]] -name = "mpt-witness-generator" +name = "mpt-test" version = "0.1.0" dependencies = [ - "env_logger", + "base64 0.21.7", + "eth-types", "ethers", + "eyre", + "flate2", + "gadgets", + "geth-utils", "glob", - "gobuild", - "log", - "num_enum 0.7.2", + "halo2_proofs", + "hex", + "hyper", + "hyper-rustls", + "lazy_static", "serde", "serde_json", + "tokio", "zkevm-circuits", ] -[[package]] -name = "native-tls" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" -dependencies = [ - "lazy_static", - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - [[package]] name = "new_debug_unreachable" version = "1.0.4" @@ -2588,28 +2565,33 @@ dependencies = [ [[package]] name = "num-complex" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" +checksum = "23c6602fda94a57c990fe0df199a035d83576b496aa29f4e634a8ac6004e68a6" dependencies = [ "num-traits", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", "num-traits", ] [[package]] name = "num-iter" -version = "0.1.43" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" dependencies = [ "autocfg", "num-integer", @@ -2630,9 +2612,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", "libm", @@ -2644,7 +2626,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.4", + "hermit-abi 0.3.6", "libc", ] @@ -2657,15 +2639,6 @@ dependencies = [ "num_enum_derive 0.5.11", ] -[[package]] -name = "num_enum" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" -dependencies = [ - "num_enum_derive 0.6.1", -] - [[package]] name = "num_enum" version = "0.7.2" @@ -2687,18 +2660,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "num_enum_derive" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "syn 2.0.48", -] - [[package]] name = "num_enum_derive" version = "0.7.2" @@ -2757,50 +2718,12 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "openssl" -version = "0.10.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15c9d69dd87a29568d4d017cfe8ec518706046a05184e5aea92d0af890b803c8" -dependencies = [ - "bitflags 2.4.2", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", -] - [[package]] name = "openssl-probe" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" -[[package]] -name = "openssl-sys" -version = "0.9.99" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e1bf214306098e4832460f797824c05d25aacdf896f64a985fb0fd992454ae" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - [[package]] name = "option-ext" version = "0.2.0" @@ -2948,9 +2871,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.6" +version = "2.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f200d8d83c44a45b21764d1916299752ca035d15ecd46faca3e9a2a2bf6ad06" +checksum = "219c0dcc30b6a27553f9cc242972b67f75b60eb0db71f0b5462f38b058c41546" dependencies = [ "memchr", "thiserror", @@ -2959,9 +2882,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.7.6" +version = "2.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcd6ab1236bbdb3a49027e920e693192ebfe8913f6d60e294de57463a493cfde" +checksum = "22e1288dbd7786462961e69bfd4df7848c1e37e8b74303dbdab82c3a9cdd2809" dependencies = [ "pest", "pest_generator", @@ -2969,9 +2892,9 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.6" +version = "2.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a31940305ffc96863a735bef7c7994a00b325a7138fdbc5bda0f1a0476d3275" +checksum = "1381c29a877c6d34b8c176e734f35d7f7f5b3adaefe940cb4d1bb7af94678e2e" dependencies = [ "pest", "pest_meta", @@ -2982,9 +2905,9 @@ dependencies = [ [[package]] name = "pest_meta" -version = "2.7.6" +version = "2.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7ff62f5259e53b78d1af898941cdcdccfae7385cf7d793a6e55de5d05bb4b7d" +checksum = "d0934d6907f148c22a3acbda520c7eed243ad7487a30f51f6ce52b58b7077a8a" dependencies = [ "once_cell", "pest", @@ -2998,7 +2921,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 2.1.0", + "indexmap 2.2.3", ] [[package]] @@ -3064,18 +2987,18 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +checksum = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" dependencies = [ "proc-macro2", "quote", @@ -3106,9 +3029,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "poseidon" @@ -3210,7 +3133,7 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" dependencies = [ - "toml_edit 0.21.0", + "toml_edit 0.21.1", ] [[package]] @@ -3370,9 +3293,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b7fa1134405e2ec9353fd416b17f8dacd46c473d7d3fd1cf202706a14eb792a" +checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" dependencies = [ "aho-corasick", "memchr", @@ -3393,9 +3316,9 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "reqwest" -version = "0.11.23" +version = "0.11.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41" +checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251" dependencies = [ "base64 0.21.7", "bytes", @@ -3407,12 +3330,10 @@ dependencies = [ "http-body", "hyper", "hyper-rustls", - "hyper-tls", "ipnet", "js-sys", "log", "mime", - "native-tls", "once_cell", "percent-encoding", "pin-project-lite", @@ -3421,9 +3342,9 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", + "sync_wrapper", "system-configuration", "tokio", - "tokio-native-tls", "tokio-rustls", "tower-service", "url", @@ -3582,6 +3503,12 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustc-hex" version = "2.1.0" @@ -3599,9 +3526,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.30" +version = "0.38.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322394588aaf33c24007e8bb3238ee3e4c5c09c084ab32bc73890b99ff326bca" +checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" dependencies = [ "bitflags 2.4.2", "errno", @@ -3622,6 +3549,18 @@ dependencies = [ "sct", ] +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + [[package]] name = "rustls-pemfile" version = "1.0.4" @@ -3792,18 +3731,18 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.195" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" +checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.195" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" +checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" dependencies = [ "proc-macro2", "quote", @@ -3812,9 +3751,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.111" +version = "1.0.113" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" +checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" dependencies = [ "itoa", "ryu", @@ -4129,9 +4068,9 @@ checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "svm-rs" -version = "0.3.3" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20689c7d03b6461b502d0b95d6c24874c7d24dea2688af80486a130a06af3b07" +checksum = "11297baafe5fa0c99d5722458eac6a5e25c01eb1b8e5cd137f54079093daa7a4" dependencies = [ "dirs", "fs2", @@ -4169,6 +4108,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + [[package]] name = "system-configuration" version = "0.5.1" @@ -4198,13 +4143,12 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.9.0" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" +checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" dependencies = [ "cfg-if", "fastrand", - "redox_syscall", "rustix", "windows-sys 0.52.0", ] @@ -4272,18 +4216,18 @@ checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" [[package]] name = "thiserror" -version = "1.0.56" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" +checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.56" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" +checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", @@ -4292,12 +4236,13 @@ dependencies = [ [[package]] name = "time" -version = "0.3.31" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" +checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" dependencies = [ "deranged", "itoa", + "num-conv", "powerfmt", "serde", "time-core", @@ -4312,10 +4257,11 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f" +checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" dependencies = [ + "num-conv", "time-core", ] @@ -4345,9 +4291,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.35.1" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" dependencies = [ "backtrace", "bytes", @@ -4371,16 +4317,6 @@ dependencies = [ "syn 2.0.48", ] -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - [[package]] name = "tokio-rustls" version = "0.24.1" @@ -4456,7 +4392,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.3", "serde", "serde_spanned", "toml_datetime", @@ -4469,18 +4405,18 @@ version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.3", "toml_datetime", "winnow", ] [[package]] name = "toml_edit" -version = "0.21.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.3", "toml_datetime", "winnow", ] @@ -4672,12 +4608,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - [[package]] name = "version_check" version = "0.9.4" @@ -4711,9 +4641,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.90" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406" +checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -4721,9 +4651,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.90" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd" +checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" dependencies = [ "bumpalo", "log", @@ -4736,9 +4666,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.40" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bde2032aeb86bdfaecc8b261eef3cba735cc426c1f3a3416d1e0791be95fc461" +checksum = "877b9c3f61ceea0e56331985743b13f3d25c406a7098d45180fb5f09bc19ed97" dependencies = [ "cfg-if", "js-sys", @@ -4748,9 +4678,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.90" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999" +checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4758,9 +4688,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.90" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7" +checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" dependencies = [ "proc-macro2", "quote", @@ -4771,15 +4701,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.90" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b" +checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" [[package]] name = "web-sys" -version = "0.3.67" +version = "0.3.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58cd2333b6e0be7a39605f0e255892fd7418a682d8da8fe042fe25128794d2ed" +checksum = "96565907687f7aceb35bc5fc03770a8a0471d82e479f25832f54a0e3f4b28446" dependencies = [ "js-sys", "wasm-bindgen", @@ -4787,9 +4717,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.25.3" +version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "winapi" @@ -4956,9 +4886,9 @@ checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "winnow" -version = "0.5.34" +version = "0.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7cf47b659b318dccbd69cc4797a39ae128f533dce7902a1096044d1967b9c16" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" dependencies = [ "memchr", ] @@ -5078,6 +5008,8 @@ dependencies = [ "ethers-signers", "gadgets", "getrandom", + "halo2-base", + "halo2-ecc", "halo2_proofs", "hex", "integer", @@ -5131,3 +5063,8 @@ dependencies = [ "cc", "pkg-config", ] + +[[patch.unused]] +name = "halo2curves" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" diff --git a/Cargo.toml b/Cargo.toml index 7e286b0c72..0e88d667b2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,13 +11,18 @@ members = [ "external-tracer", "mock", "testool", - "mpt-witness-generator/rustlib", - "light-client-poc" + "bin/mpt-test" ] [patch.crates-io] halo2_proofs = { git = "https://github.com/privacy-scaling-explorations/halo2.git", tag = "v0.3.0" } +[patch."https://github.com/scroll-tech/halo2.git"] +halo2_proofs = { git = "https://github.com/privacy-scaling-explorations/halo2.git", tag = "v0.3.0" } + +[patch."https://github.com/privacy-scaling-explorations/halo2curves.git"] +halo2curves = { version = "0.1.0", features = ["derive_serde"] } + # Definition of benchmarks profile to use. [profile.bench] opt-level = 3 diff --git a/Makefile b/Makefile index 274e6555e9..d0eb037d53 100644 --- a/Makefile +++ b/Makefile @@ -77,7 +77,7 @@ stats_evm_circuit: # Print a table with EVM Circuit stats by ExecState/opcode stats_copy_circuit: # Print a table with Copy Circuit stats by ExecState/opcode @cargo run --bin stats --features stats -- copy -evm_exec_steps_occupancy: # Print a table for each EVM-CellManager CellType with the top 10 occupancy ExecutionSteps associated +evm_exec_steps_occupancy: # Print a table for each EVM-CellManager CellType with the top 10 occupancy ExecSteps associated @cargo run --bin stats --features stats -- exec .PHONY: clippy doc fmt test test_benches test-all evm_bench state_bench circuit_benches evm_exec_steps_occupancy stats_state_circuit stats_evm_circuit stats_copy_circuit help diff --git a/bin/mpt-test/.gitignore b/bin/mpt-test/.gitignore new file mode 100644 index 0000000000..73e4dc7477 --- /dev/null +++ b/bin/mpt-test/.gitignore @@ -0,0 +1 @@ +web3_rpc_cache.bin diff --git a/bin/mpt-test/Cargo.toml b/bin/mpt-test/Cargo.toml new file mode 100644 index 0000000000..347c5eec9f --- /dev/null +++ b/bin/mpt-test/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "mpt-test" +version = "0.1.0" +edition = "2021" + +[dependencies] +ethers ={ version = "2.0.10", features = ["abigen", "rustls", "ws", "ethers-solc"] } +eth-types = { path = "../../eth-types" } +gadgets = { path = "../../gadgets" } +geth-utils = { path = "../../geth-utils" } +zkevm-circuits = { path = "../../zkevm-circuits", features=["test-circuits"]} +eyre = "0.6.11" +halo2_proofs = { git = "https://github.com/privacy-scaling-explorations/halo2.git", features=["circuit-params"], tag = "v0.3.0" } +serde_json = "1.0.111" +tokio = { version= "1.28.2", features = ["macros", "rt-multi-thread"] } +glob = "0.3.1" +lazy_static = "1.4.0" +base64 = "0.21.7" +flate2 = "1.0.28" +hyper = { version="0.14.27", features= ["full"]} +hyper-rustls = "0.24.1" +serde = "1.0.195" +hex = "0.4.3" + +[features] +default = ["disable-keccak"] +disable-keccak = [] diff --git a/bin/mpt-test/README.md b/bin/mpt-test/README.md new file mode 100644 index 0000000000..53e28a214a --- /dev/null +++ b/bin/mpt-test/README.md @@ -0,0 +1,25 @@ +# mpt-test + +This tool aims to verify mainnet blocks for the MPT circuit. + +## Running tests + +Just run `./test_mainnet_blocks.sh` + +NOTE: this run the tests with keccak testing disabled, because it takes SO MUCH to test with keccaks enables. If you want to run them with keccak, just run `cargo run --release --no-default-features`. + +## Adding new blocks to prove + +In order to add more blocks to prove you have to: + +- Add new entry in the `access-lists` folder +- Set the environment variable `WEB3_SERVICE_PROVIDER` to a mainnet JSON-RPC provider +- Run the tests again +- You will have to upload the cache file again (web3_rpc_cache.bin) and update the `test_mainnet_blocks.sh` file + +## How can get an access list for other blocks? + +There's a [modified version of geth](https://github.com/adria0/go-ethereum/tree/zklight) that [tracks access lists](https://github.com/adria0/go-ethereum/commit/fd2d7cea3747e1003a817cd18e200bf2b00be03c#diff-c3757dc9e9d868f63bc84a0cc67159c1d5c22cc5d8c9468757098f0492e0658cR1306) and allows to retrieve them via [RPC eth_accessListByNumber call](https://github.com/adria0/go-ethereum/commit/fd2d7cea3747e1003a817cd18e200bf2b00be03c#diff-c426ecd2f7d247753b9ea8c1cc003f21fa412661c1f967d203d4edf8163da344R1587), so you can deploy this version and grab some access lists there. + +Note: of course this is just a method for testing , do not use in production. + diff --git a/bin/mpt-test/access-lists/107.json b/bin/mpt-test/access-lists/107.json new file mode 100644 index 0000000000..1a28bd63d1 --- /dev/null +++ b/bin/mpt-test/access-lists/107.json @@ -0,0 +1 @@ +[{"address":"0xd7e30ae310c1d1800f5b641baa7af95b2e1fd98c","storageKeys":[]}] \ No newline at end of file diff --git a/bin/mpt-test/access-lists/18363441.json b/bin/mpt-test/access-lists/18363441.json new file mode 100644 index 0000000000..65c0f6433e --- /dev/null +++ b/bin/mpt-test/access-lists/18363441.json @@ -0,0 +1 @@ +[{"address":"0xfd46ff70314d13d62150c4fbf3f397ea1fd14d1f","storageKeys":[]},{"address":"0x92c24932b4e5eba6223510e26ecb2d19e986c312","storageKeys":[]},{"address":"0x75c97384ca209f915381755c582ec0e2ce88c1ba","storageKeys":["0xf2c891cab2af1155379e2cb5a591b3e1f3859d3ef1c231d4987204c1fe7ea115","0x000000000000000000000000000000000000000000000000000000000000000b","0xafa9712ae32b996e680ddfb579f88c5714eff15e4f29153eadd3decaad54ebca","0x5a0dc5d4d49c845a7e5c8f30d3eb17f36afd4610ee030b6b45acdef0e06b51fd","0x4c29a58e6ae8e8d5675a8f982d2b7b5003c687633919a622b92973af39bb0548","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000010","0x000000000000000000000000000000000000000000000000000000000000000f","0x000000000000000000000000000000000000000000000000000000000000000c","0x4ac0dadab39f2c7439c0a2e1c046c7e22df2ff8d95029194a826bc70fc6a0360","0xd6cd76e208ea80eb6f706515ebcfc15fc94f57f3e18452883d9478107143d407","0x6d57821318dcacfc543b369a66700bf70f3cd7f6194cd57b7e4101fc0a74401d","0xda9c22012f08f23c37f099fccfe07f399a157a4c1bf42d865b94c48d9ef10fa7","0xba4d1c7608e744a1dc4d1fdb0557e190c51b79460d4532783a98486635c83c36","0xc1d6bbde807e779e9d800fa021b5c8c5cae259cc49263c8e37cc09cbc9f773c3","0x9f9e915dbba093c21f0cc8a4d2160202ca7e51a7f3c02bd7aa37f6ad5c709858","0x5f683f9bb8ac29d67769e6ec1b79f0d2c23182c0d1c3afa6632099e73206baad","0xb9b3e30df654c8da6ba9c77c47b95fbfd6273df5c9018494447244af5290a221"]},{"address":"0x8e79e45c9e008b430aff86f7121b122f9ad27aff","storageKeys":[]},{"address":"0x388abf256ab77283427715ab0ac38848045a2f4a","storageKeys":[]},{"address":"0x2260fac5e5542a773aa44fbcfedf7c193bc2c599","storageKeys":["0x89b759767f65427c4a18c7717f8394a0142a5dc2cef03452521b758164e18b50","0xd0394c81a6b7d8cb5530f95a10548c9f5289859645db3365a4ebaeb43a664d20","0x0000000000000000000000000000000000000000000000000000000000000005","0x9319194a372d6da00e43ed5f7027e57f755d1a31b34a5351314b4fa3f025c34c","0xcd018cb5d654cc39608cf11b487d628b7c51ad6623ccdd43017a36c4d6d3d409","0xdc276a4f120117ad5ae6415d1c724b4f3a0e81f0ee6466e1392ca121b63123f2"]},{"address":"0x63bde7cb131b020e817d4e11e046ce3916fa53d8","storageKeys":[]},{"address":"0x1a7a898b00b8e4c166993dfe2174f5ff8526b9bf","storageKeys":["0x3f6de87e22e968df3dd5b7e4c532f82c2819e294a3460aff0c0bec4e89fba221"]},{"address":"0xcfd0babaf232fcfa4ca9e370c85c44ded8a57012","storageKeys":[]},{"address":"0x0439e60f02a8900a951603950d8d4527f400c3f1","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000001","0xc65ab7a07b3776139ad8a157b15c2a86a9240ddbfd989f249a2a98410370fcdd"]},{"address":"0x4a4dfbf1ebfd257aca2a65a8407c786dace7d99b","storageKeys":[]},{"address":"0x126db3213b309a8d554594e591e614425ccac78e","storageKeys":[]},{"address":"0xfbef075cd5b328b1c236ec097d34acd0705e7b2d","storageKeys":[]},{"address":"0x9b16c4bbd2d504786f90f487f0ec721ca3c02956","storageKeys":[]},{"address":"0x0000000000c2f3017e5af636ea91bd68ec3888ed","storageKeys":[]},{"address":"0x388a189d2752ef07a278f6586f5944fb73a1363c","storageKeys":[]},{"address":"0x79a5a6d94a6c233422e513e1eb5508883ac0e7b1","storageKeys":[]},{"address":"0x2d108e77ede06f89a0f285b2acc40491fb886ab2","storageKeys":[]},{"address":"0x0000000000000000000000000000000000000001","storageKeys":[]},{"address":"0xbff472ac156ca909ad883c36b4b93f827b0cc3cf","storageKeys":[]},{"address":"0x582d872a1b094fc48f5de31d3b73f2d9be47def1","storageKeys":["0x052e713d101c7dfed5314e4b3b8ecf07e42b12c3bf502e120438fddbb4b372bd","0xd857bf78a5f78591619c92bcff3bae1186c1f822220646ff6841798075d67b40","0xbaaf0bbf22a11f650c9ba4e8811d702eb3ff7ae7a92de9131f8c93ff79843f55","0x2c59fb26cb8960fc7597a10edfa823cc5833fc25820b637943dc0d621f05e8ac"]},{"address":"0x0b04b870b704846a5bac87c38b8a0555240fee5c","storageKeys":[]},{"address":"0xeea9b6df7e9a26c66a960a657248404c000e9f22","storageKeys":[]},{"address":"0x3fda25f27211a138adf211f4c060f2149674be6d","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000005","0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563","0x0000000000000000000000000000000000000000000000000000000000000000","0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e565","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000004","0x000000000000000000000000000000000000000000000000000000000000000a","0x000000000000000000000000000000000000000000000000000000000000000b","0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e564","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000008"]},{"address":"0x1e43dccf1760cc59045777a30307ad995418f7cc","storageKeys":[]},{"address":"0x2150bc3c64cbfddbac9815ef615d6ab8671bfe43","storageKeys":[]},{"address":"0x5efa852e92800d1c982711761e45c3fe39a2b6d8","storageKeys":[]},{"address":"0xb5e45fb7e89eb853c03b328daaa2c82c945b2573","storageKeys":[]},{"address":"0x3d1d55c23dfc759c5ae48500ca88ddf477b3c9e5","storageKeys":[]},{"address":"0xa017c98c147fc7a3c4e4d92a00893fb91fd0e100","storageKeys":[]},{"address":"0x7a63d17f5a59bca04b6702f461b1f1a1c59b100b","storageKeys":["0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x15e86e12d2596e308755eab3ada247f38048851b6387ce103d08698145fcd3e5"]},{"address":"0x67febbcaff34595c3776bb59e2a3e40422392a14","storageKeys":[]},{"address":"0x52f2a0c9e836743d4a509df7a96b8ce6dd6a3c73","storageKeys":[]},{"address":"0x77ecb9f03b4929e136cbd74f0ba40424aba7f33d","storageKeys":[]},{"address":"0x867bdc57d1b071fe5a9f670dd70b91e4269814d3","storageKeys":[]},{"address":"0xbdff339bc2707a1e5e4be7b2511316fa2188912c","storageKeys":[]},{"address":"0x054e993e0ecc5bf2797515adfc81d58cb8de0478","storageKeys":[]},{"address":"0x3106a0a076bedae847652f42ef07fd58589e001f","storageKeys":["0x3b031014f6c8175084b8f68107f1407fbf028ed86f79bc4053540962fdc859dd","0x193d7efdf5f83c633733c50bdc780b96fc43fd09df0b48704554e9213a4d638e"]},{"address":"0xd13b6bc36f1c6aa8c0eaad0f759c9e895201519b","storageKeys":[]},{"address":"0xd059b9025b3927c0582fd982328ff9c29c0108b4","storageKeys":[]},{"address":"0x000000000022d473030f116ddee9f6b43ac78ba3","storageKeys":["0xe92b7ebecc53b799f19b751adcdc00b9f880dfd84854a5a427861e96a27aee14"]},{"address":"0x3a23f943181408eac424116af7b7790c94cb97a5","storageKeys":["0x777c4eb203f5e2225f52abc3bd4ace68a75adabcdef917f1d0986096377a9a52"]},{"address":"0x6ee66ee47b1ff1d57caae4195cefa9672bf20c37","storageKeys":[]},{"address":"0x1efd36007f7f4306cf03cd7247f1e76efa41ccd2","storageKeys":[]},{"address":"0x19ce6addc7bec3e2759c080914452955d06b856f","storageKeys":[]},{"address":"0x51e2389f676bf15b48ea2b49e46aad7ce8d4ef98","storageKeys":[]},{"address":"0x1894bc5f85ac82589cd2d6d98beb08ff8a0cf332","storageKeys":[]},{"address":"0xb54ce26f2e30f64c5b684b141311ce138ab5e00e","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007"]},{"address":"0x5f88d1a517b670a14ded5d0cf8b3d37e554d977b","storageKeys":[]},{"address":"0x32143a02fb6484d18c79fa0401c9bf760dd3de68","storageKeys":[]},{"address":"0x5b060754b27844dbc3578382886828be224b804f","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000002e","0xc5aa584e68508eedab072ce21e7fc7dcd4d2d52d0c439d77fdc05b60ec45fe28","0x2a1cb9290a0423a43747f79d5e030615a76aa2a1c3720b17fdb2f1b26e506331","0xd13ef510468531d94ebc85abd3e4d9bb6fc03fa0cf2ac33e4d4a1ea9b840255f","0xa9989c0d89f86aba235818ead0ac055f2b9afaaba5f56494b89b2619cc92e5da","0xf6fecb6dd66268972069ac274362d988da548a5879780ed23ea332e80f58ab72","0xdcf37475f596d99d564d47a264043ef054aeded2dc3aee70eb1da7720cd42ed0","0xc6ba8782a9dbad0517d64e33b2220ddc28ab904012d80189113c9534768198f3","0x000000000000000000000000000000000000000000000000000000000000000e","0x000000000000000000000000000000000000000000000000000000000000001e","0x327505968b816924d5209e1e33a4037697dc001fc383b7bac5197705d96c866c","0x783e48d4931c659f4eadaccbf342b23ec578f1902679e3dbc08785ecca677d86","0x0000000000000000000000000000000000000000000000000000000000000012","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000024","0xd35f28dc68d0a228d05226c68f3dfd8d3ba142c198b48e54dc57959612d5c289","0x864524afabd2994b33b0c83d05f641c1a201d77afccc11f318d82a4700dc48a7","0x0000000000000000000000000000000000000000000000000000000000000034","0xa99ab8af0a963ef95adbbdf192a724d8137084c4bb695dbcfe87a7aad70b7629","0x01ab95c397577b90e3a67487b46ee47246f80a408eabaeb81a20bcb4c69d6507","0x5f71aa8e15ed48bf8f613d7f623f43f227e8cbccc903d0c1ba4bf6dad2bd67e0","0x0000000000000000000000000000000000000000000000000000000000000037","0xc43c1ef7280cd5ac861bd508e7e27aa80a320e9cb671e3be53167362eca5a0f5","0x407ced7054b1ac3cbf1ec772dedb4d6aa04e40015cfd0e23946294518cbc2667","0x1deb09875e83eb2b5ab74eb296eec65ca4f17b78065c261ab58c666c3fbab4d7","0x0000000000000000000000000000000000000000000000000000000000000010","0x000000000000000000000000000000000000000000000000000000000000000f","0xd2d5dcbde2102e87d15b37cda1fd604422c78671e5ac5f2f1a5649a7bcc3698c","0x0000000000000000000000000000000000000000000000000000000000000025","0x5bffb21522df03a002cb4564a7171fd2dc98b9687e9e3c61ac040bf68c909421","0x0000000000000000000000000000000000000000000000000000000000000000","0xcdf03d9c629f89cb5e333682e4ee004bd5a01a3a78fff12cf0d03ced6adf4485","0x0000000000000000000000000000000000000000000000000000000000000011","0x5cc8e2ea5dc5572b503e537bebc2339c3fcfa689483abf4ba458d7d0987c3aa4","0xf3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3","0xf3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee4","0x0000000000000000000000000000000000000000000000000000000000000030","0x000000000000000000000000000000000000000000000000000000000000002a","0x0fff2b59da56012547c6df5403b0bdd31215c91d03c06ade38c221eeb2eed2a3","0x0000000000000000000000000000000000000000000000000000000000000029","0x12f53cb5b3fda9f80f840cfc045e6c89dd52b49e706c9b52c211d2dfabe184e6","0x58362cdb0dd2c0a3f939dc939b24465227a128647c04d6d33f9f658532b934ae","0x2ef00c611e029a2af130445dbb3a2cb624678b5859bf1b9ebb0dbfdff4438626","0x379fa979821431b30f6687393a0a3c24a2722d8e5a004fb15e094e8a88bb4bb4","0x000000000000000000000000000000000000000000000000000000000000000d","0x245385767b995e7baea863b2383fda8821c817acf7b9e5d7d0809a82373dab98"]},{"address":"0x2a137ec3c64544bb2402b2e074f3414aa3105832","storageKeys":[]},{"address":"0x674c41b588924128587367b9f0015a71503d19ad","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000"]},{"address":"0x65b606733179b406421b7b675921d85da2789bab","storageKeys":[]},{"address":"0x1199c6c49a5235a76b64094db13f709a975320bf","storageKeys":[]},{"address":"0xdad8ff64ca16c7cb6e62afc2bc7760bd71d93d73","storageKeys":[]},{"address":"0x808b4da0be6c9512e948521452227efc619bea52","storageKeys":[]},{"address":"0x4087456720119e9153bff24291f0605cc6449a48","storageKeys":[]},{"address":"0x296f55f8fb28e498b858d0bcda06d955b2cb3f97","storageKeys":["0x08f7c1381a1fb1b7d984cbe1c2f9ba2a420186375b6d1e87b9db0b3805e07d27","0x5fb32ddd7af3fd83ab0c2e5099470666994bc1a3c3f82b87ca868ef5760b8945","0x5fb32ddd7af3fd83ab0c2e5099470666994bc1a3c3f82b87ca868ef5760b8946"]},{"address":"0x7137fdccfb6ee406771e8f5c1b466e4d3074dd45","storageKeys":[]},{"address":"0x1d80acdcae2257329557ae12c1d1fc21361def30","storageKeys":[]},{"address":"0xa38198499eb0b92155c01bd6e47ee501f5234ec1","storageKeys":[]},{"address":"0xdfb7444feee41158e4c95dcfc0663df0c4a4cf56","storageKeys":[]},{"address":"0xc77c5b30c56b402a2f43e0fb3f80d4182fbf2162","storageKeys":[]},{"address":"0x575725182cf495d977126b166bd00d8d2ac96628","storageKeys":[]},{"address":"0x2a80014c978b77a85edd2c5d654782dd68852e68","storageKeys":[]},{"address":"0x11b815efb8f581194ae79006d24e0d814b7697f6","storageKeys":["0x00000000000000000000000000000000000000000000000000000000000000a2","0x00000000000000000000000000000000000000000000000000000000000000a3","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000002","0x32d80bb380a6153715a380340a591610b4f5a62ca0809dce09eefe0e7c37ea7f"]},{"address":"0xaf2c2d5b3ab612d7f6cb22f406b1f6ff47816f14","storageKeys":[]},{"address":"0x9331ee6a0809b6a3cda743400a348fc5fa912a37","storageKeys":[]},{"address":"0xb1f01b0723c74ea99b1187c30b876941f49adb39","storageKeys":[]},{"address":"0x89e51fa8ca5d66cd220baed62ed01e8951aa7c40","storageKeys":[]},{"address":"0x32b3076c9b844adee46e6b83cd61ffd24c9d4c3b","storageKeys":[]},{"address":"0xfe21fb34b0161b53ce0e0c254340f34bceb63166","storageKeys":[]},{"address":"0xe8df9a7c34736a482a861a49b51fbc1c4c031456","storageKeys":[]},{"address":"0x615a681176023bfc4cfa94932f39ed7e8b0a5432","storageKeys":[]},{"address":"0x139dd8d31ac299747f79ae1a032a23077dd0542d","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000003","0x1a1e6821cde7d0159c0d293177871e09677b4e42307c7db3ba94f8648a5a050f","0x0000000000000000000000000000000000000000000000000000000000000001"]},{"address":"0xb3cef8a292bf665afaaf717a9dbcc156d70d4ad6","storageKeys":[]},{"address":"0xd343d5dba2fba55eef58189619c05e33cab95ca1","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000e","0x000000000000000000000000000000000000000000000000000000000000000f","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x000000000000000000000000000000000000000000000000000000000000000d"]},{"address":"0xd19d4b5d358258f05d7b411e21a1460d11b0876f","storageKeys":["0x527dcbcf86fe3303da69cdb317c41aaa6d31fa4b330582c5f81948108970338e","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x21ebe1c20d059c8774c0e58bbce5b1cf983d25acc658bc3997f122df6f662c55","0x43d06be72d58b0a6dd8b48d14c1f76a2baed1f10b679cf98560bf804d5560815","0x00000000000000000000000000000000000000000000000000000000000000e4"]},{"address":"0xd4c4044aca68ebbcb81b13cc2699e1bca2d3f458","storageKeys":[]},{"address":"0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000001"]},{"address":"0x23e7322ca615cbcc6f0ba63322441e5872eaf2eb","storageKeys":[]},{"address":"0xc36442b4a4522e871399cd717abdd847ab11fe88","storageKeys":["0xba057bab125661c01928dfa773d99b4c8ff4f2bf04513f554150f4586abd64c0","0x0000000000000000000000000000000000000000000000000000000000000002","0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3cb4485","0xba057bab125661c01928dfa773d99b4c8ff4f2bf04513f554150f4586abd64c1","0xba057bab125661c01928dfa773d99b4c8ff4f2bf04513f554150f4586abd64bf","0xdd5974cd6ebc28fb4c398655f6b0850e7424ec0d7425a06b2ed8c6ceafb89239","0xba057bab125661c01928dfa773d99b4c8ff4f2bf04513f554150f4586abd64be","0xa29e5d260357e9e8bdb6062ea0f7b1e74c116d033d6c3edb74a722dfcbfd03bf","0xa29e5d260357e9e8bdb6062ea0f7b1e74c116d033d6c3edb74a722dfcbfd03c0"]},{"address":"0xe37e799d5077682fa0a244d46e5649f71457bd09","storageKeys":[]},{"address":"0x686158b2df5cf38d948326fc7f8faac6f3bfd7df","storageKeys":[]},{"address":"0x64569f857512c63268f67c914df351d30d1d6322","storageKeys":[]},{"address":"0xb7a2a0b3a2523c62b47cd99440ad58dd7c9bf157","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000018","0x0000000000000000000000000000000000000000000000000000000000000009","0xbbc106b374ca0a57d258e3272397ac577dadd0c273a7f9d647883554e0e1ac39","0x0000000000000000000000000000000000000000000000000000000000000011","0x0000000000000000000000000000000000000000000000000000000000000023","0x0000000000000000000000000000000000000000000000000000000000000017","0xa7d6b42f0b28be868ac5fba02a1ffb6a78e9cf251f588dbad8848eda36c91d38","0xc46d6271e4a4a59cda0298df6d397a45b8063d5b2b4ae180e0b4174e9a9961f0","0x0000000000000000000000000000000000000000000000000000000000000019","0x624743ff2aee9de307cc5fa1544e5e104640ce8dd78fbcb3d2400b81e60489f7","0x740163e94bf2e5278422ed6ee528d2b71ddc2aa3a5026aeb095a3f1a26b16dd8","0xc15a171cfd73a656e9ab828b7d985fb1b7610c391a9c1e24cb119f9808653ed7","0x577ec814550374a6b95dd63a9037798436fb5d5082d2c33782529cd9dbc8d9b3","0xa334cac97239913e281823411e58e96d29b6e39e17d25306b1f3ebc66f2e0565","0x0000000000000000000000000000000000000000000000000000000000000020","0x0000000000000000000000000000000000000000000000000000000000000016","0x0000000000000000000000000000000000000000000000000000000000000022","0x0000000000000000000000000000000000000000000000000000000000000005","0x7e92b516f17f46e58d08d8c2c428eb4e7c21c3e0d9db18ff091c1a6f353efccc","0x0000000000000000000000000000000000000000000000000000000000000021"]},{"address":"0x3b4dfdf2ce3cfb280467def726e5e913ea43768f","storageKeys":[]},{"address":"0xd14ac9c18e4fb4771055a841f2c1256bd95f9184","storageKeys":[]},{"address":"0x6ebff09e0cb7ba3de1b793f9dd4f16d650238d4a","storageKeys":[]},{"address":"0x063d57e8b24b5a5b7ea7b90cf4580ad875c9e3be","storageKeys":[]},{"address":"0xba966940b8a990914a8d54b406dc2271d739beb1","storageKeys":[]},{"address":"0x33b06cd90c813c4a62ff2181d086232d45176b39","storageKeys":[]},{"address":"0x4976a4a02f38326660d17bf34b431dc6e2eb2327","storageKeys":[]},{"address":"0xc6265979793435b496e28e61af1500c22c3ba277","storageKeys":[]},{"address":"0x2fab0249c6a60d715135f12e51de7c130c26289d","storageKeys":[]},{"address":"0x072be3851a80c35e2c638d4a1b97afe7f3ba123a","storageKeys":[]},{"address":"0xf52605c7b778563a5a9144ef4dc53b57463ca2c7","storageKeys":[]},{"address":"0x5133522ea5a0494ecb83f26311a095ddd7a9d4b6","storageKeys":[]},{"address":"0x5bb467ab80999b5bc44e46dcf9d586e7902ceaf8","storageKeys":[]},{"address":"0x8fa8f9d8b228eee6e7df2056faa97ab23822deae","storageKeys":[]},{"address":"0x446d1c5a7d68d2a408869efea7e9f697c5c5a7e3","storageKeys":[]},{"address":"0xf5e106d38225d44ca8e9456b92d5ee64a58d7b82","storageKeys":[]},{"address":"0x9ac60b8b33092c2c0b4ca5af0dec2bcb84657e12","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008"]},{"address":"0x843d042c9c158e58fb5a88bcc0ffbc24f8ecf2f2","storageKeys":[]},{"address":"0x2c537e5624e4af88a7ae4060c022609376c8d0eb","storageKeys":["0x10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b","0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3","0x0000000000000000000000000000000000000000000000000000000000000001","0xba3593a51a2814ce6b32e5200c75bcb28f3d8d2944384a40a74dec87e063d098","0x1bb1269153531cf401a2bb06d1c1fda2dc76a14af7fae43515ed9a0da9945e9f","0x271880c33dec0cd2ac9380dec0fb486edef3d08c252e0b4f408b4312605c095c","0x660f20784821b748dece498c85634bf8e17fba0d424ec0b473b2549f4072ca7e"]},{"address":"0xd5980b04df6af6ee3d2b730e779eee3f8d607ba1","storageKeys":[]},{"address":"0xe4edb277e41dc89ab076a1f049f4a3efa700bce8","storageKeys":[]},{"address":"0x76e222b07c53d28b89b0bac18602810fc22b49a8","storageKeys":["0x4a8360dcbf2fb9aa7ab86da1ac9b80c2b3519c759a2bef3e5f16c0fa8d6a9b52","0x101bfeea476a950d7b29c2e53186923e14169383d54cd57d78f7493f45e91faa","0x000000000000000000000000000000000000000000000000000000000000000f","0x0000000000000000000000000000000000000000000000000000000000000010","0xdfd2420533e281f70c1cdab65f96a3bc12b8c17266c6ee9984dd1973a721870b","0x0588d0c3a76602a35b103254e95b5b0d99294eb2f4ddee93696edcaa2e07f1ad","0x7eed28a2e7c8a287690db85469e4c2f20bf9d6e3640ff8617894011d83dfadc9","0x481e9b1793e1b4e94c63ca5609e56cc2245a92c22cd7c5f50361675f6176f447","0x4cbf378d5393edba2a149d771902c6de6614d71e6d1d8d2dc058687e61f3d9a1","0x1acee096f51f9f9a4f28109ee16757afa6c16b13691f7c63b659265cde302103","0x02b8d8834ad9af8d7307f3bbdbd773ede52b32eeb265e110116185bce8222791","0x8dff745be89f9f95d0a1117ded18311df8ef4c1a352dca295640043f329e8964","0x0000000000000000000000000000000000000000000000000000000000000005","0xb5e32bf50149885d3d646d8982464d72de4ae399d83828a675f837354bf33510","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000b"]},{"address":"0x99dc263dc0a73374f58486c62c59fcd640e7a133","storageKeys":[]},{"address":"0x76107ad6a0c2aefdc5c19ee047add3d72afb4984","storageKeys":[]},{"address":"0xa270f3ad1a7a82e6a3157f12a900f1e25bc4fbfd","storageKeys":[]},{"address":"0xfb8131c260749c7835a08ccbdb64728de432858e","storageKeys":[]},{"address":"0x50cffc84b4eeae2fe36de69d9a4fe5a6c9475975","storageKeys":[]},{"address":"0x5f101efb2b882e650fed0e906a0689c40592f057","storageKeys":[]},{"address":"0x325296c431bd9579f3d35f7eef4f4ecdff0fcff0","storageKeys":[]},{"address":"0xff0e67414bbf13a158fabd5d5fddfe41e0228e59","storageKeys":[]},{"address":"0x3157e15e15fd41d6a9c5df255c71506f160db67c","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000002","0xce5274c3248f7bb33cac76a4b1f120d1d52f94f461fa5a4ea3fb02b8e3ba8fc4","0xa5bfb6184895ad46f68a4af050eef505abefcc41140757a7c3f32faa92aa6fa1","0xc7b538a5943e2df7c2b016c59da63a91ad13ba24495129cfb4ed30437ff2f569","0xce5274c3248f7bb33cac76a4b1f120d1d52f94f461fa5a4ea3fb02b8e3ba8fc1","0xa5bfb6184895ad46f68a4af050eef505abefcc41140757a7c3f32faa92aa6f9f","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000004","0xc7b538a5943e2df7c2b016c59da63a91ad13ba24495129cfb4ed30437ff2f567","0xa5bfb6184895ad46f68a4af050eef505abefcc41140757a7c3f32faa92aa6fa0","0xce5274c3248f7bb33cac76a4b1f120d1d52f94f461fa5a4ea3fb02b8e3ba8fc3","0x0000000000000000000000000000000000000000000000000000000000000001","0xce5274c3248f7bb33cac76a4b1f120d1d52f94f461fa5a4ea3fb02b8e3ba8fc2","0xc7b538a5943e2df7c2b016c59da63a91ad13ba24495129cfb4ed30437ff2f568"]},{"address":"0xa3bdc3a46a0633f999b4c39a7fb046ca2ef4bb56","storageKeys":[]},{"address":"0xdef1c0ded9bec7f1a1670819833240f027b25eff","storageKeys":["0x3a1eae4d9599b151de37596bc1e301e7833e536acda254c41c5aab51deef773d"]},{"address":"0x73ce7912501be775a693fb3a641eca8216b18b13","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000b","0x0000000000000000000000000000000000000000000000000000000000000010","0xf1ee872a93f0bcc41554c3cc13352df48d22fbec7e52ca0838f8a95ed01a36af","0x9c864eb1c0ae0c2a94d626fe1c5bb27f1cdf786e9b7ab9b920cac24e6f9bac9e","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000013","0x5c83d9320a9a25da893c14228f60de0a08c6b7bb94e4088eeee36c1b9a31c4a4","0x000000000000000000000000000000000000000000000000000000000000000d","0x0000000000000000000000000000000000000000000000000000000000000009","0x20de30300db9b2d46f45ef3798c883c649ebfb03953fa78198d91713f3132be2","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000008"]},{"address":"0xbeb5fc579115071764c7423a4f12edde41f106ed","storageKeys":["0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x0000000000000000000000000000000000000000000000000000000000000001"]},{"address":"0x59c3d094c6ec333e034b87c06687ec09523ad6a4","storageKeys":[]},{"address":"0x1111111254eeb25477b68fb85ed929f73a960582","storageKeys":["0x0aadf2db6fca536de50e90d97a6a85e01ee4c4ff8a1974983c2544501ddc7ca9","0x247c4e6195624093a7a8590fd248942c82272daada824ddf523e707ae2803d35"]},{"address":"0xfd1b0b0dfa524e1fd42e7d51155a663c581bbd50","storageKeys":["0xbe7b1a35084cd94eb4d705df422d5412a65d887389aa168d25cd230c4de1b1e7","0x4dd384764467310a8e5128f2764e8a602cd3764587787b25167a398b4a119aac","0x610ae570b1cd23187060b0ec5f4b9b26c9751aac1fc0d0262069fe0fe078950e","0x905cdb2cb03101b7dddf48539e83defe54ac11a72ed532de2b27f6b8a075a3e7","0xef091d3d50de21841ab3c34409f68b85c5b6d45b1d8d8120e7eda35cc6a344d3","0x745ed5b1948fbd0ea21808905aedc22c517a97cb13cccae4dcfa3fe8e13ec123","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x7c93f00fa8b6c4bdf9a5522397d7a2da851f0f116d9b2f671647b644f29cee52"]},{"address":"0x101816545f6bd2b1076434b54383a1e633390a2e","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000013","0xe79659174f0e98bff6608b143bffe9e550a81c916b80b13dd1629854a3d05fec","0x6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7ca","0x6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7c8","0x6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7c7","0x0000000000000000000000000000000000000000000000000000000000000011","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000e"]},{"address":"0x8d89ded148b45c614e99feefb5e3188a68525b13","storageKeys":[]},{"address":"0x16148e9f25a7c2734300076d1c8a4a0d07488476","storageKeys":[]},{"address":"0x9696f59e4d72e237be84ffd425dcad154bf96976","storageKeys":[]},{"address":"0x04fa0d235c4abf4bcf4787af4cf447de572ef828","storageKeys":["0x13733b87b551239fe69dfc361043656f3dc738db269c9a6210843dab83573d06","0x24ca134ee0c2cfe5fa33be5ab40db8015b20180968def7d18deae10df415b1f8","0x3738db18fcb9a438acf8fc0a9f828c796d7dd18649dc51d5ffcf024243f2dc7d","0x8be2f68b471b48e2f90e08b79fe8be6f21e9728e70d45f813ecb985fec2bb6ca","0xbc4214256baf8d9c76f98527edd86529d559f768db681d939a43af13ce4262b2","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000004","0x72934175c798a2231129645869558a3394847a3e8f7f15a18a1e3f1662de2acb","0xe610be3974a01d5ed2093d35419d8c21433990d629b82a756d0fb926d3c8dcad","0x0a140afd01c5321d1a8306c0f87b6ad56641579c41b3f4d85e8a17681ecabd3a","0x3024da6f1acc08bfe7ae5d0fae71112f7e8212d8078e2a42d2f289f8c3c56076","0xfd56229c5079180e92e3fa1a40a90fbb4c2a0b668745960f0a95e05ebce4ebe8","0xc269910e79664bb02e4ea6b58a6546a8f30ea3f5840ed79d34d06b85ebddd776","0xb39221ace053465ec3453ce2b36430bd138b997ecea25c1043da0c366812b829","0xe1b98cdf9aca3b3fb222ce6d5a9e87a0c28932879c7a8e790308b5476ce78af6","0xb78d313b486c553bb5534c286e75bb02d9f18ed8dfd40b69dfbf64a39d18de09","0x8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd225","0x676287bf18d924c668f2db8bd8f053faadd336727c98ba8556287d53ecb4534d"]},{"address":"0x2a48dbf6347ea5cdc906b4bb6a2ed27969241cde","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000001","0x9c04773acff4c5c42718bd0120c72761f458e43068a3961eb935577d1ed4effb","0x0000000000000000000000000000000000000000000000000000000000000008"]},{"address":"0xb519b3c897352da02430b604b23a88e3d32e3af8","storageKeys":[]},{"address":"0xf7c4d7dcec2c09a15f2db5831d6d25eaef0a296c","storageKeys":["0x45c6b4115ae224b6ca90d12c25fa10d30fcb340e95d7e0ae83848f440e71ef3a","0x22892b2751e0eb3846621cbc93a999e40fbf90608f5d3ac4793f3f92eccbe5e7"]},{"address":"0xae719cc3029f2845d62a203bb0f1076b8d735f4e","storageKeys":[]},{"address":"0x8d501afb7dd7dada424b8c1f331b5909e44a043f","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000003","0x000000000000000000000000000000000000000000000000000000000000000b","0xd001bce389e759dcb85809c4bde26aebcbf76af4272ad2454ebc279f5cc112d9","0xcae26c307b7798040b1f63dd0b43b5954bc1e3a6939c384ffd591cbddbda4d88","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000004","0x000000000000000000000000000000000000000000000000000000000000000a"]},{"address":"0x0616189d9a6c609ccbdc74fec3853146795efed3","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000002","0x0d5d46459b18070cb8e066fc80a53bae9eeb044135fd5bedc067e6ffd350bc11","0x0000000000000000000000000000000000000000000000000000000000000000","0x0d5d46459b18070cb8e066fc80a53bae9eeb044135fd5bedc067e6ffd350bc10","0x4a6f485c1c32cc07b41a962ff745e1d2a15f32520f92181d93f06ac057458486","0x0d5d46459b18070cb8e066fc80a53bae9eeb044135fd5bedc067e6ffd350bc12","0x0d5d46459b18070cb8e066fc80a53bae9eeb044135fd5bedc067e6ffd350bc13","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000004"]},{"address":"0x2c2ad2284c5785612a0894b41ac30ca68c94e224","storageKeys":[]},{"address":"0x7803f198a2137ca066c131c4b92e98b36acb369f","storageKeys":[]},{"address":"0xe720925a74c06c4848e625dd77e9cb954dfd35fa","storageKeys":[]},{"address":"0x27899fface558bde9f284ba5c8c91ec79ee60fd6","storageKeys":[]},{"address":"0x704ad8d95c12d7fea531738faa94402725acb035","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a"]},{"address":"0xa2cd3d43c775978a96bdbf12d733d5a1ed94fb18","storageKeys":["0xd13801343f04a57447ba35d4f2a09faad53876c310e963ab4f7582b86f985dc3","0xba30dc5a9939ac435e588b9a107c6dd56e3b72c83e07163c908ae6e4fb2916c5","0xc0402124c9e521c97cac829e241ca3421d80eca83c5557a8fa1d03abc22f1d0f","0x0029f02f4a38a19f13f1161d4bcf375de3cc85205fa12a7e5fc45ff4884fd043"]},{"address":"0x902f09715b6303d4173037652fa7377e5b98089e","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000034","0xf1a448c7929f6976c2b6a36a3923f20e67fe47e9b765b1b7590175f0d9cadf48","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000066","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"]},{"address":"0x03fc94d98d2a3fd1034dbab9bac65dba00e65add","storageKeys":[]},{"address":"0x229047fed2591dbec1ef1118d64f7af3db9eb290","storageKeys":["0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x0000000000000000000000000000000000000000000000000000000000000069"]},{"address":"0xe13de9c9c99d1df6264359003d9a7d4a53a2301e","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000001","0x1a1e6821cde7d0159c0d293177871e09677b4e42307c7db3ba94f8648a5a050f","0x91da3fd0782e51c6b3986e9e672fd566868e71f3dbc2d6c2cd6fbb3e361af2a7"]},{"address":"0xc05d18f2a0bf0a5022bb67d0a01052f08898c0bc","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000000000000000000000000000000000000000000b","0xa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49","0xde4d41cd88449233905508a97d5475593ca10b8c324a8bcad067de8469cad567","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000008","0x26e22803a4d02724c13feb9acde49cff4cb05832bd0d8a6c6ae88ad94e2f9c85","0x0000000000000000000000000000000000000000000000000000000000000007"]},{"address":"0x734493c574d5ca1fc83e692f456bc8cefd858b98","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000001","0xe8d1a4785a462e26e2f384fb5e72b2e8e2ad65084cb56d0498c24602348e3ad7"]},{"address":"0x2c169dfe5fbba12957bdd0ba47d9cedbfe260ca7","storageKeys":[]},{"address":"0xb2492e97a68a6e4b9e9a11b99f6c42e5accd38c7","storageKeys":["0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x19a81490d673d368fe5c55b8e02dd55172f1c31bf9b3eed55bba32b49de9e968","0xb39d4d188fc34dee54ecc868995a823481767836a4104387c6b44838cc23e9e0","0xb99ad5bcf924137d1f756353de1e34954e06e84d51e073478fa1c8df646edf42","0x6d74ea261bae1ad853805977db27674d737cc5831788f9ed8a4be9871099f7d7"]},{"address":"0x4d73adb72bc3dd368966edd0f0b2148401a178e2","storageKeys":["0x3992089ebb373af474827e29235481b53220e357b2c3694f28c7aedc399f7635","0xf3edfe273c30a9843d5009e9570b0e255a9f7de867f544e3dbc0ca77e41ad3df","0x67c6e6213cdfa6a2839937a2f5fa621ea4bd452e6ae9a72871e284700fe42cfc","0x6035be4f436522460885881708418a1d5fb63f95fbf41615678f28b29fc4656f","0x6035be4f436522460885881708418a1d5fb63f95fbf41615678f28b29fc46570","0xf82a8c2498f1bfb042f03a1990767e231fc2aac0edb10a0d5d5ad150bb2b5ee6","0xf82a8c2498f1bfb042f03a1990767e231fc2aac0edb10a0d5d5ad150bb2b5ee7","0x12cb41e0d9174da94bd5172ad2999f8be62d47f06a92f3d3fd273c9ae1f769be"]},{"address":"0x48e118fede6c0f6c4ff6130038179309946f76be","storageKeys":[]},{"address":"0x21a31ee1afc51d94c2efccaa2092ad1028285549","storageKeys":[]},{"address":"0x365f270ec430c30cde4d32439a4cee7bee8970d7","storageKeys":[]},{"address":"0xef813400a2df5e10ac505ac6eaac015fc0dd3809","storageKeys":[]},{"address":"0x2c937e3b0ea4198303d85ae11e4ac5fe3181c990","storageKeys":[]},{"address":"0x397ff1542f962076d0bfe58ea045ffa2d347aca0","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009"]},{"address":"0x1d1ca2dc773405a20db9845e09665b38e1951c09","storageKeys":[]},{"address":"0x794f95f2215b66146392576fc703dba61b84ff28","storageKeys":[]},{"address":"0xedd983cd14544a2ee67ccaea588b7388d08c73ce","storageKeys":[]},{"address":"0x737e678d0f81acee1c98adc5b3576c1215bc6d1f","storageKeys":[]},{"address":"0xeee5d2ad0623ad48a42664dff9c5d80b1815accd","storageKeys":[]},{"address":"0xe8346d6f3bceeedba26b45a6fd760ae09043fcfa","storageKeys":[]},{"address":"0xc512fc3dde2def3ebb6be5872459bd5522ac16f8","storageKeys":[]},{"address":"0xc0c293ce456ff0ed870add98a0828dd4d2903dbf","storageKeys":["0x2f368158caf5f7342fca40191c5b1c8ef2fb3ac9094920df765f94e8e8b160fe","0x188b9a5b8b50cbf331ea3e3c2d91372114a3cce9a3cc431ad08a4cf303ffe2ea","0xc048b29bff761a20dcccc05ff4666649bffd79200caf98583ea82c6dcce85859"]},{"address":"0xa8948e3495dc3095e8b5c160596b72ea4ebbe340","storageKeys":[]},{"address":"0xc08fb884576cc89957e9058ef11587c468c2952f","storageKeys":[]},{"address":"0x881d40237659c251811cec9c364ef91dc08d300c","storageKeys":["0xc03a2fe2012f4ccb13e695ea6f277edbfd1269ef86188b2c93b8db9f08993965","0xfa249ed8fe5294c7585039d570c3e4672d438c9a55814db1ddfe4276df580c16","0xfa249ed8fe5294c7585039d570c3e4672d438c9a55814db1ddfe4276df580c17","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000001","0xc03a2fe2012f4ccb13e695ea6f277edbfd1269ef86188b2c93b8db9f08993964"]},{"address":"0x5c2ab5dc71ced4d3a07f048dc9c068dfd4fc4d53","storageKeys":[]},{"address":"0x8542de66e82e57145927bcb258a20936cc319fff","storageKeys":[]},{"address":"0xf3268a4311f385dc88754b70be491c12aac0772a","storageKeys":[]},{"address":"0x926994574f4a14c276cb652ff8bc2427ba3e89b3","storageKeys":[]},{"address":"0x9e20d852f6f3fb17f29b6b3c9f589f128cda17f8","storageKeys":[]},{"address":"0x3606b0d9c84224892c7407d4e8dcfd7e9e2126a2","storageKeys":[]},{"address":"0x5b14c0585ba86337b04aa0f9c565f2e6a25d26a2","storageKeys":[]},{"address":"0x0363b1bc04365087ef6e1360e35872b60187a013","storageKeys":[]},{"address":"0x64bc2ca1be492be7185faa2c8835d9b824c8a194","storageKeys":["0xd959113c855a32062124451916b1b3749a2ba7992f23428e8155c74aee25d362","0xc5f5452c1f3e2c4eef9663717815e81fd9c59fa2db7b173ca53a7f4849bd5e53"]},{"address":"0x3e44cce94e0860103b2d5cf8f50d5bae3035e6ae","storageKeys":[]},{"address":"0x2c36080c8f720f04e4954530845a2bb7e71b547b","storageKeys":[]},{"address":"0x94a6c202ecd1f80d652eda2fb5704718f32bb887","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c"]},{"address":"0xa2e028f64686e726559fe8b69d2f09a291fadcd3","storageKeys":[]},{"address":"0x5d18b30ac9f5e8d6b21a4b783d95fecc8b3c09c6","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x000000000000000000000000000000000000000000000000000000000000000c"]},{"address":"0x4d808aa1156367090ea4dcf94feb6d1ba95c7fb6","storageKeys":[]},{"address":"0x4d224452801aced8b2f0aebe155379bb5d594381","storageKeys":["0x0b15e06596286ad8a4d9587894507f4a5ac70ee1d8dd6dd4b21859ee871cbf5f","0xdc62bb0c783812945ded321a5e0534d20f5ffd176b51dcf8784084556c7998c7"]},{"address":"0xc276a973f74d96370bf9d73d02ebf4d7129ab6fa","storageKeys":[]},{"address":"0xb34e04184ff4b3d7d684d33664a06dd4385fdba8","storageKeys":[]},{"address":"0x39778bc77bd7a9456655b19fd4c5d0bf2071104e","storageKeys":[]},{"address":"0x9a47f3289794e9bbc6a3c571f6d96ad4e7baed16","storageKeys":[]},{"address":"0x66e092fd00c4e4eb5bd20f5392c1902d738ae7bc","storageKeys":[]},{"address":"0x28a55488fef40005309e2da0040dbe9d300a64ab","storageKeys":[]},{"address":"0x001b6450083e531a5a7bf310bd2c1af4247e23d4","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000006","0x000000000000000000000000000000000000000000000000000000000000000c"]},{"address":"0x10fc50e04e90d5e7d249bab20a2c9f841e76c685","storageKeys":[]},{"address":"0xa37048d233b28e62b6f76b034fabb3b0da50e224","storageKeys":[]},{"address":"0x7a250d5630b4cf539739df2c5dacb4c659f2488d","storageKeys":[]},{"address":"0x88e76c9311ab60b60c66b373ccdde8d97a56f23b","storageKeys":[]},{"address":"0xad57d3d214ea03b61695c25c770b227b0fe4286e","storageKeys":[]},{"address":"0x2abf02c9b900cd4469a546323cdd3c0b5ece2370","storageKeys":[]},{"address":"0xcab398aa7ad93de007b7644dccc8f04cb9bb8b76","storageKeys":[]},{"address":"0x42eefb43bde2fd105deaba62bb5d5797cc1c553e","storageKeys":[]},{"address":"0xee54c5c1aae9d4384e9087d54775466556d3a80a","storageKeys":[]},{"address":"0x4c396fe2c3fd8b1d4c9b3f7d3cf5c42f51ba540b","storageKeys":[]},{"address":"0xfb8785fb3c50137aad92be8e04273dc2387dd0c3","storageKeys":[]},{"address":"0xa88800cd213da5ae406ce248380802bd53b47647","storageKeys":[]},{"address":"0xfda68f66824ef2695df85a5aaac94097587d2893","storageKeys":[]},{"address":"0x8846b8d16182b8b6cac9db3b224eb6e9a5d552ce","storageKeys":[]},{"address":"0x5a3e6a77ba2f983ec0d371ea3b475f8bc0811ad5","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000f","0xda1d2ef2004cd67c9dacd31a73f4c1ab5507274466e34bb976bdc970fc028169","0x41d90688a66d73ff62f5c0a155e7ab5ff005208172c6e57c8d5fdf69358b9484","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000008","0xc7e18232153762aed081738e249e6afaae89de63b760316fb909e54bd2a2347b","0x6a71df0dd4d74b17a1b465477dd0e3f2ce60fb2ae8492cb46457e1d679c2edc5","0xc5930a883fe3375c1c4023784161a76a191aba71d27d4d3756fd9d20dc568656","0x7be7378a6b0bfcd8a7315987d51dc5a7af8c5fea9aa83946a2a587a63f00af79","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000007","0x000000000000000000000000000000000000000000000000000000000000000d"]},{"address":"0x75dd42f3456f3b2c5415cd6addc4be1c22a18d29","storageKeys":[]},{"address":"0xdc76a2de1861ea49e8b41a1de1e461085e8f369f","storageKeys":["0x465d7ac783172a39f3c7b08b93c0ffc6516e5717f34505d8ef999b7ad46536ef","0x85422a05b517b2bd172cbfdfc466ff6292c74702c793662d0d677803cea08eb5","0x7078e7408de37c8c82999e0fc2ebdc6353325fbe0edbae26d548329e3b013744","0x3da4bcdbf0127c841c314bab77b6ab81bc2ca5ff19aab6760b80d48bb4e83fe7","0x89a3b2095ee230d9f0e79c899f31baa7ddaf8176dde99d1810ea520d9617185f","0x5ed9cda8cf25e7a744056e2554037264441308d49194a477bbc28dc5dc0ce948","0x8116e8584fe28562f1b736db452a9cd8c2d9bab7659baba875271fd1aad9343f","0x4817e102ce7f83b539a79abb7c3b870b71a00bd7411e8d6d898827440c9211ad","0x0c94fa2ba2b98ee79f7b8bd7e4ab4a6eec3c4d32c525e23e1e951b7c3f03aa37","0x6cfcf12c78d59cff139d0d47177da3b8849213104d91deaf1a6a185ca11d6a7c","0x89a3b2095ee230d9f0e79c899f31baa7ddaf8176dde99d1810ea520d9617185e","0x9dab77887980ea2879cedd380653e390b9c999f9d9e011cc7c7c63378d863fdf"]},{"address":"0x19029459beaa122d4c206c1844b3a4a97368da50","storageKeys":[]},{"address":"0x28ca9caae31602d0312ebf6466c9dd57fca5da93","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000001"]},{"address":"0xe91cbc483a8fda6bc377ad8b8c717f386a93d349","storageKeys":[]},{"address":"0x7d4456639d814f2734cc935a996ecb2f1f7d22f4","storageKeys":[]},{"address":"0x8731d54e9d02c286767d56ac03e8037c07e01e98","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0x6cb3ee90c50a38a0e4662bb7e7e6e40b91361bf6","storageKeys":["0x438f98f7726bafb53c477d8292ea370c36a1555d42a74daa95f658eb8e9b504d"]},{"address":"0x00afe08fb19d84d6848534c2bd507f8de9a3cf44","storageKeys":[]},{"address":"0x004395edb43efca9885cedad51ec9faf93bd34ac","storageKeys":["0xc44d33b83b9dd4c2daf0c164d65f2ffc4b1a6207bcacd59f30573cb83b663516","0x0000000000000000000000000000000000000000000000000000000000000004","0xc263c1bdfecb4444976ae0f8edfe027a46b8fac9fbd4c30c5adb1b2f989a3b7a","0x9cbddc2cdcd13259bc5c2c8559aa17f6cd22563778c0f4612ff13886d3421a22","0xc44d33b83b9dd4c2daf0c164d65f2ffc4b1a6207bcacd59f30573cb83b663517","0x0000000000000000000000000000000000000000000000000000000000000005","0xb2927a453ad14a2fd9227c9a993abf2bd2f43d6509080db34052f3f7122bd434","0x68219fc1f192003d086d865dee884d0168e4cb4447d2e50044e26eea64fd6451","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7f1","0xac46e77568366edc018ad4c2dbe996375f3537c428db16aab36a621e295000bf","0x5b00dc699387f37d4d693423bd46329515a394307bcf2d8ef243a16f09edad92","0xc263c1bdfecb4444976ae0f8edfe027a46b8fac9fbd4c30c5adb1b2f989a3b7d","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000003","0x9cbddc2cdcd13259bc5c2c8559aa17f6cd22563778c0f4612ff13886d3421a24","0xc263c1bdfecb4444976ae0f8edfe027a46b8fac9fbd4c30c5adb1b2f989a3b7c"]},{"address":"0x44d1a035ce4595514742b655f7635fc8e5e7b2b5","storageKeys":[]},{"address":"0xa70218d2984ee16d9fab4c6c5b84fc1119a207a0","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007"]},{"address":"0xc5565b4848f61471e5fd4c47f82c8e8d26b7ff2e","storageKeys":[]},{"address":"0x40c639fb745f2372e1d50d6551c77c64ba8468c4","storageKeys":["0x26d0b493d712c49dae5a972695792eed0125d4453c4f72be83083526091bd70a"]},{"address":"0x4f244fcaff67a2f98eaec20a44caf079a7f7a1d4","storageKeys":["0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x0000000000000000000000000000000000000000000000000000000000000000"]},{"address":"0x7d1afa7b718fb893db30a3abc0cfc608aacfebb0","storageKeys":["0xbc3269c3ddeb063124d8c8f40c383f40b2d3212d819cd058041d83e583892d9a","0x0000000000000000000000000000000000000000000000000000000000000004","0x356ea57d585b4c2292ee2a39c9da213499f25d18b4fba5671c7bc01208e40e2e"]},{"address":"0x23445c63feef8d85956dc0f19ade87606d0e19a9","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000006b","0xccae37334cfdf21ebdde223db203176e19543f7bdd940a2a2f74aa135491b1c3","0x0000000000000000000000000000000000000000000000000000000000000067","0x0000000000000000000000000000000000000000000000000000000000000066","0x000000000000000000000000000000000000000000000000000000000000006e","0xccae37334cfdf21ebdde223db203176e19543f7bdd940a2a2f74aa135491b1c5","0x9787eeb91fe3101235e4a76063c7023ecb40f923f97916639c598592fa30d6b2","0x000000000000000000000000000000000000000000000000000000000000006c","0x000000000000000000000000000000000000000000000000000000000000006a","0x9787eeb91fe3101235e4a76063c7023ecb40f923f97916639c598592fa30d6af","0x9787eeb91fe3101235e4a76063c7023ecb40f923f97916639c598592fa30d6b0","0x9787eeb91fe3101235e4a76063c7023ecb40f923f97916639c598592fa30d6b1","0xccae37334cfdf21ebdde223db203176e19543f7bdd940a2a2f74aa135491b1c4"]},{"address":"0x66a7aa37ea714e0b8dd553f375104ea7d160b0b2","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000003a","0xa2999d817b6757290b50e8ecf3fa939673403dd35c97de392fdb343b4015cea0","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x0000000000000000000000000000000000000000000000000000000000000000","0x627ad858f81ada4b64a407c93c26dd2d4112cacee6b76ef7659c7b438a8571c7","0xdce51a3093e6535e1b8b1c48aaa3b93e739586ecad0f11e2c24b050bfd4958e3"]},{"address":"0x99200b7928c0daeb36eaff0e82d13cc99e2aff91","storageKeys":[]},{"address":"0x487e760473412ab725baa05b46c4fd875c53885d","storageKeys":[]},{"address":"0x51c72848c68a965f66fa7a88855f9f7784502a7f","storageKeys":["0xd9b0307fa55d3f0df7add0e3cd10f84b0c3fb1fb51bb8b0c5d800bb7766ef81a","0x4c0683ab4c053d4d4be5b510fb58b5b966150857c444fef442fa237f2a65f0cf","0x114d359ae2342a7870f7937a9edf9a0a84b8038646c812cff76e2f891cdd1cc8","0x0000000000000000000000000000000000000000000000000000000000000000","0xeb702a743cfd21101b4e3bd7a3ec8cf8d1ce01f39d4073c9dee5374b01201602","0x225c18aa2325375dcb4fe40ec758f929baa9bca6824ccf95326d09bbe960f620","0x2751eaf94d6c4011edece59f1a1fd921ef96d564fa55c0c6c55748c57e401220"]},{"address":"0xf89d7b9c864f589bbf53a82105107622b35eaa40","storageKeys":[]},{"address":"0x95c618f318b0806bb157a800d2d0fac8aecd40d1","storageKeys":[]},{"address":"0x0b266f7ed121004a7d1b098598a9275ba5851d2f","storageKeys":[]},{"address":"0x4734b1d4b2df58329da586b2841f47e6a29cadc3","storageKeys":[]},{"address":"0x641b0e25701f7aa5aa9eeb92119ad9067fcd4337","storageKeys":[]},{"address":"0x0d9bdd2d61a37bc074e59b2801f32deee01307e5","storageKeys":[]},{"address":"0x432466b2f2a076a23b236275c2e8d7b17d11b83a","storageKeys":[]},{"address":"0xb2bd775af26ab59542dc3c9438771021af613787","storageKeys":[]},{"address":"0x65edfb436d2a51019db55b648e7a31f688c8873f","storageKeys":[]},{"address":"0x357fc4c94d03ff6bcd3c05d63752eafc1d123c51","storageKeys":[]},{"address":"0x4b2e310b10c9e7cd048c7378c24be1f806659d4f","storageKeys":[]},{"address":"0x8eb2283f696f2a130134d46e28d3528e19e16868","storageKeys":[]},{"address":"0xde1fcfb0851916ca5101820a69b13a4e276bd81f","storageKeys":["0x515216935740e67dfdda5cf8e248ea32b3277787818ab59153061ac875c9385e"]},{"address":"0x74de5d4fcbf63e00296fd95d33236b9794016631","storageKeys":[]},{"address":"0x91813c35e2c445172e1c73a7d865fc6f0da757c0","storageKeys":[]},{"address":"0x9a406ba5a99983250fd663947b3c968d387ce5cd","storageKeys":[]},{"address":"0x96612d11511d57dba6705d43381dbbf6662783eb","storageKeys":[]},{"address":"0x0c0905e0f5a8e4aff6518d5aa846a584c55f29d3","storageKeys":[]},{"address":"0xdac17f958d2ee523a2206206994597c13d831ec7","storageKeys":["0xb94d3a802909d8ba7794aa1899765bf3ac344147d7f5b927204c7a21059035e8","0x463ee7887f13fef1e00bc64d7ce21e57d68d0910423f85fb15cae8de3cfd5773","0x0b08fc3f0434c8553b79a5ca553e7a5ee516be2473a9d80c905584edb84a07a7","0x50f9793c6bbe49e15770c685f695546f185f92d4e28e083b080ea45164449511","0x091d489b479defe4ee8bde0c1bde248fc376aa80edf1f0d4d675b492a9a86c5e","0xe2645178dc09f2536bfd5f3dc3caa1e62df334e8886e10f0d8a0dbd82e311067","0xa56f92e28cd220d26f427b7f63f04ca2f4d10cdaa2cacfadf80731843f3361b8","0xea5aa12535e96729fec7dfd4c696b841917357d939364bd0be793a5d9e820240","0x8aa877cde3eeb8018045f920100f05364db1f628c30101c0ce65049b1ed89b7a","0x99c09ff3653ad8fc68e5dc867a9606ced7b21e67b7c10ec12e573c1f6879f2f4","0x7c084f6f66f1854b5ac1915798e31bad160857bb415bd586c5b093ebc7437f78","0x8032bbaad8dc69cb68b83388864605a6aa8ca1caae933b253bd93051aa37ad0b","0xbc0172e3ae7fad9fe1a25f72a5777dca9415558e3e4ea77708b0b2e0ce3ad124","0x639b0fad8cb3c3f822c7f87d4faffe54b8e4515394bf43d17915df9c544359d8","0xa4e4e13b16c5e5f85b46cb3a14a8ee3704e2a08a82bdb4983dc1bbbd9d2eb0e4","0xd6c94f6f6a0337358f71a56c17b2b48cb058cce281d0f8786819cd6b0b5b23e9","0x000000000000000000000000000000000000000000000000000000000000000a","0x524bfcec436c05b97c4fa0a4b01bdd00880f509c00db106f1fdba5574a8c1526","0x76d4fde25ddbb4d63011fbe3ae5aa7058226f7a0de67dfd2cf14b985046686e9","0x4f4c74f6348c0280149975422a172ee2d060f8f0cce33d4f0176881196b96405","0x2602e587332129fa5cfa1f1066f1d830c48565635f39274f53a5ed3aa06bba00","0xea487720912ff72f1c7a0a3afcb18dee86fdffb3c64005ade59c7b3fe9cc3331","0x61e2f2aaa624d5b791049819407ee6b1855eef42b6c65f2ced7e18970b8f990b","0xf38557e6b32b113cb5dff0c8b1f59b8d2be4631339086855c0bb81668b7aed62","0x3c0eeb53bb4a949666a6fffc7d0dba2b5390096ad885ae03ae5acb4c8a670040","0xf7edf61f84a59bfe6ce2a1e55b6aacd4ec8942e76fa69e3ede4fd1205a8fa411","0xf2d7f17f727fb799761e62421b15e5818df200b9ba6e75fc461980f795933500","0xa3b88bef8df2f6096822c988ffd14e98b0513d518130e72efa1debea259cbf43","0x24446e6ca9a7faa38e296162d09a4617ca57a80873d09753e15514f5ed2c66db","0xce4b548783a83143173f094addc3554cd447b462fa6dc74b87a90ebd6d0e297b","0x52ceba99244ba7e8ddb9571c665ba00ff09241b515949ab9a5ac611cf48ccfec","0x0ca0b0b913758dd1c61fedb942be0cae953c801aa0e1b8bef365ef30c7c5a242","0x0000000000000000000000000000000000000000000000000000000000000000","0x5af3f7574277932277b45651bd32bb971885ec8919cc013f19bb85952f6322ce","0x6ce4f048e20fbb08aaad71b12837a5065be2176721bc4a8da687b0f6b0e75672","0x74d6fb32bf6d388595c066c50eabed0d603dfc93335c385f65f9fb6b9f1a650b","0x0a2899f983353d31758d7dc1b242eafdfd6645fea4842fbab8a68ad7e79074ff","0x0b7f78333e762cdbdb5b88919ab144709571c8dafd30dec6df1a3399681ef653","0x5293860696a43f1881480a9a7accfad70c337fd6f977188c0bac2f6b4a923489","0xa20991fd0d3cf9876d36ee967ad5b60f0d9c21e3b041e4075141db45b44e84f2","0x491bc81e51a6599536925067d0634f6f48192a400b760533c9c75bebde75f34d","0x65934df9ae2a47d185255568f5b2f7f3a268413fea48d027d0115faf662502fd","0xd90df89adf4af9ef50e7dc588e78158379d6c2506c43abd84e7aea17714300d3","0x598b6ee0002d9d4a8300304bffa380eda0e326ebf2050e02fd81c936a04410c9","0xe1ac65459475a1d54a98840c1c2dc6376220be17eb7de834484d965b8173d37e","0x169228ca33ea854d54aa1e506e59ec687f618a41074f5f5de937a0e9c6343e5a","0x7c4e098c948ec3269c2499f3c1ca2df8a8348bb80ea6dfc5e9c519e65868c2c7","0x6ca1df6128cc356444c61703d8ef46aa5e6b17f16229c29f959e332bfabd81fd","0x0d09ee3100cbdab7de1cee1ab4b146dd7f0b1a0c94dea9e0758034b5187d5afb","0x3ea2f5f0971ea7c3b4f4a83ca57c584acfd4078a92e93c71b0dab7bd85ffaa94","0x0000000000000000000000000000000000000000000000000000000000000003","0xde69528ead73b65ca315efa39a6c4f0a2128f0ae6923a343f8d07418bd789772","0x0000000000000000000000000000000000000000000000000000000000000004","0xbba7fd4cc0839b814814c66213fdb2c8e15008e88fae54529c8c2ca829f2ca34","0x012a946a7f064f4092e1986c77163f655126183f5ff37183f7ed309de37e1330","0xba7c6a1a48c6185a43dcd3b940e965065db14177dfa070ccc2afaac410cd40c3","0xb66babf585d8eb66a33c07a9b5c5a742a1e27d3d057459d2f7aa84b206963780","0x18291ed68e9e283be7c714b0c68b9eb6079d24bbc16d404151fb28732f6ef7fa","0xf94b05ba7d0a6aa6692eecf3cf30c6ca5d527c3e5fd03d7081ff14e4910ec033","0x1996a27e35dd48cf7c79df72cbd6816b8512ca30c65003d522ca7f4bb7677157","0x804b6fcd955e1fb53f6d857e65091231e1ee528bdca6a5e706af3beb04eaab46","0x728e667887a5cc2d5b14fa273c88e60fabfef07301595452ac58e2cf33e7f947","0x2f1a3d45e67b8c52c3acca7d1bfdad222001d8006aa3756a7f95b5f0cbde8105","0x5df3f91ed18f909c4d07ce1a42fbd12c9da6ff38e6b9c282bfbff87885780f3b","0x63c67feb137ca46defeca012d6fac0f07183a3c9305bb33bcab94249ba4e9bb3","0x5aa816acee489dbd28481f928ed59a8c7539f7cc858ee747d79d9d15f965b8db","0xe2a6e540910470f9f60df559ae23cd602a17e1b84096366c0d7182c4ef64d5e1","0x126732c8b21370b25554f622a97d9151ea6ba00fa849e8f80c6cb673d6c405de","0xd537e497f03d2e7b7be3fe1b91f2e6a82db8a644d9f01f8293ed168e7d3f0ea2","0x7ec0f11abffe15016fb3b4988e608b041271cab72fa76b9d7f69e4816c1da758","0xc925f3253859b1469742700f71db14102510c50795c3a8e520f1992c4dfc3e74","0x5bb96862696c2d0cea055c97d882c1aea2e43ff2b77ddbff047472588e06de3f","0xe5865273b58d40c0de7333def44743042321ad4b7a68c869d6f85e01d638be43","0x482113db1169a2ee62c7bb047ba8deda7c9e44522ba01794450e387cf7046f5f","0x664d40707f8afc46cd94b6c93827dd49b3334670c6489db26eae2e0989ebb241","0x8edcc431145fd8559e4201846d67d86e143885485122da50a6e03c19c8c6bd9e","0x6aacad51e818fe1e62873dd3be752ab690963303332c12c8177fc179d13f3619","0x61806a02d55d0d0c7620a27274300f3809bdab323ae2059c88e73898fec468f4","0xff2acf1040b8375aae9ffa186abdb003c9aec45e162f5b564ab4bc02ff148678","0xf8c7857bd34ab7d393fcf8352ec460e4aa9c62b2100461db15846828f9fe93e0","0xad221574ad07edad4116f98f6006783dc33e873594089aa153bfa7c8d15aba39","0x0bcf518c91f6993f4d15cf7b8ca6c08d25dde512cbd6c6e5da859f40ddbd3992","0xe8764658090bf69c19426b599b2118f8d447011f05ef42efb1daa1a60c4d1c5b","0xf991184810abaacd6ee89d436306af648330a6b462c169e9594a6e9a392e9fc4","0x408f9d031bcb6511c186d08a0c8662c0183852777c8335bc739a78e3bdf8ba4f","0x50283d144f443148b76d2ca9e13f5d0828507d484c47a49dd0da2011582dcf02","0x78b35599871be95768b2fdfaf9293a4491ecdc8ef25b872ee404fa1e441436e0","0xb4950c67879e41f6029fd92d0b43654ad0931138f77108819b6a255663d20867","0xadd61ab0bd281b5a890240c5245c652e911472ffb277a671b5537796713bedab"]},{"address":"0xe28b3b32b6c345a34ff64674606124dd5aceca30","storageKeys":["0xb787223be3bc8ece62cd060cbb37243ae4b639a954a79701ede142b807c1768b","0x3a93b8d547a55b9f57e9b11b821bf30b45e952fe28b30d4c837a73ef19c1868d"]},{"address":"0x22c3f74d4aa7c7e11a7637d589026aa85c7af88a","storageKeys":["0xdc1c6005e746da28e58b87931af8677fde435af96c7e7b92454209412b6e7f22"]},{"address":"0x24449c139f8436d23389bd652f614fc98ddede5f","storageKeys":[]},{"address":"0x72e2f4830b9e45d52f80ac08cb2bec0fef72ed9c","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000001","0xf7f69682f9824f4882eeb5c155140ea75b5429ce47c66acc542cb334557ba4b3","0xa38585600e63da50178a690d7b1c3eca940a9b9a9bdb8e2228295b3c2c60964d","0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0xbfb731cd36d26c2a7287716de857e4380c73a64a","storageKeys":[]},{"address":"0x23a399a7bbba31a61eb0620f1e8b6f250a5b76de","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000"]},{"address":"0xd4bc3e8658619d66b3bbac0ffc15fa14d5936beb","storageKeys":[]},{"address":"0xaaef4d5ae6ea726f542033ddd8e0a1df6b189794","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000f","0x4babea82d9ff2f1ff4605a063a65f6a65bf2a9b78b2730d5cef369b8cd266c4e","0xe1970f313090c363d4bd2b7a159692748257db23537f8a4b6a87343f790486a7","0x0000000000000000000000000000000000000000000000000000000000000010","0x0371ae17dc7beeacdb9debe8c1d45e37d9a8d70fc55432643db34fc59df442e8","0x67a3cfa888e10d31abe6765ebfba98305cc3fdedabd697e3affb77aeb6c7f0c2","0x38feda9d83502e3e0eae49a97ce47789c883a8fb6ac92795e1d6a6f3a451b323","0xbbcfdfea5791c371b711c6f268d09b4c37483b981b0f807985dd4dfd751c4433","0xceef804a006c10f9dbafe22f97acc7148e36c12470a1806b4c84cd894b34d8e3","0x90cc84b6ceb3f6b7c0af01b450450575b7324e9b7514b5d967abf133317e9beb","0x0000000000000000000000000000000000000000000000000000000000000014","0x000000000000000000000000000000000000000000000000000000000000000e","0xef0cff642251177c978d2f3681c20a5d8b9ac0e657784f515a532fafae822311","0x8a8eadfe63f23cc559e138211d26abb1296d88c656e265d7ba85ff1a482bdb95","0x83757349e81da0589b26ed138effd0bc820a34e189080d49593bdca27853693b","0x629f20d8bfbe9a62bd05309ab8c8ad9929adea79f2545b8bcf91de7858d8b19e","0x000000000000000000000000000000000000000000000000000000000000000b","0x0000000000000000000000000000000000000000000000000000000000000006","0x7ed57cc193d9a313a98eecf2cabe713cdeb3edca396bc7af816685255fddf498","0x797ec894da4876bd82843785b38dfe17906d666aa843c775e9788afa0f1b0d75","0x29b49846dd9087c2bbc6eaecebfb05549be014c51b0c502d630e4ab5c4be164a","0xe075c011f49d5335fe70cd6afee6e9939f59f0e1ea0b9ee614f27260c07b9413","0x9403ef75687326de008d99f9c14ac928d9ee9aaa9cab1dafafca198a6c447168","0x6f5f85550f45e95f32dec22fa1fdf167afad8f03be18de4575a03035b829b9fd","0xbb36d8c5bb80aa6cdad8183b9be81d5376b3ac80bc5411844e76f65e5a192e89","0x4f6a9abee83357567821a17ca6ca7785bf31e7eef494aa0bec2f454e5014bac5","0xc599da84f8a71bb4479ac7d0cc74a30a73a43377eda837976d780f43f64b0466","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000013","0xe7bc46371b824185d2a151a2d41eb41f0ee72108cbd1aa51697e047c84430d9e","0x470679da08e7ca78ad517e9fbc3bde0f86c4b6a2d2c3a8e7eb7805d988863658","0xcf6a7519bafa2cd2a2b06d8afad9635d422adc4e9e42946aefe0ac4990cbbe62","0x769aa1674f7391a6da9106d6e57292a98a718eec4c60f832e8cf33395d97af92","0xb5b2b744a66bd48f53cfa7d9b059a4526924c5ab9631c4e5f214845b670ce3d8"]},{"address":"0x290a6a7460b308ee3f19023d2d00de604bcf5b42","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000073","0x0000000000000000000000000000000000000000000000000000000000000074","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000001","0x9b637a02e6f8cc8aa1e3935c0b27bde663b11428c7707039634076a3fb8a0c48"]},{"address":"0x2568e74ac4fbb5937193f64a8e747b8372b8d1e6","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000","0xa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49","0x1da56312bf8b55a61dcfc5483a4f56b6b64b3feb26c42098c296942970b75b4f","0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000007","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000b","0xe075c011f49d5335fe70cd6afee6e9939f59f0e1ea0b9ee614f27260c07b9413"]},{"address":"0x023320e0c9ac45644c3305ce574360e901c7f582","storageKeys":[]},{"address":"0xa3c22370de5f9544f0c4de126b1e46ceadf0a51b","storageKeys":["0x5d67dba4fd845345daf6041cd6b7b7eee9513f8ce46109a49d888e98d856b39c","0x86f3b28d430c80bddd95b895179f09c5299b8b4426849a342808a23e67fe2bc2"]},{"address":"0x1f5075f3ebd7c952f7eb6315ff803664efa3a776","storageKeys":[]},{"address":"0xe9a9b6ce6ae2141ed7393a61e6caadc481780f77","storageKeys":[]},{"address":"0xfba175fe8169f08eb02239ca1b235a8e13415204","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000f","0x000000000000000000000000000000000000000000000000000000000000000e","0x000000000000000000000000000000000000000000000000000000000000000a","0x0c23adc4677200a008d9b1ed7ba6a8d8f75df3ad52ce546ad30de7b41f16691c","0x3bdbca05285fc70b92d87d8c7b9e489bf0787dc47751ba4fb70ff7a65e9bb3a2","0x0000000000000000000000000000000000000000000000000000000000000006","0x5084cdfdfedcb5071c22a51423ae0503c3699b7794a606630927b3b6f909ea55","0x0000000000000000000000000000000000000000000000000000000000000013","0xf50b9d92114a759045f9357d47a14b2813ba9358477bf552a161b1a1a78a56b7","0x5db07de476cc53fc066e2d0613dc897000ecdb0c8394e5e9d0336104e62e8a47","0xc79b01738e7032455f165925d40417d97708b3391c3de18d2599ee9d128bac33","0x000000000000000000000000000000000000000000000000000000000000000c","0x5255b339729aa577223ebd3d5654ba10aac13c1f5c7bf9e02b34befaf9d03bed","0xee722d724c89bf250dae10049726c7ead1476357b09d9efbec404caf9ea81e72","0x000000000000000000000000000000000000000000000000000000000000000b","0x0000000000000000000000000000000000000000000000000000000000000014","0xf2c535f78bbf70e8c137acb4e29e2f986545c919fc7214c8b5be774e28c99ce8","0x0502ced884590ffc4848ac60e566eb50480892e45331d4743b365bed83fb7911","0xe5de7dd0f6053f40e61149cfaa90debc011c6329782e917e70c1b6bb71feb4c5","0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000010","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000011","0x46f25944edfa3c6d435108d19f6bec450dd3e2c6fe825395837a078ed83403f0"]},{"address":"0x1f41e42d0a9e3c0dd3ba15b527342783b43200a9","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000001","0x0291a94445d5c7372482f6c2b1f3ad145d43ce36e1c703848dd9dee9eb1d9200"]},{"address":"0xb113c6cf239f60d380359b762e95c13817275277","storageKeys":["0xac204596decfafc4e239289e76d499d6f82b17cb7a9019cd604e75f12f7bb96f","0xbcb1fa48d8cd1a8c2b27d56ec729913c854ebfb4568a9684779e81898cd306fa","0x0000000000000000000000000000000000000000000000000000000000000002","0xd2b080f22e7c8e771aab9a0935d6a81102a991b4daecd9698843c4bb2ad131fa","0xd5154ac1987598a8962ec88c36f664a2d3adfbb90522e7e9f119eafac1ce60c9"]},{"address":"0x4585fe77225b41b697c938b018e2ac67ac5a20c0","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000002","0xa00e9f45e9f0c328446d13a90db1b8ff531c4946ba6a4294a1ec03159cc44b19","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004"]},{"address":"0xcda72070e455bb31c7690a170224ce43623d0b6f","storageKeys":["0x9cd24bcfbe8c9604b378cadf087a22ea52c82c63861ffb5b90c4a6a5f99594c0","0x321f5a21353f34bacf52f20e9ea1f561291b4ada01f3686d0e44a0c2fc4d45bc","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0xec12166352a929db150b20ec5eab62817b9ecbcd49f6b61aa8545f0002016f6a","0x9cd24bcfbe8c9604b378cadf087a22ea52c82c63861ffb5b90c4a6a5f99594c1","0x0000000000000000000000000000000000000000000000000000000000000b87","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103","0x9cd24bcfbe8c9604b378cadf087a22ea52c82c63861ffb5b90c4a6a5f99594c2","0x1b13ec3c3ba200b4b6f90dc0d5bc2382a99e2a9e56878a75e8e3536c69abb192","0x9cd24bcfbe8c9604b378cadf087a22ea52c82c63861ffb5b90c4a6a5f99594bb","0x9cd24bcfbe8c9604b378cadf087a22ea52c82c63861ffb5b90c4a6a5f99594bc"]},{"address":"0xa06735da049041eb523ccf0b8c3fb9d36216c646","storageKeys":["0x793d232013c3ca5798e03797eea9305d9686c1cf61bd11f0b7e11495d00b2a47","0xa4fe6305e95f4e6bc8ffb29c48c741fdccd4a3a825766f6851c0bb6a3c5a430e","0xd78816b6ea38002cabc906395bc302f691a26fbd2d47893700eb1b37ac974b2c","0x0000000000000000000000000000000000000000000000000000000000000004","0x7485129ff68052e4685c51d739003f4797fd13a79328917e65349efeeaeadb60","0x63d87a887046e0430be80fdeb014107d7198c879cbf2cddf39a6df195c86cb38","0x528e688a4c3f3a1be8003de8dfc03e4cf8b9a262436505f4bfe90e18c0676718","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000002","0x7fddb37e508966bc079738b02a2e724203498db26deb50f7808dbefa9a3adc40","0xb3edd0d534d647cffdae9f1294f11ad21f3fcf2814bea44c92bbb8d384a57d9e","0x1707920804a6cbab161d9179b0477dcf9cbecbc16267d2333df6e79678ca0946","0x0000000000000000000000000000000000000000000000000000000000000000","0x1bdcb058d2b68f38fa607b48f9c45ae374d28f121439e045e6b2267532352b69","0x64c15cc42be7899b001f818cf4433057002112c418d1d3a67cd5cb453051d33e","0xd9a4f05527f7bea5b7b09c5ef989acdc31959e831882764fcac5ea635f66a44b","0x2a4e0dcd0728ffee5645e8c1ac97f571875c267f7349831e4717361af185c290","0x0000000000000000000000000000000000000000000000000000000000000001","0x26b4a10d0f0b04925c23bd4480ee147c916e5e87a7d68206a533dad160ac81e2"]},{"address":"0xae45a8240147e6179ec7c9f92c5a18f9a97b3fca","storageKeys":[]},{"address":"0x61fc714059ed8b42f4c3e6953fae3a70e6750b04","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a"]},{"address":"0x9155bb1d5b63f924f399995f31f9c73f0a64e227","storageKeys":[]},{"address":"0xc662c410c0ecf747543f5ba90660f6abebd9c8c4","storageKeys":["0xb4c82a817c6e58e43d4ecb2529caab94383420d8f31e963cfe54dfe32d2cca56","0x34eeebe9e8dc55f09826dd5222aa0cb400f6d739c369892fd57ce52bcf38ac6f","0x71a8ef1b1265359d77973c3524afac225c0a0d829a0d4da5cac3b34532019fee","0x9162bc4a5f76b79aede25ee2ae7d2df0d7b1804f107c012968394639f46582fd","0x9354578088d44b2e97576feee286ef8ea3affb76bc44d5c83953b5c244404e44","0x67963652696f3a8e8976c8d0956f2afb2fdf053b99be7bf625d956fc88a52815","0x8cde0e99a4532474b22bd3952cb1c6b00478babd3678337325283f4f48110fc4","0x177667240aeeea7e35eabe3a35e18306f336219e1386f7710a6bf8783f761b24","0x71a8ef1b1265359d77973c3524afac225c0a0d829a0d4da5cac3b34532019fed","0x04e7be39f2fb63cfd7d4fcfe19f108bc6b411ed972d99fca0a47dcaff878ce5e","0x71a8ef1b1265359d77973c3524afac225c0a0d829a0d4da5cac3b34532019fec","0xa9b49f2ab6812143fff3c91a372accb361367e6e5b434648ca08c6e70052d4f0"]},{"address":"0x8d2f3ba53de0becd02a768ae47e7daea736d18d4","storageKeys":["0x6f8bcf3c6626aa1586082a13495eb44c5260b2d8c9d5e43b95d384d8a8f9a395","0x0000000000000000000000000000000000000000000000000000000000000018","0xf390c420848802b33b9f99d1225a1ca7b322b786e7fcc98d40f10e514ddabe3c","0x0000000000000000000000000000000000000000000000000000000000000016","0x0000000000000000000000000000000000000000000000000000000000000017","0x919f5b91115577eba5aaa294e02ee010103febab72e0acfdf86e731cfe7d8459","0x8099a7c98d55864bd35c264add872ea3f19e22975214f97a17a70556e5137c3a","0xd0bf1e1ef8ffbea13745e4759156e07241fa8e730b1883710471ca181099754a","0x27a6cae6e9962538c3d4b79c1d12dd6f2e3721ec8b78be8d2c59e2a9c726057b","0xea9bc4850ce4f000c76c6bb3582f56bce9edc52d6ee0e62bc6d2c1e184f17b35","0x0000000000000000000000000000000000000000000000000000000000000014","0x0000000000000000000000000000000000000000000000000000000000000015","0x0000000000000000000000000000000000000000000000000000000000000013","0x000000000000000000000000000000000000000000000000000000000000000a","0xf1d38e698d92a18fa7b264c40ce129d4f1eeb80503a4574860256fbd602e1a38","0x0000000000000000000000000000000000000000000000000000000000000008","0x69963df970e4dd66a99a5028555867b0e0181c9b10d2be93a1e7e427811ad29d","0x8fa2e85a1fd6db242883d22e20e8a625f9ff9a630de7620c08a0b5eeb7fe5f62","0x1030a40d1f2c4eb4844f485fb6114e972905b5322a47b6de6656d7b9de081741","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000012","0x0000000000000000000000000000000000000000000000000000000000000019","0xfee8537133cc89145932ff516bbe7d949564980c75ffaaea974c37b1b8ecda1a","0x000000000000000000000000000000000000000000000000000000000000000e"]},{"address":"0x06d538690af257da524f25d0cd52fd85b1c2173e","storageKeys":["0x86b3fa87ee245373978e0d2d334dbde866c9b8b039036b87c5eb2fd89bcb6bab"]},{"address":"0xe1b6ee8f63944ff8060f382e81c75900efd2a99b","storageKeys":[]},{"address":"0x7ac070f096c6e20931c3dc54f927446be232618b","storageKeys":[]},{"address":"0xdd5c39fac0969a44a5bd12a71feb7c041a6ef605","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000001","0xf38081dfdf02e3ffc50aad06e4e2844f32f17b04fcae6b632a7977242c8e0838","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0x314943e32733e14466843bc8e84553c66878e3b7","storageKeys":[]},{"address":"0xf5074a863cad4ae21b830227a9f67ac86388e0f2","storageKeys":[]},{"address":"0x25ace71c97b33cc4729cf772ae268934f7ab5fa1","storageKeys":["0x0ae0ec7fe2be5ad9ff4a2be6686fdb9afb8ff3e683e9a82ede75059805059d5d","0x453da090ce3606b5b38b21d12b645cde48a017a5b14a6e51116f2991c345cf3f","0x00000000000000000000000000000000000000000000000000000000000000cd"]},{"address":"0x80f0c1c49891dcfdd40b6e0f960f84e6042bcb6f","storageKeys":["0x87d4a730ab55b405e2aa166a5e0a7aed45490fff46ff8702405a03f521112569","0x5e1311bc10e92b49061bef2eba5d3a8415636c5c8d8191fafa1958d1b1bb532a","0x2d370fbe8d7a28ca31eb370beb2547de3d72c45be63abb68ec4b36d0ec83fd50"]},{"address":"0x02a569eea6f85736e2d63c59e60d27d075e75c33","storageKeys":[]},{"address":"0xd0660cd418a64a1d44e9214ad8e459324d8157f1","storageKeys":["0x09d21d1cd72ca28bedd89417af6d994496bfe9008fcbd4baa5057fdb98d2b087","0x5a9a65592d465ecc4faefacdbf705f81e52b932644911b826f5235921c7f6171","0x2f817ba00790e3f5f3a3b5bdb917cb076be4f4b22cfbec79c8100f8a385a94ba","0x9a64696c647da50bf4549e27138ef82e57fac968c5d52e3fd4e34156293ac990","0x7fc15735bce30b65adce5fe18ce41eb918382cc6528beff2e47d804c5db72ed5"]},{"address":"0x1f9090aae28b8a3dceadf281b0f12828e676c326","storageKeys":[]},{"address":"0x28c6c06298d514db089934071355e5743bf21d60","storageKeys":[]},{"address":"0xf9b30557afcf76ea82c04015d80057fa2147dfa9","storageKeys":[]},{"address":"0xcaa79bf8b1d00bf3d4f6dbec6221955871c04618","storageKeys":["0xeea18d0f317f5eeead59e52fdb0579a32b3480e2a13505417495a3dd19d38c04"]},{"address":"0x1c64785eb0153bec603d778690ad70e1ecf6dad8","storageKeys":[]},{"address":"0x71a30bbea64bf575255263b13047dfcc6b78711a","storageKeys":[]},{"address":"0x67bec0c19c0dc563a091d90f1bb12a8a15ebe532","storageKeys":[]},{"address":"0x8d4caed79b68cca8d11e3c46b473177a2f63fa0b","storageKeys":[]},{"address":"0x4150b9603bd87ae5c1aecdf4aa348699af1754da","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008"]},{"address":"0xe93685f3bba03016f02bd1828badd6195988d950","storageKeys":[]},{"address":"0x99c9fc46f92e8a1c0dec1b1747d010903e884be1","storageKeys":["0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"]},{"address":"0x17265d8ea26a56c38018b8763994386ef5ae13c3","storageKeys":[]},{"address":"0xdd1eddb7202bc17dc2dfcc82e0db3f6c0e7c29aa","storageKeys":[]},{"address":"0x4ee94ef72fe26ca854afc548cc4eadf0a025c7ef","storageKeys":[]},{"address":"0x32db8f7f81c60e6405064d935b6e7bc80cb070d1","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000016","0x0000000000000000000000000000000000000000000000000000000000000014","0x000000000000000000000000000000000000000000000000000000000000000d","0x621b780129ea3a3dc49a0e938bf2cf1cc7a1c0257fe2f8975c782627300b4d66","0x0000000000000000000000000000000000000000000000000000000000000008","0x9f27954640f39ca87008025f8e187c67f1533585c3e42370266c12c3b5cc6d83","0xcae8c0dbe15f4d733e1c68bc7e9bd8f5f9eb86404d7b4bbc6a7884e8baa1d7a7","0x6902dcbce88cf7aa874bdd9eb97223fa0818ad50a29b5f6e1d3ef8a31dd84bd2","0x0b8c4d6fafeb15ddab17a2502202fc4a72dbc569b2135de949e00f66b3985021","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000018","0x000000000000000000000000000000000000000000000000000000000000000c","0xa8b9bcdd0fa5949554eac995d6e8dc7ebf2f1cc4012890e260d12d485e9fe542","0x9e8cd7a3b08c32589dabff2beb5439dcb6ad3582c9e719e70f69103c98133a7d","0x0000000000000000000000000000000000000000000000000000000000000015","0x0000000000000000000000000000000000000000000000000000000000000017","0x0000000000000000000000000000000000000000000000000000000000000009"]},{"address":"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48","storageKeys":["0xfa48c8837c8864ae17298a10397a21e7b02b95d9a9badc68599e155bbefe565c","0x8201796ea791887e5c32d454659d5834426f3bcf8c72c57f49b1721da7ecb9de","0x786533dfe123a1690bac9bfd6d7556091344dfa0463df060b9fbd06002cd524d","0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3","0x0058cd6fedcd52957ab8d87ef428633240193df1f57b11dd53dccb733866128b","0xdd7ff14e4670d9076271143b6098a23415c03d5a2684cec1bc2e37c7a801c70e","0x046f6833df90c10340e5f528ec7ee1b38565d9074a5b09ea0e914c05affb2d8f","0x3586c48eb84a9833763746fe9ffb0291e5278c9348ed5553cb93381cea237c36","0xee61682ec263cf9ac626d5a9b0cd5e26edbfa98b5b368b540e65bd739c37e3b7","0x3da550461dd905be4caf205343e38a7f6c367692823414ddf875b0d6a1bd0a65","0xac555b5e3210762911fc78ba84edffd1f1345180bd128ef32c8d4ca2616e099f","0xcb29e014082b9041e884beea62d0d143546d6246b5a51b1b715691b9e3bbaf21","0x1c2adb02a7d920ba237137c4cfe19f87455b2b0701895f5e5944fe4de4d6e5ae","0x9951e5c97f68238701a07028be91c5ba29bde0c65662546c454bab615c93f76a","0xe819cbe81daa538219fb3630a6b9566e17b43b07f0a056f947b17ed2a306e269","0xba01fe1e96824eaff7d8fa2849a602d863bf66103c12d013502acf213dbe0a68","0xf2b2693039a4f5ff7ca7e9eb4c5e683cd4a37c37a45b01c1c6a6ce4010581407","0xcd1718b39694c8b71b5b7030a9f4416a979d5bffcde56263723356d0f75e4776","0x7f9a300ac2c99cd59a2968481ec19fa4cb7e7b5e6f7da3503777f1b14aec9d5a","0x8012ef0505651f6f7fd21a24c82488b31220d4a8802e323c0eb17a68b48bb54f","0xb8aeacf27a6ec1914ea0154422815cbd50ab4495343749641427aa26fc68538a","0x8be0770d0fe89aa07ae3666a41c40ccd6d8e272702e7e1a34d101a87420b0d7a","0x10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b","0x6b51cb52851d27e4a2116a00d61df126d5616d13a8ed7491b919b48f01bfc3eb","0x8f50910e9b2ded728474507c83e45be50eaa754440d4ced26ebe6a0613a25d73","0x644da698052ca806f7482115383dc7568e2e83062c1acee4505e8ba9e0bc586d","0x390f6178407c9b8e95802b8659e6df8e34c1e3d4f8d6a49e6132bbcdd937b63a","0xc6abbba9bb0457c3f19e5b7772be5d630c7ad07112596f2b4ad25b2ab1765004","0x1f21a62c4538bacf2aabeca410f0fe63151869f172e03c0e00357ba26a341eff","0x3a3aec5717af62dfc0f5ede964a3e44cef7c5ba4453963ee6e3545ea9708690f","0x69aaed654713b7d14dce0d398de1136610ca3fa6a8595a57da751619c48c3a9a","0x92b49308bfc175dd178ecb97a1a55a2aa8d92f4e6c0642e98784d18f5463c725","0xb440be4deffff278a0a54bece4d5bba517a3236073012092c2f7526f6434fd2c","0xef9aa6e78baadd9fa11efc775ebe24781e6dd67d28095a72c3297161bfcd60c2","0x2ff7875737b31fef3a5c8b656dca7857f5fce457b5d32cd42e1b3f6a9f599d96","0x6dcc7853f5006668a25edf34db55fa7891e5d60d0f4e321c59a6cae2c6398038","0x72934175c798a2231129645869558a3394847a3e8f7f15a18a1e3f1662de2acb","0x5b1becfd7af05f0504c2763e95671207728e2d68766111a3e7268b876b97e7ea","0xabf1e0bb4f9117a2f1fc0639f2f15ecbe26c83db1288bf14e03927caa0426dc2","0xdd3fe55230fe056a7e73d31ebd2fbad11192626ab8c038aa1ed6cd261f26718d","0x4fd0465de862e927ab2eb5db0ec8bebf40022ed185675e8a081730038cb395a0","0xaa1d7eef82b1597683754d59a758c452bd781c782746e46f20c405afd154bb34","0xed16d4f58241ef39997e5b7e1901868a5dffb92293c7172ff9655cc95cf45832","0xb2b472a2d159005e01011949968c522b0bca0ec0b1751f95a02bae3f8a973c92","0x0000000000000000000000000000000000000000000000000000000000000001"]},{"address":"0x8af0a5658776b68912b22ec954a91b9c20d3f8aa","storageKeys":[]},{"address":"0x47312450b3ac8b5b8e247a6bb6d523e7605bdb60","storageKeys":["0x177667240aeeea7e35eabe3a35e18306f336219e1386f7710a6bf8783f761b24","0x7184681641399eb4ad2fdb92114857ee6ff239f94ad635a1779978947b8843be"]},{"address":"0xc15e9fd476aac7a4b7c1fdbaaf673d95547e9b37","storageKeys":[]},{"address":"0xd07597b64b4878add0965bb1727247ced90c6ce8","storageKeys":["0x1c044131722c039927e6a3b1bd4b747c4472aad115ae16aa9c20dc0e0672f9c3","0x7a03facbe8d2bb931a83fc362468bbaf22b33f1283e598b58715617de99ec7e4","0x51386c9bc7c605e6a3c98ab68b85f550e992d728e5bb05de030b637e7e3d8a2b","0xcf58d9f3a4b31d91092703ee73cb92d0c50dc28004ae3294d08b6e5aaf5f31eb","0xa714ba01ff6976331b4a2558a91983b576e879cb1eb02f6fe9b9b07dd79bffbf","0xaff75b5069ac33468caa13d601269da0ee4fc674f85b0d3b0eeb5d2bcfd89567","0x116e25341563f639ed58f3eee06738b7efef3d38c0fdd59a1702d66fada496f7","0xefd8ebda46dc8ddad393ef8d94d086802841197b86d11019f125833ef99beb48","0x3fdbdcc5a7c9b8295911b8e9a44ad099fa151c5dc8feeb0d5442d361f0d26aa6","0x59813a416b512d7942d56ec2dc10be1c5a96bb20c31833c786030601e121b4bc","0x8efea550137e377188b5f189e99aae0c09a7710572c61386b291c87aeca85cbf","0xcde3fe58956826cdbb5148da293a2ab9436bda2d6ad1f41ed01cc02e9fc9b7d5","0xbcbf48abc06253f4dfd4de17dba0dffe308764a69b4e3513e299adaf31b517e4","0x73be5ecd4ec0a32697bb193b7a852476514fb738006730e8beee6dab5cb5fcb5","0xb259c8c57b197403cf7efec11633f1695ff535ec0062bce25773d4264907f00f","0x578e5a846d9803d75975803e6dd98e48e70a6f1eb7aee6e702bf6a1de56a750f","0x980f427e00e74f6d338adfccc7468518c8c8ea00836d0dce98c5fe154e17bf2b","0x47e9c97fc294a0ff16ca049467342692686c192c036cb09b825d729103dfeb9e","0x65a3ffd40e856dbc201120f9cff1e128e8a91c7688e0871e7eb48a4082adf43c","0x5861ed0f1b28aa408974fab8cb43d3ec70030dbf3bd457a487fd04155b251a69","0x5e4c61878299b875b86b9f7e7eaf180466493978fa3afdf4f89b6e91cad518fe","0x7b6ce01bfb6b35d9ff01dcb56a37e989b7c08c2e0e81ff222d2ca0b5f12b16e8","0xe10a46b4059c1886e48e293880de1070375c360381c0bf20ee52f3ae6f7514f5","0x6cda8d68d3a6bc6ab1ee52cc6d989d9c71b4dbc6537b15e41d0f873f420db925","0xa3d2ee640ba56cdf6f1cb999d43f27bf22d5d9523533f671b028ea004d87cfe8","0x01e1b7384c499a09db86d14161301c11c1624597603d8313c9fd5becc23adda2","0xd7c3b29c29f8a342d03153bd3ef3b08dd1304ac9971ae91c5ef2131e1c56cfd5","0x0b76c9021e8ae7bbb235c193d927ce3540852277fc3ac55c2cc33d2404b605f8","0x761a7eb091e1bc90e3194d34126ba1952765058d31fdbf98c90db45854762106","0xf5d62eeb739aeba3d27e9c9e2108b5e61984ab036bc8775d77f3279b7a2db290","0x08f627d6b7c42ccb2c29ceb3c5d49b247ae7603fd372236a9fdd5a4c9219398b","0xb224181c7c737fe111c273ef4b0ecb913f6a7a682b613404f19b7c7bffaec7e0","0xb6794d459f98415ad02bc5c9f3726f39a2729a0ef2e080c26fc0c0d4a927bf4b","0xec117426ef4f7a4d40efb35d76ff4f791530c4da24ac6ac05c98ff18ea49a7c6","0xacf63e0f0bb734c5a02f3c4d72b5ba2c6d85a5cce5d7d73b36b99283b0b11ff0","0xf6eab92f796f33adeb8980ce988c61adf39e78acf9d786ac1b944d9d2c4a3bb3","0x5da5be7e8ab84aba813385d5509f9a7f563ca9bea9cebf49439b5131b61870d0","0x16fed967a633dc83c80c6e775b3bc6fe8b4709d2dc8342ae8f5fa14eb6f9e6b1","0x26b4a10d0f0b04925c23bd4480ee147c916e5e87a7d68206a533dad160ac81e2","0x054f34253ae7ee42868b3a682f0f0e059096108fb1327799762de43b64f7025a","0xf862e29f5774568ca843e4659901a0c3ca38a04362fc1504fde4fb8f8d21bb26","0x9d1532edbd2e6499793aa4d95a649338e26b9d33e862752225e18b5a6ca41044","0x0d295a22618e9f8a8db825bfe4710351972da2686e3df64675309ec1554ac7ac","0x5c709b43ab43dd33887f4085eb0689efb46b22618631d9d9276df3eeda2c16c1","0xbd611173136c300448731eec8a6909ac7f0d855118b781b413ac67b8d40deabc","0xd84d4a9a20fe59f09725e6d54b6e565df13fdafac540487e3a836a443cd803c0","0xc58cb77e7926651d9a353c8719a8ed3230b0c4e24e17025e6b7a425d512fcfc9","0xd8984f2abd8ff4edc7a98ca08cf90f67cadaa6760f266338b6ec52c11296b533","0x869f49714d2631980607c22b8fd72207800c0b4b33b74ae269cf94e40dbbf950","0xfb0b46da65fcec747ca36bf52105fc0ca030f1236a0909df36b28083ff1dd361","0x47e8e5aded0a843b0de1ea8f62d9816c6287f9069b817f816f8152f7bf15f518","0xb658feb7c705e0fceb679b158e407e9f88064ee67ee0dddb97866f1bf586f6ab","0x3b588c6916374b7fc81c2491e20ba471f73e2668f7727225a67fea444c4a1c61","0x6a186e691358d80d55256a53d1cee6f445df32f555af4c0e6982857dd7ba44a9","0x15a04109d0ebec6642e4a305f67ea1220e5fccca88fc6ae7a2830db0ce6a6e22","0x4490ee64337053bde6dddb8c87a3b54824d9b35fab41cb81a3d0d6d98048fee6","0xe23cc65530a13f10b5b981de261975015f056a18f0e9b23900ea3ba69ecff88e","0xbd25c5f5daf3bd46f85c8fc02609e67508dbdded4ba69729f720da5d0d121e98","0x8c47873dfb409bdab1339c466656c5dcf1f276fa695fb0f7446d7e59af0d3485","0xef506eb464be202838dca16998565b202e9084228d60b34e957fb8a065fb5df8","0xa0951add076260908f33441f2ffe8cccdf68fdd739c01883a7e6abe29b59f0bf","0xe0bd7fed9b93b77ad401688ee3e44f2ad301677885c99dd4720ed962763dcfee","0xdc275c413e6e77752dfe41624056cca2951635ecff1881c93e12d37805ad7585","0x484f2ae77e07955b1701d2b685a720c78d944bb8c42b09faa6bc0fcf44060580","0x1c16998faf2b7e07d5c9b673afaeb347d51371daea0116800478937ae87bbbeb","0x411a55d11247f1949681f45332b7cdcfe00e3253d3b971436ac4afd369b76e67","0x7fb86689dfbda47c2a7231a6e3184eb8e2fea3052e100c44acd906fd420600f3","0x0cd5bc177955d70dfa0ce6f81a0729e6f44ce5fe72ac1b4858dad6fc0c6e5383","0xfe1673ee9ecd9af14490aa53f8958715ae2b6d05252c21c4b82ec854bc006cfa","0xd0212504779dae03acba3645d87ef2e662c3aa81dcd30a9d65b6e742827d7c2a","0x211acfcc4182e31a241a04cd5a94c263b8f0a9e96b8fb893bcd62ea7cc898fe2","0x23d4fb6235279daf44d4cc8b4f002f6aa0f74d46046c78a9a5d8ca911c463d73","0x30c77e20de66bee70c237e10b56ad43e64f406d74114f9e4169d5b5e1823e84a","0x0000000000000000000000000000000000000000000000000000000000000000","0x361fd52a83017e7a0cb70122767dcb7d38c95a8c4c1a9f32c9d4671ef8025f68","0x8a3adf14ac7dc02e841f982b08dc15ab032db96aadb6f2224987d311507e020f","0xf0568dba80cabd44325dd7c1a0ba8a951be3cd8dff68290869eb7ffc33d3ecd0","0xfd54ff1ed53f34a900b24c5ba64f85761163b5d82d98a47b9bd80e45466993c5","0xb67d7da6dbd5ade46880769d498ead5912654513996334e3edd173b2f2911467","0xde17798ff82788684fde6b1964c256e70f94ac606b60fbcd7b05cff66e8e16fa","0x3c3e4a93cf5b5c6c8d0ea66a90cb68880482432c6060cc01c9f9d8a082a4c89c","0x0ce482d09c2c49436993bcf96d7cd40cd044fecb87a2caad99b322fcdef77d8a","0x233a22789d80973ab061781a29e1893674e71e797e0c4f035ca8953a35cf7eb6","0x0000000000000000000000000000000000000000000000000000000000000001","0xb0ee894b20ad4a12b64a51233ea5a66f5e6a401eada16f4a2e18b954d236034f","0x954d19208990a66fe8e48f3369c4b373ba378722cae97eed0f75b3d22e571c90","0x25d0428063013da6e399a5c748fddacd8dc43aa4a92b290dcb70ab26ad09ea6b","0xc3ff0fd0392f538c139495a4104749b9ecb3dc8e5b09960806b3749185eb5f5b","0x3c238d047634914442ec98dcd920cbf918f4a53b7e570f3dbfa1e70d81357772","0xa48544818c2c710afa9849c61ec9c60e8acdb3eaa2885f33b37e118cc8fd04ac","0x0c03c7c7ac52072f3f0259713d2c317f0c880cb4d52a1014f62efc48a48a61cc","0xfb6a17e196097ec134b0c9618d732ee8f073e3aa00aa0a0d121b59aadb198361"]},{"address":"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","storageKeys":["0xc4e8c2ae6ca23828db170f75ec81e748dd4bc5ea48514a9f5a5aeaf0be7815e5","0xb440be4deffff278a0a54bece4d5bba517a3236073012092c2f7526f6434fd2c","0x8defcfff9039edeb845aa046eb9cf748f8e8d35ad6a6728202750764362cf1c2","0xee61682ec263cf9ac626d5a9b0cd5e26edbfa98b5b368b540e65bd739c37e3b7","0x0a140afd01c5321d1a8306c0f87b6ad56641579c41b3f4d85e8a17681ecabd3a","0x9d4f0be8bb21b15421e173fd751bdff27bd8df7c9e46857aaa47c233aa989f57","0x9951e5c97f68238701a07028be91c5ba29bde0c65662546c454bab615c93f76a","0xfb19a963956c9cb662dd3ae48988c4b90766df71ea130109840abe0a1b23dba8","0xc71dfa760d584ebf474c6d1c55ce31ce02f85ea18a5dca00cd2f18491d012f6d","0x3514a0695d482e2591be8de983771ab1f8770ba2fa598524700d7c0d233e4d58","0x3d9c106e01ba0fbaf08e08c2670c7883c12a2a181c027b09dd9cb0eccd300010","0x4fb413805902e1d9a6681d54d7946be4d2c3433fadac4304eb49ef1b5a52a8f4","0x3a3aec5717af62dfc0f5ede964a3e44cef7c5ba4453963ee6e3545ea9708690f","0xb4cb21a7620b3b565014ce0cd45cf13f7ddcf0effa004cced448b633508425c0","0xe03178286da22a27dd0b1f68fb538cd07bc9080172ee9a5a2238416fe86db02a","0x16da94a431a6fdc65bdb2b1a7f35ff84e18bec196d1440d4d1b065ddd2618127","0xa99ab8af0a963ef95adbbdf192a724d8137084c4bb695dbcfe87a7aad70b7629","0xd5ece3e25e88de9f50d022a6326bcf9511aecd2cba269b2f186b2b5a8c5bcd77","0x674994ab631faa049823288ef8b84de2146a4c9528e1ae43eded0b8e59b3c47d","0x9ede93be0d8fc6a5eb9cf1c7345a85b7519d8487a727aef0c2f00ab966aa7716","0x0cfde81cdef18be5b61e36abce423320f5851fb3d2f5f460a99b2537bc6c1c3c","0x682ce56c5f70d09674a5d3e596352a74c7aab6cadac11e2e94f533f0756f8bb5","0xd7dc815db2d835bf2d52b7821d46639ca48b5b15ba862cb7c56bf9f8491af980","0x614a2561a9d44f4bdfc453f63299319dbac9881f80513f44208e073ba927d7df","0x2c47f2c83db5d085fba21d1d91bba6245435c688f64423ba360424c27e4558f2","0xad61338f834dd752e599385be46558b59c2c98f066f5a05ce6527531288b99b9","0x09d0a653d028a303e3445ad078cd9784c32b672ecd784e05dfa863f177744f2e","0xbbf20804ecdbf91165466add6fdfbb1ef937822ac3d118e53a48434fc0d6a287","0xc02b216410b1b775be651ff2405ecb44d9d12d5358f82830fb7f7316f700357e","0x0cb865ff1951c90111975d77bc75fa8312f25b08bb19b908f6b9c43691ac0caf","0x2fdcc99b01e8393a8bf0eaa262e26ba1981b8052fb1ec7ba1213ffeb9028ea16","0x390f6178407c9b8e95802b8659e6df8e34c1e3d4f8d6a49e6132bbcdd937b63a","0x2b83b3e1fb436772e592319bd36c360dddb62d80a39727784d546decedbafe26","0x1b8139bb6c0a61c6886577cf953aedb3825b4b72204203cc1dc2cf3bfb64d908","0xee882cb0e61efbe2f7edd0fe7a9feef75c17c350fbb5f6e38a0a447346552280","0x527728326d46a8e2d6fc8d2a42d36d0f250a3429d523a7b243a663976c0eb909","0xad5156b8ac51ab58160427050d6ce0db61d3d5f2512f904d82752cc0b778683a","0x2e40643618fe3a247bf606027d4625bdbfbb03e72fbff5a03f134226536e73b7","0x73d637d229721ca538a0a2e9712eeef46a1889496c0a60f402b430eba28d4a2e","0x88ca07a564a58da3f8d815159c0216a5efd7374eeb0aa746063ec89ec18158c3","0xd212dcd01ed41455be0b36533ba78a0fdeccda0068b5f90fa610f816600cbd08","0x1781261727bdf41944e3b1b4b4c4a685858610b8b308e198b4946aba6256f557","0xa6299f75ce9751e77050ba6791dadf619368359f2099d07a355657b365a62ab7"]},{"address":"0xc5e7b8eaac10bd261f24e71b928118ba3163b81a","storageKeys":[]},{"address":"0xaf1931c20ee0c11bea17a41bfbbad299b2763bc0","storageKeys":[]},{"address":"0xb830a5afcbebb936c30c607a18bbba9f5b0a592f","storageKeys":[]},{"address":"0x531b85dd2c4f7f913e0b20080232dd27d72b366a","storageKeys":[]},{"address":"0xa458f400e5fb141e13b33acd48056135fbb629b9","storageKeys":[]},{"address":"0xf24b4a0307ae828ca59ab0d77a0cacf5dca68def","storageKeys":[]},{"address":"0x2f3633184849d57169189eac6768029aea9a70d6","storageKeys":[]},{"address":"0x7e75debaa645805b1aaa4c5a41aa11dbcb198215","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008"]},{"address":"0x3c3d457f1522d3540ab3325aa5f1864e34cba9d0","storageKeys":[]},{"address":"0x596d13aba9d144fd092d2fb661ff24ed40e24694","storageKeys":[]},{"address":"0xd8d6ffe342210057bf4dcc31da28d006f253cef0","storageKeys":[]},{"address":"0x4b8c0a0df725750aeb948816b4dffecd32ee9008","storageKeys":[]},{"address":"0x0000000000000000000000000000000000000004","storageKeys":[]},{"address":"0x89f0832cb159809eaecd956c7d11abbcee46cfaf","storageKeys":[]},{"address":"0x6b9353bf4f90abdb218979b7596fafc3c6c6ac64","storageKeys":[]},{"address":"0x66a71dcef29a0ffbdbe3c6a460a3b5bc225cd675","storageKeys":["0x53b3987129051b28fa17fc2a027d7202b5985bfe6bd9201944a7c814fcc8130b","0x677e4f2cade567aa555414e24ea2492afaf4a490fc6c171acb0f03e0713a0188","0x0000000000000000000000000000000000000000000000000000000000000008","0x5a1e8bc90d0113cdefe68a8d52149bb916ffdb9842f14a2a8352eb60903b9f87"]},{"address":"0x16938e4b59297060484fa56a12594d8d6f4177e8","storageKeys":[]},{"address":"0x4a09cc5bb69e1e2e0483093f4ad1bb746fe5d103","storageKeys":[]},{"address":"0xef9080ae61c13c8d389b1811b5708fb363f39be1","storageKeys":[]},{"address":"0xd9db270c1b5e3bd161e8c8503c55ceabee709552","storageKeys":[]},{"address":"0xf0715a936f7012716e598f928715d15acc9a005b","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000000","0x7e0a242fa7bd05420f4edd55f05bd76c7b4a976b6238fc8caa429635d309caa0","0x6f56f6e7ec7a32da85f50a83d518c516bb3cadd20c78f39181e38684dddcb664","0x4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c8","0xe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0","0x0000000000000000000000000000000000000000000000000000000000000005","0x834e0c03dc62686e81f31dc0c99974500e851424aa07d5d6d7f3bdfd74930377","0x0000000000000000000000000000000000000000000000000000000000000003","0x5346584f5bfc66a3c00ba6498c1f513bd618ce63c791928a75f372c176d6c302"]},{"address":"0xad3b67bca8935cb510c8d18bd45f0b94f54a968f","storageKeys":[]},{"address":"0x543ba4aadbab8f9025686bd03993043599c6fb04","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000003"]},{"address":"0x8898b472c54c31894e3b9bb83cea802a5d0e63c6","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000020","0x000000000000000000000000000000000000000000000000000000000000001a","0x0000000000000000000000000000000000000000000000000000000000000002","0x346d7abcbcc8b89b045d0adbe9840aa99f8e7cd713cdbc799f6570bd199c97eb","0x346d7abcbcc8b89b045d0adbe9840aa99f8e7cd713cdbc799f6570bd199c97e9","0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000017","0x346d7abcbcc8b89b045d0adbe9840aa99f8e7cd713cdbc799f6570bd199c97ea","0x346d7abcbcc8b89b045d0adbe9840aa99f8e7cd713cdbc799f6570bd199c97ec","0x346d7abcbcc8b89b045d0adbe9840aa99f8e7cd713cdbc799f6570bd199c97ed","0x0000000000000000000000000000000000000000000000000000000000000004","0x762c1b418f310e512ecc83bc4de7cec72478814fac3ae3346b0f163b71a187a7","0xa550ba85c46b24b567d2e17cd597f2283877afab43603f46d5de7858f1bdb732","0xa550ba85c46b24b567d2e17cd597f2283877afab43603f46d5de7858f1bdb731","0xda0c63964ba5c61c41eb4d4968a986e821c685b5ead417aaa506855a5436aa5c"]},{"address":"0x736468c5f3d08dfab3f7ffa8f767cab09fab6968","storageKeys":[]},{"address":"0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640","storageKeys":["0x320975846a116b11411a5cfde94c56d7713040529fd53bc4095fb1022e45da01","0x0000000000000000000000000000000000000000000000000000000000000195","0x0000000000000000000000000000000000000000000000000000000000000196","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000001"]},{"address":"0xdce92f40cadde2c4e3ea78b8892c540e6bfe2f81","storageKeys":[]},{"address":"0x6d9db9275c144533071fea75866993ef2afcaab7","storageKeys":[]},{"address":"0x0000000000d3e910c999cfa4a016eaafe9fcb604","storageKeys":[]},{"address":"0x689e0522cac371144bf5eb5e1a320680d22b344a","storageKeys":[]},{"address":"0x41c9e7e34f30cd1d0e7ef1c0b98eb2c286ac6197","storageKeys":["0x3c442c4a026023d292cf172100bd4fafe9bc2cbc06901ad42977fa664c68d620","0x0a4756f4975ef29a29b01082ceda16ae35e77fa24fba8bde4d115c94e88d7eb5","0x2645749a946633740611cfc8178319f0958659d6922e4bf7e3a08b44789f53a4","0xf682ebea514a9e2b85c1a43cd563e10f2a61d99e157a356a6b9c80c17cdf41ad","0xbc1abd666eb357c16b7b3522aa4f16db2ac78b1440b3ea37d2505b36aa96f526","0x788d4ef1b062837b26f7fd9c101ab7a362a96fbc8957a96071a3dafe30351e2d","0x96648185182926add89ee4d5c354d3f3e8383a8966d4d875bd8575e13aa27a96","0xbc1abd666eb357c16b7b3522aa4f16db2ac78b1440b3ea37d2505b36aa96f527","0xe631f0829bd5d2248f5696f0445b749428c5508eab157fc97958c36dc8731f9f","0x6dcd433636645314e4bb32eba4dd5f9ca7e80455e16a6e723e255ac50f864570","0x0a4756f4975ef29a29b01082ceda16ae35e77fa24fba8bde4d115c94e88d7eb8","0x788d4ef1b062837b26f7fd9c101ab7a362a96fbc8957a96071a3dafe30351e2f","0xf682ebea514a9e2b85c1a43cd563e10f2a61d99e157a356a6b9c80c17cdf41ab","0x971ed63485f6dfa95ad843c866b9f66226ad11f47ba98e62a3a56cff07b7c68f","0xbc1abd666eb357c16b7b3522aa4f16db2ac78b1440b3ea37d2505b36aa96f528","0xabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe05","0x0a4756f4975ef29a29b01082ceda16ae35e77fa24fba8bde4d115c94e88d7eb6","0x0a4756f4975ef29a29b01082ceda16ae35e77fa24fba8bde4d115c94e88d7eb4","0x036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0","0x0a4756f4975ef29a29b01082ceda16ae35e77fa24fba8bde4d115c94e88d7eb7","0x788d4ef1b062837b26f7fd9c101ab7a362a96fbc8957a96071a3dafe30351e2e","0x6dcd433636645314e4bb32eba4dd5f9ca7e80455e16a6e723e255ac50f864571","0x6dcd433636645314e4bb32eba4dd5f9ca7e80455e16a6e723e255ac50f86456f","0x0a4756f4975ef29a29b01082ceda16ae35e77fa24fba8bde4d115c94e88d7eb9","0xf682ebea514a9e2b85c1a43cd563e10f2a61d99e157a356a6b9c80c17cdf41ac","0x0000000000000000000000000000000000000000000000000000000000000001"]},{"address":"0x6352a56caadc4f1e25cd6c75970fa768a3304e64","storageKeys":["0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x0000000000000000000000000000000000000000000000000000000000000065"]},{"address":"0xdfd5293d8e347dfe59e90efd55b2956a1343963d","storageKeys":[]},{"address":"0x9f5346d3a4166768e54fcb104190a0646718dc38","storageKeys":[]},{"address":"0x9da2c7d27df3d81d5d0270dc388ac5682cd1f441","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0x5c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f","storageKeys":["0xc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f7616b6","0x0000000000000000000000000000000000000000000000000000000000000000","0x239fab1eaf3eff0b6b4838c45e97fbdb63391bd921b9456d845351920c831a9f","0xd2f9d1488d8e54b331b10402bc9a97cc52239f25420b3aef9af5866c7478903f","0xc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f7616b7","0x9695bfa5caa0bf4902cb5e39eec5610b8d5635fd6e7f233ca1eea2baba7b5ca9","0xb2aa9723118528045c732641b4e2e77ed50f8f9cbf314a97a95d66021eb9e6e4","0x0000000000000000000000000000000000000000000000000000000000000003"]},{"address":"0xe8e847cf573fc8ed75621660a36affd18c543d7e","storageKeys":[]},{"address":"0x1fb27938ed2909b94dfef7023a9e00f143bd7293","storageKeys":[]},{"address":"0x3ce8cb5b2809a7094ea35aaaf1f039ec68f9c354","storageKeys":[]},{"address":"0x489dc2a0767fb775d851f678babb5a150e2ec6bc","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000000000000000000000000000000000000000000e","0x000000000000000000000000000000000000000000000000000000000000000f","0x0000000000000000000000000000000000000000000000000000000000000013","0xf318eb6180bf9fcefbc38616da1ebdd433d8c812b72031058da166e6417d6cea","0x000000000000000000000000000000000000000000000000000000000000000a","0x88ca07a564a58da3f8d815159c0216a5efd7374eeb0aa746063ec89ec18158c3","0x709cf7b3021c74484e2991069d4c044114525d03ab6d9b0914fa7c2cd637d43f","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000d","0x6fff2fafc58944079853d65fccec9fb0c80d0fce58d3c1351886b2500603d9f1","0x2018ac9c66a42e968f350a32a98c7eef7d47691f95dce397a62657fb51b63d3b","0xda90f15a2cb0eb801768ded66ed2467608f403fc4b94a8cbff5931df1d01cad8","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000012"]},{"address":"0xb987c7cfbb6cb65ed900b0ab0a85d2a337fcda9d","storageKeys":[]},{"address":"0x3be3d1e782c24938c37186577ba99456a0ba93f1","storageKeys":[]},{"address":"0xe6b738da243e8fa2a0ed5915645789add5de5152","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000"]},{"address":"0x4a8f8d7fb0255d2231f56682386b88141915d1c6","storageKeys":[]},{"address":"0x34cf7afef019fd2324480789b512dbe9da4d77d6","storageKeys":["0x95a31d09169ab4887dbc65e703af1540729d39f0ca019af01c4d6a68a2a05982","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000006","0x000000000000000000000000000000000000000000000000000000000000000e","0x000000000000000000000000000000000000000000000000000000000000000d","0x8ea8d983ce4000b9150f84945d30874955f03dce08304191b69e256ad3f37dc0","0x07d0a6a756c208d8fb4fd3a62fd8640f3dca18b06da96a713cbc86110763aaf7","0x4ad85b8a1c588f0225296a1d5b2e903a7f072a9b2ba328c3234cad07ada115b0","0x85cd5ce9dd2f938e4e2b0293c64e6bcc83ebc9f8ac2a966a769cfb1a7f708eef","0x825bef5be1f104c75584f1df5320ad96146232b95bcf40d28d0a27aab8c4329e","0x0000000000000000000000000000000000000000000000000000000000000012","0x000000000000000000000000000000000000000000000000000000000000000f","0x0000000000000000000000000000000000000000000000000000000000000013","0x9466cf6761b3495eff41bec8bc32674dc3d8dc4501923951a73c05683b368fbf","0x0b8e4bd62403d9f80aab2c0ef9be797d5bc1971939928af12736482e8d27d231","0xe06759f18a8e231512bde1eca0ab9bab87814b575ff7806294229b964ad036bf","0x003d7e63d011b4382c27e7f7ea22225a81e004c958700a716bb47a08271b0b83","0x0000000000000000000000000000000000000000000000000000000000000005","0xe9570ec067158153bf8712f8a6845e4a2460ebfe69bf46053fab2f9a9871dabd","0x26e22803a4d02724c13feb9acde49cff4cb05832bd0d8a6c6ae88ad94e2f9c85"]},{"address":"0x725e704b6933be9896c717f735e5a5edbfc7193f","storageKeys":[]},{"address":"0x3fa73f1e5d8a792c80f426fc8f84fbf7ce9bbcac","storageKeys":["0xe4ced1d64d16c07c4d599507f687d256ec3fa4a67d4deb47157dc446c74190e0","0xbe7376c7d25479ca917b2d177ec7f37e35941a45ec11fe363b66f7d0fe2c68a5","0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace","0x7d63b2f3323c3188a4dd521dafd4b34024820f036082740e91ddd8c198f9dbb4","0x0000000000000000000000000000000000000000000000000000000000000008","0xce0edc4107994ff8b742eb6f22256d994fa4856d91c22c761866015c64c635c9","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000007","0xf3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636f29","0x5d7cc7dbe140af4534d7be8e5f9efa37975bb12d2d5c4cd0d72d6b421c62dd00","0x0000000000000000000000000000000000000000000000000000000000000011","0x0a28eb57ea52997b7f6bcb9432cb0ff306f27d2c8ff0add15d74aaa2023ebb3a","0x0000000000000000000000000000000000000000000000000000000000000002","0x658d2488e049ecf069285f01ae0883f370fd5c75b3a3576bd1d4072fde038e32","0x7051c0e62c07cf8eed60bcf52739bcc8892e4d81227d2007a53b342da400bd1c","0xb62970be2a3d95e5f7da9664e84b583927a0c596d57739dde9674a0743315f22","0x5d7cc7dbe140af4534d7be8e5f9efa37975bb12d2d5c4cd0d72d6b421c62dd01","0xc88ba530ccd40c915f2b6cc494a9df1c4c3d538b8411484b0cba887452882634"]},{"address":"0x368ae5dda5873cb9ac125759123c2ce049fa3556","storageKeys":[]},{"address":"0x28a9e7bbed277092e2431f186e1af898962d4e92","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000037","0x0000000000000000000000000000000000000000000000000000000000000051","0x000000000000000000000000000000000000000000000000000000000000004e","0x000000000000000000000000000000000000000000000000000000000000003c","0x000000000000000000000000000000000000000000000000000000000000003b","0x000000000000000000000000000000000000000000000000000000000000004f","0x0000000000000000000000000000000000000000000000000000000000000033","0x000000000000000000000000000000000000000000000000000000000000003a","0x000000000000000000000000000000000000000000000000000000000000004b","0x0000000000000000000000000000000000000000000000000000000000000045","0x0000000000000000000000000000000000000000000000000000000000000032","0x0000000000000000000000000000000000000000000000000000000000000036","0x0000000000000000000000000000000000000000000000000000000000000041","0x0000000000000000000000000000000000000000000000000000000000000044","0x0000000000000000000000000000000000000000000000000000000000000043","0x0000000000000000000000000000000000000000000000000000000000000038","0x0000000000000000000000000000000000000000000000000000000000000050","0x0000000000000000000000000000000000000000000000000000000000000053","0x0000000000000000000000000000000000000000000000000000000000000039","0x000000000000000000000000000000000000000000000000000000000000003f","0x0000000000000000000000000000000000000000000000000000000000000052","0x0000000000000000000000000000000000000000000000000000000000000035","0x000000000000000000000000000000000000000000000000000000000000003d","0x000000000000000000000000000000000000000000000000000000000000004d","0x0000000000000000000000000000000000000000000000000000000000000040","0x0000000000000000000000000000000000000000000000000000000000000034","0x0000000000000000000000000000000000000000000000000000000000000049","0x0000000000000000000000000000000000000000000000000000000000000042","0x000000000000000000000000000000000000000000000000000000000000004c","0x0000000000000000000000000000000000000000000000000000000000000048","0x000000000000000000000000000000000000000000000000000000000000004a","0x0000000000000000000000000000000000000000000000000000000000000047","0x0000000000000000000000000000000000000000000000000000000000000046","0x000000000000000000000000000000000000000000000000000000000000003e"]},{"address":"0xc3112f7c3037ab2653d78da6f68c77f00682c8b6","storageKeys":[]},{"address":"0x869ae5761c9f866f47c75874fe5e2fdda1ee65d5","storageKeys":[]},{"address":"0x76d788704a6771175b47399d7ad28d092e8f70b5","storageKeys":[]},{"address":"0x80cf916402ec71de83c075c8172cec3d1bfa04b6","storageKeys":["0x4444cd5680745c72535fdbda5ad24a30aca93377f3e79b8aae7ead0ea8a8c74d"]},{"address":"0xfdc25b5f93b539e26325a630d733b0f3668f6b5a","storageKeys":[]},{"address":"0x156117da54cde3427320297266b6520a1da5e3d5","storageKeys":["0x20ea521a6bf40c1b7d633055d552704fad3e611ec114f8135b534b2d8de8f1be","0x0000000000000000000000000000000000000000000000000000000000000001"]},{"address":"0x999fcd9d9baacda40beaacc4a126d5000b88c79b","storageKeys":[]},{"address":"0xc00e94cb662c3520282e6f5717214004a7f26888","storageKeys":["0xf54c17c939c95056b2371bb181619f0a479c2ff3a009eaf6fcd506c66065cb33","0x5f4a958d163293ab9558661b2551cb459bedfdd0bb79aab5bfe21012cc5e3fea","0x4902ca1e86b78ed620d5941365e5a4b9896577c6563e2c3e8efe890ee92c121f","0xf1e30897d541b888444c9d0956343148d81197d9274d4220f3900fb3bb395ee8"]},{"address":"0x10d2290b6499b28c31aedf746465a20e470bf59e","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000033","0x000000000000000000000000000000000000000000000000000000000000006e","0x5a9158cf32ce502a1c575369bfcdb49409273affe10157f52669ded2aed37121","0x1631c29e4eb189ae257f8587355ceb78bcb6f9478087572ccbbde079fb4045ab","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x04823950daccb52300ecd20f0f6096c72a77d1caec3e569189da960be4941176","0x1631c29e4eb189ae257f8587355ceb78bcb6f9478087572ccbbde079fb4045ac","0x0000000000000000000000000000000000000000000000000000000000000065","0x18c8cb20752177317b25472820acbe91cedcc3d2bcb99162a7a3edff04a1bf3f"]},{"address":"0x8a7b7b9b2f7d0c63f66171721339705a6188a7d5","storageKeys":["0x659a4ceed2b806fb3f1651a1f9d9eda8a3a803528691ca29ad0cb6903d9faaa4","0x0000000000000000000000000000000000000000000000000000000000000004","0x2bab454520286b51c08bc24844fb90e7fd2f9adacc21d96020e2a6cb17635a2f"]},{"address":"0xdb5889e35e379ef0498aae126fc2cce1fbd23216","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000003"]},{"address":"0xb93a83c9a7a9aab3e64c8220b50f008831858cfe","storageKeys":[]},{"address":"0x06cc6689d7b1a5cc72a7ef8d1f34e32a0895dc7f","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006"]},{"address":"0x98f3c9e6e3face36baad05fe09d375ef1464288b","storageKeys":["0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c83","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c8a","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c8c","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c8b","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c92","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c85","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c94","0x88601476d11616a71c5be67555bd1dff4b1cbf21533d2669b768b61518cfe1c4","0x88601476d11616a71c5be67555bd1dff4b1cbf21533d2669b768b61518cfe1c3","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c8f","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c90","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c88","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c84","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c86","0x0000000000000000000000000000000000000000000000000000000000000003","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c8e","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c91","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c82","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c89","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c93","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c87","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c8d"]},{"address":"0x074f67b15bdc7dfab62a05b351cadfab348ba0d1","storageKeys":[]},{"address":"0x2d2a7d56773ae7d5c7b9f1b57f7be05039447b4d","storageKeys":[]},{"address":"0xa27cef8af2b6575903b676e5644657fae96f491f","storageKeys":[]},{"address":"0xf848ff35058dc7f6e713da7719c17377fddf36e0","storageKeys":[]},{"address":"0xb32c3d0ddb0063ffb15e8a50b40cc62230d820b3","storageKeys":[]},{"address":"0xe903d70549d9943575f62f23f223e488a7a13cca","storageKeys":[]},{"address":"0x5a5d0ad85762979caae341274f0eba22df8ecedd","storageKeys":[]},{"address":"0xa299c04eb002e667bcb6c0d38a024eb5022a5e1a","storageKeys":[]},{"address":"0xd4006530da498c6fede1ef57b962be869932fcbf","storageKeys":[]},{"address":"0xd6e8376a3a257c5d5a6160238e699ec5a089365e","storageKeys":[]},{"address":"0x1c22b5f3938aaa8562fdcd9cdd27b91da6294eed","storageKeys":[]},{"address":"0x6edf968da408a9640b8865826429a977a11c5048","storageKeys":[]},{"address":"0x7dbb4bdcfe614398d1a68ecc219f15280d0959e0","storageKeys":[]},{"address":"0x3871a1ee8727d78be9d6f7c2e0981216f159073b","storageKeys":[]},{"address":"0xf326e4de8f66a0bdc0970b79e0924e33c79f1915","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000"]},{"address":"0xa2327a938febf5fec13bacfb16ae10ecbc4cbdcf","storageKeys":[]},{"address":"0x0d21d05dfaf309c08ce3387658dffffd9814ba89","storageKeys":[]},{"address":"0x1bac8fb482d9603947bd39be9ccc601999d9d445","storageKeys":[]},{"address":"0xa294cca691e4c83b1fc0c8d63d9a3eef0a196de1","storageKeys":[]},{"address":"0x046eee2cc3188071c02bfc1745a6b17c656e3f3d","storageKeys":["0x8730115f3af379603b1e9225ab1e6bc6993b5fd6d0e00c24280a6ba17c0cd6af","0x000000000000000000000000000000000000000000000000000000000000009a","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x12bb162f230eacdcb6a1dd8993845aaad51d84d37c1f42a5dac314937b844630","0x8490efe14c80b79eea7b3398101a3ad00a11df1bb401a0d3ee43993f94cdb5da","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103","0x00000000000000000000000000000000000000000000000000000000000000fb","0xb9a73f10c7c13a0dce66330823ab2fdbe4f6cf54f63dadf2489941e416f0c9f6","0xae725a6314bba6e614463419cb800d0807cc2a4f688ab68828b74bc255fecab4","0x5de73dd11a40bb7b11ed31017e24983073ac791a479fe37c93e89d1271941731"]},{"address":"0xbb0e17ef65f82ab018d8edd776e8dd940327b28b","storageKeys":["0xaf16c2bd9e5946339c6051abc1169e5d66ce508bcb4e938c79c6ec8c0862cc65","0x58be6dab34a060f53791c7e744b8a200203f53d8c29f859ec6abe9e1c596fde2"]},{"address":"0xf186a8d2fbac2986a4b4434b27e3a566571d9e54","storageKeys":[]},{"address":"0x2858a227f9a0578a927311be65c4dab2b739ee08","storageKeys":[]},{"address":"0x23ebcd701fd92867235aeb0174b7c444b9b2b3ad","storageKeys":[]},{"address":"0x8b6a6f5b828f086a2a9d8a3150b958e79e91a82f","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000001","0x8a9a513b9791a18d5272680de0b8170980d584db74d5cc608d89e97f4ae4c892","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004"]},{"address":"0x79df89b7a4bbcd685ec9287578272f43b1f01d53","storageKeys":[]},{"address":"0x9350d003042622f8b7e5b893a6bfa9983a55a6ac","storageKeys":[]},{"address":"0x1a11bc142c3b57ef6c628b7968eb4af8a5b179aa","storageKeys":[]},{"address":"0x6d5e5aabb7579b2db6468150b9a6704430ba8c36","storageKeys":[]},{"address":"0xeb9b9d0af960e9ba579f624cbee86856bb1d7e90","storageKeys":[]},{"address":"0x07245eea05826f5984c7c3c8f478b04892e4df89","storageKeys":[]},{"address":"0x202d5435a180ecb56c9b17812f65482908f700ea","storageKeys":[]},{"address":"0x76f36d497b51e48a288f03b4c1d7461e92247d5e","storageKeys":[]},{"address":"0xaee0eb2ee801e74b8fbc181539c4b0384fd3fe92","storageKeys":[]},{"address":"0xa93546947f3015c986695750b8bbea8e26d65856","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000001","0xce8a96b35e26f33d14c2204bade96454efe3fd165443c5a6a20f3292428e6ca1"]},{"address":"0xfc426a7850205d2aa7d0414345e7c9d7c2e8dd1d","storageKeys":[]},{"address":"0x94ce11b1ef563e6ed61fb3302abc8bcb827b37ac","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007"]},{"address":"0x5756f580d2494a503f5288f38cc5229b36885d51","storageKeys":[]}] diff --git a/bin/mpt-test/access-lists/18363442.json b/bin/mpt-test/access-lists/18363442.json new file mode 100644 index 0000000000..2e177619cb --- /dev/null +++ b/bin/mpt-test/access-lists/18363442.json @@ -0,0 +1 @@ +[{"address":"0xc18ac6f2917d4c9b6ff3dad7e1937da8e9244fa4","storageKeys":[]},{"address":"0x7d2768de32b0b80b7a3454c06bdac94a69ddc7a9","storageKeys":["0xf9a32d67f3f8c78696e247ab205357778797ca26b6edc245827016d71f40901c","0x4cb5a02f592bd29403ce60c982c7f5174b16842da4fff5cfd025d6836dc48d52","0xa5ac31719d9f4564672a106339496685f6250ad08b6ee3bf8e1ddeb0c36d52d4","0xe08aad639ffd10ccac329590adb88878e4ea69ff976a955eed6ae73f151b10d4","0xa5ac31719d9f4564672a106339496685f6250ad08b6ee3bf8e1ddeb0c36d52d2","0xa5ac31719d9f4564672a106339496685f6250ad08b6ee3bf8e1ddeb0c36d52d5","0xe08aad639ffd10ccac329590adb88878e4ea69ff976a955eed6ae73f151b10d5","0x4cb5a02f592bd29403ce60c982c7f5174b16842da4fff5cfd025d6836dc48d4d","0x0000000000000000000000000000000000000000000000000000000000000034","0x53bbdf4cf4f70d2494b9e1c24700a6c1a17d11c747522a0d584f0f40229caaad","0xa5ac31719d9f4564672a106339496685f6250ad08b6ee3bf8e1ddeb0c36d52d3","0x4cb5a02f592bd29403ce60c982c7f5174b16842da4fff5cfd025d6836dc48d4c","0x4cb5a02f592bd29403ce60c982c7f5174b16842da4fff5cfd025d6836dc48d4b","0xa5ac31719d9f4564672a106339496685f6250ad08b6ee3bf8e1ddeb0c36d52d7","0xe08aad639ffd10ccac329590adb88878e4ea69ff976a955eed6ae73f151b10d2","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x8e0cc0f1f0504b4cb44a23b328568106915b169e79003737a7b094503cdbeeb0","0x4cb5a02f592bd29403ce60c982c7f5174b16842da4fff5cfd025d6836dc48d4f","0xe08aad639ffd10ccac329590adb88878e4ea69ff976a955eed6ae73f151b10cf","0x0000000000000000000000000000000000000000000000000000000000000039","0x67dcc86da9aaaf40a183002157e56801115aa6057705e43279b4c1c90942d6b2","0xa0a618d80eda9243166be83cb7421d97e9dab6ddddd3c70ac7a6b4440256e8e7","0xe08aad639ffd10ccac329590adb88878e4ea69ff976a955eed6ae73f151b10d3","0xe08aad639ffd10ccac329590adb88878e4ea69ff976a955eed6ae73f151b10d0","0x573a3501f034fffb5f878b1b350158420fe247d45136d31a8142b0c05e85e37d","0x4cb5a02f592bd29403ce60c982c7f5174b16842da4fff5cfd025d6836dc48d51","0x53bbdf4cf4f70d2494b9e1c24700a6c1a17d11c747522a0d584f0f40229caaaf","0x53bbdf4cf4f70d2494b9e1c24700a6c1a17d11c747522a0d584f0f40229caaae","0x53bbdf4cf4f70d2494b9e1c24700a6c1a17d11c747522a0d584f0f40229caab0","0x53bbdf4cf4f70d2494b9e1c24700a6c1a17d11c747522a0d584f0f40229caab1","0xa5ac31719d9f4564672a106339496685f6250ad08b6ee3bf8e1ddeb0c36d52d8","0x53bbdf4cf4f70d2494b9e1c24700a6c1a17d11c747522a0d584f0f40229caaac","0x4cb5a02f592bd29403ce60c982c7f5174b16842da4fff5cfd025d6836dc48d50","0x4cb5a02f592bd29403ce60c982c7f5174b16842da4fff5cfd025d6836dc48d4e","0xe08aad639ffd10ccac329590adb88878e4ea69ff976a955eed6ae73f151b10d1","0x53bbdf4cf4f70d2494b9e1c24700a6c1a17d11c747522a0d584f0f40229caaab","0x0000000000000000000000000000000000000000000000000000000000000038"]},{"address":"0x28c6c06298d514db089934071355e5743bf21d60","storageKeys":[]},{"address":"0x4e5b2e1dc63f6b91cb6cd759936495434c7e972f","storageKeys":[]},{"address":"0x4d224452801aced8b2f0aebe155379bb5d594381","storageKeys":["0xd32652d49c22eb15f53a03c8f2a2bd3924f9bd0d2cfb52a65c6f39b7af1a2e9e","0xe681f55376b2c9681f3a00cf93aa9a914f847aae12de5b7a6e7225a1d4dccbd5","0x826106af66bc55e092de57e34f7303f204c36e860d648432b21c3c1cd1706405"]},{"address":"0x1a1fdf27c5e6784d1cebf256a8a5cc0877e73af0","storageKeys":[]},{"address":"0xa009fa1ac416ec02f6f902a3a4a584b092ae6123","storageKeys":[]},{"address":"0x4976a4a02f38326660d17bf34b431dc6e2eb2327","storageKeys":[]},{"address":"0x5b6ee81953dc148768f482cab48caa300abd16de","storageKeys":[]},{"address":"0x5d18b30ac9f5e8d6b21a4b783d95fecc8b3c09c6","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007"]},{"address":"0x539a2750cf14384f4538e15479909b4fcd8f5b83","storageKeys":[]},{"address":"0x6131b5fae19ea4f9d964eac0408e4408b66337b5","storageKeys":[]},{"address":"0x59e0cda5922efba00a57794faf09bf6252d64126","storageKeys":[]},{"address":"0xf53f1bda7ce410bef2ff913bfb832d395e74574c","storageKeys":[]},{"address":"0x6beab36b5d783db20f9c23b5512ba496badae3e0","storageKeys":[]},{"address":"0x5b1085136a811e55b2bb2ca1ea456ba82126a376","storageKeys":["0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0xf817692fe687feecab62d634183cbec5394ef4918eab624e9f9f563a082d01ed","0x00000000000000000000000000000000000000000000000000000000000001c7","0xf133cab52ad4dbb2e8eaf585e026aca2131130b75fa0febe26ab08d4a8bbc545","0x2abe8b52af0dd64db0eee33f305f5695fb5fb2029ac8de4ba2150bb61672aa90","0x87090bc84023a1aa5b68055e01703131dc7a7cb6baade93013d370a5c2896596","0xb62ea3c5bdc1e90ccd012b2c34b590f214282074df0c6e6db72d53775688f2d0","0x237d497f97ac1fc21b567cbd08f9e92f376caf7800ab82d6cc36d3496a06b18f","0x42de056d96efeaee27210be1899b76be1245a2f222b9db3c3dea5d3b6e8ad34e","0xe849ad8d652c2597959eb0bf4201409e0c8a66fc52e4b25c69a4c3b32d4a47a8"]},{"address":"0xf56c5527d68a19e19b5c3e83ebd149b025ed41a5","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000001","0x42a21e1ecae229be9775b4e9bdc7b0538c3953c03a20e818d60bd7baa20ca648","0x0000000000000000000000000000000000000000000000000000000000000008"]},{"address":"0xa78aed7fb05b3dedef24d10a71d0adfdb32326a0","storageKeys":[]},{"address":"0xa76244751c10915a3578ee595e627bc4ad91d930","storageKeys":[]},{"address":"0x59d62639d1da4a7ac14939c4137c7e260c06c657","storageKeys":[]},{"address":"0x46bfbea111af9d40a7ebca47e8c0476a7fb3a898","storageKeys":[]},{"address":"0x9ff58f4ffb29fa2266ab25e75e2a8b3503311656","storageKeys":["0x68fdfc39b76b20f280a010f9491977d8f5b24e2fc048cfc4260b97516c77a322","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"]},{"address":"0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000197","0x0000000000000000000000000000000000000000000000000000000000000000","0x320975846a116b11411a5cfde94c56d7713040529fd53bc4095fb1022e45da01","0xeb2a45b9dac59659535c0aec2a4685de3b79ac8d697dd3329a43b80c480f7b2e","0xeb2a45b9dac59659535c0aec2a4685de3b79ac8d697dd3329a43b80c480f7b2f","0xeb2a45b9dac59659535c0aec2a4685de3b79ac8d697dd3329a43b80c480f7b31","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000196","0xeb2a45b9dac59659535c0aec2a4685de3b79ac8d697dd3329a43b80c480f7b30"]},{"address":"0x03f7724180aa6b939894b5ca4314783b0b36b329","storageKeys":[]},{"address":"0x07e0edf8ce600fb51d44f51e3348d77d67f298ae","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000000000000000000000000000000000000000000c","0x05adb633030d8d54da2381075d18bdc05a793dfbf76d97cd8e98a1d1ae39dcc3","0x0000000000000000000000000000000000000000000000000000000000000007","0x8aeec6bd8c9fc3000379137e7043cd0173e3cb204f76b1de95b97d8b667959b2","0x0000000000000000000000000000000000000000000000000000000000000014","0x000000000000000000000000000000000000000000000000000000000000000e","0x000000000000000000000000000000000000000000000000000000000000000f","0xc3d7455bee9868577bb56f43327cfffc8afc7a18b864e82d323320c141b2ce76","0x0000000000000000000000000000000000000000000000000000000000000015","0xa022cbe094d6365f54f49093ce7a0be53a3634f3fb110245bafbb252a39a79ba","0x0000000000000000000000000000000000000000000000000000000000000010","0xe499bc236e8314ac20e78349e6b4ec6cfec6f2c69c1e87e6b3781c3cf9fc051a","0xb24892e25e57d74f90aad96d0103c6a5d238792d42f1a3e024ff54d1de2c6e4b","0x0000000000000000000000000000000000000000000000000000000000000011","0xc9e2f387119a8df58f3d7c4f05ecc0f8977e9da2dbeb9ad99ae4fdeca3277be4"]},{"address":"0xd195965d637f4e02b7f4b553c4683c202a162e9e","storageKeys":[]},{"address":"0x29bbc2b5aff41a2143f7d28fe6944453178f1473","storageKeys":[]},{"address":"0x951585733f0302630af2cb1ff021565352a86659","storageKeys":[]},{"address":"0x1111111254eeb25477b68fb85ed929f73a960582","storageKeys":["0xfb86d251d2d8efbea48ee2a47bd76a261bef6ec3020d9041b487d21ce317b8a1"]},{"address":"0xcd531ae9efcce479654c4926dec5f6209531ca7b","storageKeys":[]},{"address":"0xa0d5ce77578968d6bd4cd625344e0fd672c22d65","storageKeys":[]},{"address":"0xb53c1a33016b2dc2ff3653530bff1848a515c8c5","storageKeys":["0x740f710666bd7a12af42df98311e541e47f7fd33d382d11602457a6d540cbd63","0x10f0e20294ece4bd93e7a467dbf22ab9ab1740ebd0a532cc53066601e880c0cf"]},{"address":"0x0af3a44aa2048ae1106a42877b9a8eee30653bf9","storageKeys":[]},{"address":"0x99a5995bd8fa3e1209a5272c4c6cc3365cfab0a8","storageKeys":[]},{"address":"0x056c1eb7c23feaefa4ce9187aca960529868fd92","storageKeys":[]},{"address":"0x14fee680690900ba0cccfc76ad70fd1b95d10e16","storageKeys":["0x44f7d82be682e34a3383629805b4c0d7cfe21c89bc29a1f25f155e1b9ed71b22","0x0000000000000000000000000000000000000000000000000000000000000014","0x18df128b82e8930657526e6fb5f92697a1f2317d07e5ba164eb5ba5c846e407a","0x23cce551d9ac00c581147e0d82102e5ab14df4677fb9cb69caf18590b1659994","0x0000000000000000000000000000000000000000000000000000000000000007","0x0aa767a32f1657645f98dc06d4a8dc5ce197cf770ef8cd79e5a2ab7c78023448","0xc248f3ee5cfe723c285bb7f188849af5ee0259f83f79d56b3c78998171be4850","0x9192a4c91a4b12435fb2396493248f068670c887382c1570b608adeb2b520af6","0x55dcb49e63a67e98541951b2916f9f4c5aeda940756e13fbdc1c3ee687f7aff3","0x59ec410f064c401da2bc1461018e0363be03844b08931015145b3dfba3094fab","0xc80fc2e7c48c344663e6847be6e7441887114388d10a3ca2cbd48b78a171ad8b","0x0000000000000000000000000000000000000000000000000000000000000016"]},{"address":"0x531842cebbdd378f8ee36d171d6cc9c4fcf475ec","storageKeys":["0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x81d16f8ff08124c3470152778cead9041e7af2087107c2534feae46c33f982db"]},{"address":"0x31896ebaa868d34def9225f46cbfc0b1c25aa779","storageKeys":[]},{"address":"0x7e75debaa645805b1aaa4c5a41aa11dbcb198215","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006"]},{"address":"0x11b815efb8f581194ae79006d24e0d814b7697f6","storageKeys":["0x32d80bb380a6153715a380340a591610b4f5a62ca0809dce09eefe0e7c37ea7f","0x00000000000000000000000000000000000000000000000000000000000000a3","0x00000000000000000000000000000000000000000000000000000000000000a4","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0x949d48eca67b17269629c7194f4b727d4ef9e5d6","storageKeys":["0x57767c446c539bbc565f295b25496cc8ef54f96473e0388a3f906848246cc146","0x40e0186d76e7e3140e8cb8ea3e58b2004453659ae684588b16ed398c2357f14b","0x46ed70dff4e88de7d66e6571d3936721e1c2e255e7f2b669fb59a70439131f38","0xf1e6cf0a638e3fb130629226277d68693a3dfce33cabe9b890202ce5e6d3cbf4"]},{"address":"0x4585fe77225b41b697c938b018e2ac67ac5a20c0","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000002","0xa00e9f45e9f0c328446d13a90db1b8ff531c4946ba6a4294a1ec03159cc44b19","0x0000000000000000000000000000000000000000000000000000000000000103","0x0000000000000000000000000000000000000000000000000000000000000104","0x0000000000000000000000000000000000000000000000000000000000000000"]},{"address":"0xe95f827838fd9419ef56d7e588f4c8c12060c91e","storageKeys":[]},{"address":"0x6ac108c4c3fe7f4d367513f599da1b9df7c43433","storageKeys":[]},{"address":"0xde8850337c25617580fc337c18d8c6f3e50679a4","storageKeys":[]},{"address":"0xf183185f9b2effb904412c5e89a8dfe0281457cb","storageKeys":[]},{"address":"0xe91d55ab2240594855abd11b3faae801fd4c4687","storageKeys":["0x973f33c0e434b580eb2ab7087fd95bd381f4422eeae16f07a423a190bb1f31a5","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x81d16f8ff08124c3470152778cead9041e7af2087107c2534feae46c33f982db"]},{"address":"0xad8629eb236a1a769898d67c7da58b561d4dd5c3","storageKeys":[]},{"address":"0x059ffafdc6ef594230de44f824e2bd0a51ca5ded","storageKeys":[]},{"address":"0x6f804af4895e7a17daf4dab920f31104e930a77f","storageKeys":[]},{"address":"0x4087456720119e9153bff24291f0605cc6449a48","storageKeys":[]},{"address":"0xeb440bcc93d3bd714fb874e1f24a5ee7722b8c45","storageKeys":[]},{"address":"0xaea46a60368a7bd060eec7df8cba43b7ef41ad85","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000006","0x9732bf2da26ebae5a8f3e0f82de48231224a6f2ab57a0b681c3e6b1b5c42c58a","0xd3cda6710bed842b507c8ca89230f38cf3b047970c3ad22e10aa575020ef8880"]},{"address":"0x5fa39b96dc7aa99ae8ca60dd0427f91ec86db277","storageKeys":[]},{"address":"0x07c904d8c04323ef9fe6bf13aaeba05b62c54825","storageKeys":["0x5bd3e423fe09fb8b6ff74d7ae9502c5c5066ec362d832a28912ad3d41b5d991c","0xcf5fba3d34590e8e85f0c5126a7a9e09971b2b52891635223dedbdf4a63f17d3","0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000011","0x0000000000000000000000000000000000000000000000000000000000000010","0x16b11da3347dbf636d5aca769e49718b1eb46a2a72b79784302d9535222eda88","0x4aecb740b55e2c6254de1063cfe39b0abda92a23413481ac3023c73cd0384a9d","0x0000000000000000000000000000000000000000000000000000000000000007","0x0fe5c537094c9245254d30052e75e832ae59120fd2474a2b5c1a781ca5533b4b","0x000000000000000000000000000000000000000000000000000000000000000a","0x000000000000000000000000000000000000000000000000000000000000000f","0x000000000000000000000000000000000000000000000000000000000000000b","0xba2fffb5b294c0eea83bf5f5e3e4ff09e5f87ec0dd5fea8e35b533e05e399403","0x422889bae5c575fcc8260e224085341ddf7aba1cc1f47370f6eca1557cbaf989"]},{"address":"0xf3808ab2a83efcca2081e427cdc15ec0aa6ad79e","storageKeys":[]},{"address":"0xa88800cd213da5ae406ce248380802bd53b47647","storageKeys":[]},{"address":"0xb4a6d352f8a89cfab5502a6ed227bc3ec7490cf3","storageKeys":[]},{"address":"0x37bf363f0530ced7f7088bddf3931c446d769ccc","storageKeys":[]},{"address":"0x60594a405d53811d3bc4766596efd80fd545a270","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000001","0x608d093ce9933575d78c0796ab9cdc4f1c4212394db9b5269ffa8fa22c833167","0x0000000000000000000000000000000000000000000000000000000000000066","0x0000000000000000000000000000000000000000000000000000000000000067","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004"]},{"address":"0xc99c679c50033bbc5321eb88752e89a93e9e83c5","storageKeys":["0xabf3624c8a015c02dea7345efed1d2d0e53c714036944b86c6fa8d0e98a31d79","0x9c364783779bb46a22caa014a6347200f929e726b93284f08d56e9f7853fe1a0","0xdd3be26bcab0f34289c2cb748b0ea92f67f86ec30cdc15b3c74d8df362b774d0","0x7ed03aa81c5ef0bb64251ee7eb1c2f293f198bc7d89f2d5be8eebe8e5ea98a3d","0xacf8692bc1621db186dfbebe1fa4758f3f5724eade94d388df63491f4c572561","0x127e093215bb2d405ab770d5cbb56864d3fa2c04321a3524a538520805ede1b2","0x95880cd37239b96192e9f9c5ed0deedcc21bd06fef79ed857e9ef9ac74470a3a","0xfd58d2fa6c8041f804957a0454cb4051c69ba6246f18b6c1d9bec54a82639247"]},{"address":"0xfa9c97893edfc2dbf18814467158fb7eada4d8d3","storageKeys":[]},{"address":"0x415ff1afc201eec50beff210a2f456674046920b","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000006","0x637034ff9a9768ec1d42ca6e42f6582a3447eb554d12d9f5461218dd45d1b84f","0xe702df336400ab3ac9d83f673120f6829ea009c1dd586132aa5919c175c32dd9"]},{"address":"0x71660c4005ba85c37ccec55d0c4493e66fe775d3","storageKeys":[]},{"address":"0x1c050bca8babe53ef769d0d2e411f556e1a27e7b","storageKeys":[]},{"address":"0xf081470f5c6fbccf48cc4e5b82dd926409dcdd67","storageKeys":["0x29bf3886dd698f1aa9baebc2edaefbf66002dc935f7e18dc4c3dd04a82a1c337","0x79d5796aca10e4405091624ef37a3c3ed6f73b7fbc2869193017f01a2c32f019"]},{"address":"0x755b1b57ae126f37138a67d6cc6aba15cb64108a","storageKeys":[]},{"address":"0x81dc771e308c76c3e06f635abed7fb24830fb824","storageKeys":[]},{"address":"0x538d72ded42a76a30f730292da939e0577f22f57","storageKeys":[]},{"address":"0x3f059a51ebec78eb78f724733d3d14ede9b1e134","storageKeys":[]},{"address":"0x1b36f43697f9c4700a8200032d7d3452bb3b4d50","storageKeys":[]},{"address":"0x98db3a41bf8bf4ded2c92a84ec0705689ddeef8b","storageKeys":[]},{"address":"0x808b4da0be6c9512e948521452227efc619bea52","storageKeys":[]},{"address":"0xb1d605200428394224a6356d57f295fbe21decc0","storageKeys":[]},{"address":"0xfdfd9c85ad200c506cf9e21f1fd8dd01932fbb23","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0x088876687ac7c4c60cbc0690a4bfae0971964162","storageKeys":[]},{"address":"0xb2dd987769e13382624272549d1807d39517455c","storageKeys":[]},{"address":"0xd7623f1d24b35c392862fb67c9716564a117c9de","storageKeys":["0x79643732f0fe60b4b194a6705d7b99ca7bd8c3ea7ff976b0ae9df422b04f38fe","0x000000000000000000000000000000000000000000000000000000000000002b","0x69d964cd2e1a6e807317c407a8e32bf9639e31a60d7bc12cb4f50d8549a5418f"]},{"address":"0x1522900b6dafac587d499a862861c0869be6e428","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000","0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563","0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e564","0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e565"]},{"address":"0x72e6886d19e9318e0ae17f501ffb368480738a24","storageKeys":[]},{"address":"0x2d108e77ede06f89a0f285b2acc40491fb886ab2","storageKeys":[]},{"address":"0xb81965ddfdda3923f292a47a1be83ba3a36b5133","storageKeys":["0x0504359d2a7818f5457fc89f095b177d7a343e546844cde896347126af569b37","0xadb6fd0d435d41431f81fdb4ec6771dbcc650e185c08dede2212497ad76f4e43","0x98809d4ecc3cef10c6d8c5f2aa7ffc335759d2040bd100ecc9dac66f3aa617e9","0xc1d441304aabac8fb55664b9d185f32ad7fbfc203fbe4587b7a2f62650d4f3db","0x58fc7ac8c990d2b5029ddcd15ce34504df526b017a519f1863dbd1714f441afd","0x0504359d2a7818f5457fc89f095b177d7a343e546844cde896347126af569b38","0x0504359d2a7818f5457fc89f095b177d7a343e546844cde896347126af569b31","0x0504359d2a7818f5457fc89f095b177d7a343e546844cde896347126af569b2e","0x58fc7ac8c990d2b5029ddcd15ce34504df526b017a519f1863dbd1714f441afb","0x8bf9a5b818cfafea5126b6aafd5069579a913f49fbd610f9c7f22b863e48c4a2","0x0504359d2a7818f5457fc89f095b177d7a343e546844cde896347126af569b30","0x129580119028c4ac5f82a93190fcc88f91ef554512ba9caf3a0e82a389f48bd2","0xadb6fd0d435d41431f81fdb4ec6771dbcc650e185c08dede2212497ad76f4e44","0x2c2e07467cfdc9bf3997d92401683c8f031721867da8ddd1dd95e479e4a64f62","0x58fc7ac8c990d2b5029ddcd15ce34504df526b017a519f1863dbd1714f441afc","0xadb6fd0d435d41431f81fdb4ec6771dbcc650e185c08dede2212497ad76f4e45"]},{"address":"0x0b511a9f8e8ccbac76d4b32e6e6f53491f64b547","storageKeys":[]},{"address":"0x3e9d24b9a83d4cb144d01594f437a9b94ccc8d60","storageKeys":[]},{"address":"0x71a30bbea64bf575255263b13047dfcc6b78711a","storageKeys":[]},{"address":"0x9a772018fbd77fcd2d25657e5c547baff3fd7d16","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000006f","0x0000000000000000000000000000000000000000000000000000000000000070","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000002","0x7d35cc2b0520994422695eb24e3bf4f74e9cba2704cae72ecd9ec54409a56afb"]},{"address":"0x2a418a3ad456cd58309ed722fa85f1e564d3d95a","storageKeys":[]},{"address":"0xee9f2375b4bdf6387aa8265dd4fb8f16512a1d46","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0xe8cfad4c75a5e1caf939fd80afcf837dde340a69","storageKeys":["0xf005d90a19dd82911cf92f3f54131b64ef1f4a5c7ddca3eb63a730828b3eda02","0x0000000000000000000000000000000000000000000000000000000000000005","0x12b8ba28555eac908c7ceeaffdb0aaf4c1c68d4c264f05b89b617d175125e4f7","0x0000000000000000000000000000000000000000000000000000000000000006"]},{"address":"0x3999d2c5207c06bbc5cf8a6bea52966cabb76d41","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0x820f8b3fcb557f365f90864a2a22cd0f3731e289","storageKeys":[]},{"address":"0x5a5485a1b0f83f84d62bec94e3c13f05732b1405","storageKeys":[]},{"address":"0x0e992c001e375785846eeb9cd69411b53f30f24b","storageKeys":[]},{"address":"0x0e944d59b8e3a9deb884676440006acc79e35f74","storageKeys":[]},{"address":"0x39aa39c021dfbae8fac545936693ac917d5e7563","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000c","0x05296c87464aaf39494f320324030b6a33b96407c2f70d16401aa3484e5cd1f7","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000d","0x000000000000000000000000000000000000000000000000000000000000000b","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000012","0x000000000000000000000000000000000000000000000000000000000000000e","0x0000000000000000000000000000000000000000000000000000000000000006"]},{"address":"0x6481ff79597fe4f77e1063f615ec5bdaddeffd4b","storageKeys":[]},{"address":"0x8fef490d614fce8b93bd6f28835dd35a8b3229a9","storageKeys":[]},{"address":"0x44a72754b072998e14ae22609ee30231d33c6ec5","storageKeys":[]},{"address":"0x2b33cf282f867a7ff693a66e11b0fcc5552e4425","storageKeys":[]},{"address":"0x16938e4b59297060484fa56a12594d8d6f4177e8","storageKeys":[]},{"address":"0x371267a1863080c5f39229183350e0d87d39743e","storageKeys":[]},{"address":"0x81076d6ff2620ea9dd7ba9c1015f0d09a3a732e6","storageKeys":["0x0bf9273d9da51b108efc6f22ae746ce922368c9d6385ab8e96bf8c607a6abefe","0x31e98e0167b11d20ad3645ffaab0d46b71126d2290e918b23fb89f617ac5dfa8","0x000000000000000000000000000000000000000000000000000000000000002a"]},{"address":"0x17144556fd3424edc8fc8a4c940b2d04936d17eb","storageKeys":[]},{"address":"0xdeb288f737066589598e9214e782fa5a8ed689e8","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0x74bb4995d5f1302b55b14bf6c1df9eb39e3f57ce","storageKeys":[]},{"address":"0xb23360ccdd9ed1b15d45e5d3824bb409c8d7c460","storageKeys":[]},{"address":"0x1634683fe980cb8544a37ad2e00cdea14b6b0ee3","storageKeys":[]},{"address":"0x98c3d3183c4b8a650614ad179a1a98be0a8d6b8e","storageKeys":["0x798ccbe29346a5fbfd5a444781e94d0e404758abd7e34bbd55822bd2969d23c3","0x40e0186d76e7e3140e8cb8ea3e58b2004453659ae684588b16ed398c2357f14b"]},{"address":"0x11950d141ecb863f01007add7d1a342041227b58","storageKeys":["0x6bfeff439fc3303d403eac8f3e782e7ba6bff4a567c7fc87d5d3903899f388a6","0x0000000000000000000000000000000000000000000000000000000000000020","0x0000000000000000000000000000000000000000000000000000000000000021","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0x737e8a8b5f36a388638285d558f80af7fbcecb8a","storageKeys":["0x627e3f23a37a531864664c886159447b884defd31bcb129d01d44041ced07df9"]},{"address":"0xe290c42db4dd54717b6d26ae5ea3ae7da359f034","storageKeys":[]},{"address":"0x5f1ee29361206f1a129e808736f11598356c6031","storageKeys":[]},{"address":"0x5b9e8728e316bbeb692d22daaab74f6cbf2c4691","storageKeys":[]},{"address":"0x235c8ee913d93c68d2902a8e0b5a643755705726","storageKeys":["0x51a58dd99f3ea493f642be715c0ad0564ccfecf4561ae59de2105e5d0f5a5b44","0x0000000000000000000000000000000000000000000000000000000000000012","0xa49bdaeace4a1dd899022db0ee5a98cf586c6a8b4470a8ed149a023c4489df2b","0x55c32dfd9da1450d01c7ed9cd745976a7e63b057bd6d1210c3ee4cb67e6c91c2","0x0000000000000000000000000000000000000000000000000000000000000010","0x000000000000000000000000000000000000000000000000000000000000000a","0x8f8b3b3bf45e71fa27f37364e8552839302e8f27a65455f04f2aef5a28efc57c","0x09e2ff9afe7a62018fc3e2297bb0f5fb17cb71366e867f11e30256536a2894eb","0x000000000000000000000000000000000000000000000000000000000000000e","0xf08565da301a221857aeb4616a40703c4534029e82e52df968583e1b2bbc29c5","0x0000000000000000000000000000000000000000000000000000000000000005","0x000000000000000000000000000000000000000000000000000000000000000f","0x000000000000000000000000000000000000000000000000000000000000000b","0x19a919343236c02e8bbb28d160b783f78a53679e405ae54040da30841a0574a8","0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000011"]},{"address":"0xecfa4e7409917cc9b08a4b02a1b42c3515b85819","storageKeys":[]},{"address":"0x6cb3ee90c50a38a0e4662bb7e7e6e40b91361bf6","storageKeys":["0xec88513cde3236b9759acf08a05c3215ae8cec8acbd844991b14db8cd22d5606"]},{"address":"0x3fda25f27211a138adf211f4c060f2149674be6d","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000004","0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563","0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e565","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000000000000000000000000000000000000000000b","0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000007","0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e564","0x0000000000000000000000000000000000000000000000000000000000000005"]},{"address":"0x5ec4bfcbc12deebbe745d7d92801354fdaa6452f","storageKeys":[]},{"address":"0xa40f67074bc008081cc2596abcd7312952aa67e7","storageKeys":[]},{"address":"0x6598c42d7291167f3a36796b166078422ff301f7","storageKeys":[]},{"address":"0x6982508145454ce325ddbe47a25d4ec3d2311933","storageKeys":["0xba43b84b17deebeec7f36d05cea2b2641fd23600f9e29f5940ca5a63978b912d","0x2cd9b4c4b045b96f74c9d3db0a7c0faf11db8b60aa05374b95c0738a129e5e66","0xe938cbea75928dfc1b527e108d009324e80bc839aeb53f39fe4b2c4a1a363094","0x0b18a50b508350f7c2dd395b6e624b1eb63ca8b44ac906ea700bf0743c2aad59","0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000006"]},{"address":"0x9f7033dde692f37d399f7c5e42e459df2386c9f0","storageKeys":[]},{"address":"0x9155bb1d5b63f924f399995f31f9c73f0a64e227","storageKeys":[]},{"address":"0x9d4578c813d69745092a4f951753ed2b28056279","storageKeys":[]},{"address":"0x2f29943a8ae002074f2b00858722e528ca3e01d8","storageKeys":[]},{"address":"0xbf94f0ac752c739f623c463b5210a7fb2cbb420b","storageKeys":[]},{"address":"0x5bcbdfb6cc624b959c39a2d16110d1f2d9204f72","storageKeys":[]},{"address":"0x7de0d6fce0c128395c488cb4df667cdbfb35d7de","storageKeys":["0x2f4107203adc28ceb484d655e8b8c689f62690ea84d57f1d067d52335c928ffd","0x000000000000000000000000000000000000000000000000000000000000002a","0x330a461656c6966361af62a41198dc5b917e97fffd5a3b22fd236fecd1fdbedf"]},{"address":"0xc15e41eb55af2c0f7c34fb150a688f672d4b1be2","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007"]},{"address":"0x73a79fab69143498ed3712e519a88a918e1f4072","storageKeys":["0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x0000000000000000000000000000000000000000000000000000000000000069"]},{"address":"0x5927a822a5b8d5efabca902302fec6a2a0ce1a22","storageKeys":[]},{"address":"0x102c776ddb30c754ded4fdcc77a19230a60d4e4f","storageKeys":["0x6a0ecfa4bda432376ec1839e62c6ad040351e53d4359a39b95a9952a8809e766"]},{"address":"0x8a32f49ffba88aba6eff96f45d8bd1d4b3f35c7d","storageKeys":["0x49e349d4f386739afdf8e55db7675b584d46c3b2a603eef62554e21dc437b5db"]},{"address":"0x9c9093f71e462ae9b6b4648ed879a2fb1668a4d3","storageKeys":["0xb429116be0125c32063a92ba8f9335363678a83b1b3fd09226f955b16a252759","0x65fd9ef4e3fa0bbfe82662cbae3587ab75dde2dee8ffe1e19be49c42ea857983","0x22ae4e1bb4478d22850525cc287e1e75d275bc0f415ae465e20117943b80e424"]},{"address":"0xdfd5293d8e347dfe59e90efd55b2956a1343963d","storageKeys":[]},{"address":"0x09e4009971f9745075df4494fcbcaeb01582548f","storageKeys":[]},{"address":"0x3b9260a928d30f2a069572805fbb6880fc719a19","storageKeys":["0xd330d89cdd04aee2394d3770fdb76e861e5bf5af7f5638ebd8b9cb9dfa87520f","0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0xbf2d58698a8a215f868cf24baba360c77266b466","storageKeys":[]},{"address":"0x21a31ee1afc51d94c2efccaa2092ad1028285549","storageKeys":[]},{"address":"0x3c3d457f1522d3540ab3325aa5f1864e34cba9d0","storageKeys":[]},{"address":"0x17b31762fcf95a6c8ff5666a19323d5ee525ddde","storageKeys":[]},{"address":"0xf0176e493e8914cd276bda5aa6a91dcdf5609c3e","storageKeys":[]},{"address":"0xa3ed5b592855635c1fbfe1f59486578050234964","storageKeys":[]},{"address":"0xb8975328aa52c00b9ec1e11e518c4900f2e6c62a","storageKeys":[]},{"address":"0xd4c4044aca68ebbcb81b13cc2699e1bca2d3f458","storageKeys":[]},{"address":"0x1796ae0b0fa4862485106a0de9b654efe301d0b2","storageKeys":["0xce6c65c9c3720eefcaad670f10850a21220d706db266128b02196b2b821f46c6","0x30b71248e9c3062e703a3064a163a14e1973646033fd303b14f844df6d46883c"]},{"address":"0xd784927ff2f95ba542bfc824c8a8a98f3495f6b5","storageKeys":["0x7d63527ad1c40424d1866972fc34c3132ec8237fe7036b7aced149ffc12c5c10","0x291444ea7c00a38f3d9c0601b1589a1b31da8aea876afde06f92a7055bf08527","0x0000000000000000000000000000000000000000000000000000000000000034","0xc30a6c66a97b946c6e5ce9899976ff5676feb5097b73f95c40985536be5d6f52","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"]},{"address":"0xd3d9ddd0cf0a5f0bfb8f7fceae075df687eaebab","storageKeys":["0x1ddf7a25c6ce56ee9f12954eb3e786c824c546b0b0e0d8e969cc55f856373d46","0xde5a730b6759f5eacd40cdb0bcf5db10d2dc99f735c85b603d09701b56d6fa4b","0xfcbc0e99f0dbde989e7754c500c808572a1eaf5be1367ad687b9ab677e25f98f","0x0000000000000000000000000000000000000000000000000000000000000000","0x310c1bfbb10ad6987383feb413590481fd21c9bff37e40f326d49c3ee363dcc7","0x5ebfd1a7e94d09423b636e2912b0064abeee6d201af983701e39dc3b677cb20b"]},{"address":"0xc6265979793435b496e28e61af1500c22c3ba277","storageKeys":[]},{"address":"0x69fca11480d66a09f09d2280f806b8a5b85cc7fe","storageKeys":[]},{"address":"0x514910771af9ca656af840dff83e8264ecf986ca","storageKeys":["0xaf89390a66013b9a552732b1e00ddc6e7aba323d057e39b8175c0c4714d6b316","0x4e506517218e6fd1a30d242ea8d040f7cca9231df83c626f127c989eba48e518","0x9c26415195f1f5086037f2f4e262ac2fe5ad02733146273591887dac05d1b31a","0xd330d89cdd04aee2394d3770fdb76e861e5bf5af7f5638ebd8b9cb9dfa87520f"]},{"address":"0x51c72848c68a965f66fa7a88855f9f7784502a7f","storageKeys":["0xeb702a743cfd21101b4e3bd7a3ec8cf8d1ce01f39d4073c9dee5374b01201602","0x0fb940e5a8f01c04e0a95326b0cc1d255b3eae95a2b9a9dfdf12852a20d72361","0x2751eaf94d6c4011edece59f1a1fd921ef96d564fa55c0c6c55748c57e401220","0x78590aea451494431e7f55a43d0ad73d5acbfd1d4035af8d3c9f04c49c521d33","0xe38627b3e89ed8fab02797f51f2e2ea77e141a5ead0c7e7ca04495e891ba9d43","0xb80a9d7d1fb9cb04e9157f542397c1085aaa06f2cf93c672a9f9d45730146d5d","0xdfe5939369c15625a98ab6fd51697e8fec60ad9a81707a4bd7094cf48c04d68e","0x0000000000000000000000000000000000000000000000000000000000000000","0x14260e1e39c9608d07edd9e7d0a9cc83880f85b021a8121ec429be8c6dd99309","0xb2dae8acd38eb9f57a471e2797be145fbcdabc2615a294726b919ebdfb713ffb","0x9bca1234a4955183c0ec3bcf1df677c6c718128f5d868d3558a927461b2476cf","0x885629f4a4b0f4dd95ef131bfc0951563f67cf9cc652e9e5925e2ccbfd142f66","0xd4626a8b64705fdaf56721e89daedd11d9543e165d280b0992cb61da9c7b9d37","0x927a0c57edcdfbce1739182a4eace6e124988679bacee2a219a50707582f30c1"]},{"address":"0x1d5e82dbb15ccc8db23a9b91252bc97e75f5abe7","storageKeys":[]},{"address":"0x6d4073bf817c4cee7ecc1d2037c3eeaa4ab65d8d","storageKeys":[]},{"address":"0x619beb58998ed2278e08620f97007e1116d5d25b","storageKeys":["0x81d16f8ff08124c3470152778cead9041e7af2087107c2534feae46c33f982db","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"]},{"address":"0x3d9819210a31b4961b30ef54be2aed79b9c9cd3b","storageKeys":["0xbccdc544072f1d154275788f84bcf1a9429a7563287106936a820738716d6e84","0x189ce800d0d168d2207e1c5ce2c81af16afc58492d6accd0bdf895381c11ed47","0x6c627db00b3ec0f04ea2ed17d2c73909bd167cfb6ad5af5b2c216bc8ea6da0d9","0x8fc13d1caece6612221ef6979b11849610022c9b44e3f1d08267517678547dc6","0x7f5f2787a3910709ad84d7203166b9923b1065447344f459da15b31d9435affb","0xe3a7a80f43ed498b93fe658098fe84fc45e7f4e46d0da1fe5058a842a2737af8","0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0x9f4911feb3555946f734be0d38ed8efee2149ef0","storageKeys":[]},{"address":"0x7b4c392bca0986b5f9f06ee1e27659f8b5bfb45e","storageKeys":["0x3bad1ee22d4b4da4e4a9857d797772ee449c4c30956c50fe7996cd53981246fe","0x24d6ca0dac231c1f2b7b3f8314f752965620e80fdd76881ffdc9705a01c52871","0x69f11aed767574697e2219341ad07e5e01dea74083d6c0f1c1f411b63dcfaf89","0x87e9eda8959df12f811190dda83c57b95a3d4f8f6571f5b8527a536dab554bb8","0x393d880bd3e96fdef891dd8860dd8e55a5015b6a66e8cf4904d5194988e96640","0xd634291d4b735c4a1de76debf538ea631431e6a6b0644c3c6d9164f1408ee8c7"]},{"address":"0xddde1fa049209bc24b69d5fa316a56efec918d79","storageKeys":[]},{"address":"0xef9080ae61c13c8d389b1811b5708fb363f39be1","storageKeys":[]},{"address":"0xb62e45c3df611dce236a6ddc7a493d79f9dfadef","storageKeys":["0x3aae9e214e2fa8e50f1906539f07d372cbfb95d0726303e7eb3451c9c4804bc0","0x7f9ca86731c9630c99e10b9421238bec3c6485da63102ba8fa22efc8e7c71b28","0x022b476bbe7529ee5698d0416095c6df52c3c69cdf916c45b119690e7b1f1f86","0x4ec4d99ec6d2fd0a3ee3c2c04104ae9b67412fb2052c8b0929a59eb093e25663"]},{"address":"0xc662c410c0ecf747543f5ba90660f6abebd9c8c4","storageKeys":["0x177667240aeeea7e35eabe3a35e18306f336219e1386f7710a6bf8783f761b24","0x71a8ef1b1265359d77973c3524afac225c0a0d829a0d4da5cac3b34532019fed","0x8cde0e99a4532474b22bd3952cb1c6b00478babd3678337325283f4f48110fc4","0x9b5f19058eee7c63de4e0d2462612dd31cec3f879bd630c15aa3352eeba3130a","0x67963652696f3a8e8976c8d0956f2afb2fdf053b99be7bf625d956fc88a52815","0xb4c82a817c6e58e43d4ecb2529caab94383420d8f31e963cfe54dfe32d2cca56","0x71a8ef1b1265359d77973c3524afac225c0a0d829a0d4da5cac3b34532019fee","0x71a8ef1b1265359d77973c3524afac225c0a0d829a0d4da5cac3b34532019fec","0x04e7be39f2fb63cfd7d4fcfe19f108bc6b411ed972d99fca0a47dcaff878ce5e","0xd1d11358ad7cba437acd2599ff8f7c12b9b97ab226aeecd4709c260804b0341c","0x814b7854122c5e357b0afbd8a19ffe8472df7a91952e0e5017103d17b74cbb6f"]},{"address":"0x63a395b574d5e23c3dbc6986be5994ef6743afa8","storageKeys":[]},{"address":"0xb5cfbbd7e6b98475afe3c8ab2aee4ae852146b52","storageKeys":[]},{"address":"0xacfc50ec5fe0fd039e83380b8ab343b77a49704f","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009"]},{"address":"0xff337e9629db413670f20a0d35c46edcfc9d609e","storageKeys":[]},{"address":"0xb04af4843e3808e1fe6f7a8ee4f456937d7afae8","storageKeys":["0x24f2478871bc2a12795c3586c48ab3ef0cac33a5bd5513e8b5948eb1c0cc252e","0xc248f3ee5cfe723c285bb7f188849af5ee0259f83f79d56b3c78998171be4850","0x0000000000000000000000000000000000000000000000000000000000000001","0x2ac45eda366f11bddaaeea4e5ed59efe98a8820fe29acf66012f683803cf5f4a","0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0xe8e847cf573fc8ed75621660a36affd18c543d7e","storageKeys":[]},{"address":"0x704ad8d95c12d7fea531738faa94402725acb035","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c"]},{"address":"0xf2b3a892b1a865da32c315d5b59c5da7883a421b","storageKeys":[]},{"address":"0x085e34722e04567df9e6d2c32e82fd74f3342e79","storageKeys":[]},{"address":"0xcfb675758bf83ba714cb9e68b3a51c90dae5ca7d","storageKeys":[]},{"address":"0xd343d5dba2fba55eef58189619c05e33cab95ca1","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000d","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000e","0x000000000000000000000000000000000000000000000000000000000000000f","0x000000000000000000000000000000000000000000000000000000000000000c"]},{"address":"0xbe69d05f3873f044403ddc603d07591b324cb662","storageKeys":[]},{"address":"0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000001"]},{"address":"0xbcca60bb61934080951369a648fb03df4f96263c","storageKeys":["0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x68fdfc39b76b20f280a010f9491977d8f5b24e2fc048cfc4260b97516c77a322"]},{"address":"0x150f8843d15e8a6c43ab0b4dda755bfc4d63a773","storageKeys":[]},{"address":"0x4a632d9436505dbd6e5062c16d321b4c33bff466","storageKeys":[]},{"address":"0x3b94440c8c4f69d5c9f47bab9c5a93064df460f5","storageKeys":["0xbe4edb14bf9277de627bf0c12b0865f158ee175e1e0fdbf25d08f3713f0c0714","0xba69fbfc5dc9b589e425165582693c74d49c6df6d20771028781a58fcb918ed7","0x832aa3b925bece9a665bae76f2fc35ac4f94ff7e74fdc223e0e2e8adeed434f1","0x6e22e1ccd2db0c08a8ae5f96a77e09fe450e3f1cce3fe3693643b59e38e50cab"]},{"address":"0xab3044d92f7d82bf332898653453a2d9744b4a36","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000004","0x621ad9740c6621dbee22a3d5a4bab2913510f4af07f4f52267f5fba5cdd33954","0x87906a5499ff68b93966dffb8ded6955834aef23e1cf49dab904b9f99e65e6d5","0x4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c8"]},{"address":"0x4b15a9c28034dc83db40cd810001427d3bd7163d","storageKeys":["0x1d9847d0baca698fa161dce6e5e1be4c45442375d5978acdfdfa21e7c84cb69a","0x04a9d33581520c6b378ef218a3f3d8ede7db9022a24a6bcd87bd19b1f58f9f69","0xf81e71c92c32acc914377acac7e5a632b30b2cdb5bfd66ef0d862f2aa3008820","0x000000000000000000000000000000000000000000000000000000000000000c","0x96d48c2878ccd570cfd9f4983ad0ecefd29b77478c3357528825f04b7cda9e54","0xff78195653be9178cc65cf0997516165d0e03c5ad3a30cbaf0524ad833d2897c","0x66b08413dd69a08c7c098c5026d58cff7b64f9033ccb45a77892ec736ff0cdd5"]},{"address":"0xc2c9dda5158f66e1088333cb2f127f46fe843c8e","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000001","0xf377e614ebf060ffd3a592667b14b65ef761b258b68bf422a9c7bfae70ee46e2","0x0000000000000000000000000000000000000000000000000000000000000008"]},{"address":"0x8bb164dda7c138a8c768cac69a99a22379186cf6","storageKeys":[]},{"address":"0xa4e5961b58dbe487639929643dcb1dc3848daf5e","storageKeys":[]},{"address":"0xe8b8db87ddf242ed56dada79aad5bb0f3db7afa3","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a"]},{"address":"0x5fa60726e62c50af45ff2f6280c468da438a7837","storageKeys":[]},{"address":"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48","storageKeys":["0x1f741f753a25bf054ce5bb0d03898f7837befc299fefefab8f05449dd31a66b8","0xa58e983b6bb89647e2658383cfbd16dfc6af473fdc1559c7b788017f58709f9d","0xd131a243a4f8a65fa707b991e8aaf35b5561b2d012ef14740493b1f75e55c0aa","0x78a0666848aae33467fe11a605ba1568a1e9311861554cce842c273f828dd1ae","0x3ba73b07f53cb93ccd18be78c1c8e9918fedc307255b31ecbe55a2bceb8cb8aa","0x4b1db8e192bdf3fce7826fd903b7b3315c56d2770bbbf2cae5cee960bd96a642","0x8d07a8c84a4d3f89791895fd1a6b044c012217909cd4417dc217c52ef105e44e","0xed0cb59692398309f3b66faa75559527f5421a4612ae8a70179664e230f82c7e","0x24c09d9cd41e893582ed9b685c2f61008d4f103548177a791173648a3b141ab7","0xe6680f7eb980be5bdebf498ff1981dbdff16365e736fc0d627d1ab4349ea6027","0xdaa46e04254ce41665cda5fc89278cba437838d5bd53364871dabc5d5924b410","0xbccdc544072f1d154275788f84bcf1a9429a7563287106936a820738716d6e84","0xfdc098bff113ca82d1b3b255e9c5e41664b4b589cc52d23183e245883f6c562a","0x63102869cdb351403a8051928e23543fe78bafcc1bfee686ed78bdc7ec3124ac","0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3","0xd1e9ab0f1cea773167dc4d9bcd074aa45fb231cf0400f4d29db5801c26e8ae41","0x0000000000000000000000000000000000000000000000000000000000000001","0x73c27597781c557765f98a1fe3273f2be87471e4dbfcac56faa155f36d91b098","0x7ad2430453561ef01f93db7a6a45f6f5d908324318fcfd1560c3a758175bc070","0x8125c7b6e358fb37977f8b20593f6ab48ed3e7e123615d3b74e99497e98341b6","0xc830cdf76eda2fd18d45c67a174feeca76eff3f8d2dc939f9c5aa11affd3fac8","0xacdc1b0980bcd6ca7322abff1072a3bf52cfefef165c857818a66b303daff429","0xf274220561bd9979e3de72bf27262aa9b0403e8ff9a6cd3050dc9aff22a0a08d","0x3dbae6a11efc91068573a3f3718075711a52e48b01fcfbc380dd6d6f68fce5fb","0x713782da38878c1e133104840d879e206672fbf86c7012091549db2ad5dd1ae9","0xe1e631c3c3c30b736d406ce1adf4b1426bd8c5ac9dc20f3a06ce9c367f3eb032","0x721115dbc6df353e9e1bafc88d67c7a7b75b36b097f248664a9c371a9cc3d86c","0x605f2bdb17107311c0ebda453fbcbae2642343c1fa5d39dd7ada23d484075cbb","0x44f644dcc1015f1bf35b84f1ec7d6afd47a3aedc2db7e424577a3822b1dfe65e","0x394bc2dd0f94516c3e05c0f71dfc4e0ffd5eb4795de812a54167849af9f751a4","0x854bade951720391b475dbbc09128e86c61a4933af5daf72486d778a52b8ace1","0x10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b","0x45544f144ac23be62f2d1b3bbe9593176ebea62c731b38425d489a7b202f73e4","0xb04fb5fc5ab7f7e00977de50f7c256894d0092ad7e91d00477cdf5619d3295ce","0xa654c14b4af30b2a1513bfb60ff8d6dfab1b87e1b3942a80024a1967cae3ac53","0x88f3305ede7c585ff29cd4b83bd948374dd88c902c64c23ce58790c290298d94","0x239bf8e621b27fd46f4d8632f0d6fe922ccacc92c199c77fede8a2d083c39d82","0x3a3aec5717af62dfc0f5ede964a3e44cef7c5ba4453963ee6e3545ea9708690f","0xd1d8e54aa17b52061dee258dcef066e085f29a75f4ca876126fb8a255e83591c","0x80270de4da90ddfee357caa7de29d60f3193fb9e2bd5bdffc18247b5137cc5f3","0x10f2f3b7c4fa9683a30144f0c344528711b7ff1b6d9091d8c85fa4d0929287b2","0x1ba662b9c5e456a94293853e47f2618b8044d5c2a7ad5390832e007ea35c00ea","0x17d309f8e43b7c8f34242d99654a84580b47c572b8d9b0c740f62ac252246239","0xdd578657406a8f2db893e41d9b769d14c2739e31e1e36ea50390017d9624663d","0xd938959fcb5467b0650f8f17a7af8d7aa736d8973aa2525820865cb6a32c6c44","0x5e1f2fd1d92f67a9febf63c605e83a0a253ea3ac522d9767212558f5aef55939","0x15a0cbb458e788285becd971f20ce3136806005c1ee80707566079f95cef342d","0xc80fe19981a5b35aa5cce4de177cbf80c82072f8cb0a9b194313dd4dac73318b","0x4e74e8bba02d59da084150af724b177738d936bdcd930546d6e8fa39cb7608bf","0x25ad1795301616dd3463e5a1b07c52b661a91c163c4b45269609dacd0a899d1a","0x26e3d1b906ec1d9d8f2e85e8e65ce887158ad9fab7166cbbf6a614b9952c5455","0x078e34790eb983ccdd9ae3a3283e5cc9ccb7bcd5ed727a00ed701508181ff8fe","0xe5cf72a733f56d39a2f80be19fe0ceebb8d89b847dda152aac2c26bf2407cdd3","0x6cdb3e6d3e74610146938ff89649bb2f5a5715da9abd053dfcf11a2343ea3490","0x891251a24261f0f881c34f15b2b5979be1f467d246f8ee93e50b92b8fae6fef9","0x0ac2bccdafd9602c6511a5bbc76e63a724ef5a8db45544b222eff7c1c4253e0b","0x8ba0fbf5d6143c4f0fca5acdbcfbc8d865972d2ac352b0968dc655c7f53dd673","0x613e37f9116ca49b43f08dee513a87e78c3c5a4880e0f389e7366805cb2a969a","0xa4b1c61a508b1e3bd94d88ed0d75f39c6ec3221b792961f6aa5fd9d29f1f45c9","0xed453e8e84ba0f96584f9d33f83393be492e7dbbdaa1a2b188674002eb309294","0x7b297e387df36adb8170d895b3a2be5a1eec722e9db38d74216204b2cc59dcf8","0x390f6178407c9b8e95802b8659e6df8e34c1e3d4f8d6a49e6132bbcdd937b63a","0x238fb56e14131e6a0c6d4afd6773fd359a8e0ec215d3af906bfe65414830c6a4","0xff07ee6e2772c91d8b57705e9d8ad8f91964fefd40f6d6e2f2b8113f384632f6","0x686d47ff3b63c8c416aa244f714e4d2674f92c8572bd2531117aa7fd6d2fb12a","0x816871738f2beed62d92204dfbfeac6a65c2fe37d2d08b445a0c0bee7c6f99d9","0x5361998fa8e73e10915d91c4ded587ebfffc80a8baa65b11af92cb500178c57e","0x49f414f220cabead4627bf003f9d9f3f0ebe76365fa6cd9a47dfb76a5a745c7e","0xf3d78c9384dad187d23d6c01f15fd76796209597862a78e94bed34fbbe2f9895","0xd3400edfa28fdf7eb01d3bfd4c45967343572ecf3afa2ba5cb3957f169acd526","0x3020d5b81a0bc3491f3cd5a8b8d1aaf1d036711f40535eff8ee52db3c2d1f538","0x2fc3a60d03f289b167da142350d2773910d3dcda1cd432b57c087634cc29be3f","0xb3dc4ae9e13ac4acb9b69cd99b9e830528d6e1c175382adcb03273cf4a8a7449","0x1b23a579721482d58bac6de83361cfa0e988b268d31d0400b8d4e824085a89d3","0xef9aa6e78baadd9fa11efc775ebe24781e6dd67d28095a72c3297161bfcd60c2","0x5c78b5f2f12a6dee29ce412e23130364cc07e81d34ecfdb12c0e677a104bf117","0x31062ad0e0b98e9c252f65642bb0fbed69386a8e6baab96797717fa736ad0c61","0xeb63bbe0f1a4672cd92e887a8f1182ed01c6c18ebe80039e2a3a14f3df59c26f","0xa75285fd893c4d64fd17ed31b6ea447551f8706f8f5968e91e38431484149438","0x71901719a5eb8aef036f3f8af568881562f22ef26efe506856bf55f3232b88fa","0x1fd11129af61843822dec4a1d08cc615a863d81c59c7e5847208232a591bd77f","0x4240f817d568e2b9ccda64e46ab25ad40fd6977c04f8b2f68a9684457555cc44","0xb7574d157c4abde95c4fa0abed26b21f8195b4607898e3b48aa49a7fdaf39468","0xc4a779d6798f07c607c7d2438d5566bf0a5fc3ddaf36534be97119ad659b43b4","0xb8ae5c6dc2a75aeeabc6989d62ae3ee6326bc036d9f30d89ea2b3239fdcca521","0xb8e0fddde34c752c6433ee0880aaadab086486c1512b24ae29b4baef0fb51a3d","0x707d21555577ed67b771e2f8af86b57aaf7370224655aea6dfbfd4a3227de429","0x0ed94544dd98388a102cf90a203cfc9464dce6ee3368321c0fa5029f6cf2d9b8","0x70c463b5d36499943c424d5ae8e8504095500e2c2e17a8acefb1df98cc040d3f","0xd535cb81e9f073138a98c202d7e848cf3c3c08673d20a81a0fe3c0361b72f056","0x38a75fa4481c378376a6c8615561d3efc7bef39e88570bb24280130d5c4a22cd","0x69f04a0a83b07d47b6dd3a5b21c984b777e36d924d5008ad706213b13d56ef2c","0x1755e51b8f7d0db4992d47b02c5b1fd9d6de1aa0182d2eb2922be75f1199f7ce","0x377f4034d9f3955c420e8e28f3d9c356343fc2f812515e428cebcb6e975a2363","0xd7a7993ea591581125813c88cdc08274c6957dbef396c701e1f529b40f1e2942","0xf4b4591ea932fa35afc016f29bbd5e717d8eaa647abfc939d7b5db603f3b93fe","0xdfc95fbb562f69a7deda4bcc940b9d9b301a6046015a6b822e9c2456077734c4","0xad8c1ae9ce37c4ee0bee8a56a141580032ca3c9eba881ca1d0ff54adf06670f3","0xc2ea0c7f74528ce0ccfce71772c48e9c5cc7868700da59af2e7f163d4e185613","0xc5e5664904199cfeeaa3544ba3c57677372d8112ee82a253946d90432327315e","0x49582348c90492f08fa99511514e68fef5a24bdcaaed7ee39e0b040c4bdba999","0x72dedf0880af9b2cc26746757e31876f259f60156ff2b9f76ddf96a98cc74515","0xb3110bd975a9f27526d482a373032306f3aa9967c8a7921c25103da8858780fd","0xf73e2a2b89727b612ca43c4af5ac5f79f5d2adc18653c70ac1681008f5762d9d","0x2d0d4f460e4daa53e343019bdd3766db2a8e830a89e6fd95801ac962447171a8","0x867719f591e1911b15b23b4f45d333065f1b4ca223ca009a0ffab9211641786e","0xdbe58a8ff109ac6c957f77e37f7f90d020e27b11c75bb86e6da1c427a9fac2ae","0x8f09e912278a1e40b587adea08586952192835cc54e6ffd8409bca14d1852179","0x1f21a62c4538bacf2aabeca410f0fe63151869f172e03c0e00357ba26a341eff","0xb02f089d6251a67bddf6ce4da48b359ab042d3c8f84c7def3474646bcb11f806","0xaaf9da845e46921ff270e8349ae2edbf48cd416b6f01fa9a8c2feaacd7aaa204","0xfd94a94294d6e86696b995741dfa8bb337e63a65dfd57d7bde0b0579df7ab08d","0xef223fc126ad81ade15fd47de0861b1d33a002828b147b14f523b408fac736c2","0x09c76cbd06caf0d4cabdf463e43d5a394bd466fad10617137ef2ea73ed61d114","0xe261b3431ea9f29fbe24d396b53ca883844f5d207288ac9d1c67ac04dacc6c71","0x66e18f664a8ccdce84631d7384c41e5b894fe9cfec6d93b4d42c1de8dab889c8"]},{"address":"0x0000000000000000000000000000000000000001","storageKeys":[]},{"address":"0x4e81b2900bea537464cfd703deb9600de47bd0b6","storageKeys":[]},{"address":"0x928ddd7c2ffa5cc21626bd5ee621a706017bc8a7","storageKeys":[]},{"address":"0xdc45492c27dc311800823a6379436138510f6953","storageKeys":["0x3bad1ee22d4b4da4e4a9857d797772ee449c4c30956c50fe7996cd53981246fe","0x24d6ca0dac231c1f2b7b3f8314f752965620e80fdd76881ffdc9705a01c52871","0x69f11aed767574697e2219341ad07e5e01dea74083d6c0f1c1f411b63dcfaf89","0x87e9eda8959df12f811190dda83c57b95a3d4f8f6571f5b8527a536dab554bb8","0x393d880bd3e96fdef891dd8860dd8e55a5015b6a66e8cf4904d5194988e96640","0x7e18d97b7f8d6d820a39a76ae68df7fafdf78d96fad47df5ec9dfb0a55ba8516"]},{"address":"0x01afb7d15d14c6130ee87dfed47f944d0ff1149b","storageKeys":[]},{"address":"0x09e050f40b3ccfaa568680bf0e459cf8dfc4157e","storageKeys":[]},{"address":"0x0eae044f00b0af300500f090ea00027097d03000","storageKeys":[]},{"address":"0x42eb6012f53c5acece0e5568a44ff46d969a1641","storageKeys":[]},{"address":"0xda98f5587564065347385e2ea39432d68dc670cd","storageKeys":[]},{"address":"0xd8ec56013ea119e7181d231e5048f90fbbe753c0","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000004"]},{"address":"0x5f607daee0670a2d1845c3bd2ee785e6cf56d8f4","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006"]},{"address":"0x733ca30d19f193c1b60340697d066d11341acf2b","storageKeys":[]},{"address":"0x2c169dfe5fbba12957bdd0ba47d9cedbfe260ca7","storageKeys":[]},{"address":"0xdef1c0ded9bec7f1a1670819833240f027b25eff","storageKeys":["0x4a432555e3fde060855a28d4d0b3bf599bbd04b75121e1e4d841e85fbc68da12","0xfafa9e60b7fc3a82d6372f25242b5c1bd30e3927bfa454fa7233ccc186ec39fb"]},{"address":"0x76e222b07c53d28b89b0bac18602810fc22b49a8","storageKeys":["0x4a8360dcbf2fb9aa7ab86da1ac9b80c2b3519c759a2bef3e5f16c0fa8d6a9b52","0x0000000000000000000000000000000000000000000000000000000000000008","0xbad65403230c1aab0e91ca43bed2244f678e58b410f9823facdb161bdac782cf","0x0000000000000000000000000000000000000000000000000000000000000005","0x000000000000000000000000000000000000000000000000000000000000000f","0xa54a1d9627c99ad8da44c66b0164725b2920c9224056b92c88d945373f5bf811","0x62b519c8f2c5a758577ee07b11d8abef980cae7105b6096c6dc03f7865004e3a","0xbcaf2ba6637abde58bbc361da53e016b274b3fa38459f5876330a346b9aa9286","0xf98842e2fa2be07315e79bd73114ddf878bbab917ac38f430b03d90174fb41a4","0x000000000000000000000000000000000000000000000000000000000000000b","0x02b8d8834ad9af8d7307f3bbdbd773ede52b32eeb265e110116185bce8222791","0x81cb7f404d50d86308eae3a1ce17a4091fb0dd2a1a57846b2949c28029c085c8","0x0588d0c3a76602a35b103254e95b5b0d99294eb2f4ddee93696edcaa2e07f1ad","0xb5e32bf50149885d3d646d8982464d72de4ae399d83828a675f837354bf33510","0x873648e847e45338af8c77aff773908ee877c8e8f711b4fdb69544c2adb7dc53"]},{"address":"0xf584f8728b874a6a5c7a8d4d387c9aae9172d621","storageKeys":[]},{"address":"0xefb47fcfcad4f96c83d4ca676842fb03ef20a477","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000f","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000009"]},{"address":"0x000000000022d473030f116ddee9f6b43ac78ba3","storageKeys":["0xfd20a2f52938a77db3766e3e75a57f2c6a244b4144815e8520ca379df855b65d","0xe01b7e69351d46a056e999f98eb46eb57cb9e5ec3a01be2ddfe7e0bd1e77f061"]},{"address":"0x95c618f318b0806bb157a800d2d0fac8aecd40d1","storageKeys":[]},{"address":"0x80c62fe4487e1351b47ba49809ebd60ed085bf52","storageKeys":["0x87c9e955454d19a2f33a6ed61cb8fe1843a9bfafa9af72f65953e3251c5fb237","0x0000000000000000000000000000000000000000000000000000000000000007","0x78b35599871be95768b2fdfaf9293a4491ecdc8ef25b872ee404fa1e441436e0"]},{"address":"0xcde3eb49d53d932c605efbc1bc425c6affa5eac2","storageKeys":[]},{"address":"0xdc5a9a89e31651d60e9a1e6feb767dc9feea763f","storageKeys":["0x4bad5b073458e12a82616354f21c0cefa48c70051b8598525370059bff1942bd"]},{"address":"0x1527beff62b110c09ac527b1ecb11ba8ac3a95f9","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a"]},{"address":"0x51b039b9afe64b78758f8ef091211b5387ea717c","storageKeys":["0x81d16f8ff08124c3470152778cead9041e7af2087107c2534feae46c33f982db","0x973f33c0e434b580eb2ab7087fd95bd381f4422eeae16f07a423a190bb1f31a5","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"]},{"address":"0x797a05dd6a8bfc1e1eaaa62e744d3aff197c46b1","storageKeys":["0xcadc17d6df60323062c6ddad440f897f800f401d222dcd5f85be63bc3d9c8b16","0x09072674acf826caec7f9bdaebf65fffa68af6c3b0900e11312f4432dc832592","0xc571c2a47af1cda3d1596770eb842fef9f52b7970fa873c7834e1d425c5be295","0x534b98ee165a1f5262bd1a73460a488085e7298387b6f32ab42fd67303f01c4e"]},{"address":"0x535b6c97f2a4c73f7826a8b4f6e3472974e78a0d","storageKeys":[]},{"address":"0xaa0e9a1e2d2ccf2b867fda047bb5394bef1883e0","storageKeys":[]},{"address":"0x5b060754b27844dbc3578382886828be224b804f","storageKeys":["0x0945544070e9911ba50b09965b23c946b789f36a7d76443dbcab055e30916d55","0x4562396b3f6dbc3ad37c44f532030af7e6c98d81d57bf92e90d69897b9e07021","0x7e3fe0c8de69ad2b1f039ea2390748a41dced549ede98d21620fe299691f12f8"]},{"address":"0x4648451b5f87ff8f0f7d622bd40574bb97e25980","storageKeys":[]},{"address":"0x0f01120fd519e01fae7bb14d1434fd68d9234a28","storageKeys":[]},{"address":"0x7e43d3a147f66a953979e4272f0368dac3a5c826","storageKeys":[]},{"address":"0x94d3af948652ea2b272870ffa10da3250e0a34c4","storageKeys":[]},{"address":"0x849b59222d093011726d829475c81c79f90ed932","storageKeys":["0xe6b148c3e9fd17908cc33cea45cfa719f6c49a54394793bf9e8ed19ffd78033e","0x0000000000000000000000000000000000000000000000000000000000000004","0xf9e7669579cfcb20cf2d6955697e06b17641ec90516aa45b2947bbcd2c542b84","0x4e5639f24ad509ee465a3b689c8dffaeabda9f54b9b6a01a67ef7496d00936cc","0x0000000000000000000000000000000000000000000000000000000000000007","0x1b7907db36a824c8ce98d443ab191a8178cb6e9e2bbc04efb5324a8a56ffcfea"]},{"address":"0xef887e8b1c06209f59e8ae55d0e625c937344376","storageKeys":["0x0ef8261f3cae401b8cff5d877ca02b47dd3d2894037ea0bfe79b46b408d9a81f"]},{"address":"0xa91035f93618e582ec60099c17460f94580a28d6","storageKeys":[]},{"address":"0x9aa10f23065d274a4abe1ec3b8a5431e89eeade8","storageKeys":[]},{"address":"0xf52605c7b778563a5a9144ef4dc53b57463ca2c7","storageKeys":[]},{"address":"0x0072d180797ff4ce05b1d12310d44ecf26c8576d","storageKeys":[]},{"address":"0xb8ffc3cd6e7cf5a098a1c92f48009765b24088dc","storageKeys":["0x8e2ed18767e9c33b25344c240cdf92034fae56be99e2c07f3d9946d949ffede4","0x54b2b2de1ae6731a04bdbca30cee71852851cfcd3298aaf29f4ebff9452b27ad"]},{"address":"0x2260fac5e5542a773aa44fbcfedf7c193bc2c599","storageKeys":["0x8c2f16f235092052b401051eef9e019dac94bb7b8f7c80be2557b939537bec39","0x4369309f68f607977384269b5da3da5c5e2613b4c7363ce002d6e8ce9d8bb26d","0x0000000000000000000000000000000000000000000000000000000000000005","0x9019172a5d9bc0b6615a6c7c628df52ca42162e812b5dbe034d3b14e4539f754","0xdc276a4f120117ad5ae6415d1c724b4f3a0e81f0ee6466e1392ca121b63123f2","0x5935c736e23ad4d6e6e460e0dc6b8b0aca699e3bf1f0848d0d58b0422b498124","0xc7d4275a066e4b7b21d40774fb08b3826b655682ec4cad51b3174878aa9a459a","0x89b759767f65427c4a18c7717f8394a0142a5dc2cef03452521b758164e18b50","0x3890681f8a64d272d9436f6480d1ea5c5ce20151c9680821b88bfbf32b176a84","0x356ea57d585b4c2292ee2a39c9da213499f25d18b4fba5671c7bc01208e40e2e","0x2784f1c75246f8f7ce09b9e7130d45ea120a62f8a723fd2aace4aa4f1ef068b4"]},{"address":"0x95ad61b0a150d79219dcf64e1e6cc01f0b64c4ce","storageKeys":["0x9319194a372d6da00e43ed5f7027e57f755d1a31b34a5351314b4fa3f025c34c","0x3429c7091f0830078fdde887c3c2184ef27bfd8cd949487e51410a262c10d064"]},{"address":"0xf87c748e4f2c699d60029c31ad3a53b862b19953","storageKeys":[]},{"address":"0x803c746200dffd726abb5636031f5608c33d8855","storageKeys":[]},{"address":"0x91aae0aafd9d2d730111b395c6871f248d7bd728","storageKeys":[]},{"address":"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","storageKeys":["0xfb19a963956c9cb662dd3ae48988c4b90766df71ea130109840abe0a1b23dba8","0x414f1935e0464dc82ed705324c997d328f5a7df4fcf51ac1eef1bd0f3d4452e9","0x635d66657ab7efa4978a0ada1229131bdb12bdff440df002b11a37709c596697","0xf762dfe765e313d39f5dd6e34e29a9ef0af51578e67f7f482bb4f8efd984976b","0x993460b7a842a34c6de2dc08dde1c527f4354825432b190bba2e4f8a7b04c6c8","0xd0b8c6f3157e5146d9edb8dd25b156d8af5046a6719564b8fd4978ec8532aea7","0x7b68bd46d681fa3f81da0e940b6a5d8c90d5e80afc2eeb845cafb1c8b6ec036b","0x6a4eff247b7329536ddf871ed3dd8d4d7d9d28d29ceac00d4f1f45bc6a92ef2c","0x8ded6157b1ca153a307d4fad9269bf57af4217a59d392394491e9b12d3ff07fa","0x3a3aec5717af62dfc0f5ede964a3e44cef7c5ba4453963ee6e3545ea9708690f","0xee882cb0e61efbe2f7edd0fe7a9feef75c17c350fbb5f6e38a0a447346552280","0x12b8ba28555eac908c7ceeaffdb0aaf4c1c68d4c264f05b89b617d175125e4f7","0x34fa8801e13d3dcccf2bbb3ad8e54c0f7473629f3b4dd2fcb81df18cbed11292","0xcd1c7cbb83b106254f2544ce2b7ae8aa02a218dcc405730b8c0de260008a6434","0x2fdcc99b01e8393a8bf0eaa262e26ba1981b8052fb1ec7ba1213ffeb9028ea16","0x60a734b9931b463b5ec40c9bfef86d3ae5a93d7796ddcc3c79118d946aae6b46","0x390f6178407c9b8e95802b8659e6df8e34c1e3d4f8d6a49e6132bbcdd937b63a","0x3fbe6099f169b217d3e3f44e5b72b54ed4319f5e6c163e6e3739eb3434dbd572","0xd634291d4b735c4a1de76debf538ea631431e6a6b0644c3c6d9164f1408ee8c7","0xc34811131593ee88429c7c60af3da7952e2c9cf75daa4f50ec0ff95e3a52e57d","0x4a37057ac6316c16f6ab114e8c7502c141610309edf356280b3bbce685feafdc","0x9ede93be0d8fc6a5eb9cf1c7345a85b7519d8487a727aef0c2f00ab966aa7716","0x1781261727bdf41944e3b1b4b4c4a685858610b8b308e198b4946aba6256f557","0x7855793a2275e6fc47e53ac86bc7359b678feea89755332cf75f01c6bf5dccd2","0x7e18d97b7f8d6d820a39a76ae68df7fafdf78d96fad47df5ec9dfb0a55ba8516","0x73d637d229721ca538a0a2e9712eeef46a1889496c0a60f402b430eba28d4a2e","0x546227570689634675c78524a7bbdb1b9a0ee9178685b69064a1d1e6c0648bb6","0x674994ab631faa049823288ef8b84de2146a4c9528e1ae43eded0b8e59b3c47d","0xef982481b635103b0e52b38555f17a90bf88de82ca144dd4f6da1015e08a5142","0x239e531bf05da9829df96478ed136912e9830c75b5fc001180d074dcd18dfcee","0x09072674acf826caec7f9bdaebf65fffa68af6c3b0900e11312f4432dc832592","0x4fb413805902e1d9a6681d54d7946be4d2c3433fadac4304eb49ef1b5a52a8f4","0x39f5da675aa1ba82d67d06c4ecc0212013a55b74d970e7fecc9495894fd19c6d","0x0cb865ff1951c90111975d77bc75fa8312f25b08bb19b908f6b9c43691ac0caf","0xe03178286da22a27dd0b1f68fb538cd07bc9080172ee9a5a2238416fe86db02a","0x23ecf26e171eb6325d732c65d1fe70a647d4434ae74b95c22ea2fce11f775cba","0x0cfde81cdef18be5b61e36abce423320f5851fb3d2f5f460a99b2537bc6c1c3c","0xdbb14cc4e2641933009446984ed0fe231c44a6b9132c54c6638cb24de164f0f1","0xc906b0b0df36e2042f059120e95e6dd99f11c9ac2ef306a59ba0efa77fd8622d","0x4175c49d56cad0bc6d69ef289864fd048386a14da4ac19736c9e074139b2e912","0x865182cb1033f3c438f26e83d271474c96d4563f7968cc57b55a4d0fd0d5a456","0x7becc3e4bba15a81504c14df5b2a3a45a58ac8145e484eef7c17528e21940785","0x503c48554e87a0a8f3157569e349fac0135dfb6108ef5322b6b694522b7f18a0"]},{"address":"0x56eddb7aa87536c09ccc2793473599fd21a8b17f","storageKeys":[]},{"address":"0x99e81edbcab512d393638c087fd29c3dc6c9b00e","storageKeys":[]},{"address":"0x32db8f7f81c60e6405064d935b6e7bc80cb070d1","storageKeys":["0x119acc7f7d83d9aa9169687c5e110979463e6125bc0869138bf19b5e5cc82f1f"]},{"address":"0xb71e813080c6a1944b0eb79f609219f9d813178c","storageKeys":[]},{"address":"0x6ab3a801969145035f93549a2c96fb95fd92e8d0","storageKeys":[]},{"address":"0xea22035c3afecc62ffaf21a8028a6c8ba60dc2ec","storageKeys":[]},{"address":"0x388a189d2752ef07a278f6586f5944fb73a1363c","storageKeys":[]},{"address":"0x5a55dc769d478ca70b4daa935c88ddb3ca1295f2","storageKeys":[]},{"address":"0x9746c4304cbcf2b9bd02b0686eb2a1443b07bd8b","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000a","0x031c6111cb1f0f5bd478bbff32910769166b0a2a476481d708302789f5c0900e","0xd1ae39517b4c7d4995db65c04c8f47ded33153a041e0537d9672ed5960e8b148","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000e","0x000000000000000000000000000000000000000000000000000000000000000f","0x37564213918344bef90d672ee3df87b725d3f0099e35b0fecc2cf3c6ac3e713a","0x71292cb7cf47fb87bee9a58a050a52c575391b9c90317773ade7d35d4ea25788","0xf0e313bf90ed3839c64a9fa927a4063b5e02407d2535470248383001e0d81419","0x000000000000000000000000000000000000000000000000000000000000000c","0x0897dfaf1c37c8dbe7def5779eacef1f70ee8772a9b3244ac94223e45b045a6c"]},{"address":"0xdfc2cae99905e140050736e54fef1bfde14ff9d1","storageKeys":[]},{"address":"0xe795d3de925c970cbef7c691f9c39505202afaca","storageKeys":[]},{"address":"0xc3649f727bc90d870aff0400c378301104244cc6","storageKeys":["0x0366b3141919ec9f847cfc8c3b10153a8959c006afe327ab0f99d0272003ef14","0x0366b3141919ec9f847cfc8c3b10153a8959c006afe327ab0f99d0272003ef13","0x0366b3141919ec9f847cfc8c3b10153a8959c006afe327ab0f99d0272003ef16"]},{"address":"0xa50ba011c48153de246e5192c8f9258a2ba79ca9","storageKeys":["0x591a3b2777bc31889c69fb5cad740ac457874aa5ce74c0ad08912df8ad7d112c","0x158cab4f3f3d7fb3fa7c40cadad4cf2a7d7d1541704c6190fb3782e9411c2817","0x49e349d4f386739afdf8e55db7675b584d46c3b2a603eef62554e21dc437b5db","0x84893e0f271e5f8233d24aa85ba38e0d2ed8f0fc8f608c286ccee51e6c35dd6e"]},{"address":"0xdcdb515e7e788badf0120c389753c4d43519d5f8","storageKeys":[]},{"address":"0x48cf2a4b8a74974beabf8db1f45f9123edc79c06","storageKeys":[]},{"address":"0xfd858c8bc5ac5e10f01018bc78471bb0dc392247","storageKeys":[]},{"address":"0x1689a089aa12d6cbbd88bc2755e4c192f8702000","storageKeys":[]},{"address":"0xa858ddc0445d8131dac4d1de01f834ffcba52ef1","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000"]},{"address":"0xdcdf0feeede933ceafc6131b663f1ee210ac61ae","storageKeys":[]},{"address":"0x5fb30336a8d0841cf15d452afa297cb6d10877d7","storageKeys":[]},{"address":"0x98f3c9e6e3face36baad05fe09d375ef1464288b","storageKeys":["0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c87","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c86","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c89","0x0000000000000000000000000000000000000000000000000000000000000003","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c84","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c8f","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c90","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c83","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c8b","0x88601476d11616a71c5be67555bd1dff4b1cbf21533d2669b768b61518cfe1c4","0x88601476d11616a71c5be67555bd1dff4b1cbf21533d2669b768b61518cfe1c3","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c85","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c8c","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c82","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c8a","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c91","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c92","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c8e","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c93","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c94","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c88","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c8d"]},{"address":"0xfbeedcfe378866dab6abbafd8b2986f5c1768737","storageKeys":[]},{"address":"0x1f9090aae28b8a3dceadf281b0f12828e676c326","storageKeys":[]},{"address":"0x5200a0e9b161bc59feecb165fe2592bef3e1847a","storageKeys":["0xf105718eba48e11374f2a9eee37e30654746b528e81db102f28293c635eef935"]},{"address":"0xe41d2489571d322189246dafa5ebde1f4699f498","storageKeys":["0xb787223be3bc8ece62cd060cbb37243ae4b639a954a79701ede142b807c1768b","0x3a93b8d547a55b9f57e9b11b821bf30b45e952fe28b30d4c837a73ef19c1868d"]},{"address":"0x8d2f3ba53de0becd02a768ae47e7daea736d18d4","storageKeys":["0x4ea7a3fb4ba9283cd9079d2f05b8fcd3154aed7afa3187dda178d31371cb8d31"]},{"address":"0xaf713ae6c540d59553b4d15a1838c501e5c866ba","storageKeys":[]},{"address":"0x63c847b01957b78ea7d2be6f4a41f117069d8b8f","storageKeys":[]},{"address":"0x97e3ccd126eedf3b3f6fb68e2d680371ed06b434","storageKeys":[]},{"address":"0x46f1a9df6384d69282f26739d1ec0ef6a86fa3d1","storageKeys":[]},{"address":"0xeae736e5d6560169f9285c62492f8a89fb4ab790","storageKeys":[]},{"address":"0x79e9c4f8ed2130f5b07f58308de5eb12e6b3bab5","storageKeys":[]},{"address":"0xcc5c7dedf02cfbd9c5c67db32ece201e460fc645","storageKeys":[]},{"address":"0xfda68f66824ef2695df85a5aaac94097587d2893","storageKeys":[]},{"address":"0x41ca411f6a9889246ec8389a946bcdd5bd89a399","storageKeys":[]},{"address":"0x4d07d25b928299adb32d54bc93cc8c21825420a1","storageKeys":[]},{"address":"0x696cfd63f98dcd1fea2d6bd27f3cf85c2007a2fd","storageKeys":[]},{"address":"0x2f3633184849d57169189eac6768029aea9a70d6","storageKeys":[]},{"address":"0xa2327a938febf5fec13bacfb16ae10ecbc4cbdcf","storageKeys":[]},{"address":"0xa1069fcfe87c812039fccf9a2c4a81db0d3c9501","storageKeys":[]},{"address":"0x2103d671d7cafa70a1f6e30d9b3ebec20bd59943","storageKeys":[]},{"address":"0x28b8d70e4414090ed7b04f42d12f21f563e8bc85","storageKeys":["0x28016cc98acae7fc08088265b14dadf576f00340724bde504c9c76ee8ffb4382","0xdf17be9cdc750e1a9a5eab270e7bec6881b4e6038b1e25c02aa58db3666ec948","0xe07fa82049a0e42eb1d7535092eaaecfa1816acde8a52156c14347d7c6857b7c"]},{"address":"0x98fc407ce8bdda6b99d3313c3652cff181f5e89d","storageKeys":[]},{"address":"0x986b5e1e1755e3c2440e960477f25201b0a8bbd4","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0x5c8bd9977978810a534f5b3fecc338502aac393e","storageKeys":[]},{"address":"0x8571c129f335832f6bbc76d49414ad2b8371a422","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000002","0xbfd5271a58b9b77988395e7a3bf7add18038632785086b00ec9c11e5e3e1084d"]},{"address":"0xcb0c1257b1ee18debc5d9522639adc260c36d423","storageKeys":[]},{"address":"0x264bd8291fae1d75db2c5f573b07faa6715997b5","storageKeys":[]},{"address":"0xa558ea1a875f8b576f0728d32c39f62158e49b92","storageKeys":[]},{"address":"0xc2fcab14ec1f2dfa82a23c639c4770345085a50f","storageKeys":[]},{"address":"0x11965b87ef36c4d816a75c7b48801ce78ccad8e1","storageKeys":[]},{"address":"0x19029459beaa122d4c206c1844b3a4a97368da50","storageKeys":[]},{"address":"0xb73e13200ddf41fb663208d3371788f6e5331f9f","storageKeys":[]},{"address":"0xcbff3004a20dbfe2731543aa38599a526e0fd6ee","storageKeys":[]},{"address":"0x861a1c63ecb0c650864212eb6733e3da242d8ca4","storageKeys":[]},{"address":"0x969c00942e13358a5b704f5105fb41017c15bcaf","storageKeys":[]},{"address":"0xf5dfb95f348c6a3ebc1af4a057185ac18f5556e4","storageKeys":[]},{"address":"0x75dd42f3456f3b2c5415cd6addc4be1c22a18d29","storageKeys":[]},{"address":"0x26fb810f14c0f43b5359b72b3714f96a268012fe","storageKeys":[]},{"address":"0xf05b0e4689f62ffd7ccf34906fae7f106f9204cd","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000013","0x543fae4ebb556a7e3ea46b6922bf9129e6840e7df76fbf613dfffb6b2479fc7f","0xba9f0a9d2918d1b53246d8caf54ac3df52e0b2e15494ad8e447636ee5efd27f5","0x42135f6292c9ebe03f3e4c587ff09692ca4c596b8f3541c7d16af07507fb5525","0x000000000000000000000000000000000000000000000000000000000000000a","0xa6b5adbbea95dd02ab7ae0ea748d852e19dea5db729ae9b55eb736cbd87a7a41","0x000000000000000000000000000000000000000000000000000000000000000e","0x000000000000000000000000000000000000000000000000000000000000000d","0x000000000000000000000000000000000000000000000000000000000000000f","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000012","0x0000000000000000000000000000000000000000000000000000000000000008"]},{"address":"0x541dcd3f00bcd1a683cc73e1b2a8693b602201f4","storageKeys":[]},{"address":"0xd9db270c1b5e3bd161e8c8503c55ceabee709552","storageKeys":[]},{"address":"0x4b8a6a3a657ba4568bd582fffe776a325a8616af","storageKeys":[]},{"address":"0xfc426a7850205d2aa7d0414345e7c9d7c2e8dd1d","storageKeys":[]},{"address":"0xa9d1e08c7793af67e9d92fe308d5697fb81d3e43","storageKeys":[]},{"address":"0xae7ab96520de3a18e5e111b5eaab095312d7fe84","storageKeys":["0xd625496217aa6a3453eecb9c3489dc5a53e6c67b444329ea2b2cbc9ff547639b","0xed310af23f61f96daefbcd140b306c0bdbf8c178398299741687b90e794772b0","0xe3b4b636e601189b5f4c6742edf2538ac12bb61ed03e6da26949d69838fa447e","0x4172f0f7d2289153072b0a6ca36959e0cbe2efc3afe50fc81636caa96338137b","0x9f70001d82b6ef54e9d3725b46581c3eb9ee3aa02b941b6aa54d678a9ca35b10","0xa66d35f054e68143c18f32c990ed5cb972bb68a68f500cd2dd3a16bbf3686483","0xa24761ee361134adc7da3d66337e75960499c185ae47c00b319ec63b4c79eaf9","0xe6e35175eb53fc006520a2a9c3e9711a7c00de6ff2c32dd31df8c5a24cac1b5c","0xa3678de4a579be090bed1177e0a24f77cc29d181ac22fd7688aca344d8938015"]},{"address":"0xb34e04184ff4b3d7d684d33664a06dd4385fdba8","storageKeys":[]},{"address":"0x2008b6c3d07b061a84f790c035c2f6dc11a0be70","storageKeys":[]},{"address":"0x963737c550e70ffe4d59464542a28604edb2ef9a","storageKeys":[]},{"address":"0x99f6de6cedb3e430d8d1f1897fb92c68758f896b","storageKeys":["0x4a6f485c1c32cc07b41a962ff745e1d2a15f32520f92181d93f06ac057458486","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0xb9e5226e56a5f3e9251a26379b1889445f5c8f76","storageKeys":[]},{"address":"0x8e79e45c9e008b430aff86f7121b122f9ad27aff","storageKeys":[]},{"address":"0xafe69384f5febd6cf791df9e9cb2a72647dc97d6","storageKeys":[]},{"address":"0x030ba81f1c18d280636f32af80b9aad02cf0854e","storageKeys":["0x14a553e31736f19e3e380cf55bfb2f82dfd6d880cd07235affb68d8d3e0cac4d","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x68fdfc39b76b20f280a010f9491977d8f5b24e2fc048cfc4260b97516c77a322","0x0000000000000000000000000000000000000000000000000000000000000036"]},{"address":"0x4cd636dee63f3caf6b1643588309b0adf3fd87f7","storageKeys":[]},{"address":"0x95392f142af1c12f6e39897ff9b09c599666b50c","storageKeys":["0x6a72c52290b228833ac2967bf2ff579e6c79a3accf70d3afa05caa3a68f8a438"]},{"address":"0xaee22923277f1a1f98ba9c9060f94c7e1acdbe66","storageKeys":[]},{"address":"0x40995fd172c745559432b1ed5e753dcaaee9a94f","storageKeys":[]},{"address":"0xe4922afab0bbadd8ab2a88e0c79d884ad337fca6","storageKeys":["0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x81d16f8ff08124c3470152778cead9041e7af2087107c2534feae46c33f982db","0x973f33c0e434b580eb2ab7087fd95bd381f4422eeae16f07a423a190bb1f31a5"]},{"address":"0x6000da47483062a0d734ba3dc7576ce6a0b645c4","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0xba4b21f973b8419704913adcc5c4411a40f83963","storageKeys":[]},{"address":"0xd9ed413bcf58c266f95fe6ba63b13cf79299ce31","storageKeys":[]},{"address":"0x9813037ee2218799597d83d4a5b6f3b6778218d9","storageKeys":["0x5f844128ee28f69817f43fed32b1eb6c3b672cdde9b2dc87fb916bc0b525b37a","0xc9af2cbffaa7378220fb956f83f49facf69fe782f55f2dfa57ca99d3fff3c387","0xa9bf534c5c6bd701fe0a8e3ed64b0769b2bb8701b6be59a4287915456580245d","0x6f5db8421302e22d2e26dde41421a59d10b0f9ab1990780de421c6f2a5271ce4","0x92783bce1b8fbf5d5a004ae454c0294c9e3a8d45cb06a52fcd99539b22445478"]},{"address":"0x00bdb5699745f5b860228c8f939abf1b9ae374ed","storageKeys":[]},{"address":"0x51301f41c8f83fbdffaeee11f846e9c114fb8046","storageKeys":[]},{"address":"0x3b2a77058a1eb4403a90b94585fab16bc512e703","storageKeys":[]},{"address":"0x340def432d1d7965c01a46e9812fd00f1a34d9e9","storageKeys":[]},{"address":"0x814785240ec46f4bafdd035414bf04bf60e169e1","storageKeys":[]},{"address":"0x5fc67fc46ec69e5c14064d651e1891c00fd720ed","storageKeys":[]},{"address":"0xa8b1b971968420c0ba4413bcfd1cc4c87abb3a98","storageKeys":[]},{"address":"0x62fe806bd23ccc4ffcc080ecc7f99920a28fa17b","storageKeys":[]},{"address":"0xbafe01ff935c7305907c33bf824352ee5979b526","storageKeys":[]},{"address":"0x79bc2620964b48b41448e29b724df3bc1300f3e3","storageKeys":[]},{"address":"0x6de037ef9ad2725eb40118bb1702ebb27e4aeb24","storageKeys":["0x6e9e74e4891bc64247ab6fa47c6a9776d34ed4eb8d9e9e21b9dff2aa8c340879","0xa8099389dda490a23c219d55ea7558c09d5405e39c1b13e3af640aee86b1351f","0x10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b","0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3"]},{"address":"0x2200cb93099aef790c1c049b0e1c7602bb7240e2","storageKeys":[]},{"address":"0x50f39e9419920809e17ca75a62a786cd3de5da40","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c"]},{"address":"0xf11d1d2e3944627282095eec46b0bc50ad3f94e5","storageKeys":[]},{"address":"0x9696f59e4d72e237be84ffd425dcad154bf96976","storageKeys":[]},{"address":"0xa2aa48e774653c6c6e1ce7e4d7f4d211352c051c","storageKeys":[]},{"address":"0x44980c8c2a4480b2a26886ce39a6589cbc4048d5","storageKeys":[]},{"address":"0x3cb0c88e41b1aad2e59b93ed51d9fdbdda021af8","storageKeys":[]},{"address":"0x974caa59e49682cda0ad2bbe82983419a2ecc400","storageKeys":[]},{"address":"0x736ec40644ebd118d170d65079ba2bb1eb4a1178","storageKeys":[]},{"address":"0x4e977830ba4bd783c0bb7f15d3e243f73ff57121","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000003e","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x81d16f8ff08124c3470152778cead9041e7af2087107c2534feae46c33f982db","0x973f33c0e434b580eb2ab7087fd95bd381f4422eeae16f07a423a190bb1f31a5","0x000000000000000000000000000000000000000000000000000000000000003b","0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0x5e0b7c6a4f59fbc984f9fc746b41740c63a5ef61","storageKeys":[]},{"address":"0x1bfa2f0d2ca96989bb18e665fdb843a635d30e4f","storageKeys":[]},{"address":"0x6b175474e89094c44da98b954eedeac495271d0f","storageKeys":["0x995f3b129dd3291868ddb9cf202c75cd985227d50e309847fbab0f8da403b19c","0x639b0fad8cb3c3f822c7f87d4faffe54b8e4515394bf43d17915df9c544359d8"]},{"address":"0xaaef4d5ae6ea726f542033ddd8e0a1df6b189794","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000e","0xf7bb1285e79a16a6587846695900bb30f85e80be0a7191954e959e2a3b39e370","0x2b1ccb8910d873f02577b3dd0fb0f3f5a20c2b974e1a42a0d5491acb79c5c155","0x000000000000000000000000000000000000000000000000000000000000000f","0x0000000000000000000000000000000000000000000000000000000000000010","0x0000000000000000000000000000000000000000000000000000000000000013","0x0000000000000000000000000000000000000000000000000000000000000014","0x000000000000000000000000000000000000000000000000000000000000000b","0x0000000000000000000000000000000000000000000000000000000000000007","0xceef804a006c10f9dbafe22f97acc7148e36c12470a1806b4c84cd894b34d8e3","0x629f20d8bfbe9a62bd05309ab8c8ad9929adea79f2545b8bcf91de7858d8b19e","0xbbcfdfea5791c371b711c6f268d09b4c37483b981b0f807985dd4dfd751c4433","0x63a9eef542482dd4b4947ede6e9f73263865424d44ef7666ed0bb5b0bdd04a7a","0x4f15c395392721a0fe530a675595d11a164ba298055c632e64a6051f30552034","0xaac10f53c8294471a32f1aa5b789cbfa01c87f3872f33d2f6bfdda17414e9e0b","0x78ab86b66e47bfa0e3425c306831e0e3ebce127e57a351efdf34b7415dd2ab37","0xc2dfb276fcc959893296bfd70cc30815c2f9644101e66a584f9cbf0fcb3b9c1c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000000","0x7ddc26c1864fd03f01accb2150b6fd9676acf46f63aa04c0be37033c8747654d"]},{"address":"0x0e9e3eff16d2d19f5d7a04717d70b81f2c7465a5","storageKeys":["0xd3d672ebe2dd1e895e9b9a35ae8a26b726888b63db7f929c27a17b82904d8e33","0x34159d7f11b10955e3538765a38239580dc3f4f4808c10fbe7149e67673c4e37"]},{"address":"0x458f33b481405be241dd06504ce2f7489d270285","storageKeys":[]},{"address":"0x8b6a6f5b828f086a2a9d8a3150b958e79e91a82f","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000002","0x8a9a513b9791a18d5272680de0b8170980d584db74d5cc608d89e97f4ae4c892","0x0000000000000000000000000000000000000000000000000000000000000008"]},{"address":"0x01ce31914fa70a1eb073aaa81cf00f00bb000355","storageKeys":[]},{"address":"0x9c39809dec7f95f5e0713634a4d0701329b3b4d2","storageKeys":["0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x81d16f8ff08124c3470152778cead9041e7af2087107c2534feae46c33f982db"]},{"address":"0x8fa8f9d8b228eee6e7df2056faa97ab23822deae","storageKeys":[]},{"address":"0x48ec5560bfd59b95859965cce48cc244cfdf6b0c","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000a","0x000000000000000000000000000000000000000000000000000000000000000b","0xee7342d08d28a9410954edecc9e99e0516566a29e7f6418f9ed88d5457a16bd1","0x35e830c43059d6a7cc540f34f150ab48058cac729b2b25760456d61d61b674f6","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000009"]},{"address":"0x78e851c35326c9296485e9720d85cb3bd153b428","storageKeys":["0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e565","0x0000000000000000000000000000000000000000000000000000000000000000","0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563","0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e564"]},{"address":"0x1d24c6be3c1254a0e7cd8712978fb50dc7f1bc1e","storageKeys":[]},{"address":"0x8ae4c29c97a9dfba7a4440c6336a7d37eba0e12c","storageKeys":[]},{"address":"0xcdb921ee04e2408b46cac61aaf3514ff1df0594e","storageKeys":[]},{"address":"0x1cedc0f3af8f9841b0a1f5c1a4ddc6e1a1629074","storageKeys":[]},{"address":"0xf4d83a5dc5666067c0530b0468aedccd00318888","storageKeys":[]},{"address":"0x48c04ed5691981c42154c6167398f95e8f38a7ff","storageKeys":[]},{"address":"0x21e0f13e7c78a2e4160ccc454c02ab3e8a9ce2a6","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000"]},{"address":"0x7f86bf177dd4f3494b841a37e810a34dd56c829b","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000f","0x0000000000000000000000000000000000000000000000000000000000000011","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000019","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000014","0x0000000000000000000000000000000000000000000000000000000000000004","0x000000000000000000000000000000000000000000000000000000000000000b","0x0000000000000000000000000000000000000000000000000000000000000003","0x000000000000000000000000000000000000000000000000000000000000000d","0x000000000000000000000000000000000000000000000000000000000000000e","0x0000000000000000000000000000000000000000000000000000000000000012","0x0000000000000000000000000000000000000000000000000000000000000009"]},{"address":"0xac4b3dacb91461209ae9d41ec517c2b9cb1b7daf","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000001","0x4a6f485c1c32cc07b41a962ff745e1d2a15f32520f92181d93f06ac057458486","0x0000000000000000000000000000000000000000000000000000000000000029","0x000000000000000000000000000000000000000000000000000000000000002a"]},{"address":"0xeaa9ebddd373c4bd8bb92dfcc9c7e7fcdb268e51","storageKeys":[]},{"address":"0xb2ecfe4e4d61f8790bbb9de2d1259b9e2410cea5","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000012f","0x24c5445a8799ed44e9e927c6f37b8d360a5ccefed281a4f86990e92aaaaf08ba","0x3dc40693fb3bf64b979c0e0b720cba651945e1a1c67007f82f8a170b92d7faf8","0x5b04c2c7c7fdbc31e5660769e48a87a3f26e1769b9982d799b6ff35b585e42d5","0x000000000000000000000000000000000000000000000000000000000000015f","0xdbce54fb76d23f3792440c2e2abc6617b38209a9e60adcdb42095f9178274e46","0xdf3c094b5ee518fa5220310d3c9712c850f4061f3e8028db5c10f763bfbe9b61","0xb1f2c095c4f33af3205737b3b638f170f58418ddf7ecb565e70c47afbb54205a","0xbc5dc498aa3b0cce90b55bcf2f4bfa38f2546adf760e816c85ed50fec632f89f","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x00000000000000000000000000000000000000000000000000000000000000fb"]},{"address":"0x4bac702dd1080a6e8cf524f4c727fd598f089faf","storageKeys":[]},{"address":"0xec2876abe8e819efced11ca1d9a1cd0e68e45e7d","storageKeys":[]},{"address":"0x0000000000000000000000000000000000000004","storageKeys":[]},{"address":"0x0e4aacf9c865471ac62597e23692adae1231f32a","storageKeys":[]},{"address":"0xa1faa113cbe53436df28ff0aee54275c13b40975","storageKeys":["0x2e261fad5dfec9e907f754bbf1467bf31efcbddc6e3937f505d225393b0dfcca","0x89b007483d9727c5c35c4f9d2201c45d8027ec8871010e1a2859acdf5c6cf59a"]},{"address":"0x0268f7e093584511bda13abf76275890405b54c3","storageKeys":[]},{"address":"0x8431060c8e72793afada261e9dd0ab950e80894f","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000006","0xe82a373272d9343f65c5826842d07de2fd655890a7154f3421dbb8bf4b542611","0x0000000000000000000000000000000000000000000000000000000000000009","0x1fa17fc9d5db9de841e8a6169b0b2d1092cdb14c73ea5c8b7e7812c757e2a4aa","0x1fa17fc9d5db9de841e8a6169b0b2d1092cdb14c73ea5c8b7e7812c757e2a4ab","0x0000000000000000000000000000000000000000000000000000000000000001","0xe82a373272d9343f65c5826842d07de2fd655890a7154f3421dbb8bf4b542610","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000005"]},{"address":"0x9f52c30f29bfc5514d79a587d61ace79ebde82da","storageKeys":[]},{"address":"0xf2eadba9d834ececa12b618ff6ac68f4aee805e0","storageKeys":[]},{"address":"0xf5543cdd5f551635e13ebe07e47d01d0fc9cbbd5","storageKeys":[]},{"address":"0x7a250d5630b4cf539739df2c5dacb4c659f2488d","storageKeys":[]},{"address":"0x49048044d57e1c92a77f79988d21fa8faf74e97e","storageKeys":["0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x0000000000000000000000000000000000000000000000000000000000000001"]},{"address":"0xccb63225a7b19dcf66717e4d40c9a72b39331d61","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008"]},{"address":"0xfba175fe8169f08eb02239ca1b235a8e13415204","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000011","0x743d0b101c262aa10d1ecf8658918ed7f11805f5a8650d7aaa22dac0c8c4f76a","0x000000000000000000000000000000000000000000000000000000000000000b","0xf2431a146209f0c0e20bc3dd1202f134d4419582b5b81084bb159b89675a656b","0x2030305594dd2247024da47a510703eb7ba5c9dd7a560e0a4596c201595fa18b","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000000000000000000000000000000000000000000c","0x000000000000000000000000000000000000000000000000000000000000000e","0x000000000000000000000000000000000000000000000000000000000000000a","0x164ae76983800950db5a0e816d00ae65e10920df2fd537af97f9722ff9f0b0f4","0xf2c535f78bbf70e8c137acb4e29e2f986545c919fc7214c8b5be774e28c99ce8","0x0000000000000000000000000000000000000000000000000000000000000009","0xb6a6ba516e372d74247785d3abb4f5443766e8f574a21d891f936eff3b3b0d3d","0x3bdbca05285fc70b92d87d8c7b9e489bf0787dc47751ba4fb70ff7a65e9bb3a2","0x0000000000000000000000000000000000000000000000000000000000000014","0xee722d724c89bf250dae10049726c7ead1476357b09d9efbec404caf9ea81e72","0x15a48a2e2aeb4a3e849a022a4c15676ac29860fb5a115f1d6f264a00f987c9c2"]},{"address":"0xdb5889e35e379ef0498aae126fc2cce1fbd23216","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000"]},{"address":"0xb543f8d66765c7074d1d77147d7e07880c96908f","storageKeys":[]},{"address":"0xafdaa6776ce03307469014a90f6b349c3b811e26","storageKeys":[]},{"address":"0xdac17f958d2ee523a2206206994597c13d831ec7","storageKeys":["0x9ffde5b44448c88a20237a7058da36efc84e747cad7f90a58122443090ad1f7c","0x8c8de58f529ae55e139d7b5b184fbb995b30d3865a11609fc4bffb35f1288bd2","0x8ede74c750105ce2fb5f2d1fe2ffa7ac9ed33eaeb281d12bdc9d790a221e60b1","0xb3847cc5d7a4860954c9a57142bb46d4f7416090ba5924ef74f1fc9ca3475f34","0xbafb32dd290eb78d46de475343c62f1f2a5ad7187f6f4e2c710d8e9987ffd80d","0x513b73944ea12005b04686b42896c504dc9740f56f3ca3cf41a801cd6c7fbe29","0x7ed1270bf9985ad0c49af6c38189f8ae41f0891a989410c4f1186ba37b42f342","0x9d441f104cff256078a6adf734a479eef99299bb28a1f82421351a727d683ecc","0xf97d781a9ca9776d9d3b1a38008e76bf1381a33940a87578110c9086a0362fea","0xb46c17c59376627e85b25cdddb0c35722c9fedafb78c66846d602dca62438788","0x673b0f0b053acf61f6f8f1846a9fd7436a51038fcd3f3a3397ee4df148b3d8f0","0x56ee5c039aedeaedf1032028e6c6acb8882795c2c1cf967aecbff3b2c39ab4c0","0x8d2403de072e792fe9cf0459126e0ccc9e4847e1a4cd6e70d3318bef51027274","0xc18aaa237f870a4d48b197f8b369a3900576d678e9beedbbc01ff1a0e867f085","0x93e4f9d25d09cc179f094b171ebe148287febce312d587312a2f18245974acf3","0xb120e35d07d4bd4187947793e596e7860c1f4e018b3a1c96a7ff3af92fb36c4b","0x0967ed5d0ad88daab1c7293a13269bdf91f32d7ca36ee10fda21d83597bcf576","0x3c346a88444e7f66c6399dd5e06c71ababc22d00dc7162f073c5cc50fced5623","0x9b6330e318991e5e03c22b7dd061a94019614e7c61e5bc7b9ab074428d2754ba","0x1d61b751c500170e1f2412f6013d5dbdeb26167be5653ce8573be3c189bc0ceb","0xc0cedb9470e41de154adee00d52e88dae60788cbddec51f676e9dacdac231977","0x94909b84551d14be639387727bc06f2df637bb55324a44bf9fc5f78e0e9e4932","0x4c02fdf59d5e9397f1719923163f6be5534e9eca4daf51f1a5d95e0c18264f79","0x6adf312d1e455f8463beba29fe7f24619fae626889f97cbc39f192bb458bb288","0xbea69bbb53ac1c8f9f304debe90f2f910f01e167907208fbf77f464e664ec927","0x685ca9823441679a09aee8e726a75083ad75e8d3bcbd68d07cd80fae41c10934","0xa00253b3f517bdfa46ecb7a04a6f2fce00bf4a7e318e2554a3e4d4ee4b9db684","0xa45d74523be7c1c49accbb5a419d77fb7de1035a341d93dc507bdfbcf79ae393","0xbd6d14f193738e283da2abeb0d0632dbcab7ecc8617c625bf49fbc971fc89313","0x176090ff7acf2144c76d3ac997c3cc26550d1f1e30187a447462e243962b412a","0x846bb8a09486c0be2e38f90f64d639ef06392c0c4da9960320e17a83f6d4b35e","0x6e6a68664f90e78d65ae0e8ef840ba37a70d92811f1f65f53120dc6acfe4b9a1","0x16f004e89ee59492de04d4f1c204747d552695fd97cddde044da1d1934fe0cbf","0x50c1e6bd531fb2aaa30fa4a972015135d131deae3f6a9e58e1fb163740327fb0","0x0eb60577085a9d049cc8510e96f0cef7a6aaae970e154f2c7108d48fd4349fb7","0xb7f1e32f97437dd540acff45e1db7c9f6711679d3753b88908dac536b94c49dc","0xd9293a630e28d3a5e61462a4f5cf955d155ff86ed3ab041ecb0533dc126b3efe","0x1e5dc723dc3f3b29801f6e6889d7e1f3270f25154bb3f7a14d1b60486e328ca9","0xc602ab3e515395034af169cd866102b11b242fd144f40785077a9866e9589b8d","0xfa7862924f5601c1f39299711d5f76fa2cfa8a207fb6605ad0c587ce8c525315","0x8d788519759306dc94c64c0360ba819c56e3d6eaff093b7bbe6f2f4ec61ee7a4","0xbe05400f97604e025f37d4ab04090667a8c7cc7f3b4bda213821868a5cd55052","0x60894daa4193203bde4d84d84870319d3f20e3ddf7d97b76bbb3e082c8465112","0xc692efbee87c967f2b3c4bbb5278d3ae68bf086501fcaf962aaea9a0adedd61d","0xd799df84c6601d9ade74005f422f31a9308c6398323c29246383d35237af9fae","0x61ecbff3bb04065cbe693ed14e280780224723722a8e523beee45ed99ef7a689","0x88904bc060ab674869155192bf1045a267dd5f06dae770eb480946730ff6b1c3","0x02109e648c764353db47b1d8894f1769d5b0e66c7caf2df343621702e7f66d88","0xff74eac351ecaabec94d24f9ab493b9e00e6f80e41439e3e33375fc4590a64ea","0x2361f0a4e0a7736aff38b77bb385f68bc1e3d241b26c67ce82933ad5fa59fa1b","0xc242760eabb96416573939975625064d0a4378d4f666476d33b944e0721c857a","0xdd6798771e43461192ecd5a15bdd405ba42f8c55d704c64f1809b1be114f54bc","0x0c5d9813b2185b448ca933e1eaca5709973271bd34ab7810302c5976285eb1bb","0x7c88d3cb74722d80d50567df1c4c6bc9082bd5821e50de3a79593e5ae778ebaa","0xd55e8ce344d811904fa3fa665cb5597dfc0888944d7f61b817b191ecd1edd8ea","0xf14741ed82d9408c177f46121dbb6df86d15f48946c487dd6a191c65b2484e37","0x47e2a6bd1a4a7d2d9ccb50db7cc8ea5054b173dc5f8d2d477dbbb253851f26be","0xba2bd0999fb5f7faf98fb04cf97608e75c7589c9970078a2c6993bb3ecdaebee","0xe1ec2b661c768fdc2b939490519c0a0d74e9778ca80745262ef058b202c946eb","0x825567a8757a03dbe2551e097e7434bfaa328fdf8ed174bf88289bca9d901bf1","0xaeb021e184b2838669932d6025f230be73896028f2bc906bb735b9747395e9e1","0xf79f0cce47344bece44e61f8999e4ec66166f5075e9914b50fcc0fbb024502e8","0x4eaaa84020a3b745aefeb4c1b542f399ef6b300a44d47eb4b0fe161ed42f1f84","0xfbf7155c833fc041a1b957c5d24f3f47beb7aaf0c77c420716897dc94017190d","0x6a0339409c908d3f577b24374505ed60b73e760d4187adf91c845864bc5bcfc6","0x000000000000000000000000000000000000000000000000000000000000000a","0x3a849f6bbec6f87da3309525a0c3c9d5dfec3505e911735f9994c3109f857147","0x426a6724c84c66cd90a97eccff356f2c9633414685df631b9c1e0ff105f618af","0x4f07ee1d124fb6b012545eeb93eb7646c29901f49b360f9fc0ac24f90ea5c14d","0x2f020855657d6aea73f452bfb0b121155a8b03120861cf24447c2bf96ba5f7e6","0x9b5bf6e49d60e72dc3948eefd6a72cd62c351487d96191ec83010fbe33ea0b2b","0x29d766f95258b12980126cb011af382e539103fd95ba6b493199beffe50e3c9e","0xe88eb99bfc904c443a2bf65417c2fa37fa60348dddce1fd1d3b5d6220f53f9b5","0x86ea0c7eb93bd8ee6c45884ee3e9228f3d5fd487ffe26af465f9ade55a5edad3","0xaeaf8520f8b4ac51b4e85d5f0a758accf1417f6da54e1491bd17097cd544e862","0xb2c4cece11835867f2ba71148c436f4b0e3ce22045267d5e6af44f369f1abe93","0x01e8c85bc67a07abf6fd84f17c248f65173c83f977e8c7d446d30dd3999be685","0x4a0218fe46259269083d094cd8ad05c40d613bf6e75789baa6c3020d5d5b92a7","0xfd61f971bc4d749f2f40b7adef6a056936f38d25222bc5fc773959d8d8305f7f","0x11bd26280b748685f71aa07dd27adb367659549b371924ce9f43bf27bab47ddf","0x06dabd79aedcb2c300b7934a293ffeba97742ce68a6c79492daeb64f2bd2b66c","0x09d95b47586eeb76d269fccfdd86e7587a8baf0f8e124833528d5335584d1ecf","0x27d0f5fcbf422c8e0f1da4dda8e3d14161b39b0d0a56f3b80b2b99f0399288ea","0xd1749e791df7dfd0079f641aaf9e63bb153a0d6cc831d3a74df9a64b99667be1","0x3c93dfa09d33d426834bc972202b882f2bce558cc453283d05f2841ca95110d3","0xf01ccb6e15a2962ec28facf21ab514910c2469175c004bd2fe2caf76918fe1f5","0xede324c4960c70117f918acefade26d2f1c526231580754d2effd680813e46c6","0xc3e2f450dc94130b8a054e10309987e1842fb4972aca41aaf8f3d1e6dd13e9ad","0xb7cc972229301b516f04636d1cb2d748c972335190955b754418c37fecefd5d2","0x560454ecdc3ed6a6714e3ffbbd694423886125502fdd88c3c3c4e391f2970feb","0x270ffdcf39d0c58b3e782db00cd6f76bd778808a23931ea6d821c8201b5d4d6c","0x68f1f863b7771eb283dd569226a5a137f4fec1dac4802099e7da3a10d3ba72b9","0x5bb96862696c2d0cea055c97d882c1aea2e43ff2b77ddbff047472588e06de3f","0xadbcc83b8fec034c3c0e9159bb909362298f13d908b4d27f6b57cd037b369613","0xc6df7368e38bce356ced80baf0940834ea9e7268aa1bc534af3af592c6ead3e8","0x0e7bc7ed145913d5ab3ea90850abd19bc3727883a7a2331eece1dc5f1db9f7e0","0xc312133211808fe66f9fb1284b56f2f648012c9e0ec2d7efb6192dbdc36d9e60","0xd905cd4a4ede32daa4aef46620fa9a1e48bcdc1d23f0ac02598466ecfe9602db","0xa7a255cbc6ba6e918e1094ef7b518d93383a1d4f96dd3f2492514cef80dc0e3e","0xa32f16378da74f95a937df6b5161305bca41894f3eebb44a77ca0fc62eb4b7b1","0x3a8fedff2f3f1cd9c37c2b6a1ad62ccd79a9301f992e8ad0871f53d87c28f6f7","0x79cc67886b6cb080611236a5d7843c023b73b6a42c30265821e4fe3ff741d7ca","0x7cb23149c1539c50577695c7e37c975dc8ea6e0e7f09c91d0d3453b4a8a38382","0x6ff666a004e90d738ea76f289fc845ec140bb3b14a3c3a2dacdb499087a44a50","0xa6e3506d6768e0eec022595cb4914867cdc03ad6fbd76dbda60573c54613d162","0x1c6619d2f2a832bc29decd86aabf28fb3177c675ef9c2cf4bb5ec8a04a901ba0","0x4944424f4626ad6817a4444e35dde950f2d813a598c237e62f877433bf145a97","0x3036da25f7115342028cc218cdbf78e09cc23f9e9f257d2d5851fe0c7f83c847","0xa4694dbb0b73f83be3e16e47c97a7f0f7b3ec9e1ef1c473b3a01819b3eac15d5","0xacee48d7605443bdadb32ed475f62a00a2059b9baffefb2cb03e4168afaa17e9","0xff411f9dd9eeff126f8ab89ccf6a0648b3ef39f469452ed249ad99451c1432a5","0x0c8124792236cbb5b8ca76508bee85a331f4543ef07fd43c116e7ffb59c49031","0x1ca7fb97f4ac8582561844711bb80616556bc6d590da3175af5d93d3d9087278","0x980d161f74a7062f7ac0ec0d09d5e22e3807649939cf61cd706c1e7168709544","0xe0d79a0338b511e70a792eed15cf9524cdc284153cab1b1124600561b86e4e56","0xeea10c754c9aad032d01b8c2033989b570b9478ee3c904a27816d022a3026037","0x3e706b42c49248cb4e7bc23a95871d949b0d4d5ee11c59b6d9a73f326e3bf5ae","0xfe5864648384c85ed745981fa7891e9d1389e1b4c461a4f3dfe9f4104d0be1b9","0xab81ded25dc5eaddc842b73a81746b055d5f04ddaf4c4f3975f1b084144fe569","0x18ebdfa94c69d7a075b0fd1de99f3e77a44a93441f56b06efbf1fd6fb46bca91","0x2e65b0516fd74458d73e0c68deb523d5741e335dd7f99b6baa333487d07812a8","0x868f7038621d35507ea88d56fb3509aa313da8bf4529615c9637da776207c35d","0x21988e9af4c39f8a8de3f00341890c008b7fd9b93e29a31542e99de04273860c","0xe364329ad7fcb81777fb8ee1679921b3cb5e69cd8424d64f7d5b003a1916dd43","0xc71f6623f447800c74207217a206180f389070c73a0e9fe459f1544a24446bcd","0x57edf41a21ca23f59ebf0d29de16a0a115192b0b4264de268352f43fe70073ce","0x0b776bc7b496565ebfae9c6ebb715d44d27685310427598e4ee987454d8feed7","0x16d9fb7f92216ab7ba3139e4ff3456b423b5dc169acced199f9f75c9785d760d","0xc199da25d9c7767b54bd23343abd08e36e2f52fe6d540a3961446c1a0a82d97d","0xe5ea1c020eddf10ab52ad845fbe32c9093c369ee5f87a1d6de433647fd7c50b5","0x43c225ad708ee685c27f102d347d33689aebf49adf688a0d2e1742251a299ff2","0x9f9d6faf4b1de92770f7d8685c4b257126c89c8cf05b4ed0363c2893c93269f1","0x15224090de68bc020c1d2a85986c2ca9198f3ea50c1fa0e6457dfc43894160c1","0x6feb46ec44622e2f7508e0577738a21c1035bb048911d1ef001e2083934c71f8","0x4f555509ac2cdf492daf3d23a16abd9703f68a44c8d5d8ea8cd1b9c7140c4965","0x24eb3ed6531fdd9cfb376c1174efc1b86161f1d8eb32469137b8442891ec4167","0xb91a40616e0096b2e1b824f7e4d1093cc34bc1a78f1183993d3dcecbaa6d7eae","0x0523a07059cced2df1ced2b91cbc30f14d20bfba567bb3e73b0735312afae380","0x0f293e61cf5227f094df9b0534ed563efac231953ce3a80d2716da5e1cd9b8b9","0x2943ceefefd28db62bfb30df41e8a816c062890c30cb423037f4eb65111fff4c","0x1a76996953213f8aa7f8f6bd5f20bbbd5b51530ff791ba03794082aae08a0484","0x306312d647f63a0535d9dc1f081f6c42eb31e54099e06bbbc8df04d8f90ae13c","0x760e719dd9a20c13555ad64e39162031aa8ed5a3376c9f1afcfe97f83991e7a9","0xacad3847b3553d1552d503f5e90f34b89406126abbf0271b224f63d4de4a52f1","0xabcc13ad8f50ee0f97ed2f86dd79ab49e320d4041d608fc36ed102e4e89d3775","0x138b3079520d24f953873677d04da453af8fb56b0bb6951ce7372d507eeefea6","0x9c3e81eae7296a9517fe83adec833d5214d955e6c82a14e2bcc4e699998c6360","0xf2aa0bfd93b622792e6d63add010f700e78986665e8d813b7d36db3d1ab2166e","0x789a57f79b43e2f4e941daa56aa0a11b07eed1bfad9d7e794c3d014c53e5f586","0x38c93013bd92978e34cd78771581a4ac6c4c76ebf50201660258c2dc39096a8a","0x6c7d8cf6c4a64b17ee50d4df45af80d2b999841515fb966b3e64519126e079bb","0xe3e18608abb358d99016574dc936e81de86f2411419133a4c6d4bb4e85c5bc5a","0x50158e1a34c692956fd793aef929aad5adddf2d6bf399de80aa5523d4cf0356f","0x3153bbd80eb6d5b26730795f662051077545b1505179bf69bfce4a44641290e3","0x0ac9d78c663a5e49fd9be2860dff72b89548844546240d1a37d5717cbb21cbdc","0x441a95f1e9e8d145433f79aeec18b96c935b8d138073f55a31e903ffaf3f68b0","0xdacdb23dcd8fd9596d89eeed187be0850b1fdf18355e5ec429e37a39d19e654b","0xdd677fe13b7fe0d232b996247d69a9256c55d1f37584db646815270041078f1f","0xe83e8c9100a868a9a333e8beb076fc2c0bf2b21017a6c1adfabfbc3ba7425f0e","0xf52ffc3b06617bdda4cfd91d414881c9433e6283a0579805542503db0382f4a7","0x0bcfae4a0bf4336947331b9acd69a6b7dfdde8a31fadec086400ab3f09d10a33","0x67bcd919598b2ce9ae1228fab78d2c5c8fa702008ccc9753d51a0601cfcc3904","0xc08272195d653104cd5cd55d97f5cbd11dbcfa7eaa0476c578ffb97916716bd1","0x8c35156d31d53ea36c079b9356f5d6d91b311e809b77a4635639bac30be52bd6","0xe70b4a8590b66602fe07518a17f6de474e7cbe36d4d2045561565da76f8b5afc","0xf26223fe95a5672bb2d242514a7d0a1f4dd6d08fbfac1836d427bc8702a320ce","0x75f7f8a447801bb3acf20ed694b60cd14d95954391a921e8e0e05339d096a919","0xd1d05e656ea1a0986dacb863d0cd2821efc38614e05951b88fdf55a0942d5fdd","0x7172a700197a0a26dda57445e2fbfb89518f7b4bc691f525ec86f42be842166a","0x560864607666d890df7290ef5cbfa98d20eb69c16ade8983a04e0bdf101a8e64","0xb0bd7e4a1b583def2a87bec316ae0488d8cb2bb0c0f45eda6eedd14082446d99","0x0bf966dddacc909947ffd7ffeff60040bc4e4907fa1418598ec0ba209ba39484","0x4e22a5d59f287c56cbecca71961e56fa96d4f0886c0abe104c2ae7924acfe06e","0xcc080730b54f8be0ee8be7fd4b8f91a5ebe12655c290d1532490b82abbcb2981","0xc27d9b54c090854715f411295a6e84702f69203b25c2c6f7969b1d070d2d67a0","0x41e0053eee47f499f2f87dba74353b410692192910f937c60ce411f5ca799020","0x3768de7dd1c4cafec8d9b8c71027701b3b4e9888abefd150e9c3539be9b25653","0x6a52b9542c6f58741aaaa107e1d988ca05100c71109b6c8315d70be6d10a7256","0x63bd10a3ff2d8633a389735f9883c12c5ea1efd7ed6c85230ab88fb212e3223c","0x619273e074a624d168d66a23c41d8c4d778b81130e4c421716042a9ecb35d2ce","0x24ac437869229c0baa55bf3c8ea5a9baacdb831aef54b2eb3b237db5b9fd8bf1","0x4235ec78597c64af6ae63e101761ed9e5a41d185012e97cfce39e25537ef8b87","0x58f616fbd943c66b28779d0ce6ec1a4c7a6410ae9e0b535d86e8ef8a602f38dd","0x8b788c1f76f3ed2d60a489801fd2cbef6eb1376fcadcb39271bcdb871db1be76","0xab2e9356bdf0a67ce9a5b98acdd0899f8c7a30b155644b8f9e5529f6f180ad49","0x26f4c9de43d9484f02ba67a4127ef15b0bdc3445a3d489734323555c7439b338","0x8f3fba7aa023dbccf54e7866c045aa958dfc708caa1647d86e43cef90f6b848b","0xcc5be6b4b4150adeb70255c49aac8f729cc2d9e7e223b441856db2c82f93d6ad","0x664d40707f8afc46cd94b6c93827dd49b3334670c6489db26eae2e0989ebb241","0xdcbf52718813423f99ad8390432090615e03d8b327e7660b14c186d9b79001b0","0x67f2216c81651be52519917c9b1f7ac6aebb2de3215f6ad2c9bb3f3a937470ec","0x71504929c73d24b01cd5ed9f9705e682a33200f6b80c57e68e5e8c1b508ee6e8","0x80e5ddb0eab7ea334899ab4eb7259dc0f82546f6566d19ce74059d5e0dc2e850","0x27107f68d6ba46706d0a93296ea56b828d9fe8ee2bbe3cc8ade9c4eff7a1292c","0xba9fef47f87a46e8f14e237bd4e6ab70c4edf018f1c95608c2428fbc20d52ef2","0x423a94df89ded9aa17454508e2d097b64af6c812fef51403649d9a8ce20edd69","0x3ad2db55fe5657fe773e3b7111e43f4b662a181a20e875b3b8be52dd9f0e2333","0xb17488bb3b0a2f76f38be74133e3a1678449bf69894a5a5b446930af0d94530f","0xec6f67140836296b2ca930def916f3c457dcc0c2a0d528cb05a0265a8d82d41f","0xa411a759ca15c53c02aceadab5845f34695fca0a13af890b8f2a1bf7a7a24cba","0xace344342d0b5c957dcb76adef708abffe0aff6cd315e3a5cf2996f27e680a66","0x32b30ad28001b07bd2fdb1bcc0930a673c96cb3108ca666687cd48c71d63fcac","0x6ec85895f612bc513d6fff14fdb02cf761a46599894d2b2b9d9a327c54f0eefb","0x6f4f80a32ebe3c86d011f81828fa7a53596150b19fde8f19c8022b6719b3123d","0x0797b1467787a8eade4ac725685287af48d6988ccb96bef04a728b549dfcb0fc","0x449331483d80c53342792de66fec85ceff607953e5e9aeffe7f6fda1694dad98","0x0c27ed749dec26c01d4e9e8910443323f1ac5b4e2b6314bb5783b03a34d13c22","0x36235af797770d4f61d3c96d3b9287d4872ed12f5d65662f72aea8fa60c9cfdc","0x2cacc66825f3b04ecbeab909fe68caf4dd5fd4174034e088a13876f75c17fc7b","0xb9c00e85d95adedebddb276707b7f6f138843d45e55ad106246b815e78eb12fc","0x21db567eebb89e5d736e8d64fa93df91021cf1e1508cb0be29707caea7be6e0a","0x4a60e70883ed5cb00413a19f4a1e41ee7d24daa217d63c8941754434cc961463","0xc3482b63084298a0638cc8c79a2568f0a07b1cf848607a35dff184d59039e426","0x37d081e5eefe91a4972ffc3c3f9fba51e9ee1df7df46ff00afa988919e5814c6","0x5d275bceb3e15b91dbe1c0a72f1e6294aab35500a093c06cce83e34b0a12bc82","0xf2ed6662a04fd58f8696b6996ad05c272307fe1800cbfb58daf7c49fadf3b950","0x6c69865940ae940c0d26db0d61f882f8dbf7e4052d06555b5fb7cf8d3d9debae","0x628aa477eae0cf8be720c88e9cfa1cecd2f88c9bdc8dc7a54ba54c9e0f41df13","0x08e2c4596e8b4053af4147c2410891b8a6b1548323dd8d781786cd41a7608cf7","0x910f04c7f4204ec6903fe52c67c653a1971858a34a277ea808910729b30c03b6","0x7f457ce9a5ea462b7e4a4320bb9aae1bbf2c09b1cbb648d4d47e3ca32cc7e679","0x3c4631ce48305f927271e0078df3788a8afd08fd8b1bc5253eb8c6073d294924","0x52b7377b9f4d6e7d481e3898cecb2005faa4297a0748920418d2046faa2f8983","0xa15402c043e68b5ed1feea87f69e814a413475e261c13c900cdc7d7f02603064","0x32aca725795f43dc36d13d8d094e531bf8bfa889059dd0f58f9e07bdf74be6a2","0x1cbc197bdce048e5e420dd5ea0b215b643ac5bb81ef713495193209202f470e6","0x0b40db39047919a79da06cef186d9d5502220d6e4da92e25fe2eb965d04d1c37","0x9d1f2e8f3c002e9d033eb5260daa0925b171e84faef4fab932ba6307359a67ae","0xc5592b083e17eff0c28303a03ca466c00696dd69822a13be86a2f020b4a22df4","0x8b87faf7d08e6bc02822b719fd0093899e61852696f11e4418d96a0c0e4782dc","0x8828f96345bd347ceddbcfe7dce783d5b88209b2d7af2b792efb70e89141e633","0x403ad2919a7c50860d24002488b242b8da50ee78e7cc6105f2d3bb44dc94ac9b","0x78b35599871be95768b2fdfaf9293a4491ecdc8ef25b872ee404fa1e441436e0","0x639b0fad8cb3c3f822c7f87d4faffe54b8e4515394bf43d17915df9c544359d8","0x28577b583eac71d1cc83d5c99964f04aeabf091f4bfe80d26d477bc5068dc3c3","0x7ecd8640901d58f6d7b90ab0199f15e8a487b97861615b776db53a085e75683e","0x7362edf0245b94639b0c160d6f398bb95d7b995e4a5d838e6f4e19459dade094","0x370d4476d0dbfd5dfa2821372de6231b6e41ba39180f2e2a0d3951df969a65c3","0x71b45202025ebb4e1615b11fe92609e7ad1f0d64c925b877a8d3ec1a3b47b4af","0xd537e497f03d2e7b7be3fe1b91f2e6a82db8a644d9f01f8293ed168e7d3f0ea2","0x9223941a43f35ef37db69d0122257647145c16c7ecfcdb28a0f8b746872fb2cd","0xb8304c2ab619bb6b08da4b89f4c30f9bf16240a0004359a685cc83dc0c0f4967","0xd0c6f9821238c26656d2df47d481f16727610364cabe475f7fdefef517425be0","0x26cc1cec77b55bba551d182c42ad8be8134b2381f654f66ba598f3cbc0b30777","0x1db0790071ee1a3b7a14a060b226989c468f4e1cedf74df7f1aa2b8ac14e9197","0xa39933c54d9083aac3ba7d7b4afe8126ee6357612d82f066090c6c59d6ab613f","0x2f4c65925b2577db4e4629e46acf27ebb536565e66efe9dcfa164a9f1867a962","0xb571af6d03341dddb95d9ee1e856d5d5e57d4136606e1bb21b09d218c792616b","0x32e7e7dff82aefc63ceadf82737097d389f9cf6210d6502d6df0d47823a34e4e","0x90dbc1ca56dbadb2b661077a1ceba6aa3890c372369b4751054a7ed3498ab226","0xde708a5749dcbefb285c70536102071adc5c06b55912f58d3a16d43a256168f4","0xebd326d9a2bc9e8a22ef613756e627bbdfc522683cab4cebeb9d513a15421e61","0xda6726da755fc1d0cd998f88c52a98fee0ba5c7934a87c8e0bb2a70ad62c630d","0xd3e4cc54c6fc55e75a44b1a5b3e68c4777f170973a11572ddaa00ffff7e098e8","0xdcd8b9cab833de5614c618b7661b3909ff5c12f2cf03c5e52351dacad9121b69","0x1dc754466176cafd659b71e627810b7db358ad8b15914bc81ce1bff0569cf71a","0xf49f060534c981c2f2d8f75fdd8ced77ee7476a2fcf95a183606666622e271b2","0x698f4010cf63ad30fbdd055d804bc19ddcc94daf79a257b2dbb7730c4a867e9f","0xacf2b9a2c4c5d9b6cf0c22ba2b06bcba55517583d8024c8ba837326308bdc706","0x26e17d0ef809b4e0578ce53ee42b74a0d38e7d676721929ebf9dbb12cdccdc82","0x38a67e02ded2f25a722b62e2696685203621a452d4e20cae0a716877f40beec5","0x64a423be0140774c855f2d8e5e2703e292513b4cb3aa5e88a6f1ee21f890e986","0x98c52b83cef0bda902a4f1cea33ec1c1b25a7a5a59a56ea33d8fb0412a505e07","0xf902e47f64af464d40cffb10a95b4e2b9e5ae28ec33291b68263089bd4520e40","0x00490e071e5d2524ee85401074aca9981f5f3ac219ec2ece50d6be53eb887bef","0x6d210cba628cda7e0b4dbc8999407ac52fb29ece1373fdd213e161ea4080d97d","0xb6abcc19fc8652f8eedae2d44a08ebc291490e6426adf40a8da777ac88a105a2","0x5aba81091c9f333045744f2dfe8980e6286c2bdf0cfe95678f9f2eed1eceb791","0xe274b705a96ee21949bc302a7d2c33e41cdc5d7628f0d532768d570381c0e9fc","0x14eda6f813af714556650891a93ceecdafcc65464195a3066a348a79f6ca27b7","0xdd0d093c1d3848db7dfc6a4f6f1d6401adbf251cf8addbb88cda8ab0d8241f57","0x8bbe375e328c15196b0a4c539390dd4b363c0b32c0c6075fd66a2b7eba8c8d31","0xf7011b1a076d65bfd62c734f62d4299ac0f6bd520dbc7ca6ce143cbe66975407","0xd58b6e7c5e921c355dcc9a1424d9c45ba5617cf66b707de1ce47c3387f70071b","0x85c32ea92c9829c0b6b92268ea223a6dd0804c7febaf74a0ad200e71f9692474","0x4b951f8db84b9d7e1b9e4f36eebe32b099e22509d8fa9a620ac5b6f73d6067af","0xf9d08a0d89261d4499dac681d5704db6b0f22a004d25ed9cb2c55535881909fb","0x169228ca33ea854d54aa1e506e59ec687f618a41074f5f5de937a0e9c6343e5a","0xfd05421312e754d03fd7664caa3e541b080e33d28867738cc80298420ebcf7a0","0x9dd84ef9f7edb81cf2866c2b87684f549ea695fbf5f1ad8ef1b5efcf00b186b9","0x7869810c94f6f003eec898d8627c020b95eddc8c6b6cce3e56871df63333575a","0x6b3e65a74ff4682f5644113957c891e21d41f6450f0cca0baaa8296b230531a5","0xbe0b3933478621951b85d617f88a1216fd761df0ef64c0dcac091124bcc947b1","0x118c137c59ec5df9510ccb5c0c44d07f17139554473881758d8ddd869df07cac","0xc97e47dd11b24634a4f9db0aee18ddc9f2804af5b646cf4ee3feffc683b8848f","0x18bbcf2f67dbe1bc50dd211a926c01726e228bd96398d25c2a3a66798bfeaed8","0xeefc71214ea1dfbe727ca29a841eb90d58b033b3b4366126fcf9405ef9a915c0","0x17d96a75c02805a81bdc347d47fe3e77ea543893ca9e6fa34558c473c24040b3","0x726882d1677354aaded40c4e78e6d40ceabd3528b82c8c19f46ced9985e1b723","0x83edfecc3f1782f2560da9d2c9626b6e1944712c1a63db1f9634eb17012334b3","0x69fb3f4f81f2b847c6788b5ebb9582bc01c307daa4601533a567c5533a7f47ae","0x851b95e96d3bbbbf2c243c39a7a524a8106744dd9732158584603d31302b05bd","0x3f041be4179f6f320e4a3dc015fdf5e29aab69dfdf4507e25ff5b9c1e307ebd7","0xe2e8f179680e27135badb96f908de5ca7d47469b6643d05e1fc3b518a03119ad","0x19155476e9833446784f267115c214f94ab917d061cf42813dd4e5e4a0346ee8","0x2c153506662cf99aba8c88c1779bab0558342a5c9f722d59bbdb9a934a6956c8","0x0000000000000000000000000000000000000000000000000000000000000000","0xc7849e953d86d4f6c8e131043ea8b2c37c5a17c8cac390fa03238b8eff986adb","0x24b35e49568a1920b33c3d547ea4b4c7d98ba2501063cb78ef39cd6174cb3488","0x3ed7f65bd9305eda28aeac4dd8c6fb35781b4be8ddfe2ebcee257d1ed01434b5","0xf89fed03aeba79c6311efb4879b084aed9671542b345f433528b9359e8f75e0d","0x3804ec71de95260c50e1783c5da6227c5d50d63b70bf04c1d0a4d4330eb0f42a","0x1e5fc96047be10be978656e500440c233d4946cbd3abfbbc775486cc86414c94","0x0000000000000000000000000000000000000000000000000000000000000004","0x1b4e1cf6969315746481d515e1268217b0d55fba270bf1388f315a960316e7b1","0x4bf1fdc440a1c755fa9125a048be5c9970581c18c12427e962c2afef94da9b52","0xd4cc1f71dce5bbcb62ee8fb495961d3bf3be91405f7a5ab7ddc238a57370a408","0x870c4294e2fb414fdae4367899fbf0138cf15b22d7bb6ecc13905c46ae921d85","0x4912aa33d2fb0762e58a5ccaead722eb40fca71de3cc07d49aef79962bfc76fe","0x6776df6fd1d8b642d0304a49608c5404d5cc31254ad0dad84004f24d67032998","0x9f1910d51d9ed0adc824cffdc25cdf43ce13160c709bb6a4c8330823b404c351","0x999063083b058de1dc7174a582e9181e83fd2346ac8d4e6ec2421d149a1ce4d6","0x9a81c43dc0e2b05c4f316040d4f09ecb8ed80663d7e49be451fda28ba4c6c855","0xd0ed4c81298ca613984ffa624462671c524fceebf6d9912427b3fa1197557856","0xba884e7e965dcd23a7fe546c57d312429e116160773dca27a23c17bcc74bb880","0x868736eda33ae45c6af8c7ebd2c5f4fde1ef0e6e12fd33fa790f17c656512b72","0xb6b2a44a43bd95746e5feba6b797ccebbbef35f7890e8905276e679622d667cb","0xcb340178cb180dba4cb24f95641071b8469f9616a6babfa8296945fd4c9f3ebd","0x73a6ddf0f493978a972f8a4745d33b94ff2430a33e65278d20a24da0e9178f0d","0xee855aaf6e4b0957bbf9001086e8130dd673332c02931b014b80af58a29b1f5e","0xbbaf37d5b12cba094ad8ae5ff216db659f109db99ae2a7beee9e9e9032f98e7b","0x1273b98b6c6958a2cd5d97f42c0742f68a8d405e6f7c13ac76d90a6e4fb08298","0x6ad52ef33ed022788136b219815636f0d07fa81b565c4f526148f59f4ddaeca4","0xd48444c98f08def24dc4f564ae27daac2e7e3388a7de9795baf6ed67de32cff3","0xa758d578cbf0f25c20f4c3dd034d07092c81130c757bbef55329f0085b072db3","0x770cab6478eda515ee42809b219ff036967c82881ac1cefd9448d717dade7706","0xb857fd7deaa59a0bd34fbdd6f64441bc33d16ba1756a970d0cf7478c73428ee6","0x65d378fc5ee176d2ca410cf4d0c7c2bafe66862d49ca1ab4352ed8379d8b2358","0x5bc7e4334a03eb245e262b8d4ca5bbe9eb810b9978b2f037adc8822e139900cd","0xb56ce6f9635cbadd173c544a9d174298a2cdf759136f6900033fc657d02d7b0d","0x711c02a65726a261b888e0158e235f8ecc20e242f53161138c3e3fed097c49fc","0x75519f9f64f71e1f14d73d79f3d75ade15d7e3fbc59926e425e5b4e1bb244a33","0xdbcbb3b11d3165ef92b5285c3b86f8c9a652a109023bb19fc4f9f42c74887467","0xdb890207ef016355cd1050d6a0cce6651cf90de81d37287f7a54b97cb5ce0441","0xb7ce4782315b2eec76c8304010c38a22ac83c7b170cda2018b6796812778cddd","0xde21aae08246b2001411a7e10f8723d26c3a811b80bd091db242550c42e6232d","0xec89e6c8d4e796158d2c05a458600b1af2490139d8c46cc4c33b0ce1e9c202e4","0x478c48c1503f200c3304cc11c60aaec097faf82fcf354af32007aca5a74a4bc5","0x11d10389352831271a9e13171b3aa8e45a23cfeeb95ea24b58ea59cd7a9823f7","0x9eaa38fe0289fac586a6c100de9923962160a839a726f5a4850de5ff4a70b5e2","0x7af7a06b24bb64dee4c5857054333d34b16fb8f4511eb4f7e0992cfc99b94bc0","0x0ba8c50f6d0196f6f16f7b215ff326aa21c0ace264a950a2903e48f595d3e96d","0xd139a14408ebc0a860ff81283aefa77fbf2deb67f25494bdeb23687ccaa12794","0xa9040b647d621e8eb3c320964f79acc66ce8772c3228f40bdc9996b0187ca017","0x11fab617d1bd97dbfebb6b39665b9cd65328595b697743a23311fff58f43a4f2","0xc49867a9b87443574ca9c747844ba3512abfe3b9502e33006384ebe19b03d745","0x7d682c7fcea20b9fbb80156f7042d76049f0115849ab2e436fbb76a05137e324","0x5ecf8e4ecf5da8e8c9b39ecd43c1d0c07d15349bc0c65701989c1e2d2b5da7ff","0x5db437c3ca51dab3cf07042ca210d3eb832584d0a7d287103a339b919065791e","0x8e87005cfddb54c349f41cf5fc9d4452ea41db48c6d6d2d6babd9f17a39fde91","0x70022406c6f374ce097fd2cabf1e0136bf474ec87d40141e29aa0758d3aff378","0xac7031353bdf85c0d6c8da635de24619d5ecc2efbefc49c1c1e219e4eb8c4c4e","0x913e9a335c6edeed601becf48acf25831eaab1ece0d27d68553c356a099da606","0x12261f70a493a86f370d8dc576b493c61f3dff3fbcecb5f9876fb3da8e404042","0x001fa49e73f290bbba276b833111ab0ae2dfaf50b0141e861e88d9e12d878e6b","0xdb8f6c735ae6a8a13e4a251ac99de62b56f098c55763992026da0f120c19c66e","0xa252d31fdc0542781e4f107cd6a6d2102769d82ce74d2d59b92e50ad1a7d2048","0x9292b72149d52bf0ca762c8f176157c00c1084376b56f9ee137d277ffc41a435","0x810660ac7d1e8f9af8fee3b76b76235742a0aa2a679036c0589e57842f6856bf","0x4f64516ad103ebaea95433a45d24503e0750f5d402ec2d3ab1a5e98dbc583e53","0xf23d12e24f1a6dfbfffcd720b62ed389bf23bb95cbc2895c1651f4223e2006b7","0xafae9044ac456fdda75ac54708cb501c9d83a72de2a2702f889ba0fd039f2f00","0x0a4852f877948613d7aaa7a03d032dc59d5c42a42a0b647dc943479d254b4c7d","0x308d04db1591a19e35fa67047b251406bbd0f71daad3c281b86488abbfded3e9","0x96ef8b4b0c74f0435778ccf893048b06a72b93cdd28b18cd52d3f7bed33ab57c","0xea55555b1996672dfd928a8ea85ce29c820e3334c5cee58630c157aacd6e87fd","0x8272b820e113138fe9ad0da3b1f2847f475fb0bcea1ca6fe0c3fc63777f7e7a9","0xd8242c4ed5f3054deb296f63a6c80e7148b846a71424723f98b39d5fa9482ab8","0x8de213acf13b7136efe28e3c2be0a096ba69220ed68ea31c415ada1e17a762e2","0x5b9d290e27af115d1e940ff88c2badb59f5afdfcef9d4ee105856b142dbb314b","0xa1b4cc344c98eadb8049e68e6ca7edae28ace42522f87f401edafcb9466be9bf","0x92f2d1e6361f77bb6408fbbca988b57950300a90f8732b6a92e8517daf29b783","0xeda37904e89a6980fc7c9366ba20f2b6890d86fd61b724526ec95ae23bf417e3","0x0aeb64504649ca439f49855d327db849a5697514b3c30a2e9729b8a766365847","0x83dc10f7f5cca84f311839108dd7fadef43db7ee18783b55a923e3800f70de57","0x157f6cb6a955922a8f49f139c1e99473fb5a153507ce6f392d8a7bd4cc414607","0xfa30b1950043201b3c1048953439c1478e7e7f6c51de053af214a421fa01814c","0x3124a5b9798d66536dcb3d2d447f81ed17c02861721f21a603dbc2d15bf4d1b2","0x682f6ae005f5f06ed757a69c6e386e30ae4f074aef29a29e7f03a0a409992555","0x1ee829fc7c8c97459125e2be6d58d2c6faf16d88b82cacb6da1d15ee85b3a080","0x4e1a473776a9ef70b47e9b326c4ba8796c8d7ccaa7b2cbb125acb8f882bd5c4d","0x194b67c66ac5f0e392eab3041441ef1b13617d1c0f6511d251c2f56b41cdd100","0xd643b1e1bdb8890d59721760c97ae330aacf5e43568e5643fc62f72eacee6f2f","0x9708a7505d7c0e56eb7a6181afc0e3c2cd3ec04c18908e5c02db21e9ea686604","0x3fc808d025832d2970a868b161bfccf946f648ffe981298194077739ce12cfa7","0x5de0c63870f084b592a6b62bf4a367b32da5208b258725752a2b777eab88d1df","0x03d1fa72673d42db8813667508b35863fea85f574d5c2f0136dd99339434f784","0x7b7a935acd0aef976afe76810bd0e0fcbc6f8e6e9a227da704ad846bfec5ec90","0x6dc67fcf4035e58f993083083ffcf3d3420fe2b18028c04065df94fe2ba068b3","0x057193aaf9f16ac4fa900b7ea08059456b61d350e1ecec3e819e9432b581e82c","0xfbac72a6958343a82f570c57bf7814ad0cffc6981a38ff87fcb3f3fb996aa2f7","0x444afe5f64a38fa7cdf58519d641b96b5c6e3d684948bac5497858af432bdd7c","0xaa17c48f4c7102fc913892584915786560d2964f8fdbb06f26d589c8335f05e3","0x8284e75c404e5bb88bcf1daf6ed2090248216822c5b362fd219949128e7dc637","0xa623a8cd996e8904c0f67630799c95e2e80f7fb0ae86c8dd542d54d40bba7b37","0xa86eff68e9bb733699e5ac5ed686aa41eaa893aa675a184c1321917b4d114669","0x0b43ce1208a187e272b204675c2daa7f381e7dea07ac8198fcb4092306c4f0dd","0x4b1242f4b1a387c9b14f8449eed7e7f0cf8ad2ec8398954c7a57f12ce04b6327","0x9b254fc999b50165bb20bde707d500f67a1d8d4bef0d4ace0aee0353e65164a4","0xf61acae1bde04ab4b8245f4f0940bca94e043fa12f85d70a10e75403dffde3e7","0xf3803d0d4d49d64733837a96ba3f99fb6f81a9f7b436a94215e9b988ce2e00ac","0x5a993269005558983f694791e9713ac402cdfd6a3bf4d5f9b19b1a8761884a28","0x503350a97a38e5744eaab514e78fee1cc5fe3de2485959dabdcf3406745a4f49","0xdea4cdd23ba0e0c45e9a5753cff7a182056bfa0ef3edf2d47d2c30e6acb05112","0x42df27c03f295e4dca40b990f7f50af41313e2203e4b6ee06c7f3bb401c77903","0xd9442f2a34b186f970390294eeafdc92fd1c862da3fd9040baabeb3695ad9570","0xc4a4899a685e0865d97d33ea1e8b9ef4a9f46e0133a6520706e3805d3d6ec400","0xd895fb398f3449e2e22579b5c2acda61b920b948d9fcb3253fb3d650f8888eca","0x66a11d329bdecdc9d9e28837e39c5f49a3caa7e762a4432868d1ffb4e5758a51","0x48fdf76abc603179ca5a871143e414b0231b3a39c54f3a3ed61aaf43f2df2323","0xb73e76b0b6151622af6c30670cc42b6faa4142812e51304a6ccb83f06ef50808","0x1dcc2bc197c227f54cd07056e25f610ada629caeaf2fd8d944247ff538f4ced3","0x62cec307fee5c8cc3a643138d61fa8c026ed1234351c2b5a758a5926d8390807","0xa13ba4b9f6d583ce27882b664cfec84ccac2ae5fcc625ca8a2dc7ec2b5ebc7f5","0xd550d865e5bfdc54a934656ec2d508bb917c87c335db7cef327a56e848e72f85","0x2de45aa08973c6fceddda16f130e4f4a84841ca25a1fae4a4a37a89d4d2e0ea4","0xf26f0aae713e0299a677faee59d5c70a887b806dcfe6a6cd3ad428b284a59b27","0xf18516aa8dbefcefb94b66f89226595db1757c95bb4f40af8f0f9589709da1d0","0x816a19a8cacf8a7f7e3fd551cb64a22e73f9a8b4cd020da258061e666c406c78","0xbcbd097c1f05da74279533632d645f0e2fc294b92c1bba7f7c531acac572579d","0xcd49b42b765fcc609e6022b407fae8df78ac5b0cd9d873e0c685094ec5b63998","0x3510ab3e13d9ed1b874e912601a16c63a6660d95e524604dc0c5e339db242d2e","0x35e68fb48c5627204a5c29fc64e9cccac7e0cf9c9c61c3e4d143a771e0a5dbd8","0x9621eb72928ac62f4e2b08f35f81c61917216bac50869f55d9727706efbd2c12","0x99184088a31c220090a85bb78e969b0f66c744954977ccdf2e41e167d1eeec7a","0x20454f732d155a2d50d8c4e4867dedfcd5e0e7330afed1454993624a1ad9ace0","0x63c67feb137ca46defeca012d6fac0f07183a3c9305bb33bcab94249ba4e9bb3","0x6fd756bc01cc98c7832190bd8197db903635d7d53907609dc8bbb2a0838a72e7","0xb65883ae2cd740a60d1819540d4c27874944d874cfae3d057d2fdc44486ac9ae","0xd5b9d2fdf003eaf025af83f59eeeece1f82195cce2e11ea28beaa5b958b190ee","0x8f04b3fd2da5cbd2e7af05e0c4d8317e3dc1ba81c699fddecee8635cc940c500","0xc0f8e1f5cf1ec509e24419462cdf687470b85ee08c3f63e5d86109de48bbd38a","0xa1e38a01d026078689fe414a99d21e91a27f9a130aa9f569bddc166c0dc1625f","0x639ce7c81694f48fc5dac96dbedc6708634cc17a71349301543ec7182d18163c","0x99a69fc0857aa6d2342dfc856aeb92731fedef02fefe4b830c7f50f973240a2b","0x518b93ae8d0bbbebb0360cb2b6125519c3b0d8cc456a64aee8b2579526ae3b21","0x83ed5d715f2b6223bd292768b2ecd91525f9e8ee6219ba4e7a5d22c6a9b1bdfc","0x3414670f98678189b3a491534c0e65afd1c39ca9ea34644ceaa5f7bbd2d4405b","0xdfe6be72dd0dd354f3175e31c234e38b0b418f52f0221c1343aa1c1e815fbaae","0x13777edddf47e48ad944096e12de5c6c9991359302d3970d47ea2c2e2f9b25b3","0xa4774584b9a55b64a14854c07687203665843640fdff0e2fab9458bc01004dbc","0x42a84ac82db75c45c0d71cf629eab6a96e70d2e026eb734c17f7564dccca19fb","0xe5800023c3112c3e4e020787e86e802e6451b1dc3af2ef8fdb4f76366b672b3e","0x56541abba26abbf4908b8cfcb40639df9102cda2badfb9541a0e20d18b57aeb4","0xc8cdf5b296b2ddb1814cb25d6d438857238de37d4720e40662b8fea0ce7a537a","0x4e973152d0dfdcb2b9ac6977efa87b0134ad8039f1b4053c59631d07eb9fad35","0x822e3315a479740bc08c67dcddcf0bc5b87f47721eddf766cd87c33f27d5bb02","0xe3eb369704ae45278a683152ca870874d2269d35f29cef7aaea413e94273aa0a","0xb0b300509efaf6427d843e0c32bbb7f17165bdb4eff946acef7fc32d5104e817","0x6ad430de027c87af2f959c7678e93ab13882cb468f7eb4ead477c927d89da2ad","0x77c59030f67ba33792e64ffb8ffeafe2afeeab2cc2410041b7a70a2966ef54f3","0x7aeea4afbcb040ffa51793df1e5aa9faa1c4e85eeb0912677e31170087c7e7c1","0x2e6c0c31d8877240154df533e38b0ce5caf9ed192ebd8adf7b5a3931ee433175","0x2fa97cf55e864a6a485bc74c2c494ebad3489b64f4c0bf05101296b0bd43406a","0xb63ca7b8bea5ddbfc6bfd850e7690031fd9d853c6fbd1c70506193ad1fbc8544","0xbc07a44733190f7ba99c889dee95d25e7e9d2409826866292899af9f9189d466","0x89cdf1400af6f92f542466cd5dc347aa2eefc2e5d558654ff7207159972c436f","0x89c9480c36a4c210d52ecb58d9a4faff4360ecf385a5efb4aeb86a94d35a4c37","0x0a3d1b619702715ea33b9b11405792e0383c2a34c642cc7656c6cc14e67bd474","0x7f1de084a21ab850bd19d9d9bd9e79f2ea0e929b91e22d2d39a02ce05559ddd5","0xbbb6a7cd35fd804fd0d610552f9b91c396db0525c2af87803fae6097ad6328a5","0x68cb2354702deee361cd1626f8770234b6f9920a4776d4a0da1d88963c697f76","0x53ae9a97d93c2a7a51d9f4dd17cfbb35c974a72b9e1a5b6d2c3138c645eb14d6","0xe12f1c794a9eff1edbcc999045c3e2b9f28b4101ededa233d3c13074dfed0ede","0x41381b13ffae9b9d006fb192e15b99531fb589aa4c3baa17f81bf32bf8c5e391","0xdc67ca0a03b51bc17fbc3ae68ec6db4f26be225e813bcb33fbc9acec56cfab71","0xadc3ef48188f0dcfa4016971273e42ee34acc6c3626d590a6e09b204a7183143","0xc2ea62f70f134554dc7e6f5b535550fc01fef1a72a12316e3bf408138a7e2a5d","0x05687d220f8b79e2c25708f91cb262a014954fbcac78d5f78c939e2da0e06ab0","0x781d87e6b972cb8a157eb0faa2906c5f6fcde66dfe99fcf43f356582c1c4f4db","0x56c08ece024e13bf393743889e35da55c3de610aa005b1a2f9410088ae8382dd","0x246771c5b80e7fe40710ca086e6a9198fc3a69d42b57154e938c5224dd7cbfd2","0x5919476737e6ef406ec78bb65454cd10400e9f2575771b2d2b2273cbb8e2c13f","0x5249529cc94ef27806f01f44c6359d30d13d7a4598ddabb018cbab5b527c672e","0xc58236203d9443e6c09baa6be95092000e24531c351ec2183f8526d22dfaf94f","0x9211f27ce8f8035947c6214b01ce5c5e4d4e22fc43d37989e35181e6f2dea88a","0x4871ee97d2f8502b8fb43839f109e4ca5967de83058c57764b3e426a5573535a","0x443025b09bbeb064188f95744b9730ff447d64fef326c3d948823fc704611ab9","0x87276b6efede777e3bb2dd756559c698d51a56a60aac0057bb37a5287b83f89e","0x2cd6e02f9264430369f9397c6dcaafbf1aeb0c9a074fd2a4502e7a7e9d2aa268","0xe07caac441599366ff3a4d6f760a24a07b6c2f372bf34d27d6272b79f322e54f","0x707f4bb60ef501df859112143dc8941afa9573b875954e5db64a4c1aa948d4d5","0x5ac0889321ef2c639574b6ffa8ada51ce4fc0e6ca89b5ea34eda66cc99c72f2e","0x4910ed40ace415a6801f806143d1c2eff95aa13641a646f8e5aed43aedf57873","0x267d4cbf9d4fb0a286627ee08f69491b2ee5ba4b7a5d0d88001eafd922576c7d","0x2d4d962c7f71e1a057ffbf56cd3142962cbdc1cf13b8a6aa00fdcf4c7a3eea86","0x3c2cb67b0005a5f6dc7c21aef481a583a2fd4f2df57a9f999324dc45453fbb23","0x533661290cf0b4372d03365ccea394db3ad1ec2fb998e72d5e3f5aaae259a489","0xbb5cfc3bdc442bcafb18a625ee49ee40fa8480b485497b7214648cb020bb6302","0x4ea161b5049c0b2b4e357227ae896bde7ed44f6f78879cbbf926141ed1b75a28","0x39df8e75558978229e746c8d77dd05fed760aef99ca7c767eb03c066f0c5ccbf","0x6610c6cd1440c123564fe6072db8b90b29505731077795efc92a9a64e7fd7d19","0x5a0c4ac13b6600cdfd75cd5c94d3b606851464c95dac4320434d5313b3c34336","0xaf9407d22a3cd3fe6203e2092682e9afddfcba2088cf1fb6c94854fb69fe455e","0xa711ceb5299d53e93fd4cc79e4c079e1846c6b65e6b4a8c7924b3246b8bddae4","0x058598cee1e3a4c11e9471a266abd24461972b02aee399fd3dabfcd390721c9b","0xe29e8608f2c7bc8991b37c77574231bd766f613f7e3a2b89ddfa520f3b533968","0x7623c08c8b90e0ae287da7c936b5c4f5c48c314166072a95ea4506105043e593","0xbdc5c896a80bdc13a81f7e93377903789d06685de30b72ba0418a23ffe3c2d01","0xcf800ae4e19cee943f798c3d28b8ea5f9eded686da8799864b5b1d476aeedf17","0x1e574853cd4b20904ec140e931434940f2ace4d623f8dafed44ef05dfaafa314","0x4e4bde2f9656b859bfd97ef00e94d667542f5433fc655a7de5207efb0b82fe27","0x3f1c83b5858128025d98383ad37628181b07bbff25e45af8b6841f9028022e04","0xcde84e9fbd6514568b1fe8c74780f12269114e1a86ec8a194a4d04a83441d762","0xc47c507eb1f199a591067d0cb9d974486fe0ae223262f43674fbc44a4c1e5aaf","0x7d50839d549b73604745cdfcde29ce9b33a264ed3f51ef800211dfe7c2967bbc","0xb1c48f35eef573c5d18b017956ea209ef85568915a01e6fa38a6324c7dc7851b","0x12eae7d07aad29c87134e06c5f73e0771a60fe2b406da317979c2bf36db196eb","0x70a7c8a859a8aca5e6ce83900a52a575cd9080e8b89cb9803394d09b8f89860d","0xd1731814e3c7314e670d05eae9abe419721b92044f3a25250be5cffe65e6c9ff","0xaccba5f19e67823d15cff5ba3db8ee970730087e6e80d121040d3c3c7fe5ce6c","0x836c4e855b0a5ed246137d24d84b788a529488eed7ee529664d94977d5b887e9","0x93826f5058d7e59c1c98aa68bc73a7d30b821ab5e4ff93a5a1d41354dff5eff7","0xb0ef364daa1c71e7a5d53357ccbf5d2bee2174aec6a7439418419293ed370dbd","0x97e79c96e94e18f9a2eb6659d918e52f0e1a6f0baedcabeb4cac03cbfe4a11dd","0xf281ce1fafb8a86729fc05e5e21044408aac24b1ca1cad1ad72f8c3ac9970ac1","0x2f4c47889300bee2ebc976dc8441f76490f2c8caf916f212107396cbcb5cb8c6","0x01baa4316d68bdf6f56208ba6b0a9f1c907e39a687a43d67a437dce5bafc64a9","0x6bffcc4b38bba399a780f75b275963fc946ac7f7f6bc13f78084d47808746687","0x032bb7d2c79255a7c8c1848928d01eb895b1434bdd56ad122ff71dfbf32f46f4","0x1728842d702e0c0c53fac5ea652d11c024b671f6c28c9472de3e60d417a3ec71","0x6db1cf6a4ad7aea306805cd29deecb06a1897be0de236e18ad8c548e4e947f52","0x28db21b06a0632047f0f842c214dce0fb9d08dada18df3c967bfd036a4bab396","0x8fe57a30da86f3445a2781dcdfed8cb1a37ee353bf890e535a353dae67bb20a4","0xef899b569799e533fcab2d466841d0e18affed420842599a3eb3566016192129","0xbaa90bf8c718f10ede1df5f79a9e67f8281b3fa844812f10cfe83a3340793858","0x80e2c98197208379b79ee35f317754b3ffa177b43292a22d22b87a3c956d8184","0x0dd48277a75a29a8233ed703ac45a23f754d7fc66ffdc1d52ab3d9bd902f88b6","0x7278b8290c6048e9d8fc1c569654c05e03001f7f33029480c18b0953fd67af43","0x7fe5a5c34ee2b2160ec5ee3f8c4ed3e69522faea0cc46c8c1eec71ef841a5447","0xb04cf1b5189c3c7660af287fda110addf77de4c8aee3fd3e809646b1e7647e2c","0x4a4fc5d72a794d819501c2195dcd43fbbd536f30b45d38537397be42176837fe","0x84307464e6ccbaf67fda3c072fb5fbe56f02192a4675d0636db8548037f3cfd1","0xda8edb53be97dafa6f636c2327329c044057a529d0092cf4823f183910f0381e","0xfe6e954e54d0733886c11bd079d8e8c4da676aca8860487feb599bdf9d77abd0","0x251c72a466ee770cd4c6a824acf31f12ddc4140d56e02b251874d3b9287889fd","0xfd62ba5e39ab3c8aebc7c57950c52e095841e29c08546df8e9937656619883d3","0x79189dacd63e6d44b08e8f0a7dd53b14f05e417089eb88929fb70062a3a9f440","0xc6d2847805f7aaf4fd45285a7b55975d52532cf724389618ace6d44573daff33","0x62e86b9104503a60578513751a00d2bcbfa5e6d16d96b670b94c8da6bd674420","0xf0a0872d15add6ce958e7bd3acf52135acca3736284b62730d2a5e2ab80825e0","0xbba9de6e38f9f1e8f2d3d4b24dc87665cfc02ea10a0268d0cabc80adba3aecee","0xb86364d0223f46effb18ebb3544e490001056e7e575c7da50d32f98509038f0b","0xf80becd45254289b88131202aa70ff78757950c9a0481ac46a1d740c1a29f7ca","0x2dc31b9b874c196319c8810a107b27b06b5439c835fd5ef73744203d2fa8c542","0xa4f2a01e12da091daf57ee56c2054a21aca6fa73a6e7cb3e8e45dedb1968a92c","0xfacac3b295576c4ddb8ad28f80c5bb7566ba14ad75226ffb01ceca79977dd873","0x7476ba1149be0fb8796473d07608876ecdaece8039f86ac3c8f7d4098900d1ad","0x25f16e263500812c02f95d937f516746fe535eb1d37e129a216f38fa3d704ac5","0xc1d9ba2daef4426afd6eb7a671a93fb148b5a936f7af419b2f4230c0ee0182d6","0xc7d44f7027b96c3a6842503c69d3ef415c1f39e362187cadb7ce16aec0863634","0x728dd134222a949e2eafaab4131039cf3728307d14443a51fb987d4ac9cc02cc","0x49bb2c37410f2ee1faeb21481cf0451f01649609997485d185220e7f46ed3401","0x77571d6689a9724297da2f892d2184898942b90d9b2916f5f9128e566a7d2919","0x75ed13e9ddc130ea1fdd06aacf8ac9a5edb223c643fab682dd9f7f6f7427da27","0x205ff4bafb7b1e63e6f30f861e28edbc094334287ad5aa459de46f7d0119bcd5","0x072d216b3b3076d14a52d1ebbc5ae9ea75b3a73dfb4ca4dfe884ed6334e601e9","0x73517c364afaf94b48b71a979c1385e867046bafc21c7873bf0af3aaf8aed3e4","0x8a328d63cfac401b22fea911e46b2678f70aea1fec2318b3febb693e2f18a08e","0xcb5790ef44c7663de4588720b342c4e891c51664cb01cbb305c2af8f8c782e17","0xb50965a9b111af78574a5a86ddf5236b80782942e5267d283d664d191ce322a4","0x2426ad6c0a2057fc3574c3f431524b991d5f221141997ec5e0eda705d1df2099","0x0419a70d4d31eb0fd8afa14413c9d6905d95762645b5ff2971509375be939dbb","0x28b7c5f650b77cf0acd6fe0f160606af51a1bb52814f015aaaf8a18c90f591e0","0x1fbd2b445beef6d4f681043fef819ebb26f5ecc0360fb027113a62c77cb4a0e6","0x4a23788145abc3153306eadf2a5f30c051b912dae730baa2d3909116d48fde3b","0xfc6884c8cc76421909690615bf998d44b597fc3aac2429ae391932bfc1ff4579","0xda0b3eae3dfa3fc9378d42a7d61e2fa69579a3209a370a7576dc39f1e456b953","0x7944268f0966c2f4883c14a2f1ca6144187a2f422e16f99460bf9215331b3f71","0xb16d839504c03abce4acd2a2173771dd7481d54fda9e2e01eee4eca7a0169789","0x6be0ac223ae846d5f1301758d154c92c9d5993f359109a0ab2f0b20df43df469","0x5d731de1b8cd5700d49d1e0f527fc7cda571996cbd519145658f55225605ec9f","0xa303b93335c3ac3e7fd57a24d5d85dbe525936e543be946364202d6a6fd39dcc","0x6c3440d4e46a2e98a5849f2eab48a9cfbbe2910652a11f8e344950b1a41b9076","0x6ff3e0154fe627ff47bfabbaa21c0f59ea270e0d884079adacd436baf65c8438","0x47df46356594ed04b5bf8990dfc295df82810ba429c86f66bfdd707e83c2369b","0x0000000000000000000000000000000000000000000000000000000000000003","0x5615a6a431186aa0e322484f660f21ad1ff1c7e9ac44ac01b392b8bd8f22a4d0","0xd071e603da5a06269051cadcbbe003b7fc7bbc098f6afff7e1d617b9f2d5b5c7","0xac20a865383bd4283729afda350bc80bcdc7f40c2f827ada2245023f86804bc0","0xffa45d4e0078d30d3f1e5cc1851ed32c7481a2e81fa9f441bf2982a632bbf297","0x752cb3bc8a9bf506350730033976707a9616f67c9fd481e00c96e5de8cf5a989","0x7e66163297423aebc11ccfcf0cf4122e485d260c68e7b7f6d316479cbab55db9","0xfd7b052cc227e4e47842a08aab6e7fdb0d39f75dad3910dac0eb713cee1f0f8a","0x5ee5a7e14fd106bca57bc8908a68373203611fa6cbd9c12b565d77fdb1d305d4","0xb77582889929b50451b33c4b66e61e013853590896feae7b0305bf40acdfce84","0xd74f3e9eae22dd7744ed316f1786249d0fc88198fbb32ff67fc60679d9e0e758","0xb8bff01d2ee246daf64f1fb885480543b92fb33a3963e6ce541166a00e82d1fb","0x28e73c6f50166bbf605fc346e26d4b578425a1f2cc48231adeda27004c653a70","0x7560120e0e6a619c4d81f1d3eaca3aa7deaec2315704ec638723299e30d8b133"]},{"address":"0xd95276070026dbbdaff30d462a2253fa649e4a8b","storageKeys":[]},{"address":"0xa294cca691e4c83b1fc0c8d63d9a3eef0a196de1","storageKeys":[]},{"address":"0xe5bbbdb2bb953371841318e1edfbf727447cef2e","storageKeys":["0xd74772f2d3f7816dea5b83ed6aeeab044779ebba1326573f1e3e7525b0066171","0x000000000000000000000000000000000000000000000000000000000000002a","0x475d52e1600ce8a3be70dff6a6538611279b22a82bca4e83048753c8f48b22aa"]},{"address":"0xfd1b0b0dfa524e1fd42e7d51155a663c581bbd50","storageKeys":["0xb330d5835afe24dd2fc749c856c37de20da21517311afd6cfe0ed8ea49c6e90a","0x363bbd0212574d92ffb538c50a6eb0a6a352ac6f7d8bb159a41ba809eded8f9d","0x584f8cd0083bbc1647a9e40a07908dc7a4e2cc05b0703fc85d3e329c4ad81fbf","0x40f73afccd6706400618e7464e5254eb0fdfc04642fbba2e6dbe07e9bab1afc7","0x5005fb144f6aefef279b3c2dd972f69cef73676936e94dc0398e7a60e4d57d9a","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x48556fb7b73ceec8bf187a571f9c1da5b5c310e61ff862f560eaa503b53fbad1"]},{"address":"0x8a7b7b9b2f7d0c63f66171721339705a6188a7d5","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000004","0x2bab454520286b51c08bc24844fb90e7fd2f9adacc21d96020e2a6cb17635a2f","0x659a4ceed2b806fb3f1651a1f9d9eda8a3a803528691ca29ad0cb6903d9faaa4","0xf50b9d92114a759045f9357d47a14b2813ba9358477bf552a161b1a1a78a56b7","0xc74823e89866e4905ff67b6b788d7ea4fe5c0fdd8d631e5fd45599a321497af4"]},{"address":"0x42bac66889967cc1772f6bbd5d3bde494edb4653","storageKeys":[]},{"address":"0xe4edb277e41dc89ab076a1f049f4a3efa700bce8","storageKeys":[]},{"address":"0x1f57cc62113c3a6346882dcf3ed49120411ac2d2","storageKeys":[]},{"address":"0x548f27e2c1eb0c90c9c0ef3a4a61a6ae60038f02","storageKeys":[]},{"address":"0x75c97384ca209f915381755c582ec0e2ce88c1ba","storageKeys":["0x78633473e3cf03ba50d81ea6ac9b60d67f872443ac00c24dd4f9eb11fe335c7e"]},{"address":"0x2f18f339620a63e43f0839eeb18d7de1e1be4dfb","storageKeys":[]},{"address":"0xf63b34710400cad3e044cffdcab00a0f32e33ecf","storageKeys":["0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x81d16f8ff08124c3470152778cead9041e7af2087107c2534feae46c33f982db","0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0xb49159afeb54f8922b0a82a5d58bd4728b8c20bb","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006"]},{"address":"0x47312450b3ac8b5b8e247a6bb6d523e7605bdb60","storageKeys":["0x177667240aeeea7e35eabe3a35e18306f336219e1386f7710a6bf8783f761b24","0x7184681641399eb4ad2fdb92114857ee6ff239f94ad635a1779978947b8843be"]},{"address":"0x2568e74ac4fbb5937193f64a8e747b8372b8d1e6","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009"]},{"address":"0x52fdfb1157878f540dcb961561ce5f3b0bbe6f80","storageKeys":[]},{"address":"0xe3792a9c235d434b702023b33f03c48c41631090","storageKeys":[]},{"address":"0xf88859464d0370433a3147074bc6d6a5aece752c","storageKeys":[]},{"address":"0x654371aa1827c7d30e2c800efadb4c7de1ffa5e7","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000"]}] diff --git a/bin/mpt-test/access-lists/18363443.json b/bin/mpt-test/access-lists/18363443.json new file mode 100644 index 0000000000..5608668ad5 --- /dev/null +++ b/bin/mpt-test/access-lists/18363443.json @@ -0,0 +1 @@ +[{"address":"0x041dd57480f16530b51e13608e276798fe424560","storageKeys":[]},{"address":"0xddf294fbb9618776fedcd808c43cfa14f11cb6f4","storageKeys":[]},{"address":"0xbdb2dbe612b22854db89706769687438373d4c08","storageKeys":[]},{"address":"0x5b1b5fea1b99d83ad479df0c222f0492385381dd","storageKeys":["0x75245230289a9f0bf73a6c59aef6651b98b3833a62a3c0bd9ab6b0dec8ed4d8f","0x0000000000000000000000000000000000000000000000000000000000000002","0x12dd898f4a480c545f9838e2a0c101409e865c40558462403a8273c3ca3e2337"]},{"address":"0x2486ff197be4553775daf666a815deac482bb6b0","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000001"]},{"address":"0xca11bde05977b3631167028862be2a173976ca11","storageKeys":[]},{"address":"0xf338cad020d506e8e3d9b4854986e0ece6c23640","storageKeys":["0x04e7be39f2fb63cfd7d4fcfe19f108bc6b411ed972d99fca0a47dcaff878ce5e","0x71a8ef1b1265359d77973c3524afac225c0a0d829a0d4da5cac3b34532019fee","0x71a8ef1b1265359d77973c3524afac225c0a0d829a0d4da5cac3b34532019fec","0x177667240aeeea7e35eabe3a35e18306f336219e1386f7710a6bf8783f761b24","0xc3312d608c59a50378089ddba3e807885a8eea46b12e8c273bda8b229030e943","0x71a8ef1b1265359d77973c3524afac225c0a0d829a0d4da5cac3b34532019fed","0xb4c82a817c6e58e43d4ecb2529caab94383420d8f31e963cfe54dfe32d2cca56","0x8cde0e99a4532474b22bd3952cb1c6b00478babd3678337325283f4f48110fc4"]},{"address":"0xabfce8e8fafe34f9add56dc2b183710a2a76f511","storageKeys":[]},{"address":"0xfdc4cf3f70e93a64116bf166e24cb8d2de414b61","storageKeys":[]},{"address":"0xa83df718a5fa09259d5f02f26013f2cd668632d6","storageKeys":[]},{"address":"0xab8363dd601aae2342127959bf8e9ed43c20a269","storageKeys":[]},{"address":"0x415ff1afc201eec50beff210a2f456674046920b","storageKeys":["0x637034ff9a9768ec1d42ca6e42f6582a3447eb554d12d9f5461218dd45d1b84f","0x4142f532bd91051d937a58b0eea4a92bce279ffe9e566097d25513f95f3e3dce","0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000006"]},{"address":"0xd1a992417a0abffa632cbde4da9f5dcf85caa858","storageKeys":[]},{"address":"0x06ffa99195a5bb90698ffa4e681007ff6a99843e","storageKeys":[]},{"address":"0x16938e4b59297060484fa56a12594d8d6f4177e8","storageKeys":[]},{"address":"0x077d360f11d220e4d5d831430c81c26c9be7c4a4","storageKeys":[]},{"address":"0xc662c410c0ecf747543f5ba90660f6abebd9c8c4","storageKeys":["0x4d034aea955367291dbdfe8d9bec2a33be772a25cc9b93b6250d2b91a2ef4d43","0xafed529457b98a6959a182bd47397490d12ec79f19478c88cc54655860628879","0xb4c82a817c6e58e43d4ecb2529caab94383420d8f31e963cfe54dfe32d2cca56","0x71a8ef1b1265359d77973c3524afac225c0a0d829a0d4da5cac3b34532019fec","0x177667240aeeea7e35eabe3a35e18306f336219e1386f7710a6bf8783f761b24","0x04e7be39f2fb63cfd7d4fcfe19f108bc6b411ed972d99fca0a47dcaff878ce5e","0x71a8ef1b1265359d77973c3524afac225c0a0d829a0d4da5cac3b34532019fee","0xc91518601a7d655d0f3d6c6df534338485449d61484080a48872fbc684f460f3","0xf4ccd0482170aaa798ca5c237410af2787d773071dc2639cbfa0bf66f5af1745","0x67963652696f3a8e8976c8d0956f2afb2fdf053b99be7bf625d956fc88a52815","0x71a8ef1b1265359d77973c3524afac225c0a0d829a0d4da5cac3b34532019fed","0x8cde0e99a4532474b22bd3952cb1c6b00478babd3678337325283f4f48110fc4"]},{"address":"0x5ebac8dbfbba22168471b0f914131d1976536a25","storageKeys":[]},{"address":"0x29fea2c9dc6502c50ff3f6141b60513c60075564","storageKeys":[]},{"address":"0x60c84c819ce7a8e2915204de741770edfd867428","storageKeys":[]},{"address":"0x4919b4c03e2edc1d0297b6eb35ca55a481c9a960","storageKeys":[]},{"address":"0x34d655069f4cac1547e4c8ca284ffff5ad4a8db0","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000016","0x000000000000000000000000000000000000000000000000000000000000001b","0x0000000000000000000000000000000000000000000000000000000000000019","0x000000000000000000000000000000000000000000000000000000000000001a"]},{"address":"0x6de037ef9ad2725eb40118bb1702ebb27e4aeb24","storageKeys":["0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3","0x42539d294491c145ea563cb7b189eee0555344a78b0c544178a395de5d244e4f","0x2cc468e5c6d483cf4e436ea79a4a6c28d0c2c90b0668f483fcc2aa4e227b230f","0x10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b"]},{"address":"0x647b364ee561b8a00245d724309b9fa5c72fa65c","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007"]},{"address":"0x4603180bbb8221157880afaa84638e0fc467738d","storageKeys":[]},{"address":"0xad684093eb4472b387f6f7a5dd1768fea65396f7","storageKeys":[]},{"address":"0x0b9ae6b1d4f0eeed904d1cef68b9bd47499f3fff","storageKeys":["0xf83db3b21c811570bbe3427c17a04e0022ec49fa34c45ccaf970a30b7efe7a1e","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000005","0x6b2be13e4077d23ab9dc280707442e6bd0314e11acc845dd86ef15694b3a8bcf","0x275efad705d0d11c88a03f2fd7c77d63dc7efe2070e07aa0e0cf946ce9d79321","0xeac66755346c9bbfdb89aeb0b12fb1c58925aa6b2edf0707448143f718b06b49","0x89088c9f2a7f1ac9ed382e84aa38db3fd85e9938edc86c983ccd46ed0b79ecc5"]},{"address":"0x967da4048cd07ab37855c090aaf366e4ce1b9f48","storageKeys":["0xf904a128e3c853faa3874e8c08e7de8aa6cc235665a2ad446f50a2b129db46f6","0xa38e259b3e467cfa7a893a052e073223923e6e1bcbfd0883b8b61ab5b9d8aaa3","0x10ccdf6a88b7ae57b83d4e64176c87096739f7d9fa50c0bbb71c0d0560cd9caa","0x0febe7a008f9b2404e6842960245b277d71c3e75e331efd48031a81cf73e17f0","0x0000000000000000000000000000000000000000000000000000000000000005"]},{"address":"0x9d98d7ccc1dac1042fb7e1652b328e16a37a8787","storageKeys":[]},{"address":"0x5a3e6a77ba2f983ec0d371ea3b475f8bc0811ad5","storageKeys":["0x5d49fde334a67e55c4a90d50c16a624b5bc85ee29dc371a116d4e9c5b8ac0332","0x0000000000000000000000000000000000000000000000000000000000000007","0x41d90688a66d73ff62f5c0a155e7ab5ff005208172c6e57c8d5fdf69358b9484","0xab65fad8d227d585b5ba6992214fb2ef665027d9a082ea237e7f435a559ab5be","0x000000000000000000000000000000000000000000000000000000000000000f","0x0000000000000000000000000000000000000000000000000000000000000000","0x31a2d0d2767091fe770faf3175f0334bc50f6bfc68aa581d37381e448cb80e88","0x73581d27b3f2dd9e4c6e4c3fa7779c1e009fc233964d3d5430aa18d6f10fe34f","0x000000000000000000000000000000000000000000000000000000000000000a","0x000000000000000000000000000000000000000000000000000000000000000d","0x6a71df0dd4d74b17a1b465477dd0e3f2ce60fb2ae8492cb46457e1d679c2edc5","0x0000000000000000000000000000000000000000000000000000000000000008"]},{"address":"0x6000da47483062a0d734ba3dc7576ce6a0b645c4","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000001"]},{"address":"0x390f3595bca2df7d23783dfd126427cceb997bf4","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000001a","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000002","0x000000000000000000000000000000000000000000000000000000000000001b","0x000000000000000000000000000000000000000000000000000000000000000a","0x000000000000000000000000000000000000000000000000000000000000000c","0x000000000000000000000000000000000000000000000000000000000000000d","0x000000000000000000000000000000000000000000000000000000000000000e","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000019","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000016","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000003"]},{"address":"0x742a6c7fc1b9188434124b9bee7b8e22a3b8696f","storageKeys":[]},{"address":"0x3fda25f27211a138adf211f4c060f2149674be6d","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000004","0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000001","0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e564","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000002","0x000000000000000000000000000000000000000000000000000000000000000b","0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e565","0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000003"]},{"address":"0x82643b1d5aef4d8d33e401ec740a19d416296af5","storageKeys":[]},{"address":"0xa8095c177032a885819e35402646ce8d9e825cd9","storageKeys":[]},{"address":"0x696c905f8f8c006ca46e9808fe7e00049507798f","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000003"]},{"address":"0x99f6de6cedb3e430d8d1f1897fb92c68758f896b","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000002","0x4a6f485c1c32cc07b41a962ff745e1d2a15f32520f92181d93f06ac057458486"]},{"address":"0xe7cd2b4eb1d98cd6a4a48b6071d46401ac7dc5c8","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000001"]},{"address":"0x6952b0ff1797e2419e13118bb69eae62920558b8","storageKeys":[]},{"address":"0xff00000000000000000000000000000000008453","storageKeys":[]},{"address":"0x49a2fcfcf2b2025c667732ef0435f548aa6cd9dd","storageKeys":[]},{"address":"0xdaedf1ab7ec587385b9d883a2fee22e849871c2f","storageKeys":[]},{"address":"0xa690621b1d2f8cc06de2de11e4cf69935f82655a","storageKeys":[]},{"address":"0xb3d9cf8e163bbc840195a97e81f8a34e295b8f39","storageKeys":["0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"]},{"address":"0x72c60bfffef18dca51db32b52b819a951b6ddbed","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000008","0xab5245ab498aa3aa3dd7566292b9f87a8b622a91323f6dd51613fad29e486b13","0x000000000000000000000000000000000000000000000000000000000000000a","0xc9753a66ad610da04beb79f65d930c250bf65f97e40a956821a29e2396fb87fc","0x1657bfd66827d22516f46550e2a81ae8dda3c42f00ed24d8aa3dfe3dfbd85e68","0x0000000000000000000000000000000000000000000000000000000000000011","0x0000000000000000000000000000000000000000000000000000000000000010","0x3539903365c4436776f483e59cde8e5e3feecaa22a69da3cf2e77452f5605384","0x431ac926be0a9ff174f0c90f184fdccc7e37efb0a1b3ea9b56c96e304d7ac8cc","0x0000000000000000000000000000000000000000000000000000000000000006","0x0a8622b3bea6b77f880346589e928a5a9e981ee9adf5de6ebaa6cad387beb635","0xb1388f2db63cd8d309ef228eb70910f72c9dbfbbdab820e60447a04923322580","0x765404f494932271b4b7b96b63002d1a99aafc59a4642fcbab1329ef7817dd4a","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000009","0xfa18cce661d851bd4053e7b7c312ed1dc528d18f40ba69c91318cf3a92e7fe76","0xf33ca819bebbbb1861541c20de662508c211dc2389f53785d1fa1f5325f7d0f6"]},{"address":"0xe7b67f44ea304dd7f6d215b13686637ff64cd2b2","storageKeys":[]},{"address":"0xe2b07a269b7c10b369f3ac9b9fd11f0224871378","storageKeys":[]},{"address":"0x7a250d5630b4cf539739df2c5dacb4c659f2488d","storageKeys":[]},{"address":"0xf522c0f04dbb5b07610d7b2f67f018dab4a28df5","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000001","0x63187d71e139eee983a88d0737447c7451979b3dbb75903c76b5fe430d36588e","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000000"]},{"address":"0x7e0e75ef5c384cc44dd7ac892cae5cea14e2dba5","storageKeys":[]},{"address":"0x22f9dcf4647084d6c31b2765f6910cd85c178c18","storageKeys":[]},{"address":"0x8efef6b061bda1a1712db316e059cbc8ebdcae4d","storageKeys":[]},{"address":"0xe91cbc483a8fda6bc377ad8b8c717f386a93d349","storageKeys":[]},{"address":"0x31fe393815822edacbd81c2262467402199efd0d","storageKeys":[]},{"address":"0x6cb3ee90c50a38a0e4662bb7e7e6e40b91361bf6","storageKeys":["0xcc6f251de275b0cbe02525d0511235dd654050f4f3f12d09c647337a4ac68340","0x2dbeb2049598770392a629a6f13df0250c7d33cac630db076ff917b65df5ee19","0x0a998e2b5267a855fec2b536d69eb411c8c8e182a57fec59ab6bbe3afff3026b","0x0fa949dc55aaf7f36d47e65c27dba764e322ac03f40b0b0e9d913438d971848e"]},{"address":"0x11b815efb8f581194ae79006d24e0d814b7697f6","storageKeys":["0x00000000000000000000000000000000000000000000000000000000000000a4","0x00000000000000000000000000000000000000000000000000000000000000a5","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000002","0x32d80bb380a6153715a380340a591610b4f5a62ca0809dce09eefe0e7c37ea7f"]},{"address":"0x13e4e13a48cffed87c63bd35383c76d67813aea1","storageKeys":[]},{"address":"0xd51a44d3fae010294c616388b506acda1bfaae46","storageKeys":["0xd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b5124289","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000002","0x000000000000000000000000000000000000000000000000000000000000001a","0xd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512428b","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000017","0x0000000000000000000000000000000000000000000000000000000000000010","0x000000000000000000000000000000000000000000000000000000000000001e","0x0000000000000000000000000000000000000000000000000000000000000023","0x000000000000000000000000000000000000000000000000000000000000000e","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000007","0x000000000000000000000000000000000000000000000000000000000000001c","0x000000000000000000000000000000000000000000000000000000000000001d","0x0000000000000000000000000000000000000000000000000000000000000011","0xd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512428a"]},{"address":"0x556b9306565093c855aea9ae92a594704c2cd59e","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000010","0x000000000000000000000000000000000000000000000000000000000000000d","0xf68cd560cd5285fa96f176cf0d55ce2f05178e0b25aac465f04891d21bfb0c8b","0x8819ef417987f8ae7a81f42cdfb18815282fe989326fbff903d13cf0e03ace29","0x0000000000000000000000000000000000000000000000000000000000000011"]},{"address":"0xdc5a9a89e31651d60e9a1e6feb767dc9feea763f","storageKeys":["0x3a63c37e3270fd06b43c60a0c1bfcd0fbe4ecc3a2a454695ea6f9d2e18dbbed4","0x0000000000000000000000000000000000000000000000000000000000000013","0x000000000000000000000000000000000000000000000000000000000000000f","0x06929d18f29b68fa3fed7fb9d8070a5363577ed8e8e3d75439ef9ce8fe098f32","0x000000000000000000000000000000000000000000000000000000000000000b","0x0000000000000000000000000000000000000000000000000000000000000006","0x3dbb268e74eb5317b968aae683c524cba3e4f9796613672f500ace353ba8468d","0x0000000000000000000000000000000000000000000000000000000000000000","0x9eb9e978eded9538ddd2316255506f4ddb4a003883587256186e155816a5959e","0x353448d629f793cfd872fc5b042f4ea45274cec0126798e9881c36a9605e75a5","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000e","0x0000000000000000000000000000000000000000000000000000000000000010","0x0000000000000000000000000000000000000000000000000000000000000014"]},{"address":"0xa0b17d7a0e2a103e2b0ecafecc6a29b8d519a528","storageKeys":[]},{"address":"0xb739d0895772dbb71a89a3754a160269068f0d45","storageKeys":[]},{"address":"0xd2347f485b7cd86ca864017a5dee559e3e8a4ffc","storageKeys":[]},{"address":"0x136e783846ef68c8bd00a3369f787df8d683a696","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000005"]},{"address":"0xaaef4d5ae6ea726f542033ddd8e0a1df6b189794","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000b","0xceef804a006c10f9dbafe22f97acc7148e36c12470a1806b4c84cd894b34d8e3","0xa55fdf537d406c57b0970779e754e61af5f2023a745c44bc248d35ec1d7fde1a","0x0000000000000000000000000000000000000000000000000000000000000014","0x629f20d8bfbe9a62bd05309ab8c8ad9929adea79f2545b8bcf91de7858d8b19e","0xcdc5cacb532e20e7b4d27bd1d86e3fe331960a6c35fdfc38f5ee228ae0fe597a","0x000000000000000000000000000000000000000000000000000000000000000f","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000007","0x000000000000000000000000000000000000000000000000000000000000000e","0x59b5fdebed8a0599e8070477070be40e6849ca769cb1717f281a7d5d78cdb239","0x0000000000000000000000000000000000000000000000000000000000000013","0x6eea42bf65fbf1389646386cc5d79d5378a0c8b47621752579a73c639a67f9f7","0xbbcfdfea5791c371b711c6f268d09b4c37483b981b0f807985dd4dfd751c4433","0xa891920fcad3f07391d9d57756873c8a211e8561c1f227e18e758af64289fd82","0x0000000000000000000000000000000000000000000000000000000000000010","0x0000000000000000000000000000000000000000000000000000000000000006","0x6431126254908548e92b90103946e6c7083c5efa38c86e2a8be92e7dd421291a","0x30582bb735035c0d67645a240d259c387c5e99478ccc4f4efe746da3b49bb51e"]},{"address":"0x5d834ead0a80cf3b88c06feed6e8e0fcae2daee5","storageKeys":[]},{"address":"0xf2b792ca68090476e7778714724dc2fa947779ff","storageKeys":[]},{"address":"0x163f8c2467924be0ae7b5347228cabf260318753","storageKeys":["0x3d2a5be9749cfe3ec60d14ef2f842725bb2978bf65d11d28555ee7f0598365ec","0x91e320e648bc3ea1bec1c7814ebbf2e41589bc3b7aad9297ff973323018bd735","0x908babbce7bbef19937f0b5073d69352545ea0dfb6386bcb0276e0615e97607e"]},{"address":"0x0a363560832bc8eec83143f5f7c823d246d8443a","storageKeys":[]},{"address":"0x16b2d19a6bcc021309e31b7a2ff8d0a8f37fddf8","storageKeys":[]},{"address":"0x46950ba8946d7be4594399bcf203fb53e1fd7d37","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000004","0x2e1f2ce9810d6f3862344d9b57fb60c3e7777a577222a301a0d2112772ed885d"]},{"address":"0x2796317b0ff8538f253012862c06787adfb8ceb6","storageKeys":["0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x0000000000000000000000000000000000000000000000000000000000000065","0x0000000000000000000000000000000000000000000000000000000000000097","0x4a04b9f2c8708b66882943eddb5d5350083b4ff814542f5aabe9a830c67d70b1","0xa713a0acff6f2de46288041ab25b8fda7ef64525900295efef2a541e5ee6ed32","0xd19c737734396143d84fecab206eb205529a6af96bf19c648108a9e3631dc1fe","0x00000000000000000000000000000000000000000000000000000000000000cc"]},{"address":"0x580bda1e7a0cfae92fa7f6c20a3794f169ce3cfb","storageKeys":["0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000001","0x9f39ea8255be1fa9195709a23c18dc6acff54dc6f627292f353fdbbd180fe867","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"]},{"address":"0xc04de60292580b9b7f01d610785309f6bd1690af","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000f","0x000000000000000000000000000000000000000000000000000000000000000b","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000001","0x80a66a63a11a7ae59f33fa2ceea4ce49d42f73d8bcb0028facdaefe7f197bca8","0x61e2e76f6a19393fe82df7c4619aee886ff3508cf884a6095e4114a041feee5f","0x000000000000000000000000000000000000000000000000000000000000000e"]},{"address":"0x4d5f47fa6a74757f35c14fd3a6ef8e3c9bc514e8","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000003d","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"]},{"address":"0x33a93bd484053615933502cb1299f77de48036c8","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007"]},{"address":"0x29469395eaf6f95920e59f858042f0e28d98a20b","storageKeys":["0xacfe491060b475e094848fc44594e8fe186ec1fd1698f56a8e0f7fb24ad94adf","0x0000000000000000000000000000000000000000000000000000000000000002","0x3f92ddf7b223311ff0e9c59321c327658afc038694a7ea06c15567fc8ea9973c","0x532c9200d1a8e3a6a10d6ed37ca3748506f1b9f33d6c01070a30abb704e0b515","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x73561cd22105fd9007908f7ba2cae2873966ab5750bcf99ce716dbec230c226c","0xc95bd371ea9dd6cc2e9511f8974f1510a9801f1d5d18ba3a2cedd73103fe6b9e"]},{"address":"0x0ea7372338a589e7f0b00e463a53aa464ef04e17","storageKeys":[]},{"address":"0xa2cd3d43c775978a96bdbf12d733d5a1ed94fb18","storageKeys":["0xde779631e3dd70d5122d73fba3cd59f0f23c17d4dd4b7d98a44c5b3dfa3e0572","0xd2a683a0c80111b5d9a848f464763f397860c9e75dbad80616d837f54f99f756","0xd13801343f04a57447ba35d4f2a09faad53876c310e963ab4f7582b86f985dc3","0xa6da79bff68c4ee67276d69a85f64b1126a8e8456c4fe632db5fdcc93e171231"]},{"address":"0xf326e4de8f66a0bdc0970b79e0924e33c79f1915","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000"]},{"address":"0x73270a15c25bf6f5832f9fd41f9fea9a7915310e","storageKeys":[]},{"address":"0x67fe41a94e779ccfa22cff02cc2957dc9c0e4286","storageKeys":[]},{"address":"0x82d98c813e63b8f0b0928031539046ff49128560","storageKeys":[]},{"address":"0xf0d4c12a5768d806021f80a262b4d39d26c58b8d","storageKeys":["0xa408ba8ceea2527895c548b60e4c24d07defcb5901eacf214bfcb2723fcb3090","0x108050c237422fed9b101c7db7446a55bdb5e1ba4d87e7cd1095ef534bda8bf6","0x2ddf3e8f684d2a93d6d6d5c0a3dd9ac2c849deaf90e99cca0b7aa09a94603502","0x5f40605477164c4fd355d3e893f3cc70d1fedf5adeeb43c8cb5efacb72ae8961","0x0000000000000000000000000000000000000000000000000000000000000000"]},{"address":"0xe592427a0aece92de3edee1f18e0157c05861564","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000"]},{"address":"0xd37bbe5744d730a1d98d8dc97c42f0ca46ad7146","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000","0xccf4e9af3f4eed76b44141ef1be0ebc0d034011fddd3a4cc5ec34f2be4592f75","0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0xb5743e6cb9b55a41ea4e0a66271c977d7c766b7c","storageKeys":[]},{"address":"0x881d40237659c251811cec9c364ef91dc08d300c","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000001","0x684fdb4b219d1c63474e6c8e4dc8c2611de744d4aaa2b78c4ec411ebb6ba9756","0x684fdb4b219d1c63474e6c8e4dc8c2611de744d4aaa2b78c4ec411ebb6ba9757"]},{"address":"0x0c5b07b1a08fb07141dbfa9cceee7f76b8890c03","storageKeys":[]},{"address":"0x6c9042eec422831dfddc5b7da36c0054f7a6ae6c","storageKeys":[]},{"address":"0xa29e963992597b21bcdcaa969d571984869c4ff5","storageKeys":[]},{"address":"0x8761e0370f94f68db8eaa731f4fc581f6ad0bd68","storageKeys":[]},{"address":"0x230a1ac45690b9ae1176389434610b9526d2f21b","storageKeys":[]},{"address":"0xa9d1e08c7793af67e9d92fe308d5697fb81d3e43","storageKeys":[]},{"address":"0x886d906b084cdfee032712fd5b3d577302508f29","storageKeys":[]},{"address":"0xdef171fe48cf0115b1d80b88dc8eab59176fee57","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000","0x6a7f830031540cb6ba9385cdf8981e3597f9470d0bcd60d2f0fe84bda3553da8","0x20bd48b28952f36f79354a8551697624fd2c128c08477dab084b947b53876b6b","0x0000000000000000000000000000000000000000000000000000000000000001"]},{"address":"0x7994c25b68e887ab62561c8c27eeff3c34c718c5","storageKeys":[]},{"address":"0x1ef89ed0edd93d1ec09e4c07373f69c49f4dccae","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000001"]},{"address":"0x80c67432656d59144ceff962e8faf8926599bcf8","storageKeys":[]},{"address":"0xfba175fe8169f08eb02239ca1b235a8e13415204","storageKeys":["0xbfb796f01d2de056efd33347c678f9e6c2784c80103e21291ca1cad60a89f056","0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000010","0xf2c535f78bbf70e8c137acb4e29e2f986545c919fc7214c8b5be774e28c99ce8","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000011","0x94cc64728ca8193670842cea4e76da9d0c16e319d971d885bcd6bbd134e488d4","0x0000000000000000000000000000000000000000000000000000000000000014","0xee722d724c89bf250dae10049726c7ead1476357b09d9efbec404caf9ea81e72","0x99af55df2b18f5d0f4ac319044baeecfbf31d3f916b070300641f7bbcb7d83d3","0x000000000000000000000000000000000000000000000000000000000000000f","0xe727b34f0abcd68809da29c4cba6af39d0dfbe5e0bd67fe496b4ada39893f3c6","0xa2a1a8f6d540056517f7685ebb03caa2cab5a92426668c4bd156bec1b5a94b57","0xbad0f5a9e726b25bcc17ba5fa850848792b174072bc03c1184566dcc0b989890","0x000000000000000000000000000000000000000000000000000000000000000b","0x0000000000000000000000000000000000000000000000000000000000000006","0xe8b0f9bfa0381d444a64fff0621b71b2155fd0fa473717d1e0ffd9bdffa89d59","0x000000000000000000000000000000000000000000000000000000000000000a","0x28a46f94fc609971d854ff967180199382447deb52c31ad45b4940bb8811dcf5","0x0000000000000000000000000000000000000000000000000000000000000013","0x3bdbca05285fc70b92d87d8c7b9e489bf0787dc47751ba4fb70ff7a65e9bb3a2","0x000000000000000000000000000000000000000000000000000000000000000e","0x36583e411db01c939cfb7263d0a44aebf8fa266d69525548c09d521fafe4ed8f"]},{"address":"0xc918f7f14109e74f0dd46800caafe1e23b13ad6b","storageKeys":[]},{"address":"0x6ecea19e9a66806e1e94a785fd6d40288f9444e4","storageKeys":[]},{"address":"0x4d224452801aced8b2f0aebe155379bb5d594381","storageKeys":["0x63da7c95b223bd8df6f855e0c330b0ba1f4391894c7b1034cfdd2c8498687f6a","0x61e381a8f2f04e8883dfafad4dc844e5b02695b963ff2a805fc101cb6baba4e1","0xc0ec8fbf02d70b2873f5a76f503e97bd1b0ca8048ab517fad231214a74ebe459","0xbc16056ccf68c5587752aeebecc9128296fa0597db3b1f8619d7e0fe34e8ef09"]},{"address":"0x52cdb891e90a12d9e13666746ed3bd5779b0b98a","storageKeys":[]},{"address":"0x0000000000000000000000000000000000000004","storageKeys":[]},{"address":"0x007872741ebc63c23826268e486ff4052fca0000","storageKeys":[]},{"address":"0xaafb85ad4a412dd8adc49611496a7695a22f4aeb","storageKeys":["0xd56bd72c62596aa451ec180a1b66c0c7fc901642dcad717eaed55b96526444a2","0xe7b8b9060b669548aac5c6f3f9f3506a8850a20ea630a4605051a9e68e2ed130","0xa8e1248eddf82e10c0adc6c737b6d8da17674abf51801ea5a4549f41c2dfdf21"]},{"address":"0xfa96ad0a9e64261db86950e2da362f5572c5c6fd","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000005"]},{"address":"0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0xa28bfc87d659bfe0cec6e6db448fb06f4eced06c","storageKeys":[]},{"address":"0xb8ffc3cd6e7cf5a098a1c92f48009765b24088dc","storageKeys":["0x54b2b2de1ae6731a04bdbca30cee71852851cfcd3298aaf29f4ebff9452b27ad","0x8e2ed18767e9c33b25344c240cdf92034fae56be99e2c07f3d9946d949ffede4"]},{"address":"0xca978a0528116dda3cba9acd3e68bc6191ca53d0","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000016","0x000000000000000000000000000000000000000000000000000000000000001b","0x0000000000000000000000000000000000000000000000000000000000000019","0x000000000000000000000000000000000000000000000000000000000000001a"]},{"address":"0x823be81bbf96bec0e25ca13170f5aacb5b79ba83","storageKeys":["0xf833cfb7cc7738ab3573637baa89524afe718752fa28b314e93881138dc9c177"]},{"address":"0x6b765d07cf966c745b340adca67749fe75b5c345","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000001"]},{"address":"0x95222290dd7278aa3ddd389cc1e1d165cc4bafe5","storageKeys":[]},{"address":"0x613876f3de2ec633f8054fe7a561324c1a01d9cb","storageKeys":[]},{"address":"0x38956b8ae9603c4ac13f553ddf6cb065538d80a7","storageKeys":[]},{"address":"0xd0da9cbea9c3852c5d63a95f9abcc4f6ea0f9032","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000003","0xf3b5e7b2afaa87733d8bedb8430937194b0018dc023c813428f433d751622932","0x0000000000000000000000000000000000000000000000000000000000000008","0x00c50324f2cbbee41befa4c7fdd00b343ec22bfee15cf5653e85155e78b68e49"]},{"address":"0x8dc658dae0604de95a6e60a7abb337d355a6e2c8","storageKeys":[]},{"address":"0x89144ab37bcb72a58b2017981b3e4384180ec39d","storageKeys":[]},{"address":"0x8146cbbe327364b13d0699f2ced39c637f92501a","storageKeys":[]},{"address":"0x7290367aa694703220516a35e68e3d339ee7d193","storageKeys":[]},{"address":"0x1216fdb1868af0adf4f78e862dadb960d391e513","storageKeys":[]},{"address":"0x7fed005ea539435ffedd7085c228c3c17e0d8e3b","storageKeys":[]},{"address":"0x7df70b612040c682d1cb2e32017446e230fcd747","storageKeys":[]},{"address":"0xb5d85cbf7cb3ee0d56b3bb207d5fc4b82f43f511","storageKeys":[]},{"address":"0xb6de3d96a6fee2a03ddad31286ba21128bc6f4c2","storageKeys":[]},{"address":"0x6b75d8af000000e20b7a7ddf000ba900b4009a80","storageKeys":[]},{"address":"0xd7f3fbe8c72a961a5515203eada59750437fa762","storageKeys":[]},{"address":"0x2d722c96f79d149dd21e9ef36f93fc12906ce9f8","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000001"]},{"address":"0x06b1f84baa77d0b76aa553699d610f2ace263e81","storageKeys":[]},{"address":"0x3527439923a63f8c13cf72b8fe80a77f6e572092","storageKeys":[]},{"address":"0x8164cc65827dcfe994ab23944cbc90e0aa80bfcb","storageKeys":["0x176062dac4e737f036c34baf4b07185f9c9fd3c1337ca36eb7c1f7a74aedb8ea","0xa9067f880bd923501d182ab273aeb10d5e7b2922a1e90246a9a4b163cbb708b4","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"]},{"address":"0x7ed066718dfb1b2b04d94780eca92b67ecf3330b","storageKeys":[]},{"address":"0x95d63e0db94e6f0485fd3a3f4ce5e60bcf53a046","storageKeys":[]},{"address":"0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000002","0x63bea916cef7359acf395d0c25e3526c585459c799da40751b0e2ed3ce04facd","0xf8ccc5baff311405947d38199a9ed11051000f058320c1718262902c7afb492e","0x30ae1eb9080cc0c26cbc5a6d3351a8dfd071566f51b830db5193fa02f085c768","0xd47b44da93a490eb8655dcfdfc921b4e0850ad0ced545e96f3a9a2ea83230d58","0x296ca052671869577b182843ddb14060e46e608806f48069589f2222fd579d8c"]},{"address":"0xc36442b4a4522e871399cd717abdd847ab11fe88","storageKeys":["0x6cc98dcd8f70dad0a044304f67f466f589857f19effd5c9d849e8dc97b4f857f","0x65c73d9bc53e36987b892850502d6fc2c0a4c8270a583ebf05c314fdf33675e2","0xbb9382d1453a6f935ba3d5111178a2dfa3829cc00143a58d36d76fdb0aec8a4e","0x453bc7eac0c46adaa20c62b7d44b063d432c77620c847f9ca7ba5f4326171433","0x6cc98dcd8f70dad0a044304f67f466f589857f19effd5c9d849e8dc97b4f8580","0xd52199c8c2cd5078d2955d688b4b1ca41e780711ef3910e58bd14e10364814f6","0xd859e4422a232f7d8f73ef924f2bbe4e9168f14615de24c867b2b00be9817e4d","0x6cc98dcd8f70dad0a044304f67f466f589857f19effd5c9d849e8dc97b4f857e","0xe940efb98da2522daacfed0a6f5aecf25c2bb059bcd0b555f09537ebfc335a1f","0x000000000000000000000000000000000000000000000000000000000000000d","0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3cb6fa0","0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3caf30b","0x0000000000000000000000000000000000000000000000000000000000000002","0x6cc98dcd8f70dad0a044304f67f466f589857f19effd5c9d849e8dc97b4f857d","0x6cc98dcd8f70dad0a044304f67f466f589857f19effd5c9d849e8dc97b4f857c","0xe940efb98da2522daacfed0a6f5aecf25c2bb059bcd0b555f09537ebfc335a22","0xe940efb98da2522daacfed0a6f5aecf25c2bb059bcd0b555f09537ebfc335a21","0x65c73d9bc53e36987b892850502d6fc2c0a4c8270a583ebf05c314fdf33675e1","0xaa6e501c6e0e37b85bfadb3d25a7e5c21ca637b7a14a88dbbed64a6e9dfe3b87","0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3cb6fa1","0xe940efb98da2522daacfed0a6f5aecf25c2bb059bcd0b555f09537ebfc335a20","0xed3166830ec2f08a2a3ec0f332dd330e970f35770235ae1ec9a1b5d294041c8b"]},{"address":"0xbd7b550d2e7571383d84acf597a00d341e5c406e","storageKeys":[]},{"address":"0x0000000000000000000000000000000000000001","storageKeys":[]},{"address":"0xf6a884fbb206a4514f2b5c7878c8084efb75f291","storageKeys":[]},{"address":"0x733ca30d19f193c1b60340697d066d11341acf2b","storageKeys":[]},{"address":"0x6704ba24b8640bccee6bf2fd276a6a1b8edf4ade","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000004"]},{"address":"0x5f4ec3df9cbd43714fe2740f5e3616155c5b8419","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0x4a5048449df075f07a3ca4ef5ed2de7f6f240472","storageKeys":[]},{"address":"0xa978187dd88788a773d7e3cbe0f729388a26e3eb","storageKeys":[]},{"address":"0xd4e791def1d554de05ec87379f240889601ce6ef","storageKeys":[]},{"address":"0x19ed335da544931ebe74afff0d93937fbf49878b","storageKeys":[]},{"address":"0xf1cd4193bbc1ad4a23e833170f49d60f3d35a621","storageKeys":[]},{"address":"0x053d80cdb4768203d0276751b6cc9611580af03b","storageKeys":[]},{"address":"0xeecf809ac3efb44d1c8f00c1914157e0dccb0752","storageKeys":[]},{"address":"0x87870bca3f3fd6335c3f4ce8392d69350b4fa4e2","storageKeys":["0xf81d8d79f42adb4c73cc3aa0c78e25d3343882d0313c0b80ece3d3a103ef1ec5","0x5e14560e314427eb9d0c466a6058089f672317c8e26719a770a709c3f2481e48","0x5e14560e314427eb9d0c466a6058089f672317c8e26719a770a709c3f2481e4a","0xf81d8d79f42adb4c73cc3aa0c78e25d3343882d0313c0b80ece3d3a103ef1ebf","0x0cd9d02c5a1e191dee341e3db951358a0ad74a185a7fb14c993ed77b1730d35d","0x5e14560e314427eb9d0c466a6058089f672317c8e26719a770a709c3f2481e50","0x000000000000000000000000000000000000000000000000000000000000003a","0x3db89e40056e1e415b186b37b7cb88f6ba0da57c1d383403faf92bb06996b6b9","0x5e14560e314427eb9d0c466a6058089f672317c8e26719a770a709c3f2481e4f","0xf81d8d79f42adb4c73cc3aa0c78e25d3343882d0313c0b80ece3d3a103ef1ec0","0xf81d8d79f42adb4c73cc3aa0c78e25d3343882d0313c0b80ece3d3a103ef1ec7","0xf81d8d79f42adb4c73cc3aa0c78e25d3343882d0313c0b80ece3d3a103ef1ec2","0x5e14560e314427eb9d0c466a6058089f672317c8e26719a770a709c3f2481e4c","0xf81d8d79f42adb4c73cc3aa0c78e25d3343882d0313c0b80ece3d3a103ef1ec3","0xf81d8d79f42adb4c73cc3aa0c78e25d3343882d0313c0b80ece3d3a103ef1ec1","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x5e14560e314427eb9d0c466a6058089f672317c8e26719a770a709c3f2481e4d","0x5e14560e314427eb9d0c466a6058089f672317c8e26719a770a709c3f2481e4e","0x4c0bd942d17410ca1f6d3278a62feef7078602605466e37de958808f1454efbd","0x4cb2b152c1b54ce671907a93c300fd5aa72383a9d4ec19a81e3333632ae92e00","0x5e14560e314427eb9d0c466a6058089f672317c8e26719a770a709c3f2481e49","0x000000000000000000000000000000000000000000000000000000000000003b","0x5e14560e314427eb9d0c466a6058089f672317c8e26719a770a709c3f2481e51","0xf81d8d79f42adb4c73cc3aa0c78e25d3343882d0313c0b80ece3d3a103ef1ec4","0xf81d8d79f42adb4c73cc3aa0c78e25d3343882d0313c0b80ece3d3a103ef1ec6","0x5e14560e314427eb9d0c466a6058089f672317c8e26719a770a709c3f2481e4b"]},{"address":"0x2446dcff9140456393ce86ee588635fac96f68d9","storageKeys":[]},{"address":"0x18672b1b0c623a30089a280ed9256379fb0e4e62","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000006","0x000000000000000000000000000000000000000000000000000000000000003e","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000028","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000005","0x000000000000000000000000000000000000000000000000000000000000002a","0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000007","0x000000000000000000000000000000000000000000000000000000000000002b","0x000000000000000000000000000000000000000000000000000000000000002c","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000029","0x0000000000000000000000000000000000000000000000000000000000000001","0x000000000000000000000000000000000000000000000000000000000000002d"]},{"address":"0x32e6ba5594acf78726aa482235d24fea8f9bb875","storageKeys":[]},{"address":"0x4ed5ad7c8847a16d25c4887c8287c26c57772c07","storageKeys":[]},{"address":"0xe1e7ba7f42a262069b8f296be7cbf9bff96f4ad8","storageKeys":[]},{"address":"0xe0e52675e3a21b45d33e11cdbbe9628bf7b698ff","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000001","0xb8d683c9d414f481826f3e7fe14b3ac6ae8c73450778287390c4bb8cb9f2e80b","0x0000000000000000000000000000000000000000000000000000000000000008"]},{"address":"0x6dd0f99d1eb6797cabb4375fd443c4f68a3d6079","storageKeys":[]},{"address":"0x267be1c1d684f78cb4f6a176c4911b741e4ffdc0","storageKeys":[]},{"address":"0x1092e00d4db9748fabcee5cb4406fafb5a7a3d92","storageKeys":[]},{"address":"0xa2327a938febf5fec13bacfb16ae10ecbc4cbdcf","storageKeys":[]},{"address":"0xcfeb09c3c5f0f78ad72166d55f9e6e9a60e96eec","storageKeys":["0x75bfc36bfa90cdd40f14b94ce404dabb9f11d6876f7e15d94f0eb3e432185442","0x45ffcf33238dfe23b8d421f254601dae0da7fd1741241d2bcba35144e38e0352","0xed7b01dde59e2ded3065c1163525ceace05ee3bec52d6790c360a2d50215076e","0xb39e9ba92c3c47c76d4f70e3bc9c3270ab78d2592718d377c8f5433a34d3470a"]},{"address":"0x56b217cc582e19b3ca933fd411e85ca7def68445","storageKeys":[]},{"address":"0xa964d693cd45fcbe4303524e0efe0988cff5ed08","storageKeys":[]},{"address":"0xb23360ccdd9ed1b15d45e5d3824bb409c8d7c460","storageKeys":[]},{"address":"0x2fd08c1f9fc8406c1d7e3a799a13883a7e7949f0","storageKeys":[]},{"address":"0xa5caff3cf28322d277445538f7bebe63a319a3e6","storageKeys":[]},{"address":"0x683fd5839bf6711be73e6cd5aa4c805d032b96f7","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007"]},{"address":"0x6ab80082688cfc4ddc36599e9d9561334913871f","storageKeys":[]},{"address":"0x8521dfdf3b31ca8930e291434077f664addbf6be","storageKeys":[]},{"address":"0x2f39d218133afab8f2b819b1066c7e434ad94e9e","storageKeys":["0x9edef266ef35fd0c6e131df0f31a330f3dd4c4d19dd31ed615c21d005c68116b","0x740f710666bd7a12af42df98311e541e47f7fd33d382d11602457a6d540cbd63","0x0d2c1bcee56447b4f46248272f34207a580a5c40f666a31f4e2fbb470ea53ab8"]},{"address":"0x5050f69a9786f081509234f1a7f4684b5e5b76c9","storageKeys":[]},{"address":"0x44a6999ec971cfca458aff25a808f272f6d492a2","storageKeys":[]},{"address":"0xb75690f6916933261796a06f93dd6a3e8706b020","storageKeys":[]},{"address":"0x71660c4005ba85c37ccec55d0c4493e66fe775d3","storageKeys":[]},{"address":"0x767c8bb1574bee5d4fe35e27e0003c89d43c5121","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000"]},{"address":"0x17144556fd3424edc8fc8a4c940b2d04936d17eb","storageKeys":[]},{"address":"0x667210a731447f8b385e068205759be2311b86d4","storageKeys":["0x0bb90043630fe4329389f5cf55e84f0b14f5fdd840b9ae35239670ba29bc9ac0"]},{"address":"0x9cb396f671328680fc4623f799ccab38d6c0568f","storageKeys":[]},{"address":"0xef13101c5bbd737cfb2bf00bbd38c626ad6952f7","storageKeys":["0x13b8ac5cbe54560dfecebf60f06748d7068ef09f2824e7ae7bcde23a3f5043f2","0x49e349d4f386739afdf8e55db7675b584d46c3b2a603eef62554e21dc437b5db","0x7cb85a05b83cf4b542b59b325b6f90658e06528fc81d9c964ec447b5f4e0519d"]},{"address":"0x3d1ec87ead59939331bd4d16d04c61844ed1ac90","storageKeys":[]},{"address":"0x98f3c9e6e3face36baad05fe09d375ef1464288b","storageKeys":["0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x88601476d11616a71c5be67555bd1dff4b1cbf21533d2669b768b61518cfe1c4","0x0000000000000000000000000000000000000000000000000000000000000003","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c86","0x88601476d11616a71c5be67555bd1dff4b1cbf21533d2669b768b61518cfe1c3","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c8a","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c83","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c8c","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c88","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c84","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c89","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c8f","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c8d","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c82","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c93","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c94","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c90","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c8e","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c8b","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c91","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c92","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c85","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c87"]},{"address":"0x0e76943a45f3dd02edbd78067930c1bfa8da96e1","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a"]},{"address":"0x548f27e2c1eb0c90c9c0ef3a4a61a6ae60038f02","storageKeys":[]},{"address":"0xdac17f958d2ee523a2206206994597c13d831ec7","storageKeys":["0x4240d64b6b79541752a19edd6eacd180f5a4336d602d15bf124a25858ca32d4d","0x93da1efae97ce6b353d34b3a8079f98e66a886c2b38db280b5fce5f05945855a","0x42ae8370c488a4ad8b0ddf619d110a0ccf166f7aaaf05db7daee57a4c6a9bb94","0x3a2e877cbe1c20f2c497461e7baf1f9c8615bcccd1ea9cf526d06d6e5a6e8dc5","0x879f8ad2b7b3f6ba5078643c6aeac384271fcad7a82ba4d6d2e8f77f99c7982c","0x71559d9e735206536601317f0ba837e3bb6673d661af8d968d05abdbc3b5eca0","0x61806a02d55d0d0c7620a27274300f3809bdab323ae2059c88e73898fec468f4","0x29fa5b1a4ac0263f18489504f341410d447d524990124199b732749eb5306e8b","0x0000000000000000000000000000000000000000000000000000000000000003","0x75f7f8a447801bb3acf20ed694b60cd14d95954391a921e8e0e05339d096a919","0x8b1cce3cbf810b099a349c39987204bdcbdd788f14c68316c12a6421474499d1","0x58a92a8c3bc36c87dac56b908a53927dd09879570deab38dd690d012eba2a5e1","0x5256e0c5d4a1d074108af5c7fb4f907ba5a00b53f19be06c043a036a3996391e","0xc486db2b76e88ca08a4c81505df9be07d859a13b15293f6a16203c8897e4fe0d","0x059fc571d3e136b6b26c498756ded0b08e59457fc43d12db4ad5dae7c010cbda","0xab81ded25dc5eaddc842b73a81746b055d5f04ddaf4c4f3975f1b084144fe569","0xb374c3016b5575858b42ffb30504a6fb0c34d194a911f2773aadfc829a3ab9e6","0xe1f7e6ab56bc25ae12f7fa7cc7f7d82e8e875736bcb69d9f0877f30a8e9d1c47","0xbc960135db2182d6782004719bc76ad45669a6ac9f17c1fa8e1c68d9c7d95427","0x95aed48a3e299b1bd009cb96e9df36494b58e68acb959025a85a3468dc48bea0","0x0e305967b4be5201d5620d44700e753ffafb4e91aba30635434dad8c9e820852","0x359d07de0d68b3b035e506db0f1a7f5f120138d64a2cd2dae8e127243acc29af","0x76c3196c40c1047b842470c952d43291e241a446825b4c8ce4a16add3def3f38","0x4d6ca782079f08b3712a84a3b64861b50fbe4ecabca77eb0fd0206f07ef0aeb9","0x77b30b6ed39dfe4f8e8cbf6d6fb90817d4374e3058ac2fccc9ed0d4f0e4f8445","0xa65ef9e260481b54d24a6843f71cd0fab54346b6a11159023bbb0675f14f7961","0x3131bda0f2f70358ce16bf15a5b77d984f69c5604f0dd514ce30851741eebb61","0xc9c023cd0ea716c08fd5de6c4e659fce0097e7fab08ce7c15de1e0d139d3ea3f","0xfce564b4f7543ff065143b1bcc861c733a2550a3c8e7fce625dfe05a443d86af","0x1a8154a13d70170b8d4ff5669674c136d50518e33cf378fb375f2ac54d92b501","0x4383669f6a2aff71ef5baed0ea76ee7ca95a9cd31b4812de6b2a47f459748147","0x0000000000000000000000000000000000000000000000000000000000000004","0x4e3941e4abc999c48372c1a2a82babcc4e0147738d25a0402a334b0f8b57bf95","0xf067fc956dd5870590f41a0f7b0cc62390ee80b15fc084fe93d4a75a02d8638e","0x70a7c8a859a8aca5e6ce83900a52a575cd9080e8b89cb9803394d09b8f89860d","0x13e4494059a3247194d80cb16337efacb2b216aaba151204d4fe0ec553f1dca2","0x1e9dcafca826b14cda5a347b9cfc79a16d81aebbdd7106bdcae100b8e6a42386","0xae9706944d54c2ff1fdad2f25db7e71f2acd7385ad63835af1f81bc99a398c4f","0x0000000000000000000000000000000000000000000000000000000000000000","0x1d79316b2aa25897f10d08f77e2f7dec84f5e4e86add982f28d5f85d95073ba4","0x741fa6c690096848542c422cf4b3eedc06a4a3dcd82a79dac3b2bee797c83796","0xfec1b1259f1b4c5b13b2e3b744ed4c90ed15fecc17f3a59cf9e3b807ab5883b9","0x996df496848afabe17f40cd8e1ed939406582aa33ff73923431e56b8763aa402","0x357bc390c5e5a67c86f3167e033dff9f2222213e9640ed3168a0319126747f7a","0xb77688c84f8fcff6bd5521050d42c556c0c670f15f5cea4ed3f4d92887971d87","0x03310ed29127619d38ec6d09b845ea5d195e6a480be222c8d8e8acfded82a1aa","0x000000000000000000000000000000000000000000000000000000000000000a","0x78b35599871be95768b2fdfaf9293a4491ecdc8ef25b872ee404fa1e441436e0","0xbef8e7df292f22f6faf0f58200c3d33e4901b13ac3dcd9a8d45df4cfa056b35c","0xdd7580ef7fe724d0429b0b3cf19d286a5f764565b4def7f56a178b99c9fc804b","0xc4a4899a685e0865d97d33ea1e8b9ef4a9f46e0133a6520706e3805d3d6ec400","0xa8190def9abe2db51350b8b1ef4c7ca5bca78372f79e55aa3610066fedb8ee67","0x8e46fe25a8051c5ae8b974c8d9d7c293a27638450887166d2175070103a71e82","0x755dec2d9f33a7cb76fdcd09f566b2fae3d09587ea324ae81586f8316dbaca31","0x56ee5c039aedeaedf1032028e6c6acb8882795c2c1cf967aecbff3b2c39ab4c0","0x70eb558e519e4ce1994e0089c96ca1d380e3d745832b467906a56e662d8684e3","0x7f58089a8da39d29ef25e1a01bcb5bc50aaf62e3dde2aec2435eaf0815567801","0xe8c174d850a7c4fd0f7b6cee26e8cf66a0c3145fc3da8228c577cc3be472069a","0xb36be5688aa5f1fe502bee16eea4495205ccef19d4d43434f78908a09f95006c","0xd003f015b6188804fe55c49f8c6da00b84def4529aa152558ba4457feeabfdb3","0x11e86d675a888d93cc8895f359e92408bab8d54b1ea2c627f6ee4e1dd016b27f","0x40010861c1447f4a139d1670c77fa3eb45332c3e75a7218a3913ca88aecb6006","0x43507c47a78c9003d1751fb0c0e92cbfe39e9f7e6ce0e20a72cd629dc07e96b2","0x0128a010ceddf639c1621d45e6f7300841aef6db5f4008c2d5fb7e63d101187c","0xa5f916d290f620b74395fcd82c33814808951aeb45e2e491c8a995419629c648","0xcfc1ecad728a8ab977217ad4a81453593d16cd5a59e2659db89836b815214903","0xee0e718267821a9cf41e52d96fc7e2b2b4f3852019a110e999d20c2b0813f53e","0xeb449bc003e7395128833de1fb3384246962a9d4d29c66083486accd9139c704","0xa2b0e51ea636cf32d482d9a0496f31beba85fb2afdb73e037be14082c3532308","0xf7dfe80a7bad0acb2dc0b4d87e03d83f102fb5f6cb9a48fde1e3dc344d4f17a0","0x8083591b79b201dff8d6016c03ccd7f410aa0b9d7a1a4f487028cfe821f8ef44","0xc3339c24cbccf7fc017d054edee1c1c7531cd8117e8a669abff31b5dd2006ad5","0x125617aba6520df91ba2f6482cb0f4289d91d40d63d800e4260764bc629f6b28","0xf9e3db02386564af4434566e28a373129f262915dc76cd58da2ffcc5f1fa24a6","0x256e284bf7df8f84cb9ab6f3f555ceb16fd472c1b8b3fad3fc3a8568e7e3ebf5","0x41454207968c72ca1f3954c5598e356985453971691489da81cf528e5ddc46ce","0x32386aa1ea2888e40243b524a67e7408609a4257cebaa46f72ca08964fad63c9","0x6e9e84ae7b8edc848e54262afc59a03baa298e039f2917f989989f0639ac12e4","0x7fbab8c305be8dd5ee9a8d9234d1b05f98fc7b07a354c943bf23048d0094a539","0xd7099bc8ff35d5f21577d120f62521b6a6cf68de6422d0d419c14e0688f914b0","0x0d02d1e277a0b66500169364924c919081e8b2118b0b5527bc7870dac1d972e0","0x169228ca33ea854d54aa1e506e59ec687f618a41074f5f5de937a0e9c6343e5a","0xc5769fb40be1cb6499c16d184625c4fa9f79b98414db53e5a41a97ea261a5312","0x2e831b46322340981c11411233de221cc9da9d5d518b843e81d1d6a997e89ea2","0xd70136eb34f79a8857fe2c6c5025d02bd9d96c5f0a448387a5bd24afd06fd6cd","0xcd1435e98db29c7f2ab0e6e13e22df360f3db4ca2bbcdd175b072bd3c2a83f1b","0xf0611ca658f6987c553f7ab19a73658d708b7f52fd4744827f6307f1ca463dc1","0x96972769ff59c6058955634be581f74619faedff2a51eed3243171bfe3eca97e","0x21cec826884609e4e521695b19972226e65ef6ada141838b7a09e7c2fea20c8a","0x1cb49a25ac2ec6f53250ae87307353d19a4b127e22da62c0fe816fe8b50482e4","0xe3b2e6597695cd9803b32ba2e4f93478b04bd1f35e2cda3ba4dc0d361c3e9fb5","0x0af9788064d4c31144684b6e9d2866c87e01efcc998f746dd8a0d743eb92d836","0xa63184d49be69ef8533eb1989a6d79f0f4b9ee3ab098cbdb19690420d21da5e9","0x93d5d383028bcde2f321df5434dfa08e927cea26e5f66f013a30c45fa9d2dc47","0x7c5de55ec44bfa02660fe5d071e6fcab76fff0256a9779a901f5900994da7fb8","0x9ca8924da97f10814c47735c7fdf043b03e330b5fcfe32bb82e0d66539484ccd","0x9c794d5186765ec259e7a49d8b01ebf991a8313af2a7ad9eb2d574167dffba85","0x1f89353eff09c4d20eefa8f2d54d25919512fe52ee494372fc94aa8c1ebb5238","0x06e2f7175ee7b8929081ee615743a2c327b3407ff87349b02ec03852d5bbed58","0x35d7fb7665514f774d2c2df607e197eb8674b6e63d2638472758647a2e67406a","0x9f416b2ff3848f29c1136ffa80b71e90653aba84b394c153763d1c891c2240c8","0xd4926819075f67206d950bc3bf5d48622894782637972462b87f1c0cb98b6216","0x4966c331fd21bb95e5096f54ff5bc865ffddab6a0f3c4edcb615c80b8d472ba5","0x2ffe96b501e60292eb0316c8fc38442c42e408e4f13dbcfa5251330006d737ed","0x1a18eeb796297fa09e602d0b890a157c79593f3aea15d5d3c5c60fa6d0a9adac","0x8893972524949e80191e7cdc95673ea996330793ba19e136d403bf0f366f2f1d","0x524bfcec436c05b97c4fa0a4b01bdd00880f509c00db106f1fdba5574a8c1526","0xb6fa6a63add63f3a78d524218dd993e0b29a3522e4fd390473fe0a5e79e61e2b","0x802b5f0caf37e8b2429fc024d3248e71315a224acc9556da583eeb787adb04cd","0xfce891f4941d737b64b6319c352f82f9b54720db9375552b4dd4840c8403d43c","0x6aacad51e818fe1e62873dd3be752ab690963303332c12c8177fc179d13f3619","0xa0c2b4c77b2374feb7da9b3d5393b8e3e13705173aad7ac7196477e40f35ea2e","0xcfb14b389a5147b66b9189aea81931a2df5b0d452f0222f7963148a932fd85aa","0x6dde3431c419530847e880062e10d39cd2f275fae4f5ca8be7d7b594bcc6ddaa","0x4b1242f4b1a387c9b14f8449eed7e7f0cf8ad2ec8398954c7a57f12ce04b6327","0x3fdd8881554d03b60f70fbc8f25a0b8cebbb7818e43bb7100c9c9c0c4c0a4544","0xa792d138d23c6b0c2e5d1820e3c2192604b496c12944b1c3a08c3b8f15333f1e"]},{"address":"0x3c3d457f1522d3540ab3325aa5f1864e34cba9d0","storageKeys":[]},{"address":"0xc99c679c50033bbc5321eb88752e89a93e9e83c5","storageKeys":["0x6af98e99429e430269837d06009ed6c7892706b39538591cd9da290ef6dc9382","0x41d7bf14ca20af2a98763db0252185f02410caf6caaa30db996170af5c223d99","0x7056050200b237383ccc55b5500523fd942d7288ea1ac6754b5946bbd4092c1b","0x7417a935f030c60f8de4437e13a345605cb5c44fbbcea09b790ba17741732924","0x4ac9d40773d21b54ffc892e174810018566b23d88f798dbf5aac890a86b8f961","0x15f7a9f50c88c2c7b8cb2916b8c1a0b0e246e439d80dfe76805a80a1af780ce1","0xd2845658a957c8b94673691b92cd84f7003c95402373eb148e0ebca45c121872","0x927bcaa6049f82b597da9464794fd3a6320f3eb39956dc17ace7f562a8cb9c1e"]},{"address":"0x5aff159b810f2244b6d009e7630b3fbc4f057986","storageKeys":[]},{"address":"0x54f251b53b70cd3c0d43dc2fb22704e6c0b4677e","storageKeys":[]},{"address":"0x26bce6ecb5b10138e4bf14ac0ffcc8727fef3b2e","storageKeys":[]},{"address":"0x74de5d4fcbf63e00296fd95d33236b9794016631","storageKeys":[]},{"address":"0x2a3dd3eb832af982ec71669e178424b10dca2ede","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000039","0x000000000000000000000000000000000000000000000000000000000000003d","0x0000000000000000000000000000000000000000000000000000000000000033","0x0000000000000000000000000000000000000000000000000000000000000034","0x0000000000000000000000000000000000000000000000000000000000000068","0x0000000000000000000000000000000000000000000000000000000000000053","0x0000000000000000000000000000000000000000000000000000000000000044","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x0000000000000000000000000000000000000000000000000000000000000036","0x0000000000000000000000000000000000000000000000000000000000000037","0x0000000000000000000000000000000000000000000000000000000000000040","0x0000000000000000000000000000000000000000000000000000000000000001"]},{"address":"0xb26d1b052b4754c49f650d133f7f59a02e8ea21c","storageKeys":[]},{"address":"0x21202591a02ee22ecc9a4e3a11ab2cf8956f5b07","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000002","0x098d468efb4f874d617491296c759dc9ae46efb517fe36bcf30699ad3f714c0f","0x0000000000000000000000000000000000000000000000000000000000000008"]},{"address":"0x47312450b3ac8b5b8e247a6bb6d523e7605bdb60","storageKeys":["0x177667240aeeea7e35eabe3a35e18306f336219e1386f7710a6bf8783f761b24","0x7184681641399eb4ad2fdb92114857ee6ff239f94ad635a1779978947b8843be"]},{"address":"0x891fa77ccead988965b2a68ac9ba1db9c5549437","storageKeys":[]},{"address":"0x7cdf68ce9a05413cbb76cb7f80eaf415a826e313","storageKeys":[]},{"address":"0x388efc4d073d87e18a2d2364aee11a61b3dbd39a","storageKeys":[]},{"address":"0x5ac4182a1dd41aeef465e40b82fd326bf66ab82c","storageKeys":[]},{"address":"0x1e072c85b84deda7db0d24d8bb60a21e7ee7ddcd","storageKeys":[]},{"address":"0x9a158802cd924747ef336ca3f9de3bdb60cf43d3","storageKeys":[]},{"address":"0x736ec40644ebd118d170d65079ba2bb1eb4a1178","storageKeys":[]},{"address":"0x100daa78fc509db39ef7d04de0c1abd299f4c6ce","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000007c","0x0000000000000000000000000000000000000000000000010000000000000008","0x0000000000000000000000000000000000000000000000010000000000000006","0x21129256a4eafc08958a0b807887fcca646f82bc20b60c3451704bc77e608f0d","0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000004","0x781fe1d320cbbd5f46653f6403c1ba5b5e8effa981c76c26ce9aeb2134ae2c59","0xec845b066ea74d1577009bd025ce13e11d1b63a356c23b2f3ff7a61d1930e0d9","0x0000000000000000000000000000000000000000000000000000000000000186","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000010000000000000009","0x781fe1d320cbbd5f46653f6403c1ba5b5e8effa981c76c26ce9aeb2134ae2c58"]},{"address":"0x1c91da0223c763d2e0173243eadaa0a2ea47e704","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000003"]},{"address":"0x421ad2fcb64c039f08129d5c120f8c6bfc48802a","storageKeys":[]},{"address":"0xa4e5961b58dbe487639929643dcb1dc3848daf5e","storageKeys":[]},{"address":"0xa8b09be3b9ff88c5c421a916272762e21a9419e8","storageKeys":[]},{"address":"0x4976a4a02f38326660d17bf34b431dc6e2eb2327","storageKeys":[]},{"address":"0xa0c68c638235ee32657e8f720a23cec1bfc77c77","storageKeys":["0xa1829a9003092132f585b6ccdd167c19fe9774dbdea4260287e8a8e8ca8185d7","0xbaab7dbf64751104133af04abc7d9979f0fda3b059a322a8333f533d3f32bf7f","0x0a7e0e74b40a947daf7b6df34c66be699f819f509940d1bd48c4d99bc5e3353c","0x62dd54cb621690df60c9b7073f32e34a6d856df3f9aed423651b66401f67d022","0x69bc9a80c51a557b6c5a4b7c71ffdcd97cc91b2bda5dc1b0da50dd9e6ab21239","0x7a3550d478a915b0b10785bfd629e4167994cf6d3bb52ded51cacf0759560a49","0x693a712f7ba943ce5af03c38013e94f869c5db0fe736c5236791209c4bc7f2d7","0x9dea75ad6703158f30a41e6f868e38130029363ec929f7f5669a536f581e3b14","0xf011c352cd55c51361d27e2685f86add2b92350cb05f654a3bdece1fdaf75acd","0x755bf09941a05945f5c1a5bf48ded1144e6eae0c055aeb34ae1632130db7a65f","0x0000000000000000000000000000000000000000000000000000000000000008","0x3d6c902089d5053230afb20d03add215c708a8333f93f9395a50fea0c3493a61","0xa8e1248eddf82e10c0adc6c737b6d8da17674abf51801ea5a4549f41c2dfdf21","0xb19cf2e52982b41c5e63c8d2b213089d6b958993eb55c34ad5b9543558dda2fa","0xf24581de3108c634cedd33e0cc3465c30dc80855ea1c5e95374b1a690d73d7d9"]},{"address":"0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000001"]},{"address":"0x8d4caed79b68cca8d11e3c46b473177a2f63fa0b","storageKeys":[]},{"address":"0x4a67aed1aee7c26b7063987e7dd226f5f5207ed2","storageKeys":[]},{"address":"0x4b0c925f3b2325c448990824e91132cd5f395f2a","storageKeys":[]},{"address":"0xb02381b1d27aa9845e5012083ca288c1818884f0","storageKeys":[]},{"address":"0xe714863d919fef75c2e5fe60983439634124ab18","storageKeys":[]},{"address":"0x1e0049783f008a0085193e00003d00cd54003c71","storageKeys":["0x73f81e05fe78bb9c03fd7e2026f0245c29102ff947eddf738e68a7faea7f48aa"]},{"address":"0xfb19ffd1ff9316b7f5bba076ef4b78e4bbedf4e1","storageKeys":[]},{"address":"0x4e9c22f5bc7dc655b9e2bcb5b5f2830047f7571e","storageKeys":[]},{"address":"0xbf2d58698a8a215f868cf24baba360c77266b466","storageKeys":[]},{"address":"0x92a5158caaa83ba2a1ed8e8fc28da823d227e04b","storageKeys":[]},{"address":"0x6edf968da408a9640b8865826429a977a11c5048","storageKeys":[]},{"address":"0x95a9bd206ae52c4ba8eecfc93d18eacdd41c88cc","storageKeys":[]},{"address":"0x1a904179b7508d22507460224ed65e17a4db613a","storageKeys":[]},{"address":"0x1111111254eeb25477b68fb85ed929f73a960582","storageKeys":[]},{"address":"0x8a7b7b9b2f7d0c63f66171721339705a6188a7d5","storageKeys":["0x5e4af95e0cc4f08c30d46a381963b76be0078cd380730098584840f07e62195e","0x659a4ceed2b806fb3f1651a1f9d9eda8a3a803528691ca29ad0cb6903d9faaa4","0x0000000000000000000000000000000000000000000000000000000000000004"]},{"address":"0x7e4079fed15a7bfa6a9f8a68dd289222870da45f","storageKeys":[]},{"address":"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","storageKeys":["0xfb19a963956c9cb662dd3ae48988c4b90766df71ea130109840abe0a1b23dba8","0xd212dcd01ed41455be0b36533ba78a0fdeccda0068b5f90fa610f816600cbd08","0x75245230289a9f0bf73a6c59aef6651b98b3833a62a3c0bd9ab6b0dec8ed4d8f","0xee61682ec263cf9ac626d5a9b0cd5e26edbfa98b5b368b540e65bd739c37e3b7","0xc0df4b32907cf80f95f8d7e2661f7a67725c8ee2f51baffe46905ce46886350d","0x3da19cbbddb7791ab46d3933c60df3c8be398aa24c48fdc578537dc4fbd5bccb","0x61bd8b7d7ea1350e36cb998c4b61b337d0b7e6c625816251eef440c23f9b21a3","0xc937356fbb1d41a475e0aeb9c72b3680e850136654e0c6ab468bc8188a0b9606","0x63e09293a900203a27de1446b93aafc007134bf082e4f30c40a88ca9cacb9d60","0x0cfde81cdef18be5b61e36abce423320f5851fb3d2f5f460a99b2537bc6c1c3c","0x0000000000000000000000000000000000000000000000000000000000000002","0x390f6178407c9b8e95802b8659e6df8e34c1e3d4f8d6a49e6132bbcdd937b63a","0xfa8d90c31aa9d60d8a5563d6b06b294f8851151f431a19253e3852de6275e289","0x058626be24917c1ae4ed5eab3b04ff1e21a4399f4fa3e36a0942903d4465e60b","0x01dea62a263fc222b26b5753e32b57cd299be8747551e6bdc46da9730656c016","0x6a4eff247b7329536ddf871ed3dd8d4d7d9d28d29ceac00d4f1f45bc6a92ef2c","0x12231cd4c753cb5530a43a74c45106c24765e6f81dc8927d4f4be7e53315d5a8","0xc565b8467ed0be432a896df92668a8397c5e16b4f50e6c53d4929ca811966139","0x65d843a32fa82c8baa8838ae701902516891fa62ff9bb968f1c878392be09941","0x12b8ba28555eac908c7ceeaffdb0aaf4c1c68d4c264f05b89b617d175125e4f7","0xd83c2a59e8a43f164ad9045304e28228b56b85bd11eeb9334557d48d1146da94","0x24b82e46710ed83fc73420a216c5d1b628e0e01dd1ba1218e862b2da11ef675b","0xe2227cf0b5be4d7ba7a42923d3c43d60d4214f9c2f94c2cf3db4cab9b6a0bdbb","0x888a8fc6fd639586fafb899e482503a0fe52a2a235b014ed5888d17107810e4e","0x47acaec6cce4f8679df357c0511627b345d6e8f569cbcd40f3cc0dc80233794f","0x615a1543cc130b48348933084d59877755e9b16372410ea81a66cd5afea1c849","0xec162348c00cbe903f0a5ba2d4aaca243f0d966690a745c44eac095ca65e24d1","0x8d629cb47d08e89353adb6c7692b952b309de6af172d6a1081aad5fa72045c48","0x39a528031c821151a0357442b7ae7ecce02aeec01c8255f8ccdd708707e959c9","0x0dc76d08d3e6e228ea22bcbe629bd5d58422f8750b11e01a7667909f11f84ac2","0x7c96a3a66922d7aabbac025d246237eaa35b006d001e3b132ec84fe3b8b21d0a","0x73a521ebb9c22d2aade7f1dd6340ba405c7330c2adeada9860737164168d5264","0x15f7a9f50c88c2c7b8cb2916b8c1a0b0e246e439d80dfe76805a80a1af780ce1","0x551680380acd9af1cd1dd5986c7e8475abf0765270bacdff5e1f2048eb5ff97d","0xb1151b5f51c370d607b59e0034392dd388ea4cc8dded24ec75baf3df36983150","0x0abc69951c5b665c2269133980e9ba8b6e10b45605200a94aa15cde106535401","0x6b1109c7e1669b7a23f286ed1bc8b52e9f75b714f0aecf873ed7076aaa6a7e6e","0x2b83b3e1fb436772e592319bd36c360dddb62d80a39727784d546decedbafe26","0x2fdcc99b01e8393a8bf0eaa262e26ba1981b8052fb1ec7ba1213ffeb9028ea16","0x4fb413805902e1d9a6681d54d7946be4d2c3433fadac4304eb49ef1b5a52a8f4","0xe03178286da22a27dd0b1f68fb538cd07bc9080172ee9a5a2238416fe86db02a","0xb064600732a82908427d092d333e607598a6238a59aeb45e1288cb0bac7161cf","0x1fa043cbbc5290844a69b6214e6365131fc875bd31c9ae646b4108b3e3dca21e","0x8c448646209c28d2528156548dfe3506caf9eea136a893f724fc598d054ad877","0x5cfa01b9a733d8746bc28fdd3f8992b7dd3bb6d323fe96a760fbd1b87ca3a2bd","0xdb5ad80047612bad580468d7c2521a02bc637474d1c0e25fb17578bb79939703","0xc906b0b0df36e2042f059120e95e6dd99f11c9ac2ef306a59ba0efa77fd8622d","0xa1d5ab10c4887c0f223dba37bfa478cb34657eb9926355f56e96c010dd66fa37","0x7056050200b237383ccc55b5500523fd942d7288ea1ac6754b5946bbd4092c1b","0x9ede93be0d8fc6a5eb9cf1c7345a85b7519d8487a727aef0c2f00ab966aa7716","0x0cb865ff1951c90111975d77bc75fa8312f25b08bb19b908f6b9c43691ac0caf","0x9cdeaf576de53b7e14d7327d4df162936ab9821eeaac60800d4d689339656449","0x95878b50d7e5b6d414aae538bc3070350ef0e3818d9d58df0ada4b2f94c44efc","0x29637e4e7746790fee278e174f4585f655f8f9eb93ccdfba31b482e7a484285a","0x9b354f30d74ca151470e4c01c97d425c838beac0ab30a0bd396660e4405f8bee","0xab0a8e62f294f05384a4fffa04078cc01f1025192e03b71a5680da71c9be2230","0x65a13d085eb4e4c9aa098b11d4131c68ad6da46dcbe14e9e9516e38e1ccf1239","0x3fbe6099f169b217d3e3f44e5b72b54ed4319f5e6c163e6e3739eb3434dbd572"]},{"address":"0x866673b96a61de00f4d4c2add5d5b009cadb1ca2","storageKeys":[]},{"address":"0x9ffac0b9faf56ee4429955a324f2c2c42562c6df","storageKeys":[]},{"address":"0x0e36660efcbc24deef1cc177125dbcb64bb92eed","storageKeys":[]},{"address":"0x2c169dfe5fbba12957bdd0ba47d9cedbfe260ca7","storageKeys":[]},{"address":"0x50130437a81535dd8f4b0b921756ebddff537523","storageKeys":[]},{"address":"0xd47434828eac1d10d8e2990d804d33719bb9c0ad","storageKeys":[]},{"address":"0xc6bce0ce5c54399a63a052de97726fdd155383ab","storageKeys":[]},{"address":"0xad01c20d5886137e056775af56915de824c8fce5","storageKeys":[]},{"address":"0x5fa60726e62c50af45ff2f6280c468da438a7837","storageKeys":[]},{"address":"0x4d596fd0a6ec54a5b6bd925eb4ec4300804a7f2b","storageKeys":[]},{"address":"0xb258ca5559b11cd702f363796522b04d7722ea56","storageKeys":[]},{"address":"0x91a1131d088c417dafc8daf86e5a6d94b5046095","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000013","0x2c1c59975ea7d6db1a21b876d34111c45ceb513b686f457fd7b296a1bfe98969","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000010","0x1e8ab2bc39629f91bec75f58438e03428fdfa2c77ccea84178d2702e759dee96","0x7eec9b89fdd871efe6b18c48aed7e88905119b980235d25971494319fd661296","0x000000000000000000000000000000000000000000000000000000000000000b","0x17b3522a83128b0b19f3ec5e77a99d0a680d1b9cb90e6a967cdd790f34abbb75","0x0000000000000000000000000000000000000000000000000000000000000014","0x000000000000000000000000000000000000000000000000000000000000000f","0x000000000000000000000000000000000000000000000000000000000000000e","0x0000000000000000000000000000000000000000000000000000000000000006","0x37fe7dfb087f3441043361330836e17e6c88a95403fe48097536f1334d17d3f0"]},{"address":"0xe648f8fa8c43905ce0c99d8e86dbb899ceec6155","storageKeys":[]},{"address":"0x020c349a0541d76c16f501abc6b2e9c98adae892","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000002","0xbfd358e93f18da3ed276c3afdbdba00b8f0b6008a03476a6a86bd6320ee6938b","0x00000000000000000000000000000000000000000000000000000000000000b1","0x00000000000000000000000000000000000000000000000000000000000000b2","0x0000000000000000000000000000000000000000000000000000000000000000"]},{"address":"0xeb2629a2734e272bcc07bda959863f316f4bd4cf","storageKeys":[]},{"address":"0x2ec8b80689bb90e91d317accd16209ed030c9702","storageKeys":[]},{"address":"0x24c0f7fe1d74fcc3887b37c1b13f412980dd8bf7","storageKeys":[]},{"address":"0x1ffc226571b6b65a3f6ad92a6d35a44784148f7c","storageKeys":[]},{"address":"0x8f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d5","storageKeys":[]},{"address":"0xac725cb59d16c81061bdea61041a8a5e73da9ec6","storageKeys":[]},{"address":"0x54006763154c764da4af42a8c3cfc25ea29765d5","storageKeys":[]},{"address":"0x018008bfb33d285247a21d44e50697654f754e63","storageKeys":["0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0xbd720a1d574c88822005a3deafee24862ca656cd78fc54edef6bbc608cd1e504"]},{"address":"0xf186a8d2fbac2986a4b4434b27e3a566571d9e54","storageKeys":[]},{"address":"0x6b175474e89094c44da98b954eedeac495271d0f","storageKeys":["0xadbb9c3cd0a068fc8ee300cb23a3b086d295f9b3d4f39ca85a25c652087d5caa","0x0c851915448d0d1d564ff8d739c8d78544db77078755e108c40f2957369677fa","0x5afcb2d7f74c40ab932919598ddadbf6952afdca5012fb86a647f1216ce93cee","0x87c358b8e65d7446f52ffce25e44c9673d2bf461b3d3e4748afcf1238e9224a3","0xe2e7ca288dc863c29298c3aef4d219378bb19d0d15e5d82b152c94d879bad225","0xeba6babfd085bd10d9852a86bcc16a8a550783bdfef66079382372430eb3fb97"]},{"address":"0xef1c6e67703c7bd7107eed8303fbe6ec2554bf6b","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000001"]},{"address":"0x6dea81c8171d0ba574754ef6f8b412f2ed88c54d","storageKeys":["0xdedf458a805de16c5b2e540b0a66d485b3b661367394e6a391c4705743dd2a27","0x39223a37ba6f79f54aa37a26efc12e526af93a444ecbdb4358d8b83204838857"]},{"address":"0x64bc2ca1be492be7185faa2c8835d9b824c8a194","storageKeys":["0xe72fee77a4425f19da01aa1ed94d1bc0416719ec24f317a1b9cbc75ba67617ed","0xadef203cf0dfd46270cba7c75e699624e27ec84903360f8d9b25c41f1bc5cb9b","0xb875d3ef6e04a5e33e79df96674749371267284283f41dbfc1199de69343bffa","0x7f812de78fc087abc17a00df75a2063b417bc316e96755c8f3a46b0861ad8ca6"]},{"address":"0x73ce7912501be775a693fb3a641eca8216b18b13","storageKeys":["0x907470f79d9f202a686aa64ed6d247218b488f43a829a93c7c6253a8bcb829a3","0xa149260fb4390bada5184add5fb0ad06577011d0f9c978986b3a3fbce79e9f15","0x0000000000000000000000000000000000000000000000000000000000000013","0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000008","0x20de30300db9b2d46f45ef3798c883c649ebfb03953fa78198d91713f3132be2","0x2abce13ae5905ec45e1c24f0aaf5df458e0c761d1ea0cc077f481c3ede35c93d","0xfa26016169cecf816474dd2676369770603498b9739ae595e9de77e1edffb30b","0x000000000000000000000000000000000000000000000000000000000000000a","0x000000000000000000000000000000000000000000000000000000000000000d","0x5c83d9320a9a25da893c14228f60de0a08c6b7bb94e4088eeee36c1b9a31c4a4","0x0000000000000000000000000000000000000000000000000000000000000010","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000000000000000000000000000000000000000000b"]},{"address":"0xa7fb5ca286fc3fd67525629048a4de3ba24cba2e","storageKeys":[]},{"address":"0x7618c038113503d15029a41857e352f43b4dcc6e","storageKeys":["0xac5b9ff47002b61b2bfa9759eb6316508af74c3c15962d0c65b151a3271fd5f2","0xac5b9ff47002b61b2bfa9759eb6316508af74c3c15962d0c65b151a3271fd5ef","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000004","0x9c04773acff4c5c42718bd0120c72761f458e43068a3961eb935577d1ed4effb","0x0000000000000000000000000000000000000000000000000000000000000008","0xac5b9ff47002b61b2bfa9759eb6316508af74c3c15962d0c65b151a3271fd5f1","0x0000000000000000000000000000000000000000000000000000000000000002","0xac5b9ff47002b61b2bfa9759eb6316508af74c3c15962d0c65b151a3271fd5f0","0x0000000000000000000000000000000000000000000000000000000000000000"]},{"address":"0xc2aacf6553d20d1e9d78e365aaba8032af9c85b0","storageKeys":["0x9ca7f9d5d99b3f78622a5fcbc389f35675664a34bddb795c2d956d671944a3d2"]},{"address":"0xea51d7853eefb32b6ee06b1c12e6dcca88be0ffe","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000003a","0x3db89e40056e1e415b186b37b7cb88f6ba0da57c1d383403faf92bb06996b6b9","0x09956717b9b4ad98dd3e6fcca072d98d7852a8ebc797aa1939ecb654ac1aeead","0x0000000000000000000000000000000000000000000000000000000000000037","0x000000000000000000000000000000000000000000000000000000000000003d","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"]},{"address":"0xd2c811d48b4cbccf8afe1428fbade11beffb269e","storageKeys":[]},{"address":"0xc73776c7c02e93c45158e2e6f1d4175fba0a9ca1","storageKeys":[]},{"address":"0x89fcb32f29e509cc42d0c8b6f058c993013a843f","storageKeys":["0x6e9e84ae7b8edc848e54262afc59a03baa298e039f2917f989989f0639ac12e4"]},{"address":"0xcc128d5859ca194aa4bd1c86e1d246d97a862bb8","storageKeys":[]},{"address":"0x4ffedb5291b2c51b821602d33fcb26a031a40167","storageKeys":[]},{"address":"0x11950d141ecb863f01007add7d1a342041227b58","storageKeys":["0x16742558cace7b1d6c79bb360b64251a86b813126bd6760df512f01dd4b09913","0xfa103d3a29328a3a71bd12300d54923866ca45d9e0f369507213fe011c69bb3e","0x16742558cace7b1d6c79bb360b64251a86b813126bd6760df512f01dd4b09912","0xfa103d3a29328a3a71bd12300d54923866ca45d9e0f369507213fe011c69bb40","0xf013cfe3da7528933eeea6a7bde8d71d9bbacf1ef58072d4ba8bf335e66b16e3","0x0000000000000000000000000000000000000000000000000000000000000002","0xfa103d3a29328a3a71bd12300d54923866ca45d9e0f369507213fe011c69bb3f","0xf013cfe3da7528933eeea6a7bde8d71d9bbacf1ef58072d4ba8bf335e66b16e4","0xfa103d3a29328a3a71bd12300d54923866ca45d9e0f369507213fe011c69bb41","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000001"]},{"address":"0x23445c63feef8d85956dc0f19ade87606d0e19a9","storageKeys":["0x4416394b5241247e3fcd23ee214789333b91c7b4dd2cc700085b7280681c580b","0x9787eeb91fe3101235e4a76063c7023ecb40f923f97916639c598592fa30d6ae","0x4e89c89162674e5c406041e4411f253ad16504e57fdfb3d64fea2ef85edd52d1","0x9787eeb91fe3101235e4a76063c7023ecb40f923f97916639c598592fa30d6b2","0x0000000000000000000000000000000000000000000000000000000000000066","0x4416394b5241247e3fcd23ee214789333b91c7b4dd2cc700085b7280681c580c","0x0000000000000000000000000000000000000000000000000000000000000067","0xccae37334cfdf21ebdde223db203176e19543f7bdd940a2a2f74aa135491b1c5","0x4e89c89162674e5c406041e4411f253ad16504e57fdfb3d64fea2ef85edd52d0","0x9787eeb91fe3101235e4a76063c7023ecb40f923f97916639c598592fa30d6b0","0x000000000000000000000000000000000000000000000000000000000000006a","0xccae37334cfdf21ebdde223db203176e19543f7bdd940a2a2f74aa135491b1c4","0x000000000000000000000000000000000000000000000000000000000000006b","0x9787eeb91fe3101235e4a76063c7023ecb40f923f97916639c598592fa30d6af","0xa06110a1557b0fd4823f5530f77fa7087a3aed892e0f4d72b2760f7927015404","0x000000000000000000000000000000000000000000000000000000000000006c","0x9787eeb91fe3101235e4a76063c7023ecb40f923f97916639c598592fa30d6b1","0xccae37334cfdf21ebdde223db203176e19543f7bdd940a2a2f74aa135491b1c3"]},{"address":"0x28c6c06298d514db089934071355e5743bf21d60","storageKeys":[]},{"address":"0xea500d073652336a58846ada15c25f2c6d2d241f","storageKeys":[]},{"address":"0x09e050f40b3ccfaa568680bf0e459cf8dfc4157e","storageKeys":[]},{"address":"0xb243f668713f16e5b947ccc1e27e3bb41f827aea","storageKeys":[]},{"address":"0x478238a1c8b862498c74d0647329aef9ea6819ed","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000002b","0xf037ccfdbd298ad20fec53c6d95663e92fa7afae5314df67da8ca5b6c3c92a79","0x9ef04667c5a1bd8192837ceac2ad5f2c41549d4db3406185e8c6aa95ea557bc5"]},{"address":"0x61509721f116767d283db6e6ec91b6d355603acc","storageKeys":[]},{"address":"0xe8cfad4c75a5e1caf939fd80afcf837dde340a69","storageKeys":["0x90ec54b732774e56970e30ca7364dec5c8adfb0dc5fa62f9eedbc3be1ca33dc5","0xe4ad990961dfc6ba5cd00630edd66e178d1358de70d54b4751abea0616cd67dd","0x3af36e30cf872d1e599d667da86551af815cf75143e187d326ed9f414a69ab9c"]},{"address":"0x5f20f761e3295c4000eda5e193d5e8d615a3173b","storageKeys":[]},{"address":"0x2bcb6bc69991802124f04a1114ee487ff3fad197","storageKeys":[]},{"address":"0x4087456720119e9153bff24291f0605cc6449a48","storageKeys":[]},{"address":"0xe38432f7950538a3ba519cdd2537a59beec3ec1c","storageKeys":[]},{"address":"0xc9f56285e0f3f82d1c72980e965178e4acc5a110","storageKeys":[]},{"address":"0xc3649f727bc90d870aff0400c378301104244cc6","storageKeys":["0x0366b3141919ec9f847cfc8c3b10153a8959c006afe327ab0f99d0272003ef13","0x0366b3141919ec9f847cfc8c3b10153a8959c006afe327ab0f99d0272003ef16","0x0366b3141919ec9f847cfc8c3b10153a8959c006afe327ab0f99d0272003ef14"]},{"address":"0x94876a7f83aafde195d795d3a7f7ac198bb32e62","storageKeys":[]},{"address":"0x5a8575695f477f67a79486e86302036d6da93971","storageKeys":[]},{"address":"0x5777d92f208679db4b9778590fa3cab3ac9e2168","storageKeys":["0xa25a49481d75e69e4962ae09926f4d34f733fd60e6d3abe86eec7bb377335f11","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0x14da17c968b3d923a1f2e76b04530e1ac26cfbfb","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000002","0x6c022040c07534cb01197b8d99b19348fd43bbe7186223003a95f7580b2b36e8","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004"]},{"address":"0x3b3d7802cea25e6ed4df6adca42eb76a371f4f77","storageKeys":[]},{"address":"0x9a8f92a830a5cb89a3816e3d267cb7791c16b04d","storageKeys":[]},{"address":"0x43579754589644805ef2bb4696bfe6a5cf7aa809","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000001"]},{"address":"0x1e7d3bf98d3f8d8ce193236c3e0ec4b00e32daae","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000004"]},{"address":"0x485a1d296b86e3222a1b1edcf65a2e0cfbcf8798","storageKeys":[]},{"address":"0x44c837a2d8e34c5c91e80329e15d1b897343fddd","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000006","0x199bda88a466ffafbbf12c89681aefbd94bd41f4fa8cb955a2264a0f6b0a8074","0x7d891ef275ba71d621d4389bfe041d651952f136efdb8fc296ad525e76f2d2ac","0x0000000000000000000000000000000000000000000000000000000000000013","0x71d1026c73e06d5eb2e06b6f7f4c177d842876c958e93921d4f8eef3211e0046","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000000000000000000000000000000000000000000e","0x000000000000000000000000000000000000000000000000000000000000000b","0xef05e748a00c45676ab9b2ca99a2eaba5e83581651a44afd4fdfa16676f064a9"]},{"address":"0x4e59541306910ad6dc1dac0ac9dfb29bd9f15c67","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000004"]},{"address":"0x9271fa2ac3695970ecc12e42326d417fcd3ad44e","storageKeys":[]},{"address":"0xd4c4044aca68ebbcb81b13cc2699e1bca2d3f458","storageKeys":[]},{"address":"0x5174aef97ef9fc42136e422f2a3ed4f540d958e1","storageKeys":[]},{"address":"0x42476f744292107e34519f9c357927074ea3f75d","storageKeys":["0xb61abca4da329a2f09cd5b8b0bd3534d753ea5ddf61db1d948e9d99db3713ade","0xd5a6446075231c623b8a17512c6b6882aabd18e41769cb78351565c0276e34ce"]},{"address":"0xe62b71cf983019bff55bc83b48601ce8419650cc","storageKeys":["0x9a09f352b299559621084d9b8d2625e8d5a97f382735872dd3bb1bdbdccc3fee","0x000000000000000000000000000000000000000000000000000000000000002b","0xb417ca425cdf18ef466b6484524239695d62ab7948ade92f2a8f02e9827fb186"]},{"address":"0x675bb023e268dcc43f543620577bcacb73047f08","storageKeys":[]},{"address":"0x55db2e620ae1e2037386f05b155a5ddebfc44685","storageKeys":[]},{"address":"0xb1990609d56ea47e169ee15f7ac388b047aba5ce","storageKeys":[]},{"address":"0xa865617d547bb0350728972d170d2d0aaf76f266","storageKeys":[]},{"address":"0x06f7e3cecd6e66ab2fcc527e8a2e908c96e1a31c","storageKeys":["0x010cdf6c883cee6e386711e9f8b6df3e8d1473e8b38135ede508771ff1ca2bfc","0x0fa97f22b5afab5efdd3339d2f95d76289515e8709f47fe8725a2a0151b81996","0x3b73a3201dab0aa19b4496259a12034c5442d2c23e12e6741beacb3f7bc6ef36","0x0074611b853f5980602fc302f856646f8e50e01366960d67ecabd16602e2b4c7"]},{"address":"0x388abf256ab77283427715ab0ac38848045a2f4a","storageKeys":[]},{"address":"0xcd6926193308d3b371fdd6a6219067e550000000","storageKeys":["0x9c87686a668c5f51d082f0bae504a5966d7f2b3907814d39e59d2fba39d1c51d","0x623348d3e9f0d9c8141e9f58b5e6fb84556de2286c85d278e5e26ce61c1f77ed"]},{"address":"0x0330e9b4d0325ccff515e81dfbc7754f2a02ac57","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000"]},{"address":"0xec2876abe8e819efced11ca1d9a1cd0e68e45e7d","storageKeys":[]},{"address":"0x1a7be22c581f6eaade9b6485ab410d046340f06a","storageKeys":[]},{"address":"0xdef1c0ded9bec7f1a1670819833240f027b25eff","storageKeys":["0x1454083160665801f09e29ab8f69468d8b8efd1ebbd910c5a96df81a9aa0224b","0x0000000000000000000000000000000500000000000000000000000000000000","0x0000000000000000000000000000000500000000000000000000000000000001","0x6eb3ac9d43904a0e4acb5bcd025c19635371b33c22b4909c404a8a1199c400f7","0x208e47d79385cc4d8e489ce7785fff836a18db7544419d7c48e31937a7a1a764"]},{"address":"0x608669d4914eec1e20408bc4c9efff27bb8cbde5","storageKeys":[]},{"address":"0x9dbe6c723ebb04c0c281d9a180914b0e0ae50a53","storageKeys":[]},{"address":"0xaa5d314a300205077e0f6c0acb06c97f5e92b0ba","storageKeys":[]},{"address":"0x0072d180797ff4ce05b1d12310d44ecf26c8576d","storageKeys":[]},{"address":"0x42262e64754471c2c187ed2f3121779135471060","storageKeys":[]},{"address":"0x000000000022d473030f116ddee9f6b43ac78ba3","storageKeys":["0x21b8750ff7ba5e35e009f0a6189c8abb42b96c3f251eaec54f29cb7e1e13a902","0x683d2dd59b56d0dcd6bb0c0d40a573f1d88752f137df6fc38e8b509e02d2842d","0x30e773a804f78e09b6e4d23fe878f370d1d504a3b5d3d1ad17fde1e1f8626ff8","0xcea01b63144489fb063739dcc5efc143757b96dcb3e24807fa7c817b6d947df1","0x73f2d1dde50d6c22179f0dc65a703c2ab7ced45d4a12639a1cd042cb0bfb09f9","0x005880a09c8062c51ba8647c33b328579ffb8c322475d3a293f6fae45e0b6e83","0x2c91be1c0bc155a16a0a7b5e13b7f85f216de1e44be9e8b5322550bc011921b1"]},{"address":"0xa57ed6e54be8125bbe45d6ca330e45ebb71ef11e","storageKeys":["0xc04a3948974e3730e404b7f715a6d31aff10e926bc4638ffeee602ed18b6b263","0x6752128797385aafbe66e63ebeffa5094edd171f5cb7b8918726e8ec310249a6","0x125b7ae58aa0bf4dc21733b335aaf75da9bd35d2f771d995516a4243b4066d37","0x000000000000000000000000000000000000000000000000000000000000000b","0x0d5cc3aff4d0a83b588733fd9be2ddd3429e53221dc5a98f45ae71cbe8e385d7","0x0000000000000000000000000000000000000000000000000000000000000011","0x000000000000000000000000000000000000000000000000000000000000000c","0x6649ac883963210e0facefe2e6d16028e2bbfa635a27126e36e2b0a102dfd834","0x09d191b225001833d11f105578f83497315735a544362c7c4a515b52378e2df0","0xf49f3538ba91e890adec3883c84ff2f51d8a52ab4bd1fd6615fc3eebb8180242","0x3419c66aa2130bb555124b3db1f82bb83f0f36baf4813af32e00e31d45a8ff3b","0x000000000000000000000000000000000000000000000000000000000000000d","0x2c0a33ea1f416505bfd0b0a93da839edf88c332758623bd7849235c778629cb7","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000005"]},{"address":"0x99a704ee425c2602cc1d421a20bb4662c69bf247","storageKeys":[]},{"address":"0xc42b14e49744538e3c239f8ae48a1eaaf35e68a0","storageKeys":["0x3c427a4a63a49986e20e76949218b899074fc42c03b48c8cd5adf39c735b4240","0xfe155a864090e2117df37367eed95f7fd34d60b0dc2c41fcadfca8f72c419b78","0xcf8ad21fc3128768e335509e4698e53f5bc5447c3ee3324662ba18b05c1b6228","0x9671a9c5acfdcb756146b4e9a24bf92788c839042bdf4ef1bec2b51989ed21f9","0xcdf0eceeb0f33a1e97a3ca4ae7c0e220a7b876702c8034e978bcc5f01be78dbc","0xaa6ecc73df4aa0d0157af61fa21e157467d27c80988aaa33b0c5e9b31ddfa0d9","0xd7eadc1d8700e75a22b647097f65ceccff638041e36bf557511dfb5a619a6c21","0xc3b53e42a298e9806b991885c3dacbd67d7dce5ae62ca1267249e3f9461893ef","0x0000000000000000000000000000000000000000000000000000000000000003","0xf427fe12801d5d4271089517ff27d6f7cfde654843b2c3fbd900ddab2f8513c6","0x6be8df344dc91266a7291f091eb8876d86ab32b5b6f852d8148ede89e05b82e9","0x18aa7c12be72d83d9fe040d8fab9d2754b873db2d49cf12b9b02a7fe5205991d","0x385a57cdd748a252225035f3dd1f3627c9cf5575b6943b0afe31ead98163eb3c","0x9a517c135ff08a94ce5c94b8e060bc093a1ce8061a6916390d4b0a6a818ea081","0xf07abe5f09279da8b07df7b6609eb30919809611f20966e8dd1efc2253b308a2"]},{"address":"0x9b16c4bbd2d504786f90f487f0ec721ca3c02956","storageKeys":[]},{"address":"0x56eddb7aa87536c09ccc2793473599fd21a8b17f","storageKeys":[]},{"address":"0x77696bb39917c91a0c3908d577d5e322095425ca","storageKeys":[]},{"address":"0xc3b0a38d5667388b04c32edb1e855bd00403edcf","storageKeys":[]},{"address":"0x8484ef722627bf18ca5ae6bcf031c23e6e922b30","storageKeys":["0xe93bb5d2d36fbcc9c72a80aac571548ddf92ea26bb641c7959f215ff2f697b8c","0xbaab7dbf64751104133af04abc7d9979f0fda3b059a322a8333f533d3f32bf7f"]},{"address":"0x3e2e4a4d94c47163c5887308213bad6c1abf5d17","storageKeys":[]},{"address":"0x946de0c2fa8228d4e89f8f6e563039b8936b1528","storageKeys":[]},{"address":"0x0ed882f8bde5a8d1f3702fa239ac145db117492e","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006"]},{"address":"0x808b4da0be6c9512e948521452227efc619bea52","storageKeys":[]},{"address":"0xd74a355a52fd198abde16745c93f33dd3889e05d","storageKeys":[]},{"address":"0x682831244b0e97946abc52cb1893cce398de3a35","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000007","0x000000000000000000000000000000000000000000000000000000000000000b","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000008"]},{"address":"0xd533a949740bb3306d119cc777fa900ba034cd52","storageKeys":["0x7f2bde1cdb65a8e033ce966e094953cb700fa5ca5db1de078fd13672baf01198","0x5f7e60196d1183c3afa6526b495cd8b0b9391531951e59d8b2d173412ca8feb5"]},{"address":"0x8472a9a7632b173c8cf3a86d3afec50c35548e76","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000004"]},{"address":"0x6c6ee5e31d828de241282b9606c8e98ea48526e2","storageKeys":["0xc2222bc987df70edff05113eb5b48b1ed151e42456cca3de5854028e97d554e2","0x0000000000000000000000000000000000000000000000000000000000000004","0xc72bbb4da6bb5f43c1674abfda8f8c6258b19f262fa4d259ea35d527f521296b"]},{"address":"0x1066cecc8880948fe55e427e94f1ff221d626591","storageKeys":[]},{"address":"0x32400084c286cf3e17e7b677ea9583e60a000324","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000022","0x0000000000000000000000000000000000000000000000000000000000000018","0x0000000000000000000000000000000000000000000000000000000000000019","0xc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131e","0x176118e676368a26c80288857d4dcc2c62f55fc0181fcbb27b91ccede4f47451","0x6fb3d3a4b7a080386d76960b33031183abb6bff4bcc494380515ed3041fa1edf","0x0000000000000000000000000000000000000000000000000000000000000017","0xe164dcb2652941f0fe4453bc5418a8e925fc89516c388105ece008a50a881f48","0x8e94fed44239eb2314ab7a406345e6c5a8f0ccedf3b600de3d004e672c33abf4","0x000000000000000000000000000000000000000000000000000000000000000d","0x1503bbb25b147dfa24009fc2786c8493bc31c19ed3d336917da9afc817c5cdd5"]},{"address":"0x51ba880f37ea1fcdcc63c5b479c72f8b8f3b4e91","storageKeys":[]},{"address":"0x01a656024de4b89e2d0198bf4d468e8fd2358b17","storageKeys":[]},{"address":"0x4dece678ceceb27446b35c672dc7d61f30bad69e","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000001a","0x0000000000000000000000000000000000000000000000000000000000000016","0x000000000000000000000000000000000000000000000000000000000000001b","0x0000000000000000000000000000000000000000000000000000000000000019"]},{"address":"0x7e94197bd57f57497f26521f899c1b7e6d4eb706","storageKeys":[]},{"address":"0x1a1fdf27c5e6784d1cebf256a8a5cc0877e73af0","storageKeys":[]},{"address":"0x4585fe77225b41b697c938b018e2ac67ac5a20c0","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000105","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000104","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000001","0x9f85c60ad79ea4337e6857f5e71ef0310bd7ffbdceba9ca937894a812d6dc2ae","0x9f85c60ad79ea4337e6857f5e71ef0310bd7ffbdceba9ca937894a812d6dc2ac","0x0000000000000000000000000000000000000000000000000000000000000004","0x9f85c60ad79ea4337e6857f5e71ef0310bd7ffbdceba9ca937894a812d6dc2ad","0xa00e9f45e9f0c328446d13a90db1b8ff531c4946ba6a4294a1ec03159cc44b19","0x9f85c60ad79ea4337e6857f5e71ef0310bd7ffbdceba9ca937894a812d6dc2af"]},{"address":"0x423f4e6138e475d85cf7ea071ac92097ed631eea","storageKeys":["0x0fd4f3d08cdce41693a053d24208ca680e29348fd4d58da076e4800b188bde1e"]},{"address":"0xc9332fdcb1c491dcc683bae86fe3cb70360738bc","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000006","0xb230807886ce02c13dff86b1a9232aff10fee960b2f5f74e72f20f48146b97a9","0x00000000000000000000000000000000000000000000000000000000000186a5","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000005"]},{"address":"0x9eb45d631f0f7d038d2e121aa3c6bf8679a5b730","storageKeys":[]},{"address":"0x8b6a6f5b828f086a2a9d8a3150b958e79e91a82f","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000002","0x8a9a513b9791a18d5272680de0b8170980d584db74d5cc608d89e97f4ae4c892","0x0000000000000000000000000000000000000000000000000000000000000004"]},{"address":"0x5c55cd67a6bd0d4c315b50cb6cd589bfb080017e","storageKeys":[]},{"address":"0x0802dd2edd3f9fad39a9173b4595be819f201d61","storageKeys":[]},{"address":"0x0a62276bfbf1ad8443f37da8630d407408085c8b","storageKeys":[]},{"address":"0x2e02cf930374dfe0fca6ab2e0ae9af498f0eeb5f","storageKeys":[]},{"address":"0xe34b4c8ccf742f12978783ce7d96ab8537de5f2d","storageKeys":[]},{"address":"0x4734b1d4b2df58329da586b2841f47e6a29cadc3","storageKeys":[]},{"address":"0x923594510fabd628d6c4a98c0321aad054a16266","storageKeys":[]},{"address":"0x6db0fb5a6f92f601aea9b7590ba559db9ab1402c","storageKeys":[]},{"address":"0x37d26dc2890b35924b40574bac10552794771997","storageKeys":[]},{"address":"0xa5c1658e253dc961b1534f92146d20293aba258b","storageKeys":[]},{"address":"0xae2fc483527b8ef99eb5d9b44875f005ba1fae13","storageKeys":[]},{"address":"0xb2ecfe4e4d61f8790bbb9de2d1259b9e2410cea5","storageKeys":["0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x000000000000000000000000000000000000000000000000000000000000012f","0x3dc40693fb3bf64b979c0e0b720cba651945e1a1c67007f82f8a170b92d7faf8","0x000000000000000000000000000000000000000000000000000000000000015f","0xd51a84850e3476406216f99da9a384d1d5ff57a85fd08323bac31bce860037fe","0xe969193d067dc13826550fda46e8f1bb43dd5c923af5eab55b6c7c2080f0a212"]},{"address":"0xc4ad29ba4b3c580e6d59105fff484999997675ff","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000004"]},{"address":"0x4e3b31eb0e5cb73641ee1e65e7dcefe520ba3ef2","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0x998b3b82bc9dba173990be7afb772788b5acb8bd","storageKeys":["0x623348d3e9f0d9c8141e9f58b5e6fb84556de2286c85d278e5e26ce61c1f77ed","0x9c87686a668c5f51d082f0bae504a5966d7f2b3907814d39e59d2fba39d1c51d"]},{"address":"0xaebdb173ecf4776968701f6b5b5781afe7baebc1","storageKeys":[]},{"address":"0x78f1038e973139a7c0d59a87a4dda0f560178f04","storageKeys":[]},{"address":"0x54586be62e3c3580375ae3723c145253060ca0c2","storageKeys":["0x2a11cb67ca5c7e99dba99b50e02c11472d0f19c22ed5af42a1599a7f57e1c7a4","0x5306b8fbe80b30a74098357ee8e26fad8dc069da9011cca5f0870a0a5982e541"]},{"address":"0xae7ab96520de3a18e5e111b5eaab095312d7fe84","storageKeys":["0xd47b44da93a490eb8655dcfdfc921b4e0850ad0ced545e96f3a9a2ea83230d58","0xae68078d7ee25b2b7bcb7d4b9fe9acf61f251fe08ff637df07889375d8385158","0xd625496217aa6a3453eecb9c3489dc5a53e6c67b444329ea2b2cbc9ff547639b","0xa66d35f054e68143c18f32c990ed5cb972bb68a68f500cd2dd3a16bbf3686483","0x9f70001d82b6ef54e9d3725b46581c3eb9ee3aa02b941b6aa54d678a9ca35b10","0xf37caed32e4e49c83636e0f1684f3f4a9a23c463a49eb17cd63abd50680b378b","0x30021dae10ba10b52bdb78afc498c2708b8205e3839e5c24c996e740e3a7bf15","0xed310af23f61f96daefbcd140b306c0bdbf8c178398299741687b90e794772b0","0x644132c4ddd5bb6f0655d5fe2870dcec7870e6be4758890f366b83441f9fdece","0x4172f0f7d2289153072b0a6ca36959e0cbe2efc3afe50fc81636caa96338137b","0xe3b4b636e601189b5f4c6742edf2538ac12bb61ed03e6da26949d69838fa447e","0xe6e35175eb53fc006520a2a9c3e9711a7c00de6ff2c32dd31df8c5a24cac1b5c"]},{"address":"0x11b2bfd17b942692f3c7f62908ae54f11555f39f","storageKeys":[]},{"address":"0x9af3049dd15616fd627a35563b5282bea5c32e20","storageKeys":[]},{"address":"0xc4472dcd0e42ffccc1dbb0b9b3855688c22f3a0f","storageKeys":["0x3bc477b501297444a13de6be90e5efdc4311e0fe3992dfebfca497de46917594","0x26cc79b59eb916f0c0e1379ab76ff28890cc061e499fcb0ff6be9a47765c07ac","0x26cc79b59eb916f0c0e1379ab76ff28890cc061e499fcb0ff6be9a47765c07ae","0x0000000000000000000000000000000000000000000000000000000000000000","0xb37cf3fec266c41396dbc03b8e81e4fd635f44273e51228d035c88ae62ff8081","0x0000000000000000000000000000000000000000000000000000000000000004","0xb37cf3fec266c41396dbc03b8e81e4fd635f44273e51228d035c88ae62ff807f","0xb37cf3fec266c41396dbc03b8e81e4fd635f44273e51228d035c88ae62ff8082","0x0000000000000000000000000000000000000000000000000000000000000008","0x26cc79b59eb916f0c0e1379ab76ff28890cc061e499fcb0ff6be9a47765c07ad","0x3bc477b501297444a13de6be90e5efdc4311e0fe3992dfebfca497de46917592","0x3bc477b501297444a13de6be90e5efdc4311e0fe3992dfebfca497de46917593","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000002","0xb37cf3fec266c41396dbc03b8e81e4fd635f44273e51228d035c88ae62ff8080"]},{"address":"0x274166dc60b0e986762d0c875aa932800cc0d6d4","storageKeys":[]},{"address":"0x0e0c77d078746f4b21bcc439905468d782bbaa00","storageKeys":[]},{"address":"0x2260fac5e5542a773aa44fbcfedf7c193bc2c599","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000005","0x041fb92791af656a5970d946eab0726fa7cc29ad5366ae52491c17c2fe5efcb1","0xdc276a4f120117ad5ae6415d1c724b4f3a0e81f0ee6466e1392ca121b63123f2","0x81d16f8ff08124c3470152778cead9041e7af2087107c2534feae46c33f982db","0x99713ceb4322a7b2d063a2b1e90a212070b8c507ea9c7afebed78f66997ae15e"]},{"address":"0xd48e9da6184dc7962831af5ec45652a52fdd6238","storageKeys":[]},{"address":"0xaa346781ddd7009caa644a4980f044c50cd2ae22","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000001"]},{"address":"0x61131513c4ff67bcd3318eb309834d26a3509cdb","storageKeys":[]},{"address":"0x600e571106c31c4ca1bf4177ba808e37146a4a0c","storageKeys":["0xd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec3320","0xd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec3310","0xd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec331c","0xd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec3312","0xd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec3315","0xcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b6887933","0x7dfe757ecd65cbd7922a9c0161e935dd7fdbcc0e999689c7d31633896b1fc60b","0xcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b6887935","0xd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec3319","0xcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b6887931","0xd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec3321","0xcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b6887938","0xd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec3322","0x7dfe757ecd65cbd7922a9c0161e935dd7fdbcc0e999689c7d31633896b1fc60c","0xcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b6887936","0xd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec3313","0xd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec331f","0x0000000000000000000000000000000000000000000000000000000000000000","0xd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec3327","0xcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b6887932","0xd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec3325","0xd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec3314","0xcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b6887939","0xcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b6887930","0xd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec331b","0x7dfe757ecd65cbd7922a9c0161e935dd7fdbcc0e999689c7d31633896b1fc60d","0xd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec3317","0xd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec3316","0xd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec3311","0x7dfe757ecd65cbd7922a9c0161e935dd7fdbcc0e999689c7d31633896b1fc60e","0xd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec3323","0xcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f","0xcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b6887934","0xd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec3318","0xd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec3324","0xd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec330f","0xd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec331d","0xd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec3326","0xd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec331a","0x7dfe757ecd65cbd7922a9c0161e935dd7fdbcc0e999689c7d31633896b1fc60f","0xcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b6887937","0xd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec331e"]},{"address":"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48","storageKeys":["0xcaaba83cc62bd9ff81815c7a16cab84590626e7a47e34ac274b560466ea44630","0xb68026b3771e024912c1e4acca593a53674101f7caf8fafd1bab5a15a52dc232","0xdf536271c8facb2f3c054c527419d2a5c603c9688aae4498c41aaf961424f570","0x4486c7f79c0aad6c1f058b6134bcad78c20c7c5a8151a221d9cfaafb51bd2fe2","0x12dd898f4a480c545f9838e2a0c101409e865c40558462403a8273c3ca3e2337","0x390f6178407c9b8e95802b8659e6df8e34c1e3d4f8d6a49e6132bbcdd937b63a","0x10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b","0xc937356fbb1d41a475e0aeb9c72b3680e850136654e0c6ab468bc8188a0b9606","0x0000000000000000000000000000000000000000000000000000000000000001","0x847c183da4f844a0bfdc97f2aff2bf6dfbc2af5fc522c2b18f95beea12dd536f","0x04d59ee12128a927af41a0d3e5152640548876e14c53a263d4754be4d7210471","0xfa8d90c31aa9d60d8a5563d6b06b294f8851151f431a19253e3852de6275e289","0x81070766827ee1a801eddcaa410aee18dab165db9ab9a203311a68f37acf073c","0x058626be24917c1ae4ed5eab3b04ff1e21a4399f4fa3e36a0942903d4465e60b","0xe7b8b9060b669548aac5c6f3f9f3506a8850a20ea630a4605051a9e68e2ed130","0x15d7a43c3a595454a812f5c7659d47d83de319cbb3b9462a445aea0204d7875b","0xce1bb5cc7ecd7fe34c2af84799e4fdf88c73ead956372fcb4aecae7766edecd5","0x688c3e002289fcdae99fec728919f8c58bf4a63597b51cc1c50519b02f2fbcb4","0x75245230289a9f0bf73a6c59aef6651b98b3833a62a3c0bd9ab6b0dec8ed4d8f","0x4dd1725f464fafcddf286deb01aabcbb4bf8a538bad59c775b5dcdb2fbc3c71a","0x1f21a62c4538bacf2aabeca410f0fe63151869f172e03c0e00357ba26a341eff","0xe2227cf0b5be4d7ba7a42923d3c43d60d4214f9c2f94c2cf3db4cab9b6a0bdbb","0xc6a9e6d75b82e15a84b7d06f92df3ad6028a819a927a8d1e3078f5a42ee8d524","0x78e84b04d971cb85a2ef0e6b2d9d480a6f1273ff7166df2a654d16e0bb74cc58","0x39a528031c821151a0357442b7ae7ecce02aeec01c8255f8ccdd708707e959c9","0xf56408d23e6790fec5453738cf042a4a3ef7ec36e9ceae8978e4ffce8e903bc3","0x466bb9565f5eeaf15aec7c92d238ad2dc4c1b89ca928b5443573880d7ebbd9b0","0x3ef898e1ffb441054c38414096beda26581a06c779a402e6040022b096f4fc6c","0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3","0x2272303eba5d14e16687cdf8936028c295e364a52d2f6814680f3354d926150e","0xbd6efac75ea691a8847324c8512167f1fbfe3a2458d602bd686eea1f0819de1b","0x4b50a38a45993764c519945acea2535b1ba5f00812efc53cb43fe562c1dc7107"]},{"address":"0xef9080ae61c13c8d389b1811b5708fb363f39be1","storageKeys":[]},{"address":"0x472bea8fd83129bd9b2e32f8201512f88f1f21bf","storageKeys":[]},{"address":"0xa68bea62dc4034a689aa0f58a76681433caca663","storageKeys":["0xadbb9c3cd0a068fc8ee300cb23a3b086d295f9b3d4f39ca85a25c652087d5caa","0x8d629cb47d08e89353adb6c7692b952b309de6af172d6a1081aad5fa72045c48"]},{"address":"0x6982508145454ce325ddbe47a25d4ec3d2311933","storageKeys":["0xd330d89cdd04aee2394d3770fdb76e861e5bf5af7f5638ebd8b9cb9dfa87520f","0x0b18a50b508350f7c2dd395b6e624b1eb63ca8b44ac906ea700bf0743c2aad59","0xe1c0912e91a5242b53d3ec84a50cea475aa4838e554926f0d80e131b2d4e66d8","0xe06c150dfd387bcf51281bce2e9176020f88348eadd61d52424b62c7c2e15359","0x0000000000000000000000000000000000000000000000000000000000000006","0xfd57e0da32991ba05427d33d4f637692387021e6a2ffa013302b53cb2e15044f","0x3f57e8e1e500a3ae77354023fe56204709951df36588147aee0845b3dbdf3c09","0xba43b84b17deebeec7f36d05cea2b2641fd23600f9e29f5940ca5a63978b912d","0xae88df6b5fa728af2ae3c86d087e9bdb6ab6fca866f63fe440852c59cf374fcc","0x95d0da21c4501374e2f53d5090272b7a894a261253fa77c4c59f468c72a33ec7","0xd02b0262d1979ce21f4bea6afb4e0771cbd81fb75d927ca17ffe87ca51822f17","0x0000000000000000000000000000000000000000000000000000000000000009","0x66cd5a530f6760ec4ab86e37df2e081462224955ed23f314f2ea54d9197d3238","0x26a610a1f44e9b5b336a8ee2ee23a5ff2ebe7014485c90bfd610f4f8be8d5952","0x55c7a092dcbb23ec5ee8345bfbc0f3d2a6e0b77bcc033d7e7fbcb812247c7eb8","0x351ef4c4037a1efa8274951f7413e5d1b195997bc5442d3302ec3ecbc682571a"]},{"address":"0x8591b92e15509b76f648e2e02e8fb90adeb33426","storageKeys":[]},{"address":"0xf939e0a03fb07f59a73314e73794be0e57ac1b4e","storageKeys":["0xdec782ec88c59a2245772c53d224473f33d69bc070424c0b14b7f8d7fd32f0c1","0xb8d6bf99893469d3544b0c0028aa3d1e6ba3b32bd46bdb8e1e52d9e2180a9cd4","0x781fe1d320cbbd5f46653f6403c1ba5b5e8effa981c76c26ce9aeb2134ae2c58","0xff181e1584a8591cb971beeb8c8a540b2075ef4cd5acc0c776d34cfd1cab60c7","0x00f7402e36c78dd81fd7bf5d0580d623b82a16ea76725677fbf90b48d8344c40","0x6d925efa75b69ac59beafda134d71b007ef78673369e7bc1241107d491d6b5aa","0xded44791a5c1c00441a7d239df442ed1560abb2cc07bee1f0d0b059a8efe12a3","0x00ecec87d9fd8df8102d8313ee75963fa58ef81f01334cb9ee425c38d0779892"]},{"address":"0x4150b9603bd87ae5c1aecdf4aa348699af1754da","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006"]},{"address":"0x8315177ab297ba92a06054ce80a67ed4dbd7ed3a","storageKeys":["0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0xb432a7c60026701625d6c1d74bc2ab936dff834a53d1b48899b5f6943831142f","0x0000000000000000000000000000000000000000000000000000000000000005"]},{"address":"0x15c5620dffac7c7366eed66c20ad222ddbb1ed57","storageKeys":[]},{"address":"0x1c09a10047fcc944efde9226e259eddfde2c1cf0","storageKeys":[]},{"address":"0x07415a26a0126a125ab5b0281687a69ffb209f65","storageKeys":[]},{"address":"0x7a63d17f5a59bca04b6702f461b1f1a1c59b100b","storageKeys":["0x15e86e12d2596e308755eab3ada247f38048851b6387ce103d08698145fcd3e5","0xa233f043162753cfa530f6666695a7becfc911a6e3f39c2a47f206ed0626f48d","0x8c730d17c644e53b5b561bb5a08693151304e80d91119d6854eca6bf2ba988f2","0x360035e73dcd2a32d51c3cf58cc3b68399fb3157fbb4392c2097c25720e09978","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0xdef2b454ad921914073d8b7891ac1601e16c3b7818c18e25c9ba3a298d5df03c"]},{"address":"0x1fc40cedcb47f341b37968a635314756d4c04f36","storageKeys":[]},{"address":"0xf02f75e9f83fc3b9b341cb015c1eb97e2504ce0c","storageKeys":[]},{"address":"0x0c1914085cc5bb4491a88e1e38e939b42613eee2","storageKeys":[]},{"address":"0xec0820efafc41d8943ee8de495fc9ba8495b15cf","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000004"]},{"address":"0xe9f77af0133225c9908ca5aef2424c49682d89c4","storageKeys":[]},{"address":"0xcf8d0c70c850859266f5c338b38f9d663181c314","storageKeys":["0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x3db89e40056e1e415b186b37b7cb88f6ba0da57c1d383403faf92bb06996b6b9","0x0000000000000000000000000000000000000000000000000000000000000037","0x000000000000000000000000000000000000000000000000000000000000003a","0x000000000000000000000000000000000000000000000000000000000000003d"]},{"address":"0xa69babef1ca67a37ffaf7a485dfff3382056e78c","storageKeys":[]},{"address":"0x66d64cbdead11caae8db4a1ce9077831539f54fb","storageKeys":[]},{"address":"0x413adac9e2ef8683adf5ddaece8f19613d60d1bb","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000003a","0x3db89e40056e1e415b186b37b7cb88f6ba0da57c1d383403faf92bb06996b6b9","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x000000000000000000000000000000000000000000000000000000000000003f"]},{"address":"0xf9bd9da2427a50908c4c6d1599d8e62837c2bcb0","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000005"]},{"address":"0x056fd409e1d7a124bd7017459dfea2f387b6d5cd","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000003"]},{"address":"0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000001","0x320975846a116b11411a5cfde94c56d7713040529fd53bc4095fb1022e45da01","0x0000000000000000000000000000000000000000000000000000000000000197","0x0000000000000000000000000000000000000000000000000000000000000198","0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0x2d6e2772859658c991e973e7c02078baa981006f","storageKeys":[]},{"address":"0x3db52ce065f728011ac6732222270b3f2360d919","storageKeys":["0x174e21b9719efe2a95a8591c9cd088a846e65aaf20e9332cfc04e0debe4a9d32","0x0000000000000000000000000000000000000000000000000000000000000003"]},{"address":"0x0d8f79ee7e5463d5423f5d70b4921faf17a23da2","storageKeys":[]},{"address":"0x1f6e1928dc0204bc3e60776b1918ce71c17f8bb3","storageKeys":[]},{"address":"0x76e40d0a69fd81826b5eb7d18145626d46eafdef","storageKeys":[]},{"address":"0xfa3e941d1f6b7b10ed84a0c211bfa8aee907965e","storageKeys":["0x16d1086c95473ebfc9232806c39a89701297a6443f9c19234e86fe346ab0c7b9","0xd1a0e794e776c50e996d25cabdc52a871c9031fedd73f3ddcd480c3b851245d4","0x7cba5942e9a7224c33185a6c4392efb74cf00521cbc9f2eff332116abf3a8733"]},{"address":"0x2b33cf282f867a7ff693a66e11b0fcc5552e4425","storageKeys":[]},{"address":"0xfa103c21ea2df71dfb92b0652f8b1d795e51cdef","storageKeys":[]},{"address":"0x39807fc9a64a376b99b1cebde2e79e3826d39aa1","storageKeys":[]},{"address":"0xaa222c7683c331b56d10b143739ebf017f46d45b","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007"]},{"address":"0xa60efe89e07cfcf83eb30f3b063834f0f8b30466","storageKeys":[]},{"address":"0xfe44c3ffc6bb69276573f568db0f499c97766cf2","storageKeys":[]},{"address":"0xf42a7c44a05b22e40d2a825c54560a14541d29cc","storageKeys":[]},{"address":"0x26352d20e6a05e04a1ecc75d4a43ae9989272621","storageKeys":[]},{"address":"0x737e8a8b5f36a388638285d558f80af7fbcecb8a","storageKeys":["0x59512ef7bf6383aaf77afa296322c739f398411e51b5a6aa00f39cb95420945d","0x329c3b59d0d3f4686e6bcf912c0417a56fb228dfef22ecf2d26400589da43bb3","0x1657cc45726892ac28247fa3d0a2698d0c94db01234ce4938755778fb52add2d","0x48dd75081681b92f9a19c433ca1b9f0d3d78280b9a4c275b2c37559f8fca1cb2","0x5ac6d4be4e02314ce9abcf7ab6a6d1e10a52c7b923194d53cb1e5c6c8a1a3826","0x0000000000000000000000000000000000000000000000000000000000000007","0x33545559ffe181d39376856b0f63408a48ae6c9c60919c262ba4a077b6f8bfe8","0xd674e972d47db11c3f413961e04bb3fa16bb2bdef6208a5b88e04e8f03c918bc","0x9377119c31d8f70e1ddc3e7047a14937a33a14f78ba70a64645b706e0aa57ec0","0x8962cc3b6af7d5d5edcd7e5e1b9c92d160f40012ed1fda69477c3187f09b09ee"]},{"address":"0x46340b20830761efd32832a74d7169b29feb9758","storageKeys":[]},{"address":"0x0e747eb2ff0f26fb77c3a1ea67ee07fac2dbb783","storageKeys":[]},{"address":"0xb2bc06a4efb20fc6553a69dbfa49b7be938034a7","storageKeys":[]},{"address":"0xbd5192295573b671ac57b2664eca20ccc0378a7e","storageKeys":[]},{"address":"0x80d186b4c786ea66592b2c52e2004ab10cfe4cf3","storageKeys":["0x9573fdc8c4a2cb4d4345ff61efaebf12d577f3a318fd20eacb349531a445a554","0x74a88c9c5ffaa82feba8db664e528c59e1e4ad0b4397eb2d89c8e7a212a0bb9b","0x0000000000000000000000000000000000000000000000000000000000000012","0x42dce39ec04f57ed60f02843779129643ab682b0204ffc3a6471867799e63c5f","0x0000000000000000000000000000000000000000000000000000000000000013","0x000000000000000000000000000000000000000000000000000000000000000f","0xfd5d9b18a682da87cccfced5527b1ca04cf30dc6c79083f8934180d7d8defecb","0x270b001ad820d62e46b79b15dffee6c2d905fd159fb410487015de63c0a8feb4","0x61eb5e420b83e80f7d464335f782bfa549b5c45609cb61e444421828c245c38c","0x0694dfb4b922264bf12cd96418586faabb545f435aa293afa1923c343964e9f2","0xafd025e5e01313368dd335e098d54e7960bbcc3ab9fba75b374b7799263021ab","0x280daa694da4d7b24134f87bd0d7e4214505fd41d25dbed0337137b3369d0044","0x1f8b8f849553c8c8ee2caa11860d4bcce792cd4899bce7e1309b2ccdb58e9473","0xe823ad0e0d8dda09b2a5836e15f2a2d9ddbf54cbd64696ca905bc42253ba5ab5","0xc40ba3a21f44e6e3f3d4189984b86510daa57e52aacf2a9f99eb45d87f4f27a9","0x0000000000000000000000000000000000000000000000000000000000000016","0x0000000000000000000000000000000000000000000000000000000000000017","0x5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c8","0xa49372c33738f1b53d645b1b12b4cdcbd791e5c6fdf2cc73fa0b12509c392780","0x4c4c614cbfa6187f701b723ac4483394eec40ff34179590c7aa9b879fe1c1ae9","0xe8efe49256c119acf13d5b7c3f126a0433eb19af846af045d9296bba48334731","0x9c07f3e67a824e6969fbab25447584870853c12cbd49016ae7c0b6a79547d3d6","0xed1cb6f015cff44bb715748f1b8e2deb20268e55db2d16915b0c6e1110534e08","0x9e743285127cb4a4e308e073036d1ccad624c8f2653ea77772e8e0db051c073d","0x8363f836c1d9bd3d7c6643b363ac7b0b29fa3b71e942d23c9aceb947a97e9a77","0x007f987b985acdd76ed5b1532843ee8487912d16fd32705a1e5a701bd5ca812f","0x3a41ad6953a5fa251a88b98716b66fc76dcf0da7ce4633c827e5abee790bd68d","0x970ba10efc2a446c87ed7eb23f936e990bfe1d384658504f675d1f800814955b","0x3a7cc0c577bce006a540658c44827493ca5d34ee1efd0aebcfe7b1c08bf4f967"]},{"address":"0x63bde7cb131b020e817d4e11e046ce3916fa53d8","storageKeys":[]},{"address":"0x2568e74ac4fbb5937193f64a8e747b8372b8d1e6","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007"]},{"address":"0x00000000000000adc04c56bf30ac9d3c0aaf14dc","storageKeys":["0x74671cc1ee4b35fc41a033cacbf339e2c7562ec1b6abffa96373accf9fb8471e","0x0000000000000000000000000000000000000000000000000000000000000000","0xf8d166207ce77d642e0739b10f854f68f56b3ab4359ab18829f1fe7dcf6641f9","0xfd519a35e08432670ff6a6ea95665b501a6834b98f5cb3f040ce380d22738e70","0x8a541198eeb70efa626cd99c41fc2f943429c59e86a10533b7c1b711821b51a7"]},{"address":"0x102633152313c81cd80419b6ecf66d14ad68949a","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000003f","0x000000000000000000000000000000000000000000000000000000000000003a","0x3db89e40056e1e415b186b37b7cb88f6ba0da57c1d383403faf92bb06996b6b9","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"]},{"address":"0x44affdf87abfb1dba08e444141bd21b4380fa35f","storageKeys":[]},{"address":"0xca68a3d663483515a9d434e854ab59a41b3a523c","storageKeys":["0xd027d05cd8d91cd8ee694a5d839324f059c2a6452b85bb3ef588f068c493c615"]},{"address":"0x6ca298d2983ab03aa1da7679389d955a4efee15c","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000010008","0x0000000000000000000000000000000000000000000000000000000000000003","0x970e8a6741a29f8dde5ff466d2df4abffe69b4b85ea62fd79efb6c9076103ff2","0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000005"]},{"address":"0x0420de7b94c386c5cee391a89f559abed77253bb","storageKeys":[]},{"address":"0xe0438eb3703bf871e31ce639bd351109c88666ea","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000006"]},{"address":"0x5a03e9355cdb5f74897fc6f91b0de01868791964","storageKeys":[]},{"address":"0x3b6ca6e7cc07605c0496b46111b08418e8bd1204","storageKeys":[]},{"address":"0x000000e7ec00e7b300774b00001314b8610022b8","storageKeys":["0x8a544f7a90e767d9bea3a08f370e08d816168745881d640911c6f3d377888215"]},{"address":"0xa920de414ea4ab66b97da1bfe9e6eca7d4219635","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000004"]},{"address":"0x39c498c0e9c30bdc071c17ba4772ebf5e565faac","storageKeys":[]},{"address":"0x0000000000a39bb272e79075ade125fd351887ac","storageKeys":["0xeac93c10be001eee2832d264e358c531c2268ce19a40c2aa709797d6715b526c","0xdf8644dba8dbd7a9b693e2d16f0483dc5920dd49c1c9b2775bc20dc85ced5138","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x407d2b4bccc660083b3d31fc565cc3a536d43a3e70a4b0243158cf620fcfda25","0x859245a13018ac5a93a01e110bf65ca1abaee6f8ad471faac9be4824c9577049"]},{"address":"0x264bd8291fae1d75db2c5f573b07faa6715997b5","storageKeys":[]},{"address":"0x8362b4bf25054423c31874307d8e65e63012e40f","storageKeys":[]},{"address":"0xd9db270c1b5e3bd161e8c8503c55ceabee709552","storageKeys":[]},{"address":"0x216b4b4ba9f3e719726886d34a177484278bfcae","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000"]},{"address":"0xbc1ea504fc54d078514efcca1f6860b5219b6bc3","storageKeys":[]},{"address":"0xc77ad0a71008d7094a62cfbd250a2eb2afdf2776","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0xaed0c38402a5d19df6e4c03f4e2dced6e29c1ee9","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0xe8c364c964573ab16724cd63dc4da72544734b86","storageKeys":[]},{"address":"0xcbd6832ebc203e49e2b771897067fce3c58575ac","storageKeys":[]},{"address":"0x6e7cead898af7704d247d777e477085d0107b63e","storageKeys":[]},{"address":"0x8544617a530a106e4be8f0ddbc4123958f428d16","storageKeys":[]},{"address":"0xe939f011a3d8fc0aa874c97e8156053a903d7176","storageKeys":["0x7d1bae3d2e5612442425c86fe76ee4b13630b94bbcc797393f0f02e69425de78","0x941c390bac53a18c0a538d7d9d002decd706476d3fdc8f108b3e944cab1dccd7","0x09ba1a2d1ed6880c8429cae6aefa6c95b3664309f08da3ba80db2afc046ce17b"]},{"address":"0x7e75debaa645805b1aaa4c5a41aa11dbcb198215","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009"]},{"address":"0xdc24316b9ae028f1497c275eb9192a3ea0f67022","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000f","0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6","0xb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf7","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000ffffff","0x0000000000000000000000000000000000000000000000000000000000000003","0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e564","0x0000000000000000000000000000000000000000000000000000000000000009"]},{"address":"0x3db3b3d04324af7a30e709b29876c167c06351f6","storageKeys":[]},{"address":"0x2f18f339620a63e43f0839eeb18d7de1e1be4dfb","storageKeys":[]},{"address":"0x86e4dc95c7fbdbf52e33d563bbdb00823894c287","storageKeys":["0xd56714ae1bc8a5cac332b6ae35b2bb0aa51b91cf92f80a052dc033beb4b4d5ed","0x0b246d9d31a73b945e5923912c50537070d73cbba56ca96ea3d544f4ab552fad","0x0b246d9d31a73b945e5923912c50537070d73cbba56ca96ea3d544f4ab552fb1","0xa605ce07bba2225103348e4b36020c42b3d747c151e6baede45600efab7c61ab","0xd56714ae1bc8a5cac332b6ae35b2bb0aa51b91cf92f80a052dc033beb4b4d5ea","0xa605ce07bba2225103348e4b36020c42b3d747c151e6baede45600efab7c61ad","0x0b246d9d31a73b945e5923912c50537070d73cbba56ca96ea3d544f4ab552faf","0xa605ce07bba2225103348e4b36020c42b3d747c151e6baede45600efab7c61af","0xd56714ae1bc8a5cac332b6ae35b2bb0aa51b91cf92f80a052dc033beb4b4d5ee","0xa605ce07bba2225103348e4b36020c42b3d747c151e6baede45600efab7c61ae","0xa605ce07bba2225103348e4b36020c42b3d747c151e6baede45600efab7c61ac","0x0b246d9d31a73b945e5923912c50537070d73cbba56ca96ea3d544f4ab552fb0","0xd56714ae1bc8a5cac332b6ae35b2bb0aa51b91cf92f80a052dc033beb4b4d5ec","0xd56714ae1bc8a5cac332b6ae35b2bb0aa51b91cf92f80a052dc033beb4b4d5eb","0x0b246d9d31a73b945e5923912c50537070d73cbba56ca96ea3d544f4ab552fae"]},{"address":"0xba0cff83faaddeb0dd42e663ef22c0f04bfa01ae","storageKeys":[]},{"address":"0x40ec5b33f54e0e8a33a975908c5ba1c14e5bbbdf","storageKeys":["0xbaab7dbf64751104133af04abc7d9979f0fda3b059a322a8333f533d3f32bf7f","0xe93bb5d2d36fbcc9c72a80aac571548ddf92ea26bb641c7959f215ff2f697b8c"]},{"address":"0x3b30a3ed9145f90da68c5910e6a9690361c2a010","storageKeys":["0x67c710f0a20788208d61dcc40bc5d70dafe2e5192f6b86ee75d5be98c5e6ecc1","0xb13e0edbcb3eab110bf5daf63b6e75919c57ea9b327200a5c18786546bfb21b9"]},{"address":"0xddb3cc4dc30ce0fcd9bbfc2a5f389b8c40aa023a","storageKeys":[]},{"address":"0xdfd5293d8e347dfe59e90efd55b2956a1343963d","storageKeys":[]},{"address":"0x37417b2238aa52d0dd2d6252d989e728e8f706e4","storageKeys":["0x8b7b9f9813a325ff1d1742084c33636aa028a7979ae4249304ff23e03619a4a6","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000009","0x5a394589617b1ba9cbcbd2b27e27cc153e90656797aacfc6ab1dbf1cd6c30271","0x270e7751614d4e91a095cd3ace3f4d517c1b37aa711dfeaf72be0b76abd04839","0x3757bb026b72bf4f9cbbbf8f2bafe0ea3d356ae6d8f07ef005aafb99b4cbde40","0xef75f3597c10141d1dc0cbd4612baf062d7e47257f426e9490860d50701a4c8e","0xc1688c1d2d0c611e93da89fe10ddd0a3f27cb50d9f94ef15a2f31a07f06220d7","0x63ad5e8597ed00826582ffe8302b2704b28344c60ae5645ec296a6326e0ed345","0x70245aa8eee00889cc059fdc11a53867c856b61f1cf8bc3ee4f4442d6b5c3c37","0xe397cf9706f522dafff518f3ae63b4cdcabf8a93293fcc829843d749f8151bb0","0x6b485436b9b234417e59960d9ab1366322cfad1c365f281a05863557ce7f5ce4","0x0000000000000000000000000000000000000000000000000000000000000000","0x9f06b6a21011ceaf77e412292865f39f3e7ad40a4f4dee40defc38983937e0b7","0xc0fe3ac15929d25201e62b8c796afb6745bcdd80b8be9470092f43535ba0b48d","0x8252d0af7d8ed7c10ea80b7c6f14fb078bd62e077f890e6c18f704b57caaa5fe","0x47cca4e5cf2ef3d1cf48e381e7c50f235175233c59e08319e054e746d4722a98","0x5a394589617b1ba9cbcbd2b27e27cc153e90656797aacfc6ab1dbf1cd6c30273","0xf67afc5d8a9483ebb5641ce5845b29143b497c64e8e700f016cf676758071285","0x07fc9f99a348f1ce3967b1918510f209dc4ad0ea6c703ec65ccdd193fba04e30","0x0000000000000000000000000000000000000000000000000000000000000005","0x09a170f3d0086dae06bb29777773ac9b2ea063027c223214f7fd334306f76582","0x6fbf3b49b523bc27464b7dbfa6311951351b1d3efd07aa2ee4d1ce319801a0ce","0x0000000000000000000000000000000000000000000000000000000000000006","0x4f6f17d4c19a0fb4496592de6c1ed38b2e6bf8a401cfc93de804cb1abd2317d9","0x0000000000000000000000000000000000000000000000000000000000000004","0x01a49be1e7ea084651fd665847100d28826db0b17160863a99534933cbbd2dce","0x0a206051e911305809ddd48cf2baa7ead2c7fb038e505e1d02f9e6c2ce72930c","0x74de6ee29ec064d7422ac246d66454f61b9e14a93dbafed176857c31132fc242","0x5a394589617b1ba9cbcbd2b27e27cc153e90656797aacfc6ab1dbf1cd6c3026f","0x5a394589617b1ba9cbcbd2b27e27cc153e90656797aacfc6ab1dbf1cd6c30270","0x7601ffefa6ba1727312968a657488b1c15c3fb08db74e7fb86ab372180914279","0x4850c7fcd76ef9a9b6af49426db50eab97252f2b3eda6fb3fba71ff8796ec45c","0x33820a7b4c4724aafa212ecdbe06d3782aeae3dbe20fcf670d9acc29d388ea90","0xfba2bf5b1dd468baf16221045792a70d5cdd656b9f3da14b127c3e81dc5d6de2","0x765724b689e31218aaf382b54d4ef85ae8209f9da80544d7ed82a51797a64b6d","0x5a394589617b1ba9cbcbd2b27e27cc153e90656797aacfc6ab1dbf1cd6c30272","0x19a91e2e18c07202ee013c560f8ebffb9b71a05a6a09fdb1d62a413e2117a159","0xc20c5761668d86779ef4c3a3fb4ef0bf03180db801ab101907600e7db2f2bec1","0xb9aa073911e1c5f8bd8c04c7214fb2acd89aeb4180f5a23dea34f2fa40cb91d2","0x5a394589617b1ba9cbcbd2b27e27cc153e90656797aacfc6ab1dbf1cd6c3026e","0x0000000000000000000000000000000000000000000000000000000000000014","0x28f973f655c78d879d00767376b860c7f1ff781d69e5cd4aa2f5a99e2232013c","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000007"]},{"address":"0x0aa5fcefbac1bab8f6cdfd907c7a3861cfdd3776","storageKeys":[]},{"address":"0x7effd7b47bfd17e52fb7559d3f924201b9dbff3d","storageKeys":[]},{"address":"0xfd1b0b0dfa524e1fd42e7d51155a663c581bbd50","storageKeys":["0x3862c7f68d582c60933f320e56f4cb669d1fa95218843b1795d2f364b0d2ff6b","0xef0b564e34f5055353ccb90fa782db38fbb87afa0547192279fe7e16077a2a04","0x745ed5b1948fbd0ea21808905aedc22c517a97cb13cccae4dcfa3fe8e13ec123","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0xf5a408b6ca36065a125b9765382973484b00a40a9a6704ede38ab2d568119416","0xa8e02bf7d13aed0bf585e4a518ddba437348f897a5311f8e1d4aa0009e508065","0x8afb6147b9f5c5bcc4b5a10449bee47fe7762bb2eecb8bf4420dd8f6ca003f9f","0x37d5ba3c65ba98e1a79cd0731ae71d87341c6a2abbdd7d40e28a50e36a570b26"]},{"address":"0xc70ae19b5feaa5c19f576e621d2bad9771864fe2","storageKeys":[]},{"address":"0x0b9857ae2d4a3dbe74ffe1d7df045bb7f96e4840","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000005","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0xe257bfc9a6b59e7f8ab9505e438b48b546dfe05fb907398da3e2d314de374119","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000001","0x271ebad1ef1c4cc3c6a7c2377a94bdf43830569b7dce0b46bebe56ceda76c0d4"]},{"address":"0x1681195c176239ac5e72d9aebacf5b2492e0c4ee","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000005"]}] diff --git a/bin/mpt-test/access-lists/18363444.json b/bin/mpt-test/access-lists/18363444.json new file mode 100644 index 0000000000..98dc9ff53d --- /dev/null +++ b/bin/mpt-test/access-lists/18363444.json @@ -0,0 +1 @@ +[{"address":"0xceb492c5e67385e2a08265352d646a0c32a5d085","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000001","0x3e5fec24aa4dc4e5aee2e025e51e1392c72a2500577559fae9665c6d52bd6a31"]},{"address":"0x69f97efe5beeec0803a9a10403998f8d11d3f256","storageKeys":[]},{"address":"0xc6265979793435b496e28e61af1500c22c3ba277","storageKeys":[]},{"address":"0x2548e9a58e45511064fdc892fcb4645075028c87","storageKeys":[]},{"address":"0xc662c410c0ecf747543f5ba90660f6abebd9c8c4","storageKeys":["0x71a8ef1b1265359d77973c3524afac225c0a0d829a0d4da5cac3b34532019fee","0x67963652696f3a8e8976c8d0956f2afb2fdf053b99be7bf625d956fc88a52815","0x71a8ef1b1265359d77973c3524afac225c0a0d829a0d4da5cac3b34532019fec","0x50ec9a2ff4d918f206930eb059dc9484bab42d8b4f52d4f6e9a264e33ed0b637","0x177667240aeeea7e35eabe3a35e18306f336219e1386f7710a6bf8783f761b24","0xb4c82a817c6e58e43d4ecb2529caab94383420d8f31e963cfe54dfe32d2cca56","0x8cde0e99a4532474b22bd3952cb1c6b00478babd3678337325283f4f48110fc4","0x04e7be39f2fb63cfd7d4fcfe19f108bc6b411ed972d99fca0a47dcaff878ce5e","0x71a8ef1b1265359d77973c3524afac225c0a0d829a0d4da5cac3b34532019fed"]},{"address":"0xbf94f0ac752c739f623c463b5210a7fb2cbb420b","storageKeys":[]},{"address":"0xd2a52f45c74b358abe1428bc43f0ce9ddf130780","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000004"]},{"address":"0x72e4f9f808c49a2a61de9c5896298920dc4eeea9","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000011","0xef1be01d872993a75b8228159a434541a9ca5354d1a5f73fe2a44d2d0f25be7f","0x2700f34971dc3c86a46eaca36bb8ef3b4442063c7d70e7e47ac1be11135fd814","0x6af51dad79bea0b2b46f7d57d925a1a4ae8ba8c9ec9a074932ac72531ccc29be","0x76cdbb4da10a556d26f29ad18920e5a22062483c170687c9c7a6e305069b2692","0x0000000000000000000000000000000000000000000000000000000000000009","0x5838759efee640af14325896999d89a13e3e6fe10f44f7f900c98dcf42995df3","0x0000000000000000000000000000000000000000000000000000000000000000","0x4ce51de202c6a46155189c1b5ca3777d364d2bbf58eff95e855ca40b812b3449","0x0bf65866927b788efaba1adb5a600465855ddd468aaec9d99c91c9352f70d2e4","0x0000000000000000000000000000000000000000000000000000000000000006","0xd2573f0dbb1b618c8497ffdc6b18073228cd828eb6d602b370f26cad6ea425de","0x000000000000000000000000000000000000000000000000000000000000000b","0x000000000000000000000000000000000000000000000000000000000000000c","0xc5753b1e233968a84b4dddceaa66223c3e65097199f2b7f2cc0808c98803b5ac","0x0904bb255c32e9fc00712cd2a9224cbd3dbc1350ca6d0347b88c7ac7b6639320","0x0000000000000000000000000000000000000000000000000000000000000014","0x000000000000000000000000000000000000000000000000000000000000000e"]},{"address":"0x15c5620dffac7c7366eed66c20ad222ddbb1ed57","storageKeys":[]},{"address":"0xea500d073652336a58846ada15c25f2c6d2d241f","storageKeys":[]},{"address":"0x4130094af2c2c12fafa9ff662b390c8c168d2afc","storageKeys":[]},{"address":"0x69af81e73a73b40adf4f3d4223cd9b1ece623074","storageKeys":["0x5b55c21b899d40d6c00cc95facd1d867524bcacab0555e9145e418f6ce188620","0xad06b61865fc0ef3fe8a979452a7d0a4cad989d464708c0a98894338f78c14b6"]},{"address":"0x000000000022d473030f116ddee9f6b43ac78ba3","storageKeys":["0x23d598f6228547f9506c8a1d9889f5d4959aabec86cb4e0421dc197880c12c61"]},{"address":"0x9ecf0d8dcc0076dd153749bece0762acae1c9049","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0xf641db6860fd5f6643d05bd75405a2586a63a141","storageKeys":[]},{"address":"0x22f9dcf4647084d6c31b2765f6910cd85c178c18","storageKeys":[]},{"address":"0xd9db270c1b5e3bd161e8c8503c55ceabee709552","storageKeys":[]},{"address":"0xb1e6e158adb290efd12c69f64512dbd44dc93343","storageKeys":[]},{"address":"0xf5074a863cad4ae21b830227a9f67ac86388e0f2","storageKeys":[]},{"address":"0x3005b16a12187cc4c3d5c3053e3521ee963af6b6","storageKeys":[]},{"address":"0xf51a529a4f892806e8ac581d53cb316aaa4e049e","storageKeys":[]},{"address":"0x8a440376e74c9e99c34a67102627ad04f03b2cfe","storageKeys":[]},{"address":"0x7e75debaa645805b1aaa4c5a41aa11dbcb198215","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007"]},{"address":"0x16938e4b59297060484fa56a12594d8d6f4177e8","storageKeys":[]},{"address":"0x513c606becd697aef54050f677c71fbf25855050","storageKeys":["0xd735dafc9e8abe8b448c57c74f6d941d9df3c07329f2702db39b1e0315aea9b7","0x0000000000000000000000000000000000000000000000000000000000000000","0x36d9207203b990c315ab6a0000555f0551db82fb224e349b40d8e507025e9c43","0x0000000000000000000000000000000000000000000000000000000000000009"]},{"address":"0x1111111254eeb25477b68fb85ed929f73a960582","storageKeys":[]},{"address":"0xa24787320ede4cc19d800bf87b41ab9539c4da9d","storageKeys":["0x091b538cc337c56d98f134820e53fdf990ed5ae12070bd3ed2dccd6576932d50","0xfe33526235a78a51be700fc56792503851298483965ca9ea3c174e0722a14e76","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"]},{"address":"0x8ad6c66122cc39bb6d89825da8c2c0fd9a0dc1ce","storageKeys":[]},{"address":"0xf2722b4a57915a155dcd6980c484de708c771ed4","storageKeys":[]},{"address":"0x2197a1d9af24b4d6a64bff95b4c29fcd3ff28c30","storageKeys":[]},{"address":"0xa7631836db2e3ec13cb2e7cfbc687c168dbed336","storageKeys":[]},{"address":"0x6edf968da408a9640b8865826429a977a11c5048","storageKeys":[]},{"address":"0xf9a2fd5faa8d06e9f4695dac80aa326fbacc9f29","storageKeys":[]},{"address":"0xb830a5afcbebb936c30c607a18bbba9f5b0a592f","storageKeys":[]},{"address":"0x7a250d5630b4cf539739df2c5dacb4c659f2488d","storageKeys":[]},{"address":"0x47312450b3ac8b5b8e247a6bb6d523e7605bdb60","storageKeys":["0x177667240aeeea7e35eabe3a35e18306f336219e1386f7710a6bf8783f761b24","0x7184681641399eb4ad2fdb92114857ee6ff239f94ad635a1779978947b8843be"]},{"address":"0x2d1e5c2a10af28d238c91fddcb22893e65c47baa","storageKeys":[]},{"address":"0xb52770137d1a1ee957d450b1036afb430f77e72a","storageKeys":[]},{"address":"0x2fc617e933a52713247ce25730f6695920b3befe","storageKeys":[]},{"address":"0x83b76b11257c4ece35370b6152f1946d49479e89","storageKeys":[]},{"address":"0xbfa899c1ad97229d9c604e9ea927c7acb988c05c","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000003","0x37f6e41b248623c992c2f0e7fb844960539b15fceff154facba92c7a9f4a0a22","0x37e84deda24a2f5acb9add1df4430f9941ee1a7c98655146e75654b6e2c23f0d"]},{"address":"0xe5bbbdb2bb953371841318e1edfbf727447cef2e","storageKeys":["0xd74772f2d3f7816dea5b83ed6aeeab044779ebba1326573f1e3e7525b0066171","0x000000000000000000000000000000000000000000000000000000000000002a","0x475d52e1600ce8a3be70dff6a6538611279b22a82bca4e83048753c8f48b22aa"]},{"address":"0x8f183ee74c790cb558232a141099b316d6c8ba6e","storageKeys":[]},{"address":"0x7cdf68ce9a05413cbb76cb7f80eaf415a826e313","storageKeys":[]},{"address":"0x72e95b8931767c79ba4eee721354d6e99a61d004","storageKeys":["0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x000000000000000000000000000000000000000000000000000000000000003a"]},{"address":"0x01a656024de4b89e2d0198bf4d468e8fd2358b17","storageKeys":[]},{"address":"0xef9ef6e07602e1e0419a5788f1d85e0698eab077","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c"]},{"address":"0xe3808fb4c3aed5abd1cf59f576e1c9c941db867b","storageKeys":[]},{"address":"0x98f3c9e6e3face36baad05fe09d375ef1464288b","storageKeys":["0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c93","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c92","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c83","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c8a","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c8e","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c8d","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c84","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c85","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c86","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c94","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c8c","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c89","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c8f","0x88601476d11616a71c5be67555bd1dff4b1cbf21533d2669b768b61518cfe1c4","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c90","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c88","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c87","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c8b","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c91","0x0000000000000000000000000000000000000000000000000000000000000003","0x88601476d11616a71c5be67555bd1dff4b1cbf21533d2669b768b61518cfe1c3","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c82"]},{"address":"0x0fcdff7f1b9aebce034d3953fa54a7f16930311a","storageKeys":[]},{"address":"0xf0a0f8b23df046135d426cf8f905c8e2d917889a","storageKeys":[]},{"address":"0x669fab7c773b2bfe8a86e09249f0a56a69695899","storageKeys":[]},{"address":"0x74de5d4fcbf63e00296fd95d33236b9794016631","storageKeys":[]},{"address":"0x3c3d457f1522d3540ab3325aa5f1864e34cba9d0","storageKeys":[]},{"address":"0xfb3cd0b8a5371fe93ef92e3988d30df7931e2820","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007"]},{"address":"0xc585ad419c5650041b74b105075248f80ac9135d","storageKeys":[]},{"address":"0xe592427a0aece92de3edee1f18e0157c05861564","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000"]},{"address":"0xc03f31fd86a9077785b7bcf6598ce3598fa91113","storageKeys":["0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0xe7f4dbde1f055fb5dfeb1ee1b0fdc52ab1e40610b4cbced628be90449bcaa996","0x0000000000000000000000000000000000000000000000000000000000000065","0x0000000000000000000000000000000000000000000000000000000000000069"]},{"address":"0xb8901acb165ed027e32754e0ffe830802919727f","storageKeys":["0xa0d1224dfac40e9c90ad58c1cf011dbe362397ab2b0fa32c54cca8801b302fdd","0x8104522f08084ff3c7769672ea3b23868d65963f4b4e53dd7ed6fc4a8f2655aa","0xab166fbe919e459855231b333e9824b787e83b032e53a3455b5340add3afab97"]},{"address":"0xbcc44a6a4b0b01fdd788a8542a8427cc6a066e55","storageKeys":[]},{"address":"0xe3944ab788a60ca266f1eec3c26925b95f6370ad","storageKeys":["0xece1cce679cdc49b18b2bf234a8ffcef69622e29ed4541e8f061169dd9bb19c3","0x816e7c8224537e9a46022ec2591d0f825dd5636618d4dec1def4c55625f2026b"]},{"address":"0xe290c42db4dd54717b6d26ae5ea3ae7da359f034","storageKeys":[]},{"address":"0xc790b0d7291f864244b559b59b30f850a8cfb40d","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009"]},{"address":"0xffe15ff598e719d29dfe5e1d60be1a5521a779ae","storageKeys":[]},{"address":"0xa9c7f76b8027526c9b1db2c24f6d9242516d671f","storageKeys":[]},{"address":"0x50130437a81535dd8f4b0b921756ebddff537523","storageKeys":[]},{"address":"0x76e222b07c53d28b89b0bac18602810fc22b49a8","storageKeys":["0xb5e32bf50149885d3d646d8982464d72de4ae399d83828a675f837354bf33510","0x02b8d8834ad9af8d7307f3bbdbd773ede52b32eeb265e110116185bce8222791","0x774cca85025c2ce10e9e3034977533ce6004a51f85ea56ea17ae38e7d83e11c7","0x4a8360dcbf2fb9aa7ab86da1ac9b80c2b3519c759a2bef3e5f16c0fa8d6a9b52","0x000000000000000000000000000000000000000000000000000000000000000b","0x8019e036999aa69d9af14701dd2e5f06d2c1be260f44867ead530198efd8aa54","0x52b309b0c3f704fda008a718f9043bebf89efce14e6afecb69b37f30be855918","0x1a67dd2ba4c77367ea4e2254ec1881eb45c3091278092d4d213c592398e4c02d","0x000000000000000000000000000000000000000000000000000000000000000f","0x0000000000000000000000000000000000000000000000000000000000000008","0x5849072c4f1de0b752aeb0bca85eccb859c8c2979bc1c5a111540c3bfa608174","0x0000000000000000000000000000000000000000000000000000000000000005","0x0588d0c3a76602a35b103254e95b5b0d99294eb2f4ddee93696edcaa2e07f1ad","0xbd04aa5d8f347727f39776d0bf0dd4fb7a53c843c1ea93e170b48f808180b98d"]},{"address":"0x1d97f8ba688b00a3333e2bfc46f62aceb5d3c19f","storageKeys":["0x58554c8d4d49f3245f2cf231069c2b20bc16b1cbbd0d182a45639fdca5b5b55e","0x1376f1602f62e688683fae11b2b431ab4f4ac45ac62b37918824942d25b9b536"]},{"address":"0x8d2f3ba53de0becd02a768ae47e7daea736d18d4","storageKeys":["0x88865833f46400bc06af14943dc9a00455c814058699150ac1e0b78df028cb11","0x0529b55e09b4d3ac6c5c3f2fc989afbcac77011c3e1062037cae91d59baa5855","0x919f5b91115577eba5aaa294e02ee010103febab72e0acfdf86e731cfe7d8459","0x000000000000000000000000000000000000000000000000000000000000000f","0x0000000000000000000000000000000000000000000000000000000000000013","0x6a2a2a495a242a48411012348a9e24b0b4eaf321d76e4de329928775af41074d","0xfee8537133cc89145932ff516bbe7d949564980c75ffaaea974c37b1b8ecda1a","0x69963df970e4dd66a99a5028555867b0e0181c9b10d2be93a1e7e427811ad29d","0x5dd8ac021dea190d797fc113d99dced426bd093f7b4398aeaf1b96df8fd17ba9","0x000000000000000000000000000000000000000000000000000000000000000e","0xe5a957b95a50128ab2d89499d80b018493099f2bb90ced5233998b2f45c15232","0x4acb8c6261840d853f24cc6b1563515d7a6ee1df5f05fe17172cc365b1cb6928","0x9fb793927b7b08fdc927222d9745736781a30935b0bf6e831ee9373d36652fe5","0x000000000000000000000000000000000000000000000000000000000000000a","0xc84d5be059429cbbd573b75d3766350741c4863699863c8ea0631569acb08c11","0x0000000000000000000000000000000000000000000000000000000000000012","0x7b3afbb4d900c1d555ef22d5365261e2b802813cff305ef1d98f5721764ac74d","0x0000000000000000000000000000000000000000000000000000000000000019","0x0000000000000000000000000000000000000000000000000000000000000017","0xc9f87165757ea85a0a25ac76c192c5adb1cc4f8abb2d26b15e373875d8d4d809","0xd8827f71efe96de401541bf20f17ca8a579950ce7f986f15890e42dab3ae19b4","0x0000000000000000000000000000000000000000000000000000000000000014","0x0000000000000000000000000000000000000000000000000000000000000009","0x27a6cae6e9962538c3d4b79c1d12dd6f2e3721ec8b78be8d2c59e2a9c726057b","0x7d0bb50997d6c42c7985f7a1fe71f3c39d29c4ad35ba2b5815f7463f4cbfb889","0x0000000000000000000000000000000000000000000000000000000000000015","0x0000000000000000000000000000000000000000000000000000000000000018","0x6f8bcf3c6626aa1586082a13495eb44c5260b2d8c9d5e43b95d384d8a8f9a395","0x0000000000000000000000000000000000000000000000000000000000000016","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000007","0x43cbfb27efa831312bc60e025cb4a5011529543a51cee05b4cd8138139c7a5c8","0x0871a5d940b7b81691b26e20b0e1d240b640a7aba2f414297b54cd756e2f8521"]},{"address":"0x548f27e2c1eb0c90c9c0ef3a4a61a6ae60038f02","storageKeys":[]},{"address":"0x414135416b86118bb9abf52241345d52e3bca641","storageKeys":[]},{"address":"0xe4edb277e41dc89ab076a1f049f4a3efa700bce8","storageKeys":[]},{"address":"0x2fd08c1f9fc8406c1d7e3a799a13883a7e7949f0","storageKeys":[]},{"address":"0xebec795c9c8bbd61ffc14a6662944748f299cacf","storageKeys":[]},{"address":"0xc1af2a2cd32d90132080439199bdccc269482bcb","storageKeys":[]},{"address":"0x504edf66b5499c680cf21a7d376a10f31229b68a","storageKeys":[]},{"address":"0x0b453140f6174788b5657876d6d25aa02f79962f","storageKeys":[]},{"address":"0xd610c5d5cad200894743455ab9bf0eb73d290e2f","storageKeys":[]},{"address":"0xe37e799d5077682fa0a244d46e5649f71457bd09","storageKeys":[]},{"address":"0xc36442b4a4522e871399cd717abdd847ab11fe88","storageKeys":["0x0143f300029cdf37fa68e68af473737b1dd6912cfefcf396b76881acadd8a65b","0x4e506517218e6fd1a30d242ea8d040f7cca9231df83c626f127c989eba48e518","0x0000000000000000000000000000000000000000000000000000000000000002","0x3922056ad7b83e0b5398060da338226d77a465bcd080ee32c419885dbc10a7bc","0x91b46369a917c12e58b375be8fb8cbc4b8a640d494672d0235789b6c77a3f615","0x3de4434b5ce3e9ff472e5aa76dd327f8cda77eeec7f85737b4fb3a12b3cbbe35","0x94b574d8873307ec24af90e8e79d92bef6e55baa4d28c398d8191b7def4c5ba3","0x000000000000000000000000000000000000000000000000000000000000000d","0x95590573b57fb100d42c6b929619f92ce6ce6c023a24346aa2ca3df230d880f4","0x0143f300029cdf37fa68e68af473737b1dd6912cfefcf396b76881acadd8a65c","0x3de4434b5ce3e9ff472e5aa76dd327f8cda77eeec7f85737b4fb3a12b3cbbe36","0x0143f300029cdf37fa68e68af473737b1dd6912cfefcf396b76881acadd8a65a","0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3c9cbc3","0xb4ab022c66d1d52e0e4637d095ccf76ab2ed8acd7096b286048925531762d2c3","0x0143f300029cdf37fa68e68af473737b1dd6912cfefcf396b76881acadd8a658","0x3922056ad7b83e0b5398060da338226d77a465bcd080ee32c419885dbc10a7bd","0x3922056ad7b83e0b5398060da338226d77a465bcd080ee32c419885dbc10a7be","0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3cb6fa2","0x375f56a183813ebc60e2580474fdce6259b00eebc335d4d9ebe22a95a8b2b722","0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3cb6fa3","0x0143f300029cdf37fa68e68af473737b1dd6912cfefcf396b76881acadd8a659","0x3922056ad7b83e0b5398060da338226d77a465bcd080ee32c419885dbc10a7bb"]},{"address":"0x902f09715b6303d4173037652fa7377e5b98089e","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000066","0x0000000000000000000000000000000000000000000000000000000000000071","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x000000000000000000000000000000000000000000000000000000000000006b","0x000000000000000000000000000000000000000000000000000000000000006c","0xbb4a7515a5e16f5dbf618622d5ae1adddfbace2bbe3ed7236b68f63164b4843b","0x740eb24e15e7b3f66b232e4101b6bfdf8bf6affb83e4df9698a0488d4d5f0008","0x6cbcefbb9b8f8e6cb91d231a006ce6c906409eb001f4d786c79a8377b2f351c6"]},{"address":"0x721fdd43bd765c6d645ce240d9a5035a148e4338","storageKeys":[]},{"address":"0x8fada3806fa641f3e2f030454d3170c10ca1d174","storageKeys":[]},{"address":"0xc59403834f631db807840d3ef58011981d4639ff","storageKeys":[]},{"address":"0xb62e45c3df611dce236a6ddc7a493d79f9dfadef","storageKeys":["0x8f3fcd8a87d8a8259bebf9cb6e7e851eb52ed472d13c686b03ef031d54fecb85","0x13061e5148594c093e4eaa49ee9225972b9b8f89d980d78e1c30ba9264578980"]},{"address":"0x1fc40cedcb47f341b37968a635314756d4c04f36","storageKeys":[]},{"address":"0xdce92f40cadde2c4e3ea78b8892c540e6bfe2f81","storageKeys":[]},{"address":"0xecfa4e7409917cc9b08a4b02a1b42c3515b85819","storageKeys":[]},{"address":"0xdd378a11475d588908001e0e99e4fd89abda5434","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000001"]},{"address":"0x9281035df6f00557c0285d7df21d323c2e2f99ad","storageKeys":[]},{"address":"0x0902e87ff457d7d85d674e7fe0c66442791b1654","storageKeys":[]},{"address":"0xab433bd84ec776f6480a9030abc5966c72a2ef2b","storageKeys":[]},{"address":"0x5f2a744b1a9ede9f66dad8d67e45e067de06c3a6","storageKeys":[]},{"address":"0x838a5832eb19cfce692809f5b2de44b15380cda2","storageKeys":["0xa7efaf40b530577fc37fe5d99a1d0519461b6c4941df4c0290f2df4fdcb9e28a","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000003"]},{"address":"0x932f4754efdffb297e57f870b5cc68bc33312e94","storageKeys":[]},{"address":"0x3b3ae790df4f312e745d270119c6052904fb6790","storageKeys":["0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x197e97841cb69cdcfa477778142be5e1152866569f923a294e043f97112451d8","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"]},{"address":"0xb9897a64f569f3f75bfc6c2cf26d837fbbcf5c2a","storageKeys":[]},{"address":"0x44a6999ec971cfca458aff25a808f272f6d492a2","storageKeys":[]},{"address":"0x0000000000a39bb272e79075ade125fd351887ac","storageKeys":["0xd1837627f2219c707702f5ac334321590aa4743e9e2ace8d7a575db4be4401ef","0xf423478e5c30bb7e04f5ae2b0c330fc964477768d362da03ee7e224862fab405","0x080320dd63591608c325c9e5a5aa32bb601cee2fce2dcdfdf1284c66de83cee9","0x859245a13018ac5a93a01e110bf65ca1abaee6f8ad471faac9be4824c9577049","0x18eb54239e3dca807a7220340675d5e483e457abef8aacb743940f5b0548d515","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x17056582f3c9264f8ede25cd22a619aa2e097a26a5b974958a539f96fe9de169","0xa272da291800fc905fbe129b74d4bdcd8d6bc953efd02e2f0f4bccc9c38e4798"]},{"address":"0x109830a1aaad605bbf02a9dfa7b0b92ec2fb7daa","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000002","0xbfd358e93f18da3ed276c3afdbdba00b8f0b6008a03476a6a86bd6320ee6938b"]},{"address":"0xc178167d2e6eb6fac41d669a7a3ecb2369f509e7","storageKeys":[]},{"address":"0x448dfb80eff9cfd017cd7ee014017cb6d5c40af4","storageKeys":[]},{"address":"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","storageKeys":["0x833fa222585c73f322f51dec13ece277fe5904f70ff95e55fa6ca8c03b6e3a51","0x9951e5c97f68238701a07028be91c5ba29bde0c65662546c454bab615c93f76a","0xda9ed07a1f285a45914f817e8cfef9514adc2e474bc077da53731b8e539df964","0xee61682ec263cf9ac626d5a9b0cd5e26edbfa98b5b368b540e65bd739c37e3b7","0x2790889919ab683a93d4271d4fe15fc1be878f84b6b702f22794331803c5dfaa","0x909d2686f472329788f5735a50677a82eb87d180e824f6cf4487742669130efc","0xa9737ba1a10239384d8fcfc799ab040cf027ae6b94e2299cb8f5f4ec251d23f1","0xd560a2cfa0eb1646a26a69aaac51ce0a87d07e92f1c5d1555931db11acbb71c1","0xee882cb0e61efbe2f7edd0fe7a9feef75c17c350fbb5f6e38a0a447346552280","0xe64622732fd0a452370f2a3346245d459568f645299277b5769727886d73e457","0x84fea2d772978e5a33ba1e173222c037e904715cfa963e3df0dc0b0b5679268c","0x63932fadaafbb12614a1ebee5dabe846ea84deea14650da76eb985ab4022093a","0xd212dcd01ed41455be0b36533ba78a0fdeccda0068b5f90fa610f816600cbd08","0x0000000000000000000000000000000000000000000000000000000000000002","0x9ed839fefbe23092644cdedfde0b79779fb1aec3a15d164c2df5e0b28fbb85d1","0x8b585f66e183984e00bf009ba25aba7f5da458e5e8efaabb6170cd4cc1f706e9","0xeca07c014d229c4f696d4a033c63141436ca3c295aa8a2b2584a59655a0e0d94","0xe03178286da22a27dd0b1f68fb538cd07bc9080172ee9a5a2238416fe86db02a","0xb1151b5f51c370d607b59e0034392dd388ea4cc8dded24ec75baf3df36983150","0x4175c49d56cad0bc6d69ef289864fd048386a14da4ac19736c9e074139b2e912","0x61bd8b7d7ea1350e36cb998c4b61b337d0b7e6c625816251eef440c23f9b21a3","0xbe11b0e2ba48478671bfcd8fd182e025c26fbfbcf4fdf6952051d6147955a36f","0xfb19a963956c9cb662dd3ae48988c4b90766df71ea130109840abe0a1b23dba8","0x8ec633f23a8bd50ec57ba06f4f70a523959f4660efb9bf0317e10af3e4918c68","0x2152d1f752d5b88a3178a813eda1508fbde034f11b826cc92dea66732e3d19a1","0xb374801ace2c02f5db0425ab5920a2b7ed1d5a00abbcd395fda7530ba1d666c0","0x87490cfb653047f997b69e61c7a1fc30f26358b189fb850deb46079b7f96ff2f","0x106c30a0c68ea09535b7105caccd49caa649caa256e85d87cf2098d10f72d4e0","0x4c3f43368e2e7b959bf0f00a0ccde02a47285afd90a3613be3bd46a0c37843dd","0x9ede93be0d8fc6a5eb9cf1c7345a85b7519d8487a727aef0c2f00ab966aa7716","0xeeb9b2a778da79ef78144c16e5ab4cba2394b8f096e394a5262a79459bfacefc","0x2b83b3e1fb436772e592319bd36c360dddb62d80a39727784d546decedbafe26","0xd4851508b763b3596bfa183329302d2d747141dd75533df138e81ab00f1ce9fc","0x3aff6944490d4628833f7b03ee999b6e6948ffcfba03d269cdadc1875a2e121f","0x3fbe6099f169b217d3e3f44e5b72b54ed4319f5e6c163e6e3739eb3434dbd572","0x5bebc1d66255dc5622774be2d4302fc1e7eeff454c5a800f05e2040f4af24f2f","0x8c38e3450e69b2ff90cc49eeeaf7fd1bed7c9abcef02c91ba6070d4dfc4743ac","0x3514a0695d482e2591be8de983771ab1f8770ba2fa598524700d7c0d233e4d58","0x390f6178407c9b8e95802b8659e6df8e34c1e3d4f8d6a49e6132bbcdd937b63a","0xba3974f7c497d4e64a9c1f262f27db1bbf8284c20bf7741255568616823b8ee2","0x2dcd944716773b83c0a1360f495fde13839861cf51362cf7556c51b451357715","0xcd1c7cbb83b106254f2544ce2b7ae8aa02a218dcc405730b8c0de260008a6434","0x0cb865ff1951c90111975d77bc75fa8312f25b08bb19b908f6b9c43691ac0caf","0x1370bdc1433914c9ffeda129ad3008563e2cfbf220222331adf7e4488ee1bfb8","0xb96a7d26beb69a346e760118cf70cc60033a13a4ec814c4aa72516e456aa2778","0xe273279646f2df33ee6e363c00a026c75bc9b08cffb5feed144b8cc6ea4a7c17","0x73a521ebb9c22d2aade7f1dd6340ba405c7330c2adeada9860737164168d5264","0x4fb413805902e1d9a6681d54d7946be4d2c3433fadac4304eb49ef1b5a52a8f4","0xf762dfe765e313d39f5dd6e34e29a9ef0af51578e67f7f482bb4f8efd984976b","0x47acaec6cce4f8679df357c0511627b345d6e8f569cbcd40f3cc0dc80233794f","0x674994ab631faa049823288ef8b84de2146a4c9528e1ae43eded0b8e59b3c47d","0x75245230289a9f0bf73a6c59aef6651b98b3833a62a3c0bd9ab6b0dec8ed4d8f","0x3355aa162647aa87d59169dcdc67640130e9607c9491efc2a497dc7a2abf1102","0x4407c5d47a7806a692816c7b7730fc910a266f9b6c73eea8ad04188aad140dea","0x640c500897aa4c5b6168b086801ead8d6109c7fa2bc9776b19a1046647afbcf8"]},{"address":"0xd4006530da498c6fede1ef57b962be869932fcbf","storageKeys":[]},{"address":"0x777ae9d03e2be0fd122f883f1cd684996df78785","storageKeys":[]},{"address":"0x39df4b1329d41a9ae20e17beff39aabd2f049128","storageKeys":[]},{"address":"0xa2413066951f039affe8415b6825b2a378cd16a3","storageKeys":[]},{"address":"0x94d3af948652ea2b272870ffa10da3250e0a34c4","storageKeys":[]},{"address":"0x55fe002aeff02f77364de339a1292923a15844b8","storageKeys":[]},{"address":"0x3773e1e9deb273fcdf9f80bc88bb387b1e6ce34d","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000003"]},{"address":"0xe31b1f0575399827551e4d611d6abcd211f4b4a4","storageKeys":[]},{"address":"0x60e4d786628fea6478f785a6d7e704777c86a7c6","storageKeys":["0x5e0f9aac96e710aeb274140bbfd2c03d303ad9ead70a70b77aecdf7db4dc683d","0x99a1f83d5a8412ce6a005dada8bcdb86271d7a9d43a7f0ede1a6f9f92f8d185b","0xd1794890cf3196f23bbffe1749783641d70a11a449179cedc7be90742c680969","0x05337f156e4de2f973b79726c5350dce046f885487876c08b2f64679151721d8","0x4f56119acaaf13802e02018899a27cf0a66e8bf7a974c1e17728f3250a78b9bf","0x4519130a0137cdb0ad6e348031753efac801089db868c6a2009265b0818fa9b9","0x621331969225d71083fd63d24f274c827d0febf3b5796386f0336a18b35cbf8e","0x472bc23beef460903d6b8add8c552fb758a143b995c58099099bea3c31db279d","0xcc0d778183592af5774d03ae3dc21576d135f70d0ad62b4e4be5e86a8dd5b71f","0x12c95e1ef2d8bc6378d8c4620a3e3f3661b6bc13a3821b6ed07aa95102771dbc","0x38b5d628759581a858fe7f971c2c0380a094950224573e553254dbca3142ddec","0x4d0b1c19582504ad7b35f6823d50a4c11ece91231277efbcdd704d1afa33dc84","0xcfe827968a5f134b26f2d8a2244c95da141d059cf3d64b9e42930ad0f3148711","0x8e77eab1aa2d4973dcff86cade1383ad357bd254e574f6df40d266340f53df26","0xc2b34ef9f1c1c3c9b7bed3078eef032cc991bdd05e132b41a0acb7fdcc67dcae","0x178de715484ada6447f6deea86b86c7552f10d41727186c773f17df7d2c45126","0x6e0a83de0848c768a8b1e058e368a393342d32d350973a00cb759d36ed2b670c","0x79a4d452c55560a09894bb1499cd87bae5eaf26e1250f7aec635dde4cfae0512","0x0da271a40588fa143365836a19f84e0fbe4e04cd2a8939e417ee2f976be1cfb6","0x7290de247b97283c5fd7a8ad0afb093cfee57db100d8f3124ea8e62f176b6bab","0xe743115e1fdc12b3488def4d471016d3b39dd89dfee7dd69948891fff5175410","0x191f44e1580242299db063ba805164df27b83ed3842bec77e30d0825697863da","0xb2fb5f88a45158ee54821ff9675c31fdfbc7437db5511ba8084a422bba98b6e7","0x8335ea94932d8b36be28d0034f980d80aacf979f224573f6e3f337d1ea2b8c50","0xe54bff27c15d90180dc4a3eeb339f7d8f2bce2b4062a8c5bbf55ca65b8dde680","0x5eb081b4b085d031c2c277752e4a3388ecc3683578c6a7b74feb09b771e40b5c","0x70c2f8df742b3a05db9fe920960efe081399f7d3c7103fcf314fde13bf9c0644","0x9f38b6383dff8661c822495bbc1f943c0f3604e57a3f356c190d62038fbca8e0","0x69b2ba739836e87aa9eb43afce38a6e8807d0d93afb7693a2fb4ece883b017f5","0xfe68ca6c9a70e86693cddd7ed649f084a2d180a39c6b03aa2bfdfc552c798efa","0x5e6ff24ced075e9ecac646fcb0ef109b2b41a72142be2976ab54ba3e546a426c","0x92fd0910c68c9172adc551702d1457e12a7213906dd3ec3f47dc0fd0855499db","0x8f055d34e9867171e01de20bbbbf599594fd01888e3914b67a2e4883bee0605b","0xeadbf07062452974829e36893662942275e1e892f44a1133bcb26d93c94ad272","0x4269c9513e075808fd31a09ea0ab39ee9ece5083b9d67231afb4626f63f905b5","0x2a5f205bfe2ecade65168e161e926a00d3001ea870207cad71b12c6b21c6a893","0xc5125415d7761e3a74e9a0ed8b35608f9673cda563eb086e67c10540de34c92c","0x4e961ce8fe6166f94d3b6bc17bd5bbaf601e9d3dd1c76be012f6db938230b3d2","0x41102d86124b1e7b6f41d5b2be2f244c7aea47732a01e512ab371d2789803a18","0x3a5396416d65fac2f238652434054caf755f1362b6ad53b2aa9e41b4a82334e8","0xe38f27c33f988b005a954468e7c1e8a776c54b3e1091353b3610a75f32f7cf74","0x917b8f8654caae7d7c0a7f58dcf5ae2fe4b13d8b6e86bdb85252dcbd09453bce","0xbd6b2278f4d1133a4b560384d4099f7b2f1ff31f656537c3f28495fb2f5af64e","0xfb4522ada2189179f8dc298bb297ed4cb70263aa7edbb557aab139c9695be5e8","0xe34740facae3a83b2b4b75a76b0d500cce98e483ea2c2abe9df75e7f549cd527","0x7fb9f0d686d517ec3395ef2ed2387f3ba95b60094af2be9f4e6eed448b270ae6","0x6b25592c43ea4c35cce61a71aff02449ce5d5e3e20a4331f0e9328b34b8cdf81","0xa251c08ee7a24fa1f04555b44e7272d114cab5a294e763f0143952dadc772059","0xdfb956a41c7a589ec797b8b880a430c1b7de8e1afb8019a7e7c2b5b46b077bde","0x48793e886bbfadb8c9dcbecc2f9ddfac9eda91468f450139ac6565833e4f14dc","0x7119f4c4835e67f202b815b65329970959af8603376ec2bbb9bb9fe785fe7ee8","0x0e6c3d987a0fe52016f93f370619eee1bf3f993cfcae2a53b02559ab88f4cca2","0xc42f62feb574c226f0492c83f3c6ce14fd4f31e004343a292d6e1884b00eba0f","0x4ec85d7f7c9a17bd6f3d088ce98c06d2bae7a3378f1ea2eb5b1c923c77b4677b","0x38791aa11f237ff1dafab27faba6bbb2cc362c247942f24fe689ab3ac3980f9c","0x76b79139b9cd33579a90170c9864e9ee8385c1cc514e926aee5bedfb44b9a9f4","0x9c6a49f39f181d89d03efd8945dbd3230cec63ad51037f1d984da84100209276","0x8e4b9e5c6763bb89d62709a4996c43114d797f458616e3f3f9ad04c59e22f40f","0x9fb7166929d82557fad2f19340d89bddb7b363f15226ae5c8a65cbd635410e8c","0xbf27dcb38b4f96aee33fc9ec4111c6cdcc946be291fec5349664d5e92faef39a","0x37267e88fa93455b6951b12b02f2b1d8ef5404f71898bff4faa46e2f6077cb45","0x59d478b2aa8f74b30e1f29700fdd88733e808e482843f228074a724951efad80","0xd9cb044ea38a2571bd6fb6eceb257b95d6ecb749e0a73a9ce2aa97c5af1d8448","0xbe86a5f58980f6af60c04831bab161527d227daa281f6f4580daac2e160387b3","0xe50a8975b2d656768e66cf4d6db1a844874120001d569cdee6cfa2b5768097df","0x9fbdd789dde3469194f6a705ec8477347176940f0e80330d3044a72a223d2820","0xaf1cbc0c4d1d5b161d67fd8e9ce97f1c4aff59a7fe34e457b638647a78b76711","0x8a55a23885e8479db394b6037d37674d9271c490cdb2732ba4d6b465f1839ba4","0x230f51296dd34abba72caf265cdc9ba0f518fa3356cef0e745f534ca0d92712f","0xa4c362802ec4004b4f06776131941d9764b5b63b02ea3a5e4ae94956e3e188a8","0xaa4e867e8c88fa02c50ef9e768d56b6c4d35e9b623e673fc0e88e18eb9ef62fb","0x03307c2a0cf8793cb3d5760a6508e393462a96b690cb843edf2a05ba2fc585d0","0x0a1add34d880882ab495d61fd5d29ca101602dedcf05443d9951011e625318dc","0xfe04ec1c2fb63fd2d29fc287c0f655850f556cb481f17ba0f90e68a8db37d7b6","0xf8617a635a84015cde3ceab05e0c4df3ba5344c0a16b940ab3ba05b8ff931478","0x14d7dacd7b706dfbce69208ea2a9441327447690e9bcb89ab565a43b14173d33","0x7fce19720ef38e08bfb53b936a9d836e8303db0b66fdbde520f3ff0868a7cf59","0x0c939833eec7eb8b03e0af0ff6c9c8a932322ce07dfd59e9719b860a67fef4ea","0xdcd10eff92d33bd728be378b28a87185dc4187983190bbb68555351c2009ae07","0x31addbd39fb586bfcff95378368464ef42b9c7643ee1f8aefb093111dbdf093c","0xf3183a7326472f4a699da79bb19d84adb3b4667ee0abcfc8e3660bb6107ec0b6","0x708e9b6a3bdee8880fbf143a89bfc4313452c39a1bdcf9668515594f4bde9dbf","0x1f8326a0e949cdfa35837f2ccc0c46bb4006e3f340543926c3562b3b63e1dbf7","0xfbbcdb0a803ed1ecf0d890277c3c8f6536ecee8023b2294f3fcde1ea59963aa6","0x9bffb5d1c015972bb6bfa529aee980fd1258e275f8c73aa553b5f25e6502f05f","0x4ca613a736700682b1203a4e6773790ee57dae6c15a1c167c2877c523ce8a7db","0xbad9c6f087f50c5936f27f4524eb98d4e33816ba48f3cd853425ba4accee08ba","0x712586084c6cf67794652d5f3e7aac7a52ae43703e72b9ac53bf301892dc5f9d","0x471069a139ef62706a68220d6333d2c2b4a4b7b4cbff6f4f922f9b2455990c10","0x0e8d28c31f452198f0f95ffb2cfe45d934c7d577b8df2350724f090f8b0a38f7","0xc4d92a52712c285ddf42f8227c19f0a948ee897afb13d93252e9e6c527f70a88","0x4fe67dbdd5c0d4a7f69723f92b440fe53df63533d2d82845815cb2c3488c4d85","0x02bfbbe102c3d119098a74e87754acadb62708bfb4a3da77e0069f56bbe995e6","0x3fc1b451d4ccd26442afa4be2b787bd0f0efb085210007fbd13861a1d545ad41","0x7d10457ad990f8f76727b30cc0a36b1a8f40ac178b63217856d621f89de0cd68","0xa9dbb2ff0e353d7eb36caf285058091bceffc224f180f1e19f3f4daf197d7fb8","0x41206d017783152518dd53ad33988c3c8c6a7b8fd6ceeb4fa028bf087ad6f654","0xedcc9b1adac30b3522d99a00177141bea956bc0348f86864e72fce0d377216a4","0x3326d0e27e6233d9f6751d4cc3c1f89b2a6ef3e60c260651b5f7b584b2a84898","0x4fbd08fbe7fc0f1401cdea71493355fa8dfb3b8be6c2eddbf33160d4afb3013c","0xa523c43fc3147c8c465209b83b27e8cd56577609dea22aadb6ecc86b048fdd35","0x59d5d01e7401183e7d3d5e0b35a1bde0fda576aca009ef4b5e1a126b91a8e46b","0xe60cff6519d4ffe916e8bc1855a18bc3df35c1286e8e218c91e9e139d745139b","0x7da21ee4e4c80b9eb51e5573e496f4d6552895d11165d189f919b3ee512b7732","0x21ebbbbcd0bd9141ef0eb5eb8287ee86f6a3f74a4ef854af35b7b58396df2935","0x5127580a5286c22c769f2c1665e066d40f9ec0213ac7d870b23ff282d8851e4a","0xe84e000052af1b12ff31020ab8abd1f694b213a1078abbeb22ddde2d02c8eca5","0x54e192cd0cdbdbfb5bc5c06174693694b16c433e1acf71871533a822338dc31a","0x68d8d23e7f893b778eb05bd7298e4fd36a17f0dbb4d9068cdafc1fe4253243b6","0xfdc692b99c885d2047c16ec306da0720dd0210f7614716e7720577eb214fc39e","0xe8548c705f915c13a4d9f547f7cae3b21c4e736dc545432f8d711f19fe9cd721","0x3a9c7db3036da51117d7244445712d858b52201df693b936cb91989442ef22cf","0xe10d49f61a9e977c6c5673278c40f6f618cbfb6718a257f83d32175e1057ccff","0xab03f994e341c7df7c057ee8640d3d55bd9c628fb92d0341de5d3a6a77486adf","0xf69cf01e515e948f61ff60d1aa86aa04482ee0d81d732e99f0036039a1ced0a1","0x8af67d5b3d07c3972c7c80c8edad9897e532dcb706272e41e6411454bb441aa2","0x7ec9340abcfaa9508b372e587cb6005b511b6a33d1f1f3aeca12794e49dc74fa","0xc34073384804ccd660cae048788ac8c75fb80db704e84dce91c448075ff6e753","0x161f9eee6dfe1a8a6465e7a96dba1628792cb1cfe9e04a32306c61bc6d87c8ff","0x90065d92b70e3d3926c944cd453596d7461b0cf99fffd289d1c0d6e2d9a8cae5","0x679fd89980ca437d5a02d79ea16cbc451278f75f423e7b4d16435f5db43b5ea4","0xe8969115ba95c7ebeb4b4cb7e7c26de513f494f0931330a541621f0146065b8f","0xe9a0e25c0a1f3eddd75c387b0b80f57713e0861366d3d8ea91e0b60edb69caff","0x580f85caadb6681d62ddf9925a380669a0030447e8aa4524a8b1d20d71b58e32","0x619465648a9e8fbf67d2944f0173b3e12703f2cf18e205d549290fa15ad0d30f","0xa882f9f84185b1847d02716cfbd577ffd693d8c21d075cf121ac60f0e4c64a95","0x827074c920f8a48f0b16fd7726dfa45e78fc99503b3c9e0b639b0f6aa1d90211","0x3642a7037a47c4951ee04044fe25c924f93b7d92fdabb63218adb72bef60d74a","0x7aa9ad72208ad5e91a5abe1bd520cbb0b4ad330a0574c1b9428e19b4d01b1a6d","0xf64125824af9f5ddb3662f773068c37467dfe9a93b490bbcf39b5c68a7333e9c","0xbb627a5d16dad6144c0ee4a31fbd8441bf6ac83de6227457441ffdabadc1c297"]},{"address":"0xb3e68c4287df2b2a5045319a9d87d8b513f2cf60","storageKeys":[]},{"address":"0xf338cad020d506e8e3d9b4854986e0ece6c23640","storageKeys":["0x04e7be39f2fb63cfd7d4fcfe19f108bc6b411ed972d99fca0a47dcaff878ce5e","0x71a8ef1b1265359d77973c3524afac225c0a0d829a0d4da5cac3b34532019fee","0x71a8ef1b1265359d77973c3524afac225c0a0d829a0d4da5cac3b34532019fec","0x177667240aeeea7e35eabe3a35e18306f336219e1386f7710a6bf8783f761b24","0xc3312d608c59a50378089ddba3e807885a8eea46b12e8c273bda8b229030e943","0x71a8ef1b1265359d77973c3524afac225c0a0d829a0d4da5cac3b34532019fed","0xb4c82a817c6e58e43d4ecb2529caab94383420d8f31e963cfe54dfe32d2cca56","0x8cde0e99a4532474b22bd3952cb1c6b00478babd3678337325283f4f48110fc4"]},{"address":"0xe1c9eae59ed343ed94b15f7304fa9fa55fc87901","storageKeys":[]},{"address":"0x2260fac5e5542a773aa44fbcfedf7c193bc2c599","storageKeys":["0x052e713d101c7dfed5314e4b3b8ecf07e42b12c3bf502e120438fddbb4b372bd","0x00a4acab033aa095db85c6c6f6d1c98cf2a1f0630c05c2e4e0fb9e1e721b8923","0x356ea57d585b4c2292ee2a39c9da213499f25d18b4fba5671c7bc01208e40e2e","0xcaec8a8f8eb95ddd46491e5028a5c5690dab389786f3ec23ea22fc46b450b8ec","0x1b14b3855f214cd4545c9c99e89917f9b978e4654b1014a77a720ed79dcd11eb","0x0000000000000000000000000000000000000000000000000000000000000005","0xdc276a4f120117ad5ae6415d1c724b4f3a0e81f0ee6466e1392ca121b63123f2"]},{"address":"0xd56e4eab23cb81f43168f9f45211eb027b9ac7cc","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000004","0xf2cf4f001b7751b7906e2fa0ceafcd025a53d63797880ae8c58702c57f330040","0xfcee78d815aefb30303e1ea7c2dfdb88e0545eddd31e2ab3e4f3c619cb5bf9b1","0x0bbfc09c26c227f6ffecac6e95d4e9aaffa3bdffd2a93f6c1c3e1f09f8419b89"]},{"address":"0x6d4ff7b8cda876bf6334cb7ea14ad251269f10dd","storageKeys":[]},{"address":"0x2febe3d60bb2bbdab135c740617241c2eb949635","storageKeys":[]},{"address":"0x21a8f7ff1700fb57a6376fec4d724c8d70f0c0e8","storageKeys":[]},{"address":"0xb4e16d0168e52d35cacd2c6185b44281ec28c9dc","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c"]},{"address":"0x3af7a58d54cf014675af2b7ebc222c3166bf5692","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x000000000000000000000000000000000000000000000000000000000000000d"]},{"address":"0x2cc846fff0b08fb3bffad71f53a60b4b6e6d6482","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a"]},{"address":"0x71ffb68713427fc0729878f15725946f87f3abc0","storageKeys":[]},{"address":"0x3681a3feed68414617d61aeed92ca5c13eb2ae4a","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009"]},{"address":"0x3e8203e0b1d56984abc66f183a8d0b1a09a7e607","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000012","0x22da7386e7384013b8b0e0eab6013e51bc14487cd4f71c21f8c1aca4a593c0b5","0x0000000000000000000000000000000000000000000000000000000000000019","0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000021","0x22bab0d86ee9e5a32bf4b00cb61bb7975afaf6b027cd25a954c9f2adc572f83a","0x0000000000000000000000000000000000000000000000000000000000000018","0xf3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3","0x0000000000000000000000000000000000000000000000000000000000000023","0x0000000000000000000000000000000000000000000000000000000000000010","0xf657f330be1ff39cfb8bcb4370a28f5a63d0c6bbae6ac3fdc1da2e4422549b99","0xe67de4fd790d3642fc767cec4a616dbfce123aebdb50b105e4c91b47053ddfcf","0xe43668e1da3dbefcdbac19ac441486be8dc03500c9e9b4105eb9e5e707d16638","0x000000000000000000000000000000000000000000000000000000000000001b","0x9e49368312a610e1b59de9f171d03178c159cfe73dfe9c10b5202bbe67cd9eab","0x000000000000000000000000000000000000000000000000000000000000000e","0x03e2ff5308e20dacbd485b2d059815970e9b4b3c639b0aa5be885878d677109e","0x1dcff9e2b0cbaf7fb3cbcbd96f31c186b6901f9ebfc188ceb23d20747fcf6918","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000014","0x7b577e76552893e772ee3df90920319622b8d8bb5d0f05c3a2fcaef264457fb5","0x000000000000000000000000000000000000000000000000000000000000001a","0xf6f889e00f165c05cfe0e9c32a9e24ba92657b3b48ca61cf3dba042c632ca006","0x2e941662505a0bb7707ee19bcb50ae11ef209818a240452e985e0785fd5f4de1","0x0000000000000000000000000000000000000000000000000000000000000011","0x000000000000000000000000000000000000000000000000000000000000000f","0x0000000000000000000000000000000000000000000000000000000000000015"]},{"address":"0x7e36a54de4a80c7eb0dfa19d49970859342b6088","storageKeys":[]},{"address":"0x6b175474e89094c44da98b954eedeac495271d0f","storageKeys":["0x04db8a9a7171fb7593380b2a759860db96c691037dd1730d6df126c8dc6b476d","0x4fb38d85aff6908084a3b22b658c7c8245ce26407000e572dd57d3f7427294aa","0x087cdfc3f958d19871f77e823f3d49c055bfcf2784ad091abd6711952805b743","0xc526f387ba5a6e8a3778c35b502ab9315ce32a0a38fd2aa5297ebd8a096dbe09","0x3f3fa626cadeb84e2412c7f44d63d161dc1bd7468fa15ee7dd343d73a77ad976","0x8d6dbee51e7ed8c69be5b5843bab1a532f2138afc261fa876ed411944ffc11c0","0x7c084f6f66f1854b5ac1915798e31bad160857bb415bd586c5b093ebc7437f78","0x681168423d09613df05fac62ebf0625d4a0cdb34dd5731f45b107a94a0a954ce","0x995f3b129dd3291868ddb9cf202c75cd985227d50e309847fbab0f8da403b19c","0x54e6dc5f26999e6ee90a8e4bd6e25ecf0c1ed7180477980112bd9b489b59ef69","0xb96c55d5df378893c8064f21edccda141cbffec5b2218d2455c9bcf754ab2fb0"]},{"address":"0x17144556fd3424edc8fc8a4c940b2d04936d17eb","storageKeys":[]},{"address":"0x390b355bd20e18157943ed4deaa365c9a14f4cec","storageKeys":[]},{"address":"0x84b33840d8b6aecec69dc5737b56d38111f4dfc2","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a"]},{"address":"0xeaa2691fe9c8cef93ccbc1b4b1e4f3ce02678942","storageKeys":[]},{"address":"0xe2f5dc546468219d690491b01528c435c086c479","storageKeys":[]},{"address":"0xbf2d58698a8a215f868cf24baba360c77266b466","storageKeys":[]},{"address":"0xfba175fe8169f08eb02239ca1b235a8e13415204","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000011","0x1db31a77d83515140733d92a828edff20a22f4b08a586faf486be16e18e3144e","0xc569b77ac39a04580cfd54b731b92b0002c2cb0857b90e43466ce272b46be61e","0x8530a0d4095c64814ef3458d8dcf20cbf180a0b68ebbaa499bd7af70a4cc7acb","0xd9d4794f24ffd60edd516aca85cd25e5e064e8754738553806b1de0375ff3d91","0x293b3e8f34d466a275078c9f806ab730f2683086814edf12bfb0d4f76f57884f","0xee722d724c89bf250dae10049726c7ead1476357b09d9efbec404caf9ea81e72","0xd66a6bd151c33df771e54063f5b6f6d5270eb4da11cf017c73de72cbb54c303c","0x000000000000000000000000000000000000000000000000000000000000000b","0x000000000000000000000000000000000000000000000000000000000000000e","0x1a5ac45ce58dd08a4f8b471882e2e937695c44b1b634d24cee7aaf8f478ab34b","0xb368d2fca3322278dbe10ccc2e6a97fa6b8e57dcea66c992783d3d66b26bcd95","0x3bdbca05285fc70b92d87d8c7b9e489bf0787dc47751ba4fb70ff7a65e9bb3a2","0x000000000000000000000000000000000000000000000000000000000000000c","0xdb14bc50192e7ce116773e9c3286486770cc4da887084f2a309d4a898c510760","0x3243cf6777a245db124589859667a703d4591bc88c4202c218e4fc7b83c0201d","0xe63003dfdc2ad53f193d4c003e5ea6b8e25cf2ba83ebc2e44e14579c0e18ca31","0xf2c535f78bbf70e8c137acb4e29e2f986545c919fc7214c8b5be774e28c99ce8","0x736fbedc083efaa4e5193d759f0f4fe1e6b457d2fef84f4c9bf186a414f0fccb","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000014"]},{"address":"0x2e603c8b383cc2da79d9562c5cde43368a273c70","storageKeys":[]},{"address":"0x35dd2a56be07c524fe18e1b9bc70c3523412591f","storageKeys":[]},{"address":"0xb66caea47f6837b5a6c8903d9c4add6ee364ce88","storageKeys":["0x63410062b002d55c3fb0530eb3c8aab04c5014aa81e71894d8f348e476002d02","0x49d7d0ceb37c146d7a17fb8b8e0a7193c74c349205bd131d220bee52b16a802b","0x78a7534cff2eb171df0b13bafcb2e4d2c049f4c9c3937ce0beee553cd6c9cced","0xbc0bfe0391f5edf76cba199b3698a8564bf8cdbe6f295db6e71646f43933e251","0xefbce2a8ff2d467e309d9248a4b22cbaa3390df6f9ad4715abf30f5eeae1d193","0x000000000000000000000000000000000000000000000000000000000000001b","0x0000000000000000000000000000000000000000000000000000000000000016","0x071b2418c6d1ea596b22ae88f167a63abd3e6ac2445d94841cc5b382f3d895c1","0x59556234a3eb3e6887ccf5e1b8ab3b8125968105007a19b2d9468be8b6c04d23","0xd46460e0ec4be8776950adcf76016e20c1ae55682b188e96bab57b3cdf10a223","0xd9107ffbbefa9a6d40a901247f7d06507b70334ffb39810213af00e69ef9b388","0xe52520f11be5c5ce5af0e06272eac9767c9dd1aa8ce1d6080b7608a2e893a3d2","0xfbfe3afd500acc83f4067ce056512b3e90b74bb147ad84f7edfea8ae1b748f13","0xe52520f11be5c5ce5af0e06272eac9767c9dd1aa8ce1d6080b7608a2e893a3d1","0x4868b5b24a5f92abef98244231e6896c8727f0e313fdcf0b4f04fcb61de21a68"]},{"address":"0x26efae46a0a71254fa6bd591645366cb94df58a1","storageKeys":[]},{"address":"0xa2f1f3a93921299f071a002b77a5f3175492bc6a","storageKeys":[]},{"address":"0x4c6199d5b6b78b3c55fb76c99eaaf2dd2b3637b5","storageKeys":[]},{"address":"0x3772f434d796a1b974e9b2cd37055a075f3450be","storageKeys":[]},{"address":"0x60594a405d53811d3bc4766596efd80fd545a270","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000067","0x0000000000000000000000000000000000000000000000000000000000000068","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000001","0x608d093ce9933575d78c0796ab9cdc4f1c4212394db9b5269ffa8fa22c833167"]},{"address":"0xd7e7812eb4b8fd2ac5ca513462f4ba12ecb53668","storageKeys":[]},{"address":"0xb8ffc3cd6e7cf5a098a1c92f48009765b24088dc","storageKeys":["0x8e2ed18767e9c33b25344c240cdf92034fae56be99e2c07f3d9946d949ffede4","0x54b2b2de1ae6731a04bdbca30cee71852851cfcd3298aaf29f4ebff9452b27ad"]},{"address":"0xb83d1d5f27a8fecdb558ddae44f2f5c8745e144b","storageKeys":[]},{"address":"0x1e0049783f008a0085193e00003d00cd54003c71","storageKeys":["0x73f81e05fe78bb9c03fd7e2026f0245c29102ff947eddf738e68a7faea7f48aa"]},{"address":"0xde67d97b8770dc98c746a3fc0093c538666eb493","storageKeys":["0x4d6bbdd6edd059f5ed1660e5ccd93b3af967cef7cd64982664490e4cff130c72","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000015","0x297181afc54b2ba549f189851a59f18fea399e60347a4e41e094460f6a2e3e34","0x35528b0820763386b11dfb6410f172487a972e4592d19974cf10cbec94c9ab35"]},{"address":"0xb517850510997a34b4ddc8c3797b4f83fad510c4","storageKeys":["0x16c3acdf1215b5b570b5070dd2e9093e7da84bab9412de668f6703a7faf39c85","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x00000000000000000000000000000000000000000000000000000000000000fb","0x00000000000000000000000000000000000000000000000000000000000000c9"]},{"address":"0xa8eb808142ba183aa9208884cb036dfd72565358","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007"]},{"address":"0xae7ab96520de3a18e5e111b5eaab095312d7fe84","storageKeys":["0xd625496217aa6a3453eecb9c3489dc5a53e6c67b444329ea2b2cbc9ff547639b","0x4172f0f7d2289153072b0a6ca36959e0cbe2efc3afe50fc81636caa96338137b","0xe3b4b636e601189b5f4c6742edf2538ac12bb61ed03e6da26949d69838fa447e","0xe6e35175eb53fc006520a2a9c3e9711a7c00de6ff2c32dd31df8c5a24cac1b5c","0x9f70001d82b6ef54e9d3725b46581c3eb9ee3aa02b941b6aa54d678a9ca35b10","0xa66d35f054e68143c18f32c990ed5cb972bb68a68f500cd2dd3a16bbf3686483","0xed310af23f61f96daefbcd140b306c0bdbf8c178398299741687b90e794772b0"]},{"address":"0xf40442e1cb0bdfb496e8b7405d0c1c48a81bc897","storageKeys":[]},{"address":"0x6de037ef9ad2725eb40118bb1702ebb27e4aeb24","storageKeys":["0x10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b","0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3","0xf29cdd059219383448e8b463b31f88f5e17e69c1c7262cd3b2b0c57147c048d6","0x500ef09e5ec8999aa7b0386488d1a60d5cc53034ca9dc2c8d68511efe382ef29"]},{"address":"0x1a8f43e01b78979eb4ef7febec60f32c9a72f58e","storageKeys":["0x92adc54cfc27c30164aeaeb7c83bf6f1b6463b994636e51a9794110a2b7e52dd","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000009","0xfdae37e3434e79028be248d41b9fe7ae364004949a54682800cf6ba4f6a21972","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000000","0xfb19a963956c9cb662dd3ae48988c4b90766df71ea130109840abe0a1b23dba8"]},{"address":"0x704ad8d95c12d7fea531738faa94402725acb035","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009"]},{"address":"0x950b9476a4de757bb134483029ac4ec17e739e3a","storageKeys":["0x46a6e53d551b9833625df9c3a93d8af4eed716592e9724af536dd5ef5f4d9171","0x3aff6944490d4628833f7b03ee999b6e6948ffcfba03d269cdadc1875a2e121f","0x218e215545a5505f300b7929ebaec4834475afd6f0ef424ac17d535fb2f7c66d","0xa4e0f4432e44d027a7b3f953940f096bca7a9bd910297cad2ba7c703c2b799d3","0xac375bcb880242328180c23d4a918023a12a7caf7cf12b8c4074e4a3f39900a0","0x0ca380e29b2a92f4cecd71f571f5161c9e98972ab0de316c8c227b4837ef115b","0x106c30a0c68ea09535b7105caccd49caa649caa256e85d87cf2098d10f72d4e0","0x7fecc9f0b925868a8c62ee842da0498074146a036d84a1041d9b5286786bbbf3"]},{"address":"0x80c67432656d59144ceff962e8faf8926599bcf8","storageKeys":[]},{"address":"0xf326e4de8f66a0bdc0970b79e0924e33c79f1915","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000"]},{"address":"0xb23360ccdd9ed1b15d45e5d3824bb409c8d7c460","storageKeys":[]},{"address":"0x9e448f9eb9bad39a0db647c58d8869694183955a","storageKeys":[]},{"address":"0x264bd8291fae1d75db2c5f573b07faa6715997b5","storageKeys":[]},{"address":"0xc7c12de0a55e7ff69a4f2f1e6cfcd576de46026f","storageKeys":[]},{"address":"0xb4babdf623a35b422bfacf05c46d0d93e0d9ae15","storageKeys":[]},{"address":"0xd0c3a07c337c5f0adf508c0cc57d5e5cac743569","storageKeys":[]},{"address":"0xdea04ef31c4b4fdf31cb58923f37869739280d49","storageKeys":[]},{"address":"0x71fd862131bf9f2a5ab9516adec6d50158fae290","storageKeys":[]},{"address":"0x88b3fcdf182bd1ed3c26c7708f1506530239c1a2","storageKeys":[]},{"address":"0xae2d4617c862309a3d75a0ffb358c7a5009c673f","storageKeys":[]},{"address":"0xf1cd4193bbc1ad4a23e833170f49d60f3d35a621","storageKeys":[]},{"address":"0x2fe4516fb4765f98ca46c9df28117c778e360ee0","storageKeys":[]},{"address":"0x427e25f2b424acece4bd84373c6dc82d053e4b3f","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000002","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000009","0x590aab03823cbfe5677ac1252eb631f53fed2bef0fa2c2020d3a50ca1770470b","0x000000000000000000000000000000000000000000000000000000000000000c","0x000000000000000000000000000000000000000000000000000000000000000b","0x0000000000000000000000000000000000000000000000000000000000000006","0x000000000000000000000000000000000000000000000000000000000000000d"]},{"address":"0xdb5889e35e379ef0498aae126fc2cce1fbd23216","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000000"]},{"address":"0x7effd7b47bfd17e52fb7559d3f924201b9dbff3d","storageKeys":[]},{"address":"0x178e339e943b0f5e335d2eeed6705e2d9f41d0c0","storageKeys":[]},{"address":"0x4585fe77225b41b697c938b018e2ac67ac5a20c0","storageKeys":["0xa696a7b979ad574bf4e83f51a549d5d6736ff47df8edbe133e71a85594b49abe","0xda68a2b0ee7b27d8019056d24355431b45445782c03a0d5406e6b848a631a249","0x3867a2045a42206490794a81e52a245b12e19358951cad31da7027b2e23c0840","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000105","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000106","0xa696a7b979ad574bf4e83f51a549d5d6736ff47df8edbe133e71a85594b49abc","0x3867a2045a42206490794a81e52a245b12e19358951cad31da7027b2e23c083e","0x3867a2045a42206490794a81e52a245b12e19358951cad31da7027b2e23c083f","0xda68a2b0ee7b27d8019056d24355431b45445782c03a0d5406e6b848a631a24a","0x0000000000000000000000000000000000000000000000000000000000000001","0xa696a7b979ad574bf4e83f51a549d5d6736ff47df8edbe133e71a85594b49abd","0xa696a7b979ad574bf4e83f51a549d5d6736ff47df8edbe133e71a85594b49abf","0x0000000000000000000000000000000000000000000000000000000000000002","0xda68a2b0ee7b27d8019056d24355431b45445782c03a0d5406e6b848a631a24b","0xa00e9f45e9f0c328446d13a90db1b8ff531c4946ba6a4294a1ec03159cc44b19"]},{"address":"0x683fd5839bf6711be73e6cd5aa4c805d032b96f7","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c"]},{"address":"0xe0f63a424a4439cbe457d80e4f4b51ad25b2c56c","storageKeys":["0x4a885becab37135dd1bb6dc512c3ddeed605266f4d312ff6362f618ca16aed86"]},{"address":"0xf95b14ee10bd94ef1ab15da46ff0d69bcac5598e","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006"]},{"address":"0xb2bc06a4efb20fc6553a69dbfa49b7be938034a7","storageKeys":[]},{"address":"0xb048ed71007ade3b3172bc6d95781833ffa3aac5","storageKeys":["0xf92893360e87d38188b7b11fa248b88db93df7bf196c713536fab10a7c72dbc7"]},{"address":"0xa6cc3c2531fdaa6ae1a3ca84c2855806728693e8","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000056","0x0000000000000000000000000000000000000000000000000000000000000004","0x94b5af2648d8bbf7f61cf41232d677e208c2ba32ec73634db3281961f4b1b51f","0x0000000000000000000000000000000000000000000000000000000000000055","0x94b5af2648d8bbf7f61cf41232d677e208c2ba32ec73634db3281961f4b1b51d","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000001","0x615166b9cbba118384f9cf85d8ef8b07ed80d030b17f0ee6aa1bee659db2e942","0x615166b9cbba118384f9cf85d8ef8b07ed80d030b17f0ee6aa1bee659db2e944","0xb3767fe4d30c6b9e60049d3282750cb051a11ac76538d7d1a87ca17a1227c17a","0x615166b9cbba118384f9cf85d8ef8b07ed80d030b17f0ee6aa1bee659db2e943","0x94b5af2648d8bbf7f61cf41232d677e208c2ba32ec73634db3281961f4b1b51e","0xb3767fe4d30c6b9e60049d3282750cb051a11ac76538d7d1a87ca17a1227c17b","0x0000000000000000000000000000000000000000000000000000000000000002","0xb3767fe4d30c6b9e60049d3282750cb051a11ac76538d7d1a87ca17a1227c179","0x94b5af2648d8bbf7f61cf41232d677e208c2ba32ec73634db3281961f4b1b520"]},{"address":"0x00000000000000adc04c56bf30ac9d3c0aaf14dc","storageKeys":["0x022b6f42361329fd836e22b5c31caf61e5478234cb6b15081bdb43d6f1dce6f4","0x539f613f5498b05c84ed7035772e0c3bebb1ad2d602d9be516fd1c6b588b56d3","0x0000000000000000000000000000000000000000000000000000000000000000"]},{"address":"0xe0bf1e7699410dc28a6473fbe92441b933ac7b33","storageKeys":[]},{"address":"0xae93e3f7752207c9dce8b6702cd14599a333a2ae","storageKeys":[]},{"address":"0xc7c53760375530e5af29fded5e13989325299382","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000016","0xcb00161c7650001830cf85bb4e8b9beff8b0fcaddc915b258ce8987aca5dd2e6","0xbda2b1a2a3e35ca431f3c4b50639098537d215591b9ca3db95c24c01795a9981","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000000000000000000000000000000000000000000d","0x0000000000000000000000000000000000000000000000000000000000000013","0x0000000000000000000000000000000000000000000000000000000000000010","0x000000000000000000000000000000000000000000000000000000000000000b","0x000000000000000000000000000000000000000000000000000000000000000c","0xf365b8316b064b730f6cf89a512b8e5e020bb7f2feb79299834dcdd73a7a6dcc","0x000000000000000000000000000000000000000000000000000000000000000e","0x51d155e8243cd6886ab3b36f59778d90f3bbb4af820bc2d4536b23ca13814bfb"]},{"address":"0xa79c2ff668e705c67addeddf31bbae68649bbf14","storageKeys":[]},{"address":"0x44affdf87abfb1dba08e444141bd21b4380fa35f","storageKeys":[]},{"address":"0x5aed5f8a1e3607476f1f81c3d8fe126deb0afe94","storageKeys":[]},{"address":"0x75e89d5979e4f6fba9f97c104c2f0afb3f1dcb88","storageKeys":[]},{"address":"0x5f607daee0670a2d1845c3bd2ee785e6cf56d8f4","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a"]},{"address":"0x613167fba619ff20f4a3bddeeab8d37ab58490ae","storageKeys":["0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x2189af69914090827b39f477d39f67203c24566e82392e5681d00d25df09c1fa","0x0000000000000000000000000000000000000000000000000000000000000097","0xdf7c8d17722358ef1227553d8f065865328352819b18fa48befdedcb4ca45a60"]},{"address":"0x77e3e957082ca648c1c5b0f3e6aec00ab1245186","storageKeys":[]},{"address":"0x1e6896cab8e257259da4ca417c8394388ac00247","storageKeys":[]},{"address":"0xa2327a938febf5fec13bacfb16ae10ecbc4cbdcf","storageKeys":[]},{"address":"0xac725cb59d16c81061bdea61041a8a5e73da9ec6","storageKeys":[]},{"address":"0x1a1fdf27c5e6784d1cebf256a8a5cc0877e73af0","storageKeys":[]},{"address":"0x5f1ee29361206f1a129e808736f11598356c6031","storageKeys":[]},{"address":"0xacde14125cbfcc67748493970b8627591c3e5bb6","storageKeys":[]},{"address":"0xf081470f5c6fbccf48cc4e5b82dd926409dcdd67","storageKeys":["0xe40d3ae7fd0bd55e59bf884b9ace5f6033b7677a86ce682f78aceee7d91b5ef6","0x29bf3886dd698f1aa9baebc2edaefbf66002dc935f7e18dc4c3dd04a82a1c337","0xc35f240c1c9bdd9967b90a65ab972af57d57fbc19a964cb938b278c5c131c297","0x9932588c857b0691792b49bc2500676cf28f18fb0177f2f1fd3490fb07babb72"]},{"address":"0x4f91ad1a0397b763fc653b4cfe4f836915bfcd84","storageKeys":[]},{"address":"0x696cfd63f98dcd1fea2d6bd27f3cf85c2007a2fd","storageKeys":[]},{"address":"0x8b63b3de93431c0f756a493644d128134291fa1b","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000004","0x0e82e3e1b9d5a0116e5669200b5680c00380f5a2dab56ade7031bbf68c4ccff3","0x7ea31f258d6f8210210222b24345878b497bc85e6020c774d6cc20a576996b4a"]},{"address":"0xc7d5b566312ec222b414b5cfc838bcc42da0069e","storageKeys":[]},{"address":"0x70e3849741f66d2805e41a5b63e16e84c1e4a307","storageKeys":[]},{"address":"0x7aa4d942664b5234fcd134c9187abb33b5e2e409","storageKeys":[]},{"address":"0xb504035a11e672e12a099f32b1672b9c4a78b22f","storageKeys":["0xc6639ab8cdce885c8f0000d455407dbabbaf3b9e9007da6f8c17d29de6bcb1c5","0xb8b42861fd634235fd711526bb36fce5cc0a33e74a143ed227110e4529d92373"]},{"address":"0x881d40237659c251811cec9c364ef91dc08d300c","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000001","0x684fdb4b219d1c63474e6c8e4dc8c2611de744d4aaa2b78c4ec411ebb6ba9756","0x684fdb4b219d1c63474e6c8e4dc8c2611de744d4aaa2b78c4ec411ebb6ba9757"]},{"address":"0xea5b523263bea6a5574858528bd591a3c2bea0f6","storageKeys":[]},{"address":"0x5fa60726e62c50af45ff2f6280c468da438a7837","storageKeys":[]},{"address":"0x47a799b28ecdc47349c50e72d61366eec97d3b5e","storageKeys":[]},{"address":"0x59354356ec5d56306791873f567d61ebf11dfbd5","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000001","0x4a6f485c1c32cc07b41a962ff745e1d2a15f32520f92181d93f06ac057458486","0x0000000000000000000000000000000000000000000000000000000000000008"]},{"address":"0xcaa79bf8b1d00bf3d4f6dbec6221955871c04618","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000007","0xf416def3a5a22eaf3e1fc3b98b393f3028381ddbd4f36fa689a624bac7fe426c","0xc964205cc068da10d7cac93a3be41fa1744560e88f6a7b0dd655fd2479154352","0x31918e36d6f6221ec8a7be287da50275918cda8b12ad4b8fa59a2836a35969cc","0xe0add72c4f545437ce3b7ad8c8b05f92acbd685f4e42b6685dd483a1ce862f1e","0x60f0e0e5c8e4388e81d20c61cf5465c82042f80a32def57804152f4c71d7e3c3","0xee1019bd099648c445a31f9961ee9089ce36583414f597d08f6deba971616f27","0x0000000000000000000000000000000000000000000000000000000000000012","0x01c1e71c97b2251e06fd465d619f598451d15e9f42d08d86cc907038cdde5662","0x0000000000000000000000000000000000000000000000000000000000000014","0x7883b676ceb098c43b0cb5d1195abfcc8a4d6043669eb6043f622849d207993c","0x811f77293405650ce95d226c5d89598584b7df80416299f52f704ae6ce31012d","0xeea18d0f317f5eeead59e52fdb0579a32b3480e2a13505417495a3dd19d38c04"]},{"address":"0x2b33cf282f867a7ff693a66e11b0fcc5552e4425","storageKeys":[]},{"address":"0x74a8acdbeb7638e0e65d58c0db49c70b2bc849c4","storageKeys":[]},{"address":"0xb0fe3d292f4bd50de902ba5bdf120ad66e9d7a39","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000003a","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x000000000000000000000000000000000000000000000000000000000000003f"]},{"address":"0xb780f8b02a7dcddefd2d53c82709c389618d9503","storageKeys":[]},{"address":"0x3a23f943181408eac424116af7b7790c94cb97a5","storageKeys":[]},{"address":"0xd74a355a52fd198abde16745c93f33dd3889e05d","storageKeys":[]},{"address":"0x73ce7912501be775a693fb3a641eca8216b18b13","storageKeys":["0x20de30300db9b2d46f45ef3798c883c649ebfb03953fa78198d91713f3132be2","0x0000000000000000000000000000000000000000000000000000000000000010","0x811ed8545df87e67ad2ee9dd5566d9aec2bfdaa46d98de545284f0229cf26b12","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000b","0x5c83d9320a9a25da893c14228f60de0a08c6b7bb94e4088eeee36c1b9a31c4a4","0x0000000000000000000000000000000000000000000000000000000000000000","0x5150b13f294230203b0c9f0dd5ffac4da0e5829a228b6c848fe1712159784722","0x000000000000000000000000000000000000000000000000000000000000000a","0x000000000000000000000000000000000000000000000000000000000000000d","0x0000000000000000000000000000000000000000000000000000000000000013","0x0000000000000000000000000000000000000000000000000000000000000009"]},{"address":"0xa964d693cd45fcbe4303524e0efe0988cff5ed08","storageKeys":[]},{"address":"0xf0c775c55aa67db748de84c051fcf1e7924606b3","storageKeys":[]},{"address":"0x549efb3c8365f3f222aaa44d9af7894cdafff083","storageKeys":[]},{"address":"0xe41d2489571d322189246dafa5ebde1f4699f498","storageKeys":["0xc0ec8fbf02d70b2873f5a76f503e97bd1b0ca8048ab517fad231214a74ebe459","0x393d76fe3f9d83a292390f16441925949594ab376ce97fe64775617375b6d0c1"]},{"address":"0x844bb374168e274497eb400fdfc84c78080a0273","storageKeys":[]},{"address":"0x24f79d5ea2baa92c4a0291fe6f490c02655114e8","storageKeys":[]},{"address":"0xaceb23f3d96a2e3be44306d9e57aaf9a0d1ffd74","storageKeys":[]},{"address":"0x3e9dd8088fe88472621f67ac502b784f0d852b71","storageKeys":[]},{"address":"0x2c169dfe5fbba12957bdd0ba47d9cedbfe260ca7","storageKeys":[]},{"address":"0xe7b67f44ea304dd7f6d215b13686637ff64cd2b2","storageKeys":[]},{"address":"0xecaa76cd531105d7b27af3102a00cc3d1d77d668","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000013","0xd5251b888f084a0847b74a07fcec92d4a4ce5607ea4ff372881aba9635cc62aa","0xeef1d7cfa8ee403eec37437a0a0bd7e40cf2168a6508c0c690027ff5c9288fb9","0x1aecba4ebe7a4e0673e4891b2b092b2228e4322380b579fb494fad3da8586e22","0x1cb2290fa01bc06b898e24a9564af4f4a9fe8d4a370d5098fa07a0c52f0c3736","0x0000000000000000000000000000000000000000000000000000000000000010","0x000000000000000000000000000000000000000000000000000000000000001f","0xce75195058e0cb3f19bbfda2061c7ed94ee4c2ef2ffedc737b2e7da02abb9d66","0xcd770edfade3f638a93e2d78005112fec7cb102f9668d0111ce229d3496d639c","0x000000000000000000000000000000000000000000000000000000000000000f","0x0000000000000000000000000000000000000000000000000000000000000018","0x494d4f6587f560916ea5a74b67a902caebf1439c8f83249c0be790c7288aee98","0x6aa3618f05ff6ef37a258b1fd4590b93f62d76684ba0bb794553e8a831b43cc2","0x0000000000000000000000000000000000000000000000000000000000000015","0x000000000000000000000000000000000000000000000000000000000000001d","0x0000000000000000000000000000000000000000000000000000000000000012","0x0000000000000000000000000000000000000000000000000000000000000004","0x000000000000000000000000000000000000000000000000000000000000000e","0x0000000000000000000000000000000000000000000000000000000000000005","0x3cd921fc8a9ca831dd992deeae1b337631482a0c2d9b444fd8398190e368e947"]},{"address":"0x48e65404141b7e592f87cbf20684187c70b12c47","storageKeys":[]},{"address":"0x986b5e1e1755e3c2440e960477f25201b0a8bbd4","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0x87870bca3f3fd6335c3f4ce8392d69350b4fa4e2","storageKeys":["0xed960c71bd5fa1333658850f076b35ec5565086b606556c3dd36a916b43ddf27","0xed960c71bd5fa1333658850f076b35ec5565086b606556c3dd36a916b43ddf29","0x6f7b2d87bc3f6727e3e7572341b4472281e770632f9f6d23b28495d1c2d3ab33","0xed960c71bd5fa1333658850f076b35ec5565086b606556c3dd36a916b43ddf21","0xed960c71bd5fa1333658850f076b35ec5565086b606556c3dd36a916b43ddf26","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0xed960c71bd5fa1333658850f076b35ec5565086b606556c3dd36a916b43ddf28","0x000000000000000000000000000000000000000000000000000000000000003b","0xed960c71bd5fa1333658850f076b35ec5565086b606556c3dd36a916b43ddf24","0xed960c71bd5fa1333658850f076b35ec5565086b606556c3dd36a916b43ddf25","0xed960c71bd5fa1333658850f076b35ec5565086b606556c3dd36a916b43ddf20","0xed960c71bd5fa1333658850f076b35ec5565086b606556c3dd36a916b43ddf23","0xed960c71bd5fa1333658850f076b35ec5565086b606556c3dd36a916b43ddf22","0xda23f9312458e5c4b201ecaba12aec89363f9010f101f0ecfd7be536102dc415"]},{"address":"0x4d73adb72bc3dd368966edd0f0b2148401a178e2","storageKeys":["0x2429e30b0558465f9e99f43765004d8af6f11ed28641cbf30de0c5eb8e7078f0","0xd9bf61c12ebbfb2c6a6a9998b18894eea69de16c4d1e199a1212f9a3ff50b863","0xa9966cf297886811b8a32882dd324f23f672f5ccd6bf17ebe1e72a723e2f5ade","0x0000000000000000000000000000000000000000000000000000000000000003","0x75a43ba0fdc2854916b0573b104f8f3b27e441d0274a726d97f7bafe2270ecdf","0xa0a8803ec561bd7e2c9289f2be2e311554d19ddc78e9804ddaf997fd66ed0bd8","0xa0a8803ec561bd7e2c9289f2be2e311554d19ddc78e9804ddaf997fd66ed0bd9","0x75a43ba0fdc2854916b0573b104f8f3b27e441d0274a726d97f7bafe2270ecde","0x6aa4d3f39b808918ebe9bc24c6a47543ee239542e25e34b0ac94a4b83cc1cd1f"]},{"address":"0x11b815efb8f581194ae79006d24e0d814b7697f6","storageKeys":["0x00000000000000000000000000000000000000000000000000000000000000a5","0x00000000000000000000000000000000000000000000000000000000000000a6","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000001","0x32d80bb380a6153715a380340a591610b4f5a62ca0809dce09eefe0e7c37ea7f"]},{"address":"0x79599c159eac39de4488abc0bdc9ffd48ed85e99","storageKeys":[]},{"address":"0xcdf7028ceab81fa0c6971208e83fa7872994bee5","storageKeys":["0x477cb59794ee11549015f55278236ff7c9b3cf854eef71fec701613efcb8d118"]},{"address":"0xed9cd4d668203b53a9b4f99e1358301126568043","storageKeys":[]},{"address":"0x4b715298676d294fb6b8bf02bdca969e4853f1b1","storageKeys":[]},{"address":"0x737e8a8b5f36a388638285d558f80af7fbcecb8a","storageKeys":["0x5ac6d4be4e02314ce9abcf7ab6a6d1e10a52c7b923194d53cb1e5c6c8a1a3826","0x3e76333f6dd7c6d0ff194a0d81288cd3f1f017a152767ba83882f5195d06c97f","0x4f57d121fc3719d837fa55d59a719dec9882fb0e1404927a023889b47cc699cf"]},{"address":"0xd257c132a1a9dcd89b38ca489c271af1ad7a4485","storageKeys":[]},{"address":"0x05cdb1526f6e224e02919a4c018d9784ea25eb3d","storageKeys":[]},{"address":"0x2c9c6a1931475f759f74dda373243e14dcb3ecfa","storageKeys":[]},{"address":"0x12e7d70dd369b4a7f649d5dc2e655730b417ac5f","storageKeys":[]},{"address":"0xcce6fdec93e5ea55c5cffb44a0fbb711eb31798d","storageKeys":["0x5589980fb8d19fe7ffe6b21a7b452f3fd3787159f43ecf3d5aed394b7c132a93","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000014","0x000000000000000000000000000000000000000000000000000000000000000b","0x40481169930ceb68601592e7fe58ca0f752959e58008d08277d97c6f321661e5","0x0000000000000000000000000000000000000000000000000000000000000000","0x7344fac072f5f99fba2247dafd1d5ff0e63b1a0089fdba04ee09a9ffdab04d7e","0x000000000000000000000000000000000000000000000000000000000000000a","0xfdae37e3434e79028be248d41b9fe7ae364004949a54682800cf6ba4f6a21972","0x0000000000000000000000000000000000000000000000000000000000000006","0x858275a96181a5cdbbc5e3eced9588d35b9894188ad73ac8c3b59657c100428a","0xf92893360e87d38188b7b11fa248b88db93df7bf196c713536fab10a7c72dbc7","0x000000000000000000000000000000000000000000000000000000000000000e","0x0000000000000000000000000000000000000000000000000000000000000011","0xded24ebb91cc2e4e7cd0b06373d908ba271d2e825a79f538f6d751d40ba5cba6"]},{"address":"0x8164cc65827dcfe994ab23944cbc90e0aa80bfcb","storageKeys":["0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0xad55efbb0ebf9f958bfa260d560c49e9831d25890cd7f7560cbad0d761c0610b"]},{"address":"0x142a774e8b52550e88e196cedd7a5835acb646d0","storageKeys":["0x6dc3cbd94c82e5fba3d7e32fcf56f0d6df40bc1d5c6e919ff3d61e8b089a9664","0x0000000000000000000000000000000000000000000000000000000000000021","0x0000000000000000000000000000000000000000000000000000000000000022","0x5f4385108fb3dccfeefba38cb57854d144ba2f9a81faef92ec53a8ce1eb9f1a4","0x0000000000000000000000000000000000000000000000000000000000000018","0x000000000000000000000000000000000000000000000000000000000000001f","0x000000000000000000000000000000000000000000000000000000000000001a","0x6990df4a0ac485ba17edd532d189268206ac41794061f2ae2b8fc72bd569e3bc","0x000000000000000000000000000000000000000000000000000000000000000b","0xdd6a3d9a9762a5e3a12b74d748e0aa5b1dd9b11605de083a9070b278002c2345","0xc784b38476a5110bb22151e095bede8ee50b4f72043b8b69a0a3f40dd7eaf995","0x24f1c4334087a2f469f06d62ba9c539abb268638212ae68c1d4d233460b7034c","0x0000000000000000000000000000000000000000000000000000000000000016","0x2b67638fd11c7a0062f0ea005a92b6a5652f987e7733223ece4e95598b833982","0x000000000000000000000000000000000000000000000000000000000000000c","0xea012beffad725ef8d1414e6930e3a37b9bac1a1fa2e07c7e3ffc268e883278e","0x0000000000000000000000000000000000000000000000000000000000000010","0x0000000000000000000000000000000000000000000000000000000000000020","0x175092dc81c37f277e4a216d01f8fced7869c858591d7535eff46e16fbdf2d32","0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000023","0x0000000000000000000000000000000000000000000000000000000000000017","0x3ebcf115573435053f9a659d8bda6bc1bd828f25806851fc1741ebcb3ba3c9a3","0x000000000000000000000000000000000000000000000000000000000000000a","0x9f4e0624e944c7635133b875955ed15d1f9523f1abdecb0e9d6114a5984fbf70","0xf3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3","0x0000000000000000000000000000000000000000000000000000000000000019","0xc81b96ca77ab138faafd2117088b0ccdfadcf8fad69b1c71a4ae113743367c7c","0xd6bdaeeaf7955cc6c862e620a7b9562cf54c3f47b208932e5eb43d3d5bbf3ba4","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000e","0xd2cf9c6e271112635ad6a2e14fba42fe9bfdc4e455d0c255dfa1eb160fea8f79"]},{"address":"0x09e050f40b3ccfaa568680bf0e459cf8dfc4157e","storageKeys":[]},{"address":"0x66a71dcef29a0ffbdbe3c6a460a3b5bc225cd675","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000008","0xc0c88364226e82fccafef42147d0cefbec72c096845af935f0a15898ffeb1aab","0xd80800ac9ff94760afd686e4dc2d6e3dcabc83f50634fca540bcc56a17eb644f"]},{"address":"0x6eccae385b8e17721721f8a1446ca73b94e14aeb","storageKeys":[]},{"address":"0x9476f8fccefcee23481f9fa5bb5d8bdf1f145f5c","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008"]},{"address":"0xe28b3b32b6c345a34ff64674606124dd5aceca30","storageKeys":["0x4fb110a88670106c39ba0fa6af41a3b0011447ffccfd709a88378934f577b5b9","0x75bfc36bfa90cdd40f14b94ce404dabb9f11d6876f7e15d94f0eb3e432185442","0xc7414059b081b5da51ec951d55a9324e37609fcd31865abc1b287dece56645dc"]},{"address":"0xef9080ae61c13c8d389b1811b5708fb363f39be1","storageKeys":[]},{"address":"0xef08a4d86a274584f744cd96a0b544898366f42a","storageKeys":[]},{"address":"0x27c334b79a894d76ca09f7cd1a117c7788dfc9ff","storageKeys":[]},{"address":"0xe219a14e355c1cb3f43594655a63488da154e8eb","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000007"]},{"address":"0x98c23e9d8f34fefb1b7bd6a91b7ff122f4e16f5c","storageKeys":["0xfac9df15455c372aa04c1e56d8d94645d6b43d1e518ab88852e3033e8316251a","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0xb9c5c39b5422df6e396faf10074fa9ea79b4af99fc4ab2bd674877e2fe84cfea","0x0000000000000000000000000000000000000000000000000000000000000036","0x0000000000000000000000000000000000000000000000000000000000000039","0x000000000000000000000000000000000000000000000000000000000000003d"]},{"address":"0x3466bb1787fd839e98453b707247ec2182f21c3a","storageKeys":[]},{"address":"0x92c2ea2fafe891758da0ed2ec2978acf1d4162fb","storageKeys":[]},{"address":"0x752ebeb79963cf0732e9c0fec72a49fd1defaeac","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000004","0x000000000000000000000000000000000000000000000000000000000000000f","0x0000000000000000000000000000000000000000000000000000000000000003"]},{"address":"0x4dbd4fc535ac27206064b68ffcf827b0a60bab3f","storageKeys":["0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x0000000000000000000000000000000000000000000000000000000000000033","0x0000000000000000000000000000000000000000000000000000000000000066","0x0000000000000000000000000000000000000000000000000000000000000065"]},{"address":"0x360fcfdb65b27ee8bf419249f3c81a98dacc8990","storageKeys":[]},{"address":"0xa0639194f3ec8ca873b29cda35bd40e5d58c0903","storageKeys":[]},{"address":"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48","storageKeys":["0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3","0x41730cfa8d2ce1ba1b00d3075cbe281ba1d82bd319f5a46c23b6ce267ca09fff","0x57d18af793d7300c4ba46d192ec7aa095070dde6c52c687c6d0d92fb8532b305","0x6375c028b85f0932b14a7d731820ad424bf97ef041478b336c5aa6ae1cc9536a","0x31485941e2ae2c65d6b3801f4ef00fd021a4398c1e864b8e06b6d12474a00046","0x678727a8e2288e3482b05b0bdadc40d88915d9389c43d9b51a4ca331325d28a1","0x644da698052ca806f7482115383dc7568e2e83062c1acee4505e8ba9e0bc586d","0x7ae84188dad39ac65698da6b247c2d7e504146b8fbe71a97d078fbb717de2d6b","0xef9aa6e78baadd9fa11efc775ebe24781e6dd67d28095a72c3297161bfcd60c2","0x432807238216b4cba128073b3b484e3fcf57d00db8de027187c1c042eadf055e","0x82fc8338773fc4426092c36a88f1631578741710523a800748804783a20f57a2","0x10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b","0x1ec4e3ff034654436090676552de103d2fc56a417d50a173971346df4c722f54","0xb374801ace2c02f5db0425ab5920a2b7ed1d5a00abbcd395fda7530ba1d666c0","0x56db3469fc9a9cb04bceb0c476dff5b6bceb0c8bbae1f5afacf1aa2ea3f54e32","0x4ac01ad812d5eac4698019823b7f6a507bc749124a4d82b1dd4c65e681cf7c39","0xa04dbf6d2c5c97758a4349e946774cd85f777c71336e93b1b6a55e23540779b4","0x0000000000000000000000000000000000000000000000000000000000000001","0xb6e478fd261351692c2fde70d34c4524b765362599337b83dc901944267e7327","0xaeaa20353bfe582a5362289abaea917959d6164741d3e508fbffe425c86f4aad","0xb1151b5f51c370d607b59e0034392dd388ea4cc8dded24ec75baf3df36983150","0x32aabe5d87581ea20da386c0272f0cfeb4ffd3e1520b843e63d95f6885c85fe5","0x4cd7297d874a4cc207b49596cea196ad5e86355c0be2885a3e38f238ac58b147","0xee61682ec263cf9ac626d5a9b0cd5e26edbfa98b5b368b540e65bd739c37e3b7","0xc8fac31b3a0f624c3c8b9d3731f19a160fe956fc08ce73a8eb71d93b044dac6d","0x3a3aec5717af62dfc0f5ede964a3e44cef7c5ba4453963ee6e3545ea9708690f","0xc18d4ff08a432753dc4c17af5cbdd67e25a3b29d92bbe5351b5fb0f6dd13b69e","0x6bd91fc796def7d7c1749500f210931bf5b3e9320a43a6f93ee41ee44001dfff","0x21bcf31c69d86fa40169c2eae710bca97372bf4d4c3eacb760f77048e805348e","0x73d637d229721ca538a0a2e9712eeef46a1889496c0a60f402b430eba28d4a2e","0xdf2d55c1c730751bd8d6ae9dd7f9119f5a3e768a8d42095280f33a24c681840a","0x5a39ffd580bbdbfa776c361f2c1049e2cd90a624d1d684c0d1cb0b254026c852","0xb32d74793294ba17c8da1fcbb8b1acea9f991830f9199dae7c9aaf973c38ea07","0x1f1a80db9a82d9fd4ea3322b7d2dcad52fb678229d487c4bb44e821a2544709f","0xf1c242ce12c9184b4b4566c6b26b3369df5c4937cd0b029fbc5f1b42ad7f2f53","0x1c04d27bf8d4776938551a82f41efc5bbc1f4ef2e02b660cddccd98e3d7126dc","0xfea107046c7bc4c4541e8a89f285b5920d226d60ade521e2341aa0d495e995c1","0xa62e24a23631140f20aac639aeed8206b56fabcd18a19242fda530cdb855c96f","0x9a434ef6696a19b05883323b0d4afad39d1fa7f6129229d28bc40fc2f196b5f9","0x4a243c1a59f9ff2138b2d322161d23c88708a10d04c0b64886c4f17d6676d2fa","0x531bc7e659321924488dbb9bdb03809af2eeaac7e550348dca6250fb67b82a6d","0xe1c5276fa12293fc2cabf8e1405950ad1e07898fd9f125e12298ee580270338a","0x368c3f5f03e5634b3e4381c9c3caac98f4d254c7027fd14b53436c90d060fef4","0x5cfa01b9a733d8746bc28fdd3f8992b7dd3bb6d323fe96a760fbd1b87ca3a2bd","0x9951e5c97f68238701a07028be91c5ba29bde0c65662546c454bab615c93f76a","0x11f4be56645defe59d18f308fb5a4acb077f963b56a2e58e6ab5f36c37abcd8a","0xf38289b9ebe269b557c627248e74eff04e2a6c6d0a0a0c99efbf27206076508f","0xccea43faabafcf2d6c9d45c7bfff0f39080f4d9997ad68aefabb9cbad3ef7ad3","0xcf4b1d382638e2c0bce0af1f6f9a3e11066694d52cdd94e5b8d8b000eb890f6b","0x645109e5be61e3aa7dc1268083df11ec36b1d104a7eb2ad98b0227c2c53c89b6","0x390f6178407c9b8e95802b8659e6df8e34c1e3d4f8d6a49e6132bbcdd937b63a","0xf2d53313cb644399924bc7ac73566f895c847f1ba79f63bc95efa3f39ec7c40d","0xebeae371187d174622df7f8a288ff80e4bb6664e82ce8cc1314e472dc24297a8","0x24b194ebe2dc12ed2d76a865393421499cb672ee4a0f3852e43f352aeddf227a","0x15d7a43c3a595454a812f5c7659d47d83de319cbb3b9462a445aea0204d7875b","0xc2e5dd65d36511a675f00d2c1cfee442e90176076028f30f85ced5fcbc35afed","0x2272303eba5d14e16687cdf8936028c295e364a52d2f6814680f3354d926150e","0x2790889919ab683a93d4271d4fe15fc1be878f84b6b702f22794331803c5dfaa","0x4b50a38a45993764c519945acea2535b1ba5f00812efc53cb43fe562c1dc7107","0x0000000000000000000000000000000000000000000000000000000000000006","0xe1e8e837f640f8c0cc533d0677093f2e8654a263155f1424c1004aeb0ecc2f2e","0x3f21e98b4315f6a41937a55122e729f4fe6505f0d4547474cc1726d7797565fa","0x313c730f2ec3e43def05de20522ad14243cf73dcedf21ff92a305a91d8fbcd24","0xfdc89995cbbe74245a80717b755801d54bac6c4d8fabe11c20b8077b26245ac0","0xd62e6b349005d4c8dbe90fed5428be37aa7780692e2d7aa5c41c7d9d443f8411","0x6eb029972b9991ddfe975cd44c3c4b50801662d5fd1e86e48c5c695eaa780d41","0x1f21a62c4538bacf2aabeca410f0fe63151869f172e03c0e00357ba26a341eff","0x28c0947f463362aab09a2d7896ccc847fb7e52633a16b978fb2caf3db1a9b8f8","0xee684e707a1cc7536e15baaa0ec9d3b2f3545171d927deee96b65c00ab35a9cd"]},{"address":"0x8b95a9f4a6959cc8a12cbcdba98f02e04a2a7737","storageKeys":[]},{"address":"0x0000000000000000000000000000000000000001","storageKeys":[]},{"address":"0xd3c7d0f62cac0e02669ee9c78496620ab143034b","storageKeys":[]},{"address":"0xfa3e941d1f6b7b10ed84a0c211bfa8aee907965e","storageKeys":["0xa59ab7d88c42bca28ce2ab1c7d20d0a720ce487402893b0804e07d5bec8b56b7","0x16d1086c95473ebfc9232806c39a89701297a6443f9c19234e86fe346ab0c7b9"]},{"address":"0x4150b9603bd87ae5c1aecdf4aa348699af1754da","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c"]},{"address":"0x6426a195cc7199240d7b57989c2bcfeb677726b8","storageKeys":[]},{"address":"0x797a05dd6a8bfc1e1eaaa62e744d3aff197c46b1","storageKeys":["0x534b98ee165a1f5262bd1a73460a488085e7298387b6f32ab42fd67303f01c4e","0xcadc17d6df60323062c6ddad440f897f800f401d222dcd5f85be63bc3d9c8b16"]},{"address":"0xe85294725c941e875910728c141d1f4dc040ef39","storageKeys":[]},{"address":"0x53b1dbe96c04260214629e36540fb6f7db852483","storageKeys":[]},{"address":"0x95ad61b0a150d79219dcf64e1e6cc01f0b64c4ce","storageKeys":["0xeeea55bf32804ce36029867ad77ef16d33e74d0d1361b89a2534a5c497f47caa","0x75bfc36bfa90cdd40f14b94ce404dabb9f11d6876f7e15d94f0eb3e432185442","0x63c8a87606e6b84a6868dcf6ddf505d107b8b7290e147cda8a4a40daa475dbdb"]},{"address":"0x3e0914fc2b3b67a476142020b7d6990d01ad234e","storageKeys":[]},{"address":"0xb430bbf4627b903cec745895aff1369898da7ae5","storageKeys":[]},{"address":"0x8315177ab297ba92a06054ce80a67ed4dbd7ed3a","storageKeys":["0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x584291d70ad4dde9dd8406c3f9db0464c54b9f80d25403cf7e0305c918871ae9","0x0000000000000000000000000000000000000000000000000000000000000006","0xf652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f378d470d","0xf652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f378d470e"]},{"address":"0x31bbea1796fdc8d1420aca89e80af923b6acbe55","storageKeys":[]},{"address":"0x94be6962be41377d5beda8dfe1b100f3bf0eacf3","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000005","0x000000000000000000000000000000000000000000000000000000000000000a","0x3c16d8355fa8e1c76dd6b21eddc4ba74efee70730f0e7aa8256409bb8c418e85","0x0000000000000000000000000000000000000000000000000000000000000007","0xf5a883109666f1bb6ac25a47fc22babd3c4bcc028a8a18486552f3190a6fcd96","0x3d4ab2e28b43f64ed00749d641c32eee9551eb374a42af249698a7a4b9996026","0x6b33ad2e7360b99ade43ec8cf27562e07d23bd5d5dd64f27fac179d9dd9b5f8f","0x8027e9943ec7dc0718d714a96ca222b82b54223b6fe14b9f3fe2da99b220cbb3","0xd4930a6d99a97127e356d3a226d94167e02c76c2ac894bc2854f0a9bd0fb0b6a","0x1b3085b822253d84d80b4e718218aefcbae7a1ff6d3e6a8d1b5779909945154c","0x0000000000000000000000000000000000000000000000000000000000000012","0xf90098839ff07b76b0d13e96a4eb2f9d11da5c27760cd3105897d343373678e6","0x2cba82cfd783d584da6efc59b78e0ff050fd6c5b00c100adf35cdcc1e7e5ec20","0x000000000000000000000000000000000000000000000000000000000000000b","0x2ae37e63af8f921481a06c3372d783b5f80bcb06783592e68e367a3a02bb7fd0","0x4d8311b1039c6515d900cb54596b2601a137e97e5982774e617644842152cafb","0x0000000000000000000000000000000000000000000000000000000000000010","0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000016"]},{"address":"0xfa2e85de5ee13cc2d0a3fe659d23f544146eaabb","storageKeys":[]},{"address":"0xd4c4044aca68ebbcb81b13cc2699e1bca2d3f458","storageKeys":[]},{"address":"0x3f8c0f3033b143af46f8f5c98c1759fd3dd92418","storageKeys":[]},{"address":"0x0c30062368eefb96bf3ade1218e685306b8e89fa","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000001a","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000001","0x8819ef417987f8ae7a81f42cdfb18815282fe989326fbff903d13cf0e03ace29","0x0000000000000000000000000000000000000000000000000000000000000019"]},{"address":"0x2f39d218133afab8f2b819b1066c7e434ad94e9e","storageKeys":["0x740f710666bd7a12af42df98311e541e47f7fd33d382d11602457a6d540cbd63"]},{"address":"0x7df70b612040c682d1cb2e32017446e230fcd747","storageKeys":[]},{"address":"0xad0c361ef902a7d9851ca7dcc85535da2d3c6fc7","storageKeys":[]},{"address":"0xb18e93158ecb9a2c0ebb9769a90b6b1d2cd760fa","storageKeys":[]},{"address":"0xad01c20d5886137e056775af56915de824c8fce5","storageKeys":[]},{"address":"0x1066cecc8880948fe55e427e94f1ff221d626591","storageKeys":[]},{"address":"0xf819d9cb1c2a819fd991781a822de3ca8607c3c9","storageKeys":["0xc71c05c6a97acda2f3299990ff555bd8127495a0aa62c276aaeea97f67a437e7","0x000000000000000000000000000000000000000000000000000000000000000b","0x2a3590c6ab202f50bebb848f788d193c5f3630bb87780f8cd07ee8f0bb8142ad","0x653426b910b95fc5a98891ceca59cdafbb6f8a7db22c1f20d78cd41408da1bf8","0x0f495763b1f4aeb1fc2de2d0b5ef9eea79713cd1026e0a01f786fe5226c365ee","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000015","0x2efee98fb6e2a339767aa19f10cd4c7e1e5b97f261068a9064c5d05d571a9ec1","0x0000000000000000000000000000000000000000000000000000000000000016","0x000000000000000000000000000000000000000000000000000000000000000e","0x000000000000000000000000000000000000000000000000000000000000001b","0x000000000000000000000000000000000000000000000000000000000000000d","0x0000000000000000000000000000000000000000000000000000000000000017","0x8231c390789b89e8cca572fe136cca26277e5b26967d3021577c7300ff36cc0f","0xfd6a89a4f17153e9727e4eeec71502e5e13157b01e2af0e975feb748a31c0256","0x000000000000000000000000000000000000000000000000000000000000000f","0x0000000000000000000000000000000000000000000000000000000000000010","0x70b4f25cac918dc2cc173f6aff1ecec34f826634edf0fdeac9d0163b795c4262","0x0000000000000000000000000000000000000000000000000000000000000009","0xbee6cfbaa8eb46a8458fa3fadf367a2d1d3d621919432be6e78ff89bd6db6b87"]},{"address":"0xb2ecfe4e4d61f8790bbb9de2d1259b9e2410cea5","storageKeys":["0xbf9675b4d1764e577312c99c116f61cf7602dd3feb80df9be2d176896186706b","0xd2c52c1f34f5beed8bd26de7305715f06acd248867f7e87dd4f719c4abdd0b44","0x000000000000000000000000000000000000000000000000000000000000012f","0xd5097a17ab8b7ef7f6959068f7831b2fddbf15bfa6064f2c045d570f39fb13fb","0x3dc40693fb3bf64b979c0e0b720cba651945e1a1c67007f82f8a170b92d7faf8","0x000000000000000000000000000000000000000000000000000000000000015f","0xd5b4c5ae9faf0731c1b280dd3ab8ba83795cd586e03805aad21a86cc854f7283","0xdbce54fb76d23f3792440c2e2abc6617b38209a9e60adcdb42095f9178274e46","0xd51a84850e3476406216f99da9a384d1d5ff57a85fd08323bac31bce860037fe","0x2c8ab33b7ac5125ea1a98c5c46cf76fff04ed1630cbbfc1878c3bd7459124ced","0x317fdf37c6bf3391f809665efb5993bebef1b952a2f45a49c3637e109e020195","0xbc89cd61935dbd15b832bc0815a2b310e1c54c2415caae642bb9f5a0988b3737","0x70657020103a210f8c9f0aaa1255228d8d70b827383558f050fa16c5aa4c768d","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"]},{"address":"0x514910771af9ca656af840dff83e8264ecf986ca","storageKeys":["0x527413b65d84f6edb6c92975fdaad2e020a5712ca9b280b6a3ea611c13efd75f","0x4e506517218e6fd1a30d242ea8d040f7cca9231df83c626f127c989eba48e518","0x9422ae262bd5bbe8254768a185116d59ff7f53e5e813d9c0ea3840cf28c230a0"]},{"address":"0x6131b5fae19ea4f9d964eac0408e4408b66337b5","storageKeys":[]},{"address":"0x5200a0e9b161bc59feecb165fe2592bef3e1847a","storageKeys":["0xf105718eba48e11374f2a9eee37e30654746b528e81db102f28293c635eef935"]},{"address":"0xf883214fb213b82a4a1b25cf55a79a5354642ff1","storageKeys":[]},{"address":"0x8fe501afe987e247eecfd3001e2d0c82c06084cc","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000b","0x000000000000000000000000000000000000000000000000000000000000000c","0x000000000000000000000000000000000000000000000000000000000000000a","0x000000000000000000000000000000000000000000000000000000000000000e"]},{"address":"0x30d7c134a9e7477dac13ded746c23c6e666f22b4","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000008","0xdf24f37874951906ba6a98b0a86885e98b4595117008b53736427ae68cf50199","0xdf24f37874951906ba6a98b0a86885e98b4595117008b53736427ae68cf5019a","0xdf24f37874951906ba6a98b0a86885e98b4595117008b53736427ae68cf50198","0x8819ef417987f8ae7a81f42cdfb18815282fe989326fbff903d13cf0e03ace29","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000001","0xdf24f37874951906ba6a98b0a86885e98b4595117008b53736427ae68cf5019b"]},{"address":"0xf732f955603ecbc5ab18e101b49ad9b31cedd423","storageKeys":[]},{"address":"0x5b905fe05f81f3a8ad8b28c6e17779cfabf76068","storageKeys":["0x4fd2cc53b82f93565014a94b43d54089fee4125619754dee1b28619e6a0fb2af"]},{"address":"0x2b4162ff2c340a385159323503db6051419e1a2b","storageKeys":[]},{"address":"0x94a6c202ecd1f80d652eda2fb5704718f32bb887","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009"]},{"address":"0xd6cf5194c472a2e1b6f8e06118411a8a346a2ba8","storageKeys":[]},{"address":"0x74dec05e5b894b0efec69cdf6316971802a2f9a1","storageKeys":[]},{"address":"0xc70ae19b5feaa5c19f576e621d2bad9771864fe2","storageKeys":[]},{"address":"0xbbbbca6a901c926f240b89eacb641d8aec7aeafd","storageKeys":["0x623348d3e9f0d9c8141e9f58b5e6fb84556de2286c85d278e5e26ce61c1f77ed","0x9c87686a668c5f51d082f0bae504a5966d7f2b3907814d39e59d2fba39d1c51d"]},{"address":"0xdbecdd726f6ad8e24afc78fe3cc8eb7b73c2d94d","storageKeys":["0x8865a409ecc64fa791e82120d160ce1eccd1b5b4088470c74a810ad3e0ea609d","0x6d2b18cbbfdc154bd5856c03495e0747333bf02b508861cd8b61ff8508bf6f4e","0x0000000000000000000000000000000000000000000000000000000000000001","0x052d8711dd34fcd5a3235991bf2ab9987250527be62b87b16ddb27ae05ec7e66","0x42bb4ea40eb4dc7b9e5ef413d9566ee72c3f92350b9f8d08c1ea0eb1c3306cf3","0x0000000000000000000000000000000000000000000000000000000000000000","0x5dc6a4fb20a04766daaa206ffda57ee18e9198df953590af1c755bc5fedf21a6","0x2dcd944716773b83c0a1360f495fde13839861cf51362cf7556c51b451357715"]},{"address":"0x288a8a256c84f42a41d8b21148f6ead6b2697065","storageKeys":[]},{"address":"0x0fa78426f6851e15368cc43e2ab58da08861f242","storageKeys":[]},{"address":"0x2e2a58da5480c7e29250ee044dee097375d55970","storageKeys":[]},{"address":"0xa7efae728d2936e78bda97dc267687568dd593f3","storageKeys":[]},{"address":"0x818339b4e536e707f14980219037c5046b049dd4","storageKeys":["0xdc77a8efd7f2564fbd744b2e50d21cc40cf3ddc3d9a21c4fcafff639e04b120e"]},{"address":"0x002fac7f9da208c9e4c8783766a53125769eeb90","storageKeys":[]},{"address":"0x99f6de6cedb3e430d8d1f1897fb92c68758f896b","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000002","0x4a6f485c1c32cc07b41a962ff745e1d2a15f32520f92181d93f06ac057458486","0x0000000000000000000000000000000000000000000000000000000000000008"]},{"address":"0x78c1bf7dba36fe3d2cc9a18fbefb140fecef3fbf","storageKeys":[]},{"address":"0x7618c038113503d15029a41857e352f43b4dcc6e","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000000","0x3c090a7f2502726cbd4c4a0dc6168e41dab6b5e5e19f1bd8c9162f7352e99abd","0x3c090a7f2502726cbd4c4a0dc6168e41dab6b5e5e19f1bd8c9162f7352e99abe","0x0000000000000000000000000000000000000000000000000000000000000004","0x9c04773acff4c5c42718bd0120c72761f458e43068a3961eb935577d1ed4effb","0x3c090a7f2502726cbd4c4a0dc6168e41dab6b5e5e19f1bd8c9162f7352e99abf","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000001","0x3c090a7f2502726cbd4c4a0dc6168e41dab6b5e5e19f1bd8c9162f7352e99abc"]},{"address":"0xdafea492d9c6733ae3d56b7ed1adb60692c98bc5","storageKeys":[]},{"address":"0x2ec705d306b51e486b1bc0d6ebee708e0661add1","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000001"]},{"address":"0x7318776157f644b193c7af8dcc4c09a1673bcfca","storageKeys":[]},{"address":"0xf4032de8a48fc1dfac2757f956c7f12a88b57e71","storageKeys":[]},{"address":"0xdac17f958d2ee523a2206206994597c13d831ec7","storageKeys":["0xe5865273b58d40c0de7333def44743042321ad4b7a68c869d6f85e01d638be43","0x62024e8ebe5980c52cf711cdb431864514828ea0c7aefb6e1feedb6b37c8b138","0x6870923961656d057d7fc65d7b5ec5d4f2c0569bf8583c96a05c4df2a8f8d74f","0x7916510ed77022e52388e31c974dab18b65189e2d98ee8473fa698154ccbcefd","0xdadc6f5a447ea95c3b459ca0110f275fe38815667322cc321e175916be403646","0xcc7ae858ae216b3f05d566265b4effb1e3668f732c1dbcf2fc1d9d03530d8445","0xc54621a39c99d9b871a60888374e7b0a754a0f2bb305be5806beb451a6888d06","0xb32d105b666ad278a952af843589feb99c9a11f2a1a0d8463421175e7533286e","0xd9293a630e28d3a5e61462a4f5cf955d155ff86ed3ab041ecb0533dc126b3efe","0xb66babf585d8eb66a33c07a9b5c5a742a1e27d3d057459d2f7aa84b206963780","0x859befcb458c886df2de76e9b1236d15d8c3a20a5d0e539c7485e3c6c28f887b","0xd6c94f6f6a0337358f71a56c17b2b48cb058cce281d0f8786819cd6b0b5b23e9","0x2fa180f7ea52504da27316a4288fd6a940ccf7214a708ca5c4371e06aa8d560b","0xbe4f044a021691c630f39f9a515db97a74c4b8f936c8736a50f9e72702b86a4b","0x4512672ec96325c2fbfa8d9861c5abfb04de17e44178ddb4a1b60b47f835b0f4","0x0e1a3e68653f58cca4abbf215c8b02f7148ffd9efcb3abf0e0ecfbc1d041e37f","0x84057b8da6509b6f87c18b80cf6e9f9ebea313067eadac92cd9744ba85a184ca","0x87faf7d264131840fb49cf2fc5ee6ef8457f3d5e004763b7023b979888a44668","0x1311c754f16c7a184ba4b60a84437d77da9f9c1510ad28021f3624c8718da6b0","0x0000000000000000000000000000000000000000000000000000000000000004","0x482113db1169a2ee62c7bb047ba8deda7c9e44522ba01794450e387cf7046f5f","0x8ad2f69e46fa18f2e8fa3595e410effeb815c804a99ad2142ba34424776c32ec","0xd39bd77f56d5e9a554d46d8f16e3525258a625c49848c705ebbe97d5d2fae76c","0x61806a02d55d0d0c7620a27274300f3809bdab323ae2059c88e73898fec468f4","0x1c3ad8eb5634594ed5555d688023bac555ad2996a6f5641699e322abf5c0de0c","0x0000000000000000000000000000000000000000000000000000000000000000","0x6827559d9dd6cccf4cdc88f221e132b2032840871ebf472ef7c9ded999975324","0x2cbd496c626baed5aa47b7572944a67babebde722928d2da3680e338950c4636","0x42431213c2c25657b94612355a76ccb15d93dcaa1324f2367d51fd1787210ff2","0x8d4a4641cb3f2db51abfd8690ad04d010dc6fd5c8c5424851c11b933e4bbc8cb","0x5238351c432862609e197ce71a0da0267db7b47ed60229356f6418e58fa26356","0xf40013d04755f16b827a5d3fa639394b2bd2eec46662c7453fce262f8db153ea","0x6669717cdf9962bd12f5530026e24d29737ca48e6c666e41630bbbfadd97e3e7","0xdce2511087ed6ff877dd74fb4c1444f2cba2b3026021183bed94ad64bfe56726","0x78b35599871be95768b2fdfaf9293a4491ecdc8ef25b872ee404fa1e441436e0","0x3119a9b2f198f14f15cf41f4b140961d2b9e5709b7a0bafea12769d16b766206","0xa2bf89f579b108f5063bacde30bdafca60363f3f850cc964b8e1022e79ed1160","0x582dce2f57b70b949404eb374b545f9a59c60be579df0fe09564049a3a799c88","0xbd08072a5545f110957f5bb1b6f705167c44924e2f63c6c418da774f69acde37","0x7531b3ae061ccd8ec5a9a7e82809f9ce04307fc0fa3854cbcca93850b8984ea9","0x02fc11c20aa8af930bb90780d97074f7c1116f07f2fd255673635bb36ee2c031","0x2134d7f4a6136c5bf0311a69a942fa0078186e08ed76e2e6d76d53950ab6673c","0x1f346489b2c99cfaab16fd76d3d683a29713d1558ff574ecfbb89aa001fa229c","0xcc2f9843ac244b4941c39a4f8c4eb0cce1e521c7eb72ce2301f5fc7825e9f9d4","0x84bcc3a7469474e82640ae9001805e5dcde53449eb8be8c82108b89aa63a6cb2","0x4b35ecd217e7a20c6967c161cfd5ef6d7830a3cc394816491c755c2b3a2381c0","0x169228ca33ea854d54aa1e506e59ec687f618a41074f5f5de937a0e9c6343e5a","0xc3523157d3378d66d8828c88aee81bec19dfd60c9bfedf932046045e3b3931a6","0x091c2eb3d5ffaffc2f460a491d1096c523cd7605b6896bf241a4095752482b69","0x2009c4cc9c1a688d69a41b13e0cc17b9cdd72ff29ba211779088d1648ea95cdc","0xe4f21bb244fdd3fd3098ae44c81e8f4467573671056a4a57a665c8b50beddcb0","0x728e667887a5cc2d5b14fa273c88e60fabfef07301595452ac58e2cf33e7f947","0x59197132a50ff279d7bb19e3a2f2538f25e56059b99386a32005928ef5cc53be","0x0000000000000000000000000000000000000000000000000000000000000003","0x10da434633302a1c4f56d398ae5bd0f7d724b6f4ab96505e7aef40281408409a","0x3ad2db55fe5657fe773e3b7111e43f4b662a181a20e875b3b8be52dd9f0e2333","0x000000000000000000000000000000000000000000000000000000000000000a","0x204599a54282882d5be7f6bacb625dec57539bbd00c4adef711f14f8fdf4876f","0x980a5e4c61064ead21a7c01bf0fecb71f4a1fa5223261706f0dbf65a4e37f365","0xd4df6013dea9acf69aee30cd0427f0115735810622dc74d13542f217d11df9c2","0x6e1ff317b20fbeb88af25171f2837c2b661ab0c1b2a25424e357b3548a3efa77","0x0356bcf1447fbc6fa23fa93481c1507da18f9198c03b27299c994f8297d5f64c","0x53cba708dfb7b5b1b3d85a5135030d0355b22f7ebc2060b966204e8031d475b8","0x0c473f49d0fbe5ad01d630abd3ed4386fa0685145f666e359f8e3b496c699997","0xb9e5c6baa4d1f78dd28fc0800a19a0a965d18f29c06735a30dea336aadb9abe2","0x524bfcec436c05b97c4fa0a4b01bdd00880f509c00db106f1fdba5574a8c1526"]},{"address":"0x0add4bd959def87ce6dbdeccf76731a159984468","storageKeys":[]},{"address":"0x28c6c06298d514db089934071355e5743bf21d60","storageKeys":[]},{"address":"0x148dfb85a90ff55ad3dfdaa345febf494a2e23d9","storageKeys":["0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad8","0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad7","0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad9","0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf","0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ada","0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad6","0x0000000000000000000000000000000000000000000000000000000000000003","0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5adb","0x0000000000000000000000000000000000000000000000000000000000000002","0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5adc","0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0","0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad2","0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad3","0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad5","0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad4","0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace","0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad1"]},{"address":"0xc832c7614108f5134e511a43215e9ae6eda78b2e","storageKeys":[]},{"address":"0x83a73b0c427dead5aa5f96e15c430fb766328510","storageKeys":[]},{"address":"0xd311a91124d0392841cdc6d53a470684704c1e33","storageKeys":[]},{"address":"0x8dbee21e8586ee356130074aaa789c33159921ca","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008"]},{"address":"0xbebf1c31e05a62aa8d07003af177f07891889ad7","storageKeys":[]},{"address":"0xaaef4d5ae6ea726f542033ddd8e0a1df6b189794","storageKeys":["0x31ac242ffb105ef7ba4bcd742723c7d376849df82edc76c7aefe4c7bb1a76a76"]},{"address":"0x1a13c81976e6f228fb1e18e1790ec9038ee0d620","storageKeys":[]},{"address":"0x6cb3ee90c50a38a0e4662bb7e7e6e40b91361bf6","storageKeys":["0xbde8e536bc5811827e4ae30dda68b72ac5844230341d03b87e5eb780d80f2da3","0x0411418bb4642e734649f8655ace73413729cd27950d19bd1799bb0ccf80bff6","0x8742960fd8c49bd455c7786429ede3e396067ef238b781ded291497544048961","0xcc58ebcaf88a33c18e1a16663ae28fde183c06077fdce019f8225f252cd3d811"]},{"address":"0xb578c10e6eae79a4bafb3cd69f221f28947d5e16","storageKeys":[]},{"address":"0x4b0c925f3b2325c448990824e91132cd5f395f2a","storageKeys":[]},{"address":"0xcc834b4dac87378d7033a990189bbf879a36362d","storageKeys":[]},{"address":"0xe3d0a497d70b5383e5a3c334a5aee31008e07d73","storageKeys":[]},{"address":"0x8146cbbe327364b13d0699f2ced39c637f92501a","storageKeys":[]},{"address":"0x5d886374ab0bfbb2e70597b6633292ce1a38f071","storageKeys":[]},{"address":"0x365f270ec430c30cde4d32439a4cee7bee8970d7","storageKeys":[]},{"address":"0xc53405b6eea309bfed15a5f64efea267b9160668","storageKeys":[]},{"address":"0x327cb095c802843b7b8e9a7b8d48432a6b5dc795","storageKeys":[]},{"address":"0x712e8fa890789e98a058277e69ef1806d952b79a","storageKeys":[]},{"address":"0xc73776c7c02e93c45158e2e6f1d4175fba0a9ca1","storageKeys":[]},{"address":"0xcbbcb370cfcc967ec2ed24263c90faf145d54ce8","storageKeys":[]},{"address":"0x84fb231ea2e00e9ee35e8ca19b3aca7d2975d20f","storageKeys":[]},{"address":"0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000001","0x320975846a116b11411a5cfde94c56d7713040529fd53bc4095fb1022e45da01","0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000005","0x5b2a585fa5c233b374a2a5ddf9a48ef884ebe611aa51fecc04c88aee2968e275","0x0000000000000000000000000000000000000000000000000000000000000007","0x5800631acacb319b6d299c037a26700faac70a0341d45ebe57a010dcf2b48d8a"]},{"address":"0x0d0707963952f2fba59dd06f2b425ace40b492fe","storageKeys":[]},{"address":"0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000001"]},{"address":"0xbe69d05f3873f044403ddc603d07591b324cb662","storageKeys":[]},{"address":"0x415ff1afc201eec50beff210a2f456674046920b","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000006","0x637034ff9a9768ec1d42ca6e42f6582a3447eb554d12d9f5461218dd45d1b84f","0x83a5ef50f025e0546bdc02478438776bb2931c0384c6eb124d85fce08565a337","0xe4988a78c82cfad4cfc79937be5b0aadbd593c8139822c62c7af51164284dcd2","0x8f52764cd52880ec2918e4983f88f06289aab8057be179fc840e56e661eb0b58","0x0000000000000000000000000000000000000000000000000000000000000009"]},{"address":"0x2602278ee1882889b946eb11dc0e810075650983","storageKeys":["0x0c1c0c914f45c000744875af89164f0c3fa7a95c88dac7dd52278df3ccdd7017","0x838881c88dd3c1e081c30902bab10bb762f93ce02a52da0b9843f95203a3261d"]},{"address":"0x49ae0f9d0bd8dbe9bcbd4d3c501a4a8a0944c2e5","storageKeys":["0xc731c162de1f37e48b52a59fba1aebb8df321acc376d0b74f52f6f68c59d388b","0xd3f567404ba310d4ca1144e5db70b5e7bfced5c9fbc7b5db4968307b8f09e25e","0x4a204f620c8c5ccdca3fd54d003badd85ba500436a431f0cbda4f558c93c34c8","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000004"]},{"address":"0xfa103c21ea2df71dfb92b0652f8b1d795e51cdef","storageKeys":["0x140eef113d7b5f11ae292171e759639b0e423c11dac6b687ee01d4ccfd8c964b"]},{"address":"0xfd1b0b0dfa524e1fd42e7d51155a663c581bbd50","storageKeys":["0x265f1732cfaf58ce32de42f37be12ac84566eb1ea99da1c3e2a355b0ad2f3f12","0x99e4583eab2c5d50e3624a740cbd0ea17288514cf77085b222c24d8698540d53","0xa73632f944257052d8be8529e6e41a5eaa504ddc5b00f522a0840d8efdb878a7","0xfdf993c9fa7dd8c372f151556f88d39e13148e21b3bda1050e4518f8e557187d","0xac922b1e30e6d7ff79fd166d5614edc761dbe1045eb5d7c4ee68ee64e56315d5","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0xd0207f98173fd0fda8f227c64dc44ceb84f73a21791a2235883202c8b767aed8"]},{"address":"0x2f18f339620a63e43f0839eeb18d7de1e1be4dfb","storageKeys":[]},{"address":"0xdef1c0ded9bec7f1a1670819833240f027b25eff","storageKeys":["0x0000000000000000000000000000000500000000000000000000000000000000","0x0000000000000000000000000000000500000000000000000000000000000001","0x1454083160665801f09e29ab8f69468d8b8efd1ebbd910c5a96df81a9aa0224b"]},{"address":"0xf05b0e4689f62ffd7ccf34906fae7f106f9204cd","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000013","0x0000000000000000000000000000000000000000000000000000000000000012","0x000000000000000000000000000000000000000000000000000000000000000e","0x000000000000000000000000000000000000000000000000000000000000000f","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000000000000000000000000000000000000000000d","0xf338efe185a403a5db9ced663c265c9aca6a9e8d5047fde96f6f34db4c4b32ca","0xba9f0a9d2918d1b53246d8caf54ac3df52e0b2e15494ad8e447636ee5efd27f5","0x543fae4ebb556a7e3ea46b6922bf9129e6840e7df76fbf613dfffb6b2479fc7f","0x0000000000000000000000000000000000000000000000000000000000000005","0x5737addb5a275661b564d0a8f54650c5e1e707fe606dc9d4411d3644d8682fab","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008"]},{"address":"0x811beed0119b4afce20d2583eb608c6f7af1954f","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008"]},{"address":"0x2f79d4ceb79ebd26161e51ca0c9300f970ded54d","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000065","0x0000000000000000000000000000000000000000000000000000000000000035","0x00000000000000000000000000000000000000000000000000000000000000fe","0x00000000000000000000000000000000000000000000000000000000000000ff","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x931798e4dac569856413eb6808a6be0e3f14caafd4cb15ca12b3573117c56e37"]},{"address":"0x49010f03e403a2303c6049d25862af115c650a01","storageKeys":[]},{"address":"0xb50721bcf8d664c30412cfbc6cf7a15145234ad1","storageKeys":["0xb9d9d0eb67c4258bcc1886ec3c9148c9d06e85018b090a027a97d16757775d24","0x990cfb0e673481226fdac2ddcf977b6c2e9e4609c85ff777ef4fc3595e77b7ca","0xad3dfc6da043c145b0f5f286248cc32ae826d33728479d5caf24f25f60f562b2","0xd64193ab2ae4623b7cbf67d0ac3e5ffe4844af5124da8f21a8a76f3c66992021","0x87da21c17b727dc39a8771d7d66e0427449ccc45daba88c95fe70cf188bdeb63","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc"]},{"address":"0xf6a94dfd0e6ea9ddfdffe4762ad4236576136613","storageKeys":[]},{"address":"0x7563758243a262e96880f178aee7817dcf47ab0f","storageKeys":[]},{"address":"0x6af3f5ae6adf03fe737ad42dbd152b2a08db7d1c","storageKeys":["0x3cc7d0cf6ce2bcd720a4b6d2d8f3f074014bfd50f093993bf8f7b64bc486b1b6","0x0000000000000000000000000000000000000000000000000000000000000002","0xf76fee4741f2e1dbd18a4efe584e3c3a2f3a6833fa0c52b67128e7929b64565f","0xbdfee2f0cb140c88e17eb54c23cccfe3171957f049aa6d32ee3e49283f0c3283","0x5f43b3828c5a6834b11c82bc671c605a533fceaf790ec93a0f4e9fad9a615d43","0x0000000000000000000000000000000000000000000000000000000000000003","0x8a631ae253960e309e920756bf219eff061b81c8183ca3f8482ba4bb91ae1e63","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000004"]}] diff --git a/bin/mpt-test/access-lists/18363445.json b/bin/mpt-test/access-lists/18363445.json new file mode 100644 index 0000000000..61a23527c4 --- /dev/null +++ b/bin/mpt-test/access-lists/18363445.json @@ -0,0 +1 @@ +[{"address":"0x40226c5821f5c6e22043833d04a1b86985550b1d","storageKeys":[]},{"address":"0xca317ef5f8978c36c1065184fde08d9dd7c36cfe","storageKeys":[]},{"address":"0x000000000022d473030f116ddee9f6b43ac78ba3","storageKeys":["0x77722c1fb10125257e0ae84767586605659d0661a31dc05916a3b79d34ce883a","0xd8fadfe2fd722ca8fa2631df2956454391dd764d27be5cfdc2782216dc628995","0xe401de12c94a724230d28b68476b22137fcad12bbbddfb4b2fda80ab57cb781a","0x315fca8d995ad8a329581d7595965a3263847b1bc96b5c474f32f08ef65cd494"]},{"address":"0x58c746b5f23213a98c1bbb9ea6a9932b544342bd","storageKeys":[]},{"address":"0xa04077670d522e9af8d0e96a724b67b16312f646","storageKeys":[]},{"address":"0x21efd411374442cfa2dee4c5f5b9518891188dce","storageKeys":[]},{"address":"0xb05073aae7c9ed7cabab67dae0ab6124f4a7a421","storageKeys":[]},{"address":"0x99f6de6cedb3e430d8d1f1897fb92c68758f896b","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000002","0x4a6f485c1c32cc07b41a962ff745e1d2a15f32520f92181d93f06ac057458486","0x0000000000000000000000000000000000000000000000000000000000000008"]},{"address":"0x1527beff62b110c09ac527b1ecb11ba8ac3a95f9","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007"]},{"address":"0x7e75debaa645805b1aaa4c5a41aa11dbcb198215","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008"]},{"address":"0xadae1798f761fa7fce29b6673d453d1a48a2931a","storageKeys":[]},{"address":"0xf61f4f2c896219a90670e19e188ebb93fcc002e8","storageKeys":[]},{"address":"0xb258ca5559b11cd702f363796522b04d7722ea56","storageKeys":[]},{"address":"0x55833e12e143d2e34ccd556850f79266bf478ee1","storageKeys":[]},{"address":"0x67fe41a94e779ccfa22cff02cc2957dc9c0e4286","storageKeys":[]},{"address":"0x11b815efb8f581194ae79006d24e0d814b7697f6","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000001","0x32d80bb380a6153715a380340a591610b4f5a62ca0809dce09eefe0e7c37ea7f","0x0000000000000000000000000000000000000000000000000000000000000000"]},{"address":"0x464f0fd1ed9523e421031ec2aae44697992366df","storageKeys":[]},{"address":"0xb23360ccdd9ed1b15d45e5d3824bb409c8d7c460","storageKeys":[]},{"address":"0xcbff3004a20dbfe2731543aa38599a526e0fd6ee","storageKeys":[]},{"address":"0x48c04ed5691981c42154c6167398f95e8f38a7ff","storageKeys":[]},{"address":"0xfaaa392734aa1b6d279d2b37ed33e57c048754d1","storageKeys":[]},{"address":"0x16ba73c3f6769122336561395ee88eb979b701d1","storageKeys":[]},{"address":"0x1111111254eeb25477b68fb85ed929f73a960582","storageKeys":["0x9c8412893622586ec36a80bb47953625f75a12c567bd60d59fe9127988db6e06"]},{"address":"0x63a395b574d5e23c3dbc6986be5994ef6743afa8","storageKeys":[]},{"address":"0x77edae6a5f332605720688c7fda7476476e8f83f","storageKeys":["0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x0000000000000000000000000000000000000000000000000000000000000033"]},{"address":"0x4e5b2e1dc63f6b91cb6cd759936495434c7e972f","storageKeys":[]},{"address":"0xfb19ffd1ff9316b7f5bba076ef4b78e4bbedf4e1","storageKeys":[]},{"address":"0x73ce7912501be775a693fb3a641eca8216b18b13","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000013","0x000000000000000000000000000000000000000000000000000000000000000d","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000b","0x0000000000000000000000000000000000000000000000000000000000000009","0xf57ae29aa849bc7913609bc09b5c1cbd3a2aedc5977d5ecee27a79a9afe058f3","0x20de30300db9b2d46f45ef3798c883c649ebfb03953fa78198d91713f3132be2","0x0000000000000000000000000000000000000000000000000000000000000010","0x8ba190cb48198fb85445fcfdf616e53510e2124fd02590bd23d8adad1a2cddfe","0x000000000000000000000000000000000000000000000000000000000000000a","0x5c83d9320a9a25da893c14228f60de0a08c6b7bb94e4088eeee36c1b9a31c4a4"]},{"address":"0x0000000000000000000000000000000000000001","storageKeys":[]},{"address":"0x26335b46eb7dab67c9f2f2581055a818ec259a36","storageKeys":[]},{"address":"0x65a215f3db3dea02fd926ede38be7eb0978db503","storageKeys":[]},{"address":"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2","storageKeys":["0xc879954464be3ad720ed8eda46e0649a78b2163f8e5cf2327373ac0a8cff56da","0xfb19a963956c9cb662dd3ae48988c4b90766df71ea130109840abe0a1b23dba8","0xc43de090e120c56163c78a79947fb033da57ecb0a8775adba22c13a3cf4abf83","0x7e37709aa64560456a2a6d490781eec3fd4960d7077c897a3978ce4a77a5ae6d","0xb0505f68d45689f03f4367abe7f1c0cf4ed6875d324edf91dd396c4d20555404","0xc269910e79664bb02e4ea6b58a6546a8f30ea3f5840ed79d34d06b85ebddd776","0x993460b7a842a34c6de2dc08dde1c527f4354825432b190bba2e4f8a7b04c6c8","0x013949704e03781bde034170a06eb3b7759c4a8b374d24553318ba458b5d6ccd","0xdc51a0a44317b550a6b5ddb34687ce2bd40e4750eec27343e32b23e686739208","0xdf2ae3f156ce84cb4ce184647a920bf090b8c7a867d38b86709d4d85664b7bfd","0x0cb865ff1951c90111975d77bc75fa8312f25b08bb19b908f6b9c43691ac0caf","0x2b83b3e1fb436772e592319bd36c360dddb62d80a39727784d546decedbafe26","0xcced982511cbf7fa68ee0a44ab44dc3426b309d28a08cb46e6eb3eb9c6dbb7c7","0x3a3aec5717af62dfc0f5ede964a3e44cef7c5ba4453963ee6e3545ea9708690f","0xd23bb4f2b1fa279eeae815c36c41ed1f07e636095d955d79839ac5e0cea06a11","0x3a28961c980b0da3e5a5a5d784aa45ae30de0ef7d5afc286aae1586c2396b799","0x86ea25831f51e46dc1f9fea523b7e87ef91b50a89f5ad6663d8df9d1f7d28c02","0x43aa45ec98615d91f961a8f191b780d7abc1159e09201f733c07e7449ec753da","0xe819cbe81daa538219fb3630a6b9566e17b43b07f0a056f947b17ed2a306e269","0x4fb413805902e1d9a6681d54d7946be4d2c3433fadac4304eb49ef1b5a52a8f4","0x39a528031c821151a0357442b7ae7ecce02aeec01c8255f8ccdd708707e959c9","0x390f6178407c9b8e95802b8659e6df8e34c1e3d4f8d6a49e6132bbcdd937b63a","0x0924d2eba8978269265ab53e97538e5611910658ed716b899a8fa36e9ed69330","0xc71dfa760d584ebf474c6d1c55ce31ce02f85ea18a5dca00cd2f18491d012f6d","0x6feef5b840b44c4be4a77f82d47514fd15c11a0feee3d50635396e05ada6d27c","0xe03178286da22a27dd0b1f68fb538cd07bc9080172ee9a5a2238416fe86db02a","0x6607c484800c9315ed89c5bffefbf1b2c1050d09697cc3dc58d1b14c633748ee","0x9ede93be0d8fc6a5eb9cf1c7345a85b7519d8487a727aef0c2f00ab966aa7716","0x60a734b9931b463b5ec40c9bfef86d3ae5a93d7796ddcc3c79118d946aae6b46","0x62f11c2afd0b1f7d5cee75ef9dc40fc9d0fb343eabd5e33a2be77ef5e7150402","0x9c624a5d083d18dacebe46f8d8d787009a1c3414eac150bbec20649cf01d77e2","0x47acaec6cce4f8679df357c0511627b345d6e8f569cbcd40f3cc0dc80233794f","0x27902350b23dab8e343168a9c4efe515d63cf66808c513bd6a00ee1036192055","0x3fbe6099f169b217d3e3f44e5b72b54ed4319f5e6c163e6e3739eb3434dbd572","0xd212dcd01ed41455be0b36533ba78a0fdeccda0068b5f90fa610f816600cbd08"]},{"address":"0x08736a84c876b46cca2bc591e2475431ed64425e","storageKeys":[]},{"address":"0xdf2b4afc475d230a826f277719f874542002be06","storageKeys":[]},{"address":"0x5d550635f87e21337462b582dff589f552e609ae","storageKeys":[]},{"address":"0x046eee2cc3188071c02bfc1745a6b17c656e3f3d","storageKeys":["0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0xb64ee41d4d625f23d84ba3d3c9ba8470ed1b58969783afc12206db6219edc380","0xae725a6314bba6e614463419cb800d0807cc2a4f688ab68828b74bc255fecab4","0x9e14b762eb423a5dd97d0661dbd41fcd5e5c9d997f8b651c280d53059ec58a47","0x5eb20f63001fa3b608b1addec478d14b6ab805a99354723a0488ffa70d5d4413","0x2f41f50d5ceee069bba953152b3424751a8ca0874e3065a0e955df4063e682c8","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103","0x000000000000000000000000000000000000000000000000000000000000009a","0x00000000000000000000000000000000000000000000000000000000000000fb","0x8730115f3af379603b1e9225ab1e6bc6993b5fd6d0e00c24280a6ba17c0cd6af"]},{"address":"0xc36442b4a4522e871399cd717abdd847ab11fe88","storageKeys":["0x737ff10d44a9cc7efc13561b99d0b3815fe76faccd3039c82bbed8d6178da46b","0x67ba4a4f82789dfc9278c45e31c806d20dc0b004d70f969c52bafb3f86a3901b","0x737ff10d44a9cc7efc13561b99d0b3815fe76faccd3039c82bbed8d6178da46c","0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3cadf8d","0x737ff10d44a9cc7efc13561b99d0b3815fe76faccd3039c82bbed8d6178da46e","0x0000000000000000000000000000000000000000000000000000000000000002","0x67ba4a4f82789dfc9278c45e31c806d20dc0b004d70f969c52bafb3f86a3901c","0x737ff10d44a9cc7efc13561b99d0b3815fe76faccd3039c82bbed8d6178da46d","0xe3cf90a5a6ee91afdc28b429497811e76db6248547e420ee2c7fa218d45124d0"]},{"address":"0x89e51fa8ca5d66cd220baed62ed01e8951aa7c40","storageKeys":[]},{"address":"0xd7f3fbe8c72a961a5515203eada59750437fa762","storageKeys":[]},{"address":"0x50130437a81535dd8f4b0b921756ebddff537523","storageKeys":[]},{"address":"0x0f036f2ac038f8a37c96c4729c6b4433967cf8ad","storageKeys":[]},{"address":"0x724d0de27cb82be1da3568dc5a4b86cee9e4dc7b","storageKeys":[]},{"address":"0x170b1d720c853f6f37ec3be782158d941d904a3c","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000013","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000017","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000001"]},{"address":"0x18672b1b0c623a30089a280ed9256379fb0e4e62","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000006","0x000000000000000000000000000000000000000000000000000000000000002c","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000003","0x000000000000000000000000000000000000000000000000000000000000002d","0x000000000000000000000000000000000000000000000000000000000000002a","0x000000000000000000000000000000000000000000000000000000000000002b","0x000000000000000000000000000000000000000000000000000000000000003e","0x0000000000000000000000000000000000000000000000000000000000000029","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000028","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000005"]},{"address":"0x9746c4304cbcf2b9bd02b0686eb2a1443b07bd8b","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000009","0xbb7dcb4cc5388d9954a2593ebd544bf89b3aea968dff8e9273b372233cc754c3","0x3b86e9d714f273bf0c5ca748dddade00a0e5033d493fd4872f63743f976142ea","0xd1ae39517b4c7d4995db65c04c8f47ded33153a041e0537d9672ed5960e8b148","0x000000000000000000000000000000000000000000000000000000000000000e","0xf0e313bf90ed3839c64a9fa927a4063b5e02407d2535470248383001e0d81419","0x000000000000000000000000000000000000000000000000000000000000000a","0x38846371790bbf7b77604da8b29ac40f0a83e107e13001367695f22659ca701c","0x000000000000000000000000000000000000000000000000000000000000000c","0x000000000000000000000000000000000000000000000000000000000000000b","0x52b97d8334233d215049143127078176f28777a52ee04f52a5cd4cd7fccfdfbf","0x0897dfaf1c37c8dbe7def5779eacef1f70ee8772a9b3244ac94223e45b045a6c"]},{"address":"0x0363b1bc04365087ef6e1360e35872b60187a013","storageKeys":[]},{"address":"0x077d360f11d220e4d5d831430c81c26c9be7c4a4","storageKeys":[]},{"address":"0x271682deb8c4e0901d1a1550ad2e64d568e69909","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000b","0x479cfcf5c676437c79d50ee9bdb4c12c1b76dc1be2d04b6b7a8fd00b9ea1c665","0x94266873ccaeef73376d2463a38f76474de9cc7b08ba8dd8efe24e41637b3b2f","0x0614b180b64fb95a5f9a927026486500538594f863a65a5f270d1394e5e9dde4"]},{"address":"0x8d8404f8cca4c8834ca3cab1e54887ae47724bee","storageKeys":[]},{"address":"0x321afcdaba70b2cee6521546e8feec05e422a10f","storageKeys":[]},{"address":"0x1b7e65258e8a9716c45fe78dca2b8b32d006b018","storageKeys":[]},{"address":"0xe23f8cb32acf55124bad04721f275acecca398aa","storageKeys":[]},{"address":"0x0f13620f1d5a8bbe8fdf8dc701b3f55f823d031a","storageKeys":[]},{"address":"0x3c3d457f1522d3540ab3325aa5f1864e34cba9d0","storageKeys":[]},{"address":"0xcb5928f7d24a05a13520018e82a1e43eadef8d47","storageKeys":[]},{"address":"0x8b2a354ba669da1828e508cc3e8b0d20a0cea81e","storageKeys":[]},{"address":"0xebbd07cab1f6cc2811000e40fcea23e6cfa5336b","storageKeys":[]},{"address":"0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000000"]},{"address":"0x5354068485fd4e394d452e5066f8a0aa2c1e781f","storageKeys":[]},{"address":"0xd533a949740bb3306d119cc777fa900ba034cd52","storageKeys":["0x32366859a08a8c4891fb0bfbcf1cc461f2d20cd3216ca7fbcf21318b863cf8d0","0xce814e876fb74b5918b09fec4d70e03d607b5da912f8cda1e91757ac60d7efb3"]},{"address":"0x0000000000000000000000000000000000000004","storageKeys":[]},{"address":"0x51c72848c68a965f66fa7a88855f9f7784502a7f","storageKeys":["0x398390768c40768f5d7fa1802afb03dc32af900388ff9b094df16e84c0bbad5f","0x0000000000000000000000000000000000000000000000000000000000000000","0x0fb940e5a8f01c04e0a95326b0cc1d255b3eae95a2b9a9dfdf12852a20d72361","0xe2a59d32e529f818e8cd31db816a8242dbf29188915dfe7d9e7442c9b5523fbe","0x41370c61bf529de5cb140b302534d0e7dd86a8a6db142f6eea6ffe20921dfbe8"]},{"address":"0x56eddb7aa87536c09ccc2793473599fd21a8b17f","storageKeys":[]},{"address":"0xc42b14e49744538e3c239f8ae48a1eaaf35e68a0","storageKeys":["0x51c2cd18b7d7edb9d16117321e08b0433321b8ba89593a7ca392ae160f0fbce9","0x0000000000000000000000000000000000000000000000000000000000000003","0x19deab9b494b525cf74020b2ff23fb69acf77adf8cf14baa3ac3ec0dba2d9066"]},{"address":"0x508e1143f569b50bc5e283b78559445bdf0807cc","storageKeys":[]},{"address":"0xc7e5aeb3ec9b4f3d912c17f6852a670aee2d7ec3","storageKeys":[]},{"address":"0xfe188e92b1c51ba31cc78e29994ec5653838e792","storageKeys":[]},{"address":"0x4c11cc6823b0cb7d699d6fc278dad288eab7bd6a","storageKeys":[]},{"address":"0x98f3c9e6e3face36baad05fe09d375ef1464288b","storageKeys":["0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c8c","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c82","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c87","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c8e","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c84","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c86","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c8b","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c8d","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c91","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c88","0x88601476d11616a71c5be67555bd1dff4b1cbf21533d2669b768b61518cfe1c3","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c92","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c94","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c85","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c8a","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c93","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c8f","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c89","0x0000000000000000000000000000000000000000000000000000000000000003","0x88601476d11616a71c5be67555bd1dff4b1cbf21533d2669b768b61518cfe1c4","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c90","0x2fc7941cecc943bf2000c5d7068f2b8c8e9a29be62acd583fe9e6e90489a8c83"]},{"address":"0x4b483d0d9d6472c4f9f0210337ea0705dd71059a","storageKeys":[]},{"address":"0x2c169dfe5fbba12957bdd0ba47d9cedbfe260ca7","storageKeys":[]},{"address":"0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0","storageKeys":["0x829bd372dd791f3f6292feae330ead664fe4b4cbf831fa5da30c6390e6af723f","0xcc535c7b9f605c3344abe50605dbe8f9c3042b41f106ff381ec7c18293d0c706","0x009e326361884c2d8981715b6fb29b3a1a533f490327862b8d26f21a98480f58","0x52ea6016d43a58df0001ed45429c86982b097cc907396c1e5968cd787bf83d28","0x43349b43841a69496db9d22f30a29e252accb6b004ff4aeba98c2ba0b873dd95","0xed72eabd9f3c4714b69eecc5e9c7ec8cfc2c12d9aee073259fbf93ec2e568535","0x2ed57b28a284bebffb1baf9fdbef9c826fec14f335dddd7ec8f211d50c71741f"]},{"address":"0xef52a7127b52dc2eabc1f82cf5d594770279a9ae","storageKeys":[]},{"address":"0x1fc40cedcb47f341b37968a635314756d4c04f36","storageKeys":[]},{"address":"0x69525dac489e4718964b5615c3d794a25d62beb7","storageKeys":["0xdb3ceb65027fc8efa2152b8073814f22b39b2965510944c2d5963cb47ea21414","0xda5bec67218a3452657dd3dfc92c5103ffc53698ce470bd53e545b032465c471","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0xeed572b39c8d3f8e891e2fc9080990524248e3bb824fc9cc7eedad7b7b08ba5b"]},{"address":"0xa7ca2c8673bcfa5a26d8ceec2887f2cc2b0db22a","storageKeys":["0x9144aee7f37b7f43b6b90b5f10849f7e24f0d10aec9ad49f57e3aa0eb644251f","0xf8d8af571bcf8331a05936e065bfc9134b6461ab3226d0f94b32b989e63dadf0","0xaeb398aaef01950a3b20c728e1997bb95d411b0de44b9c8c5376cf18fee7cb8b","0xb64dca7c2c7c1042e75fbf9b93ca1120ef9e6feac25da501460cd6d486bb8882","0x0000000000000000000000000000000000000000000000000000000000000004"]},{"address":"0x423f4e6138e475d85cf7ea071ac92097ed631eea","storageKeys":["0x7e23841ac1dc0ad28c17761055888ad118ca49b7e58219c38f6022ac7cfb6b96","0x0fd4f3d08cdce41693a053d24208ca680e29348fd4d58da076e4800b188bde1e","0xecaa7216573e0b608913bb06dddb4ae1aab903c8d7ee6ea63ea1455237919133"]},{"address":"0x765ee4f09ac9ebbaffb0103bab9aafe88da16d15","storageKeys":[]},{"address":"0xfba175fe8169f08eb02239ca1b235a8e13415204","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000009","0xee722d724c89bf250dae10049726c7ead1476357b09d9efbec404caf9ea81e72","0x79d156ceea4a0fee7d6637a7a651c35fa06f4c4b635515212bfc8949f2e1ec43","0x89771fbd38768c503b93caa8a5a7af1a98aee81bb30693325dc2478c31b99a9f","0xf2c535f78bbf70e8c137acb4e29e2f986545c919fc7214c8b5be774e28c99ce8","0x0000000000000000000000000000000000000000000000000000000000000006","0x000000000000000000000000000000000000000000000000000000000000000c","0x4a005c35fec15139d97803ed79dc14a88b633f9755a6a0777c9b23f13c3fb861","0x000000000000000000000000000000000000000000000000000000000000000e","0x0000000000000000000000000000000000000000000000000000000000000010","0xf28acad8a0670d670466b93ab09c43622744fe969ae226d34ba92c493c22ccf2","0x3bdbca05285fc70b92d87d8c7b9e489bf0787dc47751ba4fb70ff7a65e9bb3a2","0xf404b05dcec4c1028aa8e4480bb5e02ead5e2455a25dcdd2057291e3fc561343","0xa5f3f05fcb15a4a5ad6a9b72b15ccbf4a2d0626b3fb9a2738ef54cef92c8f43e","0x000000000000000000000000000000000000000000000000000000000000000b","0x0000000000000000000000000000000000000000000000000000000000000011","0x0000000000000000000000000000000000000000000000000000000000000013","0x3cb31db65d4a0cb27afc2b35e83637e3c9f86b1c5713c6da38178dca056db7fe","0xe5898500733853867923fd975114830cc7c234061a723205a8ca9bba6c090781","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000000000000000000000000000000000000000000f","0x0000000000000000000000000000000000000000000000000000000000000014","0xdcc28a903a03fd1a76f0f5fc8d4e619b82da69a2ea25ec130ff57a51897ecb18"]},{"address":"0x264bd8291fae1d75db2c5f573b07faa6715997b5","storageKeys":[]},{"address":"0xfcd4d62ec78ffa2f3393e707cbd367b55e7650f9","storageKeys":[]},{"address":"0x2260fac5e5542a773aa44fbcfedf7c193bc2c599","storageKeys":["0xdc276a4f120117ad5ae6415d1c724b4f3a0e81f0ee6466e1392ca121b63123f2","0x0000000000000000000000000000000000000000000000000000000000000005","0x356ea57d585b4c2292ee2a39c9da213499f25d18b4fba5671c7bc01208e40e2e","0x843a1149fb1433eecb1b4c3da1f05b4371f10dfa06005208a012fae04ff9d915","0x1c53a8b75d17843d0eab5a15ce9a3ee0e79e4339f036d33d0248f11f6d31916e"]},{"address":"0xa40f67074bc008081cc2596abcd7312952aa67e7","storageKeys":[]},{"address":"0x7a250d5630b4cf539739df2c5dacb4c659f2488d","storageKeys":[]},{"address":"0x8f8e7d4ef1536b3655ec1426aa3a46a3f4356289","storageKeys":[]},{"address":"0x0000000000a39bb272e79075ade125fd351887ac","storageKeys":["0x859245a13018ac5a93a01e110bf65ca1abaee6f8ad471faac9be4824c9577049","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x72b87c327550ab68e32ce1ea0077cd2e2b3258297b5b70be9fcf4abaa45ca847"]},{"address":"0x6d053ea8893ba0163e115b5cc6ff461fdf7511d7","storageKeys":[]},{"address":"0xe0438eb3703bf871e31ce639bd351109c88666ea","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000f","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000002","0x000000000000000000000000000000000000000000000000000000000000000d","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000004","0xbb47c685b7a6169f9415fd073108f8b7da3e741b7dde8513850bca404684fa97","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000014","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000007","0x000000000000000000000000000000000000000000000000000000000000000e","0x0000000000000000000000000000000000000000000000000000000000000005","0xdf6cae10d416b4d6f459eba806bebc4b85f190dfac647ab7cb4cd2638815444c","0x0000000000000000000000000000000000000000000000000000000000000003"]},{"address":"0xf939e0a03fb07f59a73314e73794be0e57ac1b4e","storageKeys":["0x66368119ff05b3698a038813004193e9779d10801fcf8ea67af1f93e0fd188a9","0x7cbe81bacd388215be9c9e8d344a47af8f17223474d114f0769e1a80406589e4","0x10ef53f11b023c0919a971c7d6dc236fe49431ce18f2b1375a7808c494d504ec","0x0cce64d4f412a0406c3b98e008e3e196ea99f2a9ce128d0ef85ee81b207bd609"]},{"address":"0xc662c410c0ecf747543f5ba90660f6abebd9c8c4","storageKeys":["0x71a8ef1b1265359d77973c3524afac225c0a0d829a0d4da5cac3b34532019fec","0xc447b48995780f669aff2327abe7302de2dddab797e0ae7ea6f3c00d66e82738","0xb4c82a817c6e58e43d4ecb2529caab94383420d8f31e963cfe54dfe32d2cca56","0xf86095cd7a40729b7fc2232125bcf06bb0c3e60d22b83e6ec934e43f40fbf9b7","0x8cde0e99a4532474b22bd3952cb1c6b00478babd3678337325283f4f48110fc4","0x04e7be39f2fb63cfd7d4fcfe19f108bc6b411ed972d99fca0a47dcaff878ce5e","0x71a8ef1b1265359d77973c3524afac225c0a0d829a0d4da5cac3b34532019fee","0x67963652696f3a8e8976c8d0956f2afb2fdf053b99be7bf625d956fc88a52815","0xabed1d7a8dcd28219aa35907a6d98d00be0ff62e90df1de607ad1eb42a06d50c","0x177667240aeeea7e35eabe3a35e18306f336219e1386f7710a6bf8783f761b24","0x71a8ef1b1265359d77973c3524afac225c0a0d829a0d4da5cac3b34532019fed"]},{"address":"0xd4c4044aca68ebbcb81b13cc2699e1bca2d3f458","storageKeys":[]},{"address":"0x51836a753e344257b361519e948ffcaf5fb8d521","storageKeys":[]},{"address":"0x3e573ca2900f5d2d1eebfd5f33c2945208d2f025","storageKeys":[]},{"address":"0x0113a6b755fbad36b4249fd63002e2035e401143","storageKeys":[]},{"address":"0x655edce464cc797526600a462a8154650eee4b77","storageKeys":["0x5e5777fab7622aff3c042c1ece74307c2e9d699a9da444f416c35f2e1def28a5","0x000000000000000000000000000000000000000000000000000000000000000d","0x2ec2a34fac153c8f4ac198c5ff9d0c53d29ab447a04f3e6ab246031dfc6a86fe"]},{"address":"0x808b4da0be6c9512e948521452227efc619bea52","storageKeys":[]},{"address":"0xd5fbda4c79f38920159fe5f22df9655fde292d47","storageKeys":[]},{"address":"0x489dc2a0767fb775d851f678babb5a150e2ec6bc","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000a","0xda90f15a2cb0eb801768ded66ed2467608f403fc4b94a8cbff5931df1d01cad8","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000000000000000000000000000000000000000000d","0xf318eb6180bf9fcefbc38616da1ebdd433d8c812b72031058da166e6417d6cea","0x17680248dec3a2b31fb321ab941c0efe7605ef48aab86acfc640717cc6ed14cb","0x2018ac9c66a42e968f350a32a98c7eef7d47691f95dce397a62657fb51b63d3b","0x9c624a5d083d18dacebe46f8d8d787009a1c3414eac150bbec20649cf01d77e2","0x000000000000000000000000000000000000000000000000000000000000000f","0x0000000000000000000000000000000000000000000000000000000000000010","0x000000000000000000000000000000000000000000000000000000000000000b","0x0000000000000000000000000000000000000000000000000000000000000008","0x6b89ba675dd260ebd3e7645241a549e9f4159452ea345e27e2a898d0bee094ac","0x0000000000000000000000000000000000000000000000000000000000000005","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000013","0x709cf7b3021c74484e2991069d4c044114525d03ab6d9b0914fa7c2cd637d43f","0x000000000000000000000000000000000000000000000000000000000000000e","0x0000000000000000000000000000000000000000000000000000000000000012","0x0000000000000000000000000000000000000000000000000000000000000011"]},{"address":"0xb0f47bb61f572c57d5ced3ed752ab35fe9ba5940","storageKeys":[]},{"address":"0x91aae0aafd9d2d730111b395c6871f248d7bd728","storageKeys":[]},{"address":"0x9696f59e4d72e237be84ffd425dcad154bf96976","storageKeys":[]},{"address":"0xbe83fd842db4937c0c3d15b2aba6af7e854f8dcb","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0x436c76637ec45821ee451be285588267361632d4","storageKeys":[]},{"address":"0x16938e4b59297060484fa56a12594d8d6f4177e8","storageKeys":[]},{"address":"0x522659c04120d93e8379b8b90675fa3fb4d128c7","storageKeys":[]},{"address":"0xa2327a938febf5fec13bacfb16ae10ecbc4cbdcf","storageKeys":[]},{"address":"0x34d655069f4cac1547e4c8ca284ffff5ad4a8db0","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000016","0x000000000000000000000000000000000000000000000000000000000000001b","0x0000000000000000000000000000000000000000000000000000000000000019","0x000000000000000000000000000000000000000000000000000000000000001a"]},{"address":"0x510100d5143e011db24e2aa38abe85d73d5b2177","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000004","0x13d7831de0a876e15144da77c3e1c9af9bc958eaa402e45fd8f2948f5b26e696","0xcfbc7dff249f698c9d6711b53ecdc089a6a98c03ce65d25900f5eae46de6b732","0x0000000000000000000000000000000000000000000000000000000000000001","0x291ecf6a8ffada34cbdfdd1b0877aa002bbd3215a408671f73c69bdd591ffa12","0x13d7831de0a876e15144da77c3e1c9af9bc958eaa402e45fd8f2948f5b26e698","0xcfbc7dff249f698c9d6711b53ecdc089a6a98c03ce65d25900f5eae46de6b734","0x13d7831de0a876e15144da77c3e1c9af9bc958eaa402e45fd8f2948f5b26e697","0x291ecf6a8ffada34cbdfdd1b0877aa002bbd3215a408671f73c69bdd591ffa15","0x13d7831de0a876e15144da77c3e1c9af9bc958eaa402e45fd8f2948f5b26e699","0x0000000000000000000000000000000000000000000000000000000000000000","0x9b637a02e6f8cc8aa1e3935c0b27bde663b11428c7707039634076a3fb8a0c48","0xcfbc7dff249f698c9d6711b53ecdc089a6a98c03ce65d25900f5eae46de6b735","0x8a9a513b9791a18d5272680de0b8170980d584db74d5cc608d89e97f4ae4c892","0xcfbc7dff249f698c9d6711b53ecdc089a6a98c03ce65d25900f5eae46de6b733","0x0000000000000000000000000000000000000000000000000000000000000012","0x291ecf6a8ffada34cbdfdd1b0877aa002bbd3215a408671f73c69bdd591ffa13","0x0000000000000000000000000000000000000000000000000000000000000013","0x291ecf6a8ffada34cbdfdd1b0877aa002bbd3215a408671f73c69bdd591ffa14"]},{"address":"0xd358c08c4db138e272a12bfc12ba19d5e48f5b93","storageKeys":[]},{"address":"0xf89d7b9c864f589bbf53a82105107622b35eaa40","storageKeys":[]},{"address":"0x4976a4a02f38326660d17bf34b431dc6e2eb2327","storageKeys":[]},{"address":"0x49bcbc58848ac642b48f3d824d8b728a1045d08b","storageKeys":[]},{"address":"0xf5f5b97624542d72a9e06f04804bf81baa15e2b4","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000012","0x0000000000000000000000000000000000000000000000000000000000000019","0x0000000000000000000000000000000000000000000000000000000000000011","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004"]},{"address":"0x3edf79a7116c278710f57b5d65868ddc1b05e961","storageKeys":[]},{"address":"0xca978a0528116dda3cba9acd3e68bc6191ca53d0","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000016","0x000000000000000000000000000000000000000000000000000000000000001b","0x0000000000000000000000000000000000000000000000000000000000000019","0x000000000000000000000000000000000000000000000000000000000000001a"]},{"address":"0xef8714b07ddb4b5d696cf9ab5410eab2a0c87a16","storageKeys":[]},{"address":"0xad3b67bca8935cb510c8d18bd45f0b94f54a968f","storageKeys":[]},{"address":"0x41a9284ab19b4ac1b51ba8764fa88abbb20b50d5","storageKeys":[]},{"address":"0x0d9bdd2d61a37bc074e59b2801f32deee01307e5","storageKeys":[]},{"address":"0x683fd5839bf6711be73e6cd5aa4c805d032b96f7","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000006","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008"]},{"address":"0xb1102f47a14c83410825bd18bad1821f00119b6d","storageKeys":[]},{"address":"0x01a8227d4e7c3068ad1000c97a059af5c5fa3476","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000001","0xc0d1c00078410fd0164580b0bad93d8a579580d06cf45fc2696a823498097b8a","0x0000000000000000000000000000000000000000000000000000000000000008"]},{"address":"0x01a656024de4b89e2d0198bf4d468e8fd2358b17","storageKeys":[]},{"address":"0x98c3d3183c4b8a650614ad179a1a98be0a8d6b8e","storageKeys":["0x798ccbe29346a5fbfd5a444781e94d0e404758abd7e34bbd55822bd2969d23c3","0x3d6c880dbe83a61b61e484448c4a8fabd735ff864eceb2b2740317b00698e5f8"]},{"address":"0xfd1b0b0dfa524e1fd42e7d51155a663c581bbd50","storageKeys":["0xdd2aaf728de1badb8028337285ba3f882448f8b67d085766ca4e9dcc16e76bf5","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0xd037c46e359becef964a4c93f37d3556ea4f4d1b7fc3c91259fd3470bb97f91a","0x407ee88c92128c4fb2d87bccef49c2ed77da8dd4c42d1290e52f65b99d73b1c0","0x088fe431716beda66b88ace281baae3af3de6a810cdd75749ccff0db9b65c139","0x5e0a0998229e2657df643643b812a918a6425fd66f8a5d5ea17a0825d135a0a3","0x9d776bdff006e72540c6bdfa8fb43c7ea4f1a8a42b67468ebb4db11ae2f55534"]},{"address":"0xa3cc77c73985295322f02a469b4c3eb42a216f56","storageKeys":[]},{"address":"0x1c09a10047fcc944efde9226e259eddfde2c1cf0","storageKeys":[]},{"address":"0x8290333cef9e6d528dd5618fb97a76f268f3edd4","storageKeys":["0x164c0d431a999b5e9f4dfeeb03c48841235e3d171aa85ecb5a0f46085a773b96","0xd0105956e73d61f078a756fad8fb1b3df08cbfd5f3933393ed4896cc9e3885fc"]},{"address":"0x21a31ee1afc51d94c2efccaa2092ad1028285549","storageKeys":[]},{"address":"0x5ec4bfcbc12deebbe745d7d92801354fdaa6452f","storageKeys":[]},{"address":"0xa06591252908576a0f64a8560ec0c8051782377c","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000001","0x68204d3e2297f872eb73477faa1fbdbfa51c71bfa8f2c8965c0a812935c44513"]},{"address":"0xab97925eb84fe0260779f58b7cb08d77dcb1ee2b","storageKeys":[]},{"address":"0x4dece678ceceb27446b35c672dc7d61f30bad69e","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000016","0x000000000000000000000000000000000000000000000000000000000000001b","0x0000000000000000000000000000000000000000000000000000000000000019","0x000000000000000000000000000000000000000000000000000000000000001a"]},{"address":"0xef9080ae61c13c8d389b1811b5708fb363f39be1","storageKeys":[]},{"address":"0xbdeea7bfe465daa4456fb3521be86a488cb0a720","storageKeys":[]},{"address":"0x0a4786366744d0b9b8da18b21418839819f8c051","storageKeys":[]},{"address":"0xe3a0c5af7219321b7c770ceddbf9aece6fd0bc9f","storageKeys":[]},{"address":"0xb4d8d1207d121cca5daa80bb866c23f22a98b95a","storageKeys":[]},{"address":"0x485641b97eb6a6824561f412e7e10b78a86d069f","storageKeys":[]},{"address":"0xaac31c17ea10868d540d251d70734e1c4172a210","storageKeys":[]},{"address":"0xb37d01dad927ea39c8d0aac77e5c3401614df47b","storageKeys":[]},{"address":"0xccdfae588bf1021af8ab44e3c2278dc93c5ca68f","storageKeys":[]},{"address":"0x6704ba24b8640bccee6bf2fd276a6a1b8edf4ade","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000004"]},{"address":"0x47312450b3ac8b5b8e247a6bb6d523e7605bdb60","storageKeys":["0x7184681641399eb4ad2fdb92114857ee6ff239f94ad635a1779978947b8843be","0x177667240aeeea7e35eabe3a35e18306f336219e1386f7710a6bf8783f761b24"]},{"address":"0x1b69a61ce5e513d117ed6b4468c17caa65a9482d","storageKeys":[]},{"address":"0x1f9090aae28b8a3dceadf281b0f12828e676c326","storageKeys":[]},{"address":"0x06cc6689d7b1a5cc72a7ef8d1f34e32a0895dc7f","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000006"]},{"address":"0x3802365eb5bd7a6bd842fff1712dc22ea643d2ec","storageKeys":[]},{"address":"0x07cc1c55559f6d2ede4f5fcbe5dc00e709ff2b60","storageKeys":[]},{"address":"0x66538115c011f038bcef6d315e5ab708aba1c139","storageKeys":[]},{"address":"0xc2500bdbcd6c796ee773517ea5cc16e641e6536d","storageKeys":[]},{"address":"0x1885de8f5773e09cd01c2246508897a40de06160","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009"]},{"address":"0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","storageKeys":[]},{"address":"0x196fd74a25c501d265fdd2d2060a56f09feaae63","storageKeys":[]},{"address":"0x958c2f111fb32f63f51bfa028228a99f6948c68a","storageKeys":[]},{"address":"0x6c2f2ea95392f22d138be349061bd55e18e0d946","storageKeys":[]},{"address":"0xe723a79bb72b6e7aa8f6793c919c776499f65aee","storageKeys":[]},{"address":"0xe6680d000f3c27b148e61346549fddd682e7cca0","storageKeys":[]},{"address":"0xa662f3ba49baa8fc47a65a8c60cf6e10c015e891","storageKeys":[]},{"address":"0x55fe002aeff02f77364de339a1292923a15844b8","storageKeys":[]},{"address":"0xb3c8a4d882533bb072542d2f984b0b5ed91d246d","storageKeys":["0xaa7e57c8186bcdd6053b575b17d4cdbe2fef89cd6b5ca7ef6494fbe1f9f66b8c","0xaa7e57c8186bcdd6053b575b17d4cdbe2fef89cd6b5ca7ef6494fbe1f9f66b8f","0x0000000000000000000000000000000000000000000000000000000000000007","0xaa7e57c8186bcdd6053b575b17d4cdbe2fef89cd6b5ca7ef6494fbe1f9f66b8d","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000001","0xaa7e57c8186bcdd6053b575b17d4cdbe2fef89cd6b5ca7ef6494fbe1f9f66b8b","0xaa7e57c8186bcdd6053b575b17d4cdbe2fef89cd6b5ca7ef6494fbe1f9f66b8e","0x07df5dcb11728897fe45be352ce3b1668d72476db7654902ba25e4b2beb5baed","0x0000000000000000000000000000000000000000000000000000000000000006","0xef02b428b8c6bd5944ba90a63343d128b47a6ff0be582ac1f365506dd06c1b06"]},{"address":"0x3fda25f27211a138adf211f4c060f2149674be6d","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000001","0x000000000000000000000000000000000000000000000000000000000000000a","0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e564","0x000000000000000000000000000000000000000000000000000000000000000b","0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000006","0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e565","0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563"]},{"address":"0x762340b8a40cdd5bfc3edd94265899fda345d0e3","storageKeys":["0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"]},{"address":"0x0b981d98e857c888e00d2c494d24dc16a12f8f3a","storageKeys":[]},{"address":"0x183a6cf1fc6504138d92c9d663094ee774f80038","storageKeys":[]},{"address":"0x1d8e8cdfd7d5a946bb0ae2965ae44a4b6f76d2c8","storageKeys":[]},{"address":"0xda3ca7fd218535d78ea9c351723e38f01591ada4","storageKeys":["0xad91bdf316595464714a4f9b2538304767ddb9763115d960efc5cddca3d04ea7","0x684171f71bca4cc6bfb1c3b466138198fce7831a43f9c3c840a03da1e5e476cf","0xbca3f838d730ae2728eba81f5806986786f6f12f7baa90e2f78e0fabd83e6bfa","0xa0ef59b4a0464d8b6c2e766414385e70c3aa2b5211b6e4ce24d4bb8583670423","0xeb40862b1d6c4ab7ecfc5aea55b22c875e4ab0a78d1a611b68c7ad49f7631166"]},{"address":"0x6de5d1c8e7d4f4899ae697ebdc0950c86a5fe29e","storageKeys":[]},{"address":"0x2f5ada12977252feaccc30161aef856e4607d2be","storageKeys":[]},{"address":"0x3f9cefc546a8e8a99a8679e4eaab6c7a205d14c5","storageKeys":["0x06388ffdeba23b161819118d98fdec1aee658dfa589a7ab8d1a69a650319e541"]},{"address":"0x6edf968da408a9640b8865826429a977a11c5048","storageKeys":[]},{"address":"0x390f3595bca2df7d23783dfd126427cceb997bf4","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000001a","0x0000000000000000000000000000000000000000000000000000000000000016","0x000000000000000000000000000000000000000000000000000000000000001b","0x0000000000000000000000000000000000000000000000000000000000000019"]},{"address":"0xa2496639f55e23c758e307693a15896bddc3a188","storageKeys":[]},{"address":"0x056fd409e1d7a124bd7017459dfea2f387b6d5cd","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000003"]},{"address":"0x32d77a95a359ba51790b54cb052e079beb852de9","storageKeys":[]},{"address":"0x6cb3ee90c50a38a0e4662bb7e7e6e40b91361bf6","storageKeys":["0x98e24e2ef8a5b861bd7570ec0d03f954502d13fe8a18f87752ad6e25748ae75a"]},{"address":"0xac80db567cb2c95995e31bab2c2fb140c20aa4a5","storageKeys":[]},{"address":"0xe16169d9fda471915d8e5d0f9fc197e60eecad92","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000b","0x0000000000000000000000000000000000000000000000000000000000000010","0x000000000000000000000000000000000000000000000000000000000000000d","0x0000000000000000000000000000000000000000000000000000000000000009","0x0b37903c5d83399c9bb463007fa09043c453811bd9be56788366d19b103aeb1d","0xaa69a36f51c5e9620c289306b11c6fc2bd0473378cb7d42100f1b628e8dbf63a","0x9d8c30166c451c1ad833ed6ce91bfdf91c26c5cfe936a74a3d3d8733a134f63d","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000013","0x8d6d63b6e5ac5b75255cca0d0a178713a1ea7a55972d31894f3f02f11fe6e04a","0x0000000000000000000000000000000000000000000000000000000000000000"]},{"address":"0x4585fe77225b41b697c938b018e2ac67ac5a20c0","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000107","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000001","0xa00e9f45e9f0c328446d13a90db1b8ff531c4946ba6a4294a1ec03159cc44b19","0x0000000000000000000000000000000000000000000000000000000000000106"]},{"address":"0x65ff6396cbc816c6228f9950b379639a3c59db35","storageKeys":[]},{"address":"0x96c41145ef781e708f964e1f3adcaa7b5362daee","storageKeys":[]},{"address":"0x7b98421b9314e3ffc0b7a593dba2fbbd3b789c7d","storageKeys":[]},{"address":"0x99a5995bd8fa3e1209a5272c4c6cc3365cfab0a8","storageKeys":[]},{"address":"0x5965aa32f7228ee98dd719223d2a56e323fc1b80","storageKeys":[]},{"address":"0x8aa1907d79e6550b4519db4643d91cff099b2e4f","storageKeys":[]},{"address":"0x43b57cf089e9913e10ef5db68f22f4b9eb3955ff","storageKeys":[]},{"address":"0x82643b1d5aef4d8d33e401ec740a19d416296af5","storageKeys":[]},{"address":"0x253553366da8546fc250f225fe3d25d0c782303b","storageKeys":["0xea6fa780d64bf3048c7451cabee352f576414b4390d6a804e339aaf70d0e4d61"]},{"address":"0xdfd5293d8e347dfe59e90efd55b2956a1343963d","storageKeys":[]},{"address":"0x44affdf87abfb1dba08e444141bd21b4380fa35f","storageKeys":[]},{"address":"0x9360c489056b64d5003bf22f4f31458e31cc8028","storageKeys":["0x11d4878f38cb02a2aec0b48814f1adc17c786149b4c9b2fd3cb835b82255b78c","0x7d99187d1873de6d33dbd2deb14dd0551b0a956cf666dbf2971d7aae54ef3f25","0x000000000000000000000000000000000000000000000000000000000000000b","0xff80cb5d74f875c4c9b96b4a2bfd57cd852a68009b00a5a8a4faa6ed4a2097da","0xfa21456d63d8f5b69fba20e5a869692a200d1017783f11111a212ac21c5dd9a1","0xc68df7b4e42bc12527e4b5dea0db1f252230d177a57a98542f41645f8f8358b4","0x0000000000000000000000000000000000000000000000000000000000000013","0x000000000000000000000000000000000000000000000000000000000000000f"]},{"address":"0x4a585e0f7c18e2c414221d6402652d5e0990e5f8","storageKeys":[]},{"address":"0xbfa7fc8681fa1e1bec716e5308687467b5b10434","storageKeys":[]},{"address":"0xfa103c21ea2df71dfb92b0652f8b1d795e51cdef","storageKeys":["0xc82ec873a6c5c50ca9e6566fee5dd50dc037203c45ebf85bc4e1cf94fa5db768"]},{"address":"0xcda72070e455bb31c7690a170224ce43623d0b6f","storageKeys":["0x9ed27f3e2683378f15b688de9ddf40d0fe3bf7aa5453c0cb9416cffdb14169bd","0x9ed27f3e2683378f15b688de9ddf40d0fe3bf7aa5453c0cb9416cffdb14169b8","0xf9bed5247993478dc5d16f0c77265cb8795360b0d8437aae5874ef087b36ebe6","0x86bdbe699efc3b109b89a74290615a1759051acbbb3ab204ce35fa12ed984ca5","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x0000000000000000000000000000000000000000000000000000000000000b87","0xabd35f888415c1753b0d84994f5ebd9c98a536fe126a0df2f09154201ecd9e7c","0x000000000000000000000000000000000000000000000000000000000000138d","0x9ed27f3e2683378f15b688de9ddf40d0fe3bf7aa5453c0cb9416cffdb14169b6","0x9ed27f3e2683378f15b688de9ddf40d0fe3bf7aa5453c0cb9416cffdb14169b7","0xab22874211e42fb4ec366c8658fcd853861404d5b08b34140a1e40674f62fa17","0x72c191cc1304cf561ec8642be2d38b04875baf1348cad8d58a87e8f0e6e0042b","0x89574835f702678b146205bfd1cc761b9001d8a7c34ed73ffe1594067acbb1bb","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103"]},{"address":"0x495f947276749ce646f68ac8c248420045cb7b5e","storageKeys":["0xdda57df4e870409926434e5b0c4c253778fbe966754b34b80aa2c8cc9ff14de7","0x3a172cce141575d8528157bc701b0c730c30f8908b13eb0ffe40a793aa643132","0x0000000000000000000000000000000000000000000000000000000000000009","0x1bc16e4ba07bd6e63f05afe4bbe02a5a5635e067c7ca8f7c86347a1eeec4112a","0x6cc219b0d8bc1e527b4b91876084e02e932d1ba5d8e17771c501824b3f1b128e"]},{"address":"0x09e050f40b3ccfaa568680bf0e459cf8dfc4157e","storageKeys":[]},{"address":"0x64bc2ca1be492be7185faa2c8835d9b824c8a194","storageKeys":["0xd0f22434ae801684604507b0f916246281c85b35845b3101e7af204047f9ba8b","0x02e7b28389f232d3ff086b915490d996ae81376004584f04b62d24929bbfa851"]},{"address":"0x7df70b612040c682d1cb2e32017446e230fcd747","storageKeys":[]},{"address":"0x813ffae25b9b8c909ecc9e2f9747006e0b43d16d","storageKeys":[]},{"address":"0x3c11f6265ddec22f4d049dde480615735f451646","storageKeys":["0x1a1e6821cde7d0159c0d293177871e09677b4e42307c7db3ba94f8648a5a050f","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0xfad45e47083e4607302aa43c65fb3106f1cd7607","storageKeys":["0x5de8a9a8608a25ea2149c44c6688f84ad6dc2750a9c9a2a30ccc8b52134413ee","0xf9e47bc758ac4ad062d6f5e4396dd7687f046ee4d8af5509937c4cbfef37a918","0xe81fc8824ca636e7885995b240a9317e7d7a5d62ddb4774f024d0a65755ab117","0x0d80ddd128d9961c8eb52e7a2730e4bf9f454e0830fd51e14407f7de9858eb1b","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0xa2e6f9ae7e5a6976e991a0f1d1a6423d90fc5512485585823fcf930f155497da","0x5558e77ec5ea4a1abd00515f540d76026a0f4d32a192b5d5574e8795fb743daa","0x7b758fb15bcbf67d69307045a77010c2ffbfbccc2172bdf7ec5c88fc5c2b6883","0x0000000000000000000000000000000000000000000000000000000000000005"]},{"address":"0xa4fc3b806b041644133cbab7322d5c339e3bf289","storageKeys":[]},{"address":"0x6d542032804c31a6f2a945eb8b7b9942ad05695e","storageKeys":[]},{"address":"0x5ee4182d976b3f3f746085a9eb814efcc23fe807","storageKeys":[]},{"address":"0xbf94f0ac752c739f623c463b5210a7fb2cbb420b","storageKeys":[]},{"address":"0x81321d9c5cfa21e506804308070d2b0f0988af7d","storageKeys":[]},{"address":"0xbabc7768584fc8f9d2a44f4b0abbc60d3b6e20b0","storageKeys":[]},{"address":"0x712e8fa890789e98a058277e69ef1806d952b79a","storageKeys":[]},{"address":"0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000002","0x320975846a116b11411a5cfde94c56d7713040529fd53bc4095fb1022e45da01","0x0000000000000000000000000000000000000000000000000000000000000198","0x0000000000000000000000000000000000000000000000000000000000000199"]},{"address":"0xe17b8adf8e46b15f3f9ab4bb9e3b6e31db09126e","storageKeys":[]},{"address":"0x2889302a794da87fbf1d6db415c1492194663d13","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000011","0x000000000000000000000000000000000000000000000000000000000000000b","0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000012","0x000000000000000000000000000000000000000000000000000000000000000f","0x0000000000000000000000000000000000000000000000000000000000000009","0x0000000000000000000000000000000000000000000000000000000000000005","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000019","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000000000000000000000000000000000000000000e","0x0000000000000000000000000000000000000000000000000000000000000014","0x0000000000000000000000000000000000000000000000000000000000000006","0x000000000000000000000000000000000000000000000000000000000000000d","0x000000000000000000000000000000000000000000000000000000000000000a"]},{"address":"0x102c776ddb30c754ded4fdcc77a19230a60d4e4f","storageKeys":["0xf92db79275607c63b17540432ae9716dabb49afffeda41d08e1e5983746bf17f","0x0c53c9be7a44133a6055bca7a90b2a9f08297a3ac104866dbc14f2d1a4742440","0x49b6a19b11278e1931d2d2ea0cb8ed7dc06efd7b4db8cdf04f81609cb57c3152"]},{"address":"0x60e4d786628fea6478f785a6d7e704777c86a7c6","storageKeys":["0x0db52fef7ac1e68d90cf210ff115fb5ba93ea209bf93946cc5eddf5ac1cad283","0xfb4522ada2189179f8dc298bb297ed4cb70263aa7edbb557aab139c9695be5e8","0x8e77eab1aa2d4973dcff86cade1383ad357bd254e574f6df40d266340f53df26","0x43a0d0213bf1caaba7ed8ed43376d575e467a447cccce8dac9f0bb0c3e4dec42","0x9fbdd789dde3469194f6a705ec8477347176940f0e80330d3044a72a223d2820","0x79a4d452c55560a09894bb1499cd87bae5eaf26e1250f7aec635dde4cfae0512","0x59d5d01e7401183e7d3d5e0b35a1bde0fda576aca009ef4b5e1a126b91a8e46b","0xbeb927c11da198cac04ec1d81f444b65cd1d20976d028ad6d4f26608250e2e66"]},{"address":"0x737e8a8b5f36a388638285d558f80af7fbcecb8a","storageKeys":["0xe52269ae564610856d56e338ed9390f2ec01c35e17f0002c27cb5853b87ebed6","0x48dd75081681b92f9a19c433ca1b9f0d3d78280b9a4c275b2c37559f8fca1cb2","0x5ac6d4be4e02314ce9abcf7ab6a6d1e10a52c7b923194d53cb1e5c6c8a1a3826","0xf2ec168eb5f145359355b5f1959fad560aab1521350ac467b1c75e89ea450712","0x0000000000000000000000000000000000000000000000000000000000000007","0x8962cc3b6af7d5d5edcd7e5e1b9c92d160f40012ed1fda69477c3187f09b09ee","0x8793485b703ebdf444b964d20fb9d47f22f8c33c27c9cec4e6e1060e9d06431b"]},{"address":"0x6c3ea9036406852006290770bedfcaba0e23a0e8","storageKeys":["0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3","0x0000000000000000000000000000000000000000000000000000000000000004","0x753dc6eec079d2847df83351b4b8d748b683602de39157d548e2725b2d4985cc","0xb7cabaa64a97d062266fae1066d0e9cf7fc8fa1ef26cc174e043956c752a361f","0x53baa87b079572ab05ef794a999f3409b582ee2b112cdf59f65bd75c272cdf5b","0xf7bf5693159a0296acb909949d160ef1224a2f70d7807896ace70b581ba794d9","0x10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b"]},{"address":"0x00000000a991c429ee2ec6df19d40fe0c80088b8","storageKeys":[]},{"address":"0x5cd0ad98ba6288ed7819246a1ebc0386c32c314b","storageKeys":["0x23863ac85e56a9dce6a22321f49a3501475e9287498cbc70613b3c8cbfb68976","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000001"]},{"address":"0x28c6c06298d514db089934071355e5743bf21d60","storageKeys":[]},{"address":"0x30252e9c4939c78e816dafc3c5ba85f795b68ae9","storageKeys":[]},{"address":"0xd0ccc331f506c7136f60af96eded503fa9325e16","storageKeys":[]},{"address":"0xa88800cd213da5ae406ce248380802bd53b47647","storageKeys":[]},{"address":"0xd0d56273290d339aaf1417d9bfa1bb8cfe8a0933","storageKeys":["0xb17349740b669941baf55dc09d27353d5066f7515a585f533b40596bae334695","0x884f7af8de1a839be5dd78276d8e88301081df8906d2f0dbf317dc73ab5b3785"]},{"address":"0x31ba6d26bed04a9c57ea29e9e1d2fe4ad47fc742","storageKeys":[]},{"address":"0x5f20f761e3295c4000eda5e193d5e8d615a3173b","storageKeys":[]},{"address":"0x2d7ad24586fa7a37793d09a5dc1a23ef3ec1c468","storageKeys":["0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008"]},{"address":"0xc1c88785e9b5c9c85b3f6c99255c3bef9e3b14a7","storageKeys":[]},{"address":"0xdf0040988afbf833e01b066e62c533e1f9e1fea5","storageKeys":[]},{"address":"0xd2eb2b74a54810d4ab7f40f1755ac8886a32d04c","storageKeys":[]},{"address":"0x4150b9603bd87ae5c1aecdf4aa348699af1754da","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006"]},{"address":"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48","storageKeys":["0x652d9f5f997b5f97e51c16692541874ca0fc43c98a2aeb85fb26080523d19b3c","0xade11d57f3507738da5732bcfe92a97b492528d4936caf6db8e9435f97ffdf7c","0xc55094e10dd4285a5d505f3cf2e60b608d125b4dda75794f39faff26ed911166","0x7f7203a2058a84ecf5c8f273f70cc7a8dcf56817eb23737e10d311cc0645939e","0x0ab58d56267315b348dbc341e0a9e437774da90ca5cff1fe72f49ce8bd7b0616","0x006b397494d73917e338e799d3425c97218b23605e900f757da88b0e95f62ce3","0xe392a866ce3af318d7e4e6c4e77f4984c9ec10bf9fd7236d1149734fd0a9201e","0x86ba3ded4b0139039c811809da71f46e8f55f5f71f58d40e9afee4798c0fe602","0x65c375c7599fa60be96ec5cd9e11e971243fe7aa688e0fd5733d1f0a163477db","0xf7bcb3e3f878e3f98fe5f78303eb156247e623aaefc5d36ead5c4de7d360bc50","0xe6a9f39063407d4358a1f0f522bbf3b830a44d9664095275ac643f9b464f227a","0x0b8a7e87c24f5d537d642858d09a91be86fdf4df52568c92819045e308a16b8e","0x688c3e002289fcdae99fec728919f8c58bf4a63597b51cc1c50519b02f2fbcb4","0x8952f11a28370b81a6fde973a4500503dad313c52fea41c3f6cff659aecc3ec4","0x52e446fa4ed99aa901145914748e932382fe15b50f063bc34357fe61b3fbbc39","0xa743409e35c9b8ba7979fc827ea69d7932a6865dd7b2917c84932da1b0c0d28e","0x56ebc994366a62c777e947e09b3700e6df7595db04cb4faa84997be984d30d98","0xa68739a1d5963494e4a3668e03db30668b1e0b9f7f15b32ae71197796736dc2d","0xab8653e182d66c8e3913ad65bdd1242570b13dd7b282f7091290d22a98d6d139","0x15afdbd81421f8919789af2e1429235108b484da1839acf2875840648c5c7476","0xfae2b57c0dbcb03b987aa0b81d3794d7770ebd1eb2f8093ab7520a022b679091","0x7e37db77d7b4ecce61487c082463092f13f68f86e67510d9a1965c26bd765962","0x6dfc3055bc2a382f15970adb34c5e72407691ebbec5e1ad8fa1af139ae602141","0x73965bd60672e44c2dc7fa955b980c15bc90734c8efb1723bd99d1b99e70c793","0xc87c4394424eed933585252cdc68e118b6f654e86e921d6c00b9ca14d7857207","0x7207638b97a836e420b5a589358d78c521c2436aa854cdb08233148b0cec6472","0xe8fc2593162131d684821f109e149650b93c4115201346ebf25bfa4427e34987","0x39a528031c821151a0357442b7ae7ecce02aeec01c8255f8ccdd708707e959c9","0x979736774f589820adf4f8e55c518faa23895a7b396c0bfb390dc0236bd1ba26","0x10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b","0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3","0xbb5864a076ae8e7753e0d4ac2c76072267c6d29d2414ed69905a9d29bddf0108","0x94ae115ebba1f0740a20a15df616ffab6c27b854fb795b9868e5222644ca101b","0xa6fe96299ff0e4cb6c4c51fe56c7601ba1ab418c635f532468b68cbe9e7ed57f","0xc55e228f511308150874de49845c51312aedb276bb5c51a28704f462f74352ff","0x89699e3e37cfcfd00017a28dcc1f89bcc8204ecfc61fe478b0cb7e46897b1ca6","0xa17ee3403718b12b5516b501605e11f62f70223d5a39c422201db9668fa83066","0x5061802a03d635796e1d7de25b91df361e46df671266b83ddd1da425a559bc39","0x61a50af710286a981638e6c47a4a314578a1dadff296e09fb741c5506d4fe7c4","0xfea107046c7bc4c4541e8a89f285b5920d226d60ade521e2341aa0d495e995c1","0x7b45abe437c4682a8ec98870a87fbe031984828bba27fc717e4a8825b562640e","0x2e1cef28272cd277cf67a219816c70c9877674ee855da442865fabfe77161e27","0x0000000000000000000000000000000000000000000000000000000000000001","0xba212c792c69e3e201e5a246ddc30e309e54563370d831947f7ef2a97a43f41b","0x749878fb8d62eed37d5800bd02f2ce973ba13375415e68b74ff303f7158e7182","0xf5fb98b5a92c92ed2c7e22097b2d6e1f0a05e723390ce2f448fdcb655dc2863d","0x9341eb2ed9e88e3aa5e27de8b1fd750f2acff3fb5bdf63de6f367ea4475fc6d5","0xfa9ac48faaee568b7f72a3a19be660d254ad3422b0b09692ed8a8f785dbf4ad0","0x3e4b759bc7348364c10367783c1ff870df4051de361c3bcd6b2ade33c84aa710","0xa545c2690686f37ebc3c1b41222d5889a73d178466a6ca3dcb246b8b593c6737","0x86405c6213719b5e63a2513b579a0631b147e7e06935d7301805b2237936c17d","0xe950ca2c7f2082f2d5b21f0595e3647938578fae29611e88e1a0818815f9ca40","0xc9c9828e1907827d4d7f6a8ed266ba157da9d4cea3364aeaa07338ea8fb173e4","0xd88f6cfd89dcec527072c11cfb20c07c1379e59c09883fd2db8799f54dde725c","0x23ac45fef68c977e2f5bc2c50b9d223748b3d46a3bbf1b70580fa502e02e8c82","0x598ec8a898ad8bf227c0c980c790d87c47401aab72bb7104ac64698200b82660","0x5324ab947d8d46b24e1c9c13b7763c61b6d2597164be887dac5fee7e1cfe2f4c","0x1f21a62c4538bacf2aabeca410f0fe63151869f172e03c0e00357ba26a341eff","0xd4ed0216ff6d852ebc1a82adddf442f64739833d085051c7c0e99c354a6a773d","0x45544f144ac23be62f2d1b3bbe9593176ebea62c731b38425d489a7b202f73e4","0x9c1bd01eb136da68a31672146a239cf3edbdcf00587b9f997e59dd826943ba6b","0x1c02d8ad8a92af61948fcf310180faeb3e042273d345f868b8bb99130f698ba2","0xb6fc83e68c32ef51ef1678bc964cb1dcb58449d9dfd5bd68accbd31ef3031f8e","0x390f6178407c9b8e95802b8659e6df8e34c1e3d4f8d6a49e6132bbcdd937b63a","0x57d18af793d7300c4ba46d192ec7aa095070dde6c52c687c6d0d92fb8532b305","0x07a1af68f3001ecf7768f222017b4ada1987a76d04b24cb424c1846c072b042a","0xfee1fad047ec04bbb7379da05703deaca2b5d734ed74e7024c97ced1e7a07caf"]},{"address":"0x2cc3941d7e7a3fa5d55d75b25748e497e4f83c46","storageKeys":[]},{"address":"0x7698136f5a4334d684bb9fe24cc5b0ce9eaf9b6d","storageKeys":["0x461721ec8dec958003275fe9ae165e3b46a158aeb477811505cf39ea0092fa4e","0x406cf63eb2bb773c07773b98f5ad977a5f9204b76304bdfd98dd4b5d39a5f444","0x0000000000000000000000000000000000000000000000000000000000000012","0x0000000000000000000000000000000000000000000000000000000000000009","0xe04b4dea4cc1e0b44a4ec85a5d934dd4b57d65e922b5b792645880892918c37e","0x6926a48dc3e59cab33f7d4d2a3d4d1a219c18068b4efef522e25d5a717e6e9ac","0x23f0e42c5d41cf4336aa90705abdac4f268915c8824665e69390f7d0c7997606","0x000000000000000000000000000000000000000000000000000000000000000b","0x0000000000000000000000000000000000000000000000000000000000000010","0x0000000000000000000000000000000000000000000000000000000000000007","0xcb92b1fe78423854fc6429367a715be45ccbfe565e18e971c41e8a73d64fb816","0x1e4651a8fffb758e6cc1eaa3ebc1f02dfeb43d6948d5b61e6b73a38607694091","0x6a5c9f717af2372fcd4094ea59ef675788f62bdda578d311065edf5011ca9f30","0x0000000000000000000000000000000000000000000000000000000000000005","0x000000000000000000000000000000000000000000000000000000000000000a","0xd71e250b79e6d4cde70a94636ebd2b6274cbaa8891cedfff4289bd1e5706a7b0","0x4821de4fe4d96b6f3c4523f4b09c820be2bd391e8ddc3374c8d8b286aa133358","0xa6089659559de7ba94081fff6316dfda593b3fa0de6c8097f6a3c8fe0e895727","0x0000000000000000000000000000000000000000000000000000000000000016"]},{"address":"0x3e88c9b0e3be6817973a6e629211e702d12c577f","storageKeys":[]},{"address":"0xdf49640412a9c20e0c682a32d5634e8329b01ce0","storageKeys":[]},{"address":"0x3ebb7644beb54b0bf7e025d8c57bf6b510219eb0","storageKeys":[]},{"address":"0x4755e870ca2b6a14bde1f6e9c609127d79d45d55","storageKeys":[]},{"address":"0xebe080c88f6d65fd055aaf0ede7b431eb284450d","storageKeys":[]},{"address":"0xba3e9eb33debbee2034e79c22179529cde748275","storageKeys":[]},{"address":"0x743bde31afcf7dc99a3114cf2b41461747c8c038","storageKeys":[]},{"address":"0xd5ec6bd06614f65ffd6428130d8015875dbb22e3","storageKeys":[]},{"address":"0x415ff1afc201eec50beff210a2f456674046920b","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000006","0x637034ff9a9768ec1d42ca6e42f6582a3447eb554d12d9f5461218dd45d1b84f","0x17689189b141d9ec4da970d3496672f88dca32f673cb742ad5dc8439c78cc0d0","0x0000000000000000000000000000000000000000000000000000000000000009"]},{"address":"0xdac17f958d2ee523a2206206994597c13d831ec7","storageKeys":["0x70515da04a4268741351ec855f9d235ce7d119b0e688543cbb556e75959dd03f","0x80c5ef2938ffe75df2492b36d511e68cb42632c695e6936f175a3efb51754606","0xf17c13ce4220b1b08a2f36a749ac31c915354ba67ca82a5c702217e3df0732ef","0x8032bbaad8dc69cb68b83388864605a6aa8ca1caae933b253bd93051aa37ad0b","0x24d38a466cd7bc9bf1cd75011322bb22e9eda9b8bf645c742e535e0026124fb7","0xf14a64371dccc87933d80ea6145101595fc67d31777c57bd9fa28fd1fb3000b8","0x7bb2ca684b19ca6a6c3db6aeaacd28d84543a3d093f90efb4943d686a6beee50","0x1ab66521618382b7754fcfb711212a760971309243a4920b7ac40f27518fa567","0x35eded437486b44d295479d34b8303007eaa09345cc6b9c15e99847ed5aa5523","0xcab7eb7f9df34064c3b626ce9079b9f6b25fe8559af3619dabb1e996461f59a1","0x11385df8cfe735e28398c8986e02c217b58f4eed7fe5cc6a7025fa0b8fd5ac43","0x090f09a74c30d3ee3b887c2a1998edabce26c9f7c7230db03f1f6dbeb0212d41","0x0c4a5b1497ee916636123968e453728aec8c2ff04a52d2fbec575d1056cb67db","0xdca09a2414aea154b80f7ad7e5f86ed8e6fb7bb71975ca2a9d4d3b364658185a","0x169228ca33ea854d54aa1e506e59ec687f618a41074f5f5de937a0e9c6343e5a","0xc272448af2488f07397e9ec9edc81a4092731e48a0a0b1cac645a27a49b1eaef","0x0000000000000000000000000000000000000000000000000000000000000003","0x5e64a352c6c978661601bdaa007ea81d5b4871e100837fde8ab4262151200193","0x623ae24b3d164fe3f0ec514d6c96baf40024422933cba682a003769d13f6a56b","0xb421ada65e357e7c9b681e7221e0cf816ea9cbb60f1ff1bf330e0d671ddbfb20","0x3f2e9ab70b73cab52e9f1f7e8a86cec8a6749190504b976b6084b532e43caeb8","0x4e340e511510a8bb172b54e0d3a7fc270ef3a64918df5232c4fa227fdfd2b9b4","0x5ebb1baecda4a71b84910865b25698fec8628083f9292b908e713ac651882a5e","0x69a105fc0f20abf8da4d109695e47e004964dc597456981021d48bba7bd1280d","0xae27e7fd593a51c9e99d3b3e6f880a13cbb48f81385fec69eea28f0c645d8b79","0xc3fb3728d2edc03350492bc149be59715187a17c46075a177bbe5b4d62f15372","0x63880018fa6d02bc2f3010e9f93d3bafa5831d1aaca923c890a7a8c3760a194b","0x31fee813054e2af2e7071596c45806e18a66fc239a368148733c79aa7eb7625a","0x3f24db47a08331f722f9f1dda1b01577431eb91d7f06e6f7bf96da064a998b11","0x462f5cdd8d97bd77492c481d64e144ad5e3f838c7f34529abfdf0095b1dfb516","0x6cd4fde347ba644f94b4c6b4a489c6a986c5ae549289bd2a7a749ac77c3930f4","0x119092491141f390faaa2a2e3b665c12d0ecf60aec5e3b901a2b643b52d9f2be","0x8f609bbefd0b0ba708e799156128418cea8f52187e06c10c35fa37d098c4c415","0x8ae4c49301282fe97656bdd045bf96d92c9b0c5d4585b2cb90c2015d352ae4b5","0xce4b548783a83143173f094addc3554cd447b462fa6dc74b87a90ebd6d0e297b","0x699c6015da84cbbf22282922540b46b3995d68e4c9fbc689f4eb1d761fe74d4f","0xb0985aa558190c58b53dfec81e9426e26fa99b5a560fad2d30098e61930ce34e","0x84f7b98705b836313ea492b8e1c52ee4ab5c7f32f55ed36a0295f547da157f19","0x66f9f462a0c1f0da52ff4c96a06d661ad1bf36c7cd4f4f04334b541d313ca606","0xf28e2e51f965bf951ea03e6cbe230874c0b359dabb90297cd31e0bb21820aab9","0x63aa69b65e900f2d97214c8621703f5de732ef270a5c355c82e9738d1b0ff8b5","0x61806a02d55d0d0c7620a27274300f3809bdab323ae2059c88e73898fec468f4","0xf94b05ba7d0a6aa6692eecf3cf30c6ca5d527c3e5fd03d7081ff14e4910ec033","0x6f82e09671e6c1b702bdedf3da7136ae074f5186e5ebc4aad241743330cc877e","0x1dc754466176cafd659b71e627810b7db358ad8b15914bc81ce1bff0569cf71a","0xcdd86836dd15bc4aa53d67185c5dbff4516e06e47bf6eff996a2d22c964a929e","0x047c854e050cea9a8fceefc1bb3919b6b6ad503f56deaea8be402b7c6d0e15f8","0x0c364b5a45c8ebf44d74f264b66db287c69aed0c994de7689326ba1d8a2e1256","0x931345d8e8ced50140e2e3d00b4a7e43d321517f7866496b8b5b5437b3370b77","0x87eac2970b370f009b8cd5258ea75fbd37e8d3bb5a9dd2dccb07a64cb52014af","0xd10d94fae5b609534af68d41069466722b7a10fdaa850afd2f5fa639efb2d92c","0x74a12ed2cb4d7a6186e5a4d44a36ba12de08157a3c70394bdfe8b950e524b255","0x9993c43a52480555a41d8212ebae46d368e07bf35079fccd80120dfc140a435a","0x2d63c3db42d241001776f2689e0d9bd25b4145b7c66bd878b98692ec847eb2f1","0x6377c278549216f0238d78555a835e7fd61fd3b7f83503bc6a38b910b57ab0b8","0x5109b62eb99f58f446282a6d76354122e3d8dd1ad9c6e4431e6b36667b055752","0x529076023d964f2cbd34b5184674442cd5a80e9d288c1a0e828477b906b78f0b","0xb8e28a4882605b805b283fd5ea07dbca9492afcd74925d81bdbf8074acd0a6f4","0x2cbbbad8ac0df7bcc4f545be21ab04b9959c4d49e36588f40ff126e28fd99f5f","0x78b35599871be95768b2fdfaf9293a4491ecdc8ef25b872ee404fa1e441436e0","0x7e176d7ee1937cd0f5a8d9708e47ae40128dd18307fadc9929da995c37d66fdb","0xbe97063f705c4f52dc4414896af0483081bf44f651aed7a2d6ca49643212c646","0x4346a6b1edf28d1fb579ec754dc7e1adff7dc4ce9c10c3f82b7ca327686dccc4","0x3ccf4584abc19c4830ee26723a1c679bb573712089c5bb96d965e3c66eb05d74","0xd6a434565a929fe7201160bab31815e2c4f6731e7db296ef87c600ec3942b722","0xf7f8b29625c90073921cf5324f917c48425bd90af9092f36da22dc63c7dcc266","0x997e085bc66f893525d11aebd1e6b39a0ab953b50c2f2180b1d25e6044eef73c","0x82fb8d2ad03de93b40d6d2121be068d270401754dfc447fb3116b2482e485c89","0x03b40e77a1629e4bcf95993d3c26c510dd924be13b972870a97164050a14561c","0xff2be857ca28476d23dc004b4ef9e7e8456561d21a0724a1b1dc6e29f3adbbe4","0xe01b06860ee6c0813dd5aa11faeb831db1257646a10fb41e2296ce2e4249dc2f","0x51557c3b9a605592682a4416538663403062d0607b892510562e70819e8c51fc","0x0b215c0811b6422da01a6c06be85f45d96a0aabcb195988380110a45330d5eff","0x7d52c15201a656a81204345a246938e1282ba7abe322bfa3d4b857637c03051b","0xa99a8ff891f333e1b49b1ae56756608e0e5a8dbd4f778afbb4f2ac7236562ffd","0x639b0fad8cb3c3f822c7f87d4faffe54b8e4515394bf43d17915df9c544359d8","0x9314eba2da1961c7918b8ba334edae41be78b7e0203ab269da4dec818126e24b","0x8d0043d78dabffbcd1cdb1d8e91c8c1e7ae3e6e3e414067b68566e80eac13178","0x173d84d6644ea5a602346a6b94ee0fd15ce7f59dcfc66414edbdeb89b7337b55","0x253a19d5d3ab02a1626ac8733ff3c7a807df7be9f3943783e58c4f735846fe5b","0x0c31fb571024f4eebe93d7b29baf4d47c202ce8fee58f03b15a5f77b947b0944","0xfe875e7ac35f1b40f466e78bc1e513d0392f3de308bb3680f16c75386765963f","0xb5387136582fa7e5eae5a3afc1f0188a888c4077bc055e708ba3d5a854bbd95d","0x38276b09648ee547af25c4dd73a8799aa36bf8fd5aeeef3dfcc6eab091c1f80b","0x0662e18bfbacd3c4aaba02032a3aa60074af4161eef40c7929bd1d1b792795f9","0x00747415244b58f7f02194695b6659b19c98326a90969cb5072f02b63b055356","0x94fdb57b6c90dab658eb75ae5356b7f719284edb8c2ed9fb7831ae6f07bb6d0f","0x62364ba67a8d1f69a9aed55692c1e6e689bf13655a110675a7ea1c41395371d7","0x185d806ecd93fc4df053fe912c4e67c2eb542aec644b9791369ad5585c61adc0","0x92e42ee137b983b1c9df53808975881cc130f9b3487504246bc30b9b20ad0c79","0x359293c28c9603c29153f85db7e20934d570ca9b5bed4dd3e9a720c2ab0da52d","0x2458b89008e68bc24fb241391e1bc663fa6fce673e10a26ec73d1da2f7664884","0x81fc01b61e86be0be0ccd0f06c625e565d0b1b3e0bb0d77316b95a2c78eab430","0x0000000000000000000000000000000000000000000000000000000000000004","0x09d04e6c82d7d9352a521fedfb01b851b9ce551292a621977989fa1204543e8a","0xabc6667e084aa76eeacdcfd1906d1787c744078cc3474e9390224d932fb20d68","0x2d6a7bb3059eee24a14dc70c42776d8c08a60e3fc1530ccab0d4162c8d7830fe","0x000000000000000000000000000000000000000000000000000000000000000a","0xe35cbe632c918eda8304425478032020bcc925557b3268776d28fd6026c1bc24","0x744bc9ed50522fa1eb6e774e1d2b1afd7272f8f25b82de51b6688e4bb1d1694a","0xa5922a1dc7e9ebf214bdbf41a82ea0a79af068bb068ae8522ea51811859a1c7a","0xe4490d058f96cc570a71be44f3105737cc6565ec84d798d8e60d87c32aeec861","0xecc68d48a1317e3d624f00d96507f152642b8f1923c537b2127afa968300fa45","0x719d7d05d901e9aa33f7b84f082ef9aadbf490acb57e199d25e77ff970a13a81","0x2d83cf4eba331a1327c5409269c5884d9610306ee832d9af24d5a2d2893b28e0","0x3a8f1f145d9d7331b5fa8cae999f2a4dc9c0bb32a3ead392e323cd9dcc299659","0x4966c331fd21bb95e5096f54ff5bc865ffddab6a0f3c4edcb615c80b8d472ba5","0x1940baa6064838f41701b761a340874dd1be578687bb7d75db3790e0f8cc4bdb","0x3ab474684ec430a476ab3753d607b3d22cde9179b15768f4e1318a78d78a41b0","0x3ad2db55fe5657fe773e3b7111e43f4b662a181a20e875b3b8be52dd9f0e2333","0x6e9e84ae7b8edc848e54262afc59a03baa298e039f2917f989989f0639ac12e4","0xe6926121e5bffaa7aee92b9a2048fd29617a792524626c9a71c0fc4dbc581e96","0x71ce39886cded666b2cea65cc176f07339e69f1b18e8ea0b949cfe571bddb501","0x6351c5c6fc4d713fe37381fc275318f1c3c3f7ea16436c61c7be810168a824d2","0xb7ddbfd200ea853b1e9512269127e11ed034a71c0a9ebcd9379ba1f95905c854","0x6a5135028658c5fe84262cf604ce089ed1b8f490b92ca50c723d7c1f5c870507","0x823adeeb59c1bd04598363f7eef4844c129d3175248a2ec5bbe63a32f1fdc5ad","0x2de45aa08973c6fceddda16f130e4f4a84841ca25a1fae4a4a37a89d4d2e0ea4","0x52f220ada7cb9ff90bb6f412551fec8c9b6c2801a502516004fcc2703e945769","0xd2d307582ed5f8f6cfcbfa917ab2e3d3d69a46ac0aaf330a54daacce14784bcb","0x21cec826884609e4e521695b19972226e65ef6ada141838b7a09e7c2fea20c8a","0x7a29766aac1dbe62f4e0f495f9efd26ed31af828ea799d1401079f2e1a05afef","0x504f70be718782ff8d1919ccbd111e506a97fd47d2e772194409f73f262e0207","0xe8db58c51f1e7cab2bc8bc23d5eaa9e12d3416885cf36840092f0d2950dedcc2","0x95ff0a4d51124669fc0353babe1cc832305db869f5f5a747117b7a7bb2331c7b","0x7c2fc41cde37b74b0b1deb783604a25ec385105fe763518599c171fcd38f5811","0x3825f87fa6745a8267452cfe8283bfad101be5abcd766a66f39fcdbc8df592d2","0x45c1197c2d1d94cb33782ec7cd8e39462b9850b3f4bf79b4368478721686da29","0x6607466841aeb80fb3942190409280ffd05e68f13020d6f61055d035660dc850","0xabb2457be097dda86792f2d233a24baf64c9bb60dea3fc98603bbae92100abe2","0x6efa2e0edf6e8d9b99f569c67aa98a474d559a8a22b4fd37f0c56f9b182fcfa3","0xb38224dbdac4a9f847189f60fc557952c1e63296fb037c379f19cdb687029142","0x6d653daecbd32f794589c81b379906bd27b618af7b3599a79d5b2847e167e1d5","0x75284dfc62ec34ea000b1a9f3a32715197f41a62e1bdd1a0f1eda5163cce3f2e","0x259d49eacc6c30d3f7bc1b1375d9b71b803987dd791aa7026f1dfe301849d545","0xec59fc0ec5646167e8bdc2c556f3cc4a36a14429d30b400e25900bd1aa14f08d","0x759ebf061baf585c99e31ae2e878792704a737b70719d1ed8895fe7d10c01bf7","0xed60408c4b22507914414c1013a0768b6214c8e4308bb00802a07a73fefdfd78","0x7994383cfda8237f0e8ab3a80037af93f8ec780a8fdd2d9b83537b7fa42097fb","0xa1901aaabda5cbfc09236d02f9507d4e86a0f609039a333169b0365d2e305efd","0x6928983459f4836656726accf0960666869e06eb7de6ba2ee7085635bf88a6e5","0x958b2da4728cfaee8179d387ec1b6b1741c907c3dfd12d905af9fab357b28ef7","0xc5355837a645f1ea1f13ad3726034add7c9fb31f7aaf8f9ab387563f9b3aafb7","0xa6446700c6b11808f5c4bd7440794964d7efe5dfaf07560b40eada203da7a2ca","0x9184a57dd0332e8b16f86960d665743455645aa7363efedacb5ed6edf48a5cd4","0x50283d144f443148b76d2ca9e13f5d0828507d484c47a49dd0da2011582dcf02","0x9dfa447cfa8c591111c7a87ad5d0fec15d38cdff4a9752fe270b830f75c726b9","0x3d09f89fa5446b42f2de16468ce035f855de9ddbae2affab11ff8196caa0d73e","0xd074d429c3b94b7261c0d12848df0b2563a05a279de80a9f6404aa8835893c5b","0x9a90f0e454e09af037a7d8e16a0402774dc4d0d445570f0520cbe6c59595d5f7","0x6b017fb7409a42a9c9a6726e025f05db5c386fd5ffdae64fc954a3cfddecc6fb","0x6dfb2cc27320676be552a10ec4bd5cc5643f418b52943a099ee80c274f01a3f5","0xddb241e291c2d4dc1e4051a69eb0436e32716aa3201978c94a849ac42281785c","0xc6860c0db79d2df8f565c5aaeb3cf0ff1b5fb1b83431eed4b88d56d62168e75b","0x02ee59c892c20c773b8c1848a25cd7be6d91395097eca4ce603a371a94641717","0x8c5b05d45c89ccd13cf614c2d3221889ecd40591c9a42d09d4698b4c133d3d03","0x76c3196c40c1047b842470c952d43291e241a446825b4c8ce4a16add3def3f38","0xc874c51c579ac97f11b663856bde56fa49e8382ba499c77de9f61e79f7c12713","0x35d7fb7665514f774d2c2df607e197eb8674b6e63d2638472758647a2e67406a","0x0642db43029543bb1ebbf7d10e6cc868b60db83de3cd8c6bbb1defd82d3b600e","0xfb5eb4a66b860e35f316a94822937b685551f7b5e94e14e264f1b68d765c3ae1","0x5063f5e0310a6a9363b891db8a37e0add0e4409e468dbcea38e0c7728190288e","0x1306e3c98bfe06ab61360fa42bd52ae44a05678bb4f4ac46d7c8e10291229267","0x678a36a61e75b3b7fec896727a042c092901c19b2203d685dc8696a6eb07d4b4","0xd56bdf2c225529686d053ac18fe03d1ce0ac1cbf490c290b889637f8178c525b","0x7620683ad2ca42272c2d3a39320d4c6ff4818972fea477ea0624da1fa2e09302","0x37b788afa5978970fc6fc5351c2eb988e1a6d0f7e034c26dc731df40d167d85b","0x7c24241ffa2de8656510026b51f3c7c6fc1b11cb0412b10bffb5996f6a3f3a2b","0x90112f8828108901f49a6d7efa50f74639494e950021a2f0b881bf4a12f50b1f","0x1f272c5ffa067e40b513a677402451384cb83cec372d351f33c0d2c980aa2791","0x83a4b079180f6516630f3876c177628eda70ee339d4dfc1731304a92bb1face8","0x003532c0810d9bac6e5aede181657c2d767b0f2b4a1f2ec4f0063fa7536195b9","0xec33c2576d25193badd245f1f44c5835881662fd048781e6056adcc103a13866","0x39ce73c2b3beeb36456e38a0bdada3b76c20042618e1d1c014efacb35e02e69e","0x9bf8796c4b076bccc885dcad43fad53f7c828a5dbd59a4141a2846be58d9f0dd","0x95848815d56b13c6e26bfcfee1b4d266b93f75eaff26cdd0c9c463c803b78820","0xbca4fe0be8e975f424af2d073832035804c6f1bbcc86580bf38730cea1253266","0xbd9b90ae1924e53d83ae885e270b2787e61243cd51c8d348e22c54c91882a0be","0x966b2a983a1220f62c7a6fa84f4612bd1d6d742c7b1a18547828e885236ef944","0x87b619b23199970ac7182a216f244ed64ae6ca7b5b2b2b3c1c0481408eb5af64","0xfa9211a19fa7d432fc65f2fa1b77555f3c77133ce7d5a42024a6ef88db123e54","0x39fd0dae636f00b7d9107edf6818413899d69306b0a557d3dce440c5a9a3c3e6","0x7043dc5f10482e6fa448c8187c116e13f30dd5dc14876275c5137c8a295e738d","0xc7f01836ef6bcec14e18ae6fe7c47a9f6087128cfcf3cdae07283005e9c551e1","0x900c6a93f283faf850f1cc77caed5a27f7075790a6a1c2f31d8952b56f89e079","0x3e57d38f12752e44a18a096cc665a4c43f632ecc13bef12afbbd4fa6d09bae11","0x7c475dbd09e95dcc1e4f9e92764bba68d8e476ca4dc8948ee1d2483f9d40e9b4","0x225a3fccdb566290c25173fd63d6e9e3fc54fb86d20619392866f6e201e13a79","0x80240a83ee96679e05d83c7e57fdcde881ae3a8c340602836d87244e1ae7d27f","0xd2f0e7e79c908fecea8c177ac15cdc2850ef353d67d7c5596c1bfc880bce9d40","0xb11a76aa47ec394446ddc8deead56bdf94c92166f1c20558d6e0f8ec303bc88e","0xd4926819075f67206d950bc3bf5d48622894782637972462b87f1c0cb98b6216","0x9aa2404403dacb191322f62da6efeb667b29d10ea1d183ff68e1ea677be12681","0x537bc38f34801d8df302fd30d0b034c0962ddf8dadabe96a9f2091c62742a41e","0x515e9e73892a8d9eb52978ac12f8af94dbabaca774b0363685219b0f7569e7cb","0xdb000d438fac4256fd47252689611c28304ba55b118a2b8c0a56de9171730fe2","0xe83538d417bf3a327392bec978ff0c3d12f982396c90514910d8aad98f85797a","0x7643fec7b9b72242e238ec48b1c3918545a514ef98eb8297e2d0b3d0989019da","0x4fb3c779bf2af416a93d3c886517bcd7bc447ac8e7aeb65ca5ad67352d422522","0x4f8326950fc8aa34177a822ae16b4cbacfc4e534c1f4ee85040bd17bcb29c8ae","0x51a461ff4cc5c89b81d06033066804873c586ece94b1ba94e351e460e0fd37ed","0xc7fd0bd487d0b6ef398b82715d8041b5e7e00ce89f81f78d36f448bcfd83c3d2","0xd9293a630e28d3a5e61462a4f5cf955d155ff86ed3ab041ecb0533dc126b3efe","0xc1dbffaa19366b126514c05d7bc931420f09b403cc13fa9ef31b5362c702ad4b","0x524bfcec436c05b97c4fa0a4b01bdd00880f509c00db106f1fdba5574a8c1526","0x0a04d0eb78fc687531e8070dcddbad4a17fc766535b508be9ec54f25282fabcf","0xe4a567e60c889432bad72fde83037e17c5d3a7c44c84541978f3d45f97f04f64","0x7c55c154cbc7e5133ed06306565f63502d6d540b5c5a443a88373a9b4afe072d","0x507ccb97367fb6cea787ae6caa841f71844d22cb223e8878c51b55e2b4701943","0x5bb96862696c2d0cea055c97d882c1aea2e43ff2b77ddbff047472588e06de3f","0x70434eb59476d5f9a405268edb793715aba6e05f698e907f93a99b023b073680","0x31ab42d640d9678b993a0bc32a5c24c1e52d40a074679dbd57d4724163bfc4fc","0x75cde72a82ffb57816bbab5b7432f5eb9a75a26ba14f61d321bc02f6c7aed9cf","0x74cd033ad106f0bc79e7c03adb6b8a6f4d64f76d45781a942f9ea9cfbb0134ca","0x39f2b54be6f78cd280e4fdd63185862f9951266f30b7bc9221a80187ebc1dbdc","0x80ffb3d9ae62dfc320efb4a1b50c08beeaabbfcdd3c924d186d6bb3c6cca18b3","0x2472b207c9304d88f42862b591fb04f2cb903a7bf38e188f3bd4ad5f422de1fb","0x69b3e376a5bc2e50490fdf62dc9bc4a0bc759533a95ebc68f041acecc91d99e9","0x5370cc048e664a5cc5502e78d16123a2f8b090d4597cfeeb7cc8450373c79c41","0x60e6b5a9e5fd0d89c9b792eb57e2bea9d73b63a6dd60463a949faf7d2155bb30","0x0000000000000000000000000000000000000000000000000000000000000000","0xefa0c25bcfb6f1f2e4bdbca89bf2931d45344a2d03b61ae989901ad0d45680d5","0x01b421520676e57dfa185f0452489eb4dd6c6800067f3d7ed2cebec567e9506a","0xc91bc8b4b5d7614826f38b2e08945eeb5cb119b4d3162bd89550dc493375b8aa","0xa2b54161c07290adf0c06d63002d5b161b98a663b3503249a87609d5fdc9f197","0xe0f69f5cfb39f89cf32b14c12bfae3dee18f339c81329e0e4d2ec901ce7e181c","0x03e3fa5cb275ddde2e44385c1b333af2ef55e9ccd090cc2e523d294eb6d24db0","0x3774386489158544063dc7588c1656ee55477ee5b327126ffeb48b9a649f32c0","0xb9a6a53192c8135ad36e8877a74189152d0496df7910114945bb2a46f662b50f","0xed5d01a190fc977d502a7eb4c9c18d5ee35bacdc10bb26070553045e5f053266"]},{"address":"0x77ad3a15b78101883af36ad4a875e17c86ac65d1","storageKeys":[]},{"address":"0xbcd3465ed116b53b1c0b603bc79297a52c353021","storageKeys":[]},{"address":"0x52e2a402cc0e3eb23cf68f1fa8ce2db867a082e4","storageKeys":[]},{"address":"0x72c60bfffef18dca51db32b52b819a951b6ddbed","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000006","0x0a8622b3bea6b77f880346589e928a5a9e981ee9adf5de6ebaa6cad387beb635","0xf33ca819bebbbb1861541c20de662508c211dc2389f53785d1fa1f5325f7d0f6","0xc05128d02b3623deafe7368d2c3ea64524a9fc1f6debb6b15ff85780be5f63f8","0x1de8b23d264d4237b3ac0469b20ace6d716b240bd983389665de352d40cd5be1","0x1c0bbe55ef33b219e852b40408910cc2e888a9c8822d1e70f3facf6c0584fdd5","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x2999130b47de50504222b5b60278422b730b89fc019494a6572b51e4912005c9","0x0000000000000000000000000000000000000000000000000000000000000011","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000010","0x895a6b9d95243a6356ce91bd48e456419db457f710a80c8a5073ae0c5240fc08","0x16f8c52a2c49604205b83683552ec60fc7b243fe18b218e2ef844c4fa21708c3","0xd5545afde697af5857bb25f0ab3c804f4932763aac4345e33ffc216e85697e26","0x0000000000000000000000000000000000000000000000000000000000000009","0x05383abc1f5d180a9ba55924699390af476c2f54d6e14df8e1d3ef158551b46a"]},{"address":"0x7f86bf177dd4f3494b841a37e810a34dd56c829b","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000011","0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000012","0x0000000000000000000000000000000000000000000000000000000000000019"]},{"address":"0x31896ebaa868d34def9225f46cbfc0b1c25aa779","storageKeys":[]},{"address":"0x3c442bab170f19dd40d0b1a405c9d93b088b9332","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x0000000000000000000000000000000000000000000000000000000000000008","0x000000000000000000000000000000000000000000000000000000000000000c","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007"]},{"address":"0x129311a1b838f10586ae0cd69c62a35871707cf2","storageKeys":[]},{"address":"0x29469395eaf6f95920e59f858042f0e28d98a20b","storageKeys":["0xc4e2253498670423f1375d8ab3f1ea4629b63f22ee5ab1004e12bee742f0390b","0xf9fce4060ef72e2f0ac395b2fe3dfef3bcd3d8e274fabe08297f895fccbe6817","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc","0x0000000000000000000000000000000000000000000000000000000000000163","0x4187e7e3de03d69356a780127a4b6b1bbf37c791e94a682082148bb37b4c7f2f","0xc10a19a91f6232865021f49fef0cf5f2de61e358ec9b88fe5aa966b280fa7075","0xacfe491060b475e094848fc44594e8fe186ec1fd1698f56a8e0f7fb24ad94adf","0x0000000000000000000000000000000000000000000000000000000000000002"]},{"address":"0x343f18e39ab281bdd574834be26b32f3c75f42dc","storageKeys":[]},{"address":"0xe3e1c933623e56cdc9b3b35d5e8c23948249bb2b","storageKeys":[]},{"address":"0x595832f8fc6bf59c85c527fec3740a1b7a361269","storageKeys":["0xf4e54bb51e10c9ff52102ae731b015539d4e9d60e64768267b59846a24141fd7","0xed077da843303ea01806892518760f47d140e0967c2ff1e73798df7e962cca4f"]},{"address":"0xc3112f7c3037ab2653d78da6f68c77f00682c8b6","storageKeys":[]},{"address":"0xe4edb277e41dc89ab076a1f049f4a3efa700bce8","storageKeys":[]},{"address":"0x517ae108c6be226caa4a6e3b224c41db8e4fda7b","storageKeys":[]},{"address":"0x0eb1c92f9f5ec9d817968afddb4b46c564cdedbe","storageKeys":["0x0c1469ad586d86b6976c45826d7ae56d76ee516e37a2bccffbe904b74dbae7ea","0x0000000000000000000000000000000000000000000000000000000000000000","0xbbce0d9318352908521fe9659dce636e39ce00e987a43eecfd7bccd20ce35b1f","0xfb5e2c639adf6f19556e762eea9953bf8c1f92c6a39651186429f581ab806849","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000001","0xf8fd3a386fa60c3459e35240b885c11499f85fa71d9b7fb67c736fb24d81cf0e","0x33445b9a8dc7ce01b7e2b5781e2e6b70ea94ff0ab46cce2526dc35e6fffd7c14","0x189c74cb3dfcf410dd3d6cbab487ece2f87bb9e2e973105ca843cf26d38b5659","0x140aabff1a85df08546c9a350c79ae18341bde4a2cef5d2fd460885c0128ce26"]}] diff --git a/bin/mpt-test/access-lists/2000004.json b/bin/mpt-test/access-lists/2000004.json new file mode 100644 index 0000000000..51d69d2189 --- /dev/null +++ b/bin/mpt-test/access-lists/2000004.json @@ -0,0 +1 @@ +[{"address":"0x4bb96091ee9d802ed039c4d1a5f6216f90f81b01","storageKeys":[]},{"address":"0x8975dbc1b8f25ec994815626d070899dda896511","storageKeys":[]},{"address":"0xb2e3732c0b0ec387962f76fa4f1bb9325089c5e0","storageKeys":[]},{"address":"0xed059bc543141c8c93031d545079b3da0233b27f","storageKeys":[]},{"address":"0xec9f6c9634165f91e22e58b90e3ede393d959e47","storageKeys":[]},{"address":"0xcaac46d9bd68bffb533320545a90cd92c6e98e58","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000001"]},{"address":"0xec9f6c9634165f91e22e58b90e3ede393d959e47","storageKeys":["0x0000000000000000000000000000000000000000000000000000000000000003","0x19da5b482fc1817af240c411d7423a456cdcf4a213e9f192aca5c80a39a4a733"]},{"address":"0xf05c1b271d12b7ecb3b37122730c085ec2c0b552","storageKeys":[]},{"address":"0x4fdf5371f7ffa04866f696882db659fe38f52559","storageKeys":[]},{"address":"0xbef52af092fa2349279f7a2b10779fe810785688","storageKeys":[]},{"address":"0x24f21c22f0e641e2371f04a7bb8d713f89f53550","storageKeys":[]}] \ No newline at end of file diff --git a/bin/mpt-test/access-lists/2000007.json b/bin/mpt-test/access-lists/2000007.json new file mode 100644 index 0000000000..5470f3a4e1 --- /dev/null +++ b/bin/mpt-test/access-lists/2000007.json @@ -0,0 +1 @@ +[{"address":"0x61c808d82a3ac53231750dadc13c777b59310bd9","storageKeys":[]},{"address":"0xdf21fa922215b1a56f5a6d6294e6e36c85a0acfb","storageKeys":[]},{"address":"0xbb9bc244d798123fde783fcc1c72d3bb8c189413","storageKeys":["0x0db619cb4b09b98626d1a90813a5566d6ae59d0a68df3e729f07a4cf6a7169fe","0x28f0a29873c622b02659ae6083b0cf3fb2c44358fa1b0c0efb89893011b2cf8b","0xf610712b7b4266f7fbc44538628f0ffdcb93c6d56f73a4dfeb041befdf2c9058","0xf903a85392f66de7c382c130eb51940c4bfed2038df5c108d8c0115c24efcc94"]}] \ No newline at end of file diff --git a/bin/mpt-test/access-lists/2000070.json b/bin/mpt-test/access-lists/2000070.json new file mode 100644 index 0000000000..3d0c8776b8 --- /dev/null +++ b/bin/mpt-test/access-lists/2000070.json @@ -0,0 +1 @@ +[{"address":"0x1a060b0604883a99809eb3f798df71bef6c358f1","storageKeys":[]},{"address":"0xed8387812f6477a421f2a16975a6121fc91933e6","storageKeys":[]},{"address":"0xbb9bc244d798123fde783fcc1c72d3bb8c189413","storageKeys":["0x4312ad16021fb135960665020d410e3ca0e42488b684d61315e73d368c7182ad","0x83390858478ca0e9bd8e0b6f9c61cb360f78d42e5c5c2908d9a885b766925386"]}] \ No newline at end of file diff --git a/bin/mpt-test/access-lists/436875.json b/bin/mpt-test/access-lists/436875.json new file mode 100644 index 0000000000..82011f21d7 --- /dev/null +++ b/bin/mpt-test/access-lists/436875.json @@ -0,0 +1 @@ +[{"address":"0x580992b51e3925e23280efb93d3047c82f17e038","storageKeys":[]},{"address":"0x52bc44d5378309ee2abf1539bf71de1b7d7be3b5","storageKeys":[]},{"address":"0x15ac3b6f90549ffbe4091177b1795b3d4c11a59e","storageKeys":[]},{"address":"0x72382223a91051a54c69759be3c93048235efc43","storageKeys":[]}] \ No newline at end of file diff --git a/bin/mpt-test/src/cache.rs b/bin/mpt-test/src/cache.rs new file mode 100644 index 0000000000..ba5100d352 --- /dev/null +++ b/bin/mpt-test/src/cache.rs @@ -0,0 +1,234 @@ +//! A simple cache for web3 rpc requests + +use eth_types::keccak256; +use eyre::{ensure, eyre, Result}; +use flate2::{read::ZlibDecoder, write::ZlibEncoder, Compression}; +use hyper::{ + body::{self}, + service::{make_service_fn, service_fn}, + Body, Client, Request, Response, Server, +}; +use serde::Deserialize; +use serde_json::Value; +use std::{ + collections::HashMap, + convert::Infallible, + fs::File, + io::{Read, Seek, Write}, +}; + +const CACHE_PATH: &str = "web3_rpc_cache.bin"; + +lazy_static! { + static ref CACHE: tokio::sync::Mutex = tokio::sync::Mutex::new(CacheFile::new()); +} + +/// Cache file format is a consecutive list of entries, each entry is: +/// - 32 bytes: key (keccak256 of the request) +/// - 4 bytes: length of the compressed response +/// - N bytes: compressed response +struct CacheFile { + offsets: HashMap<[u8; 32], u64>, +} +impl CacheFile { + pub fn new() -> Self { + Self { + offsets: HashMap::new(), + } + } + /// Load all existing entries from the cache file + pub async fn load(&mut self) -> Result<()> { + if let Ok(mut f) = File::open(CACHE_PATH) { + let mut hash = [0u8; 32]; + while f.read_exact(&mut hash).is_ok() { + let offset = f.stream_position()?; + self.offsets.insert(hash, offset); + let mut len_buf = [0u8; 4]; + f.read_exact(&mut len_buf)?; + let len = u32::from_le_bytes(len_buf); + f.seek(std::io::SeekFrom::Current(len as i64))?; + } + println!("loaded {} cached responses", self.offsets.len()); + } + Ok(()) + } + /// Write a new entry + async fn write(&mut self, key: [u8; 32], value: &[u8]) -> Result<()> { + let mut encoder = ZlibEncoder::new(Vec::new(), Compression::best()); + encoder.write_all(value)?; + let compressed = encoder.finish()?; + + let mut f = File::options().append(true).create(true).open(CACHE_PATH)?; + f.write_all(&key)?; + let offset = f.stream_position()?; + f.write_all(&(compressed.len() as u32).to_le_bytes())?; + f.write_all(&compressed)?; + + self.offsets.insert(key, offset); + + Ok(()) + } + /// Read an entry, returns Ok(None) if not found + async fn read(&self, key: [u8; 32]) -> Result>> { + let offset = self.offsets.get(&key).cloned(); + if let Some(offset) = offset { + let mut f = + File::open(CACHE_PATH).expect("since offset exists, file should exist. qed."); + f.seek(std::io::SeekFrom::Start(offset))?; + + let mut len_buf = [0u8; 4]; + f.read_exact(&mut len_buf)?; + let len = u32::from_le_bytes(len_buf); + + let mut compressed = vec![0u8; len as usize]; + f.read_exact(&mut compressed)?; + let mut decoder = ZlibDecoder::new(&compressed[..]); + let mut decompressed: Vec = Vec::new(); + decoder.read_to_end(&mut decompressed).unwrap(); + + Ok(Some(decompressed)) + } else { + Ok(None) + } + } +} + +#[derive(Deserialize, Debug)] +struct RequestBody { + method: String, + params: Option>, + id: u32, +} + +#[derive(Deserialize, Debug)] +#[serde(untagged)] +enum Param { + String(String), + Bool(bool), + StringVec(Vec), +} + +impl RequestBody { + fn hash(&self) -> [u8; 32] { + let params = if let Some(params) = &self.params { + params + .iter() + .map(|s| match s { + Param::String(s) => s.to_owned(), + Param::Bool(b) => format!("{}", b), + Param::StringVec(v) => v.join("-"), + }) + .collect::>() + .join("-") + } else { + "".to_owned() + }; + keccak256(format!("{}-{}", self.method, params).as_bytes()) + } +} + +/// Handle a web3 rpc request with error handling +async fn infallible_web3_proxy(req: Request) -> Result, Infallible> { + match web3_proxy(req).await { + Ok(res) => Ok(res), + Err(err) => { + let msg = format!("Internal Server Error: {err}"); + Ok(Response::builder() + .status(500) + .body(Body::from(msg)) + .unwrap()) + } + } +} + +/// Handle a web3 rpc request, return cached result or call the env!("WEB3_PROVIDER_URL") RPC server +async fn web3_proxy(req: Request) -> Result> { + let method = req.method().clone(); + let headers = req.headers().clone(); + + // try to read the result from the cache + let request_body_bytes = hyper::body::to_bytes(req.into_body()).await?.to_vec(); + let request_body_json: RequestBody = serde_json::from_slice(&request_body_bytes)?; + let key = request_body_json.hash(); + let response_result = CACHE.lock().await.read(key).await?; + + let response_body = if let Some(response_result) = response_result { + // return cached result + format!( + "{{\"id\":{}, \"jsonrpc\":\"2.0\", \"result\":{}}}", + request_body_json.id, + String::from_utf8(response_result).unwrap() + ) + .into_bytes() + } else { + println!( + "=>{}", + String::from_utf8(request_body_bytes.clone()).unwrap() + ); + + // call RPC server, copying headers and method from the original request + let connector = hyper_rustls::HttpsConnectorBuilder::new() + .with_native_roots() + .https_or_http() + .enable_http1() + .build(); + + let client = Client::builder().build(connector); + let provider_url = std::env::var("WEB3_PROVIDER_URL")?; + + let mut req = Request::builder() + .method(method) + .uri(provider_url) + .body(Body::from(request_body_bytes))?; + + for (key, value) in headers { + if let Some(key) = key { + if !["host", "accept-encoding", "date"].contains(&key.as_str()) { + req.headers_mut().append(key, value); + } + } + } + + let resp = client.request(req).await?; + let (head, response_body) = resp.into_parts(); + ensure!(head.status.is_success(), "Provider does not return 200"); + + // parse response and cache it + let response_bytes = body::to_bytes(response_body).await?.to_vec(); + + let root: Value = serde_json::from_slice(&response_bytes)?; + let Some(result) = root.get("result") else { + return Err(eyre!("Provider does not return result")); + }; + let result_bytes = serde_json::to_vec(result)?; + CACHE.lock().await.write(key, &result_bytes).await?; + + response_bytes + }; + + // return HTTP 200 response + let response = Response::builder() + .status(200) + .body(Body::from(response_body))?; + + Ok(response) +} + +/// Load the cache file +pub async fn load() -> Result<()> { + CACHE.lock().await.load().await +} + +/// Start the cache server at localhost:3000 +pub async fn start() -> Result<()> { + let make_svc = + make_service_fn(|_conn| async { Ok::<_, Infallible>(service_fn(infallible_web3_proxy)) }); + + let addr = ([127, 0, 0, 1], 3000).into(); + + println!("Listening on http://{}", addr); + + Server::bind(&addr).serve(make_svc).await?; + + Ok(()) +} diff --git a/bin/mpt-test/src/circuit.rs b/bin/mpt-test/src/circuit.rs new file mode 100644 index 0000000000..ee7765bae1 --- /dev/null +++ b/bin/mpt-test/src/circuit.rs @@ -0,0 +1,4 @@ +mod equal_words; +pub mod state_update; +mod utils; +pub mod witness; diff --git a/light-client-poc/src/circuit/equal_words.rs b/bin/mpt-test/src/circuit/equal_words.rs similarity index 83% rename from light-client-poc/src/circuit/equal_words.rs rename to bin/mpt-test/src/circuit/equal_words.rs index c085fa41f6..67143be140 100644 --- a/light-client-poc/src/circuit/equal_words.rs +++ b/bin/mpt-test/src/circuit/equal_words.rs @@ -1,3 +1,5 @@ +//! A simple chip to compare two words for equality. + use eth_types::Field; use eyre::Result; use gadgets::{ @@ -9,16 +11,16 @@ use halo2_proofs::{ plonk::{Advice, Column, ConstraintSystem, Error, Expression, Selector}, poly::Rotation, }; -use zkevm_circuits::util::word::Word; +use zkevm_circuits::util::word::WordLoHi; #[derive(Clone, Debug)] -pub struct EqualWordsConfig(Word>); +pub struct EqualWordsConfig(WordLoHi>); impl EqualWordsConfig { pub fn configure( meta: &mut ConstraintSystem, q_enable: Selector, - first: (Word>, Rotation), - second: (Word>, Rotation), + first: (WordLoHi>, Rotation), + second: (WordLoHi>, Rotation), ) -> Self { let lo_inv = meta.advice_column(); let lo = IsZeroChip::configure( @@ -42,7 +44,7 @@ impl EqualWordsConfig { hi_inv, ); - Self(Word::new([lo, hi])) + Self(WordLoHi::new([lo, hi])) } pub fn expr(&self) -> Expression { @@ -54,8 +56,8 @@ impl EqualWordsConfig { region: &mut Region<'_, F>, offset: usize, name: &str, - first: &Word, - second: &Word, + first: &WordLoHi, + second: &WordLoHi, ) -> Result<(), Error> { region.name_column(|| format!("{}_lo_inv", name), self.0.lo().value_inv); region.name_column(|| format!("{}_hi_inv", name), self.0.hi().value_inv); diff --git a/light-client-poc/src/circuit/state_update.rs b/bin/mpt-test/src/circuit/state_update.rs similarity index 85% rename from light-client-poc/src/circuit/state_update.rs rename to bin/mpt-test/src/circuit/state_update.rs index 15464e311b..a9271e6339 100644 --- a/light-client-poc/src/circuit/state_update.rs +++ b/bin/mpt-test/src/circuit/state_update.rs @@ -1,4 +1,5 @@ -use super::equal_words::EqualWordsConfig; +//! A circuit to verify chained proofs of state updates in a block. + use eth_types::Field; use eyre::Result; use gadgets::{ @@ -21,11 +22,12 @@ use halo2_proofs::{ use zkevm_circuits::{ mpt_circuit::{MPTCircuit, MPTCircuitParams, MPTConfig}, table::{KeccakTable, MptTable}, - util::{word, Challenges}, + util::{word::WordLoHi, Challenges}, }; -use super::witness::{ - SingleTrieModification, SingleTrieModifications, StateUpdateWitness, Transforms, +use crate::circuit::{ + equal_words::EqualWordsConfig, + witness::{FieldTrieModification, FieldTrieModifications, Witness}, }; #[cfg(not(feature = "disable-keccak"))] @@ -34,46 +36,75 @@ use zkevm_circuits::{ util::{SubCircuit, SubCircuitConfig}, }; -pub const DEFAULT_MAX_NODES: usize = 4000; -pub const DEFAULT_MAX_PROOF_COUNT: usize = 20; -pub const DEFAULT_CIRCUIT_DEGREE: usize = 14; - -// A=>B eq ~(A & ~B) (it is not the case that A is true and B is false) -fn xif(a: Expression, b: Expression) -> Expression { +// negated A=>B eq ~(A & ~B) (it is not the case that A is true and B is false) +pub fn xnif(a: Expression, b: Expression) -> Expression { and::expr([a, not::expr(b)]) } -/// +/// The circuit to verify chained proofs of state updates in a block. #[derive(Clone)] pub struct StateUpdateCircuitConfig { #[cfg(not(feature = "disable-keccak"))] + /// If enabled by feature, the verification of keccaks + /// Please note that the keccak circuit will dramatically increase the time to generate the + /// proof this is the reason why it is disabled by default (check the `disable-keccak` + /// feature) pub keccak_config: KeccakCircuitConfig, + + /// The MPT configuration pub mpt_config: MPTConfig, + /// The MPT table, where the state updates are stored pub pi_mpt: MptTable, - pub pi_instance: Column, + /// Instance column, used to check public inputs + pub instance: Column, + + /// ONE if the first row, ZERO otherwise pub is_first: Column, + + /// ONE if row is padding, ZERO otherwise pub is_padding: IsZeroConfig, + + /// ONE is the last used row, ZERO otherwise pub is_last: IsZeroConfig, + /// Check if new_root is propagated pub new_root_propagation: EqualWordsConfig, + + /// Check if previous old_root, and new_root are equal pub root_chained: EqualWordsConfig, + /// A down counter, that is decreased by one in each row pub count: Column, + + /// Check if the counter is monotonic decreasing pub count_decrement: IsZeroConfig, pub q_enable: Selector, } -/// MPT Circuit for proving the storage modification is valid. +/// MPT Circuit for proving that a from a given root, a set of state updates are valid. +/// Public inputs: +/// old_root_lo +/// old_root_hi +/// new_root_lo +/// new_root_hi +/// number of MPT changes +/// for each change +/// | change_type +/// | address +/// | value_lo +/// | value_hi +/// | key_lo +/// | key_hi #[derive(Default)] pub struct StateUpdateCircuit { - pub transforms: Transforms, #[cfg(not(feature = "disable-keccak"))] pub keccak_circuit: KeccakCircuit, pub mpt_circuit: MPTCircuit, - pub lc_witness: SingleTrieModifications, + + pub lc_witness: FieldTrieModifications, pub degree: usize, pub max_proof_count: usize, } @@ -114,15 +145,15 @@ impl Circuit for StateUpdateCircuit { let is_first = meta.fixed_column(); let count = meta.advice_column(); let q_enable = meta.complex_selector(); - let pi_instance = meta.instance_column(); + let instance = meta.instance_column(); let pi_mpt = MptTable { address: meta.advice_column(), - storage_key: word::Word::new([meta.advice_column(), meta.advice_column()]), + storage_key: WordLoHi::new([meta.advice_column(), meta.advice_column()]), proof_type: meta.advice_column(), - new_root: word::Word::new([meta.advice_column(), meta.advice_column()]), - old_root: word::Word::new([meta.advice_column(), meta.advice_column()]), - new_value: word::Word::new([meta.advice_column(), meta.advice_column()]), - old_value: word::Word::new([meta.advice_column(), meta.advice_column()]), + new_root: WordLoHi::new([meta.advice_column(), meta.advice_column()]), + old_root: WordLoHi::new([meta.advice_column(), meta.advice_column()]), + new_value: WordLoHi::new([meta.advice_column(), meta.advice_column()]), + old_value: WordLoHi::new([meta.advice_column(), meta.advice_column()]), }; for col in [ @@ -144,7 +175,7 @@ impl Circuit for StateUpdateCircuit { meta.enable_equality(*col); } - meta.enable_equality(pi_instance); + meta.enable_equality(instance); meta.enable_equality(count); let is_padding_inv = meta.advice_column(); @@ -191,13 +222,13 @@ impl Circuit for StateUpdateCircuit { meta.create_gate("if not padding, count decreases monotonically", |meta| { let q_enable = meta.query_selector(q_enable); - vec![q_enable * xif(not::expr(is_padding.expr()), count_decrement.expr())] + vec![q_enable * xnif(not::expr(is_padding.expr()), count_decrement.expr())] }); meta.create_gate("if last or padding, new_root is propagated ", |meta| { let q_enable = meta.query_selector(q_enable); let is_last_or_padding = or::expr([is_padding.expr(), is_last.expr()]); - vec![q_enable * xif(is_last_or_padding.expr(), new_root_propagation.expr())] + vec![q_enable * xnif(is_last_or_padding.expr(), new_root_propagation.expr())] }); meta.create_gate( @@ -210,7 +241,7 @@ impl Circuit for StateUpdateCircuit { vec![ q_enable - * xif( + * xnif( not::expr(one_if_not_padding_and_not_last_rot), root_chained.expr(), ), @@ -283,7 +314,7 @@ impl Circuit for StateUpdateCircuit { new_root_propagation, root_chained, q_enable, - pi_instance, + instance, pi_mpt, }; @@ -301,7 +332,7 @@ impl Circuit for StateUpdateCircuit { ) -> Result<(), Error> { let challenges = _challenges.values(&mut layouter); - // assign MPT witness + // MPT witness config .mpt_config @@ -313,6 +344,8 @@ impl Circuit for StateUpdateCircuit { self.mpt_circuit.max_nodes, )?; + // Keccak witness ( if apply ) + #[cfg(feature = "disable-keccak")] config.mpt_config.keccak_table.dev_load( &mut layouter, @@ -324,7 +357,7 @@ impl Circuit for StateUpdateCircuit { self.keccak_circuit .synthesize_sub(&config.keccak_config, &challenges, &mut layouter)?; - // assign LC witness + // Circuit witness, returns the public inputs for the state update let pi = layouter.assign_region( || "lc witness", @@ -346,7 +379,7 @@ impl Circuit for StateUpdateCircuit { || "LC_count_monodec_inv", config.count_decrement.value_inv, ); - region.name_column(|| "LC_pi_instance", config.pi_instance); + region.name_column(|| "LC_instance", config.instance); region.assign_fixed(|| "", config.is_first, 0, || Value::known(F::ONE))?; @@ -380,11 +413,11 @@ impl Circuit for StateUpdateCircuit { // assign set the value for entries to do the lookup propagating ending root in padding // and collect cells for checking public inputs. - let stm = self.lc_witness.get(offset).cloned().unwrap_or(SingleTrieModification { + let stm = self.lc_witness.get(offset).cloned().unwrap_or(FieldTrieModification { new_root: self.lc_witness.last().cloned().unwrap_or_default().new_root, ..Default::default() }); - let stm_next = self.lc_witness.get(offset+1).cloned().unwrap_or(SingleTrieModification { + let stm_next = self.lc_witness.get(offset+1).cloned().unwrap_or(FieldTrieModification { new_root: self.lc_witness.last().cloned().unwrap_or_default().new_root, ..Default::default() }); @@ -432,7 +465,7 @@ impl Circuit for StateUpdateCircuit { ).unwrap() ); - // at beggining, set the old root and number of proofs + // at beginning, set the old root and number of proofs if offset == 0 { pi.push(Some(old_root_lo)); @@ -458,7 +491,7 @@ impl Circuit for StateUpdateCircuit { // check that state updates to lookup are the same that the specified in the public inputs for (n, value) in pi.into_iter().enumerate() { - layouter.constrain_instance(value.unwrap().cell(), config.pi_instance, n)?; + layouter.constrain_instance(value.unwrap().cell(), config.instance, n)?; } Ok(()) @@ -467,14 +500,13 @@ impl Circuit for StateUpdateCircuit { impl StateUpdateCircuit { pub fn new( - witness: StateUpdateWitness, + witness: Witness, degree: usize, max_nodes: usize, max_proof_count: usize, ) -> Result> { - let StateUpdateWitness { + let Witness { mpt_witness, - transforms, lc_witness, } = witness; @@ -502,7 +534,6 @@ impl StateUpdateCircuit { let keccak_circuit = KeccakCircuit::::new(2usize.pow(degree as u32), keccak_data); let lc_circuit = StateUpdateCircuit:: { - transforms, #[cfg(not(feature = "disable-keccak"))] keccak_circuit, mpt_circuit, diff --git a/bin/mpt-test/src/circuit/utils.rs b/bin/mpt-test/src/circuit/utils.rs new file mode 100644 index 0000000000..d17827632f --- /dev/null +++ b/bin/mpt-test/src/circuit/utils.rs @@ -0,0 +1,58 @@ +//! Some utilities. + +use crate::circuit::witness::FieldTrieModifications; +use eth_types::Field; +use halo2_proofs::{dev::MockProver, halo2curves::bn256::Fr}; +use std::ops::Deref; + +use super::state_update::StateUpdateCircuit; + +pub struct PublicInputs(pub Vec); +impl Deref for PublicInputs { + type Target = Vec; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl From<&FieldTrieModifications> for PublicInputs { + fn from(stm: &FieldTrieModifications) -> Self { + let mut inputs = vec![ + stm.0[0].old_root.lo(), + stm.0[0].old_root.hi(), + stm.0.last().unwrap().new_root.lo(), + stm.0.last().unwrap().new_root.hi(), + F::from(stm.0.len() as u64), + ]; + + for proof in &stm.0 { + inputs.push(proof.typ); + inputs.push(proof.address); + inputs.push(proof.value.lo()); + inputs.push(proof.value.hi()); + inputs.push(proof.key.lo()); + inputs.push(proof.key.hi()); + } + + PublicInputs(inputs) + } +} + +impl StateUpdateCircuit { + pub fn assert_satisfied(&self) { + let num_rows: usize = self + .mpt_circuit + .nodes + .iter() + .map(|node| node.values.len()) + .sum(); + + let public_inputs: PublicInputs = (&self.lc_witness).into(); + + let prover = + MockProver::::run(self.degree as u32, self, vec![public_inputs.0]).unwrap(); + + prover.assert_satisfied_at_rows(0..num_rows, 0..num_rows); + } +} diff --git a/light-client-poc/src/circuit/witness.rs b/bin/mpt-test/src/circuit/witness.rs similarity index 56% rename from light-client-poc/src/circuit/witness.rs rename to bin/mpt-test/src/circuit/witness.rs index f667abf467..99b1514091 100644 --- a/light-client-poc/src/circuit/witness.rs +++ b/bin/mpt-test/src/circuit/witness.rs @@ -1,11 +1,18 @@ -use std::{collections::HashSet, ops::Deref, sync::Arc}; +//! Generate witness for the StateUpdate circuit. + +use std::{ + collections::{BTreeMap, BTreeSet}, + ops::Deref, + str::FromStr, + time::Duration, +}; use eth_types::{Field, ToScalar}; + use ethers::{ abi::Address, - prelude::{k256::ecdsa::SigningKey, SignerMiddleware, *}, + prelude::*, providers::{Http, Provider}, - signers::Wallet, types::{ transaction::eip2930::{AccessList, AccessListItem}, BlockId, BlockNumber, H256, U256, U64, @@ -13,15 +20,40 @@ use ethers::{ }; use eyre::Result; -use mpt_witness_generator::{ProofType, TrieModification}; +use geth_utils::mpt::{ProofType, TrieModification}; use zkevm_circuits::{ - mpt_circuit::witness_row::Node, - table::mpt_table::MPTProofType, - util::word::{self, Word}, + mpt_circuit::witness_row::Node, table::mpt_table::MPTProofType, util::word::WordLoHi, }; +lazy_static! { + static ref DEFAULT_CODE_HASH: H256 = + H256::from_str("0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470") + .unwrap(); +} + +#[derive(Default, Clone)] +pub struct FieldTrieModification { + pub typ: F, + pub address: F, + pub value: WordLoHi, + pub key: WordLoHi, + pub old_root: WordLoHi, + pub new_root: WordLoHi, +} + +#[derive(Default, Clone)] +pub struct FieldTrieModifications(pub Vec>); + +impl Deref for FieldTrieModifications { + type Target = Vec>; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + #[derive(Default, Debug, Clone)] -pub struct Transforms { +struct Transforms { pub block_no: U64, pub prev_state_root: H256, pub curr_state_root: H256, @@ -33,6 +65,7 @@ trait TrieModificationBuilder { fn nonce(address: Address, nonce: U64) -> Self; fn codehash(address: Address, code_hash: H256) -> Self; fn storage(address: Address, key: H256, value: U256) -> Self; + fn storage_does_not_exist(address: Address, key: H256, value: U256) -> Self; } impl TrieModificationBuilder for TrieModification { @@ -69,83 +102,41 @@ impl TrieModificationBuilder for TrieModification { ..Default::default() } } + fn storage_does_not_exist(address: Address, key: H256, value: U256) -> Self { + Self { + typ: ProofType::StorageDoesNotExist, + address, + key, + value, + ..Default::default() + } + } } #[derive(Default)] -pub struct StateUpdateWitness { - pub transforms: Transforms, - pub lc_witness: SingleTrieModifications, +pub struct Witness { + pub lc_witness: FieldTrieModifications, pub mpt_witness: Vec, } -#[derive(Default, Clone)] -pub struct SingleTrieModification { - pub typ: F, - pub address: F, - pub value: word::Word, - pub key: word::Word, - pub old_root: word::Word, - pub new_root: word::Word, -} - -#[derive(Default, Clone)] -pub struct SingleTrieModifications(pub Vec>); - -impl Deref for SingleTrieModifications { - type Target = Vec>; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -pub struct PublicInputs(pub Vec); -impl Deref for PublicInputs { - type Target = Vec; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -impl From<&SingleTrieModifications> for PublicInputs { - fn from(stm: &SingleTrieModifications) -> Self { - let mut inputs = vec![ - stm.0[0].old_root.lo(), - stm.0[0].old_root.hi(), - stm.0.last().unwrap().new_root.lo(), - stm.0.last().unwrap().new_root.hi(), - F::from(stm.0.len() as u64), - ]; - - for proof in &stm.0 { - inputs.push(proof.typ); - inputs.push(proof.address); - inputs.push(proof.value.lo()); - inputs.push(proof.value.hi()); - inputs.push(proof.key.lo()); - inputs.push(proof.key.hi()); - } - - PublicInputs(inputs) - } -} - -impl StateUpdateWitness { +impl Witness { pub async fn build( - client: Arc, Wallet>>, - provider: &str, + provider_url: &str, block_no: U64, access_list: Option, + include_unchanged: bool, ) -> Result> { - let transforms = Self::get_transforms(client, block_no, access_list).await?; - println!("### trns : {:#?}", transforms); + let provider: Provider = + Provider::::try_from(provider_url)?.interval(Duration::from_millis(10u64)); + + let transforms = + Self::get_transforms(provider, block_no, access_list, include_unchanged).await?; + if transforms.prev_state_root == transforms.curr_state_root { Ok(None) } else { - let (mpt_witness, lc_witness) = Self::mpt_witness(&transforms, provider)?; + let (mpt_witness, lc_witness) = Self::mpt_witness(&transforms, provider_url)?; Ok(Some(Self { - transforms, mpt_witness, lc_witness, })) @@ -153,18 +144,18 @@ impl StateUpdateWitness { } async fn get_transforms( - client: Arc, Wallet>>, + provider: Provider, block_no: U64, access_list: Option, + include_initial_values: bool, ) -> Result { - let mut trie_modifications = Vec::new(); - // get previous block and this block - let prev_block = client + let prev_block: Block = provider .get_block(BlockId::Number(BlockNumber::Number(block_no - 1))) .await? .unwrap(); - let curr_block = client + + let curr_block = provider .get_block_with_txs(BlockId::Number(BlockNumber::Number(block_no))) .await? .unwrap(); @@ -180,8 +171,7 @@ impl StateUpdateWitness { let mut access_list = if let Some(access_list) = access_list { access_list } else { - client - .provider() + provider .request( "eth_getAccessListByNumber", vec![format!("0x{:x}", block_no)], @@ -189,8 +179,28 @@ impl StateUpdateWitness { .await? }; + // sanitize access_list + let mut access_list_map = BTreeMap::new(); + for item in access_list.0.iter_mut() { + let entry = access_list_map + .entry(item.address) + .or_insert_with(BTreeSet::new); + for key in item.storage_keys.iter() { + entry.insert(*key); + } + } + let mut access_list = AccessList( + access_list_map + .into_iter() + .map(|(address, storage_keys)| AccessListItem { + address, + storage_keys: storage_keys.into_iter().collect(), + }) + .collect(), + ); + // add coinbase to the access list - let mut extra_addrs = HashSet::from([curr_block.author.unwrap()]); + let mut extra_addrs = BTreeSet::from([curr_block.author.unwrap()]); for tx in curr_block.transactions { extra_addrs.insert(tx.from); if let Some(addr) = tx.to { @@ -207,13 +217,16 @@ impl StateUpdateWitness { } } + let mut initial_values = Vec::new(); + let mut changed_values = Vec::new(); + for entry in access_list.0 { let AccessListItem { address, storage_keys, } = entry; - let old = client + let old = provider .get_proof( address, storage_keys.clone(), @@ -221,7 +234,7 @@ impl StateUpdateWitness { ) .await?; - let new = client + let new = provider .get_proof( address, storage_keys.clone(), @@ -229,33 +242,55 @@ impl StateUpdateWitness { ) .await?; - // if nothing changed, skip + // if nothing changed, append all values if old.balance == new.balance && old.nonce == new.nonce && old.code_hash == new.code_hash && old.storage_hash == new.storage_hash + && !include_initial_values { - println!("Skipping {:?} as nothing changed", address); continue; } + if include_initial_values { + initial_values.push(TrieModification::balance(address, old.balance)); + initial_values.push(TrieModification::nonce(address, old.nonce)); + initial_values.push(TrieModification::codehash(address, old.code_hash)); + + for key in storage_keys.iter() { + let old = old.storage_proof.iter().find(|p| p.key == *key).unwrap(); + if old.value == U256::zero() { + initial_values.push(TrieModification::storage_does_not_exist( + address, *key, old.value, + )); + } else { + initial_values.push(TrieModification::storage(address, *key, old.value)); + } + } + } + // check for this address changes if old.nonce != new.nonce { - trie_modifications.push(TrieModification::nonce(address, new.nonce)); + changed_values.push(TrieModification::nonce(address, new.nonce)); } if old.balance != new.balance { - trie_modifications.push(TrieModification::balance(address, new.balance)); + changed_values.push(TrieModification::balance(address, new.balance)); } - if old.code_hash != new.code_hash { - trie_modifications.push(TrieModification::codehash(address, new.code_hash)); + if old.code_hash != new.code_hash + // && new.code_hash != *DEFAULT_CODE_HASH + { + changed_values.push(TrieModification::codehash(address, new.code_hash)); } for key in storage_keys { let new = new.storage_proof.iter().find(|p| p.key == key).unwrap(); - trie_modifications.push(TrieModification::storage(address, key, new.value)); + changed_values.push(TrieModification::storage(address, key, new.value)); } } + let mut trie_modifications = initial_values; + trie_modifications.append(&mut changed_values); + Ok(Transforms { block_no, curr_state_root: curr_block.state_root, @@ -267,12 +302,13 @@ impl StateUpdateWitness { fn mpt_witness( trns: &Transforms, provider: &str, - ) -> Result<(Vec, SingleTrieModifications)> { - let nodes = mpt_witness_generator::get_witness( + ) -> Result<(Vec, FieldTrieModifications)> { + let json = geth_utils::get_witness( trns.block_no.as_u64() - 1, &trns.trie_modifications, provider, ); + let nodes = zkevm_circuits::mpt_circuit::load_proof(json.as_bytes())?; let witness_previous_state_root = H256::from_slice(&nodes[0].values[0][1..33]); let non_disabled_node = |n: &&Node| { @@ -283,8 +319,6 @@ impl StateUpdateWitness { let witness_current_state_root = H256::from_slice(&nodes.iter().rev().find(non_disabled_node).unwrap().values[1][1..33]); - // crate::utils::print_nodes(&nodes); - // check if the roots matches assert_eq!( witness_previous_state_root, trns.prev_state_root, @@ -317,28 +351,27 @@ impl StateUpdateWitness { let m = &trns.trie_modifications[lc_proofs.len()]; let changes = match m.typ { - ProofType::BalanceChanged => vec![( + ProofType::BalanceChanged => ( ProofType::BalanceChanged, m.address, m.balance, H256::zero(), - )], - ProofType::NonceChanged => vec![( + ), + ProofType::NonceChanged => ( ProofType::NonceChanged, m.address, U256::from(m.nonce.0[0]), H256::zero(), - )], - ProofType::StorageChanged => { - vec![(ProofType::StorageChanged, m.address, m.value, m.key)] - } - ProofType::CodeHashChanged => { - vec![( - ProofType::CodeHashChanged, - m.address, - U256::from_big_endian(&m.code_hash.0), - H256::zero(), - )] + ), + ProofType::StorageChanged => (ProofType::StorageChanged, m.address, m.value, m.key), + ProofType::CodeHashChanged => ( + ProofType::CodeHashChanged, + m.address, + U256::from_big_endian(&m.code_hash.0), + H256::zero(), + ), + ProofType::StorageDoesNotExist => { + (ProofType::StorageDoesNotExist, m.address, m.value, m.key) } _ => { println!("type unimplemented: {:?}", m.typ); @@ -346,19 +379,19 @@ impl StateUpdateWitness { } }; - for (proof_type, address, value, key) in changes { - let lc_proof = SingleTrieModification:: { - typ: F::from(proof_type as u64), - address: address.to_scalar().unwrap(), - value: Word::::from(value), - key: Word::::from(key), - old_root: Word::::from(from_root), - new_root: Word::::from(to_root), - }; - lc_proofs.push(lc_proof); - } + let (proof_type, address, value, key) = changes; + + let lc_proof = FieldTrieModification:: { + typ: F::from(proof_type as u64), + address: address.to_scalar().unwrap(), + value: WordLoHi::::from(value), + key: WordLoHi::::from(key), + old_root: WordLoHi::::from(from_root), + new_root: WordLoHi::::from(to_root), + }; + lc_proofs.push(lc_proof); } - Ok((nodes, SingleTrieModifications(lc_proofs))) + Ok((nodes, FieldTrieModifications(lc_proofs))) } } diff --git a/bin/mpt-test/src/main.rs b/bin/mpt-test/src/main.rs new file mode 100644 index 0000000000..ccd4dd6187 --- /dev/null +++ b/bin/mpt-test/src/main.rs @@ -0,0 +1,70 @@ +#[macro_use] +extern crate lazy_static; + +mod cache; +mod circuit; + +use ethers::{prelude::*, types::transaction::eip2930::AccessList}; +use eyre::Result; +use halo2_proofs::halo2curves::bn256::Fr; + +use circuit::{state_update::StateUpdateCircuit, witness::Witness}; + +// test the StateUpdate circuit with a mock prover +async fn mock_prove(block_no: u64, access_list: &str) -> Result<()> { + let provider_url = "http://localhost:3000"; + + let access_list: AccessList = serde_json::from_str(access_list)?; + let proof_count = 2 * access_list.0.len() * 3 + + access_list + .0 + .iter() + .map(|k| k.storage_keys.len()) + .sum::(); + + let max_nodes = 40000; + + let witness = Witness::::build(provider_url, U64::from(block_no), Some(access_list), true) + .await? + .unwrap(); + + let circuit = StateUpdateCircuit::new(witness, 16, max_nodes, proof_count + 10)?; + circuit.assert_satisfied(); + Ok(()) +} + +#[tokio::main] +async fn main() -> Result<()> { + // load the cache file, if exists + cache::load().await?; + + // start the cache server + let _handle = tokio::task::spawn(cache::start()); + + // read all the access list files, sorting them by block number + let mut files: Vec<_> = glob::glob("access-lists/*.json") + .unwrap() + .filter_map(|v| v.ok()) + .map(|v| { + let block = v + .file_name() + .unwrap() + .to_str() + .unwrap() + .strip_suffix(".json") + .unwrap(); + let block: u64 = str::parse(block).unwrap(); + (block, v) + }) + .collect(); + + files.sort_by(|(a, _), (b, _)| a.cmp(b)); + + // prove each block + for (block_no, file) in files { + let json = std::fs::read_to_string(&file)?; + mock_prove(block_no, &json).await?; + } + + Ok(()) +} diff --git a/bin/mpt-test/test_mainnet_blocks.sh b/bin/mpt-test/test_mainnet_blocks.sh new file mode 100755 index 0000000000..5a636e414d --- /dev/null +++ b/bin/mpt-test/test_mainnet_blocks.sh @@ -0,0 +1,6 @@ +URL=https://drive.google.com/uc\?export\=download\&id\=1ki4OVizAlvDWHqdipJj4svMBNMBQ5cr5 +CACHE_FILE=web3_rpc_cache.bin +if [ ! -f "$CACHE_FILE" ]; then + wget -O $CACHE_FILE $URL +fi +cargo run --release \ No newline at end of file diff --git a/bus-mapping/Cargo.toml b/bus-mapping/Cargo.toml index d58111b309..bf8dd08b25 100644 --- a/bus-mapping/Cargo.toml +++ b/bus-mapping/Cargo.toml @@ -16,6 +16,8 @@ halo2_proofs = { git = "https://github.com/privacy-scaling-explorations/halo2.gi itertools = "0.10" lazy_static = "1.4" log = "0.4.14" +num = "0.4" +rand = { version = "0.8", optional = true } serde = {version = "1.0.130", features = ["derive"] } serde_json = "1.0.66" strum = "0.24" diff --git a/bus-mapping/README.md b/bus-mapping/README.md index e0cbea24da..a1db65fcf5 100644 --- a/bus-mapping/README.md +++ b/bus-mapping/README.md @@ -1,54 +1,36 @@ # ZKEVM Bus-Mapping -![GitHub Workflow Status (branch)](https://img.shields.io/github/workflow/status/appliedzkp/zkevm-circuits/CI%20checks/main?style=for-the-badge) +The `Bus-Mapping` crate is designed to parse EVM execution traces and manipulate the data they provide to obtain structured witness inputs for the EVM Proof and the State Proof. -`Bus-Mapping` is a crate designed to parse EVM execution traces and manipulate -all of the data they provide in order to obtain structured witness inputs -for the EVM Proof and the State Proof. +## Introduction -### Introduction -At the moment every node on ethereum has to validate every transaction in -the ethereum virtual machine. This means that every transaction adds work -that everyone needs to do to verify Ethereum’s history. Worse still is that -each transaction needs to be verified by every new node. Which means the -amount of work a new node needs to do the sync the network is growing -constantly. We want to build a proof of validity for the Ethereum blocks to -avoid this. +Currently, every node on Ethereum must validate every transaction in the Ethereum Virtual Machine (EVM). This means that each transaction adds work that everyone must do to verify Ethereum’s history. Furthermore, each transaction needs to be verified by every new node, leading to a growing amount of work for new nodes to sync the network. To address this, we aim to build a proof of validity for Ethereum blocks. -This means making a proof of validity for the EVM + state reads / writes + -signatures. -To simplify we separate our proofs into two components. +This involves creating a proof of validity for the EVM, including state reads/writes and signatures. To simplify, we divide our proofs into two components: -- State proof: State/memory/stack ops have been performed correctly. This -does not check if the correct location has been read/written. We allow our -prover to pick any location here and in the EVM proof confirm it is correct. +- State Proof: Validates that state/memory/stack operations have been performed correctly. However, it does not verify if the correct location has been read/written. Our prover can select any location here and in the EVM proof confirm its correctness. +- EVM Proof: Validates that the correct opcode is called at the correct time, checking the validity of these opcodes. It also confirms that for each of these opcodes, the state proof performed the correct operation. -- EVM proof: This checks that the correct opcode is called at the correct -time. It checks the validity of these opcodes. It also confirms that for -each of these opcodes the state proof performed the correct operation. +Only after verifying both proofs can we be confident that the Ethereum block is executed correctly. -Only after verifying both proofs are we confident that that Ethereum block -is executed correctly. +## Bus Mapping -### Bus Mapping The goal of this crate is to serve as: -- A parsing lib for EVM execution traces. -- A way to infer some witness data that can only be constructed once we've - analyzed the full exec trace. -- An easy interface to collect all of the data to witness into the circuits - and witness it with few function calls. - -### Parsing -Provided a JSON file or a JSON as a stream of bytes, which contains an -execution trace from an EVM, you can parse it and construct an -`ExecutionTrace` instance from it. That will automatically fill all of the -bus-mapping instances of each -[`ExecutionStep`](crate::exec_trace::ExecutionStep) plus fill in an -[`OperationContainer`](crate::operation::container::OperationContainer) with -all of the Memory, Stack and Storage ops performed by the provided trace. + +- A parsing library for EVM execution traces. +- A way to infer some witness data that can only be constructed once we've analyzed the full exec trace. +- An easy interface to collect all of the data to witness into the circuits and witness it with few function calls. + +## Parsing + +Given a JSON file or a JSON stream containing an execution trace from an EVM, you can parse it and construct a [`GethExecTrace`](eth_types::GethExecTrace) instance from it. This will automatically populate all of the bus-mapping instances of each [`ExecStep`](crate::circuit_input_builder::ExecStep) and fill an [`OperationContainer`](crate::operation::OperationContainer) with all of the memory, stack, and storage operations performed by the provided trace. ```rust -use bus_mapping::{ExecutionTrace, ExecutionStep, BlockConstants, Error, evm::EvmWord}; +use bus_mapping::mock::BlockData; +use eth_types::{ + GethExecTrace, GethExecStep, geth_types::GethData, bytecode +}; +use mock::test_ctx::{TestContext, helpers::*}; let input_trace = r#" [ @@ -98,31 +80,48 @@ let input_trace = r#" ] "#; -let block_ctants = BlockConstants::new( - Word::from(0), - pasta_curves::Fp::zero(), - pasta_curves::Fp::zero(), - pasta_curves::Fp::zero(), - pasta_curves::Fp::zero(), - pasta_curves::Fp::zero(), - pasta_curves::Fp::zero(), - pasta_curves::Fp::zero(), -); - -// Here we have the ExecutionTrace completely formed with all of the data to witness structured. -let obtained_exec_trace = ExecutionTrace::from_trace_bytes( - input_trace.as_bytes(), - block_ctants, -).expect("Error on trace generation"); +// We use the [`TestContext`] struct to mock a block. +let code = bytecode! { + // Write 0x6f to storage slot 0 + PUSH1(0x6fu64) + PUSH1(0x00u64) + SSTORE + // Load storage slot 0 + PUSH1(0x00u64) + SLOAD + STOP +}; +// Get the execution steps from the external tracer +let block: GethData = TestContext::<2, 1>::new( + None, + account_0_code_account_1_no_code(code), + tx_from_1_to_0, + |block, _tx| block.number(0xcafeu64), +) +.unwrap() +.into(); +// Here we update the circuit input with the data from the transaction trace. +let builder = BlockData::new_from_geth_data(block.clone()).new_circuit_input_builder(); +let builder = builder + .handle_block(&block.eth_block, &block.geth_traces) + .unwrap(); +let geth_steps: Vec = serde_json::from_str(input_trace).unwrap(); +let _geth_trace = GethExecTrace { + return_value: "".to_string(), + gas: block.eth_block.transactions[0].gas.as_u64(), + invalid: false, + failed: false, + struct_logs: geth_steps, +}; // Get an ordered vector with all of the Stack operations of this trace. -let stack_ops = obtained_exec_trace.sorted_stack_ops(); - +let _stack_ops = builder.block.container.sorted_stack(); // You can also iterate over the steps of the trace and witness the EVM Proof. -obtained_exec_trace.steps().iter(); +let _ = builder.block.txs()[0].steps().iter(); ``` -Assume we have the following trace: +Assuming we have the following trace: + ```text,ignore pc op stack (top -> down) memory -- -------------- ---------------------------------- --------------------------------------- @@ -148,37 +147,28 @@ pc op stack (top -> down) memory ... ``` -Once you have the trace built (following the code found above) you can -basically: -- Get an iterator/vector over the `Stack`, `Memory` or `Storage` operations - ordered on the way the State Proof needs. +Once you have built the trace (following the code above), you can: + +- Get an iterator/vector over the `Stack`, `Memory`, or `Storage` operations ordered in the way the State Proof needs. + +For the Memory operations, it might look like this: -On that way, we would get something like this for the Memory ops: ```text,ignore -| `key` | `val` | `rw` | `gc` | Note | -|:------:| ------------- | ------- | ---- | ---------------------------------------- | -| `0x40` | `0` | `Write` | | Init | -| `0x40` | `0x80` | `Write` | 0 | Assume written at the begining of `code` | -| `0x40` | `0x80` | `Read` | 4 | `56 MLOAD` | -| - | | | | | -| `0x80` | `0` | `Write` | | Init | -| `0x80` | `0xdeadbeef` | `Write` | 10 | `63 MSTORE` | -| `0x80` | `0xdeadbeef` | `Read` | 16 | `70 MLOAD` | -| `0x80` | `0x1d97c6efb` | `Write` | 24 | `73 MSTORE` | -| - | | | | | -| `0xa0` | `0` | `Write` | | Init | -| `0xa0` | `0xcafeb0ba` | `Write` | 34 | `83 MSTORE` +| `key` | `val` | `rw` | `gc` | Note | +| :----: | ------------- | ------- | ---- | ----------------------------------------- | +| `0x40` | `0` | `Write` | | Init | +| `0x40` | `0x80` | `Write` | 0 | Assume written at the beginning of `code` | +| `0x40` | `0x80` | `Read` | 4 | `56 MLOAD` | +| - | | | | | +| `0x80` | `0` | `Write` | | Init | +| `0x80` | `0xdeadbeef` | `Write` | 10 | `63 MSTORE` | +| `0x80` | `0xdeadbeef` | `Read` | 16 | `70 MLOAD` | +| `0x80` | `0x1d97c6efb` | `Write` | 24 | `73 MSTORE` | +| - | | | | | +| `0xa0` | `0` | `Write` | | Init | +| `0xa0` | `0xcafeb0ba` | `Write` | 34 | `83 MSTORE` | ``` -Where as you see, we group by `memory_address` and then order by -`global_counter`. - -- Iterate over the `ExecutionTrace` itself over -each `ExecutionStep`'s is formed by and check which Stack/Memory&Storage operations are linked to each step. -This is also automatically done via the -[`Opcode`](crate::evm::opcodes::Opcode) trait defined in this crate. +Here, we group by `memory_address` and then order by `global_counter`. -### Documentation -For extra documentation, check the book with the specs written for the -entire ZK-EVM solution. -See: +- Iterate over the [`GethExecTrace`](eth_types::GethExecTrace) itself, over each [`ExecStep`](crate::circuit_input_builder::ExecStep) formed by, and check which Stack/Memory&Storage operations are linked to each step. This is also automatically done via the [`Opcode`](crate::evm::opcodes::Opcode) trait defined in this crate. diff --git a/bus-mapping/src/circuit_input_builder.rs b/bus-mapping/src/circuit_input_builder.rs index 7cd93c0900..9edc37358e 100644 --- a/bus-mapping/src/circuit_input_builder.rs +++ b/bus-mapping/src/circuit_input_builder.rs @@ -36,6 +36,7 @@ use eth_types::{ use ethers_providers::JsonRpcClient; pub use execution::{ CopyDataType, CopyEvent, CopyStep, ExecState, ExecStep, ExpEvent, ExpStep, NumberOrHash, + PrecompileEvent, PrecompileEvents, N_BYTES_PER_PAIR, N_PAIRING_PER_OP, }; pub use input_state_ref::CircuitInputStateRef; use itertools::Itertools; @@ -93,7 +94,7 @@ pub struct FixedCParams { /// pub total_chunks: usize, /// Maximum number of rw operations in the state circuit (RwTable length / - /// nummber of rows). This must be at least the number of rw operations + /// number of rows). This must be at least the number of rw operations /// + 1, in order to allocate at least a Start row. pub max_rws: usize, // TODO: evm_rows: Maximum number of rows in the EVM Circuit @@ -122,6 +123,11 @@ pub struct FixedCParams { /// calculated, so the same circuit will not be able to prove different /// witnesses. pub max_keccak_rows: usize, + /// This number indicate what 100% usage means, for example if we can support up to 2 + /// ecPairing inside circuit, and max_vertical_circuit_rows is set to 1_000_000, + /// then if there is 1 ecPairing in the input, we will return 500_000 as the "row usage" + /// for the ec circuit. + pub max_vertical_circuit_rows: usize, } /// Unset Circuits Parameters @@ -187,6 +193,7 @@ impl Default for FixedCParams { max_bytecode: 512, max_evm_rows: 0, max_keccak_rows: 0, + max_vertical_circuit_rows: 0, } } } @@ -225,7 +232,7 @@ pub struct CircuitInputBuilder { pub block_ctx: BlockContext, /// Chunk Context pub chunk_ctx: ChunkContext, - /// Circuit Params before chunking + /// Circuits Setup Parameters before chunking pub circuits_params: C, /// Feature config pub feature_config: FeatureConfig, @@ -922,6 +929,7 @@ impl CircuitInputBuilder { max_bytecode, max_evm_rows, max_keccak_rows, + max_vertical_circuit_rows: 0, } } } @@ -1019,7 +1027,7 @@ pub fn keccak_inputs(block: &Block, code_db: &CodeDB) -> Result>, Er } /// Generate the keccak inputs required by the SignVerify Chip from the -/// signature datas. +/// signature data. pub fn keccak_inputs_sign_verify(sigs: &[SignData]) -> Vec> { let mut inputs = Vec::new(); for sig in sigs { diff --git a/bus-mapping/src/circuit_input_builder/access.rs b/bus-mapping/src/circuit_input_builder/access.rs index 1626d6f97a..086396e749 100644 --- a/bus-mapping/src/circuit_input_builder/access.rs +++ b/bus-mapping/src/circuit_input_builder/access.rs @@ -72,7 +72,7 @@ impl From> for AccessSet { for access in list { match access.value { AccessValue::Account { address } => { - state.entry(address).or_insert_with(HashSet::new); + state.entry(address).or_default(); } AccessValue::Storage { address, key } => match state.entry(address) { Entry::Vacant(entry) => { @@ -85,7 +85,7 @@ impl From> for AccessSet { } }, AccessValue::Code { address } => { - state.entry(address).or_insert_with(HashSet::new); + state.entry(address).or_default(); code.insert(address); } } diff --git a/bus-mapping/src/circuit_input_builder/block.rs b/bus-mapping/src/circuit_input_builder/block.rs index 22edf65153..8312a96a5a 100644 --- a/bus-mapping/src/circuit_input_builder/block.rs +++ b/bus-mapping/src/circuit_input_builder/block.rs @@ -1,7 +1,8 @@ //! Block-related utility module use super::{ - execution::ExecState, transaction::Transaction, CopyEvent, ExecStep, ExpEvent, Withdrawal, + execution::ExecState, transaction::Transaction, CopyEvent, ExecStep, ExpEvent, PrecompileEvent, + PrecompileEvents, Withdrawal, }; use crate::{ operation::{OperationContainer, RWCounter}, @@ -49,7 +50,7 @@ pub struct Block { /// chain id pub chain_id: Word, /// history hashes contains most recent 256 block hashes in history, where - /// the lastest one is at history_hashes[history_hashes.len() - 1]. + /// the latest one is at history_hashes[history_hashes.len() - 1]. pub history_hashes: Vec, /// coinbase pub coinbase: Address, @@ -80,6 +81,8 @@ pub struct Block { pub sha3_inputs: Vec>, /// Exponentiation events in the block. pub exp_events: Vec, + /// IO to/from the precompiled contract calls. + pub precompile_events: PrecompileEvents, /// Original block from geth pub eth_block: eth_types::Block, } @@ -132,6 +135,7 @@ impl Block { copy_events: Vec::new(), exp_events: Vec::new(), sha3_inputs: Vec::new(), + precompile_events: PrecompileEvents { events: Vec::new() }, eth_block: eth_block.clone(), }) } @@ -178,4 +182,9 @@ impl Block { pub fn add_exp_event(&mut self, event: ExpEvent) { self.exp_events.push(event); } + + /// Push a precompile event to the block. + pub fn add_precompile_event(&mut self, event: PrecompileEvent) { + self.precompile_events.events.push(event); + } } diff --git a/bus-mapping/src/circuit_input_builder/call.rs b/bus-mapping/src/circuit_input_builder/call.rs index 1d53070197..2052e2c1ea 100644 --- a/bus-mapping/src/circuit_input_builder/call.rs +++ b/bus-mapping/src/circuit_input_builder/call.rs @@ -63,7 +63,7 @@ pub struct Call { pub kind: CallKind, /// This call is being executed without write access (STATIC) pub is_static: bool, - /// This call generated implicity by a Transaction. + /// This call generated implicitly by a Transaction. pub is_root: bool, /// This call is persistent or call stack reverts at some point pub is_persistent: bool, diff --git a/bus-mapping/src/circuit_input_builder/execution.rs b/bus-mapping/src/circuit_input_builder/execution.rs index 579c498457..fd5fc4310c 100644 --- a/bus-mapping/src/circuit_input_builder/execution.rs +++ b/bus-mapping/src/circuit_input_builder/execution.rs @@ -5,9 +5,9 @@ use crate::{ error::{ExecError, OogError}, exec_trace::OperationRef, operation::RWCounter, - precompile::PrecompileCalls, + precompile::{PrecompileAuxData, PrecompileCalls}, }; -use eth_types::{evm_types::OpcodeId, GethExecStep, Word, H256}; +use eth_types::{evm_types::OpcodeId, sign_types::SignData, GethExecStep, Word, H256}; use gadgets::impl_expr; use halo2_proofs::plonk::Expression; use strum_macros::EnumIter; @@ -51,6 +51,8 @@ pub struct ExecStep { pub copy_rw_counter_delta: u64, /// Error generated by this step pub error: Option, + /// Optional auxiliary data that is attached to precompile call internal states. + pub aux_data: Option, } impl ExecStep { @@ -81,6 +83,7 @@ impl ExecStep { bus_mapping_instance: Vec::new(), copy_rw_counter_delta: 0, error: None, + aux_data: None, } } @@ -344,7 +347,7 @@ impl From<(Word, Word, Word)> for ExpStep { } } -/// Event representating an exponentiation `a ^ b == d (mod 2^256)`. +/// Event representing an exponentiation `a ^ b == d (mod 2^256)`. #[derive(Clone, Debug)] pub struct ExpEvent { /// Identifier for the exponentiation trace. @@ -374,3 +377,44 @@ impl Default for ExpEvent { } } } + +/// I/Os from all precompiled contract calls in a block. +#[derive(Clone, Debug, Default)] +pub struct PrecompileEvents { + /// All events. + pub events: Vec, +} + +impl PrecompileEvents { + /// Get all ecrecover events. + pub fn get_ecrecover_events(&self) -> Vec { + self.events + .iter() + .map(|e| { + let PrecompileEvent::Ecrecover(sign_data) = e; + sign_data + }) + .cloned() + .collect() + } +} + +/// I/O from a precompiled contract call. +#[derive(Clone, Debug)] +pub enum PrecompileEvent { + /// Represents the I/O from Ecrecover call. + Ecrecover(SignData), +} + +impl Default for PrecompileEvent { + fn default() -> Self { + Self::Ecrecover(SignData::default()) + } +} + +/// The number of pairing inputs per pairing operation. If the inputs provided to the precompile +/// call are < 4, we append (G1::infinity, G2::generator) until we have the required no. of inputs. +pub const N_PAIRING_PER_OP: usize = 4; + +/// The number of bytes taken to represent a pair (G1, G2). +pub const N_BYTES_PER_PAIR: usize = 192; diff --git a/bus-mapping/src/circuit_input_builder/input_state_ref.rs b/bus-mapping/src/circuit_input_builder/input_state_ref.rs index 2f1fff9d92..09592d5102 100644 --- a/bus-mapping/src/circuit_input_builder/input_state_ref.rs +++ b/bus-mapping/src/circuit_input_builder/input_state_ref.rs @@ -2,8 +2,8 @@ use super::{ get_call_memory_offset_length, get_create_init_code, Block, BlockContext, Call, CallContext, - CallKind, ChunkContext, CodeSource, CopyEvent, ExecState, ExecStep, ExpEvent, Transaction, - TransactionContext, + CallKind, ChunkContext, CodeSource, CopyEvent, ExecState, ExecStep, ExpEvent, PrecompileEvent, + Transaction, TransactionContext, }; use crate::{ error::{DepthError, ExecError, InsufficientBalanceError, NonceUintOverflowError}, @@ -126,7 +126,7 @@ impl<'a> CircuitInputStateRef<'a> { } } - /// Push an [`Operation`](crate::operation::Operation) into the + /// Push an [`Operation`] into the /// [`OperationContainer`](crate::operation::OperationContainer) with the /// next [`RWCounter`](crate::operation::RWCounter) and then adds a /// reference to the stored operation ([`OperationRef`]) inside the @@ -207,8 +207,7 @@ impl<'a> CircuitInputStateRef<'a> { self.push_op(step, RW::WRITE, op) } - /// Push an [`Operation`](crate::operation::Operation) with reversible to be - /// true into the + /// Push an [`Operation`] with reversible to be true into the /// [`OperationContainer`](crate::operation::OperationContainer) with the /// next [`RWCounter`](crate::operation::RWCounter) and then adds a /// reference to the stored operation @@ -1238,7 +1237,7 @@ impl<'a> CircuitInputStateRef<'a> { ) -> Result<(), Error> { let call = self.call()?.clone(); let geth_step = steps - .get(0) + .first() .ok_or(Error::InternalError("invalid index 0"))?; let is_revert_or_return_call_success = (geth_step.op == OpcodeId::REVERT || geth_step.op == OpcodeId::RETURN) @@ -1417,6 +1416,11 @@ impl<'a> CircuitInputStateRef<'a> { self.block.add_exp_event(event) } + /// Push an event representing auxiliary data for a precompile call to the state. + pub fn push_precompile_event(&mut self, event: PrecompileEvent) { + self.block.add_precompile_event(event) + } + pub(crate) fn get_step_err( &self, step: &GethExecStep, @@ -1432,7 +1436,7 @@ impl<'a> CircuitInputStateRef<'a> { let call = self.call()?; - if matches!(next_step, None) { + if next_step.is_none() { // enumerating call scope successful cases // case 1: call with normal halt opcode termination if matches!( @@ -1627,7 +1631,6 @@ impl<'a> CircuitInputStateRef<'a> { PrecompileCalls::Sha256 | PrecompileCalls::Ripemd160 | PrecompileCalls::Blake2F - | PrecompileCalls::ECRecover | PrecompileCalls::Bn128Add | PrecompileCalls::Bn128Mul | PrecompileCalls::Bn128Pairing diff --git a/bus-mapping/src/circuit_input_builder/tracer_tests.rs b/bus-mapping/src/circuit_input_builder/tracer_tests.rs index 0855d491eb..9ce73c4599 100644 --- a/bus-mapping/src/circuit_input_builder/tracer_tests.rs +++ b/bus-mapping/src/circuit_input_builder/tracer_tests.rs @@ -146,7 +146,7 @@ fn check_err_depth(step: &GethExecStep, next_step: Option<&GethExecStep>) -> boo #[test] fn tracer_err_depth() { - // Recursive CALL will exaust the call depth + // Recursive CALL will exhaust the call depth let code = bytecode! { PUSH1(0x0) // retLength PUSH1(0x0) // retOffset diff --git a/bus-mapping/src/circuit_input_builder/transaction.rs b/bus-mapping/src/circuit_input_builder/transaction.rs index 32336956e3..6783a78191 100644 --- a/bus-mapping/src/circuit_input_builder/transaction.rs +++ b/bus-mapping/src/circuit_input_builder/transaction.rs @@ -182,7 +182,7 @@ pub struct Transaction { /// The transaction id pub id: u64, /// The raw transaction fields - tx: geth_types::Transaction, + pub tx: geth_types::Transaction, /// Calls made in the transaction pub(crate) calls: Vec, /// Execution steps @@ -190,6 +190,16 @@ pub struct Transaction { } impl Transaction { + /// Create a dummy Transaction with zero values + pub fn dummy() -> Self { + Self { + id: 0, + calls: Vec::new(), + steps: Vec::new(), + tx: geth_types::Transaction::dummy(), + } + } + /// Create a new Self. pub fn new( id: u64, diff --git a/bus-mapping/src/error.rs b/bus-mapping/src/error.rs index 313ed43652..a125fdb421 100644 --- a/bus-mapping/src/error.rs +++ b/bus-mapping/src/error.rs @@ -105,7 +105,7 @@ pub enum OogError { SelfDestruct, } -// Given OpCodeId, returns correponding OogError. +// Given OpCodeId, returns corresponding OogError. impl From<&OpcodeId> for OogError { fn from(op: &OpcodeId) -> Self { match op { diff --git a/bus-mapping/src/evm/opcodes.rs b/bus-mapping/src/evm/opcodes.rs index 7e2812351a..3be582fc20 100644 --- a/bus-mapping/src/evm/opcodes.rs +++ b/bus-mapping/src/evm/opcodes.rs @@ -115,8 +115,7 @@ pub use crate::precompile::PrecompileCallArgs; /// Generic opcode trait which defines the logic of the /// [`Operation`](crate::operation::Operation) that should be generated for one -/// or multiple [`ExecStep`](crate::circuit_input_builder::ExecStep) depending -/// of the [`OpcodeId`] it contains. +/// or multiple [`ExecStep`] depending of the [`OpcodeId`] it contains. pub trait Opcode: Debug { /// Generate the associated [`MemoryOp`](crate::operation::MemoryOp)s, /// [`StackOp`](crate::operation::StackOp)s, and diff --git a/bus-mapping/src/evm/opcodes/callop.rs b/bus-mapping/src/evm/opcodes/callop.rs index 316bfe454d..395b22504f 100644 --- a/bus-mapping/src/evm/opcodes/callop.rs +++ b/bus-mapping/src/evm/opcodes/callop.rs @@ -170,7 +170,7 @@ impl Opcode for CallOpcode { // read balance of caller to compare to value for insufficient_balance checking // in circuit, also use for callcode successful case check balance is // indeed larger than transfer value. for call opcode, it does in - // tranfer gadget implicitly. + // transfer gadget implicitly. state.account_read( &mut exec_step, call.caller_address, @@ -362,7 +362,7 @@ impl Opcode for CallOpcode { // insert a copy event (input) for this step and generate memory op let rw_counter_start = state.block_ctx.rwc; - if call.call_data_length > 0 { + let input_bytes = if call.call_data_length > 0 { let n_input_bytes = if let Some(input_len) = precompile_call.input_len() { min(input_len, call.call_data_length as usize) } else { @@ -390,11 +390,14 @@ impl Opcode for CallOpcode { bytes: input_bytes.iter().map(|s| (*s, false)).collect(), }, ); - } + Some(input_bytes) + } else { + None + }; // write the result in the callee's memory let rw_counter_start = state.block_ctx.rwc; - if call.is_success && !result.is_empty() { + let output_bytes = if call.is_success && !result.is_empty() { let (output_bytes, _prev_bytes) = state .gen_copy_steps_for_precompile_callee_memory(&mut exec_step, &result)?; @@ -413,11 +416,14 @@ impl Opcode for CallOpcode { bytes: output_bytes.iter().map(|s| (*s, false)).collect(), }, ); - } + Some(output_bytes) + } else { + None + }; // insert another copy event (output) for this step. let rw_counter_start = state.block_ctx.rwc; - if call.is_success && length > 0 { + let return_bytes = if call.is_success && length > 0 { let return_bytes = state.gen_copy_steps_for_precompile_returndata( &mut exec_step, call.return_data_offset, @@ -439,7 +445,10 @@ impl Opcode for CallOpcode { bytes: return_bytes.iter().map(|s| (*s, false)).collect(), }, ); - } + Some(return_bytes) + } else { + None + }; if has_oog_err { let mut oog_step = ErrorOOGPrecompile::gen_associated_ops( @@ -462,6 +471,9 @@ impl Opcode for CallOpcode { geth_steps[1].clone(), call.clone(), precompile_call, + &input_bytes.unwrap_or_default(), + &output_bytes.unwrap_or_default(), + &return_bytes.unwrap_or_default(), )?; // Set gas left and gas cost for precompile step. diff --git a/bus-mapping/src/evm/opcodes/error_oog_exp.rs b/bus-mapping/src/evm/opcodes/error_oog_exp.rs index 23d7d7c76d..c8ae7f4960 100644 --- a/bus-mapping/src/evm/opcodes/error_oog_exp.rs +++ b/bus-mapping/src/evm/opcodes/error_oog_exp.rs @@ -7,7 +7,7 @@ use crate::{ use eth_types::GethExecStep; /// Placeholder structure used to implement [`Opcode`] trait over it -/// corresponding to the [`OogError::Exp`](crate::error::OogError::Exp). +/// corresponding to the [`OogError::Exp`]. #[derive(Clone, Copy, Debug)] pub(crate) struct OOGExp; diff --git a/bus-mapping/src/evm/opcodes/error_oog_memory_copy.rs b/bus-mapping/src/evm/opcodes/error_oog_memory_copy.rs index 50327115ba..ef1b35c916 100644 --- a/bus-mapping/src/evm/opcodes/error_oog_memory_copy.rs +++ b/bus-mapping/src/evm/opcodes/error_oog_memory_copy.rs @@ -8,8 +8,7 @@ use crate::{ use eth_types::{evm_types::OpcodeId, GethExecStep, ToAddress}; /// Placeholder structure used to implement [`Opcode`] trait over it -/// corresponding to the -/// [`OogError::MemoryCopy`](crate::error::OogError::MemoryCopy). +/// corresponding to the [`OogError::MemoryCopy`]. #[derive(Clone, Copy, Debug)] pub(crate) struct OOGMemoryCopy; diff --git a/bus-mapping/src/evm/opcodes/error_oog_sload_sstore.rs b/bus-mapping/src/evm/opcodes/error_oog_sload_sstore.rs index 285ba59607..4ab139d39b 100644 --- a/bus-mapping/src/evm/opcodes/error_oog_sload_sstore.rs +++ b/bus-mapping/src/evm/opcodes/error_oog_sload_sstore.rs @@ -8,8 +8,7 @@ use crate::{ use eth_types::{GethExecStep, ToWord}; /// Placeholder structure used to implement [`Opcode`] trait over it -/// corresponding to the -/// [`OogError::SloadSstore`](crate::error::OogError::SloadSstore). +/// corresponding to the [`OogError::SloadSstore`]. #[derive(Clone, Copy, Debug)] pub(crate) struct OOGSloadSstore; diff --git a/bus-mapping/src/evm/opcodes/error_write_protection.rs b/bus-mapping/src/evm/opcodes/error_write_protection.rs index 2c9bd0b87e..65c3cb9eee 100644 --- a/bus-mapping/src/evm/opcodes/error_write_protection.rs +++ b/bus-mapping/src/evm/opcodes/error_write_protection.rs @@ -44,7 +44,7 @@ impl Opcode for ErrorWriteProtection { .contains(&geth_step.op)); if geth_step.op == OpcodeId::CALL { - // get only the frist three stack elements since the third one is the value we + // get only the first three stack elements since the third one is the value we // want to check. for i in 0..3 { state.stack_read( diff --git a/bus-mapping/src/evm/opcodes/precompiles/mod.rs b/bus-mapping/src/evm/opcodes/precompiles.rs similarity index 56% rename from bus-mapping/src/evm/opcodes/precompiles/mod.rs rename to bus-mapping/src/evm/opcodes/precompiles.rs index 70e62ce54c..ac16d21f6b 100644 --- a/bus-mapping/src/evm/opcodes/precompiles/mod.rs +++ b/bus-mapping/src/evm/opcodes/precompiles.rs @@ -3,15 +3,22 @@ use eth_types::{GethExecStep, ToWord, Word}; use crate::{ circuit_input_builder::{Call, CircuitInputStateRef, ExecState, ExecStep}, operation::CallContextField, - precompile::PrecompileCalls, + precompile::{PrecompileAuxData, PrecompileCalls}, Error, }; +mod ecrecover; + +use ecrecover::opt_data as opt_data_ecrecover; + pub fn gen_associated_ops( state: &mut CircuitInputStateRef, geth_step: GethExecStep, call: Call, precompile: PrecompileCalls, + input_bytes: &[u8], + output_bytes: &[u8], + return_bytes: &[u8], ) -> Result { assert_eq!(call.code_address(), Some(precompile.into())); let mut exec_step = state.new_step(&geth_step)?; @@ -19,6 +26,35 @@ pub fn gen_associated_ops( common_call_ctx_reads(state, &mut exec_step, &call)?; + let (opt_event, aux_data) = match precompile { + PrecompileCalls::Ecrecover => opt_data_ecrecover(input_bytes, output_bytes, return_bytes), + PrecompileCalls::Identity => ( + None, + Some(PrecompileAuxData::Base { + input_bytes: input_bytes.to_vec(), + output_bytes: output_bytes.to_vec(), + return_bytes: return_bytes.to_vec(), + }), + ), + _ => { + log::warn!("precompile {:?} unsupported in circuits", precompile); + ( + None, + Some(PrecompileAuxData::Base { + input_bytes: input_bytes.to_vec(), + output_bytes: output_bytes.to_vec(), + return_bytes: return_bytes.to_vec(), + }), + ) + } + }; + log::trace!("precompile event {opt_event:?}, aux data {aux_data:?}"); + + if let Some(event) = opt_event { + state.push_precompile_event(event); + } + exec_step.aux_data = aux_data; + Ok(exec_step) } diff --git a/bus-mapping/src/evm/opcodes/precompiles/ecrecover.rs b/bus-mapping/src/evm/opcodes/precompiles/ecrecover.rs new file mode 100644 index 0000000000..6bcf5f36ca --- /dev/null +++ b/bus-mapping/src/evm/opcodes/precompiles/ecrecover.rs @@ -0,0 +1,60 @@ +use eth_types::{ + sign_types::{biguint_to_32bytes_le, recover_pk, SignData, SECP256K1_Q}, + ToBigEndian, ToLittleEndian, +}; +use halo2_proofs::halo2curves::{ + group::{ff::PrimeField, prime::PrimeCurveAffine}, + secp256k1::{Fq, Secp256k1Affine}, +}; +use num::{BigUint, Integer}; + +use crate::{ + circuit_input_builder::PrecompileEvent, + precompile::{EcrecoverAuxData, PrecompileAuxData}, +}; + +pub(crate) fn opt_data( + input_bytes: &[u8], + output_bytes: &[u8], + return_bytes: &[u8], +) -> (Option, Option) { + let aux_data = EcrecoverAuxData::new(input_bytes, output_bytes, return_bytes); + + // We skip the validation through sig circuit if r or s was not in canonical form. + let opt_sig_r: Option = Fq::from_bytes(&aux_data.sig_r.to_le_bytes()).into(); + let opt_sig_s: Option = Fq::from_bytes(&aux_data.sig_s.to_le_bytes()).into(); + if opt_sig_r.zip(opt_sig_s).is_none() { + return (None, Some(PrecompileAuxData::Ecrecover(aux_data))); + } + + if let Some(sig_v) = aux_data.recovery_id() { + let recovered_pk = recover_pk( + sig_v, + &aux_data.sig_r, + &aux_data.sig_s, + &aux_data.msg_hash.to_be_bytes(), + ) + .unwrap_or(Secp256k1Affine::identity()); + let sign_data = SignData { + signature: ( + Fq::from_bytes(&aux_data.sig_r.to_le_bytes()).unwrap(), + Fq::from_bytes(&aux_data.sig_s.to_le_bytes()).unwrap(), + sig_v, + ), + pk: recovered_pk, + msg: aux_data.input_bytes.clone().into(), + msg_hash: { + let msg_hash = BigUint::from_bytes_be(&aux_data.msg_hash.to_be_bytes()); + let msg_hash = msg_hash.mod_floor(&*SECP256K1_Q); + let msg_hash_le = biguint_to_32bytes_le(msg_hash); + Fq::from_repr(msg_hash_le).unwrap() + }, + }; + ( + Some(PrecompileEvent::Ecrecover(sign_data)), + Some(PrecompileAuxData::Ecrecover(aux_data)), + ) + } else { + (None, Some(PrecompileAuxData::Ecrecover(aux_data))) + } +} diff --git a/bus-mapping/src/exec_trace.rs b/bus-mapping/src/exec_trace.rs index 90d029ddc9..28c886240b 100644 --- a/bus-mapping/src/exec_trace.rs +++ b/bus-mapping/src/exec_trace.rs @@ -5,7 +5,7 @@ use std::fmt; #[derive(Clone, Copy, PartialEq, Eq)] /// The target and index of an `Operation` in the context of an -/// `ExecutionTrace`. +/// [`GethExecTrace`](eth_types::GethExecTrace). pub struct OperationRef(pub Target, pub usize); impl fmt::Debug for OperationRef { diff --git a/bus-mapping/src/lib.rs b/bus-mapping/src/lib.rs index abd38f9141..dfa5675791 100644 --- a/bus-mapping/src/lib.rs +++ b/bus-mapping/src/lib.rs @@ -1,219 +1,8 @@ -//! ![GitHub Workflow Status (branch)](https://img.shields.io/github/workflow/status/appliedzkp/zkevm-circuits/CI%20checks/main?style=for-the-badge) -//! Bus-Mapping is a crate designed to parse EVM execution traces and manipulate -//! all of the data they provide in order to obtain structured witness inputs -//! for the EVM Proof and the State Proof. -//! -//! ## Introduction -//! At the moment every node on ethereum has to validate every transaction in -//! the ethereum virtual machine. This means that every transaction adds work -//! that everyone needs to do to verify Ethereum’s history. Worse still is that -//! each transaction needs to be verified by every new node. Which means the -//! amount of work a new node needs to do the sync the network is growing -//! constantly. We want to build a proof of validity for the Ethereum blocks to -//! avoid this. -//! -//! This means making a proof of validity for the EVM + state reads / writes + -//! signatures. -//! To simplify we separate our proofs into two components. -//! -//! - State proof: State/memory/stack ops have been performed correctly. This -//! does not check if the correct location has been read/written. We allow our -//! prover to pick any location here and in the EVM proof confirm it is correct. -//! -//! - EVM proof: This checks that the correct opcode is called at the correct -//! time. It checks the validity of these opcodes. It also confirms that for -//! each of these opcodes the state proof performed the correct operation. -//! -//! Only after verifying both proofs are we confident that that Ethereum block -//! is executed correctly. -//! -//! ## Bus Mapping -//! The goal of this crate is to serve as: -//! - A parsing lib for EVM execution traces. -//! - A way to infer some witness data that can only be constructed once we've analyzed the full -//! exec trace. -//! - An easy interface to collect all of the data to witness into the circuits and witness it with -//! few function calls. -//! -//! ## Parsing -//! Provided a JSON file or a JSON as a stream of bytes, which contains an -//! execution trace from an EVM, you can parse it and construct an -//! `ExecutionTrace` instance from it. That will automatically fill all of the -//! bus-mapping instances of each -//! [`GethExecStep`](eth_types::GethExecStep). Then the -//! [`CircuitInputBuilder`](crate::circuit_input_builder::CircuitInputBuilder) -//! will fill in an -//! [`OperationContainer`](crate::operation::container::OperationContainer) -//! with all of the Memory, Stack and Storage ops performed -//! by the provided trace. -//! -//! ```rust -//! use bus_mapping::{Error, mock::BlockData}; -//! use bus_mapping::state_db::{self, StateDB, CodeDB}; -//! use eth_types::{ -//! self, address, Address, Word, Hash, U64, GethExecTrace, GethExecStep, geth_types::GethData, bytecode -//! }; -//! use mock::test_ctx::{TestContext, helpers::*}; -//! use bus_mapping::circuit_input_builder::{Block, CircuitInputBuilder}; -//! -//! let input_trace = r#" -//! [ -//! { -//! "pc": 5, -//! "op": "PUSH1", -//! "gas": 82, -//! "gasCost": 3, -//! "refund": 0, -//! "depth": 1, -//! "stack": [], -//! "memory": [ -//! "0000000000000000000000000000000000000000000000000000000000000000", -//! "0000000000000000000000000000000000000000000000000000000000000000", -//! "0000000000000000000000000000000000000000000000000000000000000080" -//! ] -//! }, -//! { -//! "pc": 7, -//! "op": "MLOAD", -//! "gas": 79, -//! "gasCost": 3, -//! "refund": 0, -//! "depth": 1, -//! "stack": [ -//! "40" -//! ], -//! "memory": [ -//! "0000000000000000000000000000000000000000000000000000000000000000", -//! "0000000000000000000000000000000000000000000000000000000000000000", -//! "0000000000000000000000000000000000000000000000000000000000000080" -//! ] -//! }, -//! { -//! "pc": 8, -//! "op": "STOP", -//! "gas": 76, -//! "gasCost": 0, -//! "refund": 0, -//! "depth": 1, -//! "stack": [ -//! "80" -//! ], -//! "memory": [ -//! "0000000000000000000000000000000000000000000000000000000000000000", -//! "0000000000000000000000000000000000000000000000000000000000000000", -//! "0000000000000000000000000000000000000000000000000000000000000080" -//! ] -//! } -//! ] -//! "#; -//! -//! // We use the [`TestContext`] struct to mock a block. -//! let code = bytecode! { -//! // Write 0x6f to storage slot 0 -//! PUSH1(0x6fu64) -//! PUSH1(0x00u64) -//! SSTORE -//! // Load storage slot 0 -//! PUSH1(0x00u64) -//! SLOAD -//! STOP -//! }; -//! -//! // Get the execution steps from the external tracer -//! let block: GethData = TestContext::<2, 1>::new( -//! None, -//! account_0_code_account_1_no_code(code), -//! tx_from_1_to_0, -//! |block, _tx| block.number(0xcafeu64), -//! ) -//! .unwrap() -//! .into(); -//! -//! // Here we update the circuit input with the data from the transaction trace. -//! let builder = BlockData::new_from_geth_data(block.clone()).new_circuit_input_builder(); -//! let builder = builder -//! .handle_block(&block.eth_block, &block.geth_traces) -//! .unwrap(); -//! -//! let geth_steps: Vec = serde_json::from_str(input_trace).unwrap(); -//! let geth_trace = GethExecTrace { -//! return_value: "".to_string(), -//! gas: block.eth_block.transactions[0].gas.as_u64(), -//! invalid: false, -//! failed: false, -//! struct_logs: geth_steps, -//! }; -//! -//! // Get an ordered vector with all of the Stack operations of this trace. -//! let stack_ops = builder.block.container.sorted_stack(); -//! -//! // You can also iterate over the steps of the trace and witness the EVM Proof. -//! builder.block.txs()[0].steps().iter(); -//! ``` -//! -//! Assume we have the following trace: -//! ```text,ignore -//! pc op stack (top -> down) memory -//! -- -------------- ---------------------------------- --------------------------------------- -//! ... -//! 53 JUMPDEST [ , , , ] {40: 80, 80: , a0: } -//! 54 PUSH1 40 [ , , , 40] {40: 80, 80: , a0: } -//! 56 MLOAD [ , , , 80] {40: 80, 80: , a0: } -//! 57 PUSH4 deadbeaf [ , , deadbeef, 80] {40: 80, 80: , a0: } -//! 62 DUP2 [ , 80, deadbeef, 80] {40: 80, 80: , a0: } -//! 63 MSTORE [ , , , 80] {40: 80, 80: deadbeef, a0: } -//! 64 PUSH4 faceb00c [ , , faceb00c, 80] {40: 80, 80: deadbeef, a0: } -//! 69 DUP2 [ , 80, faceb00c, 80] {40: 80, 80: deadbeef, a0: } -//! 70 MLOAD [ , deadbeef, faceb00c, 80] {40: 80, 80: deadbeef, a0: } -//! 71 ADD [ , , 1d97c6efb, 80] {40: 80, 80: deadbeef, a0: } -//! 72 DUP2 [ , 80, 1d97c6efb, 80] {40: 80, 80: deadbeef, a0: } -//! 73 MSTORE [ , , , 80] {40: 80, 80: 1d97c6efb, a0: } -//! 74 PUSH4 cafeb0ba [ , , cafeb0ba, 80] {40: 80, 80: 1d97c6efb, a0: } -//! 79 PUSH1 20 [ , 20, cafeb0ba, 80] {40: 80, 80: 1d97c6efb, a0: } -//! 81 DUP3 [ 80, 20, cafeb0ba, 80] {40: 80, 80: 1d97c6efb, a0: } -//! 82 ADD [ , a0, cafeb0ba, 80] {40: 80, 80: 1d97c6efb, a0: } -//! 83 MSTORE [ , , , 80] {40: 80, 80: 1d97c6efb, a0: cafeb0ba} -//! 84 POP [ , , , ] {40: 80, 80: 1d97c6efb, a0: cafeb0ba} -//! ... -//! ``` -//! -//! Once you have the trace built (following the code found above) you can -//! basically: -//! - Get an iterator/vector over the `Stack`, `Memory` or `Storage` operations ordered on the way -//! the State Proof needs. -//! -//! On that way, we would get something like this for the Memory ops: -//! ```text,ignore -//! | `key` | `val` | `rw` | `gc` | Note | -//! |:------:| ------------- | ------- | ---- | ---------------------------------------- | -//! | `0x40` | `0` | `Write` | | Init | -//! | `0x40` | `0x80` | `Write` | 0 | Assume written at the begining of `code` | -//! | `0x40` | `0x80` | `Read` | 4 | `56 MLOAD` | -//! | - | | | | | -//! | `0x80` | `0` | `Write` | | Init | -//! | `0x80` | `0xdeadbeef` | `Write` | 10 | `63 MSTORE` | -//! | `0x80` | `0xdeadbeef` | `Read` | 16 | `70 MLOAD` | -//! | `0x80` | `0x1d97c6efb` | `Write` | 24 | `73 MSTORE` | -//! | - | | | | | -//! | `0xa0` | `0` | `Write` | | Init | -//! | `0xa0` | `0xcafeb0ba` | `Write` | 34 | `83 MSTORE` -//! ``` -//! -//! Where as you see, we group by `memory_address` and then order by -//! `global_counter`. -//! -//! - Iterate over the `ExecutionTrace` itself over -//! each `ExecutionStep`'s is formed by and check which Stack/Memory&Storage -//! operations are linked to each step. This is also automatically done via the -//! [`Opcode`](crate::evm::opcodes::Opcode) trait defined in this crate. -//! -//! ## Documentation -//! For extra documentation, check the book with the specs written for the -//! entire ZK-EVM solution. -//! See: - +#![doc = include_str!("../README.md")] +// doc test attr +#![doc(test(attr(deny(warnings))))] #![cfg_attr(docsrs, feature(doc_cfg))] -// We want to have UPPERCASE idents sometimes. +// We want to have UPPERCASE indents sometimes. #![allow(non_snake_case)] // Catch documentation errors caused by code changes. #![deny(rustdoc::broken_intra_doc_links)] diff --git a/bus-mapping/src/mock.rs b/bus-mapping/src/mock.rs index 535f0230ba..892eb41c3f 100644 --- a/bus-mapping/src/mock.rs +++ b/bus-mapping/src/mock.rs @@ -20,7 +20,7 @@ pub struct BlockData { /// chain id pub chain_id: Word, /// history hashes contains most recent 256 block hashes in history, where - /// the lastest one is at history_hashes[history_hashes.len() - 1]. + /// the latest one is at history_hashes[history_hashes.len() - 1]. pub history_hashes: Vec, /// Block from geth pub eth_block: eth_types::Block, diff --git a/bus-mapping/src/operation.rs b/bus-mapping/src/operation.rs index 5d83b219fe..8800d7102e 100644 --- a/bus-mapping/src/operation.rs +++ b/bus-mapping/src/operation.rs @@ -90,7 +90,7 @@ impl RWCounter { } } -/// Enum used to differenciate between EVM Stack, Memory and Storage operations. +/// Enum used to differentiate between EVM Stack, Memory and Storage operations. /// This is also used as the RwTableTag for the RwTable. #[derive(Debug, Clone, PartialEq, Eq, Copy, EnumIter, Hash)] pub enum Target { @@ -1165,7 +1165,7 @@ impl Operation { &mut self.op } - // /// Matches over an `Operation` returning the [`Target`] of the iternal + // /// Matches over an `Operation` returning the [`Target`] of the internal // op /// it stores inside. // pub const fn target(&self) -> Target { // self.op.target() diff --git a/bus-mapping/src/operation/container.rs b/bus-mapping/src/operation/container.rs index 408cc05fe7..2ccac336cd 100644 --- a/bus-mapping/src/operation/container.rs +++ b/bus-mapping/src/operation/container.rs @@ -16,7 +16,7 @@ use itertools::Itertools; /// [`ExecStep`](crate::circuit_input_builder::ExecStep). /// /// Finally, the container also provides the capability of retrieving all of the -/// `Stack`, `Memory` or `Storage` operations ordered according to the criterias +/// `Stack`, `Memory` or `Storage` operations ordered according to the criteria /// they have specified. /// That serves as a way to get an input with which is easy to work with in /// order to construct the State proof. diff --git a/bus-mapping/src/precompile.rs b/bus-mapping/src/precompile.rs index 2792fa4d5b..3ccc940964 100644 --- a/bus-mapping/src/precompile.rs +++ b/bus-mapping/src/precompile.rs @@ -2,7 +2,7 @@ use eth_types::{ evm_types::{GasCost, OpcodeId}, - Address, Bytecode, Word, + Address, Bytecode, ToBigEndian, Word, }; #[cfg(not(target_arch = "wasm32"))] use revm_precompile::{Precompile, PrecompileError, Precompiles}; @@ -36,8 +36,9 @@ pub(crate) fn execute_precompiled( #[cfg(not(target_arch = "wasm32"))] { - let Some(Precompile::Standard(precompile_fn)) = Precompiles::berlin() - .get(address.as_fixed_bytes()) else { + let Some(Precompile::Standard(precompile_fn)) = + Precompiles::berlin().get(address.as_fixed_bytes()) + else { panic!("calling non-exist precompiled contract address") }; let (return_data, gas_cost, is_oog, is_ok) = match precompile_fn(input, gas) { @@ -62,7 +63,7 @@ pub(crate) fn execute_precompiled( #[derive(Copy, Clone, Debug, Eq, PartialEq)] pub enum PrecompileCalls { /// Elliptic Curve Recovery - ECRecover = 0x01, + Ecrecover = 0x01, /// SHA2-256 hash function Sha256 = 0x02, /// Ripemd-160 hash function @@ -81,6 +82,12 @@ pub enum PrecompileCalls { Blake2F = 0x09, } +impl Default for PrecompileCalls { + fn default() -> Self { + Self::Ecrecover + } +} + impl From for Address { fn from(value: PrecompileCalls) -> Self { let mut addr = [0u8; 20]; @@ -104,7 +111,7 @@ impl From for usize { impl From for PrecompileCalls { fn from(value: u8) -> Self { match value { - 0x01 => Self::ECRecover, + 0x01 => Self::Ecrecover, 0x02 => Self::Sha256, 0x03 => Self::Ripemd160, 0x04 => Self::Identity, @@ -122,7 +129,7 @@ impl PrecompileCalls { /// Get the base gas cost for the precompile call. pub fn base_gas_cost(&self) -> u64 { match self { - Self::ECRecover => GasCost::PRECOMPILE_ECRECOVER_BASE, + Self::Ecrecover => GasCost::PRECOMPILE_ECRECOVER_BASE, Self::Sha256 => GasCost::PRECOMPILE_SHA256_BASE, Self::Ripemd160 => GasCost::PRECOMPILE_RIPEMD160_BASE, Self::Identity => GasCost::PRECOMPILE_IDENTITY_BASE, @@ -142,7 +149,7 @@ impl PrecompileCalls { /// Maximum length of input bytes considered for the precompile call. pub fn input_len(&self) -> Option { match self { - Self::ECRecover | Self::Bn128Add => Some(128), + Self::Ecrecover | Self::Bn128Add => Some(128), Self::Bn128Mul => Some(96), _ => None, } @@ -220,3 +227,82 @@ impl PrecompileCallArgs { code } } + +/// Auxiliary data for Ecrecover +#[derive(Clone, Debug, Default, PartialEq, Eq)] +pub struct EcrecoverAuxData { + /// Keccak hash of the message being signed. + pub msg_hash: Word, + /// v-component of signature. + pub sig_v: Word, + /// r-component of signature. + pub sig_r: Word, + /// s-component of signature. + pub sig_s: Word, + /// Address that was recovered. + pub recovered_addr: Address, + /// Input bytes to the ecrecover call. + pub input_bytes: Vec, + /// Output bytes from the ecrecover call. + pub output_bytes: Vec, + /// Bytes returned to the caller from the ecrecover call. + pub return_bytes: Vec, +} + +impl EcrecoverAuxData { + /// Create a new instance of ecrecover auxiliary data. + pub fn new(input: &[u8], output: &[u8], return_bytes: &[u8]) -> Self { + let mut resized_input = input.to_vec(); + resized_input.resize(128, 0u8); + let mut resized_output = output.to_vec(); + resized_output.resize(32, 0u8); + + // assert that recovered address is 20 bytes. + assert!(resized_output[0x00..0x0c].iter().all(|&b| b == 0)); + let recovered_addr = Address::from_slice(&resized_output[0x0c..0x20]); + + Self { + msg_hash: Word::from_big_endian(&resized_input[0x00..0x20]), + sig_v: Word::from_big_endian(&resized_input[0x20..0x40]), + sig_r: Word::from_big_endian(&resized_input[0x40..0x60]), + sig_s: Word::from_big_endian(&resized_input[0x60..0x80]), + recovered_addr, + input_bytes: input.to_vec(), + output_bytes: output.to_vec(), + return_bytes: return_bytes.to_vec(), + } + } + + /// Sanity check and returns recovery ID. + pub fn recovery_id(&self) -> Option { + let sig_v_bytes = self.sig_v.to_be_bytes(); + let sig_v = sig_v_bytes[31]; + if sig_v_bytes.iter().take(31).all(|&b| b == 0) && (sig_v == 27 || sig_v == 28) { + Some(sig_v - 27) + } else { + None + } + } +} + +/// Auxiliary data attached to an internal state for precompile verification. +#[derive(Clone, Debug, PartialEq, Eq)] +pub enum PrecompileAuxData { + /// Base precompile (used for Identity, SHA256, RIPEMD-160 and BLAKE2F). + Base { + /// input bytes to the identity call. + input_bytes: Vec, + /// output bytes from the identity call. + output_bytes: Vec, + /// bytes returned back to the caller from the identity call. + return_bytes: Vec, + }, + /// Ecrecover. + Ecrecover(EcrecoverAuxData), +} + +impl Default for PrecompileAuxData { + fn default() -> Self { + Self::Ecrecover(EcrecoverAuxData::default()) + } +} diff --git a/circuit-benchmarks/src/mpt_circuit.rs b/circuit-benchmarks/src/mpt_circuit.rs index 5160e66a76..4ff5d40efa 100644 --- a/circuit-benchmarks/src/mpt_circuit.rs +++ b/circuit-benchmarks/src/mpt_circuit.rs @@ -22,7 +22,7 @@ mod tests { use rand::SeedableRng; use rand_xorshift::XorShiftRng; use std::{env::var, ops::Deref}; - use zkevm_circuits::mpt_circuit::{load_proof, witness_row::Node, MPTCircuit}; + use zkevm_circuits::mpt_circuit::{load_proof_from_file, witness_row::Node, MPTCircuit}; #[cfg_attr(not(feature = "benches"), ignore)] #[test] @@ -39,7 +39,7 @@ mod tests { .expect("Cannot parse DEGREE env var as u32"); let path = "../zkevm-circuits/src/mpt_circuit/tests/UpdateOneLevel.json"; - let nodes: Vec = load_proof(path); + let nodes: Vec = load_proof_from_file(path); let mut keccak_data = vec![]; for node in nodes.iter() { diff --git a/circuit-benchmarks/src/super_circuit.rs b/circuit-benchmarks/src/super_circuit.rs index 603ce8929b..e800ec5806 100644 --- a/circuit-benchmarks/src/super_circuit.rs +++ b/circuit-benchmarks/src/super_circuit.rs @@ -90,6 +90,7 @@ mod tests { max_bytecode: 512, max_evm_rows: 0, max_keccak_rows: 0, + max_vertical_circuit_rows: 0, }; let (_, mut circuits, mut instances, _) = SuperCircuit::build(block, circuits_params, Fr::from(0x100)).unwrap(); diff --git a/eth-types/src/bytecode.rs b/eth-types/src/bytecode.rs index 627ff10eae..09160e274e 100644 --- a/eth-types/src/bytecode.rs +++ b/eth-types/src/bytecode.rs @@ -1,7 +1,6 @@ //! EVM byte code generator use crate::{evm_types::OpcodeId, keccak256, Bytes, Hash, ToBigEndian, ToWord, Word}; -use std::{collections::HashMap, iter, str::FromStr}; - +use std::{collections::HashMap, fmt::Display, iter, str::FromStr}; /// Error type for Bytecode related failures #[derive(Debug)] pub enum Error { @@ -254,12 +253,13 @@ impl FromStr for OpcodeWithData { } } -impl ToString for OpcodeWithData { - fn to_string(&self) -> String { - match self { +impl Display for OpcodeWithData { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let str = match self { OpcodeWithData::Opcode(opcode) => format!("{:?}", opcode), OpcodeWithData::PushWithData(n, word) => format!("PUSH{}({})", n, word), - } + }; + f.write_str(&str) } } @@ -576,6 +576,6 @@ mod tests { POP STOP }; - assert_eq!(Bytecode::try_from(code.code()).unwrap(), code); + assert_eq!(Bytecode::from(code.code()), code); } } diff --git a/eth-types/src/evm_types.rs b/eth-types/src/evm_types.rs index d9fa5ec40b..39adaa4a17 100644 --- a/eth-types/src/evm_types.rs +++ b/eth-types/src/evm_types.rs @@ -34,8 +34,7 @@ mod gas_create { // [gasCreate2Eip3860](https://github.com/ethereum/go-ethereum/blob/eb83e7c54021573eaceb14236af3a7a8c64f6027/core/vm/gas_table.go#L321) // (similar for CREATE). // 1. size <= 49152 (MaxInitCodeSize) - // 2. gasCost = memoryGasCost + (2 + 6) * ((size + 31) / 32) should not - // overflow for Uint64. + // 2. gasCost = memoryGasCost + (2 + 6) * ((size + 31) / 32) should not overflow for Uint64. // No need to constrain the second condition, since the maximum gas cost // cannot overflow for Uint64 (36028809887100925 calculated by // `memorySize = 0x1FFFFFFFE0` and `size = 49152`) if the first condition is diff --git a/eth-types/src/geth_types.rs b/eth-types/src/geth_types.rs index b606d8547b..7c81808d29 100644 --- a/eth-types/src/geth_types.rs +++ b/eth-types/src/geth_types.rs @@ -167,7 +167,7 @@ pub struct Transaction { /// Gas Limit / Supplied gas /// U64 type is required to serialize into proper hex with 0x prefix pub gas_limit: U64, - /// Transfered value + /// Transferred value pub value: Word, /// Gas Price pub gas_price: Word, @@ -247,6 +247,24 @@ impl From<&Transaction> for TransactionRequest { } impl Transaction { + /// Create a dummy Transaction with zero values + pub fn dummy() -> Self { + Self { + from: Address::zero(), + to: Some(Address::zero()), + nonce: U64::zero(), + gas_limit: U64::zero(), + value: Word::zero(), + gas_price: Word::zero(), + gas_tip_cap: Word::zero(), + gas_fee_cap: Word::zero(), + call_data: Bytes::new(), + access_list: None, + v: 0, + r: Word::zero(), + s: Word::zero(), + } + } /// Return the SignData associated with this Transaction. pub fn sign_data(&self, chain_id: u64) -> Result { let sig_r_le = self.r.to_le_bytes(); @@ -277,8 +295,9 @@ impl Transaction { libsecp256k1::Error::InvalidMessage, )?; Ok(SignData { - signature: (sig_r, sig_s), + signature: (sig_r, sig_s, v), pk, + msg, msg_hash, }) } @@ -340,7 +359,7 @@ impl Transaction { ..response::Transaction::default() } } - /// Convinient method for gas limit + /// Convenient method for gas limit pub fn gas(&self) -> u64 { self.gas_limit.as_u64() } diff --git a/eth-types/src/keccak.rs b/eth-types/src/keccak.rs index 3bef09e94a..b697a5743c 100644 --- a/eth-types/src/keccak.rs +++ b/eth-types/src/keccak.rs @@ -253,7 +253,7 @@ impl Sponge { } } -/// Convinient method to get 32 bytes digest +/// Convenient method to get 32 bytes digest pub fn keccak256(msg: &[u8]) -> [u8; 32] { let mut keccak = Keccak::default(); keccak.update(msg); diff --git a/eth-types/src/lib.rs b/eth-types/src/lib.rs index 5e1184dbdd..f1f9fb7d5c 100644 --- a/eth-types/src/lib.rs +++ b/eth-types/src/lib.rs @@ -8,7 +8,11 @@ #![deny(missing_docs)] //#![deny(unsafe_code)] Allowed now until we find a // better way to handle downcasting from Operation into it's variants. -#![allow(clippy::upper_case_acronyms)] // Too pedantic + +// Too pedantic +#![allow(clippy::upper_case_acronyms)] +// Clippy is buggy on this one. Remove after https://github.com/rust-lang/rust-clippy/issues/12101 is resolved. +#![allow(clippy::useless_vec)] #[macro_use] pub mod macros; @@ -24,9 +28,12 @@ pub use keccak::{keccak256, Keccak}; pub use bytecode::Bytecode; pub use error::Error; -use halo2_proofs::halo2curves::{ - bn256::{Fq, Fr}, - ff::{Field as Halo2Field, FromUniformBytes, PrimeField}, +use halo2_proofs::{ + halo2curves::{ + bn256::{Fq, Fr}, + ff::{Field as Halo2Field, FromUniformBytes, PrimeField}, + }, + plonk::Expression, }; use crate::evm_types::{memory::Memory, stack::Stack, storage::Storage, OpcodeId}; @@ -42,9 +49,58 @@ pub use ethers_core::{ use serde::{de, Deserialize, Serialize}; use std::{collections::HashMap, fmt, str::FromStr}; +/// trait to retrieve general operation itentity element +pub trait OpsIdentity { + /// output type + type Output; + /// additive identity + fn zero() -> Self::Output; + /// multiplicative identity + fn one() -> Self::Output; +} + +impl OpsIdentity for Expression { + type Output = Expression; + fn zero() -> Self::Output { + Expression::Constant(F::ZERO) + } + + fn one() -> Self::Output { + Expression::Constant(F::ONE) + } +} + +// Impl OpsIdentity for Fr +impl OpsIdentity for Fr { + type Output = Fr; + + fn zero() -> Self::Output { + Fr::zero() + } + + fn one() -> Self::Output { + Fr::one() + } +} + +// Impl OpsIdentity for Fq +impl OpsIdentity for Fq { + type Output = Fq; + + fn zero() -> Self::Output { + Fq::zero() + } + + fn one() -> Self::Output { + Fq::one() + } +} + /// Trait used to reduce verbosity with the declaration of the [`PrimeField`] /// trait and its repr. -pub trait Field: Halo2Field + PrimeField + FromUniformBytes<64> + Ord { +pub trait Field: + Halo2Field + PrimeField + FromUniformBytes<64> + Ord + OpsIdentity +{ /// Gets the lower 128 bits of this field element when expressed /// canonically. fn get_lower_128(&self) -> u128 { @@ -420,14 +476,14 @@ impl<'de> Deserialize<'de> for GethExecStep { } /// Helper type built to deal with the weird `result` field added between -/// `GethExecutionTrace`s in `debug_traceBlockByHash` and +/// [`GethExecTrace`]s in `debug_traceBlockByHash` and /// `debug_traceBlockByNumber` Geth JSON-RPC calls. #[derive(Clone, Debug, Eq, PartialEq, Deserialize)] #[doc(hidden)] pub struct ResultGethExecTraces(pub Vec); /// Helper type built to deal with the weird `result` field added between -/// `GethExecutionTrace`s in `debug_traceBlockByHash` and +/// [`GethExecTrace`]s in `debug_traceBlockByHash` and /// `debug_traceBlockByNumber` Geth JSON-RPC calls. #[derive(Clone, Debug, Eq, PartialEq, Deserialize)] #[doc(hidden)] diff --git a/eth-types/src/sign_types.rs b/eth-types/src/sign_types.rs index c93245af29..c3104903fd 100644 --- a/eth-types/src/sign_types.rs +++ b/eth-types/src/sign_types.rs @@ -1,13 +1,15 @@ //! secp256k1 signature types and helper functions. use crate::{ToBigEndian, Word}; +use ethers_core::{ + types::{Address, Bytes}, + utils::keccak256, +}; use halo2_proofs::{ arithmetic::{CurveAffine, Field}, halo2curves::{ - group::{ - ff::{FromUniformBytes, PrimeField}, - Curve, - }, + ff::FromUniformBytes, + group::{ff::PrimeField, prime::PrimeCurveAffine, Curve}, secp256k1::{self, Secp256k1Affine}, Coordinates, }, @@ -21,7 +23,7 @@ pub fn sign( randomness: secp256k1::Fq, sk: secp256k1::Fq, msg_hash: secp256k1::Fq, -) -> (secp256k1::Fq, secp256k1::Fq) { +) -> (secp256k1::Fq, secp256k1::Fq, u8) { let randomness_inv = Option::::from(randomness.invert()).expect("cannot invert randomness"); let generator = Secp256k1Affine::generator(); @@ -38,34 +40,51 @@ pub fn sign( let sig_r = secp256k1::Fq::from_uniform_bytes(&x_bytes); // get x coordinate (E::Base) on E::Scalar let sig_s = randomness_inv * (msg_hash + sig_r * sk); - (sig_r, sig_s) + let sig_v = sig_point.to_affine().y.is_odd().unwrap_u8(); + (sig_r, sig_s, sig_v) } /// Signature data required by the SignVerify Chip as input to verify a /// signature. #[derive(Clone, Debug)] pub struct SignData { - /// Secp256k1 signature point - pub signature: (secp256k1::Fq, secp256k1::Fq), + /// Secp256k1 signature point (r, s, v) + /// v must be 0 or 1 + pub signature: (secp256k1::Fq, secp256k1::Fq, u8), /// Secp256k1 public key pub pk: Secp256k1Affine, + /// Message being hashed before signing. + pub msg: Bytes, /// Hash of the message that is being signed pub msg_hash: secp256k1::Fq, } +impl SignData { + /// Recover address of the signature + pub fn get_addr(&self) -> Address { + if self.pk == Secp256k1Affine::identity() { + return Address::zero(); + } + let pk_hash = keccak256(pk_bytes_swap_endianness(&pk_bytes_le(&self.pk))); + Address::from_slice(&pk_hash[12..]) + } +} + lazy_static! { static ref SIGN_DATA_DEFAULT: SignData = { let generator = Secp256k1Affine::generator(); let sk = secp256k1::Fq::ONE; let pk = generator * sk; let pk = pk.to_affine(); + let msg = Bytes::new(); let msg_hash = secp256k1::Fq::ONE; let randomness = secp256k1::Fq::ONE; - let (sig_r, sig_s) = sign(randomness, sk, msg_hash); + let (sig_r, sig_s, sig_v) = sign(randomness, sk, msg_hash); SignData { - signature: (sig_r, sig_s), + signature: (sig_r, sig_s, sig_v), pk, + msg, msg_hash, } }; @@ -121,7 +140,7 @@ pub fn recover_pk( } lazy_static! { - /// Secp256k1 Curve Scalar. Referece: Section 2.4.1 (parameter `n`) in "SEC 2: Recommended + /// Secp256k1 Curve Scalar. Reference: Section 2.4.1 (parameter `n`) in "SEC 2: Recommended /// Elliptic Curve Domain Parameters" document at http://www.secg.org/sec2-v2.pdf pub static ref SECP256K1_Q: BigUint = BigUint::from_bytes_le(&(secp256k1::Fq::ZERO - secp256k1::Fq::ONE).to_repr()) + 1u64; } @@ -135,9 +154,7 @@ pub fn ct_option_ok_or(v: CtOption, err: E) -> Result { /// Return a copy of the serialized public key with swapped Endianness. pub fn pk_bytes_swap_endianness(pk: &[T]) -> [T; 64] { assert_eq!(pk.len(), 64); - let mut pk_swap = <&[T; 64]>::try_from(pk) - .map(|r| r.clone()) - .expect("pk.len() != 64"); + let mut pk_swap = <&[T; 64]>::try_from(pk).cloned().expect("pk.len() != 64"); pk_swap[..32].reverse(); pk_swap[32..].reverse(); pk_swap diff --git a/gadgets/src/binary_number.rs b/gadgets/src/binary_number.rs index 788074c5fd..68a3dd2e86 100644 --- a/gadgets/src/binary_number.rs +++ b/gadgets/src/binary_number.rs @@ -9,7 +9,7 @@ use halo2_proofs::{ plonk::{Advice, Column, ConstraintSystem, Error, Expression, Fixed, VirtualCells}, poly::Rotation, }; -use std::{collections::BTreeSet, marker::PhantomData}; +use std::{collections::BTreeSet, marker::PhantomData, ops::Deref}; use strum::IntoEnumIterator; /// Helper trait that implements functionality to represent a generic type as @@ -34,11 +34,66 @@ where } } +/// Columns of the binary number chip. This can be instantiated without the associated constraints +/// of the BinaryNumberChip in order to be used as part of a shared table for unit tests. +#[derive(Clone, Copy, Debug)] +pub struct BinaryNumberBits( + /// Must be constrained to be binary for correctness. + pub [Column; N], +); + +impl Deref for BinaryNumberBits { + type Target = [Column; N]; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl BinaryNumberBits { + /// Construct a new BinaryNumberBits without adding any constraints. + pub fn construct(meta: &mut ConstraintSystem) -> Self { + Self([0; N].map(|_| meta.advice_column())) + } + + /// Assign a value to the binary number bits. A generic type that implements + /// the AsBits trait can be provided for assignment. + pub fn assign>( + &self, + region: &mut Region<'_, F>, + offset: usize, + value: &T, + ) -> Result<(), Error> { + for (&bit, &column) in value.as_bits().iter().zip(self.iter()) { + region.assign_advice( + || format!("binary number {:?}", column), + column, + offset, + || Value::known(F::from(bit as u64)), + )?; + } + Ok(()) + } + + /// Returns the expression value of the bits at the given rotation. + pub fn value( + &self, + rotation: Rotation, + ) -> impl FnOnce(&mut VirtualCells<'_, F>) -> Expression { + let bits = self.0; + move |meta: &mut VirtualCells<'_, F>| { + let bits = bits.map(|bit| meta.query_advice(bit, rotation)); + bits.iter() + .fold(0.expr(), |result, bit| bit.clone() + result * 2.expr()) + } + } +} + /// Config for the binary number chip. #[derive(Clone, Copy, Debug)] pub struct BinaryNumberConfig { /// Must be constrained to be binary for correctness. - pub bits: [Column; N], + pub bits: BinaryNumberBits, _marker: PhantomData, } @@ -51,12 +106,7 @@ where &self, rotation: Rotation, ) -> impl FnOnce(&mut VirtualCells<'_, F>) -> Expression { - let bits = self.bits; - move |meta: &mut VirtualCells<'_, F>| { - let bits = bits.map(|bit| meta.query_advice(bit, rotation)); - bits.iter() - .fold(0.expr(), |result, bit| bit.clone() + result * 2.expr()) - } + self.bits.value(rotation) } /// Return the constant that represents a given value. To be compared with the value expression. @@ -140,10 +190,10 @@ where /// Configure constraints for the binary number chip. pub fn configure( meta: &mut ConstraintSystem, + bits: BinaryNumberBits, selector: Column, value: Option>, ) -> BinaryNumberConfig { - let bits = [0; N].map(|_| meta.advice_column()); bits.map(|bit| { meta.create_gate("bit column is 0 or 1", |meta| { let selector = meta.query_fixed(selector, Rotation::cur()); @@ -194,15 +244,7 @@ where offset: usize, value: &T, ) -> Result<(), Error> { - for (&bit, &column) in value.as_bits().iter().zip(&self.config.bits) { - region.assign_advice( - || format!("binary number {:?}", column), - column, - offset, - || Value::known(F::from(bit as u64)), - )?; - } - Ok(()) + self.config.bits.assign(region, offset, value) } } diff --git a/gadgets/src/is_zero.rs b/gadgets/src/is_zero.rs index ed44aa56a0..db89ff28ba 100644 --- a/gadgets/src/is_zero.rs +++ b/gadgets/src/is_zero.rs @@ -52,7 +52,7 @@ impl IsZeroConfig { } #[derive(Debug, Clone)] -/// Wrapper arround [`IsZeroConfig`] for which [`Chip`] is implemented. +/// Wrapper around [`IsZeroConfig`] for which [`Chip`] is implemented. pub struct IsZeroChip { config: IsZeroConfig, } diff --git a/gadgets/src/permutation.rs b/gadgets/src/permutation.rs index ea3e08c353..573773d7b6 100644 --- a/gadgets/src/permutation.rs +++ b/gadgets/src/permutation.rs @@ -71,7 +71,7 @@ impl PermutationChipConfig { // power_of_gamma start from gamma**1 let power_of_gamma = { - let num_of_col = col_values.get(0).map(|row| row.len()).unwrap_or_default(); + let num_of_col = col_values.first().map(|row| row.len()).unwrap_or_default(); std::iter::successors(Some(gamma), |prev| (*prev * gamma).into()) .take(num_of_col.saturating_sub(1)) .collect::>>() @@ -327,7 +327,7 @@ pub fn get_permutation_fingerprints( acc_fingerprints_prev: Value, ) -> Vec<(Value, Value)> { let power_of_gamma = { - let num_of_col = col_values.get(0).map(|row| row.len()).unwrap_or_default(); + let num_of_col = col_values.first().map(|row| row.len()).unwrap_or_default(); std::iter::successors(Some(Value::known(F::ONE)), |prev| (*prev * gamma).into()) .take(num_of_col) .collect::>>() diff --git a/geth-utils/Cargo.toml b/geth-utils/Cargo.toml index e0598d4ea3..0d0205d6cb 100644 --- a/geth-utils/Cargo.toml +++ b/geth-utils/Cargo.toml @@ -6,8 +6,15 @@ license = "MIT OR Apache-2.0" [build-dependencies] gobuild = "0.1.0-alpha.1" +glob = "0.3.1" [dev-dependencies] -eth-types = { path = "../eth-types" } serde = {version = "1.0.130", features = ["derive"] } -serde_json = "1.0.66" \ No newline at end of file +serde_json = "1.0.66" + +[dependencies] +eth-types = { path = "../eth-types" } +ethers = "2.0" +num_enum = "0.7.0" +serde = "1.0.188" +serde_json = "1.0.105" diff --git a/geth-utils/build.rs b/geth-utils/build.rs index 396de6484e..3a152a02ea 100644 --- a/geth-utils/build.rs +++ b/geth-utils/build.rs @@ -26,9 +26,11 @@ fn main() { } // Files the lib depends on that should recompile the lib - let dep_files = vec!["./gethutil/trace.go", "./go.mod"]; + + println!("cargo:rerun-if-changed=go.mod"); + let dep_files = glob::glob("../**/*.go").unwrap().filter_map(|v| v.ok()); for file in dep_files { - println!("cargo:rerun-if-changed={}", file); + println!("cargo:rerun-if-changed={}", file.to_str().unwrap()); } // Link diff --git a/mpt-witness-generator/oracle/apitypes.go b/geth-utils/gethutil/mpt/oracle/apitypes.go similarity index 100% rename from mpt-witness-generator/oracle/apitypes.go rename to geth-utils/gethutil/mpt/oracle/apitypes.go diff --git a/mpt-witness-generator/oracle/prefetch.go b/geth-utils/gethutil/mpt/oracle/prefetch.go similarity index 100% rename from mpt-witness-generator/oracle/prefetch.go rename to geth-utils/gethutil/mpt/oracle/prefetch.go diff --git a/mpt-witness-generator/oracle/preimage.go b/geth-utils/gethutil/mpt/oracle/preimage.go similarity index 100% rename from mpt-witness-generator/oracle/preimage.go rename to geth-utils/gethutil/mpt/oracle/preimage.go diff --git a/mpt-witness-generator/state/access_list.go b/geth-utils/gethutil/mpt/state/access_list.go similarity index 100% rename from mpt-witness-generator/state/access_list.go rename to geth-utils/gethutil/mpt/state/access_list.go diff --git a/mpt-witness-generator/state/database.go b/geth-utils/gethutil/mpt/state/database.go similarity index 96% rename from mpt-witness-generator/state/database.go rename to geth-utils/gethutil/mpt/state/database.go index 57eee638d6..52cdf1b596 100644 --- a/mpt-witness-generator/state/database.go +++ b/geth-utils/gethutil/mpt/state/database.go @@ -2,13 +2,13 @@ package state import ( "fmt" + "main/gethutil/mpt/oracle" + "main/gethutil/mpt/trie" "math/big" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethdb" - "github.com/privacy-scaling-explorations/mpt-witness-generator/oracle" - "github.com/privacy-scaling-explorations/mpt-witness-generator/trie" ) // TODO: add oracle calls here diff --git a/mpt-witness-generator/state/journal.go b/geth-utils/gethutil/mpt/state/journal.go similarity index 100% rename from mpt-witness-generator/state/journal.go rename to geth-utils/gethutil/mpt/state/journal.go diff --git a/mpt-witness-generator/state/state_object.go b/geth-utils/gethutil/mpt/state/state_object.go similarity index 99% rename from mpt-witness-generator/state/state_object.go rename to geth-utils/gethutil/mpt/state/state_object.go index 68630d1cbc..4225152f16 100644 --- a/mpt-witness-generator/state/state_object.go +++ b/geth-utils/gethutil/mpt/state/state_object.go @@ -20,6 +20,8 @@ import ( "bytes" "fmt" "io" + "main/gethutil/mpt/oracle" + "main/gethutil/mpt/trie" "math/big" "time" @@ -27,8 +29,6 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/metrics" "github.com/ethereum/go-ethereum/rlp" - "github.com/privacy-scaling-explorations/mpt-witness-generator/oracle" - "github.com/privacy-scaling-explorations/mpt-witness-generator/trie" ) var emptyCodeHash = crypto.Keccak256(nil) diff --git a/mpt-witness-generator/state/statedb.go b/geth-utils/gethutil/mpt/state/statedb.go similarity index 99% rename from mpt-witness-generator/state/statedb.go rename to geth-utils/gethutil/mpt/state/statedb.go index 99f38b2e4f..787319705c 100644 --- a/mpt-witness-generator/state/statedb.go +++ b/geth-utils/gethutil/mpt/state/statedb.go @@ -21,6 +21,8 @@ import ( "encoding/hex" "errors" "fmt" + "main/gethutil/mpt/oracle" + "main/gethutil/mpt/trie" "math/big" "sort" "time" @@ -32,8 +34,6 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/metrics" "github.com/ethereum/go-ethereum/rlp" - "github.com/privacy-scaling-explorations/mpt-witness-generator/oracle" - "github.com/privacy-scaling-explorations/mpt-witness-generator/trie" ) // for includes we don't have @@ -767,7 +767,7 @@ func (s *StateDB) Copy() *StateDB { // nil if object, exist := s.stateObjects[addr]; exist { // Even though the original object is dirty, we are not copying the journal, - // so we need to make sure that anyside effect the journal would have caused + // so we need to make sure that any side effect the journal would have caused // during a commit (or similar op) is already applied to the copy. state.stateObjects[addr] = object.deepCopy(state) @@ -816,7 +816,7 @@ func (s *StateDB) Copy() *StateDB { } if s.snaps != nil { // In order for the miner to be able to use and make additions - // to the snapshot tree, we need to copy that aswell. + // to the snapshot tree, we need to copy that as well. // Otherwise, any block mined by ourselves will cause gaps in the tree, // and force the miner to operate trie-backed only state.snaps = s.snaps diff --git a/mpt-witness-generator/trie/committer.go b/geth-utils/gethutil/mpt/trie/committer.go similarity index 100% rename from mpt-witness-generator/trie/committer.go rename to geth-utils/gethutil/mpt/trie/committer.go diff --git a/mpt-witness-generator/trie/database.go b/geth-utils/gethutil/mpt/trie/database.go similarity index 97% rename from mpt-witness-generator/trie/database.go rename to geth-utils/gethutil/mpt/trie/database.go index 8595e00572..615c33b9c0 100644 --- a/mpt-witness-generator/trie/database.go +++ b/geth-utils/gethutil/mpt/trie/database.go @@ -3,6 +3,7 @@ package trie import ( "bytes" "io" + "main/gethutil/mpt/oracle" "math/big" "sync" @@ -10,7 +11,6 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/rlp" - "github.com/privacy-scaling-explorations/mpt-witness-generator/oracle" ) // rawNode is a simple binary blob used to differentiate between collapsed trie diff --git a/mpt-witness-generator/trie/encoding.go b/geth-utils/gethutil/mpt/trie/encoding.go similarity index 100% rename from mpt-witness-generator/trie/encoding.go rename to geth-utils/gethutil/mpt/trie/encoding.go diff --git a/mpt-witness-generator/trie/errors.go b/geth-utils/gethutil/mpt/trie/errors.go similarity index 100% rename from mpt-witness-generator/trie/errors.go rename to geth-utils/gethutil/mpt/trie/errors.go diff --git a/mpt-witness-generator/trie/hasher.go b/geth-utils/gethutil/mpt/trie/hasher.go similarity index 97% rename from mpt-witness-generator/trie/hasher.go rename to geth-utils/gethutil/mpt/trie/hasher.go index c96677415b..4904340b7b 100644 --- a/mpt-witness-generator/trie/hasher.go +++ b/geth-utils/gethutil/mpt/trie/hasher.go @@ -40,7 +40,7 @@ func (b *sliceBuffer) Reset() { type hasher struct { sha crypto.KeccakState tmp sliceBuffer - parallel bool // Whether to use paralallel threads when hashing + parallel bool // Whether to use parallel threads when hashing } // hasherPool holds pureHashers @@ -189,7 +189,7 @@ func (h *hasher) HashData(data []byte) HashNode { } // ProofHash is used to construct trie proofs, and returns the 'collapsed' -// node (for later RLP encoding) aswell as the hashed node -- unless the +// node (for later RLP encoding) as well as the hashed node -- unless the // node is smaller than 32 bytes, in which case it will be returned as is. // This method does not do anything on value- or hash-nodes. func (h *hasher) ProofHash(original Node) (collapsed, hashed Node) { diff --git a/mpt-witness-generator/trie/iterator.go b/geth-utils/gethutil/mpt/trie/iterator.go similarity index 100% rename from mpt-witness-generator/trie/iterator.go rename to geth-utils/gethutil/mpt/trie/iterator.go diff --git a/mpt-witness-generator/trie/node.go b/geth-utils/gethutil/mpt/trie/node.go similarity index 100% rename from mpt-witness-generator/trie/node.go rename to geth-utils/gethutil/mpt/trie/node.go diff --git a/mpt-witness-generator/trie/proof.go b/geth-utils/gethutil/mpt/trie/proof.go similarity index 100% rename from mpt-witness-generator/trie/proof.go rename to geth-utils/gethutil/mpt/trie/proof.go diff --git a/mpt-witness-generator/trie/secure_trie.go b/geth-utils/gethutil/mpt/trie/secure_trie.go similarity index 99% rename from mpt-witness-generator/trie/secure_trie.go rename to geth-utils/gethutil/mpt/trie/secure_trie.go index 3bf3a889f3..7ed19a2b54 100644 --- a/mpt-witness-generator/trie/secure_trie.go +++ b/geth-utils/gethutil/mpt/trie/secure_trie.go @@ -19,9 +19,10 @@ package trie import ( "fmt" + "main/gethutil/mpt/oracle" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/log" - "github.com/privacy-scaling-explorations/mpt-witness-generator/oracle" ) // SecureTrie wraps a trie with key hashing. In a secure trie, all diff --git a/mpt-witness-generator/trie/stacktrie.go b/geth-utils/gethutil/mpt/trie/stacktrie.go similarity index 96% rename from mpt-witness-generator/trie/stacktrie.go rename to geth-utils/gethutil/mpt/trie/stacktrie.go index d19087b5cc..c5c1849402 100644 --- a/mpt-witness-generator/trie/stacktrie.go +++ b/geth-utils/gethutil/mpt/trie/stacktrie.go @@ -23,12 +23,13 @@ import ( "errors" "fmt" "io" + "main/gethutil/mpt/types" + "slices" "sync" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/log" - "github.com/privacy-scaling-explorations/mpt-witness-generator/types" //"github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/rlp" @@ -230,9 +231,6 @@ func (st *StackTrie) getDiffIndex(key []byte) int { // Helper function to that inserts a (key, value) pair into // the trie. func (st *StackTrie) insert(key, value []byte) { - if key[0] == 1 && key[1] == 0 { - fmt.Println("d") - } switch st.nodeType { case branchNode: /* Branch */ idx := int(key[st.keyOffset]) @@ -659,7 +657,6 @@ func (st *StackTrie) UpdateAndGetProofs(db ethdb.KeyValueReader, list types.Deri func (st *StackTrie) GetProof(db ethdb.KeyValueReader, key []byte) ([][]byte, error) { k := KeybytesToHex(key) - i := 0 if st.nodeType == emptyNode { return [][]byte{}, nil @@ -678,13 +675,11 @@ func (st *StackTrie) GetProof(db ethdb.KeyValueReader, key []byte) ([][]byte, er } var proof [][]byte - var nodes []*StackTrie - c := st isHashed := false - for i < len(k) { + for i := 0; i < len(k); i++ { if c.nodeType == extNode { nodes = append(nodes, c) c = st.children[0] @@ -701,33 +696,19 @@ func (st *StackTrie) GetProof(db ethdb.KeyValueReader, key []byte) ([][]byte, er isHashed = true c_rlp, error := db.Get(c.val) if error != nil { - fmt.Println(error) panic(error) } - fmt.Println(c_rlp) proof = append(proof, c_rlp) + branchChild := st.getNodeFromBranchRLP(c_rlp, k[i]) - for i < len(k)-1 { - node := st.getNodeFromBranchRLP(c_rlp, k[i]) - i += 1 - fmt.Println(node) - - if len(node) == 1 && node[0] == 128 { // no child at this position - break - } - - c_rlp, error = db.Get(node) - if error != nil { - fmt.Println(error) - panic(error) - } - fmt.Println(c_rlp) - - proof = append(proof, c_rlp) + // branchChild is of length 1 when there is no child at this position in the branch + // (`branchChild = [128]` in this case), but it is also of length 1 when `c_rlp` is a leaf. + if len(branchChild) == 1 { + // no child at this position - 128 is RLP encoding for nil object + break } - - break + c.val = branchChild } } @@ -740,7 +721,6 @@ func (st *StackTrie) GetProof(db ethdb.KeyValueReader, key []byte) ([][]byte, er lNodes := len(nodes) for i := lNodes - 1; i >= 0; i-- { node := nodes[i] - fmt.Println(node) if node.nodeType == leafNode { rlp, error := db.Get(node.val) @@ -760,11 +740,9 @@ func (st *StackTrie) GetProof(db ethdb.KeyValueReader, key []byte) ([][]byte, er } } - } - - fmt.Println("----------") - for i := 0; i < len(proof); i++ { - fmt.Println(proof[i]) + // The proof is now reversed (only for non-hashed), + // let's reverse it back to have the leaf at the bottom: + slices.Reverse(proof) } return proof, nil diff --git a/mpt-witness-generator/trie/trie.go b/geth-utils/gethutil/mpt/trie/trie.go similarity index 100% rename from mpt-witness-generator/trie/trie.go rename to geth-utils/gethutil/mpt/trie/trie.go diff --git a/mpt-witness-generator/types/access_list_tx.go b/geth-utils/gethutil/mpt/types/access_list_tx.go similarity index 100% rename from mpt-witness-generator/types/access_list_tx.go rename to geth-utils/gethutil/mpt/types/access_list_tx.go diff --git a/mpt-witness-generator/types/block.go b/geth-utils/gethutil/mpt/types/block.go similarity index 99% rename from mpt-witness-generator/types/block.go rename to geth-utils/gethutil/mpt/types/block.go index 360f1eb47c..b22efb6692 100644 --- a/mpt-witness-generator/types/block.go +++ b/geth-utils/gethutil/mpt/types/block.go @@ -314,7 +314,7 @@ func (b *Block) Header() *Header { return CopyHeader(b.header) } func (b *Block) Body() *Body { return &Body{b.transactions, b.uncles} } // Size returns the true RLP encoded storage size of the block, either by encoding -// and returning it, or returning a previsouly cached value. +// and returning it, or returning a previously cached value. func (b *Block) Size() common.StorageSize { if size := b.size.Load(); size != nil { return size.(common.StorageSize) diff --git a/mpt-witness-generator/types/bloom9.go b/geth-utils/gethutil/mpt/types/bloom9.go similarity index 100% rename from mpt-witness-generator/types/bloom9.go rename to geth-utils/gethutil/mpt/types/bloom9.go diff --git a/mpt-witness-generator/types/dynamic_fee_tx.go b/geth-utils/gethutil/mpt/types/dynamic_fee_tx.go similarity index 100% rename from mpt-witness-generator/types/dynamic_fee_tx.go rename to geth-utils/gethutil/mpt/types/dynamic_fee_tx.go diff --git a/mpt-witness-generator/types/hashing.go b/geth-utils/gethutil/mpt/types/hashing.go similarity index 100% rename from mpt-witness-generator/types/hashing.go rename to geth-utils/gethutil/mpt/types/hashing.go diff --git a/mpt-witness-generator/types/legacy_tx.go b/geth-utils/gethutil/mpt/types/legacy_tx.go similarity index 100% rename from mpt-witness-generator/types/legacy_tx.go rename to geth-utils/gethutil/mpt/types/legacy_tx.go diff --git a/mpt-witness-generator/types/log.go b/geth-utils/gethutil/mpt/types/log.go similarity index 100% rename from mpt-witness-generator/types/log.go rename to geth-utils/gethutil/mpt/types/log.go diff --git a/mpt-witness-generator/types/receipt.go b/geth-utils/gethutil/mpt/types/receipt.go similarity index 100% rename from mpt-witness-generator/types/receipt.go rename to geth-utils/gethutil/mpt/types/receipt.go diff --git a/mpt-witness-generator/types/transaction.go b/geth-utils/gethutil/mpt/types/transaction.go similarity index 100% rename from mpt-witness-generator/types/transaction.go rename to geth-utils/gethutil/mpt/types/transaction.go diff --git a/mpt-witness-generator/types/transaction_signing.go b/geth-utils/gethutil/mpt/types/transaction_signing.go similarity index 100% rename from mpt-witness-generator/types/transaction_signing.go rename to geth-utils/gethutil/mpt/types/transaction_signing.go diff --git a/mpt-witness-generator/witness/branch.go b/geth-utils/gethutil/mpt/witness/branch.go similarity index 91% rename from mpt-witness-generator/witness/branch.go rename to geth-utils/gethutil/mpt/witness/branch.go index d6deda4abd..9cbe21ea5d 100644 --- a/mpt-witness-generator/witness/branch.go +++ b/geth-utils/gethutil/mpt/witness/branch.go @@ -65,8 +65,8 @@ func prepareBranchWitness(rows [][]byte, branch []byte, branchStart int, branchR } } -func prepareBranchNode(branch1, branch2, extNode1, extNode2, extListRlpBytes []byte, extValues [][]byte, key, driftedInd, - branchC16, branchC1 byte, isBranchSPlaceholder, isBranchCPlaceholder, isExtension bool) Node { +func prepareBranchNode(branch1, branch2, extNode1, extNode2, extListRlpBytes []byte, extValues [][]byte, key, driftedInd byte, + isBranchSPlaceholder, isBranchCPlaceholder, isExtension bool) Node { extensionNode := ExtensionNode{ ListRlpBytes: extListRlpBytes, } @@ -197,7 +197,7 @@ func addBranchAndPlaceholder(proof1, proof2, leafRow0, key, neighbourNode []byte, keyIndex, extensionNodeInd int, additionalBranch, isAccountProof, nonExistingAccountProof, - isShorterProofLastLeaf bool, branchC16, branchC1 byte, toBeHashed *[][]byte) (bool, bool, int, byte, Node) { + isShorterProofLastLeaf bool, toBeHashed *[][]byte) (bool, bool, int, Node) { len1 := len(proof1) len2 := len(proof2) @@ -211,15 +211,7 @@ func addBranchAndPlaceholder(proof1, proof2, } isExtension := (len1 == len2+2) || (len2 == len1+2) - if !isExtension { - if branchC16 == 1 { - branchC16 = 0 - branchC1 = 1 - } else { - branchC16 = 1 - branchC1 = 0 - } - } else { + if isExtension { var numNibbles byte if len1 > len2 { numNibbles, extListRlpBytes, extValues = prepareExtensions(extNibblesS, extensionNodeInd, proof1[len1-3], proof1[len1-3]) @@ -227,16 +219,6 @@ func addBranchAndPlaceholder(proof1, proof2, numNibbles, extListRlpBytes, extValues = prepareExtensions(extNibblesC, extensionNodeInd, proof2[len2-3], proof2[len2-3]) } numberOfNibbles = int(numNibbles) - - if numberOfNibbles%2 == 0 { - if branchC16 == 1 { - branchC16 = 0 - branchC1 = 1 - } else { - branchC16 = 1 - branchC1 = 0 - } - } } /* @@ -290,8 +272,7 @@ func addBranchAndPlaceholder(proof1, proof2, driftedInd := getDriftedPosition(leafRow0, numberOfNibbles) node = prepareBranchNode(proof1[len1-2], proof1[len1-2], extNode, extNode, extListRlpBytes, extValues, - key[keyIndex+numberOfNibbles], driftedInd, - branchC16, branchC1, false, true, isExtension) + key[keyIndex+numberOfNibbles], driftedInd, false, true, isExtension) // We now get the first nibble of the leaf that was turned into branch. // This first nibble presents the position of the leaf once it moved @@ -303,9 +284,8 @@ func addBranchAndPlaceholder(proof1, proof2, driftedInd := getDriftedPosition(leafRow0, numberOfNibbles) node = prepareBranchNode(proof2[len2-2], proof2[len2-2], extNode, extNode, extListRlpBytes, extValues, - key[keyIndex+numberOfNibbles], driftedInd, - branchC16, branchC1, true, false, isExtension) + key[keyIndex+numberOfNibbles], driftedInd, true, false, isExtension) } - return isModifiedExtNode, isExtension, numberOfNibbles, branchC16, node + return isModifiedExtNode, isExtension, numberOfNibbles, node } diff --git a/mpt-witness-generator/witness/extension_node.go b/geth-utils/gethutil/mpt/witness/extension_node.go similarity index 100% rename from mpt-witness-generator/witness/extension_node.go rename to geth-utils/gethutil/mpt/witness/extension_node.go diff --git a/mpt-witness-generator/witness/gen_witness_from_infura_blockchain_test.go b/geth-utils/gethutil/mpt/witness/gen_witness_from_infura_blockchain_test.go similarity index 98% rename from mpt-witness-generator/witness/gen_witness_from_infura_blockchain_test.go rename to geth-utils/gethutil/mpt/witness/gen_witness_from_infura_blockchain_test.go index e5ef24741b..90c89d324e 100644 --- a/mpt-witness-generator/witness/gen_witness_from_infura_blockchain_test.go +++ b/geth-utils/gethutil/mpt/witness/gen_witness_from_infura_blockchain_test.go @@ -5,9 +5,10 @@ import ( "math/big" "testing" + "main/gethutil/mpt/oracle" + "main/gethutil/mpt/state" + "github.com/ethereum/go-ethereum/common" - "github.com/privacy-scaling-explorations/mpt-witness-generator/oracle" - "github.com/privacy-scaling-explorations/mpt-witness-generator/state" ) func TestUpdateOneLevel(t *testing.T) { @@ -2302,3 +2303,34 @@ func TestWrongAccount(t *testing.T) { prepareWitness("WrongAccount", trieModifications, statedb) } + +func TestStorageDoesNotExistOnlySProof(t *testing.T) { + blockNum := 2000003 + blockNumberParent := big.NewInt(int64(blockNum)) + blockHeaderParent := oracle.PrefetchBlock(blockNumberParent, true, nil) + database := state.NewDatabase(blockHeaderParent) + statedb, _ := state.New(blockHeaderParent.Root, database, nil) + addr := common.HexToAddress("0xcaac46d9bd68bffb533320545a90cd92c6e98e58") + + // Implicitly create account: + trieMod1 := TrieModification{ + Type: BalanceChanged, + Balance: big.NewInt(98), + Address: addr, + } + + key1 := common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000000") + // leave the same + val1 := common.Hash{} + + trieMod2 := TrieModification{ + Type: StorageDoesNotExist, + Key: key1, + Value: val1, + Address: addr, + } + + trieModifications := []TrieModification{trieMod1, trieMod2} + + prepareWitness("StorageDoesNotExistOnlySProof", trieModifications, statedb) +} diff --git a/mpt-witness-generator/witness/gen_witness_from_local_blockchain_test.go b/geth-utils/gethutil/mpt/witness/gen_witness_from_local_blockchain_test.go similarity index 99% rename from mpt-witness-generator/witness/gen_witness_from_local_blockchain_test.go rename to geth-utils/gethutil/mpt/witness/gen_witness_from_local_blockchain_test.go index 4508e8e22e..8471fb6353 100644 --- a/mpt-witness-generator/witness/gen_witness_from_local_blockchain_test.go +++ b/geth-utils/gethutil/mpt/witness/gen_witness_from_local_blockchain_test.go @@ -6,9 +6,11 @@ import ( "os/exec" "testing" + "main/gethutil/mpt/oracle" + "github.com/ethereum/go-ethereum/common" - "github.com/privacy-scaling-explorations/mpt-witness-generator/oracle" - "github.com/privacy-scaling-explorations/mpt-witness-generator/state" + + "main/gethutil/mpt/state" ) func SkipIfNoGeth(t *testing.T) { diff --git a/geth-utils/gethutil/mpt/witness/gen_witness_transactions_test.go b/geth-utils/gethutil/mpt/witness/gen_witness_transactions_test.go new file mode 100644 index 0000000000..723234f255 --- /dev/null +++ b/geth-utils/gethutil/mpt/witness/gen_witness_transactions_test.go @@ -0,0 +1,136 @@ +package witness + +import ( + "fmt" + "main/gethutil/mpt/trie" + "main/gethutil/mpt/types" + "math/big" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" +) + +/* +TestNonHashedTransactionsStackTrieGetProof inserts 70 transactions into a stacktrie. +For each of the 70 modifications of the trie it asks for a proof - GetProof is called before +and after the modification. The transactions in the trie are not hashed and thus GetProof +does not require to query a database to get the preimages. + +When the first transaction is added, a leaf is added to the trie +(it has index 1 which is used as a key when inserting into a trie, the key is changed by +calling KeybytesToHex(key) in TryUpdate to [0, 1, 16]). + +When the second transaction is added (it has index 2, when inserting into a trie, +it gets changed to [0, 2, 16]), the extension node E is created with nibble 0 (note that +both leaves/transactions have the first nibble 0) and the underlying branch B with children +at positions 1 and 2 (second nibble of the two leaves). + +At this point, the proof for the second transaction is (proofC when index = 2): +[226 16 160 212 52 159 164 192 63 244 122 229 5 208 58 20 16 54 62 169 98 62 238 163 88 174 155 252 118 132 91 148 62 122 23] +[248 81 128 160 32 244 75 78 180 11 251 73 229 254 70 16 254 170 54 254 200 97 231 24 180 34 220 244 153 76 1 194 23 63 64 224 160 46 141 2 37 188 204 110 232 46 31 230 82 226 213 98 71 18 241 37 90 213 167 221 58 33 36 249 248 180 207 235 47 128 128 128 128 128 128 128 128 128 128 128 128 128 128] +[248 200 2 131 4 147 224 131 1 226 65 148 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 184 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 37 160 163 65 77 46 20 3 175 162 34 86 182 41 225 43 90 92 158 249 153 67 193 148 178 63 8 81 26 169 176 56 242 78 160 21 37 82 209 254 5 113 171 235 198 244 52 17 233 162 51 76 151 85 224 28 101 146 160 197 216 253 237 240 187 19 184] + +Note that the first proof element is an extension node with nibble 0 = 16 - 16 (see +the second byte). The third byte (32 = 160 - 128) denotes the length of the subsequent stream +which represents the hash of the underlying branch. +The second proof element is the underlying branch. The second byte (81) denotes the length +of the subsequent RLP stream. The third byte (128) denotes the nil element at position 0. +Then there are two children at positions 1 (32 244 75...) and 2 (46 141 2...). Note that +these two 32-long value are the hashes of the two leaves/transactions in the branch. +The bytes 128 at the end of the branch RLP represents nil objects at positions 3 - 15. +The last proof element is the second transaction, for example the third nibble (2) +represents the index of the transaction. + +When further 13 transactions are added, the branch B gets populated at positions 3 - 15 +(the position 0 remains nil). + +When the 16-th transaction is added (it has index 16, it gets changed to [1, 0, 16]), +the extension node E is turned into branch B1 which has children at positions 0 and 1. +At position 0 it has a branch B (which used to be the underlying branch of E1) and +at position 1 it has a leaf that represents the 16-transaction. + +At this point, the proof for the second transaction is (proofC when index = 16): +[248 81 160 204 44 112 166 132 56 23 211 247 164 233 113 161 247 117 64 34 142 106 19 106 151 213 163 170 185 19 10 144 231 85 229 160 23 243 146 56 210 93 132 177 170 102 160 150 91 57 192 254 50 122 118 157 138 67 46 2 247 8 89 216 105 197 213 36 128 128 128 128 128 128 128 128 128 128 128 128 128 128 128] +[248 203 16 131 4 147 224 131 1 226 65 148 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 131 1 0 0 184 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 38 160 4 18 182 163 225 56 150 243 120 135 140 57 183 97 55 103 25 62 11 37 106 178 135 7 12 58 133 148 112 183 105 66 160 106 208 180 0 175 152 228 224 143 226 84 16 188 253 79 140 234 80 104 143 32 229 83 105 24 251 62 24 122 66 11 59] + +The first proof element is a branch with children at position 0 (branch B) and 1 (newly added leaf). +The second element is the 16-th transaction. For example, the third byte (16) represents +the transaction index. +*/ +func TestNonHashedTransactionsStackTrieGetProof(t *testing.T) { + txs := make([]*types.Transaction, 70) + key, _ := crypto.GenerateKey() + signer := types.LatestSigner(params.TestChainConfig) + + for i := range txs { + amount := math.BigPow(2, int64(i)) + price := big.NewInt(300000) + data := make([]byte, 100) + tx := types.NewTransaction(uint64(i), common.Address{}, amount, 123457, price, data) + signedTx, err := types.SignTx(tx, signer, key) + if err != nil { + panic(err) + } + txs[i] = signedTx + } + + db := rawdb.NewMemoryDatabase() + stackTrie := trie.NewStackTrie(db) + + stackTrie.UpdateAndGetProofs(db, types.Transactions(txs)) + + fmt.Println("===") +} + +/* +TestHashedTransactionsStackTrieGetProof inserts 2 transactions into a stacktrie, +the trie is then hashed (DeriveSha call). +The proof is asked for one of the two transactions. The transactions in the trie are hashed and thus +GetProof requires to query a database to get the preimages. +*/ +func TestHashedTransactionsStackTrieGetProof(t *testing.T) { + txs := make([]*types.Transaction, 2) + key, _ := crypto.GenerateKey() + signer := types.LatestSigner(params.TestChainConfig) + + for i := range txs { + amount := math.BigPow(2, int64(i)) + price := big.NewInt(300000) + data := make([]byte, 100) + data[3] = 3 + data[4] = 3 + data[5] = 3 + data[6] = 3 + data[7] = 3 + tx := types.NewTransaction(uint64(i), common.Address{}, amount, 123457, price, data) + signedTx, err := types.SignTx(tx, signer, key) + if err != nil { + panic(err) + } + txs[i] = signedTx + } + + db := rawdb.NewMemoryDatabase() + stackTrie := trie.NewStackTrie(db) + + // Update the trie with transactions: + types.DeriveSha(types.Transactions(txs), stackTrie) + + var indexBuf []byte + indexBuf = rlp.AppendUint64(indexBuf[:0], uint64(1)) + + proofS, err := stackTrie.GetProof(db, indexBuf) + if err != nil { + fmt.Println(err) + return + } + + fmt.Println(proofS) + + fmt.Println("===") +} diff --git a/mpt-witness-generator/witness/leaf.go b/geth-utils/gethutil/mpt/witness/leaf.go similarity index 97% rename from mpt-witness-generator/witness/leaf.go rename to geth-utils/gethutil/mpt/witness/leaf.go index 62d69db9ce..308490d6c6 100644 --- a/mpt-witness-generator/witness/leaf.go +++ b/geth-utils/gethutil/mpt/witness/leaf.go @@ -3,8 +3,9 @@ package witness import ( "math" + "main/gethutil/mpt/trie" + "github.com/ethereum/go-ethereum/common" - "github.com/privacy-scaling-explorations/mpt-witness-generator/trie" ) func prepareEmptyNonExistingStorageRow() []byte { @@ -14,7 +15,7 @@ func prepareEmptyNonExistingStorageRow() []byte { return nonExistingStorageRow } -func prepareNonExistingStorageRow(leafC, keyNibbles []byte, noLeaf bool) ([]byte, []byte) { +func prepareNonExistingStorageRow(leafC, keyNibbles []byte) ([]byte, []byte) { // nonExistingStorageRow is used only for proof that nothing is stored at a particular storage key nonExistingStorageRow := prepareEmptyNonExistingStorageRow() @@ -307,7 +308,7 @@ func prepareAccountLeafNode(addr common.Address, addrh []byte, leafS, leafC, nei // prepareLeafAndPlaceholderNode prepares a leaf node and its placeholder counterpart // (used when one of the proofs does not have a leaf). -func prepareLeafAndPlaceholderNode(addr common.Address, addrh []byte, proof1, proof2 [][]byte, storage_key common.Hash, key []byte, nonExistingAccountProof, isAccountProof, isSModExtension, isCModExtension bool) Node { +func prepareLeafAndPlaceholderNode(addr common.Address, addrh []byte, proof1, proof2 [][]byte, storage_key common.Hash, key []byte, isAccountProof, isSModExtension, isCModExtension bool) Node { len1 := len(proof1) len2 := len(proof2) @@ -407,7 +408,10 @@ func prepareAccountLeafPlaceholderNode(addr common.Address, addrh, key []byte, k } func prepareStorageLeafPlaceholderNode(storage_key common.Hash, key []byte, keyIndex int) Node { - leaf := make([]byte, valueLen) + // valueLen + 1 because the placeholder leaf in the empty trie occupies 35 bytes: + // [227 161 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] + // 33 (33 = 161 - 128) bytes for path, as in the example above + leaf := make([]byte, valueLen+1) setStorageLeafKeyRLP(&leaf, key, keyIndex) keyLen := getLeafKeyLen(keyIndex) leaf[0] = 192 + 1 + byte(keyLen) + 1 @@ -529,8 +533,7 @@ func prepareStorageLeafNode(leafS, leafC, neighbourNode []byte, storage_key comm var nonExistingStorageRow []byte var wrongRlpBytes []byte if nonExistingStorageProof { - noLeaf := false - wrongRlpBytes, nonExistingStorageRow = prepareNonExistingStorageRow(leafC, key, noLeaf) + wrongRlpBytes, nonExistingStorageRow = prepareNonExistingStorageRow(leafC, key) } else { nonExistingStorageRow = prepareEmptyNonExistingStorageRow() } diff --git a/mpt-witness-generator/witness/modified_extension_node.go b/geth-utils/gethutil/mpt/witness/modified_extension_node.go similarity index 96% rename from mpt-witness-generator/witness/modified_extension_node.go rename to geth-utils/gethutil/mpt/witness/modified_extension_node.go index c768b8339e..2e9eb331e1 100644 --- a/mpt-witness-generator/witness/modified_extension_node.go +++ b/geth-utils/gethutil/mpt/witness/modified_extension_node.go @@ -1,9 +1,10 @@ package witness import ( + "main/gethutil/mpt/state" + "main/gethutil/mpt/trie" + "github.com/ethereum/go-ethereum/common" - "github.com/privacy-scaling-explorations/mpt-witness-generator/state" - "github.com/privacy-scaling-explorations/mpt-witness-generator/trie" ) // equipLeafWithModExtensionNode adds rows for a modified extension node before and after modification. @@ -15,7 +16,7 @@ func equipLeafWithModExtensionNode(statedb *state.StateDB, leafNode Node, addr c key, neighbourNode []byte, keyIndex, extensionNodeInd, numberOfNibbles int, additionalBranch, isAccountProof, nonExistingAccountProof, - isShorterProofLastLeaf bool, branchC16, branchC1 byte, toBeHashed *[][]byte) Node { + isShorterProofLastLeaf bool, toBeHashed *[][]byte) Node { len1 := len(proof1) len2 := len(proof2) diff --git a/mpt-witness-generator/witness/nodes.go b/geth-utils/gethutil/mpt/witness/nodes.go similarity index 98% rename from mpt-witness-generator/witness/nodes.go rename to geth-utils/gethutil/mpt/witness/nodes.go index 052290d206..d1d40ee83b 100644 --- a/mpt-witness-generator/witness/nodes.go +++ b/geth-utils/gethutil/mpt/witness/nodes.go @@ -4,8 +4,9 @@ import ( "encoding/hex" "encoding/json" + "main/gethutil/mpt/oracle" + "github.com/ethereum/go-ethereum/common" - "github.com/privacy-scaling-explorations/mpt-witness-generator/oracle" ) type BranchNode struct { diff --git a/mpt-witness-generator/witness/prepare_witness.go b/geth-utils/gethutil/mpt/witness/prepare_witness.go similarity index 92% rename from mpt-witness-generator/witness/prepare_witness.go rename to geth-utils/gethutil/mpt/witness/prepare_witness.go index d3da7e4cf5..2149bb8c27 100644 --- a/mpt-witness-generator/witness/prepare_witness.go +++ b/geth-utils/gethutil/mpt/witness/prepare_witness.go @@ -3,11 +3,12 @@ package witness import ( "math/big" + "main/gethutil/mpt/oracle" + "main/gethutil/mpt/state" + "main/gethutil/mpt/trie" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" - "github.com/privacy-scaling-explorations/mpt-witness-generator/oracle" - "github.com/privacy-scaling-explorations/mpt-witness-generator/state" - "github.com/privacy-scaling-explorations/mpt-witness-generator/trie" ) const valueLen = 34 @@ -369,11 +370,18 @@ func convertProofToWitness(statedb *state.StateDB, addr common.Address, addrh [] var nodes []Node - branchC16 := byte(0) - branchC1 := byte(1) for i := 0; i < upTo; i++ { if !isBranch(proof1[i]) { - if i != len1-1 { // extension node + isNonExistingProof := (isAccountProof && nonExistingAccountProof) || (!isAccountProof && nonExistingStorageProof) + areThereNibbles := len(extNibblesS) != 0 || len(extNibblesC) != 0 + // If i < upTo-1, it means it's not a leaf, so it's an extension node. + // There is no any special relation between isNonExistingProof and isExtension, + // except that in the non-existing proof the extension node can appear in `i == upTo-1`. + // For non-existing proof, the last node in the proof could be an extension node (we have + // nil in the underlying branch). For the non-existing proof with the wrong leaf + // (non-existing proofs can be with a nil leaf or with a wrong leaf), + // we don't need to worry because it appears in i = upTo-1). + if (i != upTo-1) || (areThereNibbles && isNonExistingProof) { // extension node var numberOfNibbles byte isExtension = true numberOfNibbles, extListRlpBytes, extValues = prepareExtensions(extNibblesS, extensionNodeInd, proof1[i], proof2[i]) @@ -393,27 +401,6 @@ func convertProofToWitness(statedb *state.StateDB, addr common.Address, addrh [] nodes = append(nodes, node) } else { - switchC16 := true // If not extension node, switchC16 = true. - if isExtension { - keyLen := getExtensionNodeKeyLen(proof1[i-1]) - if keyLen == 1 { - switchC16 = false - } else { - if proof1[i-1][2] != 0 { // If even, switch16 = true. - switchC16 = false - } - } - } - if switchC16 { - if branchC16 == 1 { - branchC16 = 0 - branchC1 = 1 - } else { - branchC16 = 1 - branchC1 = 0 - } - } - var extNode1 []byte = nil var extNode2 []byte = nil if isExtension { @@ -422,7 +409,7 @@ func convertProofToWitness(statedb *state.StateDB, addr common.Address, addrh [] } bNode := prepareBranchNode(proof1[i], proof2[i], extNode1, extNode2, extListRlpBytes, extValues, - key[keyIndex], key[keyIndex], branchC16, branchC1, false, false, isExtension) + key[keyIndex], key[keyIndex], false, false, isExtension) nodes = append(nodes, bNode) keyIndex += 1 @@ -438,10 +425,10 @@ func convertProofToWitness(statedb *state.StateDB, addr common.Address, addrh [] leafRow0 = proof2[len2-1] } - isModifiedExtNode, _, numberOfNibbles, branchC16, bNode := addBranchAndPlaceholder(proof1, proof2, extNibblesS, extNibblesC, + isModifiedExtNode, _, numberOfNibbles, bNode := addBranchAndPlaceholder(proof1, proof2, extNibblesS, extNibblesC, leafRow0, key, neighbourNode, keyIndex, extensionNodeInd, additionalBranch, - isAccountProof, nonExistingAccountProof, isShorterProofLastLeaf, branchC16, branchC1, &toBeHashed) + isAccountProof, nonExistingAccountProof, isShorterProofLastLeaf, &toBeHashed) nodes = append(nodes, bNode) @@ -458,7 +445,7 @@ func convertProofToWitness(statedb *state.StateDB, addr common.Address, addrh [] } else { isCModExtension = true } - leafNode = prepareLeafAndPlaceholderNode(addr, addrh, proof1, proof2, storage_key, key, nonExistingAccountProof, isAccountProof, isSModExtension, isCModExtension) + leafNode = prepareLeafAndPlaceholderNode(addr, addrh, proof1, proof2, storage_key, key, isAccountProof, isSModExtension, isCModExtension) } } else { // Add storage leaf after branch placeholder @@ -472,7 +459,7 @@ func convertProofToWitness(statedb *state.StateDB, addr common.Address, addrh [] } else { isCModExtension = true } - leafNode = prepareLeafAndPlaceholderNode(addr, addrh, proof1, proof2, storage_key, key, nonExistingAccountProof, isAccountProof, isSModExtension, isCModExtension) + leafNode = prepareLeafAndPlaceholderNode(addr, addrh, proof1, proof2, storage_key, key, isAccountProof, isSModExtension, isCModExtension) } } @@ -482,14 +469,14 @@ func convertProofToWitness(statedb *state.StateDB, addr common.Address, addrh [] if isModifiedExtNode { leafNode = equipLeafWithModExtensionNode(statedb, leafNode, addr, proof1, proof2, extNibblesS, extNibblesC, key, neighbourNode, keyIndex, extensionNodeInd, numberOfNibbles, additionalBranch, - isAccountProof, nonExistingAccountProof, isShorterProofLastLeaf, branchC16, branchC1, &toBeHashed) + isAccountProof, nonExistingAccountProof, isShorterProofLastLeaf, &toBeHashed) } nodes = append(nodes, leafNode) } else { - node := prepareLeafAndPlaceholderNode(addr, addrh, proof1, proof2, storage_key, key, nonExistingAccountProof, isAccountProof, false, false) + node := prepareLeafAndPlaceholderNode(addr, addrh, proof1, proof2, storage_key, key, isAccountProof, false, false) nodes = append(nodes, node) } - } else if isBranch(proof2[len(proof2)-1]) { + } else if (len1 == 0 && len2 == 0) || isBranch(proof2[len(proof2)-1]) { // Account proof has drifted leaf as the last row, storage proof has non-existing-storage row // as the last row. // When non existing proof and only the branches are returned, we add a placeholder leaf. diff --git a/mpt-witness-generator/witness/test_tools.go b/geth-utils/gethutil/mpt/witness/test_tools.go similarity index 99% rename from mpt-witness-generator/witness/test_tools.go rename to geth-utils/gethutil/mpt/witness/test_tools.go index dbb65041cc..2613ace168 100644 --- a/mpt-witness-generator/witness/test_tools.go +++ b/geth-utils/gethutil/mpt/witness/test_tools.go @@ -3,8 +3,9 @@ package witness import ( "fmt" + "main/gethutil/mpt/trie" + "github.com/ethereum/go-ethereum/common" - "github.com/privacy-scaling-explorations/mpt-witness-generator/trie" ) // moveAccountFromSecondToFirstLevel moves an account from the second level to the first level (key stored in a leaf diff --git a/mpt-witness-generator/witness/util.go b/geth-utils/gethutil/mpt/witness/util.go similarity index 100% rename from mpt-witness-generator/witness/util.go rename to geth-utils/gethutil/mpt/witness/util.go diff --git a/geth-utils/gethutil/trace.go b/geth-utils/gethutil/trace.go index e6d8464d36..f0cb76cffd 100644 --- a/geth-utils/gethutil/trace.go +++ b/geth-utils/gethutil/trace.go @@ -117,7 +117,7 @@ type Transaction struct { type TraceConfig struct { ChainID *hexutil.Big `json:"chain_id"` // HistoryHashes contains most recent 256 block hashes in history, - // where the lastest one is at HistoryHashes[len(HistoryHashes)-1]. + // where the latest one is at HistoryHashes[len(HistoryHashes)-1]. HistoryHashes []*hexutil.Big `json:"history_hashes"` Block Block `json:"block_constants"` Accounts map[common.Address]Account `json:"accounts"` diff --git a/geth-utils/go.mod b/geth-utils/go.mod index 8b468f2c19..a417f0750e 100644 --- a/geth-utils/go.mod +++ b/geth-utils/go.mod @@ -1,8 +1,56 @@ module main -go 1.16 +go 1.21 require github.com/ethereum/go-ethereum v1.11.5 +require golang.org/x/crypto v0.1.0 + +require ( + github.com/DataDog/zstd v1.5.2 // indirect + github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 // indirect + github.com/VictoriaMetrics/fastcache v1.6.0 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cockroachdb/errors v1.9.1 // indirect + github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect + github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811 // indirect + github.com/cockroachdb/redact v1.1.3 // indirect + github.com/deckarep/golang-set/v2 v2.1.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect + github.com/getsentry/sentry-go v0.18.0 // indirect + github.com/go-ole/go-ole v1.2.1 // indirect + github.com/go-stack/stack v1.8.1 // indirect + github.com/gofrs/flock v0.8.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/gorilla/websocket v1.4.2 // indirect + github.com/holiman/bloomfilter/v2 v2.0.3 // indirect + github.com/holiman/uint256 v1.2.0 // indirect + github.com/klauspost/compress v1.15.15 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/mattn/go-runewidth v0.0.9 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/prometheus/client_golang v1.14.0 // indirect + github.com/prometheus/client_model v0.3.0 // indirect + github.com/prometheus/common v0.39.0 // indirect + github.com/prometheus/procfs v0.9.0 // indirect + github.com/rogpeppe/go-internal v1.9.0 // indirect + github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect + github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect + github.com/tklauser/go-sysconf v0.3.5 // indirect + github.com/tklauser/numcpus v0.2.2 // indirect + golang.org/x/exp v0.0.0-20230206171751-46f607a40771 // indirect + golang.org/x/sys v0.5.0 // indirect + golang.org/x/text v0.7.0 // indirect + google.golang.org/protobuf v1.28.1 // indirect + gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect +) + // Uncomment for debugging // replace github.com/ethereum/go-ethereum => ../../go-ethereum diff --git a/geth-utils/go.sum b/geth-utils/go.sum index 62c668a662..11b360c307 100644 --- a/geth-utils/go.sum +++ b/geth-utils/go.sum @@ -1,327 +1,106 @@ 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= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= -cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -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/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= -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/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= -github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= -github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= -github.com/CloudyKit/jet/v6 v6.1.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= -github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -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/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= 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/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= -github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= -github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= -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/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= -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/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= -github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= -github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= -github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= -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/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= -github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k= github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= 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/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/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -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.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHyXGitRJoDqM= -github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811 h1:ytcWPaNPhNoGMWEhDvS3zToKcDpRsLuRolQJBVGdozk= github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811/go.mod h1:Nb5lgvnQ2+oGlE/EyZy4+2/CxRh9KfvCXnag1vtpxVM= -github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= -github.com/consensys/bavard v0.1.8-0.20210406032232-f3452dc9b572/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= -github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -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/go.mod h1:CkbdF9hbRidRJYMRzmfX8TMOr95I2pYXRHF18MzRrvA= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= 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.0/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/go.mod h1:gFnFS95y8HstDP6P9pPwzrxOOC5TRDkwbM+ao15ChAI= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= -github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= 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/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 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= -github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= -github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -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/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -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/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/djherbis/atime v1.1.0/go.mod h1:28OF6Y8s3NQWwacXc5eZTsEsiMzp7LF8MbXE+XJPdBE= -github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= -github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= -github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/docker/docker v1.6.2/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/dop251/goja v0.0.0-20211022113120-dc8c55024d06/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= -github.com/dop251/goja v0.0.0-20220405120441-9037c2b61cbf/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= -github.com/dop251/goja v0.0.0-20230122112309-96b1610dd4f7/go.mod h1:yRkwfj0CBpOGre+TwBsqPV0IH0Pk73e4PXJOeNDboGs= -github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= -github.com/dop251/goja_nodejs v0.0.0-20211022123610-8dd9abb0616d/go.mod h1:DngW8aVqWbuLRMHItjPUyqdj+HWPvnQe8V8y1nDpIbM= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= 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/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -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/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/go-ethereum v1.10.26/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= github.com/ethereum/go-ethereum v1.11.5 h1:3M1uan+LAUvdn+7wCEFrcMM4LJTeuxDrPTg/f31a5QQ= github.com/ethereum/go-ethereum v1.11.5/go.mod h1:it7x0DWnTDMfVFdXcU6Ti4KEFQynLHVRarcSlPr0HBo= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/fjl/gencodec v0.0.0-20220412091415-8bb9e558978c/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= -github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= -github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= 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.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8= 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/go.mod h1:o/XfIXWi4/GqbQirfRm5uTbXMG5NpqxkxblnbZ+QM9I= -github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= -github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= -github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= -github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= -github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= 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/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= 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-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/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -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/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -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/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/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= +github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E= github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= -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-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= -github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= -github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= -github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= -github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= -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-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/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/gobwas/ws v1.1.0/go.mod h1:nzvNcVha5eUziGrbxFCo6qFIojQHjJV5cLYIbezhfL0= -github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 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/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 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.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= @@ -330,201 +109,59 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W 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.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= 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.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -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/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/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -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/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.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.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 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -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/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.2/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/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= -github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= 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/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -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/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= 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.0 h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM= github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.0.3/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= -github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= -github.com/hydrogen18/memlistener v0.0.0-20141126152155-54553eb933fb/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= -github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= -github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= -github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= -github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= -github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8= -github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= -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/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= 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/go.mod h1:ICTf89VBKSD3KB0fsyyHviKF8G8hyepP0dOXJPWz3T0= -github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= -github.com/iris-contrib/jade v1.1.4/go.mod h1:EDqR+ur9piDl6DUgs6qRrlfzmlx/D5UybogqrXvJTBE= github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= -github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= -github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= -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.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= 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= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= -github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= -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/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= -github.com/kataras/blocks v0.0.6/go.mod h1:UK+Iwk0Oxpc0GdoJja7sEildotAUKK1LYeYcVF0COWc= -github.com/kataras/blocks v0.0.7/go.mod h1:UJIU97CluDo0f+zEjbnbkeMRlvYORtmc1304EeyXf4I= -github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk= github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= -github.com/kataras/golog v0.1.7/go.mod h1:jOSQ+C5fUqsNSwurB/oAHq1IFSb0KI3l6GMa7xB6dZA= -github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U= github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= -github.com/kataras/iris/v12 v12.2.0-beta5/go.mod h1:q26aoWJ0Knx/00iPKg5iizDK7oQQSPjbD8np0XDh6dc= -github.com/kataras/jwt v0.1.8/go.mod h1:Q5j2IkcIHnfwy+oNY3TVWuEBJNw0ADgCcXK9CaZwV4o= -github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw= github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= -github.com/kataras/neffos v0.0.20/go.mod h1:srdvC/Uo8mgrApWW0AYtiiLgMbyNPf69qPsd2FhE6MQ= -github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= -github.com/kataras/pio v0.0.10/go.mod h1:gS3ui9xSD+lAUpbYnjOGiQyY7sUMJO+EHpiRzhtZ5no= -github.com/kataras/pio v0.0.11/go.mod h1:38hH6SWH6m4DKSYmRhlrCJ5WItwWgCVrTNU62XZyUvI= github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= -github.com/kataras/sitemap v0.0.6/go.mod h1:dW4dOCNs896OR1HmG+dMLdT7JjDk7mYBzoIRwuj5jA4= -github.com/kataras/tunnel v0.0.4/go.mod h1:9FkU4LaeifdMWqZu7o20ojmW4B7hdhv2CMLwfnHGpYw= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= 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/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.14.4/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.10/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= -github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= -github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= -github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= -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.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -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.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= @@ -532,808 +169,241 @@ 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/kylelemons/godebug v0.0.0-20170224010052-a616ab194758/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= -github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= -github.com/labstack/echo/v4 v4.9.0/go.mod h1:xkCDAdFCIf8jsFQ5NnbK7oqaF/yU1A1X20Ltm0OvSks= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= -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.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -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/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= -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.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -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.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= 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-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= -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/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/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg= -github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ= github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= -github.com/mediocregopher/radix/v3 v3.8.0/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= -github.com/microcosm-cc/bluemonday v1.0.20/go.mod h1:yfBmMi8mxvaZut3Yytv+jTXRY8mxyjJ0/kQBTElld50= -github.com/microcosm-cc/bluemonday v1.0.21/go.mod h1:ytNkv4RrDrLJ2pqlsSI46O6IVXmZOBBD4SaJyDwwTkM= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= 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/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/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/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= -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/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -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/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/jwt/v2 v2.2.1-0.20220330180145-442af02fd36a/go.mod h1:0tqz9Hlu6bCBFLWAASKhE5vUA4c24L9KPUUgvwumE/k= -github.com/nats-io/jwt/v2 v2.3.0/go.mod h1:0tqz9Hlu6bCBFLWAASKhE5vUA4c24L9KPUUgvwumE/k= -github.com/nats-io/nats-server/v2 v2.8.4/go.mod h1:8zZa+Al3WsESfmgSs98Fi06dRWLH5Bnq90m5bKD/eT4= -github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nats.go v1.15.0/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= -github.com/nats-io/nats.go v1.16.0/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= -github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= -github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +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.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= +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.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -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.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= 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.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= -github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= -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/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.3/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.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= -github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= -github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= -github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= 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/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/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= 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/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -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_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.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.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/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.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -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.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/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= github.com/prometheus/common v0.39.0/go.mod h1:6XBZ7lYdLCbkAVhwRsWTZn+IN5AB9F/NXd5w0BbEX0Y= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -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/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= -github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -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.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.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= -github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= -github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shirou/gopsutil/v3 v3.22.8/go.mod h1:s648gW4IywYzUfE/KjXxUsqrqx/T2xO5VqOXxONeRfI= -github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -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.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= -github.com/smartystreets/assertions v1.13.0/go.mod h1:wDmR7qL282YbGsPy6H/yAsesrxfxaaSlJazyFLYVFx8= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= -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.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 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.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/supranational/blst v0.3.8-0.20220526154634-513d2456b344/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/tdewolff/minify/v2 v2.12.1/go.mod h1:p5pwbvNs1ghbFED/ZW1towGsnnWwzvM8iz8l0eURi9g= -github.com/tdewolff/minify/v2 v2.12.4/go.mod h1:h+SRvSIX3kwgwTFOpSckvSxgax3uy8kZTSF1Ojrr3bk= -github.com/tdewolff/parse/v2 v2.6.3/go.mod h1:woz0cgbLwFdtbjJu8PIKxhW05KplTFQkOdX78o+Jgrs= -github.com/tdewolff/parse/v2 v2.6.4/go.mod h1:woz0cgbLwFdtbjJu8PIKxhW05KplTFQkOdX78o+Jgrs= -github.com/tdewolff/test v1.0.7/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= -github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= +github.com/tklauser/go-sysconf v0.3.5 h1:uu3Xl4nkLzQfXNsWn15rPc/HQCJKObbt1dKJeWp3vU4= github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= -github.com/tklauser/go-sysconf v0.3.10 h1:IJ1AZGZRWbY8T5Vfk04D9WOA5WSejdflXxP03OUqALw= -github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= +github.com/tklauser/numcpus v0.2.2 h1:oyhllyrScuYI6g+h/zUvNXNp1wy7x8qQy3t/piefldA= github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= -github.com/tklauser/numcpus v0.4.0 h1:E53Dm1HjH1/R2/aoCtXtPgzmElmn51aOkhCFSuZq//o= -github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= -github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= 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= -github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= 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/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= -github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= -github.com/urfave/cli/v2 v2.10.2/go.mod h1:f8iq5LtQ/bLxafbdBSLPPNsgaW0l/2fYYEHhAyPlwvo= -github.com/urfave/cli/v2 v2.17.2-0.20221006022127-8f469abc00aa/go.mod h1:1CNUng3PtjQMtRzJO4FMXBQvkGtuYRxxiR9xMa7jMwI= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= -github.com/valyala/fasthttp v1.40.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= -github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= -github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/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/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -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/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/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-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/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.0.0-20211215153901-e495a2d5b3d3/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-20220315160706-3147a52a75dd/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-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -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= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20200513190911-00229845015e/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20220426173459-3bcf042a4bf5/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= golang.org/x/exp v0.0.0-20230206171751-46f607a40771 h1:xP7rWLUr1e1n2xkK5YB4LI0hPEy3LJC6Wk+D4pGlOJg= golang.org/x/exp v0.0.0-20230206171751-46f607a40771/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= -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/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-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/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/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= 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.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= -golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 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-20181023162649-9b4f9f5ad519/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-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 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-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/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-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -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-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= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/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-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/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-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -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-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -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-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.4.0 h1:Q5QPcMlvfxFTAPV0+07Xz/MpK9NTXu2VDUuy0FeMfaU= -golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -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= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= 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-20190227155943-e225da77a7e6/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= -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-20201020160332-67f06af15bc9/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.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/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 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 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-20181026203630-95b1ffbd15a5/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-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190130150945-aca44879d564/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-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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-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= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/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-20191001151750-bb3f8db39f24/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-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= -golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/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-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201207223542-d4d67f95c62d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/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= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/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-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211020174200-9d6173849985/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220111092808-5a964db01320/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220517195934-5e4e11fc645e/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-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -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.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.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 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -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.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/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.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.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/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.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -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= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/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-20190328211700-ab21143f2384/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= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191126055441-b0650ceb63d9/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -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.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/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.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= 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= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/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/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df h1:5Pf6pFKu98ODmgnpvkJ3kFUOQGGLIzLIkbzUHp47618= 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.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/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= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -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-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= 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.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -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.31.1/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.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= 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= @@ -1343,61 +413,32 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi 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.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= 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.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/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-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-20200902074654-038fdea0a05b/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/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= 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/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= 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/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -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.3/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.5/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-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 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= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -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/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -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= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -moul.io/http2curl v1.0.0/go.mod h1:f6cULg+e4Md/oW1cYmwW4IWQOVl2lGbmCNGOHvzX2kE= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/geth-utils/lib/lib.go b/geth-utils/lib/lib.go index 5f428c3583..59b00b6cce 100644 --- a/geth-utils/lib/lib.go +++ b/geth-utils/lib/lib.go @@ -8,11 +8,13 @@ import ( "encoding/json" "fmt" "main/gethutil" + "main/gethutil/mpt/witness" "unsafe" ) // TODO: Add proper error handling. For example, return an int, where 0 means // ok, and !=0 means error. +// //export CreateTrace func CreateTrace(configStr *C.char) *C.char { var config gethutil.TraceConfig @@ -34,6 +36,38 @@ func CreateTrace(configStr *C.char) *C.char { return C.CString(string(bytes)) } +type Config struct { + NodeUrl string `json:"NodeUrl"` + BlockNum int `json:"BlockNum"` + Addr string `json:"Addr"` + Keys []string `json:"Keys"` + Values []string `json:"Values"` +} + +type GetWitnessRequest struct { + BlockNum int `json:"BlockNum"` + NodeUrl string `json:"NodeUrl"` + Mods []witness.TrieModification +} + +//export GetMptWitness +func GetMptWitness(proofConf *C.char) *C.char { + var config GetWitnessRequest + + err := json.Unmarshal([]byte(C.GoString(proofConf)), &config) + if err != nil { + panic(err) + } + + proof := witness.GetWitness(config.NodeUrl, config.BlockNum, config.Mods) + b, err := json.Marshal(proof) + if err != nil { + fmt.Println(err) + } + + return C.CString(string(b)) +} + //export FreeString func FreeString(str *C.char) { C.free(unsafe.Pointer(str)) diff --git a/geth-utils/src/block.rs b/geth-utils/src/block.rs new file mode 100644 index 0000000000..1df6fd9514 --- /dev/null +++ b/geth-utils/src/block.rs @@ -0,0 +1,163 @@ +//! Connection to external EVM tracer. + +use crate::go; +use core::fmt::{Display, Formatter, Result as FmtResult}; +use std::ffi::{CStr, CString}; + +/// Creates the trace +pub fn trace(config: &str) -> Result { + // Create a string we can pass into Go + let c_config = CString::new(config).expect("invalid config"); + + // Generate the trace externally + let result = unsafe { go::CreateTrace(c_config.as_ptr()) }; + + // Convert the returned string to something we can use in Rust again. + // Also make sure the returned data is copied to rust managed memory. + let c_result = unsafe { CStr::from_ptr(result) }; + let result = c_result + .to_str() + .expect("Error translating EVM trace from library") + .to_string(); + + // We can now free the returned string (memory managed by Go) + unsafe { go::FreeString(c_result.as_ptr()) }; + + // Return the trace + match result.is_empty() || result.starts_with("Failed") { + true => Err(Error::TracingError(result)), + false => Ok(result), + } +} + +/// Error type for any geth-utils related failure. +#[derive(Debug, Clone)] +pub enum Error { + /// Error while tracing. + TracingError(String), +} + +impl Display for Error { + fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult { + write!(f, "{:?}", self) + } +} + +#[cfg(test)] +mod test { + use eth_types::GethExecTrace; + + use crate::trace; + + #[test] + fn valid_tx() { + for config in [ + // Minimal call tx with gas_limit = 21000 + r#"{ + "block_constants": { + "gas_limit": "0x52080" + }, + "transactions": [ + { + "from": "0x00000000000000000000000000000000000000fe", + "to": "0x00000000000000000000000000000000000000ff", + "gas_limit": "0x5208" + } + ] + }"#, + // Minimal creation tx with gas_limit = 53000 + r#"{ + "block_constants": { + "gas_limit": "0xcf080" + }, + "transactions": [ + { + "from": "0x00000000000000000000000000000000000000fe", + "gas_limit": "0xcf08" + } + ] + }"#, + // Normal call tx with gas_limit = 21000 and gas_price = 2 Gwei + r#"{ + "block_constants": { + "gas_limit": "0x52080" + }, + "accounts": { + "0x00000000000000000000000000000000000000fe": { + "balance": "0x2632e314a000" + } + }, + "transactions": [ + { + "from": "0x00000000000000000000000000000000000000fe", + "to": "0x00000000000000000000000000000000000000ff", + "gas_limit": "0x5208", + "gas_price": "0x77359400" + } + ] + }"#, + ] { + let trace_result = trace(config); + assert!(trace_result.is_ok()); + // Run over the traces + let trace: Vec = serde_json::from_str(&trace_result.unwrap()).unwrap(); + for trace in trace.iter() { + assert!(!trace.invalid); + } + } + } + + #[test] + fn invalid_tx() { + for config in [ + // Insufficient gas for intrinsic usage + r#"{ + "block_constants": { + "gas_limit": "0xcf080" + }, + "transactions": [ + { + "from": "0x00000000000000000000000000000000000000fe", + "to": "0x00000000000000000000000000000000000000ff" + } + ] + }"#, + // Insufficient balance to buy gas + r#"{ + "block_constants": { + "gas_limit": "0x52080" + }, + "transactions": [ + { + "from": "0x00000000000000000000000000000000000000fe", + "to": "0x00000000000000000000000000000000000000ff", + "gas_limit": "0x5208", + "gas_price": "0x1111" + } + ] + }"#, + // Insufficient balance to do the first transfer + r#"{ + "block_constants": { + "gas_limit": "0x52080" + }, + "transactions": [ + { + "from": "0x00000000000000000000000000000000000000fe", + "to": "0x00000000000000000000000000000000000000ff", + "value": "0x100", + "gas_limit": "0x5208" + } + ] + }"#, + ] { + let trace_result = trace(config); + assert!(trace_result.is_ok()); + // Run over the traces + let trace: Vec = serde_json::from_str(&trace_result.unwrap()).unwrap(); + for trace in trace.iter() { + assert!(trace.invalid); + } + } + } +} diff --git a/geth-utils/src/lib.rs b/geth-utils/src/lib.rs index ee001295c7..3175693820 100644 --- a/geth-utils/src/lib.rs +++ b/geth-utils/src/lib.rs @@ -1,170 +1,16 @@ //! Connection to external EVM tracer. -use core::fmt::{Display, Formatter, Result as FmtResult}; -use std::{ - ffi::{CStr, CString}, - os::raw::c_char, -}; - -extern "C" { - fn CreateTrace(str: *const c_char) -> *const c_char; - fn FreeString(str: *const c_char); -} - -/// Creates the trace -pub fn trace(config: &str) -> Result { - // Create a string we can pass into Go - let c_config = CString::new(config).expect("invalid config"); - - // Generate the trace externally - let result = unsafe { CreateTrace(c_config.as_ptr()) }; - - // Convert the returned string to something we can use in Rust again. - // Also make sure the returned data is copied to rust managed memory. - let c_result = unsafe { CStr::from_ptr(result) }; - let result = c_result - .to_str() - .expect("Error translating EVM trace from library") - .to_string(); - - // We can now free the returned string (memory managed by Go) - unsafe { FreeString(c_result.as_ptr()) }; - - // Return the trace - match result.is_empty() || result.starts_with("Failed") { - true => Err(Error::TracingError(result)), - false => Ok(result), - } -} - -/// Error type for any geth-utils related failure. -#[derive(Debug, Clone)] -pub enum Error { - /// Error while tracing. - TracingError(String), -} - -impl Display for Error { - fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult { - write!(f, "{:?}", self) - } -} - -#[cfg(test)] -mod test { - use eth_types::GethExecTrace; - - use crate::trace; - - #[test] - fn valid_tx() { - for config in [ - // Minimal call tx with gas_limit = 21000 - r#"{ - "block_constants": { - "gas_limit": "0x52080" - }, - "transactions": [ - { - "from": "0x00000000000000000000000000000000000000fe", - "to": "0x00000000000000000000000000000000000000ff", - "gas_limit": "0x5208" - } - ] - }"#, - // Minimal creation tx with gas_limit = 53000 - r#"{ - "block_constants": { - "gas_limit": "0xcf080" - }, - "transactions": [ - { - "from": "0x00000000000000000000000000000000000000fe", - "gas_limit": "0xcf08" - } - ] - }"#, - // Normal call tx with gas_limit = 21000 and gas_price = 2 Gwei - r#"{ - "block_constants": { - "gas_limit": "0x52080" - }, - "accounts": { - "0x00000000000000000000000000000000000000fe": { - "balance": "0x2632e314a000" - } - }, - "transactions": [ - { - "from": "0x00000000000000000000000000000000000000fe", - "to": "0x00000000000000000000000000000000000000ff", - "gas_limit": "0x5208", - "gas_price": "0x77359400" - } - ] - }"#, - ] { - let trace_result = trace(config); - assert!(trace_result.is_ok()); - // Run over the traces - let trace: Vec = serde_json::from_str(&trace_result.unwrap()).unwrap(); - for trace in trace.iter() { - assert!(!trace.invalid); - } - } - } - - #[test] - fn invalid_tx() { - for config in [ - // Insufficient gas for intrinsic usage - r#"{ - "block_constants": { - "gas_limit": "0xcf080" - }, - "transactions": [ - { - "from": "0x00000000000000000000000000000000000000fe", - "to": "0x00000000000000000000000000000000000000ff" - } - ] - }"#, - // Insufficient balance to buy gas - r#"{ - "block_constants": { - "gas_limit": "0x52080" - }, - "transactions": [ - { - "from": "0x00000000000000000000000000000000000000fe", - "to": "0x00000000000000000000000000000000000000ff", - "gas_limit": "0x5208", - "gas_price": "0x1111" - } - ] - }"#, - // Insufficient balance to do the first transfer - r#"{ - "block_constants": { - "gas_limit": "0x52080" - }, - "transactions": [ - { - "from": "0x00000000000000000000000000000000000000fe", - "to": "0x00000000000000000000000000000000000000ff", - "value": "0x100", - "gas_limit": "0x5208" - } - ] - }"#, - ] { - let trace_result = trace(config); - assert!(trace_result.is_ok()); - // Run over the traces - let trace: Vec = serde_json::from_str(&trace_result.unwrap()).unwrap(); - for trace in trace.iter() { - assert!(trace.invalid); - } - } +pub mod block; +pub mod mpt; + +pub use block::*; +pub use mpt::*; + +mod go { + use std::os::raw::c_char; + extern "C" { + pub fn CreateTrace(str: *const c_char) -> *const c_char; + pub fn GetMptWitness(str: *const c_char) -> *const c_char; + pub fn FreeString(str: *const c_char); } } diff --git a/mpt-witness-generator/rustlib/src/lib.rs b/geth-utils/src/mpt.rs similarity index 51% rename from mpt-witness-generator/rustlib/src/lib.rs rename to geth-utils/src/mpt.rs index 6e9112a856..6f212f2f54 100644 --- a/mpt-witness-generator/rustlib/src/lib.rs +++ b/geth-utils/src/mpt.rs @@ -1,20 +1,10 @@ use ethers::types::{Address, H256, U64}; use serde::Serialize; -use std::{ - ffi::{CStr, CString}, - os::raw::c_char, -}; +use std::ffi::{CStr, CString}; +use crate::go; +use eth_types::U256; use num_enum::IntoPrimitive; -use zkevm_circuits::{mpt_circuit::witness_row::Node, util::U256}; - -mod golang { - use super::*; - extern "C" { - pub fn GetWitness(str: *const c_char) -> *const c_char; - pub fn FreeString(str: *const c_char); - } -} #[derive(Default, Debug, IntoPrimitive, Clone, Copy)] #[repr(u8)] @@ -70,7 +60,7 @@ struct GetWitnessRequest<'a> { node_url: &'a str, } -pub fn get_witness(block_no: u64, mods: &[TrieModification], node_url: &str) -> Vec { +pub fn get_witness(block_no: u64, mods: &[TrieModification], node_url: &str) -> String { let mods: Vec<_> = mods .iter() .map(|m| TrieModificationJson { @@ -96,55 +86,18 @@ pub fn get_witness(block_no: u64, mods: &[TrieModification], node_url: &str) -> let json = serde_json::to_string(&req).expect("Invalid request"); let c_config = CString::new(json).expect("invalid config"); - let result = unsafe { golang::GetWitness(c_config.as_ptr() as *const i8) }; + let result = unsafe { go::GetMptWitness(c_config.as_ptr()) }; let c_str = unsafe { CStr::from_ptr(result) }; - let json = c_str.to_str().expect("Error translating from library"); - - let mut nodes: Vec = serde_json::from_str(json).unwrap(); - unsafe { golang::FreeString(c_str.as_ptr()) }; - - // Add the address and the key to the list of values in the Account and Storage nodes - for node in nodes.iter_mut() { - if node.account.is_some() { - let account = node.account.clone().unwrap(); - node.values - .push([vec![148], account.address.to_vec()].concat().into()); - node.values - .push([vec![160], account.key.to_vec()].concat().into()); - } - if node.storage.is_some() { - let storage = node.storage.clone().unwrap(); - node.values - .push([vec![160], storage.address.to_vec()].concat().into()); - node.values - .push([vec![160], storage.key.to_vec()].concat().into()); - } - } - nodes -} + let json = c_str + .to_str() + .expect("Error translating from library") + .to_string(); -#[cfg(test)] -mod tests { - use std::str::FromStr; + unsafe { go::FreeString(c_str.as_ptr()) }; - use super::*; + // Note: previously this function returned a Vec of Nodes, but now returning a JSON string + // to avoid importing zkEVM circuit here (that will create a circular dependency). + // TODO: consider defining Node types in another crate. - #[test] - fn it_works() { - let nodes = get_witness( - 14359865, - &[TrieModification { - typ: ProofType::StorageChanged, - key: H256::from_low_u64_le(0x12), - value: 0x1123e2.into(), - address: Address::from_str("0x4E5B2e1dc63F6b91cb6Cd759936495434C7e972F").unwrap(), - nonce: 0.into(), - balance: 0.into(), - code_hash: H256::zero(), - }], - "https://mainnet.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161", - ); - println!("{:?}", nodes); - assert_eq!(nodes.len(), 12); - } + json } diff --git a/integration-tests/Cargo.toml b/integration-tests/Cargo.toml index d9acb79d01..2990ac5cbb 100644 --- a/integration-tests/Cargo.toml +++ b/integration-tests/Cargo.toml @@ -13,7 +13,7 @@ serde_json = { version = "1.0.66", features = ["unbounded_depth"] } serde = { version = "1.0.130", features = ["derive"] } bus-mapping = { path = "../bus-mapping", features = ["test"] } eth-types = { path = "../eth-types" } -zkevm-circuits = { path = "../zkevm-circuits", features = ["test-circuits"] } +zkevm-circuits = { path = "../zkevm-circuits", features = ["test-circuits", "mock-challenge"] } tokio = { version = "1.13", features = ["macros", "rt-multi-thread"] } url = "2.2.2" pretty_assertions = "1.0.0" diff --git a/integration-tests/build.rs b/integration-tests/build.rs index b42601fe88..6b937e3bf9 100644 --- a/integration-tests/build.rs +++ b/integration-tests/build.rs @@ -45,7 +45,7 @@ enum BuildError { /// Vec is empty #[error("ArtifactError")] ArtifactError, - /// Functon compile_output failed to encode CompilerInput to Vec + /// Function compile_output failed to encode CompilerInput to Vec #[error("CompileOutputFailure({0:})")] CompileOutputFailure(String), /// Could not convert Vec to CompilerOutput diff --git a/integration-tests/src/bin/gen_blockchain_data.rs b/integration-tests/src/bin/gen_blockchain_data.rs index e9eac2682a..dd4f3ad4ef 100644 --- a/integration-tests/src/bin/gen_blockchain_data.rs +++ b/integration-tests/src/bin/gen_blockchain_data.rs @@ -63,7 +63,7 @@ async fn dump_tx_trace(prov: Provider, receipt: TransactionReceipt, name: .expect("Failed to get transaction debug trace"); let filename = format!("{}_trace.json", name); serde_json::to_writer(&File::create(filename).expect("cannot create file"), &trace) - .expect("Could not seralize trace as json data"); + .expect("Could not serialize trace as json data"); } fn erc20_transfer( diff --git a/integration-tests/src/integration_test_circuits.rs b/integration-tests/src/integration_test_circuits.rs index 91d1bb8039..3a44ffa6f4 100644 --- a/integration-tests/src/integration_test_circuits.rs +++ b/integration-tests/src/integration_test_circuits.rs @@ -72,6 +72,8 @@ const MAX_EVM_ROWS: usize = 10000; const MAX_EXP_STEPS: usize = 1000; const MAX_KECCAK_ROWS: usize = 38000; +/// MAX_VERTICAL_CIRCUIT_ROWS +const MAX_VERTICAL_CIRCUIT_ROWS: usize = 0; const CIRCUITS_PARAMS: FixedCParams = FixedCParams { total_chunks: TOTAL_CHUNKS, @@ -84,6 +86,7 @@ const CIRCUITS_PARAMS: FixedCParams = FixedCParams { max_evm_rows: MAX_EVM_ROWS, max_exp_steps: MAX_EXP_STEPS, max_keccak_rows: MAX_KECCAK_ROWS, + max_vertical_circuit_rows: MAX_VERTICAL_CIRCUIT_ROWS, }; const EVM_CIRCUIT_DEGREE: u32 = 18; @@ -168,7 +171,7 @@ fn test_actual_circuit>( let mut transcript = PoseidonTranscript::new(Vec::new()); - // change instace to slice + // change instance to slice let instance: Vec<&[Fr]> = instance.iter().map(|v| v.as_slice()).collect(); log::info!("gen circuit proof"); @@ -218,7 +221,7 @@ fn test_actual_root_circuit>( let mut transcript = EvmTranscript::<_, NativeLoader, _, _>::new(vec![]); - // change instace to slice + // change instance to slice let instance: Vec<&[Fr]> = instance.iter().map(|v| v.as_slice()).collect(); log::info!("gen root circuit proof"); diff --git a/integration-tests/tests/circuit_input_builder.rs b/integration-tests/tests/circuit_input_builder.rs index 073476a076..e68f2eb67a 100644 --- a/integration-tests/tests/circuit_input_builder.rs +++ b/integration-tests/tests/circuit_input_builder.rs @@ -26,6 +26,7 @@ async fn test_circuit_input_builder_block(block_num: u64) { max_evm_rows: 0, max_exp_steps: 1000, max_keccak_rows: 0, + max_vertical_circuit_rows: 0, }, ) .await @@ -74,7 +75,7 @@ macro_rules! declare_tests { } // This test builds the complete circuit inputs for the block where 1 ETH is -// transfered. +// transferred. declare_tests!(test_circuit_input_builder_block_transfer_0, "Transfer 0"); // This test builds the complete circuit inputs for the block where the Greeter // contract is deployed. diff --git a/light-client-poc/.gitignore b/light-client-poc/.gitignore deleted file mode 100644 index d76dbdb852..0000000000 --- a/light-client-poc/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/target -go-ethereum-data/geth diff --git a/light-client-poc/Cargo.lock b/light-client-poc/Cargo.lock deleted file mode 100644 index d4e82fd138..0000000000 --- a/light-client-poc/Cargo.lock +++ /dev/null @@ -1,5148 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "Inflector" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" -dependencies = [ - "lazy_static", - "regex", -] - -[[package]] -name = "addr2line" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "aes" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", -] - -[[package]] -name = "ahash" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", -] - -[[package]] -name = "aho-corasick" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c378d78423fdad8089616f827526ee33c19f2fddbd5de1629152c9593ba4783" -dependencies = [ - "memchr", -] - -[[package]] -name = "alloy-rlp" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f938f00332d63a5b0ac687bd6f46d03884638948921d9f8b50c59563d421ae25" -dependencies = [ - "arrayvec", - "bytes", - "smol_str", -] - -[[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", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" -dependencies = [ - "num-traits", - "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 = "0.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23589ecb866b460d3a0f1278834750268c607e8e28a1b982c907219f3178cd72" -dependencies = [ - "nodrop", -] - -[[package]] -name = "array-init" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d62b7694a562cdf5a74227903507c56ab2cc8bdd1f781ed5cb4cf9c9f810bfc" - -[[package]] -name = "arrayref" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" - -[[package]] -name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" - -[[package]] -name = "ascii-canvas" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" -dependencies = [ - "term", -] - -[[package]] -name = "async-trait" -version = "0.1.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.31", -] - -[[package]] -name = "async_io_stream" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" -dependencies = [ - "futures", - "pharos", - "rustc_version 0.4.0", -] - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", -] - -[[package]] -name = "auto_impl" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fee3da8ef1276b0bee5dd1c7258010d8fffd31801447323115a25560e1327b89" -dependencies = [ - "proc-macro-error", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "backtrace" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "base64" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "414dcefbc63d77c526a76b3afcf6fbb9b5e2791c19c3aa2297733208750c6e53" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "bech32" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "blake2b_simd" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c2f0dc9a68c6317d884f97cc36cf5a3d20ba14ce404227df55e1af708ab04bc" -dependencies = [ - "arrayref", - "arrayvec", - "constant_time_eq 0.2.6", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "block-padding", - "generic-array 0.14.7", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array 0.14.7", -] - -[[package]] -name = "block-padding" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" - -[[package]] -name = "bs58" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" -dependencies = [ - "sha2 0.10.7", - "tinyvec", -] - -[[package]] -name = "bumpalo" -version = "3.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" - -[[package]] -name = "bus-mapping" -version = "0.1.0" -dependencies = [ - "eth-types", - "ethers-core 2.0.10", - "ethers-providers 2.0.10", - "gadgets", - "halo2_proofs", - "itertools", - "lazy_static", - "log", - "revm-precompile", - "serde", - "serde_json", - "strum 0.24.1", - "strum_macros 0.24.3", -] - -[[package]] -name = "byte-slice-cast" -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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - -[[package]] -name = "bytes" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" -dependencies = [ - "serde", -] - -[[package]] -name = "bzip2" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" -dependencies = [ - "bzip2-sys", - "libc", -] - -[[package]] -name = "bzip2-sys" -version = "0.1.11+1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" -dependencies = [ - "cc", - "libc", - "pkg-config", -] - -[[package]] -name = "camino" -version = "1.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo-platform" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cfa25e60aea747ec7e1124f238816749faa93759c6ff5b31f1ccdda137f4479" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7daec1a2a2129eeba1644b220b4647ec537b0b5d4bfd6876fcc5a540056b592" -dependencies = [ - "camino", - "cargo-platform", - "semver 1.0.18", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "cc" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "jobserver", - "libc", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defd4e7873dbddba6c7c91e199c7fcb946abc4a6a4ac3195400bcfb01b5de877" -dependencies = [ - "num-traits", -] - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", -] - -[[package]] -name = "coins-bip32" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b6be4a5df2098cd811f3194f64ddb96c267606bffd9689ac7b0160097b01ad3" -dependencies = [ - "bs58", - "coins-core", - "digest 0.10.7", - "hmac 0.12.1", - "k256", - "serde", - "sha2 0.10.7", - "thiserror", -] - -[[package]] -name = "coins-bip39" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" -dependencies = [ - "bitvec", - "coins-bip32", - "hmac 0.12.1", - "once_cell", - "pbkdf2 0.12.2", - "rand", - "sha2 0.10.7", - "thiserror", -] - -[[package]] -name = "coins-core" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5286a0843c21f8367f7be734f89df9b822e0321d8bcce8d6e735aadff7d74979" -dependencies = [ - "base64 0.21.3", - "bech32", - "bs58", - "digest 0.10.7", - "generic-array 0.14.7", - "hex", - "ripemd", - "serde", - "serde_derive", - "sha2 0.10.7", - "sha3 0.10.8", - "thiserror", -] - -[[package]] -name = "const-hex" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08849ed393c907c90016652a01465a12d86361cd38ad2a7de026c56a520cc259" -dependencies = [ - "cfg-if", - "cpufeatures", - "hex", - "serde", -] - -[[package]] -name = "const-oid" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" - -[[package]] -name = "constant_time_eq" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" - -[[package]] -name = "constant_time_eq" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a53c0a4d288377e7415b53dcfc3c04da5cdc2cc95c8d5ac178b58f0b861ad6" - -[[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - -[[package]] -name = "core-foundation" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" - -[[package]] -name = "cpufeatures" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" -dependencies = [ - "cfg-if", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" -dependencies = [ - "cfg-if", - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" -dependencies = [ - "autocfg", - "cfg-if", - "crossbeam-utils", - "memoffset", - "scopeguard", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crunchy" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - -[[package]] -name = "crypto-bigint" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "740fe28e594155f10cfc383984cbefd529d7396050557148f79cb0f621204124" -dependencies = [ - "generic-array 0.14.7", - "rand_core", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array 0.14.7", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" -dependencies = [ - "cipher", -] - -[[package]] -name = "darling" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 1.0.109", -] - -[[package]] -name = "darling_macro" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" -dependencies = [ - "darling_core", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "data-encoding" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" - -[[package]] -name = "der" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "deranged" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946" - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive_more" -version = "0.99.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version 0.4.0", - "syn 1.0.109", -] - -[[package]] -name = "diff" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" - -[[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", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer 0.10.4", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "dirs" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - -[[package]] -name = "dirs-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys", -] - -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - -[[package]] -name = "dunce" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" - -[[package]] -name = "ecc" -version = "0.1.0" -source = "git+https://github.com/privacy-scaling-explorations/halo2wrong?tag=v2023_04_20#f72db265aa3cebe297c9b9816e940d0e1d400886" -dependencies = [ - "integer", - "num-bigint", - "num-integer", - "num-traits", - "rand", - "subtle", -] - -[[package]] -name = "ecdsa" -version = "0.1.0" -source = "git+https://github.com/privacy-scaling-explorations/halo2wrong?tag=v2023_04_20#f72db265aa3cebe297c9b9816e940d0e1d400886" -dependencies = [ - "ecc", - "num-bigint", - "num-integer", - "num-traits", - "rand", - "subtle", -] - -[[package]] -name = "ecdsa" -version = "0.16.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" -dependencies = [ - "der", - "digest 0.10.7", - "elliptic-curve", - "rfc6979", - "signature", - "spki", -] - -[[package]] -name = "either" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" - -[[package]] -name = "elliptic-curve" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest 0.10.7", - "ff", - "generic-array 0.14.7", - "group", - "pkcs8", - "rand_core", - "sec1", - "subtle", - "zeroize", -] - -[[package]] -name = "ena" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c533630cf40e9caa44bd91aadc88a75d75a4c3a12b4cfde353cbed41daa1e1f1" -dependencies = [ - "log", -] - -[[package]] -name = "encoding_rs" -version = "0.8.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "enr" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0be7b2ac146c1f99fe245c02d16af0696450d8e06c135db75e10eeb9e642c20d" -dependencies = [ - "base64 0.21.3", - "bytes", - "hex", - "k256", - "log", - "rand", - "rlp", - "serde", - "serde-hex", - "sha3 0.10.8", - "zeroize", -] - -[[package]] -name = "enumn" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2ad8cef1d801a4686bfd8919f0b30eac4c8e48968c437a6405ded4fb5272d2b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.31", -] - -[[package]] -name = "env_logger" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" -dependencies = [ - "atty", - "humantime", - "log", - "regex", - "termcolor", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd" -dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "eth-keystore" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" -dependencies = [ - "aes", - "ctr", - "digest 0.10.7", - "hex", - "hmac 0.12.1", - "pbkdf2 0.11.0", - "rand", - "scrypt", - "serde", - "serde_json", - "sha2 0.10.7", - "sha3 0.10.8", - "thiserror", - "uuid", -] - -[[package]] -name = "eth-types" -version = "0.1.0" -dependencies = [ - "ethers-core 2.0.10", - "ethers-signers 2.0.10", - "halo2_proofs", - "hex", - "itertools", - "lazy_static", - "libsecp256k1", - "num", - "num-bigint", - "regex", - "serde", - "serde_json", - "serde_with", - "strum 0.24.1", - "strum_macros 0.24.3", - "subtle", - "uint", -] - -[[package]] -name = "ethabi" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" -dependencies = [ - "ethereum-types", - "hex", - "once_cell", - "regex", - "serde", - "serde_json", - "sha3 0.10.8", - "thiserror", - "uint", -] - -[[package]] -name = "ethbloom" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" -dependencies = [ - "crunchy", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "tiny-keccak", -] - -[[package]] -name = "ethereum-types" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" -dependencies = [ - "ethbloom", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "primitive-types", - "scale-info", - "uint", -] - -[[package]] -name = "ethers" -version = "2.0.8" -dependencies = [ - "ethers-addressbook 2.0.8", - "ethers-contract 2.0.8", - "ethers-core 2.0.8", - "ethers-etherscan 2.0.8", - "ethers-middleware 2.0.8", - "ethers-providers 2.0.8", - "ethers-signers 2.0.8", - "ethers-solc 2.0.8", -] - -[[package]] -name = "ethers" -version = "2.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ba3fd516c15a9a587135229466dbbfc85796de55c5660afbbb1b1c78517d85c" -dependencies = [ - "ethers-addressbook 2.0.10", - "ethers-contract 2.0.10", - "ethers-core 2.0.10", - "ethers-etherscan 2.0.10", - "ethers-middleware 2.0.10", - "ethers-providers 2.0.10", - "ethers-signers 2.0.10", - "ethers-solc 2.0.9", -] - -[[package]] -name = "ethers-addressbook" -version = "2.0.8" -dependencies = [ - "ethers-core 2.0.8", - "once_cell", - "serde", - "serde_json", -] - -[[package]] -name = "ethers-addressbook" -version = "2.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6e9e8acd0ed348403cc73a670c24daba3226c40b98dc1a41903766b3ab6240a" -dependencies = [ - "ethers-core 2.0.10", - "once_cell", - "serde", - "serde_json", -] - -[[package]] -name = "ethers-contract" -version = "2.0.8" -dependencies = [ - "ethers-contract-abigen 2.0.8", - "ethers-contract-derive 2.0.8", - "ethers-core 2.0.8", - "ethers-providers 2.0.8", - "ethers-signers 2.0.8", - "futures-util", - "hex", - "once_cell", - "pin-project", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "ethers-contract" -version = "2.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d79269278125006bb0552349c03593ffa9702112ca88bc7046cc669f148fb47c" -dependencies = [ - "const-hex", - "ethers-contract-abigen 2.0.10", - "ethers-contract-derive 2.0.10", - "ethers-core 2.0.10", - "ethers-providers 2.0.10", - "futures-util", - "once_cell", - "pin-project", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "ethers-contract-abigen" -version = "2.0.8" -dependencies = [ - "Inflector", - "dunce", - "ethers-core 2.0.8", - "ethers-etherscan 2.0.8", - "eyre", - "hex", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "reqwest", - "serde", - "serde_json", - "syn 2.0.31", - "toml", - "walkdir", -] - -[[package]] -name = "ethers-contract-abigen" -version = "2.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce95a43c939b2e4e2f3191c5ad4a1f279780b8a39139c9905b43a7433531e2ab" -dependencies = [ - "Inflector", - "const-hex", - "dunce", - "ethers-core 2.0.10", - "ethers-etherscan 2.0.10", - "eyre", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "reqwest", - "serde", - "serde_json", - "syn 2.0.31", - "toml", - "walkdir", -] - -[[package]] -name = "ethers-contract-derive" -version = "2.0.8" -dependencies = [ - "Inflector", - "ethers-contract-abigen 2.0.8", - "ethers-core 2.0.8", - "hex", - "proc-macro2", - "quote", - "serde_json", - "syn 2.0.31", -] - -[[package]] -name = "ethers-contract-derive" -version = "2.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9ce44906fc871b3ee8c69a695ca7ec7f70e50cb379c9b9cb5e532269e492f6" -dependencies = [ - "Inflector", - "const-hex", - "ethers-contract-abigen 2.0.10", - "ethers-core 2.0.10", - "proc-macro2", - "quote", - "serde_json", - "syn 2.0.31", -] - -[[package]] -name = "ethers-core" -version = "2.0.8" -dependencies = [ - "arrayvec", - "bytes", - "cargo_metadata", - "chrono", - "elliptic-curve", - "ethabi", - "generic-array 0.14.7", - "hex", - "k256", - "num_enum 0.6.1", - "once_cell", - "open-fastrlp", - "rand", - "rlp", - "serde", - "serde_json", - "strum 0.25.0", - "syn 2.0.31", - "tempfile", - "thiserror", - "tiny-keccak", - "unicode-xid", -] - -[[package]] -name = "ethers-core" -version = "2.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0a17f0708692024db9956b31d7a20163607d2745953f5ae8125ab368ba280ad" -dependencies = [ - "arrayvec", - "bytes", - "cargo_metadata", - "chrono", - "const-hex", - "elliptic-curve", - "ethabi", - "generic-array 0.14.7", - "k256", - "num_enum 0.7.0", - "once_cell", - "open-fastrlp", - "rand", - "rlp", - "serde", - "serde_json", - "strum 0.25.0", - "syn 2.0.31", - "tempfile", - "thiserror", - "tiny-keccak", - "unicode-xid", -] - -[[package]] -name = "ethers-etherscan" -version = "2.0.8" -dependencies = [ - "ethers-core 2.0.8", - "ethers-solc 2.0.8", - "reqwest", - "semver 1.0.18", - "serde", - "serde_json", - "thiserror", - "tracing", -] - -[[package]] -name = "ethers-etherscan" -version = "2.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e53451ea4a8128fbce33966da71132cf9e1040dcfd2a2084fd7733ada7b2045" -dependencies = [ - "ethers-core 2.0.10", - "reqwest", - "semver 1.0.18", - "serde", - "serde_json", - "thiserror", - "tracing", -] - -[[package]] -name = "ethers-middleware" -version = "2.0.8" -dependencies = [ - "async-trait", - "auto_impl", - "ethers-contract 2.0.8", - "ethers-core 2.0.8", - "ethers-etherscan 2.0.8", - "ethers-providers 2.0.8", - "ethers-signers 2.0.8", - "futures-channel", - "futures-locks", - "futures-util", - "instant", - "reqwest", - "serde", - "serde_json", - "thiserror", - "tokio", - "tracing", - "tracing-futures", - "url", -] - -[[package]] -name = "ethers-middleware" -version = "2.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "473f1ccd0c793871bbc248729fa8df7e6d2981d6226e4343e3bbaa9281074d5d" -dependencies = [ - "async-trait", - "auto_impl", - "ethers-contract 2.0.10", - "ethers-core 2.0.10", - "ethers-etherscan 2.0.10", - "ethers-providers 2.0.10", - "ethers-signers 2.0.10", - "futures-channel", - "futures-locks", - "futures-util", - "instant", - "reqwest", - "serde", - "serde_json", - "thiserror", - "tokio", - "tracing", - "tracing-futures", - "url", -] - -[[package]] -name = "ethers-providers" -version = "2.0.8" -dependencies = [ - "async-trait", - "auto_impl", - "base64 0.21.3", - "bytes", - "enr", - "ethers-core 2.0.8", - "futures-channel", - "futures-core", - "futures-timer", - "futures-util", - "hashers", - "hex", - "http", - "instant", - "jsonwebtoken", - "once_cell", - "pin-project", - "reqwest", - "serde", - "serde_json", - "thiserror", - "tokio", - "tokio-tungstenite 0.19.0", - "tracing", - "tracing-futures", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "ws_stream_wasm", -] - -[[package]] -name = "ethers-providers" -version = "2.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6838fa110e57d572336178b7c79e94ff88ef976306852d8cb87d9e5b1fc7c0b5" -dependencies = [ - "async-trait", - "auto_impl", - "base64 0.21.3", - "bytes", - "const-hex", - "enr", - "ethers-core 2.0.10", - "futures-channel", - "futures-core", - "futures-timer", - "futures-util", - "hashers", - "http", - "instant", - "jsonwebtoken", - "once_cell", - "pin-project", - "reqwest", - "serde", - "serde_json", - "thiserror", - "tokio", - "tokio-tungstenite 0.20.0", - "tracing", - "tracing-futures", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "ws_stream_wasm", -] - -[[package]] -name = "ethers-signers" -version = "2.0.8" -dependencies = [ - "async-trait", - "coins-bip32", - "coins-bip39", - "elliptic-curve", - "eth-keystore", - "ethers-core 2.0.8", - "hex", - "rand", - "sha2 0.10.7", - "thiserror", - "tracing", -] - -[[package]] -name = "ethers-signers" -version = "2.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ea44bec930f12292866166f9ddbea6aa76304850e4d8dcd66dc492b43d00ff1" -dependencies = [ - "async-trait", - "coins-bip32", - "coins-bip39", - "const-hex", - "elliptic-curve", - "eth-keystore", - "ethers-core 2.0.10", - "rand", - "sha2 0.10.7", - "thiserror", - "tracing", -] - -[[package]] -name = "ethers-solc" -version = "2.0.8" -dependencies = [ - "cfg-if", - "dirs", - "dunce", - "ethers-core 2.0.8", - "glob", - "hex", - "home", - "md-5", - "num_cpus", - "once_cell", - "path-slash", - "rayon", - "regex", - "semver 1.0.18", - "serde", - "serde_json", - "solang-parser", - "svm-rs", - "thiserror", - "tiny-keccak", - "tokio", - "tracing", - "walkdir", - "yansi", -] - -[[package]] -name = "ethers-solc" -version = "2.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66559c8f774712df303c907d087275a52a2046b256791aaa566d5abc8ea66731" -dependencies = [ - "cfg-if", - "const-hex", - "dirs", - "dunce", - "ethers-core 2.0.10", - "glob", - "home", - "md-5", - "num_cpus", - "once_cell", - "path-slash", - "rayon", - "regex", - "semver 1.0.18", - "serde", - "serde_json", - "solang-parser", - "svm-rs", - "thiserror", - "tiny-keccak", - "tokio", - "tracing", - "walkdir", - "yansi", -] - -[[package]] -name = "eyre" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" -dependencies = [ - "indenter", - "once_cell", -] - -[[package]] -name = "fastrand" -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.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" -dependencies = [ - "bitvec", - "rand_core", - "subtle", -] - -[[package]] -name = "fixed-hash" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" -dependencies = [ - "byteorder", - "rand", - "rustc-hex", - "static_assertions", -] - -[[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - -[[package]] -name = "flate2" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "form_urlencoded" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fs2" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futures" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" - -[[package]] -name = "futures-executor" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" - -[[package]] -name = "futures-locks" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45ec6fe3675af967e67c5536c0b9d44e34e6c52f86bedc4ea49c5317b8e94d06" -dependencies = [ - "futures-channel", - "futures-task", -] - -[[package]] -name = "futures-macro" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.31", -] - -[[package]] -name = "futures-sink" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" - -[[package]] -name = "futures-task" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" - -[[package]] -name = "futures-timer" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" -dependencies = [ - "gloo-timers", - "send_wrapper 0.4.0", -] - -[[package]] -name = "futures-util" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "gadgets" -version = "0.1.0" -dependencies = [ - "digest 0.7.6", - "eth-types", - "halo2_proofs", - "sha3 0.7.3", - "strum 0.24.1", -] - -[[package]] -name = "generic-array" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d00328cedcac5e81c683e5620ca6a30756fc23027ebf9bff405c0e8da1fbb7e" -dependencies = [ - "typenum", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "getrandom" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "gimli" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - -[[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 = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core", - "subtle", -] - -[[package]] -name = "h2" -version = "0.3.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap 1.9.3", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "halo2_proofs" -version = "0.2.0" -source = "git+https://github.com/privacy-scaling-explorations/halo2.git?tag=v2023_04_20#be955686f86eb618f55d2320c0e042485b313d22" -dependencies = [ - "blake2b_simd", - "ff", - "group", - "halo2curves", - "rand_chacha", - "rand_core", - "rayon", - "sha3 0.9.1", - "tracing", -] - -[[package]] -name = "halo2curves" -version = "0.3.2" -source = "git+https://github.com/privacy-scaling-explorations/halo2curves?tag=0.3.2#9f5c50810bbefe779ee5cf1d852b2fe85dc35d5e" -dependencies = [ - "ff", - "group", - "lazy_static", - "num-bigint", - "num-traits", - "pasta_curves", - "paste", - "rand", - "rand_core", - "static_assertions", - "subtle", -] - -[[package]] -name = "halo2wrong" -version = "0.1.0" -source = "git+https://github.com/privacy-scaling-explorations/halo2wrong?tag=v2023_04_20#f72db265aa3cebe297c9b9816e940d0e1d400886" -dependencies = [ - "halo2_proofs", - "num-bigint", - "num-integer", - "num-traits", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" - -[[package]] -name = "hashers" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2bca93b15ea5a746f220e56587f71e73c6165eab783df9e26590069953e3c30" -dependencies = [ - "fxhash", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[package]] -name = "hermit-abi" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hex-literal" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" - -[[package]] -name = "hmac" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" -dependencies = [ - "crypto-mac", - "digest 0.9.0", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -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 = "home" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "http" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" -dependencies = [ - "bytes", - "http", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - -[[package]] -name = "hyper" -version = "0.14.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2 0.4.9", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" -dependencies = [ - "futures-util", - "http", - "hyper", - "rustls", - "tokio", - "tokio-rustls", -] - -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper", - "native-tls", - "tokio", - "tokio-native-tls", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "impl-codec" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" -dependencies = [ - "parity-scale-codec", -] - -[[package]] -name = "impl-rlp" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" -dependencies = [ - "rlp", -] - -[[package]] -name = "impl-serde" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" -dependencies = [ - "serde", -] - -[[package]] -name = "impl-trait-for-tuples" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "indenter" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", -] - -[[package]] -name = "indexmap" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" -dependencies = [ - "equivalent", - "hashbrown 0.14.0", -] - -[[package]] -name = "inout" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" -dependencies = [ - "generic-array 0.14.7", -] - -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "integer" -version = "0.1.0" -source = "git+https://github.com/privacy-scaling-explorations/halo2wrong?tag=v2023_04_20#f72db265aa3cebe297c9b9816e940d0e1d400886" -dependencies = [ - "maingate", - "num-bigint", - "num-integer", - "num-traits", - "rand", - "subtle", -] - -[[package]] -name = "ipnet" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" - -[[package]] -name = "is-terminal" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" -dependencies = [ - "hermit-abi 0.3.2", - "rustix", - "windows-sys", -] - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" - -[[package]] -name = "jobserver" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" -dependencies = [ - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "jsonwebtoken" -version = "8.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" -dependencies = [ - "base64 0.21.3", - "pem", - "ring", - "serde", - "serde_json", - "simple_asn1", -] - -[[package]] -name = "k256" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" -dependencies = [ - "cfg-if", - "ecdsa 0.16.8", - "elliptic-curve", - "once_cell", - "sha2 0.10.7", - "signature", -] - -[[package]] -name = "keccak" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "lalrpop" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da4081d44f4611b66c6dd725e6de3169f9f63905421e8626fcb86b6a898998b8" -dependencies = [ - "ascii-canvas", - "bit-set", - "diff", - "ena", - "is-terminal", - "itertools", - "lalrpop-util", - "petgraph", - "regex", - "regex-syntax 0.7.5", - "string_cache", - "term", - "tiny-keccak", - "unicode-xid", -] - -[[package]] -name = "lalrpop-util" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f35c735096c0293d313e8f2a641627472b83d01b937177fe76e5e2708d31e0d" - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -dependencies = [ - "spin", -] - -[[package]] -name = "libc" -version = "0.2.147" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" - -[[package]] -name = "libm" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" - -[[package]] -name = "libsecp256k1" -version = "0.7.1" -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", -] - -[[package]] -name = "light-client-poc" -version = "0.1.0" -dependencies = [ - "ethers 2.0.8", - "eyre", - "halo2_proofs", - "hex", - "mpt-witness-generator", - "num_enum 0.6.1", - "reqwest", - "serde", - "serde_json", - "tokio", - "zkevm-circuits", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" - -[[package]] -name = "lock_api" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" - -[[package]] -name = "maingate" -version = "0.1.0" -source = "git+https://github.com/privacy-scaling-explorations/halo2wrong?tag=v2023_04_20#f72db265aa3cebe297c9b9816e940d0e1d400886" -dependencies = [ - "halo2wrong", - "num-bigint", - "num-integer", - "num-traits", - "rand", - "subtle", -] - -[[package]] -name = "maybe-uninit" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" - -[[package]] -name = "md-5" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "memchr" -version = "2.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" - -[[package]] -name = "memoffset" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" -dependencies = [ - "autocfg", -] - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "miniz_oxide" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" -dependencies = [ - "libc", - "wasi", - "windows-sys", -] - -[[package]] -name = "mpt-witness-generator" -version = "0.1.0" -dependencies = [ - "env_logger", - "ethers 2.0.9", - "glob", - "gobuild", - "log", - "num_enum 0.7.0", - "serde", - "serde_json", - "zkevm-circuits", -] - -[[package]] -name = "native-tls" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" -dependencies = [ - "lazy_static", - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "new_debug_unreachable" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" - -[[package]] -name = "nodrop" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" - -[[package]] -name = "num" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05180d69e3da0e530ba2a1dae5110317e49e3b7f3d41be227dc5f92e49ee7af" -dependencies = [ - "num-bigint", - "num-complex", - "num-integer", - "num-iter", - "num-rational", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", - "rand", -] - -[[package]] -name = "num-complex" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-integer" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" -dependencies = [ - "autocfg", - "num-bigint", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi 0.3.2", - "libc", -] - -[[package]] -name = "num_enum" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" -dependencies = [ - "num_enum_derive 0.5.11", -] - -[[package]] -name = "num_enum" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" -dependencies = [ - "num_enum_derive 0.6.1", -] - -[[package]] -name = "num_enum" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70bf6736f74634d299d00086f02986875b3c2d924781a6a2cb6c201e73da0ceb" -dependencies = [ - "num_enum_derive 0.7.0", -] - -[[package]] -name = "num_enum_derive" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "num_enum_derive" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.31", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ea360eafe1022f7cc56cd7b869ed57330fb2453d0c7831d99b74c65d2f5597" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.31", -] - -[[package]] -name = "object" -version = "0.32.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" - -[[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - -[[package]] -name = "open-fastrlp" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", - "ethereum-types", - "open-fastrlp-derive", -] - -[[package]] -name = "open-fastrlp-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" -dependencies = [ - "bytes", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "openssl" -version = "0.10.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bac25ee399abb46215765b1cb35bc0212377e58a061560d8b29b024fd0430e7c" -dependencies = [ - "bitflags 2.4.0", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.31", -] - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "openssl-sys" -version = "0.9.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db4d56a4c0478783083cfafcc42493dd4a981d41669da64b4572a2a089b51b1d" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "parity-scale-codec" -version = "3.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d640b40e81625f53b59f9c5812d3fb9e7ce11971d3fb34268eb7a83adf98051" -dependencies = [ - "arrayvec", - "bitvec", - "byte-slice-cast", - "impl-trait-for-tuples", - "parity-scale-codec-derive", - "serde", -] - -[[package]] -name = "parity-scale-codec-derive" -version = "3.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ac464815d51fff2f64d690bf6ea4442d365e53495d50737685cfecfa3dd3f62" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "parking_lot" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.3.5", - "smallvec 1.11.0", - "windows-targets", -] - -[[package]] -name = "password-hash" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" -dependencies = [ - "base64ct", - "rand_core", - "subtle", -] - -[[package]] -name = "pasta_curves" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e57598f73cc7e1b2ac63c79c517b31a0877cd7c402cdcaa311b5208de7a095" -dependencies = [ - "blake2b_simd", - "ff", - "group", - "lazy_static", - "rand", - "static_assertions", - "subtle", -] - -[[package]] -name = "paste" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" - -[[package]] -name = "path-slash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" - -[[package]] -name = "pbkdf2" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" -dependencies = [ - "digest 0.10.7", - "hmac 0.12.1", - "password-hash", - "sha2 0.10.7", -] - -[[package]] -name = "pbkdf2" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" -dependencies = [ - "digest 0.10.7", - "hmac 0.12.1", -] - -[[package]] -name = "pem" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" -dependencies = [ - "base64 0.13.1", -] - -[[package]] -name = "percent-encoding" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" - -[[package]] -name = "pest" -version = "2.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a4d085fd991ac8d5b05a147b437791b4260b76326baf0fc60cf7c9c27ecd33" -dependencies = [ - "memchr", - "thiserror", - "ucd-trie", -] - -[[package]] -name = "petgraph" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" -dependencies = [ - "fixedbitset", - "indexmap 2.0.0", -] - -[[package]] -name = "pharos" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" -dependencies = [ - "futures", - "rustc_version 0.4.0", -] - -[[package]] -name = "phf" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" -dependencies = [ - "phf_macros", - "phf_shared 0.11.2", -] - -[[package]] -name = "phf_generator" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" -dependencies = [ - "phf_shared 0.11.2", - "rand", -] - -[[package]] -name = "phf_macros" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" -dependencies = [ - "phf_generator", - "phf_shared 0.11.2", - "proc-macro2", - "quote", - "syn 2.0.31", -] - -[[package]] -name = "phf_shared" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" -dependencies = [ - "siphasher", -] - -[[package]] -name = "phf_shared" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" -dependencies = [ - "siphasher", -] - -[[package]] -name = "pin-project" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.31", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" - -[[package]] -name = "poseidon" -version = "0.2.0" -source = "git+https://github.com/privacy-scaling-explorations/poseidon.git?tag=v2023_04_20#807f8f555313f726ca03bdf941f798098f488ba4" -dependencies = [ - "halo2curves", - "subtle", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "precomputed-hash" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" - -[[package]] -name = "prettyplease" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" -dependencies = [ - "proc-macro2", - "syn 2.0.31", -] - -[[package]] -name = "primitive-types" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f3486ccba82358b11a77516035647c34ba167dfa53312630de83b12bd4f3d66" -dependencies = [ - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "uint", -] - -[[package]] -name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "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-macro2" -version = "1.0.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proptest" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e35c06b98bf36aba164cc17cb25f7e232f5c4aeea73baa14b8a9f0d92dbfa65" -dependencies = [ - "bitflags 1.3.2", - "byteorder", - "lazy_static", - "num-traits", - "rand", - "rand_chacha", - "rand_xorshift", - "regex-syntax 0.6.29", - "unarray", -] - -[[package]] -name = "quote" -version = "1.0.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rand_xorshift" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" -dependencies = [ - "rand_core", -] - -[[package]] -name = "rayon" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" -dependencies = [ - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-utils", - "num_cpus", -] - -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_users" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" -dependencies = [ - "getrandom", - "redox_syscall 0.2.16", - "thiserror", -] - -[[package]] -name = "regex" -version = "1.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax 0.7.5", -] - -[[package]] -name = "regex-automata" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax 0.7.5", -] - -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" - -[[package]] -name = "reqwest" -version = "0.11.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e9ad3fe7488d7e34558a2033d45a0c90b72d97b4f80705666fea71472e2e6a1" -dependencies = [ - "base64 0.21.3", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-rustls", - "hyper-tls", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls", - "rustls-pemfile", - "serde", - "serde_json", - "serde_urlencoded", - "tokio", - "tokio-native-tls", - "tokio-rustls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "webpki-roots 0.25.2", - "winreg", -] - -[[package]] -name = "revm" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73d84c8f9836efb0f5f5f8de4700a953c4e1f3119e5cfcb0aad8e5be73daf991" -dependencies = [ - "arrayref", - "auto_impl", - "bytes", - "hashbrown 0.13.2", - "num_enum 0.5.11", - "primitive-types", - "revm_precompiles", - "rlp", - "sha3 0.10.8", -] - -[[package]] -name = "revm-precompile" -version = "2.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41320af3bd6a65153d38eb1d3638ba89104cc9513c7feedb2d8510e8307dab29" -dependencies = [ - "k256", - "num", - "once_cell", - "revm-primitives", - "ripemd", - "secp256k1 0.27.0", - "sha2 0.10.7", - "sha3 0.10.8", - "substrate-bn", -] - -[[package]] -name = "revm-primitives" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "304d998f466ffef72d76c7f20b05bf08a96801736a6fb1fdef47d49a292618df" -dependencies = [ - "auto_impl", - "bitvec", - "bytes", - "derive_more", - "enumn", - "fixed-hash", - "hashbrown 0.13.2", - "hex", - "hex-literal", - "primitive-types", - "rlp", - "ruint", - "sha3 0.10.8", -] - -[[package]] -name = "revm_precompiles" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0353d456ef3e989dc9190f42c6020f09bc2025930c37895826029304413204b5" -dependencies = [ - "bytes", - "hashbrown 0.13.2", - "num", - "once_cell", - "primitive-types", - "ripemd", - "secp256k1 0.24.3", - "sha2 0.10.7", - "sha3 0.10.8", - "substrate-bn", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac 0.12.1", - "subtle", -] - -[[package]] -name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin", - "untrusted", - "web-sys", - "winapi", -] - -[[package]] -name = "ripemd" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "rlp" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" -dependencies = [ - "bytes", - "rlp-derive", - "rustc-hex", -] - -[[package]] -name = "rlp-derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ruint" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95294d6e3a6192f3aabf91c38f56505a625aa495533442744185a36d75a790c4" -dependencies = [ - "alloy-rlp", - "ark-ff 0.3.0", - "ark-ff 0.4.2", - "bytes", - "fastrlp", - "num-bigint", - "parity-scale-codec", - "primitive-types", - "proptest", - "rand", - "rlp", - "ruint-macro", - "serde", - "valuable", - "zeroize", -] - -[[package]] -name = "ruint-macro" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e666a5496a0b2186dbcd0ff6106e29e093c15591bde62c20d3842007c6978a09" - -[[package]] -name = "rustc-demangle" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" - -[[package]] -name = "rustc-hex" -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 1.0.18", -] - -[[package]] -name = "rustix" -version = "0.38.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0c3dde1fc030af041adc40e79c0e7fbcf431dd24870053d187d7c66e4b87453" -dependencies = [ - "bitflags 2.4.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys", -] - -[[package]] -name = "rustls" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8" -dependencies = [ - "log", - "ring", - "rustls-webpki 0.101.4", - "sct", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" -dependencies = [ - "base64 0.21.3", -] - -[[package]] -name = "rustls-webpki" -version = "0.100.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e98ff011474fa39949b7e5c0428f9b4937eda7da7848bbb947786b7be0b27dab" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "rustls-webpki" -version = "0.101.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d93931baf2d282fff8d3a532bbfd7653f734643161b87e3e01e59a04439bf0d" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" - -[[package]] -name = "ryu" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" - -[[package]] -name = "salsa20" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" -dependencies = [ - "cipher", -] - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "scale-info" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0a159d0c45c12b20c5a844feb1fe4bea86e28f17b92a5f0c42193634d3782" -dependencies = [ - "cfg-if", - "derive_more", - "parity-scale-codec", - "scale-info-derive", -] - -[[package]] -name = "scale-info-derive" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "912e55f6d20e0e80d63733872b40e1227c0bce1e1ab81ba67d696339bfd7fd29" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "schannel" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "scrypt" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" -dependencies = [ - "hmac 0.12.1", - "pbkdf2 0.11.0", - "salsa20", - "sha2 0.10.7", -] - -[[package]] -name = "sct" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct", - "der", - "generic-array 0.14.7", - "pkcs8", - "subtle", - "zeroize", -] - -[[package]] -name = "secp256k1" -version = "0.24.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b1629c9c557ef9b293568b338dddfc8208c98a18c59d722a9d53f859d9c9b62" -dependencies = [ - "secp256k1-sys 0.6.1", -] - -[[package]] -name = "secp256k1" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" -dependencies = [ - "secp256k1-sys 0.8.1", -] - -[[package]] -name = "secp256k1-sys" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83080e2c2fc1006e625be82e5d1eb6a43b7fd9578b617fcc55814daf286bba4b" -dependencies = [ - "cc", -] - -[[package]] -name = "secp256k1-sys" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a129b9e9efbfb223753b9163c4ab3b13cff7fd9c7f010fbac25ab4099fa07e" -dependencies = [ - "cc", -] - -[[package]] -name = "security-framework" -version = "2.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[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" -dependencies = [ - "serde", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" - -[[package]] -name = "send_wrapper" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" - -[[package]] -name = "serde" -version = "1.0.188" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde-hex" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca37e3e4d1b39afd7ff11ee4e947efae85adfddf4841787bfa47c470e96dc26d" -dependencies = [ - "array-init 0.0.4", - "serde", - "smallvec 0.6.14", -] - -[[package]] -name = "serde_derive" -version = "1.0.188" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.31", -] - -[[package]] -name = "serde_json" -version = "1.0.105" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_spanned" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_with" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" -dependencies = [ - "serde", - "serde_with_macros", -] - -[[package]] -name = "serde_with_macros" -version = "1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "sha1" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" -dependencies = [ - "cfg-if", - "cpufeatures", - "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", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - -[[package]] -name = "sha2" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" -dependencies = [ - "cfg-if", - "cpufeatures", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" -dependencies = [ - "block-buffer 0.9.0", - "digest 0.9.0", - "keccak", - "opaque-debug", -] - -[[package]] -name = "sha3" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" -dependencies = [ - "digest 0.10.7", - "keccak", -] - -[[package]] -name = "signature" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" -dependencies = [ - "digest 0.10.7", - "rand_core", -] - -[[package]] -name = "simple_asn1" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" -dependencies = [ - "num-bigint", - "num-traits", - "thiserror", - "time", -] - -[[package]] -name = "siphasher" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "0.6.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97fcaeba89edba30f044a10c6a3cc39df9c3f17d7cd829dd1446cab35f890e0" -dependencies = [ - "maybe-uninit", -] - -[[package]] -name = "smallvec" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" - -[[package]] -name = "smol_str" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74212e6bbe9a4352329b2f68ba3130c15a3f26fe88ff22dbdc6cdd58fa85e99c" -dependencies = [ - "serde", -] - -[[package]] -name = "snark-verifier" -version = "0.1.0" -source = "git+https://github.com/privacy-scaling-explorations/snark-verifier?tag=v2023_04_20#e5d5e4a6ccff2bba71baf77ab7a12b124d6364a1" -dependencies = [ - "bytes", - "ecc", - "halo2_proofs", - "halo2curves", - "hex", - "itertools", - "lazy_static", - "num-bigint", - "num-integer", - "num-traits", - "poseidon", - "primitive-types", - "rand", - "revm", - "rlp", - "sha3 0.10.8", -] - -[[package]] -name = "socket2" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "socket2" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" -dependencies = [ - "libc", - "windows-sys", -] - -[[package]] -name = "solang-parser" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c792fe9fae2a2f716846f214ca10d5a1e21133e0bf36cef34bcc4a852467b21" -dependencies = [ - "itertools", - "lalrpop", - "lalrpop-util", - "phf", - "thiserror", - "unicode-xid", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "spki" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "string_cache" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" -dependencies = [ - "new_debug_unreachable", - "once_cell", - "parking_lot", - "phf_shared 0.10.0", - "precomputed-hash", -] - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "strum" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" - -[[package]] -name = "strum" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" -dependencies = [ - "strum_macros 0.25.2", -] - -[[package]] -name = "strum_macros" -version = "0.24.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 1.0.109", -] - -[[package]] -name = "strum_macros" -version = "0.25.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad8d03b598d3d0fff69bf533ee3ef19b8eeb342729596df84bcc7e1f96ec4059" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.31", -] - -[[package]] -name = "substrate-bn" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b5bbfa79abbae15dd642ea8176a21a635ff3c00059961d1ea27ad04e5b441c" -dependencies = [ - "byteorder", - "crunchy", - "lazy_static", - "rand", - "rustc-hex", -] - -[[package]] -name = "subtle" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" - -[[package]] -name = "svm-rs" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597e3a746727984cb7ea2487b6a40726cad0dbe86628e7d429aa6b8c4c153db4" -dependencies = [ - "dirs", - "fs2", - "hex", - "once_cell", - "reqwest", - "semver 1.0.18", - "serde", - "serde_json", - "sha2 0.10.7", - "thiserror", - "url", - "zip", -] - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718fa2415bcb8d8bd775917a1bf12a7931b6dfa890753378538118181e0cb398" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "tempfile" -version = "3.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" -dependencies = [ - "cfg-if", - "fastrand", - "redox_syscall 0.3.5", - "rustix", - "windows-sys", -] - -[[package]] -name = "term" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" -dependencies = [ - "dirs-next", - "rustversion", - "winapi", -] - -[[package]] -name = "termcolor" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "thiserror" -version = "1.0.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d6d7a740b8a666a7e828dd00da9c0dc290dff53154ea77ac109281de90589b7" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.31", -] - -[[package]] -name = "time" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f6bb557fd245c28e6411aa56b6403c689ad95061f50e4be16c274e70a17e48" -dependencies = [ - "deranged", - "itoa", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" - -[[package]] -name = "time-macros" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a942f44339478ef67935ab2bbaec2fb0322496cf3cbe84b261e06ac3814c572" -dependencies = [ - "time-core", -] - -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "num_cpus", - "pin-project-lite", - "socket2 0.5.3", - "tokio-macros", - "windows-sys", -] - -[[package]] -name = "tokio-macros" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.31", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec509ac96e9a0c43427c74f003127d953a265737636129424288d27cb5c4b12c" -dependencies = [ - "futures-util", - "log", - "rustls", - "tokio", - "tokio-rustls", - "tungstenite 0.19.0", - "webpki-roots 0.23.1", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2dbec703c26b00d74844519606ef15d09a7d6857860f84ad223dec002ddea2" -dependencies = [ - "futures-util", - "log", - "rustls", - "tokio", - "tokio-rustls", - "tungstenite 0.20.0", - "webpki-roots 0.23.1", -] - -[[package]] -name = "tokio-util" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", - "tracing", -] - -[[package]] -name = "toml" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0a3ab2091e52d7299a39d098e200114a972df0a7724add02a273aa9aada592" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - -[[package]] -name = "toml_datetime" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.19.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" -dependencies = [ - "indexmap 2.0.0", - "serde", - "serde_spanned", - "toml_datetime", - "winnow", -] - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" -dependencies = [ - "cfg-if", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.31", -] - -[[package]] -name = "tracing-core" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" -dependencies = [ - "once_cell", -] - -[[package]] -name = "tracing-futures" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" -dependencies = [ - "pin-project", - "tracing", -] - -[[package]] -name = "try-lock" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" - -[[package]] -name = "tungstenite" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15fba1a6d6bb030745759a9a2a588bfe8490fc8b4751a277db3a0be1c9ebbf67" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "rand", - "rustls", - "sha1", - "thiserror", - "url", - "utf-8", - "webpki", -] - -[[package]] -name = "tungstenite" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e862a1c4128df0112ab625f55cd5c934bcb4312ba80b39ae4b4835a3fd58e649" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "rand", - "rustls", - "sha1", - "thiserror", - "url", - "utf-8", -] - -[[package]] -name = "typenum" -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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" - -[[package]] -name = "unicode-ident" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" - -[[package]] -name = "unicode-normalization" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-xid" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" - -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - -[[package]] -name = "url" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "uuid" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" -dependencies = [ - "getrandom", - "serde", -] - -[[package]] -name = "valuable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "walkdir" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.31", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.31", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" - -[[package]] -name = "web-sys" -version = "0.3.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0e74f82d49d545ad128049b7e88f6576df2da6b02e9ce565c6f533be576957e" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "webpki-roots" -version = "0.23.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b03058f88386e5ff5310d9111d53f48b17d732b401aeb83a8d5190f2ac459338" -dependencies = [ - "rustls-webpki 0.100.2", -] - -[[package]] -name = "webpki-roots" -version = "0.25.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -dependencies = [ - "winapi", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "winnow" -version = "0.5.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c2e3184b9c4e92ad5167ca73039d0c42476302ab603e2fec4487511f38ccefc" -dependencies = [ - "memchr", -] - -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys", -] - -[[package]] -name = "ws_stream_wasm" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" -dependencies = [ - "async_io_stream", - "futures", - "js-sys", - "log", - "pharos", - "rustc_version 0.4.0", - "send_wrapper 0.6.0", - "thiserror", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "yansi" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" - -[[package]] -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.31", -] - -[[package]] -name = "zip" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" -dependencies = [ - "aes", - "byteorder", - "bzip2", - "constant_time_eq 0.1.5", - "crc32fast", - "crossbeam-utils", - "flate2", - "hmac 0.12.1", - "pbkdf2 0.11.0", - "sha1", - "time", - "zstd", -] - -[[package]] -name = "zkevm-circuits" -version = "0.1.0" -dependencies = [ - "array-init 2.1.0", - "bus-mapping", - "ecc", - "ecdsa 0.1.0", - "env_logger", - "eth-types", - "ethers-core 2.0.10", - "gadgets", - "halo2_proofs", - "integer", - "itertools", - "lazy_static", - "libsecp256k1", - "log", - "maingate", - "num", - "num-bigint", - "num_enum 0.5.11", - "rand", - "rand_chacha", - "rand_xorshift", - "serde", - "serde_json", - "sha3 0.10.8", - "snark-verifier", - "strum 0.24.1", - "strum_macros 0.24.3", -] - -[[package]] -name = "zstd" -version = "0.11.2+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "5.0.2+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" -dependencies = [ - "libc", - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.8+zstd.1.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c" -dependencies = [ - "cc", - "libc", - "pkg-config", -] diff --git a/light-client-poc/Cargo.toml b/light-client-poc/Cargo.toml deleted file mode 100644 index 8086e56640..0000000000 --- a/light-client-poc/Cargo.toml +++ /dev/null @@ -1,29 +0,0 @@ -[package] -name = "light-client-poc" -version = "0.1.0" -edition = "2021" - -[dependencies] -serde = { version = "1.0", features = ["derive"] } -serde_json = { version = "1.0", features = ["arbitrary_precision"] } -zkevm-circuits = { path = "../zkevm-circuits", features=["test-circuits"]} -halo2_proofs = { git = "https://github.com/privacy-scaling-explorations/halo2.git", tag = "v0.3.0" } -eyre = { version = "0.6.8" } -hex = "0.4.3" -num_enum = "0.6.1" -reqwest = "0.11.18" -tokio = { version= "1.28.2", features = ["macros", "rt-multi-thread"] } -mpt-witness-generator = { path = "../mpt-witness-generator/rustlib" } -ethers ={ version = "2.0.10", features = ["abigen", "rustls", "ws", "ethers-solc"] } -eth-types = { path = "../eth-types" } -gadgets = { path = "../gadgets" } -rand_chacha = "0.3.1" -rand = "0.8.5" -env_logger = "0.9" -ahash = "=0.8.6" - -[dev-dependencies] -ctor = "0.1.22" - -[features] -disable-keccak = [] diff --git a/light-client-poc/README.md b/light-client-poc/README.md deleted file mode 100644 index d89da127ec..0000000000 --- a/light-client-poc/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# Light client PoC - -**NOTE** this is a draft implementation of a PoC server - -This light client PoC is an experiment to test how to send the incremental statedb changes -with its snark to help light clients to sync without sending MPT proofs. - -This crate contains: - -- The StateUpdateCircuit -- The witness generator for circuit -- A WIP server to generate and serve the proofs -- Test with a local geth node -- Test with mainnet blocks - -The circuit has the following public inputs: - - - previous state root (hi/lo) - - next state root (hi/lo) - - number of state db changes - - state db changes, a list of records of - - type of change ( balance change, codehash change, storage change, ...) - - address - - value changed (hi/lo) - - key changed, relevant only in storage changes (hi/lo) - diff --git a/light-client-poc/go-ethereum b/light-client-poc/go-ethereum deleted file mode 160000 index fd2d7cea37..0000000000 --- a/light-client-poc/go-ethereum +++ /dev/null @@ -1 +0,0 @@ -Subproject commit fd2d7cea3747e1003a817cd18e200bf2b00be03c diff --git a/light-client-poc/go-ethereum-data/boot.key b/light-client-poc/go-ethereum-data/boot.key deleted file mode 100644 index c400ae80f2..0000000000 --- a/light-client-poc/go-ethereum-data/boot.key +++ /dev/null @@ -1 +0,0 @@ -d78e4d3e850d6199341be93ad038be4dc2b68e49fdf898a1368f9e41592041d4 \ No newline at end of file diff --git a/light-client-poc/go-ethereum-data/keystore/UTC--2023-08-08T14-43-37.660247000Z--5b72551fc886e8dc264b4382811e596291c0bfd4 b/light-client-poc/go-ethereum-data/keystore/UTC--2023-08-08T14-43-37.660247000Z--5b72551fc886e8dc264b4382811e596291c0bfd4 deleted file mode 100644 index 02fdb1c865..0000000000 --- a/light-client-poc/go-ethereum-data/keystore/UTC--2023-08-08T14-43-37.660247000Z--5b72551fc886e8dc264b4382811e596291c0bfd4 +++ /dev/null @@ -1 +0,0 @@ -{"address":"5b72551fc886e8dc264b4382811e596291c0bfd4","crypto":{"cipher":"aes-128-ctr","ciphertext":"25d07e3633e84b486236eb38c2352a0ed826841f63db7343f35c67c405a2c64b","cipherparams":{"iv":"1209b2c918f8192410261265bf2663f9"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"817a7152b6bc0da7c706710ae01ec95975f52dd079bceb850c35960a3a88d1ee"},"mac":"d659af0665d25ccbde8dda66b772f74d337b97d94d9e1d8679b3d5b56d27310f"},"id":"0eb3873d-0f07-4289-9e3b-e9c2b5e38c00","version":3} \ No newline at end of file diff --git a/light-client-poc/go-ethereum-data/zklight.json b/light-client-poc/go-ethereum-data/zklight.json deleted file mode 100644 index fa7e60a924..0000000000 --- a/light-client-poc/go-ethereum-data/zklight.json +++ /dev/null @@ -1,803 +0,0 @@ -{ - "config": { - "chainId": 93, - "homesteadBlock": 0, - "eip150Block": 0, - "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "eip155Block": 0, - "eip158Block": 0, - "byzantiumBlock": 0, - "constantinopleBlock": 0, - "petersburgBlock": 0, - "istanbulBlock": 0, - "shangaiBlock": 0, - "clique": { - "period": 2, - "epoch": 30000 - } - }, - "nonce": "0x0", - "timestamp": "0x64d25743", - "extraData": "0x00000000000000000000000000000000000000000000000000000000000000005b72551fc886e8dc264b4382811e596291c0bfd40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "gasLimit": "0x47b760", - "difficulty": "0x1", - "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "coinbase": "0x0000000000000000000000000000000000000000", - "alloc": { - "0000000000000000000000000000000000000000": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000001": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000002": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000003": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000004": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000005": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000006": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000007": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000008": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000009": { - "balance": "0x1" - }, - "000000000000000000000000000000000000000a": { - "balance": "0x1" - }, - "000000000000000000000000000000000000000b": { - "balance": "0x1" - }, - "000000000000000000000000000000000000000c": { - "balance": "0x1" - }, - "000000000000000000000000000000000000000d": { - "balance": "0x1" - }, - "000000000000000000000000000000000000000e": { - "balance": "0x1" - }, - "000000000000000000000000000000000000000f": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000010": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000011": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000012": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000013": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000014": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000015": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000016": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000017": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000018": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000019": { - "balance": "0x1" - }, - "000000000000000000000000000000000000001a": { - "balance": "0x1" - }, - "000000000000000000000000000000000000001b": { - "balance": "0x1" - }, - "000000000000000000000000000000000000001c": { - "balance": "0x1" - }, - "000000000000000000000000000000000000001d": { - "balance": "0x1" - }, - "000000000000000000000000000000000000001e": { - "balance": "0x1" - }, - "000000000000000000000000000000000000001f": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000020": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000021": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000022": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000023": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000024": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000025": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000026": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000027": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000028": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000029": { - "balance": "0x1" - }, - "000000000000000000000000000000000000002a": { - "balance": "0x1" - }, - "000000000000000000000000000000000000002b": { - "balance": "0x1" - }, - "000000000000000000000000000000000000002c": { - "balance": "0x1" - }, - "000000000000000000000000000000000000002d": { - "balance": "0x1" - }, - "000000000000000000000000000000000000002e": { - "balance": "0x1" - }, - "000000000000000000000000000000000000002f": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000030": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000031": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000032": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000033": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000034": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000035": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000036": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000037": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000038": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000039": { - "balance": "0x1" - }, - "000000000000000000000000000000000000003a": { - "balance": "0x1" - }, - "000000000000000000000000000000000000003b": { - "balance": "0x1" - }, - "000000000000000000000000000000000000003c": { - "balance": "0x1" - }, - "000000000000000000000000000000000000003d": { - "balance": "0x1" - }, - "000000000000000000000000000000000000003e": { - "balance": "0x1" - }, - "000000000000000000000000000000000000003f": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000040": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000041": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000042": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000043": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000044": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000045": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000046": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000047": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000048": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000049": { - "balance": "0x1" - }, - "000000000000000000000000000000000000004a": { - "balance": "0x1" - }, - "000000000000000000000000000000000000004b": { - "balance": "0x1" - }, - "000000000000000000000000000000000000004c": { - "balance": "0x1" - }, - "000000000000000000000000000000000000004d": { - "balance": "0x1" - }, - "000000000000000000000000000000000000004e": { - "balance": "0x1" - }, - "000000000000000000000000000000000000004f": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000050": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000051": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000052": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000053": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000054": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000055": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000056": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000057": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000058": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000059": { - "balance": "0x1" - }, - "000000000000000000000000000000000000005a": { - "balance": "0x1" - }, - "000000000000000000000000000000000000005b": { - "balance": "0x1" - }, - "000000000000000000000000000000000000005c": { - "balance": "0x1" - }, - "000000000000000000000000000000000000005d": { - "balance": "0x1" - }, - "000000000000000000000000000000000000005e": { - "balance": "0x1" - }, - "000000000000000000000000000000000000005f": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000060": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000061": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000062": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000063": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000064": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000065": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000066": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000067": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000068": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000069": { - "balance": "0x1" - }, - "000000000000000000000000000000000000006a": { - "balance": "0x1" - }, - "000000000000000000000000000000000000006b": { - "balance": "0x1" - }, - "000000000000000000000000000000000000006c": { - "balance": "0x1" - }, - "000000000000000000000000000000000000006d": { - "balance": "0x1" - }, - "000000000000000000000000000000000000006e": { - "balance": "0x1" - }, - "000000000000000000000000000000000000006f": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000070": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000071": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000072": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000073": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000074": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000075": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000076": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000077": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000078": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000079": { - "balance": "0x1" - }, - "000000000000000000000000000000000000007a": { - "balance": "0x1" - }, - "000000000000000000000000000000000000007b": { - "balance": "0x1" - }, - "000000000000000000000000000000000000007c": { - "balance": "0x1" - }, - "000000000000000000000000000000000000007d": { - "balance": "0x1" - }, - "000000000000000000000000000000000000007e": { - "balance": "0x1" - }, - "000000000000000000000000000000000000007f": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000080": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000081": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000082": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000083": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000084": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000085": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000086": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000087": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000088": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000089": { - "balance": "0x1" - }, - "000000000000000000000000000000000000008a": { - "balance": "0x1" - }, - "000000000000000000000000000000000000008b": { - "balance": "0x1" - }, - "000000000000000000000000000000000000008c": { - "balance": "0x1" - }, - "000000000000000000000000000000000000008d": { - "balance": "0x1" - }, - "000000000000000000000000000000000000008e": { - "balance": "0x1" - }, - "000000000000000000000000000000000000008f": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000090": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000091": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000092": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000093": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000094": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000095": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000096": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000097": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000098": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000099": { - "balance": "0x1" - }, - "000000000000000000000000000000000000009a": { - "balance": "0x1" - }, - "000000000000000000000000000000000000009b": { - "balance": "0x1" - }, - "000000000000000000000000000000000000009c": { - "balance": "0x1" - }, - "000000000000000000000000000000000000009d": { - "balance": "0x1" - }, - "000000000000000000000000000000000000009e": { - "balance": "0x1" - }, - "000000000000000000000000000000000000009f": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000a0": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000a1": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000a2": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000a3": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000a4": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000a5": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000a6": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000a7": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000a8": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000a9": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000aa": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000ab": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000ac": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000ad": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000ae": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000af": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000b0": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000b1": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000b2": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000b3": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000b4": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000b5": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000b6": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000b7": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000b8": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000b9": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000ba": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000bb": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000bc": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000bd": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000be": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000bf": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000c0": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000c1": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000c2": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000c3": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000c4": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000c5": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000c6": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000c7": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000c8": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000c9": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000ca": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000cb": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000cc": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000cd": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000ce": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000cf": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000d0": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000d1": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000d2": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000d3": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000d4": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000d5": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000d6": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000d7": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000d8": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000d9": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000da": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000db": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000dc": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000dd": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000de": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000df": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000e0": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000e1": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000e2": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000e3": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000e4": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000e5": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000e6": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000e7": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000e8": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000e9": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000ea": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000eb": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000ec": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000ed": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000ee": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000ef": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000f0": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000f1": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000f2": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000f3": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000f4": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000f5": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000f6": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000f7": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000f8": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000f9": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000fa": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000fb": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000fc": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000fd": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000fe": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000ff": { - "balance": "0x1" - }, - "5b72551fc886e8dc264b4382811e596291c0bfd4": { - "balance": "0x200000000000000000000000000000000000000000000000000000000000000" - } - }, - "number": "0x0", - "gasUsed": "0x0", - "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "baseFeePerGas": null -} diff --git a/light-client-poc/src/circuit/mod.rs b/light-client-poc/src/circuit/mod.rs deleted file mode 100644 index cdd773caf1..0000000000 --- a/light-client-poc/src/circuit/mod.rs +++ /dev/null @@ -1,11 +0,0 @@ -mod equal_words; -mod prover; -mod state_update; -mod witness; - -pub use prover::StateUpdateCircuitKeys; - -pub use state_update::{ - StateUpdateCircuit, DEFAULT_CIRCUIT_DEGREE, DEFAULT_MAX_NODES, DEFAULT_MAX_PROOF_COUNT, -}; -pub use witness::{PublicInputs, StateUpdateWitness}; diff --git a/light-client-poc/src/circuit/prover.rs b/light-client-poc/src/circuit/prover.rs deleted file mode 100644 index 40a52a56ca..0000000000 --- a/light-client-poc/src/circuit/prover.rs +++ /dev/null @@ -1,162 +0,0 @@ -use eyre::Result; -use halo2_proofs::{dev::MockProver, halo2curves::bn256::Fr, plonk::Circuit, SerdeFormat}; -use rand::SeedableRng; -use rand_chacha::ChaCha20Rng; -use std::time::Instant; - -use super::witness::PublicInputs; -use halo2_proofs::{ - halo2curves::bn256::{Bn256, G1Affine}, - plonk::{create_proof, keygen_pk, keygen_vk, verify_proof, ProvingKey}, - poly::{ - commitment::ParamsProver, - kzg::{ - commitment::{KZGCommitmentScheme, ParamsKZG, ParamsVerifierKZG}, - multiopen::{ProverSHPLONK, VerifierSHPLONK}, - strategy::SingleStrategy, - }, - }, - transcript::{ - Blake2bRead, Blake2bWrite, Challenge255, TranscriptReadBuffer, TranscriptWriterBuffer, - }, -}; - -use super::state_update::StateUpdateCircuit; - -#[derive(Clone)] -pub struct StateUpdateCircuitKeys { - general_params: ParamsKZG, - verifier_params: ParamsVerifierKZG, - pk: ProvingKey, -} - -impl StateUpdateCircuitKeys { - pub fn new(circuit: &StateUpdateCircuit) -> StateUpdateCircuitKeys { - let mut rng = ChaCha20Rng::seed_from_u64(42); - - let start = Instant::now(); - - // let circuit = StateUpdateCircuit::default(); - - let general_params = ParamsKZG::::setup(circuit.degree as u32, &mut rng); - let verifier_params: ParamsVerifierKZG = general_params.verifier_params().clone(); - - // Initialize the proving key - let vk = keygen_vk(&general_params, circuit).expect("keygen_vk should not fail"); - let pk = keygen_pk(&general_params, vk, circuit).expect("keygen_pk should not fail"); - - println!("key generation time: {:?}", start.elapsed()); - - StateUpdateCircuitKeys { - general_params, - verifier_params, - pk, - } - } - - pub fn serialize(&self) -> Result> { - let mut buffer = Vec::new(); - self.general_params - .write_custom(&mut buffer, SerdeFormat::RawBytes)?; - self.verifier_params - .write_custom(&mut buffer, SerdeFormat::RawBytes)?; - self.pk.write(&mut buffer, SerdeFormat::RawBytes).unwrap(); - Ok(buffer) - } - - pub fn unserialize(mut bytes: &[u8]) -> Result { - let general_params = ParamsKZG::::read_custom(&mut bytes, SerdeFormat::RawBytes)?; - let verifier_params = - ParamsVerifierKZG::::read_custom(&mut bytes, SerdeFormat::RawBytes)?; - let circuit_params = StateUpdateCircuit::::default().params(); - let pk = ProvingKey::::read::<_, StateUpdateCircuit>( - &mut bytes, - SerdeFormat::RawBytes, - circuit_params, - )?; - Ok(Self { - general_params, - verifier_params, - pk, - }) - } -} - -impl StateUpdateCircuit { - pub fn assert_satisfied(&self) { - let num_rows: usize = self - .mpt_circuit - .nodes - .iter() - .map(|node| node.values.len()) - .sum(); - - let public_inputs: PublicInputs = (&self.lc_witness).into(); - - for (i, input) in public_inputs.iter().enumerate() { - println!("input[{i:}]: {input:?}"); - } - - let prover = - MockProver::::run(self.degree as u32, self, vec![public_inputs.0]).unwrap(); - prover.assert_satisfied_at_rows(0..num_rows, 0..num_rows); - } - - pub fn prove(self, keys: &StateUpdateCircuitKeys) -> Result> { - let rng = ChaCha20Rng::seed_from_u64(42); - - // Create a proof - let mut transcript = Blake2bWrite::<_, G1Affine, Challenge255<_>>::init(vec![]); - - let public_inputs: PublicInputs = (&self.lc_witness).into(); - - // Bench proof generation time - let start = Instant::now(); - create_proof::< - KZGCommitmentScheme, - ProverSHPLONK<'_, Bn256>, - Challenge255, - ChaCha20Rng, - Blake2bWrite, G1Affine, Challenge255>, - StateUpdateCircuit, - >( - &keys.general_params, - &keys.pk, - &[self], - &[&[&public_inputs]], - rng, - &mut transcript, - )?; - - let proof = transcript.finalize(); - - println!("proof generation time: {:?}", start.elapsed()); - - Ok(proof) - } - - pub fn verify(proof: &[u8], public_inputs: &[Fr], keys: &StateUpdateCircuitKeys) -> Result<()> { - // Bench verification time - let start = Instant::now(); - let mut verifier_transcript = Blake2bRead::<_, G1Affine, Challenge255<_>>::init(proof); - let strategy = SingleStrategy::new(&keys.general_params); - - verify_proof::< - KZGCommitmentScheme, - VerifierSHPLONK<'_, Bn256>, - Challenge255, - Blake2bRead<&[u8], G1Affine, Challenge255>, - SingleStrategy<'_, Bn256>, - >( - &keys.verifier_params, - keys.pk.get_vk(), - strategy, - &[&[public_inputs]], - &mut verifier_transcript, - )?; - - println!("verification time: {:?}", start.elapsed()); - - Ok(()) - } -} diff --git a/light-client-poc/src/main.rs b/light-client-poc/src/main.rs deleted file mode 100644 index 86eec519ef..0000000000 --- a/light-client-poc/src/main.rs +++ /dev/null @@ -1,11 +0,0 @@ -use eyre::Result; - -pub mod circuit; -pub mod server; -pub mod tests; -pub mod utils; - -#[tokio::main] -async fn main() -> Result<()> { - server::serve().await -} diff --git a/light-client-poc/src/server.rs b/light-client-poc/src/server.rs deleted file mode 100644 index c9b68c616b..0000000000 --- a/light-client-poc/src/server.rs +++ /dev/null @@ -1,85 +0,0 @@ -use eth_types::{Address, U64}; -use ethers::{ - providers::Middleware, - types::{transaction::eip2718::TypedTransaction, TransactionRequest}, -}; -use eyre::Result; -use halo2_proofs::halo2curves::bn256::Fr; -use std::{collections::HashMap, str::FromStr, time::SystemTime}; - -use crate::circuit::{ - PublicInputs, StateUpdateCircuit, StateUpdateCircuitKeys, StateUpdateWitness, - DEFAULT_CIRCUIT_DEGREE, DEFAULT_MAX_NODES, DEFAULT_MAX_PROOF_COUNT, -}; - -pub async fn serve() -> Result<()> { - const PROVIDER_URL: &str = "http://localhost:8545"; - const PVK: &str = "7ccb34dc5fd31fd0aa7860de89a4adc37ccb34dc5fd31fd0aa7860de89a4adc3"; - - let client = crate::utils::new_eth_signer_client(PROVIDER_URL, PVK).await?; - - let mut keys = None; - - let mut storage = HashMap::new(); - let mut last_processed_block = U64::from(1); - - loop { - let current_block = client.get_block_number().await.unwrap(); - if current_block <= last_processed_block { - std::thread::sleep(std::time::Duration::from_secs(1)); - let to = format!( - "0x{:040x}", - SystemTime::now() - .duration_since(SystemTime::UNIX_EPOCH) - .unwrap() - .as_millis() - ); - let tx = TransactionRequest::new() - .to(Address::from_str(&to).unwrap()) - .value(1); - - client - .send_transaction(TypedTransaction::Legacy(tx), None) - .await? - .await?; - continue; - } - - println!("Processing block {}", last_processed_block); - - last_processed_block = last_processed_block + 1; - - let witness = StateUpdateWitness::::build( - client.clone(), - PROVIDER_URL, - last_processed_block, - None, - ) - .await?; - - let Some(witness) = witness else { - continue; - }; - - let public_inputs: PublicInputs = (&witness.lc_witness).into(); - let circuit = StateUpdateCircuit::new( - witness, - DEFAULT_CIRCUIT_DEGREE, - DEFAULT_MAX_NODES, - DEFAULT_MAX_PROOF_COUNT, - )?; - - println!("trns: {:#?}", circuit.transforms); - - circuit.assert_satisfied(); - - if keys.is_none() { - keys = Some(StateUpdateCircuitKeys::new(&circuit)); - } - - let proof = circuit.prove(keys.as_ref().unwrap())?; - StateUpdateCircuit::verify(&proof, &public_inputs, keys.as_ref().unwrap())?; - - storage.insert(last_processed_block, proof); - } -} diff --git a/light-client-poc/src/tests/contract.rs b/light-client-poc/src/tests/contract.rs deleted file mode 100644 index a48df356e9..0000000000 --- a/light-client-poc/src/tests/contract.rs +++ /dev/null @@ -1,115 +0,0 @@ -#![allow(dead_code)] -#![allow(unused_imports)] - -use crate::utils::MM; -use ethers::{ - core::types::transaction::eip2930::AccessList, - middleware::SignerMiddleware, - prelude::{ - k256::{ecdsa::SigningKey, schnorr::signature::Verifier, Secp256k1}, - *, - }, - providers::{Http, Middleware, Provider}, - signers::{LocalWallet, Signer}, - solc, - types::{transaction::eip2930::AccessListItem, TransactionRequest}, - utils::format_units, -}; -use eyre::Result; -use num_enum::IntoPrimitive; -use std::{ - collections::{HashMap, HashSet}, - convert::TryFrom, - str::FromStr, - sync::Arc, - time::Duration, -}; - -const SIMPLE_STORAGE_SOL: &str = r#" -// SPDX-License-Identifier: Unlicense -pragma solidity ^0.8.0; - -contract SimpleStorage { - constructor() payable { - set(0xcafe, 0xbabe); - } - function get(uint k) view public returns (uint) { - uint v; - assembly { - v := sload(k) - } - return v; - } - function set(uint k, uint v) payable public { - assembly { - sstore(k,v) - } - } -} -"#; - -abigen!( - SimpleStorage, - r"[ - function get(uint k) view returns (uint) - function set(uint k, uint v) public -]" -); - -pub(crate) struct Contract { - pub contract: SimpleStorage, - pub receipt: TransactionReceipt, -} - -impl Contract { - pub async fn deploy(client: Arc) -> Result { - let contract = "SimpleStorage"; - - let mut path = std::env::temp_dir(); - path.push("SimpleStorage.sol"); - - std::fs::write(&path, SIMPLE_STORAGE_SOL)?; - - // compile it - - let compiler_input = CompilerInput::new(path)? - .remove(0) - .evm_version(EvmVersion::Paris); - let compiled = Solc::default().compile_exact(&compiler_input)?; - - let (abi, bytecode, _runtime_bytecode) = compiled - .find(contract) - .expect("could not find contract") - .into_parts_or_default(); - - println!("deploying contract"); - - let factory = ContractFactory::new(abi.clone(), bytecode.clone(), client.clone()); - let deployer = factory.deploy(())?.legacy(); - - let (contract, receipt) = deployer.send_with_receipt().await?; - - let address = contract.address(); - - let contract = SimpleStorage::new(address, client.clone()); - - Ok(Self { contract, receipt }) - } - - pub async fn get(&self, key: U256) -> Result { - let value = self.contract.get(key).call().await?; - Ok(value) - } - - pub async fn set(&self, key: U256, value: U256) -> Result { - let tx: TransactionReceipt = self - .contract - .set(key, value) - .legacy() - .send() - .await? - .await? - .unwrap(); - Ok(tx) - } -} diff --git a/light-client-poc/src/tests/local.rs b/light-client-poc/src/tests/local.rs deleted file mode 100644 index ac1f9ef5ef..0000000000 --- a/light-client-poc/src/tests/local.rs +++ /dev/null @@ -1,65 +0,0 @@ -#[cfg(test)] -mod tests { - use ethers::prelude::*; - use eyre::Result; - use halo2_proofs::halo2curves::bn256::Fr; - use std::sync::Arc; - - use crate::{ - circuit::StateUpdateWitness, - utils::{new_eth_signer_client, verify_mpt_witness, MM}, - }; - - const PVK: &str = "7ccb34dc5fd31fd0aa7860de89a4adc37ccb34dc5fd31fd0aa7860de89a4adc3"; - const PROVIDER_URL: &str = "http://localhost:8545"; - - async fn local_test_proof( - test: &str, - client: &Arc, - provider_url: &str, - recipt: &TransactionReceipt, - ) -> Result<()> { - println!("Running test {}", test); - - let witness = StateUpdateWitness::::build( - client.clone(), - provider_url, - recipt.block_number.unwrap(), - None, - ) - .await? - .unwrap(); - println!("trns: {:#?}", witness.transforms); - verify_mpt_witness(witness.mpt_witness) - } - - async fn run_localnode_test() -> Result<()> { - let client = new_eth_signer_client(PROVIDER_URL, PVK).await?; - - // test contract creation - let contract = crate::tests::contract::Contract::deploy(client.clone()).await?; - local_test_proof( - "contract creation", - &client, - PROVIDER_URL, - &contract.receipt, - ) - .await?; - - // test set value - let receipt = contract.set(0xad41a.into(), 0xcafe.into()).await?; - local_test_proof("test set slot", &client, PROVIDER_URL, &receipt).await?; - - // test unset value - let receipt = contract.set(0xad41a.into(), 0.into()).await?; - local_test_proof("test remove slot", &client, PROVIDER_URL, &receipt).await?; - - Ok(()) - } - - #[ignore] - #[tokio::test] - async fn test_local() { - run_localnode_test().await.unwrap(); - } -} diff --git a/light-client-poc/src/tests/mainnet.rs b/light-client-poc/src/tests/mainnet.rs deleted file mode 100644 index 6910b7e480..0000000000 --- a/light-client-poc/src/tests/mainnet.rs +++ /dev/null @@ -1,282 +0,0 @@ -#[cfg(test)] -mod test { - use ethers::{ - prelude::*, - types::transaction::eip2930::{AccessList, AccessListItem}, - }; - use eyre::Result; - use halo2_proofs::halo2curves::bn256::Fr; - use std::{collections::HashMap, str::FromStr}; - - use crate::circuit::{ - PublicInputs, StateUpdateCircuit, StateUpdateCircuitKeys, StateUpdateWitness, - DEFAULT_CIRCUIT_DEGREE, DEFAULT_MAX_NODES, DEFAULT_MAX_PROOF_COUNT, - }; - - #[ctor::ctor] - fn init_env_logger() { - // Enable RUST_LOG during tests - env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("error")).init(); - } - - async fn mock_prove( - block_no: u64, - access_list: &[(&str, Vec<&str>)], - degree: usize, - max_nodes: usize, - max_proof_count: usize, - ) -> Result> { - const PVK: &str = "7ccb34dc5fd31fd0aa7860de89a4adc37ccb34dc5fd31fd0aa7860de89a4adc3"; - let provider_url: String = std::env::var("PROVIDER_URL").expect( - "PROVIDER_URL environment var should be set with a valid mainnet RPC-JSON provider", - ); - let client = crate::utils::new_eth_signer_client(&provider_url, PVK).await?; - - let access_list = AccessList( - access_list - .iter() - .map(|(addr, storage_keys)| AccessListItem { - address: Address::from_str(addr).unwrap(), - storage_keys: storage_keys - .iter() - .map(|k| H256::from_str(k).unwrap()) - .collect(), - }) - .collect(), - ); - let witness = StateUpdateWitness::::build( - client.clone(), - &provider_url, - U64::from(block_no), - Some(access_list), - ) - .await? - .unwrap(); - - println!("trns: {:#?}", witness.transforms); - - let circuit = StateUpdateCircuit::new(witness, degree, max_nodes, max_proof_count)?; - - circuit.assert_satisfied(); - - Ok(circuit) - } - - #[allow(clippy::complexity)] - pub fn blocks() -> HashMap)>> { - [ - // 0 txs - ( - 107, - vec![("0xd7E30ae310C1D1800F5B641Baa7af95b2e1FD98C", vec![])], - ), - // 4 transfer txs - ( - 436875, - vec![ - ("0x580992B51e3925e23280EfB93d3047C82f17E038", vec![]), - ("0x52bc44d5378309EE2abF1539BF71dE1b7d7bE3b5", vec![]), - ("0x15ac3b6F90549FFBE4091177B1795B3d4C11A59e", vec![]), - ("0x72382223a91051A54c69759BE3c93048235EfC43", vec![]), - ], - ), - // TheDAO, 4 storage changes - ( - 2000007, - vec![ - ("0x61C808D82A3Ac53231750daDc13c777b59310bD9", vec![]), // coinbase - ("0xDf21fA922215B1a56f5a6D6294E6E36c85A0Acfb", vec![]), // tx1 from - ( - "0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413", - vec![ - "0x0db619cb4b09b98626d1a90813a5566d6ae59d0a68df3e729f07a4cf6a7169fe", - "0x28f0a29873c622b02659ae6083b0cf3fb2c44358fa1b0c0efb89893011b2cf8b", - "0xf610712b7b4266f7fbc44538628f0ffdcb93c6d56f73a4dfeb041befdf2c9058", - "0xf903a85392f66de7c382c130eb51940c4bfed2038df5c108d8c0115c24efcc94", - ], - ), // tx1 to - ], - ), - // TheDAO. Storage does not exist - ( - 2000070, - vec![ - ("0x1a060B0604883A99809eB3F798DF71BEf6c358f1", vec![]), // coinbase - ("0xEd8387812f6477a421f2a16975a6121FC91933e6", vec![]), // tx1 from - ( - "0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413", - vec![ - "0x4312ad16021fb135960665020d410e3ca0e42488b684d61315e73d368c7182ad", - "0x83390858478ca0e9bd8e0b6f9c61cb360f78d42e5c5c2908d9a885b766925386", - ], - ), // tx1 to - ], - ), - // A complex block - ( - 2000004, - vec![ - ("0x4Bb96091Ee9D802ED039C4D1a5f6216F90f81B01", vec![]), // coinbase - ("0x8975dBC1b8F25EC994815626D070899ddA896511", vec![]), // tx 0 - ("0xb2e3732C0B0eC387962f76fA4F1BB9325089C5E0", vec![]), - ("0xeD059bc543141c8C93031d545079b3Da0233B27f", vec![]), // tx 1 - ("0xEc9F6c9634165f91e22E58B90e3EdE393d959E47", vec![]), - ( - "0xcaac46d9bd68bffb533320545a90cd92c6e98e58", - vec![ - "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000000000000000000000000000000000000000000001", - ], - ), - ( - "0xec9f6c9634165f91e22e58b90e3ede393d959e47", - vec![ - "0x0000000000000000000000000000000000000000000000000000000000000003", - "0x19da5b482fc1817af240c411d7423a456cdcf4a213e9f192aca5c80a39a4a733", - ], - ), - ("0xF05C1b271D12b7ECB3b37122730C085ec2C0B552", vec![]), // tx 2 - ("0x4FDf5371f7fFA04866f696882Db659fE38f52559", vec![]), - ("0xBef52Af092Fa2349279f7A2B10779FE810785688", vec![]), // tx 3 - ("0x24F21c22F0e641e2371F04a7bB8d713f89f53550", vec![]), - ], - ), - ] - .into_iter() - .collect() - } - - #[ignore] - #[tokio::test] - async fn test_block_436875() -> Result<()> { - let block_no = 436875; - let access_list = blocks().get(&block_no).unwrap().clone(); - let _ = mock_prove( - block_no, - &access_list, - 16, - DEFAULT_MAX_NODES, - DEFAULT_MAX_PROOF_COUNT, - ) - .await?; - Ok(()) - } - - #[ignore] - #[tokio::test] - async fn test_block_107() -> Result<()> { - let block_no = 107; - let access_list = blocks().get(&block_no).unwrap().clone(); - let _ = mock_prove( - block_no, - &access_list, - 15, - DEFAULT_MAX_NODES, - DEFAULT_MAX_PROOF_COUNT, - ) - .await?; - Ok(()) - } - - #[ignore] - #[tokio::test] - async fn test_reuse_proving_keys() -> Result<()> { - let block_no = 107; - let access_list = blocks().get(&block_no).unwrap().clone(); - - let circuit = mock_prove( - block_no, - &access_list, - 15, - DEFAULT_MAX_NODES, - DEFAULT_MAX_PROOF_COUNT, - ) - .await?; - let public_inputs: PublicInputs = (&circuit.lc_witness).into(); - - let keys = StateUpdateCircuitKeys::new(&circuit); - let proof = circuit.prove(&keys)?; - - let keys = StateUpdateCircuitKeys::unserialize(&keys.serialize()?)?; - - StateUpdateCircuit::verify(&proof, &public_inputs, &keys)?; - - let block_no = 436875; - let access_list = blocks().get(&block_no).unwrap().clone(); - - let circuit = mock_prove( - block_no, - &access_list, - DEFAULT_CIRCUIT_DEGREE, - DEFAULT_MAX_NODES, - DEFAULT_MAX_PROOF_COUNT, - ) - .await?; - let mut public_inputs: PublicInputs = (&circuit.lc_witness).into(); - - let proof = circuit.prove(&keys)?; - - StateUpdateCircuit::verify(&proof, &public_inputs, &keys)?; - - // ok, check also modifying public inputs to check if fails - - for i in 0..public_inputs.len() { - public_inputs.0[i] += Fr::one(); - let _ = StateUpdateCircuit::verify(&proof, &public_inputs, &keys) - .err() - .unwrap(); - println!("public input: {}", i); - public_inputs.0[i] -= Fr::one(); - } - - Ok(()) - } - - #[ignore] - #[tokio::test] - async fn test_block_2000007() -> Result<()> { - let block_no = 2000007; - let access_list = blocks().get(&block_no).unwrap().clone(); - let _ = mock_prove( - block_no, - &access_list, - 18, - DEFAULT_MAX_NODES, - DEFAULT_MAX_PROOF_COUNT, - ) - .await?; - Ok(()) - } - - #[ignore] - #[tokio::test] - async fn test_block_2000004() -> Result<()> { - let block_no = 2000004; - let access_list = blocks().get(&block_no).unwrap().clone(); - let _ = mock_prove( - block_no, - &access_list, - 18, - DEFAULT_MAX_NODES, - DEFAULT_MAX_PROOF_COUNT, - ) - .await?; - Ok(()) - } - - #[ignore] - #[tokio::test] - async fn test_block_2000070() -> Result<()> { - let block_no = 2000070; - let access_list = blocks().get(&block_no).unwrap().clone(); - let _ = mock_prove( - block_no, - &access_list, - 18, - DEFAULT_MAX_NODES, - DEFAULT_MAX_PROOF_COUNT, - ) - .await?; - Ok(()) - } -} diff --git a/light-client-poc/src/tests/mod.rs b/light-client-poc/src/tests/mod.rs deleted file mode 100644 index 73f179ccfe..0000000000 --- a/light-client-poc/src/tests/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod contract; -pub mod local; -pub mod mainnet; diff --git a/light-client-poc/src/utils.rs b/light-client-poc/src/utils.rs deleted file mode 100644 index 384e9dd221..0000000000 --- a/light-client-poc/src/utils.rs +++ /dev/null @@ -1,188 +0,0 @@ -use ethers::{ - middleware::SignerMiddleware, - prelude::{k256::ecdsa::SigningKey, *}, - providers::{Http, Middleware, Provider}, - signers::{LocalWallet, Signer}, - utils::format_units, -}; -use eyre::Result; -use halo2_proofs::{dev::MockProver, halo2curves::bn256::Fr}; - -use std::{convert::TryFrom, sync::Arc, time::Duration}; -use zkevm_circuits::mpt_circuit::witness_row::*; - -pub fn print_nodes(node: &[Node]) { - for n in node { - println!("node:"); - if let Some(start) = &n.start { - println!(" start:"); - println!(" proof_type: {:?}", start.proof_type); - println!( - " disable_preimage_check: {:?}", - start.disable_preimage_check - ); - } - if let Some(extension_branch) = &n.extension_branch { - println!(" extension_branch:"); - println!(" is_extension: {:?}", extension_branch.is_extension); - println!( - " is_placeholder: {:?}", - extension_branch.is_placeholder - ); - println!(" extension:"); - println!( - " list_rlp_bytes: {}", - hex::encode(&extension_branch.extension.list_rlp_bytes.to_vec()) - ); - println!(" branch:"); - println!( - " modified_index: {}", - extension_branch.branch.modified_index - ); - println!( - " drifted_index: {}", - extension_branch.branch.drifted_index - ); - println!( - " list_rlp_bytes[0]: {}", - hex::encode(&extension_branch.branch.list_rlp_bytes[0].to_vec()) - ); - println!( - " list_rlp_bytes[1]: {}", - hex::encode(&extension_branch.branch.list_rlp_bytes[1].to_vec()) - ); - } - if let Some(account) = &n.account { - println!(" account:"); - println!(" address: {}", hex::encode(&*account.address)); - println!(" key: {}", hex::encode(&account.key.to_vec())); - println!( - " list_rlp_bytes[0]: {}", - hex::encode(&account.list_rlp_bytes[0].to_vec()) - ); - println!( - " list_rlp_bytes[1]: {}", - hex::encode(&account.list_rlp_bytes[1].to_vec()) - ); - println!( - " value_rlp_bytes[0]: {}", - hex::encode(&account.value_rlp_bytes[0].to_vec()) - ); - println!( - " value_rlp_bytes[1]: {}", - hex::encode(&account.value_rlp_bytes[1].to_vec()) - ); - println!( - " value_list_rlp_bytes[0]: {}", - hex::encode(&account.value_list_rlp_bytes[0].to_vec()) - ); - println!( - " value_list_rlp_bytes[1]: {}", - hex::encode(&account.value_list_rlp_bytes[1].to_vec()) - ); - println!( - " drifted_rlp_bytes: {}", - hex::encode(&account.drifted_rlp_bytes.to_vec()) - ); - println!( - " wrong_rlp_bytes: {}", - hex::encode(&account.wrong_rlp_bytes.to_vec()) - ); - } - - if let Some(storage) = &n.storage { - println!(" storage:"); - println!(" address: {}", hex::encode(&*storage.address)); - println!(" key: {}", hex::encode(&storage.key.to_vec())); - println!( - " list_rlp_bytes[0]: {}", - hex::encode(&storage.list_rlp_bytes[0].to_vec()) - ); - println!( - " list_rlp_bytes[1]: {}", - hex::encode(&storage.list_rlp_bytes[1].to_vec()) - ); - println!( - " value_rlp_bytes[0]: {}", - hex::encode(&storage.value_rlp_bytes[0].to_vec()) - ); - println!( - " value_rlp_bytes[1]: {}", - hex::encode(&storage.value_rlp_bytes[1].to_vec()) - ); - println!( - " drifted_rlp_bytes: {}", - hex::encode(&storage.drifted_rlp_bytes.to_vec()) - ); - println!( - " wrong_rlp_bytes: {}", - hex::encode(&storage.wrong_rlp_bytes.to_vec()) - ); - } - println!(" values:"); - for (idx, value) in n.values.iter().enumerate() { - println!(" [{}]: {}", idx, hex::encode(value.to_vec())); - } - - println!(" keccak_data:"); - for (idx, value) in n.keccak_data.iter().enumerate() { - println!(" [{}]: {}", idx, hex::encode(value.to_vec())); - } - } -} - -pub fn verify_mpt_witness(nodes: Vec) -> Result<()> { - // get the number of rows in the witness - let num_rows: usize = nodes.iter().map(|node| node.values.len()).sum(); - - // populate the keccak data - let mut keccak_data = vec![]; - for node in nodes.iter() { - for k in node.keccak_data.iter() { - keccak_data.push(k.to_vec()); - } - } - - // verify the circuit - let disable_preimage_check = nodes[0].start.clone().unwrap().disable_preimage_check; - let degree = 15; - let max_nodes = 520; - let circuit = zkevm_circuits::mpt_circuit::MPTCircuit:: { - nodes, - keccak_data, - degree, - max_nodes, - disable_preimage_check, - _marker: std::marker::PhantomData, - }; - - let prover = MockProver::::run(degree as u32, &circuit, vec![]).unwrap(); - assert_eq!(prover.verify_at_rows(0..num_rows, 0..num_rows,), Ok(())); - - println!("success!"); - - Ok(()) -} - -pub type MM = SignerMiddleware, Wallet>; - -pub async fn new_eth_signer_client(provider_url: &str, pvk: &str) -> Result> { - let provider: Provider = - Provider::::try_from(provider_url)?.interval(Duration::from_millis(10u64)); - let chain_id = provider.get_chainid().await?.as_u64(); - - let wallet = pvk.parse::()?; - let client = Arc::new(SignerMiddleware::new( - provider, - wallet.with_chain_id(chain_id), - )); - let balance = client.get_balance(client.address(), None).await?; - - println!( - "address {:?} , balance {}ETH", - client.address(), - format_units(balance, "ether")? - ); - - Ok(client) -} diff --git a/light-client-poc/start-go-ethereum.sh b/light-client-poc/start-go-ethereum.sh deleted file mode 100755 index ca135f853a..0000000000 --- a/light-client-poc/start-go-ethereum.sh +++ /dev/null @@ -1,17 +0,0 @@ -GETH=go-ethereum -DATA=./go-ethereum-data - -# clean up -rm access-list-* -rm -rf $DATA/geth - -# build geth -(cd $GETH && make) -$GETH/build/bin/geth --datadir $DATA init $DATA/zklight.json - -# set password for keystore -echo zklight > /tmp/passwd -echo >> /tmp/passwd - -# run node -$GETH/build/bin/geth --rpc.enabledeprecatedpersonal --datadir $DATA --bootnodes=enode://9bbc27c01a26835e18bfeb08a2c304fff29e406e94210a16d7d3ed09291b8a9c86193de027449eec8e0fbb4ee1b81f77686acbdffc8fd3522681739edfde5abb@127.0.0.1:0?discport=30301 --mine --miner.etherbase=0x5b72551fc886e8dc264b4382811e596291c0bfd4 --unlock=0x5b72551fc886e8dc264b4382811e596291c0bfd4 --http --http.port 8545 --http.api "eth,net,web3,txpool" --http.corsdomain '*' --http.vhosts '*' --allow-insecure-unlock $* < /tmp/passwd diff --git a/light-client-poc/test.sh b/light-client-poc/test.sh deleted file mode 100755 index b789008a97..0000000000 --- a/light-client-poc/test.sh +++ /dev/null @@ -1 +0,0 @@ -cargo test --release -- --test-threads=1 diff --git a/mock/src/test_ctx.rs b/mock/src/test_ctx.rs index 23c3e38218..164b27e589 100644 --- a/mock/src/test_ctx.rs +++ b/mock/src/test_ctx.rs @@ -80,7 +80,7 @@ pub struct TestContext { /// Account list pub accounts: [Account; NACC], /// history hashes contains most recent 256 block hashes in history, where - /// the lastest one is at history_hashes[history_hashes.len() - 1]. + /// the latest one is at history_hashes[history_hashes.len() - 1]. pub history_hashes: Vec, /// Block from geth pub eth_block: eth_types::Block, @@ -172,7 +172,7 @@ impl TestContext { } } -/// Collection of helper functions which contribute to specific rutines on the +/// Collection of helper functions which contribute to specific routines on the /// builder pattern used to construct [`TestContext`]s. pub mod helpers { use super::*; diff --git a/mpt-witness-generator/.github/workflows/go.yml b/mpt-witness-generator/.github/workflows/go.yml deleted file mode 100644 index 35860814a3..0000000000 --- a/mpt-witness-generator/.github/workflows/go.yml +++ /dev/null @@ -1,33 +0,0 @@ -# This workflow will build a golang project -# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-go - -name: Go - -on: - push: - branches: [ "main" ] - pull_request: - branches: [ "main" ] - -jobs: - - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - - name: Set up Go - uses: actions/setup-go@v4 - with: - go-version: '1.20' - - - name: Format - run: go fmt ./... - - - name: Build - run: go build -v ./... - - - name: Test - env: - NO_GETH: true - run: go test -v ./... diff --git a/mpt-witness-generator/.gitignore b/mpt-witness-generator/.gitignore deleted file mode 100644 index 2fc01ebc1c..0000000000 --- a/mpt-witness-generator/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -rust_call/target -.DS_Store -.vscode -mpt-witness-generator -mpt -generated_witnesses -rust_call/proof.json diff --git a/mpt-witness-generator/README.md b/mpt-witness-generator/README.md deleted file mode 100644 index 040966a9a9..0000000000 --- a/mpt-witness-generator/README.md +++ /dev/null @@ -1,124 +0,0 @@ -# Merkle Patricia Trie witness generator - -This project aims to prepare witness generator for Merkle Patricia Trie circuit which is part of -[zkevm-circuits](https://github.com/appliedzkp/zkevm-circuits). - -It is based on [geth](https://github.com/ethereum/go-ethereum). -It takes `eth_getProof` output and it transforms it into the MPT circuit witness. - -MPT circuit checks that the modification of the trie state happened correctly. - -Let us assume there are two proofs (as returned by `eth getProof`): - -- A proof that there exists value `val1` at key `key1` for address `addr` in the state trie with root `root1`. -- A proof that there exists value `val2` at key `key1` for address `addr` in the state trie with root `root2`. - -The circuit checks the transition from `val1` to `val2` at `key1` that led to the change -of trie root from `root1` to `root2`. - -For this reason, there are two parallel proofs for each trie modification. -There is `S` (as `State`) proof which presents the state of the trie -before the modification. And there is `C` (as `Change`) proof which presents the state -of the trie after modification. - -An example of `eth_getProof` output is given below: - -``` -[248 81 128 128 128 160 32 34 39 131 73 65 47 37 211 142 206 231 172 16 11 203 33 107 30 7 213 226 2 174 55 216 4 117 220 10 186 68 128 128 128 128 128 128 128 160 55 235 85 86 230 197 53 159 28 141 120 87 82 57 4 132 185 12 24 158 142 210 106 188 12 87 179 231 52 16 126 229 128 128 128 128 128] -[226 160 59 138 106 70 105 186 37 13 38 205 122 69 158 202 157 33 95 131 7 227 58 235 229 3 121 188 90 54 23 236 52 68 1] -``` - -The first element of the proof is a branch containing two children. The second element of the proof is -a storage leaf contained in the branch (from the first proof element). - -To simplify the MPT circuit, the `eth_getProof` elements are not directly used as rows. -Instead, the rows are prepared as: - -``` -[1 0 1 0 248 81 0 248 81 0 11 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] -[0 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1] -[0 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1] -[0 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1] -[0 160 32 34 39 131 73 65 47 37 211 142 206 231 172 16 11 203 33 107 30 7 213 226 2 174 55 216 4 117 220 10 186 68 0 160 32 34 39 131 73 65 47 37 211 142 206 231 172 16 11 203 33 107 30 7 213 226 2 174 55 216 4 117 220 10 186 68 1] -[0 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1] -[0 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1] -[0 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1] -[0 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1] -[0 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1] -[0 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1] -[0 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1] -[0 160 55 235 85 86 230 197 53 159 28 141 120 87 82 57 4 132 185 12 24 158 142 210 106 188 12 87 179 231 52 16 126 229 0 160 88 197 127 237 244 146 28 57 104 36 96 69 159 84 254 170 28 196 41 183 253 107 213 32 170 141 111 191 30 100 117 55 1] -[0 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1] -[0 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1] -[0 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1] -[0 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 128 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1] -[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16] -[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17] -[226 160 59 138 106 70 105 186 37 13 38 205 122 69 158 202 157 33 95 131 7 227 58 235 229 3 121 188 90 54 23 236 52 68 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2] -[1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13] -[226 160 59 138 106 70 105 186 37 13 38 205 122 69 158 202 157 33 95 131 7 227 58 235 229 3 121 188 90 54 23 236 52 68 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3] -[17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14] -[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15] -[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 19] -``` - -... - - - -## Generate witnesses - -To generate witnesses for MPT circuit, execute - -``` -go test -v ./... -``` - -To generate the tests that use a local blockchain you need a local `geth`. You would -need to run something like: -``` -geth --dev --http --ipcpath ~/Library/Ethereum/geth.ipc - -``` -The local `geth` is used to generate some tests that have a small number of accounts so that -these accounts appear in the first or second level of the trie. You might need to remove the -database if you already have some accounts: - -``` -geth removedb -``` - -The witness files will appear in generated_witnesses folder. - -## Format the code - -To format the code use: - -``` -gofmt -w ./* -``` - -## Calling from Rust - -Build: - -``` -go build -buildmode=c-archive -o libmpt.a witness_gen_wrapper.go -``` - -Copy libmpt.a and libmpt.h to rust_call/build: - -``` -mv libmpt.* rust_call/build -``` - -Note: to avoid the problem described [](https://github.com/golang/go/issues/42459), -the following has been set in rust_call/.cargo/config: - -``` -[build] -rustflags = ["-C", "link-args=-framework CoreFoundation -framework Security"] -``` diff --git a/mpt-witness-generator/go.mod b/mpt-witness-generator/go.mod deleted file mode 100644 index ce4ba3832e..0000000000 --- a/mpt-witness-generator/go.mod +++ /dev/null @@ -1,8 +0,0 @@ -module github.com/privacy-scaling-explorations/mpt-witness-generator - -go 1.16 - -require ( - github.com/ethereum/go-ethereum v1.10.8 - golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 -) diff --git a/mpt-witness-generator/go.sum b/mpt-witness-generator/go.sum deleted file mode 100644 index 950942ce26..0000000000 --- a/mpt-witness-generator/go.sum +++ /dev/null @@ -1,587 +0,0 @@ -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= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= -github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= -github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o= -github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= -github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -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/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= -github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= -github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= -github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= -github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= -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/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= -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/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= -github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= -github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= -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/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= -github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= -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= -github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -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/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= -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/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 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/cloudflare-go v0.14.0/go.mod h1:EnwdgGMaFOruiPZRFSgn+TsQ3hQ7C/YWzIGLeu5c304= -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/go.mod h1:815PAHg3wvysy0SyIqanF8gZ0Y1wjk/hrDHD/iT88+Q= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= -github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= -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 v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= -github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= -github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= -github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/dop251/goja v0.0.0-20200721192441-a695b0cdd498/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA= -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/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum/go-ethereum v1.10.8 h1:0UP5WUR8hh46ffbjJV7PK499+uGEyasRIfffS0vy06o= -github.com/ethereum/go-ethereum v1.10.8/go.mod h1:pJNuIUYfX5+JKzSD/BTdNsvJSZ1TJqmz0dVyXMAbf6M= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -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/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= -github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= -github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= -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/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-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0 h1:MP4Eh7ZCb31lleYCFuwm0oe4/YGak+5l1vA2NOE80nA= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E= -github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-sourcemap/sourcemap v2.1.2+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 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= -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/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -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/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -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.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.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -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 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -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/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.4.1/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/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -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/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.5/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/graph-gophers/graphql-go v0.0.0-20201113091052-beb923fada29/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= -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/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.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v1.0.2/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= -github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= -github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= -github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= -github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= -github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= -github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8= -github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= -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/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= -github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= -github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -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/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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= -github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -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.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= -github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -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/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= -github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -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/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= -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.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= -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.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.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -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/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -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/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= -github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -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/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/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/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= -github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= -github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= -github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -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/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= -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_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -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/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/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/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= -github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= -github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= -github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -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.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -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.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.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/syndtr/goleveldb v1.0.1-0.20210305035536-64b5b1c73954 h1:xQdMZ1WLrgkkvOZ/LDQxjVxMLdby7osSh4ZEVa5sIjs= -github.com/syndtr/goleveldb v1.0.1-0.20210305035536-64b5b1c73954/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM= -github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= -github.com/tklauser/go-sysconf v0.3.5 h1:uu3Xl4nkLzQfXNsWn15rPc/HQCJKObbt1dKJeWp3vU4= -github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= -github.com/tklauser/numcpus v0.2.2 h1:oyhllyrScuYI6g+h/zUvNXNp1wy7x8qQy3t/piefldA= -github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= -github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= -github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= -github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -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/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -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-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -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.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -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= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -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/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-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/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -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-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-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-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-20190620200207-3b0461eec859/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-20191209160850-c0dbc17a3553/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-20200822124328-c89045814202/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-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-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d h1:20cMwl2fHAzkJMEA+8J4JgqBQcQGzbisXo31MIeenXI= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -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= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -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-20190227155943-e225da77a7e6/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= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/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/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-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/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= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/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-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-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/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-20200826173525-f9321e4c35a6/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-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-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912 h1:uCLL3g5wH2xjxVREVuAbP9JM5PPKjRbXKRa6IBjkzmU= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -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/text v0.3.0/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.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.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -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= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/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-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-20190328211700-ab21143f2384/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= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -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= -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/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= -gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -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.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/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= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -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.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -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-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -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/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= -gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= -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/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.3/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 h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -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/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/mpt-witness-generator/rustlib/Cargo.lock b/mpt-witness-generator/rustlib/Cargo.lock deleted file mode 100644 index 4d73989235..0000000000 --- a/mpt-witness-generator/rustlib/Cargo.lock +++ /dev/null @@ -1,165 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "aho-corasick" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c378d78423fdad8089616f827526ee33c19f2fddbd5de1629152c9593ba4783" -dependencies = [ - "memchr", -] - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi", - "libc", - "winapi", -] - -[[package]] -name = "cc" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] - -[[package]] -name = "env_logger" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" -dependencies = [ - "atty", - "humantime", - "log", - "regex", - "termcolor", -] - -[[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 = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - -[[package]] -name = "libc" -version = "0.2.147" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" - -[[package]] -name = "log" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" - -[[package]] -name = "memchr" -version = "2.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" - -[[package]] -name = "regex" -version = "1.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" - -[[package]] -name = "rustlib" -version = "0.1.0" -dependencies = [ - "env_logger", - "gobuild", - "log", -] - -[[package]] -name = "termcolor" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -dependencies = [ - "winapi", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/mpt-witness-generator/rustlib/Cargo.toml b/mpt-witness-generator/rustlib/Cargo.toml deleted file mode 100644 index c97215f1fb..0000000000 --- a/mpt-witness-generator/rustlib/Cargo.toml +++ /dev/null @@ -1,18 +0,0 @@ -[package] -name = "mpt-witness-generator" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html -[build-dependencies] -gobuild = "0.1.0-alpha.1" -log = "0.4.14" -env_logger = "0.9" -glob = "0.3.1" - -[dependencies] -ethers = "2.0" -num_enum = "0.7.0" -serde = "1.0.188" -serde_json = "1.0.105" -zkevm-circuits = { path = "../../zkevm-circuits", features=["test-circuits"]} diff --git a/mpt-witness-generator/rustlib/build.rs b/mpt-witness-generator/rustlib/build.rs deleted file mode 100644 index 73d6f57feb..0000000000 --- a/mpt-witness-generator/rustlib/build.rs +++ /dev/null @@ -1,47 +0,0 @@ -use std::{ - env, - io::{self, Write}, -}; - -fn main() { - let lib_name = "mpt-witness-generator"; - let out_dir = env::var("OUT_DIR").unwrap(); - - // Build - if let Err(e) = gobuild::Build::new() - .file("../witness_gen_wrapper.go") - .try_compile(lib_name) - { - // The error type is private so have to check the error string - if format!("{}", e).starts_with("Failed to find tool.") { - fail( - " Failed to find Go. Please install Go 1.16 or later \ - following the instructions at https://golang.org/doc/install. - On linux it is also likely available as a package." - .to_string(), - ); - } else { - fail(format!("{}", e)); - } - } - - // Files the lib depends on that should recompile the lib - let dep_files = glob::glob("../**/*.go").unwrap().filter_map(|v| v.ok()); - - for file in dep_files { - println!("cargo:rerun-if-changed={}", file.to_str().unwrap()); - } - - // Link - println!("cargo:rustc-link-search=native={}", out_dir); - println!("cargo:rustc-link-lib=static={}", lib_name); -} - -fn fail(message: String) { - let _ = writeln!( - io::stderr(), - "\n\nError while building geth-utils: {}\n\n", - message - ); - std::process::exit(1); -} diff --git a/mpt-witness-generator/witness/gen_witness_transactions_test.go b/mpt-witness-generator/witness/gen_witness_transactions_test.go deleted file mode 100644 index 51c10cd6dd..0000000000 --- a/mpt-witness-generator/witness/gen_witness_transactions_test.go +++ /dev/null @@ -1,80 +0,0 @@ -package witness - -import ( - "fmt" - "math/big" - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/math" - "github.com/ethereum/go-ethereum/core/rawdb" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/rlp" - "github.com/privacy-scaling-explorations/mpt-witness-generator/trie" - "github.com/privacy-scaling-explorations/mpt-witness-generator/types" -) - -func TestTransactions(t *testing.T) { - t.Skip("failing test") - txs := make([]*types.Transaction, 70) - key, _ := crypto.GenerateKey() - signer := types.LatestSigner(params.TestChainConfig) - - for i := range txs { - amount := math.BigPow(2, int64(i)) - price := big.NewInt(300000) - data := make([]byte, 100) - tx := types.NewTransaction(uint64(i), common.Address{}, amount, 123457, price, data) - signedTx, err := types.SignTx(tx, signer, key) - if err != nil { - panic(err) - } - txs[i] = signedTx - } - - db := rawdb.NewMemoryDatabase() - stackTrie := trie.NewStackTrie(db) - - stackTrie.UpdateAndGetProofs(db, types.Transactions(txs)) - - fmt.Println("===") -} - -// No update for each step, just final proof. -func TestGetProof(t *testing.T) { - txs := make([]*types.Transaction, 70) - key, _ := crypto.GenerateKey() - signer := types.LatestSigner(params.TestChainConfig) - - for i := range txs { - amount := math.BigPow(2, int64(i)) - price := big.NewInt(300000) - data := make([]byte, 100) - tx := types.NewTransaction(uint64(i), common.Address{}, amount, 123457, price, data) - signedTx, err := types.SignTx(tx, signer, key) - if err != nil { - panic(err) - } - txs[i] = signedTx - } - - db := rawdb.NewMemoryDatabase() - stackTrie := trie.NewStackTrie(db) - - // Update the trie with transactions: - types.DeriveSha(types.Transactions(txs), stackTrie) - - var indexBuf []byte - indexBuf = rlp.AppendUint64(indexBuf[:0], uint64(1)) - - proofS, err := stackTrie.GetProof(db, indexBuf) - if err != nil { - fmt.Println(err) - return - } - - fmt.Println(proofS) - - fmt.Println("===") -} diff --git a/mpt-witness-generator/witness_gen_wrapper.go b/mpt-witness-generator/witness_gen_wrapper.go deleted file mode 100644 index 7bae964e70..0000000000 --- a/mpt-witness-generator/witness_gen_wrapper.go +++ /dev/null @@ -1,51 +0,0 @@ -package main - -// #include -import "C" -import ( - "encoding/json" - "fmt" - "unsafe" - - "github.com/privacy-scaling-explorations/mpt-witness-generator/witness" -) - -type Config struct { - NodeUrl string `json:"NodeUrl"` - BlockNum int `json:"BlockNum"` - Addr string `json:"Addr"` - Keys []string `json:"Keys"` - Values []string `json:"Values"` -} - -type GetWitnessRequest struct { - BlockNum int `json:"BlockNum"` - NodeUrl string `json:"NodeUrl"` - Mods []witness.TrieModification -} - -//export GetWitness -func GetWitness(proofConf *C.char) *C.char { - var config GetWitnessRequest - - err := json.Unmarshal([]byte(C.GoString(proofConf)), &config) - if err != nil { - panic(err) - } - - fmt.Printf("%+v", config) - proof := witness.GetWitness(config.NodeUrl, config.BlockNum, config.Mods) - b, err := json.Marshal(proof) - if err != nil { - fmt.Println(err) - } - - return C.CString(string(b)) -} - -//export FreeString -func FreeString(str *C.char) { - C.free(unsafe.Pointer(str)) -} - -func main() {} diff --git a/rust-toolchain b/rust-toolchain index b6ce6a50ba..c5f610378b 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1 +1 @@ -nightly-2023-04-24 +nightly-2024-02-14 diff --git a/testool/README.md b/testool/README.md index 4a619374c5..0f389d8ad6 100644 --- a/testool/README.md +++ b/testool/README.md @@ -102,7 +102,7 @@ Sometimes there are some files or specific tests that we want to disable at all. When the command line parameter `--report` is defined, it automatically: - After the execution, a two files are created in the `report` folder. They are - - `-.hml` with the browseable results of the execution. + - `-.hml` with the browsable results of the execution. - `-.csv` with the raw results of the execution - The HTML file also contains the diff with the previous result. The previous result file is the more recent csv file with different commit from the current one diff --git a/testool/src/abi.rs b/testool/src/abi.rs index e3e9287bbb..34e1699253 100644 --- a/testool/src/abi.rs +++ b/testool/src/abi.rs @@ -15,7 +15,7 @@ pub fn encode_funccall(spec: &str) -> Result { let func_name = func_name_params[0]; let func_params = &func_name_params[1..func_name_params.len() - 1]; - // transform func_params and args into the appropiate types + // transform func_params and args into the appropriate types let map_type = |t| match t { "uint" => ParamType::Uint(256), diff --git a/testool/src/compiler.rs b/testool/src/compiler.rs index 53296cab3c..7f03d039f4 100644 --- a/testool/src/compiler.rs +++ b/testool/src/compiler.rs @@ -47,7 +47,6 @@ impl Cache { let entry = format!("{}={}\n", hex::encode(code_hash), hex::encode(&bytecode)); std::fs::OpenOptions::new() .read(true) - .write(true) .create(true) .append(true) .open(&self.path)? diff --git a/testool/src/main.rs b/testool/src/main.rs index e94bffff9d..1687af80fb 100644 --- a/testool/src/main.rs +++ b/testool/src/main.rs @@ -109,7 +109,7 @@ fn go() -> Result<()> { env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); log::info!("Using suite '{}'", args.suite); - log::info!("Parsing and compliling tests..."); + log::info!("Parsing and compiling tests..."); let compiler = Compiler::new(true, Some(PathBuf::from(CODEHASH_FILE)))?; let suite = config.suite(&args.suite)?.clone(); let state_tests = load_statetests_suite(&suite.path, config, compiler)?; diff --git a/testool/src/statetest/mod.rs b/testool/src/statetest.rs similarity index 100% rename from testool/src/statetest/mod.rs rename to testool/src/statetest.rs diff --git a/testool/src/statetest/executor.rs b/testool/src/statetest/executor.rs index 316e3e38fd..2282d41eb8 100644 --- a/testool/src/statetest/executor.rs +++ b/testool/src/statetest/executor.rs @@ -338,6 +338,7 @@ pub fn run_test( max_evm_rows: 0, max_exp_steps: 5000, max_keccak_rows: 0, + max_vertical_circuit_rows: 0, }; let block_data = BlockData::new_from_geth_data_with_params(geth_data, circuits_params); @@ -378,6 +379,7 @@ pub fn run_test( max_bytecode: 512, max_evm_rows: 0, max_keccak_rows: 0, + max_vertical_circuit_rows: 0, }; let (k, mut circuits, mut instances, _builder) = SuperCircuit::::build(geth_data, circuits_params, Fr::from(0x100)).unwrap(); diff --git a/testool/src/statetest/results.rs b/testool/src/statetest/results.rs index 98b0fa5247..e07e74c383 100644 --- a/testool/src/statetest/results.rs +++ b/testool/src/statetest/results.rs @@ -392,7 +392,6 @@ impl Results { if let Some(path) = &self.cache { let mut file = std::fs::OpenOptions::new() .read(true) - .write(true) .create(true) .append(true) .open(path)?; @@ -441,7 +440,6 @@ impl Results { if let Some(path) = &self.cache { std::fs::OpenOptions::new() .read(true) - .write(true) .create(true) .append(true) .open(path)? diff --git a/testool/src/statetest/yaml.rs b/testool/src/statetest/yaml.rs index 3fe0b2eba3..967e4ec8e8 100644 --- a/testool/src/statetest/yaml.rs +++ b/testool/src/statetest/yaml.rs @@ -410,6 +410,8 @@ impl<'a> YamlStateTestBuilder<'a> { #[cfg(test)] mod test { + use std::fmt::Display; + use super::*; use crate::{ config::TestSuite, @@ -524,9 +526,9 @@ arith: } } } - impl ToString for Template { - fn to_string(&self) -> String { - TEMPLATE + impl Display for Template { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let str = TEMPLATE .replace("{{ gas_limit }}", &self.gas_limit) .replace("{{ pre_code }}", &self.pre_code) .replace("{{ res_storage }}", &self.res_storage) @@ -540,7 +542,8 @@ arith: } else { "Istanbul" }, - ) + ); + f.write_str(&str) } } diff --git a/testool/src/utils.rs b/testool/src/utils.rs index e4e4d647ba..fca65d0de0 100644 --- a/testool/src/utils.rs +++ b/testool/src/utils.rs @@ -181,18 +181,12 @@ pub fn current_submodule_git_commit() -> Result { pub fn bytecode_of(code: &str) -> anyhow::Result { let bytecode = if let Ok(bytes) = hex::decode(code) { - match Bytecode::try_from(bytes.clone()) { - Ok(bytecode) => { - for op in bytecode.iter() { - info!("{}", op.to_string()); - } - bytecode - } - Err(err) => { - error!("Failed to parse bytecode {:?}", err); - Bytecode::from_raw_unchecked(bytes) - } + let bytecode = Bytecode::from(bytes.clone()); + + for op in bytecode.iter() { + info!("{}", op.to_string()); } + bytecode } else { let mut bytecode = Bytecode::default(); for op in code.split(',') { diff --git a/zkevm-circuits/Cargo.toml b/zkevm-circuits/Cargo.toml index 475444f48f..b48e98e538 100644 --- a/zkevm-circuits/Cargo.toml +++ b/zkevm-circuits/Cargo.toml @@ -40,6 +40,9 @@ serde = { version = "1.0.130", features = ["derive"] } serde_json = "1.0.78" thiserror = "1.0" hex = {version = "0.4.3", features = ["serde"]} +halo2-base = { git = "https://github.com/scroll-tech/halo2-lib", branch = "develop", default-features=false, features=["halo2-pse","display"] } +halo2-ecc = { git = "https://github.com/scroll-tech/halo2-lib", branch = "develop", default-features=false, features=["halo2-pse","display"] } + [target.'cfg(target_arch = "wasm32")'.dependencies] getrandom = { version = "0.2", features = ["js"] } @@ -60,7 +63,8 @@ test-circuits = [] # Test utilities for testool crate to consume test-util = ["dep:mock"] warn-unimplemented = ["eth-types/warn-unimplemented"] -stats = ["warn-unimplemented", "dep:cli-table"] +stats = ["warn-unimplemented", "dep:cli-table", "test-util", "test-circuits", "mock-challenge"] +mock-challenge = [] [[bin]] name = "stats" diff --git a/zkevm-circuits/src/bin/stats/halo2_stats.rs b/zkevm-circuits/src/bin/stats/halo2_stats.rs new file mode 100644 index 0000000000..fe17d11e3f --- /dev/null +++ b/zkevm-circuits/src/bin/stats/halo2_stats.rs @@ -0,0 +1,387 @@ +//! Utility functions and types to get circuit stats from any halo2 circuit + +use eth_types::Field; +use halo2_proofs::plonk::ConstraintSystem; +use std::collections::BTreeSet; + +// From Scroll https://github.com/scroll-tech/zkevm-circuits/blob/7d9bc181953cfc6e7baf82ff0ce651281fd70a8a/zkevm-circuits/src/util.rs#L275 +#[allow(dead_code)] +#[derive(Debug, Default)] +pub(crate) struct CircuitStats { + pub num_constraints: usize, + pub num_fixed_columns: usize, + pub num_lookups: usize, + pub num_shuffles: usize, + pub num_advice_columns: usize, + pub num_instance_columns: usize, + pub num_selectors: usize, + pub num_permutation_columns: usize, + pub degree: usize, + pub blinding_factors: usize, + pub num_challenges: usize, + pub max_phase: u8, + pub num_rotation: usize, + pub min_rotation: i32, + pub max_rotation: i32, + pub verification_msm_size: usize, + // Aux data to diff between records + num_advice_queries: usize, + num_gates: usize, +} + +impl CircuitStats { + // Peak memory analysis by Han: + // + // fn create_proof(params: &KZGParams, pk: &ProvingKey, circuit: &Circuit, instances: &[&[F]]) { + // Let: + // + // - k: log 2 of number of rows + // - n: `1 << k` + // - d: Degree of circuit + // - e: Extension magnitude, equal to `(d - 1).next_power_of_two()` + // - c_f: number of fixed columns + // - c_a: number of advice columns + // - c_i: number of instance columns + // - c_p: number of columns enabled with copy constraint + // - c_pg: number of grand product in permutation argument, equal to `div_ceil(c_p, d - 2)` + // - c_l: number of lookup argument + // + // The memory usage M.C and M.S stands for: + // + // - M.C: number of "elliptic curve points" (with symbol â—¯) + // - M.S: number of "field elements" (with symbol â–³) + // - M.E: number of "field elements" that will be extended by "* e" (with symbol ⬡) + // + // So the actual memory usage in terms of bytes will be: + // + // M = 32 * n * (2 * M.C + M.S + e * M.E) + // + // We'll ignore other values with sublinear amount to n. + // + // + // 0. In the beginning: + // + // `params` has: + // â—¯ powers_of_tau + // â—¯ ifft(powers_of_tau) + // + // M.C = 2 (+= 2) + // M.S = 0 + // M.E = 0 + // + // `pk` has: + // ⬡ l0 + // ⬡ l_last + // ⬡ l_active_row + // â–³ fixed_lagranges (c_f) + // â–³ fixed_monomials (c_f) + // ⬡ fixed_extended_lagranges (c_f) + // â–³ permutation_lagranges (c_p) + // â–³ permutation_monomials (c_p) + // ⬡ permutation_extended_lagranges (c_p) + // + // M.C = 2 + // M.S = 2 * c_f + 2 * c_p (+= 2 * c_f + 2 * c_p) + // M.E = 3 + c_f + c_p (+= 3 + c_f + c_p) + // + // And let's ignore `circuit` + // + // + // ### 1. Pad instances as lagrange form and compute its monomial form. + // + // M.C = 2 + // M.S = 2 * c_f + 2 * c_p + 2 * c_i (+= 2 * c_i) + // M.E = 3 + c_f + c_p + // ``` + // let instance_lagranges = instances.to_lagranges(); + // let instance_monomials = instance_lagranges.to_monomials(); + // ``` + // + // + // ### 2. Synthesize circuit and collect advice column values. + // + // M.C = 2 + // M.S = 2 * c_f + 2 * c_p + 2 * c_i + c_a (+= c_a) + // M.E = 3 + c_f + c_p + // ``` + // let advice_lagranges = circuit.synthesize_all_phases(); + // ``` + // + // + // ### 3. Generate permuted input and table of lookup argument. + // For each lookup argument, we have: + // + // â–³ compressed_input_lagranges - cached for later computation + // â–³ permuted_input_lagranges + // â–³ permuted_input_monomials + // â–³ compressed_table_lagranges - cached for later computation + // â–³ permuted_table_lagranges + // â–³ permuted_table_monomials + // + // M.C = 2 + // M.S = 2 * c_f + 2 * c_p + 2 * c_i + c_a + 6 * c_l (+= 6 * c_l) + // M.E = 3 + c_f + c_p + // ``` + // let ( + // compressed_input_lagranges, + // permuted_input_lagranges, + // permuted_input_monomials, + // compressed_table_lagranges, + // permuted_table_lagranges, + // permuted_table_monomials, + // ) = lookup_permuted() + // ``` + // + // + // ### 4. Generate grand products of permutation argument. + // + // M.C = 2 + // M.S = 2 * c_f + 2 * c_p + 2 * c_i + c_a + 6 * c_l + c_pg (+= c_pg) + // M.E = 3 + c_f + c_p + c_pg (+= c_pg) + // ``` + // let ( + // perm_grand_product_monomials, + // perm_grand_product_extended_lagranges, + // ) = permutation_grand_products(); + // ``` + // + // + // ### 5. Generate grand products of lookup argument. + // And then drops unnecessary lagranges values. + // + // M.C = 2 + // M.S = 2 * c_f + 2 * c_p + 2 * c_i + c_a + 3 * c_l + c_pg (-= 3 * c_l) + // M.E = 3 + c_f + c_p + c_pg + // > let lookup_product_monomials = lookup_grand_products(); + // > drop(compressed_input_lagranges); + // > drop(permuted_input_lagranges); + // > drop(compressed_table_lagranges); + // > drop(permuted_table_lagranges); + // + // + // ### 6. Generate random polynomial. + // + // M.C = 2 + // M.S = 1 + 2 * c_f + 2 * c_p + 2 * c_i + c_a + 3 * c_l + c_pg (+= 1) + // M.E = 3 + c_f + c_p + c_pg + // ``` + // let random_monomial = random(); + // ``` + // + // + // ### 7. Turn advice_lagranges into advice_monomials. + // ``` + // let advice_monomials = advice_lagranges.to_monomials(); + // drop(advice_lagranges); + // ``` + // + // + // ### 8. Generate necessary extended lagranges. + // + // M.C = 2 + // M.S = 1 + 2 * c_f + 2 * c_p + 2 * c_i + c_a + 3 * c_l + c_pg + // M.E = 3 + c_f + c_p + c_pg + c_i + c_a (+= c_i + c_a) + // ``` + // let instances_extended_lagrnages = instances_monomials.to_extended_lagranges(); + // let advice_extended_lagrnages = advice_monomials.to_extended_lagranges(); + // ``` + // + // + // ### 9. While computing the quotient, these extended lagranges: + // + // ⬡ permuted_input_extended_lagranges + // ⬡ permuted_table_extended_lagranges + // ⬡ lookup_product_extended_lagranges + // + // of each lookup argument are generated on the fly and drop before next. + // + // And 1 extra quotient_extended_lagrange is created. So the peak memory: + // + // M.C = 2 + // M.S = 1 + 2 * c_f + 2 * c_p + 2 * c_i + c_a + 3 * c_l + c_pg + // M.E = 4 + c_f + c_p + c_pg + c_i + c_a + 3 * (c_l > 0) (+= 3 * (c_l > 0) + 1) + // ``` + // let quotient_extended_lagrange = quotient_extended_lagrange(); + // ``` + // + // + // ### 10. After quotient is comuputed, drop all the other extended lagranges. + // + // M.C = 2 + // M.S = 1 + 2 * c_f + 2 * c_p + 2 * c_i + c_a + 3 * c_l + c_pg + // M.E = 4 + c_f + c_p (-= c_pg + c_i + c_a + 3 * (c_l > 0)) + // drop(instances_extended_lagrnages) + // drop(advice_extended_lagrnages) + // drop(perm_grand_product_extended_lagranges) + // + // + // ### 11. Turn quotient_extended_lagrange into monomial form. + // And then cut int `d - 1` pieces. + // + // M.C = 2 + // M.S = 2 * c_f + 2 * c_p + 2 * c_i + c_a + 3 * c_l + c_pg + d (+= d - 1) + // M.E = 3 + c_f + c_p (-= 1) + // ``` + // let quotient_monomials = quotient_monomials() + // drop(quotient_extended_lagrange) + // ``` + // + // + // ### 12. Evaluate and open all polynomial except instance ones. + // } + pub(crate) fn estimate_peak_mem(&self, k: u32) -> usize { + let field_bytes = 32; + let c_f = self.num_fixed_columns; + let c_a = self.num_advice_columns; + let c_i = self.num_instance_columns; + let c_p = self.num_permutation_columns; + let c_l = self.num_lookups; + let c_pg = c_p.div_ceil(self.degree - 2); + let e = (self.degree - 1).next_power_of_two(); + // The estimated peak memory formula comes from step 9 of the analysis, which is the step + // of proving that needs the most memory (after that step, allocations start getting freed) + + // number of "elliptic curve points" + let m_c = 2; + // number of "field elements" + let m_s = 1 + 2 * c_f + 2 * c_p + 2 * c_i + c_a + 3 * c_l + c_pg; + // number of "field elements" that will be extended by "* e" + let m_e = 4 + c_f + c_p + c_pg + c_i + c_a + 3 * (c_l > 0) as usize; + let unit = 2 * m_c + m_s + e * m_e; + unit * 2usize.pow(k) * field_bytes + } +} + +// Return the stats in `meta`, accounting only for the circuit delta from the last aggregated stats +// in `agg`. +// Adapted from Scroll https://github.com/scroll-tech/zkevm-circuits/blob/7d9bc181953cfc6e7baf82ff0ce651281fd70a8a/zkevm-circuits/src/util.rs#L294 +pub(crate) fn circuit_stats( + agg: &CircuitStats, + meta: &ConstraintSystem, +) -> CircuitStats { + let max_phase = meta + .advice_column_phase() + .iter() + .skip(agg.num_advice_columns) + .max() + .copied() + .unwrap_or_default(); + + let rotations = meta + .advice_queries() + .iter() + .skip(agg.num_advice_queries) + .map(|(_, q)| q.0) + .collect::>(); + + let degree = meta.degree(); + let num_fixed_columns = meta.num_fixed_columns() - agg.num_fixed_columns; + let num_lookups = meta.lookups().len() - agg.num_lookups; + let num_shuffles = meta.shuffles().len() - agg.num_shuffles; + let num_advice_columns = meta.num_advice_columns() - agg.num_advice_columns; + let num_instance_columns = meta.num_instance_columns() - agg.num_instance_columns; + let num_selectors = meta.num_selectors() - agg.num_selectors; + let num_permutation_columns = + meta.permutation().get_columns().len() - agg.num_permutation_columns; + + // This calculation has some differences with the Scroll implementation at + // https://github.com/scroll-tech/zkevm-circuits/blob/7d9bc181953cfc6e7baf82ff0ce651281fd70a8a/zkevm-circuits/src/util.rs#L320-L326 + // - Remove `num_instance_columns` because it doesn't contribute when using the KZG commitment + // scheme + // - Assume SHPLONK for batch opening scheme (replaces `rotations.len()` by `1`) + // - Add `degree -1` to account for quotients + // - Add `div_ceil(num_permutation_columns, degree - 2)` for permutation arguments grand + // products. + let verification_msm_size = num_advice_columns + + num_permutation_columns // Preprocessed permutation column + + num_permutation_columns.div_ceil(degree-2) // Grand product for permutations + + num_shuffles // Grand product of each shuffle + + num_selectors // Assume no selector compression (giving us an upper bound estimation) + + num_fixed_columns + // Grand product, permuted input expression and permuted table expression for each lookup + + 3 * num_lookups + + 2 // SHPLONK batch opening scheme + + (degree -1); // quotients + + CircuitStats { + num_constraints: meta + .gates() + .iter() + .skip(agg.num_gates) + .map(|g| g.polynomials().len()) + .sum::(), + num_fixed_columns, + num_lookups, + num_shuffles, + num_advice_columns, + num_instance_columns, + num_selectors, + num_permutation_columns, + degree, + blinding_factors: meta.blinding_factors(), + num_challenges: meta.num_challenges() - agg.num_challenges, + max_phase, + num_rotation: rotations.len(), + min_rotation: rotations.first().cloned().unwrap_or_default(), + max_rotation: rotations.last().cloned().unwrap_or_default(), + verification_msm_size, + num_advice_queries: meta.advice_queries().len() - agg.num_advice_queries, + num_gates: meta.gates().len() - agg.num_gates, + } +} + +pub(crate) struct StatsCollection { + aggregate: bool, + shared_cs: ConstraintSystem, + pub(crate) agg: CircuitStats, + pub(crate) list: Vec<(String, CircuitStats)>, +} + +impl StatsCollection { + // With aggregate=true, all records are overwritten each time, leading to a single + // aggregate stats that represents the final circuit. + // With aggregate=false, each record is stored in a different entry with a name, and the + // ConstraintSystem is reset so that each entry is independent. + pub(crate) fn new(aggregate: bool) -> Self { + Self { + aggregate, + shared_cs: ConstraintSystem::default(), + agg: CircuitStats::default(), + list: Vec::new(), + } + } + + // Record a shared table + pub(crate) fn record_shared(&mut self, name: &str, meta: &mut ConstraintSystem) { + // Shared tables should only add columns, and nothing more + assert_eq!(meta.lookups().len(), 0); + assert_eq!(meta.shuffles().len(), 0); + assert_eq!(meta.permutation().get_columns().len(), 0); + assert_eq!(meta.degree(), 3); // 3 comes from the permutation argument + assert_eq!(meta.blinding_factors(), 5); // 5 is the minimum blinding factor + assert_eq!(meta.advice_queries().len(), 0); + assert_eq!(meta.gates().len(), 0); + + if self.aggregate { + self.agg = circuit_stats(&CircuitStats::default(), meta); + } else { + let stats = circuit_stats(&self.agg, meta); + self.agg = circuit_stats(&CircuitStats::default(), meta); + self.list.push((name.to_string(), stats)); + // Keep the ConstraintSystem with all the tables + self.shared_cs = meta.clone(); + } + } + + // Record a subcircuit + pub(crate) fn record(&mut self, name: &str, meta: &mut ConstraintSystem) { + if self.aggregate { + self.agg = circuit_stats(&CircuitStats::default(), meta); + } else { + let stats = circuit_stats(&self.agg, meta); + self.list.push((name.to_string(), stats)); + // Revert meta to the ConstraintSystem just with the tables + *meta = self.shared_cs.clone(); + } + } +} diff --git a/zkevm-circuits/src/bin/stats/helpers.rs b/zkevm-circuits/src/bin/stats/helpers.rs index fa470f0143..4594c187e4 100644 --- a/zkevm-circuits/src/bin/stats/helpers.rs +++ b/zkevm-circuits/src/bin/stats/helpers.rs @@ -213,7 +213,7 @@ pub(crate) fn print_circuit_stats_by_states( assert_eq!(ExecState::Op(opcode), step.exec_state); let height = fn_height(&builder.block, state, step_index); - // Substract 1 to step_index to remove the `BeginTx` step, which doesn't appear + // Subtract 1 to step_index to remove the `BeginTx` step, which doesn't appear // in the geth trace. let geth_step = &block.geth_traces[0].struct_logs[step_index - 1]; assert_eq!(opcode, geth_step.op); diff --git a/zkevm-circuits/src/bin/stats/main.rs b/zkevm-circuits/src/bin/stats/main.rs index 73514d35cc..0001931035 100644 --- a/zkevm-circuits/src/bin/stats/main.rs +++ b/zkevm-circuits/src/bin/stats/main.rs @@ -1,23 +1,43 @@ +//! Build with `--features="stats"` + +mod halo2_stats; +mod helpers; + use bus_mapping::circuit_input_builder::FeatureConfig; use cli_table::{print_stdout, Cell, Style, Table}; use eth_types::{bytecode, evm_types::OpcodeId, ToWord}; use halo2_proofs::{ halo2curves::bn256::Fr, - plonk::{Circuit, ConstraintSystem}, + plonk::{Circuit, ConstraintSystem, Expression}, }; -mod helpers; +use halo2_stats::StatsCollection; use helpers::{bytecode_prefix_op_big_rws, print_circuit_stats_by_states}; use itertools::Itertools; use mock::MOCK_ACCOUNTS; -use std::env; -use zkevm_circuits::evm_circuit::{ - param::{ - LOOKUP_CONFIG, N_COPY_COLUMNS, N_PHASE1_COLUMNS, N_PHASE2_COLUMNS, N_U16_LOOKUPS, - N_U8_LOOKUPS, +use std::{array, env, iter}; +use zkevm_circuits::{ + bytecode_circuit::{BytecodeCircuitConfig, BytecodeCircuitConfigArgs}, + copy_circuit::{CopyCircuitConfig, CopyCircuitConfigArgs}, + evm_circuit::{ + param::{ + LOOKUP_CONFIG, N_COPY_COLUMNS, N_PHASE1_COLUMNS, N_PHASE2_COLUMNS, N_U16_LOOKUPS, + N_U8_LOOKUPS, + }, + step::ExecutionState, + EvmCircuit, EvmCircuitConfig, EvmCircuitConfigArgs, + }, + exp_circuit::ExpCircuitConfig, + keccak_circuit::{KeccakCircuitConfig, KeccakCircuitConfigArgs}, + pi_circuit::{PiCircuitConfig, PiCircuitConfigArgs}, + state_circuit::{StateCircuitConfig, StateCircuitConfigArgs}, + table::{ + BlockTable, BytecodeTable, CopyTable, ExpTable, KeccakTable, MptTable, RwTable, SigTable, + TxTable, UXTable, WdTable, }, - step::ExecutionState, - EvmCircuit, + tx_circuit::{TxCircuitConfig, TxCircuitConfigArgs}, + util::{chunk_ctx::ChunkContextConfig, Challenges, SubCircuitConfig}, }; + fn main() { let args: Vec = env::args().collect(); @@ -26,6 +46,7 @@ fn main() { "state" => state_states_stats(), "copy" => copy_states_stats(), "exec" => get_exec_steps_occupancy(), + "general" => general_subcircuit_stats(), &_ => unreachable!("Unsupported arg"), } } @@ -204,3 +225,201 @@ fn get_exec_steps_occupancy() { LOOKUP_CONFIG[7].1 ); } + +#[allow(unused_variables)] +fn record_stats( + stats: &mut StatsCollection, + meta: &mut ConstraintSystem, +) { + let max_txs = 1; + let max_withdrawals = 5; + let max_calldata = 32; + let mock_randomness = F::from(0x100); + let feature_config = FeatureConfig::default(); + + // Shared Tables + let tx_table = TxTable::construct(meta); + stats.record_shared("tx_table", meta); + let wd_table = WdTable::construct(meta); + stats.record_shared("wd_table", meta); + let rw_table = RwTable::construct(meta); + stats.record_shared("rw_table", meta); + let mpt_table = MptTable::construct(meta); + stats.record_shared("mpt_table", meta); + let bytecode_table = BytecodeTable::construct(meta); + stats.record_shared("bytecode_table", meta); + let block_table = BlockTable::construct(meta); + stats.record_shared("block_table", meta); + let q_copy_table = meta.fixed_column(); + let copy_table = CopyTable::construct(meta, q_copy_table); + stats.record_shared("copy_table", meta); + let exp_table = ExpTable::construct(meta); + stats.record_shared("exp_table", meta); + let keccak_table = KeccakTable::construct(meta); + stats.record_shared("keccak_table", meta); + let sig_table = SigTable::construct(meta); + stats.record_shared("sig_table", meta); + let u8_table = UXTable::construct(meta); + stats.record_shared("u8_table", meta); + let u10_table = UXTable::construct(meta); + stats.record_shared("u10_table", meta); + let u16_table = UXTable::construct(meta); + stats.record_shared("u16_table", meta); + + // Use a mock randomness instead of the randomness derived from the challenge + // (either from mock or real prover) to help debugging assignments. + let power_of_randomness: [Expression; 31] = + array::from_fn(|i| Expression::Constant(mock_randomness.pow([1 + i as u64, 0, 0, 0]))); + + let challenges = Challenges::mock( + power_of_randomness[0].clone(), + power_of_randomness[0].clone(), + ); + + let keccak_circuit = KeccakCircuitConfig::new( + meta, + KeccakCircuitConfigArgs { + keccak_table: keccak_table.clone(), + challenges: challenges.clone(), + }, + ); + stats.record("keccak", meta); + + let pi_circuit = PiCircuitConfig::new( + meta, + PiCircuitConfigArgs { + max_txs, + max_withdrawals, + max_calldata, + block_table: block_table.clone(), + tx_table: tx_table.clone(), + wd_table, + keccak_table: keccak_table.clone(), + challenges: challenges.clone(), + }, + ); + stats.record("pi", meta); + let tx_circuit = TxCircuitConfig::new( + meta, + TxCircuitConfigArgs { + tx_table: tx_table.clone(), + keccak_table: keccak_table.clone(), + challenges: challenges.clone(), + }, + ); + stats.record("tx", meta); + let bytecode_circuit = BytecodeCircuitConfig::new( + meta, + BytecodeCircuitConfigArgs { + bytecode_table: bytecode_table.clone(), + keccak_table: keccak_table.clone(), + challenges: challenges.clone(), + }, + ); + stats.record("bytecode", meta); + let copy_circuit = CopyCircuitConfig::new( + meta, + CopyCircuitConfigArgs { + tx_table: tx_table.clone(), + rw_table, + bytecode_table: bytecode_table.clone(), + copy_table, + q_enable: q_copy_table, + challenges: challenges.clone(), + }, + ); + stats.record("copy", meta); + let state_circuit = StateCircuitConfig::new( + meta, + StateCircuitConfigArgs { + rw_table, + mpt_table, + u8_table, + u10_table, + u16_table, + challenges: challenges.clone(), + }, + ); + stats.record("state", meta); + let exp_circuit = ExpCircuitConfig::new(meta, exp_table); + stats.record("exp", meta); + + let sig_table = SigTable::construct(meta); + + let chunk_ctx_config = ChunkContextConfig::new(meta, &challenges); + let evm_circuit = EvmCircuitConfig::new( + meta, + EvmCircuitConfigArgs { + challenges, + tx_table, + rw_table, + bytecode_table, + block_table, + copy_table, + keccak_table, + exp_table, + u8_table, + u16_table, + sig_table, + chunk_ctx_config, + feature_config, + }, + ); + stats.record("evm", meta); +} + +fn general_subcircuit_stats() { + let mut stats_list = StatsCollection::::new(false); + let mut meta = ConstraintSystem::::default(); + record_stats(&mut stats_list, &mut meta); + let mut stats_agg = StatsCollection::::new(true); + let mut meta = ConstraintSystem::::default(); + record_stats(&mut stats_agg, &mut meta); + + let mut table = Vec::new(); + for (name, stats) in stats_list + .list + .iter() + .chain(iter::once(&("super".to_string(), stats_agg.agg))) + { + // At 0.0139 gas/row this gives us 2^26 * 0.0139 = ~900k gas. For 30M gas we would need 33 + // chunks. + let k = 26; + let peak_mem_gb = stats.estimate_peak_mem(k) / 1024 / 1024 / 1024; + table.push(vec![ + name.cell(), + stats.num_constraints.cell(), + stats.num_rotation.cell(), + format!("{}/{}", stats.min_rotation, stats.max_rotation).cell(), + stats.num_fixed_columns.cell(), + stats.num_selectors.cell(), + stats.num_advice_columns.cell(), + stats.num_permutation_columns.cell(), + stats.num_lookups.cell(), + stats.degree.cell(), + peak_mem_gb.cell(), + ]); + } + let table = table + .table() + .title( + [ + "circuit", + "constraints", + "rots", + "min/max(rots)", + "fix_cols", + "selectors", + "adv_cols", + "perm_cols", + "lookups", + "degree", + "mem_gb", + ] + .iter() + .map(|s| s.cell().bold(true)), + ) + .bold(true); + + assert!(print_stdout(table).is_ok()); +} diff --git a/zkevm-circuits/src/bytecode_circuit.rs b/zkevm-circuits/src/bytecode_circuit.rs index 03cc8f24ff..3cc4859a0a 100644 --- a/zkevm-circuits/src/bytecode_circuit.rs +++ b/zkevm-circuits/src/bytecode_circuit.rs @@ -16,8 +16,8 @@ use crate::{ }, table::{BytecodeFieldTag, BytecodeTable, KeccakTable, LookupTable}, util::{ - self, get_push_size, - word::{empty_code_hash_word_value, Word, Word32, WordExpr}, + get_push_size, + word::{empty_code_hash_word_value, Word32, WordExpr, WordLoHi}, Challenges, Expr, SubCircuit, SubCircuitConfig, }, witness::{self, Chunk}, @@ -40,7 +40,7 @@ const PUSH_TABLE_WIDTH: usize = 2; #[derive(Debug, Clone, Default)] /// Row for assignment pub(crate) struct BytecodeCircuitRow { - pub(crate) code_hash: Word>, + pub(crate) code_hash: WordLoHi>, tag: F, pub(crate) index: F, pub(crate) is_code: F, @@ -52,7 +52,13 @@ pub(crate) struct BytecodeCircuitRow { } impl BytecodeCircuitRow { #[cfg(test)] - pub(crate) fn new(code_hash: Word>, tag: F, index: F, is_code: F, value: F) -> Self { + pub(crate) fn new( + code_hash: WordLoHi>, + tag: F, + index: F, + is_code: F, + value: F, + ) -> Self { Self { code_hash, tag, @@ -89,7 +95,7 @@ impl From> for BytecodeCircuitAssignment { fn from(codes: Vec) -> Self { let mut rows = vec![]; for bytecode in codes.iter() { - let code_hash = util::word::Word::from(bytecode.hash()).into_value(); + let code_hash = WordLoHi::from(bytecode.hash()).into_value(); let code_size = bytecode.codesize(); let head = BytecodeCircuitRow { code_hash, @@ -341,7 +347,7 @@ impl SubCircuitConfig for BytecodeCircuitConfig { is_byte(meta), ]); - let lookup_columns = vec![value, push_data_size]; + let lookup_columns = [value, push_data_size]; let mut constraints = vec![]; @@ -366,7 +372,7 @@ impl SubCircuitConfig for BytecodeCircuitConfig { meta.query_advice(length, Rotation::cur()), ); - let empty_hash_word: Word> = + let empty_hash_word: WordLoHi> = Word32::new(*EMPTY_CODE_HASH_LE).to_expr().to_word(); cb.require_equal_word( diff --git a/zkevm-circuits/src/bytecode_circuit/test.rs b/zkevm-circuits/src/bytecode_circuit/test.rs index e28f8c2cf8..b5f69c4481 100644 --- a/zkevm-circuits/src/bytecode_circuit/test.rs +++ b/zkevm-circuits/src/bytecode_circuit/test.rs @@ -194,7 +194,7 @@ fn bytecode_invalid_is_code() { }) .verify(false); } - // Mark the 4rd byte as data (is code) + // Mark the 4th byte as data (is code) { BytecodeCircuit::::from_bytes(bytecodes.clone(), k) .mut_rows(|rows| { diff --git a/zkevm-circuits/src/circuit_tools/cell_manager.rs b/zkevm-circuits/src/circuit_tools/cell_manager.rs index 468c07e9fa..5dae4ef2af 100644 --- a/zkevm-circuits/src/circuit_tools/cell_manager.rs +++ b/zkevm-circuits/src/circuit_tools/cell_manager.rs @@ -4,7 +4,7 @@ use crate::{ circuit_tools::cached_region::CachedRegion, evm_circuit::util::rlc, table::LookupTable, - util::{query_expression, word::Word, Expr}, + util::{query_expression, word::WordLoHi, Expr}, }; use eth_types::Field; use halo2_proofs::{ @@ -103,11 +103,11 @@ impl Expr for &Cell { } } -pub(crate) type WordCell = Word>; +pub(crate) type WordLoHiCell = WordLoHi>; -impl WordCell { - pub fn expr(&self) -> Word> { - Word::new([self.lo().expr(), self.hi().expr()]) +impl WordLoHiCell { + pub fn expr(&self) -> WordLoHi> { + WordLoHi::new([self.lo().expr(), self.hi().expr()]) } } @@ -239,7 +239,7 @@ impl Eq for CellColumn {} impl PartialOrd for CellColumn { fn partial_cmp(&self, other: &Self) -> Option { - self.height.partial_cmp(&other.height) + Some(self.cmp(other)) } } diff --git a/zkevm-circuits/src/circuit_tools/constraint_builder.rs b/zkevm-circuits/src/circuit_tools/constraint_builder.rs index 62bb78bdb2..b61d58b26d 100644 --- a/zkevm-circuits/src/circuit_tools/constraint_builder.rs +++ b/zkevm-circuits/src/circuit_tools/constraint_builder.rs @@ -9,7 +9,7 @@ use std::{ use crate::{ evm_circuit::util::rlc, table::LookupTable, - util::{query_expression, word::Word, Expr}, + util::{query_expression, word::WordLoHi, Expr}, }; use eth_types::Field; use gadgets::util::{and, sum, Scalar}; @@ -18,7 +18,7 @@ use itertools::Itertools; use super::{ cached_region::StoredExpression, - cell_manager::{Cell, CellManager, CellType, WordCell}, + cell_manager::{Cell, CellManager, CellType, WordLoHiCell}, }; fn get_condition_expr(conditions: &Vec>) -> Expression { @@ -32,7 +32,7 @@ fn get_condition_expr(conditions: &Vec>) -> Expression { - /// Desciption + /// Description pub description: &'static str, /// Condition under which the lookup needs to be done pub regional_condition: Expression, @@ -47,7 +47,7 @@ pub struct TableData { /// Lookup data #[derive(Clone, Debug)] pub struct LookupData { - /// Desciption + /// Description pub description: String, /// Condition under which the lookup needs to be done pub regional_condition: Expression, @@ -130,7 +130,7 @@ pub struct ConstraintBuilder { max_degree: usize, /// conditions for constraints conditions: Vec>, - /// Columns whoes equality constraints needed to be enable + /// Columns whose equality constraints needed to be enable equalities: Vec>, /// The tables pub tables: HashMap>>, @@ -147,7 +147,7 @@ pub struct ConstraintBuilder { pub region_id: usize, /// lookup input challenge pub lookup_challenge: Option>, - /// state contect + /// state context pub state_context: Vec>, /// state constraints start pub region_constraints_start: usize, @@ -213,7 +213,7 @@ impl ConstraintBuilder { } pub(crate) fn pop_region(&mut self) { - // Apply the region condition to all contraints added in this region + // Apply the region condition to all constraints added in this region let condition = get_condition_expr(&self.state_context); for idx in self.region_constraints_start..self.constraints.len() { self.constraints[idx].1 = condition.expr() * self.constraints[idx].1.clone(); @@ -322,7 +322,7 @@ impl ConstraintBuilder { pub(crate) fn query_default(&mut self) -> Cell { self.query_cells_dyn(C::default(), 1) - .get(0) + .first() .expect("No cell found") .clone() } @@ -352,8 +352,8 @@ impl ConstraintBuilder { } // default query_word is 2 limbs. Each limb is not guaranteed to be 128 bits. - pub(crate) fn query_word_unchecked(&mut self) -> WordCell { - Word::new(self.query_cells_dyn(C::default(), 2).try_into().unwrap()) + pub(crate) fn query_word_unchecked(&mut self) -> WordLoHiCell { + WordLoHi::new(self.query_cells_dyn(C::default(), 2).try_into().unwrap()) } pub(crate) fn validate_degree(&self, degree: usize, name: &'static str) { @@ -536,7 +536,7 @@ impl ConstraintBuilder { )); self.stored_expressions .entry(self.region_id) - .or_insert_with(Vec::new) + .or_default() .push(StoredExpression { name, cell: cell.clone(), @@ -718,7 +718,7 @@ impl> ExprVec for &[E] { } } -impl + Clone> ExprVec for Word { +impl + Clone> ExprVec for WordLoHi { fn to_expr_vec(&self) -> Vec> { vec![self.lo().expr(), self.hi().expr()] } @@ -810,7 +810,7 @@ impl ExprResult for Expression { } } -/// Implement `ExprResult` for tupples +/// Implement `ExprResult` for tuples #[macro_export] macro_rules! impl_expr_result { ($($type:ty),*) => { diff --git a/zkevm-circuits/src/circuit_tools/gadgets.rs b/zkevm-circuits/src/circuit_tools/gadgets.rs index 8d95bd9701..906f1c0a7c 100644 --- a/zkevm-circuits/src/circuit_tools/gadgets.rs +++ b/zkevm-circuits/src/circuit_tools/gadgets.rs @@ -8,7 +8,7 @@ use halo2_proofs::{ use crate::{ evm_circuit::util::{from_bytes, pow_of_two, transpose_val_ret}, - util::word::{Word, WordExpr}, + util::word::{WordExpr, WordLoHi}, }; use super::{ @@ -107,8 +107,8 @@ pub struct IsEqualWordGadget { impl IsEqualWordGadget { pub(crate) fn construct( cb: &mut ConstraintBuilder, - lhs: &Word>, - rhs: &Word>, + lhs: &WordLoHi>, + rhs: &WordLoHi>, ) -> Self { let (lhs_lo, lhs_hi) = lhs.to_word().to_lo_hi(); let (rhs_lo, rhs_hi) = rhs.to_word().to_lo_hi(); @@ -129,8 +129,8 @@ impl IsEqualWordGadget { &self, region: &mut CachedRegion<'_, '_, F>, offset: usize, - lhs: Word, - rhs: Word, + lhs: WordLoHi, + rhs: WordLoHi, ) -> Result { let (lhs_lo, lhs_hi) = lhs.to_lo_hi(); let (rhs_lo, rhs_hi) = rhs.to_lo_hi(); @@ -143,8 +143,8 @@ impl IsEqualWordGadget { &self, region: &mut CachedRegion<'_, '_, F>, offset: usize, - lhs: Value>, - rhs: Value>, + lhs: Value>, + rhs: Value>, ) -> Result, Error> { transpose_val_ret( lhs.zip(rhs) @@ -159,7 +159,7 @@ impl IsEqualWordGadget { lhs: eth_types::Word, rhs: eth_types::Word, ) -> Result { - self.assign(region, offset, Word::from(lhs), Word::from(rhs)) + self.assign(region, offset, WordLoHi::from(lhs), WordLoHi::from(rhs)) } } diff --git a/zkevm-circuits/src/circuit_tools/memory.rs b/zkevm-circuits/src/circuit_tools/memory.rs index 873ec23acb..a36edaa15d 100644 --- a/zkevm-circuits/src/circuit_tools/memory.rs +++ b/zkevm-circuits/src/circuit_tools/memory.rs @@ -7,7 +7,7 @@ use halo2_proofs::{ poly::Rotation, }; use std::{ - collections::HashMap, + collections::BTreeMap, marker::PhantomData, ops::{Index, IndexMut}, }; @@ -20,7 +20,7 @@ use super::{ #[derive(Clone, Debug, Default)] pub(crate) struct Memory> { - banks: HashMap, + banks: BTreeMap, _phantom: PhantomData, tag_counter: usize, } @@ -42,7 +42,7 @@ impl> IndexMut for Memory> Memory { pub(crate) fn new() -> Self { Self { - banks: HashMap::new(), + banks: BTreeMap::new(), _phantom: PhantomData, tag_counter: 0, } diff --git a/zkevm-circuits/src/copy_circuit.rs b/zkevm-circuits/src/copy_circuit.rs index dd65fbb85c..4466bf9694 100644 --- a/zkevm-circuits/src/copy_circuit.rs +++ b/zkevm-circuits/src/copy_circuit.rs @@ -69,6 +69,8 @@ pub struct CopyCircuitConfig { /// The Copy Table contains the columns that are exposed via the lookup /// expressions pub copy_table: CopyTable, + /// BinaryNumber config out of the tag bits from `copy_table` + copy_table_tag: BinaryNumberConfig, /// Lt chip to check: src_addr < src_addr_end. /// Since `src_addr` and `src_addr_end` are u64, 8 bytes are sufficient for /// the Lt chip. @@ -128,7 +130,7 @@ impl SubCircuitConfig for CopyCircuitConfig { let rlc_acc = copy_table.rlc_acc; let rw_counter = copy_table.rw_counter; let rwc_inc_left = copy_table.rwc_inc_left; - let tag = copy_table.tag; + let tag_bits = copy_table.tag; // annotate table columns tx_table.annotate_columns(meta); @@ -136,6 +138,7 @@ impl SubCircuitConfig for CopyCircuitConfig { bytecode_table.annotate_columns(meta); copy_table.annotate_columns(meta); + let tag = BinaryNumberChip::configure(meta, tag_bits, q_enable, None); let addr_lt_addr_end = LtChip::configure( meta, |meta| meta.query_selector(q_step), @@ -363,7 +366,7 @@ impl SubCircuitConfig for CopyCircuitConfig { 0.expr(), // init_val_hi ] .into_iter() - .zip_eq(rw_table.table_exprs(meta).into_iter()) + .zip_eq(rw_table.table_exprs(meta)) .map(|(arg, table)| (cond.clone() * arg, table)) .collect() }); @@ -388,7 +391,7 @@ impl SubCircuitConfig for CopyCircuitConfig { 0.expr(), // init_val_hi ] .into_iter() - .zip_eq(rw_table.table_exprs(meta).into_iter()) + .zip_eq(rw_table.table_exprs(meta)) .map(|(arg, table)| (cond.clone() * arg, table)) .collect() }); @@ -406,7 +409,7 @@ impl SubCircuitConfig for CopyCircuitConfig { meta.query_advice(value, Rotation::cur()), ] .into_iter() - .zip_eq(bytecode_table.table_exprs(meta).into_iter()) + .zip_eq(bytecode_table.table_exprs(meta)) .map(|(arg, table)| (cond.clone() * arg, table)) .collect() }); @@ -423,12 +426,12 @@ impl SubCircuitConfig for CopyCircuitConfig { meta.query_advice(value, Rotation::cur()), ] .into_iter() - .zip(tx_table.table_exprs(meta).into_iter()) + .zip(tx_table.table_exprs(meta)) .map(|(arg, table)| (cond.clone() * arg, table)) .collect() }); - meta.create_gate("id_hi === 0 when Momory", |meta| { + meta.create_gate("id_hi === 0 when Memory", |meta| { let mut cb = BaseConstraintBuilder::default(); let cond = tag.value_equals(CopyDataType::Memory, Rotation::cur())(meta) @@ -471,6 +474,7 @@ impl SubCircuitConfig for CopyCircuitConfig { q_enable, addr_lt_addr_end, copy_table, + copy_table_tag: tag, tx_table, rw_table, bytecode_table, @@ -526,7 +530,11 @@ impl CopyCircuitConfig { .zip_eq(table_row) { // Leave sr_addr_end and bytes_left unassigned when !is_read - if !is_read && (label == "src_addr_end" || label == "bytes_left") { + // Leave tag_bit columns unassigned, since they are already assigned via + // `tag_chip.assign` + if (!is_read && (label == "src_addr_end" || label == "bytes_left")) + || label == "tag_bit" + { } else { region.assign_advice( || format!("{} at row: {}", label, offset), @@ -605,7 +613,7 @@ impl CopyCircuitConfig { ); let filler_rows = max_copy_rows - copy_rows_needed - DISABLED_ROWS; - let tag_chip = BinaryNumberChip::construct(self.copy_table.tag); + let tag_chip = BinaryNumberChip::construct(self.copy_table_tag); let lt_chip = LtChip::construct(self.addr_lt_addr_end); lt_chip.load(layouter)?; @@ -809,7 +817,7 @@ impl CopyCircuit { Self { copy_events, max_copy_rows, - _marker: PhantomData::default(), + _marker: PhantomData, external_data: ExternalData::default(), } } @@ -823,7 +831,7 @@ impl CopyCircuit { Self { copy_events, max_copy_rows, - _marker: PhantomData::default(), + _marker: PhantomData, external_data, } } diff --git a/zkevm-circuits/src/copy_circuit/util.rs b/zkevm-circuits/src/copy_circuit/util.rs index 24cce0f3f4..464d3f0e24 100644 --- a/zkevm-circuits/src/copy_circuit/util.rs +++ b/zkevm-circuits/src/copy_circuit/util.rs @@ -1,12 +1,12 @@ -use crate::util::word::Word; +use crate::util::word::WordLoHi; use bus_mapping::circuit_input_builder::NumberOrHash; use eth_types::Field; use halo2_proofs::circuit::Value; /// Encode the type `NumberOrHash` into a field element -pub fn number_or_hash_to_word(v: &NumberOrHash) -> Word> { +pub fn number_or_hash_to_word(v: &NumberOrHash) -> WordLoHi> { match v { - NumberOrHash::Number(n) => Word::from(*n as u64).into_value(), - NumberOrHash::Hash(h) => Word::from(*h).into_value(), + NumberOrHash::Number(n) => WordLoHi::from(*n as u64).into_value(), + NumberOrHash::Hash(h) => WordLoHi::from(*h).into_value(), } } diff --git a/zkevm-circuits/src/ecc_circuit.rs b/zkevm-circuits/src/ecc_circuit.rs new file mode 100644 index 0000000000..5c4c0d092a --- /dev/null +++ b/zkevm-circuits/src/ecc_circuit.rs @@ -0,0 +1,1377 @@ +//! The ECC circuit is responsible for verifying ECC-related operations from precompiled contract +//! calls, namely, EcAdd, EcMul and EcPairing. + +use std::{iter, marker::PhantomData}; + +use bus_mapping::{ + circuit_input_builder::{EcAddOp, EcMulOp, EcPairingOp, N_BYTES_PER_PAIR, N_PAIRING_PER_OP}, + precompile::PrecompileCalls, +}; +use eth_types::{Field, ToLittleEndian, ToScalar, U256}; +use halo2_base::{ + gates::{GateInstructions, RangeInstructions}, + utils::{decompose_bigint_option, fe_to_biguint, modulus}, + AssignedValue, Context, QuantumCell, SKIP_FIRST_PASS, +}; +use halo2_ecc::{ + bigint::{big_is_zero, CRTInteger, OverflowInteger}, + bn254::pairing::PairingChip, + ecc::{EcPoint, EccChip}, + fields::{ + fp::{FpConfig, FpStrategy}, + fp12::Fp12Chip, + fp2::Fp2Chip, + FieldChip, FieldExtPoint, + }, +}; +use halo2_proofs::{ + arithmetic::Field as Halo2Field, + circuit::{Layouter, Value}, + halo2curves::{ + bn256::{Fq, Fq12, Fq2, Fr, G1Affine, G2Affine}, + CurveAffine, + }, + plonk::{ConstraintSystem, Error, Expression}, +}; +use itertools::Itertools; +use log::error; +use snark_verifier::util::arithmetic::PrimeCurveAffine; + +use crate::{ + evm_circuit::{param::N_BYTES_WORD, EvmCircuit}, + keccak_circuit::KeccakCircuit, + table::{EccTable, LookupTable}, + util::{Challenges, SubCircuit, SubCircuitConfig}, + witness::Block, +}; + +mod dev; +mod test; +mod util; + +use util::{ + EcAddAssigned, EcAddDecomposed, EcMulAssigned, EcMulDecomposed, EcOpsAssigned, + EcPairingAssigned, EcPairingDecomposed, G1Assigned, G1Decomposed, G2Decomposed, ScalarAssigned, + LOG_TOTAL_NUM_ROWS, +}; + +macro_rules! log_context_cursor { + ($ctx: ident) => {{ + log::trace!("Ctx cell pos: {:?}", $ctx.advice_alloc); + }}; +} + +/// Arguments accepted to configure the EccCircuitConfig. +#[derive(Clone, Debug)] +pub struct EccCircuitConfigArgs { + /// ECC table that is connected to the ECC circuit. + pub ecc_table: EccTable, + /// zkEVM challenge API. + pub challenges: Challenges>, +} + +/// Config for the ECC circuit. +#[derive(Clone, Debug)] +pub struct EccCircuitConfig { + /// Field config for halo2_proofs::halo2curves::bn256::Fq. + fp_config: FpConfig, + /// Lookup table for I/Os to the EcAdd, EcMul and EcPairing operations. + ecc_table: EccTable, + + /// Number of limbs to represent Fp. + num_limbs: usize, + /// Number of bits per limb. + limb_bits: usize, + + _marker: PhantomData, +} + +impl SubCircuitConfig for EccCircuitConfig { + type ConfigArgs = EccCircuitConfigArgs; + + fn new( + meta: &mut ConstraintSystem, + Self::ConfigArgs { + ecc_table, + challenges: _, + }: Self::ConfigArgs, + ) -> Self { + let num_limbs = 3; + let limb_bits = 88; + let num_advice = [35, 1]; + + let fp_config = FpConfig::configure( + meta, + FpStrategy::Simple, + &num_advice, + &[17], // num lookup advice + 1, // num fixed + 13, // lookup bits + limb_bits, + num_limbs, + modulus::(), + 0, + LOG_TOTAL_NUM_ROWS as usize, // k + ); + + for column in >::advice_columns(&ecc_table) { + meta.enable_equality(column); + } + + Self { + fp_config, + ecc_table, + num_limbs, + limb_bits, + _marker: PhantomData, + } + } +} + +/// The ECC Circuit is a sub-circuit of the super circuit, responsible for verifying the following +/// ECC operations: +/// 1. Point Addition (R = P + Q) +/// 2. Scalar Multiplication (R = s.P) +/// 3. Pairing-based bilinear function +/// +/// We follow a strategy to pre-allocate maximum number of cells for each of the above ECC +/// operations, which means a witness that exceeds the pre-allocated number of cells for any of the +/// operations will be invalid. +#[derive(Clone, Debug, Default)] +pub struct EccCircuit { + /// Maximum number of EcAdd operations supported in one instance of the ECC Circuit. + pub max_add_ops: usize, + /// Maximum number of scalar multiplication operations supported in one instance of the ECC + /// Circuit. + pub max_mul_ops: usize, + /// Maximum number of pairing operations supported in one instance of the ECC Circuit. + pub max_pairing_ops: usize, + + /// EcAdd operations provided as witness data to the ECC circuit. + pub add_ops: Vec, + /// EcMul operations provided as witness data to the ECC circuit. + pub mul_ops: Vec, + /// EcPairing operations provided as witness data to the ECC circuit. + pub pairing_ops: Vec, + + _marker: PhantomData, +} + +impl EccCircuit { + /// Return the minimum number of rows required to prove an input of a + /// particular size. + pub fn min_num_rows() -> usize { + // EccCircuit can't determine usable rows independently. + // Instead, the blinding area is determined by other advise columns with most counts of + // rotation queries. This value is typically determined by either the Keccak or EVM + // circuit. + + let max_blinding_factor = Self::unusable_rows() - 1; + + // same formula as halo2-lib's FlexGate + (1 << LOG_TOTAL_NUM_ROWS) - (max_blinding_factor + 3) + } + + /// Assign witness from the ecXX ops to the circuit. + pub(crate) fn assign( + &self, + layouter: &mut impl Layouter, + config: &>::Config, + challenges: &Challenges>, + ) -> Result<(), Error> { + if self.add_ops.len() > self.max_add_ops + || self.mul_ops.len() > self.max_mul_ops + || self.pairing_ops.len() > self.max_pairing_ops + { + error!( + "add ops = {}, mul ops = {}, pairing ops = {} > max add ops = {}, max mul ops = {}, max pairing ops = {}", + self.add_ops.len(), + self.mul_ops.len(), + self.pairing_ops.len(), + self.max_add_ops, + self.max_mul_ops, + self.max_pairing_ops, + ); + return Err(Error::Synthesis); + } + + // keccak powers of randomness. + let keccak_powers = std::iter::successors(Some(Value::known(F::one())), |coeff| { + Some(challenges.keccak_input() * coeff) + }) + .take(N_PAIRING_PER_OP * N_BYTES_PER_PAIR) + .map(|x| QuantumCell::Witness(x)) + .collect_vec(); + + let powers_of_256 = iter::successors(Some(F::one()), |coeff| Some(F::from(256) * coeff)) + .take(N_BYTES_WORD) + .map(|x| QuantumCell::Constant(x)) + .collect_vec(); + + let ecc_chip = EccChip::>::construct(config.fp_config.clone()); + let fr_chip = FpConfig::::construct( + config.fp_config.range.clone(), + config.limb_bits, + config.num_limbs, + modulus::(), + ); + let pairing_chip = PairingChip::construct(config.fp_config.clone()); + let fp12_chip = + Fp12Chip::, Fq12, XI_0>::construct(config.fp_config.clone()); + + let mut first_pass = SKIP_FIRST_PASS; + + let assigned_ec_ops = layouter.assign_region( + || "ecc circuit", + |region| { + if first_pass { + first_pass = false; + return Ok(EcOpsAssigned::default()); + } + + let mut ctx = config.fp_config.new_context(region); + + macro_rules! decompose_ec_op { + ($op_type:ident, $ops:expr, $n_ops:expr, $decompose_fn:ident) => { + $ops.iter() + .filter(|op| !op.skip_by_ecc_circuit()) + .chain(std::iter::repeat(&$op_type::default())) + .take($n_ops) + .map(|op| { + self.$decompose_fn( + &mut ctx, + &ecc_chip, + &fr_chip, + &pairing_chip, + &fp12_chip, + &powers_of_256, + &op, + ) + }) + .collect_vec() + }; + } + + macro_rules! assign_ec_op { + ($decomposed_ops:expr, $assign_fn:ident) => { + $decomposed_ops + .iter() + .map(|decomposed_op| { + self.$assign_fn(&mut ctx, decomposed_op, &ecc_chip, &keccak_powers) + }) + .collect_vec() + }; + } + + // P + Q == R + let ec_adds_decomposed = + decompose_ec_op!(EcAddOp, self.add_ops, self.max_add_ops, decompose_ec_add_op); + + // s.P = R + let ec_muls_decomposed = + decompose_ec_op!(EcMulOp, self.mul_ops, self.max_mul_ops, decompose_ec_mul_op); + + // e(G1 . G2) * ... * e(G1 . G2) -> Gt + let ec_pairings_decomposed = decompose_ec_op!( + EcPairingOp, + self.pairing_ops, + self.max_pairing_ops, + decompose_ec_pairing_op + ); + + // finalize after first phase. + config.fp_config.finalize(&mut ctx); + ctx.next_phase(); + + let ec_adds_assigned = assign_ec_op!(ec_adds_decomposed, assign_ec_add); + let ec_muls_assigned = assign_ec_op!(ec_muls_decomposed, assign_ec_mul); + let ec_pairings_assigned = assign_ec_op!(ec_pairings_decomposed, assign_ec_pairing); + + // Finalize the Fp config always at the end of assignment. + let lookup_cells = config.fp_config.finalize(&mut ctx); + log::info!("total number of lookup cells: {}", lookup_cells); + ctx.print_stats(&["EccCircuit: FpConfig context"]); + + Ok(EcOpsAssigned { + ec_adds_assigned, + ec_muls_assigned, + ec_pairings_assigned, + }) + }, + )?; + + layouter.assign_region( + || "expose ecc table", + |mut region| { + // handle EcAdd ops. + for (idx, ec_add_assigned) in assigned_ec_ops.ec_adds_assigned.iter().enumerate() { + region.assign_fixed( + || "assign ecc_table op_type", + config.ecc_table.op_type, + idx, + || Value::known(F::from(u64::from(PrecompileCalls::Bn128Add))), + )?; + ec_add_assigned.is_valid.copy_advice( + &mut region, + config.ecc_table.is_valid, + idx, + ); + // P_x + ec_add_assigned.point_p.x_rlc.copy_advice( + &mut region, + config.ecc_table.arg1_rlc, + idx, + ); + // P_y + ec_add_assigned.point_p.y_rlc.copy_advice( + &mut region, + config.ecc_table.arg2_rlc, + idx, + ); + // Q_x + ec_add_assigned.point_q.x_rlc.copy_advice( + &mut region, + config.ecc_table.arg3_rlc, + idx, + ); + // Q_y + ec_add_assigned.point_q.y_rlc.copy_advice( + &mut region, + config.ecc_table.arg4_rlc, + idx, + ); + // R_x + ec_add_assigned.point_r.x_rlc.copy_advice( + &mut region, + config.ecc_table.output1_rlc, + idx, + ); + // R_y + ec_add_assigned.point_r.y_rlc.copy_advice( + &mut region, + config.ecc_table.output2_rlc, + idx, + ); + // input_rlc == 0 + region.assign_advice( + || format!("input_rlc at offset = {idx}"), + config.ecc_table.input_rlc, + idx, + || Value::known(F::zero()), + )?; + } + + // handle EcMul ops. + for (idx, ec_mul_assigned) in assigned_ec_ops.ec_muls_assigned.iter().enumerate() { + let idx = idx + self.max_add_ops; + region.assign_fixed( + || "assign ecc_table op_type", + config.ecc_table.op_type, + idx, + || Value::known(F::from(u64::from(PrecompileCalls::Bn128Mul))), + )?; + // Is valid + ec_mul_assigned.is_valid.copy_advice( + &mut region, + config.ecc_table.is_valid, + idx, + ); + // P_x + ec_mul_assigned.point_p.x_rlc.copy_advice( + &mut region, + config.ecc_table.arg1_rlc, + idx, + ); + // P_y + ec_mul_assigned.point_p.y_rlc.copy_advice( + &mut region, + config.ecc_table.arg2_rlc, + idx, + ); + // Scalar s + ec_mul_assigned.scalar_s.scalar.native.copy_advice( + &mut region, + config.ecc_table.arg3_rlc, + idx, + ); + // R_x + ec_mul_assigned.point_r.x_rlc.copy_advice( + &mut region, + config.ecc_table.output1_rlc, + idx, + ); + // R_y + ec_mul_assigned.point_r.y_rlc.copy_advice( + &mut region, + config.ecc_table.output2_rlc, + idx, + ); + for &col in [config.ecc_table.arg4_rlc, config.ecc_table.input_rlc].iter() { + region.assign_advice( + || format!("{col:?} at offset = {idx}"), + col, + idx, + || Value::known(F::zero()), + )?; + } + } + + // handle EcPairing ops. + for (idx, ec_pairing_assigned) in + assigned_ec_ops.ec_pairings_assigned.iter().enumerate() + { + let idx = idx + self.max_add_ops + self.max_mul_ops; + region.assign_fixed( + || "assign ecc_table op_type", + config.ecc_table.op_type, + idx, + || Value::known(F::from(u64::from(PrecompileCalls::Bn128Pairing))), + )?; + // is valid. + ec_pairing_assigned.is_valid.copy_advice( + &mut region, + config.ecc_table.is_valid, + idx, + ); + // RLC(input_bytes) + ec_pairing_assigned.input_rlc.copy_advice( + &mut region, + config.ecc_table.input_rlc, + idx, + ); + // success + ec_pairing_assigned.success.copy_advice( + &mut region, + config.ecc_table.output1_rlc, + idx, + ); + for &col in [ + config.ecc_table.arg1_rlc, + config.ecc_table.arg2_rlc, + config.ecc_table.arg3_rlc, + config.ecc_table.arg4_rlc, + config.ecc_table.output2_rlc, + ] + .iter() + { + region.assign_advice( + || format!("{col:?} at offset = {idx}"), + col, + idx, + || Value::known(F::zero()), + )?; + } + } + + Ok(()) + }, + )?; + + Ok(()) + } + + #[allow(clippy::too_many_arguments)] + fn decompose_ec_add_op( + &self, + ctx: &mut Context, + ecc_chip: &EccChip>, + _fr_chip: &FpConfig, + _pairing_chip: &PairingChip, + _fp12_chip: &Fp12Chip, Fq12, XI_0>, + powers_of_256: &[QuantumCell], + op: &EcAddOp, + ) -> EcAddDecomposed { + log::trace!("[ECC] ==> EcAdd Assignment START:"); + log_context_cursor!(ctx); + + let (px, px_cells, px_valid, px_is_zero) = + self.precheck_fq(ctx, ecc_chip, op.p.0, powers_of_256); + let (py, py_cells, py_valid, py_is_zero) = + self.precheck_fq(ctx, ecc_chip, op.p.1, powers_of_256); + let p_is_on_curve_or_infinity = + self.is_on_curveg1_or_infinity(ctx, ecc_chip, &px, px_is_zero, &py, py_is_zero); + let (qx, qx_cells, qx_valid, qx_is_zero) = + self.precheck_fq(ctx, ecc_chip, op.q.0, powers_of_256); + let (qy, qy_cells, qy_valid, qy_is_zero) = + self.precheck_fq(ctx, ecc_chip, op.q.1, powers_of_256); + let q_is_on_curve_or_infinity = + self.is_on_curveg1_or_infinity(ctx, ecc_chip, &qx, qx_is_zero, &qy, qy_is_zero); + + let point_p = EcPoint::construct(px, py); + let point_q = EcPoint::construct(qx, qy); + + let inputs_valid = ecc_chip.field_chip().range().gate().and_many( + ctx, + vec![ + QuantumCell::Existing(px_valid), + QuantumCell::Existing(py_valid), + QuantumCell::Existing(p_is_on_curve_or_infinity), + QuantumCell::Existing(qx_valid), + QuantumCell::Existing(qy_valid), + QuantumCell::Existing(q_is_on_curve_or_infinity), + ], + ); + let inputs_invalid = ecc_chip + .field_chip() + .range() + .gate() + .not(ctx, QuantumCell::Existing(inputs_valid)); + + log::trace!("[ECC] EcAdd Inputs Assigned:"); + log_context_cursor!(ctx); + + // We follow the approach mentioned below to handle many edge cases for the points P, Q and + // R so that we can maintain the same fixed and permutation columns and reduce the overall + // validation process from the EVM Circuit. + // + // To check the validity of P + Q == R, we check: + // r + P + Q - R == r + // where r is a random point on the curve. + // + // We cover cases such as: + // - P == (0, 0) and/or Q == (0, 0) + // - P == -Q, i.e. P + Q == R == (0, 0) + let res = op.r.unwrap_or(G1Affine::identity()); + let point_r = self.handle_g1(ctx, ecc_chip, res, powers_of_256); + let rx_is_zero = ecc_chip.field_chip.is_zero(ctx, &point_r.ec_point.x); + let ry_is_zero = ecc_chip.field_chip.is_zero(ctx, &point_r.ec_point.y); + + let rand_point = ecc_chip.load_random_point::(ctx); + let point_p_is_zero = ecc_chip.field_chip.range().gate().or_and( + ctx, + QuantumCell::Existing(inputs_invalid), + QuantumCell::Existing(px_is_zero), + QuantumCell::Existing(py_is_zero), + ); + let point_q_is_zero = ecc_chip.field_chip.range().gate().or_and( + ctx, + QuantumCell::Existing(inputs_invalid), + QuantumCell::Existing(qx_is_zero), + QuantumCell::Existing(qy_is_zero), + ); + let point_r_is_zero = ecc_chip.field_chip.range().gate().or_and( + ctx, + QuantumCell::Existing(inputs_invalid), + QuantumCell::Existing(rx_is_zero), + QuantumCell::Existing(ry_is_zero), + ); + + // sum1 = if P == (0, 0) then r else r + P + let sum1 = ecc_chip.add_unequal(ctx, &rand_point, &point_p, true); + let sum1 = ecc_chip.select(ctx, &rand_point, &sum1, &point_p_is_zero); + + // sum2 = if Q == (0, 0) then sum1 else sum1 + Q + let sum2 = ecc_chip.add_unequal(ctx, &sum1, &point_q, true); + let sum2 = ecc_chip.select(ctx, &sum1, &sum2, &point_q_is_zero); + + // sum3 = if R == (0, 0) then sum2 else sum2 - R + let sum3 = ecc_chip.sub_unequal(ctx, &sum2, &point_r.ec_point, true); + let sum3 = ecc_chip.select(ctx, &sum2, &sum3, &point_r_is_zero); + + ecc_chip.assert_equal(ctx, &rand_point, &sum3); + + log::trace!("[ECC] EcAdd Assignment END:"); + log_context_cursor!(ctx); + + EcAddDecomposed { + is_valid: inputs_valid, + point_p: G1Decomposed { + ec_point: point_p, + x_cells: px_cells, + y_cells: py_cells, + }, + point_q: G1Decomposed { + ec_point: point_q, + x_cells: qx_cells, + y_cells: qy_cells, + }, + point_r, + } + } + + /// Decomposes an EcMul operation to return each G1 element as cells representing its byte + /// form. + #[allow(clippy::too_many_arguments)] + fn decompose_ec_mul_op( + &self, + ctx: &mut Context, + ecc_chip: &EccChip>, + fr_chip: &FpConfig, + _pairing_chip: &PairingChip, + _fp12_chip: &Fp12Chip, Fq12, XI_0>, + powers_of_256: &[QuantumCell], + op: &EcMulOp, + ) -> EcMulDecomposed { + log::trace!("[ECC] ==> EcMul Assignment START:"); + log_context_cursor!(ctx); + + let (px, px_cells, px_valid, px_is_zero) = + self.precheck_fq(ctx, ecc_chip, op.p.0, powers_of_256); + let (py, py_cells, py_valid, py_is_zero) = + self.precheck_fq(ctx, ecc_chip, op.p.1, powers_of_256); + let p_is_on_curve_or_infinity = + self.is_on_curveg1_or_infinity(ctx, ecc_chip, &px, px_is_zero, &py, py_is_zero); + + // point at infinity + let infinity = EcPoint::construct( + ecc_chip + .field_chip() + .load_constant(ctx, fe_to_biguint(&Fq::zero())), + ecc_chip + .field_chip() + .load_constant(ctx, fe_to_biguint(&Fq::zero())), + ); + // for invalid case, take a random point. + let dummy_g1 = ecc_chip.load_random_point::(ctx); + + let point_p = EcPoint::construct(px, py); + let is_valid = ecc_chip.field_chip().range().gate().and_many( + ctx, + vec![ + QuantumCell::Existing(px_valid), + QuantumCell::Existing(py_valid), + QuantumCell::Existing(p_is_on_curve_or_infinity), + ], + ); + let point_p = ecc_chip.select(ctx, &point_p, &dummy_g1, &is_valid); + + let scalar_s = self.handle_fr(ctx, fr_chip, op.s); + + let res = op.r.unwrap_or(G1Affine::identity()); + let point_r = self.handle_g1(ctx, ecc_chip, res, powers_of_256); + + log::trace!("[ECC] EcMul Inputs Assigned:"); + log_context_cursor!(ctx); + + let point_r_got = ecc_chip.scalar_mult( + ctx, + &point_p, + &scalar_s.scalar.limbs().to_vec(), + fr_chip.limb_bits, + 4, + ); + let point_r_got = ecc_chip.select(ctx, &point_r_got, &infinity, &is_valid); + ecc_chip.assert_equal(ctx, &point_r.ec_point, &point_r_got); + + log::trace!("[ECC] EcMul Assignment END:"); + log_context_cursor!(ctx); + + EcMulDecomposed { + is_valid, + point_p: G1Decomposed { + ec_point: point_p, + x_cells: px_cells, + y_cells: py_cells, + }, + scalar_s, + point_r, + } + } + + /// Decomposes an EcPairing operation and returns cells that represent the LE-bytes of all + /// (G1, G2) pairs. In phase2 they will be RLC'd with the keccak randomness. + #[allow(clippy::too_many_arguments)] + fn decompose_ec_pairing_op( + &self, + ctx: &mut Context, + ecc_chip: &EccChip>, + _fr_chip: &FpConfig, + pairing_chip: &PairingChip, + fp12_chip: &Fp12Chip, Fq12, XI_0>, + powers_of_256: &[QuantumCell], + op: &EcPairingOp, + ) -> EcPairingDecomposed { + log::trace!("[ECC] ==> EcPairing Assignment START:"); + log_context_cursor!(ctx); + + let fp2_chip = Fp2Chip::, Fq2>::construct(pairing_chip.fp_chip.clone()); + let ecc2_chip = EccChip::construct(fp2_chip.clone()); + + let decomposed_pairs = op + .pairs + .iter() + .map(|pair| { + // process x and y co-ordinates of G1. + let (g1x, g1x_cells, g1x_valid, g1x_is_zero) = + self.precheck_fq(ctx, ecc_chip, pair.g1_point.0, powers_of_256); + let (g1y, g1y_cells, g1y_valid, g1y_is_zero) = + self.precheck_fq(ctx, ecc_chip, pair.g1_point.1, powers_of_256); + let g1_point = EcPoint::>::construct(g1x, g1y); + let g1_is_on_curve_or_infinity = self.is_on_curveg1_or_infinity( + ctx, + ecc_chip, + &g1_point.x, + g1x_is_zero, + &g1_point.y, + g1y_is_zero, + ); + let is_g1_valid = ecc_chip.field_chip().range().gate().and_many( + ctx, + vec![ + QuantumCell::Existing(g1x_valid), + QuantumCell::Existing(g1y_valid), + QuantumCell::Existing(g1_is_on_curve_or_infinity), + ], + ); + let is_g1_identity = ecc_chip.field_chip().range().gate().and( + ctx, + QuantumCell::Existing(g1x_is_zero), + QuantumCell::Existing(g1y_is_zero), + ); + + // process x and y co-ordinates of G2. + let (g2x0, g2x0_cells, g2x0_valid, g2x0_is_zero) = + self.precheck_fq(ctx, ecc_chip, pair.g2_point.1, powers_of_256); + let (g2x1, g2x1_cells, g2x1_valid, g2x1_is_zero) = + self.precheck_fq(ctx, ecc_chip, pair.g2_point.0, powers_of_256); + let (g2y0, g2y0_cells, g2y0_valid, g2y0_is_zero) = + self.precheck_fq(ctx, ecc_chip, pair.g2_point.3, powers_of_256); + let (g2y1, g2y1_cells, g2y1_valid, g2y1_is_zero) = + self.precheck_fq(ctx, ecc_chip, pair.g2_point.2, powers_of_256); + let g2_point = EcPoint::>>::construct( + FieldExtPoint::construct(vec![g2x0, g2x1]), + FieldExtPoint::construct(vec![g2y0, g2y1]), + ); + let g2x_is_zero = ecc_chip.field_chip().range().gate().and( + ctx, + QuantumCell::Existing(g2x0_is_zero), + QuantumCell::Existing(g2x1_is_zero), + ); + let g2y_is_zero = ecc_chip.field_chip().range().gate().and( + ctx, + QuantumCell::Existing(g2y0_is_zero), + QuantumCell::Existing(g2y1_is_zero), + ); + let g2_is_on_curve_or_infinity = self.is_on_curveg2_or_infinity( + ctx, + &fp2_chip, + &g2_point.x, + g2x_is_zero, + &g2_point.y, + g2y_is_zero, + ); + let is_g2_valid = ecc_chip.field_chip().range().gate().and_many( + ctx, + vec![ + QuantumCell::Existing(g2x0_valid), + QuantumCell::Existing(g2x1_valid), + QuantumCell::Existing(g2y0_valid), + QuantumCell::Existing(g2y1_valid), + QuantumCell::Existing(g2_is_on_curve_or_infinity), + ], + ); + let is_g2_identity = ecc_chip.field_chip().range().gate().and_many( + ctx, + vec![ + QuantumCell::Existing(g2x0_is_zero), + QuantumCell::Existing(g2x1_is_zero), + QuantumCell::Existing(g2y0_is_zero), + QuantumCell::Existing(g2y1_is_zero), + ], + ); + + // Whether the pair (G1, G2) is valid, i.e. + // - G1 is a point on curve or infinity. + // - G2 is a point on curve or infinity. + let is_pair_valid = ecc_chip.field_chip().range().gate().and( + ctx, + QuantumCell::Existing(is_g1_valid), + QuantumCell::Existing(is_g2_valid), + ); + // Whether the pair (G1, G2) is a zero pair, i.e. + // - G1 == G1::infinity && G2 is valid. + // - G2 == G2::infinity && G1 is valid. + let is_zero_pair = { + let is_zero_pair = ecc_chip.field_chip().range().gate().or( + ctx, + QuantumCell::Existing(is_g1_identity), + QuantumCell::Existing(is_g2_identity), + ); + ecc_chip.field_chip().range().gate().and( + ctx, + QuantumCell::Existing(is_zero_pair), + QuantumCell::Existing(is_pair_valid), + ) + }; + + ( + is_zero_pair, + is_pair_valid, + G1Decomposed { + ec_point: g1_point, + x_cells: g1x_cells, + y_cells: g1y_cells, + }, + G2Decomposed { + ec_point: g2_point, + x_c0_cells: g2x0_cells, + x_c1_cells: g2x1_cells, + y_c0_cells: g2y0_cells, + y_c1_cells: g2y1_cells, + }, + ) + }) + .collect_vec(); + + log::trace!("[ECC] EcPairing g1s and g2s Assigned:"); + log_context_cursor!(ctx); + + // EVM input for EcPairing in Big-Endian representation, padded by 0 bytes so that the + // total number of bytes are N_PAIRING_PER_OP * N_BYTES_PER_PAIR. + let input_cells = decomposed_pairs + .iter() + .flat_map(|(_, _, g1, g2)| { + std::iter::empty() + .chain(g1.x_cells.iter().rev()) + .chain(g1.y_cells.iter().rev()) + .chain(g2.x_c1_cells.iter().rev()) + .chain(g2.x_c0_cells.iter().rev()) + .chain(g2.y_c1_cells.iter().rev()) + .chain(g2.y_c0_cells.iter().rev()) + .cloned() + .collect::>>() + }) + .collect::>>(); + + log::trace!("[ECC] EcPairing Inputs RLC Assigned:"); + log_context_cursor!(ctx); + + // Whether all the pairs are (G1::identity, G2::valid) or (G1::valid, G2::identity) form. + let all_pairs_zero = ecc_chip.field_chip().range().gate().and_many( + ctx, + decomposed_pairs + .iter() + .map(|(is_zero_pair, _, _, _)| QuantumCell::Existing(*is_zero_pair)) + .collect_vec(), + ); + + // dummy G1, G2 points and G1::identity, G2::generator. + let dummy_g1 = ecc_chip.load_random_point::(ctx); + let dummy_g2 = ecc2_chip.load_random_point::(ctx); + let identity_g1 = EcPoint::construct( + ecc_chip + .field_chip() + .load_constant(ctx, fe_to_biguint(&Fq::zero())), + ecc_chip + .field_chip() + .load_constant(ctx, fe_to_biguint(&Fq::zero())), + ); + let generator_g2 = { + let g2_gen = G2Affine::generator(); + EcPoint::>>::construct( + ecc2_chip.field_chip().load_constant(ctx, g2_gen.x), + ecc2_chip.field_chip().load_constant(ctx, g2_gen.y), + ) + }; + // A pairing op satisfying the pairing check. + type TupleG1sG2s = ( + Vec>>, + Vec>>>, + ); + let (dummy_pair_check_ok_g1s, dummy_pair_check_ok_g2s): TupleG1sG2s = + EcPairingOp::dummy_pairing_check_ok() + .pairs + .iter() + .map(|pair| { + let (g1_point, g2_point) = + pair.as_g1_g2().expect("dummy pairing check OK pair"); + ( + EcPoint::>::construct( + ecc_chip + .field_chip() + .load_constant(ctx, fe_to_biguint(&g1_point.x)), + ecc_chip + .field_chip() + .load_constant(ctx, fe_to_biguint(&g1_point.y)), + ), + EcPoint::>>::construct( + ecc2_chip.field_chip().load_constant(ctx, g2_point.x), + ecc2_chip.field_chip().load_constant(ctx, g2_point.y), + ), + ) + }) + .unzip(); + + // process pairs so that we pass only valid input to the multi_miller_loop. + let pairs = decomposed_pairs + .iter() + .enumerate() + .map(|(idx, (is_zero_pair, is_pair_valid, g1, g2))| { + // we should swap (G1, G2) with (G1::identity, G2::generator) if: + // - G1 == (0, 0) && G2 is valid + // - G2 == (0, 0, 0, 0) && G1 is valid + // + // we should swap (G1, G2) with (G1::random, G2::random) if: + // - G1 is invalid + // - G2 is invalid + ( + { + let swapped_g1 = + ecc_chip.select(ctx, &g1.ec_point, &dummy_g1, is_pair_valid); + let swapped_g1 = + ecc_chip.select(ctx, &identity_g1, &swapped_g1, is_zero_pair); + ecc_chip.select( + ctx, + &dummy_pair_check_ok_g1s[idx], + &swapped_g1, + &all_pairs_zero, + ) + }, + { + let swapped_x = + fp2_chip.select(ctx, &g2.ec_point.x, &dummy_g2.x, is_pair_valid); + let swapped_x = + fp2_chip.select(ctx, &generator_g2.x, &swapped_x, is_zero_pair); + let swapped_x = fp2_chip.select( + ctx, + &dummy_pair_check_ok_g2s[idx].x, + &swapped_x, + &all_pairs_zero, + ); + let swapped_y = + fp2_chip.select(ctx, &g2.ec_point.y, &dummy_g2.y, is_pair_valid); + let swapped_y = + fp2_chip.select(ctx, &generator_g2.y, &swapped_y, is_zero_pair); + let swapped_y = fp2_chip.select( + ctx, + &dummy_pair_check_ok_g2s[idx].y, + &swapped_y, + &all_pairs_zero, + ); + EcPoint::construct(swapped_x, swapped_y) + }, + ) + }) + .collect_vec(); + let pairs = pairs.iter().map(|(g1, g2)| (g1, g2)).collect_vec(); + + // if the entire input to ecPairing is valid. + let is_valid = ecc_chip.field_chip().range().gate().and_many( + ctx, + decomposed_pairs + .iter() + .map(|&(_, is_pair_valid, _, _)| QuantumCell::Existing(is_pair_valid)) + .collect_vec(), + ); + + // multi-miller loop and final exponentiation to do pairing check. + let success = { + let gt = { + let gt = pairing_chip.multi_miller_loop(ctx, pairs); + pairing_chip.final_exp(ctx, >) + }; + // whether pairing check was successful. + let one = fp12_chip.load_constant(ctx, Fq12::one()); + fp12_chip.is_equal(ctx, >, &one) + }; + // success == true only if pairing check and validity are both satisfied. + let success = ecc_chip.field_chip().range().gate().and( + ctx, + QuantumCell::Existing(is_valid), + QuantumCell::Existing(success), + ); + // if all inputs were zeroes, i.e. either: + // - G1 == (0, 0) and G2 == random valid point on G2 + // - G2 == (0, 0, 0, 0) and G1 == random valid point on G1 + // + // then success == true, i.e. success - all_pairs_zero == boolean + let success_minus_all_pairs_zero = ecc_chip + .field_chip() + .range() + .gate() + .load_witness(ctx, success.value - all_pairs_zero.value); + ecc_chip + .field_chip() + .range() + .gate() + .assert_bit(ctx, success_minus_all_pairs_zero); + + let op_output = ecc_chip.field_chip().range().gate().load_witness( + ctx, + Value::known(op.output.to_scalar().expect("EcPairing output = {0, 1}")), + ); + ecc_chip.field_chip().range().gate().assert_equal( + ctx, + QuantumCell::Existing(success), + QuantumCell::Existing(op_output), + ); + + log::trace!("[ECC] EcPairingAssignment END:"); + log_context_cursor!(ctx); + + EcPairingDecomposed { + is_valid, + input_cells, + success, + } + } + + /// Handles Phase2 for EcAdd operation and returns the RLC'd x and y co-ordinates of the G1 + /// elements. + fn assign_ec_add( + &self, + ctx: &mut Context, + ec_add_decomposed: &EcAddDecomposed, + ecc_chip: &EccChip>, + keccak_powers: &[QuantumCell], + ) -> EcAddAssigned { + EcAddAssigned { + is_valid: ec_add_decomposed.is_valid, + point_p: G1Assigned { + x_rlc: ecc_chip.field_chip().range().gate().inner_product( + ctx, + ec_add_decomposed.point_p.x_cells.clone(), + keccak_powers.iter().cloned(), + ), + y_rlc: ecc_chip.field_chip().range().gate().inner_product( + ctx, + ec_add_decomposed.point_p.y_cells.clone(), + keccak_powers.iter().cloned(), + ), + }, + point_q: G1Assigned { + x_rlc: ecc_chip.field_chip().range().gate().inner_product( + ctx, + ec_add_decomposed.point_q.x_cells.clone(), + keccak_powers.iter().cloned(), + ), + y_rlc: ecc_chip.field_chip().range().gate().inner_product( + ctx, + ec_add_decomposed.point_q.y_cells.clone(), + keccak_powers.iter().cloned(), + ), + }, + point_r: G1Assigned { + x_rlc: ecc_chip.field_chip().range().gate().inner_product( + ctx, + ec_add_decomposed.point_r.x_cells.clone(), + keccak_powers.iter().cloned(), + ), + y_rlc: ecc_chip.field_chip().range().gate().inner_product( + ctx, + ec_add_decomposed.point_r.y_cells.clone(), + keccak_powers.iter().cloned(), + ), + }, + } + } + + /// Handles Phase2 for EcMul operation and returns the RLC'd x and y co-ordinates of the G1 + /// elements, and the assigned scalar field element. + fn assign_ec_mul( + &self, + ctx: &mut Context, + ec_mul_decomposed: &EcMulDecomposed, + ecc_chip: &EccChip>, + keccak_powers: &[QuantumCell], + ) -> EcMulAssigned { + EcMulAssigned { + is_valid: ec_mul_decomposed.is_valid, + point_p: G1Assigned { + x_rlc: ecc_chip.field_chip().range().gate().inner_product( + ctx, + ec_mul_decomposed.point_p.x_cells.clone(), + keccak_powers.iter().cloned(), + ), + y_rlc: ecc_chip.field_chip().range().gate().inner_product( + ctx, + ec_mul_decomposed.point_p.y_cells.clone(), + keccak_powers.iter().cloned(), + ), + }, + scalar_s: ec_mul_decomposed.scalar_s.clone(), + point_r: G1Assigned { + x_rlc: ecc_chip.field_chip().range().gate().inner_product( + ctx, + ec_mul_decomposed.point_r.x_cells.clone(), + keccak_powers.iter().cloned(), + ), + y_rlc: ecc_chip.field_chip().range().gate().inner_product( + ctx, + ec_mul_decomposed.point_r.y_cells.clone(), + keccak_powers.iter().cloned(), + ), + }, + } + } + + /// Handles Phase2 for EcPairing operation and returns the RLC'd input bytes. + fn assign_ec_pairing( + &self, + ctx: &mut Context, + ec_pairing_decomposed: &EcPairingDecomposed, + ecc_chip: &EccChip>, + keccak_powers: &[QuantumCell], + ) -> EcPairingAssigned { + EcPairingAssigned { + is_valid: ec_pairing_decomposed.is_valid, + input_rlc: ecc_chip.field_chip().range().gate().inner_product( + ctx, + ec_pairing_decomposed.input_cells.clone().into_iter().rev(), + keccak_powers.iter().cloned(), + ), + success: ec_pairing_decomposed.success, + } + } + + /// Handle G1 point and return its decomposed state. + fn handle_g1( + &self, + ctx: &mut Context, + ecc_chip: &EccChip>, + g1: G1Affine, + powers_of_256: &[QuantumCell], + ) -> G1Decomposed { + let ec_point = ecc_chip.load_private(ctx, (Value::known(g1.x), Value::known(g1.y))); + let (x_cells, y_cells) = self.decompose_g1(g1); + self.assert_crt_repr(ctx, ecc_chip, &ec_point.x, &x_cells, powers_of_256); + self.assert_crt_repr(ctx, ecc_chip, &ec_point.y, &y_cells, powers_of_256); + G1Decomposed { + ec_point, + x_cells, + y_cells, + } + } + + /// Handle a scalar field element and return its assigned state. + fn handle_fr( + &self, + ctx: &mut Context, + fr_chip: &FpConfig, + s: Fr, + ) -> ScalarAssigned { + let scalar = fr_chip.load_private(ctx, FpConfig::::fe_to_witness(&Value::known(s))); + ScalarAssigned { scalar } + } + + /// Precheck a 32-bytes word input supposed to be bn256::Fq and return its CRT integer + /// representation. We also return the LE-bytes and assigned values to indicate whether the + /// value is within Fq::MODULUS and whether or not it is zero. + fn precheck_fq( + &self, + ctx: &mut Context, + ecc_chip: &EccChip>, + word_value: U256, + powers_of_256: &[QuantumCell], + ) -> ( + CRTInteger, // CRT representation. + Vec>, // LE bytes as witness. + AssignedValue, // value < Fq::MODULUS + AssignedValue, // value == 0 + ) { + let value = Value::known(num_bigint::BigInt::from( + num_bigint::BigUint::from_bytes_le(&word_value.to_le_bytes()), + )); + let vec_value = decompose_bigint_option::( + value.as_ref(), + ecc_chip.field_chip.num_limbs, + ecc_chip.field_chip.limb_bits, + ); + let limbs = ecc_chip + .field_chip() + .range() + .gate() + .assign_witnesses(ctx, vec_value); + let native_value = OverflowInteger::evaluate( + ecc_chip.field_chip().range().gate(), + ctx, + &limbs, + ecc_chip.field_chip.limb_bases.iter().cloned(), + ); + let overflow_int = OverflowInteger::construct(limbs, ecc_chip.field_chip.limb_bits); + let crt_int = CRTInteger::construct(overflow_int, native_value, value); + let cells = word_value + .to_le_bytes() + .map(|b| QuantumCell::Witness(Value::known(F::from(b as u64)))); + self.assert_crt_repr(ctx, ecc_chip, &crt_int, &cells, powers_of_256); + let is_lt_mod = ecc_chip.field_chip().is_less_than_p(ctx, &crt_int); + let is_zero = big_is_zero::positive( + ecc_chip.field_chip().range().gate(), + ctx, + &crt_int.truncation, + ); + let is_zero = ecc_chip.field_chip().range().gate().and( + ctx, + QuantumCell::Existing(is_lt_mod), + QuantumCell::Existing(is_zero), + ); + (crt_int, cells.to_vec(), is_lt_mod, is_zero) + } + + /// Return an assigned value that indicates whether the given point is on curve G1 or identity + /// point. + fn is_on_curveg1_or_infinity( + &self, + ctx: &mut Context, + ecc_chip: &EccChip>, + x: &CRTInteger, + x_is_zero: AssignedValue, + y: &CRTInteger, + y_is_zero: AssignedValue, + ) -> AssignedValue { + let lhs = ecc_chip.field_chip().mul_no_carry(ctx, y, y); + let mut rhs = ecc_chip.field_chip().mul(ctx, x, x); + rhs = ecc_chip.field_chip().mul_no_carry(ctx, &rhs, x); + + let b = FpConfig::::fe_to_constant(G1Affine::b()); + rhs = ecc_chip.field_chip().add_constant_no_carry(ctx, &rhs, b); + let mut diff = ecc_chip.field_chip().sub_no_carry(ctx, &lhs, &rhs); + diff = ecc_chip.field_chip().carry_mod(ctx, &diff); + + let is_on_curve = ecc_chip.field_chip().is_zero(ctx, &diff); + + ecc_chip.field_chip().range().gate().or_and( + ctx, + QuantumCell::Existing(is_on_curve), + QuantumCell::Existing(x_is_zero), + QuantumCell::Existing(y_is_zero), + ) + } + + /// Return an assigned value that indicates whether the given point is on curve G2 or identity + /// point. + fn is_on_curveg2_or_infinity( + &self, + ctx: &mut Context, + fp2_chip: &Fp2Chip, Fq2>, + x: &FieldExtPoint>, + x_is_zero: AssignedValue, + y: &FieldExtPoint>, + y_is_zero: AssignedValue, + ) -> AssignedValue { + let lhs = fp2_chip.mul_no_carry(ctx, y, y); + let mut rhs = fp2_chip.mul(ctx, x, x); + rhs = fp2_chip.mul_no_carry(ctx, &rhs, x); + + let b = Fp2Chip::, Fq2>::fe_to_constant(G2Affine::b()); + rhs = fp2_chip.add_constant_no_carry(ctx, &rhs, b); + let mut diff = fp2_chip.sub_no_carry(ctx, &lhs, &rhs); + diff = fp2_chip.carry_mod(ctx, &diff); + + let is_on_curve = fp2_chip.is_zero(ctx, &diff); + + fp2_chip.range().gate().or_and( + ctx, + QuantumCell::Existing(is_on_curve), + QuantumCell::Existing(x_is_zero), + QuantumCell::Existing(y_is_zero), + ) + } + + /// Assert that a CRT integer's bytes representation matches the limb values. + fn assert_crt_repr( + &self, + ctx: &mut Context, + ecc_chip: &EccChip>, + crt_int: &CRTInteger, + bytes: &[QuantumCell], + powers_of_256: &[QuantumCell], + ) { + debug_assert_eq!(bytes.len(), 32); + debug_assert!(powers_of_256.len() >= 11); + + let limbs = [ + bytes[0..11].to_vec(), + bytes[11..22].to_vec(), + bytes[22..32].to_vec(), + ] + .map(|limb_bytes| { + ecc_chip.field_chip().range().gate().inner_product( + ctx, + limb_bytes, + powers_of_256[0..11].to_vec(), + ) + }); + + for (&limb_recovered, &limb_value) in limbs.iter().zip_eq(crt_int.truncation.limbs.iter()) { + ecc_chip.field_chip().range().gate().assert_equal( + ctx, + QuantumCell::Existing(limb_recovered), + QuantumCell::Existing(limb_value), + ); + } + } + + /// Decompose G1 element into cells representing its x and y co-ordinates. + fn decompose_g1(&self, g1: G1Affine) -> (Vec>, Vec>) { + ( + g1.x.to_bytes() + .iter() + .map(|&x| QuantumCell::Witness(Value::known(F::from(u64::from(x))))) + .collect_vec(), + g1.y.to_bytes() + .iter() + .map(|&y| QuantumCell::Witness(Value::known(F::from(u64::from(y))))) + .collect_vec(), + ) + } +} + +impl SubCircuit for EccCircuit { + type Config = EccCircuitConfig; + + fn new_from_block(block: &Block) -> Self { + Self { + max_add_ops: block.circuits_params.max_ec_ops.ec_add, + max_mul_ops: block.circuits_params.max_ec_ops.ec_mul, + max_pairing_ops: block.circuits_params.max_ec_ops.ec_pairing, + add_ops: block.get_ec_add_ops(), + mul_ops: block.get_ec_mul_ops(), + pairing_ops: block.get_ec_pairing_ops(), + _marker: PhantomData, + } + } + + /// Returns number of unusable rows of the SubCircuit, which should be + /// `meta.blinding_factors() + 1`. + fn unusable_rows() -> usize { + [ + KeccakCircuit::::unusable_rows(), + EvmCircuit::::unusable_rows(), + // may include additional subcircuits here + ] + .into_iter() + .max() + .unwrap() + } + + fn synthesize_sub( + &self, + config: &Self::Config, + challenges: &Challenges>, + layouter: &mut impl Layouter, + ) -> Result<(), Error> { + config.fp_config.range.load_lookup_table(layouter)?; + self.assign(layouter, config, challenges)?; + Ok(()) + } + + fn min_num_rows_block(block: &Block) -> (usize, usize) { + let row_num = if block.circuits_params.max_vertical_circuit_rows == 0 { + Self::min_num_rows() + } else { + block.circuits_params.max_vertical_circuit_rows + }; + + let ec_adds = block.get_ec_add_ops().len(); + let ec_muls = block.get_ec_mul_ops().len(); + let ec_pairings = block.get_ec_pairing_ops().len(); + let max_ec_ops = &block.circuits_params.max_ec_ops; + log::debug!("ecc circuit row usage: ecadd {ec_adds}/{}, ecmul {ec_muls}/{}, ecpairing {ec_pairings}/{}", + max_ec_ops.ec_add, max_ec_ops.ec_mul, max_ec_ops.ec_pairing); + + // Instead of showing actual minimum row usage, + // halo2-lib based circuits use min_row_num to represent a percentage of total-used capacity + // This functionality allows l2geth to decide if additional ops can be added. + let min_row_num = [ + (row_num / max_ec_ops.ec_add) * ec_adds, + (row_num / max_ec_ops.ec_mul) * ec_muls, + (row_num / max_ec_ops.ec_pairing) * ec_pairings, + ] + .into_iter() + .max() + .unwrap(); + + (min_row_num, row_num) + } +} diff --git a/zkevm-circuits/src/ecc_circuit/dev.rs b/zkevm-circuits/src/ecc_circuit/dev.rs new file mode 100644 index 0000000000..21147349bd --- /dev/null +++ b/zkevm-circuits/src/ecc_circuit/dev.rs @@ -0,0 +1,46 @@ +use eth_types::Field; +use halo2_proofs::{ + circuit::{Layouter, SimpleFloorPlanner}, + plonk::{Challenge, Circuit, ConstraintSystem, Error}, +}; + +use crate::{ + table::EccTable, + util::{Challenges, SubCircuit, SubCircuitConfig}, +}; + +use super::{EccCircuit, EccCircuitConfig, EccCircuitConfigArgs}; + +impl Circuit for EccCircuit { + type Config = (EccCircuitConfig, Challenges); + type FloorPlanner = SimpleFloorPlanner; + + fn without_witnesses(&self) -> Self { + Self::default() + } + + fn configure(meta: &mut ConstraintSystem) -> Self::Config { + let ecc_table = EccTable::construct(meta); + let challenges = Challenges::construct(meta); + let challenge_exprs = challenges.exprs(meta); + ( + EccCircuitConfig::new( + meta, + EccCircuitConfigArgs { + ecc_table, + challenges: challenge_exprs, + }, + ), + challenges, + ) + } + + fn synthesize( + &self, + config: Self::Config, + mut layouter: impl Layouter, + ) -> Result<(), Error> { + let challenge_values = config.1.values(&layouter); + self.synthesize_sub(&config.0, &challenge_values, &mut layouter) + } +} diff --git a/zkevm-circuits/src/ecc_circuit/test.rs b/zkevm-circuits/src/ecc_circuit/test.rs new file mode 100644 index 0000000000..4de6e9fc3b --- /dev/null +++ b/zkevm-circuits/src/ecc_circuit/test.rs @@ -0,0 +1,620 @@ +use std::{ + marker::PhantomData, + ops::{Add, Mul, Neg}, +}; + +use bus_mapping::circuit_input_builder::{ + EcAddOp, EcMulOp, EcPairingOp, EcPairingPair, PrecompileEcParams, +}; +use eth_types::{Field, U256}; +use halo2_proofs::{ + arithmetic::Field as ArithmeticField, + dev::MockProver, + halo2curves::bn256::{Fr, G1Affine, G2Affine}, +}; +use rand::{CryptoRng, Rng, RngCore}; + +use crate::ecc_circuit::EccCircuit; + +fn run( + k: u32, + max_ec_ops: PrecompileEcParams, + add_ops: Vec, + mul_ops: Vec, + pairing_ops: Vec, +) { + let circuit = EccCircuit:: { + max_add_ops: max_ec_ops.ec_add, + max_mul_ops: max_ec_ops.ec_mul, + max_pairing_ops: max_ec_ops.ec_pairing, + add_ops, + mul_ops, + pairing_ops, + _marker: PhantomData, + }; + + let prover = match MockProver::run(k, &circuit, vec![]) { + Ok(prover) => prover, + Err(e) => panic!("{e:#?}"), + }; + + if MUST_FAIL { + if let Ok(()) = prover.verify() { + panic!("expected failure, found success"); + } + } else if let Err(e) = prover.verify() { + panic!("{e:#?}"); + } +} + +trait GenRand { + fn gen_rand(r: &mut R, is_neg: bool) -> Self; +} + +impl GenRand for EcAddOp { + fn gen_rand(mut r: &mut R, is_neg: bool) -> Self { + let p = G1Affine::random(&mut r); + let q = G1Affine::random(&mut r); + let r = if is_neg { + G1Affine::random(&mut r) + } else { + p.add(&q).into() + }; + Self { + p: ( + U256::from_little_endian(&p.x.to_bytes()), + U256::from_little_endian(&p.y.to_bytes()), + ), + q: ( + U256::from_little_endian(&q.x.to_bytes()), + U256::from_little_endian(&q.y.to_bytes()), + ), + r: Some(r), + } + } +} + +impl GenRand for EcMulOp { + fn gen_rand(mut r: &mut R, is_neg: bool) -> Self { + let p = G1Affine::random(&mut r); + let s = match r.gen::() { + true => ::random(&mut r), + false => Fr::one(), + }; + let r = if is_neg { + G1Affine::random(&mut r) + } else { + p.mul(&s).into() + }; + Self { + p: ( + U256::from_little_endian(&p.x.to_bytes()), + U256::from_little_endian(&p.y.to_bytes()), + ), + s, + r: Some(r), + } + } +} + +impl GenRand for EcPairingOp { + fn gen_rand(mut r: &mut R, is_neg: bool) -> Self { + let alpha = Fr::random(&mut r); + let beta = Fr::random(&mut r); + let point_p = G1Affine::from(G1Affine::generator() * alpha); + let point_p_negated = point_p.neg(); + let point_q = G2Affine::from(G2Affine::generator() * beta); + let point_s = G1Affine::from(G1Affine::generator() * alpha * beta); + let point_t = G2Affine::generator(); + + let alpha = Fr::random(&mut r); + let beta = Fr::random(&mut r); + let point_a = G1Affine::from(G1Affine::generator() * alpha); + let point_a_negated = point_a.neg(); + let point_b = G2Affine::from(G2Affine::generator() * beta); + let point_c = G1Affine::from(G1Affine::generator() * alpha * beta); + let point_d = G2Affine::generator(); + + let mut pairs = [ + EcPairingPair::new(point_p_negated, point_q), + EcPairingPair::new(point_s, point_t), + EcPairingPair::new(point_a_negated, point_b), + EcPairingPair::new(point_c, point_d), + ]; + let output = eth_types::U256::one(); + + if is_neg { + match r.gen::() { + // change output. + true => Self { + pairs, + output: eth_types::U256::one() - output, + ..Default::default() + }, + // change a point in one of the pairs. + false => { + let altered: G1Affine = point_p_negated.add(&G1Affine::generator()).into(); + pairs[0].g1_point.0 = U256::from_little_endian(&altered.x.to_bytes()); + pairs[0].g1_point.1 = U256::from_little_endian(&altered.y.to_bytes()); + Self { + pairs, + output, + ..Default::default() + } + } + } + } else { + Self { + pairs, + output, + ..Default::default() + } + } + } +} + +fn gen(mut r: &mut R, max_len: usize, is_neg: bool) -> Vec { + std::iter::repeat(0) + .take(max_len) + .map(move |_| T::gen_rand(&mut r, is_neg)) + .collect() +} + +mod valid_invalid_cases { + use super::*; + use eth_types::word; + use snark_verifier::util::arithmetic::PrimeCurveAffine; + use std::sync::LazyLock; + + pub(crate) static EC_ADD_OPS: LazyLock> = LazyLock::new(|| { + vec![ + // 1. valid: P == Q == G1::generator + { + let p = G1Affine::generator(); + EcAddOp { + p: (U256::from(1), U256::from(2)), + q: (U256::from(1), U256::from(2)), + r: Some(p.add(&p).into()), + } + }, + // 2. invalid: P not on curve + EcAddOp { + p: (U256::from(2), U256::from(3)), + q: (U256::from(1), U256::from(2)), + r: None, + }, + // 3. valid: all zeroes + EcAddOp { + p: (U256::zero(), U256::zero()), + q: (U256::zero(), U256::zero()), + r: Some(G1Affine::identity()), + }, + // 4. invalid: Px and Py > Fq::MODULUS + EcAddOp { + p: ( + word!("0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD48"), /* p + 1 */ + word!("0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD49"), /* p + 2 */ + ), + q: (U256::from(1), U256::from(2)), + r: None, + }, + // 5. valid: P == -Q + EcAddOp { + p: (U256::from(1), U256::from(2)), + q: ( + U256::from(1), + word!("0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45"), + ), + r: Some(G1Affine::identity()), + }, + ] + }); + + pub(crate) static EC_MUL_OPS: LazyLock> = LazyLock::new(|| { + vec![ + // 1. valid: P = G1::generator, s = 3 + EcMulOp { + p: (U256::from(1), U256::from(2)), + s: Fr::from(3), + r: Some({ + let p = G1Affine::generator(); + let s = Fr::from(3); + p.mul(s).into() + }), + }, + // 2. invalid: P = (2, 3), i.e. not on curve + EcMulOp { + p: (U256::from(2), U256::from(3)), + s: Fr::from(3), + r: None, + }, + // 3. invalid: P == (p + 1, p + 2), i.e. > Fq::MODULUS + EcMulOp { + p: ( + word!("0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD48"), /* p + 1 */ + word!("0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD49"), /* p + 2 */ + ), + s: Fr::from(3), + r: None, + }, + ] + }); + pub(crate) static EC_PAIRING_OPS1: LazyLock> = LazyLock::new(|| { + vec![ + // 1. valid: pairing_check == 1 + { + let alpha = Fr::from(0x102030); + let beta = Fr::from(0x413121); + let point_p = G1Affine::from(G1Affine::generator() * alpha); + let point_p_negated = point_p.neg(); + let point_q = G2Affine::from(G2Affine::generator() * beta); + let point_s = G1Affine::from(G1Affine::generator() * alpha * beta); + let point_t = G2Affine::generator(); + let pairs = [ + EcPairingPair::new(point_p_negated, point_q), + EcPairingPair::new(point_s, point_t), + EcPairingPair::padding_pair(), + EcPairingPair::padding_pair(), + ]; + EcPairingOp { + pairs, + output: U256::one(), + ..Default::default() + } + }, + // 2. invalid: field element > Fq::MODULUS, mod p is OK + { + let alpha = Fr::from(0x102030); + let beta = Fr::from(0x413121); + let point_p = G1Affine::from(G1Affine::generator() * alpha); + let point_p_negated = point_p.neg(); + let point_q = G2Affine::from(G2Affine::generator() * beta); + let point_t = G2Affine::from(G2Affine::generator() * alpha * beta); + let pairs = [ + EcPairingPair::new(point_p_negated, point_q), + EcPairingPair { + g1_point: ( + word!("0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD48"), + word!("0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD49"), + ), + g2_point: ( + U256::from_little_endian(&point_t.x.c1.to_bytes()), + U256::from_little_endian(&point_t.x.c0.to_bytes()), + U256::from_little_endian(&point_t.y.c1.to_bytes()), + U256::from_little_endian(&point_t.y.c0.to_bytes()), + ), + }, + EcPairingPair::padding_pair(), + EcPairingPair::padding_pair(), + ]; + EcPairingOp { + pairs, + output: U256::zero(), + ..Default::default() + } + }, + ] + }); + pub(crate) static EC_PAIRING_OPS2: LazyLock> = LazyLock::new(|| { + vec![ + // 3. valid: pairing_check == 0 + { + let alpha = Fr::from(0x102030); + let beta = Fr::from(0x413121); + let gamma = Fr::from(0x591242); + let point_p = G1Affine::from(G1Affine::generator() * alpha); + let point_p_negated = point_p.neg(); + let point_q = G2Affine::from(G2Affine::generator() * beta); + let point_s = G1Affine::from(G1Affine::generator() * gamma); + let point_t = G2Affine::generator(); + let pairs = [ + EcPairingPair::new(point_p_negated, point_q), + EcPairingPair::new(point_s, point_t), + EcPairingPair::padding_pair(), + EcPairingPair::padding_pair(), + ]; + EcPairingOp { + pairs, + output: U256::zero(), + ..Default::default() + } + }, + // 4. invalid: not on curve G1. + EcPairingOp { + pairs: [ + EcPairingPair { + g1_point: (U256::from(3), U256::from(4)), + g2_point: (U256::zero(), U256::zero(), U256::zero(), U256::zero()), + }, + EcPairingPair::padding_pair(), + EcPairingPair::padding_pair(), + EcPairingPair::padding_pair(), + ], + output: 0.into(), + ..Default::default() + }, + ] + }); + pub(crate) static EC_PAIRING_OPS3: LazyLock> = LazyLock::new(|| { + vec![ + // 5. invalid: not on curve G2. + EcPairingOp { + pairs: [ + EcPairingPair { + g1_point: (U256::zero(), U256::zero()), + g2_point: (U256::from(3), U256::from(4), U256::from(5), U256::from(6)), + }, + EcPairingPair::padding_pair(), + EcPairingPair::padding_pair(), + EcPairingPair::padding_pair(), + ], + output: 0.into(), + ..Default::default() + }, + // 6. valid: all zero. + EcPairingOp { + pairs: [ + EcPairingPair::padding_pair(), + EcPairingPair::padding_pair(), + EcPairingPair::padding_pair(), + EcPairingPair::padding_pair(), + ], + output: 1.into(), + ..Default::default() + }, + ] + }); + pub(crate) static EC_PAIRING_OPS4: LazyLock> = LazyLock::new(|| { + vec![ + // 7. valid: [(G1::gen, G2::gen), (-G1::gen, G2::gen)] + EcPairingOp { + pairs: [ + EcPairingPair::new(G1Affine::generator(), G2Affine::generator()), + EcPairingPair::new(G1Affine::generator().neg(), G2Affine::generator()), + EcPairingPair::padding_pair(), + EcPairingPair::padding_pair(), + ], + output: 1.into(), + ..Default::default() + }, + // 8. valid: [(G1::gen, G2::gen), (-G1::gen, G2::gen); 2] + EcPairingOp { + pairs: [ + EcPairingPair::new(G1Affine::generator(), G2Affine::generator()), + EcPairingPair::new(G1Affine::generator().neg(), G2Affine::generator()), + EcPairingPair::new(G1Affine::generator(), G2Affine::generator()), + EcPairingPair::new(G1Affine::generator().neg(), G2Affine::generator()), + ], + output: 1.into(), + ..Default::default() + }, + ] + }); +} + +#[test] +fn test_ecc_circuit_valid_invalid() { + use crate::ecc_circuit::util::LOG_TOTAL_NUM_ROWS; + use halo2_proofs::halo2curves::bn256::Fr; + use valid_invalid_cases::{ + EC_ADD_OPS, EC_MUL_OPS, EC_PAIRING_OPS1, EC_PAIRING_OPS2, EC_PAIRING_OPS3, EC_PAIRING_OPS4, + }; + + run::( + LOG_TOTAL_NUM_ROWS, + PrecompileEcParams::default(), + EC_ADD_OPS.clone(), + EC_MUL_OPS.clone(), + EC_PAIRING_OPS1.clone(), + ); + + run::( + LOG_TOTAL_NUM_ROWS, + PrecompileEcParams { + ec_add: 0, + ec_mul: 0, + ec_pairing: 2, + }, + vec![], + vec![], + EC_PAIRING_OPS2.clone(), + ); + + run::( + LOG_TOTAL_NUM_ROWS, + PrecompileEcParams { + ec_add: 0, + ec_mul: 0, + ec_pairing: 2, + }, + vec![], + vec![], + EC_PAIRING_OPS3.clone(), + ); + + run::( + LOG_TOTAL_NUM_ROWS, + PrecompileEcParams { + ec_add: 0, + ec_mul: 0, + ec_pairing: 2, + }, + vec![], + vec![], + EC_PAIRING_OPS4.clone(), + ); +} + +#[ignore = "generate a lot of random invalid inputs for bn254 add"] +#[test] +fn test_invalid_ec_add() { + use crate::ecc_circuit::util::LOG_TOTAL_NUM_ROWS; + use halo2_proofs::halo2curves::{bn256::Fq, group::ff::PrimeField}; + use itertools::Itertools; + use num::Integer; + use rand::thread_rng; + + let u256_max = U256::from_little_endian(&[0xff; 32]); + + // 1. p is on g1 but p.x > p and p.y < p + // and p.x is close to 2^256 + // and q is generator + let mut rng = thread_rng(); + let get_g1_from_x_coordinate = |x: Fq| { + let b = Fq::from(3); + // y^2 = x^3 + b (mod Fq) + let y2 = x * x * x + b; + let y = Fq::sqrt(&y2); + y.map(|y| { + ( + U256::from_little_endian(&x.to_repr()), + U256::from_little_endian(&y.to_repr()), + ) + }) + }; + let ec_adds = (0..50) + .map(|_| { + let px = u256_max - (rng.next_u64() % 1024); + let x = Fq::from_raw(px.0); + (px, get_g1_from_x_coordinate(x)) + }) + .filter(|(_, p)| p.is_some().into()) + .map(|(px, p)| { + let p = (px, p.unwrap().1); + let q = (U256::from(1), U256::from(2)); + + EcAddOp { p, q, r: None } + }) + .collect_vec(); + + run::( + LOG_TOTAL_NUM_ROWS, + PrecompileEcParams { + ec_add: ec_adds.len(), + ec_mul: 0, + ec_pairing: 0, + }, + ec_adds, + vec![], + vec![], + ); + + // 2. p is on g1 but p.x[i] is close to Fq::MODULUS.limbs[i] and p.y < p + // and q is generator + let ec_adds = (0..50) + .map(|_| { + let fq_limbs: [u64; 4] = [ + 0x3c208c16d87cfd47, + 0x97816a916871ca8d, + 0xb85045b68181585d, + 0x30644e72e131a029, + ]; + let mut px_limbs = [0u64; 4]; + px_limbs.iter_mut().enumerate().for_each(|(j, limb)| { + if j.is_odd() { + *limb = fq_limbs[j] + rng.next_u64() % 1024; + } else { + *limb = fq_limbs[j] - rng.next_u64() % 1024; + } + }); + let x = Fq::from_raw(px_limbs); + let px = U256(px_limbs); + (px, get_g1_from_x_coordinate(x)) + }) + .filter(|(_, p)| p.is_some().into()) + .map(|(px, p)| { + let p = (px, p.unwrap().1); + let q = (U256::from(1), U256::from(2)); + + EcAddOp { p, q, r: None } + }) + .collect_vec(); + + run::( + LOG_TOTAL_NUM_ROWS, + PrecompileEcParams { + ec_add: ec_adds.len(), + ec_mul: 0, + ec_pairing: 0, + }, + ec_adds, + vec![], + vec![], + ); +} + +#[test] +fn test_ecc_circuit_positive() { + use crate::ecc_circuit::util::LOG_TOTAL_NUM_ROWS; + use halo2_proofs::halo2curves::bn256::Fr; + + let mut rng = rand::thread_rng(); + + run::( + LOG_TOTAL_NUM_ROWS, + PrecompileEcParams::default(), + gen(&mut rng, 9, false), + gen(&mut rng, 9, false), + gen(&mut rng, 1, false), + ); +} + +#[test] +fn test_ecc_circuit_negative() { + use crate::ecc_circuit::util::LOG_TOTAL_NUM_ROWS; + use halo2_proofs::halo2curves::bn256::Fr; + + let mut rng = rand::thread_rng(); + + run::( + LOG_TOTAL_NUM_ROWS, + PrecompileEcParams::default(), + gen(&mut rng, 9, true), + gen(&mut rng, 9, true), + gen(&mut rng, 1, true), + ); +} + +#[test] +fn variadic_size_check() { + use crate::ecc_circuit::util::LOG_TOTAL_NUM_ROWS; + use halo2_proofs::halo2curves::bn256::Fr; + use valid_invalid_cases::{EC_ADD_OPS, EC_MUL_OPS, EC_PAIRING_OPS1, EC_PAIRING_OPS2}; + + let mut rng = rand::thread_rng(); + + let default_params = PrecompileEcParams::default(); + + let circuit = EccCircuit:: { + max_add_ops: default_params.ec_add, + max_mul_ops: default_params.ec_mul, + max_pairing_ops: default_params.ec_pairing, + add_ops: gen(&mut rng, 25, false), + mul_ops: gen(&mut rng, 20, false), + pairing_ops: EC_PAIRING_OPS1.clone(), + _marker: PhantomData, + }; + let prover1 = MockProver::::run(LOG_TOTAL_NUM_ROWS, &circuit, vec![]).unwrap(); + + let circuit = EccCircuit:: { + max_add_ops: default_params.ec_add, + max_mul_ops: default_params.ec_mul, + max_pairing_ops: default_params.ec_pairing, + add_ops: { + let mut ops = gen(&mut rng, 30, false); + ops.extend_from_slice(&EC_ADD_OPS); + ops + }, + mul_ops: { + let mut ops = gen(&mut rng, 30, false); + ops.extend_from_slice(&EC_MUL_OPS); + ops + }, + pairing_ops: EC_PAIRING_OPS2.clone(), + _marker: PhantomData, + }; + let prover2 = MockProver::::run(LOG_TOTAL_NUM_ROWS, &circuit, vec![]).unwrap(); + + assert_eq!(prover1.fixed(), prover2.fixed()); + assert_eq!(prover1.permutation(), prover2.permutation()); +} diff --git a/zkevm-circuits/src/ecc_circuit/util.rs b/zkevm-circuits/src/ecc_circuit/util.rs new file mode 100644 index 0000000000..92c49c35d3 --- /dev/null +++ b/zkevm-circuits/src/ecc_circuit/util.rs @@ -0,0 +1,107 @@ +use eth_types::Field; +use halo2_base::{AssignedValue, QuantumCell}; +use halo2_ecc::{bigint::CRTInteger, ecc::EcPoint, fields::FieldExtPoint}; + +// Total number of rows allowable for ECC circuit +pub const LOG_TOTAL_NUM_ROWS: u32 = 20; + +// Cell usage accounting for EcAdd, EcMul and EcPairing +// Roud up to nearest 100 +pub(super) const EC_ADD_CELLS: usize = 6_900; // actual: 6_851 +pub(super) const EC_MUL_CELLS: usize = 405_500; // actual: 405_476 +pub(super) const EC_PAIRING_CELLS: usize = 6_627_500; // actual: 6_627_442 +pub(super) const COLUMN_NUM_LIMIT: usize = 150; // Max number of columns allowed + +/// Decomposed state of a G1 curve point. +pub(super) struct G1Decomposed { + /// EcPoint on G1. + pub ec_point: EcPoint>, + /// Cells for the x-coordinate of the G1 curve point in LE format. + pub x_cells: Vec>, + /// Cells for the y-coordinate of the G1 curve point in LE format. + pub y_cells: Vec>, +} + +/// State of the G1 curve point after RLC operations. +pub(super) struct G1Assigned { + /// RLC of x-coordinate that will be copied to the ECC Table. + pub x_rlc: AssignedValue, + /// RLC of y-coordinate that will be copied to the ECC Table. + pub y_rlc: AssignedValue, +} + +/// State of a scalar field element. Since the scalar fits within the field, we don't need to take +/// RLC over its bytes/cells. Hence we can decompose and assign the scalar in the first phase. +#[derive(Clone)] +pub(super) struct ScalarAssigned { + pub scalar: CRTInteger, +} + +/// Decomposed state of a G2 curve point. +pub(super) struct G2Decomposed { + /// The assigned EcPoint. + pub ec_point: EcPoint>>, + /// Cells for the coeff 0 of x-coordinate of the G2 curve point in LE format. + pub x_c0_cells: Vec>, + /// Cells for the coeff 1 of x-coordinate of the G2 curve point in LE format. + pub x_c1_cells: Vec>, + /// Cells for the coeff 0 of y-coordinate of the G2 curve point in LE format. + pub y_c0_cells: Vec>, + /// Cells for the coeff 1 of y-coordinate of the G2 curve point in LE format. + pub y_c1_cells: Vec>, +} + +/// State of EcAdd operation post first phase. +pub(super) struct EcAddDecomposed { + pub is_valid: AssignedValue, + pub point_p: G1Decomposed, + pub point_q: G1Decomposed, + pub point_r: G1Decomposed, +} + +/// State of EcAdd operation post second phase. +pub(super) struct EcAddAssigned { + pub is_valid: AssignedValue, + pub point_p: G1Assigned, + pub point_q: G1Assigned, + pub point_r: G1Assigned, +} + +/// State of EcMul operation post first phase. +pub(super) struct EcMulDecomposed { + pub is_valid: AssignedValue, + pub point_p: G1Decomposed, + pub scalar_s: ScalarAssigned, + pub point_r: G1Decomposed, +} + +/// State of EcMul operation post second phase. +pub(super) struct EcMulAssigned { + pub is_valid: AssignedValue, + pub point_p: G1Assigned, + pub scalar_s: ScalarAssigned, + pub point_r: G1Assigned, +} + +/// State of EcPairing operation post first phase. +pub(super) struct EcPairingDecomposed { + pub is_valid: AssignedValue, + pub input_cells: Vec>, + pub success: AssignedValue, +} + +/// State of EcPairing operation post second phase. +pub(super) struct EcPairingAssigned { + pub is_valid: AssignedValue, + /// RLC of (G1, G2) pairs. + pub input_rlc: AssignedValue, + pub success: AssignedValue, +} + +/// Wrapper struct that holds all the ecXX states post second phase. +#[derive(Default)] +pub(super) struct EcOpsAssigned { + pub ec_adds_assigned: Vec>, + pub ec_muls_assigned: Vec>, + pub ec_pairings_assigned: Vec>, +} diff --git a/zkevm-circuits/src/evm_circuit.rs b/zkevm-circuits/src/evm_circuit.rs index 53e8cdbde1..b595225b31 100644 --- a/zkevm-circuits/src/evm_circuit.rs +++ b/zkevm-circuits/src/evm_circuit.rs @@ -22,8 +22,8 @@ pub use crate::witness; use crate::{ evm_circuit::param::{MAX_STEP_HEIGHT, STEP_STATE_HEIGHT}, table::{ - BlockTable, BytecodeTable, CopyTable, ExpTable, KeccakTable, LookupTable, RwTable, TxTable, - UXTable, + BlockTable, BytecodeTable, CopyTable, ExpTable, KeccakTable, LookupTable, RwTable, + SigTable, TxTable, UXTable, }, util::{chunk_ctx::ChunkContextConfig, Challenges, SubCircuit, SubCircuitConfig}, witness::{Chunk, RwMap}, @@ -52,6 +52,7 @@ pub struct EvmCircuitConfig { copy_table: CopyTable, keccak_table: KeccakTable, exp_table: ExpTable, + sig_table: SigTable, /// rw permutation config pub rw_permutation_config: PermutationChipConfig, @@ -84,6 +85,8 @@ pub struct EvmCircuitConfigArgs { pub u8_table: UXTable<8>, /// U16Table pub u16_table: UXTable<16>, + /// SigTable + pub sig_table: SigTable, /// chunk_ctx config pub chunk_ctx_config: ChunkContextConfig, /// Feature config @@ -107,6 +110,7 @@ impl SubCircuitConfig for EvmCircuitConfig { exp_table, u8_table, u16_table, + sig_table, chunk_ctx_config, feature_config, }: Self::ConfigArgs, @@ -126,6 +130,7 @@ impl SubCircuitConfig for EvmCircuitConfig { ©_table, &keccak_table, &exp_table, + &sig_table, &chunk_ctx_config.chunk_ctx_table, &chunk_ctx_config.is_first_chunk, &chunk_ctx_config.is_last_chunk, @@ -144,6 +149,7 @@ impl SubCircuitConfig for EvmCircuitConfig { exp_table.annotate_columns(meta); u8_table.annotate_columns(meta); u16_table.annotate_columns(meta); + sig_table.annotate_columns(meta); chunk_ctx_config.chunk_ctx_table.annotate_columns(meta); let rw_permutation_config = PermutationChip::configure( @@ -166,6 +172,7 @@ impl SubCircuitConfig for EvmCircuitConfig { copy_table, keccak_table, exp_table, + sig_table, rw_permutation_config, chunk_ctx_config, pi_chunk_continuity, @@ -514,6 +521,7 @@ impl Circuit for EvmCircuit { let challenges_expr = challenges.exprs(meta); let chunk_ctx_config = ChunkContextConfig::new(meta, &challenges_expr); + let sig_table = SigTable::construct(meta); ( EvmCircuitConfig::new( meta, @@ -528,6 +536,7 @@ impl Circuit for EvmCircuit { exp_table, u8_table, u16_table, + sig_table, chunk_ctx_config, feature_config: params, }, @@ -572,6 +581,7 @@ impl Circuit for EvmCircuit { config.u8_table.load(&mut layouter)?; config.u16_table.load(&mut layouter)?; + config.sig_table.dev_load(&mut layouter, block)?; // synthesize chunk context config.chunk_ctx_config.assign_chunk_context( @@ -686,6 +696,7 @@ mod evm_circuit_stats { max_bytecode: 512, max_evm_rows: 0, max_keccak_rows: 0, + max_vertical_circuit_rows: 0, }; let builder = BlockData::new_from_geth_data_with_params(block.clone(), circuits_params) .new_circuit_input_builder() diff --git a/zkevm-circuits/src/evm_circuit/execution.rs b/zkevm-circuits/src/evm_circuit/execution.rs index 35d348a359..462739bafa 100644 --- a/zkevm-circuits/src/evm_circuit/execution.rs +++ b/zkevm-circuits/src/evm_circuit/execution.rs @@ -2,7 +2,8 @@ use super::{ param::{ BLOCK_TABLE_LOOKUPS, BYTECODE_TABLE_LOOKUPS, CHUNK_CTX_TABLE_LOOKUPS, COPY_TABLE_LOOKUPS, EXP_TABLE_LOOKUPS, FIXED_TABLE_LOOKUPS, KECCAK_TABLE_LOOKUPS, N_COPY_COLUMNS, - N_PHASE1_COLUMNS, N_U16_LOOKUPS, N_U8_LOOKUPS, RW_TABLE_LOOKUPS, TX_TABLE_LOOKUPS, + N_PHASE1_COLUMNS, N_U16_LOOKUPS, N_U8_LOOKUPS, RW_TABLE_LOOKUPS, SIG_TABLE_LOOKUPS, + TX_TABLE_LOOKUPS, }, step::HasExecutionState, util::{instrumentation::Instrument, CachedRegion, StoredExpression}, @@ -198,7 +199,7 @@ use origin::OriginGadget; use padding::PaddingGadget; use pc::PcGadget; use pop::PopGadget; -use precompiles::IdentityGadget; +use precompiles::{EcrecoverGadget, IdentityGadget}; use push::PushGadget; use return_revert::ReturnRevertGadget; use returndatacopy::ReturnDataCopyGadget; @@ -350,6 +351,8 @@ pub struct ExecutionConfig { error_invalid_creation_code: Box>, error_precompile_failed: Box>, error_return_data_out_of_bound: Box>, + // precompile calls + precompile_ecrecover_gadget: Box>, precompile_identity_gadget: Box>, invalid_tx: Option>>, } @@ -372,6 +375,7 @@ impl ExecutionConfig { copy_table: &dyn LookupTable, keccak_table: &dyn LookupTable, exp_table: &dyn LookupTable, + sig_table: &dyn LookupTable, chunk_ctx_table: &dyn LookupTable, is_first_chunk: &IsZeroConfig, is_last_chunk: &IsZeroConfig, @@ -673,6 +677,7 @@ impl ExecutionConfig { error_return_data_out_of_bound: configure_gadget!(), // precompile calls precompile_identity_gadget: configure_gadget!(), + precompile_ecrecover_gadget: configure_gadget!(), // step and presets step: step_curr, height_map, @@ -693,6 +698,7 @@ impl ExecutionConfig { copy_table, keccak_table, exp_table, + sig_table, chunk_ctx_table, &challenges, &cell_manager, @@ -1037,6 +1043,7 @@ impl ExecutionConfig { copy_table: &dyn LookupTable, keccak_table: &dyn LookupTable, exp_table: &dyn LookupTable, + sig_table: &dyn LookupTable, chunk_ctx_table: &dyn LookupTable, challenges: &Challenges>, cell_manager: &CellManager, @@ -1057,6 +1064,7 @@ impl ExecutionConfig { Table::Copy => copy_table, Table::Keccak => keccak_table, Table::Exp => exp_table, + Table::Sig => sig_table, Table::ChunkCtx => chunk_ctx_table, } .table_exprs(meta); @@ -1348,6 +1356,7 @@ impl ExecutionConfig { ("EVM_lookup_copy", COPY_TABLE_LOOKUPS), ("EVM_lookup_keccak", KECCAK_TABLE_LOOKUPS), ("EVM_lookup_exp", EXP_TABLE_LOOKUPS), + ("EVM_lookup_sig", SIG_TABLE_LOOKUPS), ("EVM_lookupchunk_ctx", CHUNK_CTX_TABLE_LOOKUPS), ("EVM_adv_phase2", N_PHASE2_COLUMNS), ("EVM_copy", N_COPY_COLUMNS), @@ -1641,7 +1650,9 @@ impl ExecutionConfig { ExecutionState::ErrorPrecompileFailed => { assign_exec_step!(self.error_precompile_failed) } - // precompile calls + ExecutionState::PrecompileEcrecover => { + assign_exec_step!(self.precompile_ecrecover_gadget) + } ExecutionState::PrecompileIdentity => { assign_exec_step!(self.precompile_identity_gadget) } diff --git a/zkevm-circuits/src/evm_circuit/execution/add_sub.rs b/zkevm-circuits/src/evm_circuit/execution/add_sub.rs index 6f0d36be60..3429cfb567 100644 --- a/zkevm-circuits/src/evm_circuit/execution/add_sub.rs +++ b/zkevm-circuits/src/evm_circuit/execution/add_sub.rs @@ -11,7 +11,7 @@ use crate::{ witness::{Block, Call, Chunk, ExecStep, Transaction}, }, util::{ - word::{Word, WordExpr}, + word::{WordExpr, WordLoHi}, Expr, }, }; @@ -54,9 +54,9 @@ impl ExecutionGadget for AddSubGadget { // ADD: Pop a and b from the stack, push c on the stack // SUB: Pop c and b from the stack, push a on the stack - cb.stack_pop(Word::select(is_sub.expr().0, c.to_word(), a.to_word())); + cb.stack_pop(WordLoHi::select(is_sub.expr().0, c.to_word(), a.to_word())); cb.stack_pop(b.to_word()); - cb.stack_push(Word::select(is_sub.expr().0, a.to_word(), c.to_word())); + cb.stack_push(WordLoHi::select(is_sub.expr().0, a.to_word(), c.to_word())); // State transition let step_state_transition = StepStateTransition { diff --git a/zkevm-circuits/src/evm_circuit/execution/addmod.rs b/zkevm-circuits/src/evm_circuit/execution/addmod.rs index 692cc6cf23..fe1d598b9c 100644 --- a/zkevm-circuits/src/evm_circuit/execution/addmod.rs +++ b/zkevm-circuits/src/evm_circuit/execution/addmod.rs @@ -17,7 +17,7 @@ use crate::{ witness::{Block, Call, Chunk, ExecStep, Transaction}, }, util::{ - word::{Word, Word32Cell, WordExpr}, + word::{Word32Cell, WordExpr, WordLoHi}, Expr, }, }; @@ -64,12 +64,12 @@ impl ExecutionGadget for AddModGadget { let n = cb.query_word32(); let r = cb.query_word32(); - // auxiliar witness + // auxiliary witness let k = cb.query_word32(); let a_reduced = cb.query_word32(); let d = cb.query_word32(); - let n_is_zero = IsZeroWordGadget::construct(cb, &n); + let n_is_zero = cb.is_zero_word(&n); // 1. check k * N + a_reduced == a without overflow let muladd_k_n_areduced = @@ -94,7 +94,7 @@ impl ExecutionGadget for AddModGadget { cb.require_equal_word( "check a_reduced + b 512 bit carry if n != 0", sum_areduced_b_overflow.to_word(), - Word::from_lo_unchecked(sum_areduced_b.carry().clone().unwrap().expr()) + WordLoHi::from_lo_unchecked(sum_areduced_b.carry().clone().unwrap().expr()) .mul_selector(not::expr(n_is_zero.expr())), ); @@ -162,7 +162,7 @@ impl ExecutionGadget for AddModGadget { // get stack values let [mut r, n, b, a] = [3, 2, 1, 0].map(|index| block.get_rws(step, index).stack_value()); - // assing a,b & n stack values + // assign a,b & n stack values self.a.assign_u256(region, offset, a)?; self.b.assign_u256(region, offset, b)?; self.n.assign_u256(region, offset, n)?; @@ -221,7 +221,7 @@ impl ExecutionGadget for AddModGadget { self.cmp_areduced_n.assign(region, offset, a_reduced, n)?; self.n_is_zero - .assign_value(region, offset, Value::known(Word::from(n)))?; + .assign_value(region, offset, Value::known(WordLoHi::from(n)))?; Ok(()) } diff --git a/zkevm-circuits/src/evm_circuit/execution/address.rs b/zkevm-circuits/src/evm_circuit/execution/address.rs index fbf427d1ef..024566b71a 100644 --- a/zkevm-circuits/src/evm_circuit/execution/address.rs +++ b/zkevm-circuits/src/evm_circuit/execution/address.rs @@ -11,7 +11,7 @@ use crate::{ }, table::CallContextFieldTag, util::{ - word::{WordCell, WordExpr}, + word::{WordExpr, WordLoHiCell}, Expr, }, }; @@ -22,7 +22,7 @@ use halo2_proofs::plonk::Error; #[derive(Clone, Debug)] pub(crate) struct AddressGadget { same_context: SameContextGadget, - address: WordCell, + address: WordLoHiCell, } impl ExecutionGadget for AddressGadget { diff --git a/zkevm-circuits/src/evm_circuit/execution/balance.rs b/zkevm-circuits/src/evm_circuit/execution/balance.rs index bc54c8726d..487a63089f 100644 --- a/zkevm-circuits/src/evm_circuit/execution/balance.rs +++ b/zkevm-circuits/src/evm_circuit/execution/balance.rs @@ -15,7 +15,7 @@ use crate::{ }, table::{AccountFieldTag, CallContextFieldTag}, util::{ - word::{Word, Word32Cell, WordCell, WordExpr}, + word::{Word32Cell, WordExpr, WordLoHi, WordLoHiCell}, Expr, }, }; @@ -29,8 +29,8 @@ pub(crate) struct BalanceGadget { reversion_info: ReversionInfo, tx_id: Cell, is_warm: Cell, - code_hash: WordCell, - not_exists: IsZeroWordGadget>, + code_hash: WordLoHiCell, + not_exists: IsZeroWordGadget>, balance: Word32Cell, } @@ -60,7 +60,7 @@ impl ExecutionGadget for BalanceGadget { AccountFieldTag::CodeHash, code_hash.to_word(), ); - let not_exists = IsZeroWordGadget::construct(cb, &code_hash); + let not_exists = cb.is_zero_word(&code_hash); let exists = not::expr(not_exists.expr()); let balance = cb.query_word32(); cb.condition(exists.expr(), |cb| { @@ -140,7 +140,7 @@ impl ExecutionGadget for BalanceGadget { self.code_hash .assign_u256(region, offset, code_hash.to_word())?; self.not_exists - .assign_value(region, offset, Value::known(Word::from(code_hash)))?; + .assign_value(region, offset, Value::known(WordLoHi::from(code_hash)))?; let balance = if code_hash.is_zero() { eth_types::Word::zero() } else { diff --git a/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs b/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs index ee6e5d2b20..24e85774d3 100644 --- a/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs +++ b/zkevm-circuits/src/evm_circuit/execution/begin_tx.rs @@ -22,12 +22,12 @@ use crate::{ }, table::{AccountFieldTag, BlockContextFieldTag, CallContextFieldTag}, util::{ - word::{Word, Word32Cell, WordCell, WordExpr}, + word::{Word32Cell, WordExpr, WordLoHi, WordLoHiCell}, Expr, }, }; use bus_mapping::state_db::CodeDB; -use eth_types::{evm_types::PRECOMPILE_COUNT, keccak256, Field, ToWord, U256}; +use eth_types::{evm_types::PRECOMPILE_COUNT, keccak256, Field, OpsIdentity, ToWord, U256}; use halo2_proofs::{ circuit::Value, plonk::{Error, Expression}, @@ -37,19 +37,19 @@ use halo2_proofs::{ pub(crate) struct BeginTxGadget { begin_tx: BeginTxHelperGadget, tx: TxDataGadget, - tx_caller_address_is_zero: IsZeroWordGadget>, + tx_caller_address_is_zero: IsZeroWordGadget>, call_callee_address: AccountAddress, reversion_info: ReversionInfo, sufficient_gas_left: RangeCheckGadget, transfer_with_gas_fee: TransferWithGasFeeGadget, - code_hash: WordCell, - is_empty_code_hash: IsEqualWordGadget>, Word>>, + code_hash: WordLoHiCell, + is_empty_code_hash: IsEqualWordGadget>, WordLoHi>>, caller_nonce_hash_bytes: Word32Cell, create: ContractCreateGadget, - callee_not_exists: IsZeroWordGadget>, + callee_not_exists: IsZeroWordGadget>, is_caller_callee_equal: Cell, // EIP-3651 (Warm COINBASE) - coinbase: WordCell, + coinbase: WordLoHiCell, // Caller, callee and a list addresses are added to the access list before // coinbase, and may be duplicate. // @@ -74,14 +74,14 @@ impl ExecutionGadget for BeginTxGadget { cb.call_context_lookup_write( Some(call_id.expr()), CallContextFieldTag::IsSuccess, - Word::from_lo_unchecked(reversion_info.is_persistent()), + WordLoHi::from_lo_unchecked(reversion_info.is_persistent()), ); // rwc_delta += 1 // Check gas_left is sufficient let gas_left = tx.gas.expr() - tx.intrinsic_gas(); let sufficient_gas_left = RangeCheckGadget::construct(cb, gas_left.clone()); - let tx_caller_address_is_zero = IsZeroWordGadget::construct(cb, &tx.caller_address); + let tx_caller_address_is_zero = cb.is_zero_word(&tx.caller_address); cb.require_equal( "CallerAddress != 0 (not a padding tx)", tx_caller_address_is_zero.expr(), @@ -102,8 +102,8 @@ impl ExecutionGadget for BeginTxGadget { cb.account_write( tx.caller_address.to_word(), AccountFieldTag::Nonce, - Word::from_lo_unchecked(tx.nonce.expr() + 1.expr()), - Word::from_lo_unchecked(tx.nonce.expr()), + WordLoHi::from_lo_unchecked(tx.nonce.expr() + 1.expr()), + WordLoHi::from_lo_unchecked(tx.nonce.expr()), None, ); // rwc_delta += 1 @@ -111,7 +111,7 @@ impl ExecutionGadget for BeginTxGadget { for addr in 1..=PRECOMPILE_COUNT { cb.account_access_list_write_unchecked( tx_id.expr(), - Word::new([addr.expr(), 0.expr()]), + WordLoHi::new([addr.expr(), 0.expr()]), 1.expr(), 0.expr(), None, @@ -155,9 +155,8 @@ impl ExecutionGadget for BeginTxGadget { // Read code_hash of callee let code_hash = cb.query_word_unchecked(); - let is_empty_code_hash = - IsEqualWordGadget::construct(cb, &code_hash.to_word(), &cb.empty_code_hash()); - let callee_not_exists = IsZeroWordGadget::construct(cb, &code_hash); + let is_empty_code_hash = cb.is_eq_word(&code_hash.to_word(), &cb.empty_code_hash()); + let callee_not_exists = cb.is_zero_word(&code_hash); // no_callee_code is true when the account exists and has empty // code hash, or when the account doesn't exist (which we encode with // code_hash = 0). @@ -221,12 +220,12 @@ impl ExecutionGadget for BeginTxGadget { cb.account_write( call_callee_address.to_word(), AccountFieldTag::Nonce, - Word::one(), - Word::zero(), + WordLoHi::one(), + WordLoHi::zero(), Some(&mut reversion_info), ); for (field_tag, value) in [ - (CallContextFieldTag::Depth, Word::one()), + (CallContextFieldTag::Depth, WordLoHi::one()), ( CallContextFieldTag::CallerAddress, tx.caller_address.to_word(), @@ -235,24 +234,24 @@ impl ExecutionGadget for BeginTxGadget { CallContextFieldTag::CalleeAddress, call_callee_address.to_word(), ), - (CallContextFieldTag::CallDataOffset, Word::zero()), + (CallContextFieldTag::CallDataOffset, WordLoHi::zero()), ( CallContextFieldTag::CallDataLength, - Word::from_lo_unchecked(tx.call_data_length.expr()), + WordLoHi::from_lo_unchecked(tx.call_data_length.expr()), ), (CallContextFieldTag::Value, tx.value.to_word()), - (CallContextFieldTag::IsStatic, Word::zero()), - (CallContextFieldTag::LastCalleeId, Word::zero()), + (CallContextFieldTag::IsStatic, WordLoHi::zero()), + (CallContextFieldTag::LastCalleeId, WordLoHi::zero()), ( CallContextFieldTag::LastCalleeReturnDataOffset, - Word::zero(), + WordLoHi::zero(), ), ( CallContextFieldTag::LastCalleeReturnDataLength, - Word::zero(), + WordLoHi::zero(), ), - (CallContextFieldTag::IsRoot, Word::one()), - (CallContextFieldTag::IsCreate, Word::one()), + (CallContextFieldTag::IsRoot, WordLoHi::one()), + (CallContextFieldTag::IsCreate, WordLoHi::one()), ( CallContextFieldTag::CodeHash, cb.curr.state.code_hash.to_word(), @@ -349,7 +348,7 @@ impl ExecutionGadget for BeginTxGadget { |cb| { // Setup first call's context. for (field_tag, value) in [ - (CallContextFieldTag::Depth, Word::one()), + (CallContextFieldTag::Depth, WordLoHi::one()), ( CallContextFieldTag::CallerAddress, tx.caller_address.to_word(), @@ -358,26 +357,26 @@ impl ExecutionGadget for BeginTxGadget { CallContextFieldTag::CalleeAddress, tx.callee_address.to_word(), ), - (CallContextFieldTag::CallDataOffset, Word::zero()), + (CallContextFieldTag::CallDataOffset, WordLoHi::zero()), ( CallContextFieldTag::CallDataLength, - Word::from_lo_unchecked(tx.call_data_length.expr()), + WordLoHi::from_lo_unchecked(tx.call_data_length.expr()), ), (CallContextFieldTag::Value, tx.value.to_word()), - (CallContextFieldTag::IsStatic, Word::zero()), - (CallContextFieldTag::LastCalleeId, Word::zero()), + (CallContextFieldTag::IsStatic, WordLoHi::zero()), + (CallContextFieldTag::LastCalleeId, WordLoHi::zero()), ( CallContextFieldTag::LastCalleeReturnDataOffset, - Word::zero(), + WordLoHi::zero(), ), ( CallContextFieldTag::LastCalleeReturnDataLength, - Word::zero(), + WordLoHi::zero(), ), - (CallContextFieldTag::IsRoot, Word::one()), + (CallContextFieldTag::IsRoot, WordLoHi::one()), ( CallContextFieldTag::IsCreate, - Word::from_lo_unchecked(tx.is_create.expr()), + WordLoHi::from_lo_unchecked(tx.is_create.expr()), ), (CallContextFieldTag::CodeHash, code_hash.to_word()), ] { diff --git a/zkevm-circuits/src/evm_circuit/execution/block_ctx.rs b/zkevm-circuits/src/evm_circuit/execution/block_ctx.rs index 800e7e6dd4..dcc6b97cf1 100644 --- a/zkevm-circuits/src/evm_circuit/execution/block_ctx.rs +++ b/zkevm-circuits/src/evm_circuit/execution/block_ctx.rs @@ -10,7 +10,7 @@ use crate::{ }, table::BlockContextFieldTag, util::{ - word::{WordCell, WordExpr}, + word::{WordExpr, WordLoHiCell}, Expr, }, }; @@ -23,7 +23,7 @@ use super::ExecutionGadget; #[derive(Clone, Debug)] pub(crate) struct BlockCtxGadget { same_context: SameContextGadget, - value: WordCell, + value: WordLoHiCell, } impl ExecutionGadget for BlockCtxGadget { diff --git a/zkevm-circuits/src/evm_circuit/execution/blockhash.rs b/zkevm-circuits/src/evm_circuit/execution/blockhash.rs index ce9144a067..ec7708185d 100644 --- a/zkevm-circuits/src/evm_circuit/execution/blockhash.rs +++ b/zkevm-circuits/src/evm_circuit/execution/blockhash.rs @@ -11,7 +11,7 @@ use crate::{ Transition::Delta, }, math_gadget::LtGadget, - CachedRegion, Cell, Word, + CachedRegion, Cell, WordLoHi, }, witness::{Block, Call, Chunk, ExecStep, Transaction}, }, @@ -28,7 +28,7 @@ pub(crate) struct BlockHashGadget { same_context: SameContextGadget, block_number: WordByteCapGadget, current_block_number: Cell, - block_hash: Word>, + block_hash: WordLoHi>, diff_lt: LtGadget, } @@ -42,7 +42,7 @@ impl ExecutionGadget for BlockHashGadget { cb.block_lookup( BlockContextFieldTag::Number.expr(), None, - Word::from_lo_unchecked(current_block_number.expr()), + WordLoHi::from_lo_unchecked(current_block_number.expr()), ); let block_number = WordByteCapGadget::construct(cb, current_block_number.expr()); diff --git a/zkevm-circuits/src/evm_circuit/execution/byte.rs b/zkevm-circuits/src/evm_circuit/execution/byte.rs index 3495418fcc..42002e91e8 100644 --- a/zkevm-circuits/src/evm_circuit/execution/byte.rs +++ b/zkevm-circuits/src/evm_circuit/execution/byte.rs @@ -11,7 +11,7 @@ use crate::{ witness::{Block, Call, Chunk, ExecStep, Transaction}, }, util::{ - word::{Word, Word32Cell, WordExpr}, + word::{Word32Cell, WordExpr, WordLoHi}, Expr, }, }; @@ -53,7 +53,7 @@ impl ExecutionGadget for ByteGadget { let is_byte_selected = array_init(|idx| { // Check if this byte is selected looking only at the LSB of the // index word - IsEqualGadget::construct(cb, index.limbs[0].expr(), (31 - idx).expr()) + cb.is_eq(index.limbs[0].expr(), (31 - idx).expr()) }); // Sum all possible selected bytes @@ -70,7 +70,7 @@ impl ExecutionGadget for ByteGadget { // it only uses the LSB of a word. cb.stack_pop(index.to_word()); cb.stack_pop(value.to_word()); - cb.stack_push(Word::from_lo_unchecked(selected_byte)); + cb.stack_push(WordLoHi::from_lo_unchecked(selected_byte)); // State transition let step_state_transition = StepStateTransition { diff --git a/zkevm-circuits/src/evm_circuit/execution/calldatacopy.rs b/zkevm-circuits/src/evm_circuit/execution/calldatacopy.rs index b52f4872e1..1384d23670 100644 --- a/zkevm-circuits/src/evm_circuit/execution/calldatacopy.rs +++ b/zkevm-circuits/src/evm_circuit/execution/calldatacopy.rs @@ -19,7 +19,7 @@ use crate::{ }, table::CallContextFieldTag, util::{ - word::{Word, WordExpr}, + word::{WordExpr, WordLoHi}, Expr, }, }; @@ -69,12 +69,12 @@ impl ExecutionGadget for CallDataCopyGadget { cb.call_context_lookup_read( None, CallContextFieldTag::TxId, - Word::from_lo_unchecked(src_id.expr()), + WordLoHi::from_lo_unchecked(src_id.expr()), ); cb.call_context_lookup_read( None, CallContextFieldTag::CallDataLength, - Word::from_lo_unchecked(call_data_length.expr()), + WordLoHi::from_lo_unchecked(call_data_length.expr()), ); cb.require_zero( "call_data_offset == 0 in the root call", @@ -85,17 +85,17 @@ impl ExecutionGadget for CallDataCopyGadget { cb.call_context_lookup_read( None, CallContextFieldTag::CallerId, - Word::from_lo_unchecked(src_id.expr()), + WordLoHi::from_lo_unchecked(src_id.expr()), ); cb.call_context_lookup_read( None, CallContextFieldTag::CallDataLength, - Word::from_lo_unchecked(call_data_length.expr()), + WordLoHi::from_lo_unchecked(call_data_length.expr()), ); cb.call_context_lookup_read( None, CallContextFieldTag::CallDataOffset, - Word::from_lo_unchecked(call_data_offset.expr()), + WordLoHi::from_lo_unchecked(call_data_offset.expr()), ); }); @@ -116,7 +116,7 @@ impl ExecutionGadget for CallDataCopyGadget { CopyDataType::Memory.expr(), ); cb.condition(memory_address.has_length(), |cb| { - // Set source start to the minimun value of data offset and call data length. + // Set source start to the minimum value of data offset and call data length. let src_addr = call_data_offset.expr() + select::expr( data_offset.lt_cap(), @@ -127,9 +127,9 @@ impl ExecutionGadget for CallDataCopyGadget { let src_addr_end = call_data_offset.expr() + call_data_length.expr(); cb.copy_table_lookup( - Word::from_lo_unchecked(src_id.expr()), + WordLoHi::from_lo_unchecked(src_id.expr()), src_tag, - Word::from_lo_unchecked(cb.curr.state.call_id.expr()), + WordLoHi::from_lo_unchecked(cb.curr.state.call_id.expr()), CopyDataType::Memory.expr(), src_addr, src_addr_end, diff --git a/zkevm-circuits/src/evm_circuit/execution/calldataload.rs b/zkevm-circuits/src/evm_circuit/execution/calldataload.rs index 5418a3e815..ac59cdd2bc 100644 --- a/zkevm-circuits/src/evm_circuit/execution/calldataload.rs +++ b/zkevm-circuits/src/evm_circuit/execution/calldataload.rs @@ -23,7 +23,7 @@ use crate::{ }, table::{CallContextFieldTag, TxContextFieldTag}, util::{ - word::{Word, Word32, WordExpr}, + word::{Word32, WordExpr, WordLoHi}, Expr, }, }; @@ -76,12 +76,12 @@ impl ExecutionGadget for CallDataLoadGadget { cb.call_context_lookup_read( None, CallContextFieldTag::TxId, - Word::from_lo_unchecked(src_id.expr()), + WordLoHi::from_lo_unchecked(src_id.expr()), ); cb.call_context_lookup_read( None, CallContextFieldTag::CallDataLength, - Word::from_lo_unchecked(call_data_length.expr()), + WordLoHi::from_lo_unchecked(call_data_length.expr()), ); cb.require_equal( "if is_root then call_data_offset == 0", @@ -100,22 +100,22 @@ impl ExecutionGadget for CallDataLoadGadget { cb.call_context_lookup_read( None, CallContextFieldTag::CallerId, - Word::from_lo_unchecked(src_id.expr()), + WordLoHi::from_lo_unchecked(src_id.expr()), ); cb.call_context_lookup_read( None, CallContextFieldTag::CallDataLength, - Word::from_lo_unchecked(call_data_length.expr()), + WordLoHi::from_lo_unchecked(call_data_length.expr()), ); cb.call_context_lookup_read( None, CallContextFieldTag::CallDataOffset, - Word::from_lo_unchecked(call_data_offset.expr()), + WordLoHi::from_lo_unchecked(call_data_offset.expr()), ); }, ); - // Set source start to the minimun value of data offset and call data length. + // Set source start to the minimum value of data offset and call data length. let src_addr = call_data_offset.expr() + select::expr( data_offset.lt_cap(), @@ -141,7 +141,7 @@ impl ExecutionGadget for CallDataLoadGadget { src_id.expr(), TxContextFieldTag::CallData, Some(src_addr.expr() + idx.expr()), - Word::from_lo_unchecked(buffer_reader.byte(idx)), + WordLoHi::from_lo_unchecked(buffer_reader.byte(idx)), ); }, ); diff --git a/zkevm-circuits/src/evm_circuit/execution/calldatasize.rs b/zkevm-circuits/src/evm_circuit/execution/calldatasize.rs index 664a4192e7..06972e6dd4 100644 --- a/zkevm-circuits/src/evm_circuit/execution/calldatasize.rs +++ b/zkevm-circuits/src/evm_circuit/execution/calldatasize.rs @@ -11,7 +11,7 @@ use crate::{ }, table::CallContextFieldTag, util::{ - word::{WordCell, WordExpr}, + word::{WordExpr, WordLoHiCell}, Expr, }, }; @@ -22,7 +22,7 @@ use halo2_proofs::plonk::Error; #[derive(Clone, Debug)] pub(crate) struct CallDataSizeGadget { same_context: SameContextGadget, - call_data_size: WordCell, + call_data_size: WordLoHiCell, } impl ExecutionGadget for CallDataSizeGadget { diff --git a/zkevm-circuits/src/evm_circuit/execution/caller.rs b/zkevm-circuits/src/evm_circuit/execution/caller.rs index 1db17e6bf0..ea35c8111b 100644 --- a/zkevm-circuits/src/evm_circuit/execution/caller.rs +++ b/zkevm-circuits/src/evm_circuit/execution/caller.rs @@ -11,7 +11,7 @@ use crate::{ }, table::CallContextFieldTag, util::{ - word::{WordCell, WordExpr}, + word::{WordExpr, WordLoHiCell}, Expr, }, }; @@ -22,7 +22,7 @@ use halo2_proofs::plonk::Error; #[derive(Clone, Debug)] pub(crate) struct CallerGadget { same_context: SameContextGadget, - caller_address: WordCell, + caller_address: WordLoHiCell, } impl ExecutionGadget for CallerGadget { diff --git a/zkevm-circuits/src/evm_circuit/execution/callop.rs b/zkevm-circuits/src/evm_circuit/execution/callop.rs index e04fbfe16e..d196f17acc 100644 --- a/zkevm-circuits/src/evm_circuit/execution/callop.rs +++ b/zkevm-circuits/src/evm_circuit/execution/callop.rs @@ -11,29 +11,35 @@ use crate::{ Transition::{Delta, To}, }, math_gadget::{ - ConstantDivisionGadget, IsZeroGadget, LtGadget, LtWordGadget, MinMaxGadget, + ConstantDivisionGadget, IsEqualGadget, IsZeroGadget, LtGadget, LtWordGadget, + MinMaxGadget, }, memory_gadget::{CommonMemoryAddressGadget, MemoryAddressGadget}, not, or, precompile_gadget::PrecompileGadget, - rlc, select, CachedRegion, Cell, StepRws, Word, + rlc, select, CachedRegion, Cell, StepRws, }, witness::{Block, Call, ExecStep, Transaction}, }, - util::word::{WordCell, WordExpr}, + util::word::WordExpr, }; use crate::{ evm_circuit::witness::Chunk, table::{AccountFieldTag, CallContextFieldTag}, - util::Expr, + util::{ + word::{WordLoHi, WordLoHiCell}, + Expr, + }, }; use bus_mapping::{ circuit_input_builder::CopyDataType, evm::OpcodeId, precompile::{is_precompiled, PrecompileCalls}, }; -use eth_types::{evm_types::GAS_STIPEND_CALL_WITH_VALUE, Field, ToAddress, ToScalar, U256}; +use eth_types::{ + evm_types::GAS_STIPEND_CALL_WITH_VALUE, Field, OpsIdentity, ToAddress, ToScalar, U256, +}; use halo2_proofs::{circuit::Value, plonk::Error}; use std::cmp::min; @@ -44,24 +50,24 @@ use std::cmp::min; pub(crate) struct CallOpGadget { opcode: Cell, - is_call: IsZeroGadget, - is_callcode: IsZeroGadget, - is_delegatecall: IsZeroGadget, - is_staticcall: IsZeroGadget, + is_call: IsEqualGadget, + is_callcode: IsEqualGadget, + is_delegatecall: IsEqualGadget, + is_staticcall: IsEqualGadget, tx_id: Cell, reversion_info: ReversionInfo, - current_callee_address: WordCell, - current_caller_address: WordCell, + current_callee_address: WordLoHiCell, + current_caller_address: WordLoHiCell, is_static: Cell, depth: Cell, call: CommonCallGadget, true>, - current_value: Word>, + current_value: WordLoHi>, is_warm: Cell, is_warm_prev: Cell, callee_reversion_info: ReversionInfo, transfer: TransferGadget, // current handling Call* opcode's caller balance - caller_balance: Word>, + caller_balance: WordLoHi>, // check if insufficient balance case is_insufficient_balance: LtWordGadget, is_depth_ok: LtGadget, @@ -94,12 +100,10 @@ impl ExecutionGadget for CallOpGadget { fn configure(cb: &mut EVMConstraintBuilder) -> Self { let opcode = cb.query_cell(); cb.opcode_lookup(opcode.expr(), 1.expr()); - let is_call = IsZeroGadget::construct(cb, opcode.expr() - OpcodeId::CALL.expr()); - let is_callcode = IsZeroGadget::construct(cb, opcode.expr() - OpcodeId::CALLCODE.expr()); - let is_delegatecall = - IsZeroGadget::construct(cb, opcode.expr() - OpcodeId::DELEGATECALL.expr()); - let is_staticcall = - IsZeroGadget::construct(cb, opcode.expr() - OpcodeId::STATICCALL.expr()); + let is_call = cb.is_eq(opcode.expr(), OpcodeId::CALL.expr()); + let is_callcode = cb.is_eq(opcode.expr(), OpcodeId::CALLCODE.expr()); + let is_delegatecall = cb.is_eq(opcode.expr(), OpcodeId::DELEGATECALL.expr()); + let is_staticcall = cb.is_eq(opcode.expr(), OpcodeId::STATICCALL.expr()); // Use rw_counter of the step which triggers next call as its call_id. let callee_call_id = cb.curr.state.rw_counter.clone(); @@ -138,12 +142,12 @@ impl ExecutionGadget for CallOpGadget { ); }); - let caller_address = Word::select( + let caller_address = WordLoHi::select( is_delegatecall.expr(), current_caller_address.to_word(), current_callee_address.to_word(), ); - let callee_address = Word::select( + let callee_address = WordLoHi::select( is_callcode.expr() + is_delegatecall.expr(), current_callee_address.to_word(), call_gadget.callee_address.to_word(), @@ -196,9 +200,9 @@ impl ExecutionGadget for CallOpGadget { // rwc_delta = 8 + is_delegatecall * 2 + call_gadget.rw_delta() + // callee_reversion_info.rw_delta() let is_insufficient_balance = - LtWordGadget::construct(cb, &caller_balance.to_word(), &call_gadget.value.to_word()); + cb.is_lt_word(&caller_balance.to_word(), &call_gadget.value.to_word()); // depth < 1025 - let is_depth_ok = LtGadget::construct(cb, depth.expr(), 1025.expr()); + let is_depth_ok = cb.is_lt(depth.expr(), 1025.expr()); let is_precheck_ok = and::expr([ is_depth_ok.expr(), @@ -215,18 +219,15 @@ impl ExecutionGadget for CallOpGadget { // whether the call is to a precompiled contract. // precompile contracts are stored from address 0x01 to 0x09. - let is_code_address_zero = IsZeroGadget::construct(cb, call_gadget.callee_address.expr()); - let is_precompile_lt = - LtGadget::construct(cb, call_gadget.callee_address.expr(), 0x0A.expr()); + let is_code_address_zero = cb.is_zero(call_gadget.callee_address.expr()); + let is_precompile_lt = cb.is_lt(call_gadget.callee_address.expr(), 0x0A.expr()); let is_precompile = and::expr([ not::expr(is_code_address_zero.expr()), is_precompile_lt.expr(), ]); let precompile_return_length = cb.query_cell(); - let precompile_return_length_zero = - IsZeroGadget::construct(cb, precompile_return_length.expr()); - let precompile_return_data_copy_size = MinMaxGadget::construct( - cb, + let precompile_return_length_zero = cb.is_zero(precompile_return_length.expr()); + let precompile_return_data_copy_size = cb.min_max( precompile_return_length.expr(), call_gadget.rd_address.length(), ); @@ -238,7 +239,7 @@ impl ExecutionGadget for CallOpGadget { // Verify transfer only for CALL opcode in the successful case. If value == 0, // skip the transfer (this is necessary for non-existing accounts, which - // will not be crated when value is 0 and so the callee balance lookup + // will not be created when value is 0 and so the callee balance lookup // would be invalid). let transfer = cb.condition(is_call.expr() * is_precheck_ok.expr(), |cb| { TransferGadget::construct( @@ -275,10 +276,10 @@ impl ExecutionGadget for CallOpGadget { let gas_cost = call_gadget.gas_cost_expr(is_warm_prev.expr(), is_call.expr()); // Apply EIP 150 let gas_available = cb.curr.state.gas_left.expr() - gas_cost.clone(); - let one_64th_gas = ConstantDivisionGadget::construct(cb, gas_available.clone(), 64); + let one_64th_gas = cb.div_by_const(gas_available.clone(), 64); let all_but_one_64th_gas = gas_available - one_64th_gas.quotient(); let capped_callee_gas_left = - MinMaxGadget::construct(cb, call_gadget.gas_expr(), all_but_one_64th_gas.clone()); + cb.min_max(call_gadget.gas_expr(), all_but_one_64th_gas.clone()); let callee_gas_left = select::expr( call_gadget.gas_is_u64.expr(), capped_callee_gas_left.min(), @@ -323,7 +324,7 @@ impl ExecutionGadget for CallOpGadget { cb.call_context_lookup_write( Some(callee_call_id.expr()), CallContextFieldTag::IsSuccess, - Word::from_lo_unchecked(call_gadget.is_success.expr()), + WordLoHi::from_lo_unchecked(call_gadget.is_success.expr()), ); cb.call_context_lookup_write( Some(callee_call_id.expr()), @@ -352,7 +353,7 @@ impl ExecutionGadget for CallOpGadget { cb.call_context_lookup_write( Some(callee_call_id.expr()), field_tag, - Word::from_lo_unchecked(value), + WordLoHi::from_lo_unchecked(value), ); } @@ -386,7 +387,11 @@ impl ExecutionGadget for CallOpGadget { precompile_return_length.expr(), ), ] { - cb.call_context_lookup_write(None, field_tag, Word::from_lo_unchecked(value)); + cb.call_context_lookup_write( + None, + field_tag, + WordLoHi::from_lo_unchecked(value), + ); } // copy table lookup to verify the copying of bytes: @@ -396,9 +401,9 @@ impl ExecutionGadget for CallOpGadget { cb.condition(call_gadget.cd_address.has_length(), |cb| { let precompile_input_bytes_rlc = cb.query_cell_phase2(); cb.copy_table_lookup( - Word::from_lo_unchecked(cb.curr.state.call_id.expr()), + WordLoHi::from_lo_unchecked(cb.curr.state.call_id.expr()), CopyDataType::Memory.expr(), - Word::from_lo_unchecked(callee_call_id.expr()), + WordLoHi::from_lo_unchecked(callee_call_id.expr()), CopyDataType::RlcAcc.expr(), call_gadget.cd_address.offset(), call_gadget.cd_address.offset() + precompile_input_len.expr(), @@ -421,9 +426,9 @@ impl ExecutionGadget for CallOpGadget { |cb| { let precompile_output_bytes_rlc = cb.query_cell_phase2(); cb.copy_table_lookup( - Word::from_lo_unchecked(callee_call_id.expr()), + WordLoHi::from_lo_unchecked(callee_call_id.expr()), CopyDataType::RlcAcc.expr(), - Word::from_lo_unchecked(callee_call_id.expr()), + WordLoHi::from_lo_unchecked(callee_call_id.expr()), CopyDataType::Memory.expr(), 0.expr(), precompile_return_length.expr(), @@ -450,9 +455,9 @@ impl ExecutionGadget for CallOpGadget { |cb| { let precompile_return_bytes_rlc = cb.query_cell_phase2(); cb.copy_table_lookup( - Word::from_lo_unchecked(callee_call_id.expr()), + WordLoHi::from_lo_unchecked(callee_call_id.expr()), CopyDataType::Memory.expr(), // refer u64::from(CopyDataType) - Word::from_lo_unchecked(cb.curr.state.call_id.expr()), + WordLoHi::from_lo_unchecked(cb.curr.state.call_id.expr()), CopyDataType::Memory.expr(), 0.expr(), precompile_return_data_copy_size.min(), @@ -476,10 +481,10 @@ impl ExecutionGadget for CallOpGadget { let callee_gas_left = callee_gas_left.expr() + call_gadget.has_value.clone() * GAS_STIPEND_CALL_WITH_VALUE.expr(); - let precompile_output_word_size_div: ConstantDivisionGadget = - ConstantDivisionGadget::construct(cb, precompile_output_rws.expr(), 32); + let precompile_output_word_size_div = + cb.div_by_const(precompile_output_rws.expr(), 32); let precompile_output_word_size_div_remainder_zero = - IsZeroGadget::construct(cb, precompile_output_word_size_div.remainder()); + cb.is_zero(precompile_output_word_size_div.remainder()); let precompile_output_word_size = precompile_output_word_size_div.quotient() + 1.expr() - precompile_output_word_size_div_remainder_zero.expr(); @@ -536,13 +541,13 @@ impl ExecutionGadget for CallOpGadget { cb.call_context_lookup_write( None, CallContextFieldTag::LastCalleeId, - Word::from_lo_unchecked(callee_call_id.expr()), + WordLoHi::from_lo_unchecked(callee_call_id.expr()), ); for field_tag in [ CallContextFieldTag::LastCalleeReturnDataOffset, CallContextFieldTag::LastCalleeReturnDataLength, ] { - cb.call_context_lookup_write(None, field_tag, Word::zero()); + cb.call_context_lookup_write(None, field_tag, WordLoHi::zero()); } // For CALL opcode, it has an extra stack pop `value` (+1) and if the value is @@ -584,13 +589,13 @@ impl ExecutionGadget for CallOpGadget { cb.call_context_lookup_write( None, CallContextFieldTag::LastCalleeId, - Word::from_lo_unchecked(callee_call_id.expr()), + WordLoHi::from_lo_unchecked(callee_call_id.expr()), ); for field_tag in [ CallContextFieldTag::LastCalleeReturnDataOffset, CallContextFieldTag::LastCalleeReturnDataLength, ] { - cb.call_context_lookup_write(None, field_tag, Word::zero()); + cb.call_context_lookup_write(None, field_tag, WordLoHi::zero()); } cb.require_step_state_transition(StepStateTransition { @@ -638,7 +643,11 @@ impl ExecutionGadget for CallOpGadget { cb.curr.state.reversible_write_counter.expr() + 1.expr(), ), ] { - cb.call_context_lookup_write(None, field_tag, Word::from_lo_unchecked(value)); + cb.call_context_lookup_write( + None, + field_tag, + WordLoHi::from_lo_unchecked(value), + ); } // Setup next call's context. @@ -647,37 +656,37 @@ impl ExecutionGadget for CallOpGadget { for (field_tag, value) in [ ( CallContextFieldTag::CallerId, - Word::from_lo_unchecked(cb.curr.state.call_id.expr()), + WordLoHi::from_lo_unchecked(cb.curr.state.call_id.expr()), ), ( CallContextFieldTag::TxId, - Word::from_lo_unchecked(tx_id.expr()), + WordLoHi::from_lo_unchecked(tx_id.expr()), ), ( CallContextFieldTag::Depth, - Word::from_lo_unchecked(depth.expr() + 1.expr()), + WordLoHi::from_lo_unchecked(depth.expr() + 1.expr()), ), (CallContextFieldTag::CallerAddress, caller_address), (CallContextFieldTag::CalleeAddress, callee_address), ( CallContextFieldTag::CallDataOffset, - Word::from_lo_unchecked(cd_address.offset()), + WordLoHi::from_lo_unchecked(cd_address.offset()), ), ( CallContextFieldTag::CallDataLength, - Word::from_lo_unchecked(cd_address.length()), + WordLoHi::from_lo_unchecked(cd_address.length()), ), ( CallContextFieldTag::ReturnDataOffset, - Word::from_lo_unchecked(rd_address.offset()), + WordLoHi::from_lo_unchecked(rd_address.offset()), ), ( CallContextFieldTag::ReturnDataLength, - Word::from_lo_unchecked(rd_address.length()), + WordLoHi::from_lo_unchecked(rd_address.length()), ), ( CallContextFieldTag::Value, - Word::select( + WordLoHi::select( is_delegatecall.expr(), current_value.to_word(), call_gadget.value.to_word(), @@ -685,23 +694,26 @@ impl ExecutionGadget for CallOpGadget { ), ( CallContextFieldTag::IsSuccess, - Word::from_lo_unchecked(call_gadget.is_success.expr()), + WordLoHi::from_lo_unchecked(call_gadget.is_success.expr()), ), ( CallContextFieldTag::IsStatic, - Word::from_lo_unchecked(or::expr([is_static.expr(), is_staticcall.expr()])), + WordLoHi::from_lo_unchecked(or::expr([ + is_static.expr(), + is_staticcall.expr(), + ])), ), - (CallContextFieldTag::LastCalleeId, Word::zero()), + (CallContextFieldTag::LastCalleeId, WordLoHi::zero()), ( CallContextFieldTag::LastCalleeReturnDataOffset, - Word::zero(), + WordLoHi::zero(), ), ( CallContextFieldTag::LastCalleeReturnDataLength, - Word::zero(), + WordLoHi::zero(), ), - (CallContextFieldTag::IsRoot, Word::zero()), - (CallContextFieldTag::IsCreate, Word::zero()), + (CallContextFieldTag::IsRoot, WordLoHi::zero()), + (CallContextFieldTag::IsCreate, WordLoHi::zero()), ( CallContextFieldTag::CodeHash, call_gadget.callee_code_hash.to_word(), @@ -881,22 +893,26 @@ impl ExecutionGadget for CallOpGadget { self.is_call.assign( region, offset, - F::from(opcode.as_u64()) - F::from(OpcodeId::CALL.as_u64()), + F::from(opcode.as_u64()), + F::from(OpcodeId::CALL.as_u64()), )?; self.is_callcode.assign( region, offset, - F::from(opcode.as_u64()) - F::from(OpcodeId::CALLCODE.as_u64()), + F::from(opcode.as_u64()), + F::from(OpcodeId::CALLCODE.as_u64()), )?; self.is_delegatecall.assign( region, offset, - F::from(opcode.as_u64()) - F::from(OpcodeId::DELEGATECALL.as_u64()), + F::from(opcode.as_u64()), + F::from(OpcodeId::DELEGATECALL.as_u64()), )?; self.is_staticcall.assign( region, offset, - F::from(opcode.as_u64()) - F::from(OpcodeId::STATICCALL.as_u64()), + F::from(opcode.as_u64()), + F::from(OpcodeId::STATICCALL.as_u64()), )?; self.tx_id .assign(region, offset, Value::known(F::from(tx_id.low_u64())))?; diff --git a/zkevm-circuits/src/evm_circuit/execution/callvalue.rs b/zkevm-circuits/src/evm_circuit/execution/callvalue.rs index 49468e8f9e..6b809785ef 100644 --- a/zkevm-circuits/src/evm_circuit/execution/callvalue.rs +++ b/zkevm-circuits/src/evm_circuit/execution/callvalue.rs @@ -11,7 +11,7 @@ use crate::{ }, table::CallContextFieldTag, util::{ - word::{WordCell, WordExpr}, + word::{WordExpr, WordLoHiCell}, Expr, }, }; @@ -24,7 +24,7 @@ pub(crate) struct CallValueGadget { same_context: SameContextGadget, // Value in rw_table->stack_op and call_context->call_value are both RLC // encoded, so no need to decode. - call_value: WordCell, + call_value: WordLoHiCell, } impl ExecutionGadget for CallValueGadget { diff --git a/zkevm-circuits/src/evm_circuit/execution/chainid.rs b/zkevm-circuits/src/evm_circuit/execution/chainid.rs index b215191391..ed1e476632 100644 --- a/zkevm-circuits/src/evm_circuit/execution/chainid.rs +++ b/zkevm-circuits/src/evm_circuit/execution/chainid.rs @@ -11,7 +11,7 @@ use crate::{ }, table::BlockContextFieldTag, util::{ - word::{WordCell, WordExpr}, + word::{WordExpr, WordLoHiCell}, Expr, }, }; @@ -22,7 +22,7 @@ use halo2_proofs::plonk::Error; #[derive(Clone, Debug)] pub(crate) struct ChainIdGadget { same_context: SameContextGadget, - chain_id: WordCell, + chain_id: WordLoHiCell, } impl ExecutionGadget for ChainIdGadget { diff --git a/zkevm-circuits/src/evm_circuit/execution/codecopy.rs b/zkevm-circuits/src/evm_circuit/execution/codecopy.rs index a1a5c48085..2a8450efd3 100644 --- a/zkevm-circuits/src/evm_circuit/execution/codecopy.rs +++ b/zkevm-circuits/src/evm_circuit/execution/codecopy.rs @@ -20,7 +20,7 @@ use crate::{ witness::{Block, Call, Chunk, ExecStep, Transaction}, }, util::{ - word::{Word, WordExpr}, + word::{WordExpr, WordLoHi}, Expr, }, }; @@ -66,9 +66,9 @@ impl ExecutionGadget for CodeCopyGadget { // Pop items from stack. cb.stack_pop(dst_memory_offset.to_word()); cb.stack_pop(code_offset.original_word().to_word()); - cb.stack_pop(Word::from_lo_unchecked(length.expr())); + cb.stack_pop(WordLoHi::from_lo_unchecked(length.expr())); - // Construct memory address in the destionation (memory) to which we copy code. + // Construct memory address in the destination (memory) to which we copy code. let dst_memory_addr = MemoryAddressGadget::construct(cb, dst_memory_offset, length); // Fetch the hash of bytecode running in current environment. @@ -89,7 +89,7 @@ impl ExecutionGadget for CodeCopyGadget { let copy_rwc_inc = cb.query_cell(); cb.condition(dst_memory_addr.has_length(), |cb| { - // Set source start to the minimun value of code offset and code size. + // Set source start to the minimum value of code offset and code size. let src_addr = select::expr( code_offset.lt_cap(), code_offset.valid_value(), @@ -99,7 +99,7 @@ impl ExecutionGadget for CodeCopyGadget { cb.copy_table_lookup( code_hash.to_word(), CopyDataType::Bytecode.expr(), - Word::from_lo_unchecked(cb.curr.state.call_id.expr()), + WordLoHi::from_lo_unchecked(cb.curr.state.call_id.expr()), CopyDataType::Memory.expr(), src_addr, code_size.expr(), diff --git a/zkevm-circuits/src/evm_circuit/execution/comparator.rs b/zkevm-circuits/src/evm_circuit/execution/comparator.rs index 2294e958f4..26c9f60cc5 100644 --- a/zkevm-circuits/src/evm_circuit/execution/comparator.rs +++ b/zkevm-circuits/src/evm_circuit/execution/comparator.rs @@ -11,7 +11,7 @@ use crate::{ witness::{Block, Call, Chunk, ExecStep, Transaction}, }, util::{ - word::{Word, WordCell, WordExpr}, + word::{WordExpr, WordLoHi, WordLoHiCell}, Expr, }, }; @@ -21,12 +21,12 @@ use halo2_proofs::{circuit::Value, plonk::Error}; #[derive(Clone, Debug)] pub(crate) struct ComparatorGadget { same_context: SameContextGadget, - a: WordCell, - b: WordCell, + a: WordLoHiCell, + b: WordLoHiCell, result: Cell, is_eq: IsEqualGadget, is_gt: IsEqualGadget, - word_comparison: CmpWordsGadget, WordCell>, + word_comparison: CmpWordsGadget, WordLoHiCell>, } impl ExecutionGadget for ComparatorGadget { @@ -41,10 +41,10 @@ impl ExecutionGadget for ComparatorGadget { let b = cb.query_word_unchecked(); // Check if opcode is EQ - let is_eq = IsEqualGadget::construct(cb, opcode.expr(), OpcodeId::EQ.expr()); + let is_eq = cb.is_eq(opcode.expr(), OpcodeId::EQ.expr()); // Check if opcode is GT. For GT we swap the stack inputs so that we // actually do greater than instead of smaller than. - let is_gt = IsEqualGadget::construct(cb, opcode.expr(), OpcodeId::GT.expr()); + let is_gt = cb.is_eq(opcode.expr(), OpcodeId::GT.expr()); let word_comparison = CmpWordsGadget::construct(cb, a.clone(), b.clone()); @@ -62,9 +62,9 @@ impl ExecutionGadget for ComparatorGadget { // When swap is enabled we swap stack places between a and b. // We can push result here directly because // it only uses the LSB of a word. - cb.stack_pop(Word::select(is_gt.expr(), b.to_word(), a.to_word())); - cb.stack_pop(Word::select(is_gt.expr(), a.to_word(), b.to_word())); - cb.stack_push(Word::from_lo_unchecked(result.expr())); + cb.stack_pop(WordLoHi::select(is_gt.expr(), b.to_word(), a.to_word())); + cb.stack_pop(WordLoHi::select(is_gt.expr(), a.to_word(), b.to_word())); + cb.stack_push(WordLoHi::from_lo_unchecked(result.expr())); // State transition let step_state_transition = StepStateTransition { diff --git a/zkevm-circuits/src/evm_circuit/execution/create.rs b/zkevm-circuits/src/evm_circuit/execution/create.rs index 11db26cf72..3efd40d76a 100644 --- a/zkevm-circuits/src/evm_circuit/execution/create.rs +++ b/zkevm-circuits/src/evm_circuit/execution/create.rs @@ -13,19 +13,19 @@ use crate::{ Transition::{Delta, To}, }, math_gadget::{ - ConstantDivisionGadget, ContractCreateGadget, IsZeroGadget, IsZeroWordGadget, + ConstantDivisionGadget, ContractCreateGadget, IsEqualGadget, IsZeroWordGadget, LtGadget, LtWordGadget, }, memory_gadget::{ CommonMemoryAddressGadget, MemoryAddressGadget, MemoryExpansionGadget, }, - not, AccountAddress, CachedRegion, Cell, StepRws, Word, WordExpr, + not, AccountAddress, CachedRegion, Cell, StepRws, }, witness::{Block, Call, Chunk, ExecStep, Transaction}, }, table::{AccountFieldTag, CallContextFieldTag}, util::{ - word::{Word32Cell, WordCell}, + word::{Word32Cell, WordExpr, WordLoHi, WordLoHiCell}, Expr, }, }; @@ -34,7 +34,7 @@ use bus_mapping::{ }; use eth_types::{ evm_types::{GasCost, INIT_CODE_WORD_GAS}, - Field, ToBigEndian, ToScalar, ToWord, U256, + Field, OpsIdentity, ToBigEndian, ToScalar, ToWord, U256, }; use ethers_core::utils::keccak256; use gadgets::util::{and, select}; @@ -53,16 +53,16 @@ pub(crate) struct CreateGadget, depth: Cell, - is_create2: IsZeroGadget, + is_create2: IsEqualGadget, is_success: Cell, was_warm: Cell, value: Word32Cell, - caller_balance: WordCell, + caller_balance: WordLoHiCell, callee_reversion_info: ReversionInfo, callee_nonce: Cell, - prev_code_hash: WordCell, - prev_code_hash_is_zero: IsZeroWordGadget>>, + prev_code_hash: WordLoHiCell, + prev_code_hash_is_zero: IsZeroWordGadget>>, transfer: TransferGadget, create: ContractCreateGadget, @@ -74,7 +74,7 @@ pub(crate) struct CreateGadget, is_insufficient_balance: LtWordGadget, is_nonce_in_range: LtGadget, - not_address_collision: IsZeroWordGadget>>, + not_address_collision: IsZeroWordGadget>>, memory_expansion: MemoryExpansionGadget, gas_left: ConstantDivisionGadget, @@ -95,7 +95,7 @@ impl ExecutionGadget< opcode.expr(), vec![OpcodeId::CREATE2.expr(), OpcodeId::CREATE.expr()], ); - let is_create2 = IsZeroGadget::construct(cb, opcode.expr() - OpcodeId::CREATE2.expr()); + let is_create2 = cb.is_eq(opcode.expr(), OpcodeId::CREATE2.expr()); // Use rw_counter of the step which triggers next call as its call_id. let callee_call_id = cb.curr.state.rw_counter.clone(); @@ -139,14 +139,13 @@ impl ExecutionGadget< cb.account_read( create.caller_address(), AccountFieldTag::Nonce, - Word::from_lo_unchecked(caller_nonce.expr()), + WordLoHi::from_lo_unchecked(caller_nonce.expr()), ); // Pre-check: call depth, user's nonce and user's balance - let is_depth_in_range = LtGadget::construct(cb, depth.expr(), 1025.expr()); - let is_insufficient_balance = - LtWordGadget::construct(cb, &caller_balance.to_word(), &value.to_word()); - let is_nonce_in_range = LtGadget::construct(cb, caller_nonce.expr(), u64::MAX.expr()); + let is_depth_in_range = cb.is_lt(depth.expr(), 1025.expr()); + let is_insufficient_balance = cb.is_lt_word(&caller_balance.to_word(), &value.to_word()); + let is_nonce_in_range = cb.is_lt(caller_nonce.expr(), u64::MAX.expr()); let is_precheck_ok = and::expr([ is_depth_in_range.expr(), not::expr(is_insufficient_balance.expr()), @@ -169,7 +168,7 @@ impl ExecutionGadget< ); let gas_cost = GasCost::CREATE.expr() + memory_expansion.gas_cost() + keccak_gas_cost; let gas_remaining = cb.curr.state.gas_left.expr() - gas_cost.clone(); - let gas_left = ConstantDivisionGadget::construct(cb, gas_remaining.clone(), 64); + let gas_left = cb.div_by_const(gas_remaining.clone(), 64); let callee_gas_left = gas_remaining - gas_left.quotient(); let was_warm = cb.query_bool(); @@ -182,8 +181,8 @@ impl ExecutionGadget< cb.account_write( create.caller_address(), AccountFieldTag::Nonce, - Word::from_lo_unchecked(caller_nonce.expr() + 1.expr()), - Word::from_lo_unchecked(caller_nonce.expr()), + WordLoHi::from_lo_unchecked(caller_nonce.expr() + 1.expr()), + WordLoHi::from_lo_unchecked(caller_nonce.expr()), Some(&mut reversion_info), ); @@ -209,19 +208,19 @@ impl ExecutionGadget< // empty_code_hash_word))` to represent `(callee_nonce == 0 && (prev_code_hash_word // == 0 or prev_code_hash_word == empty_code_hash_word))` let prev_code_hash_word = prev_code_hash.to_word(); - let prev_code_hash_is_zero = IsZeroWordGadget::construct(cb, &prev_code_hash_word); + let prev_code_hash_is_zero = cb.is_zero_word(&prev_code_hash_word); cb.condition(not::expr(prev_code_hash_is_zero.expr()), |cb| { cb.account_read( contract_addr.to_word(), AccountFieldTag::Nonce, - Word::from_lo_unchecked(callee_nonce.expr()), + WordLoHi::from_lo_unchecked(callee_nonce.expr()), ); }); ( prev_code_hash_is_zero, IsZeroWordGadget::construct( cb, - &Word::from_lo_unchecked(callee_nonce.expr()).add_unchecked( + &WordLoHi::from_lo_unchecked(callee_nonce.expr()).add_unchecked( prev_code_hash_word.clone().mul_unchecked( prev_code_hash_word.sub_unchecked(cb.empty_code_hash()), ), @@ -233,25 +232,27 @@ impl ExecutionGadget< for (field_tag, value) in [ ( CallContextFieldTag::ProgramCounter, - Word::from_lo_unchecked(cb.curr.state.program_counter.expr() + 1.expr()), + WordLoHi::from_lo_unchecked(cb.curr.state.program_counter.expr() + 1.expr()), ), ( CallContextFieldTag::StackPointer, - Word::from_lo_unchecked( + WordLoHi::from_lo_unchecked( cb.curr.state.stack_pointer.expr() + 2.expr() + is_create2.expr(), ), ), ( CallContextFieldTag::GasLeft, - Word::from_lo_unchecked(gas_left.quotient()), + WordLoHi::from_lo_unchecked(gas_left.quotient()), ), ( CallContextFieldTag::MemorySize, - Word::from_lo_unchecked(memory_expansion.next_memory_word_size()), + WordLoHi::from_lo_unchecked(memory_expansion.next_memory_word_size()), ), ( CallContextFieldTag::ReversibleWriteCounter, - Word::from_lo_unchecked(cb.curr.state.reversible_write_counter.expr() + 2.expr()), + WordLoHi::from_lo_unchecked( + cb.curr.state.reversible_write_counter.expr() + 2.expr(), + ), ), ] { cb.call_context_lookup_write(None, field_tag, value); @@ -266,7 +267,7 @@ impl ExecutionGadget< // the init code is being copied from memory to bytecode, so a copy table lookup // to verify that the associated fields for the copy event. cb.copy_table_lookup( - Word::from_lo_unchecked(current_call_id.expr()), + WordLoHi::from_lo_unchecked(current_call_id.expr()), CopyDataType::Memory.expr(), create.code_hash(), CopyDataType::Bytecode.expr(), @@ -290,13 +291,13 @@ impl ExecutionGadget< cb.call_context_lookup_write( None, CallContextFieldTag::LastCalleeId, - Word::from_lo_unchecked(callee_call_id.expr()), + WordLoHi::from_lo_unchecked(callee_call_id.expr()), ); for field_tag in [ CallContextFieldTag::LastCalleeReturnDataOffset, CallContextFieldTag::LastCalleeReturnDataLength, ] { - cb.call_context_lookup_write(None, field_tag, Word::zero()); + cb.call_context_lookup_write(None, field_tag, WordLoHi::zero()); } cb.require_step_state_transition(StepStateTransition { @@ -342,8 +343,8 @@ impl ExecutionGadget< cb.account_write( contract_addr.to_word(), AccountFieldTag::Nonce, - Word::one(), - Word::zero(), + WordLoHi::one(), + WordLoHi::zero(), Some(&mut callee_reversion_info), ); @@ -351,43 +352,43 @@ impl ExecutionGadget< for (field_tag, value) in [ ( CallContextFieldTag::CallerId, - Word::from_lo_unchecked(current_call_id.expr()), + WordLoHi::from_lo_unchecked(current_call_id.expr()), ), ( CallContextFieldTag::IsSuccess, - Word::from_lo_unchecked(is_success.expr()), + WordLoHi::from_lo_unchecked(is_success.expr()), ), ( CallContextFieldTag::IsPersistent, - Word::from_lo_unchecked(callee_reversion_info.is_persistent()), + WordLoHi::from_lo_unchecked(callee_reversion_info.is_persistent()), ), ( CallContextFieldTag::TxId, - Word::from_lo_unchecked(tx_id.expr()), + WordLoHi::from_lo_unchecked(tx_id.expr()), ), (CallContextFieldTag::CallerAddress, create.caller_address()), (CallContextFieldTag::CalleeAddress, contract_addr.to_word()), ( CallContextFieldTag::RwCounterEndOfReversion, - Word::from_lo_unchecked( + WordLoHi::from_lo_unchecked( callee_reversion_info.rw_counter_end_of_reversion(), ), ), ( CallContextFieldTag::Depth, - Word::from_lo_unchecked(depth.expr() + 1.expr()), + WordLoHi::from_lo_unchecked(depth.expr() + 1.expr()), ), ( CallContextFieldTag::IsRoot, - Word::from_lo_unchecked(false.expr()), + WordLoHi::from_lo_unchecked(false.expr()), ), ( CallContextFieldTag::IsStatic, - Word::from_lo_unchecked(false.expr()), + WordLoHi::from_lo_unchecked(false.expr()), ), ( CallContextFieldTag::IsCreate, - Word::from_lo_unchecked(true.expr()), + WordLoHi::from_lo_unchecked(true.expr()), ), (CallContextFieldTag::CodeHash, create.code_hash()), (CallContextFieldTag::Value, value.to_word()), @@ -414,13 +415,13 @@ impl ExecutionGadget< cb.call_context_lookup_write( None, CallContextFieldTag::LastCalleeId, - Word::from_lo_unchecked(callee_call_id.expr()), + WordLoHi::from_lo_unchecked(callee_call_id.expr()), ); for field_tag in [ CallContextFieldTag::LastCalleeReturnDataOffset, CallContextFieldTag::LastCalleeReturnDataLength, ] { - cb.call_context_lookup_write(None, field_tag, Word::zero()); + cb.call_context_lookup_write(None, field_tag, WordLoHi::zero()); } cb.require_step_state_transition(StepStateTransition { rw_counter: Delta(cb.rw_counter_offset()), @@ -457,13 +458,13 @@ impl ExecutionGadget< cb.call_context_lookup_write( None, CallContextFieldTag::LastCalleeId, - Word::from_lo_unchecked(callee_call_id.expr()), + WordLoHi::from_lo_unchecked(callee_call_id.expr()), ); for field_tag in [ CallContextFieldTag::LastCalleeReturnDataOffset, CallContextFieldTag::LastCalleeReturnDataLength, ] { - cb.call_context_lookup_write(None, field_tag, Word::zero()); + cb.call_context_lookup_write(None, field_tag, WordLoHi::zero()); } cb.require_step_state_transition(StepStateTransition { @@ -524,7 +525,8 @@ impl ExecutionGadget< self.is_create2.assign( region, offset, - F::from(opcode.as_u64()) - F::from(OpcodeId::CREATE2.as_u64()), + F::from(opcode.as_u64()), + F::from(OpcodeId::CREATE2.as_u64()), )?; self.tx_id diff --git a/zkevm-circuits/src/evm_circuit/execution/dummy.rs b/zkevm-circuits/src/evm_circuit/execution/dummy.rs index 68737291ad..f861cf60f9 100644 --- a/zkevm-circuits/src/evm_circuit/execution/dummy.rs +++ b/zkevm-circuits/src/evm_circuit/execution/dummy.rs @@ -7,15 +7,15 @@ use crate::{ util::{constraint_builder::EVMConstraintBuilder, CachedRegion}, witness::{Block, Call, Chunk, ExecStep, Transaction}, }, - util::word::{WordCell, WordExpr}, + util::word::{WordExpr, WordLoHiCell}, }; use eth_types::Field; use halo2_proofs::plonk::Error; #[derive(Clone, Debug)] pub(crate) struct DummyGadget { - pops: [WordCell; N_POP], - pushes: [WordCell; N_PUSH], + pops: [WordLoHiCell; N_POP], + pushes: [WordLoHiCell; N_PUSH], _marker: PhantomData, } @@ -27,8 +27,8 @@ impl const EXECUTION_STATE: ExecutionState = S; fn configure(cb: &mut EVMConstraintBuilder) -> Self { - let pops: [WordCell; N_POP] = [(); N_POP].map(|_| cb.query_word_unchecked()); - let pushes: [WordCell; N_PUSH] = [(); N_PUSH].map(|_| cb.query_word_unchecked()); + let pops: [WordLoHiCell; N_POP] = [(); N_POP].map(|_| cb.query_word_unchecked()); + let pushes: [WordLoHiCell; N_PUSH] = [(); N_PUSH].map(|_| cb.query_word_unchecked()); for pop in pops.iter() { cb.stack_pop(pop.to_word()); } diff --git a/zkevm-circuits/src/evm_circuit/execution/dup.rs b/zkevm-circuits/src/evm_circuit/execution/dup.rs index bd351f6e8d..a49c0ec4df 100644 --- a/zkevm-circuits/src/evm_circuit/execution/dup.rs +++ b/zkevm-circuits/src/evm_circuit/execution/dup.rs @@ -10,7 +10,7 @@ use crate::{ witness::{Block, Call, Chunk, ExecStep, Transaction}, }, util::{ - word::{WordCell, WordExpr}, + word::{WordExpr, WordLoHiCell}, Expr, }, }; @@ -20,7 +20,7 @@ use halo2_proofs::plonk::Error; #[derive(Clone, Debug)] pub(crate) struct DupGadget { same_context: SameContextGadget, - value: WordCell, + value: WordLoHiCell, } impl ExecutionGadget for DupGadget { diff --git a/zkevm-circuits/src/evm_circuit/execution/end_block.rs b/zkevm-circuits/src/evm_circuit/execution/end_block.rs index 9854d01368..73188658f2 100644 --- a/zkevm-circuits/src/evm_circuit/execution/end_block.rs +++ b/zkevm-circuits/src/evm_circuit/execution/end_block.rs @@ -7,22 +7,22 @@ use crate::{ constraint_builder::{ ConstrainBuilderCommon, EVMConstraintBuilder, StepStateTransition, Transition::Same, }, - math_gadget::{IsEqualGadget, IsZeroGadget}, + math_gadget::IsEqualGadget, not, CachedRegion, Cell, }, witness::{Block, Call, Chunk, ExecStep, Transaction}, }, table::{CallContextFieldTag, TxContextFieldTag}, - util::{word::Word, Expr}, + util::{word::WordLoHi, Expr}, }; -use eth_types::Field; +use eth_types::{Field, OpsIdentity}; use halo2_proofs::{circuit::Value, plonk::Error}; #[derive(Clone, Debug)] pub(crate) struct EndBlockGadget { total_txs: Cell, total_txs_is_max_txs: IsEqualGadget, - is_empty_rwc: IsZeroGadget, + is_empty_block: IsEqualGadget, max_txs: Cell, rw_table_padding_gadget: RwTablePaddingGadget, } @@ -35,22 +35,22 @@ impl ExecutionGadget for EndBlockGadget { fn configure(cb: &mut EVMConstraintBuilder) -> Self { let max_txs = cb.query_copy_cell(); let total_txs = cb.query_cell(); - let total_txs_is_max_txs = IsEqualGadget::construct(cb, total_txs.expr(), max_txs.expr()); - let is_empty_rwc = - IsZeroGadget::construct(cb, cb.curr.state.rw_counter.clone().expr() - 1.expr()); + let total_txs_is_max_txs = cb.is_eq(total_txs.expr(), max_txs.expr()); + // Note that rw_counter starts at 1 + let is_empty_block = cb.is_eq(cb.curr.state.rw_counter.clone().expr(), 1.expr()); // 1. Constraint total_rws and total_txs witness values depending on the empty // block case. - cb.condition(is_empty_rwc.expr(), |cb| { + cb.condition(is_empty_block.expr(), |cb| { // 1a. cb.require_equal("total_txs is 0 in empty block", total_txs.expr(), 0.expr()); }); - cb.condition(not::expr(is_empty_rwc.expr()), |cb| { + cb.condition(not::expr(is_empty_block.expr()), |cb| { // 1b. total_txs matches the tx_id that corresponds to the final step. cb.call_context_lookup_read( None, CallContextFieldTag::TxId, - Word::from_lo_unchecked(total_txs.expr()), + WordLoHi::from_lo_unchecked(total_txs.expr()), ); }); @@ -65,7 +65,7 @@ impl ExecutionGadget for EndBlockGadget { total_txs.expr() + 1.expr(), TxContextFieldTag::CallerAddress, None, - Word::zero(), + WordLoHi::zero(), ); // Since every tx lookup done in the EVM circuit must succeed // and uses a unique tx_id, we know that at @@ -107,7 +107,7 @@ impl ExecutionGadget for EndBlockGadget { max_txs, total_txs, total_txs_is_max_txs, - is_empty_rwc, + is_empty_block, rw_table_padding_gadget, } } @@ -122,12 +122,11 @@ impl ExecutionGadget for EndBlockGadget { _: &Call, step: &ExecStep, ) -> Result<(), Error> { - let total_rwc = u64::from(step.rwc) - 1; - self.is_empty_rwc - .assign(region, offset, F::from(total_rwc))?; + self.is_empty_block + .assign(region, offset, F::from(u64::from(step.rwc)), F::ONE)?; let inner_rws_before_padding = - step.rwc_inner_chunk.0 as u64 - 1 + if total_rwc > 0 { 1 } else { 0 }; + step.rwc_inner_chunk.0 as u64 - 1 + if u64::from(step.rwc) > 1 { 1 } else { 0 }; self.rw_table_padding_gadget.assign_exec_step( region, offset, diff --git a/zkevm-circuits/src/evm_circuit/execution/end_tx.rs b/zkevm-circuits/src/evm_circuit/execution/end_tx.rs index 1450954358..c8ed180f40 100644 --- a/zkevm-circuits/src/evm_circuit/execution/end_tx.rs +++ b/zkevm-circuits/src/evm_circuit/execution/end_tx.rs @@ -17,7 +17,7 @@ use crate::{ }, table::{AccountFieldTag, BlockContextFieldTag, CallContextFieldTag, TxContextFieldTag}, util::{ - word::{Word, WordCell, WordExpr}, + word::{WordExpr, WordLoHi, WordLoHiCell}, Expr, }, }; @@ -32,13 +32,13 @@ pub(crate) struct EndTxGadget { refund: Cell, effective_refund: MinMaxGadget, mul_gas_price_by_refund: MulWordByU64Gadget, - tx_caller_address: WordCell, + tx_caller_address: WordLoHiCell, gas_fee_refund: UpdateBalanceGadget, sub_gas_price_by_base_fee: AddWordsGadget, mul_effective_tip_by_gas_used: MulWordByU64Gadget, - coinbase: WordCell, - coinbase_code_hash: WordCell, - coinbase_code_hash_is_zero: IsZeroWordGadget>, + coinbase: WordLoHiCell, + coinbase_code_hash: WordLoHiCell, + coinbase_code_hash_is_zero: IsZeroWordGadget>, coinbase_reward: TransferToGadget, is_persistent: Cell, end_tx: EndTxHelperGadget, @@ -66,8 +66,8 @@ impl ExecutionGadget for EndTxGadget { MAX_REFUND_QUOTIENT_OF_GAS_USED as u64, ); let refund = cb.query_cell(); - cb.tx_refund_read(tx_id.expr(), Word::from_lo_unchecked(refund.expr())); - let effective_refund = MinMaxGadget::construct(cb, max_refund.quotient(), refund.expr()); + cb.tx_refund_read(tx_id.expr(), WordLoHi::from_lo_unchecked(refund.expr())); + let effective_refund = cb.min_max(max_refund.quotient(), refund.expr()); // Add effective_refund * tx_gas_price back to caller's balance let mul_gas_price_by_refund = MulWordByU64Gadget::construct( @@ -85,7 +85,7 @@ impl ExecutionGadget for EndTxGadget { // Add gas_used * effective_tip to coinbase's balance let coinbase = cb.query_word_unchecked(); let coinbase_code_hash = cb.query_word_unchecked(); - let coinbase_code_hash_is_zero = IsZeroWordGadget::construct(cb, &coinbase_code_hash); + let coinbase_code_hash_is_zero = cb.is_zero_word(&coinbase_code_hash); cb.account_read( coinbase.to_word(), AccountFieldTag::CodeHash, @@ -468,7 +468,7 @@ mod test { .sorted_by_key(|a| a.rw_counter()) .tuple_windows() .for_each(|(a, b)| { - // chech there is no consecutive write with same txid value + // check there is no consecutive write with same txid value assert!(a.rw_counter() != b.rw_counter()); assert!(a.value_assignment() != b.value_assignment()); }) diff --git a/zkevm-circuits/src/evm_circuit/execution/error_code_store.rs b/zkevm-circuits/src/evm_circuit/execution/error_code_store.rs index 2cb8a0ee63..0421d8d54c 100644 --- a/zkevm-circuits/src/evm_circuit/execution/error_code_store.rs +++ b/zkevm-circuits/src/evm_circuit/execution/error_code_store.rs @@ -72,8 +72,7 @@ impl ExecutionGadget for ErrorCodeStoreGadget { ); // constrain code size > MAXCODESIZE - let max_code_size_exceed = - LtGadget::construct(cb, MAXCODESIZE.expr(), memory_address.length()); + let max_code_size_exceed = cb.is_lt(MAXCODESIZE.expr(), memory_address.length()); // check must be one of CodeStoreOutOfGas or MaxCodeSizeExceeded cb.require_in_set( diff --git a/zkevm-circuits/src/evm_circuit/execution/error_invalid_creation_code.rs b/zkevm-circuits/src/evm_circuit/execution/error_invalid_creation_code.rs index a6bbd6c1e8..beb2f871d9 100644 --- a/zkevm-circuits/src/evm_circuit/execution/error_invalid_creation_code.rs +++ b/zkevm-circuits/src/evm_circuit/execution/error_invalid_creation_code.rs @@ -46,7 +46,7 @@ impl ExecutionGadget for ErrorInvalidCreationCodeGadget { cb.memory_lookup(0.expr(), memory_address.offset(), first_byte.expr(), None); let is_first_byte_invalid = - IsEqualGadget::construct(cb, first_byte.expr(), INVALID_INIT_CODE_FIRST_BYTE.expr()); + cb.is_eq(first_byte.expr(), INVALID_INIT_CODE_FIRST_BYTE.expr()); cb.require_true( "is_first_byte_invalid is true", is_first_byte_invalid.expr(), diff --git a/zkevm-circuits/src/evm_circuit/execution/error_invalid_jump.rs b/zkevm-circuits/src/evm_circuit/execution/error_invalid_jump.rs index 1a690aad27..453f5ef011 100644 --- a/zkevm-circuits/src/evm_circuit/execution/error_invalid_jump.rs +++ b/zkevm-circuits/src/evm_circuit/execution/error_invalid_jump.rs @@ -12,7 +12,7 @@ use crate::{ witness::{Block, Call, Chunk, ExecStep, Transaction}, }, util::{ - word::{Word, WordCell, WordExpr}, + word::{WordExpr, WordLoHi, WordLoHiCell}, Expr, }, }; @@ -29,8 +29,8 @@ pub(crate) struct ErrorInvalidJumpGadget { is_code: Cell, is_jump_dest: IsEqualGadget, is_jumpi: IsEqualGadget, - condition: WordCell, - is_condition_zero: IsZeroWordGadget>, + condition: WordLoHiCell, + is_condition_zero: IsZeroWordGadget>, common_error_gadget: CommonErrorGadget, } @@ -54,14 +54,14 @@ impl ExecutionGadget for ErrorInvalidJumpGadget { vec![OpcodeId::JUMP.expr(), OpcodeId::JUMPI.expr()], ); - let is_jumpi = IsEqualGadget::construct(cb, opcode.expr(), OpcodeId::JUMPI.expr()); + let is_jumpi = cb.is_eq(opcode.expr(), OpcodeId::JUMPI.expr()); // initialize is_jump_dest - let is_jump_dest = IsEqualGadget::construct(cb, value.expr(), OpcodeId::JUMPDEST.expr()); + let is_jump_dest = cb.is_eq(value.expr(), OpcodeId::JUMPDEST.expr()); // first default this condition, if use will re-construct with real condition // value - let is_condition_zero = IsZeroWordGadget::construct(cb, &condition); + let is_condition_zero = cb.is_zero_word(&condition); // Pop the value from the stack cb.stack_pop(dest.original_word().to_word()); @@ -161,8 +161,11 @@ impl ExecutionGadget for ErrorInvalidJumpGadget { )?; self.condition.assign_u256(region, offset, condition)?; - self.is_condition_zero - .assign_value(region, offset, Value::known(Word::from(condition)))?; + self.is_condition_zero.assign_value( + region, + offset, + Value::known(WordLoHi::from(condition)), + )?; self.common_error_gadget.assign( region, diff --git a/zkevm-circuits/src/evm_circuit/execution/error_oog_account_access.rs b/zkevm-circuits/src/evm_circuit/execution/error_oog_account_access.rs index 85a4804a3d..49b65ae27c 100644 --- a/zkevm-circuits/src/evm_circuit/execution/error_oog_account_access.rs +++ b/zkevm-circuits/src/evm_circuit/execution/error_oog_account_access.rs @@ -62,8 +62,7 @@ impl ExecutionGadget for ErrorOOGAccountAccessGadget { GasCost::COLD_ACCOUNT_ACCESS.expr(), ); - let insufficient_gas_cost = - LtGadget::construct(cb, cb.curr.state.gas_left.expr(), gas_cost); + let insufficient_gas_cost = cb.is_lt(cb.curr.state.gas_left.expr(), gas_cost); cb.require_equal( "Gas left is less than gas cost", diff --git a/zkevm-circuits/src/evm_circuit/execution/error_oog_call.rs b/zkevm-circuits/src/evm_circuit/execution/error_oog_call.rs index b6868f9617..4c2a851d27 100644 --- a/zkevm-circuits/src/evm_circuit/execution/error_oog_call.rs +++ b/zkevm-circuits/src/evm_circuit/execution/error_oog_call.rs @@ -79,7 +79,7 @@ impl ExecutionGadget for ErrorOOGCallGadget { let gas_cost = call_gadget.gas_cost_expr(is_warm.expr(), is_call.expr()); // Check if the amount of gas available is less than the amount of gas required - let insufficient_gas = LtGadget::construct(cb, cb.curr.state.gas_left.expr(), gas_cost); + let insufficient_gas = cb.is_lt(cb.curr.state.gas_left.expr(), gas_cost); cb.require_equal( "Either Memory address is overflow or gas left is less than cost", diff --git a/zkevm-circuits/src/evm_circuit/execution/error_oog_constant.rs b/zkevm-circuits/src/evm_circuit/execution/error_oog_constant.rs index 1af5f45ced..fdf5c01889 100644 --- a/zkevm-circuits/src/evm_circuit/execution/error_oog_constant.rs +++ b/zkevm-circuits/src/evm_circuit/execution/error_oog_constant.rs @@ -38,8 +38,7 @@ impl ExecutionGadget for ErrorOOGConstantGadget { cb.constant_gas_lookup(opcode.expr(), gas_required.expr()); // Check if the amount of gas available is less than the amount of gas // required - let insufficient_gas = - LtGadget::construct(cb, cb.curr.state.gas_left.expr(), gas_required.expr()); + let insufficient_gas = cb.is_lt(cb.curr.state.gas_left.expr(), gas_required.expr()); cb.require_equal( "constant gas left is less than gas required ", insufficient_gas.expr(), diff --git a/zkevm-circuits/src/evm_circuit/execution/error_oog_create.rs b/zkevm-circuits/src/evm_circuit/execution/error_oog_create.rs index 908ac16ca5..2f5a78d2b6 100644 --- a/zkevm-circuits/src/evm_circuit/execution/error_oog_create.rs +++ b/zkevm-circuits/src/evm_circuit/execution/error_oog_create.rs @@ -68,8 +68,7 @@ impl ExecutionGadget for ErrorOOGCreateGadget { cb.stack_pop(memory_address.length_word()); cb.condition(is_create2.expr().0, |cb| cb.stack_pop(salt.to_word())); - let init_code_size_overflow = - LtGadget::construct(cb, MAX_INIT_CODE_SIZE.expr(), memory_address.length()); + let init_code_size_overflow = cb.is_lt(MAX_INIT_CODE_SIZE.expr(), memory_address.length()); let minimum_word_size = MemoryWordSizeGadget::construct(cb, memory_address.length()); let memory_expansion = MemoryExpansionGadget::construct(cb, [memory_address.address()]); @@ -81,7 +80,7 @@ impl ExecutionGadget for ErrorOOGCreateGadget { CREATE_GAS_PER_CODE_WORD.expr(), ); let gas_cost = GasCost::CREATE.expr() + memory_expansion.gas_cost() + code_store_gas_cost; - let insufficient_gas = LtGadget::construct(cb, cb.curr.state.gas_left.expr(), gas_cost); + let insufficient_gas = cb.is_lt(cb.curr.state.gas_left.expr(), gas_cost); cb.require_equal( "Memory address is overflow, init code size is overflow, or gas left is less than cost", diff --git a/zkevm-circuits/src/evm_circuit/execution/error_oog_log.rs b/zkevm-circuits/src/evm_circuit/execution/error_oog_log.rs index 49e94dc98a..9bbe5f45fd 100644 --- a/zkevm-circuits/src/evm_circuit/execution/error_oog_log.rs +++ b/zkevm-circuits/src/evm_circuit/execution/error_oog_log.rs @@ -55,7 +55,7 @@ impl ExecutionGadget for ErrorOOGLogGadget { cb.require_zero("is_static_call is false in LOGN", is_static_call.expr()); let topic_count = opcode.expr() - OpcodeId::LOG0.as_u8().expr(); - let is_opcode_logn = LtGadget::construct(cb, topic_count.clone(), 5.expr()); + let is_opcode_logn = cb.is_lt(topic_count.clone(), 5.expr()); cb.require_equal( "topic count in [0..5) which means opcode is Log0...Log4 ", is_opcode_logn.expr(), @@ -73,7 +73,7 @@ impl ExecutionGadget for ErrorOOGLogGadget { // Check if the amount of gas available is less than the amount of gas // required - let insufficient_gas = LtGadget::construct(cb, cb.curr.state.gas_left.expr(), gas_cost); + let insufficient_gas = cb.is_lt(cb.curr.state.gas_left.expr(), gas_cost); cb.require_equal( "Memory address is overflow or gas left is less than cost", or::expr([memory_address.overflow(), insufficient_gas.expr()]), diff --git a/zkevm-circuits/src/evm_circuit/execution/error_oog_memory_copy.rs b/zkevm-circuits/src/evm_circuit/execution/error_oog_memory_copy.rs index 7e83ebb743..e7b8087647 100644 --- a/zkevm-circuits/src/evm_circuit/execution/error_oog_memory_copy.rs +++ b/zkevm-circuits/src/evm_circuit/execution/error_oog_memory_copy.rs @@ -17,7 +17,7 @@ use crate::{ }, table::CallContextFieldTag, util::{ - word::{Word, WordCell, WordExpr}, + word::{WordExpr, WordLoHi, WordLoHiCell}, Expr, }, }; @@ -39,7 +39,7 @@ pub(crate) struct ErrorOOGMemoryCopyGadget { /// Extra stack pop for `EXTCODECOPY` external_address: AccountAddress, /// Source offset - src_offset: WordCell, + src_offset: WordLoHiCell, /// Destination offset and size to copy dst_memory_addr: MemoryExpandedAddressGadget, memory_expansion: MemoryExpansionGadget, @@ -79,7 +79,7 @@ impl ExecutionGadget for ErrorOOGMemoryCopyGadget { cb.call_context_lookup_read( None, CallContextFieldTag::TxId, - Word::from_lo_unchecked(tx_id.expr()), + WordLoHi::from_lo_unchecked(tx_id.expr()), ); // Check if EXTCODECOPY external address is warm. diff --git a/zkevm-circuits/src/evm_circuit/execution/error_oog_precompile.rs b/zkevm-circuits/src/evm_circuit/execution/error_oog_precompile.rs index 6fb2d2ea88..828687fda2 100644 --- a/zkevm-circuits/src/evm_circuit/execution/error_oog_precompile.rs +++ b/zkevm-circuits/src/evm_circuit/execution/error_oog_precompile.rs @@ -63,11 +63,11 @@ impl ExecutionGadget for ErrorOOGPrecompileGadget { }); // calculate required gas for precompile - let precompiles_required_gas = vec![ - // ( - // addr_bits.value_equals(PrecompileCalls::ECRecover), - // GasCost::PRECOMPILE_ECRECOVER_BASE.expr(), - // ), + let precompiles_required_gas = [ + ( + addr_bits.value_equals(PrecompileCalls::Ecrecover), + GasCost::PRECOMPILE_ECRECOVER_BASE.expr(), + ), // addr_bits.value_equals(PrecompileCalls::Sha256), // addr_bits.value_equals(PrecompileCalls::Ripemd160), // addr_bits.value_equals(PrecompileCalls::Blake2F), @@ -114,8 +114,7 @@ impl ExecutionGadget for ErrorOOGPrecompileGadget { ); // gas_left < required_gas - let insufficient_gas = - LtGadget::construct(cb, cb.curr.state.gas_left.expr(), required_gas.expr()); + let insufficient_gas = cb.is_lt(cb.curr.state.gas_left.expr(), required_gas.expr()); cb.require_equal("gas_left < required_gas", insufficient_gas.expr(), 1.expr()); let restore_context = RestoreContextGadget::construct2( @@ -183,6 +182,7 @@ impl ExecutionGadget for ErrorOOGPrecompileGadget { // required_gas let precompile_call: PrecompileCalls = precompile_addr.to_fixed_bytes()[19].into(); let required_gas = match precompile_call { + PrecompileCalls::Ecrecover => precompile_call.base_gas_cost(), // PrecompileCalls::Bn128Pairing => { // precompile_call.base_gas_cost() // + n_pairs * GasCost::PRECOMPILE_BN256PAIRING_PER_PAIR @@ -191,8 +191,8 @@ impl ExecutionGadget for ErrorOOGPrecompileGadget { let n_words = (call.call_data_length + 31) / 32; precompile_call.base_gas_cost() + n_words * GasCost::PRECOMPILE_IDENTITY_PER_WORD } - // PrecompileCalls::Bn128Add | PrecompileCalls::Bn128Mul | PrecompileCalls::ECRecover => - // { precompile_call.base_gas_cost() + // PrecompileCalls::Bn128Add | PrecompileCalls::Bn128Mul => { + // precompile_call.base_gas_cost() // } _ => unreachable!(), }; diff --git a/zkevm-circuits/src/evm_circuit/execution/error_oog_sload_sstore.rs b/zkevm-circuits/src/evm_circuit/execution/error_oog_sload_sstore.rs index d22ce3ac30..c6ed23f111 100644 --- a/zkevm-circuits/src/evm_circuit/execution/error_oog_sload_sstore.rs +++ b/zkevm-circuits/src/evm_circuit/execution/error_oog_sload_sstore.rs @@ -17,7 +17,7 @@ use crate::{ }, table::CallContextFieldTag, util::{ - word::{Word, WordCell, WordExpr}, + word::{WordExpr, WordLoHi, WordLoHiCell}, Expr, }, }; @@ -34,14 +34,14 @@ pub(crate) struct ErrorOOGSloadSstoreGadget { opcode: Cell, tx_id: Cell, is_static: Cell, - callee_address: WordCell, - key: WordCell, - value: WordCell, - value_prev: WordCell, - original_value: WordCell, + callee_address: WordLoHiCell, + key: WordLoHiCell, + value: WordLoHiCell, + value_prev: WordLoHiCell, + original_value: WordLoHiCell, is_warm: Cell, is_sstore: PairSelectGadget, - sstore_gas_cost: SstoreGasGadget>, + sstore_gas_cost: SstoreGasGadget>, insufficient_gas_cost: LtGadget, // Constrain for SSTORE reentrancy sentry. insufficient_gas_sentry: LtGadget, @@ -81,7 +81,7 @@ impl ExecutionGadget for ErrorOOGSloadSstoreGadget { tx_id.expr(), callee_address.to_word(), key.to_word(), - Word::from_lo_unchecked(is_warm.expr()), + WordLoHi::from_lo_unchecked(is_warm.expr()), ); let sload_gas_cost = SloadGasGadget::construct(cb, is_warm.expr()); diff --git a/zkevm-circuits/src/evm_circuit/execution/error_oog_static_memory.rs b/zkevm-circuits/src/evm_circuit/execution/error_oog_static_memory.rs index 666c62950c..b19b3cb2df 100644 --- a/zkevm-circuits/src/evm_circuit/execution/error_oog_static_memory.rs +++ b/zkevm-circuits/src/evm_circuit/execution/error_oog_static_memory.rs @@ -14,7 +14,7 @@ use crate::{ }, witness::{Block, Call, Chunk, ExecStep, Transaction}, }, - util::{word::Word, Expr}, + util::{word::WordLoHi, Expr}, }; use eth_types::{evm_types::OpcodeId, Field, ToWord}; use gadgets::util::or; @@ -55,7 +55,7 @@ impl ExecutionGadget for ErrorOOGStaticMemoryGadget { ); // Check if this is an MSTORE8 - let is_mstore8 = IsEqualGadget::construct(cb, opcode.expr(), OpcodeId::MSTORE8.expr()); + let is_mstore8 = cb.is_eq(opcode.expr(), OpcodeId::MSTORE8.expr()); // pop memory_offset from stack let memory_address = MemoryExpandedAddressGadget::construct_self(cb); @@ -65,7 +65,7 @@ impl ExecutionGadget for ErrorOOGStaticMemoryGadget { cb.require_equal_word( "Memory length must be 32 for MLOAD and MSTORE, and 1 for MSTORE8", memory_address.length_word(), - Word::from_lo_unchecked(select::expr(is_mstore8.expr(), 1.expr(), 32.expr())), + WordLoHi::from_lo_unchecked(select::expr(is_mstore8.expr(), 1.expr(), 32.expr())), ); let memory_expansion = MemoryExpansionGadget::construct(cb, [memory_address.address()]); diff --git a/zkevm-circuits/src/evm_circuit/execution/error_precompile_failed.rs b/zkevm-circuits/src/evm_circuit/execution/error_precompile_failed.rs index 3f561d565e..54b3dc63b4 100644 --- a/zkevm-circuits/src/evm_circuit/execution/error_precompile_failed.rs +++ b/zkevm-circuits/src/evm_circuit/execution/error_precompile_failed.rs @@ -6,18 +6,18 @@ use crate::{ constraint_builder::{ConstrainBuilderCommon, EVMConstraintBuilder}, math_gadget::IsZeroGadget, memory_gadget::{CommonMemoryAddressGadget, MemoryAddressGadget}, - sum, CachedRegion, Cell, Word, + sum, CachedRegion, Cell, }, }, table::CallContextFieldTag, util::{ - word::{Word32Cell, WordExpr}, + word::{Word32Cell, WordExpr, WordLoHi}, Expr, }, witness::{Block, Call, Chunk, ExecStep, Transaction}, }; use bus_mapping::evm::OpcodeId; -use eth_types::{Field, U256}; +use eth_types::{Field, OpsIdentity, U256}; use halo2_proofs::{circuit::Value, plonk::Error}; #[derive(Clone, Debug)] @@ -87,14 +87,14 @@ impl ExecutionGadget for ErrorPrecompileFailedGadget { cb.stack_pop(cd_length.to_word()); cb.stack_pop(rd_offset.to_word()); cb.stack_pop(rd_length.to_word()); - cb.stack_push(Word::zero()); + cb.stack_push(WordLoHi::zero()); for (field_tag, value) in [ (CallContextFieldTag::LastCalleeId, callee_call_id.expr()), (CallContextFieldTag::LastCalleeReturnDataOffset, 0.expr()), (CallContextFieldTag::LastCalleeReturnDataLength, 0.expr()), ] { - cb.call_context_lookup_write(None, field_tag, Word::from_lo_unchecked(value)); + cb.call_context_lookup_write(None, field_tag, WordLoHi::from_lo_unchecked(value)); } let cd_address = MemoryAddressGadget::construct(cb, cd_offset, cd_length); diff --git a/zkevm-circuits/src/evm_circuit/execution/error_return_data_oo_bound.rs b/zkevm-circuits/src/evm_circuit/execution/error_return_data_oo_bound.rs index 2599a3969e..42234d499a 100644 --- a/zkevm-circuits/src/evm_circuit/execution/error_return_data_oo_bound.rs +++ b/zkevm-circuits/src/evm_circuit/execution/error_return_data_oo_bound.rs @@ -14,7 +14,7 @@ use crate::{ }, table::CallContextFieldTag, util::{ - word::{Word, WordExpr}, + word::{WordExpr, WordLoHi}, Expr, }, }; @@ -64,23 +64,22 @@ impl ExecutionGadget for ErrorReturnDataOutOfBoundGadget { cb.call_context_lookup_read( None, CallContextFieldTag::LastCalleeReturnDataLength, - Word::from_lo_unchecked(return_data_length.expr()), + WordLoHi::from_lo_unchecked(return_data_length.expr()), ); // Check if `data_offset` is Uint64 overflow. let data_offset_larger_u64 = sum::expr(&data_offset.limbs[N_BYTES_U64..]); - let is_data_offset_within_u64 = IsZeroGadget::construct(cb, data_offset_larger_u64); + let is_data_offset_within_u64 = cb.is_zero(data_offset_larger_u64); // Check if `remainder_end` is Uint64 overflow. let sum = AddWordsGadget::construct(cb, [data_offset, size], remainder_end.clone()); let is_end_u256_overflow = sum.carry().as_ref().unwrap(); let remainder_end_larger_u64 = sum::expr(&remainder_end.limbs[N_BYTES_U64..]); - let is_remainder_end_within_u64 = IsZeroGadget::construct(cb, remainder_end_larger_u64); + let is_remainder_end_within_u64 = cb.is_zero(remainder_end_larger_u64); // check if `remainder_end` exceeds return data length. - let is_remainder_end_exceed_len = LtGadget::construct( - cb, + let is_remainder_end_exceed_len = cb.is_lt( return_data_length.expr(), from_bytes::expr(&remainder_end.limbs[..N_BYTES_U64]), ); diff --git a/zkevm-circuits/src/evm_circuit/execution/error_write_protection.rs b/zkevm-circuits/src/evm_circuit/execution/error_write_protection.rs index 635ad84a7e..baf2b244de 100644 --- a/zkevm-circuits/src/evm_circuit/execution/error_write_protection.rs +++ b/zkevm-circuits/src/evm_circuit/execution/error_write_protection.rs @@ -5,28 +5,28 @@ use crate::{ util::{ common_gadget::CommonErrorGadget, constraint_builder::{ConstrainBuilderCommon, EVMConstraintBuilder}, - math_gadget::{IsZeroGadget, IsZeroWordGadget}, + math_gadget::{IsEqualGadget, IsZeroWordGadget}, AccountAddress, CachedRegion, Cell, }, witness::{Block, Call, Chunk, ExecStep, Transaction}, }, table::CallContextFieldTag, util::{ - word::{Word, WordCell, WordExpr}, + word::{WordExpr, WordLoHi, WordLoHiCell}, Expr, }, }; -use eth_types::{evm_types::OpcodeId, Field, ToAddress, U256}; +use eth_types::{evm_types::OpcodeId, Field, OpsIdentity, ToAddress, U256}; use halo2_proofs::{circuit::Value, plonk::Error}; #[derive(Clone, Debug)] pub(crate) struct ErrorWriteProtectionGadget { opcode: Cell, - is_call: IsZeroGadget, - gas: WordCell, + is_call: IsEqualGadget, + gas: WordLoHiCell, code_address: AccountAddress, - value: WordCell, - is_value_zero: IsZeroWordGadget>, + value: WordLoHiCell, + is_value_zero: IsZeroWordGadget>, common_error_gadget: CommonErrorGadget, } @@ -37,11 +37,11 @@ impl ExecutionGadget for ErrorWriteProtectionGadget { fn configure(cb: &mut EVMConstraintBuilder) -> Self { let opcode = cb.query_cell(); - let is_call = IsZeroGadget::construct(cb, opcode.expr() - OpcodeId::CALL.expr()); + let is_call = cb.is_eq(opcode.expr(), OpcodeId::CALL.expr()); let gas_word = cb.query_word_unchecked(); let code_address = cb.query_account_address(); let value = cb.query_word_unchecked(); - let is_value_zero = IsZeroWordGadget::construct(cb, &value); + let is_value_zero = cb.is_zero_word(&value); // require_in_set method will spilit into more low degree expressions if exceed // max_degree. otherwise need to do fixed lookup for these opcodes @@ -73,7 +73,7 @@ impl ExecutionGadget for ErrorWriteProtectionGadget { }); // current call context is readonly - cb.call_context_lookup_read(None, CallContextFieldTag::IsStatic, Word::one()); + cb.call_context_lookup_read(None, CallContextFieldTag::IsStatic, WordLoHi::one()); // constrain not root call as at least one previous staticcall preset. cb.require_zero( @@ -123,10 +123,11 @@ impl ExecutionGadget for ErrorWriteProtectionGadget { self.is_call.assign( region, offset, - F::from(opcode.as_u64()) - F::from(OpcodeId::CALL.as_u64()), + F::from(opcode.as_u64()), + F::from(OpcodeId::CALL.as_u64()), )?; self.is_value_zero - .assign(region, offset, Word::from(value))?; + .assign(region, offset, WordLoHi::from(value))?; self.common_error_gadget.assign( region, diff --git a/zkevm-circuits/src/evm_circuit/execution/exp.rs b/zkevm-circuits/src/evm_circuit/execution/exp.rs index df166b74e1..41deac1b77 100644 --- a/zkevm-circuits/src/evm_circuit/execution/exp.rs +++ b/zkevm-circuits/src/evm_circuit/execution/exp.rs @@ -78,11 +78,11 @@ impl ExecutionGadget for ExponentiationGadget { // We simplify constraints depending on whether or not the exponent is 0 or 1. // In order to do this, we build some utility expressions. - let exponent_lo_is_zero = IsZeroGadget::construct(cb, exponent_lo.clone()); - let exponent_hi_is_zero = IsZeroGadget::construct(cb, exponent_hi.clone()); + let exponent_lo_is_zero = cb.is_zero(exponent_lo.clone()); + let exponent_hi_is_zero = cb.is_zero(exponent_hi.clone()); let exponent_is_zero_expr = and::expr([exponent_lo_is_zero.expr(), exponent_hi_is_zero.expr()]); - let exponent_lo_is_one = IsEqualGadget::construct(cb, exponent_lo.clone(), 1.expr()); + let exponent_lo_is_one = cb.is_eq(exponent_lo.clone(), 1.expr()); let exponent_is_one_expr = and::expr([exponent_lo_is_one.expr(), exponent_hi_is_zero.expr()]); diff --git a/zkevm-circuits/src/evm_circuit/execution/extcodecopy.rs b/zkevm-circuits/src/evm_circuit/execution/extcodecopy.rs index 0b12819014..ef72eb0a9d 100644 --- a/zkevm-circuits/src/evm_circuit/execution/extcodecopy.rs +++ b/zkevm-circuits/src/evm_circuit/execution/extcodecopy.rs @@ -18,7 +18,7 @@ use crate::{ witness::{Block, Call, Chunk, ExecStep, Transaction}, }, table::{AccountFieldTag, CallContextFieldTag}, - util::word::{Word, Word32Cell, WordExpr}, + util::word::{Word32Cell, WordExpr, WordLoHi}, }; use bus_mapping::circuit_input_builder::CopyDataType; use eth_types::{evm_types::GasCost, Field, ToScalar}; @@ -40,7 +40,7 @@ pub(crate) struct ExtcodecopyGadget { reversion_info: ReversionInfo, is_warm: Cell, code_hash: Word32Cell, - not_exists: IsZeroWordGadget>>, + not_exists: IsZeroWordGadget>>, code_size: Cell, copy_rwc_inc: Cell, memory_expansion: MemoryExpansionGadget, @@ -91,7 +91,7 @@ impl ExecutionGadget for ExtcodecopyGadget { AccountFieldTag::CodeHash, code_hash.to_word(), ); - let not_exists = IsZeroWordGadget::construct(cb, &code_hash.to_word()); + let not_exists = cb.is_zero_word(&code_hash.to_word()); let exists = not::expr(not_exists.expr()); cb.condition(exists.expr(), |cb| { cb.bytecode_length(code_hash.to_word(), code_size.expr()); @@ -116,7 +116,7 @@ impl ExecutionGadget for ExtcodecopyGadget { let copy_rwc_inc = cb.query_cell(); cb.condition(memory_address.has_length(), |cb| { - // Set source start to the minimun value of code offset and code size. + // Set source start to the minimum value of code offset and code size. let src_addr = select::expr( code_offset.lt_cap(), code_offset.valid_value(), @@ -126,7 +126,7 @@ impl ExecutionGadget for ExtcodecopyGadget { cb.copy_table_lookup( code_hash.to_word(), CopyDataType::Bytecode.expr(), - Word::from_lo_unchecked(cb.curr.state.call_id.expr()), + WordLoHi::from_lo_unchecked(cb.curr.state.call_id.expr()), CopyDataType::Memory.expr(), src_addr, code_size.expr(), diff --git a/zkevm-circuits/src/evm_circuit/execution/extcodehash.rs b/zkevm-circuits/src/evm_circuit/execution/extcodehash.rs index 8c8b350bdf..fd9fcf370d 100644 --- a/zkevm-circuits/src/evm_circuit/execution/extcodehash.rs +++ b/zkevm-circuits/src/evm_circuit/execution/extcodehash.rs @@ -14,7 +14,7 @@ use crate::{ }, table::{AccountFieldTag, CallContextFieldTag}, util::{ - word::{Word32Cell, WordCell, WordExpr}, + word::{Word32Cell, WordExpr, WordLoHiCell}, Expr, }, }; @@ -28,7 +28,7 @@ pub(crate) struct ExtcodehashGadget { tx_id: Cell, reversion_info: ReversionInfo, is_warm: Cell, - code_hash: WordCell, + code_hash: WordLoHiCell, } impl ExecutionGadget for ExtcodehashGadget { diff --git a/zkevm-circuits/src/evm_circuit/execution/extcodesize.rs b/zkevm-circuits/src/evm_circuit/execution/extcodesize.rs index f8a6d7ec7d..b80a2c3532 100644 --- a/zkevm-circuits/src/evm_circuit/execution/extcodesize.rs +++ b/zkevm-circuits/src/evm_circuit/execution/extcodesize.rs @@ -16,7 +16,7 @@ use crate::{ }, table::{AccountFieldTag, CallContextFieldTag}, util::{ - word::{Word, Word32Cell, WordCell, WordExpr}, + word::{Word32Cell, WordExpr, WordLoHi, WordLoHiCell}, Expr, }, }; @@ -30,8 +30,8 @@ pub(crate) struct ExtcodesizeGadget { reversion_info: ReversionInfo, tx_id: Cell, is_warm: Cell, - code_hash: WordCell, - not_exists: IsZeroWordGadget>, + code_hash: WordLoHiCell, + not_exists: IsZeroWordGadget>, code_size: U64Cell, } @@ -69,7 +69,7 @@ impl ExecutionGadget for ExtcodesizeGadget { AccountFieldTag::CodeHash, code_hash.to_word(), ); - let not_exists = IsZeroWordGadget::construct(cb, &code_hash); + let not_exists = cb.is_zero_word(&code_hash); let exists = not::expr(not_exists.expr()); let code_size = cb.query_u64(); @@ -144,7 +144,7 @@ impl ExecutionGadget for ExtcodesizeGadget { let code_hash = block.get_rws(step, 5).account_codehash_pair().0; self.code_hash.assign_u256(region, offset, code_hash)?; self.not_exists - .assign(region, offset, Word::from(code_hash))?; + .assign(region, offset, WordLoHi::from(code_hash))?; let code_size = block.get_rws(step, 6).stack_value().as_u64(); self.code_size diff --git a/zkevm-circuits/src/evm_circuit/execution/gasprice.rs b/zkevm-circuits/src/evm_circuit/execution/gasprice.rs index 5a80523b15..c9160f4356 100644 --- a/zkevm-circuits/src/evm_circuit/execution/gasprice.rs +++ b/zkevm-circuits/src/evm_circuit/execution/gasprice.rs @@ -11,7 +11,7 @@ use crate::{ }, table::{CallContextFieldTag, TxContextFieldTag}, util::{ - word::{WordCell, WordExpr}, + word::{WordExpr, WordLoHiCell}, Expr, }, }; @@ -22,7 +22,7 @@ use halo2_proofs::{circuit::Value, plonk::Error}; #[derive(Clone, Debug)] pub(crate) struct GasPriceGadget { tx_id: Cell, - gas_price: WordCell, + gas_price: WordLoHiCell, same_context: SameContextGadget, } diff --git a/zkevm-circuits/src/evm_circuit/execution/invalid_tx.rs b/zkevm-circuits/src/evm_circuit/execution/invalid_tx.rs index 12d54b067d..286d0a5152 100644 --- a/zkevm-circuits/src/evm_circuit/execution/invalid_tx.rs +++ b/zkevm-circuits/src/evm_circuit/execution/invalid_tx.rs @@ -7,12 +7,12 @@ use crate::{ constraint_builder::{ConstrainBuilderCommon, EVMConstraintBuilder}, math_gadget::{IsEqualGadget, LtGadget, LtWordGadget}, tx::{BeginTxHelperGadget, EndTxHelperGadget, TxDataGadget}, - CachedRegion, Cell, StepRws, Word, + CachedRegion, Cell, StepRws, }, witness::{Block, Call, ExecStep, Transaction}, }, table::AccountFieldTag, - util::word::{Word32Cell, WordExpr}, + util::word::{Word32Cell, WordExpr, WordLoHi}, witness::Chunk, }; use eth_types::{Field, ToScalar}; @@ -46,9 +46,9 @@ impl ExecutionGadget for InvalidTxGadget { cb.account_read( tx.caller_address.to_word(), AccountFieldTag::Nonce, - Word::from_lo_unchecked(account_nonce.expr()), + WordLoHi::from_lo_unchecked(account_nonce.expr()), ); - let is_nonce_match = IsEqualGadget::construct(cb, account_nonce.expr(), tx.nonce.expr()); + let is_nonce_match = cb.is_eq(account_nonce.expr(), tx.nonce.expr()); // Check if the gas limit is larger or equal to the intrinsic gas cost let insufficient_gas_limit = @@ -61,8 +61,7 @@ impl ExecutionGadget for InvalidTxGadget { AccountFieldTag::Balance, balance.to_word(), ); - let insufficient_balance = - LtWordGadget::construct(cb, &balance.to_word(), &tx.total_cost().to_word()); + let insufficient_balance = cb.is_lt_word(&balance.to_word(), &tx.total_cost().to_word()); // At least one of the invalid conditions needs to be true let invalid_tx = or::expr([ diff --git a/zkevm-circuits/src/evm_circuit/execution/is_zero.rs b/zkevm-circuits/src/evm_circuit/execution/is_zero.rs index 081dcbe799..82a9db9bdd 100644 --- a/zkevm-circuits/src/evm_circuit/execution/is_zero.rs +++ b/zkevm-circuits/src/evm_circuit/execution/is_zero.rs @@ -10,7 +10,7 @@ use crate::{ witness::{Block, Call, Chunk, ExecStep, Transaction}, }, util::{ - word::{Word, WordCell, WordExpr}, + word::{WordExpr, WordLoHi, WordLoHiCell}, Expr, }, }; @@ -21,8 +21,8 @@ use halo2_proofs::{circuit::Value, plonk::Error}; #[derive(Clone, Debug)] pub(crate) struct IsZeroGadget { same_context: SameContextGadget, - value: WordCell, - is_zero_word: math_gadget::IsZeroWordGadget>, + value: WordLoHiCell, + is_zero_word: math_gadget::IsZeroWordGadget>, } impl ExecutionGadget for IsZeroGadget { @@ -34,10 +34,10 @@ impl ExecutionGadget for IsZeroGadget { let opcode = cb.query_cell(); let value = cb.query_word_unchecked(); - let is_zero_word = math_gadget::IsZeroWordGadget::construct(cb, &value); + let is_zero_word = cb.is_zero_word(&value); cb.stack_pop(value.to_word()); - cb.stack_push(Word::from_lo_unchecked(is_zero_word.expr())); + cb.stack_push(WordLoHi::from_lo_unchecked(is_zero_word.expr())); // State transition let step_state_transition = StepStateTransition { @@ -71,7 +71,7 @@ impl ExecutionGadget for IsZeroGadget { let value = block.get_rws(step, 0).stack_value(); self.value.assign_u256(region, offset, value)?; self.is_zero_word - .assign_value(region, offset, Value::known(Word::from(value)))?; + .assign_value(region, offset, Value::known(WordLoHi::from(value)))?; Ok(()) } diff --git a/zkevm-circuits/src/evm_circuit/execution/jumpi.rs b/zkevm-circuits/src/evm_circuit/execution/jumpi.rs index fc0fc1542f..08b07e6ce7 100644 --- a/zkevm-circuits/src/evm_circuit/execution/jumpi.rs +++ b/zkevm-circuits/src/evm_circuit/execution/jumpi.rs @@ -15,7 +15,7 @@ use crate::{ witness::{Block, Call, Chunk, ExecStep, Transaction}, }, util::{ - word::{Word, WordCell, WordExpr}, + word::{WordExpr, WordLoHi, WordLoHiCell}, Expr, }, }; @@ -26,8 +26,8 @@ use halo2_proofs::{circuit::Value, plonk::Error}; pub(crate) struct JumpiGadget { same_context: SameContextGadget, dest: WordByteRangeGadget, - condition: WordCell, - is_condition_zero: IsZeroWordGadget>, + condition: WordLoHiCell, + is_condition_zero: IsZeroWordGadget>, } impl ExecutionGadget for JumpiGadget { @@ -44,7 +44,7 @@ impl ExecutionGadget for JumpiGadget { cb.stack_pop(condition.to_word()); // Determine if the jump condition is met - let is_condition_zero = IsZeroWordGadget::construct(cb, &condition); + let is_condition_zero = cb.is_zero_word(&condition); let should_jump = 1.expr() - is_condition_zero.expr(); // Lookup opcode at destination when should_jump @@ -101,8 +101,11 @@ impl ExecutionGadget for JumpiGadget { self.dest.assign(region, offset, destination)?; self.condition.assign_u256(region, offset, condition)?; - self.is_condition_zero - .assign_value(region, offset, Value::known(Word::from(condition)))?; + self.is_condition_zero.assign_value( + region, + offset, + Value::known(WordLoHi::from(condition)), + )?; Ok(()) } diff --git a/zkevm-circuits/src/evm_circuit/execution/logs.rs b/zkevm-circuits/src/evm_circuit/execution/logs.rs index baf01a2970..12b472de3a 100644 --- a/zkevm-circuits/src/evm_circuit/execution/logs.rs +++ b/zkevm-circuits/src/evm_circuit/execution/logs.rs @@ -19,7 +19,7 @@ use crate::{ table::{CallContextFieldTag, TxLogFieldTag}, util::{ build_tx_log_expression, - word::{Word, Word32Cell, WordCell, WordExpr}, + word::{Word32Cell, WordExpr, WordLoHi, WordLoHiCell}, Expr, }, }; @@ -39,7 +39,7 @@ pub(crate) struct LogGadget { topics: [Word32Cell; 4], topic_selectors: [Cell; 4], - contract_address: WordCell, + contract_address: WordLoHiCell, is_static_call: Cell, is_persistent: Cell, tx_id: Cell, @@ -139,9 +139,9 @@ impl ExecutionGadget for LogGadget { let cond = memory_address.has_length() * is_persistent.expr(); cb.condition(cond.clone(), |cb| { cb.copy_table_lookup( - Word::from_lo_unchecked(cb.curr.state.call_id.expr()), + WordLoHi::from_lo_unchecked(cb.curr.state.call_id.expr()), CopyDataType::Memory.expr(), - Word::from_lo_unchecked(tx_id.expr()), + WordLoHi::from_lo_unchecked(tx_id.expr()), CopyDataType::TxLog.expr(), memory_address.offset(), memory_address.address(), @@ -403,10 +403,10 @@ mod test { code.write_op(cur_op_code); // second log op code - // prepare additinal bytes for memory reading + // prepare additional bytes for memory reading code.append(&prepare_code(&pushdata, 0x20)); mstart = 0x00usize; - // when mszie > 0x20 (32) needs multi copy steps + // when msize > 0x20 (32) needs multi copy steps msize = 0x30usize; for topic in topics { code.push(32, *topic); diff --git a/zkevm-circuits/src/evm_circuit/execution/memory.rs b/zkevm-circuits/src/evm_circuit/execution/memory.rs index d64d1f1c02..798f2ecfbc 100644 --- a/zkevm-circuits/src/evm_circuit/execution/memory.rs +++ b/zkevm-circuits/src/evm_circuit/execution/memory.rs @@ -46,9 +46,9 @@ impl ExecutionGadget for MemoryGadget { let value = cb.query_word32(); // Check if this is an MLOAD - let is_mload = IsEqualGadget::construct(cb, opcode.expr(), OpcodeId::MLOAD.expr()); + let is_mload = cb.is_eq(opcode.expr(), OpcodeId::MLOAD.expr()); // Check if this is an MSTORE8 - let is_mstore8 = IsEqualGadget::construct(cb, opcode.expr(), OpcodeId::MSTORE8.expr()); + let is_mstore8 = cb.is_eq(opcode.expr(), OpcodeId::MSTORE8.expr()); // This is an MSTORE/MSTORE8 let is_store = not::expr(is_mload.expr()); // This is an MSTORE/MLOAD diff --git a/zkevm-circuits/src/evm_circuit/execution/msize.rs b/zkevm-circuits/src/evm_circuit/execution/msize.rs index 5656cdf4cc..857e499f68 100644 --- a/zkevm-circuits/src/evm_circuit/execution/msize.rs +++ b/zkevm-circuits/src/evm_circuit/execution/msize.rs @@ -13,7 +13,7 @@ use crate::{ }, witness::{Block, Call, Chunk, ExecStep, Transaction}, }, - util::{word::Word, Expr}, + util::{word::WordLoHi, Expr}, }; use bus_mapping::evm::OpcodeId; use eth_types::Field; @@ -42,7 +42,7 @@ impl ExecutionGadget for MsizeGadget { ); // Push the value on the stack - cb.stack_push(Word::from_lo_unchecked(value.expr())); + cb.stack_push(WordLoHi::from_lo_unchecked(value.expr())); // State transition let step_state_transition = StepStateTransition { diff --git a/zkevm-circuits/src/evm_circuit/execution/mul_div_mod.rs b/zkevm-circuits/src/evm_circuit/execution/mul_div_mod.rs index 38df841f0f..2847fd45c6 100644 --- a/zkevm-circuits/src/evm_circuit/execution/mul_div_mod.rs +++ b/zkevm-circuits/src/evm_circuit/execution/mul_div_mod.rs @@ -14,7 +14,7 @@ use crate::{ witness::{Block, Call, Chunk, ExecStep, Transaction}, }, util::{ - word::{Word, Word32Cell, WordExpr}, + word::{Word32Cell, WordExpr, WordLoHi}, Expr, }, }; @@ -63,15 +63,15 @@ impl ExecutionGadget for MulDivModGadget { let d = cb.query_word32(); let mul_add_words = MulAddWordsGadget::construct(cb, [&a, &b, &c, &d]); - let divisor_is_zero = IsZeroWordGadget::construct(cb, &b); - let lt_word = LtWordGadget::construct(cb, &c.to_word(), &b.to_word()); + let divisor_is_zero = cb.is_zero_word(&b); + let lt_word = cb.is_lt_word(&c.to_word(), &b.to_word()); // Pop a and b from the stack, push result on the stack // The first pop is multiplier for MUL and dividend for DIV/MOD // The second pop is multiplicand for MUL and divisor for DIV/MOD // The push is product for MUL, quotient for DIV, and residue for MOD // Note that for DIV/MOD, when divisor == 0, the push value is also 0. - cb.stack_pop(Word::select(is_mul.clone(), a.to_word(), d.to_word())); + cb.stack_pop(WordLoHi::select(is_mul.clone(), a.to_word(), d.to_word())); cb.stack_pop(b.to_word()); cb.stack_push( d.to_word() @@ -153,7 +153,8 @@ impl ExecutionGadget for MulDivModGadget { self.words[3].assign_u256(region, offset, d)?; self.mul_add_words.assign(region, offset, [a, b, c, d])?; self.lt_word.assign(region, offset, c, b)?; - self.divisor_is_zero.assign(region, offset, Word::from(b))?; + self.divisor_is_zero + .assign(region, offset, WordLoHi::from(b))?; Ok(()) } } diff --git a/zkevm-circuits/src/evm_circuit/execution/mulmod.rs b/zkevm-circuits/src/evm_circuit/execution/mulmod.rs index 2b61900aa9..ba46cc3304 100644 --- a/zkevm-circuits/src/evm_circuit/execution/mulmod.rs +++ b/zkevm-circuits/src/evm_circuit/execution/mulmod.rs @@ -14,7 +14,7 @@ use crate::{ witness::{Block, Call, Chunk, ExecStep, Transaction}, }, util::{ - word::{Word, Word32Cell, WordExpr}, + word::{Word32Cell, WordExpr, WordLoHi}, Expr, }, }; @@ -60,18 +60,18 @@ impl ExecutionGadget for MulModGadget { let d = cb.query_word32(); let e = cb.query_word32(); - // 1. k1 * n + a_reduced == a + // 1. k1 * n + a_reduced == a let modword = ModGadget::construct(cb, [&a, &n, &a_reduced]); - // 2. a_reduced * b + 0 == d * 2^256 + e + // 2. a_reduced * b + 0 == d * 2^256 + e let mul512_left = MulAddWords512Gadget::construct(cb, [&a_reduced, &b, &d, &e], None); - // 3. k2 * n + r == d * 2^256 + e + // 3. k2 * n + r == d * 2^256 + e let mul512_right = MulAddWords512Gadget::construct(cb, [&k, &n, &d, &e], Some(&r)); // (r < n ) or n == 0 - let n_is_zero = IsZeroWordGadget::construct(cb, &n); - let lt = LtWordGadget::construct(cb, &r.to_word(), &n.to_word()); + let n_is_zero = cb.is_zero_word(&n); + let lt = cb.is_lt_word(&r.to_word(), &n.to_word()); cb.add_constraint( " (1 - (r < n) - (n==0)) ", 1.expr() - lt.expr() - n_is_zero.expr(), @@ -158,7 +158,7 @@ impl ExecutionGadget for MulModGadget { self.lt.assign(region, offset, r, n)?; - self.n_is_zero.assign(region, offset, Word::from(n))?; + self.n_is_zero.assign(region, offset, WordLoHi::from(n))?; Ok(()) } } diff --git a/zkevm-circuits/src/evm_circuit/execution/origin.rs b/zkevm-circuits/src/evm_circuit/execution/origin.rs index 3375c08bed..9ccf8e8b44 100644 --- a/zkevm-circuits/src/evm_circuit/execution/origin.rs +++ b/zkevm-circuits/src/evm_circuit/execution/origin.rs @@ -74,7 +74,7 @@ impl ExecutionGadget for OriginGadget { ) -> Result<(), Error> { let origin = block.get_rws(step, 1).stack_value(); - // Assing TxId. + // Assign TxId. self.tx_id .assign(region, offset, Value::known(F::from(tx.id)))?; diff --git a/zkevm-circuits/src/evm_circuit/execution/pop.rs b/zkevm-circuits/src/evm_circuit/execution/pop.rs index e62c12841a..f197268806 100644 --- a/zkevm-circuits/src/evm_circuit/execution/pop.rs +++ b/zkevm-circuits/src/evm_circuit/execution/pop.rs @@ -10,7 +10,7 @@ use crate::{ witness::{Block, Call, Chunk, ExecStep, Transaction}, }, util::{ - word::{WordCell, WordExpr}, + word::{WordExpr, WordLoHiCell}, Expr, }, }; @@ -21,7 +21,7 @@ use halo2_proofs::plonk::Error; #[derive(Clone, Debug)] pub(crate) struct PopGadget { same_context: SameContextGadget, - value: WordCell, + value: WordLoHiCell, } impl ExecutionGadget for PopGadget { diff --git a/zkevm-circuits/src/evm_circuit/execution/precompiles.rs b/zkevm-circuits/src/evm_circuit/execution/precompiles.rs new file mode 100644 index 0000000000..5aad1f14fe --- /dev/null +++ b/zkevm-circuits/src/evm_circuit/execution/precompiles.rs @@ -0,0 +1,5 @@ +mod ecrecover; +pub use ecrecover::EcrecoverGadget; + +mod identity; +pub use identity::IdentityGadget; diff --git a/zkevm-circuits/src/evm_circuit/execution/precompiles/ecrecover.rs b/zkevm-circuits/src/evm_circuit/execution/precompiles/ecrecover.rs new file mode 100644 index 0000000000..bfb194f44a --- /dev/null +++ b/zkevm-circuits/src/evm_circuit/execution/precompiles/ecrecover.rs @@ -0,0 +1,576 @@ +use bus_mapping::precompile::{PrecompileAuxData, PrecompileCalls}; +use eth_types::{evm_types::GasCost, word, Field, ToLittleEndian, ToScalar, U256}; +use ethers_core::k256::elliptic_curve::PrimeField; +use gadgets::util::{and, not, or, select, Expr}; +use halo2_proofs::{circuit::Value, halo2curves::secp256k1::Fq, plonk::Error}; + +use crate::{ + evm_circuit::{ + execution::ExecutionGadget, + step::ExecutionState, + util::{ + common_gadget::RestoreContextGadget, + constraint_builder::{ConstrainBuilderCommon, EVMConstraintBuilder}, + from_bytes, + math_gadget::{IsEqualGadget, IsZeroGadget, IsZeroWordGadget, LtWordGadget, ModGadget}, + CachedRegion, Cell, + }, + }, + table::CallContextFieldTag, + util::word::{Word32Cell, WordExpr, WordLimbs, WordLoHi, WordLoHiCell}, + witness::{Block, Call, Chunk, ExecStep, Transaction}, +}; + +#[derive(Clone, Debug)] +pub struct EcrecoverGadget { + is_recovered: Cell, + recovered_addr: Cell, + + fq_modulus: Word32Cell, + msg_hash: Word32Cell, + msg_hash_raw: Word32Cell, + msg_hash_mod: ModGadget, + sig_r: Word32Cell, + sig_s: Word32Cell, + sig_v: WordLoHiCell, + + sig_r_canonical: LtWordGadget, + sig_s_canonical: LtWordGadget, + is_zero_sig_r: IsZeroWordGadget>, + is_zero_sig_s: IsZeroWordGadget>, + + is_zero_sig_v_hi: IsZeroGadget, + is_sig_v_27: IsEqualGadget, + is_sig_v_28: IsEqualGadget, + + is_success: Cell, + callee_address: Cell, + caller_id: Cell, + restore_context: RestoreContextGadget, +} + +impl ExecutionGadget for EcrecoverGadget { + const EXECUTION_STATE: ExecutionState = ExecutionState::PrecompileEcrecover; + const NAME: &'static str = "ECRECOVER"; + + fn configure(cb: &mut EVMConstraintBuilder) -> Self { + let is_recovered = cb.query_bool(); + let recovered_addr = cb.query_cell(); + + let fq_modulus = cb.query_word32(); + let msg_hash = cb.query_word32(); + let msg_hash_raw = cb.query_word32(); + let sig_r = cb.query_word32(); + let sig_s = cb.query_word32(); + let sig_v = cb.query_word_unchecked(); + + let msg_hash_mod = ModGadget::construct(cb, [&msg_hash_raw, &fq_modulus, &msg_hash]); + + // verify sig_r and sig_s + // the range is 0 < sig_r/sig_s < Fq::MODULUS + let mut sig_r_be = sig_r.limbs.clone(); + let mut sig_s_be = sig_s.limbs.clone(); + sig_r_be.reverse(); + sig_s_be.reverse(); + let sig_r_canonical = LtWordGadget::construct( + cb, + &WordLimbs::new(sig_r_be.clone()).to_word(), + &fq_modulus.to_word(), + ); + let sig_s_canonical = LtWordGadget::construct( + cb, + &WordLimbs::new(sig_s_be.clone()).to_word(), + &fq_modulus.to_word(), + ); + let is_zero_sig_r = IsZeroWordGadget::construct(cb, &sig_r); + let is_zero_sig_s = IsZeroWordGadget::construct(cb, &sig_s); + let is_valid_r_s = and::expr([ + sig_r_canonical.expr(), + sig_s_canonical.expr(), + not::expr(or::expr([is_zero_sig_r.expr(), is_zero_sig_s.expr()])), + ]); + + // sig_v is valid if sig_v == 27 || sig_v == 28 + let is_zero_sig_v_hi = IsZeroGadget::construct(cb, sig_v.hi().expr()); + let is_sig_v_27 = IsEqualGadget::construct(cb, sig_v.lo().expr(), 27.expr()); + let is_sig_v_28 = IsEqualGadget::construct(cb, sig_v.lo().expr(), 28.expr()); + let is_valid_sig_v = and::expr([ + or::expr([is_sig_v_27.expr(), is_sig_v_28.expr()]), + is_zero_sig_v_hi.expr(), + ]); + + let [is_success, callee_address, caller_id] = [ + CallContextFieldTag::IsSuccess, + CallContextFieldTag::CalleeAddress, + CallContextFieldTag::CallerId, + ] + .map(|tag| cb.call_context(None, tag)); + + let input_len = PrecompileCalls::Ecrecover.input_len().unwrap(); + for (field_tag, value) in [ + (CallContextFieldTag::CallDataOffset, 0.expr()), + (CallContextFieldTag::CallDataLength, input_len.expr()), + ( + CallContextFieldTag::ReturnDataOffset, + select::expr(is_recovered.expr(), input_len.expr(), 0.expr()), + ), + ( + CallContextFieldTag::ReturnDataLength, + select::expr(is_recovered.expr(), 32.expr(), 0.expr()), + ), + ] { + cb.call_context_lookup_read(None, field_tag, WordLoHi::from_lo_unchecked(value)); + } + + let gas_cost = select::expr( + is_success.expr(), + GasCost::PRECOMPILE_ECRECOVER_BASE.expr(), + cb.curr.state.gas_left.expr(), + ); + + // lookup to the sign_verify table: + let is_valid_sig = and::expr([is_valid_r_s.expr(), is_valid_sig_v.expr()]); + cb.condition(is_valid_sig.expr(), |cb| { + let mut msg_hash_le = msg_hash.limbs.clone(); + msg_hash_le.reverse(); + cb.sig_table_lookup( + WordLimbs::new(msg_hash_le).to_word(), + sig_v.lo().expr() - 27.expr(), + sig_r.to_word(), + sig_s.to_word(), + select::expr(is_recovered.expr(), recovered_addr.expr(), 0.expr()), + is_recovered.expr(), + ); + }); + + cb.condition(not::expr(is_valid_sig.expr()), |cb| { + cb.require_zero( + "is_recovered == false if r, s or v not canonical", + is_recovered.expr(), + ); + }); + + cb.condition(not::expr(is_recovered.expr()), |cb| { + cb.require_zero( + "address == 0 if address could not be recovered", + recovered_addr.expr(), + ); + }); + + cb.precompile_info_lookup( + cb.execution_state().as_u64().expr(), + callee_address.expr(), + cb.execution_state().precompile_base_gas_cost().expr(), + ); + + let restore_context = RestoreContextGadget::construct2( + cb, + is_success.expr(), + gas_cost.expr(), + 0.expr(), + 0.expr(), + select::expr(is_recovered.expr(), 32.expr(), 0.expr()), + 0.expr(), + 0.expr(), + ); + + Self { + is_recovered, + recovered_addr, + fq_modulus, + + msg_hash, + msg_hash_raw, + msg_hash_mod, + sig_r, + sig_s, + sig_v, + + sig_r_canonical, + sig_s_canonical, + is_zero_sig_v_hi, + is_zero_sig_r, + is_zero_sig_s, + is_sig_v_27, + is_sig_v_28, + + is_success, + callee_address, + caller_id, + restore_context, + } + } + + fn assign_exec_step( + &self, + region: &mut CachedRegion<'_, '_, F>, + offset: usize, + block: &Block, + _chunk: &Chunk, + _tx: &Transaction, + call: &Call, + step: &ExecStep, + ) -> Result<(), Error> { + if let Some(PrecompileAuxData::Ecrecover(aux_data)) = &step.aux_data { + let recovered = !aux_data.recovered_addr.is_zero(); + self.is_recovered + .assign(region, offset, Value::known(F::from(recovered as u64)))?; + let mut recovered_addr = aux_data.recovered_addr.to_fixed_bytes(); + recovered_addr.reverse(); + self.recovered_addr.assign( + region, + offset, + Value::known(from_bytes::value(&recovered_addr)), + )?; + self.fq_modulus + .assign_u256(region, offset, word!(Fq::MODULUS))?; + + let sig_r = U256::from(aux_data.sig_r.to_le_bytes()); + let sig_s = U256::from(aux_data.sig_s.to_le_bytes()); + self.sig_r.assign_u256(region, offset, sig_r)?; + self.sig_s.assign_u256(region, offset, sig_s)?; + self.sig_v.assign_u256(region, offset, aux_data.sig_v)?; + + let (quotient, remainder) = aux_data.msg_hash.div_mod(word!(Fq::MODULUS)); + self.msg_hash_raw + .assign_u256(region, offset, aux_data.msg_hash)?; + self.msg_hash.assign_u256(region, offset, remainder)?; + self.msg_hash_mod.assign( + region, + offset, + aux_data.msg_hash, + word!(Fq::MODULUS), + remainder, + quotient, + )?; + + self.sig_r_canonical + .assign(region, offset, aux_data.sig_r, word!(Fq::MODULUS))?; + self.sig_s_canonical + .assign(region, offset, aux_data.sig_s, word!(Fq::MODULUS))?; + self.is_zero_sig_r.assign_u256(region, offset, sig_r)?; + self.is_zero_sig_s.assign_u256(region, offset, sig_s)?; + + let sig_v_bytes = aux_data.sig_v.to_le_bytes(); + self.is_zero_sig_v_hi + .assign(region, offset, from_bytes::value(&sig_v_bytes[16..]))?; + self.is_sig_v_27 + .assign(region, offset, F::from(sig_v_bytes[0] as u64), F::from(27))?; + self.is_sig_v_28 + .assign(region, offset, F::from(sig_v_bytes[0] as u64), F::from(28))?; + } + + self.is_success.assign( + region, + offset, + Value::known(F::from(u64::from(call.is_success))), + )?; + + self.callee_address.assign( + region, + offset, + Value::known(call.code_address().unwrap().to_scalar().unwrap()), + )?; + self.caller_id + .assign(region, offset, Value::known(F::from(call.caller_id as u64)))?; + + self.restore_context + .assign(region, offset, block, call, step, 7) + } +} + +#[cfg(test)] +mod test { + use bus_mapping::{ + evm::OpcodeId, + precompile::{PrecompileCallArgs, PrecompileCalls}, + }; + use eth_types::{bytecode, word, ToWord}; + use mock::TestContext; + // use rayon::{iter::ParallelIterator, prelude::IntoParallelRefIterator}; + + use crate::test_util::CircuitTestBuilder; + + lazy_static::lazy_static! { + static ref TEST_VECTOR: Vec = { + vec![ + PrecompileCallArgs { + name: "ecrecover (valid sig, addr recovered)", + setup_code: bytecode! { + // msg hash from 0x00 + PUSH32(word!("0x456e9aea5e197a1f1af7a3e85a3212fa4049a3ba34c2289b4c860fc0b0c64ef3")) + PUSH1(0x00) + MSTORE + // signature v from 0x20 + PUSH1(28) + PUSH1(0x20) + MSTORE + // signature r from 0x40 + PUSH32(word!("0x9242685bf161793cc25603c231bc2f568eb630ea16aa137d2664ac8038825608")) + PUSH1(0x40) + MSTORE + // signature s from 0x60 + PUSH32(word!("0x4f8ae3bd7535248d0bd448298cc2e2071e56992d0774dc340c368ae950852ada")) + PUSH1(0x60) + MSTORE + }, + // copy 128 bytes from memory addr 0. Address is recovered and the signature is + // valid. + call_data_offset: 0x00.into(), + call_data_length: 0x80.into(), + // return 32 bytes and write from memory addr 128 + ret_offset: 0x80.into(), + ret_size: 0x20.into(), + address: PrecompileCalls::Ecrecover.address().to_word(), + ..Default::default() + }, + + PrecompileCallArgs { + name: "ecrecover (overflowing msg_hash)", + setup_code: bytecode! { + // msg hash from 0x00 + PUSH32(word!("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee")) + PUSH1(0x00) + MSTORE + // signature v from 0x20 + PUSH1(28) + PUSH1(0x20) + MSTORE + // signature r from 0x40 + PUSH32(word!("0x9242685bf161793cc25603c231bc2f568eb630ea16aa137d2664ac8038825608")) + PUSH1(0x40) + MSTORE + // signature s from 0x60 + PUSH32(word!("0x4f8ae3bd7535248d0bd448298cc2e2071e56992d0774dc340c368ae950852ada")) + PUSH1(0x60) + MSTORE + }, + call_data_offset: 0x00.into(), + call_data_length: 0x80.into(), + ret_offset: 0x80.into(), + ret_size: 0x20.into(), + address: PrecompileCalls::Ecrecover.address().to_word(), + ..Default::default() + }, + + PrecompileCallArgs { + name: "ecrecover (invalid overflowing sig_r)", + setup_code: bytecode! { + // msg hash from 0x00 + PUSH32(word!("0x456e9aea5e197a1f1af7a3e85a3212fa4049a3ba34c2289b4c860fc0b0c64ef3")) + PUSH1(0x00) + MSTORE + // signature v from 0x20 + PUSH1(28) + PUSH1(0x20) + MSTORE + // signature r from 0x40 + PUSH32(word!("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee")) + PUSH1(0x40) + MSTORE + // signature s from 0x60 + PUSH32(word!("0x4f8ae3bd7535248d0bd448298cc2e2071e56992d0774dc340c368ae950852ada")) + PUSH1(0x60) + MSTORE + }, + call_data_offset: 0x00.into(), + call_data_length: 0x80.into(), + ret_offset: 0x00.into(), + ret_size: 0x00.into(), + address: PrecompileCalls::Ecrecover.address().to_word(), + ..Default::default() + }, + + PrecompileCallArgs { + name: "ecrecover (invalid overflowing sig_s)", + setup_code: bytecode! { + // msg hash from 0x00 + PUSH32(word!("0x456e9aea5e197a1f1af7a3e85a3212fa4049a3ba34c2289b4c860fc0b0c64ef3")) + PUSH1(0x00) + MSTORE + // signature v from 0x20 + PUSH1(28) + PUSH1(0x20) + MSTORE + // signature r from 0x40 + PUSH32(word!("0x9242685bf161793cc25603c231bc2f568eb630ea16aa137d2664ac8038825608")) + PUSH1(0x40) + MSTORE + // signature s from 0x60 + PUSH32(word!("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee")) + PUSH1(0x60) + MSTORE + }, + call_data_offset: 0x00.into(), + call_data_length: 0x80.into(), + ret_offset: 0x00.into(), + ret_size: 0x00.into(), + address: PrecompileCalls::Ecrecover.address().to_word(), + ..Default::default() + }, + + PrecompileCallArgs { + name: "ecrecover (invalid v > 28, single byte)", + setup_code: bytecode! { + // msg hash from 0x00 + PUSH32(word!("0x456e9aea5e197a1f1af7a3e85a3212fa4049a3ba34c2289b4c860fc0b0c64ef3")) + PUSH1(0x00) + MSTORE + // signature v from 0x20 + PUSH1(29) + PUSH1(0x20) + MSTORE + // signature r from 0x40 + PUSH32(word!("0x9242685bf161793cc25603c231bc2f568eb630ea16aa137d2664ac8038825608")) + PUSH1(0x40) + MSTORE + // signature s from 0x60 + PUSH32(word!("0x4f8ae3bd7535248d0bd448298cc2e2071e56992d0774dc340c368ae950852ada")) + PUSH1(0x60) + MSTORE + }, + call_data_offset: 0x00.into(), + call_data_length: 0x80.into(), + ret_offset: 0x00.into(), + ret_size: 0x00.into(), + address: PrecompileCalls::Ecrecover.address().to_word(), + ..Default::default() + }, + + PrecompileCallArgs { + name: "ecrecover (invalid v < 27, single byte)", + setup_code: bytecode! { + // msg hash from 0x00 + PUSH32(word!("0x456e9aea5e197a1f1af7a3e85a3212fa4049a3ba34c2289b4c860fc0b0c64ef3")) + PUSH1(0x00) + MSTORE + // signature v from 0x20 + PUSH1(26) + PUSH1(0x20) + MSTORE + // signature r from 0x40 + PUSH32(word!("0x9242685bf161793cc25603c231bc2f568eb630ea16aa137d2664ac8038825608")) + PUSH1(0x40) + MSTORE + // signature s from 0x60 + PUSH32(word!("0x4f8ae3bd7535248d0bd448298cc2e2071e56992d0774dc340c368ae950852ada")) + PUSH1(0x60) + MSTORE + }, + call_data_offset: 0x00.into(), + call_data_length: 0x80.into(), + ret_offset: 0x00.into(), + ret_size: 0x00.into(), + address: PrecompileCalls::Ecrecover.address().to_word(), + ..Default::default() + }, + PrecompileCallArgs { + name: "ecrecover (invalid v, multi-byte, last byte == 28)", + setup_code: bytecode! { + // msg hash from 0x00 + PUSH32(word!("0x456e9aea5e197a1f1af7a3e85a3212fa4049a3ba34c2289b4c860fc0b0c64ef3")) + PUSH1(0x00) + MSTORE + // signature v from 0x20, 1c == 28 (but not single byte) + PUSH32(word!("0x010000000000000000000000000000000000000000000000000000000000001c")) + PUSH1(0x20) + MSTORE + // signature r from 0x40 + PUSH32(word!("0x9242685bf161793cc25603c231bc2f568eb630ea16aa137d2664ac8038825608")) + PUSH1(0x40) + MSTORE + // signature s from 0x60 + PUSH32(word!("0x4f8ae3bd7535248d0bd448298cc2e2071e56992d0774dc340c368ae950852ada")) + PUSH1(0x60) + MSTORE + }, + call_data_offset: 0x00.into(), + call_data_length: 0x80.into(), + ret_offset: 0x00.into(), + ret_size: 0x00.into(), + address: PrecompileCalls::Ecrecover.address().to_word(), + ..Default::default() + }, + ] + }; + } + + lazy_static::lazy_static! { + static ref OOG_TEST_VECTOR: Vec = { + vec![PrecompileCallArgs { + name: "ecrecover (oog)", + setup_code: bytecode! { + // msg hash from 0x00 + PUSH32(word!("0x456e9aea5e197a1f1af7a3e85a3212fa4049a3ba34c2289b4c860fc0b0c64ef3")) + PUSH1(0x00) + MSTORE + // signature v from 0x20 + PUSH1(28) + PUSH1(0x20) + MSTORE + // signature r from 0x40 + PUSH32(word!("0x9242685bf161793cc25603c231bc2f568eb630ea16aa137d2664ac8038825608")) + PUSH1(0x40) + MSTORE + // signature s from 0x60 + PUSH32(word!("0x4f8ae3bd7535248d0bd448298cc2e2071e56992d0774dc340c368ae950852ada")) + PUSH1(0x60) + MSTORE + }, + // copy 128 bytes from memory addr 0. Address is recovered and the signature is + // valid. + call_data_offset: 0x00.into(), + call_data_length: 0x80.into(), + // return 32 bytes and write from memory addr 128 + ret_offset: 0x80.into(), + ret_size: 0x20.into(), + gas: 0.into(), + value: 2.into(), + address: PrecompileCalls::Ecrecover.address().to_word(), + ..Default::default() + }] + }; + } + + #[test] + fn precompile_ecrecover_test() { + let call_kinds = vec![ + OpcodeId::CALL, + OpcodeId::STATICCALL, + OpcodeId::DELEGATECALL, + OpcodeId::CALLCODE, + ]; + + TEST_VECTOR.iter().for_each(|test_vector| { + for &call_kind in &call_kinds { + let bytecode = test_vector.with_call_op(call_kind); + + CircuitTestBuilder::new_from_test_ctx( + TestContext::<2, 1>::simple_ctx_with_bytecode(bytecode).unwrap(), + ) + .run(); + } + }); + } + + #[test] + fn precompile_ecrecover_oog_test() { + let call_kinds = vec![ + OpcodeId::CALL, + OpcodeId::STATICCALL, + OpcodeId::DELEGATECALL, + OpcodeId::CALLCODE, + ]; + + OOG_TEST_VECTOR.iter().for_each(|test_vector| { + for &call_kind in &call_kinds { + let bytecode = test_vector.with_call_op(call_kind); + + CircuitTestBuilder::new_from_test_ctx( + TestContext::<2, 1>::simple_ctx_with_bytecode(bytecode).unwrap(), + ) + .run(); + } + }) + } +} diff --git a/zkevm-circuits/src/evm_circuit/execution/precompiles/mod.rs b/zkevm-circuits/src/evm_circuit/execution/precompiles/mod.rs deleted file mode 100644 index 942ed62ef4..0000000000 --- a/zkevm-circuits/src/evm_circuit/execution/precompiles/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -mod identity; -pub use identity::IdentityGadget; diff --git a/zkevm-circuits/src/evm_circuit/execution/push.rs b/zkevm-circuits/src/evm_circuit/execution/push.rs index a7e5720e1b..21bb13b3d9 100644 --- a/zkevm-circuits/src/evm_circuit/execution/push.rs +++ b/zkevm-circuits/src/evm_circuit/execution/push.rs @@ -10,7 +10,7 @@ use crate::{ ConstrainBuilderCommon, EVMConstraintBuilder, StepStateTransition, Transition::Delta, }, - math_gadget::{IsZeroGadget, LtGadget}, + math_gadget::{IsEqualGadget, LtGadget}, not, or, select, sum, CachedRegion, Cell, }, witness::{Block, Call, Chunk, ExecStep, Transaction}, @@ -27,7 +27,7 @@ use halo2_proofs::{circuit::Value, plonk::Error}; #[derive(Clone, Debug)] pub(crate) struct PushGadget { same_context: SameContextGadget, - is_push0: IsZeroGadget, + is_push0: IsEqualGadget, value: Word32Cell, is_pushed: [Cell; 32], is_padding: [Cell; 32], @@ -42,7 +42,7 @@ impl ExecutionGadget for PushGadget { fn configure(cb: &mut EVMConstraintBuilder) -> Self { let opcode = cb.query_cell(); - let is_push0 = IsZeroGadget::construct(cb, opcode.expr() - OpcodeId::PUSH0.expr()); + let is_push0 = cb.is_eq(opcode.expr(), OpcodeId::PUSH0.expr()); let value = cb.query_word32(); cb.stack_push(value.to_word()); @@ -56,8 +56,7 @@ impl ExecutionGadget for PushGadget { cb.bytecode_length(cb.curr.state.code_hash.to_word(), code_length.expr()); let num_bytes_needed = opcode.expr() - OpcodeId::PUSH0.expr(); - let is_out_of_bound = - LtGadget::construct(cb, code_length_left.expr(), num_bytes_needed.expr()); + let is_out_of_bound = cb.is_lt(code_length_left.expr(), num_bytes_needed.expr()); let num_bytes_padding = select::expr( is_out_of_bound.expr(), num_bytes_needed.expr() - code_length_left.expr(), @@ -171,7 +170,8 @@ impl ExecutionGadget for PushGadget { self.is_push0.assign( region, offset, - F::from(opcode.as_u64() - OpcodeId::PUSH0.as_u64()), + F::from(opcode.as_u64()), + OpcodeId::PUSH0.as_u64().into(), )?; let bytecode = block diff --git a/zkevm-circuits/src/evm_circuit/execution/return_revert.rs b/zkevm-circuits/src/evm_circuit/execution/return_revert.rs index 3b686008fc..48f9e352e1 100644 --- a/zkevm-circuits/src/evm_circuit/execution/return_revert.rs +++ b/zkevm-circuits/src/evm_circuit/execution/return_revert.rs @@ -19,7 +19,7 @@ use crate::{ }, table::{AccountFieldTag, CallContextFieldTag}, util::{ - word::{Word, Word32Cell, WordCell, WordExpr}, + word::{Word32Cell, WordExpr, WordLoHi, WordLoHiCell}, Expr, }, }; @@ -55,7 +55,7 @@ pub(crate) struct ReturnRevertGadget { code_hash: Word32Cell, caller_id: Cell, - address: WordCell, + address: WordLoHiCell, reversion_info: ReversionInfo, } @@ -92,7 +92,7 @@ impl ExecutionGadget for ReturnRevertGadget { // These are globally defined because they are used across multiple cases. let copy_rw_increase = cb.query_cell(); - let copy_rw_increase_is_zero = IsZeroGadget::construct(cb, copy_rw_increase.expr()); + let copy_rw_increase_is_zero = cb.is_zero(copy_rw_increase.expr()); let memory_expansion = MemoryExpansionGadget::construct(cb, [range.address()]); @@ -137,7 +137,7 @@ impl ExecutionGadget for ReturnRevertGadget { let code_hash = cb.query_word32(); let deployed_code_rlc = cb.query_cell_phase2(); cb.copy_table_lookup( - Word::from_lo_unchecked(cb.curr.state.call_id.expr()), + WordLoHi::from_lo_unchecked(cb.curr.state.call_id.expr()), CopyDataType::Memory.expr(), code_hash.to_word(), CopyDataType::Bytecode.expr(), @@ -179,7 +179,7 @@ impl ExecutionGadget for ReturnRevertGadget { cb.call_context_lookup_read( None, CallContextFieldTag::IsPersistent, - Word::from_lo_unchecked(is_success.expr()), + WordLoHi::from_lo_unchecked(is_success.expr()), ); cb.require_step_state_transition(StepStateTransition { program_counter: To(0.expr()), @@ -218,8 +218,7 @@ impl ExecutionGadget for ReturnRevertGadget { CallContextFieldTag::ReturnDataLength, ] .map(|field_tag| cb.call_context(None, field_tag)); - let copy_length = - MinMaxGadget::construct(cb, return_data_length.expr(), range.length()); + let copy_length = cb.min_max(return_data_length.expr(), range.length()); cb.require_equal( "increase rw counter twice for each memory to memory byte copied", copy_length.min() + copy_length.min(), @@ -234,9 +233,9 @@ impl ExecutionGadget for ReturnRevertGadget { * not::expr(copy_rw_increase_is_zero.expr()), |cb| { cb.copy_table_lookup( - Word::from_lo_unchecked(cb.curr.state.call_id.expr()), + WordLoHi::from_lo_unchecked(cb.curr.state.call_id.expr()), CopyDataType::Memory.expr(), - Word::from_lo_unchecked(cb.next.state.call_id.expr()), + WordLoHi::from_lo_unchecked(cb.next.state.call_id.expr()), CopyDataType::Memory.expr(), range.offset(), range.address(), diff --git a/zkevm-circuits/src/evm_circuit/execution/returndatacopy.rs b/zkevm-circuits/src/evm_circuit/execution/returndatacopy.rs index 4764481b83..1bf7334d4c 100644 --- a/zkevm-circuits/src/evm_circuit/execution/returndatacopy.rs +++ b/zkevm-circuits/src/evm_circuit/execution/returndatacopy.rs @@ -20,7 +20,7 @@ use crate::{ }, table::CallContextFieldTag, util::{ - word::{Word, WordExpr}, + word::{WordExpr, WordLoHi}, Expr, }, }; @@ -71,8 +71,8 @@ impl ExecutionGadget for ReturnDataCopyGadget { // 1. Pop dest_offset, offset, length from stack cb.stack_pop(dest_offset.to_word()); - cb.stack_pop(Word::from_lo_unchecked(data_offset.expr())); - cb.stack_pop(Word::from_lo_unchecked(size.expr())); + cb.stack_pop(WordLoHi::from_lo_unchecked(data_offset.expr())); + cb.stack_pop(WordLoHi::from_lo_unchecked(size.expr())); // 2. Add lookup constraint in the call context for the returndatacopy field. let last_callee_id = cb.query_cell(); @@ -81,20 +81,20 @@ impl ExecutionGadget for ReturnDataCopyGadget { cb.call_context_lookup_read( None, CallContextFieldTag::LastCalleeId, - Word::from_lo_unchecked(last_callee_id.expr()), + WordLoHi::from_lo_unchecked(last_callee_id.expr()), ); cb.call_context_lookup_read( None, CallContextFieldTag::LastCalleeReturnDataOffset, - Word::from_lo_unchecked(return_data_offset.expr()), + WordLoHi::from_lo_unchecked(return_data_offset.expr()), ); cb.call_context_lookup_read( None, CallContextFieldTag::LastCalleeReturnDataLength, - Word::from_lo_unchecked(return_data_size.expr()), + WordLoHi::from_lo_unchecked(return_data_size.expr()), ); - // 3. contraints for copy: copy overflow check + // 3. constraints for copy: copy overflow check // i.e., offset + size <= return_data_size let in_bound_check = RangeCheckGadget::construct( cb, @@ -118,9 +118,9 @@ impl ExecutionGadget for ReturnDataCopyGadget { let copy_rwc_inc = cb.query_cell(); cb.condition(dst_memory_addr.has_length(), |cb| { cb.copy_table_lookup( - Word::from_lo_unchecked(last_callee_id.expr()), + WordLoHi::from_lo_unchecked(last_callee_id.expr()), CopyDataType::Memory.expr(), - Word::from_lo_unchecked(cb.curr.state.call_id.expr()), + WordLoHi::from_lo_unchecked(cb.curr.state.call_id.expr()), CopyDataType::Memory.expr(), return_data_offset.expr() + data_offset.expr(), return_data_offset.expr() + return_data_size.expr(), diff --git a/zkevm-circuits/src/evm_circuit/execution/returndatasize.rs b/zkevm-circuits/src/evm_circuit/execution/returndatasize.rs index 047d377d25..f17b61e27e 100644 --- a/zkevm-circuits/src/evm_circuit/execution/returndatasize.rs +++ b/zkevm-circuits/src/evm_circuit/execution/returndatasize.rs @@ -11,7 +11,7 @@ use crate::{ }, table::CallContextFieldTag, util::{ - word::{WordCell, WordExpr}, + word::{WordExpr, WordLoHiCell}, Expr, }, }; @@ -22,7 +22,7 @@ use halo2_proofs::plonk::Error; #[derive(Clone, Debug)] pub(crate) struct ReturnDataSizeGadget { same_context: SameContextGadget, - return_data_size: WordCell, + return_data_size: WordLoHiCell, } impl ExecutionGadget for ReturnDataSizeGadget { diff --git a/zkevm-circuits/src/evm_circuit/execution/sar.rs b/zkevm-circuits/src/evm_circuit/execution/sar.rs index e712211158..6a73a0d83a 100644 --- a/zkevm-circuits/src/evm_circuit/execution/sar.rs +++ b/zkevm-circuits/src/evm_circuit/execution/sar.rs @@ -99,8 +99,8 @@ impl ExecutionGadget for SarGadget { let p_lo = cb.query_cell(); let p_hi = cb.query_cell(); let p_top = cb.query_cell(); - let is_neg = LtGadget::construct(cb, 127.expr(), a.limbs[31].expr()); - let shf_lt256 = IsZeroGadget::construct(cb, sum::expr(&shift.limbs[1..32])); + let is_neg = cb.is_lt(127.expr(), a.limbs[31].expr()); + let shf_lt256 = cb.is_zero(sum::expr(&shift.limbs[1..32])); for idx in 0..4 { cb.require_equal( @@ -112,23 +112,23 @@ impl ExecutionGadget for SarGadget { // Constrain `a64s_lo[idx] < p_lo`. let a64s_lo_lt_p_lo = array_init(|idx| { - let lt = LtGadget::construct(cb, a64s_lo[idx].expr(), p_lo.expr()); + let lt = cb.is_lt(a64s_lo[idx].expr(), p_lo.expr()); cb.require_zero("a64s_lo[idx] < p_lo", 1.expr() - lt.expr()); lt }); // Constrain `a64s_hi[idx] < p_hi`. let a64s_hi_lt_p_hi = array_init(|idx| { - let lt = LtGadget::construct(cb, a64s_hi[idx].expr(), p_hi.expr()); + let lt = cb.is_lt(a64s_hi[idx].expr(), p_hi.expr()); cb.require_zero("a64s_hi[idx] < p_hi", 1.expr() - lt.expr()); lt }); - // Merge contraints - let shf_lo_div64_eq0 = IsZeroGadget::construct(cb, shf_div64.expr()); - let shf_lo_div64_eq1 = IsEqualGadget::construct(cb, shf_div64.expr(), 1.expr()); - let shf_lo_div64_eq2 = IsEqualGadget::construct(cb, shf_div64.expr(), 2.expr()); - let shf_lo_div64_eq3 = IsEqualGadget::construct(cb, shf_div64.expr(), 3.expr()); + // Merge constraints + let shf_lo_div64_eq0 = cb.is_zero(shf_div64.expr()); + let shf_lo_div64_eq1 = cb.is_eq(shf_div64.expr(), 1.expr()); + let shf_lo_div64_eq2 = cb.is_eq(shf_div64.expr(), 2.expr()); + let shf_lo_div64_eq3 = cb.is_eq(shf_div64.expr(), 3.expr()); let shf_div64_eq0 = shf_lt256.expr() * shf_lo_div64_eq0.expr(); let shf_div64_eq1 = shf_lt256.expr() * shf_lo_div64_eq1.expr(); let shf_div64_eq2 = shf_lt256.expr() * shf_lo_div64_eq2.expr(); @@ -179,9 +179,9 @@ impl ExecutionGadget for SarGadget { ); // Shift constraint - let shf_div64_lt_4 = LtGadget::construct(cb, shf_div64.expr(), 4.expr()); + let shf_div64_lt_4 = cb.is_lt(shf_div64.expr(), 4.expr()); cb.require_equal("shf_div64 < 4", shf_div64_lt_4.expr(), 1.expr()); - let shf_mod64_lt_64 = LtGadget::construct(cb, shf_mod64.expr(), 64.expr()); + let shf_mod64_lt_64 = cb.is_lt(shf_mod64.expr(), 64.expr()); cb.require_equal("shf_mod64 < 64", shf_mod64_lt_64.expr(), 1.expr()); cb.require_equal( "shift[0] == shf_mod64 + shf_div64 * 64", diff --git a/zkevm-circuits/src/evm_circuit/execution/sdiv_smod.rs b/zkevm-circuits/src/evm_circuit/execution/sdiv_smod.rs index e460108ac5..966edf9944 100644 --- a/zkevm-circuits/src/evm_circuit/execution/sdiv_smod.rs +++ b/zkevm-circuits/src/evm_circuit/execution/sdiv_smod.rs @@ -16,7 +16,7 @@ use crate::{ witness::{Block, Call, Chunk, ExecStep, Transaction}, }, util::{ - word::{Word, Word32Cell, WordExpr}, + word::{Word32Cell, WordExpr, WordLoHi}, Expr, }, }; @@ -52,13 +52,13 @@ impl ExecutionGadget for SignedDivModGadget { let divisor_abs = AbsWordGadget::construct(cb); let remainder_abs = AbsWordGadget::construct(cb); let dividend_abs = AbsWordGadget::construct(cb); - let quotient_is_zero = IsZeroWordGadget::construct(cb, quotient_abs.x()); - let divisor_is_zero = IsZeroWordGadget::construct(cb, divisor_abs.x()); - let remainder_is_zero = IsZeroWordGadget::construct(cb, remainder_abs.x()); + let quotient_is_zero = cb.is_zero_word(quotient_abs.x()); + let divisor_is_zero = cb.is_zero_word(divisor_abs.x()); + let remainder_is_zero = cb.is_zero_word(remainder_abs.x()); cb.stack_pop(dividend_abs.x().to_word()); cb.stack_pop(divisor_abs.x().to_word()); - cb.stack_push(Word::select( + cb.stack_push(WordLoHi::select( is_sdiv, quotient_abs .x() @@ -109,7 +109,7 @@ impl ExecutionGadget for SignedDivModGadget { // `sign(dividend) == sign(divisor) ^ sign(quotient)` cannot be applied // for this case. let dividend_is_signed_overflow = - LtGadget::construct(cb, 127.expr(), dividend_abs.x_abs().limbs[31].expr()); + cb.is_lt(127.expr(), dividend_abs.x_abs().limbs[31].expr()); // Constrain sign(dividend) == sign(divisor) ^ sign(quotient) when both // quotient and divisor are non-zero and dividend is not signed overflow. @@ -219,11 +219,11 @@ impl ExecutionGadget for SignedDivModGadget { u64::from(dividend_abs.to_le_bytes()[31]).into(), )?; self.quotient_is_zero - .assign(region, offset, Word::from(quotient))?; + .assign(region, offset, WordLoHi::from(quotient))?; self.divisor_is_zero - .assign(region, offset, Word::from(divisor))?; + .assign(region, offset, WordLoHi::from(divisor))?; self.remainder_is_zero - .assign(region, offset, Word::from(remainder))?; + .assign(region, offset, WordLoHi::from(remainder))?; Ok(()) } } diff --git a/zkevm-circuits/src/evm_circuit/execution/selfbalance.rs b/zkevm-circuits/src/evm_circuit/execution/selfbalance.rs index a4025c035f..7bb83d4f1a 100644 --- a/zkevm-circuits/src/evm_circuit/execution/selfbalance.rs +++ b/zkevm-circuits/src/evm_circuit/execution/selfbalance.rs @@ -11,7 +11,7 @@ use crate::{ }, table::{AccountFieldTag, CallContextFieldTag}, util::{ - word::{WordCell, WordExpr}, + word::{WordExpr, WordLoHiCell}, Expr, }, }; @@ -22,8 +22,8 @@ use halo2_proofs::plonk::Error; #[derive(Clone, Debug)] pub(crate) struct SelfbalanceGadget { same_context: SameContextGadget, - callee_address: WordCell, - self_balance: WordCell, + callee_address: WordLoHiCell, + self_balance: WordLoHiCell, } impl ExecutionGadget for SelfbalanceGadget { diff --git a/zkevm-circuits/src/evm_circuit/execution/sha3.rs b/zkevm-circuits/src/evm_circuit/execution/sha3.rs index 5ebf799052..9cff5746c4 100644 --- a/zkevm-circuits/src/evm_circuit/execution/sha3.rs +++ b/zkevm-circuits/src/evm_circuit/execution/sha3.rs @@ -20,7 +20,7 @@ use crate::{ }, witness::{Block, Call, Chunk, ExecStep, Transaction}, }, - util::word::{Word, WordCell, WordExpr}, + util::word::{WordExpr, WordLoHi, WordLoHiCell}, }; use super::ExecutionGadget; @@ -29,7 +29,7 @@ use super::ExecutionGadget; pub(crate) struct Sha3Gadget { same_context: SameContextGadget, memory_address: MemoryAddressGadget, - sha3_digest: WordCell, + sha3_digest: WordLoHiCell, copy_rwc_inc: Cell, rlc_acc: Cell, memory_expansion: MemoryExpansionGadget, @@ -59,9 +59,9 @@ impl ExecutionGadget for Sha3Gadget { cb.condition(memory_address.has_length(), |cb| { cb.copy_table_lookup( - Word::from_lo_unchecked(cb.curr.state.call_id.expr()), + WordLoHi::from_lo_unchecked(cb.curr.state.call_id.expr()), CopyDataType::Memory.expr(), - Word::from_lo_unchecked(cb.curr.state.call_id.expr()), + WordLoHi::from_lo_unchecked(cb.curr.state.call_id.expr()), CopyDataType::RlcAcc.expr(), memory_address.offset(), memory_address.address(), diff --git a/zkevm-circuits/src/evm_circuit/execution/shl_shr.rs b/zkevm-circuits/src/evm_circuit/execution/shl_shr.rs index f5bb1a497c..6b795db87d 100644 --- a/zkevm-circuits/src/evm_circuit/execution/shl_shr.rs +++ b/zkevm-circuits/src/evm_circuit/execution/shl_shr.rs @@ -15,7 +15,7 @@ use crate::{ witness::{Block, Call, Chunk, ExecStep, Transaction}, }, util::{ - word::{Word, Word32Cell, WordExpr}, + word::{Word32Cell, WordExpr, WordLoHi}, Expr, }, }; @@ -69,11 +69,10 @@ impl ExecutionGadget for ShlShrGadget { let mul_add_words = MulAddWordsGadget::construct(cb, ["ient, &divisor, &remainder, ÷nd]); - let shf_lt256 = IsZeroGadget::construct(cb, sum::expr(&shift.limbs[1..32])); - let divisor_is_zero = IsZeroWordGadget::construct(cb, &divisor); - let remainder_is_zero = IsZeroWordGadget::construct(cb, &remainder); - let remainder_lt_divisor = - LtWordGadget::construct(cb, &remainder.to_word(), &divisor.to_word()); + let shf_lt256 = cb.is_zero(sum::expr(&shift.limbs[1..32])); + let divisor_is_zero = cb.is_zero_word(&divisor); + let remainder_is_zero = cb.is_zero_word(&remainder); + let remainder_lt_divisor = cb.is_lt_word(&remainder.to_word(), &divisor.to_word()); // Constrain stack pops and pushes as: // - for SHL, two pops are shift and quotient, and push is dividend. @@ -102,7 +101,7 @@ impl ExecutionGadget for ShlShrGadget { "shift == shift.cells[0] when divisor != 0", shift .to_word() - .sub_unchecked(Word::from_lo_unchecked(shift.limbs[0].expr())) + .sub_unchecked(WordLoHi::from_lo_unchecked(shift.limbs[0].expr())) .mul_selector(1.expr() - divisor_is_zero.expr()), ); @@ -181,9 +180,7 @@ impl ExecutionGadget for ShlShrGadget { let shf_lt256 = pop1 .to_le_bytes() .iter() - .fold(Some(0_u64), |acc, val| { - acc.and_then(|acc| acc.checked_add(u64::from(*val))) - }) + .try_fold(0u64, |acc, val| acc.checked_add(u64::from(*val))) .unwrap() - shf0; let divisor = if shf_lt256 == 0 { @@ -208,9 +205,9 @@ impl ExecutionGadget for ShlShrGadget { .assign(region, offset, [quotient, divisor, remainder, dividend])?; self.shf_lt256.assign(region, offset, F::from(shf_lt256))?; self.divisor_is_zero - .assign(region, offset, Word::from(divisor))?; + .assign(region, offset, WordLoHi::from(divisor))?; self.remainder_is_zero - .assign(region, offset, Word::from(remainder))?; + .assign(region, offset, WordLoHi::from(remainder))?; self.remainder_lt_divisor .assign(region, offset, remainder, divisor)?; Ok(()) diff --git a/zkevm-circuits/src/evm_circuit/execution/signed_comparator.rs b/zkevm-circuits/src/evm_circuit/execution/signed_comparator.rs index 6dc0423130..23be044ca4 100644 --- a/zkevm-circuits/src/evm_circuit/execution/signed_comparator.rs +++ b/zkevm-circuits/src/evm_circuit/execution/signed_comparator.rs @@ -12,7 +12,7 @@ use crate::{ witness::{Block, Call, Chunk, ExecStep, Transaction}, }, util::{ - word::{Word, Word32Cell, WordExpr}, + word::{Word32Cell, WordExpr, WordLoHi}, Expr, }, }; @@ -51,7 +51,7 @@ impl ExecutionGadget for SignedComparatorGadget { // The Signed Comparator gadget is used for both opcodes SLT and SGT. // Depending on whether the opcode is SLT or SGT, we // swap the order in which the inputs are placed on the stack. - let is_sgt = IsEqualGadget::construct(cb, opcode.expr(), OpcodeId::SGT.expr()); + let is_sgt = cb.is_eq(opcode.expr(), OpcodeId::SGT.expr()); // Both a and b are to be treated as two's complement signed 256-bit // (32 cells) integers. This means, the first bit denotes the sign @@ -59,8 +59,8 @@ impl ExecutionGadget for SignedComparatorGadget { // number is negative if the most significant cell >= 128 // (0b10000000). a and b being in the little-endian notation, the // most-significant byte is the last byte. - let sign_check_a = LtGadget::construct(cb, a.limbs[31].expr(), 128.expr()); - let sign_check_b = LtGadget::construct(cb, b.limbs[31].expr(), 128.expr()); + let sign_check_a = cb.is_lt(a.limbs[31].expr(), 128.expr()); + let sign_check_b = cb.is_lt(b.limbs[31].expr(), 128.expr()); // sign_check_a_lt expression implies a is positive since its MSB < 2**7 // sign_check_b_lt expression implies b is positive since its MSB < 2**7 @@ -77,7 +77,7 @@ impl ExecutionGadget for SignedComparatorGadget { // b_hi) && (a_lo < b_lo))) let (a_lo, a_hi) = a.to_word().to_lo_hi(); let (b_lo, b_hi) = b.to_word().to_lo_hi(); - let lt_lo = LtGadget::construct(cb, a_lo, b_lo); + let lt_lo = cb.is_lt(a_lo, b_lo); let comparison_hi = ComparisonGadget::construct(cb, a_hi, b_hi); let a_lt_b_lo = lt_lo.expr(); let (a_lt_b_hi, a_eq_b_hi) = comparison_hi.expr(); @@ -109,9 +109,9 @@ impl ExecutionGadget for SignedComparatorGadget { let result = a_neg_b_pos.clone() + (1.expr() - a_neg_b_pos - b_neg_a_pos) * a_lt_b.expr(); // Pop a and b from the stack, push the result on the stack. - cb.stack_pop(Word::select(is_sgt.expr(), b.to_word(), a.to_word())); - cb.stack_pop(Word::select(is_sgt.expr(), a.to_word(), b.to_word())); - cb.stack_push(Word::from_lo_unchecked(result)); + cb.stack_pop(WordLoHi::select(is_sgt.expr(), b.to_word(), a.to_word())); + cb.stack_pop(WordLoHi::select(is_sgt.expr(), a.to_word(), b.to_word())); + cb.stack_push(WordLoHi::from_lo_unchecked(result)); // The read-write counter changes by three since we're reading two words // from stack and writing one. The program counter shifts only by one diff --git a/zkevm-circuits/src/evm_circuit/execution/signextend.rs b/zkevm-circuits/src/evm_circuit/execution/signextend.rs index 42261dec92..d9c703e68e 100644 --- a/zkevm-circuits/src/evm_circuit/execution/signextend.rs +++ b/zkevm-circuits/src/evm_circuit/execution/signextend.rs @@ -52,12 +52,11 @@ impl ExecutionGadget for SignextendGadget { // need to do any changes. So just sum all the non-LSB byte // values here and then check if it's non-zero so we can use // that as an additional condition to enable the selector. - let is_msb_sum_zero = IsZeroGadget::construct(cb, sum::expr(&index.limbs[1..32])); + let is_msb_sum_zero = cb.is_zero(sum::expr(&index.limbs[1..32])); // Check if this byte is selected looking only at the LSB of the index // word - let is_byte_selected = - array_init(|idx| IsEqualGadget::construct(cb, index.limbs[0].expr(), idx.expr())); + let is_byte_selected = array_init(|idx| cb.is_eq(index.limbs[0].expr(), idx.expr())); // We need to find the byte we have to get the sign from so we can // extend correctly. We go byte by byte and check if `idx == @@ -282,7 +281,7 @@ mod test { let pos_extend = 0u8; let neg_extend = 0xFFu8; - for (value, byte_extend) in vec![(pos_value, pos_extend), (neg_value, neg_extend)].iter() { + for (value, byte_extend) in [(pos_value, pos_extend), (neg_value, neg_extend)].iter() { for idx in 0..33 { test_ok( (idx as u64).into(), diff --git a/zkevm-circuits/src/evm_circuit/execution/sload.rs b/zkevm-circuits/src/evm_circuit/execution/sload.rs index 4cf4cd050a..0065e00ad8 100644 --- a/zkevm-circuits/src/evm_circuit/execution/sload.rs +++ b/zkevm-circuits/src/evm_circuit/execution/sload.rs @@ -13,7 +13,7 @@ use crate::{ }, table::CallContextFieldTag, util::{ - word::{Word, WordCell, WordExpr}, + word::{WordExpr, WordLoHi, WordLoHiCell}, Expr, }, }; @@ -25,10 +25,10 @@ pub(crate) struct SloadGadget { same_context: SameContextGadget, tx_id: Cell, reversion_info: ReversionInfo, - callee_address: WordCell, - key: WordCell, - value: WordCell, - committed_value: WordCell, + callee_address: WordLoHiCell, + key: WordLoHiCell, + value: WordLoHiCell, + committed_value: WordLoHiCell, is_warm: Cell, } @@ -65,14 +65,14 @@ impl ExecutionGadget for SloadGadget { tx_id.expr(), callee_address.to_word(), key.to_word(), - Word::from_lo_unchecked(is_warm.expr()), + WordLoHi::from_lo_unchecked(is_warm.expr()), ); cb.account_storage_access_list_write( tx_id.expr(), callee_address.to_word(), key.to_word(), - Word::from_lo_unchecked(true.expr()), - Word::from_lo_unchecked(is_warm.expr()), + WordLoHi::from_lo_unchecked(true.expr()), + WordLoHi::from_lo_unchecked(is_warm.expr()), Some(&mut reversion_info), ); diff --git a/zkevm-circuits/src/evm_circuit/execution/sstore.rs b/zkevm-circuits/src/evm_circuit/execution/sstore.rs index 2f4deb5b45..bcc946cf8b 100644 --- a/zkevm-circuits/src/evm_circuit/execution/sstore.rs +++ b/zkevm-circuits/src/evm_circuit/execution/sstore.rs @@ -16,7 +16,7 @@ use crate::{ }, table::CallContextFieldTag, util::{ - word::{Word, Word32Cell, WordCell, WordExpr}, + word::{Word32Cell, WordExpr, WordLoHi, WordLoHiCell}, Expr, }, }; @@ -33,7 +33,7 @@ pub(crate) struct SstoreGadget { tx_id: Cell, is_static: Cell, reversion_info: ReversionInfo, - callee_address: WordCell, + callee_address: WordLoHiCell, key: Word32Cell, value: Word32Cell, value_prev: Word32Cell, @@ -88,14 +88,14 @@ impl ExecutionGadget for SstoreGadget { tx_id.expr(), callee_address.to_word(), key.to_word(), - Word::from_lo_unchecked(is_warm.expr()), + WordLoHi::from_lo_unchecked(is_warm.expr()), ); cb.account_storage_access_list_write( tx_id.expr(), callee_address.to_word(), key.to_word(), - Word::from_lo_unchecked(true.expr()), - Word::from_lo_unchecked(is_warm.expr()), + WordLoHi::from_lo_unchecked(true.expr()), + WordLoHi::from_lo_unchecked(is_warm.expr()), Some(&mut reversion_info), ); @@ -129,7 +129,7 @@ impl ExecutionGadget for SstoreGadget { ); cb.tx_refund_write( tx_id.expr(), - Word::from_lo_unchecked(tx_refund.expr()), + WordLoHi::from_lo_unchecked(tx_refund.expr()), tx_refund_prev.to_word(), Some(&mut reversion_info), ); @@ -232,12 +232,13 @@ impl ExecutionGadget for SstoreGadget { pub(crate) struct SstoreTxRefundGadget { tx_refund_old: U64Cell, tx_refund_new: Expression, - value_prev_is_zero_gadget: IsZeroWordGadget>>, - value_is_zero_gadget: IsZeroWordGadget>>, - original_is_zero_gadget: IsZeroWordGadget>>, - original_eq_value_gadget: IsEqualWordGadget>, Word>>, - prev_eq_value_gadget: IsEqualWordGadget>, Word>>, - original_eq_prev_gadget: IsEqualWordGadget>, Word>>, + value_prev_is_zero_gadget: IsZeroWordGadget>>, + value_is_zero_gadget: IsZeroWordGadget>>, + original_is_zero_gadget: IsZeroWordGadget>>, + original_eq_value_gadget: + IsEqualWordGadget>, WordLoHi>>, + prev_eq_value_gadget: IsEqualWordGadget>, WordLoHi>>, + original_eq_prev_gadget: IsEqualWordGadget>, WordLoHi>>, } impl SstoreTxRefundGadget { @@ -248,16 +249,14 @@ impl SstoreTxRefundGadget { value_prev: T, original_value: T, ) -> Self { - let value_prev_is_zero_gadget = IsZeroWordGadget::construct(cb, &value_prev.to_word()); - let value_is_zero_gadget = IsZeroWordGadget::construct(cb, &value.to_word()); - let original_is_zero_gadget = IsZeroWordGadget::construct(cb, &original_value.to_word()); - - let original_eq_value_gadget = - IsEqualWordGadget::construct(cb, &original_value.to_word(), &value.to_word()); - let prev_eq_value_gadget = - IsEqualWordGadget::construct(cb, &value_prev.to_word(), &value.to_word()); + let value_prev_is_zero_gadget = cb.is_zero_word(&value_prev.to_word()); + let value_is_zero_gadget = cb.is_zero_word(&value.to_word()); + let original_is_zero_gadget = cb.is_zero_word(&original_value.to_word()); + + let original_eq_value_gadget = cb.is_eq_word(&original_value.to_word(), &value.to_word()); + let prev_eq_value_gadget = cb.is_eq_word(&value_prev.to_word(), &value.to_word()); let original_eq_prev_gadget = - IsEqualWordGadget::construct(cb, &original_value.to_word(), &value_prev.to_word()); + cb.is_eq_word(&original_value.to_word(), &value_prev.to_word()); let value_prev_is_zero = value_prev_is_zero_gadget.expr(); let value_is_zero = value_is_zero_gadget.expr(); @@ -268,20 +267,20 @@ impl SstoreTxRefundGadget { let original_eq_prev = original_eq_prev_gadget.expr(); // (value_prev != value) && (original_value != value) && (value == - // Word::from(0)) + // WordLoHi::from(0)) let delete_slot = not::expr(prev_eq_value.clone()) * not::expr(original_is_zero.clone()) * value_is_zero; // (value_prev != value) && (original_value == value) && (original_value != - // Word::from(0)) + // WordLoHi::from(0)) let reset_existing = not::expr(prev_eq_value.clone()) * original_eq_value.clone() * not::expr(original_is_zero.clone()); // (value_prev != value) && (original_value == value) && (original_value == - // Word::from(0)) + // WordLoHi::from(0)) let reset_inexistent = not::expr(prev_eq_value.clone()) * original_eq_value * (original_is_zero); // (value_prev != value) && (original_value != value_prev) && (value_prev == - // Word::from(0)) + // WordLoHi::from(0)) let recreate_slot = not::expr(prev_eq_value) * not::expr(original_eq_prev) * (value_prev_is_zero); @@ -322,28 +321,28 @@ impl SstoreTxRefundGadget { self.tx_refund_old .assign(region, offset, Some(tx_refund_old.to_le_bytes()))?; self.value_prev_is_zero_gadget - .assign(region, offset, Word::from(value_prev))?; + .assign(region, offset, WordLoHi::from(value_prev))?; self.value_is_zero_gadget - .assign(region, offset, Word::from(value))?; + .assign(region, offset, WordLoHi::from(value))?; self.original_is_zero_gadget - .assign(region, offset, Word::from(original_value))?; + .assign(region, offset, WordLoHi::from(original_value))?; self.original_eq_value_gadget.assign( region, offset, - Word::from(original_value), - Word::from(value), + WordLoHi::from(original_value), + WordLoHi::from(value), )?; self.prev_eq_value_gadget.assign( region, offset, - Word::from(value_prev), - Word::from(value), + WordLoHi::from(value_prev), + WordLoHi::from(value), )?; self.original_eq_prev_gadget.assign( region, offset, - Word::from(original_value), - Word::from(value_prev), + WordLoHi::from(original_value), + WordLoHi::from(value_prev), )?; debug_assert_eq!( calc_expected_tx_refund(tx_refund_old, value, value_prev, original_value), diff --git a/zkevm-circuits/src/evm_circuit/execution/stop.rs b/zkevm-circuits/src/evm_circuit/execution/stop.rs index 32ac2c1e69..de2a943ab6 100644 --- a/zkevm-circuits/src/evm_circuit/execution/stop.rs +++ b/zkevm-circuits/src/evm_circuit/execution/stop.rs @@ -16,12 +16,12 @@ use crate::{ }, table::CallContextFieldTag, util::{ - word::{Word, WordExpr}, + word::{WordExpr, WordLoHi}, Expr, }, }; use bus_mapping::evm::OpcodeId; -use eth_types::Field; +use eth_types::{Field, OpsIdentity}; use halo2_proofs::{circuit::Value, plonk::Error}; #[derive(Clone, Debug)] @@ -63,7 +63,7 @@ impl ExecutionGadget for StopGadget { ); // Call ends with STOP must be successful - cb.call_context_lookup_read(None, CallContextFieldTag::IsSuccess, Word::one()); + cb.call_context_lookup_read(None, CallContextFieldTag::IsSuccess, WordLoHi::one()); let is_to_end_tx = cb.next.execution_state_selector([ExecutionState::EndTx]); cb.require_equal( diff --git a/zkevm-circuits/src/evm_circuit/execution/swap.rs b/zkevm-circuits/src/evm_circuit/execution/swap.rs index 335af24e14..92d2706cbb 100644 --- a/zkevm-circuits/src/evm_circuit/execution/swap.rs +++ b/zkevm-circuits/src/evm_circuit/execution/swap.rs @@ -10,7 +10,7 @@ use crate::{ witness::{Block, Call, Chunk, ExecStep, Transaction}, }, util::{ - word::{WordCell, WordExpr}, + word::{WordExpr, WordLoHiCell}, Expr, }, }; @@ -20,7 +20,7 @@ use halo2_proofs::plonk::Error; #[derive(Clone, Debug)] pub(crate) struct SwapGadget { same_context: SameContextGadget, - values: [WordCell; 2], + values: [WordLoHiCell; 2], } impl ExecutionGadget for SwapGadget { diff --git a/zkevm-circuits/src/evm_circuit/param.rs b/zkevm-circuits/src/evm_circuit/param.rs index 713565ccab..f205e14475 100644 --- a/zkevm-circuits/src/evm_circuit/param.rs +++ b/zkevm-circuits/src/evm_circuit/param.rs @@ -9,7 +9,7 @@ use halo2_proofs::{ use std::collections::HashMap; // Step dimension -pub(crate) const STEP_WIDTH: usize = 138; +pub(crate) const STEP_WIDTH: usize = 139; /// Step height pub const MAX_STEP_HEIGHT: usize = 19; /// The height of the state of a step, used by gates that connect two @@ -43,6 +43,7 @@ pub(crate) const EVM_LOOKUP_COLS: usize = FIXED_TABLE_LOOKUPS + COPY_TABLE_LOOKUPS + KECCAK_TABLE_LOOKUPS + EXP_TABLE_LOOKUPS + + SIG_TABLE_LOOKUPS + CHUNK_CTX_TABLE_LOOKUPS; /// Lookups done per row. @@ -55,6 +56,7 @@ pub const LOOKUP_CONFIG: &[(Table, usize)] = &[ (Table::Copy, COPY_TABLE_LOOKUPS), (Table::Keccak, KECCAK_TABLE_LOOKUPS), (Table::Exp, EXP_TABLE_LOOKUPS), + (Table::Sig, SIG_TABLE_LOOKUPS), (Table::ChunkCtx, CHUNK_CTX_TABLE_LOOKUPS), ]; @@ -82,6 +84,9 @@ pub const KECCAK_TABLE_LOOKUPS: usize = 1; /// Exp Table lookups done in EVMCircuit pub const EXP_TABLE_LOOKUPS: usize = 1; +/// Sig Table lookups done in EVMCircuit +pub const SIG_TABLE_LOOKUPS: usize = 1; + /// chunk_ctx Table lookups done in EVMCircuit pub const CHUNK_CTX_TABLE_LOOKUPS: usize = 1; @@ -180,7 +185,7 @@ lazy_static::lazy_static! { }; // Step slot height in evm circuit // We enable the invalid_tx feature to get invalid tx's ExecutionState height - // We garentee the heights of other ExecutionStates remains unchanged in the following test + // We guarantee the heights of other ExecutionStates remains unchanged in the following test pub(crate) static ref EXECUTION_STATE_HEIGHT_MAP : HashMap = get_step_height_map(*INVALID_TX_CONFIG); } fn get_step_height_map(feature_config: FeatureConfig) -> HashMap { diff --git a/zkevm-circuits/src/evm_circuit/step.rs b/zkevm-circuits/src/evm_circuit/step.rs index 9d90677b42..f26f9290f6 100644 --- a/zkevm-circuits/src/evm_circuit/step.rs +++ b/zkevm-circuits/src/evm_circuit/step.rs @@ -14,7 +14,7 @@ use crate::{ }, util::{ cell_manager::{CMFixedWidthStrategy, CellManager}, - word::{Word, WordCell}, + word::{WordLoHi, WordLoHiCell}, Expr, }, }; @@ -29,14 +29,14 @@ use halo2_proofs::{ circuit::Value, plonk::{Advice, Column, ConstraintSystem, Error, Expression}, }; -use std::{fmt::Display, iter}; +use std::{fmt::Display, iter, marker::ConstParamTy}; use strum::IntoEnumIterator; use strum_macros::EnumIter; impl From for ExecutionState { fn from(value: PrecompileCalls) -> Self { match value { - PrecompileCalls::ECRecover => ExecutionState::PrecompileEcRecover, + PrecompileCalls::Ecrecover => ExecutionState::PrecompileEcrecover, PrecompileCalls::Sha256 => ExecutionState::PrecompileSha256, PrecompileCalls::Ripemd160 => ExecutionState::PrecompileRipemd160, PrecompileCalls::Identity => ExecutionState::PrecompileIdentity, @@ -50,7 +50,7 @@ impl From for ExecutionState { } #[allow(non_camel_case_types, missing_docs)] -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, EnumIter)] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, EnumIter, ConstParamTy)] /// All the possible execution states that the computation of EVM can arrive. /// Some states are shared by multiple opcodes. pub enum ExecutionState { @@ -161,7 +161,7 @@ pub enum ExecutionState { ErrorOutOfGasCREATE, ErrorOutOfGasSELFDESTRUCT, // Precompiles - PrecompileEcRecover, + PrecompileEcrecover, PrecompileSha256, PrecompileRipemd160, PrecompileIdentity, @@ -333,7 +333,7 @@ impl From<&ExecStep> for ExecutionState { } } ExecState::Precompile(precompile) => match precompile { - PrecompileCalls::ECRecover => ExecutionState::PrecompileEcRecover, + PrecompileCalls::Ecrecover => ExecutionState::PrecompileEcrecover, PrecompileCalls::Sha256 => ExecutionState::PrecompileSha256, PrecompileCalls::Ripemd160 => ExecutionState::PrecompileRipemd160, PrecompileCalls::Identity => ExecutionState::PrecompileIdentity, @@ -376,7 +376,7 @@ impl ExecutionState { pub(crate) fn is_precompiled(&self) -> bool { matches!( self, - Self::PrecompileEcRecover + Self::PrecompileEcrecover | Self::PrecompileSha256 | Self::PrecompileRipemd160 | Self::PrecompileIdentity @@ -390,7 +390,7 @@ impl ExecutionState { pub(crate) fn precompile_base_gas_cost(&self) -> u64 { (match self { - Self::PrecompileEcRecover => PrecompileCalls::ECRecover, + Self::PrecompileEcrecover => PrecompileCalls::Ecrecover, Self::PrecompileSha256 => PrecompileCalls::Sha256, Self::PrecompileRipemd160 => PrecompileCalls::Ripemd160, Self::PrecompileIdentity => PrecompileCalls::Identity, @@ -602,7 +602,7 @@ impl ExecutionState { .collect() } - /// Get the state hight + /// Get the state height pub fn get_step_height_option(&self) -> Option { EXECUTION_STATE_HEIGHT_MAP.get(self).copied() } @@ -759,7 +759,7 @@ pub(crate) struct StepState { /// In the case of a contract creation internal call, this denotes the hash /// of the chunk of bytes from caller's memory that represent the /// contract init code. - pub(crate) code_hash: WordCell, + pub(crate) code_hash: WordLoHiCell, /// The program counter pub(crate) program_counter: Cell, /// The stack pointer @@ -804,7 +804,7 @@ impl Step { call_id: cell_manager.query_cell(meta, CellType::StoragePhase1), is_root: cell_manager.query_cell(meta, CellType::StoragePhase1), is_create: cell_manager.query_cell(meta, CellType::StoragePhase1), - code_hash: Word::new([ + code_hash: WordLoHi::new([ cell_manager.query_cell(meta, CellType::StoragePhase1), cell_manager.query_cell(meta, CellType::StoragePhase1), ]), diff --git a/zkevm-circuits/src/evm_circuit/table.rs b/zkevm-circuits/src/evm_circuit/table.rs index a3673d80d7..b0efede59f 100644 --- a/zkevm-circuits/src/evm_circuit/table.rs +++ b/zkevm-circuits/src/evm_circuit/table.rs @@ -3,7 +3,7 @@ use crate::{ evm_circuit::step::{ExecutionState, ResponsibleOp}, impl_expr, - util::word::Word, + util::word::WordLoHi, }; use bus_mapping::{evm::OpcodeId, precompile::PrecompileCalls}; use eth_types::Field; @@ -47,7 +47,7 @@ pub enum FixedTableTag { Pow2, /// Lookup constant gas cost for opcodes ConstantGasCost, - /// Preocmpile information + /// Precompile information PrecompileInfo, } impl_expr!(FixedTableTag); @@ -141,7 +141,7 @@ impl FixedTableTag { ), Self::PrecompileInfo => Box::new( vec![ - PrecompileCalls::ECRecover, + PrecompileCalls::Ecrecover, PrecompileCalls::Sha256, PrecompileCalls::Ripemd160, PrecompileCalls::Identity, @@ -191,6 +191,8 @@ pub enum Table { Keccak, /// Lookup for exp table Exp, + /// Lookup for sig table + Sig, /// Lookup for chunk context ChunkCtx, } @@ -209,13 +211,13 @@ pub(crate) struct RwValues { /// the cell value of the [`bus_mapping::operation::Target`] field_tag: Expression, /// Storage key of two limbs - storage_key: Word>, + storage_key: WordLoHi>, /// The current storage value - value: Word>, + value: WordLoHi>, /// The previous storage value - value_prev: Word>, + value_prev: WordLoHi>, /// The initial storage value before the current transaction - init_val: Word>, + init_val: WordLoHi>, } impl RwValues { @@ -225,10 +227,10 @@ impl RwValues { id: Expression, address: Expression, field_tag: Expression, - storage_key: Word>, - value: Word>, - value_prev: Word>, - init_val: Word>, + storage_key: WordLoHi>, + value: WordLoHi>, + value_prev: WordLoHi>, + init_val: WordLoHi>, ) -> Self { Self { id, @@ -253,7 +255,7 @@ impl RwValues { #[derive(Clone, Debug)] pub(crate) enum Lookup { - /// Lookup to fixed table, which contains serveral pre-built tables such as + /// Lookup to fixed table, which contains several pre-built tables such as /// range tables or bitwise tables. Fixed { /// Tag to specify which table to lookup. @@ -271,7 +273,7 @@ pub(crate) enum Lookup { /// field_tag is Calldata, otherwise should be set to 0. index: Expression, /// Value of the field. - value: Word>, + value: WordLoHi>, }, /// Lookup to read-write table, which contains read-write access records of /// time-aware data. @@ -291,7 +293,7 @@ pub(crate) enum Lookup { /// contract code. Bytecode { /// Hash to specify which code to read. - hash: Word>, + hash: WordLoHi>, /// Tag to specify whether its the bytecode length or byte value in the /// bytecode. tag: Expression, @@ -311,18 +313,18 @@ pub(crate) enum Lookup { /// should be set to 0. number: Expression, /// Value of the field. - value: Word>, + value: WordLoHi>, }, /// Lookup to copy table. CopyTable { /// Whether the row is the first row of the copy event. is_first: Expression, /// The source ID for the copy event. - src_id: Word>, + src_id: WordLoHi>, /// The source tag for the copy event. src_tag: Expression, /// The destination ID for the copy event. - dst_id: Word>, + dst_id: WordLoHi>, /// The destination tag for the copy event. dst_tag: Expression, /// The source address where bytes are copied from. @@ -351,7 +353,7 @@ pub(crate) enum Lookup { input_len: Expression, /// Output (hash) until this state. hash will be split into multiple expression in little /// endian. - output: Word>, + output: WordLoHi>, }, /// Lookup to exponentiation table. ExpTable { @@ -361,6 +363,14 @@ pub(crate) enum Lookup { exponent_lo_hi: [Expression; 2], exponentiation_lo_hi: [Expression; 2], }, + SigTable { + msg_hash: WordLoHi>, + sig_v: Expression, + sig_r: WordLoHi>, + sig_s: WordLoHi>, + recovered_addr: Expression, + is_valid: Expression, + }, /// Lookup to block table, which contains constants of this block. ChunkCtx { /// Tag to specify which field to read. @@ -368,6 +378,7 @@ pub(crate) enum Lookup { /// value value: Expression, }, + /// Conditional lookup enabled by the first element. Conditional(Expression, Box>), } @@ -388,6 +399,7 @@ impl Lookup { Self::CopyTable { .. } => Table::Copy, Self::KeccakTable { .. } => Table::Keccak, Self::ExpTable { .. } => Table::Exp, + Self::SigTable { .. } => Table::Sig, Self::Conditional(_, lookup) => lookup.table(), } } @@ -506,9 +518,26 @@ impl Lookup { exponentiation_lo_hi[0].clone(), exponentiation_lo_hi[1].clone(), ], - Self::ChunkCtx { field_tag, value } => { - vec![field_tag.clone(), value.clone()] - } + Self::SigTable { + msg_hash, + sig_v, + sig_r, + sig_s, + recovered_addr, + is_valid, + } => vec![ + 1.expr(), // q_enable + msg_hash.lo(), + msg_hash.hi(), + sig_v.clone(), + sig_r.lo(), + sig_r.hi(), + sig_s.lo(), + sig_s.hi(), + recovered_addr.clone(), + is_valid.clone(), + ], + Self::ChunkCtx { field_tag, value } => vec![field_tag.clone(), value.clone()], Self::Conditional(condition, lookup) => lookup .input_exprs() .into_iter() diff --git a/zkevm-circuits/src/evm_circuit/util.rs b/zkevm-circuits/src/evm_circuit/util.rs index f5202ad9f1..1b58790914 100644 --- a/zkevm-circuits/src/evm_circuit/util.rs +++ b/zkevm-circuits/src/evm_circuit/util.rs @@ -1,5 +1,5 @@ pub use crate::util::{ - word::{Word, WordExpr}, + word::{WordExpr, WordLoHi}, Challenges, Expr, }; use crate::{ @@ -145,8 +145,8 @@ impl<'r, 'b, F: Field> CachedRegion<'r, 'b, F> { .map(|r| rlc::value(le_bytes, r)) } - pub fn code_hash(&self, n: U256) -> Word> { - Word::from(n).into_value() + pub fn code_hash(&self, n: U256) -> WordLoHi> { + WordLoHi::from(n).into_value() } /// Constrains a cell to have a constant value. diff --git a/zkevm-circuits/src/evm_circuit/util/common_gadget.rs b/zkevm-circuits/src/evm_circuit/util/common_gadget.rs index 6cfbb365e8..9c30c46589 100644 --- a/zkevm-circuits/src/evm_circuit/util/common_gadget.rs +++ b/zkevm-circuits/src/evm_circuit/util/common_gadget.rs @@ -22,13 +22,15 @@ use crate::{ }, table::{chunk_ctx_table::ChunkCtxFieldTag, AccountFieldTag, CallContextFieldTag}, util::{ - word::{Word, Word32, Word32Cell, WordCell, WordExpr}, + word::{Word32, Word32Cell, WordExpr, WordLoHi, WordLoHiCell}, Expr, }, witness::{Block, Call, Chunk, ExecStep}, }; use bus_mapping::state_db::CodeDB; -use eth_types::{evm_types::GasCost, Field, ToAddress, ToLittleEndian, ToScalar, ToWord, U256}; +use eth_types::{ + evm_types::GasCost, Field, OpsIdentity, ToAddress, ToLittleEndian, ToScalar, ToWord, U256, +}; use gadgets::util::{select, sum}; use halo2_proofs::{ circuit::Value, @@ -98,7 +100,7 @@ pub(crate) struct RestoreContextGadget { caller_id: Cell, caller_is_root: Cell, caller_is_create: Cell, - caller_code_hash: WordCell, + caller_code_hash: WordLoHiCell, caller_program_counter: Cell, caller_stack_pointer: Cell, caller_gas_left: Cell, @@ -189,7 +191,7 @@ impl RestoreContextGadget { cb.call_context_lookup_write( Some(caller_id.expr()), field_tag, - Word::from_lo_unchecked(value), + WordLoHi::from_lo_unchecked(value), ); } @@ -306,7 +308,7 @@ impl { pub(crate) fn construct( cb: &mut EVMConstraintBuilder, - address: Word>, + address: WordLoHi>, updates: Vec>, reversion_info: Option<&mut ReversionInfo>, ) -> Self { @@ -376,14 +378,14 @@ impl TransferToGadget { #[allow(clippy::too_many_arguments)] pub(crate) fn construct( cb: &mut EVMConstraintBuilder, - receiver_address: Word>, + receiver_address: WordLoHi>, receiver_exists: Expression, must_create: Expression, value: Word32Cell, mut reversion_info: Option<&mut ReversionInfo>, account_write: bool, ) -> Self { - let value_is_zero = IsZeroWordGadget::construct(cb, &value); + let value_is_zero = cb.is_zero_word(&value); if account_write { Self::create_account( cb, @@ -413,7 +415,7 @@ impl TransferToGadget { pub(crate) fn create_account( cb: &mut EVMConstraintBuilder, - receiver_address: Word>, + receiver_address: WordLoHi>, receiver_exists: Expression, must_create: Expression, value_is_zero: Expression, @@ -429,7 +431,7 @@ impl TransferToGadget { receiver_address.clone(), AccountFieldTag::CodeHash, cb.empty_code_hash(), - Word::zero(), + WordLoHi::zero(), reversion_info, ); }, @@ -451,7 +453,7 @@ impl TransferToGadget { receiver_balance, )?; self.value_is_zero - .assign_value(region, offset, Value::known(Word::from(value)))?; + .assign_value(region, offset, Value::known(WordLoHi::from(value)))?; Ok(()) } @@ -485,8 +487,8 @@ impl TransferWithGasFeeGadget { #[allow(clippy::too_many_arguments)] pub(crate) fn construct( cb: &mut EVMConstraintBuilder, - sender_address: Word>, - receiver_address: Word>, + sender_address: WordLoHi>, + receiver_address: WordLoHi>, receiver_exists: Expression, must_create: Expression, value: Word32Cell, @@ -495,7 +497,7 @@ impl TransferWithGasFeeGadget { ) -> Self { let sender_sub_fee = UpdateBalanceGadget::construct(cb, sender_address.to_word(), vec![gas_fee], None); - let value_is_zero = IsZeroWordGadget::construct(cb, &value); + let value_is_zero = cb.is_zero_word(&value); // If receiver doesn't exist, create it TransferToGadget::create_account( cb, @@ -589,7 +591,7 @@ impl TransferWithGasFeeGadget { value, )?; self.value_is_zero - .assign_value(region, offset, Value::known(Word::from(value)))?; + .assign_value(region, offset, Value::known(WordLoHi::from(value)))?; Ok(()) } } @@ -608,15 +610,15 @@ pub(crate) struct TransferGadget { impl TransferGadget { pub(crate) fn construct( cb: &mut EVMConstraintBuilder, - sender_address: Word>, - receiver_address: Word>, + sender_address: WordLoHi>, + receiver_address: WordLoHi>, receiver_exists: Expression, must_create: Expression, - // _prev_code_hash: Word>, + // _prev_code_hash: WordLoHi>, value: Word32Cell, reversion_info: &mut ReversionInfo, ) -> Self { - let value_is_zero = IsZeroWordGadget::construct(cb, &value); + let value_is_zero = cb.is_zero_word(&value); // If receiver doesn't exist, create it TransferToGadget::create_account( cb, @@ -685,7 +687,7 @@ impl TransferGadget { value, )?; self.value_is_zero - .assign_value(region, offset, Value::known(Word::from(value)))?; + .assign_value(region, offset, Value::known(WordLoHi::from(value)))?; Ok(()) } @@ -709,10 +711,10 @@ pub(crate) struct CommonCallGadget>, pub has_value: Expression, - pub callee_code_hash: WordCell, - pub is_empty_code_hash: IsEqualWordGadget, Word>>, + pub callee_code_hash: WordLoHiCell, + pub is_empty_code_hash: IsEqualWordGadget, WordLoHi>>, - pub callee_not_exists: IsZeroWordGadget>, + pub callee_not_exists: IsZeroWordGadget>, // save information is_call: Expression, @@ -746,7 +748,7 @@ impl, const IS_SUCCESS_CAL let cd_address = MemAddrGadget::construct_self(cb); let rd_address = MemAddrGadget::construct_self(cb); // Lookup values from stack - // `callee_address` is poped from stack and used to check if it exists in + // `callee_address` is popped from stack and used to check if it exists in // access list and get code hash. // For CALLCODE, both caller and callee addresses are `current_callee_address`. // For DELEGATECALL, caller address is `current_caller_address` and @@ -765,18 +767,18 @@ impl, const IS_SUCCESS_CAL cb.stack_pop(rd_address.offset_word()); cb.stack_pop(rd_address.length_word()); cb.stack_push(if IS_SUCCESS_CALL { - Word::from_lo_unchecked(is_success.expr()) // is_success is bool + WordLoHi::from_lo_unchecked(is_success.expr()) // is_success is bool } else { - Word::zero() + WordLoHi::zero() }); // Recomposition of random linear combination to integer - let gas_is_u64 = IsZeroGadget::construct(cb, sum::expr(&gas_word.limbs[N_BYTES_GAS..])); + let gas_is_u64 = cb.is_zero(sum::expr(&gas_word.limbs[N_BYTES_GAS..])); let memory_expansion = MemoryExpansionGadget::construct(cb, [cd_address.address(), rd_address.address()]); // construct common gadget - let value_is_zero = IsZeroWordGadget::construct(cb, &value); + let value_is_zero = cb.is_zero_word(&value); let has_value = select::expr( is_delegatecall.expr() + is_staticcall.expr(), 0.expr(), @@ -789,9 +791,8 @@ impl, const IS_SUCCESS_CAL AccountFieldTag::CodeHash, callee_code_hash.to_word(), ); - let is_empty_code_hash = - IsEqualWordGadget::construct(cb, &callee_code_hash, &cb.empty_code_hash()); - let callee_not_exists = IsZeroWordGadget::construct(cb, &callee_code_hash); + let is_empty_code_hash = cb.is_eq_word(&callee_code_hash, &cb.empty_code_hash()); + let callee_not_exists = cb.is_zero_word(&callee_code_hash); Self { is_success, @@ -814,7 +815,7 @@ impl, const IS_SUCCESS_CAL } } - pub fn callee_address(&self) -> Word> { + pub fn callee_address(&self) -> WordLoHi> { self.callee_address.to_word() } @@ -881,19 +882,19 @@ impl, const IS_SUCCESS_CAL )?; self.value_is_zero - .assign(region, offset, Word::from(value))?; + .assign(region, offset, WordLoHi::from(value))?; self.callee_code_hash .assign_u256(region, offset, callee_code_hash)?; self.is_empty_code_hash.assign_value( region, offset, - Value::known(Word::from(callee_code_hash)), - Value::known(Word::from(CodeDB::empty_code_hash().to_word())), + Value::known(WordLoHi::from(callee_code_hash)), + Value::known(WordLoHi::from(CodeDB::empty_code_hash().to_word())), )?; self.callee_not_exists.assign_value( region, offset, - Value::known(Word::from(callee_code_hash)), + Value::known(WordLoHi::from(callee_code_hash)), )?; Ok(memory_expansion_gas_cost) } @@ -971,9 +972,9 @@ impl + Clone> SstoreGasGadget { value_prev: T, original_value: T, ) -> Self { - let value_eq_prev = IsEqualWordGadget::construct(cb, &value, &value_prev); - let original_eq_prev = IsEqualWordGadget::construct(cb, &original_value, &value_prev); - let original_is_zero = IsZeroWordGadget::construct(cb, &original_value); + let value_eq_prev = cb.is_eq_word(&value, &value_prev); + let original_eq_prev = cb.is_eq_word(&original_value, &value_prev); + let original_is_zero = cb.is_zero_word(&original_value); let warm_case_gas = select::expr( value_eq_prev.expr(), GasCost::WARM_ACCESS.expr(), @@ -1020,19 +1021,19 @@ impl + Clone> SstoreGasGadget { self.value_eq_prev.assign_value( region, offset, - Value::known(Word::from(value)), - Value::known(Word::from(value_prev)), + Value::known(WordLoHi::from(value)), + Value::known(WordLoHi::from(value_prev)), )?; self.original_eq_prev.assign_value( region, offset, - Value::known(Word::from(original_value)), - Value::known(Word::from(value_prev)), + Value::known(WordLoHi::from(original_value)), + Value::known(WordLoHi::from(value_prev)), )?; self.original_is_zero.assign_value( region, offset, - Value::known(Word::from(original_value)), + Value::known(WordLoHi::from(original_value)), )?; Ok(()) } @@ -1072,7 +1073,7 @@ pub(crate) fn cal_sstore_gas_cost_for_assignment( #[derive(Clone, Debug)] pub(crate) struct CommonErrorGadget { - rw_counter_end_of_reversion: WordCell, + rw_counter_end_of_reversion: WordLoHiCell, restore_context: RestoreContextGadget, } @@ -1097,7 +1098,7 @@ impl CommonErrorGadget { let rw_counter_end_of_reversion = cb.query_word_unchecked(); // rw_counter_end_of_reversion just used for read lookup, therefore skip range check // current call must be failed. - cb.call_context_lookup_read(None, CallContextFieldTag::IsSuccess, Word::zero()); + cb.call_context_lookup_read(None, CallContextFieldTag::IsSuccess, WordLoHi::zero()); cb.call_context_lookup_read( None, @@ -1191,7 +1192,7 @@ impl WordByteCapGadget { pub(crate) fn construct(cb: &mut EVMConstraintBuilder, cap: Expression) -> Self { let word = WordByteRangeGadget::construct(cb); let value = select::expr(word.overflow(), cap.expr(), word.valid_value()); - let lt_cap = LtGadget::construct(cb, value, cap); + let lt_cap = cb.is_lt(value, cap); Self { word, lt_cap } } @@ -1253,7 +1254,7 @@ impl WordByteRangeGadget { debug_assert!(VALID_BYTES < 32); let original = cb.query_word32(); - let not_overflow = IsZeroGadget::construct(cb, sum::expr(&original.limbs[VALID_BYTES..])); + let not_overflow = cb.is_zero(sum::expr(&original.limbs[VALID_BYTES..])); Self { original, @@ -1283,7 +1284,7 @@ impl WordByteRangeGadget { not::expr(self.not_overflow()) } - pub(crate) fn original(&self) -> Word> { + pub(crate) fn original(&self) -> WordLoHi> { self.original.to_word() } @@ -1369,6 +1370,7 @@ impl RwTablePaddingGadget { let total_rwc = u64::from(step.rwc) - 1; self.is_empty_rwc .assign(region, offset, F::from(total_rwc))?; + let max_rws = F::from(chunk.fixed_param.max_rws as u64); let max_rws_assigned = self.max_rws.assign(region, offset, Value::known(max_rws))?; diff --git a/zkevm-circuits/src/evm_circuit/util/constraint_builder.rs b/zkevm-circuits/src/evm_circuit/util/constraint_builder.rs index 51a125a1f4..eb52e13092 100644 --- a/zkevm-circuits/src/evm_circuit/util/constraint_builder.rs +++ b/zkevm-circuits/src/evm_circuit/util/constraint_builder.rs @@ -1,3 +1,10 @@ +use super::{ + math_gadget::{ + ConstantDivisionGadget, IsEqualGadget, IsEqualWordGadget, IsZeroGadget, IsZeroWordGadget, + LtGadget, LtWordGadget, MinMaxGadget, + }, + rlc, AccountAddress, CachedRegion, CellType, MemoryAddress, StoredExpression, U64Cell, +}; use crate::{ evm_circuit::{ param::STACK_CAPACITY, @@ -11,14 +18,14 @@ use crate::{ }, util::{ build_tx_log_expression, query_expression, - word::{Word, Word32, Word32Cell, WordCell, WordExpr}, + word::{Word32, Word32Cell, WordExpr, WordLoHi, WordLoHiCell}, Challenges, Expr, }, }; use bus_mapping::{ circuit_input_builder::FeatureConfig, operation::Target, state_db::EMPTY_CODE_HASH_LE, }; -use eth_types::Field; +use eth_types::{Field, OpsIdentity}; use gadgets::util::{not, sum}; use halo2_proofs::{ circuit::Value, @@ -29,10 +36,6 @@ use halo2_proofs::{ }, }; -use super::{ - rlc, AccountAddress, CachedRegion, CellType, MemoryAddress, StoredExpression, U64Cell, -}; - // Max degree allowed in all expressions passing through the ConstraintBuilder. // It aims to cap `extended_k` to 2, which allows constraint degree to 2^2+1, // but each ExecutionGadget has implicit selector degree 3, so here it only @@ -59,7 +62,7 @@ pub(crate) struct StepStateTransition { pub(crate) call_id: Transition>, pub(crate) is_root: Transition>, pub(crate) is_create: Transition>, - pub(crate) code_hash: Transition>>, + pub(crate) code_hash: Transition>>, pub(crate) program_counter: Transition>, pub(crate) stack_pointer: Transition>, pub(crate) gas_left: Transition>, @@ -180,15 +183,15 @@ pub(crate) trait ConstrainBuilderCommon { self.add_constraint(name, constraint); } - fn require_zero_word(&mut self, name: &'static str, word: Word>) { - self.require_equal_word(name, word, Word::zero()); + fn require_zero_word(&mut self, name: &'static str, word: WordLoHi>) { + self.require_equal_word(name, word, WordLoHi::zero()); } fn require_equal_word( &mut self, name: &'static str, - lhs: Word>, - rhs: Word>, + lhs: WordLoHi>, + rhs: WordLoHi>, ) { let (lhs_lo, lhs_hi) = lhs.to_lo_hi(); let (rhs_lo, rhs_hi) = rhs.to_lo_hi(); @@ -220,7 +223,8 @@ pub(crate) trait ConstrainBuilderCommon { .fold(1.expr(), |acc, item| acc * (value.clone() - item.clone())), ); } - + /// Under active development + #[allow(dead_code)] fn add_constraints(&mut self, constraints: Vec<(&'static str, Expression)>) { for (name, constraint) in constraints { self.add_constraint(name, constraint); @@ -459,8 +463,8 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { } // default query_word is 2 limbs. Each limb is not guaranteed to be 128 bits. - pub fn query_word_unchecked(&mut self) -> WordCell { - Word::new( + pub fn query_word_unchecked(&mut self) -> WordLoHiCell { + WordLoHi::new( self.query_cells(CellType::StoragePhase1, 2) .try_into() .unwrap(), @@ -527,7 +531,7 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { rlc::expr(&bytes, self.challenges.keccak_input()) } - pub(crate) fn empty_code_hash(&self) -> Word> { + pub(crate) fn empty_code_hash(&self) -> WordLoHi> { Word32::new(EMPTY_CODE_HASH_LE.map(|byte| byte.expr())).to_word() } @@ -618,6 +622,60 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { constrain!(log_id); } + // Math gadgets + + pub(crate) fn is_zero(&mut self, value: Expression) -> IsZeroGadget { + IsZeroGadget::construct(self, value) + } + + pub(crate) fn is_zero_word>(&mut self, value: &T) -> IsZeroWordGadget { + IsZeroWordGadget::construct(self, value) + } + + pub(crate) fn is_eq(&mut self, lhs: Expression, rhs: Expression) -> IsEqualGadget { + IsEqualGadget::construct(self, lhs, rhs) + } + + pub(crate) fn is_eq_word, T2: WordExpr>( + &mut self, + lhs: &T1, + rhs: &T2, + ) -> IsEqualWordGadget { + IsEqualWordGadget::construct(self, lhs, rhs) + } + + pub(crate) fn is_lt( + &mut self, + lhs: Expression, + rhs: Expression, + ) -> LtGadget { + LtGadget::construct(self, lhs, rhs) + } + + pub(crate) fn is_lt_word + Clone>( + &mut self, + lhs: &WordLoHi, + rhs: &WordLoHi, + ) -> LtWordGadget { + LtWordGadget::construct(self, lhs, rhs) + } + + pub(crate) fn min_max( + &mut self, + lhs: Expression, + rhs: Expression, + ) -> MinMaxGadget { + MinMaxGadget::construct(self, lhs, rhs) + } + + pub(crate) fn div_by_const( + &mut self, + numerator: Expression, + denominator: u64, + ) -> ConstantDivisionGadget { + ConstantDivisionGadget::construct(self, numerator, denominator) + } + // Fixed pub(crate) fn range_lookup(&mut self, value: Expression, range: u64) { @@ -701,7 +759,7 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { pub(crate) fn bytecode_lookup( &mut self, - code_hash: Word>, + code_hash: WordLoHi>, index: Expression, is_code: Expression, value: Expression, @@ -718,7 +776,11 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { ) } - pub(crate) fn bytecode_length(&mut self, code_hash: Word>, value: Expression) { + pub(crate) fn bytecode_length( + &mut self, + code_hash: WordLoHi>, + value: Expression, + ) { self.add_lookup( "Bytecode (length)", Lookup::Bytecode { @@ -741,7 +803,12 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { ) -> Cell { let cell = self.query_cell(); // lookup read, unchecked is safe - self.tx_context_lookup(id, field_tag, index, Word::from_lo_unchecked(cell.expr())); + self.tx_context_lookup( + id, + field_tag, + index, + WordLoHi::from_lo_unchecked(cell.expr()), + ); cell } pub(crate) fn tx_context_as_word32( @@ -760,7 +827,7 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { id: Expression, field_tag: TxContextFieldTag, index: Option>, - ) -> WordCell { + ) -> WordLoHiCell { let word = self.query_word_unchecked(); self.tx_context_lookup(id, field_tag, index, word.to_word()); word @@ -771,7 +838,7 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { id: Expression, field_tag: TxContextFieldTag, index: Option>, - value: Word>, + value: WordLoHi>, ) { self.add_lookup( "Tx lookup", @@ -789,7 +856,7 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { &mut self, tag: Expression, number: Option>, - val: Word>, + val: WordLoHi>, ) { self.add_lookup( "Block lookup", @@ -890,7 +957,7 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { pub(crate) fn account_access_list_write_unchecked( &mut self, tx_id: Expression, - account_address: Word>, + account_address: WordLoHi>, value: Expression, value_prev: Expression, reversion_info: Option<&mut ReversionInfo>, @@ -902,10 +969,10 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { tx_id, account_address.compress(), 0.expr(), - Word::zero(), - Word::from_lo_unchecked(value), - Word::from_lo_unchecked(value_prev), - Word::zero(), + WordLoHi::zero(), + WordLoHi::from_lo_unchecked(value), + WordLoHi::from_lo_unchecked(value_prev), + WordLoHi::zero(), ), reversion_info, ); @@ -914,7 +981,7 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { pub(crate) fn account_access_list_read( &mut self, tx_id: Expression, - account_address: Word>, + account_address: WordLoHi>, value: Expression, ) { self.rw_lookup( @@ -925,20 +992,20 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { tx_id, account_address.compress(), 0.expr(), - Word::zero(), - Word::from_lo_unchecked(value.clone()), - Word::from_lo_unchecked(value), - Word::zero(), + WordLoHi::zero(), + WordLoHi::from_lo_unchecked(value.clone()), + WordLoHi::from_lo_unchecked(value), + WordLoHi::zero(), ), ); } pub(crate) fn account_storage_access_list_write( &mut self, tx_id: Expression, - account_address: Word>, - storage_key: Word>, - value: Word>, - value_prev: Word>, + account_address: WordLoHi>, + storage_key: WordLoHi>, + value: WordLoHi>, + value_prev: WordLoHi>, reversion_info: Option<&mut ReversionInfo>, ) { self.reversible_write( @@ -951,7 +1018,7 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { storage_key, value, value_prev, - Word::zero(), + WordLoHi::zero(), ), reversion_info, ); @@ -960,9 +1027,9 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { pub(crate) fn account_storage_access_list_read( &mut self, tx_id: Expression, - account_address: Word>, - storage_key: Word>, - value: Word>, + account_address: WordLoHi>, + storage_key: WordLoHi>, + value: WordLoHi>, ) { self.rw_lookup( "TxAccessListAccountStorage read", @@ -975,14 +1042,14 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { storage_key, value.clone(), value, - Word::zero(), + WordLoHi::zero(), ), ); } // Tx Refund - pub(crate) fn tx_refund_read(&mut self, tx_id: Expression, value: Word>) { + pub(crate) fn tx_refund_read(&mut self, tx_id: Expression, value: WordLoHi>) { self.rw_lookup( "TxRefund read", false.expr(), @@ -991,10 +1058,10 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { tx_id, 0.expr(), 0.expr(), - Word::zero(), + WordLoHi::zero(), value.clone(), value, - Word::zero(), + WordLoHi::zero(), ), ); } @@ -1002,8 +1069,8 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { pub(crate) fn tx_refund_write( &mut self, tx_id: Expression, - value: Word>, - value_prev: Word>, + value: WordLoHi>, + value_prev: WordLoHi>, reversion_info: Option<&mut ReversionInfo>, ) { self.reversible_write( @@ -1013,10 +1080,10 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { tx_id, 0.expr(), 0.expr(), - Word::zero(), + WordLoHi::zero(), value, value_prev, - Word::zero(), + WordLoHi::zero(), ), reversion_info, ); @@ -1025,9 +1092,9 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { // Account pub(crate) fn account_read( &mut self, - account_address: Word>, + account_address: WordLoHi>, field_tag: AccountFieldTag, - value: Word>, + value: WordLoHi>, ) { self.rw_lookup( "Account read", @@ -1037,20 +1104,20 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { 0.expr(), account_address.compress(), field_tag.expr(), - Word::zero(), + WordLoHi::zero(), value.clone(), value, - Word::zero(), + WordLoHi::zero(), ), ); } pub(crate) fn account_write( &mut self, - account_address: Word>, + account_address: WordLoHi>, field_tag: AccountFieldTag, - value: Word>, - value_prev: Word>, + value: WordLoHi>, + value_prev: WordLoHi>, reversion_info: Option<&mut ReversionInfo>, ) { self.reversible_write( @@ -1060,10 +1127,10 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { 0.expr(), account_address.compress(), field_tag.expr(), - Word::zero(), + WordLoHi::zero(), value, value_prev, - Word::zero(), + WordLoHi::zero(), ), reversion_info, ); @@ -1072,11 +1139,11 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { // Account Storage pub(crate) fn account_storage_read( &mut self, - account_address: Word>, - key: Word>, - value: Word>, + account_address: WordLoHi>, + key: WordLoHi>, + value: WordLoHi>, tx_id: Expression, - committed_value: Word>, + committed_value: WordLoHi>, ) { self.rw_lookup( "account_storage_read", @@ -1097,12 +1164,12 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { #[allow(clippy::too_many_arguments)] pub(crate) fn account_storage_write( &mut self, - account_address: Word>, - key: Word>, - value: Word>, - value_prev: Word>, + account_address: WordLoHi>, + key: WordLoHi>, + value: WordLoHi>, + value_prev: WordLoHi>, tx_id: Expression, - committed_value: Word>, + committed_value: WordLoHi>, reversion_info: Option<&mut ReversionInfo>, ) { self.reversible_write( @@ -1135,7 +1202,7 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { self.call_context_lookup_read( call_id, field_tag, - Word::from_lo_unchecked(cell.expr()), // lookup read, unchecked is safe + WordLoHi::from_lo_unchecked(cell.expr()), // lookup read, unchecked is safe ); cell } @@ -1144,7 +1211,7 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { &mut self, call_id: Option>, field_tag: CallContextFieldTag, - ) -> Word> { + ) -> WordLoHi> { let word = self.query_word_unchecked(); self.call_context_lookup_read(call_id, field_tag, word.to_word()); word @@ -1154,7 +1221,7 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { &mut self, call_id: Option>, field_tag: CallContextFieldTag, - value: Word>, + value: WordLoHi>, ) { self.rw_lookup( "CallContext lookup", @@ -1164,10 +1231,10 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { call_id.unwrap_or_else(|| self.curr.state.call_id.expr()), 0.expr(), field_tag.expr(), - Word::zero(), + WordLoHi::zero(), value, - Word::zero(), - Word::zero(), + WordLoHi::zero(), + WordLoHi::zero(), ), ); } @@ -1179,7 +1246,7 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { rw_counter: Expression, call_id: Option>, field_tag: CallContextFieldTag, - value: Word>, + value: WordLoHi>, ) { self.rw_lookup_with_counter( "CallContext lookup", @@ -1190,10 +1257,10 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { call_id.unwrap_or_else(|| self.curr.state.call_id.expr()), 0.expr(), field_tag.expr(), - Word::zero(), + WordLoHi::zero(), value, - Word::zero(), - Word::zero(), + WordLoHi::zero(), + WordLoHi::zero(), ), ); } @@ -1202,7 +1269,7 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { &mut self, call_id: Option>, field_tag: CallContextFieldTag, - value: Word>, + value: WordLoHi>, ) { self.rw_lookup( "CallContext lookup", @@ -1212,10 +1279,10 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { call_id.unwrap_or_else(|| self.curr.state.call_id.expr()), 0.expr(), field_tag.expr(), - Word::zero(), + WordLoHi::zero(), value, - Word::zero(), - Word::zero(), + WordLoHi::zero(), + WordLoHi::zero(), ), ); } @@ -1235,13 +1302,13 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { self.call_context_lookup_write( call_id.clone(), field_tag, - Word::from_lo_unchecked(cell.expr()), + WordLoHi::from_lo_unchecked(cell.expr()), ); } else { self.call_context_lookup_read( call_id.clone(), field_tag, - Word::from_lo_unchecked(cell.expr()), + WordLoHi::from_lo_unchecked(cell.expr()), ); } @@ -1274,12 +1341,12 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { } // Stack - pub(crate) fn stack_pop(&mut self, value: Word>) { + pub(crate) fn stack_pop(&mut self, value: WordLoHi>) { self.stack_lookup(false.expr(), self.stack_pointer_offset.clone(), value); self.stack_pointer_offset = self.stack_pointer_offset.clone() + self.condition_expr(); } - pub(crate) fn stack_push(&mut self, value: Word>) { + pub(crate) fn stack_push(&mut self, value: WordLoHi>) { self.stack_pointer_offset = self.stack_pointer_offset.clone() - self.condition_expr(); self.stack_lookup(true.expr(), self.stack_pointer_offset.expr(), value); } @@ -1288,7 +1355,7 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { &mut self, is_write: Expression, stack_pointer_offset: Expression, - value: Word>, + value: WordLoHi>, ) { self.rw_lookup( "Stack lookup", @@ -1298,10 +1365,10 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { self.curr.state.call_id.expr(), self.curr.state.stack_pointer.expr() + stack_pointer_offset, 0.expr(), - Word::zero(), + WordLoHi::zero(), value, - Word::zero(), - Word::zero(), + WordLoHi::zero(), + WordLoHi::zero(), ), ); } @@ -1323,11 +1390,11 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { call_id.unwrap_or_else(|| self.curr.state.call_id.expr()), memory_address, 0.expr(), - Word::zero(), + WordLoHi::zero(), // TODO assure range check since write=true also possible - Word::from_lo_unchecked(byte), - Word::zero(), - Word::zero(), + WordLoHi::from_lo_unchecked(byte), + WordLoHi::zero(), + WordLoHi::zero(), ), ); } @@ -1338,7 +1405,7 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { log_id: Expression, field_tag: TxLogFieldTag, index: Expression, - value: Word>, + value: WordLoHi>, ) { self.rw_lookup( "log data lookup", @@ -1348,10 +1415,10 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { tx_id, build_tx_log_expression(index, field_tag.expr(), log_id), 0.expr(), - Word::zero(), + WordLoHi::zero(), value, - Word::zero(), - Word::zero(), + WordLoHi::zero(), + WordLoHi::zero(), ), ); } @@ -1372,11 +1439,11 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { tx_id, 0.expr(), tag.expr(), - Word::zero(), + WordLoHi::zero(), // TODO assure range check since write=true also possible - Word::from_lo_unchecked(value), - Word::zero(), - Word::zero(), + WordLoHi::from_lo_unchecked(value), + WordLoHi::zero(), + WordLoHi::zero(), ), ); } @@ -1404,14 +1471,14 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { 0.expr(), 0.expr(), StepStateFieldTag::CodeHash.expr(), - Word::zero(), + WordLoHi::zero(), self.curr.state.code_hash.to_word(), - Word::zero(), - Word::zero(), + WordLoHi::zero(), + WordLoHi::zero(), ), ); - vec![ + [ ( "StepState lookup CallID", self.curr.state.call_id.clone(), @@ -1468,10 +1535,10 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { 0.expr(), 0.expr(), field_tag.expr(), - Word::zero(), - Word::from_lo_unchecked(cell.expr()), - Word::zero(), - Word::zero(), + WordLoHi::zero(), + WordLoHi::from_lo_unchecked(cell.expr()), + WordLoHi::zero(), + WordLoHi::zero(), ), ); }); @@ -1489,10 +1556,10 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { 0.expr(), 0.expr(), 0.expr(), - Word::zero(), - Word::zero(), - Word::zero(), - Word::zero(), + WordLoHi::zero(), + WordLoHi::zero(), + WordLoHi::zero(), + WordLoHi::zero(), ), ); } @@ -1509,10 +1576,10 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { 0.expr(), 0.expr(), 0.expr(), - Word::zero(), - Word::zero(), - Word::zero(), - Word::zero(), + WordLoHi::zero(), + WordLoHi::zero(), + WordLoHi::zero(), + WordLoHi::zero(), ), ); } @@ -1522,9 +1589,9 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { #[allow(clippy::too_many_arguments)] pub(crate) fn copy_table_lookup( &mut self, - src_id: Word>, + src_id: WordLoHi>, src_tag: Expression, - dst_id: Word>, + dst_id: WordLoHi>, dst_tag: Expression, src_addr: Expression, src_addr_end: Expression, @@ -1576,12 +1643,35 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { ); } - // Keccak Table + /// Sig Table + pub(crate) fn sig_table_lookup( + &mut self, + msg_hash: WordLoHi>, + sig_v: Expression, + sig_r: WordLoHi>, + sig_s: WordLoHi>, + recovered_addr: Expression, + is_valid: Expression, + ) { + self.add_lookup( + "sig table", + Lookup::SigTable { + msg_hash, + sig_v, + sig_r, + sig_s, + recovered_addr, + is_valid, + }, + ); + } + + /// Keccak Table pub(crate) fn keccak_table_lookup( &mut self, input_rlc: Expression, input_len: Expression, - output: Word>, + output: WordLoHi>, ) { self.add_lookup( "keccak lookup", @@ -1624,7 +1714,7 @@ impl<'a, F: Field> EVMConstraintBuilder<'a, F> { /// and constrain it using the provided respective constraint. This mechanism is specifically /// used for constraining the internal states for precompile calls. Each precompile call /// expects a different cell layout, but since the next state can be at the most one precompile - /// state, we can re-use cells assgined across all thos conditions. + /// state, we can re-use cells assigned across all those conditions. pub(crate) fn constrain_mutually_exclusive_next_step( &mut self, conditions: Vec>, diff --git a/zkevm-circuits/src/evm_circuit/util/instrumentation.rs b/zkevm-circuits/src/evm_circuit/util/instrumentation.rs index 986fa2ca16..5c820dea92 100644 --- a/zkevm-circuits/src/evm_circuit/util/instrumentation.rs +++ b/zkevm-circuits/src/evm_circuit/util/instrumentation.rs @@ -37,7 +37,7 @@ impl Instrument { self.states.push((execution_state, sizes)); } - /// Dissasembles the instrumentation data and returns a collection of + /// Disassembles the instrumentation data and returns a collection of /// `ExecStateReport`s. One for each EVM `ExecutionState`. pub fn analyze(&self) -> Vec { let mut report_collection = vec![]; @@ -104,6 +104,9 @@ impl Instrument { CellType::Lookup(Table::Exp) => { report.exp_table = data_entry; } + CellType::Lookup(Table::Sig) => { + report.sig_table = data_entry; + } CellType::Lookup(Table::ChunkCtx) => { report.chunk_ctx_table = data_entry; } @@ -116,7 +119,7 @@ impl Instrument { } /// Struct which contains a Cost/ColumnType report for a particular EVM -/// `ExecutionStep`. +/// [`ExecStep`](bus_mapping::circuit_input_builder::ExecStep). #[derive(Clone, Debug, Default)] pub struct ExecStateReport { pub state: ExecutionState, @@ -134,6 +137,7 @@ pub struct ExecStateReport { pub copy_table: StateReportRow, pub keccak_table: StateReportRow, pub exp_table: StateReportRow, + pub sig_table: StateReportRow, pub chunk_ctx_table: StateReportRow, } diff --git a/zkevm-circuits/src/evm_circuit/util/math_gadget/abs_word.rs b/zkevm-circuits/src/evm_circuit/util/math_gadget/abs_word.rs index 119e7d77a2..7778c33950 100644 --- a/zkevm-circuits/src/evm_circuit/util/math_gadget/abs_word.rs +++ b/zkevm-circuits/src/evm_circuit/util/math_gadget/abs_word.rs @@ -38,7 +38,7 @@ impl AbsWordGadget { let sum = cb.query_word32(); let (x_lo, x_hi) = x.to_word().to_lo_hi(); let (x_abs_lo, x_abs_hi) = x_abs.to_word().to_lo_hi(); - let is_neg = LtGadget::construct(cb, 127.expr(), x.limbs[31].expr()); + let is_neg = cb.is_lt(127.expr(), x.limbs[31].expr()); cb.add_constraint( "x_abs_lo == x_lo when x >= 0", diff --git a/zkevm-circuits/src/evm_circuit/util/math_gadget/add_words.rs b/zkevm-circuits/src/evm_circuit/util/math_gadget/add_words.rs index 8ad2e86284..0978d32ab8 100644 --- a/zkevm-circuits/src/evm_circuit/util/math_gadget/add_words.rs +++ b/zkevm-circuits/src/evm_circuit/util/math_gadget/add_words.rs @@ -221,27 +221,27 @@ mod tests { #[test] fn test_addwords_0_0() { - try_test!(AddWordsTestContainer, vec![Word::from(0), Word::from(0), Word::from(0)], true); + try_test!(AddWordsTestContainer, [Word::from(0), Word::from(0), Word::from(0)], true); } #[test] fn test_addwords_1_1() { - try_test!(AddWordsTestContainer, vec![Word::from(1), Word::from(1), Word::from(2)], true); + try_test!(AddWordsTestContainer, [Word::from(1), Word::from(1), Word::from(2)], true); } #[test] fn test_addwords_1000_1000() { - try_test!(AddWordsTestContainer, vec![Word::from(1000), Word::from(1000), Word::from(2000)], true); + try_test!(AddWordsTestContainer, [Word::from(1000), Word::from(1000), Word::from(2000)], true); } #[test] fn test_addwords_to_wordmax() { - try_test!(AddWordsTestContainer, vec![Word::MAX - 1, Word::from(1), Word::MAX], true); + try_test!(AddWordsTestContainer, [Word::MAX - 1, Word::from(1), Word::MAX], true); } #[test] fn test_addwords_high_low_max() { - try_test!(AddWordsTestContainer, vec![WORD_LOW_MAX, WORD_HIGH_MAX, Word::MAX], true); + try_test!(AddWordsTestContainer, [WORD_LOW_MAX, WORD_HIGH_MAX, Word::MAX], true); } #[test] @@ -291,7 +291,7 @@ mod tests { let sum_7_low_max = U256([0xfffffffffffffff9u64, 0xffffffffffffffffu64, CARRY_HI, 0u64]); try_test!( AddWordsTestContainer, - vec![ + [ WORD_LOW_MAX, WORD_LOW_MAX, WORD_LOW_MAX, diff --git a/zkevm-circuits/src/evm_circuit/util/math_gadget/byte_size.rs b/zkevm-circuits/src/evm_circuit/util/math_gadget/byte_size.rs index 1d82f26f0d..34f86127ec 100644 --- a/zkevm-circuits/src/evm_circuit/util/math_gadget/byte_size.rs +++ b/zkevm-circuits/src/evm_circuit/util/math_gadget/byte_size.rs @@ -86,7 +86,7 @@ impl ByteSizeGadget { region, offset, Value::known( - F::from(u64::try_from(most_significant_nonzero_byte).unwrap()) + F::from(u64::from(most_significant_nonzero_byte)) .invert() .unwrap(), ), @@ -157,18 +157,18 @@ mod tests { #[test] fn test_bytesize_0() { - try_test!(ByteSizeGadgetContainer, vec![Word::from(0)], true) + try_test!(ByteSizeGadgetContainer, [Word::from(0)], true) } #[test] fn test_bytesize_1() { - try_test!(ByteSizeGadgetContainer, vec![Word::from(1)], true) + try_test!(ByteSizeGadgetContainer, [Word::from(1)], true) } #[test] fn test_bytesize_1_neq_0() { try_test!(ByteSizeGadgetContainer, - vec![Word::from(1)], + [Word::from(1)], false ); } @@ -176,13 +176,13 @@ mod tests { #[test] fn test_bytesize_256_eq_2() { try_test!(ByteSizeGadgetContainer, - vec![Word::from(256)], + [Word::from(256)], true ); } #[test] fn test_bytesize_wordmax_eq_32() { - try_test!(ByteSizeGadgetContainer, vec![Word::MAX], true) + try_test!(ByteSizeGadgetContainer, [Word::MAX], true) } } diff --git a/zkevm-circuits/src/evm_circuit/util/math_gadget/cmp_words.rs b/zkevm-circuits/src/evm_circuit/util/math_gadget/cmp_words.rs index ed170d9c64..c7b3e0288e 100644 --- a/zkevm-circuits/src/evm_circuit/util/math_gadget/cmp_words.rs +++ b/zkevm-circuits/src/evm_circuit/util/math_gadget/cmp_words.rs @@ -80,7 +80,7 @@ impl, T2: WordExpr> CmpWordsGadget { mod tests { use super::{test_util::*, *}; use crate::{ - evm_circuit::util::constraint_builder::ConstrainBuilderCommon, util::word::WordCell, + evm_circuit::util::constraint_builder::ConstrainBuilderCommon, util::word::WordLoHiCell, }; use eth_types::Word; use halo2_proofs::{halo2curves::bn256::Fr, plonk::Error}; @@ -88,9 +88,9 @@ mod tests { #[derive(Clone)] /// CmpWordGadgetTestContainer: require(a == b if CHECK_EQ else a < b) struct CmpWordGadgetTestContainer { - cmp_gadget: CmpWordsGadget, WordCell>, - a_word: WordCell, - b_word: WordCell, + cmp_gadget: CmpWordsGadget, WordLoHiCell>, + a_word: WordLoHiCell, + b_word: WordLoHiCell, } impl MathGadgetContainer @@ -141,7 +141,7 @@ mod tests { // a == b check try_test!( CmpWordGadgetTestContainer, - vec![Word::from(0), Word::from(0)], + [Word::from(0), Word::from(0)], true, ); } @@ -150,7 +150,7 @@ mod tests { fn test_cmpword_1_eq() { try_test!( CmpWordGadgetTestContainer, - vec![Word::from(1), Word::from(1)], + [Word::from(1), Word::from(1)], true, ); } @@ -159,7 +159,7 @@ mod tests { fn test_cmpword_wordmax_eq() { try_test!( CmpWordGadgetTestContainer, - vec![Word::MAX, Word::MAX], + [Word::MAX, Word::MAX], true, ); } @@ -168,7 +168,7 @@ mod tests { fn test_cmpword_0_neq_wordmax() { try_test!( CmpWordGadgetTestContainer, - vec![Word::from(0), Word::MAX], + [Word::from(0), Word::MAX], false, ); } @@ -178,7 +178,7 @@ mod tests { fn test_cmpword_0_lt_1() { try_test!( CmpWordGadgetTestContainer, - vec![Word::from(0), Word::from(1)], + [Word::from(0), Word::from(1)], true, ); } @@ -187,7 +187,7 @@ mod tests { fn test_cmpword_1_lt_wordmax() { try_test!( CmpWordGadgetTestContainer, - vec![Word::from(1), Word::MAX], + [Word::from(1), Word::MAX], true, ); } @@ -196,7 +196,7 @@ mod tests { fn test_cmpword_1_lt_0() { try_test!( CmpWordGadgetTestContainer, - vec![Word::from(1), Word::from(0)], + [Word::from(1), Word::from(0)], false, ); } @@ -205,7 +205,7 @@ mod tests { fn test_cmpword_lowmax_lt_highmax() { try_test!( CmpWordGadgetTestContainer, - vec![WORD_LOW_MAX, WORD_HIGH_MAX], + [WORD_LOW_MAX, WORD_HIGH_MAX], true, ); } @@ -214,7 +214,7 @@ mod tests { fn test_cmpword_highmax_lt_lowmax() { try_test!( CmpWordGadgetTestContainer, - vec![WORD_HIGH_MAX, WORD_LOW_MAX], + [WORD_HIGH_MAX, WORD_LOW_MAX], false, ); } diff --git a/zkevm-circuits/src/evm_circuit/util/math_gadget/comparison.rs b/zkevm-circuits/src/evm_circuit/util/math_gadget/comparison.rs index 5568ec54c4..60e4e4ea5d 100644 --- a/zkevm-circuits/src/evm_circuit/util/math_gadget/comparison.rs +++ b/zkevm-circuits/src/evm_circuit/util/math_gadget/comparison.rs @@ -21,8 +21,8 @@ impl ComparisonGadget { lhs: Expression, rhs: Expression, ) -> Self { - let lt = LtGadget::::construct(cb, lhs, rhs); - let eq = IsZeroGadget::::construct(cb, sum::expr(<.diff_bytes())); + let lt = cb.is_lt(lhs, rhs); + let eq = cb.is_zero(sum::expr(<.diff_bytes())); Self { lt, eq } } @@ -107,7 +107,7 @@ mod tests { // a == b check try_test!( ComparisonTestContainer, - vec![Word::from(0), Word::from(0)], + [Word::from(0), Word::from(0)], true, ); } @@ -116,7 +116,7 @@ mod tests { fn test_comparison_1_eq() { try_test!( ComparisonTestContainer, - vec![Word::from(1), Word::from(1)], + [Word::from(1), Word::from(1)], true, ); } @@ -125,7 +125,7 @@ mod tests { fn test_comparison_max_eq() { try_test!( ComparisonTestContainer, - vec![Word::from(1 << 4), Word::from(1 << 4)], + [Word::from(1 << 4), Word::from(1 << 4)], true, ); } @@ -134,7 +134,7 @@ mod tests { fn test_comparison_0_neq_max() { try_test!( ComparisonTestContainer, - vec![Word::from(0), Word::from(1 << 4)], + [Word::from(0), Word::from(1 << 4)], false, ); } @@ -144,7 +144,7 @@ mod tests { fn test_comparison_0_lt_1() { try_test!( ComparisonTestContainer, - vec![Word::from(0), Word::from(1)], + [Word::from(0), Word::from(1)], true, ); } @@ -153,7 +153,7 @@ mod tests { fn test_comparison_1_lt_max() { try_test!( ComparisonTestContainer, - vec![Word::from(1), Word::from(1 << 4)], + [Word::from(1), Word::from(1 << 4)], true, ); } @@ -162,7 +162,7 @@ mod tests { fn test_comparison_1_lt_0() { try_test!( ComparisonTestContainer, - vec![Word::from(1), Word::from(0)], + [Word::from(1), Word::from(0)], false, ); } @@ -174,13 +174,13 @@ mod tests { let half_max_hi = U256([0, u64::MAX, 0, 0]); try_test!( ComparisonTestContainer, - vec![half_max_lo, half_max_hi], + [half_max_lo, half_max_hi], true, ); try_test!( ComparisonTestContainer, - vec![half_max_hi, half_max_lo], + [half_max_hi, half_max_lo], false, ); } @@ -189,7 +189,7 @@ mod tests { fn test_comparison_overflow() { try_test!( ComparisonTestContainer, - vec![Word::from(10000), Word::from(1 << (4 + 1))], + [Word::from(10000), Word::from(1 << (4 + 1))], false, ); } diff --git a/zkevm-circuits/src/evm_circuit/util/math_gadget/constant_division.rs b/zkevm-circuits/src/evm_circuit/util/math_gadget/constant_division.rs index dff6e51a6b..ed32eae807 100644 --- a/zkevm-circuits/src/evm_circuit/util/math_gadget/constant_division.rs +++ b/zkevm-circuits/src/evm_circuit/util/math_gadget/constant_division.rs @@ -154,7 +154,7 @@ mod tests { fn test_constantdivisiongadget_0div5_rem0() { try_test!( ConstantDivisionTestContainer, - vec![Word::from(0)], + [Word::from(0)], true, ); } @@ -163,7 +163,7 @@ mod tests { fn test_constantdivisiongadget_5div5_rem0() { try_test!( ConstantDivisionTestContainer, - vec![Word::from(5)], + [Word::from(5)], true, ); } @@ -172,7 +172,7 @@ mod tests { fn test_constantdivisiongadget_1div5_rem1() { try_test!( ConstantDivisionTestContainer, - vec![Word::from(1)], + [Word::from(1)], true, ); } @@ -181,7 +181,7 @@ mod tests { fn test_constantdivisiongadget_1div5_rem4() { try_test!( ConstantDivisionTestContainer, - vec![Word::from(1)], + [Word::from(1)], false, ); } @@ -190,7 +190,7 @@ mod tests { fn test_constantdivisiongadget_quotient_overflow() { try_test!( ConstantDivisionTestContainer, - vec![Word::from(1u64 << (4 * 8)) * 5 + 1], + [Word::from(1u64 << (4 * 8)) * 5 + 1], false, ); } @@ -199,7 +199,7 @@ mod tests { fn test_constantdivisiongadget_33_div16_rem17() { try_test!( ConstantDivisionTestContainer, - vec![Word::from(33)], + [Word::from(33)], false, ); } diff --git a/zkevm-circuits/src/evm_circuit/util/math_gadget/is_equal.rs b/zkevm-circuits/src/evm_circuit/util/math_gadget/is_equal.rs index f0ddb64048..8e26ccf089 100644 --- a/zkevm-circuits/src/evm_circuit/util/math_gadget/is_equal.rs +++ b/zkevm-circuits/src/evm_circuit/util/math_gadget/is_equal.rs @@ -16,7 +16,7 @@ impl IsEqualGadget { lhs: Expression, rhs: Expression, ) -> Self { - let is_zero = IsZeroGadget::construct(cb, lhs - rhs); + let is_zero = cb.is_zero(lhs - rhs); Self { is_zero } } @@ -83,7 +83,7 @@ mod tests { fn test_isequal_0() { try_test!( IsEqualGadgetTestContainer, - vec![Word::from(0), Word::from(0)], + [Word::from(0), Word::from(0)], true, ); } @@ -92,7 +92,7 @@ mod tests { fn test_isequal_1() { try_test!( IsEqualGadgetTestContainer, - vec![Word::from(1), Word::from(1)], + [Word::from(1), Word::from(1)], true, ); } @@ -101,7 +101,7 @@ mod tests { fn test_isequal_1000() { try_test!( IsEqualGadgetTestContainer, - vec![Word::from(1000), Word::from(1000)], + [Word::from(1000), Word::from(1000)], true, ); } @@ -110,7 +110,7 @@ mod tests { fn test_isequal_1_0() { try_test!( IsEqualGadgetTestContainer, - vec![Word::from(1), Word::from(0)], + [Word::from(1), Word::from(0)], false, ); } @@ -119,7 +119,7 @@ mod tests { fn test_isequal_0_1() { try_test!( IsEqualGadgetTestContainer, - vec![Word::from(0), Word::from(1)], + [Word::from(0), Word::from(1)], false, ); } diff --git a/zkevm-circuits/src/evm_circuit/util/math_gadget/is_equal_word.rs b/zkevm-circuits/src/evm_circuit/util/math_gadget/is_equal_word.rs index 5109d47061..b7bb201251 100644 --- a/zkevm-circuits/src/evm_circuit/util/math_gadget/is_equal_word.rs +++ b/zkevm-circuits/src/evm_circuit/util/math_gadget/is_equal_word.rs @@ -11,16 +11,16 @@ use crate::{ evm_circuit::util::{ constraint_builder::EVMConstraintBuilder, transpose_val_ret, CachedRegion, }, - util::word::{Word, WordExpr}, + util::word::{WordExpr, WordLoHi}, }; -use super::IsZeroGadget; +use super::IsEqualGadget; /// Returns `1` when `lhs == rhs`, and returns `0` otherwise. #[derive(Clone, Debug)] pub struct IsEqualWordGadget { - is_zero_lo: IsZeroGadget, - is_zero_hi: IsZeroGadget, + is_zero_lo: IsEqualGadget, + is_zero_hi: IsEqualGadget, _marker: PhantomData<(T1, T2)>, } @@ -28,8 +28,8 @@ impl, T2: WordExpr> IsEqualWordGadget { pub(crate) fn construct(cb: &mut EVMConstraintBuilder, lhs: &T1, rhs: &T2) -> Self { let (lhs_lo, lhs_hi) = lhs.to_word().to_lo_hi(); let (rhs_lo, rhs_hi) = rhs.to_word().to_lo_hi(); - let is_zero_lo = IsZeroGadget::construct(cb, lhs_lo - rhs_lo); - let is_zero_hi = IsZeroGadget::construct(cb, lhs_hi - rhs_hi); + let is_zero_lo = cb.is_eq(lhs_lo, rhs_lo); + let is_zero_hi = cb.is_eq(lhs_hi, rhs_hi); Self { is_zero_lo, @@ -46,13 +46,13 @@ impl, T2: WordExpr> IsEqualWordGadget { &self, region: &mut CachedRegion<'_, '_, F>, offset: usize, - lhs: Word, - rhs: Word, + lhs: WordLoHi, + rhs: WordLoHi, ) -> Result { let (lhs_lo, lhs_hi) = lhs.to_lo_hi(); let (rhs_lo, rhs_hi) = rhs.to_lo_hi(); - self.is_zero_lo.assign(region, offset, lhs_lo - rhs_lo)?; - self.is_zero_hi.assign(region, offset, lhs_hi - rhs_hi)?; + self.is_zero_lo.assign(region, offset, lhs_lo, rhs_lo)?; + self.is_zero_hi.assign(region, offset, lhs_hi, rhs_hi)?; Ok(F::from(2)) } @@ -60,8 +60,8 @@ impl, T2: WordExpr> IsEqualWordGadget { &self, region: &mut CachedRegion<'_, '_, F>, offset: usize, - lhs: Value>, - rhs: Value>, + lhs: Value>, + rhs: Value>, ) -> Result, Error> { transpose_val_ret( lhs.zip(rhs) @@ -76,7 +76,7 @@ impl, T2: WordExpr> IsEqualWordGadget { lhs: eth_types::Word, rhs: eth_types::Word, ) -> Result { - self.assign(region, offset, Word::from(lhs), Word::from(rhs)) + self.assign(region, offset, WordLoHi::from(lhs), WordLoHi::from(rhs)) } } diff --git a/zkevm-circuits/src/evm_circuit/util/math_gadget/is_zero.rs b/zkevm-circuits/src/evm_circuit/util/math_gadget/is_zero.rs index 5e88655313..c9fbcb4d42 100644 --- a/zkevm-circuits/src/evm_circuit/util/math_gadget/is_zero.rs +++ b/zkevm-circuits/src/evm_circuit/util/math_gadget/is_zero.rs @@ -100,20 +100,16 @@ mod tests { #[test] fn test_0_is_zero() { - try_test!(IsZeroGadgetTestContainer, vec![Word::from(0)], true); + try_test!(IsZeroGadgetTestContainer, [Word::from(0)], true); } #[test] fn test_1_is_not_zero() { - try_test!(IsZeroGadgetTestContainer, vec![Word::from(1)], false); + try_test!(IsZeroGadgetTestContainer, [Word::from(1)], false); } #[test] fn test_large_num_is_not_zero() { - try_test!( - IsZeroGadgetTestContainer, - vec![Word::from(10000)], - false, - ); + try_test!(IsZeroGadgetTestContainer, [Word::from(10000)], false,); } } diff --git a/zkevm-circuits/src/evm_circuit/util/math_gadget/is_zero_word.rs b/zkevm-circuits/src/evm_circuit/util/math_gadget/is_zero_word.rs index f74ccf6a96..47ee7c9ce0 100644 --- a/zkevm-circuits/src/evm_circuit/util/math_gadget/is_zero_word.rs +++ b/zkevm-circuits/src/evm_circuit/util/math_gadget/is_zero_word.rs @@ -12,7 +12,7 @@ use crate::{ constraint_builder::{ConstrainBuilderCommon, EVMConstraintBuilder}, transpose_val_ret, CachedRegion, Cell, CellType, }, - util::word::{Word, WordExpr}, + util::word::{WordExpr, WordLoHi}, }; /// Returns `1` when `word == 0`, and returns `0` otherwise. @@ -69,7 +69,7 @@ impl> IsZeroWordGadget { &self, region: &mut CachedRegion<'_, '_, F>, offset: usize, - value: Word, + value: WordLoHi, ) -> Result { let (value_lo, value_hi) = value.to_lo_hi(); let inverse_lo = value_lo.invert().unwrap_or(F::from(0)); @@ -91,14 +91,14 @@ impl> IsZeroWordGadget { offset: usize, value: eth_types::Word, ) -> Result { - self.assign(region, offset, Word::from(value)) + self.assign(region, offset, WordLoHi::from(value)) } pub(crate) fn assign_value( &self, region: &mut CachedRegion<'_, '_, F>, offset: usize, - value: Value>, + value: Value>, ) -> Result, Error> { transpose_val_ret(value.map(|value| self.assign(region, offset, value))) } diff --git a/zkevm-circuits/src/evm_circuit/util/math_gadget/lt.rs b/zkevm-circuits/src/evm_circuit/util/math_gadget/lt.rs index 51366b5480..5801141d59 100644 --- a/zkevm-circuits/src/evm_circuit/util/math_gadget/lt.rs +++ b/zkevm-circuits/src/evm_circuit/util/math_gadget/lt.rs @@ -148,12 +148,12 @@ mod tests { fn test_lt_expect() { try_test!( LtGadgetTestContainer, - vec![Word::from(0), Word::from(1)], + [Word::from(0), Word::from(1)], true, ); try_test!( LtGadgetTestContainer, - vec![Word::from(0), Word::from(0)], + [Word::from(0), Word::from(0)], false, ); } @@ -162,7 +162,7 @@ mod tests { fn test_lt_just_in_range() { try_test!( LtGadgetTestContainer, - vec![Word::from(1), Word::from((1u64 << (N * 8)) - 1)], + [Word::from(1), Word::from((1u64 << (N * 8)) - 1)], true, ); } @@ -171,7 +171,7 @@ mod tests { fn test_lt_out_of_range() { try_test!( LtGadgetTestContainer, - vec![Word::from(1), Word::from(2 << (N * 8))], + [Word::from(1), Word::from(2 << (N * 8))], false, ); } diff --git a/zkevm-circuits/src/evm_circuit/util/math_gadget/lt_word.rs b/zkevm-circuits/src/evm_circuit/util/math_gadget/lt_word.rs index 37899253b8..dff46d9a57 100644 --- a/zkevm-circuits/src/evm_circuit/util/math_gadget/lt_word.rs +++ b/zkevm-circuits/src/evm_circuit/util/math_gadget/lt_word.rs @@ -2,7 +2,7 @@ use crate::{ evm_circuit::util::{ constraint_builder::EVMConstraintBuilder, math_gadget::*, split_u256, CachedRegion, }, - util::word::{self}, + util::word::WordLoHi, }; use eth_types::{Field, Word}; use halo2_proofs::plonk::{Error, Expression}; @@ -18,13 +18,13 @@ pub struct LtWordGadget { impl LtWordGadget { pub(crate) fn construct + Clone>( cb: &mut EVMConstraintBuilder, - lhs: &word::Word, - rhs: &word::Word, + lhs: &WordLoHi, + rhs: &WordLoHi, ) -> Self { let (lhs_lo, lhs_hi) = lhs.to_lo_hi(); let (rhs_lo, rhs_hi) = rhs.to_lo_hi(); let comparison_hi = ComparisonGadget::construct(cb, lhs_hi.expr(), rhs_hi.expr()); - let lt_lo = LtGadget::construct(cb, lhs_lo.expr(), rhs_lo.expr()); + let lt_lo = cb.is_lt(lhs_lo.expr(), rhs_lo.expr()); Self { comparison_hi, lt_lo, @@ -113,27 +113,19 @@ mod tests { fn test_ltword_expect() { try_test!( LtWordTestContainer, - vec![Word::from(0), Word::from(1)], + [Word::from(0), Word::from(1)], true, ); + try_test!(LtWordTestContainer, [Word::from(1), Word::MAX], true,); + try_test!(LtWordTestContainer, [WORD_LOW_MAX, WORD_HIGH_MAX], true,); try_test!( LtWordTestContainer, - vec![Word::from(1), Word::MAX], + [Word::from(90), WORD_LOW_MAX], true, ); try_test!( LtWordTestContainer, - vec![WORD_LOW_MAX, WORD_HIGH_MAX], - true, - ); - try_test!( - LtWordTestContainer, - vec![Word::from(90), WORD_LOW_MAX], - true, - ); - try_test!( - LtWordTestContainer, - vec![Word::from(90), WORD_HIGH_MAX], + [Word::from(90), WORD_HIGH_MAX], true, ); } @@ -142,14 +134,14 @@ mod tests { fn test_ltword_unexpect() { try_test!( LtWordTestContainer, - vec![Word::from(1), Word::from(0)], + [Word::from(1), Word::from(0)], false, ); - try_test!(LtWordTestContainer, vec![Word::MAX, Word::MAX], false,); + try_test!(LtWordTestContainer, [Word::MAX, Word::MAX], false,); try_test!( LtWordTestContainer, - vec![WORD_HIGH_MAX, WORD_LOW_MAX], + [WORD_HIGH_MAX, WORD_LOW_MAX], false, ); } diff --git a/zkevm-circuits/src/evm_circuit/util/math_gadget/min_max.rs b/zkevm-circuits/src/evm_circuit/util/math_gadget/min_max.rs index ee6b101ab8..b2b4589bcc 100644 --- a/zkevm-circuits/src/evm_circuit/util/math_gadget/min_max.rs +++ b/zkevm-circuits/src/evm_circuit/util/math_gadget/min_max.rs @@ -19,7 +19,7 @@ impl MinMaxGadget { lhs: Expression, rhs: Expression, ) -> Self { - let lt = LtGadget::construct(cb, lhs.clone(), rhs.clone()); + let lt = cb.is_lt(lhs.clone(), rhs.clone()); let max = select::expr(lt.expr(), rhs.clone(), lhs.clone()); let min = select::expr(lt.expr(), lhs, rhs); @@ -110,17 +110,17 @@ mod tests { // a == b try_test!( MinMaxTestContainer, - vec![Word::from(0), Word::from(0)], + [Word::from(0), Word::from(0)], true, ); try_test!( MinMaxTestContainer, - vec![Word::from(5), Word::from(5)], + [Word::from(5), Word::from(5)], true, ); try_test!( MinMaxTestContainer, - vec![WORD_LOW_MAX, WORD_LOW_MAX], + [WORD_LOW_MAX, WORD_LOW_MAX], true, ); } @@ -130,17 +130,17 @@ mod tests { // min == a, max == b try_test!( MinMaxTestContainer, - vec![Word::from(0), Word::from(1)], + [Word::from(0), Word::from(1)], true, ); try_test!( MinMaxTestContainer, - vec![Word::from(3), Word::from(5)], + [Word::from(3), Word::from(5)], true, ); try_test!( MinMaxTestContainer, - vec![WORD_LOW_MAX, WORD_LOW_MAX], + [WORD_LOW_MAX, WORD_LOW_MAX], true, ); } @@ -150,17 +150,17 @@ mod tests { // min == b, max == a try_test!( MinMaxTestContainer, - vec![Word::from(1), Word::from(0)], + [Word::from(1), Word::from(0)], false, ); try_test!( MinMaxTestContainer, - vec![Word::from(256), Word::from(3)], + [Word::from(256), Word::from(3)], false, ); try_test!( MinMaxTestContainer, - vec![WORD_LOW_MAX, Word::from(123456)], + [WORD_LOW_MAX, Word::from(123456)], false, ); } @@ -170,19 +170,19 @@ mod tests { // min == a, max == b try_test!( MinMaxTestContainer, - vec![Word::from(1), Word::from(0)], + [Word::from(1), Word::from(0)], true, ); try_test!( MinMaxTestContainer, - vec![Word::from(777), Word::from(44)], + [Word::from(777), Word::from(44)], true, ); try_test!( MinMaxTestContainer, - vec![WORD_LOW_MAX+1, WORD_LOW_MAX], + [WORD_LOW_MAX+1, WORD_LOW_MAX], true, ); } diff --git a/zkevm-circuits/src/evm_circuit/util/math_gadget/modulo.rs b/zkevm-circuits/src/evm_circuit/util/math_gadget/modulo.rs index 4a8fa8726e..0c1ffdca6e 100644 --- a/zkevm-circuits/src/evm_circuit/util/math_gadget/modulo.rs +++ b/zkevm-circuits/src/evm_circuit/util/math_gadget/modulo.rs @@ -5,7 +5,7 @@ use crate::{ CachedRegion, }, util::{ - word::{self, Word32Cell, WordExpr}, + word::{Word32Cell, WordExpr, WordLoHi}, Expr, }, }; @@ -36,11 +36,11 @@ impl ModGadget { let (a, n, r) = (words[0], words[1], words[2]); let k = cb.query_word32(); let a_or_zero = cb.query_word32(); - let n_is_zero = IsZeroWordGadget::construct(cb, n); - let a_or_is_zero = IsZeroWordGadget::construct(cb, &a_or_zero); + let n_is_zero = cb.is_zero_word(n); + let a_or_is_zero = cb.is_zero_word(&a_or_zero); let mul_add_words = MulAddWordsGadget::construct(cb, [&k, n, r, &a_or_zero]); - let eq = IsEqualWordGadget::construct(cb, a, &a_or_zero); - let lt = LtWordGadget::construct(cb, &r.to_word(), &n.to_word()); + let eq = cb.is_eq_word(a, &a_or_zero); + let lt = cb.is_lt_word(&r.to_word(), &n.to_word()); // Constrain the aux variable a_or_zero to be =a or =0 if n==0: // (a == a_or_zero) ^ (n == 0 & a_or_zero == 0) cb.add_constraint( @@ -82,17 +82,17 @@ impl ModGadget { self.k.assign_u256(region, offset, k)?; self.a_or_zero.assign_u256(region, offset, a_or_zero)?; - self.n_is_zero.assign(region, offset, word::Word::from(n))?; + self.n_is_zero.assign(region, offset, WordLoHi::from(n))?; self.a_or_is_zero - .assign(region, offset, word::Word::from(a_or_zero))?; + .assign(region, offset, WordLoHi::from(a_or_zero))?; self.mul_add_words .assign(region, offset, [k, n, r, a_or_zero])?; self.lt.assign(region, offset, r, n)?; self.eq.assign_value( region, offset, - Value::known(word::Word::from(a)), - Value::known(word::Word::from(a_or_zero)), + Value::known(WordLoHi::from(a)), + Value::known(WordLoHi::from(a_or_zero)), )?; Ok(()) @@ -156,37 +156,37 @@ mod tests { fn test_mod_n_expected_rem() { try_test!( ModGadgetTestContainer, - vec![Word::from(0), Word::from(0), Word::from(0)], + [Word::from(0), Word::from(0), Word::from(0)], true, ); try_test!( ModGadgetTestContainer, - vec![Word::from(1), Word::from(0), Word::from(0)], + [Word::from(1), Word::from(0), Word::from(0)], true, ); try_test!( ModGadgetTestContainer, - vec![Word::from(548), Word::from(50), Word::from(48)], + [Word::from(548), Word::from(50), Word::from(48)], true, ); try_test!( ModGadgetTestContainer, - vec![Word::from(30), Word::from(50), Word::from(30)], + [Word::from(30), Word::from(50), Word::from(30)], true, ); try_test!( ModGadgetTestContainer, - vec![WORD_LOW_MAX, Word::from(1024), Word::from(1023)], + [WORD_LOW_MAX, Word::from(1024), Word::from(1023)], true, ); try_test!( ModGadgetTestContainer, - vec![WORD_HIGH_MAX, Word::from(1024), Word::from(0)], + [WORD_HIGH_MAX, Word::from(1024), Word::from(0)], true, ); try_test!( ModGadgetTestContainer, - vec![WORD_CELL_MAX, Word::from(2), Word::from(0)], + [WORD_CELL_MAX, Word::from(2), Word::from(0)], true, ); } @@ -203,7 +203,7 @@ mod tests { // ModGadget, the statement would be invalid in the ModGadget. try_test!( ModGadgetTestContainer, - vec![ + [ Word::from(2), Word::from(3), Word::from(0), @@ -214,27 +214,27 @@ mod tests { ); try_test!( ModGadgetTestContainer, - vec![Word::from(1), Word::from(1), Word::from(1)], + [Word::from(1), Word::from(1), Word::from(1)], false, ); try_test!( ModGadgetTestContainer, - vec![Word::from(46), Word::from(50), Word::from(48)], + [Word::from(46), Word::from(50), Word::from(48)], false, ); try_test!( ModGadgetTestContainer, - vec![WORD_LOW_MAX, Word::from(999999), Word::from(888888)], + [WORD_LOW_MAX, Word::from(999999), Word::from(888888)], false, ); try_test!( ModGadgetTestContainer, - vec![WORD_CELL_MAX, Word::from(999999999), Word::from(666666666)], + [WORD_CELL_MAX, Word::from(999999999), Word::from(666666666)], false, ); try_test!( ModGadgetTestContainer, - vec![WORD_HIGH_MAX, Word::from(999999), Word::from(777777)], + [WORD_HIGH_MAX, Word::from(999999), Word::from(777777)], false, ); } diff --git a/zkevm-circuits/src/evm_circuit/util/math_gadget/mul_add_words.rs b/zkevm-circuits/src/evm_circuit/util/math_gadget/mul_add_words.rs index 85b9ee0b7c..b526e6380e 100644 --- a/zkevm-circuits/src/evm_circuit/util/math_gadget/mul_add_words.rs +++ b/zkevm-circuits/src/evm_circuit/util/math_gadget/mul_add_words.rs @@ -4,7 +4,7 @@ use crate::{ from_bytes, pow_of_two_expr, split_u256, split_u256_limb64, CachedRegion, Cell, }, util::{ - word::{Word, Word32Cell, Word4, WordExpr}, + word::{Word32Cell, Word4, WordExpr, WordLoHi}, Expr, }, }; @@ -68,8 +68,8 @@ impl MulAddWordsGadget { b_limbs.push(word4_b.limbs[i].expr()); } - let word_c: Word> = c.to_word(); - let word_d: Word> = d.to_word(); + let word_c: WordLoHi> = c.to_word(); + let word_d: WordLoHi> = d.to_word(); let t0 = a_limbs[0].clone() * b_limbs[0].clone(); let t1 = a_limbs[0].clone() * b_limbs[1].clone() + a_limbs[1].clone() * b_limbs[0].clone(); @@ -211,7 +211,7 @@ mod tests { // 0 * 0 + 0 == 0 try_test!( MulAddGadgetContainer, - vec![ + [ Word::from(0), Word::from(0), Word::from(0), @@ -223,7 +223,7 @@ mod tests { // 1 * 0 + 0 == 0 try_test!( MulAddGadgetContainer, - vec![ + [ Word::from(1), Word::from(0), Word::from(0), @@ -235,7 +235,7 @@ mod tests { // 1 * 1 + 0 == 1 try_test!( MulAddGadgetContainer, - vec![ + [ Word::from(1), Word::from(1), Word::from(0), @@ -247,7 +247,7 @@ mod tests { // 1 * 1 + 1 == 2 try_test!( MulAddGadgetContainer, - vec![ + [ Word::from(1), Word::from(1), Word::from(1), @@ -259,7 +259,7 @@ mod tests { // 100 * 54 + 98 == 5498 try_test!( MulAddGadgetContainer, - vec![ + [ Word::from(100), Word::from(54), Word::from(98), @@ -271,7 +271,7 @@ mod tests { // 100 * 54 + low_max == low_max + 5400 try_test!( MulAddGadgetContainer, - vec![ + [ Word::from(100), Word::from(54), WORD_LOW_MAX, @@ -283,7 +283,7 @@ mod tests { // 100 * 54 + high_max == high_max + 5400 try_test!( MulAddGadgetContainer, - vec![ + [ Word::from(100), Word::from(54), WORD_HIGH_MAX, @@ -299,7 +299,7 @@ mod tests { // high_max + low_max + 1 == 0 with overflow 1 try_test!( MulAddGadgetContainer, - vec![ + [ WORD_LOW_MAX + 1, Word::from(1), WORD_HIGH_MAX, @@ -318,7 +318,7 @@ mod tests { // overflow == 73786976294838206460 + ((1<<64)-1)*((1<<64)-1)*6 try_test!( MulAddGadgetContainer, - vec![ + [ Word::MAX, Word::MAX, Word::MAX, @@ -334,7 +334,7 @@ mod tests { // 10 * 1 + 1 != 3 try_test!( MulAddGadgetContainer, - vec![ + [ Word::from(10), Word::from(1), Word::from(1), @@ -347,7 +347,7 @@ mod tests { // 1 * 1 + 1 != word_max, no underflow try_test!( MulAddGadgetContainer, - vec![ + [ Word::from(1), Word::from(1), Word::from(1), @@ -360,7 +360,7 @@ mod tests { // 100 * 54 + high_max == high_max + 5400, no overflow try_test!( MulAddGadgetContainer, - vec![ + [ Word::from(100), Word::from(54), WORD_HIGH_MAX, @@ -373,7 +373,7 @@ mod tests { // (low_max + 1) * 1 + high_max == 0 with overflow 1 try_test!( MulAddGadgetContainer, - vec![ + [ WORD_LOW_MAX + 1, Word::from(1), WORD_HIGH_MAX, diff --git a/zkevm-circuits/src/evm_circuit/util/math_gadget/mul_add_words512.rs b/zkevm-circuits/src/evm_circuit/util/math_gadget/mul_add_words512.rs index c4becb836e..fed7c98d87 100644 --- a/zkevm-circuits/src/evm_circuit/util/math_gadget/mul_add_words512.rs +++ b/zkevm-circuits/src/evm_circuit/util/math_gadget/mul_add_words512.rs @@ -4,7 +4,7 @@ use crate::{ from_bytes, pow_of_two_expr, split_u256, split_u256_limb64, CachedRegion, Cell, }, util::{ - word::{self, Word4, WordExpr}, + word::{Word32Cell, Word4, WordExpr}, Expr, }, }; @@ -57,8 +57,8 @@ impl MulAddWords512Gadget { /// Addend is the optional c. pub(crate) fn construct( cb: &mut EVMConstraintBuilder, - words: [&word::Word32Cell; 4], - addend: Option<&word::Word32Cell>, + words: [&Word32Cell; 4], + addend: Option<&Word32Cell>, ) -> Self { let carry_0 = cb.query_bytes(); let carry_1 = cb.query_bytes(); @@ -207,11 +207,11 @@ mod tests { /// MulAddWords512GadgetContainer: require(a * b + c == d * 2**256 + e) struct MulAddWords512GadgetContainer { math_gadget: MulAddWords512Gadget, - a: word::Word32Cell, - b: word::Word32Cell, - d: word::Word32Cell, - e: word::Word32Cell, - addend: word::Word32Cell, + a: Word32Cell, + b: Word32Cell, + d: Word32Cell, + e: Word32Cell, + addend: Word32Cell, } impl MathGadgetContainer for MulAddWords512GadgetContainer { @@ -258,7 +258,7 @@ mod tests { // 0 * 0 + 0 == 0 * 2**256 + 0 try_test!( MulAddWords512GadgetContainer, - vec![ + [ Word::from(0), Word::from(0), Word::from(0), @@ -270,7 +270,7 @@ mod tests { // 1 * 0 + 0 == 0 * 2**256 + 0 try_test!( MulAddWords512GadgetContainer, - vec![ + [ Word::from(1), Word::from(0), Word::from(0), @@ -282,7 +282,7 @@ mod tests { // 1 * 1 + 0 == 0 * 2**256 + 1 try_test!( MulAddWords512GadgetContainer, - vec![ + [ Word::from(1), Word::from(1), Word::from(0), @@ -294,7 +294,7 @@ mod tests { // 100 * 54 + 0 == 0 * 2**256 + 5400 try_test!( MulAddWords512GadgetContainer, - vec![ + [ Word::from(100), Word::from(54), Word::from(0), @@ -306,7 +306,7 @@ mod tests { // 100 * 54 + max == 1 * 2**256 + 5400 try_test!( MulAddWords512GadgetContainer, - vec![ + [ Word::from(100), Word::from(54), Word::from(1), @@ -318,7 +318,7 @@ mod tests { // 100 * 54 + low_max == 0 * 2**256 + 5400 + low_max try_test!( MulAddWords512GadgetContainer, - vec![ + [ Word::from(100), Word::from(54), Word::from(0), @@ -330,7 +330,7 @@ mod tests { // 100 * 54 + high_max == 0 * 2**256 + 5400 + high_max try_test!( MulAddWords512GadgetContainer, - vec![ + [ Word::from(100), Word::from(54), Word::from(0), @@ -346,7 +346,7 @@ mod tests { // 10 * 1 + 0 != 1 * 2**256 + 3 try_test!( MulAddWords512GadgetContainer, - vec![ + [ Word::from(10), Word::from(1), Word::from(1), diff --git a/zkevm-circuits/src/evm_circuit/util/math_gadget/mul_word_u64.rs b/zkevm-circuits/src/evm_circuit/util/math_gadget/mul_word_u64.rs index 220235a002..ec3d6e69aa 100644 --- a/zkevm-circuits/src/evm_circuit/util/math_gadget/mul_word_u64.rs +++ b/zkevm-circuits/src/evm_circuit/util/math_gadget/mul_word_u64.rs @@ -142,43 +142,43 @@ mod tests { // 0 * 0 = 0 try_test!( MulWordByU64TestContainer, - vec![Word::from(0), Word::from(0), Word::from(0)], + [Word::from(0), Word::from(0), Word::from(0)], true, ); // max * 0 = 0 try_test!( MulWordByU64TestContainer, - vec![Word::MAX, Word::from(0), Word::from(0)], + [Word::MAX, Word::from(0), Word::from(0)], true, ); // 1 * 1 = 1 try_test!( MulWordByU64TestContainer, - vec![Word::from(1), Word::from(1), Word::from(1)], + [Word::from(1), Word::from(1), Word::from(1)], true, ); // max * 1 = max try_test!( MulWordByU64TestContainer, - vec![Word::MAX, Word::from(1), Word::MAX], + [Word::MAX, Word::from(1), Word::MAX], true, ); // 2 * 2 = 4 try_test!( MulWordByU64TestContainer, - vec![Word::from(2), Word::from(2), Word::from(4)], + [Word::from(2), Word::from(2), Word::from(4)], true, ); // 22222 * 500 = 11111000 try_test!( MulWordByU64TestContainer, - vec![Word::from(22222), Word::from(500), Word::from(11111000)], + [Word::from(22222), Word::from(500), Word::from(11111000)], true, ); // low_max * 2 = low_max << 1 try_test!( MulWordByU64TestContainer, - vec![WORD_LOW_MAX, Word::from(2), WORD_LOW_MAX << 1], + [WORD_LOW_MAX, Word::from(2), WORD_LOW_MAX << 1], true, ); } @@ -187,13 +187,13 @@ mod tests { fn test_mulwordu64_unexpect() { try_test!( MulWordByU64TestContainer, - vec![Word::MAX, Word::from(1), Word::from(1)], + [Word::MAX, Word::from(1), Word::from(1)], false, ); // high_max * 2 = overflow try_test!( MulWordByU64TestContainer, - vec![WORD_HIGH_MAX, Word::from(2), WORD_HIGH_MAX << 1], + [WORD_HIGH_MAX, Word::from(2), WORD_HIGH_MAX << 1], false, ); } diff --git a/zkevm-circuits/src/evm_circuit/util/math_gadget/pair_select.rs b/zkevm-circuits/src/evm_circuit/util/math_gadget/pair_select.rs index 5282aecded..90a562965d 100644 --- a/zkevm-circuits/src/evm_circuit/util/math_gadget/pair_select.rs +++ b/zkevm-circuits/src/evm_circuit/util/math_gadget/pair_select.rs @@ -128,12 +128,12 @@ mod tests { fn test_pairselect_eq() { try_test!( PairSelectionTestContainer, - vec![Word::from(0), Word::from(0), Word::from(0)], + [Word::from(0), Word::from(0), Word::from(0)], true, ); try_test!( PairSelectionTestContainer, - vec![Word::from(2898), Word::from(2898), Word::from(2898)], + [Word::from(2898), Word::from(2898), Word::from(2898)], true, ); } @@ -142,17 +142,17 @@ mod tests { fn test_pairselect_expect_a_and_a() { try_test!( PairSelectionTestContainer, - vec![Word::from(0), Word::from(0), Word::from(1)], + [Word::from(0), Word::from(0), Word::from(1)], true, ); try_test!( PairSelectionTestContainer, - vec![Word::from(2898), Word::from(2898), Word::from(1)], + [Word::from(2898), Word::from(2898), Word::from(1)], true, ); try_test!( PairSelectionTestContainer, - vec![WORD_LOW_MAX, WORD_LOW_MAX, Word::from(1)], + [WORD_LOW_MAX, WORD_LOW_MAX, Word::from(1)], true, ); } @@ -161,12 +161,12 @@ mod tests { fn test_pairselect_expect_a_but_b() { try_test!( PairSelectionTestContainer, - vec![Word::from(0), Word::from(1), Word::from(0)], + [Word::from(0), Word::from(1), Word::from(0)], false, ); try_test!( PairSelectionTestContainer, - vec![Word::from(2989), Word::from(1), Word::from(2989)], + [Word::from(2989), Word::from(1), Word::from(2989)], false, ); } @@ -175,12 +175,12 @@ mod tests { fn test_pairselect_expect_b_and_b() { try_test!( PairSelectionTestContainer, - vec![Word::from(0), Word::from(1), Word::from(0)], + [Word::from(0), Word::from(1), Word::from(0)], true, ); try_test!( PairSelectionTestContainer, - vec![Word::from(2989), Word::from(1), Word::from(2989)], + [Word::from(2989), Word::from(1), Word::from(2989)], true, ); } diff --git a/zkevm-circuits/src/evm_circuit/util/math_gadget/range_check.rs b/zkevm-circuits/src/evm_circuit/util/math_gadget/range_check.rs index 989011c68a..abf282f66c 100644 --- a/zkevm-circuits/src/evm_circuit/util/math_gadget/range_check.rs +++ b/zkevm-circuits/src/evm_circuit/util/math_gadget/range_check.rs @@ -87,13 +87,13 @@ mod tests { #[test] fn test_rangecheck_just_in_range() { - try_test!(RangeCheckTestContainer, vec![Word::from(0)], true); + try_test!(RangeCheckTestContainer,[Word::from(0)], true); - try_test!(RangeCheckTestContainer, vec![Word::from(1)], true); + try_test!(RangeCheckTestContainer,[Word::from(1)], true); // max - 1 try_test!( RangeCheckTestContainer, - vec![Word::from((1u64 << 32) - 1)], + [Word::from((1u64 << 32) - 1)], true, ); } @@ -102,7 +102,7 @@ mod tests { fn test_rangecheck_out_of_range() { try_test!( RangeCheckTestContainer, - vec![Word::from(1u64 << 32)], + [Word::from(1u64 << 32)], false, ); } diff --git a/zkevm-circuits/src/evm_circuit/util/math_gadget/rlp.rs b/zkevm-circuits/src/evm_circuit/util/math_gadget/rlp.rs index 4b6419b881..d6a8cff542 100644 --- a/zkevm-circuits/src/evm_circuit/util/math_gadget/rlp.rs +++ b/zkevm-circuits/src/evm_circuit/util/math_gadget/rlp.rs @@ -1,7 +1,3 @@ -use crate::{ - evm_circuit::util::rlc, - util::word::{Word32Cell, WordExpr}, -}; use eth_types::{Address, Field, ToScalar, Word}; use gadgets::util::{and, expr_from_bytes, not, select, sum, Expr}; use halo2_proofs::{ @@ -14,10 +10,10 @@ use crate::{ param::{N_BYTES_U64, N_BYTES_WORD}, util::{ constraint_builder::{ConstrainBuilderCommon, EVMConstraintBuilder}, - AccountAddress, CachedRegion, Cell, RandomLinearCombination, + rlc, AccountAddress, CachedRegion, Cell, RandomLinearCombination, }, }, - util::word, + util::word::{Word32Cell, WordExpr, WordLoHi}, }; use super::IsZeroGadget; @@ -52,7 +48,7 @@ impl RlpU64Gadget { .zip(&is_most_significant_byte) .map(|(byte, indicator)| byte.expr() * indicator.expr()), ); - let most_significant_byte_is_zero = IsZeroGadget::construct(cb, most_significant_byte); + let most_significant_byte_is_zero = cb.is_zero(most_significant_byte); let is_lt_128 = cb.query_bool(); let value = expr_from_bytes(&value_rlc.cells); @@ -260,7 +256,7 @@ impl ContractCreateGadget { } /// Caller address' value. - pub(crate) fn caller_address(&self) -> word::Word> { + pub(crate) fn caller_address(&self) -> WordLoHi> { self.caller_address.to_word() } @@ -270,7 +266,7 @@ impl ContractCreateGadget { } /// Code hash word RLC. - pub(crate) fn code_hash(&self) -> word::Word> { + pub(crate) fn code_hash(&self) -> WordLoHi> { self.code_hash.to_word() } @@ -287,7 +283,7 @@ impl ContractCreateGadget { ) } - pub(crate) fn salt(&self) -> word::Word> { + pub(crate) fn salt(&self) -> WordLoHi> { self.salt.to_word() } @@ -513,7 +509,7 @@ mod test { }; try_test!( ContractCreateGadgetContainer, - vec![ + [ caller_address.to_word(), Word::from(caller_nonce), rlp_len, diff --git a/zkevm-circuits/src/evm_circuit/util/memory_gadget.rs b/zkevm-circuits/src/evm_circuit/util/memory_gadget.rs index d9bf830820..3f59a5d0b0 100644 --- a/zkevm-circuits/src/evm_circuit/util/memory_gadget.rs +++ b/zkevm-circuits/src/evm_circuit/util/memory_gadget.rs @@ -14,7 +14,7 @@ use crate::{ }, }, util::{ - word::{Word, WordCell}, + word::{WordLoHi, WordLoHiCell}, Expr, }, }; @@ -55,10 +55,10 @@ pub(crate) trait CommonMemoryAddressGadget { ) -> Result; /// Return original word of memory offset. - fn offset_word(&self) -> Word>; + fn offset_word(&self) -> WordLoHi>; /// Return original word of memory length. - fn length_word(&self) -> Word>; + fn length_word(&self) -> WordLoHi>; /// Return valid memory length of Uint64. fn length(&self) -> Expression; @@ -74,7 +74,7 @@ pub(crate) trait CommonMemoryAddressGadget { #[derive(Clone, Debug)] pub(crate) struct MemoryAddressGadget { memory_offset_bytes: MemoryAddress, - memory_offset: WordCell, + memory_offset: WordLoHiCell, memory_length: MemoryAddress, memory_length_is_zero: IsZeroGadget, } @@ -82,17 +82,17 @@ pub(crate) struct MemoryAddressGadget { impl MemoryAddressGadget { pub(crate) fn construct( cb: &mut EVMConstraintBuilder, - memory_offset: WordCell, + memory_offset: WordLoHiCell, memory_length: MemoryAddress, ) -> Self { - let memory_length_is_zero = IsZeroGadget::construct(cb, memory_length.sum_expr()); + let memory_length_is_zero = cb.is_zero(memory_length.sum_expr()); let memory_offset_bytes = cb.query_memory_address(); let has_length = 1.expr() - memory_length_is_zero.expr(); cb.condition(has_length, |cb| { cb.require_equal_word( "Offset decomposition into 5 bytes", - Word::from_lo_unchecked(memory_offset_bytes.expr()), + WordLoHi::from_lo_unchecked(memory_offset_bytes.expr()), memory_offset.to_word(), ); }); @@ -157,11 +157,11 @@ impl CommonMemoryAddressGadget for MemoryAddressGadget { }) } - fn offset_word(&self) -> Word> { + fn offset_word(&self) -> WordLoHi> { self.memory_offset.to_word() } - fn length_word(&self) -> Word> { + fn length_word(&self) -> WordLoHi> { self.memory_length.to_word() } @@ -196,16 +196,15 @@ impl CommonMemoryAddressGadget for MemoryExpandedAddressGadget { let length = cb.query_word32(); let sum = cb.query_word32(); - let sum_lt_cap = LtGadget::construct( - cb, + let sum_lt_cap = cb.is_lt( from_bytes::expr(&sum.limbs[..N_BYTES_U64]), (MAX_EXPANDED_MEMORY_ADDRESS + 1).expr(), ); let sum_overflow_hi = sum::expr(&sum.limbs[N_BYTES_U64..]); - let sum_within_u64 = IsZeroGadget::construct(cb, sum_overflow_hi); + let sum_within_u64 = cb.is_zero(sum_overflow_hi); - let length_is_zero = IsZeroGadget::construct(cb, sum::expr(&length.limbs)); + let length_is_zero = cb.is_zero(sum::expr(&length.limbs)); let offset_length_sum = AddWordsGadget::construct(cb, [offset, length], sum); Self { @@ -260,12 +259,12 @@ impl CommonMemoryAddressGadget for MemoryExpandedAddressGadget { Ok(address) } - fn offset_word(&self) -> Word> { + fn offset_word(&self) -> WordLoHi> { let addends = self.offset_length_sum.addends(); addends[0].to_word() } - fn length_word(&self) -> Word> { + fn length_word(&self) -> WordLoHi> { let addends = self.offset_length_sum.addends(); addends[1].to_word() } @@ -340,7 +339,7 @@ pub(crate) struct MemoryWordSizeGadget { impl MemoryWordSizeGadget { pub(crate) fn construct(cb: &mut EVMConstraintBuilder, address: Expression) -> Self { - let memory_word_size = ConstantDivisionGadget::construct(cb, address + 31.expr(), 32); + let memory_word_size = cb.div_by_const(address + 31.expr(), 32); Self { memory_word_size } } @@ -569,7 +568,7 @@ pub(crate) struct BufferReaderGadget; MAX_BYTES], - /// The selectors that indicate if the corrsponding byte contains real data + /// The selectors that indicate if the corresponding byte contains real data /// or is padded selectors: [Cell; MAX_BYTES], /// The min gadget to take the minimum of addr_start and addr_end @@ -613,7 +612,7 @@ impl let is_empty = not::expr(&selectors[0]); let cap = select::expr(is_empty.expr(), 0.expr(), MAX_BYTES.expr()); let signed_len = addr_end - addr_start; - let min_gadget = MinMaxGadget::construct(cb, cap, signed_len); + let min_gadget = cb.min_max(cap, signed_len); // If we claim that the buffer is empty, we prove that the end is at or before the start. // buffer_len = max(0, signed_len) = 0 @@ -802,7 +801,7 @@ mod test { // buffer len = data len try_test!( BufferReaderGadgetTestContainer, - vec![ + [ Word::from(0), Word::from(2), Word::from(256), @@ -813,7 +812,7 @@ mod test { // buffer len > data len try_test!( BufferReaderGadgetTestContainer, - vec![ + [ Word::from(0), Word::from(2), Word::from(256), @@ -827,7 +826,7 @@ mod test { // buffer len < data len try_test!( BufferReaderGadgetTestContainer, - vec![ + [ Word::from(0), Word::from(1), Word::from(256), @@ -838,7 +837,7 @@ mod test { // buffer len <= 0 try_test!( BufferReaderGadgetTestContainer, - vec![ + [ Word::from(1), Word::from(0), Word::from(256), @@ -849,7 +848,7 @@ mod test { // empty buffer try_test!( BufferReaderGadgetTestContainer, - vec![ + [ Word::from(0), Word::from(0), Word::from(256), @@ -860,7 +859,7 @@ mod test { // MAX_BYTES < buffer size try_test!( BufferReaderGadgetTestContainer, - vec![ + [ Word::from(0), Word::from(31), Word::from(256), diff --git a/zkevm-circuits/src/evm_circuit/util/precompile_gadget.rs b/zkevm-circuits/src/evm_circuit/util/precompile_gadget.rs index da0ce68e32..0929467d41 100644 --- a/zkevm-circuits/src/evm_circuit/util/precompile_gadget.rs +++ b/zkevm-circuits/src/evm_circuit/util/precompile_gadget.rs @@ -39,6 +39,7 @@ impl PrecompileGadget { let conditions = vec![ address.value_equals(PrecompileCalls::Identity), + address.value_equals(PrecompileCalls::Ecrecover), // match more precompiles ] .into_iter() @@ -49,6 +50,7 @@ impl PrecompileGadget { let next_states = vec![ ExecutionState::PrecompileIdentity, // add more precompile execution states + ExecutionState::PrecompileEcrecover, ]; let constraints: Vec> = vec![ @@ -56,10 +58,18 @@ impl PrecompileGadget { // Identity cb.require_equal( "input length and precompile return length are the same", - cd_length, - precompile_return_length, + cd_length.clone(), + precompile_return_length.clone(), ); - }), // add more precompile constraint closures + }), + Box::new(|cb| { + // EcRecover + cb.require_equal( + "ECRecover: input length is 128 bytes", + cd_length.clone(), + 128.expr(), + ); + }), ]; cb.constrain_mutually_exclusive_next_step(conditions, next_states, constraints); diff --git a/zkevm-circuits/src/evm_circuit/util/tx.rs b/zkevm-circuits/src/evm_circuit/util/tx.rs index a9c63dd07d..162aa685d2 100644 --- a/zkevm-circuits/src/evm_circuit/util/tx.rs +++ b/zkevm-circuits/src/evm_circuit/util/tx.rs @@ -9,12 +9,12 @@ use crate::{ math_gadget::{ AddWordsGadget, ConstantDivisionGadget, IsEqualGadget, MulWordByU64Gadget, }, - CachedRegion, Cell, Word, + CachedRegion, Cell, }, witness::{Block, Transaction}, }, table::{CallContextFieldTag, TxContextFieldTag, TxReceiptFieldTag}, - util::word::{Word32Cell, WordCell}, + util::word::{Word32Cell, WordLoHi, WordLoHiCell}, }; use bus_mapping::operation::Target; use eth_types::{evm_types::GasCost, Field}; @@ -42,7 +42,7 @@ impl BeginTxHelperGadget { cb.call_context_lookup_write( Some(call_id.expr()), CallContextFieldTag::TxId, - Word::from_lo_unchecked(tx_id.expr()), + WordLoHi::from_lo_unchecked(tx_id.expr()), ); // rwc_delta += 1 // Add first BeginTx step constraint to have id == 1 @@ -81,7 +81,7 @@ impl EndTxHelperGadget { gas_used: Expression, num_rw: Expression, ) -> Self { - let is_first_tx = IsEqualGadget::construct(cb, tx_id.expr(), 1.expr()); + let is_first_tx = cb.is_eq(tx_id.expr(), 1.expr()); // Constrain tx receipt fields cb.tx_receipt_lookup( @@ -133,7 +133,7 @@ impl EndTxHelperGadget { Some(next_step_rwc), CallContextFieldTag::TxId, // tx_id has been lookup and range_check above - Word::from_lo_unchecked(tx_id.expr() + 1.expr()), + WordLoHi::from_lo_unchecked(tx_id.expr() + 1.expr()), ); // minus 1.expr() because `call_context_lookup_write_with_counter` do not bump // rwc @@ -197,8 +197,8 @@ impl EndTxHelperGadget { #[derive(Clone, Debug)] pub(crate) struct TxDataGadget { pub(crate) nonce: Cell, - pub(crate) caller_address: WordCell, - pub(crate) callee_address: WordCell, + pub(crate) caller_address: WordLoHiCell, + pub(crate) callee_address: WordLoHiCell, pub(crate) is_create: Cell, pub(crate) gas: Cell, pub(crate) call_data_length: Cell, @@ -241,8 +241,7 @@ impl TxDataGadget { // Calculate transaction gas fee let mul_gas_fee_by_gas = MulWordByU64Gadget::construct(cb, gas_price.clone(), gas.expr()); - let call_data_word_length = - ConstantDivisionGadget::construct(cb, call_data_length.expr() + 31.expr(), 32); + let call_data_word_length = cb.div_by_const(call_data_length.expr() + 31.expr(), 32); let (cost_sum, gas_mul_gas_price_plus_value) = if calculate_total_cost { let cost_sum = cb.query_word32(); diff --git a/zkevm-circuits/src/exp_circuit.rs b/zkevm-circuits/src/exp_circuit.rs index 4f709a1546..63749a2ffa 100644 --- a/zkevm-circuits/src/exp_circuit.rs +++ b/zkevm-circuits/src/exp_circuit.rs @@ -490,7 +490,7 @@ impl ExpCircuit { Self { exp_events, max_exp_rows, - _marker: PhantomData::default(), + _marker: PhantomData, } } } diff --git a/zkevm-circuits/src/instance.rs b/zkevm-circuits/src/instance.rs index fd3f67510b..a1ecc1cf92 100644 --- a/zkevm-circuits/src/instance.rs +++ b/zkevm-circuits/src/instance.rs @@ -7,7 +7,7 @@ use std::{iter, ops::Deref}; use eth_types::{geth_types::Transaction, Address, ToBigEndian, Word, H256}; use itertools::Itertools; -use crate::{util::word, witness::Block}; +use crate::{util::word::WordLoHi, witness::Block}; pub(super) const ZERO_BYTE_GAS_COST: u64 = 4; pub(super) const NONZERO_BYTE_GAS_COST: u64 = 16; @@ -289,11 +289,11 @@ impl PublicData { max_txs: usize, max_withdrawals: usize, max_calldata: usize, - ) -> word::Word { + ) -> WordLoHi { let mut keccak = Keccak::default(); keccak.update(&self.get_pi_bytes(max_txs, max_withdrawals, max_calldata)); let digest = keccak.digest(); - word::Word::from(Word::from_big_endian(&digest)) + WordLoHi::from(Word::from_big_endian(&digest)) } } diff --git a/zkevm-circuits/src/keccak_circuit.rs b/zkevm-circuits/src/keccak_circuit.rs index 65e258c13d..14cf9453de 100644 --- a/zkevm-circuits/src/keccak_circuit.rs +++ b/zkevm-circuits/src/keccak_circuit.rs @@ -32,7 +32,7 @@ use crate::{ table::{KeccakTable, LookupTable}, util::{ cell_manager::{CMFixedHeightStrategy, Cell, CellManager, CellType}, - word::{self, WordExpr}, + word::{Word32, WordExpr}, Challenges, SubCircuit, SubCircuitConfig, }, witness::{self, Chunk}, @@ -296,7 +296,7 @@ impl SubCircuitConfig for KeccakCircuitConfig { // that allows reusing the same parts in an optimal way for the chi step. // We can save quite a few columns by not recombining the parts after rho/pi and // re-splitting the words again before chi. Instead we do chi directly - // on the output parts of rho/pi. For rho/pi specically we do + // on the output parts of rho/pi. For rho/pi specially we do // `s[j][2 * i + 3 * j) % 5] = normalize(rot(s[i][j], RHOM[i][j]))`. cell_manager.get_strategy().start_region(); let mut lookup_counter = 0; @@ -580,7 +580,7 @@ impl SubCircuitConfig for KeccakCircuitConfig { cb.condition(start_new_hash, |cb| { cb.require_equal_word( "output check", - word::Word32::new(hash_bytes_le.try_into().expect("32 limbs")).to_word(), + Word32::new(hash_bytes_le.try_into().expect("32 limbs")).to_word(), hash_word.map(|col| meta.query_advice(col, Rotation::cur())), ); }); diff --git a/zkevm-circuits/src/keccak_circuit/keccak_packed_multi.rs b/zkevm-circuits/src/keccak_circuit/keccak_packed_multi.rs index 7d90ebc8d2..25f16a5f96 100644 --- a/zkevm-circuits/src/keccak_circuit/keccak_packed_multi.rs +++ b/zkevm-circuits/src/keccak_circuit/keccak_packed_multi.rs @@ -1,7 +1,7 @@ use super::{param::*, util::*, DEFAULT_CELL_TYPE}; use crate::util::{ cell_manager::{CMFixedHeightStrategy, Cell, CellManager}, - word::Word, + word::WordLoHi, Challenges, }; use eth_types::Field; @@ -81,7 +81,7 @@ pub(crate) struct KeccakRow { pub(crate) cell_values: Vec, pub(crate) length: usize, pub(crate) data_rlc: Value, - pub(crate) hash: Word>, + pub(crate) hash: WordLoHi>, } /// Part @@ -450,7 +450,7 @@ pub(crate) mod transform { } } -// Transfroms values to cells +// Transforms values to cells pub(crate) mod transform_to { use super::{AssignKeccakRegion, Cell, KeccakRegion, Part, PartValue}; use crate::{ @@ -562,7 +562,7 @@ pub(crate) fn keccak( let mut cell_managers = Vec::new(); let mut regions = Vec::new(); - let mut hash = Word::default(); + let mut hash = WordLoHi::default(); let mut round_lengths = Vec::new(); let mut round_data_rlcs = Vec::new(); for round in 0..NUM_ROUNDS + 1 { @@ -795,13 +795,13 @@ pub(crate) fn keccak( .rev() .collect::>(); - let word: Word> = Word::from(eth_types::Word::from_little_endian( + let word: WordLoHi> = WordLoHi::from(eth_types::Word::from_little_endian( hash_bytes_le.as_slice(), )) .map(Value::known); word } else { - Word::default().into_value() + WordLoHi::default().into_value() }; // The words to squeeze out @@ -888,7 +888,7 @@ pub(crate) fn multi_keccak( is_final: false, length: 0usize, data_rlc: Value::known(F::ZERO), - hash: Word::default().into_value(), + hash: WordLoHi::default().into_value(), cell_values: Vec::new(), }); } diff --git a/zkevm-circuits/src/keccak_circuit/test.rs b/zkevm-circuits/src/keccak_circuit/test.rs index aeb57474b4..90e163b1e9 100644 --- a/zkevm-circuits/src/keccak_circuit/test.rs +++ b/zkevm-circuits/src/keccak_circuit/test.rs @@ -1,7 +1,7 @@ use super::*; use crate::{ evm_circuit::util::rlc, - util::{unusable_rows, word::Word}, + util::{unusable_rows, word::WordLoHi}, }; use bus_mapping::state_db::EMPTY_CODE_HASH_LE; use eth_types::{Field, H256, U256}; @@ -86,7 +86,7 @@ fn verify(k: u32, inputs: Vec>, digests: Vec, success: for (input, digest, hash) in izip!(&inputs, &digests, &hash_lookup_table) { let len = F::from(input.len() as u64); let digest_slice: [u8; 32] = hex::decode(digest).unwrap().try_into().unwrap(); - let (lo, hi): (F, F) = Word::from(H256::from(digest_slice)).to_lo_hi(); + let (lo, hi): (F, F) = WordLoHi::from(H256::from(digest_slice)).to_lo_hi(); let expected = (rlc_input(input), len, lo, hi); @@ -95,7 +95,8 @@ fn verify(k: u32, inputs: Vec>, digests: Vec, success: assert_eq!(hash.2, expected.2); assert_eq!(hash.3, expected.3); } - let (lo, hi) = Word::from(U256::from_little_endian(EMPTY_CODE_HASH_LE.as_slice())).to_lo_hi(); + let (lo, hi) = + WordLoHi::from(U256::from_little_endian(EMPTY_CODE_HASH_LE.as_slice())).to_lo_hi(); // Check that other digests are the digest of the empty message. let empty_hash = (F::ZERO, F::ZERO, lo, hi); diff --git a/zkevm-circuits/src/lib.rs b/zkevm-circuits/src/lib.rs index 56bf0d4934..d3924cf133 100644 --- a/zkevm-circuits/src/lib.rs +++ b/zkevm-circuits/src/lib.rs @@ -34,6 +34,7 @@ pub mod mpt_circuit; pub mod pi_circuit; #[cfg(not(target_arch = "wasm32"))] pub mod root_circuit; +pub mod sig_circuit; pub mod state_circuit; pub mod super_circuit; pub mod table; diff --git a/zkevm-circuits/src/mpt_circuit.rs b/zkevm-circuits/src/mpt_circuit.rs index dfc557452e..5a2c79b02b 100644 --- a/zkevm-circuits/src/mpt_circuit.rs +++ b/zkevm-circuits/src/mpt_circuit.rs @@ -10,7 +10,7 @@ use halo2_proofs::{ poly::Rotation, }; -use std::{convert::TryInto, env::var, marker::PhantomData}; +use std::{convert::TryInto, env::var, io::Read, marker::PhantomData}; mod account_leaf; mod branch; @@ -201,7 +201,7 @@ pub enum FixedTableTag { RangeKeyLen256, /// For checking there are 0s after the RLP stream ends RangeKeyLen16, - /// Extesion key odd key + /// Extension key odd key ExtOddKey, /// RLP decoding RLP, @@ -359,10 +359,10 @@ impl MPTConfig { } let cell_columns = [rlp_cm.columns(), state_cm.columns()].concat(); - println!("max expression degree: {}", meta.degree()); - println!("num lookups: {}", meta.lookups().len()); - println!("num advices: {}", meta.num_advice_columns()); - println!("num fixed: {}", meta.num_fixed_columns()); + log::info!("max expression degree: {}", meta.degree()); + log::info!("num lookups: {}", meta.lookups().len()); + log::info!("num advices: {}", meta.num_advice_columns()); + log::info!("num fixed: {}", meta.num_fixed_columns()); // cb.base.print_stats(); MPTConfig { @@ -733,11 +733,9 @@ impl Circuit for MPTCircuit { } } -/// Loads an MPT proof from disk -pub fn load_proof(path: &str) -> Vec { - let file = std::fs::File::open(path); - let reader = std::io::BufReader::new(file.unwrap()); - let mut nodes: Vec = serde_json::from_reader(reader).unwrap(); +/// Loads an MPT proof from reader +pub fn load_proof(reader: R) -> Result, serde_json::Error> { + let mut nodes: Vec = serde_json::from_reader(reader)?; // Add the address and the key to the list of values in the Account and Storage nodes for node in nodes.iter_mut() { @@ -754,17 +752,52 @@ pub fn load_proof(path: &str) -> Vec { .push([vec![160], storage.key.to_vec()].concat().into()); } } - nodes + Ok(nodes) +} + +/// Loads an MPT proof from disk +pub fn load_proof_from_file(path: &str) -> Vec { + let file = std::fs::File::open(path); + let reader = std::io::BufReader::new(file.unwrap()); + load_proof(reader).unwrap() } #[cfg(test)] mod tests { use super::*; use halo2_proofs::{dev::MockProver, halo2curves::bn256::Fr}; - use std::{fs, ops::Deref}; + use itertools::Itertools; + use std::{fs, ops::Deref, path::PathBuf}; #[test] fn test_mpt() { + let degree = 15; + get_witnesses() + .enumerate() + .for_each(|(idx, (path, num_rows, circuit))| { + println!("{} {:?}", idx, path); + let prover = MockProver::::run(degree, &circuit, vec![]).unwrap(); + assert_eq!(prover.verify_at_rows(0..num_rows, 0..num_rows,), Ok(())); + // assert_eq!(prover.verify_par(), Ok(())); + // prover.assert_satisfied(); + }); + } + + #[test] + fn variadic_size_check() { + let mut circuits = get_witnesses(); + let first = circuits.next().unwrap().2; + let second = circuits.next().unwrap().2; + + let degree = 15; + let prover_1 = MockProver::::run(degree, &first, vec![]).unwrap(); + let prover_2 = MockProver::::run(degree, &second, vec![]).unwrap(); + + assert_eq!(prover_1.fixed(), prover_2.fixed()); + assert_eq!(prover_1.permutation(), prover_2.permutation()); + } + + fn get_witnesses() -> impl Iterator)> { let path = "src/mpt_circuit/tests"; let files = fs::read_dir(path).unwrap(); files @@ -776,13 +809,13 @@ mod tests { false } }) - .enumerate() - .for_each(|(idx, f)| { + .sorted_by(|a, b| a.file_name().cmp(&b.file_name())) + .map(|f| { let path = f.path(); let mut parts = path.to_str().unwrap().split('-'); parts.next(); - let nodes = load_proof(path.to_str().unwrap()); + let nodes = load_proof_from_file(path.to_str().unwrap()); let num_rows: usize = nodes.iter().map(|node| node.values.len()).sum(); let mut keccak_data = vec![]; @@ -791,24 +824,21 @@ mod tests { keccak_data.push(k.deref().clone()); } } - let disable_preimage_check = nodes[0].start.clone().unwrap().disable_preimage_check; let degree = 15; let max_nodes = 520; - let circuit = MPTCircuit:: { - nodes, - keccak_data, - degree, - max_nodes, - disable_preimage_check, - _marker: PhantomData, - }; - - println!("{} {:?}", idx, path); - let prover = MockProver::::run(degree as u32, &circuit, vec![]).unwrap(); - assert_eq!(prover.verify_at_rows(0..num_rows, 0..num_rows,), Ok(())); - // assert_eq!(prover.verify(), Ok(())); - // prover.assert_satisfied(); - }); + ( + path, + num_rows, + MPTCircuit:: { + nodes, + keccak_data, + degree, + max_nodes, + disable_preimage_check, + _marker: PhantomData, + }, + ) + }) } } diff --git a/zkevm-circuits/src/mpt_circuit/account_leaf.rs b/zkevm-circuits/src/mpt_circuit/account_leaf.rs index 9969f97f29..35d27bc4c6 100644 --- a/zkevm-circuits/src/mpt_circuit/account_leaf.rs +++ b/zkevm-circuits/src/mpt_circuit/account_leaf.rs @@ -1,4 +1,4 @@ -use eth_types::Field; +use eth_types::{Field, OpsIdentity, U256}; use gadgets::util::{pow, Scalar}; use halo2_proofs::{ circuit::Value, @@ -26,11 +26,11 @@ use crate::{ IsPlaceholderLeafGadget, KeyData, MPTConstraintBuilder, ParentData, WrongGadget, KECCAK, }, - param::{KEY_LEN_IN_NIBBLES, RLP_LIST_LONG, RLP_LONG}, + param::{EMPTY_TRIE_HASH, KEY_LEN_IN_NIBBLES, RLP_LIST_LONG, RLP_LONG}, MPTConfig, MPTContext, MptMemory, RlpItemType, }, table::MPTProofType, - util::word::{self, Word}, + util::word::WordLoHi, witness::MptUpdateRow, }; @@ -142,28 +142,67 @@ impl AccountLeafConfig { config.is_mod_extension[is_s.idx()] = cb.query_bool(); } + // Constraint 1 config.main_data = MainData::load(cb, &mut ctx.memory[main_memory()], 0.expr()); - // Don't allow an account node to follow an account node + // Constraint 2: Don't allow an account node to follow another account node require!(config.main_data.is_below_account => false); let mut key_rlc = vec![0.expr(); 2]; - let mut nonce = vec![Word::zero(); 2]; - let mut balance = vec![Word::zero(); 2]; - let mut storage = vec![Word::zero(); 2]; - let mut codehash = vec![Word::zero(); 2]; + let mut nonce = vec![WordLoHi::zero(); 2]; + let mut balance = vec![WordLoHi::zero(); 2]; + let mut storage = vec![WordLoHi::zero(); 2]; + let mut codehash = vec![WordLoHi::zero(); 2]; let mut leaf_no_key_rlc = vec![0.expr(); 2]; let mut leaf_no_key_rlc_mult = vec![0.expr(); 2]; let mut value_list_num_bytes = vec![0.expr(); 2]; let parent_data = &mut config.parent_data; + + // Constraint 3: parent_data[0] = ParentData::load(cb, &mut ctx.memory[parent_memory(true)], 0.expr()); + // Constraint 4: parent_data[1] = ParentData::load(cb, &mut ctx.memory[parent_memory(false)], 0.expr()); let key_data = &mut config.key_data; + // Constraint 5: key_data[0] = KeyData::load(cb, &mut ctx.memory[key_memory(true)], 0.expr()); + // Constraint 6: key_data[1] = KeyData::load(cb, &mut ctx.memory[key_memory(false)], 0.expr()); + // Constraint 7: IsEqualGadget using IsZeroGadget to determine the proof type + // Proof types + config.is_non_existing_account_proof = IsEqualGadget::construct( + &mut cb.base, + config.main_data.proof_type.expr(), + MPTProofType::AccountDoesNotExist.expr(), + ); + config.is_account_delete_mod = IsEqualGadget::construct( + &mut cb.base, + config.main_data.proof_type.expr(), + MPTProofType::AccountDestructed.expr(), + ); + config.is_nonce_mod = IsEqualGadget::construct( + &mut cb.base, + config.main_data.proof_type.expr(), + MPTProofType::NonceChanged.expr(), + ); + config.is_balance_mod = IsEqualGadget::construct( + &mut cb.base, + config.main_data.proof_type.expr(), + MPTProofType::BalanceChanged.expr(), + ); + config.is_storage_mod = IsEqualGadget::construct( + &mut cb.base, + config.main_data.proof_type.expr(), + MPTProofType::StorageChanged.expr(), + ); + config.is_codehash_mod = IsEqualGadget::construct( + &mut cb.base, + config.main_data.proof_type.expr(), + MPTProofType::CodeHashChanged.expr(), + ); + for is_s in [true, false] { ifx! {not!(config.is_mod_extension[is_s.idx()].expr()) => { // Placeholder leaf checks @@ -233,11 +272,39 @@ impl AccountLeafConfig { num_nibbles::expr(rlp_key.key_value.len(), key_data[is_s.idx()].is_odd.expr()); require!(key_data[is_s.idx()].num_nibbles.expr() + num_nibbles.expr() => KEY_LEN_IN_NIBBLES); - // Check if the account is in its parent. - // Check is skipped for placeholder leaves which are dummy leaves - ifx! {not!(and::expr(&[not!(parent_data[is_s.idx()].is_placeholder), config.is_placeholder_leaf[is_s.idx()].expr()])) => { + // Check if the leaf is in its parent. + // Check is skipped for placeholder leaves which are dummy leaves. + // Contrary to the storage leaf, the account leaf is always hashed since its length + // is always greater than 32. + // Note that the constraint works for the case when there is the placeholder branch above + // the leaf too - in this case `parent_data.hash` contains the hash of the node above the placeholder + // branch. + ifx! {not!(config.is_placeholder_leaf[is_s.idx()]) => { let hash = parent_data[is_s.idx()].hash.expr(); require!((1.expr(), leaf_rlc, rlp_key.rlp_list.num_bytes(), hash.lo(), hash.hi()) =>> @KECCAK); + } elsex { + // For NonExistingAccountProof prove there is no leaf. + + // When there is only one leaf in the trie, `getProof` will always return this leaf - so we will have + // either the required leaf or the wrong leaf, so for NonExistingAccountProof we don't handle this + // case here (handled by WrongLeaf gadget). + ifx! {config.is_non_existing_account_proof.expr() => { + ifx! {parent_data[is_s.idx()].is_root.expr() => { + // If leaf is placeholder and the parent is root (no branch above leaf) and the proof is NonExistingStorageProof, + // the trie needs to be empty. + let empty_hash = WordLoHi::::from(U256::from_big_endian(&EMPTY_TRIE_HASH)); + let hash = parent_data[is_s.idx()].hash.expr(); + require!(hash.lo() => Expression::Constant(empty_hash.lo())); + require!(hash.hi() => Expression::Constant(empty_hash.hi())); + } elsex { + // For NonExistingAccountProof we need to prove that there is nil in the parent branch + // at the `modified_pos` position. + // Note that this does not hold when there is NonExistingAccountProof wrong leaf scenario, + // in this case there is a non-nil leaf. However, in this case the leaf is not a placeholder, + // so the check below is not triggered. + require!(parent_data[is_s.idx()].rlc.expr() => 128.expr()); + }} + }} }} // Check the RLP encoding consistency. @@ -282,38 +349,6 @@ impl AccountLeafConfig { ); }}; - // Proof types - config.is_non_existing_account_proof = IsEqualGadget::construct( - &mut cb.base, - config.main_data.proof_type.expr(), - MPTProofType::AccountDoesNotExist.expr(), - ); - config.is_account_delete_mod = IsEqualGadget::construct( - &mut cb.base, - config.main_data.proof_type.expr(), - MPTProofType::AccountDestructed.expr(), - ); - config.is_nonce_mod = IsEqualGadget::construct( - &mut cb.base, - config.main_data.proof_type.expr(), - MPTProofType::NonceChanged.expr(), - ); - config.is_balance_mod = IsEqualGadget::construct( - &mut cb.base, - config.main_data.proof_type.expr(), - MPTProofType::BalanceChanged.expr(), - ); - config.is_storage_mod = IsEqualGadget::construct( - &mut cb.base, - config.main_data.proof_type.expr(), - MPTProofType::StorageChanged.expr(), - ); - config.is_codehash_mod = IsEqualGadget::construct( - &mut cb.base, - config.main_data.proof_type.expr(), - MPTProofType::CodeHashChanged.expr(), - ); - // Drifted leaf handling config.drifted = DriftedGadget::construct( cb, @@ -426,28 +461,49 @@ impl AccountLeafConfig { let address = address_item.word().compress(); ifx! {not!(config.parent_data[false.idx()].is_placeholder) => { - ctx.mpt_table.constrain( - meta, - &mut cb.base, - address.clone(), - proof_type.clone(), - Word::zero(), - config.main_data.new_root.expr(), - config.main_data.old_root.expr(), - Word::>::new([new_value_lo, new_value_hi]), - Word::>::new([old_value_lo.clone(), old_value_hi.clone()]), - ); + ifx! {not!(config.is_non_existing_account_proof) => { + ctx.mpt_table.constrain( + meta, + &mut cb.base, + address.clone(), + proof_type.clone(), + WordLoHi::zero(), + config.main_data.new_root.expr(), + config.main_data.old_root.expr(), + WordLoHi::>::new([new_value_lo, new_value_hi]), + WordLoHi::>::new([old_value_lo.clone(), old_value_hi.clone()]), + ); + } elsex { + // Non-existing proof doesn't have the value set to 0 in the case of a wrong leaf - we set it to 0 + // below to enable lookups with the value set to 0 (as in the case of a non-wrong non-existing proof). + ctx.mpt_table.constrain( + meta, + &mut cb.base, + address.clone(), + proof_type.clone(), + WordLoHi::zero(), + config.main_data.new_root.expr(), + config.main_data.old_root.expr(), + WordLoHi::zero(), + WordLoHi::zero(), + ); + }}; } elsex { + // When the value is set to 0, the leaf is deleted, and if there were only two leaves in the branch, + // the neighbour leaf moves one level up and replaces the branch. When the lookup is executed with + // the new value set to 0, the lookup fails (without the code below), because the leaf that is returned + // is the neighbour node that moved up (because the branch and the old leaf doesn’t exist anymore), + // but this leaf doesn’t have the zero value. ctx.mpt_table.constrain( meta, &mut cb.base, address, proof_type, - Word::zero(), + WordLoHi::zero(), config.main_data.new_root.expr(), config.main_data.old_root.expr(), - Word::zero(), - Word::>::new([old_value_lo, old_value_hi]), + WordLoHi::zero(), + WordLoHi::>::new([old_value_lo, old_value_hi]), ); }}; }); @@ -498,10 +554,10 @@ impl AccountLeafConfig { // Key let mut key_rlc = vec![0.scalar(); 2]; - let mut nonce = vec![Word::zero_f(); 2]; - let mut balance = vec![Word::zero_f(); 2]; - let mut storage = vec![Word::zero_f(); 2]; - let mut codehash = vec![Word::zero_f(); 2]; + let mut nonce = vec![WordLoHi::zero(); 2]; + let mut balance = vec![WordLoHi::zero(); 2]; + let mut storage = vec![WordLoHi::zero(); 2]; + let mut codehash = vec![WordLoHi::zero(); 2]; let mut key_data = vec![KeyDataWitness::default(); 2]; let mut parent_data = vec![ParentDataWitness::default(); 2]; for is_s in [true, false] { @@ -671,11 +727,11 @@ impl AccountLeafConfig { } else if is_codehash_mod { (MPTProofType::CodeHashChanged, codehash) } else if is_account_delete_mod { - (MPTProofType::AccountDestructed, vec![Word::zero_f(); 2]) + (MPTProofType::AccountDestructed, vec![WordLoHi::zero(); 2]) } else if is_non_existing_proof { - (MPTProofType::AccountDoesNotExist, vec![Word::zero_f(); 2]) + (MPTProofType::AccountDoesNotExist, vec![WordLoHi::zero(); 2]) } else { - (MPTProofType::Disabled, vec![Word::zero_f(); 2]) + (MPTProofType::Disabled, vec![WordLoHi::zero(); 2]) }; if account.is_mod_extension[0] || account.is_mod_extension[1] { @@ -688,8 +744,12 @@ impl AccountLeafConfig { } let mut new_value = value[false.idx()]; + let mut old_value = value[true.idx()]; if parent_data[false.idx()].is_placeholder { - new_value = word::Word::zero_f(); + new_value = WordLoHi::zero(); + } else if is_non_existing_proof { + new_value = WordLoHi::zero(); + old_value = WordLoHi::zero(); } mpt_config.mpt_table.assign_cached( region, @@ -698,12 +758,12 @@ impl AccountLeafConfig { address: Value::known(from_bytes::value( &account.address.iter().cloned().rev().collect::>(), )), - storage_key: word::Word::zero_f().into_value(), + storage_key: WordLoHi::zero().into_value(), proof_type: Value::known(proof_type.scalar()), new_root: main_data.new_root.into_value(), old_root: main_data.old_root.into_value(), new_value: new_value.into_value(), - old_value: value[true.idx()].into_value(), + old_value: old_value.into_value(), }, )?; diff --git a/zkevm-circuits/src/mpt_circuit/branch.rs b/zkevm-circuits/src/mpt_circuit/branch.rs index 5909eb0c8a..56ba3e8312 100644 --- a/zkevm-circuits/src/mpt_circuit/branch.rs +++ b/zkevm-circuits/src/mpt_circuit/branch.rs @@ -1,4 +1,4 @@ -use eth_types::Field; +use eth_types::{Field, OpsIdentity}; use gadgets::util::Scalar; use halo2_proofs::plonk::{Error, Expression, VirtualCells}; @@ -13,7 +13,7 @@ use crate::{ circuit, circuit_tools::{ cached_region::CachedRegion, - cell_manager::{Cell, WordCell}, + cell_manager::{Cell, WordLoHiCell}, constraint_builder::RLCChainableRev, gadgets::LtGadget, }, @@ -22,7 +22,7 @@ use crate::{ param::{HASH_WIDTH, RLP_NIL}, MPTConfig, MptMemory, RlpItemType, }, - util::word::{self, Word}, + util::word::WordLoHi, }; #[derive(Clone, Debug)] @@ -33,7 +33,7 @@ pub(crate) struct BranchState { pub(crate) key_mult_post_drifted: Expression, pub(crate) num_nibbles: Expression, pub(crate) is_key_odd: Expression, - pub(crate) mod_word: [Word>; 2], + pub(crate) mod_word: [WordLoHi>; 2], pub(crate) mod_rlc: [Expression; 2], } @@ -42,7 +42,7 @@ pub(crate) struct BranchGadget { rlp_list: [RLPListDataGadget; 2], is_modified: [Cell; ARITY], is_drifted: [Cell; ARITY], - mod_word: [WordCell; 2], + mod_word: [WordLoHiCell; 2], mod_rlc: [Cell; 2], is_not_hashed: [LtGadget; 2], @@ -57,7 +57,7 @@ impl BranchGadget { cb: &mut MPTConstraintBuilder, ctx: MPTContext, is_placeholder: &[Cell; 2], - parent_hash: &[word::Word>; 2], + parent_hash: &[WordLoHi>; 2], parent_rlc: &[Expression; 2], is_root: &[Expression; 2], key_rlc: Expression, @@ -299,7 +299,7 @@ impl BranchGadget { is_key_odd: &mut bool, node: &Node, rlp_values: &[RLPItemWitness], - ) -> Result<(F, F, F, [word::Word; 2], [F; 2]), Error> { + ) -> Result<(F, F, F, [WordLoHi; 2], [F; 2]), Error> { let branch = &node.extension_branch.clone().unwrap().branch; for is_s in [true, false] { @@ -351,7 +351,7 @@ impl BranchGadget { let key_mult_post_branch = *key_mult * mult; // Set the branch we'll take - let mut mod_node_hash_word = [word::Word::zero_f(); 2]; + let mut mod_node_hash_word = [WordLoHi::zero(); 2]; let mut mod_node_hash_rlc = [0.scalar(); 2]; for is_s in [true, false] { ( diff --git a/zkevm-circuits/src/mpt_circuit/extension.rs b/zkevm-circuits/src/mpt_circuit/extension.rs index 4663bdea09..e3ed78e819 100644 --- a/zkevm-circuits/src/mpt_circuit/extension.rs +++ b/zkevm-circuits/src/mpt_circuit/extension.rs @@ -1,4 +1,4 @@ -use eth_types::Field; +use eth_types::{Field, OpsIdentity}; use gadgets::util::{pow, Scalar}; use halo2_proofs::plonk::{Error, Expression, VirtualCells}; @@ -22,7 +22,7 @@ use crate::{ param::HASH_WIDTH, FixedTableTag, MPTConfig, MptMemory, RlpItemType, }, - util::word::Word, + util::word::WordLoHi, }; #[derive(Clone, Debug)] @@ -32,7 +32,7 @@ pub(crate) struct ExtState { pub(crate) num_nibbles: Expression, pub(crate) is_key_odd: Expression, - pub(crate) branch_rlp_word: [Word>; 2], + pub(crate) branch_rlp_word: [WordLoHi>; 2], pub(crate) branch_rlp_rlc: [Expression; 2], } @@ -61,7 +61,7 @@ impl ExtensionGadget { circuit!([meta, cb], { // Data let key_items = [ - // Special case, requring string fail tests + // Special case, requiring string fail tests ctx.rlp_item( meta, cb, @@ -100,7 +100,7 @@ impl ExtensionGadget { require!((FixedTableTag::ExtOddKey.expr(), first_byte, config.is_key_part_odd.expr()) =>> @FIXED); let mut branch_rlp_rlc = vec![0.expr(); 2]; - let mut branch_rlp_word = vec![Word::zero(); 2]; + let mut branch_rlp_word = vec![WordLoHi::zero(); 2]; for is_s in [true, false] { // In C we have the key nibbles, we check below only for S. if is_s { diff --git a/zkevm-circuits/src/mpt_circuit/extension_branch.rs b/zkevm-circuits/src/mpt_circuit/extension_branch.rs index fa69a12f2a..920136e550 100644 --- a/zkevm-circuits/src/mpt_circuit/extension_branch.rs +++ b/zkevm-circuits/src/mpt_circuit/extension_branch.rs @@ -1,4 +1,4 @@ -use eth_types::Field; +use eth_types::{Field, OpsIdentity}; use gadgets::util::Scalar; use halo2_proofs::plonk::{Error, Expression, VirtualCells}; @@ -17,7 +17,7 @@ use crate::{ helpers::{key_memory, parent_memory, Indexable, KeyData, ParentData}, MPTConfig, MptMemory, }, - util::word::Word, + util::word::WordLoHi, }; #[derive(Clone, Debug, Default)] @@ -114,8 +114,8 @@ impl ExtensionBranchConfig { ) }}; let parent_word = [ - Word::>::new([parent_word_s_lo, parent_word_s_hi]), - Word::>::new([parent_word_c_lo, parent_word_c_hi]), + WordLoHi::>::new([parent_word_s_lo, parent_word_s_hi]), + WordLoHi::>::new([parent_word_c_lo, parent_word_c_hi]), ]; let parent_rlc = [parent_rlc_s, parent_rlc_c]; let is_root = [is_root_s, is_root_c]; @@ -158,9 +158,13 @@ impl ExtensionBranchConfig { branch.mod_rlc[is_s.idx()].expr(), false.expr(), false.expr(), - Word::zero(), + WordLoHi::zero(), ); } elsex { + // For the placeholder branch / extension node the values did not change, we reuse + // the previous values. These values are used in the leaf after the placeholder branch + // - this way we can use `KeyData` and `ParentData` in the leaf as in the cases of + // the leaf after the non-placeholder branch. KeyData::store( cb, &mut ctx.memory[key_memory(is_s)], @@ -287,7 +291,7 @@ impl ExtensionBranchConfig { mod_node_hash_rlc[is_s.idx()], false, false, - Word::zero_f(), + WordLoHi::zero(), )?; } else { KeyData::witness_store( diff --git a/zkevm-circuits/src/mpt_circuit/helpers.rs b/zkevm-circuits/src/mpt_circuit/helpers.rs index 44ab29c394..b780b47a63 100644 --- a/zkevm-circuits/src/mpt_circuit/helpers.rs +++ b/zkevm-circuits/src/mpt_circuit/helpers.rs @@ -2,7 +2,7 @@ use crate::{ assign, circuit, circuit_tools::{ cached_region::{CachedRegion, ChallengeSet}, - cell_manager::{Cell, CellManager, CellType, WordCell}, + cell_manager::{Cell, CellManager, CellType, WordLoHiCell}, constraint_builder::{ ConstraintBuilder, RLCChainable, RLCChainableRev, RLCChainableValue, RLCable, }, @@ -22,12 +22,9 @@ use crate::{ rlp_gadgets::{get_ext_odd_nibble, get_terminal_odd_nibble}, }, table::LookupTable, - util::{ - word::{self, Word}, - Challenges, Expr, - }, + util::{word::WordLoHi, Challenges, Expr}, }; -use eth_types::{Field, Word as U256}; +use eth_types::{Field, OpsIdentity, Word as U256}; use gadgets::util::{not, or, pow, xor, Scalar}; use halo2_proofs::{ circuit::Value, @@ -557,20 +554,20 @@ impl KeyData { #[derive(Clone, Debug, Default)] pub(crate) struct ParentData { - pub(crate) hash: WordCell, + pub(crate) hash: WordLoHiCell, pub(crate) rlc: Cell, pub(crate) is_root: Cell, pub(crate) is_placeholder: Cell, - pub(crate) drifted_parent_hash: WordCell, + pub(crate) drifted_parent_hash: WordLoHiCell, } #[derive(Clone, Debug, Default)] pub(crate) struct ParentDataWitness { - pub(crate) hash: word::Word, + pub(crate) hash: WordLoHi, pub(crate) rlc: F, pub(crate) is_root: bool, pub(crate) is_placeholder: bool, - pub(crate) drifted_parent_hash: word::Word, + pub(crate) drifted_parent_hash: WordLoHi, } impl ParentData { @@ -607,11 +604,11 @@ impl ParentData { pub(crate) fn store>( cb: &mut MPTConstraintBuilder, memory: &mut MB, - hash: word::Word>, + hash: WordLoHi>, rlc: Expression, is_root: Expression, is_placeholder: Expression, - drifted_parent_hash: word::Word>, + drifted_parent_hash: WordLoHi>, ) { memory.store( &mut cb.base, @@ -632,11 +629,11 @@ impl ParentData { _region: &mut CachedRegion<'_, '_, F>, offset: usize, memory: &mut MB, - hash: word::Word, + hash: WordLoHi, rlc: F, force_hashed: bool, is_placeholder: bool, - drifted_parent_hash: word::Word, + drifted_parent_hash: WordLoHi, ) -> Result<(), Error> { memory.witness_store( offset, @@ -675,11 +672,11 @@ impl ParentData { .assign(region, offset, values[6])?; Ok(ParentDataWitness { - hash: word::Word::new([values[0], values[1]]), + hash: WordLoHi::new([values[0], values[1]]), rlc: values[2], is_root: values[3] == 1.scalar(), is_placeholder: values[4] == 1.scalar(), - drifted_parent_hash: word::Word::new([values[5], values[6]]), + drifted_parent_hash: WordLoHi::new([values[5], values[6]]), }) } } @@ -689,8 +686,8 @@ pub(crate) struct MainData { pub(crate) proof_type: Cell, pub(crate) is_below_account: Cell, pub(crate) address: Cell, - pub(crate) new_root: WordCell, - pub(crate) old_root: WordCell, + pub(crate) new_root: WordLoHiCell, + pub(crate) old_root: WordLoHiCell, } #[derive(Clone, Debug, Default)] @@ -698,8 +695,8 @@ pub(crate) struct MainDataWitness { pub(crate) proof_type: usize, pub(crate) is_below_account: bool, pub(crate) address: F, - pub(crate) new_root: word::Word, - pub(crate) old_root: word::Word, + pub(crate) new_root: WordLoHi, + pub(crate) old_root: WordLoHi, } impl MainData { @@ -749,8 +746,8 @@ impl MainData { proof_type: usize, is_below_account: bool, address: F, - new_root: word::Word, - old_root: word::Word, + new_root: WordLoHi, + old_root: WordLoHi, ) -> Result<(), Error> { let values = [ proof_type.scalar(), @@ -787,8 +784,8 @@ impl MainData { proof_type: values[0].get_lower_32() as usize, is_below_account: values[1] == 1.scalar(), address: values[2], - new_root: word::Word::new([values[3], values[4]]), - old_root: word::Word::new([values[5], values[6]]), + new_root: WordLoHi::new([values[3], values[4]]), + old_root: WordLoHi::new([values[5], values[6]]), }) } } @@ -992,7 +989,7 @@ impl MPTConstraintBuilder { } // default query_word is 2 limbs. Each limb is not guaranteed to be 128 bits. - pub(crate) fn query_word_unchecked(&mut self) -> WordCell { + pub(crate) fn query_word_unchecked(&mut self) -> WordLoHiCell { self.base.query_word_unchecked() } @@ -1069,20 +1066,20 @@ pub struct IsPlaceholderLeafGadget { impl IsPlaceholderLeafGadget { pub(crate) fn construct( cb: &mut MPTConstraintBuilder, - parent_word: Word>, + parent_word: WordLoHi>, ) -> Self { circuit!([meta, cb.base], { - let empty_hash = Word::::from(U256::from_big_endian(&EMPTY_TRIE_HASH)); + let empty_hash = WordLoHi::::from(U256::from_big_endian(&EMPTY_TRIE_HASH)); let is_empty_trie = IsEqualWordGadget::construct( &mut cb.base, &parent_word, - &Word::>::new([ + &WordLoHi::>::new([ Expression::Constant(empty_hash.lo()), Expression::Constant(empty_hash.hi()), ]), ); let is_nil_in_branch_at_mod_index = - IsEqualWordGadget::construct(&mut cb.base, &parent_word, &Word::zero()); + IsEqualWordGadget::construct(&mut cb.base, &parent_word, &WordLoHi::zero()); Self { is_empty_trie, @@ -1102,16 +1099,16 @@ impl IsPlaceholderLeafGadget { &self, region: &mut CachedRegion<'_, '_, F>, offset: usize, - hash: Word, + hash: WordLoHi, ) -> Result<(), Error> { - let empty_hash = Word::::from(U256::from_big_endian(&EMPTY_TRIE_HASH)); + let empty_hash = WordLoHi::::from(U256::from_big_endian(&EMPTY_TRIE_HASH)); self.is_empty_trie .assign(region, offset, hash, empty_hash)?; self.is_nil_in_branch_at_mod_index.assign( region, offset, hash, - Word::::from(U256::zero()), + WordLoHi::::from(U256::zero()), )?; Ok(()) } @@ -1222,14 +1219,14 @@ impl WrongGadget { key_value: &RLPItemView, key_rlc: &Expression, expected_item: &RLPItemView, - is_in_empty_tree: Expression, + is_placeholder: Expression, key_data: KeyData, r: &Expression, ) -> Self { let mut config = WrongGadget::default(); circuit!([meta, cb.base], { // Get the previous key data - ifx! {(is_non_existing, not!(is_in_empty_tree)) => { + ifx! {(is_non_existing, not!(is_placeholder)) => { // Calculate the key config.wrong_rlp_key = ListKeyGadget::construct(cb, expected_item); let key_rlc_wrong = key_data.rlc.expr() + config.wrong_rlp_key.key.expr( @@ -1309,7 +1306,7 @@ pub struct MainRLPGadget { mult_diff: Cell, hash_rlc: Cell, rlc_rlp: Cell, - word: WordCell, + word: WordLoHiCell, tag: Cell, max_len: Cell, is_rlp: Cell, @@ -1342,7 +1339,7 @@ impl MainRLPGadget { ensure_minimal_rlp: cb.query_cell(), keccak_r: Some(cb.keccak_r.expr()), }; - let all_bytes = vec![vec![config.rlp_byte.clone()], config.bytes.clone()].concat(); + let all_bytes = [vec![config.rlp_byte.clone()], config.bytes.clone()].concat(); // Decode the RLP item config.rlp = @@ -1587,7 +1584,7 @@ impl MainRLPGadget { .collect(), is_short: Some(self.rlp.value.is_short.rot(meta, rot)), is_long: Some(self.rlp.value.is_long.rot(meta, rot)), - word: Some(Word::new([ + word: Some(WordLoHi::new([ self.word.lo().rot(meta, rot), self.word.hi().rot(meta, rot), ])), @@ -1635,7 +1632,7 @@ pub struct RLPItemView { rlc_rlp: Option>, is_short: Option>, is_long: Option>, - word: Option>>, + word: Option>>, } impl RLPItemView { @@ -1685,7 +1682,7 @@ impl RLPItemView { not::expr(self.is_short() + self.is_long()) } - pub(crate) fn word(&self) -> Word> { + pub(crate) fn word(&self) -> WordLoHi> { assert!(self.can_use_word); self.word.clone().unwrap() } diff --git a/zkevm-circuits/src/mpt_circuit/mod_extension.rs b/zkevm-circuits/src/mpt_circuit/mod_extension.rs index e5c2721048..c1ea30addd 100644 --- a/zkevm-circuits/src/mpt_circuit/mod_extension.rs +++ b/zkevm-circuits/src/mpt_circuit/mod_extension.rs @@ -100,8 +100,8 @@ impl ModExtensionGadget { (parent_data[1].hash.lo().expr(), parent_data[1].hash.hi().expr(), parent_data[1].drifted_parent_hash.lo().expr(), parent_data[1].drifted_parent_hash.hi().expr()) }}; - let parent_data_lo = vec![lo_s, lo_c]; - let parent_data_hi = vec![hi_s, hi_c]; + let parent_data_lo = [lo_s, lo_c]; + let parent_data_hi = [hi_s, hi_c]; let ( parent_data_rlc, key_rlc_before, @@ -139,7 +139,7 @@ impl ModExtensionGadget { for is_s in [true, false] { config.is_key_part_odd[is_s.idx()] = cb.query_cell(); - let items = vec![ + let items = [ key_items[is_s.idx()].clone(), key_nibbles[is_s.idx()].clone(), ]; diff --git a/zkevm-circuits/src/mpt_circuit/rlp_gadgets.rs b/zkevm-circuits/src/mpt_circuit/rlp_gadgets.rs index d86f0b1c02..b1218c7994 100644 --- a/zkevm-circuits/src/mpt_circuit/rlp_gadgets.rs +++ b/zkevm-circuits/src/mpt_circuit/rlp_gadgets.rs @@ -12,7 +12,7 @@ use crate::{ param::{RLP_LIST_LONG, RLP_LIST_SHORT, RLP_SHORT}, FixedTableTag, }, - util::{word, Expr}, + util::{word::WordLoHi, Expr}, }; use eth_types::Field; use gadgets::util::{not, pow, Scalar}; @@ -833,8 +833,8 @@ impl RLPItemWitness { } } - pub(crate) fn word(&self) -> word::Word { - // word::Word::from(Word::from_big_endian(&self.bytes[1..33])) + pub(crate) fn word(&self) -> WordLoHi { + // WordLoHi::from(WordLoHi::from_big_endian(&self.bytes[1..33])) let (lo, hi) = if self.is_string() { if self.is_short() { let lo: F = self.bytes[0].scalar(); @@ -890,6 +890,6 @@ impl RLPItemWitness { ); (lo, hi) }; - word::Word::new([lo, hi]) + WordLoHi::new([lo, hi]) } } diff --git a/zkevm-circuits/src/mpt_circuit/start.rs b/zkevm-circuits/src/mpt_circuit/start.rs index ae9d1ab40b..37ee126e36 100644 --- a/zkevm-circuits/src/mpt_circuit/start.rs +++ b/zkevm-circuits/src/mpt_circuit/start.rs @@ -13,9 +13,9 @@ use crate::{ }, MPTConfig, MPTContext, MptMemory, RlpItemType, }, - util::word::Word, + util::word::WordLoHi, }; -use eth_types::Field; +use eth_types::{Field, OpsIdentity}; use gadgets::util::Scalar; use halo2_proofs::plonk::{Error, VirtualCells}; @@ -40,7 +40,7 @@ impl StartConfig { config.proof_type = cb.query_cell(); - let mut root = vec![Word::zero(); 2]; + let mut root = vec![WordLoHi::zero(); 2]; for is_s in [true, false] { root[is_s.idx()] = root_items[is_s.idx()].word(); } @@ -96,7 +96,7 @@ impl StartConfig { self.proof_type .assign(region, offset, start.proof_type.scalar())?; - let mut root = vec![Word::zero_f(); 2]; + let mut root = [WordLoHi::zero(); 2]; for is_s in [true, false] { root[is_s.idx()] = rlp_values[is_s.idx()].word(); } diff --git a/zkevm-circuits/src/mpt_circuit/storage_leaf.rs b/zkevm-circuits/src/mpt_circuit/storage_leaf.rs index e7edc5393a..6a698a8195 100644 --- a/zkevm-circuits/src/mpt_circuit/storage_leaf.rs +++ b/zkevm-circuits/src/mpt_circuit/storage_leaf.rs @@ -1,4 +1,4 @@ -use eth_types::Field; +use eth_types::{Field, OpsIdentity, U256}; use gadgets::util::Scalar; use halo2_proofs::{ circuit::Value, @@ -20,11 +20,11 @@ use crate::{ IsPlaceholderLeafGadget, KeyData, MPTConstraintBuilder, MainData, ParentData, ParentDataWitness, KECCAK, }, - param::KEY_LEN_IN_NIBBLES, + param::{EMPTY_TRIE_HASH, KEY_LEN_IN_NIBBLES}, MPTConfig, MPTContext, MptMemory, RlpItemType, }, table::MPTProofType, - util::word::{self, Word}, + util::word::WordLoHi, witness::MptUpdateRow, }; @@ -104,7 +104,7 @@ impl StorageLeafConfig { require!(config.main_data.is_below_account => true); let mut key_rlc = vec![0.expr(); 2]; - let mut value_word = vec![Word::zero(); 2]; + let mut value_word = vec![WordLoHi::zero(); 2]; let mut value_rlp_rlc = vec![0.expr(); 2]; let mut value_rlp_rlc_mult = vec![0.expr(); 2]; @@ -116,6 +116,18 @@ impl StorageLeafConfig { key_data[0] = KeyData::load(cb, &mut ctx.memory[key_memory(true)], 0.expr()); key_data[1] = KeyData::load(cb, &mut ctx.memory[key_memory(false)], 0.expr()); + // Proof types + config.is_storage_mod_proof = IsEqualGadget::construct( + &mut cb.base, + config.main_data.proof_type.expr(), + MPTProofType::StorageChanged.expr(), + ); + config.is_non_existing_storage_proof = IsEqualGadget::construct( + &mut cb.base, + config.main_data.proof_type.expr(), + MPTProofType::StorageDoesNotExist.expr(), + ); + for is_s in [true, false] { ifx! {not!(config.is_mod_extension[is_s.idx()].expr()) => { // Placeholder leaf checks @@ -156,7 +168,7 @@ impl StorageLeafConfig { require!(config.rlp_value[is_s.idx()].num_bytes() => value_item[is_s.idx()].num_bytes() + 1.expr()); (value.lo(), value.hi(), value_rlp_rlc, rlp_value_rlc_mult.1 * value_item[is_s.idx()].mult()) }}; - value_word[is_s.idx()] = Word::>::new([value_lo, value_hi]); + value_word[is_s.idx()] = WordLoHi::>::new([value_lo, value_hi]); let leaf_rlc = rlp_key.rlc2(&cb.keccak_r).rlc_chain_rev(( value_rlp_rlc[is_s.idx()].expr(), @@ -179,25 +191,52 @@ impl StorageLeafConfig { // Placeholder leaves default to value `0`. ifx! {is_placeholder_leaf => { - require!(value_word[is_s.idx()] => Word::zero()); + require!(value_word[is_s.idx()] => WordLoHi::>::zero()); }} // Make sure the RLP encoding is correct. // storage = [key, "value"] require!(rlp_key.rlp_list.len() => key_items[is_s.idx()].num_bytes() + config.rlp_value[is_s.idx()].num_bytes()); - // Check if the account is in its parent. - // Check is skipped for placeholder leaves which are dummy leaves + // Check if the leaf is in its parent. + // Check is skipped for placeholder leaves which are dummy leaves. + // Note that the constraint works for the case when there is the placeholder branch above + // the leaf too - in this case `parent_data.hash` contains the hash of the node above the placeholder + // branch. ifx! {not!(is_placeholder_leaf) => { config.is_not_hashed[is_s.idx()] = LtGadget::construct(&mut cb.base, rlp_key.rlp_list.num_bytes(), 32.expr()); ifx!{or::expr(&[parent_data[is_s.idx()].is_root.expr(), not!(config.is_not_hashed[is_s.idx()])]) => { - // Hashed branch hash in parent branch + // Hashed leaf in parent branch let hash = parent_data[is_s.idx()].hash.expr(); require!((1.expr(), leaf_rlc.expr(), rlp_key.rlp_list.num_bytes(), hash.lo(), hash.hi()) =>> @KECCAK); } elsex { - // Non-hashed branch hash in parent branch + // Non-hashed leaf in parent branch require!(leaf_rlc => parent_data[is_s.idx()].rlc.expr()); }} + } elsex { + // For NonExistingStorageProof prove there is no leaf. + + // When there is only one leaf in the trie, `getProof` will always return this leaf - so we will have + // either the required leaf or the wrong leaf, so for NonExistingStorageProof we don't handle this + // case here (handled by WrongLeaf gadget). + ifx! {config.is_non_existing_storage_proof.expr() => { + ifx! {parent_data[is_s.idx()].is_root.expr() => { + // If leaf is placeholder and the parent is root (no branch above leaf) and the proof is NonExistingStorageProof, + // the trie needs to be empty. + let empty_hash = WordLoHi::::from(U256::from_big_endian(&EMPTY_TRIE_HASH)); + let hash = parent_data[is_s.idx()].hash.expr(); + require!(hash.lo() => Expression::Constant(empty_hash.lo())); + require!(hash.hi() => Expression::Constant(empty_hash.hi())); + } elsex { + // For NonExistingStorageProof we need to prove that there is nil in the parent branch + // at the `modified_pos` position. + // Note that this does not hold when there is NonExistingStorageProof wrong leaf scenario, + // in this case there is a non-nil leaf. However, in this case the leaf is not a placeholder, + // so the check below is not triggered. + require!(parent_data[is_s.idx()].rlc.expr() => 128.expr()); + }} + + }} }} }}; @@ -207,11 +246,11 @@ impl StorageLeafConfig { ParentData::store( cb, &mut ctx.memory[parent_memory(is_s)], - word::Word::zero(), + WordLoHi::zero(), 0.expr(), true.expr(), false.expr(), - word::Word::zero(), + WordLoHi::zero(), ); } @@ -225,18 +264,6 @@ impl StorageLeafConfig { ); }}; - // Proof types - config.is_storage_mod_proof = IsEqualGadget::construct( - &mut cb.base, - config.main_data.proof_type.expr(), - MPTProofType::StorageChanged.expr(), - ); - config.is_non_existing_storage_proof = IsEqualGadget::construct( - &mut cb.base, - config.main_data.proof_type.expr(), - MPTProofType::StorageDoesNotExist.expr(), - ); - // Drifted leaf handling config.drifted = DriftedGadget::construct( cb, @@ -311,19 +338,55 @@ impl StorageLeafConfig { } }}; + ifx! {not!(config.is_non_existing_storage_proof) => { + let key_rlc = ifx!{not!(config.parent_data[true.idx()].is_placeholder) => { + key_rlc[true.idx()].expr() + } elsex { + key_rlc[false.idx()].expr() + }}; + // Check that the key item contains the correct key for the path that was taken + require!(key_item.hash_rlc() => key_rlc); + // Check if the key is correct for the given address + if ctx.params.is_preimage_check_enabled() { + let key = key_item.word(); + require!((1.expr(), address_item.bytes_le()[1..33].rlc(&cb.keccak_r), 32.expr(), key.lo(), key.hi()) =>> @KECCAK); + } + }}; + ifx! {not!(config.parent_data[false.idx()].is_placeholder) => { - ctx.mpt_table.constrain( - meta, - &mut cb.base, - config.main_data.address.expr(), - proof_type.clone(), - address_item.word(), - config.main_data.new_root.expr(), - config.main_data.old_root.expr(), - value_word[false.idx()].clone(), - value_word[true.idx()].clone(), - ); + ifx! {not!(config.is_non_existing_storage_proof) => { + ctx.mpt_table.constrain( + meta, + &mut cb.base, + config.main_data.address.expr(), + proof_type.clone(), + address_item.word(), + config.main_data.new_root.expr(), + config.main_data.old_root.expr(), + value_word[false.idx()].clone(), + value_word[true.idx()].clone(), + ); + } elsex { + // Non-existing proof doesn't have the value set to 0 in the case of a wrong leaf - we set it to 0 + // below to enable lookups with the value set to 0 (as in the case of a non-wrong non-existing proof). + ctx.mpt_table.constrain( + meta, + &mut cb.base, + config.main_data.address.expr(), + proof_type.clone(), + address_item.word(), + config.main_data.new_root.expr(), + config.main_data.old_root.expr(), + WordLoHi::>::new([0.expr(), 0.expr()]), + WordLoHi::>::new([0.expr(), 0.expr()]), + ); + }}; } elsex { + // When the value is set to 0, the leaf is deleted, and if there were only two leaves in the branch, + // the neighbour leaf moves one level up and replaces the branch. When the lookup is executed with + // the new value set to 0, the lookup fails (without the code below), because the leaf that is returned + // is the neighbour node that moved up (because the branch and the old leaf doesn’t exist anymore), + // but this leaf doesn’t have the zero value. ctx.mpt_table.constrain( meta, &mut cb.base, @@ -332,7 +395,7 @@ impl StorageLeafConfig { address_item.word(), config.main_data.new_root.expr(), config.main_data.old_root.expr(), - Word::zero(), + WordLoHi::zero(), value_word[true.idx()].clone(), ); }}; @@ -373,7 +436,7 @@ impl StorageLeafConfig { let mut key_data = vec![KeyDataWitness::default(); 2]; let mut parent_data = vec![ParentDataWitness::default(); 2]; let mut key_rlc = vec![0.scalar(); 2]; - let mut value_word = vec![Word::zero_f(); 2]; + let mut value_word = [WordLoHi::zero(); 2]; for is_s in [true, false] { self.is_mod_extension[is_s.idx()].assign( region, @@ -441,7 +504,7 @@ impl StorageLeafConfig { &storage.value_rlp_bytes[is_s.idx()], )?; value_word[is_s.idx()] = if value_witness.is_short() { - Word::::new([value_witness.rlc_value(region.key_r), 0.scalar()]) + WordLoHi::::new([value_witness.rlc_value(region.key_r), 0.scalar()]) } else { value_item[is_s.idx()].word() }; @@ -450,11 +513,11 @@ impl StorageLeafConfig { region, offset, &mut memory[parent_memory(is_s)], - word::Word::::new([F::ZERO, F::ZERO]), + WordLoHi::::new([F::ZERO, F::ZERO]), F::ZERO, true, false, - word::Word::::new([F::ZERO, F::ZERO]), + WordLoHi::::new([F::ZERO, F::ZERO]), )?; self.is_placeholder_leaf[is_s.idx()].assign( @@ -508,8 +571,8 @@ impl StorageLeafConfig { MPTProofType::Disabled as usize, false, F::ZERO, - Word::new([F::ZERO, F::ZERO]), - Word::new([F::ZERO, F::ZERO]), + WordLoHi::new([F::ZERO, F::ZERO]), + WordLoHi::new([F::ZERO, F::ZERO]), )?; // Put the data in the lookup table @@ -531,8 +594,12 @@ impl StorageLeafConfig { } let mut new_value = value_word[false.idx()]; + let mut old_value = value_word[true.idx()]; if parent_data[false.idx()].is_placeholder { - new_value = word::Word::zero_f(); + new_value = WordLoHi::zero(); + } else if is_non_existing_proof { + new_value = WordLoHi::zero(); + old_value = WordLoHi::zero(); } mpt_config.mpt_table.assign_cached( region, @@ -544,7 +611,7 @@ impl StorageLeafConfig { new_root: main_data.new_root.into_value(), old_root: main_data.old_root.into_value(), new_value: new_value.into_value(), - old_value: value_word[true.idx()].into_value(), + old_value: old_value.into_value(), }, )?; diff --git a/zkevm-circuits/src/mpt_circuit/tests/StorageDoesNotExistOnlySProof.json b/zkevm-circuits/src/mpt_circuit/tests/StorageDoesNotExistOnlySProof.json new file mode 100644 index 0000000000..ad5a9c33e7 --- /dev/null +++ b/zkevm-circuits/src/mpt_circuit/tests/StorageDoesNotExistOnlySProof.json @@ -0,0 +1,884 @@ +[ + { + "start": { + "disable_preimage_check": false, + "proof_type": "BalanceChanged" + }, + "extension_branch": null, + "account": null, + "storage": null, + "mod_extension": null, + "values": [ + "a02523e4607a05d992ffa4a5d5df7490a5531aa30892c5eac6adf86bad2856bb6d00", + "a0caf6653ccaaaa78601ce2fb67faa13084dfc7c2391ef77ead89284a09c02b3ec00" + ], + "keccak_data": [] + }, + { + "start": null, + "extension_branch": { + "is_extension": false, + "is_mod_extension": [ + false, + false + ], + "is_placeholder": [ + false, + false + ], + "extension": { + "list_rlp_bytes": "00000000000000000000000000000000000000000000000000000000000000000000" + }, + "branch": { + "modified_index": 12, + "drifted_index": 12, + "list_rlp_bytes": [ + "f90211", + "f90211" + ] + } + }, + "account": null, + "storage": null, + "mod_extension": null, + "values": [ + "a01d7faae436001d10cf96100d8fb1e13cd4a031d605a96f53c21a64dff0f4629700", + "a072c16366d0bbb992f6d5515a9ff895ee5c6eecfc3cbf34c1e264a8dd934e5a6500", + "a049565dab20afe6ae478427b0356f569865d9f42eda630659c2939d62721e0a7f00", + "a028146412dbe3e474ec9348a726feab497f273a27511776e9d6ff0f8f05a126ac00", + "a0a51cfec42ea9d7a4c3deac3daf2a1b364b01e2f71bdc40af02f738742f5d01ff00", + "a04c023f80d2d18f1a3e4cdc5242bf9e9ae4fe3850e324fa31f6cf0d66eac38af700", + "a052d345bf981d5e996b4bc2906d72a7fd2b30f36fd93146485beb70b46c9c6db800", + "a080a18f6ee76e65d2dde38a13d774f43c7b4205d247f46f9eb1327964dac357b400", + "a0406dc489f30576ba4475cc4d1aedeef4d531e56a52ded0bb6c0d38f601ca9b4a00", + "a0e82e0c5066e06cd1346b0475d2485723f50d5d2f3ea9d085bb0ba6264f286b5000", + "a021ae734f2f6928c9fc4910eb901c4878c87345d6f4fc1288e2f5aa72888db07400", + "a05f2d744390aa2bd1ab7e6244552162a1ebad0f975f551965776742c506ce8bd200", + "a050c4d55e661be3f28a0d41c1e2bfbd6ecc0c7551f606c341de9e6310e9e2c67100", + "a0873b1a534422dbfa2bfafc66b7c0c1f5a283be7d22be10f58b4a3b226e038cd700", + "a07fac0edb04f86c1660a9fbcf361686c59608f142482f7b0c1b60ebf433c698f400", + "a0d3841ee2a7ff3cedbe4ef083217f87d3cc285261adebd3304029ecc09f080d3800", + "a0765f7869c81a6518af91dfa6feccaff661551eae3c7e6eec1d1e376c9c46ec0d00", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000" + ], + "keccak_data": [ + "f90211a072c16366d0bbb992f6d5515a9ff895ee5c6eecfc3cbf34c1e264a8dd934e5a65a049565dab20afe6ae478427b0356f569865d9f42eda630659c2939d62721e0a7fa028146412dbe3e474ec9348a726feab497f273a27511776e9d6ff0f8f05a126aca0a51cfec42ea9d7a4c3deac3daf2a1b364b01e2f71bdc40af02f738742f5d01ffa04c023f80d2d18f1a3e4cdc5242bf9e9ae4fe3850e324fa31f6cf0d66eac38af7a052d345bf981d5e996b4bc2906d72a7fd2b30f36fd93146485beb70b46c9c6db8a080a18f6ee76e65d2dde38a13d774f43c7b4205d247f46f9eb1327964dac357b4a0406dc489f30576ba4475cc4d1aedeef4d531e56a52ded0bb6c0d38f601ca9b4aa0e82e0c5066e06cd1346b0475d2485723f50d5d2f3ea9d085bb0ba6264f286b50a021ae734f2f6928c9fc4910eb901c4878c87345d6f4fc1288e2f5aa72888db074a05f2d744390aa2bd1ab7e6244552162a1ebad0f975f551965776742c506ce8bd2a050c4d55e661be3f28a0d41c1e2bfbd6ecc0c7551f606c341de9e6310e9e2c671a0873b1a534422dbfa2bfafc66b7c0c1f5a283be7d22be10f58b4a3b226e038cd7a07fac0edb04f86c1660a9fbcf361686c59608f142482f7b0c1b60ebf433c698f4a0d3841ee2a7ff3cedbe4ef083217f87d3cc285261adebd3304029ecc09f080d38a0765f7869c81a6518af91dfa6feccaff661551eae3c7e6eec1d1e376c9c46ec0d80", + "f90211a072c16366d0bbb992f6d5515a9ff895ee5c6eecfc3cbf34c1e264a8dd934e5a65a049565dab20afe6ae478427b0356f569865d9f42eda630659c2939d62721e0a7fa028146412dbe3e474ec9348a726feab497f273a27511776e9d6ff0f8f05a126aca0a51cfec42ea9d7a4c3deac3daf2a1b364b01e2f71bdc40af02f738742f5d01ffa04c023f80d2d18f1a3e4cdc5242bf9e9ae4fe3850e324fa31f6cf0d66eac38af7a052d345bf981d5e996b4bc2906d72a7fd2b30f36fd93146485beb70b46c9c6db8a080a18f6ee76e65d2dde38a13d774f43c7b4205d247f46f9eb1327964dac357b4a0406dc489f30576ba4475cc4d1aedeef4d531e56a52ded0bb6c0d38f601ca9b4aa0e82e0c5066e06cd1346b0475d2485723f50d5d2f3ea9d085bb0ba6264f286b50a021ae734f2f6928c9fc4910eb901c4878c87345d6f4fc1288e2f5aa72888db074a05f2d744390aa2bd1ab7e6244552162a1ebad0f975f551965776742c506ce8bd2a050c4d55e661be3f28a0d41c1e2bfbd6ecc0c7551f606c341de9e6310e9e2c671a01d7faae436001d10cf96100d8fb1e13cd4a031d605a96f53c21a64dff0f46297a07fac0edb04f86c1660a9fbcf361686c59608f142482f7b0c1b60ebf433c698f4a0d3841ee2a7ff3cedbe4ef083217f87d3cc285261adebd3304029ecc09f080d38a0765f7869c81a6518af91dfa6feccaff661551eae3c7e6eec1d1e376c9c46ec0d80" + ] + }, + { + "start": null, + "extension_branch": { + "is_extension": false, + "is_mod_extension": [ + false, + false + ], + "is_placeholder": [ + false, + false + ], + "extension": { + "list_rlp_bytes": "00000000000000000000000000000000000000000000000000000000000000000000" + }, + "branch": { + "modified_index": 8, + "drifted_index": 8, + "list_rlp_bytes": [ + "f90211", + "f90211" + ] + } + }, + "account": null, + "storage": null, + "mod_extension": null, + "values": [ + "a0ae8a9a65f35ae639ed37965d8a252d2b4da7bf9d631c02e32ce88247964e636900", + "a0f3cdaf60d79fb61e893b369b710937ac23e0c2847bcbccff7009922d4db5bd0100", + "a0fce77948227c2a286b84ef12e23e853388bb8b12f72fd9bf0a84e92f63164e5300", + "a039e92b76a5aec3250c46b68db0534c0b7730026a91299f4144ae2124536000cf00", + "a0f987345194d91423f8dfcda5412ef4a12464835103a26c2822f848d194cb4bfa00", + "a04bea5e4005db61e7bef013096cd5e23a29b0595f2f9daa8ac9bc76f9e4c3adb100", + "a0695a7fbb5ad5107fb1de0c1530caa5fa73628c4100052c13e4f21859f110f31100", + "a03d98d4f7fbdaf32ef9aa992a70209a1cf7a85e746704dc3248f8c1ebbdaa08bb00", + "a06388fe7b966ff5e278f29526c5c2e4ed1e2c11016d6ec1e437a37d3223ff90ec00", + "a084b502688ae04d0b474585c2ad50dbcfa0df26b7ceb09732e3d242fb854c5ab700", + "a08d42490450e1385bdfef861f41d597d2693f4c2b5c4e1a8751b2096185f1d36400", + "a0ed9ee1e21920ec422f026b70439d6cfa0e7b3992b482e7591909eec6ddf751b400", + "a01bd96f3d6fc795e66d82116ddef3d38865bafa04e426c1b51e446d38b79dc3a100", + "a0910782b346b7dcd82c6709ec62ef1f13aa487576ddd5cb8019f0201fe15ef00900", + "a0491b867e5a84cf4046b39a78315504d529feda45cab7f99e1f6f3101bdf00c8900", + "a034f545d3a349cfb6c8098c638f87d7b2a14706400544d743187afcb337b9b9d000", + "a057994926d9422d5d969fffc0b2677cdb6e289b86625219fede0bc84421e4db0600", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000" + ], + "keccak_data": [ + "f90211a0f3cdaf60d79fb61e893b369b710937ac23e0c2847bcbccff7009922d4db5bd01a0fce77948227c2a286b84ef12e23e853388bb8b12f72fd9bf0a84e92f63164e53a039e92b76a5aec3250c46b68db0534c0b7730026a91299f4144ae2124536000cfa0f987345194d91423f8dfcda5412ef4a12464835103a26c2822f848d194cb4bfaa04bea5e4005db61e7bef013096cd5e23a29b0595f2f9daa8ac9bc76f9e4c3adb1a0695a7fbb5ad5107fb1de0c1530caa5fa73628c4100052c13e4f21859f110f311a03d98d4f7fbdaf32ef9aa992a70209a1cf7a85e746704dc3248f8c1ebbdaa08bba06388fe7b966ff5e278f29526c5c2e4ed1e2c11016d6ec1e437a37d3223ff90eca084b502688ae04d0b474585c2ad50dbcfa0df26b7ceb09732e3d242fb854c5ab7a08d42490450e1385bdfef861f41d597d2693f4c2b5c4e1a8751b2096185f1d364a0ed9ee1e21920ec422f026b70439d6cfa0e7b3992b482e7591909eec6ddf751b4a01bd96f3d6fc795e66d82116ddef3d38865bafa04e426c1b51e446d38b79dc3a1a0910782b346b7dcd82c6709ec62ef1f13aa487576ddd5cb8019f0201fe15ef009a0491b867e5a84cf4046b39a78315504d529feda45cab7f99e1f6f3101bdf00c89a034f545d3a349cfb6c8098c638f87d7b2a14706400544d743187afcb337b9b9d0a057994926d9422d5d969fffc0b2677cdb6e289b86625219fede0bc84421e4db0680", + "f90211a0f3cdaf60d79fb61e893b369b710937ac23e0c2847bcbccff7009922d4db5bd01a0fce77948227c2a286b84ef12e23e853388bb8b12f72fd9bf0a84e92f63164e53a039e92b76a5aec3250c46b68db0534c0b7730026a91299f4144ae2124536000cfa0f987345194d91423f8dfcda5412ef4a12464835103a26c2822f848d194cb4bfaa04bea5e4005db61e7bef013096cd5e23a29b0595f2f9daa8ac9bc76f9e4c3adb1a0695a7fbb5ad5107fb1de0c1530caa5fa73628c4100052c13e4f21859f110f311a03d98d4f7fbdaf32ef9aa992a70209a1cf7a85e746704dc3248f8c1ebbdaa08bba06388fe7b966ff5e278f29526c5c2e4ed1e2c11016d6ec1e437a37d3223ff90eca0ae8a9a65f35ae639ed37965d8a252d2b4da7bf9d631c02e32ce88247964e6369a08d42490450e1385bdfef861f41d597d2693f4c2b5c4e1a8751b2096185f1d364a0ed9ee1e21920ec422f026b70439d6cfa0e7b3992b482e7591909eec6ddf751b4a01bd96f3d6fc795e66d82116ddef3d38865bafa04e426c1b51e446d38b79dc3a1a0910782b346b7dcd82c6709ec62ef1f13aa487576ddd5cb8019f0201fe15ef009a0491b867e5a84cf4046b39a78315504d529feda45cab7f99e1f6f3101bdf00c89a034f545d3a349cfb6c8098c638f87d7b2a14706400544d743187afcb337b9b9d0a057994926d9422d5d969fffc0b2677cdb6e289b86625219fede0bc84421e4db0680" + ] + }, + { + "start": null, + "extension_branch": { + "is_extension": false, + "is_mod_extension": [ + false, + false + ], + "is_placeholder": [ + false, + false + ], + "extension": { + "list_rlp_bytes": "00000000000000000000000000000000000000000000000000000000000000000000" + }, + "branch": { + "modified_index": 5, + "drifted_index": 5, + "list_rlp_bytes": [ + "f90211", + "f90211" + ] + } + }, + "account": null, + "storage": null, + "mod_extension": null, + "values": [ + "a0335f88c3426aac199fed5e159ed2cf7f9f1a62f93d3a47204773364d06e6508b00", + "a0643223afd2cdf8850275b8fefeda7aa35da0c26ef0c39c60cfb1e24cc52762c100", + "a0d3e07435e99ae94fa784d0b48f7955cc327f3283c54728a0f0657e9873d4aa7600", + "a031cdb1d9522f06bc78049c39940f21a511531017c651f00d53cca82c0b6f34b200", + "a01ec8ea4b4424cf744e29c7d218af2dfe9140256e58171305ab1472bd2df95afb00", + "a02c69884acac1b6212b90cdd721b88dcfe9b00c2ccbf411d5e9ecdda90f93c23400", + "a0e89d484463e0251b72bb36be031c1182e81685bf852f637a2c8fd74f2f1edc4900", + "a01c190836d2eca2384e06b124b900da5aa4ab874ab762c06342600aa8c34c07d300", + "a0a7d794c34193c548e12e2089d9109e25d3d1b13f87be3be358412b6ea906e4cd00", + "a0176b3d097548b67aa6dd67f4311323285f773fa5bc64894515fb1fb40fe1b87c00", + "a0add35369e46f48b4fffcee149bbd8e780bd8dcf784c6bb4da5d371742a439ff200", + "a0d4c92afc344f8c1fed0a3a9a0973e0e2af3a9e92f6c11b041c1c4839b4c04f4700", + "a083a4cfd6d2fac8a31b13d1723323be55233091ad3d280637084983a8531d326600", + "a0b1eafa8ec6b94928b4ac69306d1ea447cab455a023bdd31c1b7c667265aec99800", + "a074f76c46d44c70a53fb64d3801444d9739854e7af0ba12749864929e0f3466a900", + "a037d17318bd52b12c443d1c609a64646fad41e1d5a6a9e5f46f1bb6c2b4a9f9a400", + "a03f855b509146866d83d593409f9c0f95f0c49a22ec5d86b4b9d0adb930425ef100", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000" + ], + "keccak_data": [ + "f90211a0643223afd2cdf8850275b8fefeda7aa35da0c26ef0c39c60cfb1e24cc52762c1a0d3e07435e99ae94fa784d0b48f7955cc327f3283c54728a0f0657e9873d4aa76a031cdb1d9522f06bc78049c39940f21a511531017c651f00d53cca82c0b6f34b2a01ec8ea4b4424cf744e29c7d218af2dfe9140256e58171305ab1472bd2df95afba02c69884acac1b6212b90cdd721b88dcfe9b00c2ccbf411d5e9ecdda90f93c234a0e89d484463e0251b72bb36be031c1182e81685bf852f637a2c8fd74f2f1edc49a01c190836d2eca2384e06b124b900da5aa4ab874ab762c06342600aa8c34c07d3a0a7d794c34193c548e12e2089d9109e25d3d1b13f87be3be358412b6ea906e4cda0176b3d097548b67aa6dd67f4311323285f773fa5bc64894515fb1fb40fe1b87ca0add35369e46f48b4fffcee149bbd8e780bd8dcf784c6bb4da5d371742a439ff2a0d4c92afc344f8c1fed0a3a9a0973e0e2af3a9e92f6c11b041c1c4839b4c04f47a083a4cfd6d2fac8a31b13d1723323be55233091ad3d280637084983a8531d3266a0b1eafa8ec6b94928b4ac69306d1ea447cab455a023bdd31c1b7c667265aec998a074f76c46d44c70a53fb64d3801444d9739854e7af0ba12749864929e0f3466a9a037d17318bd52b12c443d1c609a64646fad41e1d5a6a9e5f46f1bb6c2b4a9f9a4a03f855b509146866d83d593409f9c0f95f0c49a22ec5d86b4b9d0adb930425ef180", + "f90211a0643223afd2cdf8850275b8fefeda7aa35da0c26ef0c39c60cfb1e24cc52762c1a0d3e07435e99ae94fa784d0b48f7955cc327f3283c54728a0f0657e9873d4aa76a031cdb1d9522f06bc78049c39940f21a511531017c651f00d53cca82c0b6f34b2a01ec8ea4b4424cf744e29c7d218af2dfe9140256e58171305ab1472bd2df95afba02c69884acac1b6212b90cdd721b88dcfe9b00c2ccbf411d5e9ecdda90f93c234a0335f88c3426aac199fed5e159ed2cf7f9f1a62f93d3a47204773364d06e6508ba01c190836d2eca2384e06b124b900da5aa4ab874ab762c06342600aa8c34c07d3a0a7d794c34193c548e12e2089d9109e25d3d1b13f87be3be358412b6ea906e4cda0176b3d097548b67aa6dd67f4311323285f773fa5bc64894515fb1fb40fe1b87ca0add35369e46f48b4fffcee149bbd8e780bd8dcf784c6bb4da5d371742a439ff2a0d4c92afc344f8c1fed0a3a9a0973e0e2af3a9e92f6c11b041c1c4839b4c04f47a083a4cfd6d2fac8a31b13d1723323be55233091ad3d280637084983a8531d3266a0b1eafa8ec6b94928b4ac69306d1ea447cab455a023bdd31c1b7c667265aec998a074f76c46d44c70a53fb64d3801444d9739854e7af0ba12749864929e0f3466a9a037d17318bd52b12c443d1c609a64646fad41e1d5a6a9e5f46f1bb6c2b4a9f9a4a03f855b509146866d83d593409f9c0f95f0c49a22ec5d86b4b9d0adb930425ef180" + ] + }, + { + "start": null, + "extension_branch": { + "is_extension": false, + "is_mod_extension": [ + false, + false + ], + "is_placeholder": [ + false, + false + ], + "extension": { + "list_rlp_bytes": "00000000000000000000000000000000000000000000000000000000000000000000" + }, + "branch": { + "modified_index": 6, + "drifted_index": 6, + "list_rlp_bytes": [ + "f90211", + "f90211" + ] + } + }, + "account": null, + "storage": null, + "mod_extension": null, + "values": [ + "a0cdb89f2e65e49e662f7f831085ce0573deb7f3dbcf1597a55c9c0c9e420c6ede00", + "a00dffd4fc7a7acbd11a09ab1a28fad6ce37a9d446dfb9ebf6be429bf800f45b0200", + "a0ea85244fcbe9cc89739872c5ed66efc8f67d331dfa18723e22948d0bc0e8cc7900", + "a02af9d9b113e3dd75c3544b71c112f9a14bd194cccb625bb9ee139c9fee95686a00", + "a0ff3ceb58292c96600ca5b75a541fde654b8d4d8950fbec1b5d26181f8ffb49d400", + "a03f4278f130a38121d771d6ab937d9ecb458596c6ecb60cab6cb4fbfae6d1d39d00", + "a0fec61d1f7a1c8224272521d7be099e7ad7e2e61d1021866c5e12ea01f47f934b00", + "a01dfa50994defea72ee8fe405f68f5d7c7e246cc871fb194ed69977e9095b03bb00", + "a0bf00c6c27397c5b9c3e6e2bc5545d74d1ad6eaa1443f88942a26a9e37a6207b400", + "a06518755c2762ea97b58027e8843c110ddbcd2f6a07e4d239c72386f1fc77edb700", + "a08f15a73b5cbc8f2da22ec5303993b971e96e72407145a76fe327dea836226f8f00", + "a040222473c2e4aaaa15d7806aec12e22cc0b64ecf44f47af45b9a0dfd72d1b77f00", + "a081c0a354ff213fed635c58e5c3b09774374bc72811386af11e8f3716bc8e08f300", + "a0003b48aebee15ad11ab9f4e0dfe94b54122261fe23e7ed056aca36f2123eb34400", + "a028c4fe56d5638df2d3b202c7332c748272fe84d9462c534128f68612c389138d00", + "a0e064b6c149ebf5772b53b33423d2d5cf9bd8565db4d76c7f8e3a7474025b324000", + "a01f4af370ae8e26ec0c81df057a2a53fbcf5824854e5f6a9253509539bbb277db00", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000" + ], + "keccak_data": [ + "f90211a00dffd4fc7a7acbd11a09ab1a28fad6ce37a9d446dfb9ebf6be429bf800f45b02a0ea85244fcbe9cc89739872c5ed66efc8f67d331dfa18723e22948d0bc0e8cc79a02af9d9b113e3dd75c3544b71c112f9a14bd194cccb625bb9ee139c9fee95686aa0ff3ceb58292c96600ca5b75a541fde654b8d4d8950fbec1b5d26181f8ffb49d4a03f4278f130a38121d771d6ab937d9ecb458596c6ecb60cab6cb4fbfae6d1d39da0fec61d1f7a1c8224272521d7be099e7ad7e2e61d1021866c5e12ea01f47f934ba01dfa50994defea72ee8fe405f68f5d7c7e246cc871fb194ed69977e9095b03bba0bf00c6c27397c5b9c3e6e2bc5545d74d1ad6eaa1443f88942a26a9e37a6207b4a06518755c2762ea97b58027e8843c110ddbcd2f6a07e4d239c72386f1fc77edb7a08f15a73b5cbc8f2da22ec5303993b971e96e72407145a76fe327dea836226f8fa040222473c2e4aaaa15d7806aec12e22cc0b64ecf44f47af45b9a0dfd72d1b77fa081c0a354ff213fed635c58e5c3b09774374bc72811386af11e8f3716bc8e08f3a0003b48aebee15ad11ab9f4e0dfe94b54122261fe23e7ed056aca36f2123eb344a028c4fe56d5638df2d3b202c7332c748272fe84d9462c534128f68612c389138da0e064b6c149ebf5772b53b33423d2d5cf9bd8565db4d76c7f8e3a7474025b3240a01f4af370ae8e26ec0c81df057a2a53fbcf5824854e5f6a9253509539bbb277db80", + "f90211a00dffd4fc7a7acbd11a09ab1a28fad6ce37a9d446dfb9ebf6be429bf800f45b02a0ea85244fcbe9cc89739872c5ed66efc8f67d331dfa18723e22948d0bc0e8cc79a02af9d9b113e3dd75c3544b71c112f9a14bd194cccb625bb9ee139c9fee95686aa0ff3ceb58292c96600ca5b75a541fde654b8d4d8950fbec1b5d26181f8ffb49d4a03f4278f130a38121d771d6ab937d9ecb458596c6ecb60cab6cb4fbfae6d1d39da0fec61d1f7a1c8224272521d7be099e7ad7e2e61d1021866c5e12ea01f47f934ba0cdb89f2e65e49e662f7f831085ce0573deb7f3dbcf1597a55c9c0c9e420c6edea0bf00c6c27397c5b9c3e6e2bc5545d74d1ad6eaa1443f88942a26a9e37a6207b4a06518755c2762ea97b58027e8843c110ddbcd2f6a07e4d239c72386f1fc77edb7a08f15a73b5cbc8f2da22ec5303993b971e96e72407145a76fe327dea836226f8fa040222473c2e4aaaa15d7806aec12e22cc0b64ecf44f47af45b9a0dfd72d1b77fa081c0a354ff213fed635c58e5c3b09774374bc72811386af11e8f3716bc8e08f3a0003b48aebee15ad11ab9f4e0dfe94b54122261fe23e7ed056aca36f2123eb344a028c4fe56d5638df2d3b202c7332c748272fe84d9462c534128f68612c389138da0e064b6c149ebf5772b53b33423d2d5cf9bd8565db4d76c7f8e3a7474025b3240a01f4af370ae8e26ec0c81df057a2a53fbcf5824854e5f6a9253509539bbb277db80" + ] + }, + { + "start": null, + "extension_branch": { + "is_extension": false, + "is_mod_extension": [ + false, + false + ], + "is_placeholder": [ + false, + false + ], + "extension": { + "list_rlp_bytes": "00000000000000000000000000000000000000000000000000000000000000000000" + }, + "branch": { + "modified_index": 12, + "drifted_index": 12, + "list_rlp_bytes": [ + "f8d1", + "f8d1" + ] + } + }, + "account": null, + "storage": null, + "mod_extension": null, + "values": [ + "a0b0375763c9c490c555bf594dc13ecf3e63003a136a5bada92ee4f48197c73c2d00", + "80000000000000000000000000000000000000000000000000000000000000000000", + "a034e0097d64dedfd3ecaff0702de289c4110f5b7b8243d49e8ea7969682c5b17a00", + "80000000000000000000000000000000000000000000000000000000000000000000", + "a07da532ec5da228b88092a7102ba227acb97d8295949c33d7c207ea1d95771cb200", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "a035f5e68adcf50eaa023741ba9d02a53ec950464f04cf8063f22eaa3f965d36e600", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "a0a8891c6de20c065da5e4ae6fc6a52d81e29d1d18926429c50236b4949f41f52a00", + "a0dd96313bf54b09798f4c5b5958b5bd8f2c3f079b5a24c0b89033fc9a088fb08e00", + "80000000000000000000000000000000000000000000000000000000000000000000", + "a086c80e661a30f3e76d27611ee60125b0fb3deebea9a5b36236e1dc6ad87f9db400", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000" + ], + "keccak_data": [ + "f8d180a034e0097d64dedfd3ecaff0702de289c4110f5b7b8243d49e8ea7969682c5b17a80a07da532ec5da228b88092a7102ba227acb97d8295949c33d7c207ea1d95771cb2808080a035f5e68adcf50eaa023741ba9d02a53ec950464f04cf8063f22eaa3f965d36e680808080a0a8891c6de20c065da5e4ae6fc6a52d81e29d1d18926429c50236b4949f41f52aa0dd96313bf54b09798f4c5b5958b5bd8f2c3f079b5a24c0b89033fc9a088fb08e80a086c80e661a30f3e76d27611ee60125b0fb3deebea9a5b36236e1dc6ad87f9db480", + "f8d180a034e0097d64dedfd3ecaff0702de289c4110f5b7b8243d49e8ea7969682c5b17a80a07da532ec5da228b88092a7102ba227acb97d8295949c33d7c207ea1d95771cb2808080a035f5e68adcf50eaa023741ba9d02a53ec950464f04cf8063f22eaa3f965d36e680808080a0b0375763c9c490c555bf594dc13ecf3e63003a136a5bada92ee4f48197c73c2da0dd96313bf54b09798f4c5b5958b5bd8f2c3f079b5a24c0b89033fc9a088fb08e80a086c80e661a30f3e76d27611ee60125b0fb3deebea9a5b36236e1dc6ad87f9db480" + ] + }, + { + "start": null, + "extension_branch": { + "is_extension": false, + "is_mod_extension": [ + false, + false + ], + "is_placeholder": [ + true, + false + ], + "extension": { + "list_rlp_bytes": "00000000000000000000000000000000000000000000000000000000000000000000" + }, + "branch": { + "modified_index": 0, + "drifted_index": 4, + "list_rlp_bytes": [ + "f851", + "f851" + ] + } + }, + "account": null, + "storage": null, + "mod_extension": null, + "values": [ + "a05a5c24d87e3c29db49e2def81af9f175bfa4bf067e6081e69fdd6768ceb5b54d00", + "a05a5c24d87e3c29db49e2def81af9f175bfa4bf067e6081e69fdd6768ceb5b54d00", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "a01d7f6211d4254b8cde93b7a9797babd2e4d76e21d81e78e9e0aafb417c99c17900", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000" + ], + "keccak_data": [ + "f851a05a5c24d87e3c29db49e2def81af9f175bfa4bf067e6081e69fdd6768ceb5b54d808080a01d7f6211d4254b8cde93b7a9797babd2e4d76e21d81e78e9e0aafb417c99c179808080808080808080808080", + "f851a05a5c24d87e3c29db49e2def81af9f175bfa4bf067e6081e69fdd6768ceb5b54d808080a01d7f6211d4254b8cde93b7a9797babd2e4d76e21d81e78e9e0aafb417c99c179808080808080808080808080" + ] + }, + { + "start": null, + "extension_branch": null, + "account": { + "address": "caac46d9bd68bffb533320545a90cd92c6e98e58", + "key": "c856c0d4438ec2fa5935cb6f47e96b22b75968689748d23db05fa7e9d908e4f5", + "list_rlp_bytes": [ + "f86d", + "f867" + ], + "value_rlp_bytes": [ + "b84c", + "b846" + ], + "value_list_rlp_bytes": [ + "f84a", + "f844" + ], + "drifted_rlp_bytes": "f86d", + "wrong_rlp_bytes": "f867", + "is_mod_extension": [ + false, + false + ], + "mod_list_rlp_bytes": [ + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000" + ] + }, + "storage": null, + "mod_extension": null, + "values": [ + "9e345ac5795a845ff38a9ecfa2dbdecee089a41a45c2958ba2aeb719c5ff6c000000", + "9e20d4438ec2fa5935cb6f47e96b22b75968689748d23db05fa7e9d908e4f5000000", + "01000000000000000000000000000000000000000000000000000000000000000000", + "86e5eb96330000000000000000000000000000000000000000000000000000000000", + "a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42100", + "a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "62000000000000000000000000000000000000000000000000000000000000000000", + "a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42100", + "a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47000", + "9e205ac5795a845ff38a9ecfa2dbdecee089a41a45c2958ba2aeb719c5ff6c000000", + "9e20d4438ec2fa5935cb6f47e96b22b75968689748d23db05fa7e9d908e4f5000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000" + ], + "keccak_data": [ + "f86d9e345ac5795a845ff38a9ecfa2dbdecee089a41a45c2958ba2aeb719c5ff6cb84cf84a0186e5eb96330000a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "f8679e20d4438ec2fa5935cb6f47e96b22b75968689748d23db05fa7e9d908e4f5b846f8448062a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "caac46d9bd68bffb533320545a90cd92c6e98e58", + "f86d9e205ac5795a845ff38a9ecfa2dbdecee089a41a45c2958ba2aeb719c5ff6cb84cf84a0186e5eb96330000a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + ] + }, + { + "start": { + "disable_preimage_check": false, + "proof_type": "Disabled" + }, + "extension_branch": null, + "account": null, + "storage": null, + "mod_extension": null, + "values": [ + "a0000000000000000000000000000000000000000000000000000000000000000000", + "a0000000000000000000000000000000000000000000000000000000000000000000" + ], + "keccak_data": [] + }, + { + "start": { + "disable_preimage_check": false, + "proof_type": "StorageDoesNotExist" + }, + "extension_branch": null, + "account": null, + "storage": null, + "mod_extension": null, + "values": [ + "a0caf6653ccaaaa78601ce2fb67faa13084dfc7c2391ef77ead89284a09c02b3ec00", + "a0caf6653ccaaaa78601ce2fb67faa13084dfc7c2391ef77ead89284a09c02b3ec00" + ], + "keccak_data": [] + }, + { + "start": null, + "extension_branch": { + "is_extension": false, + "is_mod_extension": [ + false, + false + ], + "is_placeholder": [ + false, + false + ], + "extension": { + "list_rlp_bytes": "00000000000000000000000000000000000000000000000000000000000000000000" + }, + "branch": { + "modified_index": 12, + "drifted_index": 12, + "list_rlp_bytes": [ + "f90211", + "f90211" + ] + } + }, + "account": null, + "storage": null, + "mod_extension": null, + "values": [ + "a01d7faae436001d10cf96100d8fb1e13cd4a031d605a96f53c21a64dff0f4629700", + "a072c16366d0bbb992f6d5515a9ff895ee5c6eecfc3cbf34c1e264a8dd934e5a6500", + "a049565dab20afe6ae478427b0356f569865d9f42eda630659c2939d62721e0a7f00", + "a028146412dbe3e474ec9348a726feab497f273a27511776e9d6ff0f8f05a126ac00", + "a0a51cfec42ea9d7a4c3deac3daf2a1b364b01e2f71bdc40af02f738742f5d01ff00", + "a04c023f80d2d18f1a3e4cdc5242bf9e9ae4fe3850e324fa31f6cf0d66eac38af700", + "a052d345bf981d5e996b4bc2906d72a7fd2b30f36fd93146485beb70b46c9c6db800", + "a080a18f6ee76e65d2dde38a13d774f43c7b4205d247f46f9eb1327964dac357b400", + "a0406dc489f30576ba4475cc4d1aedeef4d531e56a52ded0bb6c0d38f601ca9b4a00", + "a0e82e0c5066e06cd1346b0475d2485723f50d5d2f3ea9d085bb0ba6264f286b5000", + "a021ae734f2f6928c9fc4910eb901c4878c87345d6f4fc1288e2f5aa72888db07400", + "a05f2d744390aa2bd1ab7e6244552162a1ebad0f975f551965776742c506ce8bd200", + "a050c4d55e661be3f28a0d41c1e2bfbd6ecc0c7551f606c341de9e6310e9e2c67100", + "a01d7faae436001d10cf96100d8fb1e13cd4a031d605a96f53c21a64dff0f4629700", + "a07fac0edb04f86c1660a9fbcf361686c59608f142482f7b0c1b60ebf433c698f400", + "a0d3841ee2a7ff3cedbe4ef083217f87d3cc285261adebd3304029ecc09f080d3800", + "a0765f7869c81a6518af91dfa6feccaff661551eae3c7e6eec1d1e376c9c46ec0d00", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000" + ], + "keccak_data": [ + "f90211a072c16366d0bbb992f6d5515a9ff895ee5c6eecfc3cbf34c1e264a8dd934e5a65a049565dab20afe6ae478427b0356f569865d9f42eda630659c2939d62721e0a7fa028146412dbe3e474ec9348a726feab497f273a27511776e9d6ff0f8f05a126aca0a51cfec42ea9d7a4c3deac3daf2a1b364b01e2f71bdc40af02f738742f5d01ffa04c023f80d2d18f1a3e4cdc5242bf9e9ae4fe3850e324fa31f6cf0d66eac38af7a052d345bf981d5e996b4bc2906d72a7fd2b30f36fd93146485beb70b46c9c6db8a080a18f6ee76e65d2dde38a13d774f43c7b4205d247f46f9eb1327964dac357b4a0406dc489f30576ba4475cc4d1aedeef4d531e56a52ded0bb6c0d38f601ca9b4aa0e82e0c5066e06cd1346b0475d2485723f50d5d2f3ea9d085bb0ba6264f286b50a021ae734f2f6928c9fc4910eb901c4878c87345d6f4fc1288e2f5aa72888db074a05f2d744390aa2bd1ab7e6244552162a1ebad0f975f551965776742c506ce8bd2a050c4d55e661be3f28a0d41c1e2bfbd6ecc0c7551f606c341de9e6310e9e2c671a01d7faae436001d10cf96100d8fb1e13cd4a031d605a96f53c21a64dff0f46297a07fac0edb04f86c1660a9fbcf361686c59608f142482f7b0c1b60ebf433c698f4a0d3841ee2a7ff3cedbe4ef083217f87d3cc285261adebd3304029ecc09f080d38a0765f7869c81a6518af91dfa6feccaff661551eae3c7e6eec1d1e376c9c46ec0d80", + "f90211a072c16366d0bbb992f6d5515a9ff895ee5c6eecfc3cbf34c1e264a8dd934e5a65a049565dab20afe6ae478427b0356f569865d9f42eda630659c2939d62721e0a7fa028146412dbe3e474ec9348a726feab497f273a27511776e9d6ff0f8f05a126aca0a51cfec42ea9d7a4c3deac3daf2a1b364b01e2f71bdc40af02f738742f5d01ffa04c023f80d2d18f1a3e4cdc5242bf9e9ae4fe3850e324fa31f6cf0d66eac38af7a052d345bf981d5e996b4bc2906d72a7fd2b30f36fd93146485beb70b46c9c6db8a080a18f6ee76e65d2dde38a13d774f43c7b4205d247f46f9eb1327964dac357b4a0406dc489f30576ba4475cc4d1aedeef4d531e56a52ded0bb6c0d38f601ca9b4aa0e82e0c5066e06cd1346b0475d2485723f50d5d2f3ea9d085bb0ba6264f286b50a021ae734f2f6928c9fc4910eb901c4878c87345d6f4fc1288e2f5aa72888db074a05f2d744390aa2bd1ab7e6244552162a1ebad0f975f551965776742c506ce8bd2a050c4d55e661be3f28a0d41c1e2bfbd6ecc0c7551f606c341de9e6310e9e2c671a01d7faae436001d10cf96100d8fb1e13cd4a031d605a96f53c21a64dff0f46297a07fac0edb04f86c1660a9fbcf361686c59608f142482f7b0c1b60ebf433c698f4a0d3841ee2a7ff3cedbe4ef083217f87d3cc285261adebd3304029ecc09f080d38a0765f7869c81a6518af91dfa6feccaff661551eae3c7e6eec1d1e376c9c46ec0d80" + ] + }, + { + "start": null, + "extension_branch": { + "is_extension": false, + "is_mod_extension": [ + false, + false + ], + "is_placeholder": [ + false, + false + ], + "extension": { + "list_rlp_bytes": "00000000000000000000000000000000000000000000000000000000000000000000" + }, + "branch": { + "modified_index": 8, + "drifted_index": 8, + "list_rlp_bytes": [ + "f90211", + "f90211" + ] + } + }, + "account": null, + "storage": null, + "mod_extension": null, + "values": [ + "a0ae8a9a65f35ae639ed37965d8a252d2b4da7bf9d631c02e32ce88247964e636900", + "a0f3cdaf60d79fb61e893b369b710937ac23e0c2847bcbccff7009922d4db5bd0100", + "a0fce77948227c2a286b84ef12e23e853388bb8b12f72fd9bf0a84e92f63164e5300", + "a039e92b76a5aec3250c46b68db0534c0b7730026a91299f4144ae2124536000cf00", + "a0f987345194d91423f8dfcda5412ef4a12464835103a26c2822f848d194cb4bfa00", + "a04bea5e4005db61e7bef013096cd5e23a29b0595f2f9daa8ac9bc76f9e4c3adb100", + "a0695a7fbb5ad5107fb1de0c1530caa5fa73628c4100052c13e4f21859f110f31100", + "a03d98d4f7fbdaf32ef9aa992a70209a1cf7a85e746704dc3248f8c1ebbdaa08bb00", + "a06388fe7b966ff5e278f29526c5c2e4ed1e2c11016d6ec1e437a37d3223ff90ec00", + "a0ae8a9a65f35ae639ed37965d8a252d2b4da7bf9d631c02e32ce88247964e636900", + "a08d42490450e1385bdfef861f41d597d2693f4c2b5c4e1a8751b2096185f1d36400", + "a0ed9ee1e21920ec422f026b70439d6cfa0e7b3992b482e7591909eec6ddf751b400", + "a01bd96f3d6fc795e66d82116ddef3d38865bafa04e426c1b51e446d38b79dc3a100", + "a0910782b346b7dcd82c6709ec62ef1f13aa487576ddd5cb8019f0201fe15ef00900", + "a0491b867e5a84cf4046b39a78315504d529feda45cab7f99e1f6f3101bdf00c8900", + "a034f545d3a349cfb6c8098c638f87d7b2a14706400544d743187afcb337b9b9d000", + "a057994926d9422d5d969fffc0b2677cdb6e289b86625219fede0bc84421e4db0600", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000" + ], + "keccak_data": [ + "f90211a0f3cdaf60d79fb61e893b369b710937ac23e0c2847bcbccff7009922d4db5bd01a0fce77948227c2a286b84ef12e23e853388bb8b12f72fd9bf0a84e92f63164e53a039e92b76a5aec3250c46b68db0534c0b7730026a91299f4144ae2124536000cfa0f987345194d91423f8dfcda5412ef4a12464835103a26c2822f848d194cb4bfaa04bea5e4005db61e7bef013096cd5e23a29b0595f2f9daa8ac9bc76f9e4c3adb1a0695a7fbb5ad5107fb1de0c1530caa5fa73628c4100052c13e4f21859f110f311a03d98d4f7fbdaf32ef9aa992a70209a1cf7a85e746704dc3248f8c1ebbdaa08bba06388fe7b966ff5e278f29526c5c2e4ed1e2c11016d6ec1e437a37d3223ff90eca0ae8a9a65f35ae639ed37965d8a252d2b4da7bf9d631c02e32ce88247964e6369a08d42490450e1385bdfef861f41d597d2693f4c2b5c4e1a8751b2096185f1d364a0ed9ee1e21920ec422f026b70439d6cfa0e7b3992b482e7591909eec6ddf751b4a01bd96f3d6fc795e66d82116ddef3d38865bafa04e426c1b51e446d38b79dc3a1a0910782b346b7dcd82c6709ec62ef1f13aa487576ddd5cb8019f0201fe15ef009a0491b867e5a84cf4046b39a78315504d529feda45cab7f99e1f6f3101bdf00c89a034f545d3a349cfb6c8098c638f87d7b2a14706400544d743187afcb337b9b9d0a057994926d9422d5d969fffc0b2677cdb6e289b86625219fede0bc84421e4db0680", + "f90211a0f3cdaf60d79fb61e893b369b710937ac23e0c2847bcbccff7009922d4db5bd01a0fce77948227c2a286b84ef12e23e853388bb8b12f72fd9bf0a84e92f63164e53a039e92b76a5aec3250c46b68db0534c0b7730026a91299f4144ae2124536000cfa0f987345194d91423f8dfcda5412ef4a12464835103a26c2822f848d194cb4bfaa04bea5e4005db61e7bef013096cd5e23a29b0595f2f9daa8ac9bc76f9e4c3adb1a0695a7fbb5ad5107fb1de0c1530caa5fa73628c4100052c13e4f21859f110f311a03d98d4f7fbdaf32ef9aa992a70209a1cf7a85e746704dc3248f8c1ebbdaa08bba06388fe7b966ff5e278f29526c5c2e4ed1e2c11016d6ec1e437a37d3223ff90eca0ae8a9a65f35ae639ed37965d8a252d2b4da7bf9d631c02e32ce88247964e6369a08d42490450e1385bdfef861f41d597d2693f4c2b5c4e1a8751b2096185f1d364a0ed9ee1e21920ec422f026b70439d6cfa0e7b3992b482e7591909eec6ddf751b4a01bd96f3d6fc795e66d82116ddef3d38865bafa04e426c1b51e446d38b79dc3a1a0910782b346b7dcd82c6709ec62ef1f13aa487576ddd5cb8019f0201fe15ef009a0491b867e5a84cf4046b39a78315504d529feda45cab7f99e1f6f3101bdf00c89a034f545d3a349cfb6c8098c638f87d7b2a14706400544d743187afcb337b9b9d0a057994926d9422d5d969fffc0b2677cdb6e289b86625219fede0bc84421e4db0680" + ] + }, + { + "start": null, + "extension_branch": { + "is_extension": false, + "is_mod_extension": [ + false, + false + ], + "is_placeholder": [ + false, + false + ], + "extension": { + "list_rlp_bytes": "00000000000000000000000000000000000000000000000000000000000000000000" + }, + "branch": { + "modified_index": 5, + "drifted_index": 5, + "list_rlp_bytes": [ + "f90211", + "f90211" + ] + } + }, + "account": null, + "storage": null, + "mod_extension": null, + "values": [ + "a0335f88c3426aac199fed5e159ed2cf7f9f1a62f93d3a47204773364d06e6508b00", + "a0643223afd2cdf8850275b8fefeda7aa35da0c26ef0c39c60cfb1e24cc52762c100", + "a0d3e07435e99ae94fa784d0b48f7955cc327f3283c54728a0f0657e9873d4aa7600", + "a031cdb1d9522f06bc78049c39940f21a511531017c651f00d53cca82c0b6f34b200", + "a01ec8ea4b4424cf744e29c7d218af2dfe9140256e58171305ab1472bd2df95afb00", + "a02c69884acac1b6212b90cdd721b88dcfe9b00c2ccbf411d5e9ecdda90f93c23400", + "a0335f88c3426aac199fed5e159ed2cf7f9f1a62f93d3a47204773364d06e6508b00", + "a01c190836d2eca2384e06b124b900da5aa4ab874ab762c06342600aa8c34c07d300", + "a0a7d794c34193c548e12e2089d9109e25d3d1b13f87be3be358412b6ea906e4cd00", + "a0176b3d097548b67aa6dd67f4311323285f773fa5bc64894515fb1fb40fe1b87c00", + "a0add35369e46f48b4fffcee149bbd8e780bd8dcf784c6bb4da5d371742a439ff200", + "a0d4c92afc344f8c1fed0a3a9a0973e0e2af3a9e92f6c11b041c1c4839b4c04f4700", + "a083a4cfd6d2fac8a31b13d1723323be55233091ad3d280637084983a8531d326600", + "a0b1eafa8ec6b94928b4ac69306d1ea447cab455a023bdd31c1b7c667265aec99800", + "a074f76c46d44c70a53fb64d3801444d9739854e7af0ba12749864929e0f3466a900", + "a037d17318bd52b12c443d1c609a64646fad41e1d5a6a9e5f46f1bb6c2b4a9f9a400", + "a03f855b509146866d83d593409f9c0f95f0c49a22ec5d86b4b9d0adb930425ef100", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000" + ], + "keccak_data": [ + "f90211a0643223afd2cdf8850275b8fefeda7aa35da0c26ef0c39c60cfb1e24cc52762c1a0d3e07435e99ae94fa784d0b48f7955cc327f3283c54728a0f0657e9873d4aa76a031cdb1d9522f06bc78049c39940f21a511531017c651f00d53cca82c0b6f34b2a01ec8ea4b4424cf744e29c7d218af2dfe9140256e58171305ab1472bd2df95afba02c69884acac1b6212b90cdd721b88dcfe9b00c2ccbf411d5e9ecdda90f93c234a0335f88c3426aac199fed5e159ed2cf7f9f1a62f93d3a47204773364d06e6508ba01c190836d2eca2384e06b124b900da5aa4ab874ab762c06342600aa8c34c07d3a0a7d794c34193c548e12e2089d9109e25d3d1b13f87be3be358412b6ea906e4cda0176b3d097548b67aa6dd67f4311323285f773fa5bc64894515fb1fb40fe1b87ca0add35369e46f48b4fffcee149bbd8e780bd8dcf784c6bb4da5d371742a439ff2a0d4c92afc344f8c1fed0a3a9a0973e0e2af3a9e92f6c11b041c1c4839b4c04f47a083a4cfd6d2fac8a31b13d1723323be55233091ad3d280637084983a8531d3266a0b1eafa8ec6b94928b4ac69306d1ea447cab455a023bdd31c1b7c667265aec998a074f76c46d44c70a53fb64d3801444d9739854e7af0ba12749864929e0f3466a9a037d17318bd52b12c443d1c609a64646fad41e1d5a6a9e5f46f1bb6c2b4a9f9a4a03f855b509146866d83d593409f9c0f95f0c49a22ec5d86b4b9d0adb930425ef180", + "f90211a0643223afd2cdf8850275b8fefeda7aa35da0c26ef0c39c60cfb1e24cc52762c1a0d3e07435e99ae94fa784d0b48f7955cc327f3283c54728a0f0657e9873d4aa76a031cdb1d9522f06bc78049c39940f21a511531017c651f00d53cca82c0b6f34b2a01ec8ea4b4424cf744e29c7d218af2dfe9140256e58171305ab1472bd2df95afba02c69884acac1b6212b90cdd721b88dcfe9b00c2ccbf411d5e9ecdda90f93c234a0335f88c3426aac199fed5e159ed2cf7f9f1a62f93d3a47204773364d06e6508ba01c190836d2eca2384e06b124b900da5aa4ab874ab762c06342600aa8c34c07d3a0a7d794c34193c548e12e2089d9109e25d3d1b13f87be3be358412b6ea906e4cda0176b3d097548b67aa6dd67f4311323285f773fa5bc64894515fb1fb40fe1b87ca0add35369e46f48b4fffcee149bbd8e780bd8dcf784c6bb4da5d371742a439ff2a0d4c92afc344f8c1fed0a3a9a0973e0e2af3a9e92f6c11b041c1c4839b4c04f47a083a4cfd6d2fac8a31b13d1723323be55233091ad3d280637084983a8531d3266a0b1eafa8ec6b94928b4ac69306d1ea447cab455a023bdd31c1b7c667265aec998a074f76c46d44c70a53fb64d3801444d9739854e7af0ba12749864929e0f3466a9a037d17318bd52b12c443d1c609a64646fad41e1d5a6a9e5f46f1bb6c2b4a9f9a4a03f855b509146866d83d593409f9c0f95f0c49a22ec5d86b4b9d0adb930425ef180" + ] + }, + { + "start": null, + "extension_branch": { + "is_extension": false, + "is_mod_extension": [ + false, + false + ], + "is_placeholder": [ + false, + false + ], + "extension": { + "list_rlp_bytes": "00000000000000000000000000000000000000000000000000000000000000000000" + }, + "branch": { + "modified_index": 6, + "drifted_index": 6, + "list_rlp_bytes": [ + "f90211", + "f90211" + ] + } + }, + "account": null, + "storage": null, + "mod_extension": null, + "values": [ + "a0cdb89f2e65e49e662f7f831085ce0573deb7f3dbcf1597a55c9c0c9e420c6ede00", + "a00dffd4fc7a7acbd11a09ab1a28fad6ce37a9d446dfb9ebf6be429bf800f45b0200", + "a0ea85244fcbe9cc89739872c5ed66efc8f67d331dfa18723e22948d0bc0e8cc7900", + "a02af9d9b113e3dd75c3544b71c112f9a14bd194cccb625bb9ee139c9fee95686a00", + "a0ff3ceb58292c96600ca5b75a541fde654b8d4d8950fbec1b5d26181f8ffb49d400", + "a03f4278f130a38121d771d6ab937d9ecb458596c6ecb60cab6cb4fbfae6d1d39d00", + "a0fec61d1f7a1c8224272521d7be099e7ad7e2e61d1021866c5e12ea01f47f934b00", + "a0cdb89f2e65e49e662f7f831085ce0573deb7f3dbcf1597a55c9c0c9e420c6ede00", + "a0bf00c6c27397c5b9c3e6e2bc5545d74d1ad6eaa1443f88942a26a9e37a6207b400", + "a06518755c2762ea97b58027e8843c110ddbcd2f6a07e4d239c72386f1fc77edb700", + "a08f15a73b5cbc8f2da22ec5303993b971e96e72407145a76fe327dea836226f8f00", + "a040222473c2e4aaaa15d7806aec12e22cc0b64ecf44f47af45b9a0dfd72d1b77f00", + "a081c0a354ff213fed635c58e5c3b09774374bc72811386af11e8f3716bc8e08f300", + "a0003b48aebee15ad11ab9f4e0dfe94b54122261fe23e7ed056aca36f2123eb34400", + "a028c4fe56d5638df2d3b202c7332c748272fe84d9462c534128f68612c389138d00", + "a0e064b6c149ebf5772b53b33423d2d5cf9bd8565db4d76c7f8e3a7474025b324000", + "a01f4af370ae8e26ec0c81df057a2a53fbcf5824854e5f6a9253509539bbb277db00", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000" + ], + "keccak_data": [ + "f90211a00dffd4fc7a7acbd11a09ab1a28fad6ce37a9d446dfb9ebf6be429bf800f45b02a0ea85244fcbe9cc89739872c5ed66efc8f67d331dfa18723e22948d0bc0e8cc79a02af9d9b113e3dd75c3544b71c112f9a14bd194cccb625bb9ee139c9fee95686aa0ff3ceb58292c96600ca5b75a541fde654b8d4d8950fbec1b5d26181f8ffb49d4a03f4278f130a38121d771d6ab937d9ecb458596c6ecb60cab6cb4fbfae6d1d39da0fec61d1f7a1c8224272521d7be099e7ad7e2e61d1021866c5e12ea01f47f934ba0cdb89f2e65e49e662f7f831085ce0573deb7f3dbcf1597a55c9c0c9e420c6edea0bf00c6c27397c5b9c3e6e2bc5545d74d1ad6eaa1443f88942a26a9e37a6207b4a06518755c2762ea97b58027e8843c110ddbcd2f6a07e4d239c72386f1fc77edb7a08f15a73b5cbc8f2da22ec5303993b971e96e72407145a76fe327dea836226f8fa040222473c2e4aaaa15d7806aec12e22cc0b64ecf44f47af45b9a0dfd72d1b77fa081c0a354ff213fed635c58e5c3b09774374bc72811386af11e8f3716bc8e08f3a0003b48aebee15ad11ab9f4e0dfe94b54122261fe23e7ed056aca36f2123eb344a028c4fe56d5638df2d3b202c7332c748272fe84d9462c534128f68612c389138da0e064b6c149ebf5772b53b33423d2d5cf9bd8565db4d76c7f8e3a7474025b3240a01f4af370ae8e26ec0c81df057a2a53fbcf5824854e5f6a9253509539bbb277db80", + "f90211a00dffd4fc7a7acbd11a09ab1a28fad6ce37a9d446dfb9ebf6be429bf800f45b02a0ea85244fcbe9cc89739872c5ed66efc8f67d331dfa18723e22948d0bc0e8cc79a02af9d9b113e3dd75c3544b71c112f9a14bd194cccb625bb9ee139c9fee95686aa0ff3ceb58292c96600ca5b75a541fde654b8d4d8950fbec1b5d26181f8ffb49d4a03f4278f130a38121d771d6ab937d9ecb458596c6ecb60cab6cb4fbfae6d1d39da0fec61d1f7a1c8224272521d7be099e7ad7e2e61d1021866c5e12ea01f47f934ba0cdb89f2e65e49e662f7f831085ce0573deb7f3dbcf1597a55c9c0c9e420c6edea0bf00c6c27397c5b9c3e6e2bc5545d74d1ad6eaa1443f88942a26a9e37a6207b4a06518755c2762ea97b58027e8843c110ddbcd2f6a07e4d239c72386f1fc77edb7a08f15a73b5cbc8f2da22ec5303993b971e96e72407145a76fe327dea836226f8fa040222473c2e4aaaa15d7806aec12e22cc0b64ecf44f47af45b9a0dfd72d1b77fa081c0a354ff213fed635c58e5c3b09774374bc72811386af11e8f3716bc8e08f3a0003b48aebee15ad11ab9f4e0dfe94b54122261fe23e7ed056aca36f2123eb344a028c4fe56d5638df2d3b202c7332c748272fe84d9462c534128f68612c389138da0e064b6c149ebf5772b53b33423d2d5cf9bd8565db4d76c7f8e3a7474025b3240a01f4af370ae8e26ec0c81df057a2a53fbcf5824854e5f6a9253509539bbb277db80" + ] + }, + { + "start": null, + "extension_branch": { + "is_extension": false, + "is_mod_extension": [ + false, + false + ], + "is_placeholder": [ + false, + false + ], + "extension": { + "list_rlp_bytes": "00000000000000000000000000000000000000000000000000000000000000000000" + }, + "branch": { + "modified_index": 12, + "drifted_index": 12, + "list_rlp_bytes": [ + "f8d1", + "f8d1" + ] + } + }, + "account": null, + "storage": null, + "mod_extension": null, + "values": [ + "a0b0375763c9c490c555bf594dc13ecf3e63003a136a5bada92ee4f48197c73c2d00", + "80000000000000000000000000000000000000000000000000000000000000000000", + "a034e0097d64dedfd3ecaff0702de289c4110f5b7b8243d49e8ea7969682c5b17a00", + "80000000000000000000000000000000000000000000000000000000000000000000", + "a07da532ec5da228b88092a7102ba227acb97d8295949c33d7c207ea1d95771cb200", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "a035f5e68adcf50eaa023741ba9d02a53ec950464f04cf8063f22eaa3f965d36e600", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "a0b0375763c9c490c555bf594dc13ecf3e63003a136a5bada92ee4f48197c73c2d00", + "a0dd96313bf54b09798f4c5b5958b5bd8f2c3f079b5a24c0b89033fc9a088fb08e00", + "80000000000000000000000000000000000000000000000000000000000000000000", + "a086c80e661a30f3e76d27611ee60125b0fb3deebea9a5b36236e1dc6ad87f9db400", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000" + ], + "keccak_data": [ + "f8d180a034e0097d64dedfd3ecaff0702de289c4110f5b7b8243d49e8ea7969682c5b17a80a07da532ec5da228b88092a7102ba227acb97d8295949c33d7c207ea1d95771cb2808080a035f5e68adcf50eaa023741ba9d02a53ec950464f04cf8063f22eaa3f965d36e680808080a0b0375763c9c490c555bf594dc13ecf3e63003a136a5bada92ee4f48197c73c2da0dd96313bf54b09798f4c5b5958b5bd8f2c3f079b5a24c0b89033fc9a088fb08e80a086c80e661a30f3e76d27611ee60125b0fb3deebea9a5b36236e1dc6ad87f9db480", + "f8d180a034e0097d64dedfd3ecaff0702de289c4110f5b7b8243d49e8ea7969682c5b17a80a07da532ec5da228b88092a7102ba227acb97d8295949c33d7c207ea1d95771cb2808080a035f5e68adcf50eaa023741ba9d02a53ec950464f04cf8063f22eaa3f965d36e680808080a0b0375763c9c490c555bf594dc13ecf3e63003a136a5bada92ee4f48197c73c2da0dd96313bf54b09798f4c5b5958b5bd8f2c3f079b5a24c0b89033fc9a088fb08e80a086c80e661a30f3e76d27611ee60125b0fb3deebea9a5b36236e1dc6ad87f9db480" + ] + }, + { + "start": null, + "extension_branch": { + "is_extension": false, + "is_mod_extension": [ + false, + false + ], + "is_placeholder": [ + false, + false + ], + "extension": { + "list_rlp_bytes": "00000000000000000000000000000000000000000000000000000000000000000000" + }, + "branch": { + "modified_index": 0, + "drifted_index": 0, + "list_rlp_bytes": [ + "f851", + "f851" + ] + } + }, + "account": null, + "storage": null, + "mod_extension": null, + "values": [ + "a05a5c24d87e3c29db49e2def81af9f175bfa4bf067e6081e69fdd6768ceb5b54d00", + "a05a5c24d87e3c29db49e2def81af9f175bfa4bf067e6081e69fdd6768ceb5b54d00", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "a01d7f6211d4254b8cde93b7a9797babd2e4d76e21d81e78e9e0aafb417c99c17900", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000" + ], + "keccak_data": [ + "f851a05a5c24d87e3c29db49e2def81af9f175bfa4bf067e6081e69fdd6768ceb5b54d808080a01d7f6211d4254b8cde93b7a9797babd2e4d76e21d81e78e9e0aafb417c99c179808080808080808080808080", + "f851a05a5c24d87e3c29db49e2def81af9f175bfa4bf067e6081e69fdd6768ceb5b54d808080a01d7f6211d4254b8cde93b7a9797babd2e4d76e21d81e78e9e0aafb417c99c179808080808080808080808080" + ] + }, + { + "start": null, + "extension_branch": null, + "account": { + "address": "caac46d9bd68bffb533320545a90cd92c6e98e58", + "key": "c856c0d4438ec2fa5935cb6f47e96b22b75968689748d23db05fa7e9d908e4f5", + "list_rlp_bytes": [ + "f867", + "f867" + ], + "value_rlp_bytes": [ + "b846", + "b846" + ], + "value_list_rlp_bytes": [ + "f844", + "f844" + ], + "drifted_rlp_bytes": "00", + "wrong_rlp_bytes": "f867", + "is_mod_extension": [ + false, + false + ], + "mod_list_rlp_bytes": [ + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000" + ] + }, + "storage": null, + "mod_extension": null, + "values": [ + "9e20d4438ec2fa5935cb6f47e96b22b75968689748d23db05fa7e9d908e4f5000000", + "9e20d4438ec2fa5935cb6f47e96b22b75968689748d23db05fa7e9d908e4f5000000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "62000000000000000000000000000000000000000000000000000000000000000000", + "a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42100", + "a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47000", + "80000000000000000000000000000000000000000000000000000000000000000000", + "62000000000000000000000000000000000000000000000000000000000000000000", + "a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42100", + "a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "9e20d4438ec2fa5935cb6f47e96b22b75968689748d23db05fa7e9d908e4f5000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000" + ], + "keccak_data": [ + "f8679e20d4438ec2fa5935cb6f47e96b22b75968689748d23db05fa7e9d908e4f5b846f8448062a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "f8679e20d4438ec2fa5935cb6f47e96b22b75968689748d23db05fa7e9d908e4f5b846f8448062a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "caac46d9bd68bffb533320545a90cd92c6e98e58" + ] + }, + { + "start": null, + "extension_branch": null, + "account": null, + "storage": { + "address": "0000000000000000000000000000000000000000000000000000000000000000", + "key": "290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563", + "list_rlp_bytes": [ + "e3", + "e3" + ], + "value_rlp_bytes": [ + "00", + "00" + ], + "drifted_rlp_bytes": "00", + "wrong_rlp_bytes": "00000000000000000000000000000000000000000000000000000000000000000000", + "is_mod_extension": [ + false, + false + ], + "mod_list_rlp_bytes": [ + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000" + ] + }, + "mod_extension": null, + "values": [ + "a1200000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "a1200000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000000000" + ], + "keccak_data": [ + "e3a12000000000000000000000000000000000000000000000000000000000000000", + "e3a12000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ] + }, + { + "start": { + "disable_preimage_check": false, + "proof_type": "Disabled" + }, + "extension_branch": null, + "account": null, + "storage": null, + "mod_extension": null, + "values": [ + "a0000000000000000000000000000000000000000000000000000000000000000000", + "a0000000000000000000000000000000000000000000000000000000000000000000" + ], + "keccak_data": [] + } +] \ No newline at end of file diff --git a/zkevm-circuits/src/mpt_circuit/witness_row.rs b/zkevm-circuits/src/mpt_circuit/witness_row.rs index 4b75019537..9ce6c47f52 100644 --- a/zkevm-circuits/src/mpt_circuit/witness_row.rs +++ b/zkevm-circuits/src/mpt_circuit/witness_row.rs @@ -39,14 +39,14 @@ pub(crate) enum AccountRowType { CodehashC, Drifted, Wrong, - LongExtNodeKey, - LongExtNodeNibbles, - LongExtNodeValue, - ShortExtNodeKey, - ShortExtNodeNibbles, - ShortExtNodeValue, - Address, - Key, + LongExtNodeKey, // only used when extension node nibbles are modified + LongExtNodeNibbles, // only used when extension node nibbles are modified + LongExtNodeValue, // only used when extension node nibbles are modified + ShortExtNodeKey, // only used when extension node nibbles are modified + ShortExtNodeNibbles, // only used when extension node nibbles are modified + ShortExtNodeValue, // only used when extension node nibbles are modified + Address, // account address + Key, // hashed account address Count, } @@ -150,61 +150,73 @@ pub struct ExtensionBranchNode { /// MPT account node #[derive(Clone, Debug, Serialize, Deserialize)] pub struct AccountNode { - /// TODO Doc. + /// Account address. pub address: Hex, - /// TODO Doc. + /// Hashed account address. pub key: Hex, - /// TODO Doc. + /// RLP bytes denoting the length of the whole account leaf stream. pub list_rlp_bytes: [Hex; 2], - /// TODO Doc. + /// RLP bytes denoting the length of the RLP list denoting the value stream (containing nonce, + /// balance storage, codehash). pub value_rlp_bytes: [Hex; 2], - /// TODO Doc. + /// RLP bytes denoting the length of the RLP of the value stream. pub value_list_rlp_bytes: [Hex; 2], - /// TODO Doc. + /// RLP bytes denoting the length of the RLP stream of the drifted leaf (neighbour leaf). + /// This is only needed in the case when a new branch is created which replaces the existing + /// leaf in the trie and this leaf drifts down into newly created branch. pub drifted_rlp_bytes: Hex, - /// TODO Doc. + /// RLP bytes denoting the length of the RLP stream of the (wrong) leaf that has been returned + /// by `getProof` which has the same address up to a certain nibble as the required leaf. + /// This is only needed for some special cases of the AccountDoesNotExist proof. pub wrong_rlp_bytes: Hex, - /// TODO Doc. + /// Denotes whether the extension node nibbles have been modified in either `S` or `C` proof. + /// In these special cases, an additional extension node is inserted (deleted). pub(crate) is_mod_extension: [bool; 2], - /// TODO Doc. + /// RLP bytes denoting the length of the RLP of the long and short modified extension node. pub(crate) mod_list_rlp_bytes: [Hex; 2], } /// MPT storage node #[derive(Clone, Debug, Serialize, Deserialize)] pub struct StorageNode { - /// TODO Doc. + /// Storage key. pub address: Hex, - /// TODO Doc. + /// Hashed storage key. pub key: Hex, - /// TODO Doc. + /// RLP bytes denoting the length of the whole storage leaf stream. pub list_rlp_bytes: [Hex; 2], - /// TODO Doc. + /// RLP bytes denoting the length of the value stream. pub value_rlp_bytes: [Hex; 2], - /// TODO Doc. + /// RLP bytes denoting the length of the RLP stream of the drifted leaf (neighbour leaf). + /// This is only needed in the case when a new branch is created which replaces the existing + /// leaf in the trie and this leaf drifts down into newly created branch. pub drifted_rlp_bytes: Hex, - /// TODO Doc. + /// RLP bytes denoting the length of the RLP stream of the (wrong) leaf that has been returned + /// by `getProof` which has the same address up to a certain nibble as the required leaf. + /// This is only needed for some special cases of the StorageDoesNotExist proof. pub wrong_rlp_bytes: Hex, - /// TODO Doc. + /// Denotes whether the extension node nibbles have been modified in either `S` or `C` proof. + /// In these special cases, an additional extension node is inserted (deleted). pub(crate) is_mod_extension: [bool; 2], - /// TODO Doc. + /// RLP bytes denoting the length of the RLP of the long and short modified extension node. pub(crate) mod_list_rlp_bytes: [Hex; 2], } /// MPT node #[derive(Clone, Debug, Default, Serialize, Deserialize)] pub struct Node { - /// TODO Doc. + /// A node denoting the start / end of the proof. pub start: Option, - /// TODO Doc. + /// A node as an abstraction of extension node and branch. pub extension_branch: Option, - /// TODO Doc. + /// An account leaf node. pub account: Option, - /// TODO Doc. + /// A storage leaf node. pub storage: Option, - /// MPT node values + /// RLP substreams of the node (for example for account leaf it contains substreams for key, + /// nonce, balance, storage, codehash, drifted key, wrong key...) pub values: Vec, - /// MPT keccak data + /// Streams to be hashed and verified by Keccak circuit. pub keccak_data: Vec, } diff --git a/zkevm-circuits/src/pi_circuit.rs b/zkevm-circuits/src/pi_circuit.rs index 0349fbda7d..920b0e13d7 100644 --- a/zkevm-circuits/src/pi_circuit.rs +++ b/zkevm-circuits/src/pi_circuit.rs @@ -33,7 +33,7 @@ use crate::{ }, table::{BlockTable, KeccakTable, LookupTable, TxFieldTag, TxTable, WdTable}, tx_circuit::TX_LEN, - util::{word::Word, Challenges, SubCircuit, SubCircuitConfig}, + util::{word::WordLoHi, Challenges, SubCircuit, SubCircuitConfig}, witness::{self, Chunk}, }; use gadgets::{ @@ -402,8 +402,8 @@ impl SubCircuitConfig for PiCircuitConfig { let default_calldata_row_constraint4 = tx_id_is_zero_config.expr() * gas_cost.expr(); // if tx_id != 0 then - // 1. tx_id_next == tx_id: idx_next == idx + 1, gas_cost_next == gas_cost + - // gas_next, is_final == false; + // 1. tx_id_next == tx_id: idx_next == idx + 1, gas_cost_next == gas_cost + gas_next, + // is_final == false; // 2. tx_id_next == tx_id + 1 + x (where x is in [0, 2^16)): idx_next == 0, // gas_cost_next == gas_next, is_final == true; // 3. tx_id_next == 0: is_final == true, idx_next == 0, gas_cost_next == 0; @@ -617,7 +617,7 @@ impl PiCircuitConfig { offset, || Value::known(F::ZERO), )?; - Word::default().into_value().assign_advice( + WordLoHi::default().into_value().assign_advice( region, || "tx_value", self.tx_table.value, @@ -698,7 +698,7 @@ impl PiCircuitConfig { F::ZERO }; let tag = F::from(tag as u64); - let tx_value = Word::new([ + let tx_value = WordLoHi::new([ from_bytes::value( &tx_value_bytes_le[..min(N_BYTES_HALF_WORD, tx_value_bytes_le.len())], ), @@ -811,7 +811,7 @@ impl PiCircuitConfig { let tx_id_diff_inv = tx_id_diff.invert().unwrap_or(F::ZERO); let tag = F::from(TxFieldTag::CallData as u64); let index = F::from(index as u64); - let tx_value: Word> = Word::from(tx_value_byte).into_value(); + let tx_value: WordLoHi> = WordLoHi::from(tx_value_byte).into_value(); let tx_value_inv = tx_value.map(|t| t.map(|x| x.invert().unwrap_or(F::ZERO))); let is_final = if is_final { F::ONE } else { F::ZERO }; @@ -910,7 +910,7 @@ impl PiCircuitConfig { offset, || Value::known(F::from(wd.validator_id)), )?; - let address_assigned_cell = Word::::from(wd.address).into_value().assign_advice( + let address_assigned_cell = WordLoHi::::from(wd.address).into_value().assign_advice( region, || "address", self.wd_table.address, @@ -1095,7 +1095,7 @@ impl PiCircuitConfig { Ok(( rpi_bytes_keccakrlc_cells[0].clone(), - Word::new( + WordLoHi::new( (0..2) // padding rpi_value_lc_cells to 2 limbs if less then 2 .map(|i| rpi_value_lc_cells.get(i).unwrap_or(&zero_cell).clone()) .collect_vec() @@ -1123,7 +1123,7 @@ impl PiCircuitConfig { let mut block_copy_cells = vec![]; // coinbase - let block_value = Word::from(block_values.coinbase) + let block_value = WordLoHi::from(block_values.coinbase) .into_value() .assign_advice( region, @@ -1150,7 +1150,7 @@ impl PiCircuitConfig { *block_table_offset += 1; // gas_limit - let block_value = Word::from(block_values.gas_limit) + let block_value = WordLoHi::from(block_values.gas_limit) .into_value() .assign_advice( region, @@ -1171,12 +1171,14 @@ impl PiCircuitConfig { *block_table_offset += 1; // number - let block_value = Word::from(block_values.number).into_value().assign_advice( - region, - || "number", - self.block_table.value, - *block_table_offset, - )?; + let block_value = WordLoHi::from(block_values.number) + .into_value() + .assign_advice( + region, + || "number", + self.block_table.value, + *block_table_offset, + )?; let (_, word) = self.assign_raw_bytes( region, &block_values.number.to_le_bytes(), @@ -1190,7 +1192,7 @@ impl PiCircuitConfig { *block_table_offset += 1; // timestamp - let block_value = Word::from(block_values.timestamp) + let block_value = WordLoHi::from(block_values.timestamp) .into_value() .assign_advice( region, @@ -1211,7 +1213,7 @@ impl PiCircuitConfig { *block_table_offset += 1; // difficulty - let block_value = Word::from(block_values.difficulty) + let block_value = WordLoHi::from(block_values.difficulty) .into_value() .assign_advice( region, @@ -1232,7 +1234,7 @@ impl PiCircuitConfig { *block_table_offset += 1; // base_fee - let block_value = Word::from(block_values.base_fee) + let block_value = WordLoHi::from(block_values.base_fee) .into_value() .assign_advice( region, @@ -1253,7 +1255,7 @@ impl PiCircuitConfig { *block_table_offset += 1; // chain_id - let block_value = Word::from(block_values.chain_id) + let block_value = WordLoHi::from(block_values.chain_id) .into_value() .assign_advice( region, @@ -1274,7 +1276,7 @@ impl PiCircuitConfig { *block_table_offset += 1; // withdrawals_root - let block_value = Word::from(block_values.withdrawals_root) + let block_value = WordLoHi::from(block_values.withdrawals_root) .into_value() .assign_advice( region, @@ -1295,7 +1297,7 @@ impl PiCircuitConfig { *block_table_offset += 1; for prev_hash in block_values.history_hashes { - let block_value = Word::from(prev_hash).into_value().assign_advice( + let block_value = WordLoHi::from(prev_hash).into_value().assign_advice( region, || "prev_hash", self.block_table.value, @@ -1402,8 +1404,8 @@ impl PiCircuitConfig { fn assign_rpi_digest_word( &self, region: &mut Region<'_, F>, - digest_word: Word, - ) -> Result>, Error> { + digest_word: WordLoHi, + ) -> Result>, Error> { let lo_assigned_cell = region.assign_advice( || "rpi_digest_bytes_limbs_lo", self.rpi_digest_bytes_limbs, @@ -1416,7 +1418,7 @@ impl PiCircuitConfig { 1, || digest_word.into_value().hi(), )?; - Ok(Word::new([lo_assigned_cell, hi_assigned_cell])) + Ok(WordLoHi::new([lo_assigned_cell, hi_assigned_cell])) } } @@ -1562,7 +1564,7 @@ impl SubCircuit for PiCircuit { let mut block_table_offset = 0; // assign empty row in block table - let zero_word = Word::default().into_value().assign_advice( + let zero_word = WordLoHi::default().into_value().assign_advice( &mut region, || "zero", config.block_table.value, @@ -1619,7 +1621,7 @@ impl SubCircuit for PiCircuit { // Add empty row // assign first tx_value empty row, and to obtain zero cell via hi() part. // we use hi() part to copy-constrains other tx_table value `hi` cells. - let zero_cell = Word::default() + let zero_cell = WordLoHi::default() .into_value() .assign_advice(&mut region, || "tx_value", config.tx_table.value, 0)? .hi(); diff --git a/zkevm-circuits/src/pi_circuit/param.rs b/zkevm-circuits/src/pi_circuit/param.rs index fff7391e76..044e63c92e 100644 --- a/zkevm-circuits/src/pi_circuit/param.rs +++ b/zkevm-circuits/src/pi_circuit/param.rs @@ -1,10 +1,10 @@ use halo2_proofs::circuit::AssignedCell; -use crate::util::word::Word; +use crate::util::word::WordLoHi; /// Fixed by the spec pub(super) const BYTE_POW_BASE: u64 = 256; pub(super) const EMPTY_TX_ROW_COUNT: usize = 1; pub(super) const N_BYTES_ONE: usize = 1; -pub(super) type AssignedByteCells = (AssignedCell, Word>); +pub(super) type AssignedByteCells = (AssignedCell, WordLoHi>); diff --git a/zkevm-circuits/src/root_circuit/aggregation.rs b/zkevm-circuits/src/root_circuit/aggregation.rs index 033e4e22ed..9858c5a18c 100644 --- a/zkevm-circuits/src/root_circuit/aggregation.rs +++ b/zkevm-circuits/src/root_circuit/aggregation.rs @@ -592,7 +592,7 @@ pub mod test { pub struct StandardPlonk(F); impl StandardPlonk { - /// Create a `StandardPlonk` with random instnace. + /// Create a `StandardPlonk` with random instance. pub fn rand(mut rng: R) -> Self { Self(F::from(rng.next_u32() as u64)) } diff --git a/zkevm-circuits/src/root_circuit/test.rs b/zkevm-circuits/src/root_circuit/test.rs index 071d4f129f..8cb70c898b 100644 --- a/zkevm-circuits/src/root_circuit/test.rs +++ b/zkevm-circuits/src/root_circuit/test.rs @@ -35,6 +35,7 @@ fn test_root_circuit_multiple_chunk() { max_bytecode: 512, max_evm_rows: 1 << 12, max_keccak_rows: 0, + max_vertical_circuit_rows: 0, }; let (k, circuits, instances, _) = SuperCircuit::<_>::build(block_1tx(), circuits_params, TEST_MOCK_RANDOMNESS.into()) diff --git a/zkevm-circuits/src/sig_circuit.rs b/zkevm-circuits/src/sig_circuit.rs new file mode 100644 index 0000000000..403d784fde --- /dev/null +++ b/zkevm-circuits/src/sig_circuit.rs @@ -0,0 +1,1052 @@ +//! Circuit to verify multiple ECDSA secp256k1 signatures. +// This module uses halo2-ecc's ecdsa chip +// - to prove the correctness of secp signatures +// - to compute the RLC in circuit +// - to perform keccak lookup table +// +// Naming notes: +// - *_be: Big-Endian bytes +// - *_le: Little-Endian bytes + +#[cfg(any(test, feature = "test-circuits"))] +mod dev; +mod ecdsa; +#[cfg(test)] +mod test; +mod utils; + +use crate::{ + evm_circuit::{util::not, EvmCircuit}, + keccak_circuit::KeccakCircuit, + sig_circuit::{ + ecdsa::ecdsa_verify_no_pubkey_check, + utils::{calc_required_advices, FpChip}, + }, + table::{KeccakTable, SigTable}, + util::{word::WordLoHi, Challenges, Expr, SubCircuit, SubCircuitConfig}, +}; +use eth_types::{ + self, + sign_types::{pk_bytes_le, pk_bytes_swap_endianness, SignData}, + Field, +}; +use halo2_base::{ + gates::{range::RangeConfig, GateInstructions, RangeInstructions}, + utils::modulus, + AssignedValue, Context, QuantumCell, SKIP_FIRST_PASS, +}; +use halo2_ecc::{ + bigint::CRTInteger, + ecc::EccChip, + fields::{ + fp::{FpConfig, FpStrategy}, + FieldChip, + }, +}; +pub(crate) use utils::*; + +use halo2_proofs::{ + circuit::{Layouter, Value}, + halo2curves::secp256k1::{Fp, Fq, Secp256k1Affine}, + plonk::{Advice, Column, ConstraintSystem, Error, Expression, Selector}, + poly::Rotation, +}; + +use ethers_core::utils::keccak256; +use itertools::Itertools; +use log::error; +use std::{iter, marker::PhantomData}; + +/// Circuit configuration arguments +pub struct SigCircuitConfigArgs { + /// KeccakTable + pub _keccak_table: KeccakTable, + /// SigTable + pub sig_table: SigTable, + /// Challenges + pub challenges: Challenges>, +} + +/// SignVerify Configuration +#[derive(Debug, Clone)] +pub struct SigCircuitConfig +where + F: Field + halo2_base::utils::ScalarField, +{ + /// ECDSA + ecdsa_config: FpChip, + // ecdsa_config: FpConfig, + /// An advice column to store RLC witnesses + rlc_column: Column, + /// selector for keccak lookup table + q_keccak: Selector, + /// Used to lookup pk->pk_hash(addr) + _keccak_table: KeccakTable, + /// The exposed table to be used by tx circuit and ecrecover + sig_table: SigTable, +} + +impl SubCircuitConfig for SigCircuitConfig +where + F: Field + halo2_base::utils::ScalarField, +{ + type ConfigArgs = SigCircuitConfigArgs; + + /// Return a new SigConfig + fn new( + meta: &mut ConstraintSystem, + Self::ConfigArgs { + _keccak_table, + sig_table, + challenges: _, + }: Self::ConfigArgs, + ) -> Self { + // need an additional phase 2 column/basic gate to hold the witnesses during RLC + // computations + let num_advice = [calc_required_advices(MAX_NUM_SIG), 1]; + let num_lookup_advice = [calc_required_lookup_advices(MAX_NUM_SIG)]; + log::info!("configuring ECDSA chip with multiple phases"); + + let ecdsa_config = FpConfig::configure( + meta, + FpStrategy::Simple, + &num_advice, + &num_lookup_advice, + 1, + LOG_TOTAL_NUM_ROWS - 1, + LIMB_BITS, + NUM_LIMBS, + modulus::(), + 0, + LOG_TOTAL_NUM_ROWS, // maximum k of the chip + ); + + // we need one phase 2 column to store RLC results + let rlc_column = meta.advice_column_in(halo2_proofs::plonk::SecondPhase); + + meta.enable_equality(rlc_column); + + meta.enable_equality(sig_table.recovered_addr); + meta.enable_equality(sig_table.sig_r.lo()); + meta.enable_equality(sig_table.sig_r.hi()); + meta.enable_equality(sig_table.sig_s.lo()); + meta.enable_equality(sig_table.sig_s.hi()); + meta.enable_equality(sig_table.sig_v); + meta.enable_equality(sig_table.is_valid); + meta.enable_equality(sig_table.msg_hash.lo()); + meta.enable_equality(sig_table.msg_hash.hi()); + + // Ref. spec SignVerifyChip 1. Verify that keccak(pub_key_bytes) = pub_key_hash + // by keccak table lookup, where pub_key_bytes is built from the pub_key + // in the ecdsa_chip. + let q_keccak = meta.complex_selector(); + + meta.lookup_any("keccak lookup table", |meta| { + // When address is 0, we disable the signature verification by using a dummy pk, + // msg_hash and signature which is not constrained to match msg_hash_rlc nor + // the address. + // Layout: + // | q_keccak | rlc | + // | -------- | --------------- | + // | 1 | is_address_zero | + // | | pk_rlc | + // | | pk_hash_lo | + // | | pk_hash_hi | + let q_keccak = meta.query_selector(q_keccak); + let is_address_zero = meta.query_advice(rlc_column, Rotation::cur()); + let is_enable = q_keccak * not::expr(is_address_zero); + + let input = [ + is_enable.clone(), + is_enable.clone() * meta.query_advice(rlc_column, Rotation(1)), + is_enable.clone() * 64usize.expr(), + is_enable.clone() * meta.query_advice(rlc_column, Rotation(2)), + is_enable * meta.query_advice(rlc_column, Rotation(3)), + ]; + let table = [ + meta.query_advice(_keccak_table.is_enabled, Rotation::cur()), + meta.query_advice(_keccak_table.input_rlc, Rotation::cur()), + meta.query_advice(_keccak_table.input_len, Rotation::cur()), + meta.query_advice(_keccak_table.output.lo(), Rotation::cur()), + meta.query_advice(_keccak_table.output.hi(), Rotation::cur()), + ]; + + input.into_iter().zip(table).collect() + }); + + Self { + ecdsa_config, + _keccak_table, + sig_table, + q_keccak, + rlc_column, + } + } +} + +/// Verify a message hash is signed by the public +/// key corresponding to an Ethereum Address. +#[derive(Clone, Debug, Default)] +pub struct SigCircuit { + /// Max number of verifications + pub max_verif: usize, + /// Without padding + pub signatures: Vec, + /// Marker + pub _marker: PhantomData, +} + +impl SubCircuit for SigCircuit { + type Config = SigCircuitConfig; + + fn new_from_block(block: &crate::witness::Block, chunk: &crate::witness::Chunk) -> Self { + assert!(chunk.fixed_param.max_txs <= MAX_NUM_SIG); + + SigCircuit { + max_verif: MAX_NUM_SIG, + signatures: block.get_sign_data(true), + _marker: Default::default(), + } + } + + /// Returns number of unusable rows of the SubCircuit, which should be + /// `meta.blinding_factors() + 1`. + fn unusable_rows() -> usize { + [ + KeccakCircuit::::unusable_rows(), + EvmCircuit::::unusable_rows(), + // may include additional subcircuits here + ] + .into_iter() + .max() + .unwrap() + } + + fn synthesize_sub( + &self, + config: &Self::Config, + challenges: &Challenges>, + layouter: &mut impl Layouter, + ) -> Result<(), Error> { + config.ecdsa_config.range.load_lookup_table(layouter)?; + self.assign(config, layouter, &self.signatures, challenges)?; + Ok(()) + } + + // Since sig circuit / halo2-lib use veticle cell assignment, + // so the returned pair is consisted of same values + fn min_num_rows_block( + block: &crate::witness::Block, + chunk: &crate::witness::Chunk, + ) -> (usize, usize) { + let row_num = if chunk.fixed_param.max_vertical_circuit_rows == 0 { + Self::min_num_rows() + } else { + chunk.fixed_param.max_vertical_circuit_rows + }; + + let ecdsa_verif_count = + block.txs.len() + block.precompile_events.get_ecrecover_events().len(); + // Reserve one ecdsa verification for padding tx such that the bad case in which some tx + // calls MAX_NUM_SIG - 1 ecrecover precompile won't happen. If that case happens, the sig + // circuit won't have more space for the padding tx's ECDSA verification. Then the + // prover won't be able to produce any valid proof. + let max_num_verif = MAX_NUM_SIG - 1; + + // Instead of showing actual minimum row usage, + // halo2-lib based circuits use min_row_num to represent a percentage of total-used capacity + // This functionality allows l2geth to decide if additional ops can be added. + let min_row_num = (row_num / max_num_verif) * ecdsa_verif_count; + + (min_row_num, row_num) + } +} + +impl SigCircuit { + /// Return a new SigCircuit + pub fn new(max_verif: usize) -> Self { + Self { + max_verif, + signatures: Vec::new(), + _marker: PhantomData, + } + } + + /// Return the minimum number of rows required to prove an input of a + /// particular size. + pub fn min_num_rows() -> usize { + // SigCircuit can't determine usable rows independently. + // Instead, the blinding area is determined by other advise columns with most counts of + // rotation queries. This value is typically determined by either the Keccak or EVM + // circuit. + + // the cells are allocated vertically, i.e., given a TOTAL_NUM_ROWS * NUM_ADVICE + // matrix, the allocator will try to use all the cells in the first column, then + // the second column, etc. + + let max_blinding_factor = Self::unusable_rows() - 1; + + // same formula as halo2-lib's FlexGate + (1 << LOG_TOTAL_NUM_ROWS) - (max_blinding_factor + 3) + } +} + +impl SigCircuit { + /// Verifies the ecdsa relationship. I.e., prove that the signature + /// is (in)valid or not under the given public key and the message hash in + /// the circuit. Does not enforce the signature is valid. + /// + /// Returns the cells for + /// - public keys + /// - message hashes + /// - a boolean whether the signature is correct or not + /// + /// WARNING: this circuit does not enforce the returned value to be true + /// make sure the caller checks this result! + fn assign_ecdsa( + &self, + ctx: &mut Context, + ecdsa_chip: &FpChip, + sign_data: &SignData, + ) -> Result>, Error> { + let gate = ecdsa_chip.gate(); + let zero = gate.load_zero(ctx); + + let SignData { + signature, + pk, + msg: _, + msg_hash, + } = sign_data; + let (sig_r, sig_s, v) = signature; + + // build ecc chip from Fp chip + let ecc_chip = EccChip::>::construct(ecdsa_chip.clone()); + let pk_assigned = ecc_chip.load_private(ctx, (Value::known(pk.x), Value::known(pk.y))); + let pk_is_valid = ecc_chip.is_on_curve_or_infinity::(ctx, &pk_assigned); + gate.assert_is_const(ctx, &pk_is_valid, F::ONE); + + // build Fq chip from Fp chip + let fq_chip = FqChip::construct(ecdsa_chip.range.clone(), 88, 3, modulus::()); + let integer_r = + fq_chip.load_private(ctx, FqChip::::fe_to_witness(&Value::known(*sig_r))); + let integer_s = + fq_chip.load_private(ctx, FqChip::::fe_to_witness(&Value::known(*sig_s))); + let msg_hash = + fq_chip.load_private(ctx, FqChip::::fe_to_witness(&Value::known(*msg_hash))); + + // returns the verification result of ecdsa signature + // + // WARNING: this circuit does not enforce the returned value to be true + // make sure the caller checks this result! + let (sig_is_valid, pk_is_zero, y_coord, y_coord_is_zero) = + ecdsa_verify_no_pubkey_check::( + &ecc_chip.field_chip, + ctx, + &pk_assigned, + &integer_r, + &integer_s, + &msg_hash, + 4, + 4, + ); + + // ======================================= + // constrains v == y.is_oddness() + // ======================================= + assert!(*v == 0 || *v == 1, "v is not boolean"); + + // we constrain: + // - v + 2*tmp = y where y is already range checked (88 bits) + // - v is a binary + // - tmp is also < 88 bits (this is crucial otherwise tmp may wrap around and break + // soundness) + + let assigned_y_is_odd = gate.load_witness(ctx, Value::known(F::from(*v as u64))); + gate.assert_bit(ctx, assigned_y_is_odd); + + // the last 88 bits of y + let assigned_y_limb = &y_coord.limbs()[0]; + let mut y_value = F::ZERO; + assigned_y_limb.value().map(|&x| y_value = x); + + // y_tmp = (y_value - y_last_bit)/2 + let y_tmp = (y_value - F::from(*v as u64)) * F::TWO_INV; + let assigned_y_tmp = gate.load_witness(ctx, Value::known(y_tmp)); + + // y_tmp_double = (y_value - y_last_bit) + let y_tmp_double = gate.mul( + ctx, + QuantumCell::Existing(assigned_y_tmp), + QuantumCell::Constant(F::from(2)), + ); + let y_rec = gate.add( + ctx, + QuantumCell::Existing(y_tmp_double), + QuantumCell::Existing(assigned_y_is_odd), + ); + let y_is_ok = gate.is_equal( + ctx, + QuantumCell::Existing(*assigned_y_limb), + QuantumCell::Existing(y_rec), + ); + + // last step we want to constrain assigned_y_tmp is 87 bits + let assigned_y_tmp = gate.select( + ctx, + QuantumCell::Existing(zero), + QuantumCell::Existing(assigned_y_tmp), + QuantumCell::Existing(y_coord_is_zero), + ); + ecc_chip + .field_chip + .range + .range_check(ctx, &assigned_y_tmp, 87); + + let y_coord_not_zero = gate.not(ctx, QuantumCell::Existing(y_coord_is_zero)); + let sig_is_valid = gate.and_many( + ctx, + vec![ + QuantumCell::Existing(sig_is_valid), + QuantumCell::Existing(y_is_ok), + QuantumCell::Existing(y_coord_not_zero), + ], + ); + + Ok(AssignedECDSA { + _pk: pk_assigned, + pk_is_zero, + msg_hash, + integer_r, + integer_s, + v: assigned_y_is_odd, + sig_is_valid, + }) + } + + fn enable_keccak_lookup( + &self, + config: &SigCircuitConfig, + ctx: &mut Context, + offset: usize, + is_address_zero: &AssignedValue, + pk_rlc: &AssignedValue, + pk_hash: &WordLoHi>, + ) -> Result<(), Error> { + log::trace!("keccak lookup"); + + // Layout: + // | q_keccak | rlc | + // | -------- | --------------- | + // | 1 | is_address_zero | + // | | pk_rlc | + // | | pk_hash_lo | + // | | pk_hash_hi | + config.q_keccak.enable(&mut ctx.region, offset)?; + + // is_address_zero + let tmp_cell = ctx.region.assign_advice( + || "is_address_zero", + config.rlc_column, + offset, + || is_address_zero.value, + )?; + ctx.region + .constrain_equal(is_address_zero.cell, tmp_cell.cell())?; + + // pk_rlc + let tmp_cell = ctx.region.assign_advice( + || "pk_rlc", + config.rlc_column, + offset + 1, + || pk_rlc.value, + )?; + ctx.region.constrain_equal(pk_rlc.cell, tmp_cell.cell())?; + + // pk_hash + let pk_cell_lo = ctx.region.assign_advice( + || "pk_hash_lo", + config.rlc_column, + offset + 2, + || pk_hash.lo().value, + )?; + ctx.region + .constrain_equal(pk_hash.lo().cell, pk_cell_lo.cell())?; + let pk_cell_hi = ctx.region.assign_advice( + || "pk_hash_hi", + config.rlc_column, + offset + 3, + || pk_hash.hi().value, + )?; + ctx.region + .constrain_equal(pk_hash.hi().cell, pk_cell_hi.cell())?; + + log::trace!("finished keccak lookup"); + Ok(()) + } + + /// Input the signature data, + /// Output the cells for byte decomposition of the keys and messages + fn sign_data_decomposition( + &self, + ctx: &mut Context, + ecdsa_chip: &FpChip, + sign_data: &SignData, + assigned_data: &AssignedECDSA>, + ) -> Result, Error> { + // build ecc chip from Fp chip + let ecc_chip = EccChip::>::construct(ecdsa_chip.clone()); + + let zero = ecdsa_chip.range.gate.load_zero(ctx); + + // ================================================ + // step 0. powers of aux parameters + // ================================================ + let word_lo_hi_powers = + iter::successors(Some(F::ONE), |coeff| Some(F::from(256) * coeff)).take(32); + let powers_of_256_cells = word_lo_hi_powers + .map(|x| QuantumCell::Constant(x)) + .collect_vec(); + + // ================================================ + // pk hash cells + // ================================================ + let pk_le = pk_bytes_le(&sign_data.pk); + let pk_be = pk_bytes_swap_endianness(&pk_le); + let pk_hash = keccak256(pk_be).map(|byte| Value::known(F::from(byte as u64))); + + log::trace!("pk hash {:0x?}", pk_hash); + let pk_hash_cells = pk_hash + .iter() + .map(|&x| QuantumCell::Witness(x)) + .rev() + .collect_vec(); + + // address is the random linear combination of the public key + // it is fine to use a phase 1 gate here + let address = ecdsa_chip.range.gate.inner_product( + ctx, + powers_of_256_cells[..20].to_vec(), + pk_hash_cells[..20].to_vec(), + ); + let address = ecdsa_chip.range.gate.select( + ctx, + QuantumCell::Existing(zero), + QuantumCell::Existing(address), + QuantumCell::Existing(assigned_data.pk_is_zero), + ); + let is_address_zero = ecdsa_chip.range.gate.is_equal( + ctx, + QuantumCell::Existing(address), + QuantumCell::Existing(zero), + ); + log::trace!("address: {:?}", address.value()); + + // ================================================ + // message hash cells + // ================================================ + + let assert_crt = |ctx: &mut Context, + bytes: [u8; 32], + crt_integer: &CRTInteger| + -> Result<_, Error> { + let byte_cells: Vec> = bytes + .iter() + .map(|&x| QuantumCell::Witness(Value::known(F::from(x as u64)))) + .collect_vec(); + self.assert_crt_int_byte_repr( + ctx, + &ecdsa_chip.range, + crt_integer, + &byte_cells, + &powers_of_256_cells, + )?; + Ok(byte_cells) + }; + + // assert the assigned_msg_hash_le is the right decomposition of msg_hash + // msg_hash is an overflowing integer with 3 limbs, of sizes 88, 88, and 80 + let assigned_msg_hash_le = + assert_crt(ctx, sign_data.msg_hash.to_bytes(), &assigned_data.msg_hash)?; + + // ================================================ + // pk cells + // ================================================ + let pk_x_le = sign_data + .pk + .x + .to_bytes() + .iter() + .map(|&x| QuantumCell::Witness(Value::known(F::from_u128(x as u128)))) + .collect_vec(); + let pk_y_le = sign_data + .pk + .y + .to_bytes() + .iter() + .map(|&y| QuantumCell::Witness(Value::known(F::from_u128(y as u128)))) + .collect_vec(); + let pk_assigned = ecc_chip.load_private( + ctx, + (Value::known(sign_data.pk.x), Value::known(sign_data.pk.y)), + ); + + self.assert_crt_int_byte_repr( + ctx, + &ecdsa_chip.range, + &pk_assigned.x, + &pk_x_le, + &powers_of_256_cells, + )?; + self.assert_crt_int_byte_repr( + ctx, + &ecdsa_chip.range, + &pk_assigned.y, + &pk_y_le, + &powers_of_256_cells, + )?; + + let assigned_pk_le_selected = [pk_y_le, pk_x_le].concat(); + log::trace!("finished data decomposition"); + + let r_cells = assert_crt( + ctx, + sign_data.signature.0.to_bytes(), + &assigned_data.integer_r, + )?; + let s_cells = assert_crt( + ctx, + sign_data.signature.1.to_bytes(), + &assigned_data.integer_s, + )?; + + Ok(SignDataDecomposed { + pk_hash_cells, + msg_hash_cells: assigned_msg_hash_le, + pk_cells: assigned_pk_le_selected, + address, + is_address_zero, + r_cells, + s_cells, + }) + } + + #[allow(clippy::too_many_arguments)] + fn assign_sig_verify( + &self, + ctx: &mut Context, + rlc_chip: &RangeConfig, + sign_data_decomposed: &SignDataDecomposed, + challenges: &Challenges>, + assigned_ecdsa: &AssignedECDSA>, + ) -> Result<([AssignedValue; 4], AssignedSignatureVerify), Error> { + // ================================================ + // step 0. powers of aux parameters + // ================================================ + let word_lo_hi_powers = iter::successors(Some(Value::known(F::ONE)), |coeff| { + Some(Value::known(F::from(256)) * coeff) + }) + .take(16) + .map(|x| QuantumCell::Witness(x)) + .collect_vec(); + + let keccak_challenge_powers = iter::successors(Some(Value::known(F::ONE)), |coeff| { + Some(challenges.keccak_input() * coeff) + }) + .take(64) + .map(|x| QuantumCell::Witness(x)) + .collect_vec(); + + // ================================================ + // step 1 message hash + // ================================================ + // Ref. spec SignVerifyChip 3. Verify that the signed message in the ecdsa_chip + // corresponds to msg_hash + let msg_hash_cells = { + let msg_hash_lo_cell_bytes = &sign_data_decomposed.msg_hash_cells[..16]; + let msg_hash_hi_cell_bytes = &sign_data_decomposed.msg_hash_cells[16..]; + + let msg_hash_cell_lo = rlc_chip.gate.inner_product( + ctx, + msg_hash_lo_cell_bytes.iter().cloned().collect_vec(), + word_lo_hi_powers.clone(), + ); + let msg_hash_cell_hi = rlc_chip.gate.inner_product( + ctx, + msg_hash_hi_cell_bytes.iter().cloned().collect_vec(), + word_lo_hi_powers.clone(), + ); + + WordLoHi::new([msg_hash_cell_lo, msg_hash_cell_hi]) + }; + + log::trace!( + "assigned msg hash: ({:?}, {:?})", + msg_hash_cells.lo().value(), + msg_hash_cells.hi().value() + ); + + // ================================================ + // step 2 random linear combination of pk + // ================================================ + let pk_rlc = rlc_chip.gate.inner_product( + ctx, + sign_data_decomposed.pk_cells.clone(), + keccak_challenge_powers, + ); + log::trace!("pk rlc: {:?}", pk_rlc.value()); + + // ================================================ + // step 3 pk_hash + // ================================================ + let pk_hash_cells = { + let pk_hash_lo_cell_bytes = &sign_data_decomposed.pk_hash_cells[..16]; + let pk_hash_hi_cell_bytes = &sign_data_decomposed.pk_hash_cells[16..]; + + let pk_hash_cell_lo = rlc_chip.gate.inner_product( + ctx, + pk_hash_lo_cell_bytes.iter().cloned().collect_vec(), + word_lo_hi_powers.clone(), + ); + let pk_hash_cell_hi = rlc_chip.gate.inner_product( + ctx, + pk_hash_hi_cell_bytes.iter().cloned().collect_vec(), + word_lo_hi_powers.clone(), + ); + + WordLoHi::new([pk_hash_cell_lo, pk_hash_cell_hi]) + }; + + // step 4: r,s + let r_cells = { + let r_lo_cell_bytes = &sign_data_decomposed.r_cells[..16]; + let r_hi_cell_bytes = &sign_data_decomposed.r_cells[16..]; + + let r_cell_lo = rlc_chip.gate.inner_product( + ctx, + r_lo_cell_bytes.iter().cloned().collect_vec(), + word_lo_hi_powers.clone(), + ); + let r_cell_hi = rlc_chip.gate.inner_product( + ctx, + r_hi_cell_bytes.iter().cloned().collect_vec(), + word_lo_hi_powers.clone(), + ); + + WordLoHi::new([r_cell_lo, r_cell_hi]) + }; + let s_cells = { + let s_lo_cell_bytes = &sign_data_decomposed.s_cells[..16]; + let s_hi_cell_bytes = &sign_data_decomposed.s_cells[16..]; + + let s_cell_lo = rlc_chip.gate.inner_product( + ctx, + s_lo_cell_bytes.iter().cloned().collect_vec(), + word_lo_hi_powers.clone(), + ); + let s_cell_hi = rlc_chip.gate.inner_product( + ctx, + s_hi_cell_bytes.iter().cloned().collect_vec(), + word_lo_hi_powers, + ); + + WordLoHi::new([s_cell_lo, s_cell_hi]) + }; + + log::trace!( + "pk hash halo2ecc: ({:?}, {:?})", + pk_hash_cells.lo().value(), + pk_hash_cells.lo().value() + ); + log::trace!("finished sign verify"); + + let to_be_keccak_checked = [ + sign_data_decomposed.is_address_zero, + pk_rlc, + pk_hash_cells.lo(), + pk_hash_cells.hi(), + ]; + let assigned_sig_verif = AssignedSignatureVerify { + address: sign_data_decomposed.address, + // msg_len: sign_data.msg.len(), + // msg_rlc: challenges + // .keccak_input() + // .map(|r| rlc::value(sign_data.msg.iter().rev(), r)), + msg_hash: msg_hash_cells, + sig_is_valid: assigned_ecdsa.sig_is_valid, + r: r_cells, + s: s_cells, + v: assigned_ecdsa.v, + }; + Ok((to_be_keccak_checked, assigned_sig_verif)) + } + + /// Assign witness data to the sig circuit. + pub(crate) fn assign( + &self, + config: &SigCircuitConfig, + layouter: &mut impl Layouter, + signatures: &[SignData], + challenges: &Challenges>, + ) -> Result>, Error> { + if signatures.len() > self.max_verif { + error!( + "signatures.len() = {} > max_verif = {}", + signatures.len(), + self.max_verif + ); + return Err(Error::Synthesis); + } + let mut first_pass = SKIP_FIRST_PASS; + let ecdsa_chip = &config.ecdsa_config; + + let assigned_sig_verifs = layouter.assign_region( + || "ecdsa chip verification", + |region| { + if first_pass { + first_pass = false; + return Ok(vec![]); + } + + let mut ctx = ecdsa_chip.new_context(region); + + // ================================================ + // step 1: assert the signature is valid in circuit + // ================================================ + let assigned_ecdsas = signatures + .iter() + .chain(std::iter::repeat(&SignData::default())) + .take(self.max_verif) + .map(|sign_data| self.assign_ecdsa(&mut ctx, ecdsa_chip, sign_data)) + .collect::>>, Error>>()?; + + // ================================================ + // step 2: decompose the keys and messages + // ================================================ + let sign_data_decomposed = signatures + .iter() + .chain(std::iter::repeat(&SignData::default())) + .take(self.max_verif) + .zip_eq(assigned_ecdsas.iter()) + .map(|(sign_data, assigned_ecdsa)| { + self.sign_data_decomposition( + &mut ctx, + ecdsa_chip, + sign_data, + assigned_ecdsa, + ) + }) + .collect::>, Error>>()?; + + // IMPORTANT: Move to Phase2 before RLC + log::info!("before proceeding to the next phase"); + + // finalize the current lookup table before moving to next phase + ecdsa_chip.finalize(&mut ctx); + ctx.print_stats(&["ECDSA context"]); + ctx.next_phase(); + + // ================================================ + // step 3: compute RLC of keys and messages + // ================================================ + let (assigned_keccak_values, assigned_sig_values): ( + Vec<[AssignedValue; 4]>, + Vec>, + ) = signatures + .iter() + .chain(std::iter::repeat(&SignData::default())) + .take(self.max_verif) + .zip_eq(assigned_ecdsas.iter()) + .zip_eq(sign_data_decomposed.iter()) + .map(|((_, assigned_ecdsa), sign_data_decomp)| { + self.assign_sig_verify( + &mut ctx, + &ecdsa_chip.range, + sign_data_decomp, + challenges, + assigned_ecdsa, + ) + }) + .collect::; 4], AssignedSignatureVerify)>, + Error, + >>()? + .into_iter() + .unzip(); + + // ================================================ + // step 4: deferred keccak checks + // ================================================ + for (i, [is_address_zero, pk_rlc, pk_hash_lo, pk_hash_hi]) in + assigned_keccak_values.iter().enumerate() + { + let offset = i * 4; + self.enable_keccak_lookup( + config, + &mut ctx, + offset, + is_address_zero, + pk_rlc, + &WordLoHi::new([*pk_hash_lo, *pk_hash_hi]), + )?; + } + + // IMPORTANT: this assigns all constants to the fixed columns + // IMPORTANT: this copies cells to the lookup advice column to perform range + // check lookups + // This is not optional. + let lookup_cells = ecdsa_chip.finalize(&mut ctx); + log::info!("total number of lookup cells: {}", lookup_cells); + + ctx.print_stats(&["ECDSA context"]); + Ok(assigned_sig_values) + }, + )?; + + layouter.assign_region( + || "expose sig table", + |mut region| { + // step 5: export as a lookup table + for (idx, assigned_sig_verif) in assigned_sig_verifs.iter().enumerate() { + region.assign_fixed( + || "assign sig_table selector", + config.sig_table.q_enable, + idx, + || Value::known(F::ONE), + )?; + + assigned_sig_verif + .v + .copy_advice(&mut region, config.sig_table.sig_v, idx); + + assigned_sig_verif.r.lo().copy_advice( + &mut region, + config.sig_table.sig_r.lo(), + idx, + ); + assigned_sig_verif.r.hi().copy_advice( + &mut region, + config.sig_table.sig_r.hi(), + idx, + ); + + assigned_sig_verif.s.lo().copy_advice( + &mut region, + config.sig_table.sig_s.lo(), + idx, + ); + assigned_sig_verif.s.hi().copy_advice( + &mut region, + config.sig_table.sig_s.hi(), + idx, + ); + + assigned_sig_verif.address.copy_advice( + &mut region, + config.sig_table.recovered_addr, + idx, + ); + + assigned_sig_verif.sig_is_valid.copy_advice( + &mut region, + config.sig_table.is_valid, + idx, + ); + + assigned_sig_verif.msg_hash.lo().copy_advice( + &mut region, + config.sig_table.msg_hash.lo(), + idx, + ); + assigned_sig_verif.msg_hash.hi().copy_advice( + &mut region, + config.sig_table.msg_hash.hi(), + idx, + ); + } + Ok(()) + }, + )?; + + Ok(assigned_sig_verifs) + } + + /// Assert an CRTInteger's byte representation is correct. + /// inputs + /// - crt_int with 3 limbs [88, 88, 80] + /// - byte representation of the integer + /// - a sequence of [1, 2^8, 2^16, ...] + /// - a overriding flag that sets output to 0 if set + fn assert_crt_int_byte_repr( + &self, + ctx: &mut Context, + range_chip: &RangeConfig, + crt_int: &CRTInteger, + byte_repr: &[QuantumCell], + word_lo_hi_powers: &[QuantumCell], + ) -> Result<(), Error> { + // length of byte representation is 32 + assert_eq!(byte_repr.len(), 32); + // need to support decomposition of up to 88 bits + assert!(word_lo_hi_powers.len() >= 11); + + let flex_gate_chip = &range_chip.gate; + + // apply the overriding flag + let limb1_value = crt_int.truncation.limbs[0]; + let limb2_value = crt_int.truncation.limbs[1]; + let limb3_value = crt_int.truncation.limbs[2]; + + // assert the byte_repr is the right decomposition of overflow_int + // overflow_int is an overflowing integer with 3 limbs, of sizes 88, 88, and 80 + // we reconstruct the three limbs from the bytes repr, and + // then enforce equality with the CRT integer + let limb1_recover = flex_gate_chip.inner_product( + ctx, + byte_repr[0..11].to_vec(), + word_lo_hi_powers[0..11].to_vec(), + ); + let limb2_recover = flex_gate_chip.inner_product( + ctx, + byte_repr[11..22].to_vec(), + word_lo_hi_powers[0..11].to_vec(), + ); + let limb3_recover = flex_gate_chip.inner_product( + ctx, + byte_repr[22..].to_vec(), + word_lo_hi_powers[0..10].to_vec(), + ); + flex_gate_chip.assert_equal( + ctx, + QuantumCell::Existing(limb1_value), + QuantumCell::Existing(limb1_recover), + ); + flex_gate_chip.assert_equal( + ctx, + QuantumCell::Existing(limb2_value), + QuantumCell::Existing(limb2_recover), + ); + flex_gate_chip.assert_equal( + ctx, + QuantumCell::Existing(limb3_value), + QuantumCell::Existing(limb3_recover), + ); + log::trace!( + "limb 1 \ninput {:?}\nreconstructed {:?}", + limb1_value.value(), + limb1_recover.value() + ); + log::trace!( + "limb 2 \ninput {:?}\nreconstructed {:?}", + limb2_value.value(), + limb2_recover.value() + ); + log::trace!( + "limb 3 \ninput {:?}\nreconstructed {:?}", + limb3_value.value(), + limb3_recover.value() + ); + + Ok(()) + } +} diff --git a/zkevm-circuits/src/sig_circuit/dev.rs b/zkevm-circuits/src/sig_circuit/dev.rs new file mode 100644 index 0000000000..684385b45b --- /dev/null +++ b/zkevm-circuits/src/sig_circuit/dev.rs @@ -0,0 +1,64 @@ +use super::*; + +use crate::util::Challenges; + +use bus_mapping::circuit_input_builder::keccak_inputs_sign_verify; +use halo2_proofs::{circuit::SimpleFloorPlanner, plonk::Circuit}; + +/// SigCircuitTesterConfig +#[derive(Clone, Debug)] +pub struct SigCircuitTesterConfig { + sign_verify: SigCircuitConfig, + challenges: crate::util::Challenges, +} + +impl SigCircuitTesterConfig { + pub(crate) fn new(meta: &mut ConstraintSystem) -> Self { + let keccak_table = KeccakTable::construct(meta); + let sig_table = SigTable::construct(meta); + let challenges = Challenges::construct(meta); + let challenges_expr = challenges.exprs(meta); + let sign_verify = SigCircuitConfig::new( + meta, + SigCircuitConfigArgs { + _keccak_table: keccak_table, + challenges: challenges_expr, + sig_table, + }, + ); + + SigCircuitTesterConfig { + sign_verify, + challenges, + } + } +} + +impl Circuit for SigCircuit { + type Config = SigCircuitTesterConfig; + type FloorPlanner = SimpleFloorPlanner; + type Params = (); + + fn without_witnesses(&self) -> Self { + Self::default() + } + + fn configure(meta: &mut ConstraintSystem) -> Self::Config { + SigCircuitTesterConfig::new(meta) + } + + fn synthesize( + &self, + config: Self::Config, + mut layouter: impl Layouter, + ) -> Result<(), Error> { + let challenges = config.challenges.values(&mut layouter); + self.synthesize_sub(&config.sign_verify, &challenges, &mut layouter)?; + config.sign_verify._keccak_table.dev_load( + &mut layouter, + &keccak_inputs_sign_verify(&self.signatures), + &challenges, + )?; + Ok(()) + } +} diff --git a/zkevm-circuits/src/sig_circuit/ecdsa.rs b/zkevm-circuits/src/sig_circuit/ecdsa.rs new file mode 100644 index 0000000000..7105066123 --- /dev/null +++ b/zkevm-circuits/src/sig_circuit/ecdsa.rs @@ -0,0 +1,226 @@ +//! This module implements the ECDSA circuit. Modified from +//! + +use halo2_base::{ + gates::{GateInstructions, RangeInstructions}, + utils::{fe_to_biguint, modulus, CurveAffineExt}, + AssignedValue, Context, + QuantumCell::Existing, +}; +use halo2_ecc::{ + bigint::{big_less_than, CRTInteger}, + ecc::{ec_add_unequal, ec_sub_unequal, fixed_base, scalar_multiply, EcPoint, EccChip}, + fields::{fp::FpConfig, FieldChip, PrimeField, Selectable}, +}; + +// CF is the coordinate field of GA +// SF is the scalar field of GA +// p = coordinate field modulus +// n = scalar field modulus +// Only valid when p is very close to n in size (e.g. for Secp256k1) +// returns +// - if the signature is valid +// - the y coordinate for rG (will be used for ECRecovery later) +#[allow(clippy::too_many_arguments)] +pub(crate) fn ecdsa_verify_no_pubkey_check( + base_chip: &FpConfig, + ctx: &mut Context, + pubkey: &EcPoint as FieldChip>::FieldPoint>, + r: &CRTInteger, + s: &CRTInteger, + msghash: &CRTInteger, + var_window_bits: usize, + fixed_window_bits: usize, +) -> ( + AssignedValue, + AssignedValue, + CRTInteger, + AssignedValue, +) +where + GA: CurveAffineExt, +{ + let ecc_chip = EccChip::>::construct(base_chip.clone()); + let scalar_chip = FpConfig::::construct( + base_chip.range.clone(), + base_chip.limb_bits, + base_chip.num_limbs, + modulus::(), + ); + let n = scalar_chip.load_constant(ctx, scalar_chip.p.to_biguint().unwrap()); + + // check whether the pubkey is (0, 0), i.e. in the case of ecrecover, no pubkey could be + // recovered. + let (is_pubkey_zero, is_pubkey_not_zero) = { + let is_pubkey_x_zero = ecc_chip.field_chip().is_zero(ctx, &pubkey.x); + let is_pubkey_y_zero = ecc_chip.field_chip().is_zero(ctx, &pubkey.y); + let is_pubkey_zero = ecc_chip.field_chip().range().gate().and( + ctx, + Existing(is_pubkey_x_zero), + Existing(is_pubkey_y_zero), + ); + ( + is_pubkey_zero, + ecc_chip + .field_chip() + .range() + .gate() + .not(ctx, Existing(is_pubkey_zero)), + ) + }; + + // check r,s are in [1, n - 1] + let r_is_zero = scalar_chip.is_soft_zero(ctx, r); + let r_in_range = scalar_chip.is_soft_nonzero(ctx, r); + let r_is_valid = base_chip + .range() + .gate() + .or(ctx, Existing(r_is_zero), Existing(r_in_range)); + let s_is_zero = scalar_chip.is_soft_zero(ctx, s); + let s_in_range = scalar_chip.is_soft_nonzero(ctx, s); + let s_is_valid = base_chip + .range() + .gate() + .or(ctx, Existing(s_is_zero), Existing(s_in_range)); + + // load required constants + let zero = scalar_chip.load_constant(ctx, FpConfig::::fe_to_constant(SF::ZERO)); + let one = scalar_chip.load_constant(ctx, FpConfig::::fe_to_constant(SF::ONE)); + let neg_one = scalar_chip.load_constant(ctx, FpConfig::::fe_to_constant(-SF::ONE)); + + // compute u1 = m * s^{-1} mod n + let s2 = scalar_chip.select(ctx, &one, s, &s_is_zero); + let u1 = scalar_chip.divide(ctx, msghash, &s2); + let u1 = scalar_chip.select(ctx, &zero, &u1, &s_is_zero); + let u1_is_one = { + let diff = scalar_chip.sub_no_carry(ctx, &u1, &one); + let diff = scalar_chip.carry_mod(ctx, &diff); + scalar_chip.is_zero(ctx, &diff) + }; + + // compute u2 = r * s^{-1} mod n + let u2 = scalar_chip.divide(ctx, r, &s2); + let u2 = scalar_chip.select(ctx, &zero, &u2, &s_is_zero); + + // u3 = 1 if u1 == 1 + // u3 = -1 if u1 != 1 + // this ensures u1 + u3 != 0 + let u3 = scalar_chip.select(ctx, &one, &neg_one, &u1_is_one); + + let u1_plus_u3 = scalar_chip.add_no_carry(ctx, &u1, &u3); + let u1_plus_u3 = scalar_chip.carry_mod(ctx, &u1_plus_u3); + + // compute (u1+u3) * G + let u1u3_mul = fixed_base::scalar_multiply::( + base_chip, + ctx, + &GA::generator(), + &u1_plus_u3.truncation.limbs, + base_chip.limb_bits, + fixed_window_bits, + ); + // compute u2 * pubkey + let u2_prime = scalar_chip.select(ctx, &one, &u2, &s_is_zero); + let pubkey_prime = ecc_chip.load_random_point::(ctx); + let pubkey_prime = ecc_chip.select(ctx, &pubkey_prime, pubkey, &is_pubkey_zero); + let u2_mul = scalar_multiply::( + base_chip, + ctx, + &pubkey_prime, + &u2_prime.truncation.limbs, + base_chip.limb_bits, + var_window_bits, + ); + let point_at_infinity = EcPoint::construct( + ecc_chip + .field_chip() + .load_constant(ctx, fe_to_biguint(&CF::ZERO)), + ecc_chip + .field_chip() + .load_constant(ctx, fe_to_biguint(&CF::ZERO)), + ); + let u2_is_zero = + base_chip + .range() + .gate() + .or(ctx, Existing(s_is_zero), Existing(is_pubkey_zero)); + let u2_mul = ecc_chip.select(ctx, &point_at_infinity, &u2_mul, &u2_is_zero); + // compute u3*G this is directly assigned for G so no scalar_multiply is required + let u3_mul = { + let generator = GA::generator(); + let neg_generator = -generator; + let generator = ecc_chip.assign_constant_point(ctx, generator); + let neg_generator = ecc_chip.assign_constant_point(ctx, neg_generator); + ecc_chip.select(ctx, &generator, &neg_generator, &u1_is_one) + }; + + // compute u2 * pubkey + u3 * G + base_chip.enforce_less_than_p(ctx, u2_mul.x()); + base_chip.enforce_less_than_p(ctx, u3_mul.x()); + let u2_pk_u3_g = ec_add_unequal(base_chip, ctx, &u2_mul, &u3_mul, false); + + // check + // - (u1 + u3) * G + // - u2 * pubkey + u3 * G + // are not equal + let u1_u2_x_eq = ecc_chip.is_equal(ctx, &u1u3_mul, &u2_pk_u3_g); + let u1_u2_not_eq = base_chip.range.gate().not(ctx, Existing(u1_u2_x_eq)); + + // compute (x1, y1) = u1 * G + u2 * pubkey and check (r mod n) == x1 as integers + // which is basically u1u3_mul + u2_mul - u3_mul + // WARNING: For optimization reasons, does not reduce x1 mod n, which is + // invalid unless p is very close to n in size. + // + // WARNING: this may be trigger errors if: + // - u1u3_mul == u2_mul + // + // if r is sampled truly from random then this will not happen + // to completely ensure the correctness we may need to sample u3 from random, but it is quite + // costly. + let sum = ec_add_unequal(base_chip, ctx, &u1u3_mul, &u2_mul, false); + + // safe: we have already checked u1.G + u2.pk != 0 + // so u1.G + u3.G + u2.pk != u3.G + let sum = ec_sub_unequal(base_chip, ctx, &sum, &u3_mul, false); + let equal_check = base_chip.is_equal(ctx, &sum.x, r); + + // TODO: maybe the big_less_than is optional? + let u1_small = big_less_than::assign::( + base_chip.range(), + ctx, + &u1.truncation, + &n.truncation, + base_chip.limb_bits, + base_chip.limb_bases[1], + ); + let u2_small = big_less_than::assign::( + base_chip.range(), + ctx, + &u2.truncation, + &n.truncation, + base_chip.limb_bits, + base_chip.limb_bases[1], + ); + + // check + // - (r in [0, n - 1]) + // - (s in [0, n - 1]) + // - (u1_mul != - u2_mul) + // - (r == x1 mod n) + // - pk != (0, 0) + let res = base_chip.range().gate().and_many( + ctx, + vec![ + Existing(r_is_valid), + Existing(s_is_valid), + Existing(u1_small), + Existing(u2_small), + Existing(u1_u2_not_eq), + Existing(equal_check), + Existing(is_pubkey_not_zero), + ], + ); + + let y_is_zero = scalar_chip.is_soft_zero(ctx, &sum.y); + (res, is_pubkey_zero, sum.y, y_is_zero) +} diff --git a/zkevm-circuits/src/sig_circuit/test.rs b/zkevm-circuits/src/sig_circuit/test.rs new file mode 100644 index 0000000000..5d845ae43b --- /dev/null +++ b/zkevm-circuits/src/sig_circuit/test.rs @@ -0,0 +1,267 @@ +use super::*; +use eth_types::sign_types::{sign, SignData}; +use halo2_proofs::{ + arithmetic::Field as HaloField, + dev::MockProver, + halo2curves::{ + bn256::Fr, + group::Curve, + secp256k1::{self, Secp256k1Affine}, + }, +}; +use rand::{Rng, RngCore}; +use std::marker::PhantomData; + +use super::utils::LOG_TOTAL_NUM_ROWS; +use crate::sig_circuit::utils::MAX_NUM_SIG; +use eth_types::{ + sign_types::{biguint_to_32bytes_le, recover_pk, SECP256K1_Q}, + word, ToBigEndian, ToLittleEndian, Word, +}; +use ethers_core::k256::elliptic_curve::PrimeField; +use halo2_proofs::halo2curves::secp256k1::Fq; +use num::{BigUint, Integer}; +use rand::SeedableRng; +use rand_xorshift::XorShiftRng; +use sha3::{Digest, Keccak256}; +use snark_verifier::util::arithmetic::PrimeCurveAffine; + +#[test] +fn test_edge_cases() { + let mut rng = XorShiftRng::seed_from_u64(1); + + // helper + let to_sig = |(r, s, v): (Word, Word, u8)| -> (Fq, Fq, u8) { + ( + Fq::from_bytes(&r.to_le_bytes()).unwrap(), + Fq::from_bytes(&s.to_le_bytes()).unwrap(), + v, + ) + }; + + // Vec<(msg_hash, r, s, v)> + // + // good data for ecrecover is (big-endian): + // - msg_hash: 0x456e9aea5e197a1f1af7a3e85a3212fa4049a3ba34c2289b4c860fc0b0c64ef3 + // - r: 0x9242685bf161793cc25603c231bc2f568eb630ea16aa137d2664ac8038825608 + // - s: 0x4f8ae3bd7535248d0bd448298cc2e2071e56992d0774dc340c368ae950852ada + // - v: 28, i.e. v == 1 for sig circuit + let good_ecrecover_data = ( + word!("0x456e9aea5e197a1f1af7a3e85a3212fa4049a3ba34c2289b4c860fc0b0c64ef3"), + word!("0x9242685bf161793cc25603c231bc2f568eb630ea16aa137d2664ac8038825608"), + word!("0x4f8ae3bd7535248d0bd448298cc2e2071e56992d0774dc340c368ae950852ada"), + 1u8, + ); + let ecrecover_data = vec![ + // 1. good data + good_ecrecover_data, + // 2. msg_hash == 0 + ( + Word::zero(), + good_ecrecover_data.1, + good_ecrecover_data.2, + good_ecrecover_data.3, + ), + // 3. r == 0 + ( + good_ecrecover_data.0, + Word::zero(), + good_ecrecover_data.2, + good_ecrecover_data.3, + ), + // 4. s == 0 + ( + good_ecrecover_data.0, + good_ecrecover_data.1, + Word::zero(), + good_ecrecover_data.3, + ), + // 5. r == 0 and s == 0 + ( + good_ecrecover_data.0, + Word::zero(), + Word::zero(), + good_ecrecover_data.3, + ), + // 6. random r and s for random msg hash + { + let mut bytes = [0u8; 32]; + rng.fill(&mut bytes[..]); + let msg_hash = Word::from_big_endian(&bytes); + rng.fill(&mut bytes[..]); + let r = Word::from_big_endian(&bytes); + rng.fill(&mut bytes[..]); + let s = Word::from_big_endian(&bytes); + (msg_hash, r, s, 0u8) + }, + // 7. v == 0 when v should be 1 + ( + good_ecrecover_data.0, + good_ecrecover_data.1, + good_ecrecover_data.2, + 1 - good_ecrecover_data.3, + ), + // 8. msg_hash outside FQ::MODULUS + ( + Word::MAX, + good_ecrecover_data.1, + good_ecrecover_data.2, + good_ecrecover_data.3, + ), + ]; + let signatures = ecrecover_data + .iter() + .map(|&(msg_hash, r, s, v)| SignData { + signature: to_sig((r, s, v)), + pk: recover_pk(v, &r, &s, &msg_hash.to_be_bytes()) + .unwrap_or(Secp256k1Affine::identity()), + msg_hash: { + let msg_hash = BigUint::from_bytes_be(&msg_hash.to_be_bytes()); + let msg_hash = msg_hash.mod_floor(&*SECP256K1_Q); + let msg_hash_le = biguint_to_32bytes_le(msg_hash); + secp256k1::Fq::from_repr(msg_hash_le).unwrap() + }, + ..Default::default() + }) + .collect(); + log::debug!("signatures="); + log::debug!("{:#?}", signatures); + + run(LOG_TOTAL_NUM_ROWS as u32, 8, signatures); +} + +#[test] +fn sign_verify_zero_msg_hash() { + let mut rng = XorShiftRng::seed_from_u64(1); + + log::debug!("testing for msg_hash = 0"); + let mut signatures = Vec::new(); + + let (sk, pk) = gen_key_pair(&mut rng); + let msg = gen_msg(&mut rng); + let msg_hash = secp256k1::Fq::zero(); + let (r, s, v) = sign_with_rng(&mut rng, sk, msg_hash); + signatures.push(SignData { + signature: (r, s, v), + pk, + msg: msg.into(), + msg_hash, + }); + + let k = LOG_TOTAL_NUM_ROWS as u32; + run(k, 1, signatures); + + log::debug!("end of testing for msg_hash = 0"); +} + +#[test] +fn sign_verify_nonzero_msg_hash() { + let mut rng = XorShiftRng::seed_from_u64(1); + + log::debug!("testing for msg_hash = 1"); + let mut signatures = Vec::new(); + + let (sk, pk) = gen_key_pair(&mut rng); + let msg = gen_msg(&mut rng); + let msg_hash = secp256k1::Fq::one(); + let (r, s, v) = sign_with_rng(&mut rng, sk, msg_hash); + signatures.push(SignData { + signature: (r, s, v), + pk, + msg: msg.into(), + msg_hash, + }); + + let k = LOG_TOTAL_NUM_ROWS as u32; + run(k, 1, signatures); + + log::debug!("end of testing for msg_hash = 1"); +} + +#[test] +fn test_sign_verify() { + let max_sigs = [1, 4]; + for max_sig in max_sigs { + sign_verify(max_sig as usize); + } +} + +#[test] +#[ignore] +fn test_sign_verify_max_num_sig() { + sign_verify(MAX_NUM_SIG); +} + +fn sign_verify(max_sig: usize) { + let mut rng = XorShiftRng::seed_from_u64(1); + + // random msg_hash + log::debug!("testing for {} signatures", max_sig); + let mut signatures = Vec::new(); + for _ in 0..max_sig { + let (sk, pk) = gen_key_pair(&mut rng); + let msg = gen_msg(&mut rng); + let msg_hash: [u8; 32] = Keccak256::digest(&msg) + .as_slice() + .to_vec() + .try_into() + .expect("hash length isn't 32 bytes"); + let msg_hash = secp256k1::Fq::from_bytes(&msg_hash).unwrap(); + let (r, s, v) = sign_with_rng(&mut rng, sk, msg_hash); + signatures.push(SignData { + signature: (r, s, v), + pk, + msg: msg.into(), + msg_hash, + }); + } + + let k = LOG_TOTAL_NUM_ROWS as u32; + run(k, max_sig, signatures); + + log::debug!("end of testing for {} signatures", max_sig); +} + +// Generate a test key pair +fn gen_key_pair(rng: impl RngCore) -> (secp256k1::Fq, Secp256k1Affine) { + // generate a valid signature + let generator = Secp256k1Affine::generator(); + let sk = secp256k1::Fq::random(rng); + let pk = generator * sk; + let pk = pk.to_affine(); + + (sk, pk) +} + +// Generate a test message. +fn gen_msg(mut rng: impl RngCore) -> Vec { + let msg_len: usize = rng.gen_range(0..128); + let mut msg = vec![0; msg_len]; + rng.fill_bytes(&mut msg); + msg +} + +// Returns (r, s, v) +fn sign_with_rng( + rng: impl RngCore, + sk: secp256k1::Fq, + msg_hash: secp256k1::Fq, +) -> (secp256k1::Fq, secp256k1::Fq, u8) { + let randomness = secp256k1::Fq::random(rng); + sign(randomness, sk, msg_hash) +} + +fn run(k: u32, max_verif: usize, signatures: Vec) { + // SignVerifyChip -> ECDSAChip -> MainGate instance column + let circuit = SigCircuit:: { + max_verif, + signatures, + _marker: PhantomData, + }; + + let prover = match MockProver::run(k, &circuit, vec![]) { + Ok(prover) => prover, + Err(e) => panic!("{e:#?}"), + }; + assert_eq!(prover.verify(), Ok(())); +} diff --git a/zkevm-circuits/src/sig_circuit/utils.rs b/zkevm-circuits/src/sig_circuit/utils.rs new file mode 100644 index 0000000000..b7aacf8aed --- /dev/null +++ b/zkevm-circuits/src/sig_circuit/utils.rs @@ -0,0 +1,115 @@ +use eth_types::Field; +use halo2_base::{AssignedValue, QuantumCell}; +use halo2_ecc::{ + bigint::CRTInteger, + ecc::EcPoint, + fields::{fp::FpConfig, FieldChip}, +}; +use halo2_proofs::halo2curves::secp256k1::{Fp, Fq}; + +use crate::util::word::WordLoHi; + +// Hard coded parameters. +// TODO: allow for a configurable param. +pub(super) const MAX_NUM_SIG: usize = 128; +/// Each ecdsa signature requires 461540 cells +pub(super) const CELLS_PER_SIG: usize = 461540; +/// Each ecdsa signature requires 63489 lookup cells +pub(super) const LOOKUP_CELLS_PER_SIG: usize = 63489; +/// Total number of rows allocated for ecdsa chip +pub(super) const LOG_TOTAL_NUM_ROWS: usize = 20; +/// Max number of columns allowed +pub(super) const COLUMN_NUM_LIMIT: usize = 58; +/// Max number of lookup columns allowed +pub(super) const LOOKUP_COLUMN_NUM_LIMIT: usize = 9; + +// halo2-ecc's ECDSA config +// +// get the following parameters by running +// `cargo test --release --package zkevm-circuits --lib sig_circuit::test::sign_verify -- +// --nocapture` +// - num_advice: 56 +// - num_lookup_advice: 8 +// - num_fixed: 1 +// - lookup_bits: 19 +// - limb_bits: 88 +// - num_limbs: 3 +// +/// Number of bits of a limb +pub(super) const LIMB_BITS: usize = 88; +/// Number of limbs +pub(super) const NUM_LIMBS: usize = 3; + +pub(super) fn calc_required_advices(num_verif: usize) -> usize { + let mut num_adv = 1; + let total_cells = num_verif * CELLS_PER_SIG; + let row_num = 1 << LOG_TOTAL_NUM_ROWS; + while num_adv < COLUMN_NUM_LIMIT { + if num_adv * row_num > total_cells { + log::debug!( + "ecdsa chip uses {} advice columns for {} signatures", + num_adv, + num_verif + ); + return num_adv; + } + num_adv += 1; + } + panic!("the required advice columns exceeds {COLUMN_NUM_LIMIT} for {num_verif} signatures"); +} + +pub(super) fn calc_required_lookup_advices(num_verif: usize) -> usize { + let mut num_adv = 1; + let total_cells = num_verif * LOOKUP_CELLS_PER_SIG; + let row_num = 1 << LOG_TOTAL_NUM_ROWS; + while num_adv < LOOKUP_COLUMN_NUM_LIMIT { + if num_adv * row_num > total_cells { + log::debug!( + "ecdsa chip uses {} lookup advice columns for {} signatures", + num_adv, + num_verif + ); + return num_adv; + } + num_adv += 1; + } + panic!("the required lookup advice columns exceeds {LOOKUP_COLUMN_NUM_LIMIT} for {num_verif} signatures"); +} + +/// Chip to handle overflow integers of ECDSA::Fq, the scalar field +pub(super) type FqChip = FpConfig; +/// Chip to handle ECDSA::Fp, the base field +pub(super) type FpChip = FpConfig; + +pub(crate) struct AssignedECDSA> { + pub(super) _pk: EcPoint, + pub(super) pk_is_zero: AssignedValue, + pub(super) msg_hash: CRTInteger, + pub(super) integer_r: CRTInteger, + pub(super) integer_s: CRTInteger, + pub(super) v: AssignedValue, + pub(super) sig_is_valid: AssignedValue, +} + +#[derive(Debug, Clone)] +pub(crate) struct AssignedSignatureVerify { + pub(crate) address: AssignedValue, + // pub(crate) msg_len: usize, + // pub(crate) msg_rlc: Value, + pub(crate) msg_hash: WordLoHi>, + pub(crate) r: WordLoHi>, + pub(crate) s: WordLoHi>, + pub(crate) v: AssignedValue, + pub(crate) sig_is_valid: AssignedValue, +} + +pub(super) struct SignDataDecomposed { + pub(super) pk_hash_cells: Vec>, + pub(super) msg_hash_cells: Vec>, + pub(super) pk_cells: Vec>, + pub(super) address: AssignedValue, + pub(super) is_address_zero: AssignedValue, + pub(super) r_cells: Vec>, + pub(super) s_cells: Vec>, + // v: AssignedValue<'v, F>, // bool +} diff --git a/zkevm-circuits/src/state_circuit.rs b/zkevm-circuits/src/state_circuit.rs index 769819d336..5d41050159 100644 --- a/zkevm-circuits/src/state_circuit.rs +++ b/zkevm-circuits/src/state_circuit.rs @@ -19,7 +19,7 @@ use self::{ }; use crate::{ table::{AccountFieldTag, LookupTable, MPTProofType, MptTable, RwTable, UXTable}, - util::{word, Challenges, Expr, SubCircuit, SubCircuitConfig}, + util::{word::WordLoHi, Challenges, Expr, SubCircuit, SubCircuitConfig}, witness::{ self, rw::{RwFingerprints, ToVec}, @@ -30,7 +30,7 @@ use constraint_builder::{ConstraintBuilder, Queries}; use eth_types::{Address, Field, Word}; use gadgets::{ batched_is_zero::{BatchedIsZeroChip, BatchedIsZeroConfig}, - binary_number::{BinaryNumberChip, BinaryNumberConfig}, + binary_number::{BinaryNumberBits, BinaryNumberChip, BinaryNumberConfig}, permutation::{PermutationChip, PermutationChipConfig}, }; use halo2_proofs::{ @@ -62,14 +62,14 @@ pub struct StateCircuitConfig { // Assigned value at the start of the block. For Rw::Account and // Rw::AccountStorage rows this is the committed value in the MPT, for // others, it is 0. - initial_value: word::Word>, + initial_value: WordLoHi>, // For Rw::AccountStorage, identify non-existing if both committed value and // new value are zero. Will do lookup for MPTProofType::StorageDoesNotExist if // non-existing, otherwise do lookup for MPTProofType::StorageChanged. is_non_exist: BatchedIsZeroConfig, // Intermediary witness used to reduce mpt lookup expression degree mpt_proof_type: Column, - state_root: word::Word>, + state_root: WordLoHi>, lexicographic_ordering: LexicographicOrderingConfig, not_first_access: Column, lookups: LookupsConfig, @@ -120,7 +120,8 @@ impl SubCircuitConfig for StateCircuitConfig { let lookups = LookupsChip::configure(meta, u8_table, u10_table, u16_table); let rw_counter = MpiChip::configure(meta, selector, [rw_table.rw_counter], lookups); - let tag = BinaryNumberChip::configure(meta, selector, Some(rw_table.tag)); + let bits = BinaryNumberBits::construct(meta); + let tag = BinaryNumberChip::configure(meta, bits, selector, Some(rw_table.tag)); let id = MpiChip::configure(meta, selector, [rw_table.id], lookups); let address = MpiChip::configure(meta, selector, [rw_table.address], lookups); @@ -131,7 +132,7 @@ impl SubCircuitConfig for StateCircuitConfig { [rw_table.storage_key.lo(), rw_table.storage_key.hi()], lookups, ); - let initial_value = word::Word::new([meta.advice_column(), meta.advice_column()]); + let initial_value = WordLoHi::new([meta.advice_column(), meta.advice_column()]); let is_non_exist = BatchedIsZeroChip::configure( meta, @@ -147,7 +148,7 @@ impl SubCircuitConfig for StateCircuitConfig { }, ); let mpt_proof_type = meta.advice_column_in(SecondPhase); - let state_root = word::Word::new([meta.advice_column(), meta.advice_column()]); + let state_root = WordLoHi::new([meta.advice_column(), meta.advice_column()]); let sort_keys = SortKeysConfig { tag, @@ -191,7 +192,7 @@ impl SubCircuitConfig for StateCircuitConfig { mpt_table, rw_permutation_config, pi_chunk_continuity, - _marker: PhantomData::default(), + _marker: PhantomData, }; let mut constraint_builder = ConstraintBuilder::new(); @@ -310,7 +311,7 @@ impl StateCircuitConfig { } // The initial value can be determined from the mpt updates or is 0. - let initial_value = word::Word::::from( + let initial_value = WordLoHi::::from( updates .get(row) .map(|u| u.value_assignments().1) @@ -332,8 +333,8 @@ impl StateCircuitConfig { .unwrap_or_default(); let value = row.value_assignment(); ( - word::Word::::from(committed_value), - word::Word::::from(value), + WordLoHi::::from(committed_value), + WordLoHi::::from(value), ) }; @@ -380,9 +381,12 @@ impl StateCircuitConfig { // State root assignment is at previous row (offset - 1) because the state root // changes on the last access row. if offset != 0 { - word::Word::::from(state_root) - .into_value() - .assign_advice(region, || "state root", self.state_root, offset - 1)?; + WordLoHi::::from(state_root).into_value().assign_advice( + region, + || "state root", + self.state_root, + offset - 1, + )?; } if offset == rows_len - 1 { @@ -395,9 +399,12 @@ impl StateCircuitConfig { new_root }; } - word::Word::::from(state_root) - .into_value() - .assign_advice(region, || "last row state_root", self.state_root, offset)?; + WordLoHi::::from(state_root).into_value().assign_advice( + region, + || "last row state_root", + self.state_root, + offset, + )?; } } @@ -485,7 +492,7 @@ impl StateCircuit { permu_gamma: chunk.permu_gamma, rw_fingerprints: chunk.by_address_rw_fingerprints.clone(), prev_chunk_last_rw: chunk.prev_chunk_last_by_address_rw, - _marker: PhantomData::default(), + _marker: PhantomData, } } } @@ -640,8 +647,8 @@ fn queries(meta: &mut VirtualCells<'_, F>, c: &StateCircuitConfig) assert_eq!(mpt_update_table_expressions.len(), 12); let meta_query_word = - |metap: &mut VirtualCells<'_, F>, word_column: word::Word>, at: Rotation| { - word::Word::new([ + |metap: &mut VirtualCells<'_, F>, word_column: WordLoHi>, at: Rotation| { + WordLoHi::new([ metap.query_advice(word_column.lo(), at), metap.query_advice(word_column.hi(), at), ]) @@ -668,24 +675,24 @@ fn queries(meta: &mut VirtualCells<'_, F>, c: &StateCircuitConfig) // TODO: clean this up mpt_update_table: MptUpdateTableQueries { address: mpt_update_table_expressions[0].clone(), - storage_key: word::Word::new([ + storage_key: WordLoHi::new([ mpt_update_table_expressions[1].clone(), mpt_update_table_expressions[2].clone(), ]), proof_type: mpt_update_table_expressions[3].clone(), - new_root: word::Word::new([ + new_root: WordLoHi::new([ mpt_update_table_expressions[4].clone(), mpt_update_table_expressions[5].clone(), ]), - old_root: word::Word::new([ + old_root: WordLoHi::new([ mpt_update_table_expressions[6].clone(), mpt_update_table_expressions[7].clone(), ]), - new_value: word::Word::new([ + new_value: WordLoHi::new([ mpt_update_table_expressions[8].clone(), mpt_update_table_expressions[9].clone(), ]), - old_value: word::Word::new([ + old_value: WordLoHi::new([ mpt_update_table_expressions[10].clone(), mpt_update_table_expressions[11].clone(), ]), diff --git a/zkevm-circuits/src/state_circuit/constraint_builder.rs b/zkevm-circuits/src/state_circuit/constraint_builder.rs index 1e43d14bad..5a35a3ec56 100644 --- a/zkevm-circuits/src/state_circuit/constraint_builder.rs +++ b/zkevm-circuits/src/state_circuit/constraint_builder.rs @@ -14,6 +14,7 @@ use halo2_proofs::{ poly::Rotation, }; use strum::IntoEnumIterator; +use word::WordLoHi; #[derive(Clone)] pub struct RwTableQueries { @@ -26,21 +27,21 @@ pub struct RwTableQueries { pub address: Expression, pub prev_address: Expression, pub field_tag: Expression, - pub storage_key: word::Word>, - pub value: word::Word>, - pub value_prev: word::Word>, // meta.query(value, Rotation::prev()) - pub value_prev_column: word::Word>, // meta.query(prev_value, Rotation::cur()) + pub storage_key: WordLoHi>, + pub value: WordLoHi>, + pub value_prev: WordLoHi>, // meta.query(value, Rotation::prev()) + pub value_prev_column: WordLoHi>, // meta.query(prev_value, Rotation::cur()) } #[derive(Clone)] pub struct MptUpdateTableQueries { pub address: Expression, - pub storage_key: word::Word>, + pub storage_key: WordLoHi>, pub proof_type: Expression, - pub new_root: word::Word>, - pub old_root: word::Word>, - pub new_value: word::Word>, - pub old_value: word::Word>, + pub new_root: WordLoHi>, + pub old_root: WordLoHi>, + pub new_value: WordLoHi>, + pub old_value: WordLoHi>, } #[derive(Clone)] @@ -55,16 +56,16 @@ pub struct Queries { pub is_tag_and_id_unchanged: Expression, pub address: MpiQueries, pub storage_key: MpiQueries, - pub initial_value: word::Word>, - pub initial_value_prev: word::Word>, + pub initial_value: WordLoHi>, + pub initial_value_prev: WordLoHi>, pub is_non_exist: Expression, pub mpt_proof_type: Expression, pub lookups: LookupsQueries, pub first_different_limb: [Expression; 4], pub not_first_access: Expression, pub last_access: Expression, - pub state_root: word::Word>, - pub state_root_prev: word::Word>, + pub state_root: WordLoHi>, + pub state_root_prev: WordLoHi>, } type Constraint = (&'static str, Expression); @@ -85,7 +86,7 @@ impl LookupBuilder { self.0.push((e1.clone(), e2.clone())); self } - fn add_word(mut self, e1: &word::Word>, e2: &word::Word>) -> Self { + fn add_word(mut self, e1: &WordLoHi>, e2: &WordLoHi>) -> Self { self.0.push((e1.lo(), e2.lo())); self.0.push((e1.hi(), e2.hi())); self @@ -576,7 +577,7 @@ impl ConstraintBuilder { self.constraints.push((name, self.condition.clone() * e)); } - fn require_word_zero(&mut self, name: &'static str, e: word::Word>) { + fn require_word_zero(&mut self, name: &'static str, e: WordLoHi>) { let (lo, hi) = e.into_lo_hi(); self.constraints.push((name, self.condition.clone() * hi)); self.constraints.push((name, self.condition.clone() * lo)); @@ -589,8 +590,8 @@ impl ConstraintBuilder { fn require_word_equal( &mut self, name: &'static str, - left: word::Word>, - right: word::Word>, + left: WordLoHi>, + right: WordLoHi>, ) { let (left_lo, left_hi) = left.into_lo_hi(); let (right_lo, right_hi) = right.into_lo_hi(); @@ -602,7 +603,7 @@ impl ConstraintBuilder { self.require_zero(name, e.clone() * (1.expr() - e)) } - fn require_word_boolean(&mut self, name: &'static str, e: word::Word>) { + fn require_word_boolean(&mut self, name: &'static str, e: WordLoHi>) { let (lo, hi) = e.into_lo_hi(); self.require_zero(name, hi); self.require_zero(name, lo.clone() * (1.expr() - lo)); @@ -650,15 +651,15 @@ impl Queries { self.rw_table.field_tag.clone() } - fn value(&self) -> word::Word> { + fn value(&self) -> WordLoHi> { self.rw_table.value.clone() } - fn initial_value(&self) -> word::Word> { + fn initial_value(&self) -> WordLoHi> { self.initial_value.clone() } - fn initial_value_prev(&self) -> word::Word> { + fn initial_value_prev(&self) -> WordLoHi> { self.initial_value_prev.clone() } @@ -690,15 +691,15 @@ impl Queries { self.last_access.clone() } - fn state_root(&self) -> word::Word> { + fn state_root(&self) -> WordLoHi> { self.state_root.clone() } - fn state_root_prev(&self) -> word::Word> { + fn state_root_prev(&self) -> WordLoHi> { self.state_root_prev.clone() } - fn value_prev_column(&self) -> word::Word> { + fn value_prev_column(&self) -> WordLoHi> { self.rw_table.value_prev_column.clone() } } diff --git a/zkevm-circuits/src/state_circuit/dev.rs b/zkevm-circuits/src/state_circuit/dev.rs index 39d50a1fdc..c7012a20d0 100644 --- a/zkevm-circuits/src/state_circuit/dev.rs +++ b/zkevm-circuits/src/state_circuit/dev.rs @@ -61,7 +61,7 @@ where } #[cfg(test)] -use crate::util::word::Word; +use crate::util::word::WordLoHi; #[cfg(test)] use crate::state_circuit::HashMap; @@ -151,26 +151,26 @@ impl AdviceColumn { Self::IsWrite => row.is_write = Value::known(value), Self::_Address => row.address = Value::known(value), Self::_StorageKeyLo => { - row.storage_key = Word::new([Value::known(value), row.storage_key.hi()]) + row.storage_key = WordLoHi::new([Value::known(value), row.storage_key.hi()]) } Self::_StorageKeyHi => { - row.storage_key = Word::new([row.storage_key.lo(), Value::known(value)]) + row.storage_key = WordLoHi::new([row.storage_key.lo(), Value::known(value)]) } - Self::ValueLo => row.value = Word::new([Value::known(value), row.value.hi()]), - Self::ValueHi => row.value = Word::new([row.value.lo(), Value::known(value)]), + Self::ValueLo => row.value = WordLoHi::new([Value::known(value), row.value.hi()]), + Self::ValueHi => row.value = WordLoHi::new([row.value.lo(), Value::known(value)]), Self::ValuePrevLo => { - row.value_prev = Word::new([Value::known(value), row.value_prev.hi()]) + row.value_prev = WordLoHi::new([Value::known(value), row.value_prev.hi()]) } Self::ValuePrevHi => { - row.value_prev = Word::new([row.value_prev.lo(), Value::known(value)]) + row.value_prev = WordLoHi::new([row.value_prev.lo(), Value::known(value)]) } Self::RwCounter => row.rw_counter = Value::known(value), Self::Tag => row.tag = Value::known(value), Self::InitialValueLo => { - row.init_val = Word::new([Value::known(value), row.init_val.hi()]) + row.init_val = WordLoHi::new([Value::known(value), row.init_val.hi()]) } Self::InitialValueHi => { - row.init_val = Word::new([row.init_val.lo(), Value::known(value)]) + row.init_val = WordLoHi::new([row.init_val.lo(), Value::known(value)]) } _ => (), }; diff --git a/zkevm-circuits/src/state_circuit/lexicographic_ordering.rs b/zkevm-circuits/src/state_circuit/lexicographic_ordering.rs index 67953ea37c..1d2e448578 100644 --- a/zkevm-circuits/src/state_circuit/lexicographic_ordering.rs +++ b/zkevm-circuits/src/state_circuit/lexicographic_ordering.rs @@ -1,7 +1,7 @@ use super::{lookups, param::*, SortKeysConfig}; use crate::{evm_circuit::param::N_BYTES_WORD, impl_expr, util::Expr, witness::Rw}; use eth_types::{Field, ToBigEndian}; -use gadgets::binary_number::{AsBits, BinaryNumberChip, BinaryNumberConfig}; +use gadgets::binary_number::{AsBits, BinaryNumberBits, BinaryNumberChip, BinaryNumberConfig}; use halo2_proofs::{ circuit::{Region, Value}, plonk::{Advice, Column, ConstraintSystem, Error, Expression, Fixed, VirtualCells}, @@ -38,10 +38,8 @@ use strum_macros::EnumIter; // 1. limb_difference fits into 16 bits. // 2. limb_difference is not zero because its inverse exists. -// 3. RLC of the pairwise limb differences before the first_different_limb is -// zero. -// 4. limb_difference equals the difference of the limbs at -// first_different_limb. +// 3. RLC of the pairwise limb differences before the first_different_limb is zero. +// 4. limb_difference equals the difference of the limbs at first_different_limb. #[derive(Clone, Copy, Debug, EnumIter)] pub enum LimbIndex { @@ -109,7 +107,8 @@ impl Config { powers_of_randomness: [Expression; N_BYTES_WORD - 1], ) -> Self { let selector = meta.fixed_column(); - let first_different_limb = BinaryNumberChip::configure(meta, selector, None); + let bits = BinaryNumberBits::construct(meta); + let first_different_limb = BinaryNumberChip::configure(meta, bits, selector, None); let limb_difference = meta.advice_column(); let config = Config { @@ -292,7 +291,7 @@ fn rlc_limb_differences( ) -> Vec> { let mut result = vec![]; let mut partial_sum = 0u64.expr(); - let powers_of_randomness = once(1.expr()).chain(powers_of_randomness.into_iter()); + let powers_of_randomness = once(1.expr()).chain(powers_of_randomness); for ((cur_limb, prev_limb), power_of_randomness) in cur .be_limbs() .iter() diff --git a/zkevm-circuits/src/state_circuit/lookups.rs b/zkevm-circuits/src/state_circuit/lookups.rs index 41b45a3fb1..697be10c5f 100644 --- a/zkevm-circuits/src/state_circuit/lookups.rs +++ b/zkevm-circuits/src/state_circuit/lookups.rs @@ -31,7 +31,6 @@ impl Config { vec![exp] .into_iter() .zip_eq(self.u16_table.table_exprs(meta)) - .map(|(exp, table_expr)| (exp, table_expr)) .collect() }); } diff --git a/zkevm-circuits/src/state_circuit/test.rs b/zkevm-circuits/src/state_circuit/test.rs index 3cf36b1ed3..97826d0746 100644 --- a/zkevm-circuits/src/state_circuit/test.rs +++ b/zkevm-circuits/src/state_circuit/test.rs @@ -1041,7 +1041,7 @@ fn prover(rows: Vec, overrides: HashMap<(AdviceColumn, isize), Fr>) -> MockP permu_gamma: Fr::from(1), rw_fingerprints: rwtable_fingerprints, prev_chunk_last_rw: None, - _marker: std::marker::PhantomData::default(), + _marker: std::marker::PhantomData, }; let instance = circuit.instance(); diff --git a/zkevm-circuits/src/super_circuit.rs b/zkevm-circuits/src/super_circuit.rs index a768514325..5aeeee6a2b 100644 --- a/zkevm-circuits/src/super_circuit.rs +++ b/zkevm-circuits/src/super_circuit.rs @@ -63,7 +63,7 @@ use crate::{ state_circuit::{StateCircuit, StateCircuitConfig, StateCircuitConfigArgs}, table::{ BlockTable, BytecodeTable, CopyTable, ExpTable, KeccakTable, LookupTable, MptTable, - RwTable, TxTable, UXTable, WdTable, + RwTable, SigTable, TxTable, UXTable, WdTable, }, tx_circuit::{TxCircuit, TxCircuitConfig, TxCircuitConfigArgs}, util::{chunk_ctx::ChunkContextConfig, log2_ceil, Challenges, SubCircuit, SubCircuitConfig}, @@ -100,6 +100,8 @@ pub struct SuperCircuitConfig { pi_circuit: PiCircuitConfig, exp_circuit: ExpCircuitConfig, chunk_ctx_config: ChunkContextConfig, + #[cfg(not(feature = "mock-challenge"))] + challenges: Challenges, } /// Circuit configuration arguments @@ -156,22 +158,33 @@ impl SubCircuitConfig for SuperCircuitConfig { let u16_table = UXTable::construct(meta); // Use a mock randomness instead of the randomness derived from the challenge - // (either from mock or real prover) to help debugging assignments. + // (either from mock or real prover) to help debugging assignments, when "mock-challenge" + // feature is enabled. + #[allow(unused_variables)] let power_of_randomness: [Expression; 31] = array::from_fn(|i| Expression::Constant(mock_randomness.pow([1 + i as u64, 0, 0, 0]))); - let challenges = Challenges::mock( + // Use the real challenges for real use, when "mock-challenge" feature is disabled. + #[cfg(not(feature = "mock-challenge"))] + let challenges = Challenges::construct(meta); + + #[cfg(feature = "mock-challenge")] + let challenges_exprs = Challenges::mock( power_of_randomness[0].clone(), power_of_randomness[0].clone(), ); + #[cfg(not(feature = "mock-challenge"))] + let challenges_exprs = challenges.exprs(meta); - let chunk_ctx_config = ChunkContextConfig::new(meta, &challenges); + let sig_table = SigTable::construct(meta); + + let chunk_ctx_config = ChunkContextConfig::new(meta, &challenges_exprs); let keccak_circuit = KeccakCircuitConfig::new( meta, KeccakCircuitConfigArgs { keccak_table: keccak_table.clone(), - challenges: challenges.clone(), + challenges: challenges_exprs.clone(), }, ); @@ -185,7 +198,7 @@ impl SubCircuitConfig for SuperCircuitConfig { tx_table: tx_table.clone(), wd_table, keccak_table: keccak_table.clone(), - challenges: challenges.clone(), + challenges: challenges_exprs.clone(), }, ); let tx_circuit = TxCircuitConfig::new( @@ -193,7 +206,7 @@ impl SubCircuitConfig for SuperCircuitConfig { TxCircuitConfigArgs { tx_table: tx_table.clone(), keccak_table: keccak_table.clone(), - challenges: challenges.clone(), + challenges: challenges_exprs.clone(), }, ); let bytecode_circuit = BytecodeCircuitConfig::new( @@ -201,7 +214,7 @@ impl SubCircuitConfig for SuperCircuitConfig { BytecodeCircuitConfigArgs { bytecode_table: bytecode_table.clone(), keccak_table: keccak_table.clone(), - challenges: challenges.clone(), + challenges: challenges_exprs.clone(), }, ); let copy_circuit = CopyCircuitConfig::new( @@ -212,7 +225,7 @@ impl SubCircuitConfig for SuperCircuitConfig { bytecode_table: bytecode_table.clone(), copy_table, q_enable: q_copy_table, - challenges: challenges.clone(), + challenges: challenges_exprs.clone(), }, ); let state_circuit = StateCircuitConfig::new( @@ -223,14 +236,14 @@ impl SubCircuitConfig for SuperCircuitConfig { u8_table, u10_table, u16_table, - challenges: challenges.clone(), + challenges: challenges_exprs.clone(), }, ); let exp_circuit = ExpCircuitConfig::new(meta, exp_table); let evm_circuit = EvmCircuitConfig::new( meta, EvmCircuitConfigArgs { - challenges, + challenges: challenges_exprs, tx_table, rw_table: chronological_rw_table, bytecode_table, @@ -240,6 +253,7 @@ impl SubCircuitConfig for SuperCircuitConfig { exp_table, u8_table, u16_table, + sig_table, chunk_ctx_config: chunk_ctx_config.clone(), feature_config, }, @@ -317,6 +331,8 @@ impl SubCircuitConfig for SuperCircuitConfig { pi_circuit, exp_circuit, chunk_ctx_config, + #[cfg(not(feature = "mock-challenge"))] + challenges, } } } @@ -360,7 +376,7 @@ impl SuperCircuit { } } -// Eventhough the SuperCircuit is not a subcircuit we implement the SubCircuit +// Even though the SuperCircuit is not a subcircuit we implement the SubCircuit // trait for it in order to get the `new_from_block` and `instance` methods that // allow us to generalize integration tests. impl SubCircuit for SuperCircuit { @@ -530,10 +546,14 @@ impl Circuit for SuperCircuit { mut layouter: impl Layouter, ) -> Result<(), Error> { let block = self.evm_circuit.block.as_ref().unwrap(); + #[cfg(feature = "mock-challenge")] let challenges = Challenges::mock( Value::known(block.randomness), Value::known(block.randomness), ); + #[cfg(not(feature = "mock-challenge"))] + let challenges = config.challenges.values(&mut layouter); + let rws = &self.state_circuit.rows; config.block_table.load(&mut layouter, &block.context)?; diff --git a/zkevm-circuits/src/super_circuit/test.rs b/zkevm-circuits/src/super_circuit/test.rs index f6891026c3..062d324aa7 100644 --- a/zkevm-circuits/src/super_circuit/test.rs +++ b/zkevm-circuits/src/super_circuit/test.rs @@ -42,7 +42,7 @@ fn test_super_circuit(block: GethData, circuits_params: FixedCParams, mock_rando SuperCircuit::::build(block, circuits_params, mock_randomness).unwrap(); circuits .into_iter() - .zip(instances.into_iter()) + .zip(instances) .enumerate() .for_each(|(i, (circuit, instance))| { let prover = MockProver::run(k, &circuit, instance).unwrap(); @@ -159,6 +159,7 @@ fn serial_test_super_circuit_1tx_1max_tx() { max_bytecode: 512, max_evm_rows: 0, max_keccak_rows: 0, + max_vertical_circuit_rows: 0, }; test_super_circuit(block, circuits_params, Fr::from(TEST_MOCK_RANDOMNESS)); } @@ -177,6 +178,7 @@ fn serial_test_super_circuit_1tx_2max_tx() { max_bytecode: 512, max_evm_rows: 0, max_keccak_rows: 0, + max_vertical_circuit_rows: 0, }; test_super_circuit(block, circuits_params, Fr::from(TEST_MOCK_RANDOMNESS)); } @@ -195,6 +197,7 @@ fn serial_test_super_circuit_2tx_2max_tx() { max_bytecode: 512, max_evm_rows: 0, max_keccak_rows: 0, + max_vertical_circuit_rows: 0, }; test_super_circuit(block, circuits_params, Fr::from(TEST_MOCK_RANDOMNESS)); } @@ -214,6 +217,7 @@ fn serial_test_multi_chunk_super_circuit_2tx_2max_tx() { max_bytecode: 512, max_evm_rows: 0, max_keccak_rows: 0, + max_vertical_circuit_rows: 0, }; test_super_circuit(block, circuits_params, Fr::from(TEST_MOCK_RANDOMNESS)); } @@ -241,6 +245,7 @@ where max_evm_rows: 0, max_keccak_rows: 0, total_chunks: 1, + max_vertical_circuit_rows: 0, }; let rw_map = RwMap::from(&OperationContainer { ..Default::default() diff --git a/zkevm-circuits/src/table.rs b/zkevm-circuits/src/table.rs index bab3808741..a929ed9cb5 100644 --- a/zkevm-circuits/src/table.rs +++ b/zkevm-circuits/src/table.rs @@ -4,18 +4,14 @@ use crate::{ copy_circuit::util::number_or_hash_to_word, evm_circuit::util::rlc, impl_expr, - util::{ - build_tx_log_address, keccak, - word::{self, Word}, - Challenges, - }, + util::{build_tx_log_address, keccak, word::WordLoHi, Challenges}, witness::{Block, BlockContext, MptUpdateRow, MptUpdates, Rw, RwMap, RwRow, Transaction}, }; use bus_mapping::circuit_input_builder::{CopyDataType, CopyEvent, CopyStep}; use core::iter::once; use eth_types::{Field, ToScalar, U256}; use gadgets::{ - binary_number::{BinaryNumberChip, BinaryNumberConfig}, + binary_number::BinaryNumberBits, util::{split_u256, split_u256_limb64}, }; use halo2_proofs::{ @@ -43,6 +39,8 @@ pub(crate) mod keccak_table; pub mod mpt_table; /// rw table pub(crate) mod rw_table; +/// signature table +pub(crate) mod sig_table; /// tx table pub(crate) mod tx_table; /// ux table @@ -50,19 +48,18 @@ pub(crate) mod ux_table; /// withdrawal table pub(crate) mod wd_table; -pub(crate) use block_table::{BlockContextFieldTag, BlockTable}; -pub(crate) use bytecode_table::{BytecodeFieldTag, BytecodeTable}; -pub(crate) use copy_table::CopyTable; -pub(crate) use exp_table::ExpTable; +pub use block_table::{BlockContextFieldTag, BlockTable}; +pub use bytecode_table::{BytecodeFieldTag, BytecodeTable}; +pub use copy_table::CopyTable; +pub use exp_table::ExpTable; pub use keccak_table::KeccakTable; -pub(crate) use ux_table::UXTable; +pub use ux_table::UXTable; pub use mpt_table::{MPTProofType, MptTable}; -pub(crate) use rw_table::RwTable; -pub(crate) use tx_table::{ - TxContextFieldTag, TxFieldTag, TxLogFieldTag, TxReceiptFieldTag, TxTable, -}; -pub(crate) use wd_table::WdTable; +pub use rw_table::RwTable; +pub use sig_table::SigTable; +pub use tx_table::{TxContextFieldTag, TxFieldTag, TxLogFieldTag, TxReceiptFieldTag, TxTable}; +pub use wd_table::WdTable; /// Trait used to define lookup tables pub trait LookupTable { diff --git a/zkevm-circuits/src/table/block_table.rs b/zkevm-circuits/src/table/block_table.rs index b697ff42f3..0d7cc0dfce 100644 --- a/zkevm-circuits/src/table/block_table.rs +++ b/zkevm-circuits/src/table/block_table.rs @@ -36,7 +36,7 @@ pub struct BlockTable { /// Index pub index: Column, /// Value - pub value: word::Word>, + pub value: WordLoHi>, } impl BlockTable { @@ -45,7 +45,7 @@ impl BlockTable { Self { tag: meta.fixed_column(), index: meta.fixed_column(), - value: word::Word::new([meta.advice_column(), meta.advice_column()]), + value: WordLoHi::new([meta.advice_column(), meta.advice_column()]), } } @@ -75,7 +75,7 @@ impl BlockTable { || row[1], )?; - word::Word::new([row[2], row[3]]).assign_advice( + WordLoHi::new([row[2], row[3]]).assign_advice( &mut region, || format!("block table value {}", offset), self.value, diff --git a/zkevm-circuits/src/table/bytecode_table.rs b/zkevm-circuits/src/table/bytecode_table.rs index 3599180297..ca73aab745 100644 --- a/zkevm-circuits/src/table/bytecode_table.rs +++ b/zkevm-circuits/src/table/bytecode_table.rs @@ -1,5 +1,4 @@ use super::*; -use crate::util; use bus_mapping::state_db::CodeDB; /// Tag to identify the field in a Bytecode Table row @@ -16,7 +15,7 @@ impl_expr!(BytecodeFieldTag); #[derive(Clone, Debug)] pub struct BytecodeTable { /// Code Hash - pub code_hash: word::Word>, + pub code_hash: WordLoHi>, /// Tag pub tag: Column, /// Index @@ -31,7 +30,7 @@ impl BytecodeTable { /// Construct a new BytecodeTable pub fn construct(meta: &mut ConstraintSystem) -> Self { let [tag, index, is_code, value] = array::from_fn(|_| meta.advice_column()); - let code_hash = word::Word::new([meta.advice_column(), meta.advice_column()]); + let code_hash = WordLoHi::new([meta.advice_column(), meta.advice_column()]); Self { code_hash, tag, @@ -41,7 +40,7 @@ impl BytecodeTable { } } - /// Assign the `BytecodeTable` from a list of bytecodes, followig the same + /// Assign the `BytecodeTable` from a list of bytecodes, following the same /// table layout that the Bytecode Circuit uses. pub fn load( &self, @@ -66,7 +65,7 @@ impl BytecodeTable { >::advice_columns(self); for bytecode in bytecodes.clone().into_iter() { let rows = { - let code_hash = util::word::Word::from(bytecode.hash()); + let code_hash = WordLoHi::from(bytecode.hash()); std::iter::once([ code_hash.lo(), code_hash.hi(), diff --git a/zkevm-circuits/src/table/copy_table.rs b/zkevm-circuits/src/table/copy_table.rs index 324301af63..1fea1d8240 100644 --- a/zkevm-circuits/src/table/copy_table.rs +++ b/zkevm-circuits/src/table/copy_table.rs @@ -1,8 +1,10 @@ use crate::witness::Chunk; use super::*; +use gadgets::binary_number::AsBits; -type CopyTableRow = [(Value, &'static str); 9]; +// The row also includes the 3 column bits from the tag +type CopyTableRow = [(Value, &'static str); 12]; type CopyCircuitRow = [(Value, &'static str); 5]; /// Copy Table, used to verify copies of byte chunks between Memory, Bytecode, @@ -16,7 +18,7 @@ pub struct CopyTable { /// 1. Call ID/Caller ID for CopyDataType::Memory /// 2. The hi/lo limbs of bytecode hash for CopyDataType::Bytecode /// 3. Transaction ID for CopyDataType::TxCalldata, CopyDataType::TxLog - pub id: word::Word>, + pub id: WordLoHi>, /// The source/destination address for this copy step. Can be memory /// address, byte index in the bytecode, tx call data, and tx log data. pub addr: Column, @@ -36,10 +38,12 @@ pub struct CopyTable { pub rwc_inc_left: Column, /// Selector for the tag BinaryNumberChip pub q_enable: Column, + // We use the `BinaryNumberBits` instead of `BinaryNumberChip` in order to construct the table + // without attaching any constraints. /// Binary chip to constrain the copy table conditionally depending on the /// current row's tag, whether it is Bytecode, Memory, TxCalldata or /// TxLog. - pub tag: BinaryNumberConfig, + pub tag: BinaryNumberBits<3>, } impl CopyTable { @@ -47,9 +51,9 @@ impl CopyTable { pub fn construct(meta: &mut ConstraintSystem, q_enable: Column) -> Self { Self { is_first: meta.advice_column(), - id: word::Word::new([meta.advice_column(), meta.advice_column()]), + id: WordLoHi::new([meta.advice_column(), meta.advice_column()]), q_enable, - tag: BinaryNumberChip::configure(meta, q_enable, None), + tag: BinaryNumberBits::construct(meta), addr: meta.advice_column(), src_addr_end: meta.advice_column(), bytes_left: meta.advice_column(), @@ -117,7 +121,7 @@ impl CopyTable { number_or_hash_to_word(©_event.dst_id) }; - // tag binary bumber chip + // tag binary number chip let tag = if is_read_step { copy_event.src_type } else { @@ -162,36 +166,43 @@ impl CopyTable { // is_code let is_code = Value::known(copy_step.is_code.map_or(F::ZERO, |v| F::from(v as u64))); + let tag_bits: [_; 3] = tag + .as_bits() + .map(|b| (Value::known(F::from(b as u64)), "tag_bit")); + let copy_table_row = [ + (is_first, "is_first"), + (id.lo(), "id_lo"), + (id.hi(), "id_hi"), + (addr, "addr"), + ( + Value::known(F::from(copy_event.src_addr_end)), + "src_addr_end", + ), + (Value::known(F::from(bytes_left)), "bytes_left"), + ( + match (copy_event.src_type, copy_event.dst_type) { + (CopyDataType::Memory, CopyDataType::Bytecode) => rlc_acc, + (_, CopyDataType::RlcAcc) => rlc_acc, + (CopyDataType::RlcAcc, _) => rlc_acc, + _ => Value::known(F::ZERO), + }, + "rlc_acc", + ), + ( + Value::known(F::from(copy_event.rw_counter(step_idx))), + "rw_counter", + ), + ( + Value::known(F::from(copy_event.rw_counter_increase_left(step_idx))), + "rwc_inc_left", + ), + tag_bits[0], + tag_bits[1], + tag_bits[2], + ]; assignments.push(( tag, - [ - (is_first, "is_first"), - (id.lo(), "id_lo"), - (id.hi(), "id_hi"), - (addr, "addr"), - ( - Value::known(F::from(copy_event.src_addr_end)), - "src_addr_end", - ), - (Value::known(F::from(bytes_left)), "bytes_left"), - ( - match (copy_event.src_type, copy_event.dst_type) { - (CopyDataType::Memory, CopyDataType::Bytecode) => rlc_acc, - (_, CopyDataType::RlcAcc) => rlc_acc, - (CopyDataType::RlcAcc, _) => rlc_acc, - _ => Value::known(F::ZERO), - }, - "rlc_acc", - ), - ( - Value::known(F::from(copy_event.rw_counter(step_idx))), - "rw_counter", - ), - ( - Value::known(F::from(copy_event.rw_counter_increase_left(step_idx))), - "rwc_inc_left", - ), - ], + copy_table_row, [ (is_last, "is_last"), (value, "value"), @@ -226,10 +237,9 @@ impl CopyTable { } offset += 1; - let tag_chip = BinaryNumberChip::construct(self.tag); let copy_table_columns = >::advice_columns(self); for copy_event in block.copy_events.iter() { - for (tag, row, _) in Self::assignments(copy_event, *challenges) { + for (_, row, _) in Self::assignments(copy_event, *challenges) { for (&column, (value, label)) in copy_table_columns.iter().zip_eq(row) { region.assign_advice( || format!("{} at row: {}", label, offset), @@ -238,7 +248,6 @@ impl CopyTable { || value, )?; } - tag_chip.assign(&mut region, offset, &tag)?; offset += 1; } } @@ -262,7 +271,7 @@ impl CopyTable { impl LookupTable for CopyTable { fn columns(&self) -> Vec> { - vec![ + let mut columns = vec![ self.is_first.into(), self.id.lo().into(), self.id.hi().into(), @@ -272,11 +281,13 @@ impl LookupTable for CopyTable { self.rlc_acc.into(), self.rw_counter.into(), self.rwc_inc_left.into(), - ] + ]; + columns.extend(self.tag.iter().map(|c| Into::>::into(*c))); + columns } fn annotations(&self) -> Vec { - vec![ + let mut names = vec![ String::from("is_first"), String::from("id_lo"), String::from("id_hi"), @@ -286,7 +297,9 @@ impl LookupTable for CopyTable { String::from("rlc_acc"), String::from("rw_counter"), String::from("rwc_inc_left"), - ] + ]; + names.extend((0..self.tag.len()).map(|i| format!("tag_bit{i}"))); + names } fn table_exprs(&self, meta: &mut VirtualCells) -> Vec> { diff --git a/zkevm-circuits/src/table/keccak_table.rs b/zkevm-circuits/src/table/keccak_table.rs index 7f36be98a1..e2d906e40e 100644 --- a/zkevm-circuits/src/table/keccak_table.rs +++ b/zkevm-circuits/src/table/keccak_table.rs @@ -10,7 +10,7 @@ pub struct KeccakTable { /// Byte array input length pub input_len: Column, /// Output hash word - pub output: word::Word>, + pub output: WordLoHi>, } impl LookupTable for KeccakTable { @@ -42,7 +42,7 @@ impl KeccakTable { is_enabled: meta.advice_column(), input_rlc: meta.advice_column_in(SecondPhase), input_len: meta.advice_column(), - output: word::Word::new([meta.advice_column(), meta.advice_column()]), + output: WordLoHi::new([meta.advice_column(), meta.advice_column()]), } } @@ -55,7 +55,7 @@ impl KeccakTable { .keccak_input() .map(|challenge| rlc::value(input.iter().rev(), challenge)); let input_len = F::from(input.len() as u64); - let output = word::Word::from(keccak(input)); + let output = WordLoHi::from(keccak(input)); vec![[ Value::known(F::ONE), @@ -125,12 +125,12 @@ impl KeccakTable { } /// returns matchings between the circuit columns passed as parameters and - /// the table collumns + /// the table columns pub fn match_columns( &self, value_rlc: Column, length: Column, - code_hash: Word>, + code_hash: WordLoHi>, ) -> Vec<(Column, Column)> { vec![ (value_rlc, self.input_rlc), diff --git a/zkevm-circuits/src/table/mpt_table.rs b/zkevm-circuits/src/table/mpt_table.rs index 87a30a5cba..08ae579283 100644 --- a/zkevm-circuits/src/table/mpt_table.rs +++ b/zkevm-circuits/src/table/mpt_table.rs @@ -46,17 +46,17 @@ pub struct MptTable { /// Account address pub address: Column, /// Storage address - pub storage_key: word::Word>, + pub storage_key: WordLoHi>, /// Proof type pub proof_type: Column, /// New MPT root - pub new_root: word::Word>, + pub new_root: WordLoHi>, /// Previous MPT root - pub old_root: word::Word>, + pub old_root: WordLoHi>, /// New value - pub new_value: word::Word>, + pub new_value: WordLoHi>, /// Old value - pub old_value: word::Word>, + pub old_value: WordLoHi>, } impl LookupTable for MptTable { @@ -100,15 +100,15 @@ impl LookupTable for MptTable { impl MptTable { /// Construct a new MptTable - pub(crate) fn construct(meta: &mut ConstraintSystem) -> Self { + pub fn construct(meta: &mut ConstraintSystem) -> Self { Self { address: meta.advice_column(), - storage_key: word::Word::new([meta.advice_column(), meta.advice_column()]), + storage_key: WordLoHi::new([meta.advice_column(), meta.advice_column()]), proof_type: meta.advice_column(), - new_root: word::Word::new([meta.advice_column(), meta.advice_column()]), - old_root: word::Word::new([meta.advice_column(), meta.advice_column()]), - new_value: word::Word::new([meta.advice_column(), meta.advice_column()]), - old_value: word::Word::new([meta.advice_column(), meta.advice_column()]), + new_root: WordLoHi::new([meta.advice_column(), meta.advice_column()]), + old_root: WordLoHi::new([meta.advice_column(), meta.advice_column()]), + new_value: WordLoHi::new([meta.advice_column(), meta.advice_column()]), + old_value: WordLoHi::new([meta.advice_column(), meta.advice_column()]), } } @@ -119,11 +119,11 @@ impl MptTable { cb: &mut ConstraintBuilder, address: Expression, proof_type: Expression, - storage_key: word::Word>, - new_root: word::Word>, - old_root: word::Word>, - new_value: word::Word>, - old_value: word::Word>, + storage_key: WordLoHi>, + new_root: WordLoHi>, + old_root: WordLoHi>, + new_value: WordLoHi>, + old_value: WordLoHi>, ) { circuit!([meta, cb], { require!(a!(self.address) => address); diff --git a/zkevm-circuits/src/table/rw_table.rs b/zkevm-circuits/src/table/rw_table.rs index 94a10852e5..229f946384 100644 --- a/zkevm-circuits/src/table/rw_table.rs +++ b/zkevm-circuits/src/table/rw_table.rs @@ -36,13 +36,13 @@ pub struct RwTable { /// Key3 (FieldTag) pub field_tag: Column, /// Key3 (StorageKey) - pub storage_key: word::Word>, + pub storage_key: WordLoHi>, /// Value - pub value: word::Word>, + pub value: WordLoHi>, /// Value Previous - pub value_prev: word::Word>, + pub value_prev: WordLoHi>, /// InitVal (Committed Value) - pub init_val: word::Word>, + pub init_val: WordLoHi>, } impl LookupTable for RwTable { @@ -95,19 +95,19 @@ impl RwTable { id: meta.unblinded_advice_column(), address: meta.unblinded_advice_column(), field_tag: meta.unblinded_advice_column(), - storage_key: word::Word::new([ + storage_key: WordLoHi::new([ meta.unblinded_advice_column(), meta.unblinded_advice_column(), ]), - value: word::Word::new([ + value: WordLoHi::new([ meta.unblinded_advice_column(), meta.unblinded_advice_column(), ]), - value_prev: word::Word::new([ + value_prev: WordLoHi::new([ meta.unblinded_advice_column(), meta.unblinded_advice_column(), ]), - init_val: word::Word::new([ + init_val: WordLoHi::new([ meta.unblinded_advice_column(), meta.unblinded_advice_column(), ]), @@ -460,12 +460,12 @@ fn batch_invert_assigned>( assigned .iter() - .zip(assigned_denominators.into_iter()) + .zip(assigned_denominators) .map(|(poly, inv_denoms)| { let inv_denoms = inv_denoms.into_iter().map(|d| d.unwrap_or(F::ONE)); domain.lagrange_from_vec( poly.iter() - .zip(inv_denoms.into_iter()) + .zip(inv_denoms) .map(|(a, inv_den)| a.numerator() * inv_den) .collect(), ) diff --git a/zkevm-circuits/src/table/sig_table.rs b/zkevm-circuits/src/table/sig_table.rs new file mode 100644 index 0000000000..037b0c9cfe --- /dev/null +++ b/zkevm-circuits/src/table/sig_table.rs @@ -0,0 +1,131 @@ +use super::*; + +use eth_types::sign_types::SignData; + +/// The sig table is used to verify signatures, used in tx circuit and ecrecover precompile. +#[derive(Clone, Copy, Debug)] +pub struct SigTable { + /// Indicates whether or not the gates are enabled on the current row. + pub q_enable: Column, + /// Keccak256 hash of the message that's signed. + pub msg_hash: WordLoHi>, + /// signature's `r` component. + pub sig_r: WordLoHi>, + /// signature's `s` component. + pub sig_s: WordLoHi>, + /// should be in range [0, 1] + pub sig_v: Column, + /// The recovered address, i.e. the 20-bytes address that must have signed the message. + pub recovered_addr: Column, + /// Indicates whether or not the signature is valid or not upon signature verification. + pub is_valid: Column, +} + +impl SigTable { + /// Construct the SigTable. + pub fn construct(meta: &mut ConstraintSystem) -> Self { + Self { + q_enable: meta.fixed_column(), + msg_hash: WordLoHi::new([meta.advice_column(), meta.advice_column()]), + sig_r: WordLoHi::new([meta.advice_column(), meta.advice_column()]), + sig_s: WordLoHi::new([meta.advice_column(), meta.advice_column()]), + sig_v: meta.advice_column(), + recovered_addr: meta.advice_column(), + is_valid: meta.advice_column(), + } + } + + /// Assign witness data from a block to the verification table. + pub fn dev_load( + &self, + layouter: &mut impl Layouter, + block: &Block, + ) -> Result<(), Error> { + layouter.assign_region( + || "sig table (dev load)", + |mut region| { + let signatures: Vec = block.get_sign_data(false); + + for (offset, sign_data) in signatures.iter().enumerate() { + let msg_hash = + WordLoHi::from(U256::from(sign_data.msg_hash.to_bytes())).into_value(); + let sig_r = + WordLoHi::from(U256::from(sign_data.signature.0.to_bytes())).into_value(); + let sig_s = + WordLoHi::from(U256::from(sign_data.signature.1.to_bytes())).into_value(); + let sig_v = Value::known(F::from(sign_data.signature.2 as u64)); + let recovered_addr = Value::known(sign_data.get_addr().to_scalar().unwrap()); + region.assign_fixed( + || format!("sig table q_enable {offset}"), + self.q_enable, + offset, + || Value::known(F::ONE), + )?; + for (column, value) in [ + (self.sig_v, sig_v), + (self.recovered_addr, recovered_addr), + ( + self.is_valid, + Value::known(F::from(!sign_data.get_addr().is_zero() as u64)), + ), + ] { + region.assign_advice( + || "assign sign data on sig table", + column, + offset, + || value, + )?; + } + for (column, value) in [ + (self.msg_hash, msg_hash), + (self.sig_r, sig_r), + (self.sig_s, sig_s), + ] { + value.assign_advice( + &mut region, + || "assign sign data on sig table", + column, + offset, + )?; + } + } + + Ok(()) + }, + )?; + + Ok(()) + } +} + +impl LookupTable for SigTable { + fn columns(&self) -> Vec> { + vec![ + self.q_enable.into(), + self.msg_hash.lo().into(), + self.msg_hash.hi().into(), + self.sig_v.into(), + self.sig_r.lo().into(), + self.sig_r.hi().into(), + self.sig_s.lo().into(), + self.sig_s.hi().into(), + self.recovered_addr.into(), + self.is_valid.into(), + ] + } + + fn annotations(&self) -> Vec { + vec![ + String::from("q_enable"), + String::from("msg_hash_lo"), + String::from("msg_hash_hi"), + String::from("sig_v"), + String::from("sig_r_lo"), + String::from("sig_r_hi"), + String::from("sig_s_lo"), + String::from("sig_s_hi"), + String::from("recovered_addr"), + String::from("is_valid"), + ] + } +} diff --git a/zkevm-circuits/src/table/tx_table.rs b/zkevm-circuits/src/table/tx_table.rs index 0c36548579..4237fc0c6a 100644 --- a/zkevm-circuits/src/table/tx_table.rs +++ b/zkevm-circuits/src/table/tx_table.rs @@ -69,7 +69,7 @@ pub struct TxTable { /// Index for Tag = CallData pub index: Column, /// Value - pub value: word::Word>, + pub value: WordLoHi>, } impl TxTable { @@ -79,7 +79,7 @@ impl TxTable { tx_id: meta.advice_column(), tag: meta.fixed_column(), index: meta.advice_column(), - value: word::Word::new([meta.advice_column(), meta.advice_column()]), + value: WordLoHi::new([meta.advice_column(), meta.advice_column()]), } } @@ -158,30 +158,24 @@ impl TxTable { .collect(); for tx in txs.iter().chain(padding_txs.iter()) { let tx_id = Value::known(F::from(tx.id)); - let tx_data = vec![ - ( - TxContextFieldTag::Nonce, - word::Word::from(tx.nonce.as_u64()), - ), - (TxContextFieldTag::Gas, word::Word::from(tx.gas())), - (TxContextFieldTag::GasPrice, word::Word::from(tx.gas_price)), - (TxContextFieldTag::CallerAddress, word::Word::from(tx.from)), + let tx_data = [ + (TxContextFieldTag::Nonce, WordLoHi::from(tx.nonce.as_u64())), + (TxContextFieldTag::Gas, WordLoHi::from(tx.gas())), + (TxContextFieldTag::GasPrice, WordLoHi::from(tx.gas_price)), + (TxContextFieldTag::CallerAddress, WordLoHi::from(tx.from)), ( TxContextFieldTag::CalleeAddress, - word::Word::from(tx.to_or_contract_addr()), - ), - ( - TxContextFieldTag::IsCreate, - word::Word::from(tx.is_create()), + WordLoHi::from(tx.to_or_contract_addr()), ), - (TxContextFieldTag::Value, word::Word::from(tx.value)), + (TxContextFieldTag::IsCreate, WordLoHi::from(tx.is_create())), + (TxContextFieldTag::Value, WordLoHi::from(tx.value)), ( TxContextFieldTag::CallDataLength, - word::Word::from(tx.call_data.len() as u64), + WordLoHi::from(tx.call_data.len() as u64), ), ( TxContextFieldTag::CallDataGasCost, - word::Word::from(tx.call_data_gas_cost()), + WordLoHi::from(tx.call_data_gas_cost()), ), ] .iter() diff --git a/zkevm-circuits/src/table/wd_table.rs b/zkevm-circuits/src/table/wd_table.rs index 93c8d293cd..622e37a1f2 100644 --- a/zkevm-circuits/src/table/wd_table.rs +++ b/zkevm-circuits/src/table/wd_table.rs @@ -10,7 +10,7 @@ pub struct WdTable { /// validator id pub validator_id: Column, /// withdrawal address - pub address: Word>, + pub address: WordLoHi>, /// validator withdrawal amount in Gwei pub amount: Column, } @@ -21,7 +21,7 @@ impl WdTable { Self { id: meta.advice_column(), validator_id: meta.advice_column(), - address: Word::new([meta.advice_column(), meta.advice_column()]), + address: WordLoHi::new([meta.advice_column(), meta.advice_column()]), amount: meta.advice_column(), } } @@ -78,7 +78,7 @@ impl WdTable { .chain(padding_withdrawals.iter()) .enumerate() { - let address_word = Word::from(wd.address); + let address_word = WordLoHi::from(wd.address); let row = [ Value::known(F::from(wd.id)), Value::known(F::from(wd.validator_id)), diff --git a/zkevm-circuits/src/test_util.rs b/zkevm-circuits/src/test_util.rs index 6d32d3090b..a809631a7b 100644 --- a/zkevm-circuits/src/test_util.rs +++ b/zkevm-circuits/src/test_util.rs @@ -439,13 +439,13 @@ pub enum Circuit { #[derive(Debug, Error)] /// Errors for Circuit test pub enum CircuitTestError { - /// We didn't specify enough attibutes to define a block for the circuit test + /// We didn't specify enough attributes to define a block for the circuit test #[error("NotEnoughAttributes")] NotEnoughAttributes, /// Something wrong in the handle_block #[error("CannotHandleBlock({0})")] CannotHandleBlock(String), - /// Something worng in the block_convert + /// Something wrong in the block_convert #[error("CannotConvertBlock({0})")] CannotConvertBlock(String), /// Something worng in the chunk_convert @@ -472,7 +472,7 @@ pub enum CircuitTestError { impl CircuitTestError { /// Filter out EVM circuit failures /// - /// Errors must come from EVM circuit and must be unsatisifed constraints or lookup failure + /// Errors must come from EVM circuit and must be unsatisfied constraints or lookup failure pub fn assert_evm_failure(&self) { match self { Self::VerificationFailed { circuit, reasons } => { diff --git a/zkevm-circuits/src/tx_circuit.rs b/zkevm-circuits/src/tx_circuit.rs index 27aee606ea..3fae849fcb 100644 --- a/zkevm-circuits/src/tx_circuit.rs +++ b/zkevm-circuits/src/tx_circuit.rs @@ -15,7 +15,7 @@ pub use dev::TxCircuit as TestTxCircuit; use crate::{ table::{KeccakTable, TxFieldTag, TxTable}, - util::{word::Word, Challenges, SubCircuit, SubCircuitConfig}, + util::{word::WordLoHi, Challenges, SubCircuit, SubCircuitConfig}, witness::{self, Chunk}, }; use eth_types::{geth_types::Transaction, sign_types::SignData, Field}; @@ -41,7 +41,7 @@ pub struct TxCircuitConfig { tx_id: Column, tag: Column, index: Column, - value: Word>, + value: WordLoHi>, sign_verify: SignVerifyConfig, _marker: PhantomData, } @@ -103,8 +103,8 @@ impl TxCircuitConfig { tx_id: usize, tag: TxFieldTag, index: usize, - value: Word>, - ) -> Result>, Error> { + value: WordLoHi>, + ) -> Result>, Error> { region.assign_advice( || "tx_id", self.tx_id, @@ -186,7 +186,7 @@ impl TxCircuit { 0, TxFieldTag::Null, 0, - Word::default().into_value(), + WordLoHi::default().into_value(), )?; offset += 1; // Assign all Tx fields except for call data @@ -201,27 +201,33 @@ impl TxCircuit { for (tag, value) in [ ( TxFieldTag::Nonce, - Word::from(tx.nonce.as_u64()).into_value(), + WordLoHi::from(tx.nonce.as_u64()).into_value(), + ), + (TxFieldTag::Gas, WordLoHi::from(tx.gas()).into_value()), + ( + TxFieldTag::GasPrice, + WordLoHi::from(tx.gas_price).into_value(), + ), + ( + TxFieldTag::CallerAddress, + WordLoHi::from(tx.from).into_value(), ), - (TxFieldTag::Gas, Word::from(tx.gas()).into_value()), - (TxFieldTag::GasPrice, Word::from(tx.gas_price).into_value()), - (TxFieldTag::CallerAddress, Word::from(tx.from).into_value()), ( TxFieldTag::CalleeAddress, - Word::from(tx.to_or_zero()).into_value(), + WordLoHi::from(tx.to_or_zero()).into_value(), ), ( TxFieldTag::IsCreate, - Word::from(tx.is_create() as u64).into_value(), + WordLoHi::from(tx.is_create() as u64).into_value(), ), - (TxFieldTag::Value, Word::from(tx.value).into_value()), + (TxFieldTag::Value, WordLoHi::from(tx.value).into_value()), ( TxFieldTag::CallDataLength, - Word::from(tx.call_data.0.len() as u64).into_value(), + WordLoHi::from(tx.call_data.0.len() as u64).into_value(), ), ( TxFieldTag::CallDataGasCost, - Word::from(tx.call_data_gas_cost()).into_value(), + WordLoHi::from(tx.call_data_gas_cost()).into_value(), ), ( TxFieldTag::TxSignHash, @@ -271,7 +277,7 @@ impl TxCircuit { i + 1, // tx_id TxFieldTag::CallData, index, - Word::from(*byte as u64).into_value(), + WordLoHi::from(*byte as u64).into_value(), )?; offset += 1; calldata_count += 1; @@ -284,7 +290,7 @@ impl TxCircuit { 0, // tx_id TxFieldTag::CallData, 0, - Word::default().into_value(), + WordLoHi::default().into_value(), )?; offset += 1; } diff --git a/zkevm-circuits/src/tx_circuit/sign_verify.rs b/zkevm-circuits/src/tx_circuit/sign_verify.rs index fe4d2f3513..7a9e0b2f5f 100644 --- a/zkevm-circuits/src/tx_circuit/sign_verify.rs +++ b/zkevm-circuits/src/tx_circuit/sign_verify.rs @@ -10,7 +10,7 @@ use crate::{ util::{from_bytes, not, rlc}, }, table::KeccakTable, - util::{word::Word, Challenges, Expr}, + util::{word::WordLoHi, Challenges, Expr}, }; use ecc::{maingate, EccConfig, GeneralEccChip}; use ecdsa::ecdsa::{AssignedEcdsaSig, AssignedPublicKey, EcdsaChip}; @@ -105,7 +105,7 @@ impl Default for SignVerifyChip { aux_generator: Secp256k1Affine::default(), window_size: 4, max_verif: 0, - _marker: PhantomData::default(), + _marker: PhantomData, } } } @@ -292,8 +292,8 @@ pub(crate) struct AssignedECDSA { #[derive(Debug)] pub(crate) struct AssignedSignatureVerify { - pub(crate) address: Word>, - pub(crate) msg_hash: Word>, + pub(crate) address: WordLoHi>, + pub(crate) msg_hash: WordLoHi>, } // Return an array of bytes that corresponds to the little endian representation @@ -350,9 +350,10 @@ impl SignVerifyChip { let SignData { signature, pk, + msg: _, msg_hash, } = sign_data; - let (sig_r, sig_s) = signature; + let (sig_r, sig_s, _) = signature; let ChipsRef { main_gate: _, @@ -389,9 +390,9 @@ impl SignVerifyChip { // Ref. spec SignVerifyChip 4. Verify the ECDSA signature ecdsa_chip.verify(ctx, &sig, &pk_assigned, &msg_hash)?; - // TODO: Update once halo2wrong suports the following methods: + // TODO: Update once halo2wrong supports the following methods: // - `IntegerChip::assign_integer_from_bytes_le` - // - `GeneralEccChip::assing_point_from_bytes_le` + // - `GeneralEccChip::assign_point_from_bytes_le` Ok(AssignedECDSA { pk_x_le, @@ -451,7 +452,7 @@ impl SignVerifyChip { ctx: &mut RegionCtx, is_address_zero: &AssignedCell, pk_rlc: &AssignedCell, - pk_hash: &Word>, + pk_hash: &WordLoHi>, ) -> Result<(), Error> { let copy = |ctx: &mut RegionCtx, name, column, assigned: &AssignedCell| { let copied = ctx.assign_advice(|| name, column, assigned.value().copied())?; @@ -559,8 +560,8 @@ impl SignVerifyChip { )?; ( - Word::new([address_cell_lo, address_cell_hi]), - Word::new([pk_hash_cell_lo, pk_hash_cell_hi]), + WordLoHi::new([address_cell_lo, address_cell_hi]), + WordLoHi::new([pk_hash_cell_lo, pk_hash_cell_hi]), ) }; @@ -594,7 +595,7 @@ impl SignVerifyChip { |_, _| Ok(()), )?; - Word::new([msg_hash_cell_lo, msg_hash_cell_hi]) + WordLoHi::new([msg_hash_cell_lo, msg_hash_cell_hi]) }; let pk_rlc = { @@ -717,7 +718,7 @@ mod sign_verify_tests { use super::*; use crate::util::Challenges; use bus_mapping::circuit_input_builder::keccak_inputs_sign_verify; - use eth_types::sign_types::sign; + use eth_types::{sign_types::sign, Bytes}; use halo2_proofs::{ arithmetic::Field as HaloField, circuit::SimpleFloorPlanner, @@ -841,7 +842,7 @@ mod sign_verify_tests { rng: impl RngCore, sk: secp256k1::Fq, msg_hash: secp256k1::Fq, - ) -> (secp256k1::Fq, secp256k1::Fq) { + ) -> (secp256k1::Fq, secp256k1::Fq, u8) { let randomness = secp256k1::Fq::random(rng); sign(randomness, sk, msg_hash) } @@ -868,6 +869,7 @@ mod sign_verify_tests { signature: sig, pk, msg_hash, + msg: Bytes::new(), }); } diff --git a/zkevm-circuits/src/util.rs b/zkevm-circuits/src/util.rs index ebb97cb2dc..cd614d42ca 100644 --- a/zkevm-circuits/src/util.rs +++ b/zkevm-circuits/src/util.rs @@ -98,7 +98,9 @@ impl Challenges { [&self.keccak_input, &self.lookup_input] } - pub(crate) fn mock(keccak_input: T, lookup_input: T) -> Self { + /// Returns a mock Challenges for testing purposes + #[cfg(feature = "mock-challenge")] + pub fn mock(keccak_input: T, lookup_input: T) -> Self { Self { keccak_input, lookup_input, diff --git a/zkevm-circuits/src/util/cell_manager.rs b/zkevm-circuits/src/util/cell_manager.rs index 574301ea78..abc2d1c815 100644 --- a/zkevm-circuits/src/util/cell_manager.rs +++ b/zkevm-circuits/src/util/cell_manager.rs @@ -277,7 +277,7 @@ impl CellManagerColumns { } } - /// Returns a column of a given cell type and index amoung all columns of that cell type. + /// Returns a column of a given cell type and index among all columns of that cell type. pub fn get_column(&self, cell_type: CellType, column_idx: usize) -> Option<&CellColumn> { if let Some(columns) = self.columns.get(&cell_type) { columns.get(column_idx) diff --git a/zkevm-circuits/src/util/cell_placement_strategy.rs b/zkevm-circuits/src/util/cell_placement_strategy.rs index 88e0ff0511..3ccecbd9c9 100644 --- a/zkevm-circuits/src/util/cell_placement_strategy.rs +++ b/zkevm-circuits/src/util/cell_placement_strategy.rs @@ -1,4 +1,4 @@ -use std::collections::{BTreeMap, HashMap}; +use std::collections::BTreeMap; use eth_types::Field; use halo2_proofs::plonk::{Advice, Column, ConstraintSystem}; @@ -8,7 +8,7 @@ use super::cell_manager::{ }; #[derive(Clone, Debug, Default)] -pub(crate) struct CMFixedWidthStrategyDistribution(HashMap>>); +pub(crate) struct CMFixedWidthStrategyDistribution(BTreeMap>>); impl CMFixedWidthStrategyDistribution { pub(crate) fn add(&mut self, cell_type: CellType, advice: Column) { @@ -34,7 +34,7 @@ pub(crate) struct CMFixedWidthStrategy { advices: CMFixedWidthStrategyDistribution, height_offset: usize, - next: HashMap, + next: BTreeMap, perm_substitution: bool, max_height: usize, @@ -52,7 +52,7 @@ impl CMFixedWidthStrategy { CMFixedWidthStrategy { advices, height_offset, - next: HashMap::default(), + next: BTreeMap::default(), perm_substitution: false, max_height: usize::max_value(), } diff --git a/zkevm-circuits/src/util/chunk_ctx.rs b/zkevm-circuits/src/util/chunk_ctx.rs index 77554fd019..2f5a223ff6 100644 --- a/zkevm-circuits/src/util/chunk_ctx.rs +++ b/zkevm-circuits/src/util/chunk_ctx.rs @@ -211,7 +211,7 @@ impl ChunkContextConfig { }, )?; - vec![ + [ chunk_index_cell, chunk_index_next_cell, total_chunk_cell, diff --git a/zkevm-circuits/src/util/int_decomposition.rs b/zkevm-circuits/src/util/int_decomposition.rs index 8f0950537d..90ad08f355 100644 --- a/zkevm-circuits/src/util/int_decomposition.rs +++ b/zkevm-circuits/src/util/int_decomposition.rs @@ -12,7 +12,7 @@ use crate::evm_circuit::{ util::{rlc, CachedRegion, Cell}, }; -use super::word::{Word, WordExpr}; +use super::word::{WordExpr, WordLoHi}; #[derive(Clone, Debug)] /// IntDecomposition decompose integer into byte limbs @@ -89,7 +89,7 @@ impl Expr for IntDecomposition { } impl WordExpr for IntDecomposition { - fn to_word(&self) -> Word> { + fn to_word(&self) -> WordLoHi> { let exprs = self .limbs .clone() @@ -97,7 +97,7 @@ impl WordExpr for IntDecomposition>>(); - Word::new( + WordLoHi::new( (0..2) .map(|id| exprs.get(id).unwrap_or(&0.expr()).clone()) .collect_vec() diff --git a/zkevm-circuits/src/util/word.rs b/zkevm-circuits/src/util/word.rs index 98a31fa87a..0205a234da 100644 --- a/zkevm-circuits/src/util/word.rs +++ b/zkevm-circuits/src/util/word.rs @@ -1,10 +1,10 @@ //! Define generic Word type with utility functions -// Naming Convesion +// Naming Conversion // - Limbs: An EVN word is 256 bits. Limbs N means split 256 into N limb. For example, N = 4, each // limb is 256/4 = 64 bits use bus_mapping::state_db::CodeDB; -use eth_types::{Field, ToLittleEndian, H160, H256}; +use eth_types::{Field, OpsIdentity, ToLittleEndian, H160, H256}; use gadgets::util::{not, or, Expr}; use halo2_proofs::{ circuit::{AssignedCell, Region, Value}, @@ -35,7 +35,7 @@ pub(crate) type Word4 = WordLimbs; pub(crate) type Word32 = WordLimbs; -pub(crate) type WordCell = Word>; +pub(crate) type WordLoHiCell = WordLoHi>; pub(crate) type Word32Cell = Word32>; @@ -79,7 +79,7 @@ impl Default for WordLimbs { /// Get the word expression pub trait WordExpr { /// Get the word expression - fn to_word(&self) -> Word>; + fn to_word(&self) -> WordLoHi>; } impl WordLimbs, N> { @@ -186,8 +186,8 @@ impl WordLimbs, N> { } impl WordExpr for WordLimbs, N> { - fn to_word(&self) -> Word> { - Word(self.word_expr().to_word_n()) + fn to_word(&self) -> WordLoHi> { + WordLoHi(self.word_expr().to_word_n()) } } @@ -200,9 +200,9 @@ impl WordLimbs { /// `Word`, special alias for Word2. #[derive(Clone, Debug, Copy, Default)] -pub struct Word(Word2); +pub struct WordLoHi(Word2); -impl Word { +impl WordLoHi { /// Construct the word from 2 limbs pub fn new(limbs: [T; 2]) -> Self { Self(WordLimbs::::new(limbs)) @@ -230,19 +230,19 @@ impl Word { (lo, hi) } - /// Wrap `Word` into `Word` - pub fn into_value(self) -> Word> { + /// Wrap `Word` into `WordLoHi` + pub fn into_value(self) -> WordLoHi> { let [lo, hi] = self.0.limbs; - Word::new([Value::known(lo), Value::known(hi)]) + WordLoHi::new([Value::known(lo), Value::known(hi)]) } /// Map the word to other types - pub fn map(&self, mut func: impl FnMut(T) -> T2) -> Word { - Word(WordLimbs::::new([func(self.lo()), func(self.hi())])) + pub fn map(&self, mut func: impl FnMut(T) -> T2) -> WordLoHi { + WordLoHi(WordLimbs::::new([func(self.lo()), func(self.hi())])) } } -impl std::ops::Deref for Word { +impl std::ops::Deref for WordLoHi { type Target = WordLimbs; fn deref(&self) -> &Self::Target { @@ -250,24 +250,35 @@ impl std::ops::Deref for Word { } } -impl PartialEq for Word { +impl PartialEq for WordLoHi { fn eq(&self, other: &Self) -> bool { self.lo() == other.lo() && self.hi() == other.hi() } } -impl From for Word { +impl From for WordLoHi { /// Construct the word from u256 fn from(value: eth_types::Word) -> Self { let bytes = value.to_le_bytes(); - Word::new([ + WordLoHi::new([ from_bytes::value(&bytes[..N_BYTES_HALF_WORD]), from_bytes::value(&bytes[N_BYTES_HALF_WORD..]), ]) } } -impl From for Word { +impl> OpsIdentity for WordLoHi { + /// output type + type Output = WordLoHi; + fn zero() -> Self::Output { + WordLoHi::new([T::zero(), T::zero()]) + } + fn one() -> Self::Output { + WordLoHi::new([T::one(), T::zero()]) + } +} + +impl From for WordLoHi { /// Construct the word from H256 fn from(h: H256) -> Self { let le_bytes = { @@ -275,55 +286,55 @@ impl From for Word { b.reverse(); b }; - Word::new([ + WordLoHi::new([ from_bytes::value(&le_bytes[..N_BYTES_HALF_WORD]), from_bytes::value(&le_bytes[N_BYTES_HALF_WORD..]), ]) } } -impl From for Word { +impl From for WordLoHi { /// Construct the word from u64 fn from(value: u64) -> Self { let bytes = value.to_le_bytes(); - Word::new([from_bytes::value(&bytes), F::from(0)]) + WordLoHi::new([from_bytes::value(&bytes), F::from(0)]) } } -impl From for Word { +impl From for WordLoHi { /// Construct the word from u8 fn from(value: u8) -> Self { - Word::new([F::from(value as u64), F::from(0)]) + WordLoHi::new([F::from(value as u64), F::from(0)]) } } -impl From for Word { +impl From for WordLoHi { fn from(value: bool) -> Self { - Word::new([F::from(value as u64), F::from(0)]) + WordLoHi::new([F::from(value as u64), F::from(0)]) } } -impl From for Word { +impl From for WordLoHi { /// Construct the word from h160 fn from(value: H160) -> Self { let mut bytes = *value.as_fixed_bytes(); bytes.reverse(); - Word::new([ + WordLoHi::new([ from_bytes::value(&bytes[..N_BYTES_HALF_WORD]), from_bytes::value(&bytes[N_BYTES_HALF_WORD..]), ]) } } -impl Word> { +impl WordLoHi> { /// Assign advice pub fn assign_advice( &self, region: &mut Region<'_, F>, annotation: A, - column: Word>, + column: WordLoHi>, offset: usize, - ) -> Result>, Error> + ) -> Result>, Error> where A: Fn() -> AR, AR: Into, @@ -332,38 +343,28 @@ impl Word> { let lo = region.assign_advice(|| &annotation, column.lo(), offset, || self.lo())?; let hi = region.assign_advice(|| &annotation, column.hi(), offset, || self.hi())?; - Ok(Word::new([lo, hi])) + Ok(WordLoHi::new([lo, hi])) } } -impl Word> { +impl WordLoHi> { /// Query advice of Word of columns advice pub fn query_advice( &self, meta: &mut VirtualCells, at: Rotation, - ) -> Word> { + ) -> WordLoHi> { self.0.query_advice(meta, at).to_word() } } -impl + Clone> WordExpr for Word { - fn to_word(&self) -> Word> { +impl + Clone> WordExpr for WordLoHi { + fn to_word(&self) -> WordLoHi> { self.map(|limb| limb.expr()) } } -impl Word { - /// zero word - pub fn zero_f() -> Self { - Self::new([F::ZERO, F::ZERO]) - } - - /// one word - pub fn one_f() -> Self { - Self::new([F::ONE, F::ZERO]) - } - +impl WordLoHi { /// Convert address (h160) to single field element. /// This method is Address specific pub fn compress_f(&self) -> F { @@ -371,31 +372,22 @@ impl Word { } } -impl Word> { +impl WordLoHi> { /// create word from lo limb with hi limb as 0. caller need to guaranteed to be 128 bits. pub fn from_lo_unchecked(lo: Expression) -> Self { Self::new([lo, 0.expr()]) } - /// zero word - pub fn zero() -> Self { - Self::new([0.expr(), 0.expr()]) - } - - /// one word - pub fn one() -> Self { - Self::new([1.expr(), 0.expr()]) - } /// select based on selector. Here assume selector is 1/0 therefore no overflow check pub fn select + Clone>( selector: T, - when_true: Word, - when_false: Word, - ) -> Word> { + when_true: WordLoHi, + when_false: WordLoHi, + ) -> WordLoHi> { let (true_lo, true_hi) = when_true.to_lo_hi(); let (false_lo, false_hi) = when_false.to_lo_hi(); - Word::new([ + WordLoHi::new([ selector.expr() * true_lo.expr() + (1.expr() - selector.expr()) * false_lo.expr(), selector.expr() * true_hi.expr() + (1.expr() - selector.expr()) * false_hi.expr(), ]) @@ -403,22 +395,22 @@ impl Word> { /// Assume selector is 1/0 therefore no overflow check pub fn mul_selector(&self, selector: Expression) -> Self { - Word::new([self.lo() * selector.clone(), self.hi() * selector]) + WordLoHi::new([self.lo() * selector.clone(), self.hi() * selector]) } /// No overflow check on lo/hi limbs pub fn add_unchecked(self, rhs: Self) -> Self { - Word::new([self.lo() + rhs.lo(), self.hi() + rhs.hi()]) + WordLoHi::new([self.lo() + rhs.lo(), self.hi() + rhs.hi()]) } /// No underflow check on lo/hi limbs pub fn sub_unchecked(self, rhs: Self) -> Self { - Word::new([self.lo() - rhs.lo(), self.hi() - rhs.hi()]) + WordLoHi::new([self.lo() - rhs.lo(), self.hi() - rhs.hi()]) } /// No overflow check on lo/hi limbs pub fn mul_unchecked(self, rhs: Self) -> Self { - Word::new([self.lo() * rhs.lo(), self.hi() * rhs.hi()]) + WordLoHi::new([self.lo() * rhs.lo(), self.hi() * rhs.hi()]) } /// Convert address (h160) to single expression. @@ -462,14 +454,14 @@ impl WordLimbs, N1> { } impl WordExpr for WordLimbs, N1> { - fn to_word(&self) -> Word> { - Word(self.to_word_n()) + fn to_word(&self) -> WordLoHi> { + WordLoHi(self.to_word_n()) } } -/// Return the hash of the empty code as a `Word>` in little-endian. -pub fn empty_code_hash_word_value() -> Word> { - Word::from(CodeDB::empty_code_hash()).into_value() +/// Return the hash of the empty code as a `WordLoHi>` in little-endian. +pub fn empty_code_hash_word_value() -> WordLoHi> { + WordLoHi::from(CodeDB::empty_code_hash()).into_value() } // TODO unittest diff --git a/zkevm-circuits/src/witness/block.rs b/zkevm-circuits/src/witness/block.rs index d79641cba9..6d3c4417fb 100644 --- a/zkevm-circuits/src/witness/block.rs +++ b/zkevm-circuits/src/witness/block.rs @@ -9,15 +9,17 @@ use crate::{ exp_circuit::param::OFFSET_INCREMENT, instance::public_data_convert, table::BlockContextFieldTag, - util::{log2_ceil, unwrap_value, word, SubCircuit}, + util::{log2_ceil, unwrap_value, word::WordLoHi, SubCircuit}, witness::Chunk, }; use bus_mapping::{ - circuit_input_builder::{self, CopyEvent, ExpEvent, FeatureConfig, FixedCParams, Withdrawal}, + circuit_input_builder::{ + self, CopyEvent, ExpEvent, FeatureConfig, FixedCParams, PrecompileEvents, Withdrawal, + }, state_db::CodeDB, Error, }; -use eth_types::{Address, Field, ToScalar, Word, H256}; +use eth_types::{sign_types::SignData, Address, Field, ToScalar, Word, H256}; use gadgets::permutation::get_permutation_fingerprints; use halo2_proofs::circuit::Value; @@ -59,6 +61,8 @@ pub struct Block { pub prev_state_root: Word, // TODO: Make this H256 /// Keccak inputs pub keccak_inputs: Vec>, + /// IO to/from the precompiled contract calls. + pub precompile_events: PrecompileEvents, /// Original Block from geth pub eth_block: eth_types::Block, /// rw_table padding meta data @@ -83,6 +87,26 @@ impl Block { } } + /// Get signature (witness) from the block for tx signatures and ecRecover calls. + pub(crate) fn get_sign_data(&self, padding: bool) -> Vec { + let mut signatures: Vec = self + .txs + .iter() + .map(|tx| tx.tx.sign_data(self.context.chain_id.as_u64())) + .filter_map(|res| res.ok()) + .collect::>(); + signatures.extend_from_slice(&self.precompile_events.get_ecrecover_events()); + if padding && self.txs.len() < self.circuits_params.max_txs { + // padding tx's sign data + signatures.push( + Transaction::dummy() + .sign_data(self.context.chain_id.as_u64()) + .unwrap(), + ); + } + signatures + } + /// Get a read-write record pub(crate) fn get_rws(&self, step: &ExecStep, index: usize) -> Rw { self.rws[step.rw_index(index)] @@ -177,7 +201,7 @@ pub struct BlockContext { pub number: Word, /// The timestamp of the block pub timestamp: Word, - /// The difficulty of the blcok + /// The difficulty of the block pub difficulty: Word, /// The base fee, the minimum amount of gas fee for a transaction pub base_fee: Word, @@ -197,8 +221,8 @@ impl BlockContext { [ Value::known(F::from(BlockContextFieldTag::Coinbase as u64)), Value::known(F::ZERO), - Value::known(word::Word::from(self.coinbase).lo()), - Value::known(word::Word::from(self.coinbase).hi()), + Value::known(WordLoHi::from(self.coinbase).lo()), + Value::known(WordLoHi::from(self.coinbase).hi()), ], [ Value::known(F::from(BlockContextFieldTag::Timestamp as u64)), @@ -215,8 +239,8 @@ impl BlockContext { [ Value::known(F::from(BlockContextFieldTag::Difficulty as u64)), Value::known(F::ZERO), - Value::known(word::Word::from(self.difficulty).lo()), - Value::known(word::Word::from(self.difficulty).hi()), + Value::known(WordLoHi::from(self.difficulty).lo()), + Value::known(WordLoHi::from(self.difficulty).hi()), ], [ Value::known(F::from(BlockContextFieldTag::GasLimit as u64)), @@ -227,20 +251,20 @@ impl BlockContext { [ Value::known(F::from(BlockContextFieldTag::BaseFee as u64)), Value::known(F::ZERO), - Value::known(word::Word::from(self.base_fee).lo()), - Value::known(word::Word::from(self.base_fee).hi()), + Value::known(WordLoHi::from(self.base_fee).lo()), + Value::known(WordLoHi::from(self.base_fee).hi()), ], [ Value::known(F::from(BlockContextFieldTag::ChainId as u64)), Value::known(F::ZERO), - Value::known(word::Word::from(self.chain_id).lo()), - Value::known(word::Word::from(self.chain_id).hi()), + Value::known(WordLoHi::from(self.chain_id).lo()), + Value::known(WordLoHi::from(self.chain_id).hi()), ], [ Value::known(F::from(BlockContextFieldTag::WithdrawalRoot as u64)), Value::known(F::ZERO), - Value::known(word::Word::from(self.withdrawals_root).lo()), - Value::known(word::Word::from(self.withdrawals_root).hi()), + Value::known(WordLoHi::from(self.withdrawals_root).lo()), + Value::known(WordLoHi::from(self.withdrawals_root).hi()), ], ], { @@ -252,8 +276,8 @@ impl BlockContext { [ Value::known(F::from(BlockContextFieldTag::BlockHash as u64)), Value::known((self.number - len_history + idx).to_scalar().unwrap()), - Value::known(word::Word::from(*hash).lo()), - Value::known(word::Word::from(*hash).hi()), + Value::known(WordLoHi::from(*hash).lo()), + Value::known(WordLoHi::from(*hash).hi()), ] }) .collect() @@ -324,6 +348,7 @@ pub fn block_convert( exp_circuit_pad_to: ::default(), prev_state_root: block.prev_state_root, keccak_inputs: circuit_input_builder::keccak_inputs(block, code_db)?, + precompile_events: block.precompile_events.clone(), eth_block: block.eth_block.clone(), end_block: block.end_block.clone(), rw_padding_meta, diff --git a/zkevm-circuits/src/witness/mpt.rs b/zkevm-circuits/src/witness/mpt.rs index df7b1ddebb..f2005ddb76 100644 --- a/zkevm-circuits/src/witness/mpt.rs +++ b/zkevm-circuits/src/witness/mpt.rs @@ -1,7 +1,7 @@ use crate::{ evm_circuit::witness::Rw, table::{AccountFieldTag, MPTProofType}, - util::word, + util::word::WordLoHi, }; use eth_types::{Address, Field, ToScalar, Word}; use halo2_proofs::circuit::Value; @@ -45,12 +45,12 @@ pub struct MptUpdates { #[derive(Default, Clone, Copy, Debug)] pub struct MptUpdateRow { pub(crate) address: F, - pub(crate) storage_key: word::Word, + pub(crate) storage_key: WordLoHi, pub(crate) proof_type: F, - pub(crate) new_root: word::Word, - pub(crate) old_root: word::Word, - pub(crate) new_value: word::Word, - pub(crate) old_value: word::Word, + pub(crate) new_root: WordLoHi, + pub(crate) old_root: WordLoHi, + pub(crate) new_value: WordLoHi, + pub(crate) old_value: WordLoHi, } impl MptUpdates { @@ -101,12 +101,12 @@ impl MptUpdates { let (new_value, old_value) = update.value_assignments(); MptUpdateRow { address: Value::known(update.key.address().to_scalar().unwrap()), - storage_key: word::Word::::from(update.key.storage_key()).into_value(), + storage_key: WordLoHi::::from(update.key.storage_key()).into_value(), proof_type: Value::known(update.proof_type()), - new_root: word::Word::::from(new_root).into_value(), - old_root: word::Word::::from(old_root).into_value(), - new_value: word::Word::::from(new_value).into_value(), - old_value: word::Word::::from(old_value).into_value(), + new_root: WordLoHi::::from(new_root).into_value(), + old_root: WordLoHi::::from(old_root).into_value(), + new_value: WordLoHi::::from(new_value).into_value(), + old_value: WordLoHi::::from(old_value).into_value(), } }) .collect() diff --git a/zkevm-circuits/src/witness/rw.rs b/zkevm-circuits/src/witness/rw.rs index 06120f95a3..a87f819d9a 100644 --- a/zkevm-circuits/src/witness/rw.rs +++ b/zkevm-circuits/src/witness/rw.rs @@ -18,14 +18,14 @@ use crate::{ table::{ AccountFieldTag, CallContextFieldTag, StepStateFieldTag, TxLogFieldTag, TxReceiptFieldTag, }, - util::{build_tx_log_address, unwrap_value, word}, + util::{build_tx_log_address, unwrap_value, word::WordLoHi}, }; use super::MptUpdates; const U64_BYTES: usize = u64::BITS as usize / 8usize; -/// Rw constainer for a witness block +/// Rw container for a witness block #[derive(Debug, Default, Clone)] pub struct RwMap(pub HashMap>); @@ -171,8 +171,8 @@ impl RwMap { ( iter::empty() .chain([padding_start_rw.unwrap_or(Rw::Start { rw_counter: 1 })]) - .chain(rows_trimmed.into_iter()) - .chain(padding.into_iter()) + .chain(rows_trimmed) + .chain(padding) .take(target_len) .collect(), padding_length, @@ -368,10 +368,10 @@ pub struct RwRow { pub(crate) id: F, pub(crate) address: F, pub(crate) field_tag: F, - pub(crate) storage_key: word::Word, - pub(crate) value: word::Word, - pub(crate) value_prev: word::Word, - pub(crate) init_val: word::Word, + pub(crate) storage_key: WordLoHi, + pub(crate) value: WordLoHi, + pub(crate) value_prev: WordLoHi, + pub(crate) init_val: WordLoHi, } impl RwRow { @@ -412,9 +412,9 @@ impl RwRow> { }); inner.unwrap_or_default() }; - let unwrap_w = |f: word::Word>| { + let unwrap_w = |f: WordLoHi>| { let (lo, hi) = f.into_lo_hi(); - word::Word::new([unwrap_f(lo), unwrap_f(hi)]) + WordLoHi::new([unwrap_f(lo), unwrap_f(hi)]) }; RwRow { @@ -495,8 +495,8 @@ impl RwRow> { tag: Value::known(F::from(Target::Start as u64)), ..Default::default() })) - .chain(rows_trimmed.into_iter()) - .chain(padding.into_iter()) + .chain(rows_trimmed) + .chain(padding) .take(target_len) .collect(), padding_length, @@ -649,11 +649,11 @@ impl Rw { id: Value::known(F::from(self.id().unwrap_or_default() as u64)), address: Value::known(self.address().unwrap_or_default().to_scalar().unwrap()), field_tag: Value::known(F::from(self.field_tag().unwrap_or_default())), - storage_key: word::Word::from(self.storage_key().unwrap_or_default()).into_value(), - value: word::Word::from(self.value_assignment()).into_value(), - value_prev: word::Word::from(self.value_prev_assignment().unwrap_or_default()) + storage_key: WordLoHi::from(self.storage_key().unwrap_or_default()).into_value(), + value: WordLoHi::from(self.value_assignment()).into_value(), + value_prev: WordLoHi::from(self.value_prev_assignment().unwrap_or_default()) .into_value(), - init_val: word::Word::from(self.committed_value_assignment().unwrap_or_default()) + init_val: WordLoHi::from(self.committed_value_assignment().unwrap_or_default()) .into_value(), } }